一、概述
模式:
主从复制,主库写入数据,从库同步主库数据,从库保持与主库内容一致,达到实施备份的效果。
优势:
- 数据分布(data distribution)
- 负载平衡(load balancing),实现读写分离,缓解数据库压力。
- 数据备份(backup)
- 高可用性与容错行(high availability and failover)
原理图如下:
功能:
- BinLog:二进制文件,存储MasterDB(主数据库)中修改数据的内容,存储内容的格式有Statement,Row,Mixed。
- Relay Log:功能作用与Binlog一样,不同点在于当日志内的内容被读取完后,会被删除。
- Binlog dump:将读取Binlog后发送数据给IO线程。
- IO线程:将接收到数据传给RelayLog日志。
- SQL线程:读取RelayLog数据。
流程:
- 从库,配置主库信息,建立连接。
- MasterDB数据库数据发生变化时,会记录在Binlog日志中。
- Binlog dump线程读取Binlog中的内容,将数据发送给IO线程。
- IO线程再将数据存入RelayLog中。
- SQL线程读取RelayLog中的数据并写入从库。
二、安装和配置
2.1 环境说明
提示:主从库的数据库版本最好保持一致,或者,从库的版本一定要高于主库版本,否则在数据同步过程中可能会出现问题,切记。
这里使用测试环境来记录。
Master(主数据库)环境:
- 机器:物理机
- 网络:固定IP
- 系统:Windows 7
- IP:192.168.2.166
- 子网掩码:255.255.255.0
- 默认网关:192.168.2.1
- DNS1:202.100.199.8
- DNS2:202.100.192.68
- 数据库版本:MySQL 5.7.19
Slave(从数据库)环境:
- 机器:从宿主机器建立Esxi环境,在Esxi下建立Centos系统。
- 网络:1.Esxi 网络桥接 2.Centos 网络桥接
- 系统:虚拟机 Linux Centos 7
- IP:192.168.2.110
- 子网掩码:255.255.255.0
- 默认网关:192.168.2.1
- DNS1:202.100.199.8
- DNS2:202.100.192.68
- 数据库版本:MySQL 5.7.30
环境测试:
要求:IP互通,端口互通
Windows:
- ping 192.168.2.110
- telnet 192.168.2.110 3306
Centos:
- ping 192.168.2.166
- telnet 192.168.2.166 3306 或 wget 192.168.2.166:3306 或 curl 192.168.2.166 3306
2.2 配置主数据库(Master)
1.修改【主数据库】配置文件,Windows 下默认配置文件(my.ini)路径可以通过服务里面查询。
2.修改my.ini配置文件,找到以下2行代码取消注释并修改。
- Master(主数据库)192.168.2.166
[mysqld]
# 启用二进制日志,可指定指定路径和名称
log-bin=mysql-bin
# 服务唯一ID,默认是1,一般取IP最后一段,如IP:192.168.2.166
server-id=166
3.重启数据库服务。
4.进入到主数据库中,创建从数据库的操作用户账号和权限。
# 1.登录
mysql -uroot -p
# 2.创建用户并授权 REPLICATION SLAVE ,用户:backup-user,密码:backup-user,授权IP:192.168.2.110(从数据库IP)
grant replication slave on *.* to 'backup_user'@'192.168.2.110' identified by 'backup_user';
# 3.刷新权限
flush privileges;
# 4.查询用户表
select user,host from mysql.user;
5.清除日志索引文件,用于第1次搭建主从环境。
reset master;
6.查询 master 状态。
show master status\G;
- File:mysql-bin.000001
- Position:154
2.3 配置从数据库(Slave)
1.修改my.ini配置文件(Linux下,执行 vim /etc/my.cnf),添加以下2行代码。
- Slave(从数据库)192.168.2.110
[mysqld]
# 启用二进制日志,可指定指定路径和名称
log-bin=mysql-bin
# 服务唯一ID,默认是1,一般取IP最后一段,如IP:192.168.2.110
server-id=110
# 复制进程不随MySQL启动而启动,设置后重启数据库后需要手动启动复制进程,即start slave
skip-slave-start=on
# 同步的数据库名称
replicate_wild_do_table=test_db.*
3.重启数据库服务。(systemctl restart mysqld.service)
4.修改从数据库的master链接配置。
- MASTER_HOST='192.168.2.166' # 连接主机地址
- MASTER_USER='backup_user' # 连接主机账号
- MASTER_PASSWORD='backup_user' # 连接主机账号密码
- MASTER_LOG_FILE='mysql-bin.000001' # 日志文件-通过查询主数据库master状态取得
- MASTER_LOG_POS=154 # 日志文件起始位置-通过查询主数据库master状态取得
# 1.修改master信息
CHANGE MASTER TO MASTER_HOST='192.168.2.166',MASTER_USER='backup_user',MASTER_PASSWORD='backup_user',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;
# 2.开启
start slave;
# 3.查询状态
show slave status\G;
以下两行代码都显示yes代表已经配置成功。
- Slave_IO_Running:Yes
- Slave_SQL_Running:Yes
2.4 同步数据库
1.如没有旧的数据库需要同步,则可以直接使用。如主数据库上,有旧的数据库需要同步,则要进行锁表操作,防止对数据库进行读写改变日志索引文件的位置值,将主数据库上的数据库导入从数据库后再进行解锁。
flush tables with read lock;
2.将需要同步的数据库导出(可使用mysql命令或其他工具均可,如:Navicat等)。
3.导入从数据库后,在主数据库上,进行解锁操作。
unlock tables;
4.这里直接使用Navicat将表同步过去。
三、测试
注意:启动从数据库同步命令以前建立的数据库是不会同步的,如需要同步旧的数据库,看2.4步骤,这里直接使用新增表操作来演示。
- 在主数据库上(192.168.2.166),新建 Article 表,新增1条数据。
- 刷新从数据库(192.168.2.110),可以看到从数据库已经同步了。
四、要点说明和场景应用(其它)
4.1 从库解除主从关系
场景:从库解除主从关系,提升从库为主库进行使用或重置主从关系和日志文件。
1.在从库数据库命令行中,先停止主从关系进程。
stop slave
2.再使用以下命令,清除主从复制关系的位置信息。该语句将被用于干净的启动,它删除 master.info 文件和 relay-log.info 文件以及所有的 relay log 文件并重新启用一个新的 relaylog 文件。
reset slave
3.查询状态
show slave status\G;
4.修改 my.cnf 删除主从相关配置参数。
4.2 skip-slave-start 使从数据库复制进程不随从数据库启动而启动
场景:从数据库重启时,确保手动启动从数据库复制进程是正常的,我们一般在从数据库配置文件中加入 skip-slave-start=on 参数配置,查询相关配置是否正确(主数据库 show master status\G; 的 File 和 Position 值正确为前提),从数据库重启完成后,先检查主数据库值,再手动去启动复制进程 start slave。
4.3 指定同步数据库
第1种,在主数据库中进行 grant 用户授权时,限定用户可操作的数据库。
# 统一格式
grant 权限1,权限2,... on 数据库名称.表名称 to '用户名'@'授权地址' identified by '用户密码';
# 栗子:创建并授权本地 root用户 全部数据库 全部权限
grant all privileges on *.* to 'root'@'localhost' identified by 'root';
# 栗子:创建并授权192.168.2.110地址 test_user用户 test_db数据库 select,insert权限
grant select,insert on test_db.* to 'test_user'@'192.168.2.110' identified by 'test_user';
# 栗子:创建并授权192.168.2.110地址 test_user用户 test_db数据库 user数据表 select,insert权限
grant select,insert on test_db.user to 'test_user'@'192.168.2.110' identified by 'test_user';
# 栗子:创建并授权192.168.2.110地址 backup_user用户 test_db数据库 replication slave权限
grant replication slave on test_db.* to 'backup_user'@'192.168.2.110' identified by 'backup_user';
第2种,在主数据库配置文件中(my.ini、my.cnf),设置以下规则参数,从数据库中不做限制。
- 不建议使用:binlog_do_db=DB_NAME(需要同步的数据库,1.如需同步全部数据库,则不需要设置;2.多个数据库,用逗号分开)
- 不建议使用:binlog_ignore_db=DB_NAME(需要忽略的数据库,搭配使用)
第3种,在从数据库配置文件中(my.ini、my.cnf),设置以下规则参数,主数据库中不做限制。
- 不建议使用:replicate_do_db=DB_NAME(需要同步的数据库,1.如需同步全部数据库,则不需要设置;2.多个数据库,用逗号分开)
- 不建议使用:replicate_ignore_db=DB_NAME(需要忽略的数据库,搭配使用)
- 不建议使用:replicate_do_table=DB_NAME.TABLE_NAME(需要同步的数据表,1.如需同步全部数据表,则不需要设置;2.多个数据表,用逗号分开)
- 不建议使用:replicate_igore_table=DB_NAME.TABLE_NAME(需要忽略的数据表,搭配使用)
- 建议使用:replicate_wild_do_table=DB_NAME.TABLE_NAME(可解决跨库和过滤问题,需要同步的数据表,全部表:DB_NAME.%)
- 建议使用:replicate_wild_ignore_table=DB_NAME.TABLE_NAME(可解决跨库和过滤问题,需要忽略的数据表,全部表:DB_NAME.%)
五、参考文章
- https://blog.csdn.net/Yoga0301/article/details/80545914?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.compare
- https://blog.csdn.net/kjsayn/article/details/51350691?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.compare&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.compare
- https://blog.csdn.net/donghaixiaolongwang/article/details/78591012
来源:oschina
链接:https://my.oschina.net/discussjava/blog/4422141