gpexpand扩展集群节点过程及问题解决

来源:互联网 发布:程序员技术博客模板 编辑:程序博客网 时间:2024/06/01 08:55

1.使用root用户修改相关参数

 主要是/etc/sysctl.conf和/etc/security/limits.conf和/etc/hostname

2.创建gpadmin组和用户,并安装相关的依赖包;

3.保持和之前集群的目录一致,安装greenplum;

4.配置新加入的主要和之前的所有主机的ssh互信;

注意:配置ssh互信时,由于ssh版本升级,导致使用gpssh-exkeys配置失败,所以只能使用每个节点配置的方法来完成,后续希望能找到方法进行优化。

5.使用gpexpand -f 创建扩展文件,这一步是交互的,主要是问你需要创建几个节点,每个节点的目录名称,完成后,会自动创建一个可扩展文件,此文件中写着扩展后所有的节点名称及对应的路径;

6.使用gpexpand -i expand_file扩展集群。

7.集群扩展过程中,会遇到扩展失败的问题,希望做好准备,不要慌张,仔细查找错误信息,并找到相关的日志信息,一般都能正常解决,下面是我遇到的问题和解决方法 

(1) 扩展失败时,要求使用gpexpand --rollbackup进行回滚

  看到扩展失败时,要求执行这个命令,当时也就执行了,但是扩展时发现集群已经处于shutdown状态,所以试着用gtstart命令进行启动,发现启动失败了,最后使用gpstart -m命令进行启动,也就是只启动gpmaster节点,启动后,就可以执行gpexpand --rollbackup了

(2) 扩展过程中,出现如下错误信息:

20161115:14:45:11:157784 gpexpand:ETL:gpadmin-[ERROR]:-gpexpand failed: ExecutionError: 'non-zero rc: 2' occured.  Details: 'GPSTART_INTERNAL_MASTER
_ONLY=1 $GPHOME/bin/gpstart -a -R -v'  cmd had rc=2 completed=True halted=False

.......

  stderr=''
20161115:14:35:06:136757 gpsegstart.py_storm2:gpadmin:storm2:gpadmin-[DEBUG]:-[worker4] finished cmd: Starting seg at dir /export/gpdata/gpdatam3/gp
seg6 cmdStr='env GPSESSID=0000000000 GPERA=01072a35fd4d98f5_161115143503 $GPHOME/bin/pg_ctl -D /export/gpdata/gpdatam3/gpseg6 -l /export/gpdata/gpda
tam3/gpseg6/pg_log/startup.log -w -t 600 -o " -p 50002 -b 24 -z 48 --silent-mode=true -i -M quiescent -C 6 " start 2>&1'  had result: cmd had rc=0 c
ompleted=True halted=False
  stdout='waiting for server to start.... done
server started in mirror or quiescent mode
'
  stderr=''
20161115:14:35:07:136757 gpsegstart.py_storm2:gpadmin:storm2:gpadmin-[DEBUG]:-[worker8] finished cmd: Starting seg at dir /export/gpdata/gpdatap1/gp
seg40 cmdStr='env GPSESSID=0000000000 GPERA=01072a35fd4d98f5_161115143503 $GPHOME/bin/pg_ctl -D /export/gpdata/gpdatap1/gpseg40 -l /export/gpdata/gp
datap1/gpseg40/pg_log/startup.log -w -t 600 -o " -p 40004 -b 58 -z 48 --silent-mode=true -i -M quiescent -C 40 " start 2>&1'  had result: cmd had rc
=1 completed=True halted=False
  stdout='waiting for server to start......pg_ctl: PID file "/export/gpdata/gpdatap1/gpseg40/postmaster.pid" does not exist
 stopped waiting
pg_ctl: could not start server
Examine the log output.

.........


如果简单的看最上面的日志信息,可以就被骗了,因为从最上面的日志信息中看不出任何解决问题的原因,所以接着网下看日志信息,终于发现,有很多节点都能正常启动,但是突然到某一节点时,就突然发现pid文件不存在了,看蓝色字本部分,由于每个节点都有各自的日志信息,所以试着去日志中去查找,终于在日志中发现了问题产生的原因

/export/gpdata/gpdatap1/gpseg40/pg_log/startup.log,日志中的信息如下所示:

2016-11-15 11:22:53.116290 CST,,,p129385,th1492498208,,,,0,,,seg-1,,,,,"FATAL","XX000","could not create semaphores: No space left on device (pg_sem
a.c:132)","Failed system call was semget(40002049, 17, 03600).","This error does *not* mean that you have run out of disk space.
It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), 
would be exceeded.  You need to raise the respective kernel parameter.  Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its
 max_connections parameter (currently 750).

The PostgreSQL documentation contains more information about configuring your system for PostgreSQL.",,,,,,"InternalIpcSemaphoreCreate","pg_sema.c",
132,1    0xb07dce postgres errstart + 0x4de
2    0x8dde58 postgres PGSemaphoreCreateInitVal + 0x328
3    0xbfbb63 postgres FileRepIpc_ShmemInit + 0x1a3
4    0x95fb7f postgres CreateSharedMemoryAndSemaphores + 0x59f
5    0x8fa4ad postgres PostmasterMain + 0xc5d
6    0x7fc8bf postgres main + 0x44f
7    0x367541ed1d libc.so.6 __libc_start_main + 0xfd
8    0x4c4869 postgres <symbol not found> + 0x4c4869


原因出在了共享内存参数上,如下所示:

[root@GP-Master gpdata]# ipcs -ls
------ Semaphore Limits --------
max number of arrays = 2560
max semaphores per array = 50100
max semaphores system wide = 128256000
max ops per semop call = 50100
semaphore max value = 32767


解决方案:

先设置参数如下,并使之生效,发现还是报同样的错误

kernel.sem = 5010 1282560 5010 256
重新设置参数如下:

kernel.sem = 50100 128256000 50100 2560

再次扩展,发现成功了。

总结:看来对如下参数的理解还是不到位,需要再次补充知识。

SEMMSL 每个信号量set中信号量最大个数
SEMMNS linux系统中信号量最大个数
SEMOPM semop系统调用允许的信号量最大个数设置,设置成和SEMMSL一样即可
SEMMNI  linux系统信号量set最大个数

0 0
原创粉丝点击