MariaDB ColumnStore初探(1):安裝、使用及測試
作者介紹
賀春暘,普惠金融MySQL專家,《MySQL管理之道》第一版、第二版作者。曾任職於中國移動飛信、機鋒安卓市場,擁有豐富的數據庫管理經驗。目前致力於MySQL、Linux等開源技術的研究。
相信大家在對接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 root@192.168.17.133' # ssh-copy-id '-p 22 root@192.168.17.134' # ssh-copy-id '-p 22 root@192.168.17.135' # ssh-copy-id '-p 22 root@192.168.17.136' (注:如果你的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 https://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
70
# 設置為PM主機的物理內存70%,用來緩存數據到內存
50%
# 設置為UM主機的物理內存50%,用來對PM分析的結果進行聚合
MariaDB Columnstore測試
1、這是在生產服務器InnoDB_Buffer_Pool50G內存跑的,耗時4小時7分。
當然這個SQL是有優化空間的,但會浪費DBA過多的精力與時間,業務方不等人,時間就是金錢。
2、下麵是在Columnstore,我的筆記本vmware虛擬機1G內存跑的,耗時4.66秒。
大家可以用生產的複雜SQL跑一跑,來體驗一下。
原文發布時間為:2016-12-22
本文來自雲棲社區合作夥伴DBAplus
最後更新:2017-05-13 08:41:34