半同步复制——基于GTID
简介
- 默认情况下,MySQL的复制功能是异步的,异步复制可以提供最佳的性能, 主库把binlog日志发送给从库,这一动作就结束了,并不会验证从库是否接收完毕,这一过程,也就意味着有可能出现当主服务器或从服务器端发生故障的时 候,有可能从服务器没有接收到主服务器发送过来的binlog日志,这就会造成主服务器和从服务器的数据不一致,甚至在恢复时造成数据的丢失
- 为了解决上述可能发生的错误,MySQL 5.5 引入了一种半同步复制模式。该模式可以确保从服务器接收完主服务器发送的binlog日志文件并写入到自己的中继日志relay log里,然后会给主服务器一个反馈,告诉主服务器已经接收完毕,这时主服务线程才返回给当前session告知操作完成。
- 当出现超时情况是,主服务器会暂时切换到异步复制模式,直到至少有一个从服务器从及时收到信息为止
- 中继日志的自我修复:
从MySQL 5.5.X 版本开始,增加了relay_log_recovery参数,这个参数的作用是:当slave从库宕机后,假如relay.log损坏了,导致一部分中继 日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性。默认情况下该功 能是关闭的,将relay_log_recovery的值设置为1时,可在slave从库上开启该功能,建议开启- 半同步复制与异步复制的切换:
半同步复制的工作原理就是当slave从库IO_Thread线程将binlog日志接收完毕之后,要给master主库一个确认,如果 rpl_semi_sync_master_timeout=10000 (10秒)超过10秒未收到slave从库的接受确认信号,那么就会自动切换为传统的异步复制模式注意:
半同步复制模式必须在主服务器和从服务器端同时开启,否则主服务器默认使用异步复制模式
此实验是在上一篇博客实现主从复制的基础上进行的
在master里面;
mysql -p
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; ###下载一个插件
SET GLOBAL rpl_semi_sync_master_enabled=1; ##临时有效,重启之后便失效
show plugins; ##显示加载的插件
在slave里面也要下载
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;
show status like '%rpl%'; ##此时显示值为on
在master里面;
show status like '%rpl%'; ###master_status 为on
show variables like '%rpl%'; ###variable_name 会显示
测试:
在master里面增加个库和表
use wubian;
insert into usertb values('user4','444');
select * from usertb; ##显现有没有进去
在slave里面做
show databases;
use wubian; ##数据库有同步过来
show tables;
select * from usertb; ##观看数据有没有同步过来
在master里面;
show status like '%rpl%'; ###最后一行master_yes_tx应该为1,根据自己插入的东西而不断增加 _tx_waits 也会不断增加
在slave里面,
stop slave io_thread;
在master里面;
show status like '%rpl%';
##master_status oFF
##master_no_tx 2; ##没有传过去的文件数为2
在slave里面,
start slave io_thread;
在master里面;
show status like '%rpl%';
##master_status on
###一主三从
在master里面
mysqldump -p wubian > wubian.sql ###复制数据库,保证数据的一致性
scp wubian.sql server3:/root
在server3里面,
6 tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
7 ls
8 rpm -qa | grep mysql ##查看你虚拟机有什么关于mysql的包
18 yum install mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-1.el6.x86_64.rpm mysql-community-libs-5.7.17-1.el6.x86_64.rpm mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm mysql-community-server-5.7.17-1.el6.x86_64.rpm
在server2里面
vim /etc/my.cnf
server-id=2
log-bin=mysql-bin ##二进制日志文件
log-slave-updates=ON ##允许slave来更新数据
gtid_mode=ON
enforce-gtid-consistency=true
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16 ##开启16个线程
master_info_repository=TABLE
relay_log_info_repository=TABLE ##用表的形式保存数据
relay_log_recovery=ON
/etc/init.d/mysqld restart
mysql -p
grant replication slave on *.* to repl@'%' identified by 'Wb@123456';
在server3里面
mysql -h 172.25.254.2 -u repl -p ##看是否可以登上去
vim /etc/my.cnf
server-id=3
gtid_mode=ON
enforce-gtid-consistency=true
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16 ##开启16个线程
master_info_repository=TABLE
relay_log_info_repository=TABLE ##用表的形式保存数据
relay_log_recovery=ON
/etc/init.d/mysqld start
grep password /var/log/mysqld.log ##得到密码
mysl_secure_installation ##初始化
mysql -p ##看是否可以等进去
show databases;
在server2里面
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_slave_enabled=1;
SET GLOBAL rpl_semi_sync_master_enabled=1;
show plugins;
stop slave io_thread;
start slave io_thread;
show status like '%rpl%'; ###主要看有没有开启
在server3里面
mysqladmin -p create wubian; ##建立一个库
mysql -p wubian < wubian.sql ##要求数据同步
mysql -p
use mysql
show tables
select * from gtid_executed;
change master to master_host='172.25.17.2',master_user='repl',master_password='Wb@123456',master_auto_position=1;
start slave;
show slave status;
NSTALL 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;
然后就是测试插入东西,看有没有同步过去
主master
slave
组复制
简介
组复制分单主模式和多主模式,mysql 的复制技术仅解决了数据同步的问题,如果 master 宕机,意味着数据库管理员需要介入,应用系统可能需要修改数据库连接地址或者重启才能实现。(这里也可以使用数据库中间件产品来避免应用系统数据库连接的 问题,例如 mycat 和 atlas 等产品)。组复制在数据库层面上做到了,只要集群中大多数主机可用,则服务可用,也就是说3台服务器的集群,允许其中1台宕机。组复制的流程图如下
特点
● 高一致性
基于原生复制及 paxos 协议的组复制技术,并以插件的方式提供,提供一致数据安全保证;
● 高容错性
只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制;
● 高扩展性
节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息;
● 高灵活性
有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;
多主模式下,所有 server 都可以同时处理更新操作。
####全同步依赖半同步,必须让mysql关闭,他对数据一致性的依赖极高,必须保证数据的一致性,改完之后才能开启服务,每个主机都是master,没有slave;
server1和server2和server3首先必须关掉服务,设置开机不自启
/etc/init.d/mysqld stop
chkconfig mysqld off
在server1里面做
cd /var/lib/mysql
rm -fr *
ls ###此时应该没有任何信息
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
loose-group_replication_group_name="b8b8d7dd-9312-4539-971c-b013f49d6e51" #UUID的格式,获得uuid的方法uuidgen
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.254.1: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="172.25.254.0/24"
loose-group_replication_enforce_update_everywhere_checks=on
loose-group_replication_single_primary_mode=off ##默认为单组模式,我们要把单组模式禁掉
/etc/init.d/mysqld start
grep password /var/log/mysqld.log ##获取密码
mysql_secure_installaition
mysql -p
set sql_log_bin=0; ##禁掉二进制文件
grant replication slave on *.* to rpl_user@'%' identified by 'Wb@123456';##授权登陆
flush privileges; ##刷新
reset master; ###重启master,删掉二进制文件
set sql_log_bin=1; ##重启二进制文件
change master to master_user='rpl_user',master_password='Wb@123456' for channel 'group_replication_recovery'; ##以组的形式进行授权
install plugin group_replication SONAME 'group_replication.so'; ##下载插件
show plugins;##显示有没有下载的插件
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
create database wubian;
use wubian;
create table t1 (c1 int primary key,c2 text not null);###必须以这种格式创建,否则插入不进去数据
insert into t1 values(1,'li');
select * from t1;
####在server2里面做
cd /var/lib/mysql
rm -fr *
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
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="b8b8d7dd-9312-4539-971c-b013f49d6e51" #UUID的格式,获得uuid的方法uuidgen
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.254.2: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="172.25.254.0/24"
loose-group_replication_enforce_update_everywhere_checks=on
loose-group_replication_single_primary_mode=off ##默认为单组模式,我们要把单组模式禁掉
/etc/init.d/mysqld start
grep password /var/log/mysqld.log ##获取密码
mysql_secure_installaition
mysql -p
set sql_log_bin=0;
grant replication slave on *.* to rpl_user@'%' identified by 'Wb@123456';
flush privileges;
reset master;
set sql_log_bin=1;
change master to master_user='rpl_user',master_password='Wb@123456' for channel 'group_replication_recovery';
install plugin group_replication SONAME 'group_replication.so';
show plugins;
start group_replication;
select * from performance_schema.replication_group_members ; ##是否为online
####在server3里面做
cd /var/lib/mysql
rm -fr *
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
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="b8b8d7dd-9312-4539-971c-b013f49d6e51" #UUID的格式,获得uuid的方法uuidgen
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "172.25.254.3: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="172.25.254.0/24"
loose-group_replication_enforce_update_everywhere_checks=on
loose-group_replication_single_primary_mode=off ##默认为单组模式,我们要把单组模式禁掉
/etc/init.d/mysqld startf
grep password /var/log/mysqld.log ##获取密码
mysql_secure_installaition
mysql -p
set sql_log_bin=0;
grant replication slave on *.* to rpl_user@'%' identified by 'Wb@123456';
flush privileges;
reset master;
set sql_log_bin=1;
change master to master_user='rpl_user',master_password='Wb@123456' for channel 'group_replication_recovery';
install plugin group_replication SONAME 'group_replication.so';
show plugins;
start group_replication;
select * from performance_schema.replication_group_members; ##是否为online
测试:
不论在server1或者server2或者server3里面插入东西,三个里面都有所显示
use wubian;
insert into t1 values(2,'wesros');
select * from t1; ##在3个里面查看是否有所显示