爲什麼基於Docker搭建?
- 資源有限
- 虛擬機搭建對機器配置有要求,並且安裝mysql步驟繁瑣
- 一臺機器上可以運行多個Docker容器
- Docker容器之間相互獨立,有獨立ip,互不衝突
- Docker使用步驟簡便,啓動容器在秒級別
利用Docker搭建主從服務器
拉取鏡像
首先拉取docker鏡像,我們這裏使用8.0.19
版本的mysql(其它版本同理):
docker pull mysql:8.0.19
Dockfile自定義構建Mysql
構建Master鏡像
- 新增文件
my.cnf
[mysqld] ## 保證這個ID唯一 server-id=1 ## 開啓二進制日誌功 log-bin=myslq-bin ## 基礎配置 secure-file-priv= NULL pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql symbolic-links=0 !includedir /etc/mysql/conf.d/
- 新建文件
Dockfile
FROM mysql:8.0.19 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV LANG=C.UTF-8 ENV MYSQL_ROOT_PASSWORD 123456 COPY my.cnf /etc/mysql/my.cnf EXPOSE 3306
- 將兩個文件放在一個目錄,然後進入該目錄
- 構建Master鏡像
docker build -t mysql/master:v1 .
構建Slave鏡像
- 新增文件
my.cnf
[mysqld] ## 保證這個ID唯一 server-id=2 ## 開啓二進制日誌功能 log-bin=myslq-slave-bin ## relay_log配置中繼日誌 relay_log=edu-mysql-relay-bin ## 基礎配置 secure-file-priv= NULL pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql symbolic-links=0 !includedir /etc/mysql/conf.d/
- 新建文件
Dockfile
FROM mysql:8.0.19 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime ENV LANG=C.UTF-8 ENV MYSQL_ROOT_PASSWORD 123456 COPY my.cnf /etc/mysql/my.cnf EXPOSE 3306
- 將兩個文件放在一個目錄,然後進入該目錄
- 構建Slave鏡像
docker build -t mysql/slave:v1 .
啓動鏡像
- 查看鏡像信息
docker images | grep mysql
- 分別啓動
master、slave
主從節點- Master節點
docker run -p 3306:3306 -d mysql/master:v1
- Slave節點
docker run -p 3306:3306 -d mysql/slave:v1
- Master節點
創建用戶並啓用主從同步
-
創建用戶進行主從同步的用戶
- 進如啓動的 master 數據庫
docker exec -it ContainerID bash
- 登錄mysql,密碼在Dockerfile配置文件的字段(ENV MYSQL_ROOT_PASSWORD 123456)
mysql -uroot -p123456
- 授予用戶 slave REPLICATION SLAVE權限和REPLICATION CLIENT權限,用於在主從庫之間同步數據
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
- 在Master數據庫創建數據同步用戶
CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; #
- 進如啓動的 master 數據庫
-
配置主從同步
- 查看
Master
節點的狀態信息
show master status;
- 進入
Slave
節點並登錄Mysql
之後執行
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;
- 查看
-
命令說明:
命令 說明 master_port Master的端口號,指的是容器的端口號 master_user 用於數據同步的用戶 master_password 用於同步的用戶的密碼 master_log_file 指定 Slave 從哪個日誌文件開始複製數據,即上文中提到的 File 字段的值 master_log_pos 從哪個 Position 開始讀,即上文中提到的 Position 字段的值 master_connect_retry 如果連接失敗,重試的時間間隔,單位是秒,默認是60秒 -
在Slave 中的mysql終端執行
start slave;
啓動主從同步。 -
在Slave 中的mysql終端執行
show slave status \G;
啓動主從同步。
SlaveIORunning 和 SlaveSQLRunning 都是Yes,說明主從複製已經開啓。此時可以測試數據同步是否成功。
使用數據庫工具測試
Master
Slave
之後再Master
節點創建數據庫或者添加數據,可以看到從數據進行同步