Greenplum_原始碼編譯安裝和RPM包安裝

wait4friend發表於2018-08-16

背景

原來使用GP的場景是直接使用阿里雲提供的HybridDB產品,所以沒有親自動手安裝過。現在有一個在本地搭建測試環境的需求,所以就照貓畫虎的做一遍,把過程記錄下來。

CentOS 7 x64

Greenplum 5.8.0 RPM包安裝(基於PostgreSQL 8.3.23)

Greenplum 6.0.0 原始碼安裝(基於PostgreSQL 9.2.0)

備註

  • 目前Greenplum已經開源,但是在網上不太容易找到已經編譯後的最新版本,所以我這次找了一個第三方編譯的5.8.0的RPM包來進行安裝。

  • 基於最新原始碼,我也進行了一次編譯安裝。

參考

Greenplum的安裝

centos7 編譯安裝greenplum5.7

OS環境準備

本節所有操作都預設使用root使用者在每一個節點上執行

GP生產環境一般是多個節點,如果是僅用於測試,也可以選擇單節點模式。兩種安裝方式在操作流程上幾乎沒有區別。

系統準備

#### 安裝過程中需要使用到的一些工具,dos2unix用來轉換在Win環境編輯的配置檔案
yum -y install unzip ntp dos2unix
複製程式碼

sysctl引數

#### 修改系統引數
vi /etc/sysctl.conf

# 修改下列配置,以下是最小配置
kernel.shmmax = 500000000
kernel.shmmni = 4096
kernel.shmall = 4000000000
kernel.sem = 500 1024000 200 4096
kernel.sysrq = 1
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.msgmni = 2048
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.conf.all.arp_filter = 1
net.ipv4.ip_local_port_range = 1025 65535
net.core.netdev_max_backlog = 10000
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
vm.overcommit_memory = 2

#### 修改完畢後重新載入
sysctl -p
複製程式碼

limits引數

#### 修改檔案開啟數等限制
vi /etc/security/limits.conf

# 新增如下幾行(注意*也需要新增)
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072

#### 
vi /etc/security/limits.d/90-nproc.conf

# 新增如下幾行(注意*也需要新增)
* soft nofile 65536
* hard nofile 65536
* soft nproc 131072
* hard nproc 131072
複製程式碼

scheduler引數

#### 修改預設引數cfq為deadline
echo deadline > /sys/block/vda/queue/scheduler

#### 檢查修改後的結果
more /sys/block/vda/queue/scheduler 
noop anticipatory [deadline] cfq 
複製程式碼

關閉防火牆

#### 關閉防火牆
chkconfig iptables off
service iptables stop
systemctl stop firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

#### 檢查修改後的結果
sestatus
複製程式碼

允許root密碼登入

#### 允許root密碼登入並重啟ssh
sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^PermitRootLogin .*$/PermitRootLogin yes/' /etc/ssh/sshd_config
service sshd restart

#### 檢查修改後的結果
grep ^PasswordAuthentication /etc/ssh/sshd_config
grep ^PermitRootLogin /etc/ssh/sshd_config
複製程式碼

主機hosts

#### 修改hosts
vi /etc/hosts

# 修改為如下內容(三個節點)
127.0.0.1       localhost
10.10.1.10      mdw
10.10.1.11      sdw1
10.10.1.12      sdw2

#### 修改主機名(在每個節點上分別使用各自的名稱,這裡僅用mdw為例)
sed -i 's/HOSTNAME=.*/HOSTNAME=mdw/' /etc/sysconfig/network | hostname mdw
複製程式碼

時鐘同步

####
vi /etc/ntp.conf 

# 把下列內容改在第一行
server mdw
複製程式碼

安裝資料庫

本節所有操作都預設使用root使用者在Master節點上執行

節點資訊配置

安裝過程中,GP需要兩個檔案提供節點資訊

#### 
vi hostfile_exkeys 

# 包含Master和Segment
mdw
sdw1
sdw2

####
vi hostfile_segments 

# 只包含Segment
sdw1
sdw2
複製程式碼

安裝Master

原始碼編譯安裝

因為流程步驟比較多,所以我把這一部分內容放在了文章末尾的附錄中。

RPM安裝

#### RPM方式,預設安裝到 /usr/local/greenplum-db/ (以root在master執行)
rpm -Uvh greenplum-db-5.8.0-rhel7-x86_64.rpm
複製程式碼

建立節點信任關係

#### 安裝各個節點的過程中,需要打通master到各節點的免密碼登入 (以root在master執行)
source /usr/local/greenplum-db/greenplum_path.sh
gpssh-exkeys -f hostfile_exkeys

# 在上面操作過程中要求輸入節點root的密碼
複製程式碼

安裝各節點

#### 安裝各個節點,並建立gpadmin使用者(以root在master執行)
gpseginstall -f hostfile_exkeys -u gpadmin -p gpadmin
複製程式碼

建立資料資料夾

#### 建立資料資料夾 (以root在master執行)
# gpssh工具可以同時在多個機器上執行相同命令,和ansible功能類似
gpssh -f hostfile_exkeys 
=>
mkdir -p /data/gpdata/gpmaster
mkdir -p /data/gpdata/primary
mkdir -p /data/gpdata/mirror
chown -R gpadmin:gpadmin /data/gpdata
exit
複製程式碼

安裝後檢查

#### 
gpssh -f hostfile_exkeys -v -e 'ntpd'
gpcheck -f hostfile_exkeys -m mdw -s sdw1 -s sdw2
複製程式碼

初始化資料庫

本節所有操作都預設使用gpadmin使用者在Master節點上執行

環境變數

su - gpadmin

#### 修改環境變數
vi ~/.bash_profile

