mysql--半同步复制和全同步复制

一、半同步复制

1 半同步复制的介绍

mysql的主备库通过binlog日志保持一致,主库本地执行完事务,binlog日志落盘后即返回给用户;备库通过拉取主库binlog日志来同步主库的操作。默认情况下,主库与备库并没有严格的同步,因此存在一定的概率备库与主库的数据是不对等的。半同步特性的出现,就是为了保证在任何时刻主备数据一致的问题。相对于异步复制,半同步复制要求执行的每一个事务,都要求至少有一个备库成功接收后,才返回给用户。实现原理也很简单,主库本地执行完毕后,等待备库的响应消息(包含最新备库接收到的binlog(file,pos)),接收到备库响应消息后,再返回给用户,这样一个事务才算真正完成。在主库实例上,有一个专门的线程(ack_receiver)接收备库的响应消息,并以通知机制告知主库备库已经接收的日志,可以继续执行。

2 半同步复制的配置

主机:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; #安装半同步复制插件
SET GLOBAL rpl_semi_sync_master_enabled = 1; 设置开机自启

从机:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; #安装插件
SET GLOBAL rpl_semi_sync_slave_enabled = 1; #设置开机自启

STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD; #相当于重启IO连接

查看一下半同步的状态:

SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%semi%';

 

测试:

主机在hahahaha库中的usertb表中插入数据

从机上查看:

 

二、全同步复制

1 全同步复制的介绍

全同步是主从同步数据的增强

主从同步只有在主数据库上写入,从数据库自动同步数据,但从数据库作出改变,主数据库不会改变,导致数据不一致。

全同步恰好解决这一问题,只有一个数据库发生改变,与它在同一个组的数据库也会发生改变,同组数据库没有等级之分,可以理解为同组数据之间相互同步,数据完全一致。

2 配置

实验环境:

主机:172.25.7.5

从机1:172.25.7.6

从机2:172.25.7.7

实验前要保证有一个纯净的环境,所以要先关闭Mysqld服务,将三台服务器的/var/lib/mysql里面的东西删除干净,再次开启服务并初始化。

删除环境

安全初始化:

=======================

下面分两种情况进行配置

[1] 创建的时候没有数据不需要做备份

在node5上:

1.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

    plugin_load_add='group_replication.so' #将组复制插件添加到服务器在启动时加载的插件列表中。在生产部署中,这比手动安装插件更可取。
    transaction_write_set_extraction=XXHASH64
    group_replication_group_name="1f4c81d7-3035-11ea-8218-52540011de01" #告诉插件它正在加入号或者创建的组名为“   ” 。生成方法,进入数据库中,select uuid();
    group_replication_start_on_boot=off #插件在服务器启动时不会自动启动操作,确保您可以在手动启动插件之前配置服务器
    group_replication_local_address= "172.25.7.5:33061"
    group_replication_group_seeds= "172.25.7.5:33061,172.25.7.6:33061,172.25.7.7:33061"
    group_replication_bootstrap_group=off
    group_replication_ip_whitelist="127.0.0.1,172.25.7.0/24"
    group_replication_enforce_update_everywhere_checks=ON
    group_replication_single_primary_mode=OFF

2.systemctl restart mysqld  #重启数据库
3.mysql -uroot -pSll123+456 #登陆数据库
4.CREATE USER rpl_user@'%' IDENTIFIED BY 'Sll123+456'; #创建用户
5.GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; #赋予权限
6.FLUSH PRIVILEGES;
7.CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Sll123+456' FOR CHANNEL 'group_replication_recovery';
8.SHOW PLUGINS; #看group_replication状态是否是ACTIVE
9.SET GLOBAL group_replication_bootstrap_group=ON;
  START GROUP_REPLICATION;
  SET GLOBAL group_replication_bootstrap_group=OFF;
  SELECT * FROM performance_schema.replication_group_members; #查看状态是否是online

其中UUID的生成方法:

 

 

关闭selinux后再次开启组复制,即可成功。

node6上:

1.vim /etc/my.cnf #修改配置文件
    server_id=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

    plugin_load_add='group_replication.so'
    transaction_write_set_extraction=XXHASH64
    group_replication_group_name="1f4c81d7-3035-11ea-8218-52540011de01" #三台保持一致
    group_replication_start_on_boot=off
    group_replication_local_address= "172.25.7.6:33061"
    group_replication_group_seeds= "172.25.7.5:33061,172.25.7.6:33061,172.25.7.7:33061"
    group_replication_bootstrap_group=off
    group_replication_ip_whitelist="127.0.0.1,172.25.7.0/24"
    group_replication_enforce_update_everywhere_checks=ON
    group_replication_single_primary_mode=OFF

