数据库的半同步复制,全同步复制和一主两从

半同步复制——基于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个里面查看是否有所显示



 

猜你喜欢

转载自blog.csdn.net/weixin_42709236/article/details/83280391