MySQL 数据库双向复制、循环复制(镜像)

MySQL数据库复制、镜像、实时备份的文章中,主数据库A 的数据镜像到从数据库B,是单向的,网站的数据读写都必须在数据库A进行,结果会自动镜像到数据库B中。但是对数据库B的直接操作,不会影响数据库A。

对于双向数据库镜像,就是数据库A的数据变化要镜像到数据库B中,同时数据库B里的修改也要同时复制到数据库A里。
对于循环数据库镜像,就是多个数据库A、B、C、D等,对其中任一个数据库的修改,都要同时镜像到其它的数据库里。

应用:同一个网站的数据库和程序,可以放置在不同的主机上,在任一台主机上新增的订单、客户资料,都会同时加入其它的主机数据库里。

要实现双向或循环数据库镜像,首先要解决的就是防止数据库中自动递增(AUTO_INCREMENT)字段的冲突,以免多数据库各自生成一样的增量值。

下面以三台主机循环镜像为例,A是B的主镜像,B是C的主镜像,C是A的主镜像。三台主机上MySQL设置文件 /etc /my.cnf 中分别加入下面的参数:

#
主机一:美国主机 A, IP: 100.101.102.201
[mysqld]
server-id                      = 10
log-bin                         = mysql-bin
log-slave-updates
replicate-same-server-id       = 0
auto_increment_increment        = 10
auto_increment_offset          = 1
master-host                     = 100.101.102.203
master-user                    = repl_user
master-password                 = repl_password
report-host                     = 100.101.102.201

#
主机二:中国主机 B, IP: 100.101.102.202
[mysqld]
server-id                      = 20
log-bin                         = mysql-bin
log-slave-updates
replicate-same-server-id       = 0
auto_increment_increment        = 10
auto_increment_offset          = 2
master-host                     = 100.101.102.201
master-user                    = repl_user
master-password                 = repl_password
report-host                     = 100.101.102.202

#
主机三:本地主机 C, IP: 100.101.102.203
[mysqld]
server-id                      = 30
log-bin                         = mysql-bin
log-slave-updates
replicate-same-server-id       = 0
auto_increment_increment        = 10
auto_increment_offset          = 3
master-host                     = 100.101.102.202
master-user                    = repl_user
master-password                 = repl_password
report-host                     = 100.101.102.203

简单说明:
server-id:数据库标识,每个数据库标识必须唯一;
replicate-same-server-id:设置为0,防止数据循环更新;
auto_increment_increment:这是循环镜像里最重要的参数之一,表示自动增量为10,这将允许最多10台数据库加入这个循环镜像的阵列,而自动递增字段不会重复。
auto_increment_offset:这是循环镜像里最重要的参数之一,表示偏移值,每个数据库的偏移值必须唯一,且在1和auto_increment_increment之间。
master-host:主数据库服务器的IP;
master-user:用于连接主数据库的镜像用户名;
master-password:用于连接主数据库的镜像密码;
report-host:提供给主数据库用于反向连接的IP,因为主数据库有时无法正确判断从服务器的IP,所以这里最好填上从服务器自己的IP地址。

另外,有时只需要镜像某些数据库,可以在 my.cnf 中加入:
replicate-do-db = db_name1
replicate-do-db = db_name2
replicate-do-db = db_name3

这样就仅仅镜像 db_name1/db_name2/db_name3

如果只是某些数据库不要镜像,可以在 my.cnf 中加入:
replicate-ignore-db=db_name1
replicate-ignore-db=db_name2
replicate-ignore-db=db_name3

这样镜像时就忽略 db_name1/db_name2/db_name3 这三个数据库。

2 thoughts on “MySQL 数据库双向复制、循环复制(镜像)

  • 星期一 五月 9th, 2011 at 15:59
    Permalink

    看了你的文章,写得不错
    但是我想问下,MySQL的双机复制可以确保任一台服务器当掉都没问题。但是像你上面所说的三台复制,201上修改的数据通过202然后再到203,如果202那一台当掉了,那203就同步不到201的数据了。
    此外如果服务器很多,组的这个同步环很大,那同步的时延就会非常大。

    Reply

黄忠进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注