Qihoo 360 altas 實踐

Qihoo 360 altas 實踐

簡介

Atlas是由 Qihoo 360公司Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了不少功能特性。目前該項目在360公司內部獲得了普遍應用,不少MySQL業務已經接入了Atlas平臺,天天承載的讀寫請求數達幾十億條。同時,有超過50家公司在生產環境中部署了Atlas,超過800人已加入了咱們的開發者交流羣,而且這些數字還在不斷增長。前端

主要功能:

  • 讀寫分離
  • 從庫負載均衡
  • IP過濾
  • 自動分表
  • DBA可平滑上下線DB
  • 自動摘除宕機的DB

架構

Atlas是由 Qihoo 360, Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它是在mysql-proxy 0.8.2版本的基礎上,對其進行了優化,增長了一些新的功能特性。360內部使用Atlas運行的mysql業務,天天承載的讀寫請求數達幾十億條。mysql

Atlas是一個位於應用程序與MySQL之間中間件。在後端DB看來,Atlas至關於鏈接它的客戶端,在前端應用看來,Atlas至關於一個DB。Atlas做爲服務端與應用程序通信,它實現了MySQL的客戶端和服務端協議,同時做爲客戶端與MySQL通信。它對應用程序屏蔽了DB的細節,同時爲了下降MySQL負擔,它還維護了鏈接池。Atlas的總體架構,可參考下面這兩幅圖:sql


atlas 安裝

硬件狀況

由於條件限制,使用額都是vm的虛擬機數據庫

主機名 IP 系統 備註
SH-DATA-01 192.168.31.11 CENTOS 6.8 x86-84 中間件端
SH-DATA-02 192.168.31.12 CENTOS 6.8 x86-84 數據庫主庫
SH-DATA-03 192.168.31.13 CENTOS 6.8 x86-84 數據庫從庫1
SH-DATA-04 192.168.31.14 CENTOS 6.8 x86-84 數據庫從庫2

這裏說明一下,第一臺虛機是手動安裝的的,安裝的時候MySQL也已經部署上了,這樣每臺啓動的MySQL的uuid都是同樣的,同步會出現如下問題vim

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs;
these UUIDs must be different for replication to work.後端

解決方法是,刪除或者備份data/ 下面的auto.cnf,而後重啓數據庫就能夠了。架構

注意事項

  1. Atlas只能安裝運行在64位的系統上。
  2. Centos 5.X安裝 Atlas-XX.el5.x86_64.rpm,Centos 6.X安裝Atlas-XX.el6.x86_64.rpm。
  3. 若是執行sudo rpm –i Atlas-XX.el6.x86_64.rpm,提示相似:「file /usr/local/mysql-proxy/bin/encrypt from install of Atlas-2.0.1-1.x86_64 conflicts with file from package Atlas-1.0.3-1.x86_64」錯誤,則表示該系統以前已經安裝過Atlas-1.0.3-1.x86_64,須要執行:sudo rpm –e Atlas-1.0.3-1.x86_64,將以前安裝的Atlas刪除掉,再執行sudo rpm –i Atlas-XX.el6.x86_64.rpm安裝新版本的Atlas。

安裝

  • 系統、數據安裝就很少說了。
  • atlas 咱們這裏選擇rpm安裝(官方文檔博客打不開了,只能用rpm安裝了)
wget http://olvimidkv.bkt.clouddn.com/Atlas-sharding_1.0.1-el6.x86_64.rpm
rpm -ivh Atlas-sharding_1.0.1-el6.x86_64.rpm

配置

配置文件修改

Atlas運行須要依賴一個配置文件(test.cnf)。在運行Atlas以前,須要對該文件進行配置。Atlas的安裝目錄是/usr/local/mysql-proxy,進入安裝目錄的conf目錄,能夠看到已經有一個test.cnf默認配置文件,咱們只須要對這個文件進行修改便可。併發

1.配置文件說明

[mysql-proxy]

#帶#號的爲非必需的配置項目

#管理接口的用戶名
admin-username = user

#管理接口的密碼
admin-password = pwd

#Atlas後端鏈接的MySQL主庫的IP和端口,可設置多項,用逗號分隔
proxy-backend-addresses = 127.0.0.1:3306

#Atlas後端鏈接的MySQL從庫的IP和端口,@後面的數字表明權重,用來做負載均衡,若省略則默認爲1,可設置多項,用逗號分隔
#proxy-read-only-backend-addresses = 127.0.0.1:3305@1

#用戶名與其對應的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,下行的user1和user2爲示例,將其替換爲你的MySQL的用戶名和加密密碼!
pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc=

