1.1 GreemPlum架构
正常情况下只有primary master接受用户连接请求,standby master通过gpsyncagent进程(运行在standby master上)利用事务日志保持与primary master的同步。
segment崩溃时正在运行的事务会全部失败。
mirror会自动接管服务而无需人工干预,接管过程中会有几秒的不可用时间
1.2 环境搭建
GreenPlum对存储的要求比较高。在文件系统的选择上,Linux建议使用XFS,在solaris建议使用ZFS。
集群环境:
程序里连master和standby master的浮动ip:192.168.1.222。
1.2.1 创建用户名,用户组
groupadd -g 530 gpadmin
useradd -g 530 -u 530 -m -d /home/gpadmin -s /bin/bash gpadmin
chown -R gpadmin:gpadmin /home/gpadmin
echo "密码" | passwd --stdin gpadmin
1.2.2 修改hosts文件
vi /etc/hosts,添加:
192.168.1.202 pc1
192.168.1.203 pc2
192.168.1.204 pc3
--备注:
即使是GreenPlum小化安装(在一台机器上安装一个master,一个段),也需要修改/etc/hosts文件及使用gpssh-exkeys打通所有服务器,免密码登录
1.2.3 安装依赖包
yum install apr apr-util zip -y
1.2.4 修改系统内核参数
vi /etc/sysctl.conf
kernel.shmmni = 4096
kernel.shmall = 4000000000
kernel.sem = 250 512000 100 2048
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.tcp_tw_recycle = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.conf.defalut.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
vi /etc/security/limits.conf,添加:
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
#让配置生效
sysctl -p-
1.2.5 安装GreenPlum
1.2.5.1 在master节点安装GreenPlum软件
下载地址:https://github.com/greenplum-db/gpdb/releases/
rpm -ivh greenplum-db-6.8.0-rhel7-x86_64.rpm
默认的安装路径是/usr/local,然后需要修改该路径gpadmin操作权限:
chown -R gpadmin:gpadmin /usr/local
1.2.5.2 配置hostlist文件,打通节点
su - gpadmin
mkdir -p /home/gpadmin/conf
vi /home/gpadmin/conf/hostlist
添加:
pc1
pc2
pc3
#创建一个 seg_hosts ,包含所有的Segment Host的主机名:
vi /home/gpadmin/conf/seg_hosts
pc2
pc3
#配置台服务器到另外两台服务器的主机信任关系,使之可以免密登录
ssh-keygen
ssh-copy-id pc2
ssh-copy-id pc3
#使用gpssh-exkeys打通所有服务器,免密码登录
source /usr/local/greenplum-db/greenplum_path.sh
gpssh-exkeys -f /home/gpadmin/conf/hostlist
[STEP 1 of 5] create local ID and authorize on local host
... /home/gpadmin/.ssh/id_rsa file exists ... key generation skipped
[STEP 2 of 5] keyscan all hosts and update known_hosts file
[STEP 3 of 5] retrieving credentials from remote hosts
... send to pc2
... send to pc3
[STEP 4 of 5] determine common authentication file content
[STEP 5 of 5] copy authentication files to all remote hosts
... finished key exchange with pc2
... finished key exchange with pc3
[INFO] completed successfully
/*
假如报错:
[ERROR QG-DB-03] authentication check failed:
[ERROR] cannot establish ssh access into the local host
有可能是做了普通用户无法ssh的限制。
可以通过修改/etc/ssh/sshd_config,在AllowUsers这一行后面添加能远程访问的用户,示例:
AllowUsers root.adminssh
然后重启ssh:service sshd restart
再重新执行gpssh-exkeys命令。
*/
如果gpssh-exkeys执行失败,可以尝试在每台机器上配置互信:
ssh-keygen
ssh-copy-id 目标IP
回头再执行下gpssh-exkeys -f /home/gpadmin/conf/hostlist,可能就好了。
#验证免密连接是否成功,如果中间需要输入密码,则有问题
[gpadmin@pc1]$ gpssh -f /home/gpadmin/conf/hostlist
=> pwd
[pc1] /home/gpadmin
[pc2] /home/gpadmin
[pc3] /home/gpadmin
1.2.5.3 在Segment节点上安装GreenPlum
#在master节点打包安装包并复制到各个数据节点:
cd /usr/local
tar -cf gp.tar greenplum-db-6.5.0/
scp gp.tar 192.168.1.203:/usr/local/
#在数据节点上解压
tar -xf gp.tar
ln -s greenplum-db-6.5.0 greenplum-db
chown -R gpadmin:gpadmin /usr/local/greenplum-db
chown -R gpadmin:gpadmin /usr/local/greenplum-db-6.5.0
1.2.5.4 初始化数据库
1.2.5.4.1 创建数据目录
#在各节点创建数据目录:
mkdir -p /data/greenplum/data/
chown -R gpadmin:gpadmin /data/greenplum/data/
#在一台服务器上统一处理所有节点
gpssh -f /home/gpadmin/conf/hostlist
mkdir -p /data/greenplum/data/master
mkdir -p /data/greenplum/data/primary1
mkdir -p /data/greenplum/data/primary2
mkdir -p /data/greenplum/data/mirror1
mkdir -p /data/greenplum/data/mirror2
1.2.5.4.2 配置环境变量
#在各节点服务器上执行:
vi /home/gpadmin/.bash_profile
新增:
source /usr/local/greenplum-db/greenplum_path.sh
export MASTER_DATA_DIRECTORY=/data/greenplum/data/master/gpseg-1
export PGPORT=5432
export PGDATABASE=gp_sydb
export GPHOME=/usr/local/greenplum-db
source /home/gpadmin/.bash_profile #让修改生效
1.2.5.4.3 创建greenplum配置文件
配置文件模板:$GPHOME/docs/cli_help/gpconfigs/gpinitsystem_config
此模板中 Mirror Segment的配置都被注释了。
在master节点上执行:
cd /usr/local/greenplum-db/docs/cli_help/gpconfigs
cp gpinitsystem_config initgp_config
vi initgp_config
需要修改一下几个地方:
#指定Primary Segment的数据目录:
declare -a DATA_DIRECTORY=(/data/greenplum/data/primary1 /data/greenplum/data/primary2)
MASTER_HOSTNAME=pc1
MASTER_DIRECTORY=/data/greenplum/data/master
#指定Mirror Segment的数据目录:
declare -a MIRROR_DATA_DIRECTORY=(/data/greenplum/data/mirror1 /data/greenplum/data/mirror2)
DATABASE_NAME=gp_sydb
MACHINE_LIST_FILE=/home/gpadmin/conf/seg_hosts
1.2.5.4.4 关闭防火墙
service iptables stop-
1.2.5.4.5 执行初始化
在master上执行:
[gpadmin@pc1 gpconfigs]$ gpinitsystem -c initgp_config
……
Continue with Greenplum creation Yy|Nn (default=N): #这里输入Y继续
……
#初始化成功后,可以正常登陆数据库了:
[gpadmin@pc1 master]$ psql -d postgres
psql (9.4.24)
Type "help" for help.
#在master节点修改gpadmin密码
alter role gpadmin with password '密码';
默认只有本地可以连数据库,远程连接会报错:
[gpadmin@pc2 master]$ psql -h 192.168.1.202 -d postgres
psql: FATAL: no pg_hba.conf entry for host "192.168.1.203", user "gpadmin", database "postgres", SSL off
如果想让别的服务器能够远程连接,需要修改master节点和standby master的gp_hba.conf文件:
cd /data/greenplum/data/master/gpseg-1
vi pg_hba.conf
添加:
host all all 192.168.1.0/24 md5 #允许192.168.1网段所有服务器连接
执行gpstop -u使修改生效
#查看有哪些数据库
postgres-# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+---------+----------+------------+------------+---------------------
gp_sydb | gpadmin | UTF8 | en_US.utf8 | en_US.utf8 |
postgres | gpadmin | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | gpadmin | UTF8 | en_US.utf8 | en_US.utf8 | =c/gpadmin +
| | | | | gpadmin=CTc/gpadmin
template1 | gpadmin | UTF8 | en_US.utf8 | en_US.utf8 | =c/gpadmin +
| | | | | gpadmin=CTc/gpadmin
(4 rows)
1.2.5.5 配置standby master
#在standby机器上执行
mkdir -p /data/greenplum/data/standby
chown -R gpadmin:gpadmin /data/greenplum/data/standby
#在master上执行
gpinitstandby -s pc3
中间输入一次Y。
1.2.5.6 配置mirror
1.2.5.6.1 生成addmirror文件
[gpadmin@pc1 data]$ gpaddmirrors -o ./addmirror
……
Enter mirror segment data directory location 1 of 2 >
/data/greenplum/data/mirror1
Enter mirror segment data directory location 2 of 2 >
/data/greenplum/data/mirror2
20200331:21:19:50:004400 gpaddmirrors:pc1:gpadmin-[INFO]:-Configuration file output to ./addmirror successfully.
1.2.5.6.2 添加mirror
gpaddmirrors -i addmirror
1.2.6 用keepalive实现master高可用
在Greenplum的master节点和standby节点部署keepalive服务,配置一个虚拟IP,使用keepalive监控greenplum的进程状态和服务可用性;
当master节点出现故障后,由Keepalived机制来保证切换到standby节点,需要特别注意的是切换到standby节点的时候,需要首先激活Standby节点(gpactivatestandby -d $MASTER_DATA_DIRECTORY),这样就解决了greenplum主备节点的无缝切换
1.2.6.1 安装keepalive
在master节点和standby master上安装keepalive。
将安装包上传至/usr/local/src下
yum install -y popt-devel openssl-devel gcc
cd /usr/local/src
tar zxvf keepalived-1.2.2.tar.gz
cd keepalived-1.2.2
./configure --prefix=/
make
make install
1.2.6.2 在standby master节点上创建激活脚本
su - gpadmin
cd /data/greenplum/data/standby
vi activatestandby.sh
添加:
export MASTER_DATA_DIRECTORY=/data/greenplum/data/master/gpseg-1
export PGPORT=5432
export PGDATABASE=gp_sydb
export GPHOME=/usr/local/greenplum-db
source /usr/local/greenplum-db/greenplum_path.sh
echo y | /usr/local/greenplum-db-6.8.0/bin/gpactivatestandby -d $MASTER_DATA_DIRECTORY
1.2.6.3 只在master节点上创建检查脚本
用root用户执行:
vi /root/check_gp.sh
添加:
#检查greenplum master进程是否存在,若不存在,则将浮动ip转移到备用master上
date=`date "+%Y-%m-%d-%H:%M"`
LogName='/root/check_gp.log'
echo $date':' > $LogName
v1=$(netstat -nltp |grep 5432)
if [ "$v1" = "" ]
then
echo 'master节点宕机,开始关闭keepalive,并激活standby master...' >> $LogName
service keepalived stop
su - gpadmin -c "ssh 192.168.1.204 sh /data/greenplum/data/standby/activatestandby.sh"
exit 2
else
echo 'master节点正常.' >> $LogName
exit 0
fi
上面指定的ip是standby master的ip。
可通过/root/check_gp.log查看相关日志:
#给该脚本授权
chmod +x /root/check_gp.sh
1.2.6.4 修改keepalive配置文件
1.2.6.4.1 master节点
cd /etc/keepalived/
mv keepalived.conf keepalived.conf_bak
vi keepalived.conf
添加:
vrrp_script check_application { ######定义监控脚本
script "/root/check_gp.sh"
interval 2 ######监控时间间隔
weight 2 ######负载参数
}
vrrp_instance vrrptest { ######定义vrrptest实例
state BACKUP ######服务器状态
interface eth0 ######使用的网络接口
virtual_router_id 51 ######虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换
priority 150 ######服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER
advert_int 1 ######服务器之间的存活检查时间
authentication {
auth_type PASS ######认证类型
auth_pass ufsoft ######认证密码,一组lvs 服务器的认证密码必须一致
}
track_script { ######执行监控mysql进程的脚本
check_application
}
virtual_ipaddress { ######虚拟IP地址
192.168.1.222
}
}
/*
注释:
① script那行表示监控应用的脚本
② interface处的eth0这里需要根据实际情况改成当前服务器使用的网卡名称
③ 假如该网段配置了多套keepalive,则需修改virtual_router_id值,不要和现有的冲突了。
④ virtual_ipaddress指定的是两台服务器使用的浮动ip
*/
1.2.6.4.2 standby master节点
cd /etc/keepalived/
mv keepalived.conf keepalived.conf_bak
vi keepalived.conf
添加:
vrrp_instance vrrptest { ######定义vrrptest实例
state BACKUP ######服务器状态
interface eth0 ######使用的网络接口
virtual_router_id 61 ######虚拟路由的标志,一组lvs的虚拟路由标识必须相同,这样才能切换
priority 150 ######服务启动优先级,值越大,优先级越高,BACKUP 不能大于MASTER
advert_int 1 ######服务器之间的存活检查时间
authentication {
auth_type PASS ######认证类型
auth_pass ufsoft ######认证密码,一组lvs 服务器的认证密码必须一致
}
virtual_ipaddress { ######虚拟IP地址
192.168.1.222
}
}
1.2.6.5 启动keepalive
#先启动master节点的keepalive,再启动standby master的keepalive,确保浮动ip在master节点上:
service keepalived start
#设置开机自启
chkconfig --add keepalived
chkconfig keepalived on
1.2.6.6 验证master高可用
关掉master节点,验证下浮动ip是否漂移到standby master上
#关掉master节点
su - gpadmin
gpstop -m
#在从节点查看ip
ip addr
#在standby master上检查集群状态,看下当前master是否切换过来:
如果没切换过来的话,在standby master上执行gpstate -s会提示:
[CRITICAL]:-gpstate failed. (Reason='FATAL: the database system is in recovery mode
--原主库恢复后,若想让其重新变为主库,可参考文档:
https://blog.csdn.net/yabingshi_tech/article/details/105224804
1.3 集群操作命令
gpstate -s #查看整个GP群集的状态
gpstate -m #查看segment mirror信息
gpstate -e #查看mirror的状态
gpstate -f #查看standby master的状态
gpstate -i #查看GP的版本
gp_sydb=# select *from gp_segment_configuration;
dbid | content | role | preferred_role | mode | status | port | hostname | address | datadir
------+---------+------+----------------+------+--------+------+----------+---------+--------------------------------------
7 | -1 | p | p | s | u | 5432 | pc1 | pc1 | /data/greenplum/data/master/gpseg-1
5 | 3 | p | p | s | u | 6001 | pc3 | pc3 | /data/greenplum/data/primary2/gpseg3
9 | 3 | m | m | s | u | 7001 | pc2 | pc2 | /data/greenplum/data/mirror2/gpseg3
4 | 2 | p | p | s | u | 6000 | pc3 | pc3 | /data/greenplum/data/primary1/gpseg2
8 | 2 | m | m | s | u | 7000 | pc2 | pc2 | /data/greenplum/data/mirror1/gpseg2
2 | 0 | p | p | s | u | 6000 | pc2 | pc2 | /data/greenplum/data/primary1/gpseg0
1 | 0 | m | m | s | u | 7000 | pc3 | pc3 | /data/greenplum/data/mirror1/gpseg0
3 | 1 | p | p | s | u | 6001 | pc2 | pc2 | /data/greenplum/data/primary2/gpseg1
6 | 1 | m | m | s | u | 7001 | pc3 | pc3 | /data/greenplum/data/mirror2/gpseg1
--各字段值介绍可以参考http://gpdb.docs.pivotal.io/530/ref_guide/system_catalogs/gp_segment_configuration.html
#停止集群
gpstop -M immediate #停止整个集群
gpstop -m #只停止master节点
#启动集群
gpstart -a
--本篇文章主要参考了https://blog.csdn.net/king13127/article/details/83989704#%E4%BA%94%E3%80%81%E6%95%B0%E6%8D%AE%E5%BA%93%E6%93%8D%E4%BD%9C及《GreenPlum企业应用实战》
本文来源:https://blog.csdn.net/yabingshi_tech/article/details/105182552