30分钟快速搭建Mysql主从环境
📅 2026/7/30 7:09:16
👁️ 阅读次数
📝 编程学习
拉取mysql镜像
docker pull mysql:5.7dockerCompose yml 文件
version: '3.8' services: mysql-master: # 服务名称 image: mysql:5.7 # 镜像信息 container_name: mysql-master # 容器名称 environment: # 环境变量配置 MYSQL_ROOT_PASSWORD: root123 # root 密码 MYSQL_ROOT_HOST: '%' # 权限 volumes: # 容器卷 - ./msmysql/master/conf/my.cnf:/etc/mysql/my.cnf - ./msmysql/master/data:/var/lib/mysql ports: # 端口 - "3306:3306" command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci networks: # 网络连接 - mysql-net mysql-slave1: image: mysql:5.7 container_name: mysql-slave1 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_ROOT_HOST: '%' volumes: - ./msmysql/slave1/conf/my.cnf:/etc/mysql/my.cnf - ./msmysql/slave1/data:/var/lib/mysql ports: - "3307:3306" command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci networks: - mysql-net mysql-slave2: image: mysql:5.7 container_name: mysql-slave2 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_ROOT_HOST: '%' volumes: - ./msmysql/slave2/conf/my.cnf:/etc/mysql/my.cnf - ./msmysql/slave2/data:/var/lib/mysql ports: - "3308:3306" command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci networks: - mysql-net # 自定义网络连接,连接方式为 bridge 方式。 host 方式等,这里选择 bridge 方式,为后续操作简化 # bridge 内的容器服务可以通过容器名访问,省去dns 解析. networks: mysql-net: driver: bridge这里注意: 为什么使用自定义创建的网络连接 并使用bridge 方式。
docker compose 在进行排版时,如果使用brideg 并且服务不指明网络 。 dockerCompose 就会自动创建一个名称为 服务名-default 的网络。
容器卷
msmysql | |---master | |--conf | |---my.cnf | |--data | |---slave1 | |--conf | |---my.cnf | |--data | |---slave2 | |--conf | |---my.cnf | |--datamy.cnf配置
配置 主my.cnf
[mysqld] # 服务id 唯一标识不能重复 server-id=1 # 开启二进制日志,主从复制的数据文件 log_bin=mysql-bin # 需要同步的数据库名称, 这里不做添加 # binlog-do-db=xxxx # 设置binlog 格式 binlog_format=STATEMENT # 设置网络允许远程连接 bind-address=0.0.0.0从库配置 my.cnf
[mysqld] #服务唯一表示 server-id=2 #从库开启日志 便于级联复制 log_bin=mysql-bin #读日志 relay-log=mysql-relay #允许远程连接 bind-address=0.0.0.0 [mysqld] #服务唯一表示 server-id=3 #从库开启日志 便于级联复制 log_bin=mysql-bin #读日志 relay-log=mysql-relay #允许远程连接 bind-address=0.0.0.0启动服务配置
- 启动dockerCompose 排版文件
docker compose -f msmysql.yml up -d- 进入主服务,并配置 主从账号和获取主服务信息
mysql -uroot -proot123进入mysql 服务,并查看当前用户
use mysql ; select user, host from user;这时候会发现,只有root用户是有所有权限 %
现在创建一个可以连接主从服务的用户
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl123';查看 master的binlog日志和开始间距
show master status;会看到如图显示
+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000004 | 405 | | | | +------------------+----------+--------------+------------------+-------------------+file ,用于slave 服务读取主服务的开始文件,
position ,位置用于 slave 服务开始读取配置。
登录从服务器
docker exec -it /bin/bash #登录数据库 mysql -uroot -proot123; show slave status\G; #未启用时可看到 Slave_IO_Running: No Slave_SQL_Running: No设置从库同步
change to master_host: Master的ip master_port:Master的端口号,因为用的是docker中的mysql,所以这里指的是宿主机映射到到mysql容器的端口 master_user:用于数据同步的用户 master_password:用于同步的用户的密码 master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值 master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值 master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒 #连接数据库输入以下配置,其中FILE与POS为主服务器看到参数 CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='repl123', MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=405, MASTER_CONNECT_RETRY=60; #启动同步功能 start slave设置完成后,重启slave1,slave2 容器,并登录查看数据库状态
#查看slave配置信息 show slave status\G;log_file, log_pos 都要与主库保持一致。
如果两个 slave 变成yes,证明启动成功。
测试
登录主数据库
#进入主数据库,新建数据库mytestcreate DATABASE mytest;#进入slave1数据库,查看数据库列表show databases;#可看到存在mytest表#进入slave2数据库可看到一样结果,证明主从配置生效
编程学习
技术分享
实战经验