在阿里云服务器上用Docker来创建主从Mysql教程
在Docker中创建网络以此来连接主从Docker容器
docker network create mysql-cluster-net
创建服务
- 创建Mysql主服务
docker run -d \ --name mysqlp1 \ --network mysql-cluster-net \ -p 3305:3306 \ -e MYSQL_ROOT_PASSWORD=password \ -e MYSQL_REPLICATION_USER=repl \ -e MYSQL_REPLICATION_PASSWORD=replpassword \ -v /root/mysql_cluster/mysqlp1/data:/var/lib/mysql \ -v /root/mysql_cluster/mysqlp1/conf:/etc/mysql/conf.d \ -v /root/mysql_cluster/mysqlp1/init:/docker-entrypoint-initdb.d \ mysql:latest
- 代码解释
docker run -d \ # 在后台(detached mode)运行 Docker 容器 --name mysqlp1 \ # 将容器命名为 'mysqlp1' --network mysql-cluster-net \ # 连接到 'mysql-cluster-net' 网络 -p 3305:3306 \ # 将主机的端口 3305 映射到容器的端口 3306(MySQL 默认端口) -e MYSQL_ROOT_PASSWORD=password \ # 设置 MySQL root 用户的密码为 'password' -e MYSQL_REPLICATION_USER=repl \ # 设置 MySQL 复制用户名为 'repl' -e MYSQL_REPLICATION_PASSWORD=replpassword \ # 设置 MySQL 复制用户的密码为 'replpassword' -v /root/mysql_cluster/mysqlp1/data:/var/lib/mysql \ # 挂载主机目录 '/root/mysql_cluster/mysqlp1/data' 到容器目录 '/var/lib/mysql',用于 MySQL 数据存储 -v /root/mysql_cluster/mysqlp1/conf:/etc/mysql/conf.d \ # 挂载主机目录 '/root/mysql_cluster/mysqlp1/conf' 到容器目录 '/etc/mysql/conf.d',用于 MySQL 配置文件 -v /root/mysql_cluster/mysqlp1/init:/docker-entrypoint-initdb.d \ # 挂载主机目录 '/root/mysql_cluster/mysqlp1/init' 到容器目录 '/docker-entrypoint-initdb.d',用于初始化脚本 mysql:latest # 指定使用 'latest' 标签的 MySQL Docker 镜像
- 创建从Mysql服务
docker run -d \ --name mysqlr1 \ --network mysql-cluster-net \ -p 3304:3306 \ -e MYSQL_ROOT_PASSWORD=password \ -e MYSQL_REPLICATION_USER=repl \ -e MYSQL_REPLICATION_PASSWORD=replpassword \ -v /root/mysql_cluster/mysqlr1/data:/var/lib/mysql \ -v /root/mysql_cluster/mysqlr1/conf:/etc/mysql/conf.d \ -v /root/mysql_cluster/mysqlr1/init:/docker-entrypoint-initdb.d \ mysql:latest
- 代码解释同上
配置文件修改
- 配置主Mysql配置文件
打开映射出来的数据卷
vim /root/mysql_cluster/mysqlp1/conf
写入配置文件内容[mysqld] server-id=1 log_bin=master-bin log_bin-index=master-bin.index skip-name-resolve port=3306 max_connections=200 max_connect_errors=10 character-set-server=utf8 default-storage-engine=INNODB default_authentication_plugin=mysql_native_password
- 配置文件解释
[mysqld] #主库和从库需要不一致 server-id=2 #打开MySQL中继日志 relay-log-index=slave-relay-bin.index relay-log=slave-relay-bin #打开从服务二进制日志 log-bin=mysql-bin #使得更新的数据写进二进制日志中 log-slave-updates=1 # 设置3306端口 port=3306 # 允许最大连接数 max_connections=200 # 允许连接失败的次数。 max_connect_errors=10 # 服务端使用的字符集默认为UTF8 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB # 默认使用“mysql_native_password”插件认证 #mysql_native_password default_authentication_plugin=mysql_native_password
- 配置从Mysql服务器配置文件
[mysqld] server-id=2 relay-log-index=slave-relay-bin.index relay-log=slave-relay-bin log_bin=mysql-bin log-slave-updates=1 skip-name-resolve port=3306 max_connections=200 max_connect_errors=10 character-set-server=utf8 default-storage-engine=INNODB default_authentication_plugin=mysql_native_password
- 配置文件解释同上
初始化主从配置
- 主服务配置
- 进入主服务
docker exec -it mysqlp1 mysql -u root -ppassword
- 设置复制用户的操作
CREATE USER 'repl'@'%' IDENTIFIED BY 'replpassword'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
- 获取日志消息输出结过为mysql数据的二进制文件需要记下名称和地址
SHOW MASTER STATUS;
- 输出结果示例File和Position需要记忆以后有用
+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+
- 输出结果示例File和Position需要记忆以后有用
- 从服务器配置
- 进入从服务
docker exec -it mysql-slave mysql -u root -ppassword
- 连接到主mysql和规定复制用户消息
CHANGE MASTER TO MASTER_HOST='mysqlp1', MASTER_USER='repl', MASTER_PASSWORD='replpassword', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
- 启动复制
START SLAVE;
- 记录复制状态
SHOW SLAVE STATUS \G;
- 如果输出中 Slave_IO_Running 和 Slave_SQL_Running 都是 Yes,说明主从复制配置成功。
配置检测
- 在主服务新建数据库和表格并且插入数据
-- 创建数据库 CREATE DATABASE test_database; -- 切换到新创建的数据库 USE test_database; -- 创建表 CREATE TABLE test_table ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, age INT ); -- 切换到指定的数据库 USE test_database; -- 向表中插入数据 INSERT INTO test_table (name, age) VALUES ('Alice', 25), ('Bob', 30), ('Charlie', 28);
- 在从服务中检测是否出现主服务中的数据库
show databases;
- 成功示例
主服务
从服务
- 成功示例
错误处理
- 高版本的mysql可能出现 MySQL 8.0 默认使用 caching_sha2_password 认证插件,而连接需要 SSL(安全连接)。
- 第一种解决办法在配置其他插件
之后需要重新配置从服务器docker exec -it mysql-master mysql -u root -ppassword -- 在MySQL命令行中执行以下命令 ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'replpassword'; FLUSH PRIVILEGES;
docker exec -it mysql-slave mysql -u root -ppassword -- 在MySQL命令行中执行以下命令 STOP SLAVE; CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='repl', MASTER_PASSWORD='replpassword', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=根据实际情况填写可能会改变; START SLAVE; -- 检查复制状态 SHOW SLAVE STATUS \G;
- 第二种解决办法
- 生成SSL证书
使用 MySQL 自带工具生成SSL证书:
mysql_ssl_rsa_setup --datadir=/path/to/mysql/data
- 配置主服务器使用SSL在主服务器的 my.cnf 文件中添加:
[mysqld] ... ssl-ca=/path/to/ca.pem ssl-cert=/path/to/server-cert.pem ssl-key=/path/to/server-key.pem
- 配置从服务器使用SSL在从服务器的 my.cnf 文件中添加:
[mysqld] ... ssl-ca=/path/to/ca.pem ssl-cert=/path/to/client-cert.pem ssl-key=/path/to/client-key.pem
- 然后在从服务器上重新配置主从复制,确保启用SSL连接:
docker exec -it mysql-slave mysql -u root -ppassword -- 在MySQL命令行中执行以下命令 STOP SLAVE; CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='repl', MASTER_PASSWORD='replpassword', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=根据实际情况填写可能会改变; START SLAVE; -- 检查复制状态 SHOW SLAVE STATUS \G;
- 生成SSL证书
本地连接
云配置
- 通过阿里云
- 配置出占规则(我们需要这两个端口可以被外界访问)
我们需要添加Docker中两个服务器的映射端口
- 主服务器为3305 从服务器为3304
- 点击手动添加并且填写端口
- 宝塔配置出站规则
- 进入宝塔按照图示
本地配置
- 本文通过IDEA来进行远程连接需要专业版
- 打开Idea数据库
- 在填写端口那里填写主从服务的映射端口