本篇博客介紹的是經過 主從複製(Master-Slave)的方式來同步數據,再經過讀寫分離(MySQL-Proxy)來提高數據庫的併發負載能力實現mysql高可用性mysql
首先 , 咱們先了解AB主從複製 . AB複製即在A主機上作create , update, insert, delete 等數據庫 , 表 , 記錄的增刪該查操做 , B主機會自動作數據庫 , 表 , 記錄的同步跟新sql
AB主從複製數據庫
工做原理和過程
vim
(圖片源於網絡)後端
說明 : 1.在主庫上把數據更改記錄到二進制日誌中
2.備庫將主庫上的日誌複製到本身的中繼日誌中
3.備庫讀取中繼日誌中的事件 , 將其重放到備庫數據庫上
4.備庫根據其中的內容作出主庫相應的操做 , 對數據進行更新centos
過程 : 安全
A主機 : create database db ----- > 將此命令寫入本機的二進制日誌中
B主機: I/O線程 監測並讀取主機A主機上的二進制日誌文件新增的內容 , 而且將更新的內容寫入到B主機本身的中繼日誌文件中
SQL線程 : 讀取B主機上的中繼日誌文件中心的SQL語句 , 而且自動執行這些SQL語句 , 最終在B主機上建立db這個庫bash
讀寫分離服務器
原理和工做過程網絡
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 . 安裝好數據庫 , 並啓動數據庫服務
部署流程可參考(不作過多解釋):http://www.javashuo.com/article/p-hprxxnny-ht.html
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主從複製和讀寫分離部署到此完結 !!