360 Atlas生產環境使用心得

1、Atlas介紹mysql

Atlas是360開源的一個Mysql Proxy,如下是官方介紹:git

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

https://github.com/Qihoo360/A..._ZH.mdgithub

如下是其github代碼庫:https://github.com/Qihoo360/A... redis

主要功能:sql

1.讀寫分離數據庫

2.從庫負載均衡後端

3.IP過濾架構

4.自動分表負載均衡

5.DBA可平滑上下線DB工具

6.自動摘除宕機的DB

「自動分表」須要打引號,對於新表是沒問題的;

若是是一張有歷史數據的表須要拆分,Atlas是不會幫咱們拆分的,就須要本身寫工具遷移。

2、安裝

一、從官網下載相應版本,咱們選擇的是2.2.1;

https://github.com/Qihoo360/A...

分表的方式有2種,1是單機分表,另1種是支持跨機器分表,能夠根據狀況選擇,咱們選擇的是單機分表的,即一張總表拆成多張子表,子表和總表都在一個Mysql實例上。

二、安裝

由於是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下,每一個配置文件表示一個實例;

三、配置說明

如下是經常使用的配置項:

配置項 說明
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 tables

關鍵參數:

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張表。

3、踩過的坑

一、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踩坑

4、總結

一、若是你是新表,而且預見之後數據很大,能夠用上Atlas來解決數據量的問題;

二、舊錶的話,你還得本身寫腳本導數據,覈對數據;

三、若是有些分頁查詢的話,還須要本身重寫;

四、肯定你的全部場景的查詢是否都有分表字段做爲where,沒有的話,須要本身再寫工具將子表的數據同步到總表;

能夠看到Atlas若是須要產品化還要作不少的事情,若是肯定上面都不是問題,就大膽的用吧~

往期精彩文章:

FastDFS不一樣步怎麼破

Dubbo2.7試用

redis-port支持前綴遷移

擴展Redis:增長Redis命令

相關文章
相關標籤/搜索