关键词:mysql复制(异步复制),mysql异步复制mysql
核心原理:linux
mysql 复制流程原理sql
一个事务在 mysql异步复制中的流程与生命周期数据库
一个事务,在传统半同步的复制流程vim
#mysql主从基本实验centos
步骤目录:服务器
前提网络
异步复制(asynchronous )架构
#【0】主从均开启binlog,设置server-idapp
#【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=1 #从设置为server-id=2 binlog_format= ROW #gtid_mode = on #enforce_gtid_consistency = 1 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='123456', 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】一主一从结构迁移从库架构图
具体作法是这样:
#【12】半同步复制(Semisynchronous )
在异步复制的参数及操做以后,开启以下步骤
【1.2】半同步复制配置(5.7) 两种办法 【1.2.1】手动安装半同步复制插件(在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.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=1 #MySQL开启主的半同步复制(rpl_semi_sync_master_enabled) loose_rpl_semi_sync_slave_enabled=1 #MySQL5.6开启从的半同步复制 loose_rpl_semi_sync_master_timeout=5000 #超时5秒,切回异步 rpl_semi_sync_master_wait_for_slave_count=1 #至少收到1个slave发会的ack rpl_semi_sync_master_wait_point=AFTER_SYNC #MySQL 5.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开发、优化与管理维护书目