mysql主主被动复制_mysql主从复制 主主复制

一、数据库复制 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 语句。

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

架构图:

3cc0823f5b7c8d41ef8dcb908ce1b996.png

流程图:

eb6fbb2527773bd19b7407f624da1702.png

二、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;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值