Lv.的博客

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
  
  

与正在运行的容器进行交互:

image.png

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
  1. 主-备复制配置:

    • 在主容器上,需要开启二进制日志记录(log-bin)并配置服务器 ID。
    • 在备容器上,需要配置连接主容器的复制用户凭证,以及复制过滤规则。
    • 可以使用 Docker 环境变量或自定义的 MySQL 配置文件来完成这些配置。
  2. 主-备切换:

    • 如果主节点发生故障,需要将备节点提升为新的主节点。这需要手动执行一些 MySQL 命令,或者使用自动化工具来实现。
    • 当主节点恢复后,可以将其重新配置为备节点,与新的主节点进行数据同步。
  3. 备份和恢复:

    • 可以定期备份主节点的数据,例如使用 mysqldump 命令。备份数据可以存储在主机上或者其他存储系统中。
    • 如果需要进行数据恢复,可以将备份数据导入到新的 MySQL 容器中,并将其配置为备节点加入到复制拓扑中。
  4. 监控和报警:

    • 需要监控主-备复制的状态,确保复制正常进行。可以使用 MySQL 命令或者第三方监控工具来实现。
    • 当出现复制延迟或者主节点故障时,需要及时发送报警通知,以便及时采取措施。
  5. 负载均衡:

    • 可以使用负载均衡器将读写请求分发到主节点和备节点,提高系统的性能和可用性。
    • 需要根据业务需求,合理分配读写请求,以确保主节点不会过载。

总的来说,使用 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 主从复制,并确保数据持久化。

posted @ 2024-08-03 11:33  Avatarx  阅读(57)  评论(0编辑  收藏  举报