【3.1】【mysql基本实验】mysql复制(主从复制/异步复制/半同步复制,一主一从)
关键词:mysql复制(异步复制),mysql异步复制
核心原理:
mysql 复制流程原理
一个事务在 mysql异步复制中的流程与生命周期
一个事务,在传统半同步的复制流程
#mysql主从基本实验
步骤目录:
前提
异步复制(asynchronous )
#【0】主从均开启binlog,设置server-id
#【1】准备复制账户
#【2】在主库上,设置读锁定有效。以便获取一个一致性的快照(flush table with read lock)
#【3】show master status;获取主库当前的二进制日志名和偏移量pos位置。
#【4】备份主库还原到从库(直接copy,或者mysqldump)
解锁主库(unlock tables;)
#【5】跳过从线程启动Mysql (mysqld_safe --skip-slave-start &)
#【6】在mysql下配置从库复制线程(change master to )
#【7】在mysql下启动从线程并验证
#【8】开始验证
#【9】故障诊断
#【10】主从挂了怎么快速切换恢复
#【11】一主一从结构迁移从库架构图
#【12】半同步复制
#【13】复制的日常管理与维护
详情:
前提:
(0)测试环境:2台centos6.5,都装有单实例 mysql5.7.26
(1)网络可以互相ping通:ping 192.168.135.158
(2)双方端口是否侦听开启:netstat -an|grep 3306
(3)防火墙策略:service iptables stop;(这里只是测试,我就直接关闭了哈)
(4)selinux策略:getenforce(查看状态) setenforce 0 (关闭)
(5)彻底关闭开机自启:
防火墙 ~~ chkconfig iptables off
selinux~~ vim /etc/selinux/config ,然后把selinux=disabled,如下图
#【0】主从均开启binlog,设置server-id(在配置文件my.cnf下的 [mysqld] 下加入下列参数)
- ## replication
- log-bin=mysql-bin
- server-id= #从设置为server-id=
- binlog_format= ROW
- #gtid_mode = on
- #enforce_gtid_consistency =
- log_slave_updates = 1 #是否复制日志写入从库的Binlog中
binlog_rows_query_log_events=on #在row 模式的binlog中包含SQL EVENTS(即SQL语句也会保留)
master-info-repository=TABLE
relay-log-info-repository=TABLE
master-connect-retry=60
#【1】在主库上 准备复制账户
mysql下操作:(这里的host ip是从库IP)
主:grant replication slave on *.* to 'repl'@'192.168.135.159' identified by '123456';
-- 可以顺道测试一下使用该账户是否能在从库上连接上主库。
#【2】在主库上,设置读锁定有效。以便获取一个一致性的快照
mysql下操作:(锁表,获取一致性)
flush tables with read lock;
#【3】在主库上 show master status;获取主库当前的二进制名和偏移量pos位置。
show master status;
-- 查看到的日志名:mysql-bin.000002 , postion: 881
#【4】备份主库还原到从库
逻辑方式:mysqldump。然后scp拷贝过去。然后登录上从库的mysql,直接把dump的文件加载进去即可。
物理方式:直接拷贝,备份删除从库原有data目录,然后把主库的data目录复制过去,复制到从库后记得删除拷贝过来data/下的auto.cnf,否则uuid会一样,导致无法复制出现故障【9】。
不管是物理还是逻辑方式,CP或者mysqldump完后,就都可以解锁主库了
在主库的mysql登录下,使用命令,unlock tables;
#【5】在从库上 跳过从线程启动Mysql
#注意,要这样使用,需要配置好环境变量,否则请切换到mysql文件 bin 目录下后,再执行该命令
mysqld_safe --skip-slave-start &
#【6】在mysql下 配置从库复制线程
- -- mysql环境下
- change master to
- master_host='192.168.135.158',
- master_port=3306,
- master_user='repl',
- master_password='',
- master_log_file='mysql-bin.000002',
- master_log_pos=881;
#【7】在从库上 在mysql下启动从线程并验证
start slave;
#【8】在从库上 开始验证
show processlist; -- 一般有2个如下线程,基本就是没有问题了,但是要确认的话,还是得用下面的命令;
show slave status\G -- 这种带error字样的字段没有信息或者是0,那才是正确的!
去主库上做操作,然后从库上验证数据是否同步过来(比如给一个表插入一条数据,注意如果没开自动提交记得commit)
#【9】故障诊断
【9.1】The slave I/O thread stops because master and slave have equal MySQL server UUIDs
原因就是直接用主库的文件覆盖到从库的,导致auto.cnf中的uuid相同;
#【10】主从挂了怎么快速切换恢复
1.备份主库上的data目录 mv data data.org
2.从库上scp data目录到主库上 scp -r data 主库:/databases/data/3306/
3.检查my.cnf配置文件,主要保证innodb_log_file_size和innodb_log_files_in_group要和从库设置一致。
4.注意修改data目录里的auto.cnf文件,里面记录的是服务器的uuid,请修改回主库data.org目录下的auto.cnf文件。
5.启动mysql,看错误日志,应该可以正常启动了
6.恢复后的主库上,清除复制关系 mysql> reset slave all;
7.原从库启动数据库,并重做主从 mysql> reset slave all;
8.mysql> change master to ...
#【11】一主一从结构迁移从库架构图
具体做法是这样:
- 研发将 102 的读业务切到主库;
- 确认 102 MySQL 状态(主要看 PROCESS LIST),观察机器流量,确认无误后,停止 102 从节点的服务;
- 103 新建 MySQL 实例,建成以后,停止 MySQL 服务,并且将整个数据目录 mv 到其他地方做备份;
- 将 102 的整个 mysql 数据目录使用 rsync 拷贝到 103;
- 拷贝的同时,在 101 授权,使 103 有拉取 binlog 的权限(REPLICATION SLAVE, REPLICATION CLIENT);
- 待拷贝完成,修改 103 配置文件中的 server_id,注意不要和 102 上的一致;
- 在 103 启动 MySQL 实例,注意配置文件中的数据文件路径以及数据目录的权限;
- 进入 103 MySQL 实例,使用 SHOW SLAVE STATUS 检查从库状态,可以看到 Seconds_Behind_Master 在递减;
- Seconds_Behind_Master 变为 0 后,表示同步完成,此时可以用 pt-table-checksum 检查 101 和 103 的数据一致,但比较耗时,而且对主节点有影响,可以和开发一起进行数据一致性的验证;
- 和研发沟通,除了做数据一致性验证外,还需要验证账号权限,以防业务迁回后访问出错;
- 做完上述步骤,可以和研发协调,把 101 的部分读业务切到 103,观察业务状态;
- 如果业务没有问题,证明迁移成功。
#【12】半同步复制(Semisynchronous )
在异步复制的参数及操作之后,开启如下步骤
- 【1.2】半同步复制配置(5.7)
- 两种办法
- 【1.2.】手动安装半同步复制插件(在mysql环境下,主从都安装)
- 【step 1】安装半同步插件
- 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 2】设置开启半同步参数
建议都开启,以免主备切换时需要重新加;如果分开,如下图;
在主库上:set global rpl_semi_sync_master_enabled=1;
在从库上:set global rpl_semi_sync_slave_enabled=1;
如果异步复制正在运行,需要在从库运行一下命令 才会使用半同步;
stop slave io_thread;start slave io_thread;
【step 3】检查状态
在主库查看半同步状态: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事务不是半同步模式下从库及时响应的(比如可能有网络延迟,导致半同步超时切换成异步)
- 【1.2.】写入配置文件(推荐使用,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.7,参数前面加上loose_,如下列,如果是5.6 则直接使用 rpl_semi_sync_master_enabled=1 之类的就好了。
#我这里是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(传统半同步)
#【13】复制的日常管理与维护
(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 传输
参考:深入浅出mysql开发、优化与管理维护书目
【3.1】【mysql基本实验】mysql复制(主从复制/异步复制/半同步复制,一主一从)的更多相关文章
- MySQL 基础知识梳理学习(五)----半同步复制
1.半同步复制的特征 (1)从库会在连接到主库时告诉主库,它是不是配置了半同步. (2)如果半同步复制在主库端是开启了的,并且至少有一个半同步复制的从节点,那么此时主库的事务线程在提交时会被阻塞并等待 ...
- MySQL主从复制半同步复制原理及搭建
在MySQL5.5之前的版本中,MySQL的复制是异步复制,主库和从库的数据之间存在一定的延迟,比如网络故障等各种原因,这样子容易存在隐患就是:当在主库写入一个事务成功后并提交了,但是由于从库延迟没有 ...
- MySQL 5.7 基于GTID主从复制+并行复制+半同步复制
环境准备 IP HOSTNAME SERVICE SYSTEM 192.168.131.129 mysql-master1 mysql CentOS7.6 192.168.131.130 mysql- ...
- MySQL主从复制、半同步复制和主主复制
同步,异步,半同步复制的比较: 同步复制:Master提交事务,直到事务在所有的Slave都已提交,此时才会返回客户端,事务执行完毕.缺点:完成一个事务可能会有很大的延迟. 异步复制:当Slave准备 ...
- Mysql半同步复制模式说明及配置示例 - 运维小结
MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二 ...
- 安装MySQL半同步复制
一.简介 从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认 ...
- MySQL 半同步复制+MMM架构
200 ? "200px" : this.width)!important;} --> 介绍 上篇文章介绍了MMM架构的实现方法,但是上篇文章的MMM方案的复制是异步复制,异 ...
- MySQL半同步复制搭建
默认情况下,MySQL 5.5/5.6/5.7和MariaDB 10.0/10.1的复制是异步的,异步复制可以提供最佳性能,主库把binlog日志发送给从库,这一动作就结束了,并不会验证从库是否接收完 ...
- MySQL/MariaDB数据库的半同步复制
MySQL/MariaDB数据库的半同步复制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL半同步复制概述 1>.MySQL默认的异步复制 默认情况下,M ...
- MySQL半同步复制
从MySQL5.5开始,MySQL以插件的形式支持半同步复制.如何理解半同步呢?首先我们来看看异步,全同步的概念 异步复制(Asynchronous replication) MySQL默认的复制即是 ...
随机推荐
- 网页制作怎么加MP4,用HTML代码
<video src="movie.mp4" controls="controls"> 您的浏览器不支持 video 标签. </video& ...
- wx小程序知识点(六)
六.生命周期 (1)onLoad —— 加载时触发,只调用一次,可用来发送请求绑定数据.获取url中参数 (2)onShow —— 页面显示时触发,每次显示都会执行,用来获取需要频繁更新的数 ...
- Linux不同机器文件挂载
由于此前发布项目应用时,需要对两台文件服务器进行文件挂载,所以才实际第一次接触到这个名词,但由于一直以来自己没有真正的去操作过,只是停留在一些理论层次,所以今天记录一下这个实现过程,以备后用. 使用设 ...
- cat:连接文件并打印输出到标准输出设备
是 concatenate(连接.连续)的简写.cat 命令可以用来显示文本文件的内容,也可以把几个文件内容附加到另一个文件中,即连接合并文件. cat 命令的基本格式如下: [root@localh ...
- el-input和和filter结合实现实时搜索
<el-input placeholder="请选择日期" clearable prefix-icon="el-icon-search" v-model= ...
- crontab 常见 /dev/null 2>&1 详解
大部分在 crontab 计划任务中都会年到未尾带 >/dev/null 2>&1,是什么意思呢? > 是重定向 /dev/null 代表空设备文件 1 表示stdout标准 ...
- R_Studio(cart算法决策树)对book3.csv数据用测试集进行测试并评估模型
对book3.csv数据集,实现如下功能: (1)创建训练集.测试集 (2)用rpart包创建关于类别的cart算法的决策树 (3)用测试集进行测试,并评估模型 book3.csv数据集 setwd( ...
- JS框架_(JQuery.js)带阴影贴纸标签按钮
百度云盘 传送门 密码:azo6 纯CSS带阴影贴纸标签按钮效果: <!doctype html> <html> <head> <meta charset=& ...
- Unity3D_(网格导航)简单物体自动寻路
NavMesh(导航网络)是3D游戏世界中用于实现动态物体自动寻路的一种技术,它将游戏场景中复杂的结构组织关系简化为带有一定信息的网格,进而在这些网格的基础上通过一系列的计算来实现自动寻路. 实现Ca ...
- Docker入门-构建第一个Java程序
定制镜像 准备一个没有第三方依赖的java web项目,可能参考示例maven结构项目: session-web.war 把该war上传到安装有docker软件的服务器上宿主目录下.在同级目录创建Do ...