背景
PolarDB
關系資料庫作為商業應用的核心,承載這無比重要的職責。不僅需要為上層服務提供高性能的事務服務,并且需要保證資料的原子性、一緻性、隔離性和持久性。通常初創企業都會選擇MySQL或者Postgres這樣較為成熟的開源免費産品搭建生産叢集,然而随着業務量的迅速增長,資料庫的性能和容量往往很快成為業務發展的瓶頸。選擇增加從庫和分庫分表的解決方式,固然可以一定成都緩解資料庫性能和容量的問題,然而與之對應的是運維成本的急劇增加。聘請專業DBA和購買商業版資料庫套件成本居高不下,有什麼低成本的解決方案呢?
阿裡雲PolarDB就是這個雲原生時代新的解決方案之一。
- 高可靠。依托于阿裡雲領先RDMA高速網絡,PolarDB采用了共享存儲的架構設計,徹底消解了資料庫主從同步延時問題,使得整個資料庫叢集在應對任何單點故障時,可以保證資料零丢失。
- 大容量。基于阿裡雲先進的自研分布式共享存儲技術,PolarDB不受限于單節點的規格,購買時無需關心容量,自動擴充,輕松應對上百TB級别的資料規模。
- 高性能。PolarDB深度優化的資料庫核心和存算分離的架構,計算能力最高可擴充至1000核以上,叢集版單庫最多可擴充到16個節點,滿足高并發場景對性能的要求。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yM1MmMwYGZhF2NzYTLhR2Mi1CNzMDNtcTYhJTL1MmYldzY1YTLygDM5ETO0QjN5MjNx8CX1QDN3cTNyIzLcdmbw9CXxIDMy8CXw8CXlVXc1l3Lc12bj5yayFGbu5ibkN2Lc9CX6MHc0RHaiojIsJye.png)
選擇PolarDB,不僅節省了資料庫系統的總成本,更是獲得了傳統資料庫解決方案無法匹敵的可靠性、容量和性能。
日志現狀
再好的資料庫産品也免不了需要進行日志審計、性能調優、錯誤監控以滿足安全合規、交易提速、故障響應等需求,通常這些需求都可以通過分析資料庫的日志得到滿足。目前PolarDB提供了以下4類日志:
日志類型 | 日志說明 |
審計日志 | 審計日志記錄了所有對資料庫的操作和狀态碼,包括DDL、DML等,幫助您更好地擷取SQL語句的具體資訊,進行錯誤排查、安全審計、SQL性能優化等。 |
性能名額 | 性能名額記錄了資料庫引擎的關鍵性能名額,如讀寫行數、IO操作數、緩存使用率等,幫助您更好地監控資料庫負載,指導調參擴容。 |
慢查詢日志 | 慢查詢日志記錄了查詢時長超過門檻值SQL,包括發起人、耗時、擷取鎖等待時間等資訊,幫助您洞察慢查詢和潛在的資料庫設計問題,進行SQL和索引調優。 |
錯誤日志 | 錯誤日志記錄了資料庫程序的關鍵事件,例如啟動、崩潰、打開資料庫檔案、資料同步等,幫助您了解資料庫執行個體的運作情況,協助處理資料庫故障。 |
然而,PolarDB内置的日志檢視能力對于滿足上述需求仍然存在這諸多不足。
- 缺乏全局視圖:PolarDB資産是分地展示的,缺乏跨地域的全局資産視圖。同時PolarDB的日志檢視功能是在單個執行個體下面,如果需要監控的執行個體比較多那日志監控的開啟、查詢會比較不便。
- 分析能力較弱:PolarDB控制台提供的日志查詢能力比較簡單,僅提供預定義幾個次元的篩選和排序能力,無法自定義SQL查詢,也不能基于自定義查詢結果采取行動,如進行告警。
- 存儲時間短:例如PolarDB的内置查詢界面僅能檢視最近1小時的性能名額與慢日志,逾時效的日志資料無法檢視,不利于運維問題追溯。
PolarDB Lens介紹
特性
PolarDB Lens是阿裡雲日志服務(SLS)團隊聯合PolarDB團隊釋出的一款PolarDB資料營運應用,其主要功能包括
- 全局PolarDB執行個體資産視圖:幫助使用者一覽全部叢集資産1,友善快捷地配置資料庫的審計日志、性能名額、慢日志以及錯誤日志的監控與分析。
- 分析能力和場景應用:依托于日志服務(SLS)平台的基礎能力,PolarDB Lens中使用者可以輕松對日志進行自定義SQL查詢、關聯查詢,同時内置了資料報表以滿足客戶在安全、性能、監控等場景下的業務需求2。
- 持久的日志存儲:PolarDB Lens為接入的全部4種PolarDB資料庫的日志提供可自定義的日志存儲時長,最長可達3000天,并且結合了日志服務(SLS)平台最新釋出的冷存儲能力,極大地降低了客戶資料長期存儲的成本3。
- 目前僅支援相容MySQL類型的PolarDB叢集執行個體。
- 目前僅有性能監控,更多場景應用建設中。
- PolarDB Lens内冷存UI內建預計21年12月底釋出。
接入管理--PolarDB叢集接入視圖
PolarDB Lens的的叢集接入頁面采用了跨地域全局視圖,所有地域的執行個體在一個頁面内以清單形式呈現,如下圖所示。
為了幫助客戶便捷地篩選所需執行個體,管理界面的偏左側展示了執行個體的名稱、地域、标簽、規格等關鍵屬性,并提供了篩選排序功能。偏右側則內建了審計日志、性能名額、慢查詢日志和錯誤日志4種日志類型的采集管理、狀态展示和查詢功能。對于已經開通采集的執行個體日志,其對應狀态會在浮層中展示,資訊包括:目标存儲庫的project名稱,logstore名稱,地域,存儲時長,并有跳轉查詢連結一鍵直達日志資料。如果已經開啟的采集不能正常工作,那麼頁面上會提示“采集異常”,幫助客戶發現問題。
注意:開啟審計日志的同時會開啟依賴的PolarDB SQL洞察服務,該服務為收費項目,收費标準可根據頁面提示跳轉查詢。性能名額、慢查詢日志和錯誤日志,無額外費用項目,僅收取基本的日志服務費用。
存儲管理--存儲目标庫視圖
PolardBB Lens的存儲目标庫頁面展示了所有存儲PolarDB日志資料的存儲庫,如下圖所示。
視圖中,以目标存儲庫為分組,展示了存儲庫的地域、儲存時間、采集執行個體數和存儲的日志類型。其中,調整資料儲存時間是這個界面的關鍵功能。為了滿足等保2.0等合規硬性要求,我們可能需要将審計日志的保留時長調整到180天以上,而為了控制成本,我們可能需要開啟冷存或者将非核心日志的保留時長縮短,這些操作都可以在這裡輕松完成。
場景應用--PolarDB性能監控
目前PolarDB已經開放了PolarDB性能監控這一場景應用,如下圖所示。
PolarDB性能監控提取了PolarDB性能名額中最關鍵的一些名額,如CPU使用率、記憶體使用率、已使用資料量、活躍連接配接數、QPS、TPS、緩沖池讀取命中率等,并将其可視化。篩選元件使得監控頁面可以針對某個異常叢集或者讀/寫執行個體進行單獨的名額分析。
産品入口--日志服務-雲産品Lens
性能資料探秘
名額介紹
PolarDB Lens提供了總共45個性能名額和秒級監控頻率友善您掌握叢集的運作狀态,并提供了7個Label可供細分助您快速定位運維問題。
詳細的名額資訊如下:
類别 | 字段 | 含義 |
基本 | mysql_cpu_ratio | CPU使用率 |
mysql_mem_ratio | 記憶體使用率 | |
操作統計 | mysql_qps | 每秒請求數。來源于show global status指令查詢結果中的Questions名額 |
mysql_tps | 每秒事務數。來源于show global status指令查詢結果中的Com_commit和Com_rollback名額之和 | |
mysql_mps | 每秒資料操作數。來源于show global status指令查詢結果中的Com_insert、Com_insert_select、Com_update 、Com_update_multi、Com_delete、Com_delete_multi、Com_replace、Com_replace_select名額之和 | |
mysql_com_delete | 每秒DELETE指令執行次數 | |
mysql_com_delete_multi | 每秒多表DELETE指令執行次數 | |
mysql_com_insert | 每秒INSERT指令執行次數 | |
mysql_com_insert_select | 每秒INSERT ... SELECT指令執行次數 | |
mysql_com_replace | 每秒REPLACE指令執行次數 | |
mysql_com_replace_select | 每秒REPLACE ... SELECT指令執行次數 | |
mysql_com_select | 每秒SELECT指令執行次數 | |
mysql_com_update | 每秒UPDATE指令執行次數 | |
mysql_com_update_multi | 每秒多表UPDATE指令執行次數 | |
mysql_innodb_rows_deleted | 每秒DELETE的行數 | |
mysql_innodb_rows_inserted | 每秒INSERT的行數 | |
mysql_innodb_rows_read | 每秒SELECT的行數 | |
mysql_innodb_rows_updated | 每秒UPDATE的行數 | |
存儲空間 | mysql_data_size | 資料空間的使用量 |
mysql_binlog_size | Binlog日志檔案的大小 | |
mysql_redolog_size | Redolog日志檔案的大小 | |
mysql_other_log_size | 其他日志檔案的大小 | |
mysql_sys_dir_size | 系統空間的使用量 | |
mysql_tmp_dir_size | 臨時空間的使用量 | |
引擎 | mysql_innodb_buffer_read_hit | 緩沖池的讀命中率 |
mysql_innodb_buffer_use_ratio | 緩沖池的使用率 | |
mysql_innodb_buffer_dirty_ratio | 緩沖池的髒塊率 | |
mysql_innodb_data_read | 每秒從存儲引擎讀取的資料量 | |
mysql_innodb_data_written | 每秒往存儲引擎寫入的資料量 | |
mysql_innodb_data_reads | 每秒從存儲引擎讀取的次數 | |
mysql_innodb_data_writes | 每秒往存儲引擎寫入的次數 | |
mysql_innodb_log_write_requests | 每秒寫日志的請求數量。來源于show global status指令查詢結果中的Innodb_log_write_requests名額 | |
mysql_innodb_os_log_fsyncs | 每秒同步日志資料到磁盤的次數。來源于show global status指令查詢結果中的Innodb_os_log_fsyncs名額 | |
mysql_created_tmp_disk_tables | 每秒建立的臨時表數量。來源于show global status指令查詢結果中的Created_tmp_disk_tables名額 | |
mysql_slow_queries | 每秒慢請求次數 | |
存儲IO | mysql_iops | 每秒讀寫總次數 |
mysql_iops_r | 每秒每秒讀次數 | |
mysql_iops_w | 每秒每秒寫次數 | |
mysql_iops_throughput | 每秒總I/O吞吐量 | |
mysql_iops_throughput_r | 每秒讀I/O吞吐量 | |
mysql_iops_throughput_w | 每秒寫I/O吞吐量 | |
網絡 | mysql_total_session | 每秒總連接配接數。來源于show processlist指令查詢結果中的統計資訊 |
mysql_active_session | 每秒活躍連接配接數。來源于show processlist指令查詢結果中的統計資訊 | |
mysql_kbytes_sent | 每秒輸出流量 | |
mysql_kbytes_received | 每秒輸入流量 |
詳細的Label資訊如下:
cluster_id | PolarDB叢集ID |
node_id | PolarDB節點ID |
type_role | 節點類型(讀寫、隻讀) |
owner_id | 所有者主賬号ID |
polardb_type | PolarDB相容性類型 |
db_version | PolarDB相容性版本 |
polardb_category | PolarDB系列 |
性能實驗
PolarDB的性能、可擴充性和成本效益是否如宣傳那樣驚人呢?我們通過實驗與單機MySQL的代表RDS雲産品做個對比。
PolarDB執行個體:類型MySQL 8.0相容,4核16G獨享型,1寫1讀。
RDS執行個體(相當于MySQL單機):類型MySQL 8.0,4核16G獨享型,本地SSD 500G。
我們使用Sysbench 0.5對資料進行一番測試,借此對資料庫的性能有一個基本的了解。我們選用olta.lua的腳本對資料進行測試,該腳本提供了混合讀寫測試,讀寫比例14:4,能較為綜合地反映出資料庫的性能水準。
首先,我們使用腳本向資料庫插入2千萬條資料,這個數字對于單機的MySQL已經可以構成一定的挑戰。
time ./sysbench --test='tests/db/oltp.lua' --oltp_tables_count=1 --report-interval=10 --oltp-table-size=20000000 --mysql-user=*** --mysql-password=*** --mysql-table-engine=innodb --mysql-host=*** --mysql-port=*** --mysql-db=*** --max-time=300 --max-requests=0 --oltp_skip_trx=off --oltp_auto_inc=off --oltp_secondary=off --oltp_range_size=100 --num-threads=1000 --percentile=99 --max-time=300 prepare
為了友善讀者了解,我們附上表結構。
CREATE TABLE `sbtest1` (
`id` int(10) unsigned NOT NULL,
`k` int(10) unsigned NOT NULL DEFAULT '0',
`c` char(120) NOT NULL DEFAULT '',
`pad` char(60) NOT NULL DEFAULT '',
KEY `xid` (`id`),
KEY `k_1` (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PolarDB耗時8m30.860s,RDS耗時6m57.367s,說明PolarDB相比于使用本地SSD的MySQL執行個體在寫入上可能沒有顯著優勢。
然後,我們開始執行讀寫測試5分鐘。
time ./sysbench --test='tests/db/oltp.lua' --oltp_tables_count=1 --report-interval=10 --oltp-table-size=20000000 --mysql-user=*** --mysql-password=*** --mysql-table-engine=innodb --mysql-host=*** --mysql-port=*** --mysql-db=*** --max-time=300 --max-requests=0 --oltp_skip_trx=off --oltp_auto_inc=off --oltp_secondary=off --oltp_range_size=100 --num-threads=1000 --percentile=99 --max-time=300 run
此時通過PolarDB Lens的性能監控可以觀測到壓測過程中的資源消耗和資料庫性能名額的變化情況。
此時,我們第一階段的測試已經完成,彙總PolarDB和RDS性能監控的資料如下:
執行個體産品 | RDS | |
99分位延時均值 | 1.43s | 2.31s |
QPS均值 | 28484 | 10223 |
TPS均值 | 1422 | 2075 |
96.81% | 92.03% |
從結果上看,PolarDB在讀多寫少的場景相比與MySQL單機具有顯著優勢。這一點也非常好了解,因為PolarDB預設為1寫1讀,天然比單機多一個隻讀計算節點。由于部分SQL非常慢,導緻了99分位的SQL延時較高,我們可以結合慢日志分析一下原因。
從圖中可以看到一條典型的慢SQL,但這與其他SQL無顯著差別,lock_time為0,并且我們已經通過建表語句确認了id字段索引已經建立。由于99分位延時過高,且通過PolarDB Lens的性能監控觀察到CPU使用率已經達到96%以上,我們嘗試擴充PolarDB的隻讀節點來提高查詢性能,同時測試PolarDB的性能擴充彈性。
節點數量 | 1寫1讀 | 1寫2讀 | 1寫3讀 | 1寫4讀 | 1寫5讀 |
0.95s | 0.74s | 0.67s | 0.62s | ||
38157 | 48959 | 54818 | 62150 | ||
1908 | 2443 | 2695 | 3054 | ||
95.83% | 95.85% | 94.74% | 94.42% |
第二階段的測試結果如表所示,可以看到PolarDB的QPS性能是随着節點數的增加而線性增長的,當配備1寫5讀時,62150的QPS均值達到了單機MySQL的6倍,這證明了PolarDB确實具備良好的性能彈性擴充特性。而計算一下成本,假設我們的業務恰好是這樣的query,并且需要6萬QPS的性能,使用PolarDB的月租費用為:2000(初始1寫1讀)+存儲1750(以500G計算)+440(隻讀節點)*4=5510/月,而使用RDS的月租費用為2500(主執行個體)+2254(讀寫執行個體)*4=11516/月(未計算讀寫分離代理費用)。由此可見在讀多寫少的場景下,使用PolarDB相比于傳統資料庫解決方案可大幅節省成本,同時還享受了存按量計費、資料強一緻、簡易運維的好處,确實可以稱得上成本效益驚人。
結語
PolarDB為企業提供了一種創新的高可靠高性能可擴充的資料庫解決方案,然而資料庫的世界從不簡單,作為業務的存儲核心圍繞資料庫展開的審計、性能、監控需求持續不斷,PolarDB Lens為客戶提供了一站式的資料庫資産概覽、日志采集管理、分析和場景應用落地的支援,是資料庫安全審計、性能優化、監控響應等解決方案中的可靠夥伴。
最後,給耐心看完文章小夥伴留一個思考題,在本測試中,資料庫的性能并不理想,是sysbench中的哪幾個開關對測試結果産生了不利影響呢?歡迎細心的小夥伴在評論區留言交流。
參考文獻
PolarDB Lens前端入口:
https://sls.console.aliyun.com/lognext/app/lens/polardbSLS各個雲産品日志應用文檔清單:
https://help.aliyun.com/document_detail/151620.html6倍性能差100TB容量,阿裡雲POLARDB如何實作?
https://developer.aliyun.com/article/214367智能冷熱分層存儲:
https://help.aliyun.com/document_detail/308645.html檢視性能監控名額:
https://help.aliyun.com/document_detail/68555.htmlSysbench使用指南:
https://developer.aliyun.com/article/797665- 歡迎釘釘掃群加入阿裡雲-日志服務(SLS)技術交流, 獲得第一手資料與支援
- 更多SLS的系列直播與教育訓練視訊會同步到微信公衆号、知乎與B站,敬請留意