关键词,mysql半同步复制

【0】实验环境

操作系统:CentOS linux 7.5

数据库版本:5.7.24

数据库架构:主从复制,主库用于生产,从库用于数据容灾和主库备机,采用默认传统的异步复制。

主库IP:192.168.1.201  端口:3306

从库IP:192.168.1.202  端口:3306

正文:

【1】配置my.cnf

【1.1】通用复制配置

#replication_new
log_bin=/mysql/log//mysql-bin #开启binlog
log_bin_index=/mysql/log//mysql-bin.index
binlog_format=row
binlog_rows_query_log_events=on
max_binlog_size= bind-address=0.0.0.0
server_id=
expire_logs_days= #超过7天的binlog清理
innodb_support_xa=
binlog_cache_size=1M
log_bin_trust_function_creators= #同步存储过程、函数、触发器
innodb_flush_log_at_trx_commit=
sync_binlog=
transaction-isolation=read-committed relay_log=/mysql/log//relaylog/mysql-relay.log
log-slave-updates=
read_only=
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=
master_info_repository=table #master_info 会记录到 mysql.slave_master_info
relay_log_info_repository=table #relay_log 会记录到,mysql.slave_relay_log_info
relay_log_recovery=
slave_skip_errors=ddl_exist_errors
slave_preserve_commit_order=

【2】半同步复制配置的2种办法(5.7)

  两种办法

  【.】手动安装半同步复制插件(在mysql环境下,主从都安装)

    【step 】安装半同步插件
    install plugin rpl_semi_sync_master soname 'semisync_master.so';
    install plugin rpl_semi_sync_slave soname 'semisync_slave.so';     show plugins; -- 查看插件安装情况 or select * from mysql.plugin;
      
     
     【step 】设置开启半同步参数       建议都开启,以免主备切换时需要重新加;如果分开,如下图;       在主库上:set global rpl_semi_sync_master_enabled=;       在从库上:set global rpl_semi_sync_slave_enabled=;       如果异步复制正在运行,需要在从库运行一下命令 才会使用半同步;         stop slave io_thread;start slave io_thread;      【step 】检查状态       在主库查看半同步状态:show status like '%rpl_semi%';          
        圈出第1行表示,连接主库的客户端个数。

        圈出第2行表示,该实例做为半同步的主库状态,是on,是开启的。

        最后1行,Rpl_semi_sync_slave_status,表示该实例,作为半同步的从库状态,是off,不是从库。

        (但是从库上进行查看时,图中的 master_status 与 slave_status 应该正好相反,作为主库是关闭的,作为从库是开启的)

        其他重要参数,

          Repl_semi_sync_master_yes_tx:表示已经同步的事务数,0表示还没有任何一个事务以半同步的方式复制到从库

          Repl_semi_sync_master_no_tx:假如为3,表示当前有3事务不是半同步模式下从库及时响应的(比如可能有网络延迟,导致半同步超时切换成异步)

  【.】写入配置文件(推荐使用,my.cnf)

    show variables like 'plugin%'; -- 查看插件路径

#修改my.cnf 复制代码
#如果已经有异步复制了,也不需要改其他的,只需要把下面参数加入到my.cnf,重启mysql服务即可。
#如果业务不允许宕机重启实例,那么可以参考方法1,并且把该段代码加上,就可以直接用了。
plugin_dir=/mysql/app/mysql/lib/plugin/
plugin_load=rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so #如果是5.,参数前面加上loose_,如下列,如果是5. 则直接使用 rpl_semi_sync_master_enabled= 之类的就好了。
#我这里是5.7就直接做增强半同步了(loseless Semisynchronous )
loose_rpl_semi_sync_master_enabled= #MySQL开启主的半同步复制(rpl_semi_sync_master_enabled)
loose_rpl_semi_sync_slave_enabled= #MySQL5.6开启从的半同步复制
loose_rpl_semi_sync_master_timeout= #超时5秒,切回异步
rpl_semi_sync_master_wait_for_slave_count= #至少收到1个slave发会的ack
rpl_semi_sync_master_wait_point=AFTER_SYNC #MySQL .7的方法,AFTER_SYNC(default,增强半同步) & AFTER_COMMIT(传统半同步)

【3】进行初始化操作

【3.1】完全同步情况

#【】在主库和从库上 准备复制账户 
create user 'rpl'@'192.168.1.%' identified by '123456';
grant replication slave on *.* to 'rpl'@'192.168.1.%';
flush privileges;
select user,host from mysql.user;
#【】在主库上,设置读锁定有效。以便获取一个一致性的快照   
mysql下操作:(锁表,获取一致性)   
flush tables with read lock; #【】在主库上 show master status;获取主库当前的二进制名和偏移量pos位置。  
 show master status;   
