MySQL的主从复制可以实现将数据从一台数据库服务器(master)复制到一台或多台数据库服务器(slave)上,进而可以保证数据有多份冗余。
默认情况下,属于异步复制,所以无需维持长连接。
slave端的IO线程发送请求给master端的binlog (二进制日志)线程
master端binlog dump线程获取二进制日志信息(文件名和位置信息)发送给slave端的IO线程
salve端IO线程获取到的内容依次写到slave端relay log(中继日志)里,并把master端的bin-log文件名和位置记录到http://master.info里
salve端的SQL线程,检测到relay log中内容更新,就会解析relay log里更新的内容,并执行这些操作,从而达到和master数据一致
当前环境中只有一台MySQL数据库服务器,上面已有相关业务数据。现需要在此基础上构建MySQL的主从复制架构。
1 系统环境说明
2 数据库安装环境说明
3. 从服务器安装MySQL数据库
注意:暂时不需要初始化数据库文件,只是安装好了和master相同版本的mysql数据库软件;后面向master来同步所有数据。
4. 修改主和从的配置文件注意:
· server-id必须不能一致;
· master需要开启二进制日志
· slave需要开启中继日志
· 从ID 不能大于主ID,否则同步失效
[root@ma ~]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3307
socket=/usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/data/db01_3307.err
character_set_server=utf8mb4
log-bin=/usr/local/mysql/data/binlog
server-id = 10
[root@sl ~]# cat /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/data/db02_3307.err
character_set_server=utf8mb4
server-id=20
relay-log=/usr/local/mysql/data/relaylog
5. 主从两边初始数据保持一致
1 .1主服务器停止MySQL服务
[root@ma ~]# mysqladmin shutdown -p123
1.2 Master上数据同步到slave
[root@ma ~]# rsync -av /usr/local/mysql/data/ 192.168.8.12:/usr/local/mysql/data
6. 启动Master和Slave数据库
[root@ma ~]# service mysql start[root@sl ~]# service mysql start
7. 主服务器创建复制用户
mysql> grant replication slave on . to ‘slave’@‘10.1.1.%’ identified by ‘123’;mysql> flush privileges;
先加锁,防止两边数据不一致mysql> flush tables with read lock;查看当前数据库的二进制日志写到什么位置(只有打开二进制日志,这句命令才有结果)mysql> show master status;
8. 从服务器配置同步信息
mysql> change master to master_host=‘192.168.8.11’,master_user=‘slave’,master_password=‘123’,master_port=3307,master_log_file=‘mybinlog.000002’,master_log_pos=405;
9. 从服务器启动复制线程
mysql> start slave;mysql> show slave status\G…Slave_IO_Running: Yes 代表成功连接到master并且下载日志Slave_SQL_Running: Yes 代表成功执行日志中的SQL语句
10. 主服务器解锁
mysql> unlock tables;Query OK, 0 rows affected (0.00 sec)
mysql主从机制主要是在主机意外情况中断服务(比如断电、宕机等)的情况下,能够将业务转向备机,下面梳理一下整个切换流程:
1、确认主库短时内无法恢复
如果主库已经无法使用,并且确实短时间内没法恢复正常,则考虑切换备库作为新的主库。
2、停止从库 IO_THREAD 线程
先停止 IO_THREAD 线程, 即断开从主库的 sql 消息接收, 有利于从库完成剩余的数据同步。
#slave
mysql> stop slave IO_THREAD;
mysql> show slave status;
#上面命令检查是否是如下状态,如果是说明io_thread线程已经停止Slave_IO_Running: NoSlave_SQL_Running: Yes
3、确认slave完成所有同步
slave mysql> show processlist;
直到看到状态都为 XXX has read all relay log 表示从库更新均执行完毕,则可以进行下一步。
4、切换从库为主库
mysql> stop slave; # 完全停止 slave 复制
mysql> reset slave all; # 完全清空 slave 复制信息
msyql> reset master; # 清空本机上 master 的位置信息
5、检查新主库可写性
之前配置成从库时,可能配置read_only为1,即不可写,这时候要确认一下新库是否支持写入操作,若不能写入,需要将数据库设为可读写。
mysql> set global read_only=0; #关闭数据库只读属性
#或者配置文件中置该配置项为0,然后重启mysql
6、通知业务修改相应端口
业务需要修改mysql新地址,所以需要业务代码具有灵活配置能力