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_user master_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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章