1. 程式人生 > >Amoeba實現mysql讀寫分離

Amoeba實現mysql讀寫分離

一、關於讀寫分離

讀寫分離(Read/Write Splitting),基本的原理是讓主資料庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從資料庫處理SELECT查詢操作。資料庫複製被用來把事務性操作導致的變更同步到叢集中的從資料庫。

二、同類產品比較

雖然大多數都是從程式裡直接實現讀寫分離的,但對於分散式的部署和水平和垂直分割,一些代理的類似中介軟體的軟體還是挺實用的,Amoeba for Mysql 與MySQL Proxy比較在MySQL proxy 6.0版本上面如果想要讀寫分離並且讀叢集、寫叢集 機器比較多情況下,用mysqlproxy 需要相當大的工作量,目前mysql proxy沒有現成的 lua指令碼。mysql proxy根本沒有配置檔案, lua指令碼就是它的全部,當然lua是相當方便的。那麼同樣這種東西需要編寫大量的指令碼才能完成一個複雜的配置。而Amoeba for Mysql只需要進行相關的配置就可以滿足需求。

三、關於Amoeba

Amoeba(變形蟲)專案,該開源框架於2008年 開始釋出一款 Amoeba forMysql軟體。這個軟體致力於MySQL的分散式資料庫前端代理層,它主要在應用層訪問MySQL的時候充當SQL路由功能,專注於分散式資料庫代理層(Database Proxy)開發。座落與 Client、DB Server(s)之間,對客戶端透明。具有負載均衡、高可用性、SQL 過濾、讀寫分離、可路由相關的到目標資料庫、可併發請求多臺資料庫合併結果。通過Amoeba你能夠完成多資料來源的高可用、負載均衡、資料切片的功能,目前Amoeba已在很多企業的生產線上面使用。

四、Amoeba的安裝

場景描述:

Amoeba伺服器:192.168.1.21
主資料庫伺服器:雙主複製:192.168.1.22(active),192.168.1.21(passive)。

                                 已配置Keepalive高可用,虛擬IP 192.168.1.60  #注意,這裡雙主複製並不是必須的。

從資料庫伺服器:192.168.1.23,MySQL已經安裝

4.1 下載

wget http://nchc.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.1.0-RC5.tar.gz

4.2 安裝amoeba

mkdir /usr/local/amoeba

mv amoeba-mysql-binary-2.1.0-RC5.tar.gz/usr/local/amoeba

tar xvf amoeba-mysql-binary-2.1.0-RC5.tar.gz 

4.3 安裝JDK

rpm -ivhjdk-8u65-linux-x64.rpm\?AuthParam\=1452665963_7ae34dd55d5d4c1b2a7297acd2135e73

 vi/etc/profile 

在末尾新增:

export AMOEBA_HOME=/usr/local/amoeba

export JAVA_HOME=/usr/java/jdk1.8.0_65

export CLASSPATH=$JAVA_HOME/lib/tools.jar

exportPATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$AMOEBA_HOME/bin

驗證是否安裝成功:

java -version

注意:1.4 和1.7的命令不一樣, 1.4中是java --version 檢視版本,1.7 執行錯誤的命令就是報上面那個錯誤,1.7的命令格式是java -version。

五、Amoeba配置

5.1 配置dbServers.xml

cd /usr/local/amoeba/conf
vi dbServers.xml

5.1.1設定mysql預設連線時的埠,資料庫,帳號和密碼

該配置檔案裡主從資料庫的parent是abstractServer,需要從它繼承一些資訊,所以這裡的資訊一定要配置正確。

 

需要修改成類似:

mysql schema這裡預設是test,需要改成一個存在的資料庫。

5.1.2設定連線主從資料庫伺服器的IP地址和伺服器別名,使用者名稱及密碼

<dbServername="server1" parent="abstractServer">
                <factoryConfig>
                        <!-- mysql ip -->
                        <propertyname="ipAddress">127.0.0.1</property>
                </factoryConfig>
        </dbServer>

替換成類似於:
<dbServername="master" parent="abstractServer">
                <factoryConfig>
                        <propertyname="ipAddress">192.168.1.60</property>
                        <propertyname="user">root </property>
                        <propertyname="password">dandan </property>
                </factoryConfig>
        </dbServer>
 
        <dbServername="slave1" parent="abstractServer">
                <factoryConfig>
                        <propertyname="ipAddress">192.168.1.23</property>
                        <propertyname="user">root </property>
                        <propertyname="password">dandan </property>
                </factoryConfig>
        </dbServer>

--注意:這裡寫的資料庫使用者,密碼必須是主從允許遠端訪問的使用者,不是主從的本地使用者。

5.1.3 定義讀寫的池

把master節點加入WritePool,把slave節點加入ReadPool

替換為類似於:

5.2 配置amoeba.xml

vi amoeba.xml

5.2.1 修改proxy的埠號,管理帳號及密碼

客戶端和程式只需要連線proxy的帳號密碼即可,相當於中間接封裝。


替換成類似於:


 #注意,amoeba伺服器上也安裝了mysql,這裡的埠不要和mysql埠衝突了。

5.2.2 設定預設池及讀寫分離

一些除了SELECT\UPDATE\INSERT\DELETE的語句都會在defaultPool執行。

我這裡將

替換為:

這裡記得取消註釋writePool和readPool這兩行。

--這幾行位於檔案後面的位置

六、啟動Amoeba

[[email protected] lib]#/usr/local/amoeba/bin/amoeba start &

開機自動啟動可加入到 /etc/rc.local內

echo"/usr/local/amoeba/bin/amoeba start &" >> /etc/rc.local

七、日誌排錯

日誌檔案在/usr/local/amoeba/logs下  

八:驗證讀寫分離

連線前,需要開放防火牆埠。

mysql -u root -p123456 -h 192.168.1.21 --port 3308

mysql> use dba;

Reading tableinformation for completion of table and column names

You can turn offthis feature to get a quicker startup with -A

Database changed

mysql> select *from t;

+------+

| id   |

+------+

|    2 |

|    1 |

+------+

2 rows in set (0.03sec)

為了清晰的看到讀寫分離的效果,需要暫時關閉MySQL主從複製功能。

#在slave上執行:

mysql> stop slave;

Query OK, 0 rowsaffected (0.03 sec)

#連線amoeba代理,執行:

mysql> insert into t(id) values(3),(4);

Query OK, 2 rowsaffected (0.09 sec)

Records: 2  Duplicates: 0 Warnings: 0

mysql> select *from t;

+------+

| id   |

+------+

|    2 |

|    1 |

+------+

2 rows in set (0.00sec)

並沒有檢視到新增的兩條資料。

而直接登入master,可以看到新增資料:

mysql> use dba;

Reading tableinformation for completion of table and column names

You can turn offthis feature to get a quicker startup with -A

Database changed

mysql>select  * from t;

+------+

| id   |

+------+

|    2 |

|    1 |

|    3 |

|    4 |

+------+

4 rows in set (0.00sec)

現在再開始啟動複製

mysql> start slave;

Query OK, 0 rowsaffected (0.02 sec)

連線amoeba代理,重新查詢:

可以看到,現在能查到資料了。

這充分說明寫是在主庫進行,查是在叢庫執行。