AliSQL是阿裡雲深度定制的獨立MySQL分支,除了社群版的所有功能外,AliSQL提供了類似于MySQL企業版的諸多功能,如企業級備份恢複、線程池、并行查詢等,并且AliSQL還提供相容Oracle的能力,如sequence引擎等。RDS MySQL使用AliSQL核心,為使用者提供了MySQL所有的功能,同時提供了企業級的安全、備份、恢複、監控、性能優化、隻讀執行個體等進階特性。
1月9日,依托AliSQL核心的專屬主機組RDS MySQL服務即将重磅釋出!
- 時間: 1月9日15:00 — 17:00
- 主題: RDS專屬主機組和ECS專有主控端 聯合釋出會
- 詳情: https://promotion.aliyun.com/ntms/act/mysqlzhuanshuzhuji.html
- 預約直播!: https://yq.aliyun.com/live/1858
(需登陸阿裡雲賬号哦!)
本文作者:黃忠
MySQL代表了開源資料庫的快速發展,從2004年前後的Wiki、WordPress等輕量級Web 2.0應用起步,到2010年阿裡巴巴在電商及支付場景大規模使用MySQL資料庫,再到2012年開始阿裡雲RDS for MySQL為成千上萬家客戶提供可靠的關系資料庫服務,積累了來自内外部功能、性能、安全方面的衆多需求,培養了一支強勁的MySQL研發團隊,并打造了面向企業場景的AliSQL分支,高效演進并穩定地服務着内外部關鍵業務場景。
讓我們來一起看一下AliSQL中面向企業場景的設計及功能。
1、MySQL 8.0 Compatiable
MySQL 8.0有5個非常好的企業級功能,來逐一看一下:
🔸Atomic DDL,MySQL 8.0去掉了表結構frm檔案,實作了中繼資料資訊字典化,可以保證DDL操作處理或復原幹淨,避免了表删除不幹淨的情況。
🔸Instant Add Column,中繼資料字典化後,向表最後面加列(無預設值)時,可以隻更改資料字典,而不需要更改表資料,實作了極快速的加列。
🔸Window Function,視窗函數可以用來快速實作複雜的報表,在許多企業應用場景中都會出現。
🔸Temp Engine,執行特别複雜的SQL時,需要用到記憶體之外的臨時空間,以前版本會動态地建立和删除檔案,而在MySQL 8.0中,使用了集中式的Temp Engine,避免不停地建立和删除檔案,有效降低了檔案系統的壓力。
🔸Hash Join,MySQL 8.0中實作了Hash Join,可以加快多表(三表)以上關聯的SQL性能,在企業場景中由于業務邏輯複雜,多表關聯是常态,絕對的企業級功能。
我們在2019年推出了基于MySQL 8.0版本的AliSQL版本,遠遠領先于同行。
2、Dynamic Thread Pool
企業級場景(包括網際網路與非網際網路場景)的商業數字化程度越來越高,應用場景越來越豐富,RDS資料庫如何在有限資源(4c/8c規格,雲上彈性降底企業成本)的情況下提供高品質服務,會面臨以下挑戰:
🔸如何在有限的資源下,支援更多的資料庫連接配接數?
🔸如何支援更高的短連接配接能力?
🔸如何在有限的資源下,提高資源的使用效率,提升性能?
🔸如何進行并發控制或隔離,保證核心業務邏輯的穩定性?
Dynamic Thread Pool可以很好地解決上述問題,
🔸采用Listener & Worker機制,将所有請求放到Worker隊列中,由共享的Worker線程來執行不同使用者的請求,進而不需要每個用戶端會話都建立一個背景線程(非Dynamic Thread Pool)來執行請求,比如1000個用戶端連接配接發起請求,伺服器端隻需要數十個Worker線程即可,而不需要建立1000個線程,進而可以在有限資源内建立更多的連接配接。
🔸由于每個連接配接後面并不對應固定的線程,建立新連接配接時沒有線程的操作,是以建立新連接配接的成本大大降底,進而可以提供更高和更穩定的連接配接建立能力。
🔸通過控制了有限資源内的線程數,減少了線程切換,有效降低了SYS CPU的使用,提升了CPU的資源使用效率。在高并發的sysbench point select測試中,Dynamic Thread Pool可以提升10%左右的性能;在低并發時,Dynamic Thread Pool可以動态切換回專用模式,即每個連接配接都有專用的Worker對應,進而保證高低并發下都有極好的性能。
🔸在資料庫中有讀寫操作,SQL操作也可以分為簡單操作和複雜操作,為了防止互相影響,Dynamic Thread Pool設計了多個隊列,按SQL的操作成本将SQL進行分類,各自進入不同的隊列,并在隊列上進行并發的控制,進而可以隔離不同類型操作的互相影響。比如說核心業務邏輯中都是簡單查詢,建立應用未經評審的複雜SQL就不會影響核心邏輯。
🔸Dynamic Thread Pool可以動态啟停,不需要重新開機資料庫執行個體。這是AliSQL Dynamic Thread Pool一個非常重大的技術創新與突破。
Dynamic Thread Pool已經在RDS 5.6/5.7/8.0版本上線,并已經預設開啟,所有使用者和客戶都可以受益。TPCC模型最接近企業核心業務場景,在1024或2048用戶端并發的TPCC測試中,Dynamic Thread Pool可以提升50%-100%左右的TpmC,并節約10%到20%的CPU資源消耗,給阿裡雲所有客戶帶來實實在在的技術紅利。
3、Index Mutex Tuning
TPCC模型最接近企業核心業務場景,對此場景的優化可以讓企業應用受益。在TPCC的壓力測試中,發現Index的鎖非常重,在節點分裂時會阻塞所有的其他操作。AliSQL對此進行了優化,有效地降低了壓測過程中,索引節點分裂的成本,大大地提升了TPCC場景的處理能力。在全記憶體的測試中,單機達到了39W的TpmC,相對于原生版本提升35-50%不等(大規格測試,5.6提升35%、5.7提升40%、8.0進升45%)。
此優化已在RDS 56/57/80上同步優化釋出上線。
4、TDE & SM4
RDS 5.6/5.7/8.0都已經全線支援,并且支援SM4國密算法,可以確定客戶資料的安全。
5、Performance Insight
應用側的SQL優化對系統及業務的優化至關重要,原生的MySQL中缺少行之有效的監控資料,AliSQL結合不同資料庫的經驗,并結合内部外部客戶的需求,在SQL性能這塊做了豐富的擴充,包含以下五個方面的擴充:
🔸table_stats,記錄每個表增删除改查的行數,可以快速地了解現有系統中的資料存取行為,判斷業務的核心表,判斷哪些表适合來作緩存處理。
🔸index_stats,記錄用到的索引以及索引被使用的頻率,可以快速地了解索引的使用情況,判斷哪些索引是多餘的,判斷哪些索引是核心的索引。
🔸Performance Point,記錄了每個SQL的細粒度性能資料,包括SQL語句的時間(包括消耗時間、執行時間、Server層MDL鎖的時間、事務鎖的時間)、SQL IO的資訊(包括這條SQL引起的資料讀、資料寫、日志生成、記憶體通路、實體讀寫的量及IO時間)、以及核心層面的鎖(包括Mutex、RW Lock)的次數和時間。很容易找到值得優化的SQL語句,如果有一定的源代碼能力,也可以分析和改進MySQL的鎖機制。
🔸Performance Agent,使用内置Daemon程式,在同一時間點收集不同唯度(CPU、記憶體、網絡、磁盤IO、Server、InnoDB、Linux Kernel、File System)的關鍵性能資料,每秒收集一次,以格式化文本方式在背景記錄,便于事後進行性能分析,同時也是記憶體表的方式提供通路,友善客戶直接使用Grafana等工具來展示RDS資料庫性能曲線。
🔸IO_STATISTICS,記錄執行個體級各種不同IO的總量及時間,預設每2秒一個值(可配置),可以直接使用Grafana等工具來展示。
在仔細分析原生Performance Schema後,AliSQL中增加了這些額外的性能相關的資料,如實地反映了系統的運作情況,友善我們進行事後性能問題診斷,也友善了客戶進行SQL性能分析,也可以讓第三方基于這些性能資料來為客戶提供更好的性能優化服務。
6、Async File Purge
在檔案系統中删除一個特别大的檔案(Drop Table/Partition、Truncate Table/Partition)時,可能會鎖定整個檔案系統,導緻同一個檔案系統上的其他操作無法進行,阻塞整個執行個體。AliSQL中對這種行為進行了優化,當接到删除表或分區的操作時,會記一個檔案異步清理的任務,将表或分區的操作先做完,然後由背景線程以相對溫和的方式進行清理。其原理是将大檔案一步一步變小,到某個安全大小後,才徹底删除檔案。
7、Slow Log Rotate
某些業務場景下,會産生大量的慢SQL語句,會被記錄在慢日志中,而原生的MySQL一直使用單個檔案機制會一直保持Slow Log檔案打開,導緻檔案變得特别大(可高在上百GB),需要在關閉MySQL執行個體的情況下,才能對Slow Log檔案進行維護,非常地不友好。
AliSQL對此作出了改進,設計了Slow Log切換機制,可以定時或到指定大小後進行切換(切換指令由外部觸發),避免需要重新開機資料庫執行個體來維護Slow Log檔案(比如釋放Slow Log空間)。其間還修複了以CSV格式存放Slow Log時,SQL執行時間範圍超過35天(通常是Binlog Dump指令)引起的損壞問題。
8、SQL Outline
SQL Hint是非常有效的優化手段,AliSQL對SQL Hint做了功能擴充,可以在運作過程中将SQL計算中的路徑資訊用相應的SQL Hint進行持久化儲存,以保證執行計劃的穩定性。可以有效應對以下場景下的SQL執行計劃變更:
🔸資料庫版本更新,優化器行為會發生變化,SQL計算計劃可能變好也可能變壞。
🔸DDL操作,建立索引後,會導緻原有的SQL執行計劃發生變化。
🔸統計資訊發生變化,重新收集或人工設定後,SQL執行計劃可能發生變化。
對于核心業務的SQL,應當使用SQL Outline進行固化,避免SQL執行計劃變壞。
AliSQL還提供API進行SQL Hint編輯,即可以手工給SQL加一個Hint,進行透明的SQL優化,可以在無法更改應用程式代碼的情況下進行SQL優化。并在此基礎上,與AliSQL其他的優化功能進行內建,比如Statement Queue、Query Cache(研發中)等,可以通過在SQL Outline中指定Hint來啟用Statement Queeu的并發控制,或啟用Query Cache,實作對應用透明的SQL優化。
9、Binlog XA Tuning
MySQL的邏輯日志(Binlog)給資料訂閱帶來了極大的便捷性,但也給性能帶來了負面影響。在服務客戶的過程中,我們發現企業場景對性能的要求越來越高,便對啟用Binlog後的事務送出機制進行了重大的技術突破,在不影響Binlog的前提下,去除了XA機制帶來的所有負面性能影響,相較于原生的MySQL,事務處理性能提升将近一倍。更實作了事務送出的Pipeline機制,交由Dynamic Thread Pool的線程去回複使用者事務送出結果,進一步降底了線程池的線程數,提升了系統處理效率。
10、DDL Recycle Bin
在MySQL中DDL語句是無法復原的,是以Drop/Truncate表或分區的操作會變得極期危險,在商業資料庫中也是如此。
Oracle在10g中加入了資源回收筒的功能,可以将Drop/Truncate的表或分區先放到資源回收筒中,後續根據空間的使用情況,按先進先出的政策自動回收。這樣就可以在Drop/Truncate誤操作手,從資源回收筒中快速恢複資料,而不需要進行執行個體基于時間點的恢複來找回誤操作的表,AliSQL在8.0上也實作了此資源回收筒功能。
AliSQL還有其他的企業級功能,例如Sequence引摯、Statement Queue等,在這裡不一一詳細解釋。
從業務中找需求,從技術中找需求,從運作維護中找需求,從合作夥伴中找需求,所有的需求方都是我們的客戶,一直緻力于讓AliSQL更加開放更加面向企業級應用。
大型企業資料庫服務首選,專屬主機組RDS MySQL服務重磅釋出!
- https://yq.aliyun.com/live/1858?spm=a2c4e.11155435.0.0.47c97796lYEQzh&do=login&accounttraceid=14d775f2522241d4871f6aab6e95e597anna
👇