#設置Atlas的運行方式,設爲true時爲守護進程方式,設爲false時爲前臺方式,通常開發調試時設爲false,線上運行時設爲true,true後面不能有空格。
daemon = true

#設置Atlas的運行方式,設爲true時Atlas會啓動兩個進程,一個爲monitor,一個爲worker,monitor在worker意外退出後會自動將其重啓,設爲false時只有worker,沒有monitor,通常開發調試時設爲false,線上運行時設爲true,true後面不能有空格。
keepalive = true

#工做線程數,對Atlas的性能有很大影響,可根據狀況適當設置
event-threads = 8

#日誌級別,分爲message、warning、critical、error、debug五個級別
log-level = message

#日誌存放的路徑
log-path = /usr/local/mysql-proxy/log

#SQL日誌的開關,可設置爲OFF、ON、REALTIME,OFF表明不記錄SQL日誌,ON表明記錄SQL日誌,REALTIME表明記錄SQL日誌且實時寫入磁盤,默認爲OFF
#sql-log = OFF

#慢日誌輸出設置。當設置了該參數時,則日誌只輸出執行時間超過sql-log-slow(單位:ms)的日誌記錄。不設置該參數則輸出所有日誌。
#sql-log-slow = 10

#實例名稱,用於同一臺機器上多個Atlas實例間的區分
#instance = test

#Atlas監聽的工做接口IP和端口
proxy-address = 0.0.0.0:1234

#Atlas監聽的管理接口IP和端口
admin-address = 0.0.0.0:2345

#分表設置,此例中person爲庫名,mt爲表名,id爲分表字段,3爲子表數量,可設置多項,以逗號分隔,若不分表則不須要設置該項
#tables = person.mt.id.3

#默認字符集,設置該項後客戶端再也不須要執行SET NAMES語句
#charset = utf8

#容許鏈接Atlas的客戶端的IP,能夠是精確IP,也能夠是IP段,以逗號分隔,若不設置該項則容許全部IP鏈接,不然只容許列表中的IP鏈接
#client-ips = 127.0.0.1, 192.168.1

#Atlas前面掛接的LVS的物理網卡的IP(注意不是虛IP),如有LVS且設置了client-ips則此項必須設置,不然能夠不設置
#lvs-ips = 192.168.1.1

2.重要配置說明

如下幾項配置參數對性能和正常運行起到重要做用,須要正確設置。負載均衡

(1)線程數

event-threads項設置,太小沒法充分發揮多核CPU的性能,過大形成沒必要要的線程切換開銷,推薦設置爲CPU的核數。

(2)最小空閒鏈接數(2.x以上版本不須要該項,1.x版本須要)

min-idle-connections項設置,太小則在高併發下會有報錯,過大雖然不報錯但在測試時不容易看出讀寫分離效果,推薦設置爲比客戶端的併發峯值稍大,詳見《配置參數詳解》。上面的配置範例是針對Atlas 2.X版本,沒有該選項。對於Atlas 1.X版本的配置文件,須要加入該配置選項。

3.可選配置說明

如下幾項能夠設置,也可使用默認值,區別不大。運維

(1)Atlas的工做端口

proxy-address項配置,例如proxy-address = 0.0.0.0:1234表明客戶端應該使用1234這個端口鏈接Atlas來發送SQL請求。

(2)Atlas的管理端口

admin-address項配置,例如admin-address = 0.0.0.0:2345表明DBA應該使用2345這個端口鏈接Atlas來執行運維管理操做。

(3)管理接口的用戶名和密碼

admin-username項和admin-password項設置,這兩項是用來進入Atlas的管理界面的,與後端鏈接的MySQL沒有關係,因此能夠任意設置,不須要MySQL在配置上作任何改動。

(4)日誌級別

以log-level項配置,分爲message、warning、critical、error、debug五個級別。

(5)日誌路徑

以log-path項配置,如log-path = /usr/local/mysql-proxy/log。

咱們的配置

如下是咱們的配置

[mysql-proxy]

#帶#號的爲非必需的配置項目

#管理接口的用戶名
admin-username = admin

#管理接口的密碼
admin-password = admin

#Atlas後端鏈接的MySQL主庫的IP和端口,可設置多項,用逗號分隔
proxy-backend-addresses = 192.168.31.12:3306

#Atlas後端鏈接的MySQL從庫的IP和端口,@後面的數字表明權重,用來做負載均衡,若省略則默認爲1,可設置多項,用逗號分隔
#proxy-read-only-backend-addresses = 127.0.0.1:3305@1
proxy-read-only-backend-addresses = 192.168.31.13:3306@1, 192.168.31.14:3306@1
#用戶名與其對應的加密過的MySQL密碼,密碼使用PREFIX/bin目錄下的加密程序encrypt加密,下行的user1和user2爲示例,將其替換爲你的MySQL的用戶名和加密密碼!
#pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc=
pwds = center:/iZxz+0GRoA=

