全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 1072|回复: 9

技术分享:MySQL(Mariadb)数据库实现主主同步

[复制链接]
发表于 2019-1-23 19:49:50 | 显示全部楼层 |阅读模式
本帖最后由 3000 于 2019-1-23 20:51 编辑

原文链接:http://www.28ab.cn/detail.php?id=6921


上一节我们讲了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服务器,都会相互同步到另一台机器上。
发表于 2019-1-23 19:53:27 来自手机 | 显示全部楼层
你是来seo的吗……
发表于 2019-1-23 19:53:53 | 显示全部楼层
 楼主| 发表于 2019-1-23 20:05:17 | 显示全部楼层
xfspace 发表于 2019-1-23 19:53
http://www.hostloc.com/thread-516367-1-1.html

大哥你是瞎了吗
 楼主| 发表于 2019-1-23 20:49:23 | 显示全部楼层
why? 发表于 2019-1-23 19:53
你是来seo的吗……


大哥你咋这么牛逼?
发表于 2019-1-23 20:53:53 来自手机 | 显示全部楼层
3000 发表于 2019-1-23 20:49
大哥你咋这么牛逼?

你去谷歌搜一下
http://www.28ab.cn/detail.php?id=6921
 楼主| 发表于 2019-1-23 20:54:39 | 显示全部楼层
why? 发表于 2019-1-23 20:53
你去谷歌搜一下
http://www.28ab.cn/detail.php?id=6921

啥意思?去谷歌搜啥?
发表于 2019-1-23 20:54:41 | 显示全部楼层
建议写到百家号里去
 楼主| 发表于 2019-1-23 20:56:39 | 显示全部楼层
why? 发表于 2019-1-23 20:53
你去谷歌搜一下
http://www.28ab.cn/detail.php?id=6921

搜链接对我的网站有什么卵用?
 楼主| 发表于 2019-1-23 20:58:21 | 显示全部楼层
hxuf 发表于 2019-1-23 20:54
建议写到百家号里去

百家号是什么来的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-4-24 07:17 , Processed in 0.067270 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表