使用 Docker 完成 MySQL 數據庫主從配置

使用 docker 進行數據庫主從配置,由於我有這個需求,而在網上搜索後發現沒有知足我需求的相關實踐文檔,有的是一些
零零碎碎的文檔,並且在參照這些文檔進行部署的時候我還踩了許多坑。
mysql

所以根據我本身部署成功的經驗,我寫了這個文檔。
sql

使用 docker 天然就須要有 docker 環境,固然 docker 的鏡像在國內訪問比較慢,建議使用國內的源
docker

構建 DockerFile

咱們的工做是在 Mysql 鏡像基礎上進行的。數據庫

docker pull mysql:5.7.20 這條命令會下載最新的 mysql 鏡像,固然也能夠指定版本。bash

新建一個 DockerFile 文件:服務器

FROM mysql:5.7.20
EXPOSE 3306
COPY my.cnf /etc/mysql/
CMD ["mysqld"]socket

在構建鏡像前,咱們須要 mysql 的配置文件 my.cnf ,能夠先啓動一個 mysql 的容器,而後進入容器複製它下來,並對其進行修改:tcp

master 的my.cnf 以下:
ide

!includedir /etc/mysql/conf.d/
[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
#log-error=/var/log/mysql/error.log
#By default we only accept connections from localhost
#bind-address = 127.0.0.1
log-bin=/var/log/mysql/mysql-bin.index
server-id=1
#Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
ui

slave 的my.conf 以下;

!includedir /etc/mysql/conf.d/
[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
#log-error=/var/log/mysql/error.log
#By default we only accept connections from localhost
#bind-address = 127.0.0.1
log-bin=/var/log/mysql/mysql-bin.index
server-id=2
#Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

以上是我修改好的一個 my.conf 文件,咱們主要修改的是如下這些選項:

#bind-address= 127.0.0.1 # 註釋這個選項可讓遠程機器訪問,或者能夠修改成 0.0.0.0
log-bin=/var/log/mysql/mysql-bin.index # 開啓 log-bin 日誌,日誌路徑
server-id=1 # 服務器惟一ID,默認是1,通常取IP最後一段,這裏看狀況分配

構建須要的文件結構就是如下這樣:

master
├── Dockerfile
└── my.cnf
slave
├── Dockerfile
└── my.cnf

而後在master目錄中使用 docker build -t master/mysql:5.7.20 . 命令構建鏡像主庫,從庫構建命令 docker build -t
slave/mysql:5.7.20 .。命令最後有個.,不要忘記,表明當前目錄。-t 的意思是tag,是 --tag
的縮寫,也就是命名這個鏡像,若是不加docker會隨機給這個鏡像一個名字,建議格式爲name:tag

配置docker容器

構建完成後咱們使用如下命令啓動主庫和從庫

docker run -p 3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=root -d master/mysql:5.7.20

docker run -p 3306 --name mysql-slave --link mysql-master:master -e MYSQL_ROOT_PASSWORD=root -d
slave/mysql:5.7.20

進入docker容器進行操做:

1.而後分別執行 docker exec -it mysql-master bash 和 docker exec -it slave-master bash 命令進入到容器內部。
2.執行 mysql -uroot -proot 進入mysql環境,這時咱們的環境搭建就已經完成了,下面正式配置主從鏈接。

固然此時docker會分配一個惟一的端口給容器,咱們也能夠用mysql客戶端鏈接進行配置。使用docker ps查看端口號,就能夠用客戶端鏈接進行管理。

檢查容器是否啓動狀態:
☁ mysql-master-slave docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
6c7648e829e0 slave/mysql:5.7.20 "docker-entrypoint..." 4 minutes ago Up 4 minutes
0.0.0.0:32769->3306/tcp mysql-slave
483842c63235 master/mysql:5.7.20 "docker-entrypoint..." 5 minutes ago Up 5 minutes
0.0.0.0:32768->3306/tcp mysql-master

建立用戶並指定ip能夠訪問:

1.全部ip能夠訪問:

GRANT REPLICATION SLAVE ON . to 'user'@'%' identified by 'mysql';

2.指定的ip能夠訪問:

GRANT REPLICATION SLAVE ON . TO 'user'@'192.168.1.200' IDENTIFIED BY 'mysql';

3.指定網段能夠訪問:

GRANT REPLICATION SLAVE ON . TO 'user'@'192.168.1.%' IDENTIFIED BY 'mysql';

使用show master status查看mysql主容器的狀態,打印以下信息:

+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
使用hostname查看主容器的hostname,如個人主容器是483842c63235。

從數據庫最重要的配置:

change master to
master_host='master',#要鏈接的主服務器的ip
master_user='user',#指定的用戶名,最好不要用root
master_log_file='mysql-bin.000003',#主庫記錄的值
master_log_pos=154,#主庫的pos值
master_port=3306,#主庫3306映射的端口
master_password='mysql';#主庫要鏈接的用戶的密碼了
使用start slave啓動主從同步

使用命令查看:show slave status\G

打印以下信息:

*************************** 1. row ***************************
Slave_IO_State: Connecting to master
Master_Host: master //主服務器地址
Master_User: user //受權賬戶名,儘可能避免使用root
Master_Port: 3306 //數據庫端口,部分版本沒有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000003 //同步主庫的日誌文件名
Read_Master_Log_Pos: 154 //同步讀取二進制日誌的位置,大於等於
Relay_Log_File: 6c7648e829e0-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes //此狀態必須YES
Slave_SQL_Running: Yes //此狀態必須YES
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 154
Relay_Log_Space: 154
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:

Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
這樣就是完成了一組主從mysql的配置。

登錄master終端

mysql> create database sunhao;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sunhao |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use sunhao
Database changed
mysql> create table sunhao(id int(3),name char(10));
Query OK, 0 rows affected (0.04 sec)
mysql> insert into sunhao values(1,'xiaoshuai');
Query OK, 1 row affected (0.01 sec)
mysql> select * from sunhao;
+------+-----------+
| id | name |
+------+-----------+
| 1 | xiaoshuai |
+------+-----------+
1 row in set (0.00 sec)

登錄slave終端

mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sunhao | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> use sunhao Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from sunhao; +------+-----------+ | id | name | +------+-----------+ | 1 | xiaoshuai | +------+-----------+

相關文章
相關標籤/搜索