天天看點

AliSQL開源功能特性

在2017線上技術峰會“阿裡開源項目最佳實踐”上,阿裡雲資料庫核心專家趙建偉(冷香)為大家帶來了“alisql開源功能特性”的演講。本文先簡要介紹了alisql以及其開源背景,重點說明了alisql已開源的功能,包括sequence engine、tokudb引擎支援和秒殺優化等,最後對alisql使用者issue和典型問題作了解答。

3月1号下午,雲栖社群将迎來2017線上技術峰會——“阿裡開源項目最佳實踐”。來自淘寶、天貓、阿裡雲、螞蟻金服的8位項目核心成員将現場剖析阿裡開源項目背後的技術實踐,分享開源經驗。其中,阿裡雲資料庫核心專家趙建偉(冷香)為大家帶來了“alisql開源功能特性”的演講。本文先簡要介紹了alisql以及其開源背景,重點說明了alisql已開源的功能,包括sequence engine、tokudb引擎支援和秒殺優化等,最後對alisql使用者issue和典型問題作了解答。

以下是精彩内容整理:

alisql是基于mysql官方版本的一個分支,由阿裡雲資料庫團隊維護,目前也應用于阿裡巴巴集團業務以及阿裡雲資料庫服務。該版本在社群版的基礎上做了大量的性能與功能的優化改進,增加更多監控名額,并針對電商秒殺、物聯網大資料壓縮、金融資料安全等場景提供個性化的解決方案。在通用基準測試場景下,alisql 版本比 mysql 官方版本有着 70% 的性能提升;在秒殺場景下,性能提升 100 倍。

alisql簡介

alisql 于2016年10月份正式開源,我們也同步了github的開源位址:

按照内部制定的節奏,我們希望開源的alisql能持續地保持活躍,是以在首頁上可以看到release notes自9月15号以來,一直不斷地更新,release notes中有詳細的本次釋出的相關内容、使用方法和注意問題, 4月1日我們也将有重要的features釋出。

alisql 也在首頁提供必要的資訊。最初的基礎版本希望領先于官方版本,以及在性能上有質的飛躍,希望在特定場景下我們是遙遙領先的,是以我們給出了benchmark測試樣例,在特定場景下有一些特定的優化,比如淘寶秒殺,我們專門做了benchmark,相對于其它分支有很大提升;16年11月份,我們合并了tokudb引擎,alisql以及官方提供的rds上都是支援tokudb引擎的,tokudb引擎對于大資料、物聯網等資料量大的場景下,會有很大的壓縮比,是以在特定場景下tokudb的支援也做了配套工具的改良,如alisqlbackup,多引擎支援上,我們希望對使用者是透明的,也開放出實體備份的工具在github上;我們也提供doc文檔,其中sequence engine這個feature,在官方和業界mysql分支上都還沒有這個功能,我們提供從設計到文法到使用配套工具,以及非常詳細的中英文文檔,使用者可以在首頁上看到一級的重要連結,對大家使用alisql有一定幫助。

alisql開源背景

alisql并不是一個從零開始的項目,它起于開源,汲取社群紅利,擁抱開源,促進社群發展。

alisql社群背景是基于官方大版本(mysql &

mariadb),緊跟小版本,汲取不同開源分支(percona,mariadb)技術紅利。集團背景是基于alibaba集團業務進行性能的改進。

alisql已開源功能介紹

<b>sequence</b>

engine

最初想法是在集團大範圍使用mysql之前,使用oracle時大量使用sequence,sequence用來生成單調的檔案,檔案又被業務方進行包裝加上日期或使用者辨別,便于進行天然使用者次元的分庫分表。這樣大範圍推廣mysql時,我們發現使用上不舒服的地方,如果想定制化遞增的補償等,相對于orcale或pg提供的sequence有一些不足,基于此,我們在mysql上移植sequence特性,希望在文法上相容到其它相關資料庫。

AliSQL開源功能特性

我們提供的文法基本和orcale類似,在擷取maxvalue提供兩個文法,一是select

from sequence,一是select for sequence,from子句希望相容到現有mysql方法,for擷取方法同時也相容了sqlserver的方法,我們先行在這部分做了相容和支援,現在alisql可以用select maxvalue for sequence擷取下一個值,每一次都會疊代步長,如果用select

maxvalue from sequence,獲得的是定義的資料,本身sequence在alisql中提供這樣的文法,在設計階段基于sequence engine實作文法,sequence本身設計是通過sequence handler來通路。資料存儲是以一張二維表的方式,所有屬性儲存在一行上,sequeence初始化是,先建立一張表,再插入一條記錄,如果在create sequence中設定了cache,我們會在sequence handler保留cache,從sequence擷取nextvalue時,隻需疊代cache裡面的值就可以了,不需要通路sequence handler底層基表,每當疊代nextvalue會有cache用完時,會面臨sequence的更新,select語句内部已經變成update語句,另外,sequence擷取的值是不允許復原的,是以我們開啟了autonomous transaction,我們也将sequence的邏輯備份更改成create table+insert文法。

