这里以容器为例来做个实验

mysql版本是5.29

centos容器镜像

节点描述 节点ip  

节点vip,对接业务

master1节点 172.17.0.6   vip:172.17.0.11
master2节点 172.17.0.7  
slave1节点 172.17.0.8 同步 master1 的数据

vip:172.17.0.12

slave2节点

172.17.0.9 同步master2 的数据

slave3节点

172.17.0.10 用于专业的数据库备份  

 

 

 

 

 

 

 

 

 

 

master1节点配置

[root@2cc95893a4c9 /]# cat /etc/my.cnf
[client]
port=3306
socket=/data/mysql/tmp/mysql.sock
#default-character-set = utf8

[mysqld]
############################ system  ##################################
server-id                                             = 1
port                                                  = 3306
user                                                  = mysql
read_only                                             = off
character-set-server                                  = utf8
socket                                                = /data/mysql/tmp/mysql.sock
datadir                                               = /data/mysql/data
basedir                                               = /data/mysql

auto-increment-increment        = 2  表示自增长字段每次增长的量,默认值是1,取值范围是1~65535.配置双主双从的话;两台的增长量都配置为2。
auto-increment-offset   = 1  表示自增长字段从哪个字开始,取值范围是1~65535。配置双主双从的话,两台分别配置为1和2.
......................................

.....................................

 

重启数据库 : /etc/init/mysqld restart

配置同步的账户:grant all privileges on *.* to repl@'%' identified by "123456";

更新:flush privileges;

如果是生产环境:最好将库锁住,仅仅允许读,以保证数据一致性;待主主同步环境部署后再解锁;
锁住后,就不能往表里写数据,但是重启mysql服务后就会自动解锁!

flush tables with read lock;  锁只读

查看master1上面二进制日志的详细信息

show  master status\G

 

------------------------------------------------   master 2  配置------------------------------------

xxxx】cat /etc/my.cnf

[client]
port=3306
socket=/data/mysql/tmp/mysql.sock
#default-character-set = utf8

[mysqld]
############################ system  ##################################
server-id                                             = 220
port                                                  = 3306
user                                                  = mysql
read_only                                             = off
character-set-server                                  = utf8
socket                                                = /data/mysql/tmp/mysql.sock
datadir                                               = /data/mysql/data
basedir                                               = /data/mysql

auto-increment-increment                              = 2
auto-increment-offset                                 = 2
.................................................

................................................

配置同步用户

grant replication slave,replication client on *.* to repl@'%' identified by "123465";   【解释:如果你之前是认为replication slave 是复制所必须的权限,那么你就错了,为了安全性一般都需要replication slave 。如果单独设置replication slave,replication client 复制其实都可以运行的。mysql有一些特殊的权限允许复制进程运行,运行在从服务器上的I/O线程创建了到master的连接,这就意味着必须在主服务器上创建一个用户并且需要授予特殊的权限。这样I/O线程就会一特定的身份连接到主服务器上并且读取二进制日志。但是需要说明的一点是,复制用户在主服务器上实际只需要replication  client  权限就可以运行的,这里授予replication  slave的原因是用于监视和管理复制账号需要这个权限,并且这两个功能(复制需要的权限,监视和管理复制账号权限)通常是一个账号在管理,而不是为了达到这两个目标而分别设置2个账号。】

刷新:flush privileges;

生产环境的话建议将库锁起来,只能读

flush tables with read lock;

查看master2的二进制日志情况

show master status;

--------------------------------------------  配置master1 同步 master2 的数据   -------------------------------------------------------------------

unlock tables; //先解锁,将对方数据同步到自己的数据库中用,当然了,如果之前就没有锁的话就不用解锁了。

slave stop;停slave同步,一般之前没有配置slave的话也不用这个操作。

change master to master_host='172.17.0.7',master_user='repl',master_password='12346',master_log_file='mysql-bin.000001',master_log_pos=430;   这个就是配置master1 去同步 master2 的数据了。

start slave; 开启slave同步。

--------------------------------------------  配置master2 同步 master1 的数据   -------------------------------------------------------------------

unlock tables; //先解锁,将对方数据同步到自己的数据库中用,当然了,如果之前就没有锁的话就不用解锁了。

slave stop;停slave同步,一般之前没有配置slave的话也不用这个操作。

change master to master_host='172.17.0.6',master_user='repl',master_password='12346',master_log_file='mysql-bin.000001',master_log_pos=430;   这个就是配置master1 去同步 master2 的数据了。

start slave; 开启slave同步。

--------------------------------------------  配置slave1 同步 master1 的数据   -------------------------------------------------------------------

unlock tables; //先解锁,将对方数据同步到自己的数据库中用,当然了,如果之前就没有锁的话就不用解锁了。

slave stop;停slave同步,一般之前没有配置slave的话也不用这个操作。

change master to master_host='172.17.0.6',master_user='repl',master_password='12346',master_log_file='mysql-bin.000001',master_log_pos=430;   这个就是配置master1 去同步 master2 的数据了。

start slave; 开启slave同步。

--------------------------------------------  配置slave2 同步 master2 的数据   -------------------------------------------------------------------

unlock tables; //先解锁,将对方数据同步到自己的数据库中用,当然了,如果之前就没有锁的话就不用解锁了。

slave stop;停slave同步,一般之前没有配置slave的话也不用这个操作。

change master to master_host='172.17.0.7',master_user='repl',master_password='12346',master_log_file='mysql-bin.000001',master_log_pos=430;   这个就是配置master1 去同步 master2 的数据了。

start slave; 开启slave同步。

--------------------------------------------  配置slave3 同步 master1 的数据   -------------------------------------------------------------------

unlock tables; //先解锁,将对方数据同步到自己的数据库中用,当然了,如果之前就没有锁的话就不用解锁了。

slave stop;停slave同步,一般之前没有配置slave的话也不用这个操作。

change master to master_host='172.17.0.6',master_user='repl',master_password='12346',master_log_file='mysql-bin.000001',master_log_pos=430;   这个就是配置master1 去同步 master2 的数据了。

start slave; 开启slave同步。