1. 程式人生 > >mysql+amoeba 主從復制,讀寫分離,負載均衡

mysql+amoeba 主從復制,讀寫分離,負載均衡

負載均衡 可用性 char 狀態 mariadb 過濾 follow size 主機名

Amoeba是什麽?
Amoeba(變形蟲)項目,該開源框架於2008年 開始發布一款 Amoeba for Mysql軟件。這個軟件致力於MySQL的分布式數據庫前端代理層,它主要在應用層訪問MySQL的時候充當SQL路由功能,專註於分布式數據庫代理層(Database Proxy)開發,它位於與Client、DBServer(s)之間,對客戶端透明。具有 負載均衡、高可用性、SQL過濾、讀寫分離、可路由相關的到目標數據庫、可並發請求多臺數據庫合並結果 。

通過Amoeba你能夠完成多數據源的高可用、負載均衡、數據切片的功能,目前Amoeba已在很多 企業的生產線上面使用。

需求案例:
有三個數據庫節點分別命名為Master、Slave1、Slave2如下:

Master: Master (只寫)
Slaves:Slave1、Slave2 (2個平等的數據庫。只讀/負載均衡)
案例實現Master、Slaves之間數據庫主從復制、讀寫分離,負載均衡的高可用Mysql架構。

實驗架構圖:
技術分享圖片

系統環境:
技術分享圖片

數據庫主從復制環境部署
一、mster:(10.100.246.241)
yum install -y mariadb
systemctl enable mariadb
systemctl start mariadb
1、修改mysql配置
找到主數據庫的配置文件my.cnf(或者my.ini),我的在/etc/mysql/my.cnf,在[mysqld]部分插入如下兩行:
[mysqld]

log-bin=mysql-bin //開啟二進制日誌
server-id=241 //設置server-id
技術分享圖片

2、重啟數據庫並重置
systemctl restart mariadb
mysql_secure_installation
技術分享圖片

3、啟mysql,創建用於同步的用戶賬號,並授予對應的權限
打開mysql會話shell>mysql -uname -ppassword
分別創建兩個用戶,一個用戶授權給slave01和slave02,另一個用戶授權給amoeba服務器
slave username:slave ;password:123456
amoeba username:amoeba ;password:123456

mysql>CREATE USER slave@‘10.100.246.%‘ IDENTIFIED BY ‘123456‘;
mysql>GRANT REPLICATION SLAVE ON . TO slave@‘10.100.246.%‘ WITH GRANT OPTION;
mysql>GRANT ALL PRIVILEGES ON . TO [email protected] IDENTIFIED BY ‘123456‘ WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES;
技術分享圖片

4、查看master狀態,記錄二進制文件名(mysql-bin.000002)和位置(245)
SHOW MASTER STATUS;
技術分享圖片

5、防火墻放行服務及端口
技術分享圖片

二、slave01和slave02:(10.100.246.242,10.100.246.243)
註:slave02操作步驟除了my.cnf配置裏的server-id號不一樣,其余操作步驟和slave01一樣
yum install -y mariadb
systemctl enable mariadb
systemctl start mariadb
1、更改mysql配置
找到my.cnf配置文件,添加server-id
[mysqld]
server-id=242 //設置server-id,必須唯一;slave02 server-id=243
技術分享圖片

2、重啟數據庫並重置
systemctl restart mariadb
mysql_secure_installation
技術分享圖片

3、打開mysql會話,執行同步SQL語句(需要主服務器主機名,登陸憑據,二進制文件的名稱和位置):
CHANGE MASTER TO MASTER_HOST=‘10.100.246.241‘, MASTER_USER=‘slave‘, MASTER_PASSWORD=‘123456‘, MASTER_LOG_FILE=‘mysql-bin.000002‘, MASTER_LOG_POS=245;
技術分享圖片

4、啟動slave同步進程,並查看slave狀態
mysql>start slave;
mysql>SHOW SLAVE STATUS;
技術分享圖片

5、建立amoeba用戶,並授予相關權限,為部署amoeba做準備(兩臺從數據庫都要添加)
GRANT ALL PRIVILEGES ON . TO [email protected] IDENTIFIED BY ‘123456‘ WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES;
技術分享圖片

6、防火墻放行服務及端口
技術分享圖片

JDK環境部署:(amoeba使用java編寫,所以運行amoeba的運行環境要安裝好java環境,並配置好環境變量)
1、卸載系統自帶的OpenJDK以及相關的java文件
rpm -aq | grep java
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64 java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64 java-1.7.0-openjdk-headless-1.7.0.141-2.6.10.5.el7.x86_64 java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64
java -version
技術分享圖片
技術分享圖片
技術分享圖片