# 增加如下內容
export GPHOME=/usr/local/greenplum-db
export MASTER_DATA_DIRECTORY=/data/gpdata/gpmaster/gpseg-1
source ${GPHOME}/greenplum_path.sh

#### 重新載入環境變數
source ~/.bash_profile
複製程式碼

初始化資料庫

#### 以gpinitsystem_config檔案為模板
cp $GPHOME/docs/cli_help/gpconfigs/gpinitsystem_config ./gpinit_config

#### 配置gpinit_config
vi gpinit_config

# 修改如下配置,每個segment上1個資料資料夾,沒有配置映象
declare -a DATA_DIRECTORY=(/data/gpdata/primary)
MASTER_DIRECTORY=/data/gpdata/gpmaster
ENCODING=UTF8

#### 初始化
gpinitsystem -c gpinit_config -h hostfile_segments
複製程式碼

修改安全設定

#### 設定監聽IP和Port
vi ${MASTER_DATA_DIRECTORY}/postgresql.conf

# 設定監聽所有IP(這是一個非常寬鬆的限制,生產環境慎用)
listen_addresses = '*'
port = 5432

#### 設定資料庫白名單
vi ${MASTER_DATA_DIRECTORY}/pg_hba.conf

# 增加如下一條記錄,允許使用者密碼模式(這是一個非常寬鬆的限制,生產環境慎用)
host	all		all		0.0.0.0/0	md5
複製程式碼

啟動停止命令

#### 啟動,-a引數跳過使用者確認步驟
${GPHOME}/bin/gpstart -a

#### 停止
${GPHOME}/bin/gpstop -a -M fast

#### 重新載入配置檔案(不需要重啟)
${GPHOME}/bin/gpstop -u
複製程式碼

訪問資料庫

命令列連線

#### 使用gpadmin使用者作為超級使用者登入
su - gpadmin
psql -p 5432 -d postgres
複製程式碼
# 查詢當前版本
select * from version();

# 通過執行計劃檢視當前優化器型別
explain select 1;

# 開啟/關閉GPORAC
set optimizer=on;
set optimizer=off;
複製程式碼

新建DB和USER

# 新建一個測試用使用者
drop user if exists demo;
create user demo password 'demo';

# 新建一個測試用DB並分配給指定使用者
drop database if exists demo;
create database demo owner=demo;

# 修改使用者密碼
alter user demo password 'xxx';

# 切換到新建使用者
\connect demo demo mdw

# 新建Schema
drop schema if exists s01 cascade;
create schema s01;
set search_path to s01;
複製程式碼

建立只讀使用者

在GP下建立一個只讀使用者的流程是

  1. 建立使用者
  2. 賦予給定DB的連線許可權
  3. 賦予給定Schema的使用許可權
  4. 賦予給定Table的訪問許可權

備註:因為我們想要精確控制,所以這裡使用的是針對每一個表的顯式授權。如果要求不那麼嚴格,可以使用預設授權讓新建的表自動獲得訪問許可權。

# 新建一個測試用使用者(gpadmin使用者執行)
drop user if exists demoread;
create user demo password 'demo';

# 賦予、取消給定DB的連線許可權(DB所有者執行,這裡是demo使用者執行)
grant connect on database demo to demoread;
revoke connect on database demo from demoread;

# Schema和Table的許可權操作用下面語句生成,然後執行
# (DB所有者執行,這裡是demo使用者執行)
-- 構造對指定schema下所有表的grant、revoke語句
select 
	'grant usage on schema ' || pn.nspname || ' to ' || u.uname || ' ;' as schema_grant,
	'revoke usage on schema ' || pn.nspname || ' from ' || u.uname || ' ;' as schema_revoke,
	'grant select on ' || pn.nspname || '.' || pc.relname || ' to ' || u.uname || ' ;' as table_grant,
	'revoke select on ' || pn.nspname || '.' || pc.relname || ' from ' || u.uname || ' ;' as table_revoke
from pg_class pc, 
	pg_namespace pn, 
	(select 'demoread' as uname) as u -- 提供:給定被授權使用者名稱
where pc.relnamespace = pn.oid
	and pc.relkind in ('r', 'v', 'S')
	and pn.nspname in ('s01','s02') -- 提供:授權schema
order by pn.nspname, pc.relname
;

複製程式碼

附錄:原始碼編譯安裝

根據官方安裝手冊指導進行操作。

編譯準備工作

#### 獲取原始碼
git clone https://github.com/greenplum-db/gpdb.git

#### 獲取指定版本
cd gpdb
git checkout xxxx

#### 安裝CentOS依賴包
./README.CentOS.bash

# 這一步安裝conan依賴包的過程中,有個pyparsing包失敗,通過強制手工安裝這個包進行了修復
pip install --ignore-installed pyparsing

#### 軟連線cmake3
ln -sf /usr/bin/cmake3 /usr/local/bin/cmake

#### 配置動態連結庫
vi /etc/ld.so.conf
# 內容如下
include ld.so.conf.d/*.conf
include /usr/local/lib
include /usr/local/lib64

#### 解決後面gporca版本不能識別的問題 configure: error: Your ORCA version is expected to be 2.XX.XXX
vi /etc/ld.so.conf.d/usrlocallib.conf
# 內容如下
/usr/local
/usr/local/lib
/usr/local/lib64

#### 重新整理動態連結庫快取
ldconfig
複製程式碼

編譯GPORCA

#### 安裝手冊執行
cd depends
./configure
make
make install_local
cd ..
複製程式碼

編譯安裝GPDB

# 設定編譯環境,指定目標目錄 /usr/local/greenplum-db
./configure --with-perl --with-python --with-libxml --with-gssapi --prefix=/usr/local/greenplum-db

# 編譯和安裝
make -j8
make -j8 install
複製程式碼

相關文章