一、环境的准备
1、准备2台机器,安装好MySQL
机器名 | IP | 系统版本 | 数据库版本 |
jfdb | 192.168.232.35 | RedHat 6.7 | 5.7.22 |
jfdb2 | 192.168.232.36 | RedHat 6.7 | 5.7.22 |
2、工作原理
依赖二进制日志(BinaryLog)和中继日志(RelayLog)来实现,主节点Master会把自己每次的改动都记录到BinaryLog中,从节点slave通过读取Master上的BinaryLog,把记录写到自己的RelayLog日志中,然后从服务器上的SQL线程会负责读取这个RelayLog日志,并执行一遍,来保持自己和主节点上的数据同步。
简单来说就是从节点通过读取主节点上的日志,把主节点上执行的SQL在自己这边也执行一遍,只要保持数据库的初始状态是一致的,就能保证数据一直同步下去。
3、该种同步方式不仅可以同步数据,也可以同步存储过程、视图、函数等系统资源。
二、搭建的步骤
1、开启主节点上的BinaryLog
打开/etc/my.cnf文件,添加如下内容
log-bin = mysql-bin
binlog_format = mixed
server-id = 1
read-only=0
binlog-do-db=test
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
auto-increment-increment=10
auto-increment-offset=1
参数含义:
binlog-do-db:用来表示把哪些数据库的改动记录到binary日志中,可以写多行,表示同步多个数据库,注释掉,表示除去忽略的数据库,都同步。
binlog-ignore-db:表示要忽略的数据库,我这里把4个系统数据库忽略了。
auto-increment-increment:是用于双主同步时,解决自增主键冲突的问题的,每次增加10。
auto-increment-offset:表示这台服务器的序号,从1开始。这样做的话,在这台服务器上插入的第一条数据的id就是1,第二条就是11了。
2、在主节点上创建用于同步数据的用户
命令:grant replication slave on *.* to 'repl_user1'@'192.168.232.36' identified by '123456';
注:上面的IP写的是从节点的IP,意思是只用从节点用,只用于同步数据。
3、创建test库和测试的表
命令:create database test default character set utf8;
4、导出test数据库中的数据
(1)先锁定test数据库
命令: FLUSH TABLES WITH READ LOCK;
(2)导出test库的数据
命令:./mysqldump --master-data -uroot -p test >/mysql/test.sql
5、查看主节点的binary日志位置
命令:show master status\G
含义:
File: mysql-bin.000001 ------- 表示当前正在记录的binarylog文件名。
Position: 154 -----表示当前文件的偏移量,就是写在该mysql-bin.000001文件的位置, 配置从节点的时候,需要用到上面的2个值,并且从节点就是从这个文件的这个位置开始同步的。
Binlog_Do_DB: test ----------表示需要同步的数据库时test。
Binlog_Ignore_DB: mysql,information_schema,performance_schema,sys ---------表示需要忽略的数据库。
注:如果显示是空的(如下图),则需要重启服务器
6、解除表的锁定
命令: UNLOCK TABLES;
7、始设置从节点的数据库
(1) 打开/etc/my.cnf文件,添加如下内容,重启mysql服务
log-bin = mysql-bin
binlog_format = mixed
server-id = 2
replicate-do-db=test
replicate-ignore-db=mysql
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=sys
relay_log=mysql-relay-bin
log-slave-updates = ON
含义:
server_id:必须保证每台服务器不一样。
replicate-do-db:指定需要同步的数据库。
replicate-ignore-db:指定需要忽略的数据库。
relay_log:中继日志的名称。
log-slave-updates:意思是,中继日志执行之后,这些变化是否需要计入自己的binarylog。当从节点需要作为另一个服务器的主节点时,这个需要打开。后面搭建的主-主互备,就需要打开。
(2)保存后重启mysql
命令:service mysql restart
8、导入主节点上导出的数据到从节点
(1)从主节点传到从节点
命令:scp test.sql root@192.168.232.36:/mysql
(2)在从节点上修改文件的权限
命令:chown -R mysql:mysql test.sql
(3)导入数据
命令:mysql -uroot -p test < test.sql
9、从节点上开启同步
命令:
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.232.35',
-> MASTER_USER='repl_user1',
-> MASTER_PASSWORD='123456',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=154;
含义:
MASTER_HOST:主节点的IP。
MASTER_USER:主节点上创建的用户同步的用户。
MASTER_PASSWORD:用户的密码。
MASTER_LOG_FILE:主节点正在写入binarylog日志的文件。
MASTER_LOG_POS:文件的偏移量。
MASTER_PORT=3308:不是默认端口时,需要指定
10、重启MySQL服务,查看slave的状态
命令:show slave status\G
注意:如果遇到这2个线程有为NO的情况,要去查错误日志排查,如发现我的Slave_IO_Running线程为NO,查看错误日志,具体解决方法见下面第三部分。
含义:
Slave_IO_Running:从服务器上读取主服务器BinaryLog日志的线程,并把日志拷贝回来。
Slave_SQL_Running:专门执行SQL的线程。负责把复制回来的的RelayLog执行到自己的数据库中。
在从节点上这2个参数必须都为Yes,才能表明数据能正常同步。
11、测试数据是否同步
(1)主节点新增数据
注意:我们可以看到第二条的数据的id是11,这也就是我们主节点的my.cnf文件的auto-increment-increment参数,起到了作用,下一条数据的id就会是21、31、41.。。。。。
(2)从节点查看数据已经同步过来了
12、测试存储过程是否可以同步
(1)主节点创建一个存储过程
(2)从节点查看是否有该存储过程
三、遇到的错误
1、导出数据库数据时报Binloging on server not active的错误
(1)错误截图如下:
(2)问题描述
因为我的MySQL的my.cnf文件里是没有log-bin = mysql-bin(或者是注释掉的),修改完这个文件后没有重启服务,重启一下就好了。
(3)解决办法
2、查看从节点slave的状态Slave_IO_Running线程为NO的错误
(1)错误截图如下:
(2)查看错误日志的详细描述
发现主节点和从节点有相同的UUID,这是因为我的从节点是通过主节点的虚拟机快照生成的,所以UUID相同
(3)解决办法
删除该UUID的文件,重启mysql即可