0、实验拓扑
1、实验环境
4台CentOS-7.5虚拟机
Master-1:192.168.18.103
Master-2:192.168.18.104
slave-1: 192.168.18.107
slave-2: 192.168.18.108
4台虚机的防火墙+selinux均关闭
2、安装MySQL
注:4台mysql服务器均执行相同的操作:
# rpm -qa mariadb
# rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64
# yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
# rm -rf /etc/my.cnf
# yum -y install mysql-community-server #安装MySQL
# systemctl start mysqld.service #启动MySQL
# systemctl enable mysqld.service #设置MySQL开机自启动
3、初始化MySQL
4台MySQL都要执行如下操作,本实验4台mysql的root密码都为 Ctsi.2020
1)初始化MySQL
# grep 'temporary' /var/log/mysqld.log #获取mysql临时登录密码
# mysql_secure_installation #使用安全配置向导修改MySQL的root用户密码等操作
2)初始化完毕后,尝试登录MySQL
[root@CentOS ~]#
[root@CentOS ~]# mysql -uroot -p'Ctsi.2020'
4、修改MySQL服务器的配置文件
4台MySQL配置略有差异:
1)先配置M1
[root@CentOS ~]#
[root@CentOS ~]# vi /etc/my.cnf
2)接着配置M2
[root@CentOS-2 ~]#
[root@CentOS-2 ~]# vi /etc/my.cnf
3)再配置S1
[root@CentOS-3 ~]#
[root@CentOS-3 ~]# vi /etc/my.cnf
4)最后配置S2
[root@CentOS-4 ~]#
[root@CentOS-4 ~]# vi /etc/my.cnf
5)创建binlog日志的存放路径并授权
注:只需要在M1和M2服务器创建就行,S1和S2没必要创建
# mkdir /var/lib/mysql/binlog
# chown mysql:mysql /var/lib/mysql/binlog
6)重启MySQL
修改完配置以后一定要重启MySQL复制,使配置生效
# systemctl restart mysqld
7)查看binlog是否生成
[root@CentOS ~]#
[root@CentOS ~]# ll /var/lib/mysql/binlog/
4、配置双主双从
1)先配置双主
思路:先配置M1为主,M2为从的环境;在配置M2为主,M1为从的环境
M1为主,M2为从:
[root@CentOS ~]#
[root@CentOS ~]# mysql -uroot -p'Ctsi.2020'
mysql>
mysql> show databases;
mysql>
mysql> grant replication slave on *.* to repluser@192.168.18.104 identified by 'Mysql.2020';
#授权repluser账户可以通过从服务器 192.168.18.104 来登录主服务器并复制主服务器的所有库和所有表
mysql> flush privileges; #刷新授权表
[root@CentOS ~]#
[root@CentOS ~]# mysqldump -uroot -p'Ctsi.2020' --all-databases --single-transaction > /tmp/mysql_full-1.sql #从M1导出一个全备
[root@CentOS ~]# ll /tmp/mysql_full-1.sql
[root@CentOS ~]#
[root@CentOS ~]# scp /tmp/mysql_full-1.sql root@192.168.18.104:/tmp/ #将M1服务器的第一次全备拷贝到从服务器M2
[root@CentOS-2 ~]#
[root@CentOS-2 ~]# mysql -uroot -p'Ctsi.2020' < /tmp/mysql_full-1.sql #去M2端将从M1那里拷贝过来的全备文件还原到M2数据库中,从而实现M1与M2两端数据一致
mysql>
mysql> show master status; #去M1端查看主服务器数据库的状态并记住
说明:这个状态非常重要,后面从机同步的时候要用到,所以要记住
[root@CentOS-2 ~]#
[root@CentOS-2 ~]# mysql -uroot -p'Ctsi.2020' #登录M2端数据库,设置主从复制
mysql>
mysql> change master to
-> master_host='192.168.18.103',
-> master_user='repluser',
-> master_password='Mysql.2020',
-> master_log_file='M1-binlog.000001',
-> master_log_pos=616;
Query OK, 0 rows affected, 2 warnings (0.11 sec)
mysql>
mysql>
mysql> start slave; #在M2端执行,启动slave同步进程
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> show slave status\G #查看slave状态
M2为主,M1为从:
理解:接下来还应该在原来的M1主节点上创建新的用户
(※理解这点很重要,因为前面刚刚已经设置好了主从配置,所以在M1节点上创建会自动同步至M2上,如果在M2上创建用户,则可能会导致两节点数据不一致情况发生)
mysql>
mysql> grant replication slave on *.* to repluser@192.168.18.103 identified by 'Mysql.2020';
# 授权repluser账户可以通过从服务器 192.168.18.103 来登录主服务器并复制主服务器的所有库和所有表
mysql> flush privileges; #刷新授权表
mysql>
mysql> show master status; #去M2端查看主数据库服务器的状态
在M1端,设置主从复制
mysql>
mysql> change master to
-> master_host='192.168.18.104',
-> master_user='repluser',
-> master_password='Mysql.2020',
-> master_log_file='M2-binlog.000001',
-> master_log_pos=831730;
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql>
mysql>
mysql> start slave; #在M1端启动slave同步进程
Query OK, 0 rows affected (0.04 sec)
mysql>
mysql> show slave status\G #查看slave的状态
2)配置M1-S1单主单从
[root@CentOS ~]#
[root@CentOS ~]# mysql -uroot -p'Ctsi.2020' #登录M1设置
mysql>
mysql> grant replication slave on *.* to repluser@192.168.18.107 identified by 'Mysql.2020';
mysql> flush privileges;
[root@CentOS ~]#
[root@CentOS ~]# mysqldump -uroot -p'Ctsi.2020' --all-databases --single-transaction > /tmp/mysql_full-2.sql #M1导出第二个全备文件
[root@CentOS ~]#
[root@CentOS ~]# scp /tmp/mysql_full-2.sql root@192.168.18.107:/tmp/ #将第二个全备从M1拷贝到S1
[root@CentOS-3 ~]#
[root@CentOS-3 ~]# mysql -uroot -p'Ctsi.2020' < /tmp/mysql_full-2.sql #去S1端,将从M1拷来的全备文件恢复到S1的数据库中,实现M1与S1数据一致性
mysql>
mysql> show master status; #查看M1主数据库的状态
在S1端设置主从同步
mysql>
mysql> change master to
-> master_host='192.168.18.103',
-> master_user='repluser',
-> master_password='Mysql.2020',
-> master_log_file='M1-binlog.000001',
-> master_log_pos=1540;
Query OK, 0 rows affected, 2 warnings (0.23 sec)
mysql>
mysql> start slave; #在S1端开启主从同步
Query OK, 0 rows affected (0.17 sec)
mysql>
mysql> show slave status\G #查看slave的状态
3) 配置M2-S2单主单从
在M2端操作:
[root@CentOS-2 ~]#
[root@CentOS-2 ~]# mysql -uroot -p'Ctsi.2020'
mysql>
mysql> grant replication slave on *.* to repluser@192.168.18.108 identified by 'Mysql.2020';
# 授权repluser账户可以通过从服务器 192.168.18.108 来登录主服务器并复制主服务器的所有库和所有表
mysql> flush privileges; #刷新授权表
[root@CentOS-2 ~]#
[root@CentOS-2 ~]# mysqldump -uroot -p'Ctsi.2020' --all-databases --single-transaction > /tmp/mysql_full-3.sql #对M2做一个全备并导出
[root@CentOS-2 ~]#
[root@CentOS-2 ~]# scp /tmp/mysql_full-3.sql root@192.168.18.108:/tmp/ #在M2端将导出的全备文件远程拷贝到S2端
[root@CentOS-4 ~]#
[root@CentOS-4 ~]# mysql -uroot -p'Ctsi.2020' < /tmp/mysql_full-3.sql #去S2端,将从M2端拷来的全备文件恢复到S2数据库中,实现M2和S2两端数据一致
mysql>
mysql> show master status; #去M2端查看主数据库的状态
在S2端设置主从复制
mysql>
mysql> change master to
-> master_host='192.168.18.104',
-> master_user='repluser',
-> master_password='Mysql.2020',
-> master_log_file='M2-binlog.000001',
-> master_log_pos=832654;
Query OK, 0 rows affected, 2 warnings (0.30 sec)
mysql>
mysql> start slave; #启动主从复制
mysql>
mysql> show slave status\G #查看slave的状态
5、双主双从验证
在M1上创建一个名为China的数据库,然后分别去 M2、S1、S2 上去查看是否同步过去
M1端执行:
mysql>
mysql> create database china;
Query OK, 1 row affected (0.15 sec)
mysql>
mysql> show databases;
M2端查看:
S1端查看:
S2端查看:
6、实验结论
经测试,MySQL双主双从结构搭建完成,且数据同步正常