1.前言
mysql作為網際網路公司都會用到的資料庫,如果在使用過程中出現性能問題,會采用mysql的橫向擴充,使用主從複制來提高讀性能,要是解決寫入問題,需要進行分庫分表。本文不會去介紹mysql的高可用,本文主要介紹mysql的通路中間件(DAL)的一些實作方案。
2.Atlas
官網: https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
2.1.atlas簡介
Atlas是由 Qihoo 360公司Web平台部基礎架構團隊開發維護的一個基于MySQL協定的資料中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug,添加了很多功能特性。目前該項目在360公司内部得到了廣泛應用,很多MySQL業務已經接入了Atlas平台,每天承載的讀寫請求數達幾十億條。同時,有超過50家公司在生産環境中部署了Atlas,超過800人已加入了我們的開發者交流群,并且這些數字還在不斷增加。
2.2.atlas架構
Atlas是一個位于應用程式與MySQL之間中間件。在後端DB看來,Atlas相當于連接配接它的用戶端,在前端應用看來,Atlas相當于一個DB。Atlas作為服務端與應用程式通訊,它實作了MySQL的用戶端和服務端協定,同時作為用戶端與MySQL通訊。它對應用程式屏蔽了DB的細節,同時為了降低MySQL負擔,它還維護了連接配接池。

