1. 程式人生 > >MariaDB ColumnStore初探(1):安裝、使用及測試

MariaDB ColumnStore初探(1):安裝、使用及測試

 

相信大家在對接BI資料報表部門有很深刻的體驗,高大上的複雜SQL關聯JOIN十幾張表在InnoDB裡跑起來,會讓你酸爽到死。它的出現正是解決這個問題,DBA能不能輕鬆愉快地玩耍,就要靠它了,“神州行我看行”。

 

通過本文,會讓大家都可以動手玩起來。我們的口號:接地氣!

 

什麼是MariaDB ColumnStore?

 

MariaDB ColumnStore是在MariaDB 10.1基礎上移植了InfiniDB 4.6.2構建的大規模並行,高效能,壓縮,分散式開源列式儲存引擎,類似收費產品Infobright。它設計用於大資料離線分析,用來抗衡Hadoop 。官方自稱MariaDB ColumnStore是資料倉庫的未來,ColumnStore允許儲存更多的資料並更快地分析它。

 

你可以使用標準SQL語句進行查詢,支援目前流行的sqlyog/navicat客戶端工具連線,對業務方使用沒有任何的不便,並且你不需要建立任何索引,不需要修改業務方的複雜SQL(自身就支援複雜的關聯查詢、聚合、儲存過程和使用者定義的函式),你唯一要做的就是把資料匯入到ColumnStore裡,就沒你事了。這對一家沒有Hadoop工程師的公司來說,MariaDB ColumnStore會是一個更好的替代產品。

 

MariaDB ColumnStore架構概述

 

MariaDB ColumnStore是一種專為分散式大規模並行處理(MPP)設計的列式儲存引擎。它由三個元件組成,協同工作。

在官方給出的架構圖中,我們可以看到分為三個元件構成:UM、PM、資料儲存層。

 

使用者模組(UM):

使用者模組管理和控制終端使用者查詢的操作,它維護每個查詢的狀態,向一個或多個性能模組發出請求以代為執行SQL查詢工作,最後,使用者模組彙集來自各個參與的效能模組的所有查詢結果,以形成返回給使用者的完整的查詢結果集。

 

效能模組(PM):

效能模組負責儲存,檢索和管理資料,處理對查詢操作的塊請求,並將其傳遞迴使用者模組以完成查詢請求。效能模組將獲取的資料快取在其記憶體中計算。MPP是通過允許使用者配置儘可能多的效能模組,以實現更高的處理能力。

 

儲存:

MariaDB ColumnStore對於儲存系統極為靈活。當在內部執行時,它可以使用本地儲存或共享儲存(例如SAN)來儲存資料。在Amazon EC2環境中,它可以使用臨時或彈性塊儲存(EBS)卷。當無共享部署需要資料冗餘時,它被構建為與GlusterFS和Apache Hadoop分散式檔案系統(HDFS)整合。

 

一句話總結:使用者模組(UM)將客戶端發出的SQL請求進行分配,分配到後端效能模組(PM),PM進行資料查詢分析,將處理的結果返回給UM,UM再把PM分析的結果進行聚合,最後返回給客戶端最終的查詢結果。

 

MariaDB  ColumnStore安裝前的準備工作

 

我們這裡採用2臺um、2臺pm跑一組叢集,作業系統Centos6.8,MariaDB ColumnStore最新GA版本1.0.6。

 

# cat /etc/hosts

192.168.17.133    um1
192.168.17.134    um2
192.168.17.135    pm1
192.168.17.136    pm2

1、公私鑰認證,打通SSH無密碼(um1/2、pm1/2均執行如下)

# ssh-keygen
# ssh-copy-id '-p 22 [email protected]'
# ssh-copy-id '-p 22 [email protected]'
# ssh-copy-id '-p 22 [email protected]'
# ssh-copy-id '-p 22 [email protected]'
(注:如果你的ssh埠不是22,修改-p 22為你自己的定義的埠)

2、關閉IPTABLES防火牆/關閉SELINUX

