一.Mysql的组复制简介
1.组复制简介
- 组复制分单主模式和多主模式,mysql 的复制技术仅解决了数据同步的问题,如果 master 宕机,意味着数据库管理员需要介入,应用系统可能需要修改数据库连接地址或者重启才能实现。组复制在数据库层面上做到了,只要集群中大多数主机可用,则服务可用。
- 单主模型:从复制组众多个MYSQL节点中自动选举一个master节点,只有master节点可以写,其它节点自动设置为只读。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其它的slave将指向这个新的master。
- 多主模型:复制组中的任何一个节点都可以写,因此没有master和slave的概念,只要突然故障的节点的数量不太多这个多主模就能继续使用。
2.组复制原理
- 组复制由多个mysql服务器组成,并且组中的每一个mysql服务成员可以独立的执行事务。但是所有的读写事务只有在冲突检测成功后才会提交,只读事务不需要冲突检测,可以立即提交。
- 对于任何读写事务,提交操作并不是由始发服务单向决定的,而是由组来决定是否提交。
- 在始发mysql服务上,当事务准备好要提交时,该主机会广播写入值即已改变的行和对应的写入集及已更新的行的唯一标识符。然后会为该事务建立一个全局的顺序。最终,所有的server成员以相同的顺序接收同一组事务。所有的server成员以相同的顺序应用相同的更改,以保证组内一致。
3.组复制的优点
- 组复制中即使一些server发生故障,系统仍然可用,只是在性能和伸缩性上有所降低,但是仍然可用。
- server故障是孤立的。它们由组成员服务来监控,组成员服务依赖于分布式的故障检测系统,其能够在任何server自愿或者由于意外停止而离开组时发出信号。
二.单主模式下的Mysql组复制的部署
注:组复制必须保证节点服务相同
1.实验环境
主机名(IP) | 服务 |
---|---|
server1(172.25.254.1) | master |
server2(172.25.254.2) | slave |
server3(172.25.254.3) | slave |
2.部署过程
server1:
- 由于在此实验之前做了mysql的其它相关应用,所以首先需要进行对数据库重新清理
a.查看server1上的uuid后面组复制时需要用到
b.数据库的文件删除恢复到初始状态,注意要先关闭数据库然后再删文件,才会生效
- server1上组复制的配置
a.编辑配置文件添加组复制
[root@server1 mysql]# vim /etc/my.cnf
文件编辑内容如下:
server_id=1
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 ##指定server必须为每个事务收集写集合,并使用哈希算法将其编码为散列
loose-group_replication_group_name="ad9693a1-7179-11e9-bc05-5254007ff442" ##对创建的组命名
loose-group_replication_start_on_boot=off ##不自动启动组复制
loose-group_replication_local_address= "172.25.254.1:24901" ##本地的端口24901实现成员连接
loose-group_replication_group_seeds= "172.25.254.1:24901,172.25.254.2:24901,172.25.254.3:24901"
loose-group_replication_bootstrap_group=off ##是否自动引导组
loose-group_replication_ip_whitelist="127.0.0.1,172.25.254.0/24"
loose-group_replication_enforce_update_everywhere_checks=ON ##打开检查及其更新
loose-group_replication_single_primary_mode=OFF #设置组自动选择一个server来处理读写工作
b.开启数据库
c.查看密码并且登录,可以在登录后使用命令对其初始化及修改密码
[root@server1 mysql]# grep password /var/log/mysqld.log
mysql> alter user root@localhost identified by 'Zhulili+123';
d.启动组复制
mysql> SET SQL_LOG_BIN=0; ##首先在进行用户建立之前关闭二进制日志,建立好之后再打开
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Zhulili+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='Zhulili+123'
-> FOR CHANNEL 'group_replication_recovery'; ##设置如果要改变master时需要通过该通道group_replication_recovery给其master的用户名和密码
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so'; ##安装组复制插件
mysql> SET GLOBAL group_replication_bootstrap_group=ON; ##只在master上进行的操作,即自动引导组,当打开组复制之后将其再关闭
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
mysql> SHOW PLUGINS; ##查看组复制插件
组复制添加完成后查看状态为online则组复制添加成功
e.创建库添加表,插入数据方便后续的测试
server2:
- 同server1如果做了相应的mysql的应用则需要删除数据重新开启数据库进行初始化
- server2上的配置(同server1,只需要修改相应的地方)
a.开启数据库过滤密码并且登录数据库进行修改密码
[root@server2 mysql]# systemctl start mysqld
[root@server2 mysql]# grep password /var/log/mysqld.log
b.编辑配置文件添加组复制(同server1)
c.启动组复制
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Zhulili+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='Mk-123456' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> SET GLOBAL group_replication_allow_local_disjoint_gtids_join=on;
mysql> reset master; ##重启master,否则开启组复制之后可能出现错误
mysql> START GROUP_REPLICATION;
mysql> SHOW PLUGINS;
d.查看数据是否同步
server3:
- 安装数据库
- 组复制配置(同server2)
a.编辑配置为文件
b.开启数据库
c.过滤密码并且登录修改密码
d.启动组复制
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Zhulili+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='Mk-123456' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
mysql> SET GLOBAL group_replication_allow_local_disjoint_gtids_join=on;
mysql> reset master; ##重启master,否则开启组复制之后可能出现错误
mysql> START GROUP_REPLICATION;
mysql> SHOW PLUGINS;
查看状态:
e.查看数据是否同步
发现数据已经同步,则组复制成功