Percona TokuDB初試
◆ 緣起
最近在做個專案,它是一個報表系統
本來要用EDB(Postgres)但它的授權計算下來簡直是天價
所以又找了Greenplum要來做,測試後發現速度也無法滿足要求
最後想用MySQL的方案來試試。
◆ 關於TokuDB
它的詳細說明,就不一一細數,有興趣直接到官網 Percona
簡單來說呢,是一個高效能、高壓縮比支援ACID和MVCC的儲存引擎,非常適合用在寫密集型且日誌型的應用場景。
在官方的部落中有做了一個The MySQL Archive Storage Engine-Alternatives
對MyISAM、InnoDB、Archive和TokuDB的比較
在這些表中分別插入約2千萬筆的資料,其壓縮比如下:
TokuDB相關參數設定
tokudb_commit_sync=ON
# commit時是否要fsync log到硬碟
tokudb_directio=ON
# 是否開啟O_Direct I/O功能
tokudb_row_format=TOKUDB_ZLIB
# 壓縮模式,分別說明
TOKUDB_DEFAULT:預設的壓縮模式,採用Zlib library
TOKUDB_FAST:使用quicklz library壓縮
TOKUDB_SMALL:使用lzma library壓縮
除了上面三種方式之外,還可直接指定壓縮的library:
TOKUDB_ZLIB:使用Zlib library,提供中階的壓縮比和中階的CPU耗用
TOKUDB_QUICKLZ:提供輕量的壓縮比和較低的CPU耗用
TOKUDB_LZMA:提供最高壓縮比和最高的CPU耗用
TOKUDB_SNAPPY:使用snappy library,目標在於高效率及合理的壓縮比
TOKUDB_UNCOMPRESSED:關閉壓縮功能
tokudb_tmp_dir=/tmp
# 臨時表的目錄
tokudb_write_status_frequency =1
# 控制tokudb寫狀態的頻率,1表示每執行一個指令會更新一次
tokudb_read_status_frequency=1
# 控制tokudb讀狀態的頻率,1表示每執行一個指令會更新一次
tokudb_data_dir=/opt/percona56/data
# 指定tokudb的資料表存放位置
tokudb_log_dir=/opt/percona56/data
# 指定tokudb的log存放位置
tokudb_cache_size=1G
# 資料緩存的大小,類似於innodb_buffer_pool_size
tokudb_loader_memory_size=200M
# 限制批次載入程序將使用每個loader instance的記憶體大小
錯誤處理
最近在做個專案,它是一個報表系統
本來要用EDB(Postgres)但它的授權計算下來簡直是天價
所以又找了Greenplum要來做,測試後發現速度也無法滿足要求
最後想用MySQL的方案來試試。
◆ 關於TokuDB
它的詳細說明,就不一一細數,有興趣直接到官網 Percona
簡單來說呢,是一個高效能、高壓縮比支援ACID和MVCC的儲存引擎,非常適合用在寫密集型且日誌型的應用場景。
在官方的部落中有做了一個The MySQL Archive Storage Engine-Alternatives
對MyISAM、InnoDB、Archive和TokuDB的比較
在這些表中分別插入約2千萬筆的資料,其壓縮比如下:
Engine | Compression | Table size [MB] |
---|---|---|
InnoDB | none | 2272 |
InnoDB | KEY_BLOCK_SIZE=8 | 1144 |
InnoDB | KEY_BLOCK_SIZE=4 | 584 |
MyISAM | none | 1810 |
MyISAM | compressed with myisampack | 809 |
Archive | default | 211 |
TokuDB | ZLIB | 284 |
TokuDB | LZMA | 208 |
此表引用於Percona官方部落格
當然會有些限制內容,詳細就到官網上去看看
◆ 安裝
手冊裡寫說可以單獨下載TokuDB的plugin,並安裝在MySQL或MariaDB的資料庫中,我這次是直接用Percona Server原生的資料庫,所以就包含在整個tar包裡了。
安裝前記得有幾個設定要先處理,否則在啟動的時候會發生錯誤
- libjemalloc library
TokuDB需要libjemalloc 3.3.0以上的版本,如果是用tar包安裝的話,可以直接在lib/mysql/找到libjemalloc.so檔案,並且設定在my.cnf中:[mysqld_safe]
malloc-lib=/opt/percona57/lib/mysql/libjemalloc.so - Transparent huge pages
可以用指令先檢查目前OS上的設定是什麼:# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never ->表示啟用的
可以透過修改kernel來關閉:
如果是Linux 6的話,在/etc/grub.conf裡面修改:
在kernel那行的最後面加入 transparent_hugepage=never
在Linux 7的中,試過在Kernel的文件裡修改,但都沒生效,還沒研究出是什麼問題,所以只好先寫在/etc/rc.d/rc.local中讓它開機時自動執行:# vim /etc/rc.d/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
或者直接下指令讓它立即生效(重開機失效):
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# echo never > /sys/kernel/mm/transparent_hugepage/defrag
最後將此設定寫在my.cnf中
$ vim /etc/my.cnf
[mysqld_safe]
thp-setting=never
一定要寫在/etc/my.cnf中,因為在安裝plugin過程中,它也會去判斷設定檔中是否有此設定,若沒有的話會自動幫你寫入
如果你的設定檔放在其他路徑下,用軟連結指過去的話,它會自動幫你產生相同的檔案覆蓋在/etc/my.cnf中 - SELinux設定成disabled或至少要設定成Permissive
修改參數檔:# vim /etc/selinux/config
SELINUX=permissive
指令設定(重開機失效):
# setenforce 0
# getenforce ->檢查SELinux狀態
Permissive
資料庫安裝的過程一樣就不贅述,直接安裝TokuDB Plugin
利用ps_tokudb_admin安裝
$ ps_tokudb_admin --enable -uroot -proot
檢查最後一行Installing TokuDB engine...的INFO:如果出現Successfully則表示安裝成功啦!
進DB裡面驗證看看
mysql> show engines;
mysql> show plugins;
TokuDB相關參數設定
tokudb_commit_sync=ON
# commit時是否要fsync log到硬碟
tokudb_directio=ON
# 是否開啟O_Direct I/O功能
tokudb_row_format=TOKUDB_ZLIB
# 壓縮模式,分別說明
TOKUDB_DEFAULT:預設的壓縮模式,採用Zlib library
TOKUDB_FAST:使用quicklz library壓縮
TOKUDB_SMALL:使用lzma library壓縮
除了上面三種方式之外,還可直接指定壓縮的library:
TOKUDB_ZLIB:使用Zlib library,提供中階的壓縮比和中階的CPU耗用
TOKUDB_QUICKLZ:提供輕量的壓縮比和較低的CPU耗用
TOKUDB_LZMA:提供最高壓縮比和最高的CPU耗用
TOKUDB_SNAPPY:使用snappy library,目標在於高效率及合理的壓縮比
TOKUDB_UNCOMPRESSED:關閉壓縮功能
tokudb_tmp_dir=/tmp
# 臨時表的目錄
tokudb_write_status_frequency =1
# 控制tokudb寫狀態的頻率,1表示每執行一個指令會更新一次
tokudb_read_status_frequency=1
# 控制tokudb讀狀態的頻率,1表示每執行一個指令會更新一次
tokudb_data_dir=/opt/percona56/data
# 指定tokudb的資料表存放位置
tokudb_log_dir=/opt/percona56/data
# 指定tokudb的log存放位置
tokudb_cache_size=1G
# 資料緩存的大小,類似於innodb_buffer_pool_size
tokudb_loader_memory_size=200M
# 限制批次載入程序將使用每個loader instance的記憶體大小
小心有坑
這裡面我對TokuDB有些不滿的地方是
- 它所有的檔案不會跟你的資料庫放在同一個目錄下,也就是說在你的資料庫的目錄中,只會存放.frm檔,而tokudb相關的檔案會放在設定檔中所指定tokudb_data_dir的目錄中
例如:我一個測試資料庫叫big_table,裡面有一張資料表叫rxxx4,在它所屬的目錄下只有rxxx4.frm檔,其他的例如data和index都在我所指定的tokudb_data_dir目錄中,如下圖所示:
它把所有的index都存成一個檔案,目前還沒搞不清楚main和status裡面放什麼,也不知道真正的資料是放在哪(或許是main裡)
但其實這有點困擾阿,你資料庫的表一多,這個目錄裡面的東西就會超多!!
如果今天有多個資料庫,那不就不同資料庫的資料表所都放在同一個目錄裡,好難維護阿~~~ - 資料表一旦建立了,就沒辦法再修改路徑了!!
對MySQL的使用者來說,有時候在維護或更新的時候會很習慣用目錄搬移的方式來做,只要在設定檔裡指定好目錄、權限設定好,開機時自然有辦法可以直接存取
但TokuDB不是阿…
它在information_schema.TokuDB_file_map裡面會記錄資料表的"絕對路徑"
而且是無法修改的,也就是說,一旦建立了就無法修改路徑囉!
如下圖所示:
錯誤處理
留言
張貼留言