Ubuntu22.04 + Mysql5.7 + Docker + 主备复制方案
同时运行两个 MySQL 5.7 容器。这种方式可以实现数据库的主-备复制架构,提高系统的可靠性。
下面是一个示例,演示如何运行两个 MySQL 5.7 容器,一个作为主节点,一个作为备节点:
1. 运行主 MySQL 容器:
sudo docker run -d \
--name mysql-57-master \
--restart=always \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=master_password \
-e MYSQL_DATABASE=my_database \
-v mysql-master-data:/var/lib/mysql \
mysql:5.7
这里我们创建了一个名为 mysql-57-master
的容器,并将 root 密码设置为 master_password
。我们还创建了一个名为 my_database
的数据库,并将数据存储在名为 mysql-master-data
的 Docker 卷中。
2. 运行备 MySQL 容器:
sudo docker run -d \
--name mysql-57-slave \
--restart=always \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=slave_password \
-e MYSQL_REPLICATION_SOURCE=mysql-57-master \
-e MYSQL_REPLICATION_USER=repl_user \
-e MYSQL_REPLICATION_PASSWORD=repl_password \
-v mysql-slave-data:/var/lib/mysql \
mysql:5.7
与正在运行的容器进行交互:
docker exec -it mysql-57-master bash
这里我们创建了一个名为 mysql-57-slave
的容器,并将 root 密码设置为 slave_password
。我们还设置了一些环境变量来配置主-备复制:
MYSQL_REPLICATION_SOURCE
: 指定主 MySQL 容器的名称MYSQL_REPLICATION_USER
: 指定用于复制的用户名MYSQL_REPLICATION_PASSWORD
: 指定用于复制的密码
同样,我们将数据存储在名为 mysql-slave-data
的 Docker 卷中。
停止容器
sudo docker stop mysql-57-master
sudo docker stop mysql-57-slave
通过这种方式,我们可以在两个独立的 MySQL 容器中运行主-备复制架构。主容器接收所有的写入请求,备容器会自动同步主容器的数据。这种方式可以提高数据库的可靠性和高可用性。
还可以根据需要添加更多的备节点容器,并配置复制拓扑。此外,可以使用负载均衡器来分发读写请求,进一步提高系统的性能和可扩展性。
3. 登录MySQL并创建数据库和用户
-- 登录MySQL
docker exec -it mysql-57-master bash
mysql -u root -p
-- 创建数据库
CREATE DATABASE db_test;
-- 创建用户并授权
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON db_test.* TO 'myuser'@'%';
FLUSH PRIVILEGES;
4. mysql workbench 安装
wget https://downloads.mysql.com/archives/get/p/8/file/mysql-workbench-community_8.0.36-1ubuntu22.04_amd64.deb
sudo dpkg -i mysql-workbench-community_8.0.36-1ubuntu22.04_amd64.deb
-
主-备复制配置:
- 在主容器上,需要开启二进制日志记录(
log-bin
)并配置服务器 ID。 - 在备容器上,需要配置连接主容器的复制用户凭证,以及复制过滤规则。
- 可以使用 Docker 环境变量或自定义的 MySQL 配置文件来完成这些配置。
- 在主容器上,需要开启二进制日志记录(
-
主-备切换:
- 如果主节点发生故障,需要将备节点提升为新的主节点。这需要手动执行一些 MySQL 命令,或者使用自动化工具来实现。
- 当主节点恢复后,可以将其重新配置为备节点,与新的主节点进行数据同步。
-
备份和恢复:
- 可以定期备份主节点的数据,例如使用 mysqldump 命令。备份数据可以存储在主机上或者其他存储系统中。
- 如果需要进行数据恢复,可以将备份数据导入到新的 MySQL 容器中,并将其配置为备节点加入到复制拓扑中。
-
监控和报警:
- 需要监控主-备复制的状态,确保复制正常进行。可以使用 MySQL 命令或者第三方监控工具来实现。
- 当出现复制延迟或者主节点故障时,需要及时发送报警通知,以便及时采取措施。
-
负载均衡:
- 可以使用负载均衡器将读写请求分发到主节点和备节点,提高系统的性能和可用性。
- 需要根据业务需求,合理分配读写请求,以确保主节点不会过载。
总的来说,使用 Docker 运行两个 MySQL 容器实现主-备复制架构需要一些额外的配置和管理工作,但可以显著提高数据库系统的可靠性和高可用性。您需要根据具体的业务需求,合理规划和配置主-备复制拓扑,并建立完善的监控和报警机制。
Docker Compose的方式配置主从复制
在 Docker Compose 中,卷(volumes)可以用来持久化数据,以确保即使容器被删除,数据仍然保留。以下是详细的配置和说明。
docker-compose.yml 示例
version: '3.8'
services:
mysql-master:
image: mysql:5.7
container_name: mysql-master
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_REPLICATION_USER: repl_user
MYSQL_REPLICATION_PASSWORD: repl_password
MYSQL_DATABASE: exampledb
ports:
- "3306:3306"
volumes:
- master_data:/var/lib/mysql
command: >
--server-id=1
--log-bin=mysql-bin
--binlog-do-db=exampledb
mysql-slave:
image: mysql:5.7
container_name: mysql-slave
depends_on:
- mysql-master
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_REPLICATION_USER: repl_user
MYSQL_REPLICATION_PASSWORD: repl_password
ports:
- "3307:3306"
volumes:
- slave_data:/var/lib/mysql
command: >
--server-id=2
--relay-log=relay-log-bin
--log-slave-updates
--read-only=1
volumes:
master_data:
slave_data:
卷的配置和作用
在这个配置中:
volumes: 定义了两个卷:master_data 和 slave_data。
在 mysql-master 服务中,卷 master_data 挂载到容器内的 /var/lib/mysql 目录。这是 MySQL 存储数据的默认位置。
在 mysql-slave 服务中,卷 slave_data 也挂载到容器内的 /var/lib/mysql 目录。
这些卷的配置确保了 MySQL 容器中的数据可以持久化,即使容器被删除或重新创建,数据仍然保留。
创建和启动服务
创建 docker-compose.yml 文件:
在你的项目目录下创建一个名为 docker-compose.yml 的文件,并将上述内容粘贴进去。
启动 Docker Compose:
在项目目录中运行以下命令来启动服务:
docker-compose up -d
检查卷:
你可以使用以下命令查看创建的卷:
docker volume ls
配置主从复制
进入主节点容器并创建复制用户:
docker exec -it mysql-master mysql -uroot -proot_password
在 MySQL shell 中执行以下命令:
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
记录 File 和 Position:
记录下 SHOW MASTER STATUS 命令的输出中的 File 和 Position 值。
配置从节点:
进入从节点容器:
docker exec -it mysql-slave mysql -uroot -proot_password
在 MySQL shell 中执行以下命令,替换 <master_log_file> 和 <master_log_pos> 为你记录的值:
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl_user',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='<master_log_file>',
MASTER_LOG_POS=<master_log_pos>;
START SLAVE;
验证从节点状态:
SHOW SLAVE STATUS \G
确保 Slave_IO_Running 和 Slave_SQL_Running 都显示为 Yes。
通过这些步骤,你可以在 Docker Compose 中配置和运行 MySQL 主从复制,并确保数据持久化。