一、数据库复制 replication 实现原理
mysql 的主从复制功能是基于 binlog 操作日志的,其过程如下:
从数据库执行 start salve ,开启主从复制开关
从数据库的 io 线程会使用主数据上授权的用户请求连接主数据库,并请求指定的 binlog 日志。
主数据接收到来自从数据库的 io 线程的请求后,主数据库上负责复制的 io 线程根据从数据库的请求信息,读取指定的 binlog 文件的指定位置,返回给从数据库的io线程,返回的信息除了本次请求的日志内容外,还是有本次返回的日志内容后在主数据上新的 binlog 文件名称及在 binlog 中的位置(供从数据库下次请求 binlog 使用)。
从数据的 io 线程获取到来自主数据上的 io 线程发送的 binlog 后,将 binlog 中的内容依次写入到从数据库自身的 relaylog(中继日志)文件(Mysql-info-realy-bin.XXXX) 的最末端,并将新的 binlog 文件名和位置记录到 Master-info 文件中,以便下一次读取主数据库的新 binlog 日志时,能够告诉 master 服务器需要从新 binlog 日志的那个文件那个位置,开始返回给从数据库。
从数据库的 sql 线程会实时的检测本地 relay log 中新增的日志内容,然后及时把 log 文件中的内容解析成在主数据库曾经执行的 sql 语句,并在自身从数据库上按顺序执行这些 sql 语句。
至此,正常情况下,主从数据库,就可以实现同步。
架构图:
流程图:
二、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。
被动模式下的主主复制
两台服务器地位一样,但新增只用一台服务器,另一台设置为只读。当写服务器发生故障时,可以迅速改读服务器的配置为可读可写。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。