1. 程式人生 > >Atlas讀寫分離

Atlas讀寫分離

atlas

Atlas讀寫分離

第1章 介紹

1.1 企業讀寫分離機分庫分表方案:

Mysql-proxyoracle

Mysql-routeroracle

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=

3. 重啟altas服務

4. /etc/rc.d/init.d/mysql-proxy restart

登錄數據庫

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執行(SELECTDELETEUPDATEINSERTREPLACE)操作時,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這個IP192.168.2.*這個段的IP可以連接Atlas,其他IP均不能連接。如果該參數不設置,則任意IP均可連接Atlas。如果設置了client-ips參數,且Atlas前面掛有LVS,則必須設置lvs-ips參數,否則可以不設置lvs-ips

SQL語句黑白名單功能: Atlas會屏蔽不帶where條件的deleteupdate操作,以及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支持非shardingsharding的表共同存在同一個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的表跟語句都會發往這個組內,所以治安沒有shardingatlas的表而已無縫的在新版本上使用

註意:沒有分片的組只能配置一個,而分片的組可以配置多個,下面的配置,配置了分片的組

[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讀寫分離