Atlas源代碼用C語言編寫,它對(duì)于WebServer相當(dāng)于是DB,相對(duì)于DB相當(dāng)于是Client,如果把Atlas的邏輯放到WebServer程序里去處理,這樣會(huì)大大增加WebServer程序的復(fù)雜度,同時(shí)WebServer和DB之間的耦合度也相當(dāng)高,因?yàn)橹灰狣B增加/減少服務(wù),WebServer就有可能要發(fā)生代碼改變,若代碼不改變,就得通過中間關(guān)系表與心跳機(jī)制來維護(hù)Server之間的關(guān)系,這樣會(huì)帶來性能的損耗,而Atlas是架設(shè)在WebServer與DB之間的一個(gè)中間件,WebServer與DB之間的耦合關(guān)系放到了Atlas來處理,既做到了靈活也保留了性能,這也是Atlas存在的價(jià)值。
Atlas支持表的水平切分,支持讀寫分離,對(duì)數(shù)據(jù)實(shí)時(shí)性要求較高的項(xiàng)目可以在select語句前增加強(qiáng)制讀主庫(kù),主從MySql數(shù)據(jù)庫(kù)之間數(shù)據(jù)的同步需要自己配置,主從MySql數(shù)據(jù)庫(kù)數(shù)據(jù)主從復(fù)制的配置方法參見博客:
http://blog.csdn.net/jhq0113/article/details/44263367
1.安裝
注意:只能安裝在64位的Linux操作系統(tǒng)上,CentOS官方建議rpm安裝方式
獲取地址:https://github.com/Qihoo360/Atlas/releases
目前最新的版本為:
Atlas-2.2.1.el5.x86_64.rpm CentOS5.* 版本
Atlas-2.2.1.el6.x86_64.rpm CentOS6.* 版本
我的環(huán)境是CentOS6.6 Basic Server x86_64
安裝命令:
[root@jhq0229src]# rpm -i Atlas-2.2.1.el6.x86_64.rpm
安裝位置:
/usr/local/mysql-proxy
配置文件:
/usr/local/mysql-proxy/conf/test.cnf
重要配置文件詳解:
(1)線程數(shù)
event-threads項(xiàng)設(shè)置,過小無法充分發(fā)揮多核CPU的性能,過大造成不必要的線程切換開銷,推薦設(shè)置為CPU的核數(shù)。
(2)最小空閑連接數(shù)(2.x以上版本不需要該項(xiàng),1.x版本需要)
min-idle-connections項(xiàng)設(shè)置,過小則在高并發(fā)下會(huì)有報(bào)錯(cuò),過大雖然不報(bào)錯(cuò)但在測(cè)試時(shí)不容易看出讀寫分離效果,推薦設(shè)置為比客戶端的并發(fā)峰值稍大,詳見《配置參數(shù)詳解》。上面的配置范例是針對(duì)Atlas2.X版本,沒有該選項(xiàng)。對(duì)于Atlas1.X版本的配置文件,需要加入該配置選項(xiàng)
(3)Atlas的工作端口
proxy-address項(xiàng)配置,例如proxy-address=0.0.0.0:1234代表客戶端應(yīng)該使用1234這個(gè)端口連接Atlas來發(fā)送SQL請(qǐng)求。
(4)Atlas的管理端口
admin-address項(xiàng)配置,例如admin-address=0.0.0.0:2345代表DBA應(yīng)該使用2345這個(gè)端口連接Atlas來執(zhí)行運(yùn)維管理操作。
(5)管理接口的用戶名和密碼
admin-username項(xiàng)和admin-password項(xiàng)設(shè)置,這兩項(xiàng)是用來進(jìn)入Atlas的管理界面的,與后端連接的MySQL沒有關(guān)系,所以可以任意設(shè)置,不需要MySQL在配置上做任何改動(dòng)。
(6)日志級(jí)別
以log-level項(xiàng)配置,分為message、warning、critical、error、debug五個(gè)級(jí)別。
(7)日志路徑
以log-path項(xiàng)配置,如log-path= /usr/local/mysql-proxy/log。
(8)主庫(kù)的IP和端口
proxy-backend-addresses =192.168.0.12:3306
(9)從庫(kù)的IP和端口,@后面的數(shù)字代表權(quán)重,用來作負(fù)載均衡,若省略則默認(rèn)為1,可設(shè)置多項(xiàng),用逗號(hào)分隔。如果想讓主庫(kù)也能分擔(dān)讀請(qǐng)求的話,只需要將主庫(kù)信息加入到下面的配置項(xiàng)中。
proxy-read-only-backend-addresses= 192.168.0.13:3306,192.168.0.14:3306
(10)用戶名與其對(duì)應(yīng)的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,用戶名與密碼之間用冒號(hào)分隔。主從數(shù)據(jù)庫(kù)上需要先創(chuàng)建該用戶并設(shè)置密碼(用戶名和密碼在主從數(shù)據(jù)庫(kù)上要一致)。比如用戶名為myuser,密碼為mypwd,執(zhí)行./encryptmypwd結(jié)果為HJBoxfRsjeI=。如果有多個(gè)用戶用逗號(hào)分隔即可。則設(shè)置如下行所示:
pwds= myuser: HJBoxfRsjeI=,myuser2:HJBoxfRsjeI=
(11)分表設(shè)置,此例中person為庫(kù)名,mt為表名,id為分表字段,3為子表數(shù)量,可設(shè)置多項(xiàng),以逗號(hào)分隔,若不分表則不需要設(shè)置該項(xiàng),子表需要事先建好,子表名稱為表名_數(shù)字,數(shù)字范圍為[0,子表數(shù)-1],如本例里,子表名稱為mt_0、mt_1、mt_2
tables= person.mt.id.3
------------------------------------------------------------------------------------------
我的配置:
1. [mysql-proxy]
2.
3. #管理接口的用戶名
4. admin-username = user
5.
6. #管理接口的密碼
7. admin-password = pwd
8.
9. #Atlas后端連接的MySQL主庫(kù)的IP和端口,可設(shè)置多項(xiàng),用逗號(hào)分隔
10. proxy-backend-addresses = 192.168.1.18:3306
11.
12. #從庫(kù)
13. proxy-read-only-backend-addresses = 192.168.1.16:3306@1
14. #用戶名和密碼配置項(xiàng),需要和主從復(fù)制配置的用戶名和密碼配置一樣
15. #pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc=
16. pwds = mastt:/iZxz+0GRoA=
17.
18. #后臺(tái)運(yùn)行
19. daemon = true
20.
21. keepalive = true
22.
23. #工作線程數(shù),對(duì)Atlas的性能有很大影響,可根據(jù)情況適當(dāng)設(shè)置
24. event-threads = 8
25.
26. #日志級(jí)別,分為message、warning、critical、error、debug五個(gè)級(jí)別
27. log-level = message
28.
29. #日志存放的路徑
30. log-path = /usr/local/mysql-proxy/log
31.
32. #SQL日志的開關(guān),可設(shè)置為OFF、ON、REALTIME,OFF代表不記錄SQL日志,ON代表記錄SQL日志,REALTIME代表記錄SQL日>志且實(shí)時(shí)寫入磁盤,默認(rèn)為OFF
33. #sql-log = OFF
34.
35. #慢日志輸出設(shè)置。當(dāng)設(shè)置了該參數(shù)時(shí),則日志只輸出執(zhí)行時(shí)間超過sql-log-slow(單位:ms)的日志記錄。不設(shè)置該參數(shù)
36. 則輸出全部日志。
37. #sql-log-slow = 10
38.
39. #實(shí)例名稱,用于同一臺(tái)機(jī)器上多個(gè)Atlas實(shí)例間的區(qū)分
40. #instance = test
41.
42. #Atlas監(jiān)聽的工作接口IP和端口
43. proxy-address = 192.168.1.18:8060
44.
45. #Atlas監(jiān)聽的管理接口IP和端口
46. admin-address = 192.168.1.18:2345
47.
48. #分表設(shè)置,此例中person為庫(kù)名,mt為表名,id為分表字段,3為子表數(shù)量,可設(shè)置多項(xiàng),以逗號(hào)分隔,若不分表則不需
49. 要設(shè)置該項(xiàng)
50. #tables = person.mt.id.3
51. tables=orders.my_orders.year.2015
52.
53. #默認(rèn)字符集,設(shè)置該項(xiàng)后客戶端不再需要執(zhí)行SET NAMES語句
54. charset = utf8
55.
56. #允許連接Atlas的客戶端的IP,可以是精確IP,也可以是IP段,以逗號(hào)分隔,若不設(shè)置該項(xiàng)則允許所有IP連接,否則只允
57. 許列表中的IP連接
58. #client-ips = 127.0.0.1, 192.168.1
59.
60. #Atlas前面掛接的LVS的物理網(wǎng)卡的IP(注意不是虛IP),若有LVS且設(shè)置了client-ips則此項(xiàng)必須設(shè)置,否則可以不設(shè)置
61. #lvs-ips = 192.168.1.1
----------------------------------------------------------------------------------------------
從以上配置可以清楚看到:
主庫(kù):192.168.1.18:3306
從庫(kù):192.168.1.16:3306 權(quán)重為1
注意:主從復(fù)制需要自行配置。
AtlasProxy的ip和端口為:192.168.1.18:8060
主從復(fù)制的用戶和密碼為:mastt 123456,以上的pwds的密碼是經(jīng)過加密處理的
若用Navicat登陸,就用AtlasProxy的ip和端口,用戶名和密碼用主從復(fù)制的,主從復(fù)制的賬戶需要設(shè)置可以在Navicat上登陸。
分表配置項(xiàng):
1. tables=orders.my_orders.year.2015
我的主從庫(kù)名稱是orders,里有三張表,分別是my_orders_0,my_orders_1,my_orders_2,按year字段進(jìn)行分表,雖然分了2015張表,但是你的數(shù)據(jù)庫(kù)里不一定有這么多張表,這里的2015只是取模的一個(gè)基數(shù),按照此規(guī)律去找到相應(yīng)的表,例如year=2015,數(shù)據(jù)請(qǐng)求會(huì)發(fā)送到my_orders_0表。
編寫簡(jiǎn)單Atlas的啟動(dòng)腳本:
[root@jhq0229 ~]#vim /etc/init.d/atlas
內(nèi)容如下:
-------------------------------?-----------------------------
授權(quán)并加入開機(jī)啟動(dòng)
[root@jhq0229 ~]#chmod +x /etc/init.d/atlas[root@jhq0229~]# chkconfig atlas on
啟動(dòng)atlas服務(wù)
[root@jhq0229 ~]#service atlas start
2.功能測(cè)試:
1).利用mastt用戶123456密碼Navicat登陸到192.168.1.18:8060查看數(shù)據(jù)庫(kù)表,開始數(shù)據(jù)庫(kù)中沒有數(shù)據(jù)。
表結(jié)構(gòu)如下:
1. CREATE TABLE `my_orders_0` (
2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '表主鍵',
3. `pid` int(10) unsigned NOT NULL COMMENT '產(chǎn)品ID',
4. `price` decimal(15,2) NOT NULL COMMENT '單價(jià)',
5. `num` int(11) NOT NULL COMMENT '購(gòu)買數(shù)量',
6. `person` varchar(255) NOT NULL COMMENT '客戶姓名',
7. `atime` int(10) unsigned NOT NULL COMMENT '下單時(shí)間',
8. `utime` int(10) unsigned NOT NULL COMMENT '修改時(shí)間',
9. `isdel` tinyint(4) NOT NULL DEFAULT '0' COMMENT '軟刪除標(biāo)識(shí)',
10. `year` smallint(5) unsigned NOT NULL COMMENT '年',
11. PRIMARY KEY (`id`)
12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入數(shù)據(jù)
1. INSERT INTO `my_orders`(`pid`,`price`,`num`,`person`,`atime`,`utime`,`year`) VALUES ('1', '123.54', '1', '周潤(rùn)發(fā)', '1426335606', '1426335606','2015');
2. INSERT INTO `my_orders`(`pid`,`price`,`num`,`person`,`atime`,`utime`,`year`) VALUES ('3', '13.67', '4', '周迅', '1426338765', '1426338765', '2016');
3. INSERT INTO `my_orders`(`pid`,`price`,`num`,`person`,`atime`,`utime`,`year`) VALUES ('4', '44.44', '4', '郭敬明', '1426754324', '1426754324','2017');
此時(shí)我們會(huì)看到my_orders_0,1,2表中分別有一條數(shù)據(jù),15年的在0表,16年在1表,17年的在2表。
查詢測(cè)試,如果不指定表的全名,查詢時(shí)需要year字段作為where條件,否則不會(huì)通過,測(cè)試結(jié)果如下圖:
讀寫分離測(cè)試,為了達(dá)到測(cè)試效果,我們?cè)趶膸?kù)的my_orders_0表手動(dòng)添加一條數(shù)據(jù),語句如下:
1. INSERT INTO `my_orders_0`(`pid`,`price`,`num`,`person`,`atime`,`utime`,`year`) VALUES ('2', '212.54', '1', '梁朝偉', '1426335606', '1426335606','2015');
此時(shí),主庫(kù)的0表只有一條數(shù)據(jù),從表里有兩條數(shù)據(jù),如果我們執(zhí)行查詢語句
SELECT * FROMmy_orders WHERE`year`=2015出現(xiàn)一條結(jié)果,則都的是主庫(kù),若出現(xiàn)兩條則為從庫(kù),結(jié)果如下圖:
證明已經(jīng)讀的是從庫(kù)。
測(cè)試強(qiáng)制讀主庫(kù),若執(zhí)行語句 SELECT * FROM my_orders WHERE`year`=2015有兩條記錄則讀的是從庫(kù),如果是一條記錄都的是主庫(kù),測(cè)試結(jié)果只有周潤(rùn)發(fā)一條記錄。
至此,Atlas的配置完畢,如果將Atlas與Mysql表的分區(qū)聯(lián)合使用可以大大提高大數(shù)據(jù)的處理能力,希望可以幫助到你。
聯(lián)系客服