# /etc/init.d/iptables stop
# cat /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted
# chkconfig iptables off
# chkconfig --list | grep iptables
iptables          0:off   1:off   2:off     3:off   4:off   5:off     6:off

3、關閉檔案系統訪問時間和更改磁碟IO演算法

# cat /etc/fstab
UUID=683a6e67-567c-498a-a06a-c65f8f290080 /data   xfs     defaults,noatime,nobarrier        1 2
#cat /etc/rc.local
echo "deadline" >   /sys/block/sdb/queue/scheduler

 4、優化Linux系統核心

# cat /etc/sysctl.conf
# 將如下引數加到最後
# increase TCP max buffer size
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# increase Linux autotuning TCP buffer limits
# min, default, and max number of bytes to use
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# don't cache ssthresh from previous connection
net.ipv4.tcp_no_metrics_save = 1
# recommended to increase this for 1000 BT or higher
net.core.netdev_max_backlog = 2500
# for 10 GigE, use this
net.core.netdev_max_backlog = 30000
fs.file-max=65535
net.ipv4.ip_local_port_range = 1025 65000
net.ipv4.tcp_tw_reuse = 1
vm.swappiness = 1

5、調整檔案描述符ulimit為65535

# cat /etc/security/limits.conf
*                       soft     nofile             65535
*                     hard     nofile             65535
*                       soft     nproc              65535
*                       hard     nproc              65535
# cat /etc/security/limits.d/90-nproc.conf
*                       soft     nproc              65535
*                       hard     nproc              65535

6、關閉NUMA

# cat /etc/grub.conf
title CentOS 6 (2.6.32-642.el6.x86_64)
        root   (hd0,0)
        kernel   /vmlinuz-2.6.32-642.el6.x86_64 ro   root=UUID=98f9a4a6-f596-42e6-bffa-98a42b32145d rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD   crashkernel=auto.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet numa=off
        initrd   /initramfs-2.6.32-642.el6.x86_64.img

7、安裝jemalloc記憶體管理器

# yum -y install jemalloc*

8、重啟伺服器

# reboot

MariaDB ColumnStore安裝部署

1、安裝boost軟體包

# yum -y install boost*
# yum -y groupinstall "Development Tools"
# yum -y install cmake
# cd /root/
# wget   http://sourceforge.net/projects/boost/files/boost/1.55.0/boost_1_55_0.tar.gz
# tar zxvf boost_1_55_0.tar.gz
# cd boost_1_55_0
# ./bootstrap.sh   --with-libraries=atomic,date_time,exception,filesystem,iostreams,locale,program_options,regex,signals,system,test,thread,timer,log   --prefix=/usr
# ./b2 install

2、安裝Perl依賴包

# yum -y install expect perl perl-DBI openssl zlib   perl-DBD-MySQL

3、安裝配置MariaDB ColumnStore

我們這裡選用的是二進位制安裝包

# cd /root/
# wget
https://downloads.mariadb.com/enterprise/dapw-ktc5/mariadb-columnstore/1.0.6/centos/x86_64/6/mariadb-columnstore-1.0.6-1-centos6.x86_64.bin.tar.gz
# tar zxvf   mariadb-columnstore-1.0.6-1-centos6.x86_64.bin.tar.gz -C /usr/local/

執行下面的命令進行配置

/usr/local/mariadb/columnstore/bin/postConfigure

後面的步驟,請大家仔細參考我的安裝截圖。

我們選擇multi叢集的方式,填寫2回車。

我們選擇separate,在單獨的機器上部署um和pm,這裡輸入1回車。

由於我沒有共享儲存環境,這裡我選擇本地儲存資料,輸入1回車。

 

um節點數,我們這裡是2臺,輸入2回車。

輸入主機名um1回車,再輸入um2回車。

pm節點數,我們這裡是2臺,輸入2回車。

 

輸入主機名pm1回車,再輸入pm2回車。

輸入y回車安裝,然後輸入binary,因我們安裝是採用的二進位制安裝包,之後讓我們輸入其他機器的密碼,注意所有機器的root密碼要一致,預設是使用ssh-key認證。

經過漫長的等待,我們輸入y開始啟動系統,至此啟動完畢。

 

