在阿里云服务器上用Docker来创建主从Mysql教程

在阿里云服务器上用Docker来创建主从Mysql教程

在Docker中创建网络以此来连接主从Docker容器

docker network create mysql-cluster-net

创建服务

  1. 创建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 映射到容器的端口 3306MySQL 默认端口)
      -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 镜像
    
  1. 创建从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
    
    • 代码解释同上

配置文件修改

  1. 配置主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
    
  2. 配置从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
    
  • 配置文件解释同上

初始化主从配置

  1. 主服务配置
  • 进入主服务
    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 |              |                  |                   |
      +------------------+----------+--------------+------------------+-------------------+
      
  1. 从服务器配置
  • 进入从服务
    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,说明主从复制配置成功

配置检测

  1. 在主服务新建数据库和表格并且插入数据
    -- 创建数据库
    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);
    
  2. 在从服务中检测是否出现主服务中的数据库
    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;
    
  • 第二种解决办法
    1. 生成SSL证书
      使用 MySQL 自带工具生成SSL证书:
    mysql_ssl_rsa_setup --datadir=/path/to/mysql/data
    
    1. 配置主服务器使用SSL在主服务器的 my.cnf 文件中添加:
      [mysqld]
      ...
      ssl-ca=/path/to/ca.pem
      ssl-cert=/path/to/server-cert.pem
      ssl-key=/path/to/server-key.pem
      
    2. 配置从服务器使用SSL在从服务器的 my.cnf 文件中添加:
      [mysqld]
      ...
      ssl-ca=/path/to/ca.pem
      ssl-cert=/path/to/client-cert.pem
      ssl-key=/path/to/client-key.pem
      
    3. 然后在从服务器上重新配置主从复制,确保启用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;
      

本地连接

云配置

  1. 通过阿里云
  • 配置出占规则(我们需要这两个端口可以被外界访问)

我们需要添加Docker中两个服务器的映射端口

  • 主服务器为3305 从服务器为3304在这里插入图片描述
  • 点击手动添加并且填写端口在这里插入图片描述
  1. 宝塔配置出站规则
  • 进入宝塔按照图示

本地配置

  • 本文通过IDEA来进行远程连接需要专业版
  • 打开Idea数据库
  • 在这里插入图片描述
  • 填写端口那里填写主从服务的映射端口
    在这里插入图片描述
  • 11
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值