1. 程式人生 > >Mysql讀寫分離方案-MySQL Proxy環境部署記錄

Mysql讀寫分離方案-MySQL Proxy環境部署記錄

round back 通過 and http 意思 同時 主從 角色

Mysql的讀寫分離可以使用MySQL Proxy和Amoeba實現,其實也可以使用MySQL-MMM實現讀寫分離的自動切換。MySQL Proxy有一項強大功能是實現"讀寫分離",基本原理是讓主數據庫處理寫方面事務,讓從庫處理SELECT查詢;Amoeba for MySQL是一款優秀的中間件軟件,同樣可以實現讀寫分離,負載均衡等功能下面重點說下Mysql Proxy:

MySQL Proxy處於客戶端應用程序和MySQL服務器之間,通過截斷、改變並轉發客戶端和後端數據庫之間的通信來實現其功能。代理服務器是和TCP/IP協議打交道,
而要理解MySQL Proxy的工作機制,同樣要清楚MySQL客戶端和服務器之間的通信協議,MySQL Protocol 包括認證和查詢兩個基本過程:
.................................
認證過程包括:
1)客戶端向服務器發起連接請求
2)服務器向客戶端發送握手信息
3)客戶端向服務器發送認證請求
4)服務器向客戶端發送認證結果
................................
如果認證通過,則進入查詢過程:
1)客戶端向服務器發起查詢請求
2)服務器向客戶端返回查詢結果
當然,這只是一個粗略的描述,每個過程中發送的包都是有固定格式的。MySQL Proxy要做的,就是介入協議的各個過程。首先MySQL Proxy以服務器的身份接受客戶端請求,
根據配置對這些請求進行分析處理,然後以客戶端的身份轉發給相應的後端數據庫服務器,再接受服務器的信息,返回給客戶端。所以MySQL Proxy需要同時實現客戶端和服務
器的協議。由於要對客戶端發送過來的SQL語句進行分析,還需要包含一個SQL解析器。可以說MySQL Proxy相當於一個輕量級的MySQL了,實際上,MySQL Proxy的admin server
是可以接受SQL來查詢狀態信息的。

MySQL Proxy通過lua 腳本來控制連接轉發的機制。主要的函數都是配合MySQL Protocol各個過程的,這一點從函數名上就能看出來:
connect_server()
read_handshake()
read_auth()
read_auth_result()
read_query()
read_query_result()

至於為什麽采用lua 腳本語言,大概是因為MySQL Proxy中采用了wormhole 存儲引擎 的關系吧,這個蟲洞存儲引擎很有意思,數據的存儲格式就是一段lua腳本。

Mysql Proxy的原理圖

技術分享

順便貼下Mysql Proxy的工作拓撲圖

技術分享

部署MySQL Proxy實現讀寫分離並提高並發負載的操作記錄

0)機器環境

ip地址              角色         主機名
182.48.115.237     master      master-node
182.48.115.236     slave1      slave-node1
182.48.115.238     slave2      slave-node2
182.48.115.233     proxy       proxy-node

四臺機器都關閉防火墻和selinux

綁定hosts設置(四臺機器都要操作)
[[email protected]
/* */ ~]# vim /etc/hosts ...... 182.48.115.237 master-node 182.48.115.236 slave-node1 182.48.115.238 slave-node2 182.48.115.233 proxy-node

1)Mysql主從復制部署(本案例是一主兩從架構)

mysql安裝參考:http://www.cnblogs.com/kevingrace/p/6109679.html
mysql主從部署參考:http://www.cnblogs.com/kevingrace/p/6256603.html

2)在proxy機器上安裝mysql-proxy

Mysql讀寫分離方案-MySQL Proxy環境部署記錄