名稱 | 版本 |
---|---|
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主從集羣已經搭建成功!