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