索引
- 前言
- 安装docker
- 设置国内镜像源
- 拉取镜像
- 创建docker-compose.yml
- 启动主从数据库
- 配置主数据库
- 配置从数据库
- 实验是否成功
前言
为了方便游戏服务器扩展,我需要了解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” 可以根据需要设置成国内其他镜像源。
源 | 说明 |
网易镜像,体验良好,推荐 | |
docker中国 | |
中国科技大学镜像 | |
网易镜像,我这里很快 | |
阿里云镜像,不能直接使用,需要登录进去生成专属地址 |
设置完镜像源后,需要重启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很方便。