一、背景知識
Amoeba(變形蟲)項目,專注 分布式數據庫 proxy 開發。座落與Client、DB Server(s)之間。對客戶端透明。具有負載均衡、高可用性、sql過濾、讀寫分離、可路由相關的query到目標數據庫、可並發請求多台數據庫合並結果。
要想搭建Amoeba讀寫分離,首先需要知道MySQL的主從配置,可參考:Ubuntu10下MySQL搭建Master/Slave,更好的情況下是你還需要了解MySQL-Proxy,可參考:Ubuntu10下搭建MySQL Proxy讀寫分離
二、搭建過程
(一) 測試環境
Amoeba for MySQL:192.168.1.147
Master:192.168.1.25
Slave1:192.168.1.30
Slave2:192.168.1.35
數據庫為:dba_db,帳號密碼統一為:test/123456
(二) 前期准備
1. 驗證Amoeba是否安裝成功的命令(如下圖):/usr/local/amoeba/bin/amoeba
(圖1:安裝成功)
2. 啟動amoeba:/usr/local/amoeba/bin/amoeba start
(圖2:啟動成功)
(三) Amoeba讀寫分離配置
1. 修改amoeba.xml,設置登陸amoeba的帳號密碼。
<property name="user">testuser</property>
<property name="password">password</property>
2. 測試使用上面帳號是否正常登陸,如果出現上面的圖2界面說明設置的帳號密碼成功。
#mysql -u testuser -p -h 192.168.1.147 -P 8066
3. 修改dbServers.xml,設置數據庫、登陸MySQL的帳號和密碼。
<property name="schema">dba_db</property>
<property name="user">test</property>
<property name="password">123456</property>
4. 修改dbServers.xml,設置數據庫服務器的IP地址和服務器別名。
<dbServer name="Master" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.1.25</property>
</factoryConfig>
</dbServer>
<dbServer name="Slave1" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.1.30</property>
</factoryConfig>
</dbServer>
<dbServer name="Slave2" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.1.35</property>
</factoryConfig>
</dbServer>
5. 修改dbServers.xml,設置ROUNDROBIN(輪詢策略);
<dbServer name="virtualSlave" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<property name="poolNames">Slave1,Slave2,Slave2</property>
</poolConfig>
</dbServer>
6. 修改amoeba.xml,設置讀寫分離,修改queryRouter標簽下的;
<property name="LRUMapSize">1500</property>
<property name="defaultPool">Master</property>
<property name="writePool">Master</property>
<property name="readPool">virtualSlave</property>
<property name="needParse">true</property>
7. 重新啟動amoeba,如果出現上面的圖2界面說明設置成功;
8. 如果你已經使用終端登陸了amoeba(#mysql -u testuser -p -h 192.168.1.147 -P 8066),那么你需要重啟打開終端;如果你使用SQLyog的工具登陸了amoeba,那么你需要關閉鏈接,再重新鏈接amoeba。
(四) MySQL的Master/Slave配置
1. Master服務器/etc/mysql/my.cnf目錄 [mysqld] 區塊中加上:
log-bin=mysql-bin
server-id=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1
binlog_do_db=dba_db
binlog_ignore_db=mysql
2. 登陸Master的MySQL,新建一個用戶賦予“REPLICATION SLAVE”的權限。你不需要再賦予其它的權限:(因為是有兩個Salve,所以使用了%)
mysql>use mysql;
mysql>create user viajar@'192.168.1.%' identified by '123456';
mysql>grant replication slave on *.* to viajar@'192.168.1.%' identified by '123456';
3. 重啟Master的MySQL:
#service mysql restart
4. 獲取Master的binlog信息:(mysql-bin.000136,106)
mysql>SHOW MASTER logs;
(圖3)
5. Slave1服務器/etc/mysql/my.cnf目錄 [mysqld] 區塊中加上:
server-id=2
6. 重啟Slave1的MySQL:
#service mysql restart
7. 登陸Slave1的MySQL,執行命令:
mysql> change master to master_host='192.168.1.25', master_user='viajar', master_password='123456', master_log_file='mysql-bin.000136', master_log_pos=106;
8. 啟動Slave1的Slave:
mysql>START SLAVE;
9. 檢查Slave1的Slave是否正常:
mysql>show slave status\G;
10. 以同樣的方式配置Slave2,唯一有不同的就是第5步的設置:server-id=3
(五) 驗證讀寫分離
1. 登陸到amoeba(147),插入下面的測試數據
INSERT INTO label(Id,NAME,Description,AddOn)
VALUES (1,'viajar','我的博客',NOW());
INSERT INTO label(Id,NAME,Description,AddOn)
VALUES (2,'viajar','我的博客',NOW());
INSERT INTO label(Id,NAME,Description,AddOn)
VALUES (3,'viajar','我的博客',NOW());
INSERT INTO label(Id,NAME,Description,AddOn)
VALUES (4,'viajar','我的博客',NOW());
2. 登陸Master、Slave1、Slave2、amoeba分別驗證數據的分布,四個地方看到數據都如下圖所示:
(圖4)
四個地方的數據都如圖4的意思是搭建的replication成功了;Amoeba作為透明的代理已經基本成功,程序只需要知道Amoeba的地址就可以,完全不需要理會后台的處理;接下來我們驗證Amoeba讀寫是否是分離的。
3. 停止Slave1上的Slave,刪除id為3的記錄:
mysql>stop slave;
mysql>DELETE FROM label WHERE id =3;
(圖5:Slave1)
4. 停止Slave2上的Slave,添加一條新的記錄:
mysql>stop slave;
(圖6:Slave2)
5. 到Amoeba上執行多次查詢,查詢返回的結果集:
mysql>SELECT * FROM label;
發現Slave1,Slave2,Slave2這樣的配置會返回:圖5出現1次,圖6出現2次的規律進行返回的。
到此Amoeba的讀寫分離已經測試完畢。
三、注意事項
1. 在做Master/Slave的時候,當刪除了master的帳號,如果想要看到slave的效果,那就需要重啟master的數據庫服務再去看slave的status;(但是當salve從不可用到master可用了,不用重啟master的數據庫服務,slave也能看到效果)
2. 在做Master/Slave的時候,我們有兩台Salve,而且是內網的機器,所以使用了“192.168.1.%”這樣的方式來創建用戶,在一定的程度上保障帳號的安全性,又方便管理,使用“*”是錯誤的;
3. 對於多Slave的帳號問題,還可以有其它方式來創建帳號的,就是在Master為每個Slave創建獨立的帳號和密碼;
4. 修改log4j.xml 取消日志文件生成(太大了,磁盤很容易滿),<param name="file" value="${amoeba.home}/logs/project.log"/>改成:<param name="file" value="<![CDATA[${amoeba.home}/logs/project.log>/dev/null]]>"/>
5. 性能優化,打開bin/amoeba,DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"改成:DEFAULT_OPTS="-server -Xms512m -Xmx512m -Xmn100m -Xss1204k"
6. loadbalance元素設置了loadbalance策略的選項,這里選擇第一個“ROUNDROBIN”輪詢策略,該配置提供負載均衡、failOver、故障恢復功能。poolNames定義了其中的數據庫節點配置(當然也可以是虛擬的節點)。此外對於輪詢策略,poolNames還定義了其輪詢規則,比如設置成“Slave1,Slave1,Slave2”那么Amoeba將會以兩次Slave1,一次Slave2的順序循環對這些數據庫節點轉發請求。
四、疑問
1. 修改dbServers.xml的時候,設置virtualSlave 為ROUNDROBIN(輪詢策略):<property name="poolNames">Slave1,Slave2</property>,刪除Slave1(30)一條數據,插入Slave2(35)一條數據,如圖所示,到amoeba(147)執行多次Select,但是卻沒有出現負載均衡的效果,一直顯示為Slave1的數據:(圖5、圖6)
Slave1,Slave2或者Slave1,Slave2,Slave1,Slave2這樣的模式是無法達到輪詢Slave1和Slave2的目的。當設置為Slave1,Slave1,Slave2或者Slave1,Slave2,Slave1或者Slave1,Slave2,Slave2就生效了。為什么呢?Amoeba for mysql讀寫分離
五、參考文獻
Amoeba新版本MYSQL讀寫分離配置(log4j.xml設置)
Amoeba for mysql讀寫分離(比較多的測試)
-------------------華麗分割線-------------------
作者:聽風吹雨
版權:本文版權歸作者和博客園共有
轉載:歡迎轉載,必須保留原文鏈接
格言:不喜歡是因為你不會 && 因為會所以喜歡
-------------------華麗分割線-------------------