※ 主从同步
主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)
复制异步进行,从服务器无需一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。
使用主从同步的好处:
- 通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
- 提高数据安全,因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据
- 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能
1. Docker 安装 MySQL
作为准备阶段,我们需要下载 MySQL 镜像,并准备主从两个容器
仓库中查询MySQL
输入docker search mysql
在docker 镜像仓库中查询 MySQL镜像
拉取 MySQL 镜像
随后使用docker pull docker.io/mysql
命令下载该版本(即“拉取”镜像)
下载完成后,使用docker image ls
命令查看镜像列表:
运行 主(master)容器
主从容器必须设置不同的对外端口,这里我们规定,主容器的端口号设置为3310,从容器的端口号设置为3311
docker run -itd --name=mysql_master -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123 docker.io/mysql
使用docker ps
命令查询 主(master)容器 是否启动:
运行 从(slave)容器
设置从容器的端口号为3311
查询 从(slave)容器 是否启动:
使用navicat测试是否连通
至此,容器准备工作完成!
【注】连接失败 可能原因:防火墙未开放目标端口号
2. 配置 主(master)容器
配置阶段:配置 主(master)容器
进入 master 容器内
使用如下命令进入 master容器内:
docker exec -it mysql_master /bin/bash
进入 /etc/mysql 文件夹
使用 vi/vim 编辑 my.cnf 文件
vi/vim 没有安装,解决步骤:
-
执行
apt-get update
做准备工作:
-
执行
apt-get install vim
安装vim
-
使用
vim my.conf
进行编辑 my.cnf
-
在my.cnf添加 唯一ID 和 必要信息(使用“i” 键进入编辑模式,结束后Esc +
:wq
保存修改)
-
重新启动容器:使配置生效
创建专用账户(slave)进行主从同步
- 使用root账户登入MySQL:
- 创建专用同步账户(slave):
3. 配置 从(slave)容器
配置阶段:配置 从(slave)容器
进入 slave 容器内
进入 /etc/mysql 文件夹
使用 vi/vim 编辑 my.cnf 文件
- 准备工作:
- 编辑文件:
server-id=201
log-bin=mysql-slave-bin
relay_log=edu-mysql-relay-bin
4. 主(master)从(slave)复制
关联阶段:主从复制
查看master状态
- 进入master容器:
- 显示主服务器状态:
在slave中执行命令
- 使用命令
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql_master
查询master容器的独立IP
- 进入slave容器,执行SQL语句:
master_host:Master库的地址,容器独立ip
master_port:Master库的端口号,容器端口号(默认3306)
master_user:用于数据同步的用户
master_password:用于数据同步用户的密码
MASTER_LOG_FILE:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
MASTER_LOG_POS:从哪个 Position 开始读,即上文中提到的 Position 字段的值
- 开启主从复制过程
- 配置成功:
show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 172.17.0.2
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 879
Relay_Log_File: edu-mysql-relay-bin.000002
Relay_Log_Pos: 324
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1416
Relay_Log_Space: 537
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 200
Master_UUID: a699d8b9-f9dc-11eb-a124-0242ac110002
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set, 1 warning (0.00 sec)
ERROR:
No query specified
可能遇到的错误:
查看主库:
USE mysql;
SELECT plugin FROM user WHERE user = 'slave';
原来是主库 slave用户的 plugin 是 caching_sha2_password 导致连接不上,修改为mysql_native_password 即可解决。
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
如果还是出现错误,可以尝试删除 salve 用户、抛弃权限,重新建立即可:
- 删除用户命令:
DELETE FROM user WHERE user='用户名';
flush privileges;
DROP user 用户名@'%';
在图形化界面navicat中测试
建立数据库 test_db
进行测试:
至此,MySQL 主从配置完成!