轻松实现MySQL主从复制

什么是主从复制?

指的是一台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_RunningSlave_SQL_Running的值都为No时,表示还没有开始复制过程,若都为Yes则表示开始复制过程。

  • 开始主从复制
start slave;

tips:测试方法,使用Navicat分别连接主从数据库,在主机写入数据,当从机同步到主机数据时,则表示主从复制成功。


相关文章:[Django实现读写分离教程](https://www.jianshu.com/p/f2caab1712fa)

猜你喜欢

转载自blog.csdn.net/qq_42349944/article/details/103343033