amoeba实现mysql主从读写分离_MySQL+Amoeba实现数据库主从复制和读写分离
MySQL讀寫分離是在主從復制的基礎上進一步通過在master上執行寫操作,在slave上執行讀操作來實現的。通過主從復制,master上的數據改動能夠同步到slave上,從而保持了數據的一致性。實現數據的讀寫分離能帶來的好處有:
增加物理服務器,提升機器處理能力,也就是拿硬件換性能。
主從只負責各自的讀和寫,極大程度緩解X鎖和S鎖爭用。
slave可以配置myIasm引擎,提升查詢性能以及節約系統開銷。
master直接寫是并發的,slave通過主庫發送來的binlog恢復數據是異步。
slave可以單獨設置一些參數來提升其讀的性能。
增加冗余,提高可用性。
常見的實現數據庫讀寫分離的方案大致有兩種:應用層,代理層
在應用層也就是在代碼中進行操作,通過對數據庫操作類型的不同手動指定數據源,可以通過AOP的方式進行實現,不過對于一個已經搭建起來并正在運行的系統來說,這個方案應該比較復雜。
另外一種實現方式是通過數據庫代理層,代理對應用層呢個是透明的,所有的讀寫分離操作由代理層來完成,好處就是對于開發應用層來說是透明的,不需要管理數據源,缺點在于應用原來直接訪問數據庫現在變成了通過代理訪問數據庫,性能上肯定會有影響,不過如果代理層實現的很優秀的話這個影響應該不大。
通過代理層實現數據庫讀寫分離又有兩種方案可供選擇,其一是使用MySQL-Proxy,另一種是使用Amoeba。最開始找到的實現方案是基于MySQL-Proxy的,由于它沒有配置文件,所要完成的工作需要由Lua腳本來實現,這對于一個Lua門外漢來說壓力不小。后來找到的Amoeba實現起來很簡單,只需要簡單地配置就能實現數據庫的讀寫分離,所以這里記錄我通過使用Amoeba來實現數據庫讀寫分離的過程。
Amoeba簡介:
Amoeba(變形蟲)致力于MySQL的分布式數據庫前端代理層,它主要在應用層訪問MySQL的 時候充當SQL路由功能,專注于分布式數據庫代理層(Database Proxy)開發。座落與 Client、DB Server(s)之間,對客戶端透明。具有負載均衡、高可用性、SQL 過濾、讀寫分離、可路由相關的到目標數據庫、可并發請求多臺數據庫合并結果。 通過Amoeba你能夠完成多數據源的高可用、負載均衡、數據切片的功能。
Amoeba使用:
一、準備工作
amoeba使用java編寫,所以運行amoeba的運行環境要安裝好java環境,并配置好環境變量,jdk版本要在1.5以上,因為amoeba就是用jdk1.5編寫的;我的服務器java版本為1.7。
amoeba是在主從同步的基礎上工作的,所以要先配置好MySQL的主從同步功能,我在另一篇日志中記錄了我實現Mysql主從同步的過程,可以參考:MySQL主從復制(Master-Slave)實踐
amoeba服務器 :虛擬機 ip:182.92.172.80 ? amoeba版本3.0.5-RC ? mysql版本5. 5.32? ?Java環境1.7.0_60 ? ?操作系統linux
master服務器 ? ?:虛擬機 ip:182.92.172.80 ?mysql版本5. 5.32 ??操作系統centos6.5 (和amoeba在同一個服務器上,因為我只用了兩個服務器)
slave服務器 ? ? ? :虛擬機 ip:123.57.44.85 ? mysql版本5.5.39 ? 操作系統centos6.5
二、下載安裝amoeba
下載地址:https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/3.x/,選擇最新版本進行下載,我下載的版本為:amoeba-mysql-3.0.5-RC-distribution.zip
安裝:把zip安裝包解壓到自己指定的服務器路徑上就可以了,我把它放在了/usr/local/amoeba/amoeba-mysql-3.0.5-RC里面,解壓后的文件結構如下圖:
三、配置amoeba
Amoeba基礎配置介紹:
想象Amoeba作為數據庫代理層,它一定會和很多數據庫保持通信,因此它必須知道由它代理的數據庫如何連接,比如最基礎的:主機IP、端口、Amoeba使用的用戶名和密碼等等。這些信息存儲在$AMOEBA_HOME/conf/dbServers.xml中。
Amoeba為了完成數據切分提供了完善的切分規則配置,為了了解如何分片數據、如何將數據庫返回的數據整合,它必須知道切分規則。與切分規則相關的信息存儲在$AMOEBA_HOME/conf/rule.xml中。
當我們書寫SQL來操作數據庫的時候,常常會用到很多不同的數據庫函數,比如:UNIX_TIMESTAMP()、SYSDATE()等等。這些函數如何被Amoeba解析呢?$AMOEBA_HOME/conf/functionMap.xml描述了函數名和函數處理的關系。
對$AMOEBA_HOME/conf/rule.xml進行配置時,會用到一些我們自己定義的函數,比如我們需要對用戶ID求HASH值來切分數據,這些函數在$AMOEBA_HOME/conf/ruleFunctionMap.xml中定義。
Amoeba可以制定一些可訪問以及拒絕訪問的主機IP地址,這部分配置在$AMOEBA_HOME/conf/access_list.conf中
Amoeba允許用戶配置輸出日志級別以及方式,配置方法使用log4j的文件格式,文件是$AMOEBA_HOME/conf/log4j.xml。
在開始配置amoeba配置文件之前我們需要先了解為什么要做這些配置工作。
第一,如上第一條所述,Amoeba是通過代理MySQL服務來實現數據庫的讀寫分離的,它必須要知道如何連接到需要被代理的數據庫,因此需要被代理的數據庫需要創建一個訪問用戶給amoeba,這樣amoeba才能連接到數據庫上。
第二,amobea把對客戶端也就是應用層是透明的,不管amoeba如何實現的讀寫分離,它既然把數據庫全都給代理了,那它就要為客戶端提供一個類似原來mysql那樣的連接,客戶端就把當它是mysql,它其實是一個虛擬的mysql,對外提供mysql協議,客戶端連接amoeba就象連接mysql一樣,因此amoeba要為客戶端提供一個可供連接的用戶賬號。
第三,amoeba內部是實現了多數據庫的負載均衡、讀寫分離、可切片的,所以這部分的配置是它功能上的核心配置。
下面就正式開始配置amoeba
所有數據庫創建amoeba訪問的用戶:
mysql>grant all on *.* to 'amoeba'@'182.92.172.80' identified by '123456'#創建用戶并授權
mysql>flush privileges; #刷新權限
為了方便統一管理就把所有數據庫創建的用戶名和密碼保持一致了
2.配置conf文件
在amoeba安裝目錄的conf文件夾下找到dbServer.xml和amoeba.xml文件,這兩個文件是需要我們配置的
我的dbServer.xml文件配置如下:
1 <?xml version="1.0" encoding="gbk"?>
2
3
4
5
6
12
13
14
15 ${defaultManager}
16 64
17 128
18
19
20
21
22
23 yj_platform
24
25
26 amoeba
27
28 123456
29
30
31
32 500
33 500
34 1
35 600000
36 600000
37 true
38 true
39 true
40
41
42
43
44
45
46 182.92.172.96
47
48 3306
49
50
51
52
53
54
55 123.57.44.78
56
57 13306
58
59
60
61
71
需要我們關注的元素用標紅字體顯示出來了,在這里是指幾個dbServer元素,需要手動修改的部分用黃色背景表示出來。
第一個dbServer元素其abstractive="true"屬性表示這個一個抽象元素可以被其他dbServer元素擴展,類似于java里面的抽象類和類的繼承之間的關系。這個dbServer里面配置amoeba連接它所代理的mysql數據庫的連接信息,因為之前已經說過為了方便管理把每個數據庫為amoeba訪問創建的用戶都統一了賬號,在這里我把端口信息給注釋掉了,因為我的slave數據庫端口用的不是默認的3306,這種和ip,端口不一樣的信息就沒辦法配置在通用的抽象dbServer里面了。
第二個dbServer取名為"maser",其parent="abstractServer"表示拓展了上面的抽象dbServer,在這里設置的是amoeba連接數據庫具體的信息,因為每個數據庫的ip肯定是不同的。
同樣第三個dbServer取名為“slave”,連接信息是slave服務器。
在下面被我注釋掉的第四個dbServer其name="multiPool" virtual="true"屬性表示這是一個對多服務器池,這個配置使得amoeba可以把多個讀數據庫管理成一個讀池,把多個寫數據庫管理成寫池,在每個池中amoeba就能夠實現負載均衡。由于我的主從同步只設置了一主一從,并不涉及到多個讀數據庫組成池的情況,所以我就把這個配置注釋掉了。
接下來配置amoeba.xml文件,同樣放上我的配置文件:
1 <?xml version="1.0" encoding="gbk"?>
2
3
4
5
6
7
8
9
10
11 8066
12
13
14
15
16
17
18
19
20 128
21 64
22
23
24
25
26
27
28 amoeba
29
30 password
31
32
33
34 ${amoeba.home}/conf/access_list.conf
35
36
37
38
39
40
41
42
43
44
45 128
46
47
48 500
49
50
51 utf8
52
53
54 60
55
56
57
58
59
63
64
65 com.meidusa.toolkit.net.AuthingableConnectionManager
66
67
68
69
70
71 ${amoeba.home}/conf/dbServers.xml
72
73
74
75
76
77 ${amoeba.home}/conf/rule.xml
78 ${amoeba.home}/conf/ruleFunctionMap.xml
79
80
81 ${amoeba.home}/conf/functionMap.xml
82 1500
83 slave1
84 master
85 slave1
86 true
87
88
amoeba.xml文件中需要配置的地方也不多,首先要配置的是service標簽,其中需要配置的地方有三個port,user,password。這里的端口,用戶名和密碼其實就是為了虛擬出一個mysql鏈接做準備的(非真實,amoeba服務器可以不安裝真實的mysql數據庫),端口默認的事8066,可以修改但是不要跟現有的端口沖突,用戶名和密碼是客戶端連接amoeba虛擬出來的mysql連接的用戶名密碼,和之前mysql數據庫創建給amoeba的用戶賬號不同。在這里有一個注釋掉的ipAddress屬性,如果Amoeba所在的服務器在多個網絡環境內你可以定義該機器的其中一個IP來指定Amoeba所服務的網絡環境,但是如果設置為127.0.0.1將導致其他機器無法訪問Amoeba的服務。
之后配置queryRouter標簽,這是amoeba真正實現讀寫分離所產生作用的地方,之前的配置都是為了該處做準備。
該處有三個地方需要我們配置,首先是defaultPool,一些除了SELECT\UPDATE\INSERT\DELETE的語句都會在defaultPool執行。
之后是writePool,這里是配置寫庫也就是主數據庫,在這里是前面dbServer.xml中配置的master。
resdPool配置的是讀庫,我這里是slave1,如果讀庫有多個這里可以填讀池,也就是我在dbServer.xml中注釋掉的那個dbServer配置的信息。在這里就完成了讀寫分離(主寫從讀)的配置。我的配置中是把寫操作限制在了master中,把讀限制在了slave中,如果我把defaultPool改成master的話那么讀操作就會在master和slave之間做負載均衡了。
四、配置jvm運行參數
運行在jdk1.7環境中的amoeba要求xss參數必須大于228才能啟動JVM
所以在amoeba安裝目錄下的jvm.properties文件中進行參數設置:
1 # app名字2 APP_NAME=Amoeba-MySQL3
4 # app版本號5 APP_VERSION=3.0.0-beta6
7 # 日志輸出路徑,log4j中可引用參數 ${project.output}8
9 APP_OUTPUT_PATH=$PROJECT_HOME/logs10
11 # 應用程序的PID文件存放路徑, 默認存放在: ${project.home}/${APP_NAME}.pid12
13 #APP_PID_PATH=/temp/logs/$APP_NAME
14
15
16 # 控制臺輸出到日志文件17
18 APP_CONSOLE_LOG=$APP_OUTPUT_PATH/console.log
19
20
21 # 程序相關的配置參數22
23 #APP_OPTIONS="-DmyParam=value1 -DmyParam2=value2"24
25 # 啟動參數26
27 #APP_ARGS="args0 "28
29
30 # JVM相關的參數,包括內存配置、垃圾回收策略31
32 JVM_OPTIONS="-server -Xms512m -Xmx1024m -Xss512k -XX:PermSize=16m -XX:MaxPermSize=96m"33
34
35 # 應用程序忽略的信號列表,以逗號分割,程序shutdown的信號為15(可用 kill -15pid 可讓程序文明的shutdown,請不要在這兒填15)36
37 IGNORE_SIGNALS=1,2
如上所有的配置工作就已經完成了,可以看出amoeba所需的全部配置工作還是比較少的。
啟動amoeba:
啟動腳本在amoeba安裝目錄的bin目錄下運行lancher:
root@iZ25j1wvn7pZ:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/bin# ./launcher2016-12-12 21:38:05,748 INFO context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-3.0.4-BETA
log4j:WARN ip access configload completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/access_list.conf2016-12-12 21:38:06,037 INFO net.ServerableConnectionManager - Server listening on /127.0.0.1:8066.2016-12-12 22:14:44 [INFO] Project Name=Amoeba-MySQL, PID=2596 , System shutdown....2016-12-12 22:14:48 [INFO] Project Name=Amoeba-MySQL, PID=3324, starting...
log4j:WARN log4j configload completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/log4j.xml2016-12-12 22:14:49,405 INFO context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-3.0.4-BETA
log4j:WARN ip access configload completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/access_list.conf2016-12-12 22:14:49,664 INFO net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.2016-12-14 15:02:14 [INFO] Project Name=Amoeba-MySQL, PID=3324 , System shutdown....2016-12-14 15:02:20 [INFO] Project Name=Amoeba-MySQL, PID=12246, starting...
log4j:WARN log4j configload completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/log4j.xml2016-12-14 15:02:20,955 INFO context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-3.0.4-BETA
log4j:WARN ip access configload completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/access_list.conf2016-12-14 15:02:21,224 INFO net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.
運行結果如上所示表示啟動成功。
之后可以通過amoeba連接到數據庫,連接信息如下:
root@iZ25j1wvn7pZ:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/bin# mysql -h182.92.172.80 -P8066 -uamoeba -ppassword
Welcometo the MySQL monitor. Commands end with ; or\g.
Your MySQL connection idis 2049945506Server version: 5.1.45-mysql-amoeba-proxy-3.0.4-BETA (Ubuntu)
Copyright (c)2000, 2014, Oracle and/or its affiliates. Allrights reserved.
Oracleis a registered trademark of Oracle Corporation and/orits
affiliates. Other names may be trademarksoftheir respective
owners.
Type'help;' or '\h' for help. Type '\c' to clear the currentinput statement.
mysql>
五、amoeba服務測試
從連接的server version 可以看出連接數據可的實例是amoeba-proxy實例不是mysql實例,這樣就表示可以通過amoeba的訪問賬戶連接amoeba服務了。之后就可以進行測試了,首先向數據庫中添加一條記錄,可以看見數據同時更新到master和slave中,主從同步功能是可以用的。之后在slave上停止slave服務,再通過amoeba寫入數據,這時amoeba重新讀出的數據就沒有新插入的數據了,因為主從同步功能已經關掉了,寫入的數據在master中,沒有同步到slave中,而amoeba讀數據是從slave中讀取的,因此沒有新加入的數據。之后打開slave的同步服務,再在amoeba中讀取就可以讀到之前添加的數據了。整體測試下來就保證了amoeba實現了讀寫分離功能。
參考資料:
總結
以上是生活随笔為你收集整理的amoeba实现mysql主从读写分离_MySQL+Amoeba实现数据库主从复制和读写分离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个空间多个php网站,一个空间多个域名
- 下一篇: 电商销售分析之制作销售看板