MySQL搭建Amoeba_讀寫分離


一、背景知識

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讀寫分離

 

五、參考文獻

在Master/Slave結構下的讀寫分離

Amoeba使用指南

Amoeba新版本MYSQL讀寫分離配置log4j.xml設置

Amoeba for mysql讀寫分離比較多的測試

MYSQL之--amoeba 實現讀寫分離,負載均衡

Mysql 基於 Amoeba 讀寫分離

Amoeba搞定mysql主從讀寫分離

Amoeba for Mysql 試用小結

 

-------------------華麗分割線-------------------

作者:聽風吹雨

出處:http://gaizai.cnblogs.com/

版權:本文版權歸作者和博客園共有

轉載:歡迎轉載,必須保留原文鏈接

郵箱:gaizai@126.com

格言:不喜歡是因為你不會 && 因為會所以喜歡

-------------------華麗分割線-------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM