AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1166156
Accepted
Jose Cabrera Zuniga
Jose Cabrera Zuniga
Asked: 2024-10-05 00:24:12 +0800 CST2024-10-05 00:24:12 +0800 CST 2024-10-05 00:24:12 +0800 CST

设置 docker mariadb 复制

  • 772

为了理解 mariadb 复制,我创建了下一个 docker 容器:

docker run -e TZ=America/Denver --name mariadb1 --network=camino_nw \
  -e MARIADB_SERVER_ID=1 -e MARIADB_LOG_BIN=mysql-bin -e MARIADB_LOG_BASENAME=mariadb1 \
  -e MARIADB_BINLOG_FORMAT=mixed -p 127.0.0.1:53301:3306 \
  -v /home/jcz/Documents/dockerMariadbData1:/var/lib/mysql:z \
  -e MARIADB_ROOT_PASSWORD=S3cretPw -d mariadb:latest

docker run -e TZ=America/Denver --name mariadb2 --network=camino_nw \
  -e MARIADB_SERVER_ID=2 -e MARIADB_LOG_BIN=mysql-bin -e MARIADB_LOG_BASENAME=mariadb2 \
  -e MARIADB_BINLOG_FORMAT=mixed -p 127.0.0.1:53302:3306 \
  -v /home/jcz/Documents/dockerMariadbData2:/var/lib/mysql:z \
  -e MARIADB_ROOT_PASSWORD=S3cretPw -d mariadb:latest

docker run -e TZ=America/Denver --name mariadb3 --network=camino_nw \
  -e MARIADB_SERVER_ID=3 -e MARIADB_LOG_BIN=mysql-bin -e MARIADB_LOG_BASENAME=mariadb3 \
  -e MARIADB_BINLOG_FORMAT=mixed -p 127.0.0.1:53303:3306 \
  -v /home/jcz/Documents/dockerMariadbData3:/var/lib/mysql:z \
  -e MARIADB_ROOT_PASSWORD=S3cretPw -d mariadb:latest

主服务器是 mariadb1,对于这个我执行了:

CREATE USER 'replication_user'@'%' IDENTIFIED BY 'S3cretPw';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';

对于每个从属 mariadb2 和 mariadb3 我运行:

CHANGE MASTER TO MASTER_HOST='mariadb1',  MASTER_USER='replication_user',  MASTER_PASSWORD='S3cretPw',  MASTER_PORT=3306, MASTER_CONNECT_RETRY=10;

CHANGE MASTER TO MASTER_USE_GTID = slave_pos;

我还用 START SLAVE 启动了从属服务器;

运行

SHOW SLAVE STATUS \G 

我收到下一个错误:

         Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MariaDB server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).

如果我使用,怎么会发生这种情况

MARIADB_SERVER_ID=1
MARIADB_SERVER_ID=2
MARIADB_SERVER_ID=3

对于我的每个容器?

我正在尝试遵循:

https://mariadb.com/kb/en/setting-up-replication/

docker
  • 1 1 个回答
  • 55 Views

1 个回答

  • Voted
  1. Best Answer
    larsks
    2024-10-05T11:51:54+08:002024-10-05T11:51:54+08:00

    为什么您认为设置MARIADB_SERVER_ID环境变量会设置 mariadb 服务器 ID?我在mariadb 文档或容器映像文档(或环境变量列表MARIADB_*)中都找不到提及的内容。您的大多数其他变量也是如此。

    如果你能做到以下几点,你就能让事情正常运转:

    1. 删除错误变量,
    2. 使用记录的变量来设置复制,并且
    3. 使用命令行选项设置服务器配置选项

    它可能看起来像这样:

    docker network create camino_nw
    
    docker run -d --name mariadb1 --network=camino_nw \
      -p 127.0.0.1:53301:3306 \
      -v mariadb1-data:/var/lib/mysql \
      -e TZ=America/Denver \
      -e MARIADB_ROOT_PASSWORD=secret \
      -e MARIADB_REPLICATION_USER=replication_user \
      -e MARIADB_REPLICATION_PASSWORD=secret \
      mariadb:10 --server-id=1 --log-bin --log-basename=mariadb1 --binlog-format=mixed
    
    docker run -d --name mariadb2 --network=camino_nw \
      -p 127.0.0.1:53302:3306 \
      -v mariadb2-data:/var/lib/mysql \
      -e TZ=America/Denver \
      -e MARIADB_ROOT_PASSWORD=secret \
      -e MARIADB_MASTER_HOST=mariadb1 \
      -e MARIADB_REPLICATION_USER=replication_user \
      -e MARIADB_REPLICATION_PASSWORD=secret \
      mariadb:10 --server-id=2
    
    docker run -d --name mariadb3 --network=camino_nw \
      -p 127.0.0.1:53303:3306 \
      -v mariadb3-data:/var/lib/mysql \
      -e TZ=America/Denver \
      -e MARIADB_ROOT_PASSWORD=secret \
      -e MARIADB_MASTER_HOST=mariadb1 \
      -e MARIADB_REPLICATION_USER=replication_user \
      -e MARIADB_REPLICATION_PASSWORD=secret \
      mariadb:10 --server-id=3
    

    这将自动为您创建复制用户(因为我们设置了MARIADB_REPLICATION_USER和MARIADB_REPLICATION_PASSWORD),并且它将自动配置要从中复制的副本mariadb1(因为我们还设置了MARIADB_MASTER_HOST副本)。


    顺便说一句,这是使用 的绝佳机会docker compose,因为它使这些长docker run命令行更容易管理。我将上述所有内容放入compose.yaml如下所示的 中:

    services:
      mariadb1:
        command:
          - --server-id=1
          - --log-bin
          - --log-basename=mariadb1
          - --binlog-format=mixed
        environment:
          MARIADB_REPLICATION_PASSWORD: ${MARIADB_REPLICATION_PASSWORD}
          MARIADB_REPLICATION_USER: ${MARIADB_REPLICATION_USER}
          MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
          TZ: ${TZ}
        hostname: mariadb1
        image: mariadb:10
        ports:
          - 127.0.0.1:53301:3306
        volumes:
          - mariadb1:/var/lib/mysql
      mariadb2:
        command:
          - --server-id=2
        environment:
          MARIADB_MASTER_HOST: ${MARIADB_MASTER_HOST}
          MARIADB_REPLICATION_PASSWORD: ${MARIADB_REPLICATION_PASSWORD}
          MARIADB_REPLICATION_USER: ${MARIADB_REPLICATION_USER}
          MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
          TZ: ${TZ}
        hostname: mariadb2
        image: mariadb:10
        ports:
          - 127.0.0.1:53302:3306
        volumes:
          - mariadb2:/var/lib/mysql
      mariadb3:
        command:
          - --server-id=3
        environment:
          MARIADB_MASTER_HOST: ${MARIADB_MASTER_HOST}
          MARIADB_REPLICATION_PASSWORD: ${MARIADB_REPLICATION_PASSWORD}
          MARIADB_REPLICATION_USER: ${MARIADB_REPLICATION_USER}
          MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD}
          TZ: ${TZ}
        hostname: mariadb3
        image: mariadb:10
        ports:
          - 127.0.0.1:53303:3306
        volumes:
          - mariadb3:/var/lib/mysql
    volumes:
      mariadb1: null
      mariadb2: null
      mariadb3: null
    

    我有一个.env如下所示的文件:

    MARIADB_ROOT_PASSWORD=secret
    MARIADB_MASTER_HOST=mariadb1
    MARIADB_REPLICATION_USER=replication_user
    MARIADB_REPLICATION_PASSWORD=replication
    TZ=America/Denver
    

    这使我能够简单地docker compose up和整个环境。您可以在此存储库docker compose down中找到此答案中引用的文件。

    • 3

相关问题

  • 当你让一个进程监听 0.0.0.0 而不是 127.0.0.1 时,为什么 docker 工作仍然很困惑

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve