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

[经验分享] mysql5.7.19的半同步复制问题分享

[复制链接]

尚未签到

发表于 2018-10-7 12:10:57 | 显示全部楼层 |阅读模式
  ===
  异步复制(Asynchronous replication)
  MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。
  全同步复制(Fully synchronous replication)
  指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
  半同步复制(Semisynchronous replication)
  介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
  引用:http://www.cnblogs.com/ivictor/p/5735580.html
  AFTER_SYNC (the default): The master writes each transaction to its binary log and the slave, and syncs the binary log to disk. The master waits for slave acknowledgment of transaction receipt after the sync. Upon receiving acknowledgment, the master commits the transaction to the storage engine and returns a result to the client, which then can proceed.
  AFTER_COMMIT: The master writes each transaction to its binary log and the slave, syncs the binary log, and commits the transaction to the storage engine. The master waits for slave acknowledgment of transaction receipt after the commit. Upon receiving acknowledgment, the master returns a result to the client, which then can proceed.
  ====
  半同步复制会设置一个超时的时间,如果超过这个时间从服务器没有给主服务器确认信息,主服务器会启用异步复制,当检测到从服务器又好了,主服务器又会采用半同步复制。
  配置半同步复制
  mysql> show variables like "have_dynamic_loading";
  +----------------------+-------+
  | Variable_name        | Value |
  +----------------------+-------+
  | have_dynamic_loading | YES   |
  +----------------------+-------+
  1 row in set (0.02 sec)
  mysql>
  要想使用半同步复制,必须满足以下几个条件:
  1. MySQL 5.5及以上版本
  2. 变量have_dynamic_loading为YES
  3. 异步复制已经存在
  首先加载插件
  因用户需执行INSTALL PLUGIN, SET GLOBAL, STOP SLAVE和START SLAVE操作,所以用户需有SUPER权限。
  主:
  mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
  从:
  mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
  然后在主和从上查看插件是否启用
  mysql>show plugins;
  | rpl_semi_sync_master       | ACTIVE   | REPLICATION        | semisync_master.so   | GPL     |
  ====
  启动半同步复制
  在安装完插件后,半同步复制默认是关闭的,这时需设置参数来开启半同步
  主:
  mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
  从:
  mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
  以上的启动方式是在命令行操作,也可写在配置文件中。
  主:
  plugin-load=rpl_semi_sync_master=semisync_master.so
  rpl_semi_sync_master_enabled=1
  从:
  plugin-load=rpl_semi_sync_slave=semisync_slave.so
  rpl_semi_sync_slave_enabled=1
  查看半同步是否在运行
  主:
  mysql> show status like 'Rpl_semi_sync_master_status';
  +-----------------------------+-------+
  | Variable_name               | Value |
  +-----------------------------+-------+
  | Rpl_semi_sync_master_status | ON    |
  +-----------------------------+-------+
  1 row in set (0.00 sec)
  从:
  mysql> show status like 'Rpl_semi_sync_slave_status';
  +----------------------------+-------+
  | Variable_name              | Value |
  +----------------------------+-------+
  | Rpl_semi_sync_slave_status | ON    |
  +----------------------------+-------+
  1 row in set (0.20 sec)
  这两个变量常用来监控主从是否运行在半同步复制模式下。
  至此,MySQL半同步复制搭建完毕~
  ====
  修改完配置文件后,直接加入加载插件和启用半同步复制,重启刷新mysqld服务后,导致半同步复制没有起来
  mysql> show status like 'Rpl_semi_sync_slave_status';
  +----------------------------+-------+
  | Variable_name              | Value |
  +----------------------------+-------+
  | Rpl_semi_sync_slave_status | OFF    |
  +----------------------------+-------+
  1 row in set (0.02 sec)
  mysql>
  导致的原因是:主服务器上的二进制日志的文件和位置和从服务器的relay-log.info里的文件名和位置不一致导致
  主服务器上的信息
  mysql> show master status;
  +-------------------------+----------+--------------+------------------+-------------------+
  | File                    | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  +-------------------------+----------+--------------+------------------+-------------------+
  | MySQL-master-bin.000002 |      154 |              |                  |                   |
  +-------------------------+----------+--------------+------------------+-------------------+
  1 row in set (0.00 sec)
  从服务器上的信息
  mysql> show slave status\G;
  ERROR 2006 (HY000): MySQL server has gone away
  No connection. Trying to reconnect...

  Connection>  Current database: *** NONE ***
  *************************** 1. row ***************************
  Slave_IO_State:
  Master_Host: 192.168.0.137
  Master_User: backup
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: Mysql-master-bin.000001
  Read_Master_Log_Pos: 1508
  Relay_Log_File: mysql-slave-relay-bin.000010

  >
  >  Slave_IO_Running: No   启动不了
  Slave_SQL_Running: Yes
  Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'  错误提醒

  [root@mysql-slave mysql]# cat>  7
  ./mysql-slave-relay-bin.000010
  4
  Mysql-master-bin.000001    ---》文件和位置不一致
  1508
  0
  0
  1
  [root@mysql-slave mysql]#
  解决方法:
  mysql> show master status; 查看主服务器上的日志文件和位置
  +-------------------------+----------+--------------+------------------+-------------------+
  | File                    | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  +-------------------------+----------+--------------+------------------+-------------------+
  | MySQL-master-bin.000002 |      154 |              |                  |                   |
  +-------------------------+----------+--------------+------------------+-------------------+
  1 row in set (0.00 sec)
  mysql>
  从服务器里设置日志文件名和位置
  mysql> change master to master_log_file='MySQL-master-bin.000002',master_log_pos=154;
  mysql> show status like 'Rpl_semi_sync_slave_status'; 查看
  +----------------------------+-------+
  | Variable_name              | Value |
  +----------------------------+-------+
  | Rpl_semi_sync_slave_status | ON    |
  +----------------------------+-------+
  1 row in set (0.02 sec)
  mysql>
  最后ok了


运维网声明 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-614320-1-1.html 上篇帖子: mysql计算 TPS,QPS 的方式 下篇帖子: 通过SQL语句查看mysql数据库的大小
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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