2.systemctl restart myslqd 
3.SET SQL_LOG_BIN=0;
4.CREATE USER rpl_user@'%' IDENTIFIED BY 'Sll123+456'; #创建用户
5.GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; #授权
6.SET SQL_LOG_BIN=1;
7.CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Sll123+456' FOR CHANNEL 'group_replication_recovery';
8.START GROUP_REPLICATION;
9.SELECT * FROM performance_schema.replication_group_members; #查看状态

 

node7上面:和node6上面一样,只需要改个server_id 和local_address

1.vim /etc/my.cnf #修改配置文件
    server_id=3
    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

    plugin_load_add='group_replication.so'
    transaction_write_set_extraction=XXHASH64
    group_replication_group_name="1f4c81d7-3035-11ea-8218-52540011de01" #三台保持一致
    group_replication_start_on_boot=off
    group_replication_local_address= "172.25.7.7:33061"
    group_replication_group_seeds= "172.25.7.5:33061,172.25.7.6:33061,172.25.7.7:33061"
    group_replication_bootstrap_group=off
    group_replication_ip_whitelist="127.0.0.1,172.25.7.0/24"
    group_replication_enforce_update_everywhere_checks=ON
    group_replication_single_primary_mode=OFF

2.systemctl restart myslqd 
3.SET SQL_LOG_BIN=0;
4.CREATE USER rpl_user@'%' IDENTIFIED BY 'Sll123+456'; #创建用户
5.GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%'; #授权
6.SET SQL_LOG_BIN=1;
7.CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Sll123+456' FOR CHANNEL 'group_replication_recovery';
8.START GROUP_REPLICATION;
9.SELECT * FROM performance_schema.replication_group_members; #查看状态

配置完成,状态应该是online

测试:

在node5上建立一个数据库test,在node7上建立一个数据库tt,node5,node6,node7全部同步

 

[2]配置的时候需要做备份

恢复原始环境:关闭mysqld服务,删除三台机器/var/lib/mysql 里的所有东西,再次开启服务,查看初始密码,并安全初始化。

在node5和node6,node7上的配置和上述一样,但是在node6显示状态的时候,node6的状态是recovering,如何解决?

这是因为在node5上已经有了数据,所以需要把node5上的数据备份一份,发给node6和node7(注意:这里必须是通过域名发送)

通过ip发送的时候,登陆数据库显示的还是recovering.

备份数据:

数据备份:
mysqldump --all-databases --single-transaction --triggers --routines --events --host=127.0.0.1 --port=3306 --user=root --password=Sll123+456 > 123.sql

数据传输到其他机器:
scp 123.sql node6:~
scp 123.sql node7:~

node6和node7:
mysql -p < 123.sql # 数据导入

数据导入时,需mysqld开启,若导入不成功,登陆mysql执行reset mysqld ,再次导入,密码是数据库的密码Sll123+456

导入成功后,node6和node7:

SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'Sll123+456';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Sll123+456' FOR CHANNEL 'group_replication_recovery';

START GROUP_REPLICATION;
SELECT * FROM performance_schema.replication_group_members;

 

状态全部是online,在任意一台创建的库,其他的也能看到。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL同步复制是一种数据库复制机制,它可以提高数据复制的可靠性和一致性。同步复制要求在主库和从库上都启用相应的插件。 首先,在主库上启用同步复制功能,可以使用以下命令: mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; 这将安装并启用主库的同步复制插件。 接下来,在从库上启用同步复制功能,可以使用以下命令: mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; 这将安装并启用从库的同步复制插件。 然后,需要确保IO线程正在运行。可以使用以下命令来启动IO线程: mysql> start slave io_thread; 这将启动从库的IO线程,用于从主库获取二进制日志事件。 最后,可以在主库上检查同步复制是否正常工作。可以使用以下命令来检查: mysql> show variables like 'rpl_semi_sync%'; 这将显示同步复制的相关变量值,以确认同步复制是否正常启用和运行。 总结起来,对于MySQL同步复制,需要在主库和从库上分别启用相应的插件,并确保IO线程正常运行。这样可以提高数据复制的可靠性和一致性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Mysql同步复制](https://blog.csdn.net/carefree2005/article/details/113971341)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值