為什么基于Docker搭建碳抄?
- 服務器資源有限
- 虛擬機搭建對機器配置有要求敞嗡,并且安裝mysql步驟繁瑣
- 一臺機器上可以運行多個Docker容器
- Docker容器之間相互獨立荷鼠,有獨立ip俄删,互不沖突
- Docker使用步驟簡便溉委,啟動容器在秒級別
前提準備
- LInux服務器上具備docker環(huán)境(熟悉docker操作命令继谚,本文不做docker命令講解)
- 拉取Mysql鏡像
docker pull mysql:latest
- 使用鏡像啟動兩個主送容器
- Master(主)
docker run -p 3307:3306 --name mysql-second -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
- Slave(從)
docker run -p 3306:3306 --name mysql-test -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
使用docker ps命令查看正在運行的容器:
配置Master(主)
- 通過命令進入到Master容器內部
docker exec -it cf6ad8c368fa /bin/bash
cd /etc/mysql切換到/etc/mysql目錄下烈菌,然后vi my.cnf對my.cnf進行編輯。此時會報出bash: vi: command not found花履,需要在docker容器內部自行安裝vim芽世。使用apt-get install vim命令安裝vim
如會出現如下問題:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vim
先執(zhí)行apt-get update,然后再次執(zhí)行apt-get install vim即可成功安裝vim诡壁。
在my.cnf中添加如下配置:
[mysqld]
## 同一局域網內注意要唯一
server-id=1
## 開啟二進制日志功能济瓢,可以隨便取(關鍵)
log-bin=mysql-bin
## 設置不需要服裝店數據庫(可設置多個)
binlog-ignore-db=mysql
##設置需要復制的數據庫
binlog-do-db=testdb
#設置logbin格式
binlog_format=STATEMENT
配置完成之后妹卿,需要重啟docker容器
docker restart cf6ad8c368fa
在Master數據庫創(chuàng)建數據同步用戶旺矾,授予用戶 slave REPLICATION SLAVE權限和REPLICATION CLIENT權限,用于在主從庫之間同步數據夺克。
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
配置Slave(從)
和配置Master(主)一樣箕宙,在Slave配置文件my.cnf中添加如下配置:
[mysqld]
## 設置server_id,注意要唯一
server-id=12
## 開啟二進制日志功能,以備Slave作為其它Slave的Master時使用
log-bin=mysql-slave-bin
## relay_log配置中繼日志
relay_log=edu-mysql-relay-bin
配置完成后也需要重啟docker容器懊直,操作和配置Master(主)一致扒吁。
鏈接Master(主)和Slave(從)
- 在Master進入mysql,執(zhí)行
show master status;
2.png
File和Position字段的值后面將會用到室囊,在后面的操作完成之前雕崩,需要保證Master庫不能做任何操作,否則將會引起狀態(tài)變化融撞,File和Position字段的值變化盼铁。
在Slave 中進入 mysql,執(zhí)行一下命令
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=1280, master_connect_retry=30;
命令說明:
master_host :Master的地址尝偎,指的是容器的獨立ip,可以通過docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱|容器id
查詢容器的ip
master_port:Master的端口號饶火,指的是容器的端口號
master_user:用于數據同步的用戶
master_password:用于同步的用戶的密碼
master_log_file:指定 Slave 從哪個日志文件開始復制數據鹏控,即上文中提到的 File 字段的值
master_log_pos:從哪個 Position 開始讀,即上文中提到的 Position 字段的值
master_connect_retry:如果連接失敗肤寝,重試的時間間隔当辐,單位是秒,默認是60秒
- 在Slave 中的mysql終端執(zhí)行
show slave status \G;
用于查看主從同步狀態(tài)鲤看。
正常情況下缘揪,SlaveIORunning 和 SlaveSQLRunning 都是No,因為我們還沒有開啟主從復制過程义桂。使用start slave開啟主從復制過程找筝,然后再次查詢主從同步狀態(tài)show slave status \G;。
SlaveIORunning 和 SlaveSQLRunning 都是Yes慷吊,說明主從復制已經開啟袖裕。此時可以測試數據同步是否成功。
主從復制排錯:
使用start slave開啟主從復制過程后溉瓶,如果SlaveIORunning一直是Connecting急鳄,則說明主從復制一直處于連接狀態(tài),這種情況一般是下面幾種原因造成的堰酿,我們可以根據 Last_IO_Error提示予以排除攒岛。
造成的原因如下:
- 網絡不通 -- 檢查ip,端口
- 密碼不對 -- 檢查是否創(chuàng)建用于同步的用戶和用戶密碼是否正確
- pos不對 -- 檢查Master的 Position
測試主從復制
測試主從復制方式就十分多了,最簡單的是在Master創(chuàng)建一個數據庫胞锰,然后檢查Slave是否存在此數據庫。
Master:
Slave: