Percona TokuDB初試

◆ 緣起
最近在做個專案,它是一個報表系統
本來要用EDB(Postgres)但它的授權計算下來簡直是天價
所以又找了Greenplum要來做,測試後發現速度也無法滿足要求
最後想用MySQL的方案來試試。


◆ 關於TokuDB
它的詳細說明,就不一一細數,有興趣直接到官網 Percona
簡單來說呢,是一個高效能、高壓縮比支援ACID和MVCC的儲存引擎,非常適合用在寫密集型且日誌型的應用場景。
在官方的部落中有做了一個The MySQL Archive Storage Engine-Alternatives
對MyISAM、InnoDB、Archive和TokuDB的比較
在這些表中分別插入約2千萬筆的資料,其壓縮比如下:
EngineCompressionTable 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包裡了。
安裝前記得有幾個設定要先處理,否則在啟動的時候會發生錯誤
  1. libjemalloc library
    TokuDB需要libjemalloc 3.3.0以上的版本,如果是用tar包安裝的話,可以直接在lib/mysql/找到libjemalloc.so檔案,並且設定在my.cnf中:
    [mysqld_safe]
    malloc-lib=/opt/percona57/lib/mysql/libjemalloc.so
  2. 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中
  3. 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有些不滿的地方是
  1. 它所有的檔案不會跟你的資料庫放在同一個目錄下,也就是說在你的資料庫的目錄中,只會存放.frm檔,而tokudb相關的檔案會放在設定檔中所指定tokudb_data_dir的目錄中
    例如:我一個測試資料庫叫big_table,裡面有一張資料表叫rxxx4,在它所屬的目錄下只有rxxx4.frm檔,其他的例如data和index都在我所指定的tokudb_data_dir目錄中,如下圖所示:

    它把所有的index都存成一個檔案,目前還沒搞不清楚main和status裡面放什麼,也不知道真正的資料是放在哪(或許是main裡)
    但其實這有點困擾阿,你資料庫的表一多,這個目錄裡面的東西就會超多!!
    如果今天有多個資料庫,那不就不同資料庫的資料表所都放在同一個目錄裡,好難維護阿~~~
  2. 資料表一旦建立了,就沒辦法再修改路徑了!!
    對MySQL的使用者來說,有時候在維護或更新的時候會很習慣用目錄搬移的方式來做,只要在設定檔裡指定好目錄、權限設定好,開機時自然有辦法可以直接存取
    但TokuDB不是阿…
    它在information_schema.TokuDB_file_map裡面會記錄資料表的"絕對路徑"
    而且是無法修改的,也就是說,一旦建立了就無法修改路徑囉!
    如下圖所示:



錯誤處理
  1. 啟動錯誤

    可能是transparent huge pages沒做持久化設定,重開機時又變成啟動的狀態,在開資料庫服務的時候雖然能正常改動,但要使用資料庫時就會發生錯誤,如下圖:

    這時候去看show plugins;如TokuDB其他相關的套件還在,但本身的TokuDB這個plugin卻不見了

    且去看show engines;會發現TokuDB不見了

    只要把transparent huge pages相關設定搞定再開啟資料庫服務就可以了。



留言

這個網誌中的熱門文章

【工作筆記】SQL Timeout追蹤

MySQL監控軟體MEM及PMM介紹

MySQL Router 設定檔說明