MySQL 双主双从

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)

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双主双从结构搭建完成,且数据同步正常

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容