閱讀1008 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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)設計的列式存儲引擎。它由三個組件組成,協同工作。

 

20161222100638833.jpg

 

在官方給出的架構圖中,我們可以看到分為三個組件構成: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

 

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

 

20161222100710389.jpg

 

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

 

20161222100733602.jpg

 

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

 

20161222100757950.jpg

 

由於我沒有共享存儲環境,這裏我選擇本地存儲數據,輸入1回車。

 

um節點數,我們這裏是2台,輸入2回車。

 

20161222100824429.jpg

 

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

 

20161222100851671.jpg

 

pm節點數,我們這裏是2台,輸入2回車。

 

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

 

20161222100910404.jpg

 

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

 

20161222100928755.jpg

 

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

 

輸入命令mcsadmin進入管理後台,輸入getSystemStatus可以看到節點信息。

 

20161222100957790.jpg

20161222101031206.jpg

 

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是字段的結束符

 

20161222101048252.jpg

 

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

 

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

 

20161222101100695.jpg

 

 MariaDB ColumnStore參數調優  

 

配置文件/usr/local/mariadb/columnstore/etc/Columnstore.xml

70

# 設置為PM主機的物理內存70%,用來緩存數據到內存

50%

# 設置為UM主機的物理內存50%,用來對PM分析的結果進行聚合

 

 MariaDB Columnstore測試  

 

1、這是在生產服務器InnoDB_Buffer_Pool50G內存跑的,耗時4小時7分。

 

20161222101120176.jpg

 

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

 

2、下麵是在Columnstore,我的筆記本vmware虛擬機1G內存跑的,耗時4.66秒。

 

20161222101144523.jpg

 

大家可以用生產的複雜SQL跑一跑,來體驗一下。

原文發布時間為:2016-12-22

本文來自雲棲社區合作夥伴DBAplus

最後更新:2017-05-13 08:41:34

  上一篇:go  MariaDB ColumnStore初探(2):特性、命令及運維優化
  下一篇:go  與微服務一脈相承,Serverless適用何種場景?會帶來哪些衝擊?