先从 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 安装
- 参考:https://blog.csdn.net/hongguo_cheng/article/details/80293264,要在两个虚拟机中均安装成功。
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;
在 master-2 上执行如下命令:
mysql> show master status;
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)
对表的操作可自行进行测试。