名称 | 版本 |
---|---|
Docker | 1.14.0-rc2 |
Mysql | 5.7.17 |
Docker compose | 19.03.1 |
./
- docker-compose.yml
- master/
- my.cnf
- Dockerfile
- slave/
- my.cnf
- Dockerfile
复制代码
docker-compose.ymlmysql
version: '2'
services:
mysql-master:
build:
context: ./
dockerfile: master/Dockerfile
environment:
- "MYSQL_ROOT_PASSWORD=root"
- "MYSQL_DATABASE=replicas_db"
links:
- mysql-slave
ports:
- "33065:3306"
restart: always
hostname: mysql-master
mysql-slave:
build:
context: ./
dockerfile: slave/Dockerfile
environment:
- "MYSQL_ROOT_PASSWORD=root"
- "MYSQL_DATABASE=replicas_db"
ports:
- "33066:3306"
restart: always
hostname: mysql-slave
复制代码
FROM mysql:5.7.17
MAINTAINER harrison
ADD ./master/my.cnf /etc/mysql/my.cnf
复制代码
[mysqld]
## 设置server_id,通常设置为IP,注意要惟一
server_id=100
## 复制过滤:也就是指定哪一个数据库不用同步(mysql库通常不一样步)
binlog-ignore-db=mysql
## 开启二进制日志功能,能够随便取,最好有含义(关键就是这里了)
log-bin=replicas-mysql-bin
## 为每一个session分配的内存,在事务过程当中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过时的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的全部错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是由于主从数据库数据不一致
slave_skip_errors=1062
复制代码
FROM mysql:5.7.17
MAINTAINER harrison
ADD ./slave/my.cnf /etc/mysql/my.cnf
复制代码
[mysqld]
## 设置server_id,通常设置为IP,注意要惟一
server_id=101
## 复制过滤:也就是指定哪一个数据库不用同步(mysql库通常不一样步)
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave做为其它Slave的Master时使用
log-bin=replicas-mysql-slave1-bin
## 为每一个session 分配的内存,在事务过程当中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过时的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的全部错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是由于主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=replicas-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进本身的二进制日志
log_slave_updates=1
## 防止改变数据(除了特殊的线程)
read_only=1
复制代码
在当前目录,运行 docker-compose 启动命令。sql
docker-compose up -d
复制代码
以下面输出,则代表容器已经启动成功docker
[root@localhost my-mysql]# docker-compose up -d
Building mysql-slave
Step 1/3 : FROM mysql:5.7.17
---> 9546ca122d3a
Step 2/3 : MAINTAINER harrison
---> Running in df2ad9059e34
Removing intermediate container df2ad9059e34
---> eb0aacfa9ec1
Step 3/3 : ADD ./slave/my.cnf /etc/mysql/my.cnf
---> c6b14fcc1fcd
Successfully built c6b14fcc1fcd
Successfully tagged mymysql_mysql-slave:latest
WARNING: Image for service mysql-slave was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Building mysql-master
Step 1/3 : FROM mysql:5.7.17
---> 9546ca122d3a
Step 2/3 : MAINTAINER harrison
---> Using cache
---> eb0aacfa9ec1
Step 3/3 : ADD ./master/my.cnf /etc/mysql/my.cnf
---> 193dc5745984
Successfully built 193dc5745984
Successfully tagged mymysql_mysql-master:latest
WARNING: Image for service mysql-master was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating mymysql_mysql-slave_1 ...
Creating mymysql_mysql-slave_1 ... done
Creating mymysql_mysql-master_1 ...
Creating mymysql_mysql-master_1 ... done
复制代码
使用数据库管理工具,能够看到,单独链接master,slave数据库都是能链接成功。数据库
没有成功的请假差配置文件是否输入正确,这一步成功才能记录后续操做。缓存
走到这一步去,代表主从数据库的安装已是成功了,接下来把slave数据库关联上master,就能让咱们的mysql主从集群搭建成功。 那要怎么关联上master呢?就是在从数据配置主数据库binary-log
的文件名称和数据同步位置bash
首先在主数据库查询主库的状态session
show master status;
工具
能够看到直接结果为:测试
File: replicas-mysql-bin.000003
ui
Position: 154
在 从数据库 上运行 主数据库 的相关配置 sql
进行主从关联
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='root',
MASTER_PASSWORD='root',
MASTER_LOG_FILE='replicas-mysql-bin.000003', -- File文件名
MASTER_LOG_POS=154; -- binlog记录位置
复制代码
slave
服务docker restart 从数据库容器名/容器id
复制代码
在 主数据库 中建立一张测试数据表test
sql 以下:
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
复制代码
而后在从数据刷新,看是否有test
已经从主数据库同步过来了。看到了则代表咱们基于docker compose
的mysql主从集群已经搭建成功!