-- 查看到的日志名记录下来,比如:mysql-bin. , postion: #【】备份主库还原到从库   
逻辑方式:mysqldump。然后scp拷贝过去。然后登录上从库的mysql,直接把dump的文件加载进去即可。
物理方式:直接拷贝,备份删除从库原有data目录,然后把主库的data目录复制过去。
复制到从库后记得删除拷贝过来data/下的auto.cnf,否则uuid会一样,导致无法复制。   
不管是物理还是逻辑方式,CP或者mysqldump完后,就都可以解锁主库了   
在主库的mysql登录下,使用命令,unlock tables;

【3.2】如果业务正在跑,利用备份还原恢复同步

#【】在主库和从库上 准备复制账户 
create user 'rpl'@'192.168.1.%' identified by '';
grant replication slave on *.* to 'rpl'@'192.168.1.%';
flush privileges;
select user,host from mysql.user; #【】利用备份
#mysqldump,如果备份时加了--master-data=2参数,是有记录binlog文件和位置的。
    
#XtraBackup,也会复制Binlog文件和位置信息
    

#【】开始还原
利用备份去进行还原,这个时候多半是不一致的,因为业务在跑。
这个时候利用备份中的binlog 来做 change master to #【4】change master to 示例
change master to
master_host='192.168.1.201',
master_port=3306,
master_user='rep',
master_password='123456',
master_log_file='mysql-bin.000002',
master_log_pos=154;

【4】参数解析

【4.1】show status like '%rpl%'; -- 查看半同步状态

主库:

Variable_name
--------------------------------------------
Rpl_semi_sync_master_clients           --已连接到本机主库的客户端输了
Rpl_semi_sync_master_net_avg_wait_time       --平均等待时间
Rpl_semi_sync_master_net_wait_time       --总等待时间
Rpl_semi_sync_master_net_waits         --等待次数
Rpl_semi_sync_master_no_times         --关闭半同步的次数
Rpl_semi_sync_master_no_tx            --没有成功同步提交的事务个数 
Rpl_semi_sync_master_status           --主库半同步状态(on为打开半同步,off为异步) 
Rpl_semi_sync_master_timefunc_failures     --调用函数失败的次数
Rpl_semi_sync_master_tx_avg_wait_time     --事务平均等待时间、平均传输时间
Rpl_semi_sync_master_tx_wait_time       --事务总等待时间 、总传输时间
Rpl_semi_sync_master_tx_waits         --事务的总等待次数
Rpl_semi_sync_master_wait_pos_backtraverse   -- 后来的事务先来了,先来的事务还没有到的次数
Rpl_semi_sync_master_wait_sessions       -- 当前有多少Session 因为slave 而造成的等待 
Rpl_semi_sync_master_yes_tx           -- 成功被slave恢复同步的事务个数 
Rpl_semi_sync_slave_status          -- 表示当前本词库是异步还是半同步(主库应该为off,从库因为on)

【4.2】show variables like '%rpl%'; -- 查看半同步配置参数

【5】复制的日常管理

#复制的日常管理与维护

  (1)show slave status\G :在从库查看从库线程状态

  (2)flush tables with read lock;  :主从不一致后锁表。

    然后 show master status\G

    然后 show slave status\G 来查看从库同步状态 或者重新 change master to....

    然后 select master_pos_wait('mysql-bin.00002','389'); (即刚刚show master status找到的文件及位置),如果为1 标识超时退出 ,如果为1 则标识主从同步。

    最后再主库 unlock tables; 解锁

  (3)跳过错误

跳过错误有两种方式:
1.跳过指定数量的事务:(建议如果已经出现了错误,使用这种办法)
mysql>slave stop;
mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1 #跳过一个事务
mysql>slave start 2.修改mysql的配置文件,通过slave_skip_errors参数来跳所有错误或指定类型的错误(建议配置时使用这种办法)
vi /etc/my.cnf
[mysqld]
#slave-skip-errors=1062,1053,1146 #跳过指定error no类型的错误,DDL错误类型包含 1007,1008,1050,1051,1054,1060,1061,1068,1091,1146(5.6可以用这个)
#slave-skip-errors=ddl_exist_errors #跳过DDL错误,all:跳过所有错误(mysql5.7才有ddl_exist_errors)

  (4)大对象blog ,text 传输

   

【6】从库宕机如何重新连入主库?

1. 此2个参数rpl_semi_sync_master_enabled  和rpl_semi_sync_slave_enabled  不要直接写入到my.cnf配置文件开启。
2.在slave库上先 stop slave io_thread ;set global rpl_semi_sync_slave_enabled=0 关闭此参数。
然后start slave io_thread 或者start slave 开启异步复制,让slave库追赶上master库。
3.然后在slave库 set global rpl_semi_sync_slave_enabled=1 ;stop slave io_thread;start slave io_thread;

