MySQL(Mariadb)数据库实现主主同步(主主复制、双主同步、双向同步)

上一节我们讲了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这些

  1. 本网站所收集的部分资料来源于互联网,本站不对其真实性负责,也不构成任何其他建议。如果您发现有侵犯您权益的内容,请与我们取得联系,我们会及时修改或删除。
  2. 传递知识、传递力量,欢迎各位网友对本站的文章进行转载和分享。
  3. 本站QQ群交流群:904314688  群号:904314688
发表评论
 
评论列表(目前共有 条评论)
陈浩南
3台以上的服务器,怎么设置主主同步呢 ?
2019-08-16 15:08:54
秋风下的落叶
主主同步最关键的就是自增ID的问题,只要设置好这两个参数就可以解决了auto_increment_offset和auto_increment_increment。你仔细看一下文章,里面有提到怎么设置的。
2019-08-16 15:56:17
陈浩南
大佬 ~ 请问,第三台C和第四台D服务器,配置同步服务的时候,是填A服务器,还是B服务器的信息呢?因为A和B都是相互填写对方的服务器IP的;C和D怎么填写?
2019-08-17 15:08:35
秋风下的落叶
b填a,c填b,d填c,然后a填d,这样就形成了闭环。一台监控一台
2019-08-17 16:18:08
陈浩南
非常感谢,已经搭建成功了。但是在4台小鸡上面 mysql 执行 show slave status\G;查看同步状态的时候,4台小鸡最下面都会显示:ERROR: No query specified 这个错误,应该没关系吧?实际操作数据库都会自动同步的,Slave_IO_Running和Slave_SQL_Running 都是 Yes状态。
2019-08-17 18:08:13
秋风下的落叶
应该没有关系的,只要数据那些能成功同步就不怕。你可以收藏我的网站和加入我的QQ群:904314688
2019-08-17 18:15:43

文章搜索

商家广告


版权所有:秋风雅居 (www.198933.com) ©2024 All Rights Reserved.

粤ICP备20031662号