上一节我们讲了MySQL(Mariadb)数据库的主从同步的实现过程,链接:http://www.28ab.cn/detail.php?id=6920。今天我们来讲一下主主同步,那么什么是主主同步呢?首先我们先来回顾一下什么是主从同步?所谓主从同步,就是一台主机,一台备用机,主机做了任何操作都会实时同步到备用机,这是单向同步的。那么主主同步呢,就是指两台或多台主机互为主从关系,相互同步。
比如有两台服务器A和B,如果是主从同步的话,那么A作为主机,B作为备用机,A上面的所有操作都会单向同步到B上。
如果是主主同步,则A是B的主机,B同样也是A的主机,A的操作会同步到B,B的操作也会同步到A,两者相互同步。
主从同步的好处是可以读写分离,比如往主机A上写数据,从B里面读数据,这样就可以减轻A的压力。那么主主同步呢?有什么好处呢?其实很明显,如果是主从同步的话,那么当主机坏掉的时候,要把备用机切换成主机,需要耗费一定的时间。
换个角度,如果是主主同步的话,平时就直接是多台机器当主机,那么就可以做负载均衡,向任意机器写入数据和读取数据都可以。同时也可以做数据备份,这样一来数据的安全就更加有保证。
废话不多说,下面我们正式开始讲解主主同步的实现方式。在之前的主从同步中,我们可以发现,如果我们的数据表有使用自增字段的话,单向同步是完全没有问题的。但是现在主主同步的话就存在这么一个问题,假如我同时向AB服务器插入一条数据,那么自增ID可能就重复了。这个也是主主同步需要解决的最关键问题。当然,这个问题解决起来并不难。
首先我们来安装Mariadb数据库
我的测试环境是Debian 9 + Mariadb数据库,我这里拿2台服务器来做测试
提示:两台服务器的数据库版本要相同
安装Mariadb数据库并设置root密码为123456,两台服务器的安装方法都是一样的
apt install mariadb-server -y
mysql -uroot -e "grant all on *.* to root@'%' identified by '123456';"
mysql -uroot -e "delete from mysql.user where password = '';"
mysql -uroot -e "update mysql.user set Grant_priv = 'Y';"
mysql -uroot -e "flush privileges;"
#设置mariadb接受远程连接
sed -i '1,$s/bind-address\s*=\s*127.0.0.1/bind-address=0.0.0.0/g' /etc/mysql/mariadb.conf.d/50-server.cnf
Mariadb的数据库配置文件是:/etc/mysql/mariadb.conf.d/50-server.cnf
注意:下面所提到的参数全部都是在[mysqld]节点下添加
像主从同步一样,在这个文件的[mysqld]节点下先添加两个参数,两台服务器都要添加,注意server-id不要相同
server-id=1
log-bin=mysql-bin
然后添加最关键的两个参数,也就是解决我们自增ID重复的.首先在A服务器添加以下两个参数
auto_increment_offset = 1
auto_increment_increment = 2
auto_increment_offset,表示该数据库的自增ID从1开始
auto_increment_increment,设置为服务器的总数量,比如我们这里用2台服务器做测试,那么就设置为2。这里设置为2,表示的是每次自增时增长2,即该台数据库的自增ID的顺序为:1,3,4,7,9……
然后在B服务器添加以下两个参数
auto_increment_offset = 2
auto_increment_increment = 2
auto_increment_offset,表示该数据库的自增ID从2开始
auto_increment_increment,设置为服务器的总数量,比如我们这里用2台服务器做测试,那么就设置为2。这里设置为2,表示的是每次自增时增长2,即该台数据库的自增ID的顺序为:2,4,6,8,10……
这样设置,两台服务器的自增ID就完美的错开了,就不会存在重复的问题了。
接着在A、B两台服务器都添加以下这个参数
log-slave-updates = true
修改后的配置文件如下图:
接下来就简单了,跟主从同步的操作基本上一致了,首先是添加用来同步用的账号密码。在A、B两台服务器上添加相同的账号密码
mysql -uroot -p123456
grant replication slave on *.* to repl@'%' identified by '123456';
exit
添加完毕账号后,重启数据库服务
systemctl restart mysql
重启完毕后,重新登录两台服务器的数据库,查看日志文件的信息并记录File和Position信息
mysql -uroot -p123456
show master status;
A服务器:
B服务器:
因为我两个服务器都是全新安装的数据库,所以这些信息都是一样的。接下来在配置同步服务,首先在A服务器配置
change master to master_host='B服务器的IP',master_port=3306,master_user='B服务器的数据库账号repl',master_password='B服务器的数据库密码123456',master_log_file='mysql-bin.000001',master_log_pos=313;
log_file就是主服务器File的值,这里要填写B服务器查询出来的值
master_log_pos就是主服务器Position的值,这里要填写B服务器查询出来的值
然后在B服务器上做相同的设置,注意将以下的信息相应的改成A服务器的信息
change master to master_host='A服务器的IP',master_port=3306,master_user='A服务器的数据库账号repl',master_password='A服务器的数据库密码123456',master_log_file='mysql-bin.000001',master_log_pos=313;
log_file就是主服务器File的值,这里要填写A服务器查询出来的值
master_log_pos就是主服务器Position的值,这里要填写A服务器查询出来的值
执行完毕后,再执行start slave;开启同步
然后在A、B服务器上执行show slave status\G;查看同步状态
当看到以下两个参数是YES就说明配置已经生效
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
接下来我们在A服务器上创建数据库test01,看看B服务器是不是同步创建了数据库
跟着我们在B服务器的test01数据库上创建表t_01,表里面有三个字段,其中id字段是自增,然后再刷新一下A服务器,看看是不是已经同步了t_01表过去
接下来我们在A服务器上插入一条数据到表t_01
insert into t_01(name,age) values('张三',30);
接下来我们再继续向A服务器插入一条数据
insert into t_01(name,age) values('李四',55);
大家也可以向B服务器里面插入数据试试,看看自增ID是怎么变化的。
至此为止,我们的主主同步操作就已经完成了。后面所有的操作,不管是在A服务器,还是在B服务器,都会相互同步到另一台机器上。
温馨提示:如果同步的时候想指定数据库,或者排除某些数据库不想同步的,可以使用以下两个参数:
binlog-do-db=test
binlog-ignore-db=mysql
binlog-do-db指定是需要同步的数据库,如果不指定的话默认同步全部数据库,如果有多个数据库要设置的话,需要写多行
binlog-ignore-db表示需要忽略,不进行同步的数据库,如果有多个数据库要设置的话,需要写多行。一般情况下为了维持各个服务器的账号等数据,都会设置忽略mysql自带的数据库mysql,test这些
陈浩南
3台以上的服务器,怎么设置主主同步呢 ?秋风下的落叶
主主同步最关键的就是自增ID的问题,只要设置好这两个参数就可以解决了auto_increment_offset和auto_increment_increment。你仔细看一下文章,里面有提到怎么设置的。