amoeba mysql proxy_mysql-proxy和amoeba 分别实现Mariadb读写分离
內容概覽:
1、mysql-proxy實現Mariadb讀寫分離
1、1 拓撲圖和環境介紹
1、2 mysql-proxy安裝
1、3 設置mysql-proxy
1、4 主節點添加mysql-proxy可訪問用戶
1、5 讀寫分離驗證
2、amoeba
2、1 amoeba工作原理圖
2、2 環境拓撲
2、3 配置JAVA環境
2、4 安裝配置amoeba
2、5 抓包驗證讀寫分離
1、Mysql-proxy實現Mariadb讀寫分離
MySQL Proxy就是這么一個中間層代理,簡單的說,MySQL Proxy就是一個連接池,負責將前臺應用的連接請求轉發給后臺的數據庫,并且通過使用lua腳本,可以實現復雜的連接控制和過濾,從而實現讀寫分離和負載平衡。對于應用來說,MySQL Proxy是完全透明的,應用則只需要連接到MySQL Proxy的監聽端口即可。當然,這樣proxy機器可能成為單點失效,但完全可以使用多個proxy機器做為冗余,在應用服務器的連接池配置中配置到多個proxy的連接參數即可。
MySQL Proxy更強大的一項功能是實現“讀寫分離”,基本原理是讓主數據庫處理事務性查詢,讓從庫處理SELECT查詢。數據庫復制被用來把事務性查詢導致的變更同步到集群中的從庫。
-——百度百科
Mysql-proxy官方地址:dev.mysql.com/downloads/mysql-proxy/
1、1 拓撲圖和環境介紹
主機名IP地址系統環境功能說明
Mysql-proxy172.16.4.100Centos6.6 64位接收用戶對后端數據庫的讀寫操作,并且將讀寫操作分別發往后端不同主機
Master172.16.4.136Mysql主庫,可以接收讀請求或者寫請求
Slave172.16.4.10Mysql從庫,只能接收讀請求,如果想寫入數據,需要從主庫復制
說明:Master和Slave的主從復制環境已經在實驗前配置完成,這里不提供配置。
1、2? mysql-proxy安裝:
在epel的yum源中提供了mysql-proxy的rpm包,直接配置epel的yum源使用yum安裝即可。[root@mysql-proxy?~]#?yum?install?mysql-proxy
但是rpm包安裝的mysql-proxy不知道什么原因沒有讀寫分離腳本(rw-splitting.lua),所以需要解壓源碼包復制一個讀寫分離腳本到/usr/lib64/mysql-proxy目錄下。[root@mysql-proxy?~]#?tar?xfmysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@mysql-proxy?~]#?cdmysql-proxy-0.8.5-linux-el6-x86-64bit/share/doc/mysql-proxy/
[root@mysql-proxy?mysql-proxy]#?cp?rw-splitting.lua/usr/lib64/mysql-proxy/lua/
安裝后生成的文件[root@mysql-proxy?~]#?rpm?-ql?mysql-proxy
/etc/mysql-proxy.cnf?????????#mysql-proxy的配置文件
/etc/rc.d/init.d/mysql-proxy?#mysql-proxy啟動腳本
/usr/bin/mysql-proxy?????????#mysql-proxy的主程序
1、3 設置mysql-proxy
修改mysql-proxy配置文件,指明后端讀寫服務器,mysql-proxy的連接及管理相關配置即可[root@mysql-proxy?~]#?vim?/etc/mysql-proxy.cnf
[mysql-proxy]
daemon?=?true
pid-file?=?/var/run/mysql-proxy.pid
log-file?=?/var/log/mysql-proxy.log
log-level?=?debug
max-open-files?=?1024
plugins?=?admin,proxy
user?=?mysql-proxy
#
#Proxy?Configuration
proxy-address?=?0.0.0.0:3306??????????????????????????????#代理服務器監聽地址和端口
proxy-backend-addresses?=?172.16.4.136:3306???????????????#支持讀寫操作的后端
proxy-read-only-backend-addresses?=172.16.4.10:3306???????#只讀后端服務器,如果有多個節點使用逗號隔開
proxy-lua-script?=/usr/lib64/mysql-proxy/lua/rw-splitting.lua??#指定使用的讀寫分離腳本
#proxy-skip-profiling?=?true
#
#?Admin?Configuration
admin-address?=?0.0.0.0:4041??????#連接mysql-proxy的mysql界面端口
admin-lua-script?=/usr/lib64/mysql-proxy/lua/admin.lua??#指定使用的管理腳本
admin-username?=?admin?????????????#連接mysql-proxy的用戶名
admin-password?=?admin?????????????#連接mysql-proxy的密碼
設置完成啟動mysql-proxy[root@mysql-proxy?~]#?service?mysql-proxy?start
驗證3306端口是否啟動,如果啟動表示proxy工作正常[root@mysql-proxy?~]#?ss?-tnlp?|?grep?3306
LISTEN????0??????128???????????????????????*:3306?????????????????????*:*?????users:(("mysql-proxy",37922,11))
1、4 主節點添加mysql-proxy可訪問用戶
主節點設置允許root用戶遠程連接并設置密碼,否則mysql-proxy無法完成訪問。MariaDB?[(none)]>?GRANT?ALL?ON?*.*?TOroot@'172.16.%.%'?IDENTIFIED?BY?'proxy';
MariaDB?[(none)]>?FLUSH?PRIVILEGES;
說明:從節點不需要添加用戶,因為主節點創建完成從節點就自動復制過去了。
這時使用mysql命令,連接mysql-proxy節點就可以查看數據庫了[root@mysql-proxy?~]#?mysql?-uroot?-h172.16.4.100-p?-e?'SHOW?DATABASES;'
Enter?password:
+--------------------+
|?Database??????????|
+--------------------+
|?information_schema?|
|?hellodb???????????|
|?mysql?????????????|
|?performance_schema?|
|?test??????????????|
+--------------------+
1、5讀寫分離驗證
連接mysql-proxy驗證讀寫分離,帳號密碼端口等都在mysql-proxy.cnf中定義。[root@mysql-proxy?~]#?mysql?-uadmin?-padmin?-P4041?-h172.16.4.100
使用SELECT * FROM backends;命令查看后端節點,從類型判斷讀服務器(ro)和寫服務器(rw)mysql>?SELECT?*?FROM?backends;
+-------------+-------------------+---------+------+------+-------------------+
|?backend_ndx?|?address???????????|?state???|?type?|?uuid?|?connected_clients?|
+-------------+-------------------+---------+------+------+-------------------+
|???????????1|?172.16.4.136:3306?|?up??????|?rw???|?NULL?|?????????????????0?|
|???????????2|?172.16.4.10:3306??|?unknown?|?ro???|?NULL?|?????????????????0?|
+-------------+-------------------+---------+------+------+-------------------+
2?rows?in?set?(0.00?sec)
從節點status顯示unknown的原因是還沒有將請求發往到從節點,只要連接到proxy節點執行一個select操作就會顯示狀態為up;操作過程如下所示:[root@mysql-proxy?~]#?mysql?-uroot?-h172.16.4.100-p?-e?'SELECT?*?from?mysql.user;'
[root@mysql-proxy?~]#?mysql?-uadmin?-padmin?-P4041-h172.16.4.100
mysql>?SELECT?*?FROM?backends;
+-------------+-------------------+-------+------+------+-------------------+
|?backend_ndx?|?address???????????|?state?|?type?|?uuid?|connected_clients?|
+-------------+-------------------+-------+------+------+-------------------+
|???????????1|?172.16.4.136:3306?|?up????|?rw???|?NULL?|?????????????????0?|
|???????????2|?172.16.4.10:3306??|?up????|?ro??|?NULL?|?????????????????0?|
+-------------+-------------------+-------+------+------+-------------------+
2?rows?in?set?(0.00?sec)
設置完成關閉服務,以免影響后續amoeba實驗效果[root@mysql-proxy?~]#?service?mysql-proxy?stop
2、Amoeba
Amoeba(變形蟲)項目,該開源框架于2008年開始發布一款Amoeba forMysql軟件。這個軟件致力于MySQL的分布式數據庫前端代理層,它主要在應用層訪問MySQL的時候充當SQL路由功能,專注于分布式數據庫代理層(Database Proxy)開發。座落與Client、DB Server(s)之間,對客戶端透明。具有負載均衡、高可用性、SQL過濾、讀寫分離、可路由相關的到目標數據庫、可并發請求多臺數據庫合并結合。通過Amoeba你能夠完成多數據源的高可用、負載均衡、數據切片的功能,目前Amoeba已在很多企業的生產線上面使用。
2、1 Amoeba工作原理圖
Client通過連接JAVA、PHP開發的前端程序,由程序將數據庫請求發送到amoeba,amoeba將讀寫操作分發到不同的mysql數據庫。
2、2環境拓撲
環境還是使用mysql-proxy的環境,只不過mysql-proxy換成了amoeba,IP地址等配置均相同,
2、3 配置JAVA環境
Amoeba是根據JAVA語言研發的程序,如果想成功安裝amoeba就需要配置JAVA運行環境。[root@amoeba?~]#?rpm?-ivh?jdk-7u67-linux-x64.rpm
[root@amoeba?~]#?vim?/etc/profile.d/java.sh
export?JAVA_HOME=/usr/java/latest
export?PATH=$JAVA_HOME/bin:/$PATH
[root@amoeba?~]#?.?/etc/profile.d/java.sh
驗證,使用JAVA命令可以輸出版本,表示JAVA環境配置成功[root@amoeba?~]#?java?-version
java?version?"1.7.0_67"
Java(TM)?SE?Runtime?Environment?(build1.7.0_67-b01)
Java?HotSpot(TM)?64-Bit?Server?VM?(build?24.65-b04,mixed?mode)
2、4 安裝配置amoeba
解壓amoeba到安裝指定目錄,就完了[root@amoeba?~]#?mkdir?/usr/local/amoeba
[root@amoeba?~]#?tar?xf?amoeba-mysql-binary-2.2.0.tar.gz-C?/usr/local/amoeba/
Master節點添加用戶運行mysql-proxy遠程連接(mysql-proxy的時候已經添加過了,這里只是強調一下,如果沒有這個用戶amoeba是無法完成代理的)MariaDB?[(none)]>?GRANT?ALL?ON?*.*?TOroot@'172.16.%.%'?IDENTIFIED?BY?'proxy';
MariaDB?[(none)]>?FLUSH?PRIVILEGES;
Slave節點不需要添加用戶,因為主節點創建完成從節點就自動復制過去了。
修改amoeba的dbServers.xml文件,指定讀寫節點,設置client連接proxy的相關信息[root@amoeba?~]#?cat/usr/local/amoeba/conf/dbServers.xml
${defaultManager}
64
128
3306?????#指定后端服務器的端口
mydb???#指定默認連接的數據庫
root?????#指定數據庫用戶名
proxy??#指定數據庫密碼
500
500
10
600000
600000
true
true
true
??#定義寫數據庫,這里不是真正的定義,在后面的amoeba.xml中定義才生效
172.16.4.136???#定義寫服務器地址
?????#定義讀服務器
172.16.4.10???#定義讀服務器地址
1???#設置調度方式,1為負載,2為加權,3為高可用
master,slave??????#定義readPool池中的服務器,可以添加多個服務器,在后面的amoeba.xml統一調用
修改amoeba.xml設置讀寫分離相關配置[root@amoeba?~]#?cat/usr/local/amoeba/conf/amoeba.xml
3306?????#設置amoeba監聽的端口
0.0.0.0??#設置amoeba監聽的地址
${clientConnectioneManager}
128
64
root????????#設置連接后端服務器的帳號
proxy??#設置連接后端服務器的密碼
中間省略一大段內容……
${amoeba.home}/conf/functionMap.xml
1500
master???#設定默認數據庫
master????#設定寫數據庫
readPool???#設定讀數據庫
true
這個時候就可以使用/usr/local/amoeba/bin/amoeba這個腳本啟動amoeba了
但是啟動amoeba報錯,原因是棧太小了,最少228k[root@amoeba?~]#?/usr/local/amoeba/bin/amoeba?start
/usr/local/amoeba/bin/amoeba:?line?14:?uname:command?not?found
/usr/local/amoeba/bin/amoeba:?line?37:?dirname:command?not?found
The?stack?size?specified?is?too?small,?Specify?atleast?228k
Error:?Could?not?create?the?Java?Virtual?Machine.
Error:?A?fatal?exception?has?occurred.?Program?willexit.
解決方法:修改amoeba啟動文件的57行的-Xss的值為512k[root@amoeba?~]#?vim?/usr/local/amoeba/bin/amoeba
ULT_OPTS="-server?-Xms256m?-Xmx256m-Xss512k"
設置完成啟動amoeba[root@amoeba?~]#?/usr/local/amoeba/bin/amoeba?start
log4j:WARN?log4j?config?load?completed?fromfile:/usr/local/amoeba/conf/log4j.xml
2015-05-26?23:58:05,165?INFO??context.MysqlRuntimeContext?-?Amoeba?forMysql?current?versoin=5.1.45-mysql-amoeba-proxy-2.2.0
log4j:WARN?ip?access?config?load?completed?fromfile:/usr/local/amoeba/conf/access_list.conf
2015-05-26?23:58:05,558?INFO??net.ServerableConnectionManager?-?Amoeba?forMysql?listening?on?/0.0.0.0:3306.
2015-05-26?23:58:05,568?INFO??net.ServerableConnectionManager?-?AmoebaMonitor?Server?listening?on?/127.0.0.1:55854.
補充:啟動的時候可以加&表示在后臺運行,如下所示,這樣不會占用前臺
[root@amoeba?~]#?/usr/local/amoeba/bin/amoeba?start?&
這個時候amoeba就配置完成了
2、5 抓包驗證讀寫分離
連接amoeba寫入數據,驗證寫請求是否發往Master服務器[root@amoeba?~]#?mysql?-uroot?-pproxy?-h172.16.4.100
mysql>?create?database?test;
master抓包出現寫入的數據的sql語句[root@master?~]#?tcpdump?-i?eth0?-nn?-XX?tcp?port3306
03:33:16.418983?IP?172.16.4.100.39625?>172.16.4.136.3306:?Flags?[P.],?seq?25:52,?ack?59,?win?245,?options?[nop,nop,TSval?13988352?ecr?14759402],?length?27
0x0000:??000c?29ba?d792?000c?2922?c5c2?0800?4500??..).....)"....E.
0x0010:??004f?5103?4000?4006?8899?ac10?0464?ac10??.OQ.@.@......d..
0x0020:??0488?9ac9?0cea?98ee?7151?8c41?0a32?8018??........qQ.A.2..
0x0030:??00f5?c45d?0000?0101?080a?00d5?7200?00e1??...]........r...
0x0040:??35ea?1700?0000?0363?7265?6174?6520?6461??5......create.da
0x0050:??7461?6261?7365?2074?6573?7464?62?????????tabase.testdb
在amoeba查詢數據,驗證讀mysql>?SELECT?*?FROM?mysql.user;
Slave節點出現查詢請求,如果再次查詢可能在master節點出現,因為讀請求是負載均衡的[root@slave?~]#?tcpdump?-i?eth0?-nn?-XX?tcp?port3306
02:43:15.645879?IP?172.16.4.100.39625?>172.16.4.136.3306:?Flags?[P.],?seq?2565763465:2565763494,?ack?2353076083,?win336,?options?[nop,nop,TS?val?14201044?ecr?14967401],?length?29
0x0000:??000c?29ba?d792?000c?2922?c5c2?0800?4500??..).....)"....E.
0x0010:??0051?5108?4000?4006?8892?ac10?0464?ac10??.QQ.@.@......d..
0x0020:??0488?9ac9?0cea?98ee?7189?8c41?1773?8018??........q..A.s..
0x0030:??0150?cf76?0000?0101?080a?00d8?b0d4?00e4??.P.v............
0x0040:??6269?1900?0000?0353?454c?4543?5420?2a20??bi.....SELECT.*.
0x0050:??4652?4f4d?206d?7973?716c?2e75?7365?72????FROM.mysql.user
總結
以上是生活随笔為你收集整理的amoeba mysql proxy_mysql-proxy和amoeba 分别实现Mariadb读写分离的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Python报错集合篇7-KeyErro
- 下一篇: 实操教程:黑客如何瞄准和入侵网站的
