本文将介绍一下MySQL组复制以及如何安装和配置、监控组。 组复制是MySQL服务器插件,通过这种插件可以实现弹性、高可用、容错复制拓扑结构。
复制组能够以一种自动优先选择的单主模式运行,在某个时间只有一个服务器接受更新 。但是对于更高优先级的用户,组能够以多主模式部署,所有的服务器都能够接受更新,即使他们是同时发生的。
组复制中存在着一种内建的组成员关系服务用来保持组的视图一致,并且在任意时间对于组中的所有的服务器都可用。MySQL服务器能够退出或者加入组中,而且视图也会相应的更新。有时服务器可能会意外的退出组(故障),在这种情况下失败检测机制检测这种情况并且告知复制组视图发生了变化,这所有的一切都是自动实现的。
组复制原理图:
以下是MySQL组复制的应用场景:
弹性复制(Elastic Replication) -适用于需要一个不固定易变的复制架构,这种情况下组中的服务器可以在很少的副作用的情况下动态增加或者减少。 例如云服务的数据库服务。
高可用分片(Highly Available Shards) -分片是一种实现写操作的横向扩展的流行方法。当每一个分片映射到复制组的时候可以使用MySQL 组复制去实现高可用分片。
可选择的主从复制(Alternative to Master-Slave replication)- 在某些情况下, 使用单主服务器就会存在单点竞争。写入整个组能够在某些情况下改进这种情况。
自主系统 (Autonomic Systems) - 而且,我们也可以单纯的为了自动化部署MySQL组复制。
组复制中的每一个实例(MySQL服务器)可以运行在独立的物理机上或者在同一台机器上。此部分将讲述如何用三台 MySQL服务器建立一个组复制 。
组复制的架构图:
环境要求三台主机(虚拟机rhel6.5.x86_64):
server1: 172.25.0.2,mysql-5.7
server2:172.25.0.3,mysql-5.7
server3:172.25.0.4,mysql-5.7
安装好MySQL服务之后首先要进行配置文件修改(三台都要,注意server-id和loose-group_replication_local_address对应每台主机):
vim /etc/my.cnf
在原有配置基础上增加以下内容:
server-id=1#第一台1,第二台2,以此类推
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
# 指明对于每一个事物服务器必须收集写集并且使用XXHASH64哈希算法进行哈希编码
loose-group_replication_group_name="2a9e58f4-11d8-42fc-88d8-2c02bd8df65a"
#uuid唯一标记一个组,可以使用uuidgen命令生成,然后复制到这里
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="172.25.0.2:24901"#对应着所在主机的ip
loose-group_replication_group_seeds="172.25.0.2:24901,172.25.0.3:24901,172.25.0.4:24901"#复制组中所有主机和端口
loose-group_replication_bootstrap_group=off
配置完成之后启动服务并且执行以下动作:
/etc/init.d/mysqld start
mysql -p#登录到MySQL服务器
mysql>SET SQL_LOG_BIN=0;#关闭二进制日志
mysql>CREATE USER rpl_user@'%' IDENTIFIED BY 'Lockey+123';#创建用户并且指定密码,组内各服务器一致
mysql>GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';#授权操作,组内各服务器一致
mysql>FLUSH PRIVILEGES;
mysql>SET SQL_LOG_BIN=1;#开启二进制日志
mysql>CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Lockey+123' FOR CHANNEL 'group_replication_recovery';
mysql>INSTALL PLUGIN group_replication SONAME 'group_replication.so';
#安装组复制插件
mysql>SHOW PLUGINS;
mysql>START GROUP_REPLICATION;
#开启组复制
mysql>SELECT * FROM performance_schema.replication_group_members;
#查看复制组的信息
然后进行一些数据库操作,比如建库建表插入数据等,等会需要在组内其他服务器上进行验证。
添加第二——N个服务器到复制组
首先是配置文件
vim /etc/my.cnf
#加入内容基本和上边的配置一样,但是要注意server-id和oose-group_replication_local_address是对应服务器所在主机的
接下来的操作和上边的一致,配置完成后查看组信息(第一台和第二台的查询结果基本一致):
每往组中添加一个实例,信息就会增加一条
测试组复制
分别在组内各个服务器进行数据库操作,增删改之类的,可以看到各服务器的数据是一致的,这就是组复制,多台主机互为主从,可以同时进行读写,但是最终的数据是一致的。
本文内容是从MySQL官网文档摘下翻译的,如果想要看更加详细的内容以及操作可以去原地址https://dev.mysql.com/doc/refman/5.7/en/group-replication.html