mysql主从复制 主主复制

一、数据库复制 replication 实现原理

mysql 的主从复制功能是基于 binlog 操作日志的,其过程如下:

  1. 从数据库执行 start salve ,开启主从复制开关

  2. 从数据库的 io 线程会使用主数据上授权的用户请求连接主数据库,并请求指定的 binlog 日志。

  3. 主数据接收到来自从数据库的 io 线程的请求后,主数据库上负责复制的 io 线程根据从数据库的请求信息,读取指定的 binlog 文件的指定位置,返回给从数据库的io线程,返回的信息除了本次请求的日志内容外,还是有本次返回的日志内容后在主数据上新的 binlog 文件名称及在 binlog 中的位置(供从数据库下次请求 binlog 使用)。

  4. 从数据的 io 线程获取到来自主数据上的 io 线程发送的 binlog 后,将 binlog 中的内容依次写入到从数据库自身的 relaylog(中继日志)文件(Mysql-info-realy-bin.XXXX) 的最末端,并将新的 binlog 文件名和位置记录到 Master-info 文件中,以便下一次读取主数据库的新 binlog 日志时,能够告诉 master 服务器需要从新 binlog 日志的那个文件那个位置,开始返回给从数据库。

  5. 从数据库的 sql 线程会实时的检测本地 relay log 中新增的日志内容,然后及时把 log 文件中的内容解析成在主数据库曾经执行的 sql 语句,并在自身从数据库上按顺序执行这些 sql 语句。

  6. 至此,正常情况下,主从数据库,就可以实现同步。

架构图:

《mysql主从复制 主主复制》

流程图:

《mysql主从复制 主主复制》

二、mysql常用相关指令

show master status;     //查看master的状态,尤其是当前的日志及位置
show slave status;     //查看slave的状态
reset slave;            //重置slave状态
start slave;            //启动slave状态(开启监听master的变化)
stop slave;             //暂停salve状态

三、主从基本配置步骤

主服务器:192.168.0.100
从服务器:192.168.0.101

1. 主服务器打开二进制功能

配置my.cnf

# 给服务器起一个唯一的id
server-id=1
# 开启二进制日志
log-bin=mysql-bin
# 指定日志格式
binlog-format=mixd/row/statement
# 重启mysql
# 查看状态
mysql>show master status;
2. 从服务器打开二进制日志和relay日志功能

配置my.cnf

# 服务器id
server-id=2
# 从服务器中继日志
relay-log=mysql-relay
# 指定只读
read-only=1
# 重启服务器
3. 主服务器建立从服务器的账号,并授权
mysql> grant replication slave,replication client on *.* to account@'192.168。0.%' identified by '000000';
mysql> flush privileges;
4. 从服务器指定对应的主服务器,开启从服务器
mysql> change master to
    -> master_host='192.168.0.100'
    -> master_user='account',
    -> master_password='000000',
    -> master_log_file='mysql-bin.00001',
    -> master_log_pos=0;

mysql> start slave;

mysql> show slave status \G;

四、主主复制

两台服务器上都开启二进制日志和relay日志,都设置replication账号,都设置对方为自己的master。
主主复制主键同步冲突问题解决:

1. 设置自增步长
服务器100:
set global auto_increment_increment = 2;
set global auto_increment_offset = 1; 
set session auto_increment_increment = 2;
set session auto_increment_offset = 1; 
服务器101:
set global auto_increment_increment = 2;
set global auto_increment_offset = 2; 
set session auto_increment_increment=2;
set session auto_increment_offset = 2; 

当需要加入新的服务器时,这种方法难以扩展。

2. 新增行时,计算好id

比如oracle数据库的主键id,可以使用序列sequence,每次新增生成递增的id。 mysql可以使用redis设置一个自增id,每次新增取出id。

被动模式下的主主复制

两台服务器地位一样,但新增只用一台服务器,另一台设置为只读。当写服务器发生故障时,可以迅速改读服务器的配置为可读可写。

五、sql语句路由

1. 在程序中判断语句并路由。
2. 使用mysql_proxy;
    原文作者:waterandair
    原文地址: https://segmentfault.com/a/1190000009724090
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