輸入命令mcsadmin進入管理後臺,輸入getSystemStatus可以看到節點資訊。

um1

是主節點,um2是備節點,pm1是主節點,pm2是備節點。

 

在實際生產環境中,部署更多的pm節點會帶來效能的提升。

 

MySQL節點的資料是通過主從複製傳輸的,登入um1或um2機器上輸入mcsmysql命令登陸,輸入show slave status\G確定哪臺機器是主庫。

 

它其實就是命令的別名,cat /root/.bashrc檢視

alias   mcsmysql='/usr/local/mariadb/columnstore/mysql/bin/mysql   --defaults-file=/usr/local/mariadb/columnstore/mysql/my.cnf -u root'
alias ma=/usr/local/mariadb/columnstore/bin/mcsadmin
alias   mcsadmin=/usr/local/mariadb/columnstore/bin/mcsadmin
alias home='cd /usr/local/mariadb/columnstore'
alias log='cd /var/log/mariadb/columnstore/'
alias core='cd /var/log/mariadb/columnstore/corefiles'
alias tmsg='tail -f /var/log/messages'
alias tdebug='tail -f   /var/log/mariadb/columnstore/debug.log'
alias tinfo='tail -f   /var/log/mariadb/columnstore/info.log'
alias dbrm='cd   /usr/local/mariadb/columnstore/data1/systemFiles/dbrm'
alias module='cat   /usr/local/mariadb/columnstore/local/module'

MariaDB ColumnStore使用

我們這裡以sysbench生成的sbtest表為例,表結構如下:

CREATE TABLE `sbtest` (
  `id` int(10)   unsigned NOT NULL,
  `k` int(10)   unsigned NOT NULL DEFAULT '0',
  `c` char(120)   DEFAULT '',
  `pad` char(60)   NOT NULL DEFAULT ''
) ENGINE=Columnstore DEFAULT CHARSET=utf8;

 

注:不支援主鍵和索引,資料型別不支援text和timestamp欄位型別。

 

資料匯入

 

由於是離線分析,不支援與前端MySQL的主從複製,需要手工把MySQL/Percona/MariaDB的資料匯出,命令:

select * from sbtest into outfile '/tmp/sbtest.txt'   FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'  LINES TERMINATED BY '\n';
#FIELDS TERMINATED BY ',' --欄位的結束符
#OPTIONALLY ENCLOSED BY '"' --字串的分割符
#LINES TERMINATED BY '\n' --行的結束符

匯入有兩種方法:

 

一種是通過load命令匯入

load data infile '/tmp/sbtest.txt' into table sbtest   FIELDS TERMINATED BY ','  OPTIONALLY   ENCLOSED BY '"'  LINES TERMINATED   BY '\n';


另一種官方推薦自帶的cpimport命令匯入。

 

cpimport是一種高速批量載入實用程式,可以快速高效地將資料匯入ColumnStore引擎。

/usr/local/mariadb/columnstore/bin/cpimport  test    sbtest    /root/tmp/sbtest.txt  -E   '"'  -s ','
#test是資料庫
#sbtest是表
#-E是字串的分割符
#-s是欄位的結束符

入上圖所示,代表已經匯入成功。

 

然後你就可以使用SQL查詢分析了,如下圖所示:


MariaDB ColumnStore引數調優

 

配置檔案/usr/local/mariadb/columnstore/etc/Columnstore.xml

<NumBlocksPct>70</NumBlocksPct>

# 設定為PM主機的實體記憶體70%,用來快取資料到記憶體

<TotalUmMemory>50%</TotalUmMemory>

# 設定為UM主機的實體記憶體50%,用來對PM分析的結果進行聚合

 

MariaDB Columnstore測試

 

1、這是在生產伺服器InnoDB_Buffer_Pool50G記憶體跑的,耗時4小時7分。

當然這個SQL是有優化空間的,但會浪費DBA過多的精力與時間,業務方不等人,時間就是金錢。

 

2、下面是在Columnstore,我的筆記本vmware虛擬機器1G記憶體跑的,耗時4.66秒。