Mysql主从复制-基于日志点的复制

前言

mysql的复制能减轻数据库的读负载压力。mysql的复制功能(异步,可能会导致同一时间点上数据不一致问题)是基于二进制日志增量进行的。同时建议在同一个IDC机房中进行复制,以减少网络问题带来的问题。

mysql的复制格式主要有两种,SBR(基于SQL语句复制)和RBR(基于行复制),实际生产中一般建议采用基于行的复制方式,该种方式能较好的解决线上主从服务器复制不一致的问题,主从复制性能也相对基于SBR复制方式性能好。

MySQL复制工作流程大致如下:主服务器将数据库变更写入二进制日志—>从服务器读取二进制文件并写入到relay_log中—>在从服务器上重放relay_log中的日志。

Mysql主从复制-基于日志点的复制_第1张图片 主从复制实现简图(图片来源于网络)

尤其要注意的是,安装mysql后务必开启mysql的二进制日志,有些mysql版本中默认是关闭二进制日志功能的,防止日后已经在运行中的mysql才开启是需要重启机器的,比较麻烦。同时无论采用哪种复制拓扑,主从的服务器mysql版本务必保持一致,避免由版本不一致带来的问题。

Mysql主从复制-基于日志点的复制

日志点的复制是mysql5.6以前常用的主从复制模式,mysql5.6开始推出了基于GTID的复制,文末有基于GTID复制的文章讲解。

我这里还是以一主一从的复制拓扑来搭建mysql基于日志点的复制功能(Master:10.200.121.167  Slave:10.200.121.29)。

1、在主DB服务器上建立复制账号并授权复制权限

CREATE USER 'simons'@'10.200.121.%' IDENTIFIED by '123456';

GRANT replication SLAVE ON *.* TO 'simons'@'10.200.121.%';

2、配置Master主数据库服务器中的mysql配置文件 :vim /etc/my.cnf,添加

log_bin=mysql-bin
server_id=100        #动态参数,但在集群中是唯一的

log_bin是二进制日志的文件名,默认路径在 ${mysql安装路径}/data下,以mysql-bin.00000x的形式存在

3、配置Slave从数据库服务器中的mysql配置文件:vim /etc/my.cnf,添加

log_bin=mysql-bin
server_id=102
relay_log=/var/lib/mysql-relay-bin     
log_slave_updates=1 
read_only=1  

relay_log是中继日志的存放目录;log_slave_updates为1表示开启链式复制,比如A->B->C;read_only=1表示从服务器mysql只读模式,建议开启

4、初始化Slave从服务器数据,将Master服务器上的mysql数据初始化到Slave中的mysql机器上

mysqldump --single-transaction --master-data=2 --all-databases -uroot -p > all.sql

我这里使用mysqldump工具,导出Master上的mysql数据,接下来发送到slave机器上

scp all.sql [email protected]:/

然后在Slave从服务上执行导入all.sql(初始化)

[root@simonsfan /]# mysql -u root -p < all.sql

5、Slave机器上切换master并启动复制链路

CHANGE MASTER TO MASTER_HOST = '10.200.121.167',       #Master服务器ip                 
                 MASTER_USER = 'simons',               #步骤一建立的用户       
                 MASTER_PASSWORD = '123456',           #步骤一建立的密码
                 MASTER_LOG_FILE = 'mysql-bin.000001', #主库上的二进制文件名称
                 MASTER_LOG_POS = 154;                 #日志偏移量 

MASTER_LOG_FILE 和 MASTER_LOG_POS在刚才的all.sql中查找

Mysql主从复制-基于日志点的复制_第2张图片 all.sql部分数据截图

如果正常的话,mysql主从复制就可以了。不正常的话,就根据具体的错误信息调整

注意:

1、执行change master to ……命令时候可能会报错:ERROR 1776 (HY000): Parameters MASTER_LOG_FILE, MASTER_LOG_POS, RELAY_LOG_FILE and RELAY_LOG_POS cannot be set when MASTER_AUTO_POSITION is active.

这个时候需要执行:change master to master_auto_position=0;命令即可。我这里也报了这个错,是因为之前这两台机器是通过GITD的复制的,现在调整为基于日志点复制;

接着在Slave从服务器上启动

#启动复制链路
mysql> start slave;

#查看slave状态
mysql> show slave status;

注意:

上述步骤执行start slave命令时候可能会报错:Slave SQL for channel '': Slave failed to initialize relay log info structure from the repository, Error_code: 1872,我的也报了这个错,因为我Slave从服务器上的配置文件my.cnf中继日志relay_log=/var/lib/mysql-relay-bin,这里没有执行权限导致的,于是执行了 

[root@simonsfan /]# chmod 777 /var/lib/mysql-relay-bin

mysql> reset slave;

mysql> start slave;

Mysql主从复制-基于日志点的复制_第3张图片

检验主从复制功能:如上便实现了基于日志点的复制功能,在Master上执行新的SQL,数据均会同步到了Slave机器上,校验结果就不贴图了。

 

基于日志点复制的优点

1、是比较早的复制方式,bug相对较少;

2、对SQL查询没有什么限制;

3、故障处理时比较容易;

基于日志点复制的缺点

故障转移时获取主服务器的节点信息比较难,比如日志偏移量。Mysql官方也考虑到这个问题,在mysql5.6以后推出了基于GTID的复制来实现Mysql的复制。

引申文章:

Mysql主从复制-基于GTID复制(https://blog.csdn.net/fanrenxiang/article/details/70197004)

Mysql二进制日志详解(https://blog.csdn.net/fanrenxiang/article/details/70193636)

你可能感兴趣的:(Mysql,数据库)