moeba是一個以MySQL為底層數據存儲,並對應用提供MySQL協議接口的proxy,下面我們一起來看看關於使用Amoeba實現MySQL的主從讀寫分離的例子吧.
主從同步架構的優點
- 讀取工作交給了從服務器,降低了主服務器的壓力
- 在從服務器進行備份,避免備份期間影響主服務器服務
- 當主服務器出現問題時,可以切換到從服務器。
Amoeba介紹
代碼如下
復制代碼
Amoeba(變形蟲)項目,該開源框架於2008年 開始發布一款 Amoeba for Mysql軟件。這個軟件致力於MySQL的分布式數據庫前端代理層,它主要在應用層訪問MySQL的 時候充當SQL路由功能,專注於分布式數據庫代理層(Database Proxy)開發。座落與 Client、DB Server(s)之間,對客戶端透明。具有負載均衡、高可用性、SQL 過濾、讀寫分離、可路由相關的到目標數據庫、可並發請求多台數據庫合並結果。 通過Amoeba你能夠完成多數據源的高可用、負載均衡、數據切片的功能。本次主要用到的就是Amoeba for Mysql這個軟件。
MySQL的主從同步配置
實驗環境
- 服務器類型:虛擬機
- 系統: CentOS release 6.8 (Final)
- MySQL: 5.1.73
- 主數據庫: 172.16.2.239
- 從數據庫: 172.16.2.230
配置主庫
- 本次操作使用yum服務進行安裝,輸入yum -y install mysql(注:-y 表示安裝過程自動選擇’y’)
- service mysql start 啟動MySQL服務
- 在root賬戶下使用 mysqladmin -u root password ‘newpassword’為mysql的root賬戶設置密碼(注:首次登錄root賬號沒有密碼,直接回車進入,但沒有設置密碼無法進行很多操作)
- mysql -u root -p 輸入密碼後登錄
- grant replication salve on *. * to ‘root’@’172.16.2.230’ identified by ‘123456’ (添加從庫到本機同步的遠程賬號下,root是賬號,ip為從庫地址,123456為登錄密碼)
- select user, host,password from mysql.user查看是否創建成功並查看有無賬號密碼為空的賬戶,並刪除(注:這步不是必須,空賬戶的存在會影響登錄,這是在遇到問題之前先進行排除)
- vim /etc/my.cnf
(server-id 不能與其它節點重復,replicate_ignore_db設置了不進行同步的databases)
- 退出MySQL,service mysqld restart重啟後登錄,查看server_id 以及 File+position信息並記錄
配置從庫
- 在172.16.2.230上開始配置從庫,安裝過程參照主庫(這裡筆者使用的是默認數據庫作為主從,所以直接用yum安裝從庫,如果主庫有改動需要保持一致則使用dump備份並在從庫節點上恢復的方式配置)
- vim /etc/my.cnf 編輯配置文件
(注:這裡的server-id一定不能與主庫相同)
- service mysqld restart重啟數據庫
- mysql -u root -p -h 172.16.2.239驗證連接主庫(此處的root為在主庫中授權過的賬號)
- 退出遠程連接,換為本地root賬號登錄,SHOW VARIABLES LIKE ‘server_id’查看ID號確認是否和主庫重復
- slave stop;關閉同步服務
- change master to master_host=’172.16.2.239’, master_user=’root’, master_password=’123456’, master_log_file=’master_bin.000019’, master_log_pos=106;(注:此處的master_user為授權的賬號,log_file和pos為之前主庫上查看的記錄,見上面第8步。如果在主庫中在未同步的情況下使用過flush privileges命令刷新過數據庫的話,log_file會自動+1)
- slave star**t 打開同步,**show slave status查看狀態
這裡主要注意的是Slave_IO_Running 和 shlave_SQL_Running是否為Yes,如果為NO,注意檢查配置
- 檢查完狀態後可以在主庫中的test庫中建立一張表,寫入完成後便能再從庫中查看,同步完成
安裝配置 Amoeba
1.配置JAVA環境
此處需要下載JDK,筆者圖方便直接從yum上進行下載安裝,
yum -y install java-1.6.0-openjdk 這裡使用的是1.6的版本。也可以直接使用wget 到Oracle上進行下載,只不過需要解壓建立連接等操作。
vim /etv/profile 進行java環境變量的配置,注意下載方式不同,路徑也不同
完成後執行
source profile ,使用
java -verison查看
2. 安裝Amoeba
wget https://sourceforge.net/projects/amoeba/files/Amoeba_for_mysql/2.2.x/amoeba-mysql-binary-2.2.0.tar.gz/download
mkdir /usr/local/amoeba-2.2.0
tar xvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba-2.2.0
3.配置Amoeba
vim /usr/local/amoeba-2.2.0/conf/dbServers.xml
- port = 3306指的是主從數據庫的端口號
- schema = test指的是amoeba代理數據庫的名稱
- user = root 以及 password 是amoeba登錄主從服務器的賬號密碼,因此要注意這裡的賬戶必須有訪問兩個數據庫的權限才行
- 這裡的localhost指的是主庫的代號,底下的ipAddress為主庫地址
- slave指的是從庫的代號,底下的ipAddress為從庫地址
- 輪詢的主和從的讀設置權重設置成1:3,這樣就可以很好的解決主從不壓力均衡的問題
vim /usr/local/amoeba-2.2.0/conf/amoeba.xml
- 這裡的8066端口為amoeba代理所監聽的端口
- user 和 password 是用來登錄amoeba代理所使用的賬號信息
- LRUMapSize定義了Amoeba緩存的SQL語句解析條數
- defaultPool配置了默認的節點,一些除了SELELCT/UPDATE/INSERT/DELETEDE的語句都會在上面執行
- writePool配置了寫庫,通常就是主庫
- readPool配置了讀庫,可以為一個也可以是數據庫池
這樣Amoeba的配置就完成了(注:關於配置文件的參數意義在amoeba文檔中有完整的解釋)
接下來進行環境變量的配置,
vim /etc/profile.d/amoeba.sh
export AMOEBA_HOME=/usr/local/amoeba-2.2.0/
export PATH=$AMOEBA_HOME/bin/:$PATH
4.啟動Amoeba
執行
amoeba start
The stack size specified is too small, Specify at least 160k
Could not create the Java virtual machine.
如果報以上錯誤,需編輯二進制腳本,因為JAVA啟動對xss參數最小值有限制
vim /usr/local/amoeba-2.2.0/bin/amoeba
DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss128k”
修改為如下
DEFAULT_OPTS=”-server -Xms256m -Xmx256m -Xss256k”
(注:如果啟動失敗要主要看有無 Amoeba Monitor Server shutdown completed!,如果沒有請執行一遍amoeba stop)
5.連接amoeba
正常啟動後連接amoeba數據庫,
mysql -u root -p -h 172.16.2.231 -P8066
這就是正常啟動後的提示信息,如果提示錯誤的話可能性很多,但大多數是網絡(防火牆沒關,主從數據庫未啟動等)、權限(主從數據庫未提供amoeba賬號權限等)以及配置的問題,多多閱讀錯誤提示和日志能讓你更快的定位到錯誤
6.測試
測試的方法有很多種這裡就不舉例了,主要的思想是:
- 在amoeba上創建表,測試操作是否同步主從;
- 將從庫的同步關閉slave stop,在amoeba上進行寫操作看是否只有主庫寫入;在主從上分別插入一條數據,並在amoba上執行讀操作看顯示的數據等。