Atlas 讀寫分離
第1章 介紹
1.1 企業讀寫分離機分庫分表方案:
Mysql-proxy(oracle)
Mysql-router(oracle)
Atlas (Qihoo 360)
Atlas-sharding (Qihoo 360)
Cobar(是阿裏巴巴(B2B)部門開發)
Mycat(基於阿裏開源的Cobar產品而研發)
TDDL Smart Client的方式(淘寶)
Oceanus(58同城數據庫中間件)
OneProxy(原支付寶首席架構師樓方鑫開發 )
vitess(谷歌開發的數據庫中間件)
Heisenberg(
TSharding(蘑菇街白輝)
Xx-dbproxy(金山的Kingshard、當當網的sharding-jdbc )
amoeba
1.2 Atlas簡介:
Atlas是由 Qihoo 360公司Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了很多功能特性。目前該項目在360公司內部得到了廣泛應用,很多MySQL業務已經接入了Atlas平臺,每天承載的讀寫請求數達幾十億條
Atlas官方鏈接: https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
Atlas下載鏈接: https://github.com/Qihoo360/Atlas/releases
1.3 主要功能:
1. 讀寫分離,從庫負載均衡,自動分表,IP過濾
2. sql語句黑白名單,DBA平滑上下線,自動摘除故障機
1.4 使用場景:
Atlas是一個位於前端應用於後端數據庫之間的中間件,它使得應用程序員無需在關心讀寫分離,分表等於mysql相關的細節,可以專註於編寫業務邏輯,同時使得DBA運維工作對前端應用透明,上下線DB前端應用無感知
第1章 安裝Atlas
軟件獲取地址:https://github.com/Qihoo360/Atlas/releases
1.1 下載安裝:
curl https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
這裏已經下載好軟件,yum本地安裝即可:
yum localinstall -y Atlas-2.2.1-2.el7.centos.x86_64_\(1\).rpm Atlas-devel-2.2.1-2.el7.centos.x86_64_\(1\).rpm
1.1.1 Atlas都為我們安裝了什麽:
[root@db03 bin]# rpm -ql Atlas /etc/mysql-proxy/mysql-proxy.cnf /etc/rc.d/init.d/mysql-proxy #啟動腳本 /usr/bin/encrypt #制作密碼工具 /usr/bin/mysql-binlog-dump /usr/bin/mysql-myisam-dump /usr/bin/mysql-proxy
1.2 配置Atlas配置文件:
Atlas配置文件中的密碼需要進行加密,可以使用軟件自帶的加密工具進行加密
1.2.1 制作加密密碼:
[root@db03 bin]# encrypt 123 3yb5jEku5h4=
1.2.2 編寫配置文件:
[root@db03 mysql-proxy]# pwd /etc/mysql-proxy [root@db03 mysql-proxy]# vim mysql-proxy.cnf [mysql-proxy] admin-username = user admin-password = pwd proxy-backend-addresses = 10.0.0.51:3306 寫操作節點,也就是高可用的vip地址 proxy-read-only-backend-addresses = 10.0.0.52:3306,10.0.0.53:3306 讀操作節點 pwds = rep:3yb5jEku5h4=,mha:O2jBXONX098= daemon = true keepalive = true event-threads = 8 log-level = message log-path = /var/log/mysql-proxy/ sql-log=ON proxy-address = 0.0.0.0:33060 atlas代理的端口 admin-address = 0.0.0.0:2345 atlas管理節點的端口 charset=utf8
1.3 啟動atlas服務:
/etc/rc.d/init.d/mysql-proxy start
第2章 Atlas管理操作:
2.1 登錄管理接口:
mysql -uuser -ppwd -h127.0.0.1 -P2345
2.2 查看幫助信息:
mysql> SELECT * FROM help;
2.3 查看後端代理庫:
mysql> SELECT * FROM backends; +-------------+----------------+-------+------+ | backend_ndx | address | state | type | +-------------+----------------+-------+------+ | 1 | 10.0.0.55:3306 | down | rw | | 2 | 10.0.0.52:3306 | down | ro | | 3 | 10.0.0.53:3306 | up | ro | +-------------+----------------+-------+------+ 3 rows in set (0.00 sec)
2.4 平滑摘除代理庫:
mysql> REMOVE BACKEND 2; Empty set (0.00 sec) mysql> SELECT * FROM backends; +-------------+----------------+-------+------+ | backend_ndx | address | state | type | +-------------+----------------+-------+------+ | 1 | 10.0.0.55:3306 | down | rw | | 2 | 10.0.0.53:3306 | up | ro | +-------------+----------------+-------+------+ 2 rows in set (0.00 sec)
2.5 保存配置文件:
mysql> save config;
2.6 添加節點:
mysql> add slave 10.0.0.52:3306; Empty set (0.00 sec) mysql> SELECT * FROM backends; +-------------+----------------+-------+------+ | backend_ndx | address | state | type | +-------------+----------------+-------+------+ | 1 | 10.0.0.55:3306 | down | rw | | 2 | 10.0.0.53:3306 | up | ro | | 3 | 10.0.0.52:3306 | down | ro | +-------------+----------------+-------+------+ 3 rows in set (0.00 sec) mysql> save config; Empty set (0.01 sec)
2.7 數據庫查看負載情況:
通過atlas登錄數據庫,註意,這裏使用的是數據庫上存在的用戶及密碼
mysql -umha -pmha -h127.0.0.1 -P33060 mysql> show variables like "server_id"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 3 | +---------------+-------+ 1 row in set (0.37 sec) mysql> show variables like "server_id"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 2 | +---------------+-------+ 1 row in set (0.00 sec) mysql> show variables like "server_id"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | server_id | 3 | +---------------+-------+ 1 row in set (0.00 sec)
第3章 Atlas讀寫分離
讀寫分離說明:
atlas會透明的將事務語句和寫語句發送至主庫執行,讀語句發送至從庫執行
3.1 從庫負載均衡配置:
proxy-read-only-backend-addresses=ip1:port1@權重,ip2:port2@權重
3.2 讀寫分離測試
1. 設置從庫為只讀模式:
mysql> set global read_only=1;
2. 在主庫中添加普通用戶:
mysql> grant select ,update ,delete ,insert,create,drop on -> *.* to appuser@'10.0.0.%' identified by '123';
3. 添加到配置文件中
vim /etc/mysql-proxy/mysql-proxy.cnf pwds = rep:3yb5jEku5h4=,mha:O2jBXONX098=,appuser:3yb5jEku5h4=
4. 重啟altas服務
登錄數據庫
mysql -uappuser -p123 -h 10.0.0.53 -P 33060
進行寫操作進行測試:
mysql> create database jiang;
第4章 Atlas高級功能
4.1 企業中分庫分表的策略:
1. 垂直拆分---分庫
2. 垂直拆分---分表
3. 水平拆分---拆表
4. 水平拆分---分片
4.2 自動分表(取模):
使用自動分表時,首先需要在配置文件中設置tables參數tables參數設置格式:數據庫名;表明;分表字段;子表數量
比如:
你的數據庫名叫school,表名叫stu,分表字段叫id,總共分為2張表,那麽就寫為school.stu.id.2,如果還有其他的分表,以逗號分隔即可。
用戶需要手動建立2張子表(stu_0,stu_1,註意子表序號是從0開始的)。
所有的子表必須在DB的同一個database裏。
當通過Atlas執行(SELECT、DELETE、UPDATE、INSERT、REPLACE)操作時,Atlas會根據分表結果(id%2=k),定位到相應的子表(stu_k)。
例如,執行select * from stu where id=3;,Atlas會自動從stu_1這張子表返回查詢結果。
但如果執行SQL語句(select * from stu;)時不帶上id,則會提示執行stu表不存在。
4.2.1 atlas功能說明:
atlas暫不支持自動漸變耦合跨庫分表的功能
目前支持分表的語句有select delete update insert replace
4.3 IP過濾Lclient-ips
該參數用來實現IP過濾功能:
在傳統的開發模式中,應用程序直接連接DB,因此DB會對部署應用的機器(比如web服務器)的IP作訪問授權。
在引入中間層後,因為連接DB的是Atlas,所以DB改為對部署Atlas的機器的IP作訪問授權,如果任意一臺客戶端都可以連接Atlas,就會帶來潛在的風險。
client-ips參數用來控制連接Atlas的客戶端的IP,可以是精確IP,也可以是IP段,以逗號分隔寫在一行上即可。
如: client-ips=192.168.1.2, 192.168.2
這就代表192.168.1.2這個IP和192.168.2.*這個段的IP可以連接Atlas,其他IP均不能連接。如果該參數不設置,則任意IP均可連接Atlas。如果設置了client-ips參數,且Atlas前面掛有LVS,則必須設置lvs-ips參數,否則可以不設置lvs-ips。
SQL語句黑白名單功能: Atlas會屏蔽不帶where條件的delete和update操作,以及sleep函數。
第5章 Atlas-sharding版本
5.1 版本介紹:
sharding的基本思想就是把一個數據表中的數據切分成多個部分,存放到不同的主機上去,從而緩解單臺機器的壓力
sharding是一種水平切分,適用於單表數據龐大的情景,目前atlas支持靜態的
sharding方案,暫時不支持數據的自動遷移以及數據組的動態加入
Atlas以表為單位sharding,同一個數據庫內可以同時共有sharding的表和不sharding的表,不sharding的表數據存在未sharding的數據庫組中
目前Atlas sharding支持insert, delete, select, update語句, 只支持不跨shard的事務. 所有的寫操作如insert, delete, update只能一次命中一個組, 否則會報"ERROR 1105 (HY000):write operation is only allow to one dbgroup!"錯誤.
由於sharding取替了Atlas的分表功能, 所以在Sharding分支裏面, Atlas單機分表的功能已經移除, 配置tables將不會再有效.
5.2 Atlas-sharding架構:
1.1 sharding配置示例:
Atlas支持非sharding跟sharding的表共同存在同一個atlas中,2.2.1之前的配置可以直接運行,之前的配置如:
proxy-backend-addresses = 192.168.0.12:3306
proxy-read-only-backend-addresses = 192.168.0.13:3306,192.168.0.14:3306 ...
這配置了一個master和兩個slave,這屬於非sharding的組,所有非sharding的表跟語句都會發往這個組內,所以治安沒有sharding的atlas的表而已無縫的在新版本上使用
註意:沒有分片的組只能配置一個,而分片的組可以配置多個,下面的配置,配置了分片的組
[shardrule-0]
table = test.sharding_test
分表名,有數據庫+表名組成 t
ype = range
sharding類型:range 或 hash
shard-key = id
sharding 字段
groups = 0:0-999,1:1000-1999
分片的group,如果是range類型的sharding,則groups的格式是:group_id:id範圍。如果是hash類型的sharding,則groups的格式是:group_id。例如groups = 0, 1
[group-0] proxy-backend-addresses=192.168.0.15:3306 proxy-read-only-backend-addresses=192.168.0.16:3306 [group-1] proxy-backend-addresses=192.168.0.17:3306 proxy-read-only-backend-addresses=192.168.0.18:3306
1.2 Sharding限制
關於支持的語句
Atlas sharding只對sql語句提供有限的支持, 目前支持基本的Select, insert/replace, delete,update語句,支持全部的Where語法(SQL-92標準), 不支持DDL(create drop alter)以及一些管理語句,DDL請直連MYSQL執行, 請只在Atlas上執行Select, insert, delete, update(CRUD)語句.
對於以下語句, 如果語句命中了多臺dbgroup, Atlas均未做支持(如果語句只命中了一個dbgroup, 如 select count(*) from test where id < 1000, 其中dbgroup0範圍是0 - 1000, 那麽這些特性都是支持的)Limit Offset(支持Limit)
Order by
Group by Join
ON
Count, Max, Min等函數
增加節點
註意: 暫時只支持range方式的節點擴展, hash方式由於需要數據遷移, 暫時未做支持.
擴展節點在保證原來節點的範圍不改變的情況下, 如已有dbgroup0為範圍0 - 999, dbgroup1為範圍 1000-1999, 這個時候可以增加範圍>2000的節點. 如增加一個節點為2000 - 2999, 修改配置文件, 重啟Atlas即可.
Atlas 讀寫分離