mysql 同步复制 异步复制_【3.1】【mysql基本实验】mysql复制(主从复制/异步复制/半同步复制,一主一从)...

关键词:mysql复制(异步复制),mysql异步复制

核心原理:

mysql 复制流程原理

0d1cb76689dbb190b8f9f1866f732a58.png

一个事务在 mysql异步复制中的流程与生命周期

92bb0505e45b940fbc2a31dffb642cb0.png

一个事务,在传统半同步的复制流程

5fbf013e5167d14ee334a69584371587.png

#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

e59d18fd03e8dae5ca773200f0db2e53.png

selinux~~ vim /etc/selinux/config ,然后把selinux=disabled,如下图

116c4e3e496406c0083fcac885b226ee.png

主从搭建

#【0】主从均开启binlog,设置server-id(在配置文件my.cnf下的 [mysqld] 下加入下列参数)

## replication

log-bin=mysql-bin

server-id=1 #从设置为server-id=2binlog_format=ROW

#gtid_mode=on

#enforce_gtid_consistency= 1log_slave_updates= 1 #是否复制日志写入从库的Binlog中binlog_rows_query_log_events=on #在row 模式的binlog中包含SQL EVENTS(即SQL语句也会保留)

master-info-repository=TABLErelay-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 tomaster_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个如下线程,基本就是没有问题了,但是要确认的话,还是得用下面的命令;

e969716b10173a9d6d5b98381081cd77.png

show slave status\G -- 这种带error字样的字段没有信息或者是0,那才是正确的!

11acbfcd8cd659ef09e321c081a4b7e6.png

去主库上做操作,然后从库上验证数据是否同步过来(比如给一个表插入一条数据,注意如果没开自动提交记得commit)

故障诊断

#【9】故障诊断

【9.1】The slave I/O thread stops because master and slave have equal MySQL server UUIDs

原因就是直接用主库的文件覆盖到从库的,导致auto.cnf中的uuid相同;

删掉data目录中的 auto.cnf中的就好了

#【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.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;

63b80353c2d3903c71160776d7fbf479.png

【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%';

01470049580ea3d82e102615f3853f4a.png

圈出第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 start2.修改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 传输

679916edb5ec646b6bded1869fc78708.png

参考:深入浅出mysql开发、优化与管理维护书目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值