什么是主从复制?
指的是一台MySQL数据库服务器当主机,另一台或多台数据库服务器当从机,主机负责主要写入数据,从机负责只能读取数据。
主从复制的原理是什么?
MySQL服务器之间的主从复制主要是通过二进制日志文件实现的,主机负责使用二进制日志文件记录数据库数据的变化情况,而从机通过读取和执行二进制日志文件来保持与主机的数据一致。
主从复制有什么优点?
- 因为读数据、写数据在不同服务器中执行的,分摊了读写数据在同一台服务器的压,使得数据库的读写分离,提高了数据读写的性能
- 从机与主机保持着数据的一致,可以在服务器上备份而不破坏主机相应的数据,提高数据的安全性
- 当主机宕机时,便会将一台从机作为主机,继续运行而不影响数据的读写
MySQL主从复制流程
下面流程是在阿里云服务器中配置,使用了docker拉取MySQL镜像,创建两个不同端口的MySQL容器。
①准备两台MySQL服务器(一台作为主机,另一台作为从机)
- 创建master服务器(主机)
sudo docker run --name mysql_master -p 3307:3306 -d mysql:5.7.22 -e
MYSQL_ROOT_PASSWORD=123456
mysql:5.7.22
:表示拉取镜像的版本,建议使用5.7版本,比较稳定。
MYSQL_ROOT_PASSWORD
:表示设置数据库的密码,创建时一定要自定义密码。
-p
:表示绑定端口,冒号前是可以通过外网访问的端口,冒号后是数据库服务的端口。
tips:自己的服务器中不会创建新的端口,需要自己去添加新的端口才能创建成功。
- 创建slave服务器(从机)
sudo docker run --name mysql_slave -p 3308:3306 -d mysql:5.7.22 -e
MYSQL_ROOT_PASSWORD=123456
- 检查是否创建成功
sudo docker ps
若可以看到刚刚创建的容器,并正在运行中,则表示创建成功;否则,删除容器重新创建。
②配置主服务器
- 首先先进入名为
mysql_master
容器
sudo docker exec -it mysql_master /bin/bash
- 修改配置文件 /etc/mysql/mysql.conf.d/mysqld.conf
# 在末尾加上两个配置
## 设置server_id,一般设置为IP的最后一位,同一局域网内注意要唯一
server_id = 3
## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin = edu-mysql-bin
log-bin
:表示开启二进制日志功能,名字取得要有意义(关键配置)
server_id
:主机的id,这个的值一定要是唯一的。
tips:若没有vim命令,则需要进行安装。
①apt-get update
②apt install vim
- 配置完成后重启 mysql
service mysql restart
- 重新打开容器
docker container start mysql_master
- 进入mysql数据库中创建数据同步用户
mysql -u root -p -h xx.xxx.xxx.xxx --port=3307
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
-h
:该参数的值需要更改,改为自己服务器的外网ip地址
③ 配置slave服务器
- 首先先进入名为
mysql_slave
容器
sudo docker exec -it mysql_slave /bin/bash
- 修改配置文件 /etc/mysql/mysql.conf.d/mysqld.conf
# 在末尾加上两个配置
## 设置server_id,一般设置为IP的最后一位,同一局域网内注意要唯一
server_id = 4
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin = edu-mysql-bin
tips:在slave中,可以不用配置参数
log-bin
,若要配置必须要与主机的值相同。该参数的作用:当主机宕机时,会选择参数中配置该参数的从机作为新的主机。
- 重启服务,重启容器
service mysql restart
docker container start mysql_slave
④完成Master和Slave链接
- 进入主机,查看主机状态
mysql -u root -p -h xx.xxx.xxx.xxx --port=3307
show master status;
注意:记录下 File 和 Position 字段的值,后面需要使用
- 进入从机进行连接
mysql -u root -p -h xx.xxx.xxx.xxx --port=3308
change master to master_host='xx.xxx.xxx.xxx', master_user='slave', master_password='123456',
master_port=3307, master_log_file='edu-mysql-bin.000001', master_log_pos=34659,
master_connect_retry=30;
master_host
: Master 的IP地址
master_user
: 在 Master 中授权的用于数据同步的用户
master_password
:同步数据的用户的密码
master_port
: Master 的数据库的端口号
master_log_file
: 指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos
: 从哪个 Position 开始读,即上文中提到的 Position 字段的值
- 查看从机同步状态
show slave status \G;
Slave_IO_Running
与Slave_SQL_Running
的值都为No时,表示还没有开始复制过程,若都为Yes则表示开始复制过程。
- 开始主从复制
start slave;
tips:测试方法,使用Navicat分别连接主从数据库,在主机写入数据,当从机同步到主机数据时,则表示主从复制成功。
相关文章:
Django实现读写分离教程
打开MySQL数据库日志文件
网友评论