公司最近說是數據庫中數據量比較大,好多是15/16年的數據,基本不用,但是堆在數據庫又嚴重影響性能,想找個方法解決掉它。所以,這個任務就這麼放到了我的頭上。
一、 目前問題
業務系統的業務表的數據量很大,嚴重影響性能,需要進行優化。
二、 問題解決方案
按照目前問題,對症下藥,我們需要對數據進行歸檔。目前市面上有幾個解決該問題的方案,可選用一種或多種進行優化
三、 方案一
3.1 TokuDB
RDS推出了數據壓縮的支持,在TokuDB引擎的幫助下,RDS for MySQL能以低於五分之一的存儲開銷來支持用戶大數據需求,進一步降低用戶的數據存儲成本。TokuDB是一個支持事務的MySQL引擎,擁有出色的數據壓縮能力和極低的資源消耗。
3.2 爲什麼要壓縮數據
當一個數據庫的數據空間達到TB級別時運維難度是非常高的。尤其是數據遷移和備份操作,不僅耗時將會成倍增長,而且成功率會有很大下降。另外無論用戶是自建數據庫還是使用雲服務,增長迅速的存儲空間都會帶來巨大的開支。
3.3 使用須知
- TokuDB可以大幅度降低存儲使用量和IOPS開銷
- TokuDB支持在線DDL,添加/刪除列和索引不會引起阻塞
- TokuDB無法支持外鍵Foreign Key
- TokuDB不適用於大量讀取的場景
3.4 操作步驟
首先說明版本要求:5.6及以上,5.6親測可行
1、配置TokuDB引擎
select sum(data_length) into @all_size from information_schema.tables where engine='innodb';
select sum(data_length) into @change_size from information_schema.tables where engine='innodb' and concat(table_schema, '.', table_name) in ('dba1.tbl1', 'db2.tbl2', 'db3.tbl3');
select round(@change_size/@all_size*100);
參數配置:
登錄RDS控制檯,將loose_tokudb_buffer_pool_ratio設置爲上步計算得到百分比。該參數需要重啓數據庫才能生效。
2、 開啓壓縮
RDS已推出數據不停機遷移服務
ALTER TABLE XXX ENGINE=TokuDB
3.5 優勢
1、高壓縮比,默認使用zlib進行壓縮,尤其是對字符串(varchar,text等)類型有非常高的壓縮比,比較適合存儲日誌、原始數據等。官方宣稱可以達到1:12。
2、在線添加索引,不影響讀寫操作
3、HCADER 特性,支持在線字段增加、刪除、擴展、重命名操作,(瞬間或秒級完成)
4、支持完整的ACID特性和事務機制
5、非常快的寫入性能, Fractal-tree在事務實現上有優勢,無undo log,官方稱至少比innodb高9倍。
6、支持show processlist 進度查看
7、數據量可以擴展到幾個TB;
8、不會產生索引碎片;
9、支持hot column addition,hot indexing,mvcc
3.6 缺點
1、不支持外鍵(foreign key)功能,如果您的表有外鍵,切換到 TokuDB引擎後,此約束將被忽略。
2、TokuDB 不適大量讀取的場景,因爲壓縮解壓縮的原因。CPU佔用會高2-3倍,但由於壓縮後空間小,IO開銷低,平均響應時間大概是2倍左右。
3、online ddl 對text,blob等類型的字段不適用
4、沒有完善的熱備工具,只能通過mysqldump進行邏輯備份
3.7 使用場景
1、訪問頻率不高的數據或歷史數據歸檔
2、數據表非常大並且時不時還需要進行DDL操作
接下來還要繼續調研一些新的適用方案,或許會有更優選擇或者可以一起使用的方案,我會將我調研到的新技術繼續更新的。