参考文章:

  mysql复制实践:https://www.cnblogs.com/gered/p/11239898.html

  mysql复制日常维护,故障处理:https://www.cnblogs.com/gered/p/11388986.html

(5.5)mysql高可用系列——MySQL半同步复制(实践)的更多相关文章

  1. (5.8)mysql高可用系列——MySQL中的GTID复制(实践篇)

    一.基于GTID的异步复制(一主一从)无数据/少数据搭建 二.基于GTID的无损半同步复制(一主一从)(mysql5.7)基于大数据量的初始化 正文: [0]概念 [0.5]GTID 复制(mysql ...

  2. (5.3)mysql高可用系列——mysql复制之复制的参数

    参考:https://www.iteye.com/blog/shift-alt-ctrl-2269539 详情 [1]参数 #[1.1]基本参数 bind-address=192.168.1.201 ...

  3. (5.3)mysql高可用系列——mysql复制(理论篇)【续写中】

    关键词:mysql主从复制,mysql复制,MGR,mysql并行复制 目录 [1]mysql支持的复制类型 [2]mysql的主从4种同步方式介绍 (1)异步 (2)同步 (3)5.6 半同步 (4 ...

  4. (5.6)mysql高可用系列——MySQL Utilities 管理工具

    关键词:mysql工具集,mysql管理工具,mysql utilities [1]安装mysql utilities cd /download wget https://cdn.mysql.com/ ...

  5. (5.7)mysql高可用系列——MySQL中的GTID复制(理论篇)【转】

    转自:https://blog.csdn.net/wmq880204/article/details/53160078 一.GTID的概述: 1.全局事物标识:global transaction i ...

  6. (5.4)mysql高可用系列——MySQL异步复制(实践)

    关键词:mysql复制,mysql异步复制,mysql传统异步复制 [1]实验环境 操作系统:CentOS linux 7.5 数据库版本:5.7.24 数据库架构:主从复制,主库用于生产,从库用于数 ...

  7. (5.12)mysql高可用系列——复制中的在线切换GTID模式/增加节点/删除节点

    目录 [0]需求 前提,已经假设好基于传统异步复制的主库和从库1. [0.1]传统异步切换成基于GTID的无损模式 [0.2]增加特殊要求的从库 [1]操作环境 [2]构建 复制->半同步复制 ...

  8. MySQL高可用解决方案(MySQL HA Solution)

    http://blog.sina.com.cn/s/blog_7e89c3f501012vtr.html 什么是高可用性?很多公司的服务都是24小时*365天不间断的.比如Call Center.这就 ...

  9. MySQL 高可用:mysql+mycat实现数据库分片(分库分表)

    本文引用于http://blog.csdn.net/kk185800961/article/details/51147029 MySQL 高可用:mysql+mycat实现数据库分片(分库分表) 什么 ...

随机推荐

  1. Java进阶知识07 Hibernate一对一双向外键关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.创建Husband类和Wife类 package com.shore.model; import javax.persistence.Entity; impo ...

  2. mac 强行关掉php

    sudo pkill -INT -o php-fpm//重启php sudo php-fpm //mac brew安装的php可以使用这个开启brew services start homebrew/ ...

  3. 深入理解LINUX下动态库链接器/加载器ld-linux.so.2

    [ld-linux-x86-64.so.2] 最近在Linux 环境下开发,搞了好几天 Compiler 和 linker,觉得有必要来写一篇关于Linux环境下 ld.so的文章了,google上搜 ...

  4. LeetCode 94. 二叉树的中序遍历(Binary Tree Inorder Traversal)

    题目描述 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路 由于 ...

  5. LeetCode 143. 重排链表(Reorder List)

    题目描述 给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. ...

  6. leetcode-hard-array-41. First Missing Positive-NO

    mycode class Solution(object): def firstMissingPositive(self, nums): """ :type nums: ...

  7. LC 413. Arithmetic Slices

    A sequence of number is called arithmetic if it consists of at least three elements and if the diffe ...

  8. leetcode 100. Same Tree、101. Symmetric Tree

    100. Same Tree class Solution { public: bool isSameTree(TreeNode* p, TreeNode* q) { if(p == NULL &am ...

  9. MySQL 存储过程 函数 routine 权限

    MySQL 存储过程 函数 routine 权限 Table of Contents 1. mysql存储过程/函数权限 1.1. 相关对象操作权限检查 1.2. 执行权限 1 mysql存储过程/函 ...

  10. 几行python代码解决相关词联想

    日常生活中经常会遇到相关词联想的问题,也就是说输入一个词汇,把相关的词汇查询出来,听起来这个做法也不是太难,但如何去积累那么多的词汇,再用好的算法将相关内容联系起来,本身还是不简单的.笔者认为最简单的 ...