有时候我们的业务需要数据库的读写分离,但是读写分离是基于MySQL的主从复制的基础上实现的,并且MySQL的主从复制可以实现将数据从一台数据库服务器(master)复制到一台或多台数据库服务器(slave)上,进而可以保证数据有多份冗余,这篇文章就简单的实现以下MySQL的主从复制搭建流程。
一、环境
Red Hat Enterprise Linux Server release 6.5 (Santiago)
mysql Ver 14.14 Distrib 5.7.24, for linux-glibc2.12 (x86_64) using EditLine wrapper
首先我们需要准备两台服务器,安装好MySQL数据库,可以参考这篇教程:Linux安装MySQL5.7完整版流程。
注意:若是第二台服务器是直接copy第一台的话,需要去删除数据存放目录下的auto.cnf文件,因为auto.cnf文件里保存的是每个数据库实例的UUID信息,代表数据库的唯一标识,直接复制的话会冲突。
我这里准备的是两台机,如下:
角色 | ip | user | passed |
---|---|---|---|
master(主) | 172.16.1.6 | root | 123456 |
slave(备) | 172.16.1.7 | root | 123456 |
二、MySQL主从复制原理
1、 主节点 log dump 线程
当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。
当从节点上执行start slave
命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地relay-log中。
SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。
三、Master搭建
一、主库配置:
1、编辑配置文件:
$ vim /etc/my.cnf
server-id = 1 # 设置主服务器的id(不能和别的服务器重)
lower_case_table_names=1 # 可以配置的值:0/1/2; 0、效率最高,最不安全;1、最安全,但是效率最低;2、安全和效率平衡的取舍,在服务器系统挂掉的情况下会丢失数据;
sync_binlog = 1 # 值可设置 1、500、1000;可自己根据测试性能配置
log-bin = mysql-bin # binlog日志文件名
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema
binlog-ignore-db = sys
# 表示不同步以上的数据库binlog-do-db = data # 这个表示只同步某个库 (如果没有此项,表示同步所有的库)
2、重启MySQL
service mysqld restart
登录
mysql -u root -p #在mysql的bin目录下执行。
创建从数据库的copy用户和权限
- mysql>
grant replication slave on *.* to 'copy'@'172.16.1.%' identified by '123456';
172.16.1.%
通配符,表示0-255的IP都可访问主服务器,正式环境请配置指定从服务器IP
若将172.16.1.%
改为 %,则任何ip均可作为其从数据库来访问主服务器
刷新系统权限并重启MySQL,使my.cnf 配置生效;查看主库状态:
flush privileges;
service mysqld restart
记录日志文件名字和pos 这两个值后续要用
- mysql> show master status;
这里是mysql-bin.000001和601
四、Slave搭建
1、编辑配置文件:
$ vim /etc/my.cnf
server-id = 2
# 配置不需要复制的库mysql (注意:如从库中的数据库和主的不一致一定要把不同步复制的数据库配置完,否则会出现 Slave_SQL_Running: No的情况)
replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = sys
# 标记出需要同步的数据库名,在多从配置时可以按需配置
replicate_do_db = data
# 可以配置的值:0/1/2; 0、效率最高,最不安全;1、最安全,但是效率最低;2、安全和效率平衡的取舍,在服务器系统挂掉的情况下会丢失数据;
innodb_flush_log_at_trx_commit = 1
# 每进行n次事务提交之后,MySQL将binlog_cache中的数据强制写入磁盘。
sync_binlog = 1000
# 根据实际情况决定开启多少个线程用于主从复制
slave_parallel_workers = 4
# 基于组提交的并行复制方式
slave_parallel_type = logical_clock
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON
2、配置完成后,重启从库的MySQL:
$ service mysql restart
# 登录mysql
$ mysql -u root -p
# 关闭从库
mysql> stop slave;
# 配置主库信息 这里就用到主库 show master status 那里的两个字段
mysql>change master to master_host='172.16.1.6',master_port=3306,master_user='copy',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=601;
# 开启从库
mysql> start slave;
查看同步状态是否正常
mysql> show slave status \G;
报:ERROR: No query specified错的时候可以把
mysql> show slave status \G; 的后面;去掉就不报错了。
可以看到Slave_IO_Running和Slave_SQL_Running都是YES,假如我们关闭从线程。
mysql>stop slave;
那么将都会变成NO.
如需要删除同步信息可在stop slave或reset slave;后再执行reset slave all; 后同步信息就会被删除。
到这里,主从搭建成功。