1. 程式人生 > 其它 >Docker構建mysql主從

Docker構建mysql主從

一、為什麼要搭建主從架構呢

1.資料安全,可以進行資料的備份。

2.讀寫分離,大部分的業務系統來說都是讀資料多,寫資料少,當訪問壓力過大時,可以把讀請求給到從伺服器。從而緩解資料庫訪問的壓力

3.故障轉移(高可用),當主節點宕機之後,將從服務切換為主節點繼續提供服務。當然要實現主從切換還需要其他中介軟體來實現。

二、主從資料同步原理

mysql的主從架構一般都是通過binlog日誌實現,binlog日誌會記錄主庫的每一次操作。從庫和主庫建立連線TCP後,請求主庫將binlog傳輸過來,這是主庫有一個dump執行緒把binlog傳輸給從庫。

從庫將讀取到的binlog日誌寫入自己的relaylog,另外一個執行緒讀取relaylog裡面的內容進行重放。有那麼一點點像redis的AOF持久方式,也是重放操作記錄。

三、docker搭建mysql主從

感覺用docker會方便很多,自己寫點demo之類需要構建叢集的時候確實方便很多。

1.拉映象,再啟動兩個mysql容器

我的docker是裝的windows版本的。

-d 後臺啟動 最後的mysql:5.7 是我自己的映象版本,分別對映到宿主機的3306和3307埠 方便等下使用工具連線

docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

docker run -p 3307:3306 --name mysqlslave -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

確保兩個mysql容器都正常啟動了,可以使用工具連線3306和3307埠看看是否能夠連線上mysql。

2.修改配置,這個時候我們需要進入到docker容器內部去修改/etc/mysql目錄下的mysql的my.cnf檔案

docker exec -it 容器ID/容器名字 /bin/bash

docker容器是輕量級的嘛,所以有些操作是不支援的,我們想要修改檔案一般都會使用vim命令嘛,所以我們還需要安裝一下:

先執行

apt-get update

在執行

apt-get install vim

master的my.cnf檔案:

[mysqld]
#保證唯一性
server-id=1
#開啟binlog日誌並設定檔名字 log_bin=master-bin

slave的my.cnf檔案:

[mysqld]
#保證唯一性
server-id=2 
#開啟relay日誌並設定檔名字
relay_log=slave-relay

  

配置完之後重啟兩個容器的mysql服務 service mysql restart 或者重啟容器,因為重啟mysql服務容器也會停止。

windows桌面版的docker可以直接在這兒重啟容器

3.檢視master狀態配置並進行連線

show master status;

可以看到binlog檔案,還有檔案中的索引位置。Binlog_Do_DB和Binlog_Ignore_DB這兩個欄位是表示需要記錄binlog檔案的庫或者不需要記錄binlog檔案的庫。暫時沒有配置,就表示是針對全庫記錄日誌。

在從節點上面執行sql語句:

change master to master_host='172.17.0.3', 
master_user='root',
master_password='root',
master_port=3306, 
master_log_file='master-bin.000001',
master_log_pos= 154;

  

master_host:Master的地址,這兒需要的是容器在的獨立IP 可以進入容器檢視,也可執行docker指令檢視:

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱/容器id

master_usermaster_password:用於同步的使用者的密碼,實際中肯定不能使用root使用者

master_log_file:指定 Slave 從哪個日誌檔案開始複製資料

master_log_pos:從哪個 Position 開始讀,都是對應master中的值

執行成功之後在啟動slave就可以了

start slave;
show slave status

檢視從節點資訊了:

現在去主庫建庫表,寫資料,從庫都會吧資料同步過去了

四、其他

這個主從架構師可能失敗的,如果檢視slave狀態發現Slave_SQL_Running=no 就表示主從同步失敗了,可能是在從庫進行了些,導致從主庫同步過來主鍵衝突。也可能是從庫服務重啟之後有事務回滾了。如果是從庫事務回滾可以:

stop slave ;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 
start slave ;

還可以重新設定主節點的binlog資訊 重新指定position,可能需要處理一下從節點上面的資料

其他引數:

#master:
#需要同步的二進位制資料庫名 
binlog-do-db=masterdemo 
#只保留7天的二進位制日誌,以防磁碟被日誌佔滿(可選) 
expire-logs-days = 7 
#不備份的資料庫 
binlog-ignore-db=xxx1
binlog-ignore-db=xxx2

#從庫:
#如果master庫名[mastdemo]與salve庫名[mastdemo01]不同,使用以下配置[需要做對映] 
replicate-rewrite-db = xxx -> aaa
#如果不是要全部同步[預設全部同步],則指定需要同步的表 
replicate-wild-do-table=xxx1
replicate-wild-do-table=xxx2