Atlas是由 Qihoo 360公司W(wǎng)eb平臺(tái)部基礎(chǔ)架構(gòu)團(tuán)隊(duì)開(kāi)發(fā)維護(hù)的一個(gè)基于MySQL協(xié)議的數(shù)據(jù)中間層項(xiàng)目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎(chǔ)上,修改了大量bug,添加了很多功能特性,目前該項(xiàng)目在360公司內(nèi)部得到了廣泛應(yīng)用。
下面是Atlas的架構(gòu)圖
Atlas的架構(gòu)圖
Atlas主要有以下功能
- 讀寫(xiě)分離
- 從庫(kù)負(fù)載均衡
- IP過(guò)濾
- 自動(dòng)分表(目前只支持在同一個(gè)庫(kù)中進(jìn)行分表)
- DBA可平滑上下線DB
- 自動(dòng)摘除宕機(jī)的DB
Atlas相對(duì)于官方MySQL-Proxy有以下優(yōu)勢(shì)
- 將主流程中所有Lua代碼用C重寫(xiě),Lua僅用于管理接口
- 重寫(xiě)網(wǎng)絡(luò)模型、線程模型
- 實(shí)現(xiàn)了真正意義上的連接池
- 優(yōu)化了鎖機(jī)制,性能提高數(shù)十倍
下面就一步一步帶大家去安裝和使用Atlas數(shù)據(jù)庫(kù)中間件
安裝Atlas-sharding_1.0.1-el6.x86_64.rpm包
大家可以從++https://github.com/Qihoo360/Atlas/releases++網(wǎng)站下載到最新的rpm包,推薦使用rpm包安裝
加密應(yīng)用訪問(wèn)mysql數(shù)據(jù)庫(kù)訪問(wèn)密碼
安裝好Atlas的rpm包之后,進(jìn)入到/usr/local/mysql-proxy/bin目錄,使用下面命令對(duì)密碼進(jìn)行加密
./encrypt tony ANDKNNypf4k= <--這個(gè)就是加密后的密碼
配置Atlas配置文件(/usr/local/mysql-proxy/conf/opentest.cnf)
[mysql-proxy] #帶#號(hào)的為非必需的配置項(xiàng)目 #管理接口的用戶名 admin-username = user #管理接口的密碼 admin-password = pwd12345 #Atlas后端連接的MySQL主庫(kù)的IP和端口,可設(shè)置多項(xiàng),用逗號(hào)分隔 proxy-backend-addresses = 10.10.57.206:3306 #Atlas后端連接的MySQL從庫(kù)的IP和端口,@后面的數(shù)字代表權(quán)重,用來(lái)作負(fù)載均衡,若省略則默認(rèn)為1,可設(shè)置多項(xiàng),用逗號(hào)分隔 proxy-read-only-backend-addresses = 10.10.57.207:3306@1,10.10.57.208:3306@1 #用戶名與其對(duì)應(yīng)的加密過(guò)的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,下行的user1和user2為示例,將其替換為你的MySQL的用戶名和加密密碼! pwds = tony:ANDKNNypf4k= #設(shè)置Atlas的運(yùn)行方式,設(shè)為true時(shí)為守護(hù)進(jìn)程方式,設(shè)為false時(shí)為前臺(tái)方式,一般開(kāi)發(fā)調(diào)試時(shí)設(shè)為false,線上運(yùn)行時(shí)設(shè)為true,true后面不能有空格。 daemon = true #設(shè)置Atlas的運(yùn)行方式,設(shè)為true時(shí)Atlas會(huì)啟動(dòng)兩個(gè)進(jìn)程,一個(gè)為monitor,一個(gè)為worker,monitor在worker意外退出后會(huì)自動(dòng)將其重啟,設(shè)為false時(shí)只有worker,沒(méi)有monitor,一般開(kāi)發(fā)調(diào)試時(shí)設(shè)為false,線上運(yùn)行時(shí)設(shè)為true,true后面不能有空格。 keepalive = true #工作線程數(shù),對(duì)Atlas的性能有很大影響,推薦設(shè)置成系統(tǒng)的CPU核數(shù)的2至4倍 event-threads = 2 #日志級(jí)別,分為message、warning、critical、error、debug五個(gè)級(jí)別 log-level = message #日志存放的路徑 log-path = /usr/local/mysql-proxy/log #SQL日志的開(kāi)關(guān),可設(shè)置為OFF、ON、REALTIME,OFF代表不記錄SQL日志,ON代表記錄SQL日志,REALTIME代表記錄SQL日志且實(shí)時(shí)寫(xiě)入磁盤(pán),默認(rèn)為OFF sql-log = REALTIME #實(shí)例名稱,用于同一臺(tái)機(jī)器上多個(gè)Atlas實(shí)例間的區(qū)分 instance = opentest #Atlas監(jiān)聽(tīng)的工作接口IP和端口 proxy-address = 0.0.0.0:1234 #Atlas監(jiān)聽(tīng)的管理接口IP和端口 admin-address = 0.0.0.0:2345 #分表設(shè)置,此例中person為庫(kù)名,mt為表名,id為分表字段,3為子表數(shù)量,可設(shè)置多項(xiàng),以逗號(hào)分隔,若不分表則不需要設(shè)置該項(xiàng) #tables = person.mt.id.3
啟動(dòng)Atlas服務(wù)
/usr/local/mysql-proxy/bin/mysql-proxyd opentest start
檢查Atlas服務(wù)狀態(tài)
ps -ef||grep -i mysql /usr/local/mysql-proxy/bin/mysql-proxyd opentest status
連接Atlas管理
mysql -h10.10.57.205 -P2345 -uuser -ppwd12345
連接好之后,可以使用select * from help;查看可以查看Atlas的管理命令
例如:查看mysql庫(kù)的讀寫(xiě)分離信息
mysql> SELECT * FROM backends; +----------+-------------------+-------+------+-------------+ | group_id | address | state | type | backend_ndx | +----------+-------------------+-------+------+-------------+ | -1 | 10.10.57.206:3306 | up | rw | 1 | | -1 | 10.10.57.207:3306 | up | ro | 2 | | -1 | 10.10.57.208:3306 | up | ro | 3 | +----------+-------------------+-------+------+-------------+ 3 rows in set (0.00 sec)
測(cè)試應(yīng)用連接Atlas服務(wù)
mysql -h10.10.57.205 -P1234 -utony -ptony Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 11 Server version: 5.0.81-log MySQL Community Server (GPL) Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> mysql> select * from test.t_test; +----+-------+ | id | name | +----+-------+ | 1 | test1 | | 2 | test2 | +----+-------+ 2 rows in set (0.00 sec)
通過(guò)查看sql運(yùn)行日志,可以看到應(yīng)用已經(jīng)實(shí)現(xiàn)了讀寫(xiě)分離和負(fù)載均衡
[08/30/2018 16:48:18] C:10.10.57.208:56858 S:10.10.57.206:3306 OK 13.602 "insert into t_test values('1','test1')" [08/30/2018 16:48:35] C:10.10.57.208:56858 S:10.10.57.206:3306 OK 12.519 "insert into t_test values('2','test2')" [08/30/2018 16:48:47] C:10.10.57.208:56858 S:10.10.57.208:3306 OK 0.414 "select * from t_test" [08/30/2018 16:48:47] C:10.10.57.208:56858 S:10.10.57.207:3306 OK 0.456 "select * from t_test" [08/30/2018 16:48:48] C:10.10.57.208:56858 S:10.10.57.208:3306 OK 0.413 "select * from t_test"
喜歡的同學(xué)可以關(guān)注我的公眾號(hào)(db_arch)(Mysql數(shù)據(jù)庫(kù)運(yùn)維與架構(gòu)設(shè)計(jì))