主从复制的概念
主从复制是一种在数据库系统中常用的数据备份和读取扩展技术,通过将一个数据库服务器(主服务器)上的数据变更自动同步到一个或多个数据库服务器(从服务器)上,以此来实现数据的冗余备份、读写分离以及负载均衡等目的。
主从复制的原理
- 首先在Master上开启二进制日志。
- 当Master上数据发生变化,进行DML操作时,会产生二进制日志。
- Master上dump线程会通知Slave上的I/O线程来拿二进制日志。
- I/O线程拿到日志后会写入到Slave上的中继日志。
- 然后SQL线程会去读取新产生的中继日志,重演二进制日志里的操作,从而达到Slave和Master上的数据一模一样,实现数据的一致性
主从复制的原理如上,在Slave服务器上还存在master-info文件和relay-log.info文件。master-info文件记录I/O线程从Master服务器上获取二进制日志结束的pos位置号和日志文件的名字。relay-log.info文件记录当前中继日志的文件名和位置点。
主从复制的操作
1、环境准备
准备两台服务器,一台作为master服务器(192.168.2.117),一台作为slave服务器(192.168.2.118),确保两台服务器上的mysql服务是启动的,mysql版本为5.x。
修改主机名,便于辨识:
// master服务器上
[root@localhost ~] hostnamectl set-hostname master// slave服务器上
[root@localhost ~] hostnamectl set-hostname slave
2、修改mysql配置文件
在master服务器上开启二进制日志,server_id=1,在slave服务器上也可以开启二进制日志,server_id=2
// master服务器上
[root@master ~] vim /etc/my.cnf
# 找到[mysqld]位置添加以下内容
[mysqld]
log_bin
server_id=1// 重启服务
[root@master ~] service mysqld restart// slave服务器上
[root@slave ~] vim /etc/my.cnf
# 找到[mysqld]位置添加以下内容
[mysqld]
log_bin
server_id=2// 重启服务
[root@slave ~] service mysqld restart
3、统一两台服务器的基础数据
// master服务器导出所有数据
[root@master ~] mysqldump -uroot -p'123456' --all-databases >all_db.SQL// 上传slave服务器
[root@master ~] scp all_db.SQL root@192.168.2.118:/root// slave服务器执行SQL文件
[root@slave ~] mysql -uroot -p'123456' <all_db.SQL
4、master服务器初始化二进制日志
清除master服务器上所有的二进制日志,因为上一步已经做了一次全部备份了。
root@(none) mysql> reset master;// 查看二进制文件名和位置点POS
root@(none) mysql> show master status;
5、新建授权用户
在master服务器上新建一个授权用户,给slave来复制二进制日志。
// master服务器上操作
root@(none) mysql> reset master;
root@(none) mysql> grant replication slave on *.* to 'slave-1'@'192.168.2.118';
6、配置master-info信息
在slave服务器上配置master-info信息,master-info文件记录I/O线程从master服务器上获取二进制日志结束的pos位置号和日志文件的名字。当master服务器通知slave服务器来读取二进制日志时,slave服务器通过master-info信息才能得知从哪里开始读取。
// slave服务器上操作
root@(none) mysql> CHANGE MASTER TO MASTER_HOST='192.168.2.137',
> MASTER_USER='slave-1',
> MASTER_PASSWORD='123456',
> MASTER_PORT=3306,
> MASTER_LOG_FILE='master-bin.000001',
> MASTER_LOG_POS=154;
7、查看slave是否配置成功
// slave服务器上操作
// 启动slave
root@(none) mysql> start slave;root@(none) mysql> show slave status\G;// 下面这两个为yes则表示启动成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
在线主从复制
在线主从复制指服务器运行中进行主从复制,在线主从复制与上述主从复制原理一致,其难点在于slave服务器配置master-info信息时,如何准确知晓master服务器的二进制日志文件名和位置号pos。
本文在这给出的方法是使用xtrabackup工具包,xtrabackup在备份的时候自动记录二进制日志文件和位置好,感兴趣的小伙伴可以自行去搜索深入了解。
主从切换的原理
在主从复制中,当主服务器挂了,就需要提升原来的从为主,这就是主从切换。
首先在监控机器上每秒钟扫描master服务器的3306端口(nc 3306),当master服务器出现故障时,马上执行手工操作的步骤(最后是将其编写成脚本自动执行),从而实现主从复制。
手工操作步骤:
- 首先选择一台从服务器,在其上停止从服务器服务(stop slave)。
- 开启二进制日志。
- 重置二进制日志(reset master)。
- 建立授权复制用户。
- 在其他从服务器中配置master-info信息去拉取二进制日志。
- 将网站的写流量切换到新的master上。
常见问题
- 查看服务器防火墙3306端口是否开放。
- 配置时是否出现拼写错误。
- 两天服务器是否为克隆产生,是克隆产生则需要修改uuid。修改mysql数据目录下auto.cnf文件(vim /data/mysql/auto.cnf)中server-uuid的值,随便修改几个字符即可。