Skip to content

Commit 6ad5ee7

Browse files
committed
init
0 parents  commit 6ad5ee7

12 files changed

+283
-0
lines changed

.env

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# default environment variables https://docs.docker.com/compose/env-file/

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.DS_Store
2+
.idea
3+
data

README.md

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
Docker MySQL master-slave replication
2+
========================
3+
docker-compose构建 mysql 主从复制(读写分离)集群
4+
MySQL master-slave replication with using Docker.
5+
6+
## Run
7+
8+
To run this examples you will need to start containers with "docker-compose"
9+
and after starting setup replication. See commands inside ./build.sh.
10+
11+
#### Create 2 MySQL containers with master-slave row-based replication
12+
13+
```
14+
./build.sh
15+
```
16+
17+
#### Make changes to master
18+
19+
```
20+
docker exec mysql_master sh -c "export MYSQL_PWD=111; mysql -u root mydb -e 'create table code(code int); insert into code values (100), (200)'"
21+
```
22+
23+
#### Read changes from slave
24+
25+
```
26+
docker exec mysql_slave sh -c "export MYSQL_PWD=111; mysql -u root mydb -e 'select * from code \G'"
27+
```
28+
```
29+
docker exec mysql_slave2 sh -c "export MYSQL_PWD=111; mysql -u root mydb -e 'select * from code \G'"
30+
```
31+
32+
## Troubleshooting
33+
34+
#### Check Logs
35+
36+
```
37+
docker-compose logs
38+
```
39+
40+
#### Start containers in "normal" mode
41+
42+
> Go through "build.sh" and run command step-by-step.
43+
44+
#### Check running containers
45+
46+
```
47+
docker-compose ps
48+
```
49+
50+
#### Clean data dir
51+
52+
```
53+
rm -rf ./master/data/*
54+
rm -rf ./slave/data/*
55+
rm -rf ./slave2/data/*
56+
```
57+
58+
#### Run command inside "mysql_master"
59+
60+
```
61+
docker exec mysql_master sh -c 'mysql -u root -p111 -e "SHOW MASTER STATUS \G"'
62+
```
63+
64+
#### Run command inside "mysql_slave"
65+
66+
```
67+
docker exec mysql_slave sh -c 'mysql -u root -p111 -e "SHOW SLAVE STATUS \G"'
68+
```
69+
```
70+
docker exec mysql_slave2 sh -c 'mysql -u root -p111 -e "SHOW SLAVE STATUS \G"'
71+
```
72+
73+
#### Enter into "mysql_master"
74+
75+
```
76+
docker exec -it mysql_master bash
77+
```
78+
79+
#### Enter into "mysql_slave"
80+
81+
```
82+
docker exec -it mysql_slave bash
83+
```
84+
85+
```
86+
docker exec -it mysql_slave2 bash
87+
```