#設置Atlas的運行方式,設爲true時爲守護進程方式,設爲false時爲前臺方式,通常開發調試時設爲false,線上運行時設爲true,true後面不能有空格。
daemon = true

#設置Atlas的運行方式,設爲true時Atlas會啓動兩個進程,一個爲monitor,一個爲worker,monitor在worker意外退出後會自動將其重啓,設爲false時只有worker,沒有monitor,通常開發調試時設爲false,線上運行時設爲true,true後面不能有空格。
keepalive = true

#工做線程數,對Atlas的性能有很大影響,可根據狀況適當設置
event-threads = 1

#日誌級別,分爲message、warning、critical、error、debug五個級別
log-level = message

#日誌存放的路徑
log-path = /usr/local/mysql-proxy/log

#SQL日誌的開關,可設置爲OFF、ON、REALTIME,OFF表明不記錄SQL日誌,ON表明記錄SQL日誌,REALTIME表明記錄SQL日誌且實時寫入磁盤,默認爲OFF
#測試的緣由,這個打開了。
sql-log = REALTIME

#慢日誌輸出設置。當設置了該參數時,則日誌只輸出執行時間超過sql-log-slow(單位:ms)的日誌記錄。不設置該參數則輸出所有日誌。
#測試環境打開
sql-log-slow = 1

#實例名稱,用於同一臺機器上多個Atlas實例間的區分
#instance = test

#Atlas監聽的工做接口IP和端口
proxy-address = 0.0.0.0:1234

#Atlas監聽的管理接口IP和端口
admin-address = 0.0.0.0:2345

#分表設置,此例中person爲庫名,mt爲表名,id爲分表字段,3爲子表數量,可設置多項,以逗號分隔,若不分表則不須要設置該項
#tables = person.mt.id.3
tables=business_center.fc_attendances.id.10

#默認字符集,設置該項後客戶端再也不須要執行SET NAMES語句
charset = utf8

#容許鏈接Atlas的客戶端的IP,能夠是精確IP,也能夠是IP段,以逗號分隔,若不設置該項則容許全部IP鏈接,不然只容許列表中的IP鏈接
client-ips = 192.168.31.12, 192.168.31.13, 192.168.31.14

#Atlas前面掛接的LVS的物理網卡的IP(注意不是虛IP),如有LVS且設置了client-ips則此項必須設置,不然能夠不設置
#lvs-ips = 192.168.1.1

使用

運行Atlas

進入/usr/local/mysql-proxy/bin目錄,執行下面的命令啓動、重啓或中止Atlas。

  • sudo ./mysql-proxyd test start,啓動Atlas。
  • sudo ./mysql-proxyd test restart,重啓Atlas
  • sudo ./mysql-proxyd test stop,中止Atlas。

數據庫的受權不要忘了

grant all privileges  on *.* to 'center'@'192.168.31.%' identified by '123456';

注意

  • 運行文件是:mysql-proxyd(不是mysql-proxy)。
  • test是conf目錄下配置文件的名字,也是配置文件裏instance項的名字,三者須要統一。
  • 可使用ps -ef | grep mysql-proxy查看Atlas是否已經啓動或中止。

執行命令:mysql -h127.0.0.1 -P1234 -u用戶名 -p密碼,若是能連上則證實Atlas初步測試正常,能夠再嘗試發幾條SQL語句看看執行結果是否正確

須要把127.0.0.1加到容許IP列表裏面,用戶名密碼使用 加密那個。

進入Atlas的管理界面的命令:mysql -h127.0.0.1 -P2345 -uuser -ppwd,進入後執行:select * from help;查看管理DB的各種命令。
mysql -h127.0.0.1 -P2345 -uadmin -padmin

若是提示密碼錯誤之類的,多是密碼沒有加密,使用/usr/local/mysql-proxy/bin/encrypt 123456 獲取加密值,而後修改配置文件,並建立用戶。

測試

mysql -h127.0.0.1 -P1234 -ucenter -p123456

create database hehe;
create table lala ( id int not null, name varchar(20) not null);
insert into lala values(1,"sunhong");

其它數據隨便插入,打開日誌

能夠看到,查詢是一比一的,插入就直連主庫了,錯誤的也會顯示出來,可是不顯示錯誤緣由。

相關文章
相關標籤/搜索