360 Atlas生產環境使用心得
一、Atlas介紹
Atlas是360開源的一個Mysql Proxy,以下是官方介紹:
Atlas是由 Qihoo 360公司Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的資料中間層專案。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了很多功能特性。目前該專案在360公司內部得到了廣泛應用,很多MySQL業務已經接入了Atlas平臺,每天承載的讀寫請求數達幾十億條。同時,有超過50家公司在生產環境中部署了Atlas,超過800人已加入了我們的開發者交流群,並且這些數字還在不斷增加。
https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
以下是其github程式碼庫:https://github.com/Qihoo360/Atlas
主要功能:
1.讀寫分離
2.從庫負載均衡
3.IP過濾
4.自動分表
5.DBA可平滑上下線DB
6.自動摘除宕機的DB
“自動分表”需要打引號,對於新表是沒問題的;
如果是一張有歷史資料的表需要拆分,Atlas是不會幫我們拆分的,就需要自己寫工具遷移。
二、安裝
1、從官網下載相應版本,我們選擇的是2.2.1;
https://github.com/Qihoo360/Atlas/releases
分表的方式有2種,1是單機分表,另1種是支援跨機器分表,可以根據情況選擇,我們選擇的是單機分表的,即一張總表拆成多張子表,子表和總表都在一個Mysql例項上。
2、安裝
因為是rpm安裝,直接用rpm命令安裝就可以了:
rpm -i Atlas-2.2.1.el6.x86_64.rpm
預設安裝目錄為/usr/local/mysql-proxy。
啟動命令
/usr/local/mysql-proxy/bin/mysql-proxyd test start
test表示哪個例項
配置檔案在 usr/local/mysql-proxy/conf下,每個配置檔案表示一個例項;
3、配置說明
以下是常用的配置項:
配置 |
說明 |
---|---|
admin-username | 後臺管理員賬號 |
admin-password | 後臺管理員密碼 |
proxy-backend-addresses | Mysql例項,多項以,(逗號)分隔 |
pwds |
密碼,必須和Mysql例項的密碼一樣, 用安裝目錄 bin目錄下的加密程式encrypt加密 |
event-threads | 工作執行緒數,對效能影響大 |
sql-log | SQL日誌的開關,可設定為OFF、ON、REALTIME,OFF代表不記錄SQL日誌,ON代表記錄SQL日誌,REALTIME代表記錄SQL日誌且實時寫入磁碟 |
proxy-address | Atlas監聽的工作介面IP和埠 |
tables | 分表設定,此例中person為庫名,mt為表名,id為分表字段,3為子表數量,可設定多項,以逗號分隔,若不分表則不需要設定該項 |
關鍵引數:
proxy-backend-addresses:後端Mysql例項地址
tables:分表引數,格式:
資料庫名.表名.分表字段.子表數量
舉1個栗子,假如我們在做社群,社群主要功能是發帖和回帖,那主要是2張表(只是為了演示,不會把真實實際場景所有欄位加上):
帖子表(posts)
欄位名 | 型別 | 說明 |
tid | int | 帖子id |
title | varchar(200) | 帖子標題 |
content | text | 帖子內容 |
回覆表(replies)
欄位名 | 型別 | 說明 |
pid | int | 回覆id |
tid | int | 帖子id |
uid | int | 使用者id |
content | text | 回覆內容 |
create_time | datetime | 插入時間 |
假設這些表都在資料庫forums中,
如果我們要對replies進行分表,則tables這樣設定
forums.replies.tid.64
上面表示對replies進行分表,分表字段為tid,即所有tid相同的回覆會在同一張表,總共分64張表。
三、踩過的坑
1、Atlas不支援壓縮選項,以下連線是不行的
mysql_connect($dbhost, $dbuser, $dbpw, 1, MYSQL_CLIENT_COMPRESS);
正確的寫法
mysql_connect($dbhost, $dbuser, $dbpw, 1);
2. Count語句問題
分表後,count返回的結果會是針對多個表查詢的多個值(count結果為0的不返回),具體示例如下(當前分表為4張):
3. 分表後,如果刪掉主表,則不帶分表字段的查詢會報錯(如下圖);如果保留主表,則查詢的是主表資料。
4. 分頁問題
以上面舉例的場景來說,如果要從回覆表查詢uid為123,並且tid為100-200之間的記錄的第2頁(Discuz裡就是這樣查使用者的回覆的),每頁顯示10條,按時間倒序,就有可能返回為空了;
為什麼這樣呢,設想這樣一個場景,使用者一共有40條回覆,假設分佈在4張表中,並且分佈很均勻,每張表10條記錄,因為從每張子表取偏移10-20的記錄,子表返回為空了,實際是使用者是有資料的,正確的做法是從每張表取出前20條記錄,再合併然後進行分頁。
關於這個問題,我已經在另一篇文章詳細說明了,Mysql中介軟體360 Atlas踩坑
四、總結
1、如果你是新表,並且預見以後資料很大,可以用上Atlas來解決資料量的問題;
2、舊錶的話,你還得自己寫指令碼導資料,核對資料;
3、如果有些分頁查詢的話,還需要自己重寫;
4、確定你的所有場景的查詢是否都有分表字段作為where,沒有的話,需要自己再寫工具將子表的資料同步到總表;
可以看到Atlas如果需要產品化還要做很多的事情,如果確定上面都不是問題,就大膽的用吧~
往期精彩文章: