mysql使用docker配置GTID主从复制

前言

为了方便游戏服务器扩展,我需要了解mysql主从复制,并在本地部署实验。
为啥我选择使用docker安装?因为我被mysql本地配置主从配置搞疯了。历经2个小时,处理各种因为启动用户,文件权限,文件缺失的问题,我放弃了。

安装docker

docker安装可以去官网寻找安装文件 ,这个是mac版本的链接。因为墙的存在,可能会经历痛苦的下载过程。这时候可以选择阿里云的镜像站进行下载。没错,镜像站不只是提供镜像,还提供docker安装文件MAC版本

设置国内镜像源

docker安装完成之后,如果不设置国内镜像源,会慢的不可思议。在linux系统,我创建或修改 /etc/docker/daemon.json 文件。添加如下内容:

{
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
}

里面的镜像源地址 “http://hub-mirror.c.163.com” 可以根据需要设置成国内其他镜像源。

说明
http://hub-mirror.c.163.com网易镜像,体验良好,推荐
https://registry.docker-cn.comdocker中国
https://docker.mirrors.ustc.edu.cn中国科技大学镜像
http://hub-mirror.c.163.com网易镜像,我这里很快
https://cr.console.aliyun.com阿里云镜像,不能直接使用,需要登录进去生成专属地址

设置完镜像源后,需要重启docker服务。mac版本docker在Preference->Docker Engine中设置。

拉取镜像

我这里使用的是mysql5.7.30版本。

docker pull mysql:5.7

创建docker-compose.yml

主库设置名称 mysql3307m,开放端口 3307,从库设置名称 mysql3308s,开放端口 3308.然后我还配置了my.cnf文件映射。

#docker-compose.yml
version: '2'
services:
  mysql-master:
    image: "mysql:5.7"
    container_name: "mysql3307m"
    environment:
      - "MYSQL_ROOT_PASSWORD=root"
    links:
      - mysql-slave
    ports:
      - "3307:3306"
    volumes:
      - ./master.cnf:/etc/mysql/my.cnf
    hostname: mysql-master
  mysql-slave:
    image: "mysql:5.7"
    container_name: "mysql3308s"
    environment:
      - "MYSQL_ROOT_PASSWORD=root"
    ports:
      - "3308:3306"
    volumes:
      - ./slave.cnf:/etc/mysql/my.cnf
    hostname: mysql-slave
#master.cnf
[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=100 
gtid_mode=ON
enforce-gtid-consistency=true
## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin=replicas-mysql-bin  
## 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M  
## 主从复制的格式(mixed,statement,row,默认格式是statement)官方推荐在使用GTID情况下,基于行复制
binlog_format=row
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# 没有设置双1
innodb_flush_log_at_trx_commit=1
#slave.cnf
[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=101
#GTID主从复制模式
gtid_mode=ON
enforce-gtid-consistency=true
## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin=replicas-mysql-bin  
## 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M  
## 主从复制的格式(mixed,statement,row,默认格式是statement)官方推荐在使用GTID情况下,基于行复制
binlog_format=row
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
relay_log=mysql-relay-bin
# crash safe
log_slave_updates=OFF
relay_log_recovery=ON
read_only=1

启动主从数据库

在docker-compose.yml文件目录运行命令

docker-compose up

查看控制台消息,看是否存在error,如果没有error,则继续。

配置主数据库

连上主库mysql-master,这里使用了 docker-compose.yml文件配置的container-name:mysql3307m

docker exec -it mysql3307m /bin/bash

连上mysql,这里直接用了root的密码root,对应docker-compose.yml文件中配置的MYSQL_ROOT_PASSWORD项。

mysql -uroot -proot

执行sql,创建用于复制的用户,分配复制权限

CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%'; 

配置从数据库

连上从库mysql-slave

docker exec -it mysql3308s /bin/bash

连上mysql,这里直接用了root的密码root,对应docker-compose.yml文件中配置的MYSQL_ROOT_PASSWORD项。

mysql -uroot -proot

执行sql,指定master和链接的用户

CHANGE MASTER TO
     >     MASTER_HOST = 'mysql-master',
     >     MASTER_PORT = 3306,
     >     MASTER_USER = 'repl',
     >     MASTER_PASSWORD = 'repl',
     >     MASTER_AUTO_POSITION = 1;

注意>符号是打回车之后自动出现的。
成功后执行sql语句

start slave;

实验是否成功

链接上mysql-master,创建一个数据库,在mysql-slave上看是否存在。如果存在,那么同步成功。如果没有,那么检查一下配置和步骤,使用docker-compose rm删除容器重新来过,docker很方便。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值