2、下載最新穩定JDK
【註意】:JDK安裝在哪個用戶下,就是給哪個用戶使用
下載地址為
2.1當前最新版本下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
  歷史版本下載地址:  http://www.oracle.com/technetwork/java/javase/archive-139210.html

2.2粘貼地址到瀏覽器地址欄
技術分享圖片
根據版本,系統位數,選擇tar.gz文件下載 (註:記得勾選license)
技術分享圖片

2.3下載完成後,將JDK包本地解壓,通過winscp上傳至amoeba服務器 /usr/java 目錄 (註:沒有java這個目錄可自行建立)
2.4將/java目錄中的文件授予執行權限
chmod o+x /usr/java/ -R

3、配置JDK環境變量
在文本的最後一行粘貼如下:
註意JAVA_HOME=/usr/java/jdk-11.0.2 就是你自己的目錄
【註】:CentOS6上面的是JAVAHOME,CentOS7是{JAVA_HOME}
vim /etc/profile
#java environment
export JAVA_HOME=/usr/java/jdk-11.0.2
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
技術分享圖片

4、剛剛設置的環境變量生效並檢查是否安裝成功
source /etc/profile 或者 . /etc/profile
java -version
技術分享圖片

Amoeba環境部署:(10.100.246.240)
一、準備工作
1、amoeba使用java編寫,所以運行amoeba的運行環境要安裝好java環境,並配置好環境變量,jdk版本要在1.5以上,因為amoeba就是用jdk1.5編寫的;我的服務器java版本為11.0.2
2、amoeba是在主從同步的基礎上工作的,所以要先配置好MySQL的主從同步功能

二、下載安裝amoeba
1、下載地址:https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/3.x/
選擇最新版本進行下載;我下載的版本為:amoeba-mysql-3.0.5-RC-distribution.zip
技術分享圖片
2、下載完成後,在本地將包解壓,解壓完成後,通過winscp工具將amoeba-mysql-3.0.5-RC文件上傳至amoeba服務器/usr/amoeba目錄下(註:amoeba目錄自行建立)
3、授予該目錄執行權限
[root@amoeba amoeba]# chmod o+x amoeba-mysql-3.0.5-RC/ -R

4、防火墻放行端口號
技術分享圖片

我們在amoeba文件夾中找到conf文件夾,其中我們需要配置的僅有dbServers.xml和amoeba.xm
5、編輯配置 /amoeba-mysql-3.0.5-RC/conf 目錄下dbServers.xml文件
首先我們來看下name為abstractServer的dbServer標簽,其中abstractive屬性為true,意味著這是一個抽象的dbServer定義,可以由其他dbServer定義拓展,類似於抽象類,可以由其他類繼承和擴展。其中需要我們手動修改的是端口(port),數據庫(schema),用戶名(user),密碼(password);那麽這裏應該如何填寫呢?本人第一次使用的時候也非常迷糊,其實我們應該填寫的就是在master和slave上我們為amoeba服務器創建的用於連接master和slave數據庫的用戶,因此這裏應該填寫port——3306(默認端口無修改),schema——bob(bob數據庫),user——amoeba(用戶名),password——123456(密碼)

技術分享圖片

而abstractServer下方的dbServer就是我們實際中需要使用的,關於dbServer,可以根據自己的情況書寫,有幾個需要配置的數據庫,就填寫幾個,其中name可以自定義,最好書寫有含義的名稱,parent就填寫abstractServer,因為我們要繼承abstractServer,這樣我們就可以在abstractServer的基礎上進行擴展(繼承了port,schema,user和password等屬性),只需要添加獨有的屬性即可。
案列為一主兩從,主為master,從一為slave01,從二為slave02。除了各自的dbServer之外,我們還可以新建一個dbServer作為數據庫池,用於整合那些功能相同的數據庫,案列中slave1和slave2都是從數據庫,負責讀取操作,我們就可以把它們集中在一起方便調用。其中屬性為loadbalance代表負載均衡,默認值是1,代表輪詢算法,poolNames屬性就是讓我們放置那些具有共同功能的dbServer,例如slave1,,slave2,其中不同的dbServer以英文逗號隔開

技術分享圖片

6、編輯配置 /amoeba-mysql-3.0.5-RC/conf 目錄下amoeba.xml文件
配置完成dbSevers.xml之後,我們來配置amoeba.xml,首先我們來配置service標簽,需要配置的地方有三點,port,user和password。其中port默認是8066,可以自行更改,但是不要跟現有端口起沖突,如非必要不建議更改。user和password則可以自定義,無需跟master和slave創建的用戶一致。這裏的端口,用戶名和密碼其實就是為了虛擬出一個mysql鏈接做準備的(非真實,amoeba服務器可以不安裝真實的mysql數據庫)

