本篇博客介紹的是通過 主從複製(Master-Slave)的方式來同步數據,再通過讀寫分離(MySQL-Proxy)來提升數據庫的併發負載能力實現mysql高可用性
首先 , 我們先了解AB主從複製 . AB複製即在A主機上做create , update, insert, delete 等數據庫 , 表 , 記錄的增刪該查操作 , B主機會自動做數據庫 , 表 , 記錄的同步跟新
AB主從複製
工作原理和過程
(圖片源於網絡)
說明 : 1.在主庫上把數據更改記錄到二進制日誌中
2.備庫將主庫上的日誌複製到自己的中繼日誌中
3.備庫讀取中繼日誌中的事件 , 將其重放到備庫數據庫上
4.備庫根據其中的內容做出主庫相應的操作 , 對數據進行更新
過程 :
A主機 : create database db ----- > 將此命令寫入本機的二進制日誌中
B主機: I/O線程 監測並讀取主機A主機上的二進制日誌文件新增的內容 , 並且將更新的內容寫入到B主機自己的中繼日誌文件中
SQL線程 : 讀取B主機上的中繼日誌文件中心的SQL語句 , 並且自動執行這些SQL語句 , 最終在B主機上創建db這個庫
讀寫分離
原理和工作過程
MySQL的主從複製和MySQL的讀寫分離兩者有着緊密的聯繫 , 首先部署主從複製 , 只有主從複製完了 , 才能在此基礎上進行數據的讀寫分離 .
簡單來說 , 讀寫分離就是在主服務器上寫 , 只在從服務器上讀 , 基本的原理是讓主數據庫處理事務性查詢 , 而從數據庫處理select查詢 , 數據庫複製被用來把事務性查詢導致的改變同步到集羣中的從數據庫
舉個例子來說 , 主數據庫就相當於銀行的存款取款一體機 , 從就相當於取款機 , 當用戶要存錢(寫入數據)就在存取款機上操作 , 當用戶要取款(讀)就在取款機上操作
讀寫分離可以基於程序代碼內部實現 , 也可以基於中間件(mysql-proxy , amoeba , Atlas)代理層實現
AB主從複製與讀寫分離實現數據庫高可用部署
實驗拓撲圖 :
環境 :centos7
主數據庫服務器(master) : 192.168.11.11
從數據庫服務器(slave) : 192.168.11.12
代理服務器 : 192.168.11.13
一 . AB主從複製部署
部署思路 :
1.在A主機上的/etc/my.cnf主配置文件中開啓binlog二進制日誌文件功能 , 並且給主機設置server-id唯一的標識編號 , 重啓Mariadb服務
2.在A主機上創建用於AB主從複製的用戶賬號 , 並查看master狀態中的binlog日誌文件的position位置數值
3.在B主機上的/etc/my.cnf主配置文件中設置server-id唯一標識編碼 , 重啓mariadb服務
4.在B主機上用help change master to 查命令幫助 , 並用change master 命令告訴B主機它的master主人的正確幸喜
5.在B主機上用start slave 啓動mariadb的隨從服務 , 並用show slave status 查看Ab主從複製的數據同步狀態 , 確定兩個線程的狀態爲yes
--------在A主機(192.168.11.11)的操作--------
1 . 安裝好數據庫 , 並啓動數據庫服務
部署流程可參考(不做過多解釋):https://blog.51cto.com/14181896/2361492
2 . 編輯主配置文件 /etc/my.cnf ,添加下圖234行內容
3 . 重啓服務 , 創建用於AB主從複製的用戶賬號 (賬號密碼均爲rep) , 如圖:
4 . 查看master狀態中的binlog日誌文件的position位置數值(position值會根據重啓次數改變)
--------在B主機(192.168.11.12)的操作--------
1 . 同A主機安裝部署好數據庫服務
2 . 修改主配置文件 /etc/my.cnf , 添加如下內容 :
3 . 重啓服務 , 測試賬號rep用戶是否能遠程訪問master主機的數據庫服務
4 . 在數據庫中 , 用change master命令告訴B主機他的主人master的正確信息
CHANGE MASTER TO
MASTER_HOST='192.168.11.11', #A主機IP
MASTER_USER='rep', #用於主從複製的用戶
MASTER_PASSWORD='rep', #用於主從複製的密碼
MASTER_PORT=3306, #端口號爲3306
MASTER_LOG_FILE='master-bin.000001', #對應A主機master狀態切記的值
MASTER_LOG_POS=403, #A主機position值
MASTER_CONNECT_RETRY=10; #值和主連不上重試時間爲10S
5 . 使用start slave啓動Mariadb的隨從服務 , 並用show slave status 查看AB主從複製的數據同步狀態 , 要確認IO和SQL兩個線程的狀態爲yes
6 . 測試一下AB主從複製是否配置成功 , 在A(192.168.11.11)上創建一個庫 , 看B主機(192.168.11.12)是否同步該數據庫
A主機 :
B主機 :
可以看到同步到了新創建的數據庫testrep , 到此主從複製配置結束 !!
二 . 採用中間件來實現讀寫分離操作
讀寫分離的中間件分爲很多種 ,在此實驗使用Atlas軟件來實現讀寫分離
注 :代理服務器(192.168.11.13)不需要安裝mysql服務
atlas介紹 :
由360開發 , 其優點有 :
(1)、基於mysql-proxy-0.8.2進行修改,代碼完全開源;
(2)、比較輕量級,部署配置也比較簡單;
(3)、支持DB讀寫分離;
(4)、支持從DB讀負載均衡,並自動剔除故障從DB;
(5)、支持平滑上下線DB;
(6)、具備較好的安全機制(IP過濾、賬號認證);
(7)、版本更新、問題跟進、交流圈子都比較活躍。
代理服務器部署流程 :
1 . 在192.168.11.13上安裝和配置atlas軟件
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm (該源碼包需在網上下載 , 百度搜索Atlas rpm源碼包)
echo "PATH=$PATH:/usr/local/mysql-proxy/bin/" >> /etc/profile
source /etc/profile
ll /usr/local/mysql-proxy/
說明 :
bin目錄下放的都是可執行文件
1. “encrypt”是用來生成MySQL密碼加密的,在配置的時候會用到
2. “mysql-proxy”是MySQL自己的讀寫分離代理
3. “mysql-proxyd”是360弄出來的,後面有個“d”,服務的啓動、重啓、停止。都是用他來執行的
conf目錄下放的是配置文件
1. “test.cnf”只有一個文件,用來配置代理的,可以使用vim來編輯
2. lib目錄下放的是一些包,以及Atlas的依賴
3 . log目錄下放的是日誌,如報錯等錯誤信息的記錄
進入bin目錄,使用encrypt來對數據庫的密碼進行加密,此處用戶和密碼爲rep
cd /usr/local/mysql-proxy/bin/
./encrypt 01 生成加密密碼,並複製此密碼(上圖)
cd /usr/local/mysql-proxy/conf/
cp -v test.cnf test.cnf.bak //備份test.cnf配置文件
vi test.conf 修改後的讀寫分享的完整配置文件內容
test.cnf讀寫分離配置文件功能說明:
1:[mysql-proxy] //讀寫分離代理配置
6:admin-username = user //管理接口的用戶名
9:admin-password = pwd //管理接口的密碼
12:proxy-backend-addresses = 192.168.100.25:3306 //主數據庫的IP地址和端口號(可讀可寫)
15:proxy-read-only-backend-addresses = 192.168.100.26:3306@1,192.168.100.27:3306@2 //讀服務器的ip、端口和權重
18:pwds = admin:VFnEp9P4Vu4=, rep:VFnEp9P4Vu4= //後端MYSQL的用戶名和encrypt命令生成的加密密碼
21:daemon = true //設置爲守護進程模式(後臺運行)
24:keepalive = true //允許keepalive
27:event-threads = 8 //工作線程數爲8
30:log-level = message //日誌等級爲message消息
33:log-path = /usr/local/mysql-proxy/log //日誌文件路徑
45:proxy-address = 0.0.0.0:3306 //Atlas監聽的管理接口IP和端口
48:admin-address = 0.0.0.0:2345 //Atlas監聽的管理接口IP和端口
2 . 配置好Atlas , 啓動atlas服務
/usr/local/mysql-proxy/bin/mysql-proxyd test start
(重啓atlas服務:/usr/local/mysql-proxy/bin/mysql-proxyd test restart)
設置mysql-proxyd開機啓動:
echo "/usr/local/mysql-proxy/bin/mysql-proxyd test start" >> /etc/profile
source /etc/profile
抓包驗證 :
tcpdump抓包:tcpdump -i ens33 -nn tcp port 3306
在A主機上創建表 , 並寫入數據:
B主機同步
抓包結果 :
到此 ,AB主從複製和讀寫分離部署到此完結 !!