標籤:Proxy 伺服器 amoeba
MySQL讀寫分離--mysql-proxy和amoeba
靜態分離:直接將伺服器位址寫入程式
動態分離:通過Proxy 伺服器對資料進行讀寫操作,由Proxy 伺服器判定讀寫操作,在主伺服器上寫資料,在
從伺服器上讀資料。
好處:只在一台伺服器上進行讀或寫操作,可以減少伺服器的工作量,提高效率和伺服器效能
進行寫操作時(在Proxy 伺服器上動作陳述式,寫入master),slave利用主從複製同步資料
三台伺服器:主伺服器10.0.10.1、從伺服器10.0.10.2、Proxy 伺服器10.0.10.3
兩種方法實現:使用MySQL-proxy實現、使用amoeba實現
1、使用mysql-proxy實現讀寫分離
# ./mysql-proxy --proxy-backend-addresses=10.0.10.1:3306 --proxy-read-only-backend-addresses=10.0.10.2:3306 --proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua --daemon --user=mysql --log-level=warning --log-file=/var/log/mysql-proxy.log --max-open-files=2048 --event-threads=4 --proxy-address=10.0.10.3:3306
--proxy-backend-addresses 指定主伺服器地址(寫資料)
--proxy-read-only-backend-addresses 指定從伺服器位址(讀資料)
--proxy-lua-script 指定用於讀寫分離的指令碼程式
--daemon 指定以守護進程的方式運行
--user=mysql 指定啟動並執行使用者
--log-level 指定日誌記錄層級
--log-file 指定記錄檔位置
--max-open-files 指定最大可開啟的檔案數,受作業系統限制
--event-threads 設定背景工作執行緒數
--proxy-address 設定監聽的本機地址和連接埠
擷取mysql-proxy協助
# ./mysql-proxy --help \\基本選項協助
# ./mysql-proxy --help-proxy \\代理選項協助
在主從伺服器上分別對Proxy 伺服器進行授權,使Proxy 伺服器能夠使用主從伺服器上的此使用者進行串連主從。
mysql> grant all on *.* to ‘repuser‘@‘10.0.10.3‘ identified by ‘123123‘;
mysql> flush privileges;
2、使用amoeba實現讀寫分離
(1)安裝jdk
# tar xf jdk-7u51-linux-x64.tar.gz -C /usr/local/
# mv jdk1.7.0_51 java
(2)編輯/etc/profile檔案,設定java環境變數
# vim /etc/profile
放在export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL之前
JAVA_HOME="/usr/local/java"
CLASS_PATH="/usr/local/java/jre:/usr/local/java/lib"
export JAVA_HOME CLASS_PATH
PATH="$PATH:/usr/local/amoeba/bin:/usr/local/java/bin"
# source /etc/profile
(3)查看和調整java的預設版本
# java -version
[[email protected] local]# which java
/usr/bin/java \\本身有java 的路徑填/usr/bin/java
# alternatives --install /usr/local/java/bin/java java /usr/local/java/bin/java 100 \\在系統中登記java版本和設定優先權
# alternatives --display java \\顯示java資訊
# alternatives --config java \\設定java的預設版本
(4)安裝和配置amoeba實現讀寫分離
# unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/
# mv amoeba-mysql-3.0.5-RC amoeba
# vim dbServers.xml \\定義後端伺服器資訊 與主從伺服器相連
<property name="sendBufferSize">256</property> \\設定發送緩衝區大小
<property name="receiveBufferSize">256</property> \\設定接收緩衝區大小
<property name="port">3306</property> \\設定後端伺服器連接埠
<property name="schema">zz</property> \\設定代理預設串連的資料庫
<property name="user">root</property>
<property name="password">123123</property> \\設定串連後端伺服器的密碼
===
<dbServer name="master1" parent="abstractServer"> \\定義後端伺服器(主伺服器)
<factoryConfig>
<property name="ipAddress">10.0.10.1</property>
</factoryConfig>
</dbServer>
<dbServer name="slave1" parent="abstractServer"> \\定義後端伺服器 (從伺服器)
<factoryConfig>
<property name="ipAddress">10.0.10.2</property>
</factoryConfig>
</dbServer>
===
<dbServer name="master" virtual="true"> \\定義伺服器集區
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<property name="loadbalance">1</property> \\定義負載平衡演算法
<property name="poolNames">master1</property> \\添加伺服器,多個用逗號隔開
</poolConfig>
</dbServer>
<dbServer name="slave" virtual="true"> \\定義伺服器集區
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<property name="loadbalance">1</property>
<property name="poolNames">slave1</property>
</poolConfig>
</dbServer>
======
# vim amoeba.xml \\定義代理資訊
<property name="port">3306</property> \\設定Proxy 伺服器監聽的連接埠
<property name="ipAddress">10.0.10.3</property> \\設定代理監聽的地址
<property name="user">root</property> \\設定Proxy 伺服器使用的使用者名稱
<property name="password">123123</property> \\設定Proxy 伺服器使用的密碼
<property name="defaultPool">master</property> \\設定預設的伺服器集區,一般除
select,insert,update,delete等的其它操作都在預設的伺服器進行
<property name="writePool">master</property> \\執行寫操作的伺服器集區
<property name="readPool">slave</property> \\執行讀操作的伺服器集區
<property name="needParse">true</property>
# vim jvm.properties \\設定java記憶體配置資訊
JVM_OPTIONS="-server -Xms256m -Xmx1024m -Xss512k -XX:PermSize=32m -XX:MaxPermSize=128m"
# vim access_list.conf \\定義存取控制清單
10.0.10.100:no
10.0.*.*:yes
(5)啟動amoeba
#cd /usr/local/amoeba/bin
#./launcher &
關閉amoeba
#./shutdowm
(6)實現資料分割
水平分割:將關鍵字段按特定的演算法存放到不同的伺服器
垂直分割:將資料按業務的不同分別儲存到不同的伺服器
水平分割
# vim rule.xml
<tableRule name="stu" schema="zz" defaultPools="master1,master2">
<rule name="rule1">
<parameters>id</parameters>
<expression><![CDATA[ id % 2 == 0 ]]></expression>
<defaultPools>master1</defaultPools>
<readPools>master1</readPools>
<writePools>master1</writePools>
</rule>
<rule name="rule2">
<parameters>id</parameters>
<expression><![CDATA[ id % 2 == 1 ]]></expression>
<defaultPools>master2</defaultPools>
<writePools>master2</writePools>
<readPools>master2</readPools>
</rule>
</tableRule>
====
在Proxy 伺服器上操作
[[email protected] ~]# mysql -u root -h 10.0.10.3 -paixocm -e "insert into zz.stu(id,name) values(1,‘張三‘)"
[[email protected] ~]# mysql -u root -h 10.0.10.3 -paixocm -e "insert into zz.stu(id,name) values(2,‘李四‘)"
[[email protected] ~]# mysql -u root -h 10.0.10.3 -paixocm -e "insert into zz.stu(id,name) values(3,‘王五‘)"
[[email protected] ~]# mysql -u root -h 10.0.10.3 -paixocm -e "insert into zz.stu(id,name) values(4,‘趙六‘)"
mysql> select * from stu;
+----+--------+
| id | name |
+----+--------+
| 2 | 李四 |
| 4 | 趙六 |
+----+--------+
mysql> select * from stu;
+----+--------+
| id | name |
+----+--------+
| 1 | 張三 |
| 3 | 王五 |
+----+--------+
=======
垂直分割
<tableRule name="user_info" schema="weblog" readPools="slave1" writePools="master1" />
<tableRule name="user_info" schema="webchat" readPools="slave2" writePools="master2"/>
本文出自 “菜鳥在成長” 部落格,請務必保留此出處http://shuaiz.blog.51cto.com/10626377/1697535
MySQL讀寫分離--mysql-proxy和amoeba