技术知识分享

MySQL(Mariadb)数据库实现主主同步

宝塔面板永久版优惠券

今天我们来讲一下主主同步,那么什么是主主同步呢?首先我们先来回顾一下什么是主从同步?所谓主从同步,就是一台主机,一台备用机,主机做了任何操作都会实时同步到备用机,这是单向同步的。那么主主同步呢,就是指两台或多台主机互为主从关系,相互同步。

比如有两台服务器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 [email protected]'%' 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 [email protected]'%' 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服务器,都会相互同步到另一台机器上。

这篇文章不是小白原创的,这篇文章的大佬在LOC连续SEO了2天。我想看看谁的权重高。

未经允许不得转载:pc6a学习分享 » MySQL(Mariadb)数据库实现主主同步
腾讯云服务器秒杀

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址