一、 什么是MySQL的复制

MySQL的主从复制可以实现将数据从一台数据库服务器(master)复制到一台或多台数据库服务器(slave)上,进而可以保证数据有多份冗余。

默认情况下,属于异步复制,所以无需维持长连接。

二、 MySQL复制的原理

mysql支持主从切换吗 mysql 主从切换的原理_数据

  1. slave端的IO线程发送请求给master端的binlog (二进制日志)线程
  2. master端binlog dump线程获取二进制日志信息(文件名和位置信息)发送给slave端的IO线程
  3. salve端IO线程获取到的内容依次写到slave端relay log(中继日志)里,并把master端的bin-log文件名和位置记录到http://master.info里
  4. salve端的SQL线程,检测到relay log中内容更新,就会解析relay log里更新的内容,并执行这些操作,从而达到和master数据一致

三、MySQL复制搭建

当前环境中只有一台MySQL数据库服务器,上面已有相关业务数据。现需要在此基础上构建MySQL的主从复制架构。

1 系统环境说明

mysql支持主从切换吗 mysql 主从切换的原理_数据_02

2 数据库安装环境说明

mysql支持主从切换吗 mysql 主从切换的原理_MySQL_03

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 -p1231.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 start7. 主服务器创建复制用户
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)

四、主从测试验证

  1. 主服务器上插入数据
  2. 从服务器查看数据

五、 mysql主从切换流程

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新地址,所以需要业务代码具有灵活配置能力