MySQL8 基于Docker实现一主多从

参考

环境

软件/系统 版本 说明
Windows Windows 10 专业版 22H2 19045.4046
Docker Desktop 4.27.1
Docker 25.0.2
Docker Compose v2.24.3-desktop.1
MySQL 8.0.36

同步模式

  • 异步复制:这是 MySQL 默认的同步模式。在异步复制中,主库将事务写入 binlog,并立即返回给客户端,而不等待从库接收和应用这些日志。从库会以异步的方式从主库获取 binlog,并进行重放。这种方式的好处是主库的写入延迟较低,但从库可能存在一定程度的数据延迟。

  • 半同步复制:半同步复制是介于异步复制和同步复制之间的一种模式。在半同步复制中,主库在事务提交时会等待至少一个从库确认已经接收到并写入了该事务的 binlog,然后才会返回给客户端。这样可以减少数据丢失的风险,但相比于异步复制,写入延迟会稍微增加。

  • 全同步复制:在全同步复制模式下,主库在事务提交时会等待所有从库都已经接收到并写入了该事务的 binlog,然后才会返回给客户端。这种方式可以最大程度地确保数据的一致性,但也会导致较高的写入延迟。

需要注意的是,半同步复制和全同步复制需要在主库和从库上进行额外的配置和参数设置。你可以根据应用需求和性能要求选择适合的同步模式。
除了上述常见的同步模式外,还有其他复制技术和工具可以实现更高级的同步策略,例如基于组复制(Group Replication)的 MySQL InnoDB Cluster,以及第三方工具如MaxScale、Galera Cluster等。

步骤

1. 启动容器(当前电脑项目下执行)

docker-compose up 

2. 开启主从关联(进入从库容器MySQL命令行执行,注意: 配置信息是主库的)

# 从库重启后依旧会从主库中同步数据,无需再次执行本命令。
change master to master_host='master', master_user='root', master_password='12345678', master_port=3306, get_master_public_key=1, MASTER_CONNECT_RETRY=10;

3. 开启同步(进入从库容器MySQL命令行执行)

start slave;

相关命令

停止同步(进入从库容器MySQL命令行执行)

stop slave;

清除同步(进入从库容器MySQL命令行执行)

reset slave;

查看MySQL错误(进入从库容器MySQL命令行执行)

show warnings

查看同步状态(进入从库容器MySQL命令行执行)

SHOW SLAVE STATUS\G;
# 下面显示都是 Yes 才可以正常复制
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

查看主库状态(进入主库容器MySQL命令行执行)

SHOW MASTER STATUS;

查看从库信息(进入主库容器MySQL命令行执行)

SHOW SLAVE HOSTS;
# 两个从库配置完毕后,主库执行本命令则显示如下
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID                           |
+-----------+------+------+-----------+--------------------------------------+
|         3 |      | 3306 |         1 | 3c0de2c7-db84-11ee-9581-0242c0a8e004 |
|         2 |      | 3306 |         1 | 3beac053-db84-11ee-9591-0242c0a8e003 |
+-----------+------+------+-----------+--------------------------------------+
2 rows in set, 1 warning (0.00 sec)

MySQL 创建用户

解决 root 账号不受只读配置的问题

  1. 创建用户. username:要创建的账户名; host:允许访问的主机名或 IP 地址.如果希望从任意主机访问,可以使用 % 作为通配符;password:账户的密码.
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
  1. 授予权限
GRANT ALL PRIVILEGES ON *.* TO 'username'@'host';
  1. 刷新权限,应用生效
FLUSH PRIVILEGES;

主要配置文件

Docker容器在同一网络

master 主库
  • /etc/my.cnf
    [mysqld]
    # 主从配置(主) 
    # server-id 禁止重复
    server-id=1
    log-bin=mysql-bin
    binlog-format=ROW
    
slave 从库(有几个从库就配置几个从库的对应的 my.cnf )
  • /etc/my.cnf
    [mysqld]
    # 主从配置(从1)
    # server-id 禁止重复
    server-id=2
    #从服务器的二进制日志文件的名称。
    log_bin=mysql-bin 
    #中继日志文件的名称,用于从主服务器接收二进制日志事件。
    relay-log=mysql-relay-bin
    log-slave-updates=1
    # 只读(对root账号不生效,测试新建一个账号也可以写入...)
    read-only=1
    # 指定要复制的数据库,不指定则所有
    binlog-do-db=database
    #不同步相关的库
    replicate-ignore-db=mysql 
    replicate-ignore-db=information_schema
    replicate-ignore-db=performance_schema
    
posted @   夏秋初  阅读(91)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
历史上的今天:
2022-03-06 Java 通过原子类 AtomicStampedReference 实现自旋锁
点击右上角即可分享
微信分享提示