特別說明:在service標簽中有一個被註釋的ipAddress屬性,該屬性用於綁定可以鏈接amoeba虛擬出來的mysql的具體ip,如果不綁定,則amoeba服務器所在的網絡環境(在同一個局域網下,非同一個局域網下未測試)的其他服務器,可以通過amoeba的內網ip進行鏈接,如果綁定了127.0.0.1,那麽只有amoeba服務器可以鏈接虛擬出來的mysql,這點需要註意

技術分享圖片

端口,用戶名和密碼配置完之後,我們來配置queryRouter標簽,該標簽可以實現真正意義上的讀寫分離,以上配置均為該標簽做準備。其中我們需要手動修改的地方有三處,分別是defaultPool,writePool和readPool。defaultPool配置了默認的數據庫節點,一些除了SELECT\UPDATE\INSERT\DELETE的語句都會在defaultPool執行,一般設置為主庫。writePool顧名思義就是數據庫寫庫,insert,update和delete操作都將會在此庫中執行,一般設置為主庫。readPool就是寫庫。如果是單主單從,則readPool就寫從庫在dbServers.xml中設置的名稱,例如設置為slave01,如果是一主多從,則readPool設置為從數據庫池,例如本案例中的multiPool,就是從數據庫池,包含slave01和salve02兩個從數據庫,這樣就完成了讀寫分離(主從)和負載均衡(從一和從二)。至此,amoeba的配置工作已完成
技術分享圖片

7、配置jvm運行參數
運行在jdk11.0.2環境中的amoeba要求xss參數必須大於228才能啟動JVM
所以在amoeba安裝目錄下的jvm.properties文件中進行參數設置
vim jvm.properties
JVM_OPTIONS="-server -Xms512m -Xmx1024m -Xss512k -XX:PermSize=16m -XX:MaxPermSize=96m"
技術分享圖片
技術分享圖片

8、啟動腳本
./launcher &
技術分享圖片

9、將腳本加入開機啟動項
vim /etc/profile
./usr/amoeba/amoeba-mysql-3.0.5-RC/bin/launcher &
技術分享圖片

10、查看java服務
netstat -tnlap | grep java
技術分享圖片

客戶端驗證
1、安裝mariadb軟件
yum install -y mariadb

2、登錄amoeba服務器
mysql -h10.100.246.240 -udesktop -P8066 -p
技術分享圖片

3、測試數據庫是否能夠寫入數據,主從數據是否同步
客戶端登錄數據庫後,進入名為bob的數據庫,插入一張表
MySQL [bob]> CREATE TABLE cisco (id int(10),name varchar(10),type varchar(20));
MySQL [bob]> INSERT INTO cisco VALUE (‘1‘,‘ccie‘,‘this_is_master‘);

在主數據庫和兩臺從數據庫上查看是否存在建立的table與表中插入的數據,存在則說明寫入成功,主從同步成功
技術分享圖片

4、測試驗證兩臺從數據庫是否實現負載均衡(輪詢)
slave01:進入bob數據庫,在cisco表中插入以下數據
MariaDB [bob]>INSERT INTO cisco VALUE (‘2‘,‘ccie‘,‘this_is_slave01‘);

slave02:進入bob數據庫,在cisco表中插入以下數據
MariaDB [bob]>INSERT INTO cisco VALUE (‘2‘,‘ccie‘,‘this_is_slave01‘);

desktop:進入bob數據庫,通過命令查看cisco表中數據,因為是輪詢負載,所以表中查看數據會在slave01和slave02上來回切換數據
MariaDB [bob]>SELECT * FROM cisco;
技術分享圖片

5、測試驗證讀是否限制在slave01和slave02兩臺從數據庫中
5.1臨時關閉slave01和slave02與主數據庫的同步
MariaDB [bob]> STOP SLAVE;

5.2客戶端在cisco數據表中插入一條數據,通過SELECT命令是否能查看插入的數據,不能看見數據,則實驗成功
技術分享圖片

5.3再將slave01和slave02與主數據庫的同步開啟,驗證客戶端上是否能夠查看到數據
slave01和slave02:MariaDB [bob]> START SLAVE;
desktop:MariaDB [bob]>SELECT * FROM cisco;
技術分享圖片

參考文獻資料:
https://www.cnblogs.com/gl-developer/p/6178608.html
https://github.com/ameizi/DevArticles/issues/141
https://blog.csdn.net/a7442358/article/details/47781089
https://blog.csdn.net/moliyiran/article/details/80274993
http://blog.51cto.com/10316297/2139138
https://www.cnblogs.com/symcious/p/4522571.html
https://www.cnblogs.com/aguncn/p/4313724.html

mysql+amoeba 主從復制,讀寫分離,負載均衡