一、為什麼要搭建主從架構呢
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