设为首页 收藏本站
查看: 951|回复: 0

[经验分享] Mysql5.6.21半同步

[复制链接]

尚未签到

发表于 2018-10-9 09:05:47 | 显示全部楼层 |阅读模式
  Mysql在5.5版本引入了半同步的概念,在这里也普及一些基础知识。
  
  一:神马是半同步,同步,异步。
  1:Mysql的复制过程就是slave去master拉日志回来,存到relay文件中,然后执行。
  2:Master根本不考虑数据是否达到了slave,或者slave是否执行成功了。
  3:默认情况下mysql主从复制就是异步的方式,别看好像数据刚被创建,slve就可以看到了,因为你的数据量太小了,无法感受到异步的现象。
  4:同步就是两边信息都完全一样,master确认了slvae数据复制并执行成功,才叫同步。
  我们举个生产例子说明一下这件事。
  生产中是否做过数据库读写分离?不管什么数据库,读写分离就是为了减轻数据库压力,假设我们有2台服务器,A是写入库,B是读库。用户注册了你网站的会员,注册的时候,是通过A库写入, 登录的时候是同步B服务器,对吧?
  异步:
  注册写到A库,应用前端直接返回注册成功,然后B库才到A库拉取新数据,在本地执行同步。如果由于网络,数据量等原因,B库还没有执行新数据,新用户就点击登录窗口,这个时候,应用前端就提示该用户尚未注册。。蛋疼了吧??
  同步情况:
  注册写到A库,A库要把信息同步到B库,确定B库执行成功后,返回信息给前端,这个时候应用前端才显示注册成功。用户在注册后登录就不会出现异常了。这才符合逻辑吧?Mysql主从复制中,主库根本不去考虑从库是否把信息拷贝过去,或者成功执行了。
  半同步又是什么概念??
  如果按mysql主从复制原理看,slave到master把数据垃取下来,然后执行,执行完后,把状态返回给master,这个时候应用程序才给客户端响应成功,这种延迟,用户都接受吗?找一个折中的方法:Mysql半同步在5.5版本横空出世。
  半同步情况:
  一主一从,一主多从情况下,Master节点只要确认至少有一个slave接受到了事务,即可向发起请求的客户端返回执行成功的操作,master节点是不需要等待slave节点成功执行完这个事务。slave节点接受到这个事务,并成功写入到本地relay日志中,就算是成功了。
  半同步在数据完成性上得到了保障,起码主从架构中,有一个备份集,当然,这也不是说半同步配置成功,就不会丢失数据,都是有可能的,比如sql错误,半同步发现错误后,默认会自动转换成半同步的。有利有弊,半同步也增加了成本,对性能也有一定的影响。开源的就是这样。不然为什么Oracle要收费。哈哈。。
  
  
  二:查看系统是否支持半同步
  查看是否加载半同步插件。
  sql> show plugins;
  查找是否有semisync字母。如果没有跟着步骤走。
  步骤1:查找mysql插件目录位置。
  sql>show variables like ‘plugin_dir‘;
  +---------------+--------------------------------+
  | Variable_name | Value                 |
  +---------------+--------------------------------+
  | plugin_dir   | /usr/local/mysql56/lib/plugin/ |
  +---------------+--------------------------------+
  步骤2:查看目录文件是否存在。
  $ll /usr/local/mysql56/lib/plugin/

  我们可以发现有2个文件,一个是master.so 一个是slave.so,在主服务器加载master文件,在从服务器加载slave文件就可以。
  实验环境描述:我们接着上一章的Mysql-Gtid复制。
  A:192.168.112.131
  B:192.168.112.132 (主Master)
  C:192.168.112.129
  
  三:加载半同步插件。
  主服务器:192.168.112.132
  sql> install plugin rpl_semi_sync_master soname ‘semisync_master.so‘;
  查看是否加载插件
  sql> show plugins;
rpl_semi_sync_master   | ACTIVE  | REPLICATION     | semisync_master.so | GPL  从服务器:192.168.112.129
  sql> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so‘;
  查看是否加载插件
  sql> show plugins;
rpl_semi_sync_slave    | ACTIVE  | REPLICATION    | semisync_slave.so | GPL  四:启动半同步插件。
  Master:启用插件
  (192.168.112.132)
  sql>set global rpl_semi_sync_master_enabled = on;
  Slave:启动半同步,slave要重启动IO线程,否则还是异步的方式同步数据。
  (192.168.112.129)
  sql>set global rpl_semi_sync_slave_enabled = on;
  sql>stop slave IO_THREAD;
  sql>start slave IO_THREAD;
  
  
  五:查看半同步的状态。
  1:在master中查看,slave是没有这几个信息的。
  sql>show status like ‘%Rpl_semi_sync%‘;

  解释几个重要的值。
Rpl_semi_sync_master_status是否启用了半同步。Rpl_semi_sync_master_clients半同步模式下Slave一共有多少个。Rpl_semi_sync_master_no_tx往slave发送失败的事务数量。Rpl_semi_sync_master_yes_tx往slave发送成功的事务数量。  2:半同步几个参数设置
  sql>show variables like ‘%Rpl%‘;

  注释:
