设置MySQL主从同步
主从同步,也称master-slave,是开发过程中常见的提高程序性能的办法。通常情况下在主数据库服务器写入数据,查询数据的时候是在从服务器,主从服务器之间通过同步机制来保持一致,虽然主从数据库的一致性是存在一定时间差的,但因为这个时间差很小所以在一些对时间不是非常敏感的业务场景下被认为是实时一致的。在大多数主流数据库中都是可以通过配置来实现主从同步、读写分离的。
这里就以刚刚配置起来的两个数据实例来演示如何实现主从同步的,步骤有如下:
(1)主数据库实例设置server-id和开启bin-log;
(2)主数据库实例创建用于同步的账号;
(3)从数据库实例设置server-id;
(4)从数据库实例配置同步参数;
(5)从数据库实例启动同步开关。
5.1主数据库实例设置server-id和开启bin-log
其实在上面的3306的配置文件里已经配置了server-id和bin-log,就在/usr/local/mysql-5.7.18/data/3306/my.cnf文件的[mysqld]节点处:
另外还需要注意的是在这个my.cnf配置文件中还有一句:
它的意思是在进行主从同步时忽略mysql这个库,因为mysql库主要存放账号及授权信息的,不同数据库实例账号和授权信息不同的可能性极大,因此没有必要同步这个库。
通过如下命令可以快速查看是否已经正确配置:
在数据库中也可以查看:
同时,这里也查看一下主数据库的状态:
这里:File和Position的值是两个很重要的参数,这是从数据库下次同步时的起始位置。
5.2主数据库实例创建用于同步的账号
在主数据库创建一个replication账号用于从主库同步数据到从库,创建replication账号的语句如下:
grant replication slave on *.* to 'replication'@'%' identified by 'your_password';flush privileges;
在实际执行时请将your_password改为自己的密码,执行这个SQL语句后就会在mysql库中的user表中创建一个名为replication的用户,可以通过SQL语句查看:
5.3从数据库实例设置server-id
同样,其实在上面的3307的配置文件里已经配置了server-id和bin-log,就在/usr/local/mysql-5.7.18/data/3307/my.cnf文件的[mysqld]节点处:
注意:在一个主从关系群中server-id是唯一的,另外在由于从数据库不向其它库同步数据,因此没有开启bin-log。这里也通过egrep查看一下:
5.4从数据库实例配置同步参数
登录3307端口对应的实例:
然后执行以下语句:
说明:
MASTER_HOST为主服务器IP或主机名;
MASTER_PORT为主服务器端口;
MASTER_USER为主服务器上用于同步的数据库账户名;
MASTER_PASSWORD为主服务器上用于同步的数据库账户对应的密码;
MASTER_LOG_FILE为当前bin-log日志文件名;
MASTER_LOG_POS为当前偏移量;
其中MASTER_LOG_FILE和MASTER_LOG_POS可以在主数据库上执行” show master status \G;”SQL语句来获得,见本文“主数据库实例设置server-id和开启bin-log”一节。
5.5从数据库实例启动同步开关
登录从数据库执行”start slave”即可。
在本篇中由于连个数据库都是刚刚初始化的,所以数据都是一致的。在实际情况中,需要先将两个数据库实例中的除mysql库之外的数据一致后才可启动同步,否则两个库中的就会不一致。
这里我们来检查一下效果:
在主库中创建一个数据库,如下:
然后在从库中查看数据库的情况:
可见主库的数据被自动同步到从库了,这时再在主库中删除zhoufoxcn这个库,可以看到从库中也自动删掉了。
这时在主库查看状态:
在从库查看状态:
主从同步,也称master-slave,是开发过程中常见的提高程序性能的办法。通常情况下在主数据库服务器写入数据,查询数据的时候是在从服务器,主从服务器之间通过同步机制来保持一致,虽然主从数据库的一致性是存在一定时间差的,但因为这个时间差很小所以在一些对时间不是非常敏感的业务场景下被认为是实时一致的。在大多数主流数据库中都是可以通过配置来实现主从同步、读写分离的。
这里就以刚刚配置起来的两个数据实例来演示如何实现主从同步的,步骤有如下:
(1)主数据库实例设置server-id和开启bin-log;
(2)主数据库实例创建用于同步的账号;
(3)从数据库实例设置server-id;
(4)从数据库实例配置同步参数;
(5)从数据库实例启动同步开关。
5.1主数据库实例设置server-id和开启bin-log
其实在上面的3306的配置文件里已经配置了server-id和bin-log,就在/usr/local/mysql-5.7.18/data/3306/my.cnf文件的[mysqld]节点处:
另外还需要注意的是在这个my.cnf配置文件中还有一句:
它的意思是在进行主从同步时忽略mysql这个库,因为mysql库主要存放账号及授权信息的,不同数据库实例账号和授权信息不同的可能性极大,因此没有必要同步这个库。
通过如下命令可以快速查看是否已经正确配置:
在数据库中也可以查看:
同时,这里也查看一下主数据库的状态:
这里:File和Position的值是两个很重要的参数,这是从数据库下次同步时的起始位置。
5.2主数据库实例创建用于同步的账号
在主数据库创建一个replication账号用于从主库同步数据到从库,创建replication账号的语句如下:
grant replication slave on *.* to 'replication'@'%' identified by 'your_password';flush privileges;
在实际执行时请将your_password改为自己的密码,执行这个SQL语句后就会在mysql库中的user表中创建一个名为replication的用户,可以通过SQL语句查看:
5.3从数据库实例设置server-id
同样,其实在上面的3307的配置文件里已经配置了server-id和bin-log,就在/usr/local/mysql-5.7.18/data/3307/my.cnf文件的[mysqld]节点处:
注意:在一个主从关系群中server-id是唯一的,另外在由于从数据库不向其它库同步数据,因此没有开启bin-log。这里也通过egrep查看一下:
5.4从数据库实例配置同步参数
登录3307端口对应的实例:
然后执行以下语句:
说明:
MASTER_HOST为主服务器IP或主机名;
MASTER_PORT为主服务器端口;
MASTER_USER为主服务器上用于同步的数据库账户名;
MASTER_PASSWORD为主服务器上用于同步的数据库账户对应的密码;
MASTER_LOG_FILE为当前bin-log日志文件名;
MASTER_LOG_POS为当前偏移量;
其中MASTER_LOG_FILE和MASTER_LOG_POS可以在主数据库上执行” show master status \G;”SQL语句来获得,见本文“主数据库实例设置server-id和开启bin-log”一节。
5.5从数据库实例启动同步开关
登录从数据库执行”start slave”即可。
在本篇中由于连个数据库都是刚刚初始化的,所以数据都是一致的。在实际情况中,需要先将两个数据库实例中的除mysql库之外的数据一致后才可启动同步,否则两个库中的就会不一致。
这里我们来检查一下效果:
在主库中创建一个数据库,如下:
然后在从库中查看数据库的情况:
可见主库的数据被自动同步到从库了,这时再在主库中删除zhoufoxcn这个库,可以看到从库中也自动删掉了。
这时在主库查看状态:
在从库查看状态:
可以看出通过配置,两台数据库能够自动同步数据了。
配置双主
master的binlog位置
linux-node2 master端
d /data/app/mysql-3306/ ./bin/mysql -uroot -p -S mysql.sock -P 3306 mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 613 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
linux-node3 master端
cd /data/app/mysql-3306/ ./bin/mysql -uroot -p -S mysql.sock -P 3306 mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 613 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
linux-node2 master配置跟linux-node3 master同步
mysql> CHANGE MASTER TO MASTER_HOST='192.168.56.13', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='mysql', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=613; mysql> start slave; Query OK, 0 rows affected (0.03 sec) mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.56.13 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 613 Relay_Log_File: linux-node2-relay-bin.000002 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes
linux-node3 master配置跟linux-node2 master同步
mysql> CHANGE MASTER TO MASTER_HOST='192.168.56.12', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='mysql', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=613; mysql> start slave; Query OK, 0 rows affected (0.00 sec) mysql> mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.56.12 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 613 Relay_Log_File: linux-node3-relay-bin.000002 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes