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秒。