隨着Greenplum大數據平臺正式進入6時代,Greenplum 新版本在功能和性能上都實現大幅度地提高。Greenplum 用戶麥煜遙將在本文詳細介紹如何在Linux上搭建Greenplum 6.1集羣。html
操做系統: CentOS release 6.6linux
數據庫: Greenplum 6.1git
輔助工具: Winscp, Puttygithub
Winscp: 以root權限登陸,遠程鏈接Linux修改文檔內容。Putty: 遠程鏈接Linux運行命令。sql
• Greenplum 5 <Greenplum 企業應用實戰> 何勇,陳曉峯數據庫
• Greenplum 6 官網windows
https://gpdb.docs.pivotal.io/6-1/install_guide/prep_os.html#topic1
https://github.com/greenplum-db/gpdb/releases/tag/6.1.0
備註:Greenplum 6.1 安裝有兩種方法:bash
一是,下載源碼,本地編譯、安裝;服務器
二是,直接下載編譯好的包安裝。cookie
這裏選擇的是,下載編譯好的包安裝,對於POC來說,比較節省時間。
我搭建的 Greenplum 集羣,使用1個 Master ,3個 Segment 的集羣,以下:
192.168.xxx.1 Master 192.168.xxx.3 Segment 192.168.xxx.4 Segment 192.168.xxx.5 Segment
備註:192.168.xxx.2 是 ETL 的 Pentaho 服務器,後面用來作測試的,沒有在此列。
Master:
(1) 創建與客戶端的回話鏈接和管理
(2) SQL的解析並造成分佈式的執行計劃
(3) 將生成好的執行計劃分發到每一個 Segment 上執行
(4) 收集 Segment 的執行結果
(5) Master 不存儲業務數據,只存儲數據字典
(6) Master 主機能夠一主一備,分佈在兩臺機器上
(7) 爲了提升性能, Master 最好單獨佔用一臺機器
Segment:
(1) 業務數據的存儲和存取
(2) 執行 Master 分發的 SQL 語句
(3) 對於 Master 來說,每一個 Segment 都是對等的,負責對應數據的存儲和計算
(4) 每一臺機器上能夠配置一到多個 Segment
(5) 因爲每一個 Segment 都是對等的,建議採用相同的機器配置
(6) Segment 分 primary 和 mirror 兩種,通常交錯的存放在子節點上。
• /etc/selinux/config
SELINUX=disabled
備註:關閉後,就不用再開啓,也不須要reboot。另外,用 Winscp 去編輯文檔,比在命令環境方便多了。
配置的時候,要保證全部的機器的網絡都是通的,而且每臺機器的防火牆都是關閉的,避免存在網絡不通的狀況。
• 查看防火牆狀態
> service iptables status
• 關閉防火牆
> service iptables stop
• 永久關閉防火牆
> chkconfig iptables off
備註:CentOS 6的命令是iptables,和CentOS 7不一樣。防火牆關閉後,就不用再開啓。
主要是爲以後 Greenplum 可以在各個節點之間相互通訊作準備。習慣將 Master 叫 mdw,Segment 叫 sdw 。4臺都要設置:
192.168.xxx.1 (主機名) mdw 192.168.xxx.3 (主機名) sdw1 192.168.xxx.4 (主機名) sdw2 192.168.xxx.5 (主機名) sdw3
備註:hosts文件是Linux系統中負責ip地址與域名快速解析的文件,我這臺DEV服務器裝了不少東西,主機名已經配置了。因此,mdw只是一個主機的別名,不影響程序去查找IP。
若是你想知道添加是否成功,ping一下便可:
• /etc/sysctl.conf (這是官網貼的配置,上面有說明)
kernel.shmall = 4000000000 kernel.shmmax = 500000000 kernel.shmmni = 4096 vm.overcommit_memory = 2 vm.overcommit_ratio = 95 net.ipv4.ip_local_port_range = 10000 65535 kernel.sem = 500 2048000 200 40960 kernel.sysrq = 1 kernel.core_uses_pid = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.msgmni = 2048 net.ipv4.tcp_syncookies = 1 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.conf.all.arp_filter = 1 net.core.netdev_max_backlog = 10000 net.core.rmem_max = 2097152 net.core.wmem_max = 2097152 vm.swappiness = 10 vm.zone_reclaim_mode = 0 vm.dirty_expire_centisecs = 500 vm.dirty_writeback_centisecs = 100 vm.dirty_background_ratio = 0 vm.dirty_ratio = 0 vm.dirty_background_bytes = 1610612736 vm.dirty_bytes = 4294967296
• 執行命令使之生效
> sysctl -p
• /etc/security/limits.conf
* soft nofile 524288 * hard nofile 524288 * soft nproc 131072 * hard nproc 131072
建立 gpadmin 用戶及用戶組,將其做爲安裝 greenplum 的操做系統用戶。
• 若是已經存在,先刪除
> groupdel gpadmin > userdel gpadmin
• 建立新的用戶和用戶組
> groupadd -g 530 gpadmin > useradd -g 530 -u 530 -m -d /home/gpadmin -s /bin/bash gpadmin
• 對文件夾進行賦權,爲新用戶建立密碼
> chown -R gpadmin:gpadmin /home/gpadmin/ > passwd gpadmin
備註:密碼提示太簡單,連續輸入兩次便可。
> mkdir /usr/local/greenplum > chown -R gpadmin:gpadmin /usr/local/greenplum/
備註:
• greenplum 5的書本提示安裝在/opt,greenplum 6 裝在/usr/local 。
• /opt通常是安裝系統後用戶本身安裝的其餘應用軟件,通常是源碼包的軟件、大型軟件、或者是一些服務程序的安裝目錄。
• /usr 通常是安裝軟件的目錄,這個目錄就至關於在 windows 下的 Program Files 目錄。由於我是POC,無所謂,因此裝在 /usr/local 。
拷貝至 Master 主節點 /usr/local/greenplum 目錄下 (其實能夠放置在隨意的目錄)
• 執行命令安裝
> cd /usr/local/greenplum > yum install greenplum-db-6.1.0-rhel6-x86_64.rpm
自動安裝依賴,沒有要求輸入安裝路徑,自動安裝到 /usr/local。
備註:greenplum 5 是用rpm命令的,而greenplum 6 則用 yum install 直接安裝依賴。生成的文件夾以下,並自動建立軟鏈接。
• 賦權限
由於我是用root權限安裝的,因此Owner是root,要把Owner換成gpadmin,不然gpadmin無權操做該目錄的文件。
chown -R gpadmin:gpadmin /usr/local/greenplum*
• 應用環境變量
安裝完成後,greenplum的環境變量,已經在 greenplum_path.sh 中設置了,這裏須要應用一下變量。用 gpadmin 用戶,登陸到 master host:
> su gpadmin > source /usr/local/greenplum-db-6.1.0/greenplum_path.sh
Master,Segment之間是經過SSH鏈接登陸的,SSH登陸有2種方式:密碼,Host key。固然還能夠兩個都驗證。可是,在服務器之間不可能每次都輸入密碼,因此咱們只須要用Host key 登陸便可。
• 建立公私鑰對 (4臺)
個人Linux尚未公私鑰對,因此,要先生成一個。生成時不要輸入密碼,不然還要用密碼打開key。注意,個人登陸用戶是gpadmin。
> ssh-keygen -t rsa
選擇生成的位置是/home/gpadmin/.ssh/id_rsa,是私鑰。另外,還會產生一個公鑰 id_rsa.pub,生成以下:
• 添加信任其餘機器的Host key (4 臺)
> ssh-copy-id mdw > ssh-copy-id sdw1 > ssh-copy-id sdw2 > ssh-copy-id sdw3
在集羣的每一臺使用 ssh-copy-id 命令,把 gpadmin 的 public key 拷到 known_hosts。這樣,集羣的機器互相訪問就是經過這個設定互相信任的。(其實,我的以爲known_hosts是不須要放本機的key,放其餘的機器key便可。而authorized_keys裏面放的是本機的key。)
• 建立 hostlist,seg_hosts (Master)
目錄/home/gpadmin/conf,再分別建立hostlist,seg_hosts 。我這裏 hostlist 中填寫全部節點的主機別名,seg_hosts 中填寫全部Segment 的主機別名。
> mkdir /home/gpadmin/conf > cd /home/gpadmin/conf > touch hostlist > touch seg_hosts
而後,我喜歡使用winscp去修改內容:
• 使用 gpssh-exkeys 將全部機器的通道打開,這樣在每臺機器之間跳轉,就不須要輸入密碼。
> cd /home/gpadmin/conf > gpssh-exkeys -f hostlist
• 在打通全部機器通道以後,咱們就可使用 gpssh 命令對全部機器進行批量操做了。
> gpssh -f hostlist
備註:這是一個神奇的功能,原來我接觸的集羣部署,須要運行 SCP 遠程拷貝命令。若是有100臺,就須要操做100次。可是,這裏只須要操做一次,就完成到所有集羣的操做,前面帶 "=>",exit 退出。
• 打包
> cd /usr/local > tar -cf gp6.tar greenplum-db-6.1.0/ > chown -R gpadmin:gpadmin /usr/local/gp6.tar
打包的時候權限不夠,我換成root,而後再把.tar的權限還給gpadmin。
最後,要用gpadmin操做,由於前面設置了gpadmin免密。
• 分發
> gpscp -f /home/gpadmin/conf/hostlist gp6.tar =:/usr/local/greenplum
官網沒有這部分的說明,書上看到用的是 hostlist 做爲參數去操做。可是 hostlist 裏面的是配置包括 master 的主機別名,因此,主機到主機也複製了一份。
書上的用意應該是,把 greenplum-db-6.1.0 放進 greenplum 裏面,外面那套greenplum重複了,就刪掉。而後,4臺機器都在同一個目錄下。
• 解壓
在master上運行,一臺上敲命令,操做4臺。
> gpssh -f /home/gpadmin/conf/hostlist => cd /usr/local/greenplum => tar -xf gp6.tar => ln -s greenplum-db-6.1.0 greenplum-db
最後,退出。
以上安裝的是程序,接下來要建立數據存儲空間 。
• Master
Master 不存儲 user data,僅有 system catalog tables 和 system metadata ,我這裏沒有 Standby Master。因此,只在 Master 建立一個目錄便可。
> mkdir -p /home/gpadmin/data/master
• Segment
數據存儲在Segment 中,而且須要 primary segments 和 mirror segments,其他3臺segment 用 gpssh分別建立2個目錄。
> source /usr/local/greenplum-db/greenplum_path.sh > gpssh -f /home/gpadmin/conf/seg_hosts -e 'mkdir -p /home/gpadmin/data/primary' > gpssh -f /home/gpadmin/conf/seg_hosts -e 'mkdir -p /home/gpadmin/data/mirror'
• /home/gpadmin/.bash_profile, 網上沒有確切說要配置幾臺,我4臺都配置了。
source /usr/local/greenplum/greenplum-db/greenplum_path.sh export MASTER_DATA_DIRECTORY=/home/gpadmin/data/master/gpseg-1 export PGPORT=5432 export PGUSER=testDB
其中,greenplum_path.sh中包括greenplun運行的一些環境變量設置,包GPHOME等,由於安裝後把位置改了,4臺都修正之。
• 使之生效
> source /home/gpadmin/.bash_profile
• configuration file
模板在:$GPHOME/docs/cli_help/gpconfigs/gpinitsystem_config,拷貝過來。
> mkdir /home/gpadmin/gpconfigs > cp $GPHOME/docs/cli_help/gpconfigs/gpinitsystem_config /home/gpadmin/gpconfigs/gpinitsystem_config
#數據庫代號 ARRAY_NAME="Greenplum" #segment前綴 SEG_PREFIX=gpseg #primary segment 起始的端口號 PORT_BASE=33000 #指定primary segment的數據目錄,網上寫的是多個相同目錄,多個目錄表示一臺機器有多個segment declare -a DATA_DIRECTORY=(/home/gpadmin/data/primary) #master所在機器的host name MASTER_HOSTNAME=mdw #master的數據目錄 MASTER_DIRECTORY=/home/gpadmin/data/master #master的端口 MASTER_PORT=5432 #指定bash的版本 TRUSTED_SHELL=/usr/bin/ssh #將日誌寫入磁盤的間隔,每一個段文件一般 =16MB < 2 * CHECK_POINT_SEGMENTS + 1 CHECK_POINT_SEGMENTS=8 #字符集 ENCODING=UNICODE #mirror segment 起始的端口號 MIRROR_PORT_BASE=44000 # mirror的數據目錄,和主數據同樣,一個對一個,多個對多個 declare -a MIRROR_DATA_DIRECTORY=(/home/gpadmin/data/mirror)
• host file
> cd ~ > gpinitsystem -c gpconfigs/gpinitsystem_config -h gpconfigs/hostfile_gpinitsystem
期間會提示,是否繼續,輸入y便可:
• 以上提示安裝失敗
• 查看日誌,排查異常
[FATAL]:-Not on original master host Master, backout script exiting! 解決:不使用這個腳本清理中間數據,按照backout裏面的步驟一個個刪除。
• 經歷過不少次失敗,最後成功了,也忘記怎麼過來的。多是我在gpadmin和root之間頻繁切換,要Source 環境變量,反正網上均可以搜到答案。
psql -d postgres
• 建立數據庫
命令集參考文檔以下:
https://gpdb.docs.pivotal.io/6-1/ref_guide/sql_commands/sql_ref.html
\q 退出 \l 顯示數據庫列表
• navicat登陸
結果報錯,由於greenplum有權限控制,並非全部的機器均可以鏈接到數據庫。須要在pg_hba.conf文件增長客戶端機器的權限。
• 先給gpadmin建立一個密碼:
testdb=# alter role gpadmin with password 'gpadmin'; ALTER ROLE
• 在Linux,咱們能夠用命令快速查找一個文件:
[root@ ~]# find / -type f -name pg_hba.conf /home/gpadmin/data/master/gpseg-1/pg_hba.conf
• 由於是POC,我開通全網能夠直接訪問所有數據庫。
鏈接方式 鏈接的數據庫 鏈接的用戶 鏈接的主機IP 認證方式 host all gpadmin 192.168.0.0/16 trust
• 刷新
pg_ctl reload -D /home/gpadmin/data/master/gpseg-1
備註:官網說的 gpstop -u 能夠刷新 postgresql.conf 和 pg_hba.conf 但不重啓 Greenplum Database,實際上是不行的,我一直改pg_hba.conf,一直報錯。
• navicat登陸
大功告成!
• 關閉
> gpstop
• 啓動
> gpstart
• 狀態查看
> gpstate
• 其餘
https://gpdb.docs.pivotal.io/6-1/utility_guide/ref/gpstate.html
麥煜遙 (公衆號:Entelodon):畢業於電子科技大學(成都) ,熱衷IT技術,擅長數據分析。曾從事社保數據分析處理,IBM/AS400 DB2開發、數據分析,參保人員數據量月增千萬級;曾於電腦OEM廠商,負責EDI(電子數據交換),電子訂單秒級併發量萬級。現於供職於風電行業,從事大數據分析。