2.3.主要功能
1.讀寫分離
2.從庫負載均衡
3.IP過濾
4.自動分表
5.DBA可平滑上下線DB
6.自動摘除當機的DB
Atlas相對于官方MySQL-Proxy的優勢
1.将主流程中所有Lua代碼用C重寫,Lua僅用于管理接口
2.重寫網絡模型、線程模型
3.實作了真正意義上的連接配接池
4.優化了鎖機制,性能提高數十倍
3.Mysql router
http://dev.mysql.com/doc/mysql-router/en/
3.1.mysql router簡介
MySQL Router是mysql官方釋出的資料庫中間件,是處于應用client和dbserver之間的輕量級代理程式,它能檢測,分析和轉發查詢到後端資料庫執行個體,并把結果傳回給client。是mysql-proxy的一個替代品。其架構圖和功能如下。
3.2.mysql router架構
1.Router實作讀寫分離,程式不是直接連接配接資料庫IP,而是固定連接配接到mysql router。MySQL Router對前端應用是透明的。應用程式把MySQL Router當作是普通的mysql執行個體,把查詢發給MySQL Router,而MySQL Router會把查詢結果傳回給前端的應用程式。
2.從資料庫伺服器故障,業務可以正常運作。由MySQL Router來進行自動下線不可用伺服器。程式配置不需要任何修改。
3.主資料庫故障,由MySQL Router來決定主從自動切換,業務可以正常通路。程式配置不需要做任何修改。
MySQL Router讀寫分離原理:
MySQL Router接受前端應用程式請求後,根據不同的端口來區分讀寫,把連接配接讀寫端口的所有查詢發往主庫,把連接配接隻讀端口的select查詢以輪詢方式發往多個從庫,進而實作讀寫分離的目的。讀寫傳回的結果會交給MySQL Router,由MySQL Router傳回給用戶端的應用程式。
3.3.mysql router主要功能
MySQL Router的主要用途是讀寫分離,主主故障自動切換,負載均衡,連接配接池等。
4.Mycat
http://www.mycat.org.cn/
4.1.mycat簡介
Mycat是基于開源cobar演變而來,對cobar的代碼進行了徹底的重構,使用NIO重構了網絡子產品,并且優化了Buffer核心,增強了聚合,Join等基本特性,同時相容絕大多數資料庫成為通用的資料庫中間件。1.4 版本以後 完全的脫離基本cobar核心,結合Mycat叢集管理、自動擴容、智能優化,成為高性能的中間件。
一個徹底開源的,面向企業應用開發的大資料庫叢集
支援事務、ACID、可以替代MySQL的加強版資料庫
一個可以視為MySQL叢集的企業級資料庫,用來替代昂貴的Oracle叢集
一個融合記憶體緩存技術、NoSQL技術、HDFS大資料的新型SQL Server
結合傳統資料庫和新型分布式資料倉庫的新一代企業級資料庫産品
一個新穎的資料庫中間件産品
4.2.mycat架構
4.3.mycat主要功能
支援SQL92标準
遵守Mysql原生協定,跨語言,跨平台,跨資料庫的通用中間件代理。
基于心跳的自動故障切換,支援讀寫分離,支援MySQL主從,以及galera cluster叢集。
支援Galera for MySQL叢集,Percona Cluster或者MariaDB cluster
基于Nio實作,有效管理線程,高并發問題。
支援資料的多片自動路由與聚合,支援sum,count,max等常用的聚合函數。
支援單庫内部任意join,支援跨庫2表join,甚至基于caltlet的多表join。
支援通過全局表,ER關系的分片政策,實作了高效的多表join查詢。
支援多租戶方案。
支援分布式事務(弱xa)。
支援全局序列号,解決分布式下的主鍵生成問題。
分片規則豐富,插件化開發,易于擴充。
強大的web,指令行監控。
支援前端作為mysq通用代理,後端JDBC方式支援Oracle、DB2、SQL Server 、 mongodb 、巨杉。
支援密碼加密
支援服務降級
支援IP白名單
支援SQL黑名單、sql注入攻擊攔截
支援分表(1.6)
叢集基于ZooKeeper管理,線上更新,擴容,智能優化,大資料處理(2.0開發版)。
5.Cobar
https://github.com/alibaba/cobar/wiki
5.1.cobar簡介
Cobar是提供關系型資料庫(MySQL)分布式服務的中間件,它可以讓傳統的資料庫得到良好的線性擴充,并看上去還是一個資料庫,對應用保持透明。
産品在阿裡巴巴穩定運作3年以上。
接管了3000+個MySQL資料庫的schema。
叢集日處理線上SQL請求50億次以上。
叢集日處理線上資料流量TB級别以上。
5.2.cobar架構
5.3.cobar現狀
2013年阿裡的Cobar在社群使用過程中發現存在一些比較嚴重的問題,及其使用限制,後來在cobar的基礎上改良誕生mycat,也就是目前cobar的代替版,而且2013年之後就沒有版本更新了。
6.Amoeba
http://docs.hexnova.com/amoeba/
6.1.amoeba簡介
Amoeba(變形蟲)項目,該開源架構于2008年 開始釋出一款 Amoeba for Mysql軟體。這個軟體緻力于MySQL的分布式資料庫前端代理層,它主要在應用層通路MySQL的 時候充當SQL路由功能,專注于分布式資料庫代理層(Database Proxy)開發。座落與 Client、DB Server(s)之間,對用戶端透明。具有負載均衡、高可用性、SQL 過濾、讀寫分離、可路由相關的到目标資料庫、可并發請求多台資料庫合并結果。通過Amoeba你能夠完成多資料源的高可用、負載均衡、資料切片的功能
6.2.amoeba架構
6.3.amoeba現狀
目前作者已經停止維護。
7.Mysql proxy
7.1.mysql proxy簡介
MySQL Proxy是一個處于你的client端和MySQL server端之間的簡單程式,它可以監測、分析或改變它們的通信。它使用靈活,沒有限制,常見的用途包括:負載均衡,故障、查詢分析,查詢過濾和修改等等。
MySQL Proxy就是這麼一個中間層代理,簡單的說,MySQL Proxy就是一個連接配接池,負責将前台應用的連接配接請求轉發給背景的資料庫,并且通過使用lua腳本,可以實作複雜的連接配接控制和過濾,進而實作讀寫分離和負載平衡。對于應用來說,MySQL Proxy是完全透明的,應用則隻需要連接配接到MySQL Proxy的監聽端口即可。當然,這樣proxy機器可能成為單點失效,但完全可以使用多個proxy機器做為備援,在應用伺服器的連接配接池配置中配置到多個proxy的連接配接參數即可。
MySQL Proxy更強大的一項功能是實作“讀寫分離”,基本原理是讓主資料庫處理事務性查詢,讓從庫處理SELECT查詢。資料庫複制被用來把事務性查詢導緻的變更同步到叢集中的從庫。
7.2.mysql proxy現狀
自從mysql官網出現mysql router之後,mysql proxy就已經停止維護了。
8.用戶端分片
8.1.用戶端分片簡介
程式用戶端進行分庫分表。也就是直接在程式裡面進行資料庫和表的拆分,例如使用者表。根據使用者的UID,例如13678789,根據最後一位,可以拆分為0-9共10個資料庫,把尾号是0的存入db_user_0資料庫,尾号是1的存入db_user_1資料庫,select的時候也是一樣。然後根據倒數第二位,可以拆分為0-9共10張表,根據倒數第二的尾号寫入相應的表中。例如13678789這個UID的資訊,寫入db_user_9資料庫的table_user_8的表中。
8.2.優點
(1)不需要使用中間件對性能沒有影響
(2)通過代碼控制,可定義性強
9.阿裡雲DRDS産品
DRDS 産品簡介
DRDS 是一款基于 MySQL 存儲、采用分庫分表技術進行水準擴充的分布式 OLTP 資料庫服務産品,支援 RDS for MySQL 以及 POLARDB for MySQL,産品目标旨在提升資料存儲容量、并發吞吐、複雜計算效率三個方面的擴充性需求。
DRDS 核心能力采用标準關系型資料庫技術實作,建構與公共雲( cloud native ),配合完善的管控運維及産品化能力,使其具備穩定可靠、高度可擴充、持續可運維、類傳統單機 MySQL 資料庫體驗的特點。
DRDS 于公共雲和專有雲環境沉澱打磨多年,曆經各界天貓雙十一核心交易業務及各行業阿裡雲客戶業務的考驗。承載大量使用者核心線上業務,橫跨網際網路、金融&支付、教育、通信、公共事業等多行業,是阿裡巴巴集團内部所有線上核心業務及衆多阿裡雲客戶業務接入分布式資料庫的事實标準。
DRDS 産品特點
穩定
對于絕大部分應用而言,關系型資料庫所承擔的職責是整個資料管理系統中最為核心基礎的,不光直接影響到終端使用者的服務體驗,同時也是業務資料的最後一道保險,是以穩定性是資料庫最為核心的選型因素。
DRDS 的穩定性建立在對久經考驗的 MySQL 合理使用的基礎上,單機 MySQL 在高并發、大量資料存儲和複雜計算場景下,呈現出相對弱勢的狀态。
DRDS 将資料拆分到多個 RDS MySQL,使每個 RDS MySQL 承擔合适的并發、資料存儲和計算負載,各個 RDS MySQL 處于穩定狀态,DRDS 層面處理分布式邏輯,最終得到一個具有穩定可靠、高度擴充性的分布式關系型資料庫系統。
相比于全自研分布式 NewSQL 資料庫,DRDS 産品始終以持續穩定性和可運維性作為第一要務,同時通過标準資料庫技術彌補與單機資料庫的體驗差異,讓使用者便捷、快速地上手使用,充分發揮産品的業務價值。
高度可擴充
相比傳統單機關系型資料庫,DRDS 采用分層架構可確定在并發、計算、資料存儲三個方面均可線性擴充,通過增加 DRDS 節點 和 RDS for MySQL 執行個體達到水準擴充效果。
相比基于分布式存儲的新型 cloud native 資料庫,理論上 DRDS 的擴充性沒有上限,打消業務在快速發展的過程中針對資料庫擴充性産生的後顧之憂與運維壓力。
持續可運維
關系型資料庫對于絕大部分應用而言需要 7 * 24 小時穩定工作,持續可運維是資料庫的核心關鍵能力。
DRDS 在公共雲和專有雲持續深耕多年,提供豐富的産品化能力及完備的運維體系,通過完整的 OpenAPI 可讓業務自行定時與內建。
生命周期管理
執行個體建立、重新開機、釋放
資料庫建立、删除
資料白屏化操作
容量管理
水準拆分、垂直拆分
讀寫分離
分析型隻讀執行個體
并發型隻讀執行個體
彈性變配
平滑擴容、熱點擴容
拆分變更
安全與審計
VPC
IP 白名單
賬号與權限管理
SQL 審計與分析
容災管理
一體化備份恢複(快速&一緻性)
SQL 閃回
表資源回收筒
多可用區執行個體容災部署
監控告警
自有分層監控
雲監控接入與關鍵名額報警管理
通過 RDS for MySQL 提供穩定的存儲支援,DRDS 核心專注于分布式 SQL 層,整個分布式 SQL 層如同大部分單機關系型資料庫,分為網絡和協定層、SQL 解析層、優化層和執行層。其中優化層包含邏輯優化和實體優化,執行層包含單機兩階段執行、單機并行執行( Parallel Query )和多機并行執行( DAG ),采用多種傳統單機資料庫優化和執行技術。
與單機資料庫不同的是,DRDS 将資料拆分邏輯加入到了 SQL 優化和執行過程中,與其他分布式資料庫不同的是,在面向 OLTP 場景時,DRDS 着重關注因分布式而帶來的代價,提供了包括自定義資料拆分、算子 move-arround 和 pushdown、join 和 aggregation 的 co-located 優化和計算、分布式事務的處理和優化、分布式全局二級索引、面對遠超單機資料容量的外置 DAG 計算等技術。
DRDS 不斷滿足業務對關系型資料庫在并發、存儲、計算三個方面的擴充性需求,通過積極評估業界積累的資料庫技術與經驗、不斷出現的前沿技術,審慎選擇采用,持續為業務提供優良的體驗與穩定的保證。
業務架構
DRDS 在業務架構體系中所處的位置如下圖所示, DRDS 承擔着 OLTP 線上核心資料庫的職責與定位,可于資料內建、資料傳輸,緩存、大資料生态配合使用。
核心架構
DRDS 使用體驗相容 MySQL 體系 , 采用标準關系型資料庫技術實作,并且大幅度增強其适配分布式場景的能力,因為基于穩定可靠的 > MySQL 存儲,是以 DRDS 核心技術主要展現于分布式 SQL 層。
整個分布式 SQL 層如同大多數傳統單機關系型資料庫,分為網絡層、協定層、SQL 解析層、優化層和執行層,其中優化層包含邏輯優化> 和實體優化,執行層包含單機兩階段執行、單機并行執行和多機并行執行,應用了多種傳統單機資料庫優化和執行技術。
與單機資料庫不同的是,DRDS 将資料拆分邏輯加入到了 SQL 優化和執行過程中,并且和其他分布式資料庫不同的是,在面向 OLTP 場景時,DRDS 特别關注分布式所帶來的代價,提供了包括資料拆分的可定制化(指定拆分字段和拆分算法)、算子 move-arround 和 pushdown 、 join 和 aggregation 的 co-located 優化和計算 、分布式事務的處理和優化、分布式全局二級索引、面對遠超單機資料容量的外置 DAG 計算等核心技術。
部署架構
DRDS 服務部署在公有雲上,采取多種方式確定生産安全,其中包括
- 支援 VPC、IP 白名單、非對稱賬号密碼、TLS 等方式,確定資料服務安全
- 使用獨享高性能實體資源、執行個體間充分隔離、支援多可用區執行個體,確定資料服務穩定
- 支撐運維系統采用多 region 隔離部署、核心資料服務 SLA 與運維管控 SLA 解綁,確定運維體系穩定