本指南将介绍在 CentOS 8 环境下,使用 Docker 搭建 MySQL (8.0.32)双主复制集群。双主复制意味着两个 MySQL实例都可读写并相互同步,以此提高可用性。主要内容包括:

  • ​​环境准备​​:系统与软件要求。 ​​
  • 网络与数据规划​​:创建 Docker 网络和宿主机数据目录。 ​​
  • 部署与配置​​:启动容器并配置MySQL 双主复制。
  • ​​验证测试​​:检查复制状态并进行数据同步测试。

接下来是详细的部署步骤:

1. 环境准备与前提条件

开始部署前,请确保你的CentOS 8系统已安装以下软件并满足基本要求:

  • ​​Docker​​: 版本 ≥ 20.10.7
  • 系统资源​​:建议至少 4核 CPU / 8GB 内存
  • ​​安装Docker和Docker Compose​​
  • 如果系统尚未安装Docker,可以通过以下命令安装:

安装Docker

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
​​验证安装​​:
安装完成后,使用以下命令验证安装是否成功:

```bash
docker --version

2. 创建Docker容器数据目录

为了确保容器间能够持久化数据,需要先创建一个专用的Docker数据目录。

​​创建数据与配置目录​​:
为每个MySQL节点创建独立的数据和配置目录,防止数据丢失并便于管理。

mkdir -p /opt/docker/mysql/{master1,master2}/{data,config,log}

3. 部署MySQL容器

你可以选择使用 docker run命令或 Docker Compose来部署容器。下面是两种方式的具体配置。

使用 Docker Run 命令分别运行两个mySQL容器:

​​启动 Master1 容器​​:
docker run -p 3316:3306 \
        --name mysql_master1 \
        --privileged=true \
        -v /opt/docker/mysql/masert1/data:/var/lib/mysql \
        -v /opt/docker/mysql/masert1/conf:/etc/mysql/conf.d \
        -v /opt/docker/mysql/masert1/log:/var/log \
        -e MYSQL_ROOT_PASSWORD=abc123456 \
        -d mysql:8.0.32 \
        --server-id=101 \
        --log-bin=mysql-bin \
        --gtid-mode=ON \
        --enforce-gtid-consistency=ON \
        --lower_case_table_names=1
启动 Master2 容器​​:
docker run -p 3326:3306 \
        --name mysql_master2 \
        --privileged=true \
        -v /opt/docker/mysql/masert2/data:/var/lib/mysql \
        -v /opt/docker/mysql/masert2/conf:/etc/mysql/conf.d \
        -v /opt/docker/mysql/masert2/log:/var/log \
        -e MYSQL_ROOT_PASSWORD=abc123456 \
        -d mysql:8.0.32 \
        --server-id=102 \
        --log-bin=mysql-bin \
        --gtid-mode=ON \
        --enforce-gtid-consistency=ON \
        --lower_case_table_names=1

4. 配置双主复制

容器运行后,需要进入MySQL内部配置复制账户和主从关系。
​​在两个主节点上创建复制账户​​:分别进入 mysql-master1和 mysql-master2容器,创建用于复制的用户。

进入mysql-master1容器
docker exec -it mysql_master1 mysql -uroot -p
输入密码后执行SQL
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'abc123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
在 mysql-master2上执行同样的操作。
  • 查看主节点状态并记录位置信息​​:
    在每个主节点上执行以下命令,并​​记下 File和 Position的值​​(非常重要!)。
SHOW MASTER STATUS;
  • ​​配置主从关系​​:
    在 mysql-master2上配置,将其指向 mysql-master1(使用第一步中在master1上查到的File和Position值):
CHANGE MASTER TO
  MASTER_HOST='192.168.0.2',
  MASTER_USER='repl',
  MASTER_PORT='3316'
  MASTER_PASSWORD='abc123456',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=157;
START SLAVE;
  • 在 mysql-master1上配置,将其指向mysql-master2(使用第一步中在master2上查到的File和Position值):
CHANGE MASTER TO
  MASTER_HOST='192.168.0.2',
  MASTER_USER='repl',
  MASTER_PORT='3326'
  MASTER_PASSWORD='abc123456',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=157;
START SLAVE;

5. 验证复制状态

  • 在双主节点上分别执行以下命令,检查复制状态:
SHOW SLAVE STATUS\G
  • 关键检查点是在输出结果中,确保以下两个字段的值均为 Yes:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

如果都是 Yes,表示复制链路正常。
​​

进行数据同步测试​​:

  • 在一个主节点(例如 mysql-master1)上创建表或插入数据:
CREATE TABLE test_table (id INT PRIMARY KEY, data VARCHAR(100));
INSERT INTO test_table VALUES (1, 'Hello from Master1');
  • 然后在另一个主节点(mysql-master2)上查询:
SELECT * FROM test_table;
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