环境准备
两台虚拟机:
master1的IP:192.168.192.136
master2的IP:192.168.192.135
一、配置
master1操作:
-
修改my.cnf的配置文件
设置server-id值,并开启bin_log日志,重启mysql。
[root@localhost ~]# vim /etc/my.cnf [mysqld] character_set_server=utf8 #设置MySQL的字符编码 validate_password=off #关闭MySQL的密码策略,可设置成简单的密码,可以不写入,这里主要是为了方便 log_bin=master1 max_binlog_size=1024M #binlog单文件最大 server_id=11 auto_increment_offset=1 #自增id起始值 auto_increment_increment=2 #每次自增数字 [root@localhost ~]# systemctl restart mysqld
-
建立同步账号
[root@localhost ~]# mysql -uroot -p123 mysql> grant replication slave on *.* to repl@192.168.192.135 identified by '123456';
-
查看主库状态,记住file值和position值。
mysql> show master status; +----------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +----------------+----------+--------------+------------------+-------------------+ | master1.000003 | 456 | | | | +----------------+----------+--------------+------------------+-------------------+
master2操作:
-
修改my.cnf的配置文件
设置server-id值,并开启bin_log日志,重启mysql。
[root@localhost ~]# vim /etc/my.cnf [mysqld] character_set_server=utf8 #设置MySQL的字符编码 validate_password=off log_bin=master1 max_binlog_size=1024M #binlog单文件最大 server_id=11 auto_increment_offset=1 #自增id起始值 auto_increment_increment=2 #每次自增数字 [root@localhost ~]# systemctl restart mysqld
-
建立同步账号
[root@localhost ~]# mysql -uroot -p321 mysql> grant replication slave on *.* to 'repl21'@192.168.192.136 identified by '654321';
-
查看主库状态,记住file值和position值。
mysql> show master status; +----------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +----------------+----------+--------------+------------------+-------------------+ | master2.000003 | 154 | | | | +----------------+----------+--------------+------------------+-------------------+
master1与master2相互同步配置,在上面步骤的基础之上进行操作。
-
master1设置与master2同步,启动master1从库
mysql> change master to -> master_host='192.168.192.135', -> master_port=3306, -> master_user='repl21', -> master_password='654321', -> master_log_file='master2.000003', -> master_log_pos=154; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql> start slave; Query OK, 0 rows affected (0.01 sec) #查看是否配置成功 mysql> show slave status\G;
-
master2设置与master1同步,启动master2从库
mysql> change master to master_host='192.168.192.136',master_port=3306,master_user='repl',master_password='123456',master_log_file='mysql.000003',master_log_pos=456; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> start slave; Query OK, 0 rows affected (0.01 sec) #查看是否配置成功 mysql> show slave status\G;
另:
由于我们不是一开始就配置同步的,所以未同步之前的数据双方不会共享,如果要将双方的数据弄成一样的话,就需要用到mysqldump备份、scp文件传输、以及mysql将文件写入到另一方的数据库中。
追加:
如果我们要配置多主多从的话,就要在每个master的配置文件中(my.cnf)添加一个参数—— log-slave-updates ,在多主多从配置中很重要的一个参数,与log_bin一同使用,表示开启master的slave的二进制日志。如果没有这个参数。
假设有个双主双从的配置:master1,master2,slave1(是master1的slave),slave2(是master2的slave)
当你在 master1 上修改 db 数据, master2 的 db 数据会更新,但 slave2 的 db 不会更新。原因是在 master1 上修改数据时, master2 就只是一个 slave ,master2不会把更新数据写入 log-bin 中,只会写入 log-slave 中。
如果你想要 slave2 能跟着 master1 更新数据,就要在 master2 的 my.cnf 配置文件里加上 log-slave-updates 。
比较建议,在配置多主多从时,在每个 master 上的配置文件都添加上 log-slave-updates 。
log-slave-updates 是与 log-bin 一同使用。