您好,登錄后才能下訂單哦!
? ? 本篇博客介紹的是通過 主從復制(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主從復制和讀寫分離部署到此完結 ?!!
? ? ? ? ? ? ? ??
? ? ? ? ? ??
?
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。