rpl_semi_sync_master_timeoutMaster等待slave响应的时间,单位是毫秒,默认值是10秒,超过这个时间,slave无响应,环境架构将自动转换为异步复制rpl_semi_sync_master_trace_level监控等级,一共4个等级(1,16,32,64),后续补充详细。rpl_semi_sync_master_wait_no_slave是否允许master 每个事物提交后都要等待slave的receipt信号。默认为on ,每一个事务都会等待,如果slave当掉后,当slave追赶上master的日志时,可以自动的切换为半同步方式,如果为off,则slave追赶上后,也不会采用半同步的方式复制了,需要手工配置。rpl_stop_slave_timeout  控制stop slave 的执行时间,在重放一个大的事务的时候,突然执行stop slave ,命令 stop slave会执行很久,这个时候可能产生死锁或阻塞,严重影响性能,mysql 5.6可以通过rpl_stop_slave_timeout参数控制stop slave 的执行时间
  3:半同步数据测试
  Master添加数据
  sql>create table t20(id int);
  查看状态
  sql>show status like ‘%Rpl_semi_sync%‘;

  Rpl_semi_sync_master_no_tx: 0
  Rpl_semi_sync_master_yes_tx: 1
  可以看到执行成功,并返回了状态。
  
  六:将C节点加入半同步。
  IP:192.168.112.129
  1:加载激活C-slave节点服务器。
  这四个步骤直接执行即可。前提是C节点是和B节点建立了GTID复制的环境。
  sql>install plugin rpl_semi_sync_slave soname ‘semisync_slave.so‘;
  sql>set global rpl_semi_sync_slave_enabled = on;
  sql>stop slave IO_THREAD;
  sql>start slave IO_THREAD;
  2:在B主服务器查看状态。
  sql> show status like ‘%Rpl_semi_sync%‘;

  Rpl_semi_sync_master_clients:2  可以看到,节点的数量已经是两个了。
  3:继续测试数据。
  sql>create table t21(id int);
  sql>show status like ‘%Rpl_semi_sync%‘;

  Rpl_semi_sync_master_no_tx: 0
  Rpl_semi_sync_master_yes_tx: 2
  可以看到执行成功,并返回了状态。状态是2不是3,符合了理论值,半同步值确保有一台服务器接受到了数据。
  七:半同步主从切换。
  A:192.168.112.131
  B:192.168.112.132 (主Master)
  C:192.168.112.129
  考虑每个服务器都可能成为主服务器,所以都需要加载master主从插件,不激活就行了。
  1:在主服务器加载半同步slave插件。
  sql>install plugin rpl_semi_sync_slave soname ‘semisync_slave.so‘;
  2:在从服务器加载半同步master插件。
  sql>install plugin rpl_semi_sync_master soname ‘semisync_master.so‘;
  描述:模拟master宕机,A服务器接管服务。
  3:模拟一下环境,先把C服务器的slave服务关闭。
  标准的关闭slave方式,生产中,确保把已复制到relay的日志文件执行了。
  sql>stop slave io_thread;
  sql>stop slave;
  4:B主manster服务器添加新数据。
  sql>create table t22(id int);
  sql>create table t23(id int);
  sql>create table t24(id int);
  5:B主master服务器关闭mysql服务。
  $sh mysql_shutdown.sh

  6:A服务器关闭slave服务,切换主数据库模式。
  sql>stop slave io_thread;
  sql>stop slave;
  启动主库半同步插件。
  sql>set global rpl_semi_sync_master_enabled = on;
  sql>show status like ‘%Rpl_semi_sync%‘;

  Rpl_semi_sync_master_clients:1 可以看到目前还没有新的slave连接自己。
  八:C节点加入新master服务器。
  1:C节点连接新master服务器。
  sql>change master to master_host=‘192.168.112.131‘, master_user=‘ruser‘,master_password=‘rpass‘,master_auto_position=1;
  2:新master添加新数据。(192.168.112.131)
  sql>create table t25(id int);
  sql>create table t26(id int);
  sql>create table t27(id int);
  3:C节点启动slave服务,查看C节点slave状态。
  sql>start slave;
  sql>show slave status\G

  4:A节点查看主从复制状态。
  sql>show status like ‘%Rpl_semi_sync%‘;

  Rpl_semi_sync_master_clients 1: 一个从节点
  Rpl_semi_sync_master_no_tx  0: 没有错误
  Rpl_semi_sync_master_yes_tx 3: 成功3次事务
  九:源Master节点B,加入新master。
  1:启动mysql服务
  $sh mysql_startup.sh
  2:与新master节点建立主从连接,启动slve服务。
  先关闭slave服务
  sql>stop slave;
  sql>change master to master_host=‘192.168.112.131‘, master_user=‘ruser‘,master_password=‘rpass‘,master_auto_position=1;
  sql>start slave;
  3:查看主从复制状态(此刻是异步复制)
  sql>start slave;

  
  
  4:检查数据表是否成功同步。
  sql>use testhuang
  sql>show tables;

  4:启动半同步。
  sql>set global rpl_semi_sync_slave_enabled = on;
  sql>stop slave IO_THREAD;
  sql>start slave IO_THREAD;
  5:主数据库查看状态。
  sql>show status like ‘%Rpl_semi_sync%‘;

  发现clients现在的值是2.
  6:测试,主服务器添加数据测试。
  省略.....................


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-619388-1-1.html 上篇帖子: mysql学习笔记(3-相关术语) 下篇帖子: Mysql数据库理论基础一:MySQL编译安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表