MySQL

CentOS7 中 MySQL 5.7 主主互备配置

Posted on 2021-09-17,5 min read

先从 MySQL 对数据库复制的能力看,MySQL 支持单向、异步的复制。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环。当一个从服务器连接到主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知下一次更新。

现在公司中很多都用到了云服务器,无论是服务器还是数据库,但是我们在开发阶段一般还是公司自己的服务器,在没有 dba 的情况就需要开发人员自己去搭建数据库集群,但是对于小公司来说,两台数据库服务器互为主备也许对开发人员来说就是比较理想的。当然有运维同事帮忙的话会更好,使用 keepalived 搭建个高可用的服务器集群(后面再去研究如何使用 keepalived 搭建)。下面我们就介绍下 CentOS7 中如何搭建 MySQL 主主互备服务器。

1. 主机环境与软件版本

  • 主机系统:CentOS7.6 64 位
  • 两个虚拟机:

主机 (master-1):IP 地址: 10.213.116.11

主机 (master-2):IP 地址: 10.213.116.12

  • MySQL 版本:mysql-5.7.22

2. MySQL 安装

3. MySQL 配置

既然是主主互备,就说明两个数据库都要对外进行服务,为了防止 id 重复,我们需要在配置文件中对两个数据库的自增长的 offset 设置为不同的值,具体如下:

master-1 服务器中文件 /etc/my.cnf 中添加如下配置:

server-id=1                             #server的唯一标识
auto_increment_offset=1                  #自增id起始值
auto_increment_increment=2                #每次自增数字

log-bin = mysql-bin                           #打开二进制功能,MASTER主服务器必须打开此项
max_binlog_size=1024M                          #binlog单文件最大值

replicate-ignore-db = mysql                    #忽略不同步主从的数据库
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = test

master-2 服务器中文件 /etc/my.cnf 中添加如下配置:

server-id = 2                               #server的唯一标识
auto_increment_offset = 2                   #自增id起始值
auto_increment_increment = 2                 #每次自增数字

log-bin = mysql-bin                           #打开二进制功能,MASTER主服务器必须打开此项
max_binlog_size=1024M                          #binlog单文件最大值

replicate-ignore-db = mysql                    #忽略不同步主从的数据库
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = test

4. MySQL 重启

shell> service mysql restart

5. 主从配置

5.1 添加主从同步账户

在 master-1 中添加 repl 用户:

mysql> grant replication slave on *.* to 'repl'@' 10.213.116.12' identified by '1234asdF';

在 master-2 中添加 repl 用户:

mysql> grant replication slave on *.* to 'repl'@' 10.213.116.11' identified by '1234asdF';

5.2 查看主库的状态

在 master-1 上执行如下命令:

mysql> show master status;

https://img-blog.csdn.net/20180512180426454?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hvbmdndW9fY2hlbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

在 master-2 上执行如下命令:

mysql> show master status;

https://img-blog.csdn.net/20180512180444504?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hvbmdndW9fY2hlbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

5.3 配置同步数据

在 master-1 上执行如下命令:

mysql> change master to master_host='10.213.116.12',\
master_port=3306,master_user='repl',master_password='1234asdF',\
master_log_file='mysql-bin.000001',master_log_pos=738;

mysql> start slave;

mysql> show slave status\G;

下面这两个状态表示正常:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

在 master-2 上执行如下命令:

mysql> change master to master_host='10.213.116.11',\
master_port=3306,master_user='repl',master_password='1234asdF',\
master_log_file='mysql-bin.000001',master_log_pos=446;

mysql> start slave;

mysql> show slave status\G;

下面这两个状态表示正常:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

说明

master_log_file: master 的日志文件,则 master-1 互指 master-2 中的数据,根据上图可以得到此值。

master_log_pos: master 的日志文件起始位置,则 master-1 互指 master-2 中的数据,根据上图可以得到此值。

6. 测试主从同步

在 master-1 上执行如下 sql 脚本进行测试:

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| test               |

+--------------------+
rows in set (0.00 sec)

mysql> create database test1;

Query OK, 1 row affected (0.00 sec)

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| test               |

| test01             |

+--------------------+
rows in set (0.00 sec)

同时查看 master-2 中是否创建了数据库 test1

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| test               |

| test1             |

+--------------------+
rows in set (0.00 sec)

对表的操作可自行进行测试。

下一篇: Linux关闭防火墙命令→