build.sh

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#!/bin/bash
2+
#################### 变量定义 ####################
3+
mysql_user="mydb_slave_user" # 主服务器允许从服务器登录的用户名
4+
mysql_password="mydb_slave_pwd" # 主服务器允许从服务器登录的密码
5+
root_password="111" # 每台服务器的root密码
6+
# 主库列表
7+
master_container=mysql_master
8+
# 从库列表
9+
slave_containers=(mysql_slave mysql_slave2)
10+
# 所有的数据库集群列表
11+
all_containers=($master_container ${slave_containers[@]})
12+
13+
#################### 函数定义 ####################
14+
# 获取服务器的ip
15+
docker-ip() {
16+
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
17+
}
18+
19+
#################### docker-compose初始化 ####################
20+
docker-compose down
21+
rm -rf ./master/data/*
22+
rm -rf ./slave/data/*
23+
rm -rf ./slave2/data/*
24+
docker-compose build
25+
docker-compose up -d
26+
27+
#################### 服务器初始化操作 ####################
28+
# 这个操作的目的是尝试连接服务器, 如果连接失败, 就等待4s后重试, 直到等待mysql服务器就绪, 并且连接上为止
29+
for container in ${all_containers[@]};do
30+
until docker exec $container sh -c 'export MYSQL_PWD='$root_password'; mysql -u root -e ";"'
31+
do
32+
echo "Waiting for mysql_master database connection..."
33+
sleep 4
34+
done
35+
done
36+
37+
#################### 主服务器操作 ####################开始
38+
# 在主服务器上添加数据库用户
39+
priv_stmt='GRANT REPLICATION SLAVE ON *.* TO "'$mysql_user'"@"%" IDENTIFIED BY "'$mysql_password'"; FLUSH PRIVILEGES;'
40+
41+
docker exec $master_container sh -c "export MYSQL_PWD='$root_password'; mysql -u root -e '$priv_stmt'"
42+
43+
# 查看主服务器的状态
44+
MS_STATUS=`docker exec $master_container sh -c 'export MYSQL_PWD='$root_password'; mysql -u root -e "SHOW MASTER STATUS"'`
45+
46+
# binlog文件名字,对应 File 字段,值如: mysql-bin.000004
47+
CURRENT_LOG=`echo $MS_STATUS | awk '{print $6}'`
48+
# binlog位置,对应 Position 字段,值如: 1429
49+
CURRENT_POS=`echo $MS_STATUS | awk '{print $7}'`
50+
51+
#################### 从服务器操作 ####################开始
52+
# 设置从服务器与主服务器互通命令
53+
start_slave_stmt="CHANGE MASTER TO
54+
MASTER_HOST='$(docker-ip $master_container)',
55+
MASTER_USER='$mysql_user',
56+
MASTER_PASSWORD='$mysql_password',
57+
MASTER_LOG_FILE='$CURRENT_LOG',
58+
MASTER_LOG_POS=$CURRENT_POS;"
59+
start_slave_cmd='export MYSQL_PWD='$root_password'; mysql -u root -e "'
60+
start_slave_cmd+="$start_slave_stmt"
61+
start_slave_cmd+='START SLAVE;"'
62+
63+
# 执行从服务器与主服务器互通
64+
for slave in ${slave_containers[@]};do
65+
# 从服务器连接主互通
66+
docker exec $slave sh -c "$start_slave_cmd"
67+
# 查看从服务器得状态
68+
docker exec $slave sh -c "export MYSQL_PWD='$root_password'; mysql -u root -e 'SHOW SLAVE STATUS \G'"
69+
done
70+

docker-compose.yml

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
version: '3'
2+
services:
3+
mysql_master:
4+
image: mysql:5.7
5+
env_file:
6+
- ./master/mysql_master.env
7+
container_name: "mysql_master"
8+
restart: "no"
9+
ports:
10+
- 4406:3306
11+
volumes:
12+
- ./master/conf/mysql.conf.cnf:/etc/mysql/conf.d/mysql.conf.cnf
13+
- ./master/data:/var/lib/mysql
14+
networks:
15+
- overlay
16+
17+
mysql_slave:
18+
image: mysql:5.7
19+
env_file:
20+
- ./slave/mysql_slave.env
21+
name: kye1
22+
address: key2
23+
container_name: "mysql_slave"
24+
restart: "no"
25+
ports:
26+
- 5506:3306
27+
depends_on:
28+
- mysql_master
29+
volumes:
30+
- ./slave/conf/mysql.conf.cnf:/etc/mysql/conf.d/mysql.conf.cnf
31+
- ./slave/data:/var/lib/mysql
32+
networks:
33+
- overlay
34+
35+
mysql_slave2:
36+
image: mysql:5.7
37+
env_file:
38+
- ./slave2/mysql_slave.env
39+
container_name: "mysql_slave2"
40+
restart: "no"
41+
ports:
42+
- 5507:3306
43+
depends_on:
44+
- mysql_master
45+
volumes:
46+
- ./slave2/conf/mysql.conf.cnf:/etc/mysql/conf.d/mysql.conf.cnf
47+
- ./slave2/data:/var/lib/mysql
48+
networks:
49+
- overlay
50+
51+
networks:
52+
overlay:
53+

master/conf/mysql.conf.cnf

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[mysqld]
2+
3+
skip-host-cache
4+
skip-name-resolve
5+
6+
server-id = 11
7+
log_bin = /var/log/mysql/mysql-bin.log
8+
binlog_format = ROW
9+
binlog_do_db = mydb

master/mysql_master.env

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Note, by default mysql root does not have a password.
2+
# You need to restart a server to bring MYSQL_ROOT_PASSWORD working.
3+
# Use "docker-compose restart" command.
4+
MYSQL_ROOT_PASSWORD=111
5+
MYSQL_PORT=3306
6+
# 数据库配置
7+
MYSQL_USER=mydb_slave_user
8+
MYSQL_PASSWORD=mydb_slave_pwd
9+
MYSQL_DATABASE=mydb
10+
# 设置为大小写不敏感
11+
MYSQL_LOWER_CASE_TABLE_NAMES=0

slave/conf/mysql.conf.cnf

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[mysqld]
2+
3+
skip-host-cache
4+
skip-name-resolve
5+
6+
server-id=21
7+
relay-log = /var/log/mysql/mysql-relay-bin.log
8+
log_bin = /var/log/mysql/mysql-bin.log
9+
binlog_do_db = mydb

slave/mysql_slave.env

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Note, by default mysql root does not have a password.
2+
# You need to restart a server to bring MYSQL_ROOT_PASSWORD working.
3+
# Use "docker-compose restart" command.
4+
MYSQL_ROOT_PASSWORD=111
5+
MYSQL_PORT=3306
6+
# 数据库配置
7+
MYSQL_USER=mydb_slave_user
8+
MYSQL_PASSWORD=mydb_slave_pwd
9+
MYSQL_DATABASE=mydb
10+
# 设置为大小写不敏感
11+
MYSQL_LOWER_CASE_TABLE_NAMES=0

slave2/conf/mysql.conf.cnf

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[mysqld]
2+
3+
skip-host-cache
4+
skip-name-resolve
5+
6+
server-id=22
7+
relay-log = /var/log/mysql/mysql-relay-bin.log
8+
log_bin = /var/log/mysql/mysql-bin.log
9+
binlog_do_db = mydb

slave2/mysql_slave.env

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Note, by default mysql root does not have a password.
2+
# You need to restart a server to bring MYSQL_ROOT_PASSWORD working.
3+
# Use "docker-compose restart" command.
4+
MYSQL_ROOT_PASSWORD=111
5+
MYSQL_PORT=3306
6+
# 数据库配置
7+
MYSQL_USER=mydb_slave_user
8+
MYSQL_PASSWORD=mydb_slave_pwd
9+
MYSQL_DATABASE=mydb
10+
# 设置为大小写不敏感
11+
MYSQL_LOWER_CASE_TABLE_NAMES=0

test.sh

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#!/bin/bash
2+
3+
releases=('AAA' 'BBB' ccc)
4+
5+
for release in ${releases[@]};do
6+
7+
echo $release
8+
9+
done

0 commit comments

Comments
 (0)