<b>tokudb</b><b>引擎支援</b><b></b>

AliSQL開源功能特性

tokudb引擎是在10月份版本釋放出來的,在特定場景下可以有非常高的壓縮比,有一些單機資料庫在雲上的客戶,資料增長飛快,我們也希望在有限資源下盡量減少分庫分表的需求,不斷地壓榨單機所能提供的資源;異步寫、sata 盤親合,吞吐量很高;事務 acid 完整支援,并沒有犧牲任何事物特性;支援secondary clustering index,在innodb或其它樹形結構上,對二級索引使用上,如果查詢牽涉到二級索引以外的字段需要回表,如果主表與二級索引順序反差比較大,回表就變成非常離散的圖,為了減少離散圖的情況,在tokudb樹形結構上支援cluster。

<b>秒殺優化</b><b></b>

AliSQL開源功能特性

秒殺減庫存并沒有并行性可言(維護事務特性的情況下),10w的集中庫存放到1s内減完是不現實的,應用伺服器的反應是增加連接配接,大量的請求導緻cpu無法排程,當資料庫請求越來越慢時,應用伺服器的線程會被耗盡,請求如果滿足不了,會增加更多的資料庫連接配接,這就是常說的雪崩效應,雪崩是沒有辦法緩解的,如圖,當請求到2000量級時,資料庫基本沒有辦法響應。針對這個情況,我們做了排隊機制,當綿羊并發性可言時就不要消耗任何cpu等資源,在server上進行排隊,排隊隻消耗記憶體,保證資料庫請求到達率很高的情況下還有比較穩定的響應跟吞吐量。

<b>table/index</b>

statistics

AliSQL開源功能特性

我們還增加了一些統計資訊:

table的統計:

核心業務的讀寫比例如何,後期的擴充性是讀寫分離,還是水準拆分哪個更适合,基于資料分析業務模型,在架構上做出資料庫規劃,在容量提升過程中是非常好的資料指導。

index的統計:

索引使用的頻率和效率,哪些索引根本沒有使用,

可以drop掉。

<b>persistent auto_increment</b>

在自增元件上,我們也做了feature,自增元件維持記憶體的值,擷取值時會在記憶體中作計算,得到下一個值,插入時以此值插入到資料庫當中。初始化過程是邏輯的初始化,資料庫在這個表啟動時初始化table對象時,從表中選擇max id作為目前值,每次啟動都會從表中擷取目前最大值作為目前記憶體基準值使用,在曆史資料歸檔導緻資料沖突的背景下,我們提供了innodb_autoinc_persistent和innodb_autoinc_persistent_interval兩個參數配置,每次變更的auto_increment進行一次持久化,持久化位置為root page page_max_trx_id官方保留位置,目前已經合并到mariadb。

<b>semisync</b><b>優化</b><b></b>

AliSQL開源功能特性

semisync希望在主備部署的過程中,如果主庫送出時資料庫寫入日志能夠傳輸到備庫,傳完傳回ack在進行送出,保證主庫資料的持久化及時傳入到備庫。我們做了semisync靜态編譯優化,也做了lock_log鎖優化(lock_end_position)。

<b>表級别并行複制</b><b></b>

AliSQL開源功能特性

我們也在alisql開源了表級别的并行複制,對dba來說,備庫delay是很困擾的問題,影響資料庫安全和恢複時間等。我們在官方schema級别并行複制基礎上,提供了table級别的并行複制,并不須要求是不同資料庫,隻要是不同的表,就可以做到并行複制。

<b>io</b><b>限速</b><b></b>

io限速提供了以下兩個資訊:

統計資訊:logical_read、physical_sync_read和physical_async_read,可以對目前sql執行過程中産生多少讀取、io操作和邏輯操作有比較直覺的、可量化的資訊;

sql 實體io限制:“set rds_sql_max_iops= 100;”,可以達到目前執行的100/s iops。

<b>動态加字段(</b><b>next release)</b>

AliSQL開源功能特性

我們希望在簡單的加字段過程中做到動态的完成,通過變更innodb記錄格式,在原本格式上增加了n_fields,n_fields代表記錄中一共存儲多少字段,通過這種方式加字段後,會發現每一條記錄裡可能的個數都不一樣,是以我們加的每一個字段都是“非”,必須加在最後面,如果資料字典比記錄fields值多,我們要填充len值,圖中新的記錄格式變更字段隻需很少的時間,因為其中隻需做資料字典結構的變更,資料本身不做任何遷移和變更。

alisql使用者issue和典型問題

編譯指南:現階段不支援windows、不支援embeded,我們也提供了alisql

compiler guide,guide中詳細介紹alisql在編譯過程中需要的環境和參數。

參數優化:

AliSQL開源功能特性

我們給出了不同配置規格參數的樣例供使用者參考,其中有以前沒有公開的,也是後面要逐漸開放的。

秒殺使用指南:

AliSQL開源功能特性

針對特别的page,我們提供詳細介紹和測試腳本供大家參考。