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