diff options
author | Pavan Deolasee | 2014-12-17 06:27:45 +0000 |
---|---|---|
committer | Pavan Deolasee | 2015-04-15 05:46:43 +0000 |
commit | 72a588dac2b662f72f8a67a4cf0ada7b506e621a (patch) | |
tree | d62ce1268f5375ac56819e2dbbcd19cd6b4a5c89 | |
parent | 255fb63ceacae6bd1060f3dd391cec441f58b8eb (diff) |
Cleanup old bash scripts in pgxc_ctl contrib module and other changes.
This patch also removes certain files from git repository which are
auto-generated when the utility is built. The recent changes to create
different config templates is also integrated into the auto-generation
mechanism.
Some changes in this patch are contributed by Jov and there are bunch of other
changes made by me.
-rw-r--r-- | contrib/pgxc_ctl/Makefile | 12 | ||||
-rw-r--r-- | contrib/pgxc_ctl/do_command.c | 3 | ||||
-rwxr-xr-x | contrib/pgxc_ctl/make_signature | 33 | ||||
-rwxr-xr-x | contrib/pgxc_ctl/pgxc_ctl.bash | 5361 | ||||
-rw-r--r-- | contrib/pgxc_ctl/pgxc_ctl_bash.c | 952 | ||||
-rwxr-xr-x | contrib/pgxc_ctl/pgxc_ctl_bash.org | 885 | ||||
-rwxr-xr-x | contrib/pgxc_ctl/pgxc_ctl_bash_2 | 3 | ||||
-rw-r--r-- | contrib/pgxc_ctl/pgxc_ctl_bash_conf_part | 0 | ||||
-rwxr-xr-x | contrib/pgxc_ctl/pgxc_ctl_conf_part_full (renamed from contrib/pgxc_ctl/pgxc_ctl_conf_part) | 10 | ||||
-rw-r--r-- | contrib/pgxc_ctl/pgxc_ctl_conf_part_minimal | 267 | ||||
-rw-r--r-- | contrib/pgxc_ctl/signature.h | 15 |
11 files changed, 316 insertions, 7225 deletions
diff --git a/contrib/pgxc_ctl/Makefile b/contrib/pgxc_ctl/Makefile index 6d4f6006f3..e94d72f144 100644 --- a/contrib/pgxc_ctl/Makefile +++ b/contrib/pgxc_ctl/Makefile @@ -12,7 +12,7 @@ PGFILEDESC = "pgxc_ctl - Provide XC configuration and opeation" PGAPPICON = win32 PROGRAM= pgxc_ctl -OBJS= bash_handler.o config.o pgxc_ctl.o pgxc_ctl_bash.o variables.o pgxc_ctl_log.o do_command.o \ +OBJS= pgxc_ctl_bash.o bash_handler.o config.o pgxc_ctl.o variables.o pgxc_ctl_log.o do_command.o \ utils.o do_shell.o gtm_cmd.o coord_cmd.o datanode_cmd.o gtm_util.o mcxt.o monitor.o @@ -36,10 +36,10 @@ include $(top_builddir)/src/Makefile.global include $(top_srcdir)/contrib/contrib-global.mk endif -pgxc_ctl_bash.c: pgxc_ctl_conf_part pgxc_ctl_bash_2 +pgxc_ctl_bash.c: pgxc_ctl_conf_part_full pgxc_ctl_conf_part_minimal pgxc_ctl_bash_2 ./make_signature - touch pgxc_ctl_bash.c - touch pgxc_ctl_bash_conf_part -clean_script: - rm -f pgxc_ctl_bash.c +clean: clean-script + +clean-script: + rm -f pgxc_ctl_bash.c signature.h diff --git a/contrib/pgxc_ctl/do_command.c b/contrib/pgxc_ctl/do_command.c index 9201d8c035..49ee7ff983 100644 --- a/contrib/pgxc_ctl/do_command.c +++ b/contrib/pgxc_ctl/do_command.c @@ -2368,6 +2368,9 @@ int do_singleLine(char *buf, char *wkline) config_type = CONFIG_COMPLETE; else if (token) config_path = strdup(token); + + if (GetToken() != NULL) + config_path = strdup(token); } do_prepareConfFile(config_path, config_type); diff --git a/contrib/pgxc_ctl/make_signature b/contrib/pgxc_ctl/make_signature index bdc3d42ebf..f0ddce2484 100755 --- a/contrib/pgxc_ctl/make_signature +++ b/contrib/pgxc_ctl/make_signature @@ -108,7 +108,7 @@ EOF rm pgxc_ctl_bash.c.wk -cp pgxc_ctl_conf_part pgxc_ctl_conf_part.wk +cp pgxc_ctl_conf_part_full pgxc_ctl_conf_part.wk ex pgxc_ctl_conf_part.wk <<EOF %s/"/\\\"/g @@ -138,3 +138,34 @@ NULL EOF rm pgxc_ctl_conf_part.wk + +cp pgxc_ctl_conf_part_minimal pgxc_ctl_conf_part.wk + +ex pgxc_ctl_conf_part.wk <<EOF +%s/"/\\\"/g +w +%s/^\(.*\)$/"\1",/ +%s/^"#ifdef XCP",$/#ifdef XCP/ +%s/^"#endif",$/#endif/ +wq +EOF + +cat >> pgxc_ctl_bash.c <<EOF +/* + * Prototype of pgxc_ctl configuration file. + * + * It should be self descripting. Can be extracted to your pgxc_ctl + * work directory with 'prepare config' command. + */ + +char *pgxc_ctl_conf_prototype_minimal[] = { +EOF + +cat pgxc_ctl_conf_part.wk >> pgxc_ctl_bash.c + +cat >> pgxc_ctl_bash.c <<EOF +NULL +}; +EOF + +rm pgxc_ctl_conf_part.wk diff --git a/contrib/pgxc_ctl/pgxc_ctl.bash b/contrib/pgxc_ctl/pgxc_ctl.bash deleted file mode 100755 index 6cf5b95d85..0000000000 --- a/contrib/pgxc_ctl/pgxc_ctl.bash +++ /dev/null @@ -1,5361 +0,0 @@ -#!/bin/bash -# -# TODO -# * Backup configuration file (at update, too) to some remote site for pgxc_ctl HA feature too. -# * Write output of *_ctl, intdb and intgtm result to log files -# * Write every operation to the log. Log file can be specified with --l file or --log file -# * Configure log level -# * Switch log log file -# * Log option to the configuration file so that this can be failed over. -# * Log to a remote server? -# * Multiple log? -# -# Configuration file. Configuration file can be specified as -c option of -# the command like, or PGXCCONFIG environment variable. If both are -# not specified, the following configuration file will be used. -# -# Change in the cluster status due to failover will be added to the configuration file so that -# new master can be invoked as the master when restarted. -# -# All such addition will be tagged with proper comment and date/time info. If you'd like to -# cancel such changes, you can remove or comment-out such additional lines. -# -# -#========================================================================================================================== -# -# Configuration Section -# -# This section should be in the file $configFile for -# user's configuration. -# -# Several assumptons: -# 1) configuration file will be set to data directory. -# configuration file name is fixed to postgresql.conf -# 2) pg_hba.conf will be set to data directory. File name is -# fixed to pg_hba.conf -# -#================================================================ -# MEMO -# -# max_connections, min_pool_size, max_pool_size --> should be configurable! -# They're not cluster specific. So we may give a chance to include -# these specific options to be included from external files. -# They should not change by failover so they just have to be -# configured at first time only. -#=============================================================== -# -#---- Configuration File -pgxcInstallDir=$HOME/pgxc -configFile=$pgxcInstallDir/pgxcConf -#---- OVERALL ----------------------------------------------------------------------------------------------------------- -# -pgxcOwner=koichi # owner of the Postgres-XC database cluster. Here, we use this - # both as linus user and database user. This must be - # the super user of each coordinator and datanode. -pgxcUser=$pgxcOwner # OS user of Postgres-XC owner - - -tmpDir=/tmp # temporary dir used in XC servers -localTmpDir=$tmpDir # temporary dir used here locally - -logOpt=y # If you want log -logDir=$pgxcInstallDir/pgxc_ctl_log # Directory to write pgxc_ctl logs - -configBackup=y # If you want config file backup -configBackupHost=pgxc-linker # host to backup config file -configBackupDir=$pgxcInstallDir -configBackupFile=$configFile # Backup file name - -#---- GTM -------------------------------------------------------------------------------------------------------------- - -# GTM is mandatory. You must have at least (and only) one GTM master in your Postgres-XC cluster. -# If GTM crashes and you need to reconfigure it, you can do it by pgxc_update_gtm command to update -# GTM master with others. Of course, we provide pgxc_remove_gtm command to remove it. This command -# will not stop the current GTM. It is up to the operator. - -#---- Overall ------- -gtmName=gtm - -#---- GTM Master ----------------------------------------------- - -#---- Overall ---- -gtmMasterServer=node13 -gtmMasterPort=20001 -gtmMasterDir=$HOME/pgxc/nodes/gtm - -#---- Configuration --- -gtmExtraConfig=none # Will be added gtm.conf for both Master and Slave (done at initilization only) -gtmMasterSpecificExtraConfig=none # Will be added to Master's gtm.conf (done at initialization only) - -#---- GTM Slave ----------------------------------------------- - -# Because GTM is a key component to maintain database consistency, you may want to configure GTM slave -# for backup. - -#---- Overall ------ -gtmSlave=y # Specify y if you configure GTM Slave. Otherwise, GTM slave will not be configured and - # all the following variables will be reset. -gtmSlaveServer=node12 # value none means GTM slave is not available. Give none if you don't configure GTM Slave. -gtmSlavePort=20001 # Not used if you don't configure GTM slave. -gtmSlaveDir=$HOME/pgxc/nodes/gtm # Not used if you don't configure GTM slave. -# Please note that when you have GTM failover, then there will be no slave available until you configure the slave -# again. (pgxc_add_gtm_slave function will handle it) - -#---- Configuration ---- -gtmSlaveSpecificExtraConfig=none # Will be added to Slave's gtm.conf (done at initialization only) - -#---- GTM Proxy ------------------------------------------------------------------------------------------------------- -# GTM proxy will be selected based upon which server each component runs on. -# When fails over to the slave, the slave inherits its master's gtm proxy. It should be -# reconfigured based upon the new location. -# -# To do so, slave should be restarted. So pg_ctl promote -> (edit postgresql.conf and recovery.conf) -> pg_ctl restart -# -# You don't have to configure GTM Proxy if you dont' configure GTM slave or you are happy if every component connects -# to GTM Master directly. If you configure GTL slave, you must configure GTM proxy too. - -#---- Shortcuts ------ -gtmProxyDir=$HOME/pgxc/nodes/gtm_pxy - -#---- Overall ------- -gtmProxy=y # Specify y if you conifugre at least one GTM proxy. You may not configure gtm proxies - # only when you dont' configure GTM slaves. - # If you specify this value not to y, the following parameters will be set to default empty values. - # If we find there're no valid Proxy server names (means, every servers are specified - # as none), then gtmProxy value will be set to "n" and all the entries will be set to - # empty values. -gtmProxyNames=(gtm_pxy1 gtm_pxy2 gtm_pxy3 gtm_pxy4) # No used if it is not configured -gtmProxyServers=(node06 node07 node08 node09) # Specify none if you dont' configure it. -gtmProxyPorts=(20001 20001 20001 20001) # Not used if it is not configured. -gtmProxyDirs=($gtmProxyDir $gtmProxyDir $gtmProxyDir $gtmProxyDir) # Not used if it is not configured. - -#---- Configuration ---- -gtmPxyExtraConfig=none # Extra configuration parameter for gtm_proxy -gtmPxySpecificExtraConfig=(none none none none) - -#---- Coordinators ---------------------------------------------------------------------------------------------------- - -#---- shortcuts ---------- -coordMasterDir=$HOME/pgxc/nodes/coord -coordSlaveDir=$HOME/pgxc/nodes/coord_slave -coordArchLogDir=$HOME/pgxc/nodes/coord_archlog - -#---- Overall ------------ -coordNames=(coord1 coord2 coord3 coord4) # Master and slave use the same name -coordPorts=(20004 20005 20004 20005) # Master and slave use the same port -poolerPorts=(20010 20011 20010 20011) # Master and slave use the same pooler port -coordPgHbaEntries=(192.168.1.0/24) # Assumes that all the coordinator (master/slave) accepts - # the same connection - # This entry allows only $pgxcOwner to connect. - # If you'd like to setup another connection, you should - # supply these entries through files specified below. -# Note: The above parameter is extracted as "host all all 0.0.0.0/0 trust". If you don't want -# such setups, specify the value () to this variable and suplly what you want using coordExtraPgHba -# and/or coordSpecificExtraPgHba variables. - -#---- Master ------------- -coordMasterServers=(node06 node07 node08 node09) # none means this master is not available -coordMasterDirs=($coordMasterDir $coordMasterDir $coordMasterDir $coordMasterDir) -coordMaxWALsernder=5 # max_wal_senders: needed to configure slave. If zero value is specified, - # it is expected to supply this parameter explicitly by external files - # specified in the following. If you don't configure slaves, leave this value to zero. -coordMaxWALSenders=($coordMaxWALsernder $coordMaxWALsernder $coordMaxWALsernder $coordMaxWALsernder) - # max_wal_senders configuration for each coordinator. - -#---- Slave ------------- -coordSlave=y # Specify y if you configure at least one coordiantor slave. Otherwise, the following - # configuration parameters will be set to empty values. - # If no effective server names are found (that is, every servers are specified as none), - # then coordSlave value will be set to n and all the following values will be set to - # empty values. -coordSlaveServers=(node07 node08 node09 node06) # none means this slave is not available -coordSlaveDirs=($coordSlaveDir $coordSlaveDir $coordSlaveDir $coordSlaveDir) -coordArchLogDirs=($coordArchLogDir $coordArchLogDir $coordArchLogDir $coordArchLogDir) - -#---- Configuration files--- -# Need these when you'd like setup specific non-default configuration -# These files will go to corresponding files for the master. -# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries -# Or you may supply these files manually. -coordExtraConfig=none # Extra configuration file for coordinators. This file will be added to all the coordinators' - # postgresql.conf -coordSpecificExraConfig=(none none none none) -coordExtraPgHba=none # Extra entry for pg_hba.conf. This file will be added to all the coordinators' pg_hba.conf -coordSpecificExtraPgHba=(none none none none) - -#---- Datanodes ------------------------------------------------------------------------------------------------------- - -#---- Shortcuts -------------- -datanodeMasterDir=$HOME/pgxc/nodes/dn_master -datanodeSlaveDir=$HOME/pgxc/nodes/dn_slave -datanodeArchLogDir=$HOME/pgxc/nodes/datanode_archlog - -#---- Overall --------------- -#primaryDatanode=datanode1 # Primary Node. -# At present, xc has a priblem to issue ALTER NODE against the primay node. Until it is fixed, the test will be done -# without this feature. -primaryDatanode=datanode1 # Primary Node. -datanodeNames=(datanode1 datanode2 datanode3 datanode4) -datanodePorts=(20008 20009 20008 20009) # Master and slave use the same port! -datanodePoolerPorts=(20011 20012 20011 20012) # Master and slave use the same port! -datanodePgHbaEntries=(192.168.1.0/24) # Assumes that all the coordinator (master/slave) accepts - # the same connection - # This list sets up pg_hba.conf for $pgxcOwner user. - # If you'd like to setup other entries, supply them - # through extra configuration files specified below. -# Note: The above parameter is extracted as "host all all 0.0.0.0/0 trust". If you don't want -# such setups, specify the value () to this variable and suplly what you want using datanodeExtraPgHba -# and/or datanodeSpecificExtraPgHba variables. - -#---- Master ---------------- -datanodeMasterServers=(node06 node07 node08 node09) # none means this master is not available. - # This means that there should be the master but is down. - # The cluster is not operational until the master is - # recovered and ready to run. -datanodeMasterDirs=($datanodeMasterDir $datanodeMasterDir $datanodeMasterDir $datanodeMasterDir) -datanodeMaxWalSender=5 # max_wal_senders: needed to configure slave. If zero value is - # specified, it is expected this parameter is explicitly supplied - # by external configuration files. - # If you don't configure slaves, leave this value zero. -datanodeMaxWalSenders=($datanodeMaxWalSender $datanodeMaxWalSender $datanodeMaxWalSender $datanodeMaxWalSender) - # max_wal_senders configuration for each datanode - -#---- Slave ----------------- -datanodeSlave=y # Specify y if you configure at least one coordiantor slave. Otherwise, the following - # configuration parameters will be set to empty values. - # If no effective server names are found (that is, every servers are specified as none), - # then datanodeSlave value will be set to n and all the following values will be set to - # empty values. -datanodeSlaveServers=(node07 node08 node09 node06) # value none means this slave is not available -datanodeSlaveDirs=($datanodeSlaveDir $datanodeSlaveDir $datanodeSlaveDir $datanodeSlaveDir) -datanodeArchLogDirs=( $datanodeArchLogDir $datanodeArchLogDir $datanodeArchLogDir $datanodeArchLogDir ) - -# ---- Configuration files --- -# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries here. -# These files will go to corresponding files for the master. -# Or you may supply these files manually. -datanodeExtraConfig=none # Extra configuration file for datanodes. This file will be added to all the - # datanodes' postgresql.conf -datanodeSpecificExtraConfig=(none none none none) -datanodeExtraPgHba=none # Extra entry for pg_hba.conf. This file will be added to all the datanodes' postgresql.conf -datanodeSpecificExtraPgHba=(none none none none) - -# -# End of Configuration Section -# -#========================================================================================================================== - -# Common variables ###################################################################### -xc_prompt='PGXC$ ' -interactive=n -verbose=n -progname=$0 - -# Create config file template -# -# If you change the structure of configuration file section, you must reflect the change in the part below. -# -function create_config_file_template -{ - cat > $configFile <<EOF -#!/bin/bash -#========================================================================================================================== -# -# Configuration Section -# -# This section should be in the file $configFile for -# user's configuration. -# -# Several assumptons: -# 1) configuration file will be set to data directory. -# configuration file name is fixed to postgresql.conf -# 2) pg_hba.conf will be set to data directory. File name is -# fixed to pg_hba.conf -# -#================================================================ -# MEMO -# -# max_connections, min_pool_size, max_pool_size --> should be configurable! -# They're not cluster specific. So we may give a chance to include -# these specific options to be included from external files. -# They should not change by failover so they just have to be -# configured at first time only. -#=============================================================== -# -#---- Configuration File -# -# If you're using non-default config file, you should specify config file each time you invoke pgxc_ctl -pgxcInstallDir=$HOME/pgxc -configFile=$pgxcInstallDir/pgxcConf -#---- OVERALL ----------------------------------------------------------------------------------------------------------- -# -pgxcOwner=koichi # owner of the Postgres-XC database cluster. Here, we use this - # both as linus user and database user. This must be - # the super user of each coordinator and datanode. -pgxcUser=$pgxcOwner # OS user of Postgres-XC owner - - -tmpDir=/tmp # temporary dir used in XC servers -localTmpDir=$tmpDir # temporary dir used here locally - -logOpt=y # If you want log -logDir=$pgxcInstallDir/pgxc_ctl_log # Directory to write pgxc_ctl logs - -configBackup=y # If you want config file backup -configBackupHost=pgxc-linker # host to backup config file -configBackupFile=$configFile # Backup file name - -#---- GTM -------------------------------------------------------------------------------------------------------------- - -# GTM is mandatory. You must have at least (and only) one GTM master in your Postgres-XC cluster. -# If GTM crashes and you need to reconfigure it, you can do it by pgxc_update_gtm command to update -# GTM master with others. Of course, we provide pgxc_remove_gtm command to remove it. This command -# will not stop the current GTM. It is up to the operator. - -#---- Overall ------- -gtmName=gtm - -#---- GTM Master ----------------------------------------------- - -#---- Overall ---- -gtmMasterServer=node13 -gtmMasterPort=20001 -gtmMasterDir=$HOME/pgxc/nodes/gtm - -#---- Configuration --- -gtmExtraConfig=none # Will be added gtm.conf for both Master and Slave (done at initilization only) -gtmMasterSpecificExtraConfig=none # Will be added to Master's gtm.conf (done at initialization only) - -#---- GTM Slave ----------------------------------------------- - -# Because GTM is a key component to maintain database consistency, you may want to configure GTM slave -# for backup. - -#---- Overall ------ -gtmSlave=y # Specify y if you configure GTM Slave. Otherwise, GTM slave will not be configured and - # all the following variables will be reset. -gtmSlaveServer=node12 # value none means GTM slave is not available. Give none if you don't configure GTM Slave. -gtmSlavePort=20001 # Not used if you don't configure GTM slave. -gtmSlaveDir=$HOME/pgxc/nodes/gtm # Not used if you don't configure GTM slave. -# Please note that when you have GTM failover, then there will be no slave available until you configure the slave -# again. (pgxc_add_gtm_slave function will handle it) - -#---- Configuration ---- -gtmSlaveSpecificExtraConfig=none # Will be added to Slave's gtm.conf (done at initialization only) - -#---- GTM Proxy ------------------------------------------------------------------------------------------------------- -# GTM proxy will be selected based upon which server each component runs on. -# When fails over to the slave, the slave inherits its master's gtm proxy. It should be -# reconfigured based upon the new location. -# -# To do so, slave should be restarted. So pg_ctl promote -> (edit postgresql.conf and recovery.conf) -> pg_ctl restart -# -# You don't have to configure GTM Proxy if you dont' configure GTM slave or you are happy if every component connects -# to GTM Master directly. If you configure GTL slave, you must configure GTM proxy too. - -#---- Shortcuts ------ -gtmProxyDir=$HOME/pgxc/nodes/gtm_pxy - -#---- Overall ------- -gtmProxy=y # Specify y if you conifugre at least one GTM proxy. You may not configure gtm proxies - # only when you dont' configure GTM slaves. - # If you specify this value not to y, the following parameters will be set to default empty values. - # If we find there're no valid Proxy server names (means, every servers are specified - # as none), then gtmProxy value will be set to "n" and all the entries will be set to - # empty values. -gtmProxyNames=(gtm_pxy1 gtm_pxy2 gtm_pxy3 gtm_pxy4) # No used if it is not configured -gtmProxyServers=(node06 node07 node08 node09) # Specify none if you dont' configure it. -gtmProxyPorts=(20001 20001 20001 20001) # Not used if it is not configured. -gtmProxyDirs=($gtmProxyDir $gtmProxyDir $gtmProxyDir $gtmProxyDir) # Not used if it is not configured. - -#---- Configuration ---- -gtmPxyExtraConfig=none # Extra configuration parameter for gtm_proxy -gtmPxySpecificExtraConfig=(none none none none) - -#---- Coordinators ---------------------------------------------------------------------------------------------------- - -#---- shortcuts ---------- -coordMasterDir=$HOME/pgxc/nodes/coord -coordSlaveDir=$HOME/pgxc/nodes/coord_slave -coordArchLogDir=$HOME/pgxc/nodes/coord_archlog - -#---- Overall ------------ -coordNames=(coord1 coord2 coord3 coord4) # Master and slave use the same name -coordPorts=(20004 20005 20004 20005) # Master and slave use the same port -poolerPorts=(20010 20011 20010 20011) # Master and slave use the same pooler port -coordPgHbaEntries=(192.168.1.0/24) # Assumes that all the coordinator (master/slave) accepts - # the same connection - # This entry allows only $pgxcOwner to connect. - # If you'd like to setup another connection, you should - # supply these entries through files specified below. -# Note: The above parameter is extracted as "host all all 0.0.0.0/0 trust". If you don't want -# such setups, specify the value () to this variable and suplly what you want using coordExtraPgHba -# and/or coordSpecificExtraPgHba variables. - -#---- Master ------------- -coordMasterServers=(node06 node07 node08 node09) # none means this master is not available -coordMasterDirs=($coordMasterDir $coordMasterDir $coordMasterDir $coordMasterDir) -coordMaxWALsernder=5 # max_wal_senders: needed to configure slave. If zero value is specified, - # it is expected to supply this parameter explicitly by external files - # specified in the following. If you don't configure slaves, leave this value to zero. -coordMaxWALSenders=($coordMaxWALsernder $coordMaxWALsernder $coordMaxWALsernder $coordMaxWALsernder) - # max_wal_senders configuration for each coordinator. - -#---- Slave ------------- -coordSlave=y # Specify y if you configure at least one coordiantor slave. Otherwise, the following - # configuration parameters will be set to empty values. - # If no effective server names are found (that is, every servers are specified as none), - # then coordSlave value will be set to n and all the following values will be set to - # empty values. -coordSlaveServers=(node07 node08 node09 node06) # none means this slave is not available -coordSlaveDirs=($coordSlaveDir $coordSlaveDir $coordSlaveDir $coordSlaveDir) -coordArchLogDirs=($coordArchLogDir $coordArchLogDir $coordArchLogDir $coordArchLogDir) - -#---- Configuration files--- -# Need these when you'd like setup specific non-default configuration -# These files will go to corresponding files for the master. -# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries -# Or you may supply these files manually. -coordExtraConfig=none # Extra configuration file for coordinators. This file will be added to all the coordinators' - # postgresql.conf -coordSpecificExraConfig=(none none none none) -coordExtraPgHba=none # Extra entry for pg_hba.conf. This file will be added to all the coordinators' pg_hba.conf -coordSpecificExtraPgHba=(none none none none) - -#---- Datanodes ------------------------------------------------------------------------------------------------------- - -#---- Shortcuts -------------- -datanodeMasterDir=$HOME/pgxc/nodes/dn_master -datanodeSlaveDir=$HOME/pgxc/nodes/dn_slave -datanodeArchLogDir=$HOME/pgxc/nodes/datanode_archlog - -#---- Overall --------------- -#primaryDatanode=datanode1 # Primary Node. -# At present, xc has a priblem to issue ALTER NODE against the primay node. Until it is fixed, the test will be done -# without this feature. -primaryDatanode=N/A # Primary Node. -datanodeNames=(datanode1 datanode2 datanode3 datanode4) -datanodePorts=(20008 20009 20008 20009) # Master and slave use the same port! -datanodePoolerPorts=(20011 20012 20011 20012) # Master and slave use the same port! -datanodePgHbaEntries=(192.168.1.0/24) # Assumes that all the coordinator (master/slave) accepts - # the same connection - # This list sets up pg_hba.conf for $pgxcOwner user. - # If you'd like to setup other entries, supply them - # through extra configuration files specified below. -# Note: The above parameter is extracted as "host all all 0.0.0.0/0 trust". If you don't want -# such setups, specify the value () to this variable and suplly what you want using datanodeExtraPgHba -# and/or datanodeSpecificExtraPgHba variables. - -#---- Master ---------------- -datanodeMasterServers=(node06 node07 node08 node09) # none means this master is not available. - # This means that there should be the master but is down. - # The cluster is not operational until the master is - # recovered and ready to run. -datanodeMasterDirs=($datanodeMasterDir $datanodeMasterDir $datanodeMasterDir $datanodeMasterDir) -datanodeMaxWalSender=5 # max_wal_senders: needed to configure slave. If zero value is - # specified, it is expected this parameter is explicitly supplied - # by external configuration files. - # If you don't configure slaves, leave this value zero. -datanodeMaxWalSenders=($datanodeMaxWalSender $datanodeMaxWalSender $datanodeMaxWalSender $datanodeMaxWalSender) - # max_wal_senders configuration for each datanode - -#---- Slave ----------------- -datanodeSlave=y # Specify y if you configure at least one coordiantor slave. Otherwise, the following - # configuration parameters will be set to empty values. - # If no effective server names are found (that is, every servers are specified as none), - # then datanodeSlave value will be set to n and all the following values will be set to - # empty values. -datanodeSlaveServers=(node07 node08 node09 node06) # value none means this slave is not available -datanodeSlaveDirs=($datanodeSlaveDir $datanodeSlaveDir $datanodeSlaveDir $datanodeSlaveDir) -datanodeArchLogDirs=( $datanodeArchLogDir $datanodeArchLogDir $datanodeArchLogDir $datanodeArchLogDir ) - -# ---- Configuration files --- -# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries here. -# These files will go to corresponding files for the master. -# Or you may supply these files manually. -datanodeExtraConfig=none # Extra configuration file for datanodes. This file will be added to all the - # datanodes' postgresql.conf -datanodeSpecificExtraConfig=(none none none none) -datanodeExtraPgHba=none # Extra entry for pg_hba.conf. This file will be added to all the datanodes' postgresql.conf -datanodeSpecificExtraPgHba=(none none none none) - -# -# End of Configuration Section -# -#========================================================================================================================== -EOF - - chmod +x $configFile -} -#============================================================ -# -# Common functions -# -#============================================================ - -logfile=none; -function log_echo -{ - if [ $logOpt == "y" ]; then - echo $* >> $logfile - fi -} - -function log_echo_with_date -{ - if [ $logOpt == "y" ]; then - echo `date +%y%m%d,%H:%M:%S` $* >> $logfile - fi -} - -function set_log_file -{ - mkdir -p $logDir - if [ -d $logDir ]; then - logfile=$logDir/pgxc_ctl_$datetime.log - else - logOpt=n - eecho Log directory $logDir could not found or is not a directory. - fi -} - -function change_log_file -{ - if [ $logOpt == y ]; then - logfile=$logDir/$1 - else - eecho Log disabled. Cannot change log file. - fi -} - -function vecho -{ - if [ "$verbose" == y ]; then - echo $* - fi - log_echo $* -} - -function iecho -{ - if [ "$interactive" == y ]; then - echo $* - fi -} - -function eecho -{ - echo $* - log_echo $* -} - -function doit -{ - vecho $* - $* -} - -function doall -{ - local i - vecho doall target: "(" ${allServers[@]} ")" - for (( i=0; i< ${#allServers[@]}; i++ )); do - if [ ${allServers[$i]} != none ] && [ ${allServers[$i]} != N/A ]; then - vecho "... ${allServers[$i]}: $* ..." - ssh $pgxcUser@${allServers[$i]} $* - fi - done -} - -function Doall -{ - local i - vecho Doall target: "(" ${DoallTarget[@]} ")" - for (( i=0; i< ${#DoallTarget[@]}; i++ )); do - if [ ${DoallTarget[$i]} != none ] && [ ${DoallTarget[$i]} != N/A ]; then - vecho "${DoallTarget[$i]}: $* ..." - ssh $pgxcUser@${DoallTarget[$i]} $* - fi - done -} - -function cpall -{ - local i - vecho cpall target: "(" ${allServers[@]} ")" - for (( i=0; i < ${#allServers[@]}; i++ )); do - if [ ${allServers[$i]} != none ] && [ ${allServers[$i]} != N/A ]; then - vecho scp -r $1 $pgxcUser@${allServers[$i]}:$2 - scp -r $1 $pgxcUser@${allServers[$i]}:$2 - fi - done -} - -function Cpall -{ - local i - vecho Cpall target: "(" ${CpallTarget[@]} ")" - for (( i=0; i< ${#CpallTarget[@]}; i++ )); do - if [ ${CpallTarget[$i]} != none ] && [ ${CpallTarget[$i]} != N/A ]; then - vecho scp -r $1 $pgxcUser@${CpallTarget[$i]}:$2 - scp -r $1 $pgxcUser@${CpallTarget[$i]}:$2 - fi - done -} - - -function set_verbose -{ - if [ $# -le 0 ]; then - echo verbose=$verbose - return - fi - case $1 in - y ) - verbose=y;; - n ) - verbose=n;; - on ) - verbose=y;; - off ) - verbose=n;; - * ) - echo Specify y/n/on/off - return 1;; - esac - iecho Verbose set to $verbose - return 0 -} - -function set_interactive -{ - if [ $# -le 0 ]; then - echo interactive=$interactive - return - fi - case $1 in - y ) - interactive=y;; - n ) - interactive=n;; - on ) - interactive=y;; - off ) - interactive=n;; - * ) - echo Specify y/n/on/off - return 1;; - esac - iecho Interactive set to $interactive - return 0 -} -function set_prompt -{ - if [ $# -le 0 ]; then - echo xc_prompt=$xc_prompt - return - fi - xc_prompt=$1 - iecho Prompt set to $xc_prompt -} - -function readyesno -{ - if [ $# -ne 1 ];then - echo n - return 1 - fi - local yesno - read yesno - case $yesno in - y ) - echo y;; - yes ) - echo y;; - n ) - echo n;; - no ) - echo n;; - * ) - echo $1;; - esac -} - -# -# Backups configuration file, especially done when configuraiton file is updated due to -# failover. -# -function pgxc_backup_config_file -{ - if [ "$configBackup" == "y" ]; then - log_echo Backing up configuration file $configFile to $configBackupHost:$configBackupFile - doit ssh $pgxcUser@$configBackupHost mkdir -p $configBackupDir - doit scp $configFile $pgxcUser@$configBackupHost:$configBackupFile - fi -} -datetime=`date +%y%m%d_%H%M` -immediate="-m fast" # option for pg_ctl stop. - -allServers=() # List of all the servers which appear in this configuation. - -############################################################################################################## -# -# FUNCTIONS -# -############################################################################################################## - -function create_config_file -{ - # The configuration file is just a copy of the above configuraiton section. If you modify the above, - # you should reflect it to the below too. - cat > $configFile <<EOF -#!/bin/bash -# The context will be supplied finally... -EOF -} - -# -# A couple of following functions helps to kill all the processes of specified -# coordinator or datanode. Target coordinator or datanode are identified by -# the server and the working directory. -# -# They depend upon ps output format. It depends upon specific operating system -# and may need rewrite. -# -function extract_pid -{ - # Caution: ps format deeply depends upon operating system. - # Checked for CentOS (RHEL), Ubuntu 10.4, ubuntu 12.4. - local uid - local pid - local extra - read uid pid extra - if [ $? == 0 ]; then - echo $pid - else - echo none - fi -} - -function get_postmaster_pid -{ - # arguments are server and directory - # Caution: ps format deeply depends upon operating system. - # Checked for CentOS (RHEL), Ubuntu 10.4, ubuntu 12.4. - # This assumes that grep extracts at most one line. - ssh $pgxcUser@$1 ps -f -C postgres | grep $2 | extract_pid -} - -# -# Get next xid of the node. Used to determine what xid gtm should start with. -# -# $1: host -# $2: dir -# Result will be set to the variable nextXid, which is declared as number -# -declare -i nextXid - -function get_nextXid -{ - nextXid=`ssh $pgxcUser@$1 pg_controldata $2 | grep NextXid | sed -e "s%.*/%%"` -} - -function kill_all_child_parent -{ - # argument is the target node name and the PID of the parent. - if [ $# -ne 2 ]; then - iecho Specify nodename and parent PID - return 1 - fi - if [ "$2" == "" ] || [ $2 == none ] || [ $2 == N/A ]; then - return 1 - fi - ssh $pgxcUser@$1 kill -9 $2 `ssh $pgxcUser@$1 pgrep -P $2` -} - -#---------------------------------------------- -# DEBUG Aid -#---------------------------------------------- - -# Debug --> Should be cleaned - -DEBUG=n - -function set_debug -{ - if [ $# -le 0 ]; then - iecho Specify y/n/on/off - return 1 - fi - case $1 in - y ) - DEBUG=y - ;; - n ) - DEBUG=n;; - on ) - DEBUG=y;; - off ) - DEBUG=n;; - * ) - iecho Specify y/n/on/off - return 1;; - esac - iecho Debug mode set to $DEBUG - return 0 -} - -function funcname -{ - if [ "$DEBUG" == y ]; then - echo '******** ' "$1() called" ' **********' - fi -} - -function decho -{ - if [ "$DEBUG" == y ]; then - echo $* - fi -} - -function ddo -{ - if [ "$DEBUG" == y ]; then - $* - fi -} - -# Extract the server list into ${allServers[@]} -# Check if there's no duplicate elements in ${allServers[@]}. If not, then add the argument -# to ${allServers[@]} -function addServer -{ - local append - local i - - append=y - if [ "$1" == 'none' ] || [ "$i" == N/A ]; then - return - fi - for((i=0; i<${#allServers[@]}; i++)); do - if [ ${allServers[$i]} == "$1" ]; then - append=n - break - fi - done - if [ $append == y ]; then - allServers[$i]=$1 - fi -} - -# Build unique server list -# -function makeServerList -{ - local i - - # GTM Master - if [ $gtmMasterServer != none ]; then - addServer $gtmMasterServer - fi - # GTM Slave - if [ $gtmSlaveServer != none ]; then - addServer $gtmSlaveServer - fi - # GTM Proxy - for ((i=0; i<${#gtmProxyServers[@]};i++)); do - if [ ${gtmProxyServers[$i]} != 'none' -a ${gtmProxyServers[$i]} != "" ]; then - addServer ${gtmProxyServers[$i]} - fi - done - # Coordinator Master - for ((i=0; i<${#coordMasterServers[@]}; i++)); do - if [ ${coordMasterServers[$i]} != none ]; then - addServer ${coordMasterServers[$i]} - fi - done - # Coordinator Slave - for ((i=0; i<${#coordSlaveServers[@]}; i++)); do - if [ ${coordSlaveServers[$i]} != none ]; then - addServer ${coordSlaveServers[$i]} - fi - done - # Datanode Master - for ((i=0; i<${#datanodeMasterServers[@]}; i++)); do - if [ ${datanodeMasterServers[$i]} != none ]; then - addServer ${datanodeMasterServers[$i]} - fi - done - # Datanode Slave - for ((i=0; i<${#datanodeSlaveServers[@]}; i++)); do - if [ ${datanodeSlaveServers[$i]} != none ] ; then - addServer ${datanodeSlaveServers[$i]} - fi - done - decho '(' ${allServers[@]} ')' -} - -#### Handle Slave Configurations ################################### - -# Set GTM Proxy info unconfigured. -function gtm_proxy_set_to_no -{ - local i - - gtmProxy=n - gtmProxyNames=() - gtmProxyServers=() - gtmProxyPorts=() - gtmProxyDirs=() - gtmPxySpecificExtraConfig=() - gtmPxyExtraConfig="" - for ((i=0; i< ${#allServers[@]}; i++)); do - gtmProxyNames[$i]="none" - gtmProxyServers[$i]="none" - gtmProxyPorts[$i]=0 - gtmProxyDirs[$i]="none" - gtmProxySpecificExtraConfig[$i]="" - done -} - -# Set Coordinator Slave info unconfigured -function coord_slave_set_to_no -{ - local i - - coordSlave=n - coordSlaveServers=() - coordSlaveDirs=() - coordArchLogDirs=() - for ((i=0; i<${#coordMasterServers[@]}; i++)); do - coordSlaveServers[$i]=none - coordSlaveDirs[$i]=none - coordArchLogDirs[$i]=none - done -} - -# Set Datanode slave info unconfigured -function datanode_slave_set_to_no -{ - local i - - datanodeSlave=n - datanodeSlaveServers=() - datanodeSlaveDirs=() - datanodeSlaveArchLogDirs=() - for ((i=0; i<${#datanodeMasterServers[@]}; i++)); do - datanodeSlaveServers[$i]=none - datanodeSlaveDirs[$i]=none - datanodeSlaveArchLogDirs[$i]=none - done -} - -# Handle the case where slaves are not configured. --> Construct empty configuration for them -# We assume that all the server list has been constructed. - -function handle_no_slaves -{ - local i - local isEmpty - - # GTM slave - if [ $gtmSlave != y ] || [ "$gtmSlaveServer" == none ] || [ "$gtmSlaveServer" == N/A ]; then - gtmSlave=n - gtmSlaveServer=none - gtmSlavePort=0 - gtmSlaveDir=none - fi - - # GTM Proxy - if [ $gtmProxy != y ]; then - gtm_proxy_set_to_no - else - isEmpty=y - for ((i=0; i<${#gtmProxyServers[@]}; i++)); do - if [ ${gtmProxyServers[$i]} != none ] && [ ${gtmProxyServers[$i]} != N/A ]; then - isEmpty=n - break - fi - done - if [ "$isEmpty" == y ]; then - gtm_proxy_set_to_no - gtmProxy=n - fi - fi - - # Coordinator - if [ $coordSlave != y ]; then - coord_slave_set_to_no - else - isEmpty=y - for ((i=0; i<${#coordSlaveServers[@]}; i++)); do - if [ ${coordSlaveServers[$i]} != none ] && [ ${coordSlaveServers[$i]} != N/A ]; then - isEmpty=n - break - fi - done - if [ "$isEmpty" == y ]; then - coord_slave_set_to_no - coordSlave=n - fi - fi - - # Datanode - if [ $datanodeSlave != y ]; then - datanode_slave_set_to_no - else - isEmpty=y - for ((i=0; i<${#datanodeSlaveServers[@]}; i++)); do - if [ ${datanodeSlaveServers[$i]} != none ] && [ ${coordSlaveServers[$I]} != N/A ]; then - isEmpty=n - break - fi - done - if [ "$isEmpty" == y ]; then - datanode_slave_set_to_no - datanodeSlave=n - fi - fi -} - - - -# Check if there're no duplicates in port and working directory assigment -function verifyResource -{ - local i - local j - - # Number of array entries - # GTM proxies - if [ "$gtmProxy" == y ]; then - i=${#gtmProxyNames[@]} - if [ $i -ne ${#gtmProxyServers[@]} -o $i -ne ${#gtmProxyPorts[@]} -o $i -ne ${#gtmProxyDirs[@]} -o $i -ne ${#gtmPxySpecificExtraConfig[@]} ]; then - echo ERROR: Invalid entry numbers in gtm proxy configuration. - return 1 - fi - fi - # Coordinators - i=${#coordNames[@]} - if [ $i -ne ${#coordPorts[@]} -o $i -ne ${#poolerPorts[@]} -o $i -ne ${#coordSpecificExraConfig[@]} -o $i -ne ${#coordSpecificExtraPgHba[@]} ]; then - echo ERROR: Invalid entry numbers in coordinator configuration. - return 1 - fi - if [ $i -ne ${#coordMasterServers[@]} -o $i -ne ${#coordMasterDirs[@]} ]; then - echo ERROR: Invalid entry numbers in coordinator configuration. - return 1 - fi - if [ "$coordSlave" == y ]; then - if [ $i -ne ${#coordSlaveServers[@]} -o $i -ne ${#coordSlaveDirs[@]} -o $i -ne ${#coordArchLogDirs[@]} -o $i -ne ${#coordMaxWALSenders[@]} ]; then - echo ERROR: Invalid entry numbers in coordinator configuration. - return 1 - fi - fi - # Datanodes - i=${#datanodeNames[@]} - if [ $i -ne ${#datanodePorts[@]} -o $i -ne ${#datanodeSpecificExtraConfig[@]} -o $i -ne ${#datanodeSpecificExtraPgHba[@]} ]; then - echo ERROR: Invalid entry numbers in datanode configuration. - return 1 - fi - #if XCP - if [ $i -ne ${#datanodePoolerPorts[@]} -o $i -ne ${#datanodeSpecificExtraConfig[@]} -o $i -ne ${#datanodeSpecificExtraPgHba[@]} ]; then - echo ERROR: Invalid entry numbers in datanode pooler port configuration. - return 1 - fi - if [ $i -ne ${#datanodeMasterServers[@]} -o $i -ne ${#datanodeMasterDirs[@]} ]; then - echo ERROR: Invalid entry numbers in datanode configuration. - return 1 - fi - if [ "$datanodeSlave" == y ]; then - if [ $i -ne ${#datanodeSlaveServers[@]} -o $i -ne ${#datanodeSlaveDirs[@]} -o $i -ne ${#datanodeArchLogDirs[@]} -o $i -ne ${#datanodeMaxWalSenders[@]} ]; then - echo ERROR: Invalid entry numbers in datanode configuration. - return 1 - fi - fi - - # Check if node names don't duplicate - # GTM - for ((i=0; i<${#gtmProxyNames[@]};i++)); do - if [ $gtmName == ${gtmProxyNames[$i]} ]; then - echo ERROR: GTM name duplicates one of the GTM Proxies, $gtmName - return 1 - fi - done - for ((i=0; i<${#coordNames[@]}; i++)); do - if [ $gtmName == ${coordNames[$i]} ]; then - echo ERROR: GTM name duplicates one of the coordinators, $gtmName - return 1 - fi - done - for ((i=0; i<${#datanodeNames[@]}; i++)); do - if [ $gtmName == ${datanodeNames[$i]} ]; then - echo ERROR: GTM name duplicates one of the datanodes, $gtmName - return 1 - fi - done - # GTM Proxy - for ((i=0; i<${#gtmProxyNames[@]}; i++)); do - for ((j=$i+1;j<${#gtmProxyNames[@]}; j++)); do - if [ ${gtmProxyNames[$i]} == ${gtmProxyNames[$j]} ]; then - echo ERROR: GTM proxy name duplicates one of the other GTM proxies, ${gtmProxyNames[$i]} - return 1 - fi - done - for ((j=0;j<${#coordNames[@]};j++));do - if [ ${coordNames[$j]} == ${gtmProxyNames[$i]} ]; then - echo ERROR: GTM proxy name duplicates one of the coordinator names, ${gtmProxyNames[$i]} - return 1 - fi - done - for ((j=0;j<${#datanodeNames[@]};j++));do - if [ ${datanodeNames[$j]} == ${gtmProxyNames[$i]} ]; then - echo ERROR: GTM proxy name duplicates one of the datanode names, ${gtmProxyNames[$i]} - return 1 - fi - done - done - # Cordinator - for ((i=0; i<${#coordNames[@]}; i++)); do - for ((j=$i+1; j<${#coordNames[@]}; j++)); do - if [ ${coordNames[$i]} == ${coordNames[$j]} ]; then - echo ERROR: Coordinator name duplicates on of the other coordinators, ${coordNames[$i]} - return 1 - fi - done - for ((j=0; j<${#datanodeNames[@]}; j++)); do - if [ ${coordNames[$i]} == ${datanodeNames[$j]} ] - then - echo ERROR: Coordinator name duplicates one of the datanodes, ${coordNames[$i]} - return 1 - fi - done - done - # Datanode - for ((i=0; i<${#datanodeNames[@]}; i++)); do - for ((j=$i+1; j<${#datanodeNames[@]}; j++)); do - if [ ${datanodeNames[$i]} == ${datanodeNames[$j]} ]; then - echo ERROR: Datanode name duplicates one of the other datanodes, ${datanodeNames[$i]} - return 1 - fi - done - done - # Check if primary datanode is in datanode name list, or none - if [ "$primaryDatanode" == "none" ] || [ "$primaryDatanode" == "N/A" ]; then - return 0 - fi - # Primary Datanode: is it specified? - local xx - xx=n - for ((i=0;i<${#datanodeNames[@]};i++));do - if [ "$primaryDatanode" == ${datanodeNames[$i]} ]; then - xx=y; - break; - fi - done - if [ $xx == n ]; then - echo ERROR: Primary datanode is not in the datanode list, $primaryDatanode - return 1 - fi -} - -function verifyNode -{ - local i - local j - local Ports - local Dirs - - Ports=() - Dirs=() - - decho $1 - # Check if there's no duplicate in port/directory assignment - if [ $1 == $gtmMasterServer ]; then - Ports=( ${Ports[@]} $gtmMasterPort ) - Dirs=( ${Dirs[@]} $gtmMasterDir ) - fi - if [ $1 == $gtmSlaveServer ]; then - Ports=( ${Ports[@]} $gtmSlavePort ) - Dirs=( ${Dirs[@]} $gtmSlaveDir ) - fi - for ((i=0; i<${#gtmProxyServers[@]}; i++)); do - if [ $1 == ${gtmProxyServers[$i]} ]; then - Ports=( ${Ports[@]} ${gtmProxyPorts[$i]} ) - Dirs=( ${Dirs[@]} ${gtmProxyDirs[$i]} ) - fi - done - for ((i=0; i<${#coordMasterServers[@]}; i++)); do - if [ $1 == ${coordMasterServers[$i]} ]; then - Ports=( ${Ports[@]} ${coordPorts[$i]} ) - Ports=( ${Ports[@]} ${poolerPorts[$i]} ) - Dirs=( ${Dirs[@]} ${coordMasterDirs[$i]} ) - fi - if [ $1 == ${coordSlaveServers[$i]} ]; then - Ports=( ${Ports[@]} ${coordPorts[$i]} ) - Ports=( ${Ports[@]} ${poolerPorts[$i]} ) - Dirs=( ${Dirs[@]} ${coordSlaveDirs[$i]} ) - fi - done - for ((i=0; i<${#datanodeMasterServers[$i]}; i++)); do - if [ $1 == ${datanodeMasterServers[$i]} ]; then - Ports=( ${Ports[@]} ${datanodePorts[$i]} ) - PoolerPorts=( ${PoolerPorts[@]} ${datanodePoolerPorts[$i]} ) #XCP - Dirs=( ${Dirs[@]} ${datanodeMasterDirs[$i]} ) - fi - if [ $1 == ${datanodeSlaveServers[$i]} ]; then - Ports=( ${Ports[@]} ${datanodePorts[$i]} ) - PoolerPorts=( ${PoolerPorts[@]} ${datanodePoolerPorts[$i]} ) #XCP - Dirs=( ${Ports[@]} ${datanodeSlaveDirs[$i]} ) #mds - fi - done - for ((i=0; i<${#Ports[@]}; i++)); do - for ((j=$i+1; j<${#Ports[@]}; j++)); do - if [ ${Ports[$i]} -eq ${Ports[$j]} -a ${Ports[$i]} != none ]; then - echo ERROR: duplicate port assignment for the server $1 - return 1 - fi - done - done - for ((i=0; i<${#Dirs[@]}; i++)); do - for ((j=$i+1; j<${#Dirs[@]}; j++)); do - if [ ${Dirs[$i]} == ${Dirs[$j]} -a ${Dirs[$i]} != none ]; then - echo ERROR: duplicate work directory assignment for the server $1 - return 1 - fi - done - done - # We should check if GTM proxy is configured when GTM slave is configured. - # We could do this here but it's better to do it when we configure - # postgresql.conf of coordinator/datanode master. -} - -function print_config -{ - local ii - local jj - - echo "========= Postgres-XC configuration ========================" - echo "=== Overall ===" - echo Postgres-XC owner: $pgxcOwner - echo Postgres-XC user: $pgxcUser - echo Postgres-XC install directory: $pgxcInstallDir - echo tmpDir: $tmpDir - echo localTmpDir: $localTmpDir - echo "=== Each Server ===" - for ((ii=0;ii<${#allServers[@]};ii++)); do - echo "=== ${allServers[$ii]} ===" - # GTM Master - if [ ${allServers[$ii]} == $gtmMasterServer ]; then - echo "GTM Master: " - echo " " Nodename: "'"$gtmName"'", port: $gtmMasterPort, dir: "'"$gtmMasterDir"'" - echo " " ExtraConfig: "'"$gtmExtraCofig"'", Specific Extra Config: "'"$gtmMasterSpecificExtraConfig"'" - fi - # GTM Slave - if [ $gtmSlave == y ]; then - if [ ${allServers[$ii]} == $gtmSlaveServer ]; then - echo "GTM Slave: " - echo " " Nodename: "'"$gtmName"'", port: $gtmSlavePort, dir: "'"$gtmSlaveDir"'" - echo " " ExtraConfig: "'"$gtmExtraConfig"'", Specific Extra Config: "'"$gtmSlaveSpecificExtraConfig"'" - fi - fi - # GTM Proxy - if [ $gtmProxy == y ]; then - for ((jj=0;jj<${#gtmProxyServers[@]};jj++)); do - if [ ${allServers[$ii]} == ${gtmProxyServers[$jj]} ]; then - echo "GTM Proxy:" - echo " " Nodename: "'"${gtmProxyNames[$jj]}"'", port: ${gtmProxyPorts[$jj]}, dir: "'"${gtmProxyDirs[$jj]}"'" - echo " " ExtraConfig: "'"$gtmPxyExtraConfig"'", Specific Extra Config: "'"${gtmPxySpecificExtraConfig[$jj]}"'" - fi - done - fi - # Coordinator Master - for ((jj=0;jj<${#coordMasterServers[@]};jj++)); do - if [ ${allServers[$ii]} == ${coordMasterServers[$jj]} ]; then - echo "Coordinator Master:" - echo " " Nodename: "'"${coordNames[$jj]}"'", port: ${coordPorts[$jj]}, pooler port: "'"${poolerPorts[$jj]}"'" - echo " " MaxWalSenders: ${coordMaxWalsenders[$jj]}, Dir: "'"${coordMasterDirs[$jj]}"'" - echo " " ExtraConfig: "'"$coordExtraConfig"'", Specific Extra Config: "'"${coordSpecificExtraConfig[$jj]}"'" - echo " " pg_hba entries: '(' ${coordPgHbaEntries[@]} ')' - echo " " Extra pg_hba: "'"$coordExraPgHba"'", Specific Extra pg_hba: "'"${coordSpecificExtraPgHba[$jj]}"'" - fi - done - # Coordinator Slave - if [ $coordSlave == y ]; then - for ((jj=0;jj<${#coordSlaveServers[@]};jj++)); do - if [ ${allServers[$ii]} == ${coordSlaveServers[$jj]} ]; then - echo "Coordinator Slave:" - echo " " Nodename: "'"${coordNames[$jj]}"'", port: ${coordPorts[$jj]}, pooler port: ${poolerPorts[$jj]} - echo " " Dir: "'"${coordSlaveDirs[$jj]}"'", Archive Log Dir: "'"${coordArchLogDirs[$jj]}"'" - fi - done - fi - # Datanode Master - for ((jj=0;jj<${#datanodeMasterServers[@]};jj++)); do - if [ ${allServers[$ii]} == ${datanodeMasterServers[$jj]} ]; then - echo "Datanode Master" - echo " " Nodename: "'"${datanodeNames[$jj]}"'", port: ${datanodePorts[$jj]} - #mdsecho " " Pooler Ports: ${datanodePoolerPorts[$jj]} - echo " " MaxWalSenders: ${datanodeMaxWalSenders[$jj]}, Dir: "'"${datanodeMasterDirs[$jj]} - echo " " ExtraConfig: "'"datanodeExtraConfig"'", Specific Extra Config: \ - "'"${datanodeSpecificExtraConfig[$jj]}"'" - echo " " pg_hba entries: '(' ${datanodePgHbaEntries[@]} ')' - echo " " Extra pg_hba: "'"$datanodeExtraPgHba"'", Specific Extra pg_hba: \ - "'"${datanodeSpecificExtraPgHba[$jj]}"'" - fi - done - # Datanode Slave - if [ $datanodeSlave == y ]; then - for ((jj=0;jj<${#datanodeMasterServers[@]};jj++)); do - if [ ${allServers[$ii]} == ${datanodeSlaveServers[$jj]} ]; then - echo "Datanode Slave" - echo " " Nodename: "'"${datanodeNames[$jj]}"'", port: ${datanodePorts[$jj]} - #mdsecho " " Pooler Ports: ${datanodePoolerPorts[$jj]} - echo " " MaxWalSenders: ${datanodeMaxWalSenders[$jj]}, Dir: "'"${datanodeSlaveDirs[$jj]} - echo " " ExtraConfig: "'"datanodeExtraConfig"'", Specific Extra Config: \ - "'"${datanodeSpecificExtraConfig[$jj]}"'" - echo " " pg_hba entries: '(' ${datanodePgHbaEntries[@]} ')' - echo " " Extra pg_hba: "'"$datanodeExtraPgHba"'", Specific Extra pg_hba: \ - "'"${datanodeSpecificExtraPgHba[$jj]}"'" - fi - done - fi - done - echo "=== End of configuration ===" -} - -# $1: nodename, $2: [master/slave/all] -function pgxc_ctl_monitor -{ - local fn=monitor - local i - if [ $# -le 0 ]; then - eecho "$progname:$fn" specify node name - return 2 - fi - if [ "$1" == "none" ] || [ "$1" == "N/A" ]; then - eecho "$progname:$fn" invalid node name - return 2 - fi - if [ "$1" == "$gtmName" ]; then - if [ "$2" == "master" ]; then - pgxc_monitor -Z gtm -p $gtmMasterPort -h $gtmMasterServer - if [ $? -eq 0 ]; then - echo GTM master "("$gtmName")" running - else - echo GTM master "("$gtmName")" not running - fi - return - elif [ "$2" == "slave" ]; then - if [ "$gtmSlaveServer" == "none" ] || [ "$gtmSlaveServer" == "N/A" ]; then - echo GTM slave not configured. - return - fi - pgxc_monitor -Z gtm -p $gtmSlavePort -h $gtmSlaveServer - if [ $? -eq 0 ]; then - echo GTM slave "("$gtmName")" running - else - echo GTM slave "("$gtmName")" not running - fi - return - elif [ "$2" == "all" ] || [ "$2" == "" ]; then - pgxc_monitor -Z gtm -p $gtmMasterPort -h $gtmMasterServer - if [ $? -eq 0 ]; then - echo GTM master "("$gtmName")" running - else - echo GTM master "("$gtmName")" not running - fi - if [ "$gtmSlaveServer" == "none" ] || [ "$gtmSlaveServer" == "N/A" ]; then - echo GTM slave not configured. - return - fi - pgxc_monitor -Z gtm -p $gtmSlavePort -h $gtmSlaveServer - if [ $? -eq 0 ]; then - echo GTM slave "("$gtmName")" running - else - echo GTM slave "("$gtmName")" not running - fi - fi - return - fi - # GTM-Proxy - for ((i=0; i<${#gtmProxyNames[@]}; i++)); do - if [ "$1" == "${gtmProxyNames[$i]}" ]; then - if [ "${gtmProxyServers[$i]}" == "none" ] || [ "${gtmProxyServers[$i]}" == "N/A" ]; then - echo GTM proxy "("${gtmProxyNames[$i]}")": not configured - return; - fi - pgxc_monitor -Z gtm -p ${gtmProxyPorts[$i]} -h ${gtmProxyServers[$i]} - if [ $? -eq 0 ]; then - echo GTM proxy "("${gtmProxyNames[$i]}")": running - else - echo GTM proxy "("${gtmProxyNames[$i]}")": not running - fi - return - fi - done - # Coordinator - for ((i=0; i<${#coordNames[@]}; i++)); do - if [ "$1" == "${coordNames[$i]}" ]; then - if [ "$2" == "master" ]; then - if [ "${coordMasterServers[$i]}" == "none" ] || [ "${coordMasterServers[$i]}" == "N/A" ]; then - echo Coordinator master "("${coordNames[$i]}")": not configured - return - fi - pgxc_monitor -Z node -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} -U $pgxcOwner -d postgres - if [ $? == 0 ]; then - echo Coordinator master "("${coordNames[$i]}")": running - else - echo Coordinator master "("${coordNames[$i]}")": not running - fi - return - fi - if [ "$2" == "slave" ]; then - if [ "${coordSlaveServers[$i]}" == "none" ] || [ "${coordSlaveServers[$i]}" == "N/A" ]; then - echo Coordinator slave "("${coordNames[$i]}")": not configured - return - fi - pgxc_monitor -Z node -p ${coordPorts[$i]} -h ${coordSlaveServers[$i]} -U $pgxcOwner -d postgres - if [ $? == 0 ]; then - echo Coordinator slave "("${coordNames[$i]}")": running - else - echo Coordinator slave "("${coordNames[$i]}")": not running - fi - return - fi - if [ "$2" == "all" ] || [ "$2" == "" ]; then - if [ "${coordMasterServers[$i]}" == "none" ] || [ "${coordMasterServers[$i]}" == "N/A" ]; then - echo Coordinator master "("${coordNames[$i]}")": not configured - else - pgxc_monitor -Z node -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} -U $pgxcOwner -d postgres - if [ $? == 0 ]; then - echo Coordinator master "("${coordNames[$i]}")": running - else - echo Coordinator master "("${coordNames[$i]}")": not running - fi - fi - if [ "${coordSlaveServers[$i]}" == "none" ] || [ "${coordSlaveServers[$i]}" == "N/A" ]; then - echo Coordinator slave "("${coordNames[$i]}")": not configured - else - pgxc_monitor -Z node -p ${coordPorts[$i]} -h ${coordSlaveServers[$i]} -U $pgxcOwner -d postgres - if [ $? == 0 ]; then - echo Coordinator slave "("${coordNames[$i]}")": running - else - echo Coordinator slave "("${coordNames[$i]}")": not running - fi - fi - return - fi - fi - done - # Datanode - for ((i=0; i<${#datanodeNames[@]}; i++)); do - if [ "$1" == "${datanodeNames[$i]}" ]; then - if [ "$2" == "master" ]; then - if [ "${datanodeMasterServers[$i]}" == "none" ] || [ "${datanodeMasterServers[$i]}" == "N/A" ]; then - echo Datanode master "("${datanodeNames[$i]}")": not configured - return - fi - pgxc_monitor -Z node -p ${datanodePorts[$i]} -h ${datanodeMasterServers[$i]} -U $pgxcOwner -d postgres - if [ $? == 0 ]; then - echo Datanode master "("${datanodeNames[$i]}")": running - else - echo Datanode master "("${datanodeNames[$i]}")": not running - fi - return - fi - if [ "$2" == "slave" ]; then - if [ "${datanodeSlaveServers[$i]}" == "none" ] || [ "${datanodeSlaveServers[$i]}" == "N/A" ]; then - echo Datanode slave "("${datanodeNames[$i]}")": not configured - return - fi - pgxc_monitor -Z node -p ${datanodePorts[$i]} -h ${datanodeSlaveServers[$i]} -U $pgxcOwner -d postgres - if [ $? == 0 ]; then - echo Datanode slave "("${datanodeNames[$i]}")": running - else - echo Datanode slave "("${datanodeNames[$i]}")": not running - fi - return - fi - if [ "$2" == "all" ] || [ "$2" == "" ]; then - if [ "${datanodeMasterServers[$i]}" == "none" ] || [ "${datanodeMasterServers[$i]}" == "N/A" ]; then - echo Datanode master "("${datanodeNames[$i]}")": not configured - else - pgxc_monitor -Z node -p ${datanodePorts[$i]} -h ${datanodeMasterServers[$i]} -U $pgxcOwner -d postgres - if [ $? == 0 ]; then - echo Datanode master "("${datanodeNames[$i]}")": running - else - echo Datanode master "("${datanodeNames[$i]}")": not running - fi - fi - if [ "${datanodeSlaveServers[$i]}" == "none" ] || [ "${datanodeSlaveServers[$i]}" == "N/A" ]; then - echo Datanode slave "("${datanodeNames[$i]}")": not configured - else - pgxc_monitor -Z node -p ${datanodePorts[$i]} -h ${datanodeSlaveServers[$i]} -U $pgxcOwner -d postgres - if [ $? == 0 ]; then - echo Datanode slave "("${coordNames[$i]}")": running - else - echo Datanode slave "("${coordNames[$i]}")": not running - fi - fi - return - fi - fi - done - -} -#============================================================== -# Check each component status (running or not) -# You must install/deploy pgxc_monitor -#============================================================== - -function pgxc_ctl_show_component -{ - local i - # GTM - if [ "$1" == "$gtmName" ]; then - echo "$1:" GTM - echo " " GTM Master, "port=$gtmMasterPort", "host=$gtmMasterServer", "dir=$gtmMasterDir" - if [ "$gtmSlaveServer" == "none" ] || [ "$gtmSlaveServer" == "N/A" ]; then - echo " " GTM Slave, not configured - else - echo " " GTM Slave, "port=$gtmSlavePort", "host=$gtmSlaveServer", "dir=$gtmSlaveDir" - fi - return - fi - # GTM Proxy - for ((i=0; i<${#gtmProxyNames[@]}; i++)); do - if [ "${gtmProxyNames[$i]}" == "$1" ]; then - echo "$1:" GTM Proxy, "port=${gtmProxyPorts[$i]}", "host=${gtmProxyServers[$i]}", "dir=${gtmProxyDirs[$i]}" - return - fi - done - # Coordinator - for ((i=0; i<${#coordNames[@]}; i++)); do - if [ "${coordNames[$i]}" == "$1" ]; then - echo "$1:" Coordinator - echo " " Coordinator Master, port=${coordPorts[$i]}, host=${coordMasterServers[$i]}, dir=${coordMasterDirs[$i]} - if [ "${coordSlaveServers[$i]}" == "none" ] || [ "${coordSlaveServers[$i]}" == "N/A" ]; then - echo " " Coordinator Slave, not configured - else - echo " " Coordinator Slave, port=${coordPorts[$i]}, host=${coordSlaveServers[$i]}, dir=${coordSlaveDirs[$i]} - fi - return - fi - done - # Datanode - for ((i=0; i<${#datanodeNames[@]}; i++)); do - if [ "${datanodeNames[$i]}" == "$1" ]; then - echo "$1:" Datanode - echo " " Datanode Master, port=${datanodePorts[$i]}, pooler_port=${datanodePoolerPorts[$]}, host=${datanodeMasterServers[$i]}, dir=${datanodeMasterDirs[$i]} - if [ "${datanodeSlaveServers[$i]}" == "none" ] || [ "${datanodeSlaveServers[$i]}" == "N/A" ]; then - echo " " Datanode Slave, not configured - else - echo " " Datanode Slave, port=${datanodePorts[$i]}, pooler_port=${datanodePoolerPorts[$]}, host=${datanodeSlaveServers[$i]}, dir=${datanodeSlaveDirs[$i]} - fi - return - fi - done - echo Component $1 not found. - return 1 -} - -function pgxc_ctl_show_gtm_proxy_all -{ - local i - echo ---------- - if [ "$gtmProxy" != "y" ]; then - eecho GTM Proxy is not configured - return 2 - fi - echo GTM Proxies: - for ((i=0; i<${#gtmProxyNames[@]}; i++)); do - pgxc_ctl_show_component ${gtmProxyNames[$i]} - done -} - -function pgxc_ctl_show_coordinator_all -{ - local i - echo ---------- - echo Coordinators: - for ((i=0; i<${#coordNames[@]}; i++)); do - pgxc_ctl_show_component ${coordNames[$i]} - done -} - -function pgxc_ctl_show_datanode_all -{ - local i - echo ---------- - echo Datanodes: - for ((i=0; i<${#datanodeNames[@]}; i++)); do - pgxc_ctl_show_component ${datanodeNames[$i]} - done -} - -function monitor_components -{ - local i - local j - - # GTM master - pgxc_monitor -Z gtm -p $gtmMasterPort -h $gtmMasterServer - if [ $? -eq 0 ]; then - echo -n GTM master "("$gtmName")": running. " " - else - echo -n GTM master "("$gtmName")": not running. " " - fi - echo host: $gtmMasterServer, port: $gtmMasterPort, dir: $gtmMasterDir - - # GTM slave - if [ $gtmSlave == y ]; then - if [ $gtmSlaveServer == none ] || [ $gtmSlaveServer == N/A ]; then - echo GTM slave "("$gtmName")": not configured. - else - pgxc_monitor -Z gtm -p $gtmSlavePort -h $gtmSlaveServer - if [ $? -eq 0 ]; then - echo -n GTM slave "("$gtmName")": running. " " - else - echo -n GTM slave "("$gtmName")": not running. " " - fi - echo host: $gtmSlaveServer, port: $gtmSlavePort, dir: $gtmSlaveDir - fi - fi - - # GTM proxies - if [ $gtmProxy == y ]; then - for ((i=0; i<${#gtmProxyNames[@]}; i++)); do - if [ ${gtmProxyServers[$i]} != none ] && [ ${gtmProxyServers[$i]} != N/A ]; then - pgxc_monitor -Z gtm -p ${gtmProxyPorts[$i]} -h ${gtmProxyServers[$i]} - if [ $? -eq 0 ]; then - echo -n GTM proxy "("${gtmProxyNames[$i]}")": running. " " - else - echo -n GTM proxy "("${gtmProxyNames[$i]}")": not running. " " - fi - echo host: ${gtmProxyServers[$i]}, port: ${gtmProxyPorts[$i]}, dir: ${gtmProxyDirs[$i]} - fi - done - fi - - # Coordinator masters - local postmaster_pid - for ((i=0; i<${#coordNames[@]};i++));do - if [ ${coordMasterServers[$i]} != none ] && [ ${coordMasterServers[$i]} != N/A ]; then - pgxc_monitor -Z node -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} -U $pgxcOwner -d postgres - if [ $? == 0 ]; then - echo -n Coordinator master "("${coordNames[$i]}")": running. " " - else - echo -n Coordinator master "("${coordNames[$i]}")": not running. " " - fi - echo host: ${coordMasterServers[$i]}, port: ${coordPorts[$i]}, dir: ${coordMasterDirs[$i]} - fi - done - - # Coordinator slaves - if [ $coordSlave == y ]; then - for ((i=0; i<${#coordNames[@]};i++)); do - if [ ${coordSlaveServers[$i]} == none ] || [ ${coordSlaveServers[$i]} == N/A ]; then - if [ ${coordNames[$i]} != none ] && [ $coordNames[$i] != N/A ]; then - echo Coordinator slave "("${coordNames[$i]}")": not configured - fi - else - pgxc_monitor -Z node -p ${coordPorts[$i]} -h ${coordSlaveServers[$i]} -U $pgxcOwner -d postgres - if [ $? == 0 ]; then - echo -n Coordinator slave "("${coordNames[$i]}")": running. " " - else - echo -n Coordinator slave "("${coordNames[$i]}")": not running. " " - fi - echo host: ${coordSlaveServers[$i]}, port: ${coordPorts[$i]}, dir: ${coordSlaveDirs[$i]} - fi - done - fi - - # Datanode masters - for ((i=0; i<${#datanodeNames[@]}; i++));do - if [ ${datanodeMasterServers[$i]} != none ] && [ ${datanodeMasterServers[$i]} != N/A ]; then - pgxc_monitor -Z node -p ${datanodePorts[$i]} -h ${datanodeMasterServers[$i]} -U $pgxcOwner -d postgres - if [ $? == 0 ]; then - echo -n Datanode master "("${datanodeNames[$i]}")": running. " " - else - echo -n Datanode master "("${datanodeNames[$i]}")": not running. " " - fi - echo host: ${datanodeMasterServers[$i]}, port: ${datanodePorts[$i]}, dir: ${datanodeMasterDirs[$i]} - fi - done - - # Datanode slaves - if [ $datanodeSlave == y ]; then - for ((i=0; i<${#datanodeNames[@]}; i++)); do - if [ ${datanodeSlaveServers[$i]} == none ] || [ ${datanodeSlaveServers[$i]} == N/A ]; then - if [ ${datanodeNames[$i]} != none ] && [ ${datanodeNames[$i]} != N/A ]; then - echo Datanode slave "("${datanodeNames[$i]}")": not configured - fi - else - pgxc_monitor -Z node -p ${datanodePorts[$i]} -h ${datanodeSlaveServers[$i]} -U $pgxcOwner -d postgres - if [ $? == 0 ]; then - echo -n Datanode slave "("${datanodeNames[$i]}")": running. " " - else - echo -n Datanode slave "("${datanodeNames[$i]}")": not running. " " - fi - echo host: ${datanodeSlaveServers[$i]}, port: ${datanodePorts[$i]}, pooler_port=${datanodePoolerPorts[$]}, dir: ${datanodeSlaveDirs[$i]} - fi - done - fi -} - - -#=============================================================== -# Tool function to check -m option to stop coordinator and -# datanode -#=============================================================== -function check_immediate -{ - case $1 in - immediate ) - immediate="-m immediate" ;; - fast ) - immediate="-m fast" ;; - normal ) - immediate="" ;; - * ) - echo "ERROR: Please specify immediate, fast or normal" - exit 1;; - esac; -} - -#================================================== -# -# Setup .bashrc file for PATH and LD_LIBRARY_PATH -# -#================================================== - -function setup_bashrc -{ - vecho ================================================================ - vecho Setting .bashrc files - for ((i=0; i< ${#allServers[@]}; i++)); do - vecho ---- ${allServers[$i]} ------------------------- - doit ssh $pgxcUser@${allServers[$i]} cp .bashrc .bashrc.org - ssh $pgxcUser@${allServers[$i]} "cat >> .bashrc" <<EOF -# .bachrc addition for Postgres-XC PATH and LD_LIBRARY_PATH -# $datetime -export PATH_ORG=\$PATH -export PATH=$pgxcInstallDir/bin:\$PATH -export LD_LIBRARY_PATH_ORG=\$LD_LIBRARY_PATH -export LD_LIBRARY_PATH=$pgxcInstallDir/lib:\$LD_LIBRARY_PATH -export MANPATH_ORG=\$MANPATH -export MANPATH=$pgxcInstallDir/share/man:\$MANPATH -# End of addition -EOF - done -} - -function setup_bashrc_individual -{ - vecho ================================================================ - vecho Setting .bashrc files for $pgxcOwner at $1 - doit ssh $pgxcUser@$1 cp .bashrc .bashrc.org - ssh $pgxcUser@$1 "cat >> .bashrc" <<EOF -# .bachrc addition for Postgres-XC PATH and LD_LIBRARY_PATH -# $datetime -export PATH_ORG=\$PATH -export PATH=$pgxcInstallDir/bin:\$PATH -export LD_LIBRARY_PATH_ORG=\$LD_LIBRARY_PATH -export LD_LIBRARY_PATH=$pgxcInstallDir/lib:\$LD_LIBRARY_PATH -export MANPATH_ORG=\$MANPATH -export MANPATH=$pgxcInstallDir/share/man:\$MANPATH -# End of addition -EOF -} - -#================================================== -# -# Deploy binaries and other common things to each server -# -# All the build materials will be deployed to each -# servers. -# -#================================================= - -function pgxc_deploy_all -{ - vecho ================================================================ - vecho pgxc_deploy_all: copy built materials to all the target servers. - - doall rm -rf $pgxcInstallDir/bin $pgxcInstallDir/include $pgxcInstallDir/lib $pgxcInstallDir/share - doall mkdir -p $pgxcInstallDir - vecho tar czCf $pgxcInstallDir $tmpDir/wk.tgz bin include lib share - tar czCf $pgxcInstallDir $tmpDir/wk.tgz bin include lib share - cpall $tmpDir/wk.tgz $pgxcInstallDir/wk.tgz - doall tar xzCf $pgxcInstallDir $pgxcInstallDir/wk.tgz - doall rm $pgxcInstallDir/wk.tgz - doit rm $tmpDir/wk.tgz -} - -# First argument is the target node. - -function pgxc_deploy_individual -{ - vecho ================================================================ - vecho pgxc_deploy_individual: copy built materials to the server $1 - - doit ssh $pgxcUser@$1 rm -rf $pgxcInstallDir/bin $pgxcInstallDir/include $pgxcInstallDir/lib $pgxcInstallDir/share - doit ssh $pgxcUser@$1 mkdir -p $pgxcInstallDir - doit tar czCf $pgxcInstallDir $tmpDir/wk.tgz bin include lib share - doit scp $tmpDir/wk.tgz $pgxcUser@$1:$pgxcInstallDir/wk.tgz - doit ssh $pgxcUser@$1 tar xzCf $pgxcInstallDir $pgxcInstallDir/wk.tgz - doit ssh $pgxcUser@$1 rm $pgxcInstallDir/wk.tgz - doit rm $tmpDir/wk.tgz -} - -#================================================== -# -# Cleanup work directories -# -#================================================== - -# First argument is the server name. second argument is the directory name -# Server name could be none, where the target does not exist. -function pgxc_clean_dir -{ - if [ $# -ne 2 ]; then - return 2 - fi - if [ $1 == none ]; then - return 0 - fi - doit ssh $pgxcUser@$1 rm -rf $2 - doit ssh $pgxcUser@$1 mkdir -p $2 - doit ssh $pgxcUser@$1 chmod 0700 $2 -} - -function pgxc_clean_socket -{ - doit ssh $pgxcUser@$1 rm -f /tmp/.s.'*'$2'*' -} - -# First argument is the nodename. The second is "master", "slave" or "all". -function pgxc_clean_node -{ - local i - - log_echo pgxc_clean_node'('$*')' - if [ $1 == $gtmName ]; then - shift; - case $1 in - master ) - if [ "$gtmMasterServer" != "none" ] && [ "$gtmMasterServer" != "N/A" ]; then - doit pgxc_clean_dir $gtmMasterServer $gtmMasterDir - doit pgxc_clean_socket $gtmMasterServer $gtmMasterPort - else - eecho GTM $gtmName is not configured. - fi - return;; - slave ) - if [ "$gtmSlaveServer" != "none" ] && [ "$gtmSlaveServer" != "N/A" ]; then - doit pgxc_clean_dir $gtmSlaveServer $gtmSlaveDir - doit pgxc_clean_socket $gtmSlaveServer $gtmSlavePort - else - eecho GTM slave $gtmName is not configured. - fi - return;; - all ) - if [ "$gtmMasterServer" != "none" ] && [ "$gtmMasterServer" != "N/A" ]; then - doit pgxc_clean_dir $gtmMasterServer $gtmMasterDir - doit pgxc_clean_socket $gtmMasterServer $gtmMasterPort - else - eecho GTM $gtmName is not configured. - fi - if [ "$gtmSlaveServer" != "none" ] && [ "$gtmSlaveServer" != "N/A" ]; then - doit pgxc_clean_dir $gtmSlaveServer $gtmSlaveDir - doit pgxc_clean_socket $gtmSlaveServer $gtmSlavePort - else - eecho GTM slave $gtmName is not configured. - fi - return;; - * ) - echo ERROR: invalid argument for pgxc_clean_node, $1 - return 1;; - esac - fi - for ((i= 0; i< ${#gtmProxyNames[@]}; i++)); do - if [ $1 == ${gtmProxyNames[$i]} ]; then - if [ "${gtmProxyServers[$i]}" != "none" ] && [ "${gtmProxyServers[$i]}" != "N/A" ]; then - doit pgxc_clean_dir ${gtmProxyServers[$i]} ${gtmProxyDirs[$i]} - doit pgxc_clean_socket ${gtmProxyServers[$i]} ${gtmProxyPorts[$i]} - else - eecho GTM Proxy $1 is not configured. - fi - return; - fi - done - for ((i= 0; i< ${#coordNames[@]}; i++)); do - if [ $1 == ${coordNames[$i]} ]; then - case $2 in - master ) - if [ "${coordMasterServers[$i]}" != "none" ] && [ "${coordMasterServers[$i]}" != "N/A" ]; then - doit pgxc_clean_dir ${coordMasterServers[$i]} ${coordMasterDirs[$i]} - doit pgxc_clean_socket ${coordMasterServers[$i]} ${coordPorts[$i]} - else - eecho Coordinator master $1 is not configured. - fi - return;; - slave ) - if [ "${coordSlaveServers[$i]}" != "none" ] && [ "${coordSlaveServers[$i]}" != "N/A" ]; then - doit pgxc_clean_dir ${coordSlaveServers[$i]} ${coordSlaveDirs[$i]} - doit pgxc_clean_socket ${coordSlaveServers[$i]} ${coordPorts[$i]} - else - eecho Coordinator slave $1 is not configured. - fi - return;; - all ) - if [ "${coordMasterServers[$i]}" != "none" ] && [ "${coordMasterServers[$i]}" != "N/A" ]; then - doit pgxc_clean_dir ${coordMasterServers[$i]} ${coordMasterDirs[$i]} - doit pgxc_clean_socket ${coordMasterServers[$i]} ${coordPorts[$i]} - else - eecho Coordinator master $1 is not configured. - fi - if [ "${coordSlaveServers[$i]}" != "none" ] && [ "${coordSlaveServers[$i]}" != "N/A" ]; then - doit pgxc_clean_dir ${coordSlaveServers[$i]} ${coordSlaveDirs[$i]} - doit pgxc_clean_socket ${coordSlaveServers[$i]} ${coordPorts[$i]} - else - eecho Coordinator slave $1 is not configured. - fi - return;; - * ) - echo ERROR: invalid argument for pgxc_clean_node, $1 - return 1;; - esac - fi - done - for ((i= 0; i< ${#datanodeNames[@]}; i++)); do - if [ $1 == ${datanodeNames[$i]} ]; then - case $2 in - master ) - if [ "${datanodeMasterServers[$i]}" != "none" ] && [ "${datanodeMasterServers[$i]}" != "N/A" ]; then - doit pgxc_clean_dir ${datanodeMasterServers[$i]} ${datanodeMasterDirs[$i]} - doit pgxc_clean_socket ${datanodeMasterServers[$i]} ${datanodePorts[$i]} - doit pgxc_clean_socket ${datanodeMasterServers[$i]} ${datanodePoolerPorts[$i]} - else - eecho Datanode master $1 is not configured. - fi - return;; - slave ) - if [ "${datanodeSlaveServers[$i]}" != "none" ] && [ "${datanodeSlaveServers[$i]}" != "N/A" ]; then - doit pgxc_clean_dir ${datanodeSlaveServers[$i]} ${datanodeSlaveDirs[$i]} - doit pgxc_clean_socket ${datanodeSlaveServers[$i]} ${datanodePorts[$i]} - doit pgxc_clean_socket ${datanodeSlaveServers[$i]} ${datanodePoolerPorts[$i]} - else - eecho Datanode slave $1 is not configured. - fi - return;; - all ) - if [ "${datanodeMasterServers[$i]}" != "none" ] && [ "${datanodeMasterServers[$i]}" != "N/A" ]; then - doit pgxc_clean_dir ${datanodeMasterServers[$i]} ${datanodeMasterDirs[$i]} - doit pgxc_clean_socket ${datanodeMasterServers[$i]} ${datanodePorts[$i]} - doit pgxc_clean_socket ${datanodeMasterServers[$i]} ${datanodePoolerPorts[$i]} - else - eecho Datanode master $1 is not configured. - fi - if [ "${datanodeSlaveServers[$i]}" != "none" ] && [ "${datanodeSlaveServers[$i]}" != "N/A" ]; then - doit pgxc_clean_dir ${datanodeSlaveServers[$i]} ${datanodeSlaveDirs[$i]} - doit pgxc_clean_socket ${datanodeSlaveServers[$i]} ${datanodePorts[$i]} - doit pgxc_clean_socket ${datanodeSlaveServers[$i]} ${datanodePoolerPorts[$i]} - else - eecho Datanode slave $1 is not configured. - fi - return;; - * ) - echo ERROR: invalid argument for pgxc_clean_node, $1 - return 1;; - esac - fi - done - echo ERROR: no target nodename found, $1 -} - -# First argument is "master", "slave" or "all" -function pgxc_clean_gtm -{ - log_ehco pgxc_clen_gtm'('$*')' - if [ $# -ne 1 ];then - echo Specify master, slave or all - return 1 - fi - case $1 in - master );; - slave );; - all );; - * ) - vecho Specify master, slave or all - return 1;; - esac - if [ $1 == master ] || [ $1 == all ]; then - pxc_clean_dir $gtmMasterServer $gtmMasterDir - fi - if [ $gtm_slave != y ]; then - if [ $1 == slave ] || [ $1 == all ]; then - pgxc_clean_dir $gtmSlaveServer $gtmSlaveDir - fi - fi -} - -# First argument is gtm_proxy name -function pgxc_clean_gtm_proxy -{ - log_echo pgxc_clean_gtm_proxy'('$*')' - if [ $gtmProxy != y ]; then - echo gtm_proxy is not configured - return 1 - fi - if [ $# -ne 1 ]; then - echo Specify gtm_proxy name - return 2 - fi - local i - for ((i=0; i<${#gtmProxyNames[@]}; i++));do - if [ $1 == ${gtmProxyNames[$i]} ]; then - pgxc_clean_dir ${gtmProxyServers[$i]} ${gtmProxyDirs[$i]} - return - fi - done - echo specified gtm_proxy is not configured, $1 - return 2 -} - -# No argument -function pgxc_clean_gtm_proxy_all -{ - log_echo pgxc_clean_gtm_proxy_all'('$*')' - if [ $gtmProxy != y ]; then - echo gtm_proxy is not configured - return 1 - fi - local i - for ((i=0; i<${#gtmProxyNames[@]}; i++));do - pgxc_clean_gtm_proxy ${gtmProxyNames[$i]} - done -} - -# First argument is coordinator name -function pgxc_clean_coordinator_master -{ - log_echo pgxc_clean_coordinator_master'('$*')' - if [ $# -ne 1 ]; then - echo specify coordinator name - return 2 - fi - local i - for ((i=0; i<${#coordNames[@]}; i++));do - if [ $1 == ${coordNames[$i]} ]; then - pgxc_clean_dir ${coordMasterServers[$i]} ${coordMasterDirs[$i]} - return - fi - done - echo specified coordinator is not configured, $1 - return 2 -} - -function pgxc_clean_coordinator_master_all -{ - local i - log_echo pgxc_clean_coordinator_master_all'('$*')' - for ((i=0;i<${#coordNames[@]};i++));do - pgxc_clean_coordinator_master ${coordNames[$i]} - done -} - -# First argument is a coordinator name -function pgxc_clean_coordinator_slave -{ - log_echo pgxc_clean_coordinator_slave'('$*')' - if [ $coordSlave != y ]; then - echo Coordinator slave is not configured. - return 1 - fi - if [ $# -ne 1 ]; then - echo Specify coordinator name. - return 2 - fi - local i - for ((i=0;i<${#coordNames[@]};i++));do - if [ $1 == ${coordNames[$i]} ]; then - if [ ${coordSlaveServers[$i]} == none ] || [ ${coordSlaveServers[$i]} == N/A ]; then - echo Specified coordinator slave is not configured, $1 - return 2 - fi - pgxc_clean_dir ${coordSlaveServers[$i]} ${coordSlaveDirs[$i]} - return - fi - done - echo Specified coordinator is not configured, $1 - return 2 -} - -function pgxc_clean_coordinator_slave_all -{ - log_echo pgxc_clean_coordinator_slave_all'('$*')' - if [ $coordSlave != y ]; then - echo Coordinator slave is not configured. - return 1 - fi - local i - for ((i=0; i<${#coordNames[@]}; i++));do - pgxc_clean_coordinator_slave ${coordNames[$i]} - done -} - -function pgxc_clean_coordinator_all -{ - log_echo pgxc_clean_coordinator_all'('$*')' - pgxc_clean_coordinator_master_all - pgxc_clean_coordinator_slave_all -} - -function pgxc_clean_datanode_master -{ - log_echo pgxc_clean_datanode_master'('$*')' - if [ $# -ne 1 ]; then - echo Specify datanode name - return 2 - fi - local i - for ((i=0; i<${datanodeNames[@]}; i++));do - if [ $1 == ${datanodeNames[$i]} ]; then - pgxc_clean_dir ${datanodeMasterServers[$i]} ${datanodeMasterDirs[$i]} - return - fi - done - echo Specified datanode is not configured, $1 - return 2 -} - -function pgxc_clena_datanode_master_all -{ - local i - log_echo pgxc_clean_datanode_master_all'('$*')' - for ((i=0; i<${#datanodeNames[@]}; i++));do - pgxc_clean_datanode_master ${datanodeNames[$i]} - done -} - -function pgxc_clean_datanode_slave -{ - log_echo pgxc_clean_datanode_slave'('$*')' - if [ $datanodeSlave != y ]; then - echo Datanode slave is not configured. - return 1 - fi - if [ $# -ne 1 ]; then - echo Specify datanode name. - return 2 - fi - local i - for ((i=0;i<${#datanodeNames[@]}; i++));do - if [ $1 == ${datanodeNames[$i]} ]; then - if [ ${datanodeSlaveServers[$i]} == none ] || [ ${datanodeSlaveServers[$i]} == N/A ]; then - echo Specified datanode slave is not configured, $1 - return 2 - fi - pgxc_clean_dir ${datanodeSlaveServers[$i]} ${datanodeSlaveDirs[$i]} - return - fi - done - echo Specified datanode is not configured, $1 - return 2 -} - -function pgxc_clean_datanode_slave_all -{ - log_echo pgxc_clean_datanode_slave_all'('$*')' - if [ $datanodeSlave != y ]; then - echo Datanode slave is not configured. - return 1 - fi - local i - for ((i=0; i<${#datanodeNames[@]}; i++)); do - pgxc_clean_datanode_slave ${datanodeNames[$i]} - done -} - -function pgxc_clean_datanode_all -{ - log_echo pgxc_clean_datanode_all'('$*')' - pgxc_clean_datanode_master_all - pgxc_clean_datanode_slave_all -} - -function pgxc_clean_node_all -{ - local i - - log_echo pgxc_clean_node_all'('$*')' - pgxc_clean_node $gtmName all - if [ "$gtmProxy" == "y" ]; then - for ((i=0; i< ${#gtmProxyNames[@]}; i++)); do - pgxc_clean_node ${gtmProxyNames[$i]} - done - else - eecho GTM Proxies are not configured. - fi - for ((i=0; i< ${#coordNames[@]}; i++)); do - pgxc_clean_node ${coordNames[$i]} all - done - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - pgxc_clean_node ${datanodeNames[$i]} all - done -} - -# print_stdout host file prompt -function print_stdout -{ - local host - local file - if [ $# -ne 3 ]; then - return 1 - fi - host=$1 - shift - file=$1 - shift - if [ $verbose == y ]; then - if [ $interactive != y ]; then - if [ $host != localhost ]; then - ssh $pgxcUser@$host cat $file - else - cat $file >> $logfile - fi - else - echo -n $* - if [ `readyesno n` == y ]; then - if [ $host != localhost ]; then - ssh $pgxcUser@$host cat $file - else - cat $file - fi - fi - fi - fi - if [ $logOpt == y ]; then - if [ $host != localhost ]; then - (ssh $pgxcUser@$host cat $file) >> $logfile - else - cat $file >> $logfile - fi - fi - if [ $host != localhost ]; then - ssh $pgxcUser@$host rm -f $file - else - rm -f $file - fi -} - -# Print without asking, if $verbose == y -function do_stdout -{ - local host - local file - if [ $# -ne 2 ]; then - return 1 - fi - host=$1 - shift - file=$1 - shift - if [ $verbose == y ]; then - if [ $host != localhost ]; then - ssh $pgxcUser@$host cat $file - else - cat $file - fi - if [ $logOpt == y ]; then - if [ $host != localhost ]; then - (ssh $pgxcUser@$host cat $file) >> $logfile - else - cat $file >> $logfile - fi - fi - fi - if [ $host != localhost ]; then - ssh $pgxcUser@$host rm -f $file - else - rm -f $file - fi -} - -# Write the file to the log if log is enabled. $1: file to write -function fileWriteToLog -{ - if [ $logOpt == y ]; then - cat $1 >> $logfile - fi -} - -function print_initgtm_out -{ - print_stdout $1 $2 "Print initgtm output\?" -} - -function print_initdb_out -{ - print_stdout $1 $2 "Print initgtm output\?" -} - -function print_pg_ctl_out -{ - print_stdout $1 $2 "Print pg_ctl output\?" -} - -function print_gtm_ctl_out -{ - print_stdout $1 $2 "Print gtm_ctl output\?" -} - -#=========================================================== -# -# GTM and GTM slave staff -# -#=========================================================== - -# Reconfigure GTM Master. Result will be reflected to the configuration file too. -# Parameters are server, port and directory. Please note that the node name -# is fixed. You should edit configuration file to change GTM node name. -# You may specify two more arguments, gtm additional configuration file common to -# master/slave and gtm additional configuration file specific to gtm master. -# If you don't specify "no" additional ones, you can specify "none". -function pgxc_configure_gtm_master -{ - log_echo pgxc_configure_gtm_master"("$*")" - vecho ================================================================ - vecho Configure GTM Master - - if [ $# -lt 3 -o $# -gt 5 ]; then - echo ERROR: invalid arguments, $* - return 1 - fi - gtmMasterServer=$1 - gtmMasterPort=$2 - gtmMasterDir=$3 - vecho New GTM Master config: Server: "'"$gtmMasterServer"'", Port: $gtmMasterPort, Dir: "'"$gtmMasterDir"'" - # Update configuration file - cat >> $configFile <<EOF -#==================================== -# Updated due to GTM Master reconfiguration -# $datetime -gtmMasterServer=$gtmMasterServer -gtmMasterPort=$gtmMasterPort -gtmMasterDir=$gtmMasterDir -EOF - if [ $# -ge 4 ]; then - gtmExtraConfig=$4 - vecho -n " "ExtraConfig: "'"$gtmExtraConfig"'" - cat >> $configFile <<EOF -gtmExtraConfig=$gtmExtraConfig -EOF - if [ $# -eq 5 ]; then - gtmMasterSpecificExtraConfig=$5 - vecho "," ExtraSpecificConfig: "'"$gtmMasterSpecificExtraConfig"'" - cat >> $configFile <<EOF -gtmMasterSpecificExtraConfig=$gtmMasterSpecificExtraConfig -EOF - fi - fi - vecho "" - cat >> $configFile <<EOF -# --- End of reconfiguration -------- -EOF - # Backup configuration file - pgxc_backup_config_file -} - -function pgxc_init_gtm_master -{ - local yesno - - log_echo pgxc_init_gtm_master"("$*")" - vecho ================================================================ - vecho GTM Master initialize - - doit ssh $pgxcUser@$gtmMasterServer "killall -u $pgxcOwner -9 gtm > /dev/null 2>&1" - doit ssh $pgxcUser@$gtmMasterServer rm -rf $gtmMasterDir - doit ssh $pgxcUser@$gtmMasterServer mkdir -p $gtmMasterDir - doit ssh $pgxcUser@$gtmMasterServer "initgtm -Z gtm -D $gtmMasterDir > $tmpDir/initgtm.out 2>&1" - print_initgtm_out $gtmMasterServer $tmpDir/initgtm.out - vecho Configuring $gtmMasterServer:$gtmMasterDir/gtm.conf - vecho ssh $pgxcUser@$gtmMasterServer '"'cat '>>' $gtmMasterDir/gtm.conf '<<EOF' - ssh $pgxcUser@$gtmMasterServer "cat >> $gtmMasterDir/gtm.conf" <<EOF -#=========================================== -# Added at initialization. $datetime -listen_addresses = '*' -EOF - if [ $gtmExtraConfig != none ]; then - vecho ssh $pgxcUser@$gtmMasterServer '"'cat '>>' $gtmMasterDir/gtm.conf'"' '<' $gtmExtraConfig - ssh $pgxcUser@$gtmMasterServer "cat >> $gtmMasterDir/gtm.conf" < $gtmExtraConfig - fi - if [ $gtmMasterSpecificExtraConfig != none ]; then - vecho ssh $pgxcUser@$gtmMasterServer '"'cat '>>' $gtmMasterDir/gtm.conf'"' '<' $gtmSpecificExtraConfig - ssh $pgxcUser@$gtmMasterServer "cat >> $gtmMasterDir/gtm.conf" < $gtmSpecificExtraConfig - fi - vecho ssh $pgxcUser@$gtmMasterServer '"'cat '>>' $gtmMasterDir/gtm.conf'"' - ssh $pgxcUser@$gtmMasterServer "cat >> $gtmMasterDir/gtm.conf" <<EOF -port = $gtmMasterPort -nodename = '$gtmName' -startup = ACT -# End of addition -EOF - # Next two lines a needed to start GTM with minimum GXID as possible. (default is 10000). - # Current default GXID initial value will cause datanode slave error because there's too - # many XID's involved. This is a dirty hack and should be corrected by running initdb with - # gtm, or gtm can correct what GXID to start with from all the nodes. - vecho Initializing starting GXID value... - vecho '('ssh $pgxcUser@$gtmMasterServer gtm -x 2000 -D $gtmMasterDir '&)' - (ssh $pgxcUser@$gtmMasterServer gtm -x 2000 -D $gtmMasterDir &) - sleep 1 - vecho ssh $pgxcUser@$gtmMasterServer '"'gtm_ctl stop -Z gtm -D $gtmMasterDir '>' /dev/null '2>&1"' - ssh $pgxcUser@$gtmMasterServer "gtm_ctl stop -Z gtm -D $gtmMasterDir > /dev/null 2>&1" -} - -# Configure gtm_slave. The arguments are host name, port and directory. -# If you remove (or don't configure) the slave, you specify host name as -# none. You don't have to worry about the rest of the parameters. -# You can specify additional parameters, extra file to go to gtm.conf -# file, only to the slave. The common file should be configured -# using pgxc_configure_gtm_master function. -#function pgxc_configure_gtm_slave -#{ -#} - - -function pgxc_init_gtm_slave -{ - log_echo pgxc_init_gtm_slave'('$*')' - vecho ================================================================ - vecho $progname:$0 GTM Slave initialize - - if [ "$gtmSlave" != "y" ] || [ "$gtmSlaveServer" == "N/A" ] || [ "$gtmSlaverServer" == "none" ] ; then - echo $progname:$0 ERROR: GTM Slave is not configured. - return 1 - fi - vecho ssh $pgxcUser@$gtmSlaveServer '"'killall -u $pgxcOwner -9 gtm '>' /dev/null '2>&1"' - ssh $pgxcUser@$gtmSlaveServer "killall -u $pgxcOwner -9 gtm > /dev/null 2>&1" - doit ssh $pgxcUser@$gtmSlaveServer rm -rf $gtmSlaveDir - doit ssh $pgxcUser@$gtmSlaveServer mkdir -p $gtmSlaveDir - vecho ssh $pgxcUser@$gtmSlaveServer '"'initgtm -Z gtm -D $gtmSlaveDir '>' $tmpDir/initgtm.out '2>&1"' - ssh $pgxcUser@$gtmSlaveServer "initgtm -Z gtm -D $gtmSlaveDir > $tmpDir/initgtm.out 2>&1" - print_initgtm_out $gtmSlaveServer $tmpDir/initgtm.out - vecho $pgxcUser@$gtmSlaveServer '"'cat '>>' $gtmSlaveDir/gtm.conf'"' - ssh $pgxcUser@$gtmSlaveServer "cat >> $gtmSlaveDir/gtm.conf" <<EOF -listen_addresses = '*' -EOF - if [ $gtmExtraConfig != none ]; then - vecho ssh $pgxcUser@$gtmSlaveServer '"'cat '>>' $gtmSlaveDir/gtm.conf'"' '<' $gtmExtraConfig - ssh $pgxcUser@$gtmSlaveServer "cat >> $gtmSlaveDir/gtm.conf" < $gtmExtraConfig - fi - if [ $gtmSlaveSpecificExtraConfig != none ]; then - vecho ssh $pgxcUser@$gtmSlaveServer '"'cat '>>' $gtmSlaveDir/gtm.conf'"' '<' $gtmSlaveSpecificExtraConfig - ssh $pgxcUser@$gtmSlaveServer "cat >> $gtmSlaveDir/gtm.conf" < $gtmSlaveSpecificExtraConfig - fi - vecho ssh $pgxcUser@$gtmSlaveServer '"'cat '>>' $gtmSlaveDir/gtm.conf'"' - ssh $pgxcUser@$gtmSlaveServer "cat >> $gtmSlaveDir/gtm.conf" <<EOF -port = $gtmSlavePort -nodename = '$gtmName' -startup = STANDBY -active_host = '$gtmMasterServer' -active_port = $gtmMasterPort -EOF -} - -function pgxc_start_gtm_master -{ - log_echo pgxc_start_gtm_master'('$*')' - vecho ================================================================ - vecho Starting GTM Master - - vecho ssh $pgxcUser@$gtmMasterServer '"'killall -u $pgxcOwner -9 gtm '>' /dev/null '2>&1"' - ssh $pgxcUser@$gtmMasterServer "killall -u $pgxcOwner -9 gtm > /dev/null 2>&1" - doit ssh $pgxcUser@$gtmMasterServer "rm -f $gtmMasterDir/register.node" - vecho ssh $pgxcUser@$gtmMasterServer '"'gtm_ctl start -Z gtm -D $gtmMasterDir '>' $tmpDir/gtm.out'"' - ssh $pgxcUser@$gtmMasterServer "gtm_ctl start -Z gtm -D $gtmMasterDir > $tmpDir/gtm.out" - do_stdout $gtmMasterServer $tmpDir/gtm.out -} - -function pgxc_start_gtm_slave -{ - log_echo pgxc_start_gtm_slave'('$*')' - vecho ================================================================ - vecho $progname:$0 Starting GTM Slave - - if [ $gtmSlaveServer == none ]; then - eecho ERROR: GTM slave is not configured. - return 1 - fi - vecho ssh $pgxcUser@$gtmMasterServer '"'gtm_ctl status -Z gtm -D $gtmMasterDir '>' /dev/null '2>&1"' - ssh $pgxcUser@$gtmMasterServer "gtm_ctl status -Z gtm -D $gtmMasterDir > /dev/null 2>&1" - if [ $? -ne 0 ]; then - echo ERROR: GTM Master is not running. Cannot start the slave. - return 1 - fi - vecho ssh $pgxcUser@$gtmSlaveServer '"'killall -u $pgxcOwner -9 gtm '>' /dev/null '2>&1"' - ssh $pgxcUser@$gtmSlaveServer "killall -u $pgxcOwner -9 gtm >/dev/null 2>&1" - doit ssh $pgxcUser@$gtmSlaveServer "rm -f $gtmSlaveDir/register.node" - vecho ssh $pgxcUser@$gtmSlaveServer '"'gtm_ctl start -Z gtm -D $gtmSlaveDir '>' $tmpDir/gtm.out'"' - ssh $pgxcUser@$gtmSlaveServer "gtm_ctl start -Z gtm -D $gtmSlaveDir > $tmpDir/gtm.out" - do_stdout $gtmSlaveServer $tmpDir/gtm.out -} - - -function pgxc_stop_gtm_master -{ - log_echo pgxc_stop_gtm_master'('$*')' - vecho ================================================================ - vecho Stopping GTM Master - doit ssh $pgxcUser@$gtmMasterServer gtm_ctl stop -Z gtm -D $gtmMasterDir -} - -function pgxc_stop_gtm_slave -{ - log_echo pgxc_stop_gtm_slave'('$*')' - vecho ================================================================ - vecho Stopping GTM Slave - if [ $gtmSlaveServer == none ] || [ $gtmSlaveServer == N/A ]; then - eecho ERROR: GTM slave is not configured. - return 1 - fi - doit ssh $pgxcUser@$gtmSlaveServer gtm_ctl stop -Z gtm -D $gtmSlaveDir -} - -function pgxc_kill_gtm_master -{ - log_echo pgxc_kill_gtm_master'('$*')' - vecho ================================================================ - vecho Stopping GTM Master - vecho ssh $pgxcUser@$gtmMasterServer '"'killall -u $pgxcUser -9 gtm '>'/dev/null '2>&1"' - ssh $pgxcUser@$gtmMasterServer "killall -u $pgxcUser -9 gtm >/dev/null 2>&1" - pgxc_clean_socket $gtmMasterServer $gtmMasterPort -} - -function pgxc_kill_gtm_slave -{ - log_echo pgxc_kill_gtm_slave'('$*')' - vecho ================================================================ - vecho Stopping GTM Slave - if [ $gtmSlaveServer == none ] || [ $gtmSlaveServer == N/A ]; then - eecho ERROR: GTM slave is not configured. - return 1 - fi - vecho ssh $pgxcUser@$gtmSlaveServer '"'killall -u $pgxcUser -9 gtm '>'/dev/null '2>&1"' - ssh $pgxcUser@$gtmSlaveServer "killall -u $pgxcUser -9 gtm >/dev/null 2>&1" - pgxc_clean_socket $gtmSlaveServer $gtmSlavePort -} - -function pgxc_failover_gtm -{ - log_echo pgxc_failover_gtm - # Reconnect should be done in separate action. - vecho ================================================================ - vecho GTM Failover - - if [ $gtmSlaveServer == none ]; then - eecho ERROR: pgxc_failover_gtm: GTM slave is not available. - return 1 - fi - doit pgxc_monitor -Z gtm -p $gtmSlavePort -h $gtmSlaveServer -# ssh "$pgxcUser@$gtmSlaveServer gtm_ctl status -Z gtm -D $gtmSlaveDir > /dev/null 2>&1" - if [ $? -ne 0 ]; then - eecho ERROR: GTM slave is not running. - return 1 - fi - # STONITH GTM Master - # Please note that master and slave should run on different server. -# vecho $pgxcUser@$gtmMasterServer '"'killall -u $pgxcOwner -9 gtm '>'/dev/null '2>&1"' -# ssh $pgxcUser@$gtmMasterServer "killall -u $pgxcOwner -9 gtm >/dev/null 2>&1" - doit ssh $pgxcUser@$gtmSlaveServer gtm_ctl promote -Z gtm -D $gtmSlaveDir - # Update GTM configuration file as the master - vecho Reconfigure GTM as Master - vecho ssh $pgxcUser@$gtmSlaveServer '"'cat '>>' $gtmSlaveDir/gtm.conf'"' - ssh $pgxcUser@$gtmSlaveServer "cat >> $gtmSlaveDir/gtm.conf" <<EOF -#=================================================== -# Updated due to GTM failover -# $datetime -startup = ACT -#----End of reconfiguration ------------------------- -EOF - # Update configuration - vecho Reconfiguring whole Postgres-XC cluster - vecho cat '>>' $configFile - cat >> $configFile <<EOF -#=================================================== -# pgxc configuration file updated due to GTM failover -# $datetime -gtmMasterServer=$gtmSlaveServer -gtmMasterPort=$gtmSlavePort -gtmMasterDir=$gtmSlaveDir -gtmSlaveServer=none -gtmSlavePort=0 -gtmSlaveDir=none -#----End of reconfiguration ------------------------- -EOF - # Bacup config file - pgxc_backup_config_file - # Reconfigure myself - gtmMasterServer=$gtmSlaveServer - gtmMasterPort=$gtmSlavePort - gtmMasterDir=$gtmSlaveDir - gtmSlaveServer=none - gtmSlavePort=0 - gtmSlaveDir=none -} - -#=============================================================================== -# -# GTM Proxy staff -# -#=============================================================================== - -function pgxc_init_gtm_proxy -{ - # First argument is the nodename - log_echo pgxc_init_gtm_proxy'('$*')' - vecho ================================================================ - vecho Initialize GTM Proxy $1 - - local i - - if [ $# -ne 1 ]; then - eecho ERROR: Specify gtm_proxy name - return 1 - fi - for ((i=0; i< ${#gtmProxyNames[@]}; i++)); do - if [ $1 == ${gtmProxyNames[$i]} ] && [ ${gtmProxyServers[$i]} != none ] && [ ${gtmProxyServers[$i]} != N/A ]; then - vecho ssh $pgxcUser@${gtmProxyServers[$i]} '"'killall -u $pgxcOwner -9 gtm_proxy '>'/dev/null '2>&1"' - ssh $pgxcUser@${gtmProxyServers[$i]} "killall -u $pgxcOwner -9 gtm_proxy >/dev/null 2>&1" - doit ssh $pgxcUser@${gtmProxyServers[$i]} rm -rf ${gtmProxyDirs[$i]} - doit ssh $pgxcUser@${gtmProxyServers[$i]} mkdir -p ${gtmProxyDirs[$i]} - vecho ssh $pgxcUser@${gtmProxyServers[$i]} '"'initgtm -Z gtm_proxy -D ${gtmProxyDirs[$i]} '>' $tmpDir/initgtm.out '2>&1"' - ssh $pgxcUser@${gtmProxyServers[$i]} "initgtm -Z gtm_proxy -D ${gtmProxyDirs[$i]} > $tmpDir/initgtm.out 2>&1" - print_initgtm_out ${gtmProxyServers[$i]} $localTmpDir/initgtm.out - vecho Configuring ${gtmProxyServers[$i]}:${gtmProxyDirs[$i]}/gtm_proxy.conf - if [ $gtmPxyExtraConfig != none ] && [ $gtmPxyExtrConfig != N/A ]; then - vecho ssh $pgxcUser@${gtmProxyServers[$i]} '"'cat '>>' ${gtmProxyDirs[$i]}/gtm_proxy.conf'"' '<' $gtmPxyExtraConfig - ssh $pgxcUser@${gtmProxyServers[$i]} "cat >> ${gtmProxyDirs[$i]}/gtm_proxy.conf" < $gtmPxyExtraConfig - fi - vecho ssh $pgxcUser@${gtmProxyServers[$i]} '"'cat '>>' ${gtmProxyDirs[$i]}/gtm_proxy.conf'"' - ssh $pgxcUser@${gtmProxyServers[$i]} "cat >> ${gtmProxyDirs[$i]}/gtm_proxy.conf" <<EOF -nodename = '${gtmProxyNames[$i]}' -listen_addresses = '*' -port = ${gtmProxyPorts[$i]} -gtm_host = $gtmMasterServer -gtm_port = $gtmMasterPort -worker_threads = 1 -gtm_connect_retry_interval = 1 -EOF - return - fi - done - eecho ERROR: specified GTM proxy is not configured, $1 - return 1 -} - -function pgxc_init_gtm_proxy_all -{ - local i - - log_echo pgxc_init_gtm_proxy_all'('$*')' - if [ $gtmProxy != y ]; then - eecho ERROR: gtm_proxy is not configured - return 1 - fi - for((i=0;i<${#gtmProxyNames[@]};i++)); do - if [ ${gtmProxyServers[$i]} != none ] && [ ${gtmProxyServers[$i]} != N/A ]; then - pgxc_init_gtm_proxy ${gtmProxyNames[$i]} - fi - done -} - -function pgxc_start_gtm_proxy -{ - # First argument is the nodename - log_echo pgxc_start_gtm_proxy'('$*')' - vecho ================================================================ - vecho Start GTM Proxy $1 - - if [ $# -ne 1 ]; then - eecho Error: specify GTM proxy name - return 1 - fi - local i - for ((i=0; i< ${#gtmProxyNames[@]}; i++)); do - if [ $1 == ${gtmProxyNames[$i]} ]; then - vecho ssh $pgxcUser@${gtmProxyServers[$i]} '"'killall -u $pgxcOwner -9 gtm_proxy '>'/dev/null '2>&1"' - ssh $pgxcUser@${gtmProxyServers[$i]} "killall -u $pgxcOwner -9 gtm_proxy >/dev/null 2>&1" - vecho ssh $pgxcUser@${gtmProxyServers[$i]} '"'gtm_ctl start -Z gtm_proxy -D ${gtmProxyDirs[$i]} '>' $tmpDir/gtm_proxy.out '2>&1"' - ssh $pgxcUser@${gtmProxyServers[$i]} "gtm_ctl start -Z gtm_proxy -D ${gtmProxyDirs[$i]} > $tmpDir/gtm_proxy.out 2>&1" - do_stdout ${gtmProxyServers[$i]} $tmpDir/gtm_proxy.out - return - fi - done - eecho ERROR: specified GTM proxy does not exist, $1 - return 1 -} - -function pgxc_start_gtm_proxy_all -{ - log_echo pgxc_startgtm_proxy_all'('$*')' - local i - vecho ================================================================ - vecho Starting all the GTM proxies - if [ $gtmProxy != y ]; then - eecho ERROR: GTM proxy is not configured. - return 1 - fi - for((i=0;i<${#gtmProxyNames[@]};i++)); do - if [ ${gtmProxyServers[$i]} != none ] && [ ${gtmProxyServers[$i]} != N/A ]; then - pgxc_monitor -Z gtm -p ${gtmProxyPorts[$i]} -h ${gtmProxyServers[$i]} - if [ $? -eq 0 ]; then - eecho gtm_proxy"("${gtpmProxyNames[$i]}")" is already running. - else - doit pgxc_start_gtm_proxy ${gtmProxyNames[$i]} - fi - fi - done -} - -function pgxc_stop_gtm_proxy -{ - # First argument is the nodename - log_echo pgxc_stop_gtm_proxy'('$*')' - vecho ================================================================ - vecho Stop GTM Proxy $1 - - if [ $# -ne 1 ]; then - iecho Specify GTM Proxy name - return 1 - fi - local i - for ((i=0; i< ${#gtmProxyNames[@]}; i++)); do - if [ $1 == ${gtmProxyNames[$i]} ]; then - doit ssh $pgxcUser@${gtmProxyServers[$i]} gtm_ctl stop -Z gtm_proxy -D ${gtmProxyDirs[$i]} - return - fi - done - eecho ERROR: specified GTM proxy does not exist, $1 - return 1 -} - -function pgxc_stop_gtm_proxy_all -{ - log_echo pgxc_stop_gtm_proxy_all'('$*')' - vecho ================================================================ - vecho Stop all the GTM Proxies - - local i - if [ $gtmProxy != y ]; then - eecho Error: GTM Proxy is not configured - return 1 - fi - for((i=0;i<${#gtmProxyNames[@]};i++)); do - if [ ${gtmProxyServers[$i]} == none ] || [ ${gtmProxyServers[$i]} == N/A ]; then - continue - fi - doit pgxc_stop_gtm_proxy ${gtmProxyNames[$i]} - done -} - - - -function pgxc_kill_gtm_proxy -{ - # First argument is the nodename - log_echo pgxc_kill_gtm_proxy'('$*')' - vecho ================================================================ - vecho Kill GTM Proxy $1 - - if [ $# -ne 1 ]; then - eecho ERROR: specify GTM proxy name - return 1 - fi - local i - for ((i=0; i< ${#gtmProxyNames[@]}; i++)); do - if [ $1 == ${gtmProxyNames[$i]} ]; then - vecho ssh $pgxcUser@${gtmProxyServers[$i]} '"'killall -u $pgxcOwner -9 gtm_proxy '>'/dev/null '2>&1"' - ssh $pgxcUser@${gtmProxyServers[$i]} "killall -u $pgxcOwner -9 gtm_proxy >/dev/null 2>&1" - doit pgxc_clean_socket ${gtmProxyServers[$i]} ${gtmProxyPorts[$i]} - return - fi - done - eecho ERROR: specified GTM proxy does not exist, $1 - return 1 -} - -#----------------ここまで: ログ出力拡張: Oct 19, 2012 -------------------------- -function pgxc_kill_gtm_proxy_all -{ - log_echo pgxc_lill_gtm_proxy_all "("$*")" - vecho ================================================================ - vecho Killing all the GTM Proxies - - local i - if [ $gtmProxy != y ]; then - eecho GTM Proxy is not configured - return 1 - fi - for((i=0;i<${#gtmProxyNames[@]};i++)); do - if [ ${gtmProxyServers[$i]} == none ] || [ ${gtmProxySevrers[$i]} == N/A ]; then - continue - fi - pgxc_kill_gtm_proxy ${gtmProxyNames[$i]} - done -} - -function pgxc_reconnect_gtm_proxy -{ - # Reconnect to the current GTM master. When failed over, the current Master must have been updated. - # Remember to update gtm_proxy configuration file so that it connects to the new master at the next - # start. - # Please note that we assume GTM has already been failed over. - # First argument is gtm_proxy nodename - log_echo pgxc_reconnect_gtm_proxy "("$*")" - vecho ================================================================ - vecho Reconnect GTM Proxy $1 - - if [ $# -ne 1 ]; then - eecho Specify GTM proxy name - return 1 - fi - local i - for ((i=0; i< ${#gtmProxyNames[@]}; i++)); do - if [ $1 == ${gtmProxyNames[$i]} ]; then - vecho doit ssh $pgxcUser@${gtmProxyServers[$i]} gtm_ctl reconnect -Z gtm_proxy -D ${gtmProxyDirs[$i]} -o \ - \"-s $gtmMasterServer -t $gtmMasterPort\" - - doit ssh $pgxcUser@${gtmProxyServers[$i]} gtm_ctl reconnect -Z gtm_proxy -D ${gtmProxyDirs[$i]} -o \ - \"-s $gtmMasterServer -t $gtmMasterPort\" - vecho Reconfiguring GTM Proxy reflect reconnect. - log_echo ssh $pgxcUser@${gtmProxyServers[$i]} '"'cat '>>' ${gtmProxyDirs[$i]}/gtm_proxy.conf'"' - ssh $pgxcUser@${gtmProxyServers[$i]} "cat >> ${gtmProxyDirs[$i]}/gtm_proxy.conf" <<EOF -#=================================================== -# Updated due to GTM Proxy reconnect -# $datetime -gtm_host = $gtmMasterServer -gtm_port = $gtmMasterPort -#----End of reconfiguration ------------------------- -EOF - return - fi - done - eecho ERROR: specified GTM proxy does not exist, $1 - return 1 - -} - -function pgxc_reconnect_gtm_proxy_all -{ - log_echo pgxc_reconnect_gtm_proxy_all "("$*")" - vecho ================================================================ - vecho Reconnect all the GTM proxies - - local i - if [ $gtmProxy != y ]; then - eecho GTM Poxy is not configured - return 1 - fi - for((i=0;i<${#gtmProxyNames[@]};i++)); do - if [ ${gtmProxyServers[$i]} == none ] || [ ${gtmProxyServers[$i]} == N/A ]; then - continue - fi - pgxc_reconnect_gtm_proxy ${gtmProxyNames[$i]} - done -} -#=============================================================================== -# -# Coordinator Staff -# -#=============================================================================== - -function pgxc_init_coordinator_master -{ - # First argument is the nodename - log_echo pgxc_init_coordinator_master "("$*")" - vecho ================================================================ - vecho Initialize coordinator master $1 - - if [ $# -ne 1 ]; then - eecho Specify coordinator name - return 1 - fi - local i - for ((i=0; i< ${#coordNames[@]}; i++)); do - if [ $1 == ${coordNames[$i]} ] && [ ${coordMasterServers[$i]} != none ] && [ ${coordMasterServers[$i]} != N/A ]; then - psql -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} -c 'select 1' postgres $pgxcOwner > /dev/null 2> /dev/null - if [ $? -eq 0 ]; then - eecho ERROR: target coordinator master is running now. Stop to configure $1 slave. - return 1 - fi - doit ssh $pgxcUser@${coordMasterServers[$i]} rm -rf ${coordMasterDirs[$i]} - doit ssh $pgxcUser@${coordMasterServers[$i]} mkdir -p ${coordMasterDirs[$i]} - doit ssh $pgxcUser@${coordMasterServers[$i]} "initdb --nodename ${coordNames[$i]} -D ${coordMasterDirs[$i]} > $tmpDir/initdb.out 2>&1" - print_initdb_out ${coordMasterServers[$i]} $tmpDir/initdb.out - vecho Configuring ${coordMasterServers[$i]}:${coordMasterDirs[$i]}/postgresql.conf - # Get effective GTM port and host. If gtm_proxy is not found, then connect to GTM - local j - local targetGTMhost - local targetGTMport - targetGTMhost=$gtmMasterServer - targetGTMport=$gtmMasterPort - for ((j=0; j< ${#gtmProxyServers[@]}; j++)); do - if [ ${coordMasterServers[$i]} == ${gtmProxyServers[$j]} ]; then - targetGTMhost=${gtmProxyServers[$j]} - targetGTMport=${gtmProxyPorts[$j]} - break - fi - done - if [ $coordExtraConfig != none ] && [ $coordExtraConfig != N/A ]; then - vecho Configuring $pgxcUser@${coordMasterServer[$i]}:${coaordMasterDirs[$i]}/postgresql.conf using $coordExtraConfig - ssh $pgxcUser@${coordMasterServers[$i]} "cat >> ${coordMasterDirs[$i]}/postgresql.conf" < $coordExtraConfig - fi - if [ ${coordSpecificExraConfig[$i]} != none ] && [ ${coordSpecificExraConfig[$i]} != none ]; then - vecho Configuring $pgxcUser@${coordMasterServers[$i]}:${coordMasterDirs[$i]}/postgresql.conf using ${coordSpecificExtraConfig[$i]} - ssh $pgxcUser@${coordMasterServers[$i]} "cat >> ${coordMasterDirs[$i]}/postgresql.conf" < ${coordSpecificExtraConfig[$i]} - fi - vecho Configuring $pgxcUser@${coordMasterServers[$i]}:${coordMasterDirs[$i]}/postgresq - log_echo ssh $pgxcUser@${coordMasterServers[$i]} '"'cat '>>' ${coordMasterDirs[$i]}/postgresql.conf'"' - ssh $pgxcUser@${coordMasterServers[$i]} "cat >> ${coordMasterDirs[$i]}/postgresql.conf" <<EOF -#=========================================== -# Added at initialization. $datetime -log_destination = 'stderr' -logging_collector = on -log_directory = 'pg_log' -listen_addresses = '*' -port = ${coordPorts[$i]} -max_connections = 100 -pooler_port = ${poolerPorts[$i]} -gtm_host = '$targetGTMhost' -gtm_port = $targetGTMport -EOF - # Additional initialization for log_shipping. - if [ $coordSlave == y ] && [ ${coordSlaveServers[$i]} != none ] && [ ${coordSlaveServers[$i]} != N/A ]; then - # At least cleanup remote archive directory. - pgxc_clean_dir ${coordSlaveServers[$i]} ${coordArchLogDirs[$i]} - # Then setup postgresql.conf - log_echo ssh $pgxcUser@${coordMasterServers[$i]} '"'cat '>>' ${coordMasterDirs[$i]}/postgresql.conf'"' - ssh $pgxcUser@${coordMasterServers[$i]} "cat >> ${coordMasterDirs[$i]}/postgresql.conf" <<EOF -wal_level = hot_standby -archive_mode = on -archive_command = 'rsync %p $pgxcUser@${coordSlaveServers[$i]}:${coordArchLogDirs[$i]}/%f' -max_wal_senders = ${coordMaxWALSenders[$i]} -# End of Addition -EOF - else - log_echo ssh $pgxcUser@${coordMasterServers[$i]} '"'cat '>>' ${coordMasterDirs[$i]}/postgresql.conf'"' - ssh $pgxcUser@${coordMasterServers[$i]} "cat >> ${coordMasterDirs[$i]}/postgresql.conf" <<EOF -# End of Addition -EOF - fi - vecho Configuring ${coordMasterServers[$i]}:${coordMasterDirs[$i]}/pg_hba.conf - log_echo ssh $pgxcUser@${coordMasterServers[$i]} '"'cat '>>' ${coordMasterDirs[$i]}/pg_hba.conf'"' - ssh $pgxcUser@${coordMasterServers[$i]} "cat >> ${coordMasterDirs[$i]}/pg_hba.conf" <<EOF -#================================================= -# Addition at initialization, $datetime -EOF - if [ $coordExtraPgHba != none ] && [ $coordExtraPgHba != N/A ]; then - vecho Configuring ${coordMasterServers[$i]}:${coordMasterDirs[$i]}/pg_hba.conf using $coordExtraPgHba - log_echo ssh $pgxcUser@${coordMasterServers[$i]} '"'cat '>>' ${coordMasterDirs[$i]}/pg_hab.conf'"' '<' $coordExtraPgHba - ssh $pgxcUser@${coordMasterServers[$i]} "cat >> ${coordMasterDirs[$i]}/pg_hab.conf" < $coordExtraPgHba - fi - if [ ${coordSpecificExtraPgHba[$i]} != none ] && [ ${coordSpecificExtraPgHba[$i]} != N/A ]; then - log_echo ssh $pgxcUser@${coordMasterServers[$i]} '"'cat '>>' ${coordMasterDirs[$i]}/pg_hab.conf'"' '<' ${coordSpecificExtraPgHba[$i]} - ssh $pgxcUser@${coordMasterServers[$i]} "cat >> ${coordMasterDirs[$i]}/pg_hab.conf" < ${coordSpecificExtraPgHba[$i]} - fi - local j - for ((j=0; j< ${#coordPgHbaEntries[@]}; j++)); do - log_echo ssh $pgxcUser@${coordMasterServers[$i]} '"'cat '>>' ${coordMasterDirs[$i]}/pg_hba.conf'"' - ssh $pgxcUser@${coordMasterServers[$i]} "cat >> ${coordMasterDirs[$i]}/pg_hba.conf" <<EOF -host all $pgxcOwner ${coordPgHbaEntries[$j]} trust -EOF - if [ ${coordSlaveServers[$i]} != none ] && [ ${coordSlaveServers[$i]} != N/A ]; then - log_echo ssh $pgxcUser@${coordMasterServers[$i]} '"'cat '>>' ${coordMasterDirs[$i]}/pg_hba.conf'"' - ssh $pgxcUser@${coordMasterServers[$i]} "cat >> ${coordMasterDirs[$i]}/pg_hba.conf" <<EOF -host replication $pgxcOwner ${coordPgHbaEntries[$j]} trust -EOF - fi - done - log_echo ssh $pgxcUser@${coordMasterServers[$i]} '"'cat '>>' ${coordMasterDirs[$i]}/pg_hba.conf'"' - ssh $pgxcUser@${coordMasterServers[$i]} "cat >> ${coordMasterDirs[$i]}/pg_hba.conf" <<EOF -# End of addition -EOF - return - fi - done - eecho ERROR: specified coordinator is not configured, $1 - return 1 -} - -function pgxc_init_coordinator_master_all -{ - log_echo pgxc_init_coordinator_master_all'('$*')' - vecho ================================================================ - vecho Initialize all the coordinator masters - - local i - for ((i=0; i< ${#coordNames[@]}; i++)); do - if [ ${coordMasterServers[$i]} != none ] && [ ${coordMasterServers[$i]} != N/A ]; then - pgxc_init_coordinator_master ${coordNames[$i]} - fi - done -} - -function pgxc_start_coordinator_master -{ - log_echo pgxc_start_coordinator_master'('$*')' - # First argument is the coordinator name - vecho ================================================================ - vecho Start coordinator master $1 - - if [ $# -ne 1 ]; then - eecho Specify coordinator name - return 1 - fi - local i - for ((i=0; i< ${#coordNames[@]}; i++)); do - if [ $1 == ${coordNames[$i]} ]; then - log_echo psql -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} postgres $pgxcOwner -c \'select 1\' '>' /dev/null '2>&1' - psql -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} postgres $pgxcOwner -c 'select 1' > /dev/null 2>&1 - if [ $? -eq 0 ]; then - eecho ERROR: target coordinator master is running now. - return 1 - fi - log_echo ssh $pgxcUser@${coordMasterServers[$i]} '"'pg_ctl start -Z coordinator -D ${coordMasterDirs[$i]} -o -i '>' $tmpDir/coord.out '2>&1"' - ssh $pgxcUser@${coordMasterServers[$i]} "pg_ctl start -Z coordinator -D ${coordMasterDirs[$i]} -o -i > $tmpDir/coord.out 2>&1" - do_stdout ${coordMasterServers[$i]} $tmpDir/coord.out - return - fi - done - echo ERROR: specified coordinator is not configured, $1 - return 1 -} - -function pgxc_start_coordinator_master_all -{ - log_echo pgxc_start_coordinator_master_all'('$*')' - vecho ================================================================ - vecho Start all the coordinator masters - - local i - for ((i=0; i< ${#coordNames[@]}; i++)); do - if [ ${coordMasterServers[$i]} != none ] && [ ${coordMasterServers[$i]} != N/A ]; then - doit pgxc_monitor -Z node -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} -U $pgxcOwner -d postgres - if [ $? -eq 0 ]; then - eecho coordinator master "("${coordNames[$i]}")" is already running - else - pgxc_start_coordinator_master ${coordNames[$i]} - fi - fi - done -} - -function pgxc_stop_coordinator_master -{ - log_echo pgxc_stop_coordinator_master'('$*')' - # First arugument is the coordinator name - vecho ================================================================ - vecho Stop coordinator master $1 - - if [ $# -ne 1 ]; then - eecho Specify coordinator name - return 1 - fi - local i - for ((i=0; i< ${#coordNames[@]}; i++)); do - if [ $1 == ${coordNames[$i]} ]; then - doit ssh $pgxcUser@${coordMasterServers[$i]} pg_ctl stop -Z coordinator -D ${coordMasterDirs[$i]} $immediate - return - fi - done - eecho ERROR: specified coordinator does not exist, $1 - return 1 -} - -function pgxc_stop_coordinator_master_all -{ - log_echo pgxc_stop_coordinator_master_all'('$*')' - vecho ================================================================ - vecho Stop all the coordinator masters - - local i - for ((i=0; i< ${#coordNames[@]}; i++)); do - if [ ${coordMasterServers[$i]} != none ] && [ ${coordMasterServers[$i]} != N/A ]; then - pgxc_stop_coordinator_master ${coordNames[$i]} - fi - done -} - - -function pgxc_kill_coordinator_master -{ - log_echo pgxc_kill_coordinator_master'('$*')' - # First arugument is the coordinator name - - # It's safer to kill the target coordinator with killall command. In this case, we need to - # capture postmaster's pid for the target - vecho ================================================================ - vecho Kill coordinator master $1 - - if [ $# -ne 1 ]; then - eecho Specify nodename - return 1 - fi - local i - local postmaster_pid - for ((i=0; i< ${#coordNames[@]}; i++)); do - if [ $1 == ${coordNames[$i]} ]; then - if [ ${coordMasterServers[$i]} != none ] && [ ${coordMasterServers[$i]} != N/A ]; then - postmaster_pid=`get_postmaster_pid ${coordMasterServers[$i]} ${coordMasterDirs[$i]}` - if [ $postmaster_pid != none ]; then - doit kill_all_child_parent ${coordMasterServers[$i]} $postmaster_pid - fi - doit pgxc_clean_socket ${coordMasterServers[$i]} ${coordPorts[$i]} - else - eecho specified coordinator master does not exist, $1 - fi - return - fi - done - eecho ERROR: specified coordinator does not exist, $1 - return 1 -} - -function pgxc_kill_coordinator_master_all -{ - log_echo pgxc_kill_coordinator_master_all'('$*')' - vecho ================================================================ - vecho Start all the coordinator masters - - local i - for ((i=0; i< ${#coordNames[@]}; i++)); do - if [ ${coordMasterServers[$i]} != none ] && [ ${coordMasterServers[$i]} != N/A ]; then - pgxc_kill_coordinator_master ${coordNames[$i]} - fi - done -} - - -# Caution: This function has not been tested yet! Should test when datanode is ready. -# If a coordinator is not configured with the slave, we should remove it from the cluster -# when it fails. -function pgxc_remove_coordinator_master # NOT TESTED YET -{ - log_echo pgxc_remove_coordinator_master'('$*')' - local i - for ((i=0; i<${#coordNames[@]}; i++)); do - if [[ ${coordNames[$i]} == $1 ]]; then - local j - for ((j=0; j< ${#coordNames[@]}; j++)); do - if [ $i -ne -$j ]; then - if [ ${coordMasterServers[$j]} != none ] && [ ${coordMasterServers[$i]} != N/A ]; then - log_echo psql -p ${coordPorts[$j]} -h ${coordMasterServers[$j]} postgres $pgxcOwner -c '"'DROP NODE ${coordNames[$j]}'"' - psql -p ${coordPorts[$j]} -h ${coordMasterServers[$j]} postgres $pgxcOwner -c "DROP NODE ${coordNames[$j]}" - fi - else - doit ssh $pgxcUser@${coordMasterServers[$j]} pg_ctl stop -Z coordinator -D ${coordMaseterDirs[$j]} -m immediate - fi - done - ${coordMasterServers[$i]}=none - ${coordMasterDirs[$i]}=none - log_echo Update configuration file $configFile with new cordinaor Master - cat >> $configFile <<EOF -#========================================================= -# Update due to coordinator master removal, $1, $datetime -coordMasterServers=(${coordMasterServers[@]}) -coordMasterDirs=(${coordMasterDirs[@]) -# End of update -EOF - # Backup configiraiton file - pgxc_backup_config_file - fi - done -} - -# To construct coordinator slave, pg_basebackup utility is used, which needs master coordinator running. -# If the master coordinator is not running, then we temporary run it. After copying the base backup, -# the the master will be stopped. Please be sure that coordinator master is initialized properly. -# If it is running, then it will be restarted to reflect the change to postgresql.conf. -function pgxc_init_coordinator_slave -{ - log_echo pgxc_init_coordinator_slave'('$*')' - # First argument is the coordinator name - vecho ================================================================ - vecho Initialize coordinator slave $1 - - if [ $# -ne 1 ]; then - eecho Specify coordinator node name - return 1 - fi - if [ "$coordSlave" != "y" ]; then - eecho No coordinator Slave is configured. - return 1 - fi - local i - local start_master=n - restart=n - for ((i=0; i< ${#coordNames[@]}; i++)); do - if [ $1 == ${coordNames[$i]} ]; then - if [ ${coordSlaveServers[$i]} == N/A ] || [ ${coordSlaveServers[$i]} == none ]; then - eecho ERROR: slave for the coordinator $1 is not configured. - return 1 - fi - # Coordinator master should be running - log_echo psql -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} postgres $pgxcOwner -c \'select 1\' '>' /dev/null '2>&1' - psql -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} postgres $pgxcOwner -c 'select 1' > /dev/null 2>&1 - if [ $? -ne 0 ]; then - start_master=y - fi - # Clean slave's directory - doit ssh $pgxcUser@${coordSlaveServers[$i]} rm -rf ${coordSlaveDirs[$i]} - doit ssh $pgxcUser@${coordSlaveServers[$i]} mkdir -p ${coordSlaveDirs[$i]} - doit ssh $pgxcUser@${coordSlaveServers[$i]} chmod 0700 ${coordSlaveDirs[$i]} - # if the master is not running, we just start it and then stop it. - if [ $start_master == y ]; then - log_echo Starting the coordinator master to obtain base backup - log_echo ssh $pgxcUser@${coordMasterServers[$i]} '"'pg_ctl start -Z coordinator -D ${coordMasterDirs[$i]} -o -i '>' $tmpDir/cmd.out'"' - ssh $pgxcUser@${coordMasterServers[$i]} "pg_ctl start -Z coordinator -D ${coordMasterDirs[$i]} -o -i > $tmpDir/cmd.out" - do_stdout ${coordMasterServers[$i]} $tmpDir/cmd.out - sleep 2 - fi - # Obtain base backup of the master - doit ssh $pgxcUser@${coordSlaveServers[$i]} pg_basebackup -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} -D ${coordSlaveDirs[$i]} -x - - # Configure recovery.conf of the slave - vecho -- Configure slave\'s recovery.conf, ${coordSlaveServers[$i]}:${coordSlaveDirs[$i]}/recovery.conf - log_echo ssh $pgxcUser@$coordSlaveServers[$i]} '"'cat '>>' ${coordSlaveDirs[$i]}/recovery.conf'"' - ssh $pgxcUser@${coordSlaveServers[$i]} "cat >> ${coordSlaveDirs[$i]}/recovery.conf" <<EOF -#========================================== -# Added to initialize the slave, $datetime -standby_mode = on -primary_conninfo = 'host = ${coordMasterServers[$i]} port = ${coordPorts[$i]} user = $pgxcOwner application_name = ${coordNames[$i]}' -restore_command = 'cp ${coordArchLogDirs[$i]}/%f %p' -archive_cleanup_command = 'pg_archivecleanup ${coordArchLogDirs[$i]} %r' -EOF - # Configure slave's postgresql.conf - vecho -- Configure slave\'s postgresql.conf, ${coordSlaveServers[$i]}:${coordSlaveDirs[$i]}/postgresql.conf - log_echo ssh $pgxcUser@${coordSlaveServers[$i]} '"'cat '>>' ${coordSlaveDirs[$i]}/postgresql.conf'"' - ssh $pgxcUser@${coordSlaveServers[$i]} "cat >> ${coordSlaveDirs[$i]}/postgresql.conf" <<EOF -#========================================== -# Added to initialize the slave, $datetime -hot_standby = on -port = ${coordPorts[$i]} -EOF - # Stop the Master if it was not runnig - if [ $start_master = y ]; then - doit ssh $pgxcUser@${coordMasterServers[$i]} pg_ctl stop -Z coordinator -D ${coordMasterDirs[$i]} -m fast - fi - return - fi - done - eecho ERROR: specified coordinator is not configured, $1 - return 1 -} - -function pgxc_init_coordinator_slave_all -{ - log_echo pgxc_init_coordinator_slave_all'('$*')' - # First argument is the coordinator name - vecho ================================================================ - vecho Initialize all the coordinator slaves - - local i - if [ $coordSlave != y ]; then - eecho Coordinator slaves are not configured. - return 1 - fi - for ((i=0;i<${#coordNames[@]};i++)); do - if [ ${coordNames[$i]} != none ] && [ ${coordNames[$i]} != N/A ]; then - log_echo psql -p ${coordPorts[$i]} -h ${coordSlaveServers[$i]} postgres $pgxcOwner -c \'select 1\' '>' /dev/null '2>&1' - psql -p ${coordPorts[$i]} -h ${coordSlaveServers[$i]} postgres $pgxcOwner -c 'select 1' > /dev/null 2>&1 - if [ $? -eq 0 ]; then - eecho Coordinator slave "("${coordNames[$i]}")" is already running. - return 1 - fi - pgxc_init_coordinator_slave ${coordNames[$i]} - fi - done - return -} - -function pgxc_start_coordinator_slave -{ - log_echo pgxc_start_coordinator_slave'('$*')' - # First argument is the coordinator name - vecho ================================================================ - vecho Start coordinator slave $1 - - if [ $coordSlave != y ]; then - eecho Coordinator slaves are not configured. - return 1 - fi - local i - for ((i=0; i< ${#coordNames[@]}; i++)); do - if [ $1 == ${coordNames[$i]} ]; then - if [ ${coordSlaveServers[$i]} == none ] || [ ${coordSlaveServers[$i]} == N/A ]; then - eecho ERROR: slave for coordinator $1 is not configured. - return 1 - fi - # Coordinator master should be running - log_echo psql -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} postgres $pgxcOwner -c \'select 1\' '>' /dev/null '2>&1' - psql -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} postgres $pgxcOwner -c 'select 1' > /dev/null 2>&1 - if [ $? -ne 0 ]; then - eecho ERROR: corresponding coordinator master is not running now, $1 - return 1 - fi - # Start the slave - log_echo ssh $pgxcUser@${coordSlaveServers[$i]} '"'pg_ctl start -Z coordinator -D ${coordSlaveDirs[$i]} -o -i '>' $tmpDir/coord.out'"' - ssh $pgxcUser@${coordSlaveServers[$i]} "pg_ctl start -Z coordinator -D ${coordSlaveDirs[$i]} -o -i > $tmpDir/coord.out" - do_stdout ${coordSlaveServers[$i]} $tmpDir/coord.out - # Change the master to synchronous mode - vecho Change the master to synchrnous mode, $1 - log_echo ssh $pgxcUser@${coordMasterServers[$i]} '"'cat '>>' ${coordMasterDirs[$i]}/postgresql.conf'"' - ssh $pgxcUser@${coordMasterServers[$i]} "cat >> ${coordMasterDirs[$i]}/postgresql.conf" <<EOF -#========================================================== -# Added to start the slave in sync. mode, $datetime -synchronous_commit = on -synchronous_standby_names = '${coordNames[$i]}' -# End of the addition -EOF - doit ssh $pgxcUser@${coordMasterServers[$i]} pg_ctl reload -Z coordinator -D ${coordMasterDirs[$i]} - return - fi - done - eecho ERROR: specified coordinator does not exist, $1 - return 1 -} - -function pgxc_start_coordinator_slave_all -{ - # First argument is the coordinator name - vecho ================================================================ - vecho Start all the coordinator slaves - - if [ $coordSlave != y ]; then - eecho Coordinator slaves are not configured. - return 1 - fi - local i - for ((i=0; i<${#coordNames[@]}; i++)); do - if [ ${coordNames[$i]} != none ] && [ ${coordNames[$i]} != N/A ]; then - pgxc_start_coordinator_slave ${coordNames[$i]} - fi - done -} - -function pgxc_stop_coordinator_slave -{ - log_echo pgxc_stop_coordinator_slave'('$*')' - # First argument is the coordinator name - vecho ================================================================ - vecho Stop coordinator slave $1 - - if [ $coordSlave != y ]; then - eecho Coordinator slaves are not configured. - return 1 - fi - if [ $# -ne 1 ]; then - eecho Specify coordinator node name - return 1 - fi - - local i - for ((i=0; i< ${#coordNames[@]}; i++)); do - if [ $1 == ${coordNames[$i]} ]; then - if [ ${coordSlaveServers[$i]} == none ] || [ ${coordSlaveServers[$i]} == N/A ]; then - eecho ERROR: slave for the coordinator $1 is not configured. - return 1 - fi - # If the master is running, master's switch replication to asynchronous mode. - log_echo psql -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} postgres $pgxcOwner -c \'select 1\' '>' /dev/null '2>&1' - psql -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} postgres $pgxcOwner -c 'select 1' > /dev/null 2>&1 - if [ $? -eq 0 ]; then - # Switch Master to asynchronous mode. - vecho Switching master of $1 at ${coordMasterServer[$i]} to asynchronous replication mode. - log_echo ssh $pgxcUser@${coordMasterServers[$i]} '"'cat '>>' ${coordMasterDirs[$i]}/postgresql.conf'"' - ssh $pgxcUser@${coordMasterServers[$i]} "cat >> ${coordMasterDirs[$i]}/postgresql.conf" <<EOF -#======================================= -# Updated to trun off the slave $datetime -synchronous_standby_names = '' -# End of the update -EOF - doit ssh $pgxcUser@${coordMasterServers[$i]} pg_ctl reload -Z coordinator -D ${coordMasterDirs[$i]} - fi - doit ssh $pgxcUser@${coordSlaveServers[$i]} pg_ctl stop -Z coordinator -D ${coordSlaveDirs[$i]} $immediate - return; - fi - done - eecho ERROR: Specified coordinator was not configured, $1 - return 1 -} - -function pgxc_stop_coordinator_slave_all -{ - log_echo pgxc_stop_coordinator_slave_all'('$*')' - # First argument is the coordinator name - vecho ================================================================ - vecho Stop all the coordinator slaves - - if [ $coordSlave != y ]; then - eecho Coordinator slaves are not configured. - return 1 - fi - local i - for ((i=0; i<${#coordNames[@]}; i++)); do - if [ ${coordNames[$i]} != none ] && [ ${coordNames[$i]} != N/A ]; then - pgxc_stop_coordinator_slave ${coordNames[$i]} - fi - done -} - -function pgxc_kill_coordinator_slave -{ - log_echo pgxc_kill_coordinator_slave'('$*')' - # First arugument is the coordinator name - - # It's safer to kill the target coordinator with killall command. In this case, we need to - # capture postmaster's pid for the target - vecho ================================================================ - vecho Kill coordinator master $1 - - if [ $coordSlave != y ]; then - eecho Coordinator slaves are not configured. - return 1 - fi - if [ $# -ne 1 ]; then - eecho Specify nodename - return 1 - fi - local i - local postmaster_pid - for ((i=0; i< ${#coordNames[@]}; i++)); do - if [ $1 == ${coordNames[$i]} ]; then - if [ ${coordSlaveServers[$i]} != none ] && [ ${coordSlaveServers[$i]} != N/A ]; then - postmaster_pid=`get_postmaster_pid ${coordSlaveServers[$i]} ${coordSlaveDirs[$i]}` - if [ $postmaster_pid != none ]; then - doit kill_all_child_parent ${coordSlaveServers[$i]} $postmaster_pid - fi - doit pgxc_clean_socket ${coordSlaveServers[$i]} ${coordPorts[$i]} - else - eecho specified coordinator slave does not exist, $1 - fi - return - fi - done - eecho ERROR: specified coordinator does not exist, $1 - return 1 -} - -# This failover function assumes that no IP address is carried over from corresponding master server. -# If IP address can be carried over, then you don't need a section which issues ALTER NODE statement. -# Instead, you should disable the slave. -function pgxc_failover_coordinator -{ - log_echo pgxc_failover_coordinator'('$*')' - local fn=pgxc_failover_coordinator - - # First argument is the coordinator name - decho called: $fn $* - vecho ================================================================ - vecho Failover coordinator $1 - - if [ $# -ne 1 ]; then - eecho $progname:$fn Error: Specify coordinator name to failover - return 1 - fi - if [ $coordSlave != y ]; then - eecho $progname:$fn No coordinator slaves are configured. Cannot failover - return 1 - fi - - local i - for ((i=0; i< ${#coordNames[@]}; i++)); do - if [ $1 == ${coordNames[$i]} ]; then - if [ ${coordSlaveServers[$i]} == none ] || [ ${coordSlaveServers[$i]} == N/A ]; then - eecho $progname:$fn: ERROR, Slave for the coordinator $1 is not configured. Cannot failover. - return 1 - fi - decho "Target coordinator slave to failover:" ${coordNames[$i]} "at" ${coordSlaveServers[$i]} - # Find the new local gtm_proxy - local j - local targetGTMhost - local targetGTMport - targetGTMhost=none - targetGTMport=0 - for ((j=0; j<${#gtmProxyServers[@]}; j++)); do - if [ ${coordSlaveServers[$i]} == ${gtmProxyServers[$j]} ]; then - targetGTMhost=${gtmProxyServers[$j]} - targetGTMport=${gtmProxyPorts[$j]} - break - fi - done - # gtm_proxy has to be configured properly - # This can be a bit more flexible so that each component can connect to GTM directly if - # gtm_proxy is not configured locally. - decho "New GTM Proxy:" "$targetGTMHost":"$targetGTMPort" - if [ "$targetGTMhost" == none ]; then - eecho $progname:$fn: ERROR, gtm_proxy is not configured at the server ${coordSlaveServers[$i]}. Cannot failover. - return 1 - fi - # Now promote the slave - vecho $0: Promoting coordinator slave at ${coordSlaveServers[$i]}:${coordSlaveDirs[$i]} - doit gtm_util unregister -Z coordinator -p $gtmMasterPort -h gtmMasterServer ${coordNames[$i]} - # doit ssh $pgxcUser@$gtmMasterServer rm -f $gtmMasterDir/register.node - doit ssh $pgxcUser@${coordSlaveServers[$i]} pg_ctl promote -Z coordinator -D ${coordSlaveDirs[$i]} - ssh $pgxcUser@${coordSlaveServers[$i]} rm -rf $tmpDir/cmd.out - vecho done - # Restart the new master with new gtm_proxy - # The following command is a dirty hack to unregister the old master. This is only one way available now, but - # the next version of the core should include an utility to clean it up partially. - # Reconfigure new master's gtm_proxy - vecho Reconfiguring new gtm_proxy for ${coordSlaveServers[$i]}:${coordSlaveDirs[$i]}/postgresql.conf - log_echo ssh $pgxcUser@${coordSlaveServers[$i]} '"'cat '>>' ${coordSlaveDirs[$i]}/postgresql.conf'"' - ssh $pgxcUser@${coordSlaveServers[$i]} "cat >> ${coordSlaveDirs[$i]}/postgresql.conf" <<EOF -#================================================= -# Added to promote, $datetime -gtm_host = '$targetGTMhost' -gtm_port = $targetGTMport -# End of addition -EOF - vecho done - # doit ssh $pgxcUser@${coordSlaveServers[$i]} pg_ctl stop -w -Z coordinator -D ${coordSlaveDirs[$i]} -o -i -m immediate - vecho Restarting ${coordNames[$i]} at ${coordSlaveServers[$i]} - log_echo ssh $pgxcUser@${coordSlaveServers[$i]} pg_ctl restart -Z coordinator -D ${coordSlaveDirs[$i]} -w -o -i '>' $localTmpDir/cmd.out '2>&1' - ssh $pgxcUser@${coordSlaveServers[$i]} pg_ctl restart -Z coordinator -D ${coordSlaveDirs[$i]} -w -o -i > $localTmpDir/cmd.out 2>&1 & - sleep 1 - doit cat $localTmpDir/cmd.out - doit rm -f $localTmpDir/cmd.out - - # Update the configuration variable - coordMasterServers[$i]="${coordSlaveServers[$i]}" - coordMasterDirs[$i]="${coordSlaveDirs[$i]}" - coordSlaveServers[$i]="N/A" - coordSlaveDirs[$i]="N/A" - # Then update the configuration file with this new configuration - log_echo cat '>>' $configFile - cat >> $configFile <<EOF -#===================================================== -# Updated due to the coordinator failover, $1, $datetime -coordMasterServers=( ${coordMasterServers[@]} ) -coordMasterDirs=( ${coordMasterDirs[@]} ) -coordSlaveServers=( ${coordSlaveServers[@]} ) -coordSlaveDirs=( ${coordSlaveDirs[@]} ) -# End of the update -EOF - # Backup configration file - pgxc_backup_config_file - # Update other coordinators with this new one ---> first, clean connection for all the users for all the databases - # Get all the available users --> Use this coordinator to get usernam - # It may be better to clean connections. However, we found that clean connection is not stable enough when some node - # is gone. We will wait until it is more stable. - # It is not clean but I'd like to leave these code for future improvement. - vecho Update other coordinators with new coordinator configuration. - vecho Clean all the pooler connections and update the node configuration - for ((j=0; j< ${#coordMasterServers[@]}; j++)); do - if [ "${coordMasterServers[$j]}" != none ] && [ "${coordMasterServers[$j]}" != N/A ]; then - doit pgxc_monitor -Z node -p ${coordPorts[$j]} -h ${coordMasterServers[$j]} -U $pgxcOwner -d postgres - if [ $? -ne 0 ]; then - eecho Coordinator ${coordNames[$j]} is not running. Skip reconfiguration for this. - continue; - fi - # The following code section seemed to be necessary. However, when some node fails, the current Postgres-XC does not work well and - # it seems to be okay practically to skip it. - # - #for user in $users; do - #if [ $j != $i ]; then - #vecho cleaning connection on ${coordMasterServers[$j]} for user $user - #psql -p ${coordPorts[$j]} -h ${coordMasterServers[$j]} postgres $pgxcOwner -c "CLEAN CONNECTION TO ALL TO USER $user" > /dev/null 2>&1 - #fi - #done - # - # Issue ALTER NODE. If target coordinator is not running, we have no way to do this now. May need to run this afterwords. - # Store the script to elsewhere? --> Now we don't do this. May be for further work because we expect everything except - # for the current coordinator is running healthy. - cat > $localTmpDir/cmd.sql <<EOF -ALTER NODE ${coordNames[$i]} WITH (HOST='${coordMasterServers[$i]}', PORT=${coordPorts[$i]}); -select pgxc_pool_reload(); -\q -EOF - cat $localTmpDir/cmd.sql - doit psql -p ${coordPorts[$j]} -h ${coordMasterServers[$j]} postgres $pgxcOwner -f $localTmpDir/cmd.sql - rm -f $localTmpDir/cmd.sql - fi - done - return; - fi - done - eecho ERROR: specified coordinator $1 not configured. - return 2 -} - -# $1: database name -function pgxc_clean_connection_all -{ - log_echo pgxc_clean_connection_all'('$*')' - local fn=pgxc_clean_connection - local i - if [ $# -le 0 ]; then - eecho $progname:$fn no database name specified - return 2 - fi - for ((i=0; i<${#coordNames[@]}; i++)); do - if [ "${coordMasterServers[$i]}" == "none" ] || [ "${coordMasterServers[$i]}" == "N/A" ]; then - continue; - fi - log_echo psql -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} postgres $pgxcOwner -c '"'CLEAN CONNECTION TO ALL FOR DATABASE $1'"' - psql -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} postgres $pgxcOwner -c "CLEAN CONNECTION TO ALL FOR DATABASE $1" - done -} - -#=============================================================================== -# -# Datanode staff -# -#=============================================================================== - -function pgxc_init_datanode_master -{ - log_echo pgxc_init_datanode_master'('$*')' - # First argument is the nodename - vecho ================================================================ - vecho Initialize datanode master $1 - - if [ $# -ne 1 ]; then - eecho Specify datanode name - return 1 - fi - local i - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ $1 == ${datanodeNames[$i]} ] && [ ${datanodeMasterServers[$i]} != none ] && [ ${datanodeMasterServers[$i]} != N/A ]; then - psql -p ${datanodePorts[$i]} -h ${datanodeMasterServers[$i]} -c 'select 1' postgres $pgxcOwner > /dev/null 2> /dev/null - if [ $? -eq 0 ]; then - eecho ERROR: target coordinator master is running now. Stop it to configure. - return 1 - fi - doit ssh $pgxcUser@${datanodeMasterServers[$i]} rm -rf ${datanodeMasterDirs[$i]} - doit ssh $pgxcUser@${datanodeMasterServers[$i]} mkdir -p ${datanodeMasterDirs[$i]} - doit ssh $pgxcUser@${datanodeMasterServers[$i]} "initdb --nodename ${datanodeNames[$i]} -D ${datanodeMasterDirs[$i]} > $tmpDir/initdb.out 2>&1" - print_initdb_out ${datanodeMasterServers[$i]} $tmpDir/initdb.out - vecho Configuring ${datanodeMasterServers[$i]}:${datanodeMasterDirs[$i]}/postgresql.conf - # Get effective GTM port and host. If gtm_proxy is not found, then connect to GTM - local j - local targetGTMhost - local targetGTMport - targetGTMhost=$gtmMasterServer - targetGTMport=$gtmMasterPort - for ((j=0; j< ${#gtmProxyServers[@]}; j++)); do - if [ ${datanodeMasterServers[$i]} == ${gtmProxyServers[$j]} ]; then - targetGTMhost=${gtmProxyServers[$j]} - targetGTMport=${gtmProxyPorts[$j]} - break - fi - done - if [ $datanodeExtraConfig != none ] && [ $datanodeExtraConfig != N/A ]; then - vecho Configuring $pgxcUser@${datanodeMasterServer[$i]}:${datanodeMasterDirs[$i]}/postgresql.conf using $datanodeExtraConfig - log_echo ssh $pgxcUser@${datanodeMasterServers[$i]} '"'cat '>>' ${datanodeMasterDirs[$i]}/postgresql.conf'"' '<' $datanodeExtraConfig - ssh $pgxcUser@${datanodeMasterServers[$i]} "cat >> ${datanodeMasterDirs[$i]}/postgresql.conf" < $datanodeExtraConfig - fi - if [ ${datanodeSpecificExtraConfig[$i]} != none ] && [ ${datanodeSpecificExtraConfig[$i]} != none ]; then - vecho Configuring $pgxcUser@${datanodeMasterServers[$i]}:${datanodeMasterDirs[$i]}/postgresql.conf using ${datanodeSpecificExtraConfig[$i]} - log_echo ssh $pgxcUser@${datanodeMasterServers[$i]} '"'cat '>>' ${datanodeMasterDirs[$i]}/postgresql.conf'"' '<' ${datanodeSpecificExtraConfig[$i]} - ssh $pgxcUser@${datanodeMasterServers[$i]} "cat >> ${datanodeMasterDirs[$i]}/postgresql.conf" < ${datanodeSpecificExtraConfig[$i]} - fi - vecho Configuring $pgxcUser@${datanodeMasterServers[$i]}:${datanodeMasterDirs[$i]}/postgresql.conf - log_echo ssh $pgxcUser@${datanodeMasterServers[$i]} '"'cat '>>' ${datanodeMasterDirs[$i]}/postgresql.conf'"' - ssh $pgxcUser@${datanodeMasterServers[$i]} "cat >> ${datanodeMasterDirs[$i]}/postgresql.conf" <<EOF -#=========================================== -# Added at initialization. $datetime -log_destination = 'stderr' -logging_collector = on -log_directory = 'pg_log' -listen_addresses = '*' -port = ${datanodePorts[$i]} -pooler_port = ${datanodePoolerPorts[$i]} -max_connections = 100 -gtm_host = '$targetGTMhost' -gtm_port = $targetGTMport -EOF - # Additional initialization for log_shipping. - if [ $datanodeSlave == y ] && [ ${datanodeSlaveServers[$i]} != none ] && [ ${datanodeSlaveServers[$i]} != N/A ]; then - # At least cleanup remote archive directory. - doit pgxc_clean_dir ${datanodeSlaveServers[$i]} ${datanodeArchLogDirs[$i]} - # Then setup postgresql.conf - log_echo ssh $pgxcUser@${datanodeMasterServers[$i]} '"'cat '>>' ${datanodeMasterDirs[$i]}/postgresql.conf'"' - ssh $pgxcUser@${datanodeMasterServers[$i]} "cat >> ${datanodeMasterDirs[$i]}/postgresql.conf" <<EOF -wal_level = hot_standby -archive_mode = on -archive_command = 'rsync %p $pgxcUser@${datanodeSlaveServers[$i]}:${datanodeArchLogDirs[$i]}/%f' -max_wal_senders = ${datanodeMaxWalSenders[$i]} -# End of Addition -EOF - else - log_echo ssh $pgxcUser@${datanodeMasterServers[$i]} '"'cat '>>' ${datanodeMasterDirs[$i]}/postgresql.conf'"' - ssh $pgxcUser@${datanodeMasterServers[$i]} "cat >> ${datanodeMasterDirs[$i]}/postgresql.conf" <<EOF -# End of Addition -EOF - fi - vecho Configuring ${cdatanodeMasterServers[$i]}:${datanodeMasterDirs[$i]}/pg_hba.conf - log_echo ssh $pgxcUser@${datanodeMasterServers[$i]} '"'cat '>>' ${coordMasterDirs[$i]}/pg_hba.conf'"' - ssh $pgxcUser@${datanodeMasterServers[$i]} "cat >> ${coordMasterDirs[$i]}/pg_hba.conf" <<EOF -#================================================= -# Addition at initialization, $datetime -EOF - if [ $datanodeExtraPgHba != none ] && [ $datanodeExtraPgHba != N/A ]; then - vecho Configuring ${datanodeMasterServers[$i]}:${datanodeMasterDirs[$i]}/pg_hba.conf using $datanodeExtraPgHba - log_echo ssh $pgxcUser@${datanodeMasterServers[$i]} '"'cat '>>' ${datanodeMasterDirs[$i]}/pg_hab.conf'"' '<' $datanodeExtraPgHba - ssh $pgxcUser@${datanodeMasterServers[$i]} "cat >> ${datanodeMasterDirs[$i]}/pg_hab.conf" < $datanodeExtraPgHba - fi - if [ ${datanodeSpecificExtraPgHba[$i]} != none ] && [ ${datanodeSpecificExtraPgHba[$i]} != N/A ]; then - log_echo ssh $pgxcUser@${datanodeMasterServers[$i]} '"'cat '>>' ${datanodeMasterDirs[$i]}/pg_hab.conf'"' '<' ${datanodeSpecificExtraPgHba[$i]} - ssh $pgxcUser@${datanodeMasterServers[$i]} "cat >> ${datanodeMasterDirs[$i]}/pg_hab.conf" < ${datanodeSpecificExtraPgHba[$i]} - fi - local j - for ((j=0; j< ${#datanodePgHbaEntries[@]}; j++)); do - log_echo ssh $pgxcUser@${datanodeMasterServers[$i]} '"'cat '>>' ${datanodeMasterDirs[$i]}/pg_hba.conf'"' - ssh $pgxcUser@${datanodeMasterServers[$i]} "cat >> ${datanodeMasterDirs[$i]}/pg_hba.conf" <<EOF -host all $pgxcOwner ${datanodePgHbaEntries[$j]} trust -EOF - if [ ${datanodeSlaveServers[$i]} != none ] && [ ${datanodeSlaveServers[$i]} != N/A ]; then - vecho ssh $pgxcUser@${datanodeMasterServers[$i]} "cat >> ${datanodeMasterDirs[$i]}/pg_hba.conf" - ssh $pgxcUser@${datanodeMasterServers[$i]} "cat >> ${datanodeMasterDirs[$i]}/pg_hba.conf" <<EOF -host replication $pgxcOwner ${datanodePgHbaEntries[$j]} trust -EOF - fi - done - log_echo ssh $pgxcUser@${datanodeMasterServers[$i]} '"'cat '>>' ${datanodeMasterDirs[$i]}/pg_hba.conf'"' - ssh $pgxcUser@${datanodeMasterServers[$i]} "cat >> ${datanodeMasterDirs[$i]}/pg_hba.conf" <<EOF -# End of addition -EOF - return - fi - done - eecho ERROR: specified coordinator is not configured, $1 - return 1 -} - -function pgxc_init_datanode_master_all -{ - log_echo pgxc_init_datanode_master_all'('$*')' - vecho ================================================================ - vecho Initialize all the datanode masters - - local i - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ ${datanodeMasterServers[$i]} != none ] && [ ${datanodeMasterServers[$i]} != N/A ]; then - pgxc_init_datanode_master ${datanodeNames[$i]} - fi - done -} - -function pgxc_start_datanode_master -{ - log_echo pgxc_start_datanode_master'('$*')' - # First argument is the nodename - vecho ================================================================ - vecho Start datanode master $1 - - if [ $# -ne 1 ];then - eecho ERROR: specify datanode name - return 1 - fi - local i - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ $1 == ${datanodeNames[$i]} ]; then - log_echo psql -p ${datanodePorts[$i]} -h ${datanodeMasterServers[$i]} postgres $pgxcOwner -c \'select 1\' '>' /dev/null '2>&1' - psql -p ${datanodePorts[$i]} -h ${datanodeMasterServers[$i]} postgres $pgxcOwner -c 'select 1' > /dev/null 2>&1 - if [ $? -eq 0 ]; then - eecho ERROR: target datanode master is running now. - return 1 - fi - doit ssh $pgxcUser@${datanodeMasterServers[$i]} "pg_ctl start -Z datanode -D ${datanodeMasterDirs[$i]} -o -i > $tmpDir/datanode.out" - do_stdout ${datanodeMasterServers[$i]} $tmpDir/datanode.out - return - fi - done - eecho ERROR: specified datanode is not configured, $1 - return 1 -} - -function pgxc_start_datanode_master_all -{ - log_echo pgxc_start_datanode_master_all'('$*')' - vecho ================================================================ - vecho Start all the datanode masters - - local i - for ((i=0;i<${#datanodeNames[@]};i++));do - pgxc_start_datanode_master ${datanodeNames[$i]} - done -} - -function pgxc_stop_datanode_master -{ - log_echo pgxc_stop_datanode_master'('$*')' - # First argument is the nodename - vecho ================================================================ - vecho Stop datanode master $1 - - if [ $# -ne 1 ]; then - eecho ERROR: specify datanode name - return 1 - fi - local i - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ $1 == ${datanodeNames[$i]} ]; then - doit ssh $pgxcUser@${datanodeMasterServers[$i]} pg_ctl stop -Z datanode -D ${datanodeMasterDirs[$i]} $immediate - return - fi - done - eecho ERROR: specified coordinator does not exist, $1 - return 1 -} - -function pgxc_stop_datanode_master_all -{ - log_echo pgxc_stop_datanode_master_all'('$*')' - vecho ================================================================ - vecho Stop all the datanode master - - local i - for ((i=0;i<${#datanodeNames[@]};i++));do - pgxc_stop_datanode_master ${datanodeNames[$i]} - done -} - -function pgxc_kill_datanode_master -{ - log_echo pgxc_kill_datanode_master'('$*')' - # First arugument is the nodename - vecho ================================================================ - vecho Kill coordinator master $1 - - if [ $# -ne 1 ]; then - eecho ERROR: specify datanode name - return 1 - fi - local i - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ $1 == ${datanodedNames[$i]} ]; then - if [ ${datanodeMasterServers[$i]} != none ] && [ ${datanodeMasterServers[$i]} != N/A ]; then - postmaster_pid=`get_postmaster_pid ${datanodeMasterServers[$i]} ${datandoeMasterDirs[$i]}` - if [ $postmaster_pid != none ]; then - doit kill_all_child_parent ${datanodeMasterServers[$i]} $postmaster_pid - fi - doit pgxc_clean_socket ${datanodeMasterServers[$i]} ${datanodePorts[$i]} - doit pgxc_clean_socket ${datanodeMasterServers[$i]} ${datanodePoolerPorts[$i]} - else - eecho ERROR: could not find specified coordinator master, $1 - fi - return - fi - done - eecho ERROR: specified coordinator does not exist, $1 - return 1 -} - -function pgxc_kill_datanode_master_all -{ - log_echo pgxc_kill_datanode_master_all'('$*')' - vecho ================================================================ - vecho Kill all the datanode master - - local i - for ((i=0;i<${#datanodeNames[@]};i++));do - pgxc_kill_datanode_master ${datanodeNames[$i]} - done -} - -# To construct datanode slave, pg_basebackup utility is used, which needs master coordinator running. -# If the master is not running, then we temporary run it. After copying the base backup, -# the the master will be stopped. Please be sure that coordinator master is initialized properly. -# If it is running, then it will be restarted to reflect the change to postgresql.conf. -function pgxc_init_datanode_slave -{ - log_echo pgxc_init_datanode_slave'('$*')' - # First argument is the datanode name - vecho ================================================================ - vecho Initialize datanode slave $1 - - if [ $# -ne 1 ]; then - eecho ERROR: specify coordinator node name - return 1; - fi - if [ "$datanodeSlave" != "y" ]; then - eecho No datanode slave is configured. - return 1 - fi - - local i - local start_master=n - for ((i=0;i<${#datanodeNames[@]};i++)); do - if [ $1 == ${datanodeNames[$i]} ]; then - if [ ${datanodeSlaveServers[$i]} == N/A ]; then - eecho ERROR: slave for the datanode $1 is not configured. - return 1 - fi - # Datanode master should be running - log_echo psql -p ${datanodePorts[$i]} -h ${datanodeMasterServers[$i]} postgres $pgxcOwner -c \'select 1\' '>' /dev/null 2>&1 - psql -p ${datanodePorts[$i]} -h ${datanodeMasterServers[$i]} postgres $pgxcOwner -c 'select 1' > /dev/null 2>&1 - if [ $? -ne 0 ]; then - start_master=y - fi - # Clean slave's directory - doit ssh $pgxcUser@${datanodeSlaveServers[$i]} rm -rf ${datanodeSlaveDirs[$i]} - doit ssh $pgxcUser@${datanodeSlaveServers[$i]} mkdir -p ${datanodeSlaveDirs[$i]} - - # if the master is not running, we just start it and then stop it. - if [ $start_master == y ]; then - vecho Starting the datanode master to obtain base backup - doit ssh $pgxcUser@${datanodeMasterServers[$i]} "pg_ctl start -Z datanode -D ${datanodeMasterDirs[$i]} -o -i > $tmpDir/cmd.out" - do_stdout ${datanodeMasterServers[$i]} $tmpDir/cmd.out - sleep 2 - fi - # Obtain base backup of the master - doit pgxc_clean_dir ${datanodeSlaveServers[$i]} ${datanodeSlaveDirs[$i]} - doit ssh $pgxcUser@${datanodeSlaveServers[$i]} pg_basebackup -p ${datanodePorts[$i]} -h ${datanodeMasterServers[$i]} -D ${datanodeSlaveDirs[$i]} -x - - # Configure recovery.conf of the slave - vecho -- Configure slave\'s recovery.conf, ${datanodeSlaveServers[$i]}:${datanodeSlaveDirs[$i]}/recovery.conf - log_echo ssh $pgxcUser@${datanodeSlaveServers[$i]} '"'cat '>>' ${datanodeSlaveDirs[$i]}/recovery.conf'"' - ssh $pgxcUser@${datanodeSlaveServers[$i]} "cat >> ${datanodeSlaveDirs[$i]}/recovery.conf" <<EOF -#========================================== -# Added to initialize the slave, $datetime -standby_mode = on -primary_conninfo = 'host = ${datanodeMasterServers[$i]} port = ${datanodePorts[$i]} user = $pgxcOwner application_name = ${datanodeNames[$i]}' -restore_command = 'cp ${datanodeArchLogDirs[$i]}/%f %p' -archive_cleanup_command = 'pg_archivecleanup ${datanodeArchLogDirs[$i]} %r' -EOF - - # Configure slave's postgresql.conf - vecho -- Configure slave\'s postgresql.conf, ${doatanodeSlaveServers[$i]}:${datanodeSlaveDirs[$i]}/postgresql.conf - log_echo ssh $pgxcUser@${datanodeSlaveServers[$i]} '"'cat '>>' ${datanodeSlaveDirs[$i]}/postgresql.conf'"' - ssh $pgxcUser@${datanodeSlaveServers[$i]} "cat >> ${datanodeSlaveDirs[$i]}/postgresql.conf" <<EOF -#========================================== -# Added to startup the slave, $dtetime -hot_standby = on -port = ${datanodePorts[$i]} -pooler_port = ${datanodePoolerPorts[$i]} -EOF - if [ $start_master == y ]; then - vecho Stopping the datanode master. - doit ssh $pgxcUser@${datanodeMasterServers[$i]} "pg_ctl stop -Z datanode -D ${datanodeMasterDirs[$i]} > /dev/null 2>&1" - fi - return - fi - done - eecho ERROR: specified coordinator is not configured, $1 - return 1 -} - -function pgxc_init_datanode_slave_all -{ - log_echo pgxc_init_datanode_slave_all'('$*')' - vecho ================================================================ - vecho Initialize all the datanode slaves - - local i - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ ${datanodeSlaveServers[$i]} != none ] && [ ${datanodeSlaveServers[$i]} != N/A ]; then - pgxc_init_datanode_slave ${datanodeNames[$i]} - fi - done -} - -function pgxc_start_datanode_slave -{ - log_echo pgxc_start_datanode_slave'('$*')' - # First argument is the datanode name - vecho ================================================================ - vecho Start datanode slave $1 - - if [ $datanodeSlave != y ]; then - eecho ERROR: no datanode slaves are configured - return 1 - fi - local i - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ $1 == ${datanodeNames[$i]} ]; then - if [ ${datanodeSlaveServers[$i]} == none ] || [ ${datanodeSlaveServers[$i]} == N/A ]; then - eecho ERROR: slave for datanode $1 is not configured. - return 1 - fi - # Datanode master should be running - log_echo psql -p ${datanodePorts[$i]} -h ${datanodeMasterServers[$i]} postgres $pgxcOwner -c \'select 1\' '>' /dev/null '2>&1' - psql -p ${datanodePorts[$i]} -h ${datanodeMasterServers[$i]} postgres $pgxcOwner -c 'select 1' > /dev/null 2>&1 - if [ $? -ne 0 ] ; then - eecho ERROR: corresponding datanode master is not running now, $1 - return 1 - fi - # Start the slave - psql -p ${datanodePorts[$i]} -h ${datanodeSlaveServers[$i]} postgres $pgxcOwner -c 'select 1' > /dev/null 2>&1 - if [ $? -eq 0 ] ; then - eecho ERROR: datanode slave "("${datanodeNames[$i]}")" is already running - return 1 - fi - doit ssh $pgxcUser@${datanodeSlaveServers[$i]} "pg_ctl start -Z datanode -D ${datanodeSlaveDirs[$i]} -o -i > $tmpDir/coord.out" - do_stdout ${datanodeSlaveServers[$i]} $tmpDir/coord.out - # Change the master to synchronous mode - vecho Change the master to synchrnous mode, $1 - log_echo ssh $pgxcUser@${datanodeMasterServers[$i]} '"'cat '>>' ${datanodeMasterDirs[$i]}/postgresql.conf'"' - ssh $pgxcUser@${datanodeMasterServers[$i]} "cat >> ${datanodeMasterDirs[$i]}/postgresql.conf" <<EOF -#========================================================== -# Added to start the slave in sync. mode, $datetime -synchronous_commit = on -synchronous_standby_names = '${datanodeNames[$i]}' -# End of the addition -EOF - doit ssh $pgxcUser@${datanodeMasterServers[$i]} pg_ctl reload -Z datanode -D ${datanodeMasterDirs[$i]} - return - fi - done - eecho ERROR: specified datanode does not exist, $1 - return 1 -} - -function pgxc_start_datanode_slave_all -{ - log_eco pgxc_start_datanode_slave_all'('$*')' - vecho ================================================================ - vecho Start all the datanode slaves - - local i - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ ${datanodeSlaveServers[$i]} != none ] && [ ${datanodeSlaveServers[$i]} != N/A ]; then - pgxc_start_datanode_slave ${datanodeNames[$i]} - fi - done -} - -function pgxc_stop_datanode_slave -{ - log_echo pgxc_stop_datanode_slave'('$*')' - # First argument is the datanode name - vecho ================================================================ - vecho Stop datanode slave $1 - - - if [ $datanodeSlave != y ]; then - eecho ERROR: no datanode slaves are configured - return 1 - fi - local i - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ $1 == ${datanodeNames[$i]} ]; then - if [ ${datanodeSlaveServers[$i]} == none ] || [ ${datanodeSlaveServers[$i]} == N/A ]; then - eecho ERROR: slave for the datanode $1 is not configured. - fi - # If the master is running, master's switch replication to asynchronous mode. - psql -p ${datanodePorts[$i]} -h ${datanodeMasterServers[$i]} postgres $pgxcOwner -c 'select 1' > /dev/null 2> /dev/null - if [ $? -eq 0 ]; then - # Switch Master to asynchronous mode. - vecho Switching master of $1 at ${datanodeMasterServer[$i]} to asynchronous replication mode. - log_echo ssh $pgxcUser@${datanodeMasterServers[$i]} '"'cat '>>' ${datanodeMasterDirs[$i]}/postgresql.conf'"' - ssh $pgxcUser@${datanodeMasterServers[$i]} "cat >> ${datanodeMasterDirs[$i]}/postgresql.conf" <<EOF -#======================================= -# Updated to trun off the slave $datetime -synchronous_standby_names = '' -# End of the update -EOF - doit ssh $pgxcUser@${datanodeMasterServers[$i]} pg_ctl reload -Z datanode -D ${datanodeMasterDirs[$i]} - fi - doit ssh $pgxcUser@${datanodeSlaveServers[$i]} pg_ctl stop -Z datanode -D ${datanodeSlaveDirs[$i]} $immediate - return; - fi - done - eecho ERROR: Specified datanode is not configureed, $1 - return 1 -} -function pgxc_stop_datanode_slave_all -{ - log_echo pgxc_stop_datanode_slave_all'('$*')' - vecho ================================================================ - vecho Stop all the datanode slaves - - local i - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ ${datanodeSlaveServers[$i]} != none ] && [ ${datanodeSlaveServers[$i]} != N/A ]; then - pgxc_stop_datanode_slave ${datanodeNames[$i]} - fi - done -} - -function pgxc_kill_datanode_master -{ - log_echo pgxc_kill_datanode_master'('$*')' - # First argument is the datanodeinator name - vecho ================================================================ - vecho Kill datanode slave $1 - - local i - local postmaster_pid - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ $1 == ${datanodeNames[$i]} ]; then - if [ ${datanodeMasterServers[$i]} != none ] && [ ${datanodeMasterServers[$i]} != N/A ]; then - postmaster_pid=`get_postmaster_pid ${datanodeMasterServers[$i]} ${datanodeMasterDirs[$i]}` - if [ $postmaster_pid != none ]; then - doit kill_all_child_parent ${datanodeMasterServers[$i]} $postmaster_pid - fi - else - eecho ERROR: specified coordinator master does not exist, $1 - fi - return - fi - done - eecho ERROR: specified datanode master is not configured, $1 - return 1 -} - -function pgxc_kill_datanode_master_all -{ - log_echo pgxc_kill_datanode_master_all'('$*')' - vecho ================================================================ - vecho Kill all the datanode masters - - local i - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ ${datanodeMasterServers[$i]} != none ] && [ ${datanodeMasterServers[$i]} != N/A ]; then - pgxc_kill_datanode_master ${datanodeNames[$i]} - fi - done -} - -# Please note that this function does not take care of anything but just kill the processes. -function pgxc_kill_datanode_slave -{ - log_echo pgxc_kill_datanode_slave'('$*')' - # First argument is the datanodeinator name - vecho ================================================================ - vecho Kill datanode slave $1 - - local i - local postmaster_pid - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ $1 == ${datanodeNames[$i]} ]; then - if [ ${datanodeSlaveServers[$i]} != none ] && [ ${datanodeSlaveServers[$i]} != N/A ]; then - postmaster_pid=`get_postmaster_pid ${datanodeSlaveServers[$i]} ${datanodeSlaveDirs[$i]}` - if [ $postmaster_pid != none ]; then - doit kill_all_child_parent ${datanodeSlaveServers[$i]} $postmaster_pid - fi - doit pgxc_clean_socket ${datanodeSlaveServers[$i]} ${datanodePorts[$i]} - doit pgxc_clean_socket ${datanodeSlaveServers[$i]} ${datanodePoolerPorts[$i]} - else - eecho ERROR: specified coordinator master does not exist, $1 - fi - return - fi - done - eecho ERROR: specified datanode master is not configured, $1 - return 1 -} - -# Select coordinator -function pgxc_kill_datanode_slave_all -{ - log_echo pgxc_kill_datanode_slave_all'('$*')' - vecho ================================================================ - vecho Kill all the datanode masters - - local i - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ ${datanodeSlaveServers[$i]} != none ] && [ ${datanodeSlaveServers[$i]} != N/A ]; then - pgxc_kill_datanode_slave ${datanodeNames[$i]} - fi - done -} - - -selected_coord="none" -selected_coord_port=0 -selected_coord_host="none" - -function pgxc_find_coordinator -{ - local fn=pgxc_find_coordinator - selected_coord="none" - selected_coord_port=0 - selected_coord_host="none" - local i - log_echo $progname-$fn $* - if [ $# -le 0 ]; then - eecho $progname-$fn missing coordinator name - return 2 - fi - if [ "$1" == "none" ] || [ "$1" == "N/A" ]; then - eecho "$progname:$fn" invalid coordinator name $1 - return 2 - fi - for ((i=0;i<${#coordNames[@]};i++));do - if [ "${coordNames[$i]}" == "$1" ]; then - if [ "${coordMasterServers[$i]}" == "none" ] || [ "${coordMasterServers[$i]}" == "N/A" ]; then - eecho "$progname:$fn" specified coordinator $1 does not have master - return 2 - fi - selected_coord=${coordNames[$i]} - selected_coord_port=${coordPorts[$i]} - selected_coord_host=${coordMasterServers[$i]} - return; - fi - done - eecho $progname-$fn specified coordinator $1 not found - return 1 -} - -function pgxc_select_coordinator -{ - selected_coord="none" - selected_coord_port=0 - selected_coord_host="none" - local i - local s - s=$(($RANDOM%${#coordMasterServers[@]})) - for ((i=$s;i<${#coordMasterServers[@]};i++)); do - if [ ${coordMasterServers[$i]} != "none" ] && [ ${coordMasterServers[$i]} != "N/A" ]; then - pgxc_monitor -Z node -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} -U $pgxcOwner -d postgres - if [ $? == 0 ]; then - # Need this block not to select failed coordinator. This may happen if a server fails - # and datanode fails over first. - selected_coord=${coordNames[$i]} - selected_coord_port=${coordPorts[$i]} - selected_coord_host=${coordMasterServers[$i]} - return 0 - fi - fi - done - for ((i=0;i<$s;i++)); do - if [ ${coordMasterServers[$i]} != "none" ] && [ ${coordMasterServers[$i]} != "N/A" ]; then - pgxc_monitor -Z node -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} -U $pgxcOwner -d postgres - if [ $? == 0 ]; then - # Need this block not to select failed coordinator. This may happen if a server fails - # and datanode fails over first. - selected_coord=${coordNames[$i]} - selected_coord_port=${coordPorts[$i]} - selected_coord_host=${coordMasterServers[$i]} - return 0 - fi - fi - done - return 1 -} - -# Connects to the target ($1) from the coordinator ($2) using specified user ($3). -# Issue "select 1" using EXECUTE DIRECT. -# Need to make CLEAN CONNECTION work. -function pgxc_dummy_connect -{ - local i - if [ $# -ne 3 ]; then - echo pgxc_dummy_connect target coordinator user - return 1 - fi - for ((i=0;i<${#coordNames[@]}; i++)); do - if [ $2 == ${coordNames[$i]} ]; then - cat > $localTmpDir/cmd_dummy.sql <<EOF -EXECUTE DIRECT ON ($1) 'SELECT 1'; -\q -EOF - psql -p ${coordPorts[$i]} -h ${coordMasterServers[$i]} -f $localTmpDir/cmd_dummy.sql postgres $3 - rm -f $localTmpDir/cmd_dummy.sql - return - fi - done - echo ERROR: coordinator $2 not found. - return 1 -} - -# This failover function assumes that no IP address is carried over from corresponding master server. -# If IP address can be carried over, then you don't need a section which issues ALTER NODE statement. -# Instead, you should disable the slave. -function pgxc_failover_datanode -{ - log_echo pgxc_failover_datanode'('$*')' - local fn=pgxc_failover_datanode - - # First argument is the datanode name - decho called: $fn $* - vecho ================================================================ - vecho Failover datanode $1 - - if [ $# -ne 1 ]; then - eecho $progname:$fn Error: Specify datanode name to failover - return 1 - fi - if [ $datanodeSlave != y ]; then - echo $progname:$fn No datanode slaves are configured. Cannot failover - return 1 - fi - - local i - for ((i=0; i< ${#datanodeNames[@]}; i++)); do - if [ $1 == ${datanodeNames[$i]} ]; then - if [ ${datanodeSlaveServers[$i]} == none ] || [ ${datanodeSlaveServers[$i]} == N/A ]; then - eecho $progname:$0: ERROR, Slave for the datanode $1 is not configured. Cannot failover. - return 1 - fi - decho "Target coordinator slave to failover:" ${datanodeNames[$i]} "at" ${datanodeSlaveServers[$i]} - # Find the new local gtm_proxy - local j - local targetGTMhost - local targetGTMport - targetGTMhost=none - targetGTMport=0 - for ((j=0; j<${#gtmProxyServers[@]}; j++)); do - if [ ${datanodeSlaveServers[$i]} == ${gtmProxyServers[$j]} ]; then - targetGTMhost=${gtmProxyServers[$j]} - targetGTMport=${gtmProxyPorts[$j]} - break - fi - done - # gtm_proxy has to be configured properly - # This can be a bit more flexible so that each component can connect to GTM directly if - # gtm_proxy is not configured locally. - decho "New GTM Proxy:" "$targetGTMHost":"$targetGTMPort" - if [ "$targetGTMhost" == none ]; then - eecho $progname:$fn: ERROR, gtm_proxy is not configured at the server ${datanodeSlaveServers[$i]}. Cannot failover. - return 1 - fi - # Now promote the slave - vecho Promoting datnode slave at ${datanodeSlaveServers[$i]}:${datanodeSlaveDirs[$i]} - doit gtm_util unregister -Z datanode -p $gtmMasterPort -h $gtmMasterServer ${datanodeNames[$i]} - # doit ssh $pgxcUser@$gtmMasterServer rm -f $gtmMasterDir/register.node - doit ssh $pgxcUser@${datanodeSlaveServers[$i]} pg_ctl promote -Z datanode -D ${datanodeSlaveDirs[$i]} - ssh $pgxcUser@${datanodeSlaveServers[$i]} rm -rf $tmpDir/cmd.out - vecho done - # Restart the new master with new gtm_proxy - # The following command is a dirty hack to unregister the old master. This is only one way available now, but - # the next version of the core should include an utility to clean it up partially. - # Reconfigure new master's gtm_proxy - vecho Reconfiguring new gtm_proxy for ${datanodeSlaveServers[$i]}:${datanodeSlaveDirs[$i]}/postgresql.conf - log_echo ssh $pgxcUser@${datanodeSlaveServers[$i]} '"'cat '>>' ${datanodeSlaveDirs[$i]}/postgresql.conf'"' - ssh $pgxcUser@${datanodeSlaveServers[$i]} "cat >> ${datanodeSlaveDirs[$i]}/postgresql.conf" <<EOF -#================================================= -# Added to promote, $datetime -gtm_host = '$targetGTMhost' -gtm_port = $targetGTMport -# End of addition -EOF - vecho done - # doit ssh $pgxcUser@${datanodeSlaveServers[$i]} pg_ctl stop -w -Z datanode -D ${datanodeSlaveDirs[$i]} -o -i -m immediate - vecho Restarting ${datanodeNames[$i]} at ${datanodeSlaveServers[$i]} - log_echo ssh $pgxcUser@${datanodeSlaveServers[$i]} pg_ctl restart -w -Z datanode -D ${datanodeSlaveDirs[$i]} -w -o -i '>' $localTmpDir/cmd.out '2>&1 &' - ssh $pgxcUser@${datanodeSlaveServers[$i]} pg_ctl restart -w -Z datanode -D ${datanodeSlaveDirs[$i]} -w -o -i > $localTmpDir/cmd.out 2>&1 & - sleep 2 # do we need it? - doit cat $localTmpDir/cmd.out - doit rm -f $localTmpDir/cmd.out - - # Update other coordinators with this new one ---> first, clean connection for all the users for all the databases - # Get all the available users --> Use this coordinator to get usernam - # It may be better to clean connections. However, we found that clean connection is not stable enough when some node - # is gone. We will wait until it is more stable. - # It is not clean but I'd like to leave these code for future improvement. - vecho Update coordinators with new datanode configuration. - # Clean all the pooler connections and update the node configuration - vecho Clean all the pooler connections and update the node configuration - for ((j=0; j< ${#coordMasterServers[@]}; j++)); do - if [ "${coordMasterServers[$j]}" != none ] && [ "${coordMasterServers[$j]}" != N/A ]; then - doit pgxc_monitor -Z node -p ${coordPorts[$j]} -h ${coordMasterServers[$j]} -U $pgxcOwner -d postgres - # The following block is needed because a coordinator may leave failed when a server fails and - # the datanode may fail-over first. --> In this case, the coordinator should be given a chance - # to reconfigure itself with this datanode. Coordinator should failover first. - if [ $? -ne 0 ]; then - eecho ERROR: coordinator ${coordNames[$j]} is not running. Skip reconfiguration for this. - continue; - fi - # Issue ALTER NODE. If target coordinator is not running, we have no way to do this now. May need to run this afterwords. - # Store the script to elsewhere? --> Now we don't do this. May be for further work because we expect everything except - # for the current coordinator is running healthy. - log_echo cat '>>' $localTmpDir/cmd.sql - cat >> $localTmpDir/cmd.sql <<EOF -ALTER NODE ${datanodeNames[$i]} WITH (HOST='${datanodeSlaveServers[$i]}', PORT=${datanodePorts[$i]}); -select pgxc_pool_reload(); -\q -EOF - cat $localTmpDir/cmd.sql - psql -p ${coordPorts[$j]} -h ${coordMasterServers[$j]} postgres $pgxcOwner -f $localTmpDir/cmd.sql - rm -f $localTmpDir/cmd.sql - fi - done - # Update the configuration variable - datanodeMasterServers[$i]="${datanodeSlaveServers[$i]}" - datanodeMasterDirs[$i]="${datanodeSlaveDirs[$i]}" - datanodeSlaveServers[$i]="none" - datanodeSlaveDirs[$i]="none" - # Then update the configuration file with this new configuration - log_echo cat '>>' $configFile - cat >> $configFile <<EOF -#===================================================== -# Updated due to the coordinator failover, $1, $datetime -datanodeMasterServers=( ${datanodeMasterServers[@]} ) -datanodeMasterDirs=( ${datanodeMasterDirs[@]} ) -datanodeSlaveServers=( ${datanodeSlaveServers[@]} ) -datanodeSlaveDirs=( ${datanodeSlaveDirs[@]} ) -# End of the update -EOF - # Backup configuraiton file - pgxc_backup_config_file - return; - fi - done - eecho ERROR: specified coordinator $1 not configured. - return 2 -} - - -function pgxc_configure_nodes -{ - log_echo pgxc_configure_nodes'('$*')' - # First argument is a coordinator name - vecho ================================================================ - vecho Configure nodes for coordinator $1 - - if [ $# -ne 1 ]; then - eecho ERROR: specify coorinator name. - return 2 - fi - local i - local j - for ((i=0; i<${#coordNames[@]}; i++));do - if [ $1 == ${coordNames[$i]} ] && [ ${coordNames[$i]} != none ] && [ ${coordNames[$i]} != N/A ]; then - rm -rf $localTmpDir/cmd.sql - touch $localTmpDir/cmd.sql - for ((j=0; j<${#coordNames[@]}; j++));do - vecho Setup pgxc_node for ${coordNames[$j]} at ${coordNames[$i]}. - # Setup coordinators - decho i=$i, j=$j - if [ $i != $j ]; then - #echo CREATE NODE - cat >> $localTmpDir/cmd.sql <<EOF -CREATE NODE ${coordNames[$j]} WITH (TYPE='coordinator', HOST='${coordMasterServers[$j]}', PORT=${coordPorts[$j]}); -EOF - else - #echo ALTER NODE - cat >> $localTmpDir/cmd.sql <<EOF -ALTER NODE ${coordNames[$j]} WITH (HOST='${coordMasterServers[$j]}', PORT=${coordPorts[$j]}); -EOF - fi - done - for ((j=0; j<${#datanodeNames[@]}; j++)); do - vecho Setup pgxc_node for ${datanodeNames[$j]} at ${coordNames[$i]}. - # Setup datanodes - cat >> $localTmpDir/cmd.sql <<EOF -CREATE NODE ${datanodeNames[$j]} WITH (TYPE='datanode', HOST='${datanodeMasterServers[$j]}', PORT=${datanodePorts[$j]}); -EOF - if [ ${datanodeNames[$j]} == $primaryDatanode ]; then - # Primary node - cat >> $localTmpDir/cmd.sql <<EOF -ALTER NODE ${datanodeNames[$j]} WITH (PRIMARY); -EOF - fi - if [ ${datanodeMasterServers[$j]} == ${coordMasterServers[$i]} ]; then - # Preferred node - cat >> $localTmpDir/cmd.sql <<EOF -ALTER NODE ${datanodeNames[$j]} WITH (PREFERRED); -EOF - fi - done - cat >> $localTmpDir/cmd.sql <<EOF -\q -EOF - ddo cat $localTmpDir/cmd.sql - if [ "$verbose" == "y" ] || [ $logOpt == "y" ]; then - doit psql -h ${coordMasterServers[$i]} -p ${coordPorts[$i]} -a -f $localTmpDir/cmd.sql postgres $pgxcOwner - else - psql -h ${coordMasterServers[$i]} -p ${coordPorts[$i]} -f $localTmpDir/cmd.sql postgres $pgxcOwner - fi - rm -rf $localTmpDir/cmd.sql - return - fi - done - eecho Coordinator $1 is not configured. - return 1 -} - -function pgxc_configure_nodes_all -{ - log_echo pgxc_configure_node'('$*')' - vecho ================================================================ - vecho Configure nodes for all the coordinators - - local i - for ((i=0;i<${#coordNames[@]};i++)); do - if [ "${coordMasterServers[$i]}" != "none" ] && [ "${coordMasterServers[$i]}" != "N/A" ]; then - pgxc_configure_nodes ${coordNames[$i]} - fi - done -} - - -function start_all -{ - log_echo start_all'('$*')' - pgxc_start_gtm_master - if [ $gtmSlave == y ]; then - pgxc_start_gtm_slave - fi - if [ $gtmProxy == y ]; then - pgxc_start_gtm_proxy_all - fi - pgxc_start_datanode_master_all - if [ $datanodeSlave == y ]; then - pgxc_start_datanode_slave_all - fi - pgxc_start_coordinator_master_all - if [ $coordSlave == y ]; then - pgxc_start_coordinator_slave_all - fi -} - -function init_all -{ - log_echo init_all'('$*')' - pgxc_init_gtm_master - if [ $gtmSlave == y ]; then - pgxc_init_gtm_slave - fi - if [ $gtmProxy == y ]; then - pgxc_init_gtm_proxy_all - fi - pgxc_init_datanode_master_all - pgxc_start_gtm_master - if [ $gtmProxy == y ]; then - pgxc_start_gtm_proxy_all - fi - if [ $datanodeSlave == y ]; then - pgxc_init_datanode_slave_all - fi - pgxc_init_coordinator_master_all - if [ $coordSlave == y ]; then - pgxc_init_coordinator_slave_all - fi - if [ $gtmProxy == y ]; then - pgxc_stop_gtm_proxy_all - fi - if [ $gtmSlave == y ]; then - pgxc_stop_gtm_slave - fi - pgxc_stop_gtm_master - start_all - pgxc_configure_nodes_all -} - -function stop_all -{ - log_echo stop_all'('$*')' - if [ $coordSlave == y ]; then - pgxc_stop_coordinator_slave_all - fi - pgxc_stop_coordinator_master_all - if [ $datanodeSlave == y ]; then - pgxc_stop_datanode_slave_all - fi - pgxc_stop_datanode_master_all - if [ $gtmProxy == y ]; then - pgxc_stop_gtm_proxy_all - fi - if [ $gtmSlave == y ]; then - pgxc_stop_gtm_slave - fi - pgxc_stop_gtm_master -} - -function clean_all -{ - log_echo clean_all'('$*')' - local immediate_bk - immediate_bk="$immediate" - immediate="-m immediate" - stop_all - pgxc_clean_node_all - immediate="$immediate_bk" -} - -# Start --- all | gtm [master|slave|all] | gtm_proxy | coordinator [master|slave|all] | datanode [master|slave|all] | nodename [master|slave|all] -function pgxc_start_something -{ - log_echo pgxc_start_something'('*')' - local i - - if [ "$1" == "all" ] || [ "$1" == "" ]; then - start_all - return - fi - if [ "$1" == "gtm" ] || [ "$1" == "$gtmName"]; then - if [ "$2" == "master" ]; then - pgxc_monitor -Z gtm $gtmMasterPort -h $gtmMasterServer - if [ $? -eq 0 ]; then - eecho GTM master is already running. - return 1 - fi - pgxc_start_gtm_master - return; - fi - if [ "$2" == "slave" ]; then - if [ $gtmSlave != y ]; then - eecho GTM Slave is not configured. Cannot start. - return; - fi - pgxc_monitor -Z gtm -p $gtmMasterPort -h $gtmMasterServer - if [ $? -eq 0 ]; then - pgxc_start_gtm_slave - else - eecho GTM master is not running. Cannot start the slave. - fi - return; - fi - if [ "$2" == "all" ] || [ "$2" == "" ]; then - pgxc_monitor -Z gtm $gtmMasterPort -h $gtmMasterServer - if [ $? -eq 0 ]; then - eecho GTM master is already running. - return 1 - fi - pgxc_start_gtm_master - if [ $gtmSlave == y ]; then - pgxc_start_gtm_slave - fi - fi - return - fi - if [ "$1" == "gtm_proxy" ]; then - pgxc_start_gtm_proxy_all - return - fi - if [ "$1" == "coordinator" ]; then - if [ "$2" == "master" ]; then - pgxc_start_coordinator_master_all - elif [ "$2" == "slave" ]; then - pgxc_start_coordinator_slave_all - elif [ "$2" == "all" ] || [ "$2" == "" ]; then - pgxc_start_coordinator_master_all - pgxc_start_coordinator_slave_all - else - eecho Invalid argument for start coordinator command, $2 - fi - return - fi - if [ "$1" == "datanode" ]; then - if [ "$2" == "master" ]; then - pgxc_start_datanode_master_all - elif [ "$2" == "slave" ]; then - pgxc_start_datanode_slave_all - elif [ "$2" == "all" ] || [ "$2" == "" ]; then - pgxc_start_datanode_master_all - pgxc_start_datanode_slave_all - else - eecho Invalid argument for start coordinator command, $2 - fi - return - fi - # General nodename specification - # Have done GTM - # GTM proxy? - for ((i=0; i<${#gtmProxyNames[@]}; i++)); do - if [ "$1" == "${gtmProxyNames[$i]}" ]; then - pgxc_start_gtm_proxy $1 - return - fi - done - # Coordinator? - for ((i=0; i<${#coordNames[@]}; i++)); do - if [ "$1" == "${coordNames[$i]}" ]; then - if [ "$2" == "master" ]; then - pgxc_start_coordinator_master $1 - elif [ "$2" == "slave" ]; then - pgxc_start_coordinator_slave $1 - elif [ "$2" == "all" ] || [ "$2" == "" ]; then - pgxc_start_coordinator_master $1 - pgxc_start_coordinator_slave $1 - else - eecho Invalid start coordinator command option, $2 - fi - return - fi - done - # Datanode? - for ((i=0; i<${#datanodeNames[@]}; i++)); do - if [ "$1" == "${datanodeNames[$i]}" ]; then - if [ "$2" == "master" ]; then - pgxc_start_datanode_master $1 - elif [ "$2" == "slave" ]; then - pgxc_start_datanode_slave $1 - elif [ "$2" == "all" ] || [ "$2" == "" ]; then - pgxc_start_datanode_master $1 - pgxc_start_datanode_slave $1 - else - eecho Invalid start datanode command option, $2 - fi - return - fi - done - eecho No component named $1 found - return 1 -} - -# Stop --- all | gtm [master|slave|all] | gtm_proxy | coordinator [master|slave|all] | datanode [master|slave|all] | nodename [master|slave|all] -function pgxc_stop_something -{ - local i - - log_echo pgxc_stop_something'('$*')' - if [ "$1" == "all" ] || [ "$1" == "" ]; then - stop_all - return - fi - if [ "$1" == "gtm" ] || [ "$1" == "$gtmName" ]; then - if [ "$2" == "master" ]; then - pgxc_monitor -Z gtm -p $gtmMasterPort -h $gtmMasterServer - if [ $? -ne 0 ]; then - eecho GTM master is not running. Cannot stop it. - return 1 - fi - pgxc_stop_gtm_master - return; - fi - if [ "$2" == "slave" ]; then - if [ $gtmSlave != y ]; then - eecho GTM Slave is not configured. Cannot stop. - return; - fi - pgxc_monitor -Z gtm -p $gtmSlavePort -h $gtmSlaveServer - if [ $? -eq 0 ]; then - pgxc_stop_gtm_slave - else - eecho GTM slave is not running. Cannot stop it. - fi - return; - fi - if [ "$2" == "all" ] || [ "$2" == "" ]; then - pgxc_monitor -Z gtm $gtmMasterPort -h $gtmMasterServer - if [ $? -ne 0 ]; then - eecho GTM master is not running. - else - pgxc_start_gtm_master - fi - if [ $gtmSlave == y ]; then - pgxc_monitor -Z gtm -p $gtmSlavePort -h gtmSlaveServer - if [ $? -eq 0 ]; then - pgxc_start_gtm_slave - else - eecho GTM slave is not running - fi - fi - return - else - eecho Invalid stop gtm option, $2 - return 2 - fi - return - fi - if [ "$1" == "gtm_proxy" ]; then - pgxc_stop_gtm_proxy_all - return - fi - if [ "$1" == "coordinator" ]; then - if [ "$2" == "master" ]; then - pgxc_stop_coordinator_master_all - elif [ "$2" == "slave" ]; then - pgxc_stop_coordinator_slave_all - elif [ "$2" == "all" ] || [ "$2" == "" ]; then - pgxc_stop_coordinator_master_all - pgxc_stop_coordinator_slave_all - else - eecho Invalid argument for start coordinator command, $2 - fi - return - fi - if [ "$1" == "datanode" ]; then - if [ "$2" == "master" ]; then - pgxc_stop_datanode_master_all - elif [ "$2" == "slave" ]; then - pgxc_stop_datanode_slave_all - elif [ "$2" == "all" ] || [ "$2" == "" ]; then - pgxc_stop_datanode_master_all - pgxc_stop_datanode_slave_all - else - eecho Invalid argument for stop coordinator command, $2 - fi - return - fi - # General nodename specification - # GTM case: has been handled - # GTM proxy? - for ((i=0; i<${#gtmProxyNames[@]}; i++)); do - if [ "$1" == "${gtmProxyNames[$i]}" ]; then - pgxc_stop_gtm_proxy $1 - return - fi - done - # Coordinator? - for ((i=0; i<${#coordNames[@]}; i++)); do - if [ "$1" == "${coordNames[$i]}" ]; then - if [ "$2" == "master" ]; then - pgxc_stop_coordinator_master $1 - elif [ "$2" == "slave" ]; then - pgxc_stop_coordinator_slave $1 - elif [ "$2" == "all" ] || [ "$2" == "" ]; then - pgxc_stop_coordinator_master $1 - pgxc_stop_coordinator_slave $1 - else - eecho Invalid stop coordinator command option, $2 - fi - return - fi - done - # Datanode? - for ((i=0; i<${#datanodeNames[@]}; i++)); do - if [ "$1" == "${datanodeNames[$i]}" ]; then - if [ "$2" == "master" ]; then - pgxc_stop_datanode_master $1 - elif [ "$2" == "slave" ]; then - pgxc_stop_datanode_slave $1 - elif [ "$2" == "all" ] || [ "$2" == "" ]; then - pgxc_stop_datanode_master $1 - pgxc_stop_datanode_slave $1 - else - eecho Invalid stop datanode command option, $2 - fi - return - fi - done - eecho No component named $1 found - return 1 -} - -# failover --- gtm | component name -function pgxc_failover_something -{ - local i - - log_echo pgxc_failover_something'('$*')' - if [ "$1" == "gtm" ] || [ "$1" == "$gtmName" ]; then - pgxc_failover_gtm - pgxc_reconnect_gtm_proxy_all - return - fi - for ((i=0; i<${#coordNames[@]};i++)); do - if [ "$1" == ${coordNames[$i]} ]; then - pgxc_failover_coordinator $1 - return - fi - done - for ((i=0; i<${#datanodeNames[@]}; i++)); do - if [ "$1" == ${datanodeNames[$i]} ]; then - pgxc_failover_datanode $1 - return - fi - done - eecho No such componen found to failover $1 - return 1 -} - -function pgxc_kill_something -{ - local n - - log_echo pgxc_kill_something'('$*')' - if [ "$1" == "" ]; then - return 2 - fi - for ((n=0; n<${#gtmProxyNames[@]}; n++)); do - if [ "$1" == "${gtmProxyNames[$n]}" ]; then - pgxc_kill_gtm_proxy $1 - return - fi - done - if [ "$2" != "master" ] && [ "$2" != "slave" ]; then - eecho Specify master or slave. - return 2 - fi - if [ $1 == $gtmName ]; then - if [ $2 == master ]; then - pgxc_kill_gtm_master - else - pgxc_kill_gtm_slave - fi - return; - fi - for ((n=0; n<${#coordNames[@]}; n++)); do - if [ $1 == ${coordNames[$n]} ]; then - if [ $2 == master ]; then - pgxc_kill_coordinator_master $1 - else - pgxc_kill_coordinator_slave $1 - fi - return; - fi - done - for ((n=0; n<${#datanodeNames[@]}; n++)); do - if [ $1 == ${datanodeNames[$n]} ]; then - if [ $2 == master ]; then - pgxc_kill_datanode_master $1 - else - pgxc_kill_datanode_slave $1 - fi - return; - fi - done -} - -function kill_all -{ - log_echo kill_all'('$*')' - doall killall -u $pgxcUser -9 postgres gtm_proxy gtm -} - -function test_failover -{ - kill_all - init_all - start_all - pgxc_kill_coordinator_master coord1 - pgxc_failover_coordinator coord1 -} - -############################################################################## -# -# Help commands -# -############################################################################## - -function help_command -{ - echo Command you can type: - echo " " - clean Createdb Createuser deploy Dropdb Dropuser end failover - echo " " - init kill monitor prepare Psql q start stop Vacuumdb xcset xcshow - echo For details, type cmdname ? - - echo - echo If you are familiar with internal functions, you can type "function" name and its argument directory. - echo pgxc_ctl will also accept any command for bash. -} - -############################################################################### -# -# EXECUTING SECTION -# -############################################################################### - -#======================================================= -# Things to be done at first -#======================================================= - -# Handle options -progname=$0 -moretodo=y -cmd_with_log=null -while [ $moretodo == y ]; do - if [ $# -gt 0 ]; then - case $1 in - -v ) - shift; - verbose=y; - continue;; - --verbose ) - shift; - verbose=y; - continue;; - --silent ) - verbose=n; - continue;; - -d ) # debug option - shift; - DEBUG=y; - continue;; - --debug ) - shift; - DEBUG=y; - continue;; - -c ) # Configuraton file - shift; - if [ $# -le 0 ]; then - echo ERROR: no -c option value found - exit 1 - else - $configFile=$1 - shift - fi; - continue;; - --configuration ) # Configuraion file - shift; - if [ $# -le 0 ]; then - echo ERROR: no --configuration option value found - exit 1 - else - $configFile=$1 - shift - fi; - continue;; - -f ) # input_file - shift; - if [ "$1" == "" ]; then - echo Epecify input file - else - $progname < $1 - fi - continue;; - --interactive ) # interactive - shift; - interactive=y - continue;; - --batch ) - shift - interactive=n - continue;; - --with-log ) - shift - cmd_with_log=y - continue;; - --without-log ) - shift - cmd_with_log=n - continue;; - * ) - moretodo=n - continue;; - esac - else - moretodo=n - fi -done - -# Read configuration file --> Should be activated only when debug option is off -if [ -f $configFile ]; then - source $configFile -fi -# Log option can be overriden by command-line option -if [ "$cmd_with_log" != "null" ]; then - cmdOpt=$cmd_with_log -fi -if [ "$logOpt" == "y" ]; then - set_log_file -fi - -log_echo '===== Start PGXC_CTL ==========' `date` - -# Check configuration -- Mayh need more detailed check. - -# Check if slaves are configured and makeup each server to N/A if needed -handle_no_slaves -# Construct the server list -makeServerList - -# For interactive operation ---> Finally this should be a part of pgxc_ctl interactive command -# interactive=y --> should be set by options -firstline=y -lastline=n -while [ 1 ]; do - if [ $lastline = "y" ]; then - break - fi - if [ $firstline == "y" ] && [ "$1" != "" ]; then - cmdname=$1; shift - p1=$1; shift - p2=$1; shift - p3=$1; shift - p4=$1; shift - cmdparam=$* - firstline=n - lastline=y - set_interactive off - else - echo -n "$xc_prompt" - read cmdname p1 p2 p3 p4 cmdparam - fi - log_echo_with_date '======' USER COMMAND '=====' $cmdname $p1 $p2 $p3 $p4 $cmdparam - - if [ "$cmdname" == "" ]; then - continue - fi - if [ "$cmdname" == "exit" ] || [ "$cmdname" == "q" ]; then - if [ "$p1" == '?' ]; then - echo Exit command finishes pgxc_ctl. - continue - fi - break - fi - if [ "$cmdname" == "?" ] || [ "$cmdname" == "help" ]; then - help_command - continue - fi - - # Init --- Now accepts only all or default to initialize everything here. - # If you'd like to initialize individual component, use internal function - # directly. - if [ "$cmdname" == "init" ]; then - if [ "$p1" != "" ] && [ "$p1" != "all" ]; then - eecho Invalid init command argument, $p1 - continue - fi - init_all - continue - fi - - # Start --- all | gtm [master|slave|all] | gtm_proxy | coordinator [master|slave|all] | datanode [master|slave|all] | nodename [master|slave|all] - if [ "$cmdname" == "start" ]; then - pgxc_start_something $p1 $p2 $p3 $p4 $cmdparam - continue - fi - - # Stop --- all | gtm [master|slave|all] | gtm_proxy | coordiantor [master|slave|all] | datanode [master|slave|all] | nodename [master|slave|all] - if [ "$cmdname" == "stop" ]; then - pgxc_stop_something $p1 $p2 $p3 $p4 $cmdparam - continue - fi - # Kill -- kills processes will kill command - if [ "$cmdname" == "kill" ]; then - if [ "$p1" == "" ]; then - eecho Specify what to kill "("all/component name")" - elif [ "$p1" == "all" ]; then - kill_all - else - pgxc_kill_something $p1 $p2 $p3 $p4 $cmdparam - continue - fi - fi - if [ "$cmdname" == "Psql" ]; then - if [ "$p1" != "-" ]; then - pgxc_select_coordinator - if [ "$selected_coord" == "none" ]; then - eecho No available coordinator found - continue; - fi - psql -p $selected_coord_port -h $selected_coord_host $p1 $p2 $p3 $p4 $cmdparam - continue - else - pgxc_find_coordinator $p2 - if [ "$selected_coord" == "none" ]; then - eecho No available coordinator found - continue; - fi - psql -p $selected_coord_port -h $selected_coord_host $p3 $p4 $cmdparam - continue - fi - continue - fi - if [ "$cmdname" == "clean" ]; then - if [ "$p1" == "all" ] || [ "$p1" == "" ]; then - clean_all - else - pgxc_clean_node $p1 $p2 $p3 $p4 $cmdparam - fi - continue - fi - - # failover --- gtm | component name - if [ "$cmdname" == "failover" ]; then - pgxc_failover_something $p1 $p2 $p3 $p4 $cmdparam - continue - fi - if [ "$cmdname" == "Createdb" ]; then - if [ "$p1" == "" ]; then - eecho Specify database name to create - continue - fi - if [ "$p1" == "-" ]; then - pgxc_find_coordinator $p2 - if [ "$selected_coord" == "none" ]; then - eecho No available coordinator found - continue; - fi - createdb -p $selected_coord_port -h $selected_coord_host $p3 $p4 $cmdparam - continue - else - pgxc_select_coordinator - if [ "$selected_coord" == "none" ]; then - eecho No available coordinator found - continue; - fi - createdb -p $selected_coord_port -h $selected_coord_host $p1 $p2 $p3 $p4 $cmdparam - continue - fi - fi - if [ "$cmdname" == "Dropdb" ]; then - if [ "$p1" == "" ]; then - eecho Specify database name to drop - continue - fi - if [ "$p1" == "-" ]; then - pgxc_find_coordinator $p2 - if [ "$selected_coord" == "none" ]; then - eecho No available coordinator found - continue; - fi - if [ "$p3" == "" ]; then - echo Specify database name to drop - continue - fi - pgxc_clean_connection_all $p3 - dropdb -p $selected_coord_port -h $selected_coord_host $p3 $p4 $cmdparam - continue - else - pgxc_select_coordinator - if [ "$selected_coord" == "none" ]; then - eecho No available coordinator found - continue; - fi - pgxc_clean_connection_all $p1 - dropdb -p $selected_coord_port -h $selected_coord_host $p1 $p2 $p3 $p4 $cmdparam - continue - fi - fi - if [ "$cmdname" == "Createuser" ]; then - if [ "$p1" == "" ]; then - eecho Specify coordinator user name to create - continue - fi - if [ "$p1" == "-" ]; then - pgxc_find_coordinator $p2 - if [ "$selected_coord" == "none" ]; then - eecho No available coordinator found - continue; - fi - createuser -p $selected_coord_port -h $selected_coord_host $p3 $p4 $cmdparam - continue - else - pgxc_select_coordinator - if [ "$selected_coord" == "none" ]; then - eecho No available coordinator found - continue; - fi - createuser -p $selected_coord_port -h $selected_coord_host $p1 $p2 $p3 $p4 $cmdparam - continue - fi - continue - fi - if [ "$cmdname" == "Dropuser" ]; then - if [ "$p1" == "" ]; then - eecho Specify user name to drop - continue - fi - if [ "$p1" == "-" ]; then - pgxc_find_coordinator $p2 - if [ "$selected_coord" == "none" ]; then - eecho No available coordinator found - continue; - fi - # we may need to clean connection for this user - dropuser -p $selected_coord_port -h $selected_coord_host $p3 $p4 $cmdparam - continue - else - pgxc_select_coordinator - if [ "$selected_coord" == "none" ]; then - eecho No available coordinator found - continue; - fi - # we may need to clean connection for this user - dropuser -p $selected_coord_port -h $selected_coord_host $p1 $p2 $p3 $p4 $cmdparam - continue - fi - continue - fi - if [ "$cmdname" == "Vacuumdb" ]; then - if [ "$p1" != "-" ]; then - pgxc_select_coordinator - continue - if [ "$selected_coord" == "none" ]; then - eecho No available coordinator found - continue; - fi - vacuumdb -p $selected_coord_port -h $selected_coord_host $p1 $p2 $p3 $p4 $cmdparam - continue - else - pgxc_find_coordinator $p2 - if [ "$selected_coord" == "none" ]; then - eecho No available coordinator found - continue; - fi - vacuumdb -p $selected_coord_port -h $selected_coord_host $p3 $p4 $cmdparam - continue - fi - fi - if [ "$cmdname" == "prepare" ]; then - if [ "$p1" == "config" ]; then - create_config_file_template - else - eecho Type prepare config - fi - continue - fi - if [ "$cmdname" == "monitor" ]; then - if [ "$p1" == "all" ]; then - monitor_components - else - pgxc_ctl_monitor $p1 $p2 $p3 $p4 $cmdparam - fi - continue - fi - if [ "$cmdname" == "xcshow" ]; then - if [ "$p1" == "" ]; then - echo Specify item to show - elif [ "$p1" == "config" ]; then - print_config - elif [ "$p1" == "verbose" ]; then - echo verbose=$verbose - elif [ "$p1" == "interactive" ]; then - echo interactive=$interactive - elif [ "$p1" == "log" ]; then - echo -n log option = $logOpt - if [ "$logOpt" == "y" ]; then - echo , logDir: $logDir - else - echo "" - fi - elif [ "$p1" == "backup" ]; then - echo -n config backup = $configBackup - if [ "$configBackup" == "y" ]; then - echo "backup host:" $configBackupHost, "backup file:" $configBackupFile - else - echo "" - fi - elif [ "$p1" == "gtm" ]; then - echo GTM list - pgxc_ctl_show_component $gtmName - elif [ "$p1" == "gtm_proxy" ]; then - pgxc_ctl_show_gtm_proxy_all - elif [ "$p1" == "coordinator" ]; then - pgxc_ctl_show_coordinator_all - elif [ "$p1" == "datanode" ]; then - pgxc_ctl_show_datanode_all - else - pgxc_ctl_show_component $p1 $p2 $p3 $p4 $cmdparam - fi - continue - fi - if [ "$cmdname" == "xcset" ]; then - if [ "$p1" == "verbose" ]; then - set_verbose $p2 - elif [ "$p1" == "log" ]; then - if [ "$p2" == "" ]; then - oeecho Specify log file name. - else - change_log_file $p2 - fi - elif [ "$p1" == "interactive" ]; then - set_interactive $p2 - else - echo "Invalid xcset option $p1" - fi - continue - fi - if [ "$cmdname" == "deploy" ]; then - if [ "$p1" == "all" ]; then - pgxc_deploy_all - elif [ "$p1" == "" ]; then - eecho Specify server name to deploy. - else - pgxc_deploy_individual $p1 - fi - continue - fi - # Need the following trick to handle variable value assignment and echo. - # - # Note: we need to write the command output to the log too. - cat > $localTmpDir/wk.cmd <<EOF -$cmdname $p1 $p2 $p3 $p4 $cmdparam -EOF - source $localTmpDir/wk.cmd - rm $localTmpDir/wk.cmd - continue -done diff --git a/contrib/pgxc_ctl/pgxc_ctl_bash.c b/contrib/pgxc_ctl/pgxc_ctl_bash.c deleted file mode 100644 index 67997045ac..0000000000 --- a/contrib/pgxc_ctl/pgxc_ctl_bash.c +++ /dev/null @@ -1,952 +0,0 @@ -/* - *----------------------------------------------------------------------- - * - * pgxc_ctl_bash.c - * - * Bash script body for Postrgres-XC configuration and operation tool. - * - * Copyright (c) 2013 Postgres-XC Development Group - * - *------------------------------------------------------------------------ - * - * This file was created by make_signature utility when pgxc_ctl was built. - * - * pgxc_ctl uses this bash script to configure postgres-xc and read - * configuration. - * - * This provides users very flexible way to configure their own - * postgres-xc cluster. For example, by using extra variables and script, - * you can save most of your specific hours typing same (or similar) - * variable values again and again. - */ - -#include <stddef.h> - -/* - * Bash script to read pgxc_ctl configuration parameters and write - * back to itself. - * - * This part is written to pgxc_ctl work directory and reads - * configuration file, which is also written in bash script. - */ - -char *pgxc_ctl_bash_script[] = { -"#!/bin/bash", -"# Common variables ######################################################################", -"xc_prompt='PGXC$ '", -"interactive=n", -"verbose=n", -"progname=$0", -"", -"bin=pgxc_ctl # Just in case. Never touch this", -"logfile=none", -"", -"#===========================================================", -"#", -"# Extract parsed configuration values", -"#", -"#===========================================================", -"", -"# $1 is variable name of the array to print", -"function print_array", -"{", -" echo -n $1 \" \"", -" eval echo '$'{$1[@]}", -"}", -"", -"", -"function print_values", -"{", -" local i", -" declare -i i", -" local el", -"", -" # Install Directory", -" echo pgxcInstallDir $pgxcInstallDir", -"", -" # Overall", -" echo pgxcOwner $pgxcOwner", -" echo pgxcUser $pgxcUser", -" echo tmpDir $tmpDir", -" echo localTmpDir $localTmpDir", -" echo configBackup $configBackup", -" echo configBackupHost $configBackupHost", -" echo configBackupDir $configBackupDir", -" echo configBackupFile $configBackupFile", -"", -" # GTM overall", -" echo gtmName $gtmName", -"", -" # GTM master", -" echo gtmMasterServer $gtmMasterServer", -" echo gtmMasterPort $gtmMasterPort", -" echo gtmMasterDir $gtmMasterDir", -" echo gtmExtraConfig $gtmExtraConfig", -" echo gtmMasterSpecificExtraConfig $gtmMasterSpecificExtraConfig", -"", -" # GTM slave", -" echo gtmSlaveName $gtmSlaveName", -" echo gtmSlave $gtmSlave", -" echo gtmSlaveServer $gtmSlaveServer", -" echo gtmSlavePort $gtmSlavePort", -" echo gtmSlaveDir $gtmSlaveDir", -" echo gtmSlaveSpecificExtraConfig $gtmSlaveSpecificExtraConfig", -"", -" # GTM Proxy", -" echo gtmProxy $gtmProxy", -" print_array gtmProxyNames", -" print_array gtmProxyServers", -" print_array gtmProxyPorts", -" print_array gtmProxyDirs", -" echo gtmPxyExtraConfig $gtmPxyExtraConfig", -" print_array gtmPxySpecificExtraConfig", -"", -" # Coordinators overall", -" print_array coordNames", -" print_array coordPorts", -" print_array poolerPorts", -" print_array coordPgHbaEntries", -"", -" # Coordinators master", -" print_array coordMasterServers", -" print_array coordMasterDirs", -" print_array coordMaxWALSenders", -"", -" # Coordinators slave", -" echo coordSlave $coordSlave", -" echo coordSlaveSync $coordSlaveSync", -" print_array coordSlaveServers", -" print_array coordSlavePorts", -" print_array coordSlavePoolerPorts", -" print_array coordSlaveDirs", -" print_array coordArchLogDirs", -"", -" # Coordinator Configuration files", -" echo coordExtraConfig $coordExtraConfig", -" print_array coordSpecificExtraConfig", -" echo coordExtraPgHba $coordExtraPgHba", -" print_array coordSpecificExtraPgHba", -"", -" # Coordinator Additional Slaves", -" echo coordAdditionalSlaves $coordAdditionalSlaves", -" if [ \"$coordAdditionalSlaves\" == \"y\" ]; then", -" print_array coordAdditionalSlaveSet", -" for ((i=0; i<${#coordAdditionalSlaveSet[@]}; i++)); do", -" el=${coordAdditionalSlaveSet[$i]}", -" echo -n ${el}_Sync \" \"", -" eval echo '$'\"$el\"_Sync", -" print_array ${el}_Servers", -" print_array ${el}_Dirs", -" print_array ${el}_ArchLogDirs", -" done", -" fi", -"", -" # Datanodes overall", -" echo primaryDatanode $primaryDatanode", -" print_array datanodeNames", -" print_array datanodePorts", -#ifdef XCP -" print_array datanodePoolerPorts", -#endif -" print_array datanodePgHbaEntries", -" ", -" # Datanodes masters", -" print_array datanodeMasterServers", -" print_array datanodeMasterDirs", -" print_array datanodeMaxWALSenders", -" ", -" # Datanodes slaves", -" echo datanodeSlave $datanodeSlave", -" echo datanodeSlaveSync $datanodeSlaveSync", -" print_array datanodeSlaveServers", -" print_array datanodeSlavePorts", -#ifdef XCP -" print_array datanodeSlavePoolerPorts", -#endif -" print_array datanodeSlaveDirs", -" print_array datanodeArchLogDirs", -"", -" # Datanode configuration files", -" echo datanodeExtraConfig $datanodeExtraConfig", -" print_array datanodeSpecificExtraConfig", -" echo datanodeExtraPgHba $datanodeExtraPgHba", -" print_array datanodeSpecificExtraPgHba", -"", -" # Datanodes additional slaves", -" echo datanodeAdditionalSlaves $datanodeAdditionalSlaves", -" if [ \"$datanodeAdditionalSlaves\" == \"y\" ]; then", -" print_array datanodeAdditionalSlaveSet", -" for ((i=0; i<${#datanodeAdditionalSlaveSet[@]}; i++)); do", -" el=${datanodeAdditionalSlaveSet[$i]}", -" echo -n ${el}_Sync \" \"", -" eval echo '$'\"$el\"_Sync", -" print_array ${el}_Servers", -" print_array ${el}_Dirs", -" print_array ${el}_ArchLogDirs", -" done", -" fi", -" ", -" # WAL Archives", -" echo walArchive $walArchive", -" print_array walArchiveSet", -" if [ \"$walArchive\" == \"y\" ]; then", -" for ((i=0; i<${#walArchvieSet[@]}; i++)); do", -" print_array ${el}_source", -" echo -n ${el}_host", -" eval echo '$'\"$el\"_host", -" echo -n ${el}_backupdir", -" eval echo '$'\"$el\"_backupdir", -" done", -" fi", -"}", -"", -"", -"", -"#============================================================", -"#", -"# Common functions", -"#", -"#============================================================", -"", -"# Optionally $1 will be $PGXC_CTL_HOME settings.", -"function set_home", -"{", -" if [ $# > 1 ]; then", -" echo \"Invalid set_home function call\"", -" return 1", -" fi", -" if [ $# == 1 ]; then", -" if [ -d $1 ]; then", -" pgxc_ctl_home=$1", -" else", -" eecho \"set_home: $1 is not a directory.\"", -" return 1", -" fi", -" elif [ $PGXC_CTL_HOME != \"\" ]; then", -" if [ -d $PGXC_CTL_HOME ]; then", -" pgxc_ctl_home=$PGXC_CTL_HOME", -" else", -" eecho \"set_home: env PGXC_CTL_HOME($PGXC_CTL_HOME) is not a directory.\"", -" return 1;", -" fi", -" fi", -" cd $pgxc_ctl_home;", -"}", -"", -"###############################################################################", -"#", -"# EXECUTING SECTION", -"#", -"###############################################################################", -"", -"#=======================================================", -"# Things to be done at first", -"#=======================================================", -"", -"# Handle options", -"progname=$0", -"moretodo=y", -"cmd_with_log=null", -"#set_home", -"if [ -f $pgxc_ctl_home/.pgxc_ctl_rc ]; then", -" source $pgxc_ctl_home/.pgxc_ctl_rc", -"fi", -"", -"configFile=\"\"", -"", -"while [ $moretodo == y ]; do", -" if [ $# -gt 0 ]; then", -" case $1 in", -" -v )", -" shift;", -" verbose=y;", -" continue;;", -" --verbose )", -" shift;", -" verbose=y;", -" continue;;", -" --silent )", -" verbose=n;", -" continue;;", -" -d ) # debug option", -" shift;", -" DEBUG=y;", -" continue;;", -" --debug )", -" shift;", -" DEBUG=y;", -" continue;;", -" -c ) # Configuraton file", -" shift;", -" if [ $# -le 0 ]; then", -" echo ERROR: no -c option value found", -" exit 1", -" else", -" configFile=$1", -" shift", -" fi;", -" continue;;", -" --configuration ) # Configuraion file", -" shift;", -" if [ $# -le 0 ]; then", -" echo ERROR: no --configuration option value found", -" exit 1", -" else", -" configFile=$1", -" shift", -" fi;", -" continue;;", -" --home ) # PGXC_CTL_HOME", -" shift;", -" if [ $# -le 0 ]; then", -" echo ERROR: no pgxc_ctl_home specified", -" exit 1", -" else", -" pgxc_ctl_home=$1", -" cd $pgxc_ctl_home", -" shift", -" fi;", -" continue;;", -" --signature ) # Check signature", -" shift;", -" if [ $# -le 0 ]; then", -" echo ERROR: Signature does not match", -" exit 1", -" fi", -" if [ \"$1\" != \"$signature\" ]; then", -" echo ERROR: Signature does not match", -" exit 1", -" fi", -" shift", -" continue;;", -" * )", -" moretodo=n", -" continue;;", -" esac", -" else", -" moretodo=n", -" fi", -"done", -"", -"echo $signature", -"# Read configuration file --> Should be activated only when debug option is off", -"", -"if [ -f $pgxc_ctl_home/pgxc_ctl_rc ]; then", -" source $pgxc_ctl_home/pgxc_ctl_rc", -"fi", -"", -"if [ \"$configFile\" != \"\" ] && [ -f \"$configFile\" ]; then", -" source $configFile", -"fi", -"# Log option can be overriden by command-line option", -"", -"print_values", -"", -"", -NULL -}; - -/* - * Prototype of pgxc_ctl configuration file. - * - * It should be self descripting. Can be extracted to your pgxc_ctl - * work directory with 'prepare config' command. - */ -char *pgxc_ctl_conf_prototype[] = { -"#!/bin/bash", -"#", -"# Postgres-XC Configuration file for pgxc_ctl utility. ", -"#", -"# Configuration file can be specified as -c option from pgxc_ctl command. Default is", -"# $PGXC_CTL_HOME/pgxc_ctl.org.", -"#", -"# This is bash script so you can make any addition for your convenience to configure", -"# your Postgres-XC cluster.", -"#", -"# Please understand that pgxc_ctl provides only a subset of configuration which pgxc_ctl", -"# provide. Here's several several assumptions/restrictions pgxc_ctl depends on.", -"#", -"# 1) All the resources of pgxc nodes has to be owned by the same user. Same user means", -"# user with the same user name. User ID may be different from server to server.", -"# This must be specified as a variable $pgxcOwner.", -"#", -"# 2) All the servers must be reacheable via ssh without password. It is highly recommended", -"# to setup key-based authentication among all the servers.", -"#", -"# 3) All the databases in coordinator/datanode has at least one same superuser. Pgxc_ctl", -"# uses this user to connect to coordinators and datanodes. Again, no password should", -"# be used to connect. You have many options to do this, pg_hba.conf, pg_ident.conf and", -"# others. Pgxc_ctl provides a way to configure pg_hba.conf but not pg_ident.conf. This", -"# will be implemented in the later releases.", -"#", -"# 4) Gtm master and slave can have different port to listen, while coordinator and datanode", -"# slave should be assigned the same port number as master.", -"#", -"# 5) Port nuber of a coordinator slave must be the same as its master.", -"#", -"# 6) Master and slave are connected using synchronous replication. Asynchronous replication", -"# have slight (almost none) chance to bring total cluster into inconsistent state.", -"# This chance is very low and may be negligible. Support of asynchronous replication", -"# may be supported in the later release.", -"#", -"# 7) Each coordinator and datanode can have only one slave each. Cascaded replication and", -"# multiple slave are not supported in the current pgxc_ctl.", -"#", -"# 8) Killing nodes may end up with IPC resource leak, such as semafor and shared memory.", -"# Only listening port (socket) will be cleaned with clean command.", -"#", -"# 9) Backup and restore are not supported in pgxc_ctl at present. This is a big task and", -"# may need considerable resource.", -"#", -"#========================================================================================", -"#", -"#", -"# pgxcInstallDir variable is needed if you invoke \"deploy\" command from pgxc_ctl utility.", -"# If don't you don't need this variable.", -"pgxcInstallDir=$HOME/pgxc", -"#---- OVERALL -----------------------------------------------------------------------------", -"#", -"pgxcOwner=$USER # owner of the Postgres-XC databaseo cluster. Here, we use this", -" # both as linus user and database user. This must be", -" # the super user of each coordinator and datanode.", -"pgxcUser=$pgxcOwner # OS user of Postgres-XC owner", -"", -"tmpDir=/tmp # temporary dir used in XC servers", -"localTmpDir=$tmpDir # temporary dir used here locally", -"", -"configBackup=n # If you want config file backup, specify y to this value.", -"configBackupHost=pgxc-linker # host to backup config file", -"configBackupDir=$HOME/pgxc # Backup directory", -"configBackupFile=pgxc_ctl.bak # Backup file name --> Need to synchronize when original changed.", -"", -"#---- GTM ------------------------------------------------------------------------------------", -"", -"# GTM is mandatory. You must have at least (and only) one GTM master in your Postgres-XC cluster.", -"# If GTM crashes and you need to reconfigure it, you can do it by pgxc_update_gtm command to update", -"# GTM master with others. Of course, we provide pgxc_remove_gtm command to remove it. This command", -"# will not stop the current GTM. It is up to the operator.", -"", -"", -"#---- GTM Master -----------------------------------------------", -"", -"#---- Overall ----", -"gtmName=gtm", -"gtmMasterServer=node13", -"gtmMasterPort=20001", -"gtmMasterDir=$HOME/pgxc/nodes/gtm", -"", -"#---- Configuration ---", -"gtmExtraConfig=none # Will be added gtm.conf for both Master and Slave (done at initilization only)", -"gtmMasterSpecificExtraConfig=none # Will be added to Master's gtm.conf (done at initialization only)", -"", -"#---- GTM Slave -----------------------------------------------", -"", -"# Because GTM is a key component to maintain database consistency, you may want to configure GTM slave", -"# for backup.", -"", -"#---- Overall ------", -"gtmSlave=y # Specify y if you configure GTM Slave. Otherwise, GTM slave will not be configured and", -" # all the following variables will be reset.", -"gtmSlaveName=gtmSlave", -"gtmSlaveServer=node12 # value none means GTM slave is not available. Give none if you don't configure GTM Slave.", -"gtmSlavePort=20001 # Not used if you don't configure GTM slave.", -"gtmSlaveDir=$HOME/pgxc/nodes/gtm # Not used if you don't configure GTM slave.", -"# Please note that when you have GTM failover, then there will be no slave available until you configure the slave", -"# again. (pgxc_add_gtm_slave function will handle it)", -"", -"#---- Configuration ----", -"gtmSlaveSpecificExtraConfig=none # Will be added to Slave's gtm.conf (done at initialization only)", -"", -"#---- GTM Proxy -------------------------------------------------------------------------------------------------------", -"# GTM proxy will be selected based upon which server each component runs on.", -"# When fails over to the slave, the slave inherits its master's gtm proxy. It should be", -"# reconfigured based upon the new location.", -"#", -"# To do so, slave should be restarted. So pg_ctl promote -> (edit postgresql.conf and recovery.conf) -> pg_ctl restart", -"#", -"# You don't have to configure GTM Proxy if you dont' configure GTM slave or you are happy if every component connects", -"# to GTM Master directly. If you configure GTL slave, you must configure GTM proxy too.", -"", -"#---- Shortcuts ------", -"gtmProxyDir=$HOME/pgxc/nodes/gtm_pxy", -"", -"#---- Overall -------", -"gtmProxy=y # Specify y if you conifugre at least one GTM proxy. You may not configure gtm proxies", -" # only when you dont' configure GTM slaves.", -" # If you specify this value not to y, the following parameters will be set to default empty values.", -" # If we find there're no valid Proxy server names (means, every servers are specified", -" # as none), then gtmProxy value will be set to \"n\" and all the entries will be set to", -" # empty values.", -"gtmProxyNames=(gtm_pxy1 gtm_pxy2 gtm_pxy3 gtm_pxy4) # No used if it is not configured", -"gtmProxyServers=(node06 node07 node08 node09) # Specify none if you dont' configure it.", -"gtmProxyPorts=(20001 20001 20001 20001) # Not used if it is not configured.", -"gtmProxyDirs=($gtmProxyDir $gtmProxyDir $gtmProxyDir $gtmProxyDir) # Not used if it is not configured.", -"", -"#---- Configuration ----", -"gtmPxyExtraConfig=none # Extra configuration parameter for gtm_proxy. Coordinator section has an example.", -"gtmPxySpecificExtraConfig=(none none none none)", -"", -"#---- Coordinators ----------------------------------------------------------------------------------------------------", -"", -"#---- shortcuts ----------", -"coordMasterDir=$HOME/pgxc/nodes/coord", -"coordSlaveDir=$HOME/pgxc/nodes/coord_slave", -"coordArchLogDir=$HOME/pgxc/nodes/coord_archlog", -"", -"#---- Overall ------------", -"coordNames=(coord1 coord2 coord3 coord4) # Master and slave use the same name", -"coordPorts=(20004 20005 20004 20005) # Master ports", -"poolerPorts=(20010 20011 20010 20011) # Master pooler ports", -"coordPgHbaEntries=(192.168.1.0/24) # Assumes that all the coordinator (master/slave) accepts", -" # the same connection", -" # This entry allows only $pgxcOwner to connect.", -" # If you'd like to setup another connection, you should", -" # supply these entries through files specified below.", -"# Note: The above parameter is extracted as \"host all all 0.0.0.0/0 trust\". If you don't want", -"# such setups, specify the value () to this variable and suplly what you want using coordExtraPgHba", -"# and/or coordSpecificExtraPgHba variables.", -"", -"#---- Master -------------", -"coordMasterServers=(node06 node07 node08 node09) # none means this master is not available", -"coordMasterDirs=($coordMasterDir $coordMasterDir $coordMasterDir $coordMasterDir)", -"coordMaxWALsernder=5 # max_wal_senders: needed to configure slave. If zero value is specified,", -" # it is expected to supply this parameter explicitly by external files", -" # specified in the following. If you don't configure slaves, leave this value to zero.", -"coordMaxWALSenders=($coordMaxWALsernder $coordMaxWALsernder $coordMaxWALsernder $coordMaxWALsernder)", -" # max_wal_senders configuration for each coordinator.", -"", -"#---- Slave -------------", -"coordSlave=y # Specify y if you configure at least one coordiantor slave. Otherwise, the following", -" # configuration parameters will be set to empty values.", -" # If no effective server names are found (that is, every servers are specified as none),", -" # then coordSlave value will be set to n and all the following values will be set to", -" # empty values.", -"coordSlaveSync=y # Specify to connect with synchronized mode.", -"coordSlaveServers=(node07 node08 node09 node06) # none means this slave is not available", -"coordSlavePorts=(20004 20005 20004 20005) # Master ports", -"coordSlavePoolerPorts=(20010 20011 20010 20011) # Master pooler ports", -"coordSlaveDirs=($coordSlaveDir $coordSlaveDir $coordSlaveDir $coordSlaveDir)", -"coordArchLogDirs=($coordArchLogDir $coordArchLogDir $coordArchLogDir $coordArchLogDir)", -"", -"#---- Configuration files---", -"# Need these when you'd like setup specific non-default configuration ", -"# These files will go to corresponding files for the master.", -"# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries ", -"# Or you may supply these files manually.", -"coordExtraConfig=coordExtraConfig # Extra configuration file for coordinators. ", -" # This file will be added to all the coordinators'", -" # postgresql.conf", -"# Pleae note that the following sets up minimum parameters which you may want to change.", -"# You can put your postgresql.conf lines here.", -"cat > $coordExtraConfig <<EOF", -"#================================================", -"# Added to all the coordinator postgresql.conf", -"# Original: $coordExtraConfig", -"log_destination = 'stderr'", -"logging_collector = on", -"log_directory = 'pg_log'", -"listen_addresses = '*'", -"max_connections = 100", -"EOF", -"", -"# Additional Configuration file for specific coordinator master.", -"# You can define each setting by similar means as above.", -"coordSpecificExtraConfig=(none none none none)", -"coordExtraPgHba=none # Extra entry for pg_hba.conf. This file will be added to all the coordinators' pg_hba.conf", -"coordSpecificExtraPgHba=(none none none none)", -"", -"#----- Additional Slaves -----", -"#", -"# Please note that this section is just a suggestion how we extend the configuration for", -"# multiple and cascaded replication. They're not used in the current version.", -"#", -"coordAdditionalSlaves=n # Additional slave can be specified as follows: where you", -"coordAdditionalSlaveSet=(cad1) # Each specifies set of slaves. This case, two set of slaves are", -" # configured", -"cad1_Sync=n # All the slaves at \"cad1\" are connected with asynchronous mode.", -" # If not, specify \"y\"", -" # The following lines specifies detailed configuration for each", -" # slave tag, cad1. You can define cad2 similarly.", -"cad1_Servers=(node08 node09 node06 node07) # Hosts", -"cad1_dir=$HOME/pgxc/nodes/coord_slave_cad1", -"cad1_Dirs=($cad1_dir $cad1_dir $cad1_dir $cad1_dir)", -"cad1_ArchLogDir=$HOME/pgxc/nodes/coord_archlog_cad1", -"cad1_ArchLogDirs=($cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir)", -"", -"", -"#---- Datanodes -------------------------------------------------------------------------------------------------------", -"", -"#---- Shortcuts --------------", -"datanodeMasterDir=$HOME/pgxc/nodes/dn_master", -"datanodeSlaveDir=$HOME/pgxc/nodes/dn_slave", -"datanodeArchLogDir=$HOME/pgxc/nodes/datanode_archlog", -"", -"#---- Overall ---------------", -"#primaryDatanode=datanode1 # Primary Node.", -"# At present, xc has a priblem to issue ALTER NODE against the primay node. Until it is fixed, the test will be done", -"# without this feature.", -"primaryDatanode=datanode1 # Primary Node.", -"datanodeNames=(datanode1 datanode2 datanode3 datanode4)", -"datanodePorts=(20008 20009 20008 20009) # Master ports", -#ifdef XCP -"datanodePoolerPorts=(20012 20013 20012 20013) # Master pooler ports", -#endif -"datanodePgHbaEntries=(192.168.1.0/24) # Assumes that all the coordinator (master/slave) accepts", -" # the same connection", -" # This list sets up pg_hba.conf for $pgxcOwner user.", -" # If you'd like to setup other entries, supply them", -" # through extra configuration files specified below.", -"# Note: The above parameter is extracted as \"host all all 0.0.0.0/0 trust\". If you don't want", -"# such setups, specify the value () to this variable and suplly what you want using datanodeExtraPgHba", -"# and/or datanodeSpecificExtraPgHba variables.", -"", -"#---- Master ----------------", -"datanodeMasterServers=(node06 node07 node08 node09) # none means this master is not available.", -" # This means that there should be the master but is down.", -" # The cluster is not operational until the master is", -" # recovered and ready to run. ", -"datanodeMasterDirs=($datanodeMasterDir $datanodeMasterDir $datanodeMasterDir $datanodeMasterDir)", -"datanodeMaxWalSender=5 # max_wal_senders: needed to configure slave. If zero value is ", -" # specified, it is expected this parameter is explicitly supplied", -" # by external configuration files.", -" # If you don't configure slaves, leave this value zero.", -"datanodeMaxWALSenders=($datanodeMaxWalSender $datanodeMaxWalSender $datanodeMaxWalSender $datanodeMaxWalSender)", -" # max_wal_senders configuration for each datanode", -"", -"#---- Slave -----------------", -"datanodeSlave=y # Specify y if you configure at least one coordiantor slave. Otherwise, the following", -" # configuration parameters will be set to empty values.", -" # If no effective server names are found (that is, every servers are specified as none),", -" # then datanodeSlave value will be set to n and all the following values will be set to", -" # empty values.", -"datanodeSlaveServers=(node07 node08 node09 node06) # value none means this slave is not available", -"datanodeSlavePorts=(20008 20009 20008 20009) # value none means this slave is not available", -"datanodeSlavePoolerPorts=(20012 20013 20012 20013) # value none means this slave is not available", -"datanodeSlaveSync=y # If datanode slave is connected in synchronized mode", -"datanodeSlaveDirs=($datanodeSlaveDir $datanodeSlaveDir $datanodeSlaveDir $datanodeSlaveDir)", -"datanodeArchLogDirs=( $datanodeArchLogDir $datanodeArchLogDir $datanodeArchLogDir $datanodeArchLogDir )", -"", -"# ---- Configuration files ---", -"# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries here.", -"# These files will go to corresponding files for the master.", -"# Or you may supply these files manually.", -"datanodeExtraConfig=none # Extra configuration file for datanodes. This file will be added to all the ", -" # datanodes' postgresql.conf", -"datanodeSpecificExtraConfig=(none none none none)", -"datanodeExtraPgHba=none # Extra entry for pg_hba.conf. This file will be added to all the datanodes' postgresql.conf", -"datanodeSpecificExtraPgHba=(none none none none)", -"", -"#----- Additional Slaves -----", -"datanodeAdditionalSlaves=n # Additional slave can be specified as follows: where you", -"# datanodeAdditionalSlaveSet=(dad1 dad2) # Each specifies set of slaves. This case, two set of slaves are", -" # configured", -"# dad1_Sync=n # All the slaves at \"cad1\" are connected with asynchronous mode.", -" # If not, specify \"y\"", -" # The following lines specifies detailed configuration for each", -" # slave tag, cad1. You can define cad2 similarly.", -"# dad1_Servers=(node08 node09 node06 node07) # Hosts", -"# dad1_dir=$HOME/pgxc/nodes/coord_slave_cad1", -"# dad1_Dirs=($cad1_dir $cad1_dir $cad1_dir $cad1_dir)", -"# dad1_ArchLogDir=$HOME/pgxc/nodes/coord_archlog_cad1", -"# dad1_ArchLogDirs=($cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir)", -"", -"#---- WAL archives -------------------------------------------------------------------------------------------------", -"walArchive=n # If you'd like to configure WAL archive, edit this section.", -" # Pgxc_ctl assumes that if you configure WAL archive, you configure it", -" # for all the coordinators and datanodes.", -" # Default is \"no\". Please specify \"y\" here to turn it on.", -"#", -"# End of Configuration Section", -"#", -"#==========================================================================================================================", -"", -"#========================================================================================================================", -"# The following is for extension. Just demonstrate how to write such extension. There's no code", -"# which takes care of them so please ignore the following lines. They are simply ignored by pgxc_ctl.", -"# No side effects.", -"#=============<< Beginning of future extension demonistration >> ========================================================", -"# You can setup more than one backup set for various purposes, such as disaster recovery.", -"walArchiveSet=(war1 war2)", -"war1_source=(master) # you can specify master, slave or ano other additional slaves as a source of WAL archive.", -" # Default is the master", -"wal1_source=(slave)", -"wal1_source=(additiona_coordinator_slave_set additional_datanode_slave_set)", -"war1_host=node10 # All the nodes are backed up at the same host for a given archive set", -"war1_backupdir=$HOME/pgxc/backup_war1", -"wal2_source=(master)", -"war2_host=node11", -"war2_backupdir=$HOME/pgxc/backup_war2", -"#=============<< End of future extension demonistration >> ========================================================", -NULL -}; - -char *pgxc_ctl_conf_prototype_minimal[] = { -"#!/bin/bash", -"#", -"# Postgres-XC Configuration file for pgxc_ctl utility. ", -"#", -"# Configuration file can be specified as -c option from pgxc_ctl command. Default is", -"# $PGXC_CTL_HOME/pgxc_ctl.org.", -"#", -"# This is bash script so you can make any addition for your convenience to configure", -"# your Postgres-XC cluster.", -"#", -"# Please understand that pgxc_ctl provides only a subset of configuration which pgxc_ctl", -"# provide. Here's several several assumptions/restrictions pgxc_ctl depends on.", -"#", -"# 1) All the resources of pgxc nodes has to be owned by the same user. Same user means", -"# user with the same user name. User ID may be different from server to server.", -"# This must be specified as a variable $pgxcOwner.", -"#", -"# 2) All the servers must be reacheable via ssh without password. It is highly recommended", -"# to setup key-based authentication among all the servers.", -"#", -"# 3) All the databases in coordinator/datanode has at least one same superuser. Pgxc_ctl", -"# uses this user to connect to coordinators and datanodes. Again, no password should", -"# be used to connect. You have many options to do this, pg_hba.conf, pg_ident.conf and", -"# others. Pgxc_ctl provides a way to configure pg_hba.conf but not pg_ident.conf. This", -"# will be implemented in the later releases.", -"#", -"# 4) Gtm master and slave can have different port to listen, while coordinator and datanode", -"# slave should be assigned the same port number as master.", -"#", -"# 5) Port nuber of a coordinator slave must be the same as its master.", -"#", -"# 6) Master and slave are connected using synchronous replication. Asynchronous replication", -"# have slight (almost none) chance to bring total cluster into inconsistent state.", -"# This chance is very low and may be negligible. Support of asynchronous replication", -"# may be supported in the later release.", -"#", -"# 7) Each coordinator and datanode can have only one slave each. Cascaded replication and", -"# multiple slave are not supported in the current pgxc_ctl.", -"#", -"# 8) Killing nodes may end up with IPC resource leak, such as semafor and shared memory.", -"# Only listening port (socket) will be cleaned with clean command.", -"#", -"# 9) Backup and restore are not supported in pgxc_ctl at present. This is a big task and", -"# may need considerable resource.", -"#", -"#========================================================================================", -"#", -"#", -"# pgxcInstallDir variable is needed if you invoke \"deploy\" command from pgxc_ctl utility.", -"# If don't you don't need this variable.", -"pgxcInstallDir=$HOME/pgxc", -"#---- OVERALL -----------------------------------------------------------------------------", -"#", -"pgxcOwner=$USER # owner of the Postgres-XC databaseo cluster. Here, we use this", -" # both as linus user and database user. This must be", -" # the super user of each coordinator and datanode.", -"pgxcUser=$pgxcOwner # OS user of Postgres-XC owner", -"", -"tmpDir=/tmp # temporary dir used in XC servers", -"localTmpDir=$tmpDir # temporary dir used here locally", -"", -"configBackup=n # If you want config file backup, specify y to this value.", -"configBackupHost=pgxc-linker # host to backup config file", -"configBackupDir=$HOME/pgxc # Backup directory", -"configBackupFile=pgxc_ctl.bak # Backup file name --> Need to synchronize when original changed.", -"", -"dataDirRoot=$HOME/DATA/pgxl/nodes", -"", -"#---- GTM ------------------------------------------------------------------------------------", -"", -"# GTM is mandatory. You must have at least (and only) one GTM master in your Postgres-XC cluster.", -"# If GTM crashes and you need to reconfigure it, you can do it by pgxc_update_gtm command to update", -"# GTM master with others. Of course, we provide pgxc_remove_gtm command to remove it. This command", -"# will not stop the current GTM. It is up to the operator.", -"", -"#---- Overall -------", -"gtmName=gtm", -"", -"#---- GTM Master -----------------------------------------------", -"", -"#---- Overall ----", -"gtmMasterServer=localhost", -"gtmMasterPort=20001", -"gtmMasterDir=$dataDirRoot/gtm", -"", -"#---- Configuration ---", -"gtmExtraConfig=none # Will be added gtm.conf for both Master and Slave (done at initilization only)", -"gtmMasterSpecificExtraConfig=none # Will be added to Master's gtm.conf (done at initialization only)", -"", -"#---- GTM Slave -----------------------------------------------", -"", -"# Because GTM is a key component to maintain database consistency, you may want to configure GTM slave", -"# for backup.", -"", -"#---- Overall ------", -"gtmSlave=n # Specify y if you configure GTM Slave. Otherwise, GTM slave will not be configured and", -" # all the following variables will be reset.", -"gtmSlaveName=gtmSlave", -"gtmSlaveServer=localhost # value none means GTM slave is not available. Give none if you don't configure GTM Slave.", -"gtmSlavePort=20002 # Not used if you don't configure GTM slave.", -"gtmSlaveDir=$dataDirRoot/gtm_slv # Not used if you don't configure GTM slave.", -"# Please note that when you have GTM failover, then there will be no slave available until you configure the slave", -"# again. (pgxc_add_gtm_slave function will handle it)", -"", -"#---- Configuration ----", -"#gtmSlaveSpecificExtraConfig=none # Will be added to Slave's gtm.conf (done at initialization only)", -"", -"#---- GTM Proxy -------------------------------------------------------------------------------------------------------", -"# GTM proxy will be selected based upon which server each component runs on.", -"# When fails over to the slave, the slave inherits its master's gtm proxy. It should be", -"# reconfigured based upon the new location.", -"#", -"# To do so, slave should be restarted. So pg_ctl promote -> (edit postgresql.conf and recovery.conf) -> pg_ctl restart", -"#", -"# You don't have to configure GTM Proxy if you dont' configure GTM slave or you are happy if every component connects", -"# to GTM Master directly. If you configure GTL slave, you must configure GTM proxy too.", -"", -"#---- Shortcuts ------", -"gtmProxyDir=$dataDirRoot/gtm_pxy", -"", -"#---- Overall -------", -"gtmProxy=y # Specify y if you conifugre at least one GTM proxy. You may not configure gtm proxies", -" # only when you dont' configure GTM slaves.", -" # If you specify this value not to y, the following parameters will be set to default empty values.", -" # If we find there're no valid Proxy server names (means, every servers are specified", -" # as none), then gtmProxy value will be set to \"n\" and all the entries will be set to", -" # empty values.", -"gtmProxyNames=(gtm_pxy1) # No used if it is not configured", -"gtmProxyServers=(localhost) # Specify none if you dont' configure it.", -"gtmProxyPorts=(20101) # Not used if it is not configured.", -"gtmProxyDirs=($gtmProxyDir.1) # Not used if it is not configured.", -"", -"#---- Configuration ----", -"gtmPxyExtraConfig=n # Extra configuration parameter for gtm_proxy. Coordinator section has an example.", -"", -"#---- Coordinators ----------------------------------------------------------------------------------------------------", -"", -"#---- shortcuts ----------", -"coordMasterDir=$dataDirRoot/coord_master", -"coordSlaveDir=$HOME/coord_slave", -"coordArchLogDir=$HOME/coord_archlog", -"", -"#---- Overall ------------", -"coordNames=(coord1 coord2) # Master and slave use the same name", -"coordPorts=(30001 30002) # Master server listening ports", -"poolerPorts=(30011 30012) # Master pooler ports", -"coordPgHbaEntries=(::1/128) # Assumes that all the coordinator (master/slave) accepts", -" # the same connection", -" # This entry allows only $pgxcOwner to connect.", -" # If you'd like to setup another connection, you should", -" # supply these entries through files specified below.", -"#coordPgHbaEntries=(127.0.0.1/32) # Same as above but for IPv4 connections", -"", -"#---- Master -------------", -"coordMasterServers=(localhost localhost) # none means this master is not available", -"coordMasterDirs=($coordMasterDir.1 $coordMasterDir.2)", -"coordMaxWALsender=5 # max_wal_senders: needed to configure slave. If zero value is specified,", -" # it is expected to supply this parameter explicitly by external files", -" # specified in the following. If you don't configure slaves, leave this value to zero.", -"coordMaxWALSenders=($coordMaxWALsender $coordMaxWALsender)", -" # max_wal_senders configuration for each coordinator.", -"", -"#---- Slave -------------", -"coordSlave=n # Specify y if you configure at least one coordiantor slave. Otherwise, the following", -" # configuration parameters will be set to empty values.", -" # If no effective server names are found (that is, every servers are specified as none),", -" # then coordSlave value will be set to n and all the following values will be set to", -" # empty values.", -"coordSlaveSync=y # Specify to connect with synchronized mode.", -"coordSlaveServers=(localhost localhost) # none means this slave is not available", -"coordSlavePorts=(30101 30102) # coordinator slave listening ports", -"coordSlavePoolerPorts=(30111 30112) # coordinator slave pooler ports", -"coordSlaveDirs=($coordSlaveDir.1 $coordSlaveDir.2)", -"coordArchLogDirs=($coordArchLogDir.1 $coordArchLogDir.2)", -"", -"#---- Configuration files---", -"# Need these when you'd like setup specific non-default configuration ", -"# These files will go to corresponding files for the master.", -"# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries ", -"# Or you may supply these files manually.", -"coordExtraConfig=coordExtraConfig # Extra configuration file for coordinators. ", -" # This file will be added to all the coordinators'", -" # postgresql.conf", -"# Pleae note that the following sets up minimum parameters which you may want to change.", -"# You can put your postgresql.conf lines here.", -"cat > $coordExtraConfig <<EOF", -"#================================================", -"# Added to all the coordinator postgresql.conf", -"# Original: $coordExtraConfig", -"log_destination = 'stderr'", -"logging_collector = on", -"log_directory = 'pg_log'", -"listen_addresses = '*'", -"max_connections = 100", -"hot_standby = off", -"EOF", -"", -"# Additional Configuration file for specific coordinator master.", -"# You can define each setting by similar means as above.", -"coordSpecificExtraConfig=(none none)", -"coordSpecificExtraPgHba=(none none)", -"", -"#---- Datanodes -------------------------------------------------------------------------------------------------------", -"", -"#---- Shortcuts --------------", -"datanodeMasterDir=$dataDirRoot/dn_master", -"datanodeSlaveDir=$dataDirRoot/dn_slave", -"datanodeArchLogDir=$dataDirRoot/datanode_archlog", -"", -"#---- Overall ---------------", -"primaryDatanode=datanode_1 # Primary Node.", -"datanodeNames=(datanode_1 datanode_2)", -"datanodePorts=(40001 40002) # Master and slave use the same port!", -"datanodePoolerPorts=(40011 40012) # Master and slave use the same port!", -"datanodePgHbaEntries=(::1/128) # Assumes that all the coordinator (master/slave) accepts", -" # the same connection", -" # This list sets up pg_hba.conf for $pgxcOwner user.", -" # If you'd like to setup other entries, supply them", -" # through extra configuration files specified below.", -"#datanodePgHbaEntries=(127.0.0.1/32) # Same as above but for IPv4 connections", -"", -"#---- Master ----------------", -"datanodeMasterServers=(localhost localhost) # none means this master is not available.", -" # This means that there should be the master but is down.", -" # The cluster is not operational until the master is", -" # recovered and ready to run. ", -"datanodeMasterDirs=($datanodeMasterDir.1 $datanodeMasterDir.2)", -"datanodeMaxWalSender=5 # max_wal_senders: needed to configure slave. If zero value is ", -" # specified, it is expected this parameter is explicitly supplied", -" # by external configuration files.", -" # If you don't configure slaves, leave this value zero.", -"datanodeMaxWALSenders=($datanodeMaxWalSender $datanodeMaxWalSender)", -" # max_wal_senders configuration for each datanode", -"", -"#---- Slave -----------------", -"#datanodeSlave=n # Specify y if you configure at least one coordiantor slave. Otherwise, the following", -" # configuration parameters will be set to empty values.", -" # If no effective server names are found (that is, every servers are specified as none),", -" # then datanodeSlave value will be set to n and all the following values will be set to", -" # empty values.", -"#datanodeSlaveServers=(localhost localhost) # value none means this slave is not available", -"#datanodeSlavePorts=(40101 40102) # Master and slave use the same port!", -"#datanodeSlavePoolerPorts=(40111 40112) # Master and slave use the same port!", -"#datanodeSlaveSync=y # If datanode slave is connected in synchronized mode", -"#datanodeSlaveDirs=($datanodeSlaveDir.1 $datanodeSlaveDir.2)", -"#datanodeArchLogDirs=( $datanodeArchLogDir.1 $datanodeArchLogDir.2)", -"", -"# ---- Configuration files ---", -"# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries here.", -"# These files will go to corresponding files for the master.", -"# Or you may supply these files manually.", -"datanodeExtraConfig=datanodeExtraConfig ", -"cat > $datanodeExtraConfig <<EOF", -"#================================================", -"# Added to all the datanode postgresql.conf", -"# Original: $datanodeExtraConfig", -"log_destination = 'stderr'", -"logging_collector = on", -"log_directory = 'pg_log'", -"listen_addresses = '*'", -"max_connections = 100", -"hot_standby = off", -"EOF", -"# Additional Configuration file for specific datanode master.", -"# You can define each setting by similar means as above.", -"datanodeSpecificExtraConfig=(none none)", -"datanodeSpecificExtraPgHba=(none none)", -NULL -}; diff --git a/contrib/pgxc_ctl/pgxc_ctl_bash.org b/contrib/pgxc_ctl/pgxc_ctl_bash.org deleted file mode 100755 index f1c142d298..0000000000 --- a/contrib/pgxc_ctl/pgxc_ctl_bash.org +++ /dev/null @@ -1,885 +0,0 @@ -#!/bin/bash -# -# TODO -# * Backup configuration file (at update, too) to some remote site for pgxc_ctl HA feature too. -# * Write output of *_ctl, intdb and intgtm result to log files -# * Write every operation to the log. Log file can be specified with --l file or --log file -# * Configure log level -# * Switch log log file -# * Log option to the configuration file so that this can be failed over. -# * Log to a remote server? -# * Multiple log? -# -# Configuration file. Configuration file can be specified as -c option of -# the command like, or PGXCCONFIG environment variable. If both are -# not specified, the following configuration file will be used. -# -# Change in the cluster status due to failover will be added to the configuration file so that -# new master can be invoked as the master when restarted. -# -# All such addition will be tagged with proper comment and date/time info. If you'd like to -# cancel such changes, you can remove or comment-out such additional lines. -# -# -#========================================================================================================================== -# -# Configuration Section -# -# This section should be in the file $configFile for -# user's configuration. -# -# Several assumptons: -# 1) configuration file will be set to data directory. -# configuration file name is fixed to postgresql.conf -# 2) pg_hba.conf will be set to data directory. File name is -# fixed to pg_hba.conf -# -#================================================================ -# MEMO -# -# max_connections, min_pool_size, max_pool_size --> should be configurable! -# They're not cluster specific. So we may give a chance to include -# these specific options to be included from external files. -# They should not change by failover so they just have to be -# configured at first time only. -#=============================================================== -# -# -#---- Home dir of pgxc_ctl -pgxc_ctl_home=$HOME/.pgxc_ctl -#---- Configuration File -pgxcInstallDir=$HOME/pgxc -configFile=$pgxcInstallDir/pgxcConf -#---- OVERALL ----------------------------------------------------------------------------------------------------------- -# -pgxcOwner=pgxc # owner of the Postgres-XC database cluster. Here, we use this - # both as linus user and database user. This must be - # the super user of each coordinator and datanode. -pgxcUser=$pgxcOwner # OS user of Postgres-XC owner - -tmpDir=/tmp # temporary dir used in XC servers -localTmpDir=$tmpDir # temporary dir used here locally - -logOpt=y # If you want log -logDir=$pgxc_ctl_home/pgxc_ctl_log # Directory to write pgxc_ctl logs - -configBackup=y # If you want config file backup -configBackupHost=pgxc-linker # host to backup config file -configBackupDir=$pgxcInstallDir -configBackupFile=`basename $configFile` # Backup file name --> Need to synchronize when original changed. - -#---- GTM -------------------------------------------------------------------------------------------------------------- - -# GTM is mandatory. You must have at least (and only) one GTM master in your Postgres-XC cluster. -# If GTM crashes and you need to reconfigure it, you can do it by pgxc_update_gtm command to update -# GTM master with others. Of course, we provide pgxc_remove_gtm command to remove it. This command -# will not stop the current GTM. It is up to the operator. - -#---- Overall ------- -gtmName=gtm - -#---- GTM Master ----------------------------------------------- - -#---- Overall ---- -gtmMasterServer=node13 -gtmMasterPort=20001 -gtmMasterDir=$HOME/pgxc/nodes/gtm - -#---- Configuration --- -gtmExtraConfig=none # Will be added gtm.conf for both Master and Slave (done at initilization only) -gtmMasterSpecificExtraConfig=none # Will be added to Master's gtm.conf (done at initialization only) - -#---- GTM Slave ----------------------------------------------- - -# Because GTM is a key component to maintain database consistency, you may want to configure GTM slave -# for backup. - -#---- Overall ------ -gtmSlave=y # Specify y if you configure GTM Slave. Otherwise, GTM slave will not be configured and - # all the following variables will be reset. -gtmSlaveServer=node12 # value none means GTM slave is not available. Give none if you don't configure GTM Slave. -gtmSlavePort=20001 # Not used if you don't configure GTM slave. -gtmSlaveDir=$HOME/pgxc/nodes/gtm # Not used if you don't configure GTM slave. -# Please note that when you have GTM failover, then there will be no slave available until you configure the slave -# again. (pgxc_add_gtm_slave function will handle it) - -#---- Configuration ---- -gtmSlaveSpecificExtraConfig=none # Will be added to Slave's gtm.conf (done at initialization only) - -#---- GTM Proxy ------------------------------------------------------------------------------------------------------- -# GTM proxy will be selected based upon which server each component runs on. -# When fails over to the slave, the slave inherits its master's gtm proxy. It should be -# reconfigured based upon the new location. -# -# To do so, slave should be restarted. So pg_ctl promote -> (edit postgresql.conf and recovery.conf) -> pg_ctl restart -# -# You don't have to configure GTM Proxy if you dont' configure GTM slave or you are happy if every component connects -# to GTM Master directly. If you configure GTL slave, you must configure GTM proxy too. - -#---- Shortcuts ------ -gtmProxyDir=$HOME/pgxc/nodes/gtm_pxy - -#---- Overall ------- -gtmProxy=y # Specify y if you conifugre at least one GTM proxy. You may not configure gtm proxies - # only when you dont' configure GTM slaves. - # If you specify this value not to y, the following parameters will be set to default empty values. - # If we find there're no valid Proxy server names (means, every servers are specified - # as none), then gtmProxy value will be set to "n" and all the entries will be set to - # empty values. -gtmProxyNames=(gtm_pxy1 gtm_pxy2 gtm_pxy3 gtm_pxy4) # No used if it is not configured -gtmProxyServers=(node06 node07 node08 node09) # Specify none if you dont' configure it. -gtmProxyPorts=(20001 20001 20001 20001) # Not used if it is not configured. -gtmProxyDirs=($gtmProxyDir $gtmProxyDir $gtmProxyDir $gtmProxyDir) # Not used if it is not configured. - -#---- Configuration ---- -gtmPxyExtraConfig=none # Extra configuration parameter for gtm_proxy -gtmPxySpecificExtraConfig=(none none none none) - -#---- Coordinators ---------------------------------------------------------------------------------------------------- - -#---- shortcuts ---------- -coordMasterDir=$HOME/pgxc/nodes/coord -coordSlaveDir=$HOME/pgxc/nodes/coord_slave -coordArchLogDir=$HOME/pgxc/nodes/coord_archlog - -#---- Overall ------------ -coordNames=(coord1 coord2 coord3 coord4) # Master and slave use the same name -coordPorts=(20004 20005 20004 20005) # Master and slave use the same port -poolerPorts=(20010 20011 20010 20011) # Master and slave use the same pooler port -coordPgHbaEntries=(192.168.1.0/24) # Assumes that all the coordinator (master/slave) accepts - # the same connection - # This entry allows only $pgxcOwner to connect. - # If you'd like to setup another connection, you should - # supply these entries through files specified below. -# Note: The above parameter is extracted as "host all all 0.0.0.0/0 trust". If you don't want -# such setups, specify the value () to this variable and suplly what you want using coordExtraPgHba -# and/or coordSpecificExtraPgHba variables. - -#---- Master ------------- -coordMasterServers=(node06 node07 node08 node09) # none means this master is not available -coordMasterDirs=($coordMasterDir $coordMasterDir $coordMasterDir $coordMasterDir) -coordMaxWALsernder=5 # max_wal_senders: needed to configure slave. If zero value is specified, - # it is expected to supply this parameter explicitly by external files - # specified in the following. If you don't configure slaves, leave this value to zero. -coordMaxWALSenders=($coordMaxWALsernder $coordMaxWALsernder $coordMaxWALsernder $coordMaxWALsernder) - # max_wal_senders configuration for each coordinator. - -#---- Slave ------------- -coordSlave=y # Specify y if you configure at least one coordiantor slave. Otherwise, the following - # configuration parameters will be set to empty values. - # If no effective server names are found (that is, every servers are specified as none), - # then coordSlave value will be set to n and all the following values will be set to - # empty values. -coordSlaveSync=y # Specify to connect with synchronized mode. -coordSlaveServers=(node07 node08 node09 node06) # none means this slave is not available -coordSlaveDirs=($coordSlaveDir $coordSlaveDir $coordSlaveDir $coordSlaveDir) -coordArchLogDirs=($coordArchLogDir $coordArchLogDir $coordArchLogDir $coordArchLogDir) - -#---- Configuration files--- -# Need these when you'd like setup specific non-default configuration -# These files will go to corresponding files for the master. -# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries -# Or you may supply these files manually. -coordExtraConfig=none # Extra configuration file for coordinators. This file will be added to all the coordinators' - # postgresql.conf -coordSpecificExraConfig=(none none none none) -coordExtraPgHba=none # Extra entry for pg_hba.conf. This file will be added to all the coordinators' pg_hba.conf -coordSpecificExtraPgHba=(none none none none) - -#----- Additional Slaves ----- -coordAdditionalSlaves=n # Additional slave can be specified as follows: where you -coordAdditionalSlaveSet=(cad1) # Each specifies set of slaves. This case, two set of slaves are - # configured -cad1_Sync=n # All the slaves at "cad1" are connected with asynchronous mode. - # If not, specify "y" - # The following lines specifies detailed configuration for each - # slave tag, cad1. You can define cad2 similarly. -cad1_Servers=(node08 node09 node06 node07) # Hosts -cad1_dir=$HOME/pgxc/nodes/coord_slave_cad1 -cad1_Dirs=($cad1_dir $cad1_dir $cad1_dir $cad1_dir) -cad1_ArchLogDir=$HOME/pgxc/nodes/coord_archlog_cad1 -cad1_ArchLogDirs=($cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir) - - -#---- Datanodes ------------------------------------------------------------------------------------------------------- - -#---- Shortcuts -------------- -datanodeMasterDir=$HOME/pgxc/nodes/dn_master -datanodeSlaveDir=$HOME/pgxc/nodes/dn_slave -datanodeArchLogDir=$HOME/pgxc/nodes/datanode_archlog - -#---- Overall --------------- -#primaryDatanode=datanode1 # Primary Node. -# At present, xc has a priblem to issue ALTER NODE against the primay node. Until it is fixed, the test will be done -# without this feature. -primaryDatanode=datanode1 # Primary Node. -datanodeNames=(datanode1 datanode2 datanode3 datanode4) -datanodePorts=(20008 20009 20008 20009) # Master and slave use the same port! -datanodePgHbaEntries=(192.168.1.0/24) # Assumes that all the coordinator (master/slave) accepts - # the same connection - # This list sets up pg_hba.conf for $pgxcOwner user. - # If you'd like to setup other entries, supply them - # through extra configuration files specified below. -# Note: The above parameter is extracted as "host all all 0.0.0.0/0 trust". If you don't want -# such setups, specify the value () to this variable and suplly what you want using datanodeExtraPgHba -# and/or datanodeSpecificExtraPgHba variables. - -#---- Master ---------------- -datanodeMasterServers=(node06 node07 node08 node09) # none means this master is not available. - # This means that there should be the master but is down. - # The cluster is not operational until the master is - # recovered and ready to run. -datanodeMasterDirs=($datanodeMasterDir $datanodeMasterDir $datanodeMasterDir $datanodeMasterDir) -datanodeMaxWalSender=5 # max_wal_senders: needed to configure slave. If zero value is - # specified, it is expected this parameter is explicitly supplied - # by external configuration files. - # If you don't configure slaves, leave this value zero. -datanodeMaxWalSenders=($datanodeMaxWalSender $datanodeMaxWalSender $datanodeMaxWalSender $datanodeMaxWalSender) - # max_wal_senders configuration for each datanode - -#---- Slave ----------------- -datanodeSlave=y # Specify y if you configure at least one coordiantor slave. Otherwise, the following - # configuration parameters will be set to empty values. - # If no effective server names are found (that is, every servers are specified as none), - # then datanodeSlave value will be set to n and all the following values will be set to - # empty values. -datanodeSlaveServers=(node07 node08 node09 node06) # value none means this slave is not available -datanodeSlaveDirs=($datanodeSlaveDir $datanodeSlaveDir $datanodeSlaveDir $datanodeSlaveDir) -datanodeArchLogDirs=( $datanodeArchLogDir $datanodeArchLogDir $datanodeArchLogDir $datanodeArchLogDir ) - -# ---- Configuration files --- -# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries here. -# These files will go to corresponding files for the master. -# Or you may supply these files manually. -datanodeExtraConfig=none # Extra configuration file for datanodes. This file will be added to all the - # datanodes' postgresql.conf -datanodeSpecificExtraConfig=(none none none none) -datanodeExtraPgHba=none # Extra entry for pg_hba.conf. This file will be added to all the datanodes' postgresql.conf -datanodeSpecificExtraPgHba=(none none none none) - -#----- Additional Slaves ----- -datanodeAdditionalSlaves=n # Additional slave can be specified as follows: where you -# datanodeAdditionalSlaveSet=(dad1 dad2) # Each specifies set of slaves. This case, two set of slaves are - # configured -# dad1_Sync=n # All the slaves at "cad1" are connected with asynchronous mode. - # If not, specify "y" - # The following lines specifies detailed configuration for each - # slave tag, cad1. You can define cad2 similarly. -# dad1_Servers=(node08 node09 node06 node07) # Hosts -# dad1_dir=$HOME/pgxc/nodes/coord_slave_cad1 -# dad1_Dirs=($cad1_dir $cad1_dir $cad1_dir $cad1_dir) -# dad1_ArchLogDir=$HOME/pgxc/nodes/coord_archlog_cad1 -# dad1_ArchLogDirs=($cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir) - -#---- WAL archives ------------------------------------------------------------------------------------------------- -walArchive=n # If you'd like to configure WAL archive, edit this section. - # Pgxc_ctl assumes that if you configure WAL archive, you configure it - # for all the coordinators and datanodes. - # Default is "no". Please specify "y" here to turn it on. -# You can setup more than one backup set for various purposes, such as disaster recovery. -walArchiveSet=(war1 war2) -war1_source=(master) # you can specify master, slave or ano other additional slaves as a source of WAL archive. - # Default is the master -wal1_source=(slave) -wal1_source=(additiona_coordinator_slave_set additional_datanode_slave_set) -war1_host=node10 # All the nodes are backed up at the same host for a given archive set -war1_backupdir=$HOME/pgxc/backup_war1 -wal2_source=(master) -war2_host=node11 -war2_backupdir=$HOME/pgxc/backup_war2 -# -# End of Configuration Section -# -#========================================================================================================================== - -# Common variables ###################################################################### -xc_prompt='PGXC$ ' -interactive=n -verbose=n -progname=$0 -bin=pgxc_ctl # Just in case. Never touch this -logfile=none - -# Create config file template -# -# If you change the structure of configuration file section, you must reflect the change in the part below. -# -function create_config_file_template -{ - cat > $configFile <<EOF -#!/bin/bash -# -# TODO -# * Backup configuration file (at update, too) to some remote site for pgxc_ctl HA feature too. -# * Write output of *_ctl, intdb and intgtm result to log files -# * Write every operation to the log. Log file can be specified with --l file or --log file -# * Configure log level -# * Switch log log file -# * Log option to the configuration file so that this can be failed over. -# * Log to a remote server? -# * Multiple log? -# -# Configuration file. Configuration file can be specified as -c option of -# the command like, or PGXCCONFIG environment variable. If both are -# not specified, the following configuration file will be used. -# -# Change in the cluster status due to failover will be added to the configuration file so that -# new master can be invoked as the master when restarted. -# -# All such addition will be tagged with proper comment and date/time info. If you'd like to -# cancel such changes, you can remove or comment-out such additional lines. -# -# -#========================================================================================================================== -# -# Configuration Section -# -# This section should be in the file $configFile for -# user's configuration. -# -# Several assumptons: -# 1) configuration file will be set to data directory. -# configuration file name is fixed to postgresql.conf -# 2) pg_hba.conf will be set to data directory. File name is -# fixed to pg_hba.conf -# -#================================================================ -# MEMO -# -# max_connections, min_pool_size, max_pool_size --> should be configurable! -# They're not cluster specific. So we may give a chance to include -# these specific options to be included from external files. -# They should not change by failover so they just have to be -# configured at first time only. -#=============================================================== -# -# -#---- Home dir of pgxc_ctl -pgxc_ctl_home=$HOME/.pgxc_ctl -#---- Configuration File -pgxcInstallDir=$HOME/pgxc -configFile=$pgxcInstallDir/pgxcConf -#---- OVERALL ----------------------------------------------------------------------------------------------------------- -# -pgxcOwner=pgxc # owner of the Postgres-XC database cluster. Here, we use this - # both as linus user and database user. This must be - # the super user of each coordinator and datanode. -pgxcUser=$pgxcOwner # OS user of Postgres-XC owner - -tmpDir=/tmp # temporary dir used in XC servers -localTmpDir=$tmpDir # temporary dir used here locally - -logOpt=y # If you want log -logDir=$pgxc_ctl_home/pgxc_ctl_log # Directory to write pgxc_ctl logs - -configBackup=y # If you want config file backup -configBackupHost=pgxc-linker # host to backup config file -configBackupDir=$pgxcInstallDir -configBackupFile=`basename $configFile` # Backup file name --> Need to synchronize when original changed. - -#---- GTM -------------------------------------------------------------------------------------------------------------- - -# GTM is mandatory. You must have at least (and only) one GTM master in your Postgres-XC cluster. -# If GTM crashes and you need to reconfigure it, you can do it by pgxc_update_gtm command to update -# GTM master with others. Of course, we provide pgxc_remove_gtm command to remove it. This command -# will not stop the current GTM. It is up to the operator. - -#---- Overall ------- -gtmName=gtm - -#---- GTM Master ----------------------------------------------- - -#---- Overall ---- -gtmMasterServer=node13 -gtmMasterPort=20001 -gtmMasterDir=$HOME/pgxc/nodes/gtm - -#---- Configuration --- -gtmExtraConfig=none # Will be added gtm.conf for both Master and Slave (done at initilization only) -gtmMasterSpecificExtraConfig=none # Will be added to Master's gtm.conf (done at initialization only) - -#---- GTM Slave ----------------------------------------------- - -# Because GTM is a key component to maintain database consistency, you may want to configure GTM slave -# for backup. - -#---- Overall ------ -gtmSlave=y # Specify y if you configure GTM Slave. Otherwise, GTM slave will not be configured and - # all the following variables will be reset. -gtmSlaveServer=node12 # value none means GTM slave is not available. Give none if you don't configure GTM Slave. -gtmSlavePort=20001 # Not used if you don't configure GTM slave. -gtmSlaveDir=$HOME/pgxc/nodes/gtm # Not used if you don't configure GTM slave. -# Please note that when you have GTM failover, then there will be no slave available until you configure the slave -# again. (pgxc_add_gtm_slave function will handle it) - -#---- Configuration ---- -gtmSlaveSpecificExtraConfig=none # Will be added to Slave's gtm.conf (done at initialization only) - -#---- GTM Proxy ------------------------------------------------------------------------------------------------------- -# GTM proxy will be selected based upon which server each component runs on. -# When fails over to the slave, the slave inherits its master's gtm proxy. It should be -# reconfigured based upon the new location. -# -# To do so, slave should be restarted. So pg_ctl promote -> (edit postgresql.conf and recovery.conf) -> pg_ctl restart -# -# You don't have to configure GTM Proxy if you dont' configure GTM slave or you are happy if every component connects -# to GTM Master directly. If you configure GTL slave, you must configure GTM proxy too. - -#---- Shortcuts ------ -gtmProxyDir=$HOME/pgxc/nodes/gtm_pxy - -#---- Overall ------- -gtmProxy=y # Specify y if you conifugre at least one GTM proxy. You may not configure gtm proxies - # only when you dont' configure GTM slaves. - # If you specify this value not to y, the following parameters will be set to default empty values. - # If we find there're no valid Proxy server names (means, every servers are specified - # as none), then gtmProxy value will be set to "n" and all the entries will be set to - # empty values. -gtmProxyNames=(gtm_pxy1 gtm_pxy2 gtm_pxy3 gtm_pxy4) # No used if it is not configured -gtmProxyServers=(node06 node07 node08 node09) # Specify none if you dont' configure it. -gtmProxyPorts=(20001 20001 20001 20001) # Not used if it is not configured. -gtmProxyDirs=($gtmProxyDir $gtmProxyDir $gtmProxyDir $gtmProxyDir) # Not used if it is not configured. - -#---- Configuration ---- -gtmPxyExtraConfig=none # Extra configuration parameter for gtm_proxy -gtmPxySpecificExtraConfig=(none none none none) - -#---- Coordinators ---------------------------------------------------------------------------------------------------- - -#---- shortcuts ---------- -coordMasterDir=$HOME/pgxc/nodes/coord -coordSlaveDir=$HOME/pgxc/nodes/coord_slave -coordArchLogDir=$HOME/pgxc/nodes/coord_archlog - -#---- Overall ------------ -coordNames=(coord1 coord2 coord3 coord4) # Master and slave use the same name -coordPorts=(20004 20005 20004 20005) # Master and slave use the same port -poolerPorts=(20010 20011 20010 20011) # Master and slave use the same pooler port -coordPgHbaEntries=(192.168.1.0/24) # Assumes that all the coordinator (master/slave) accepts - # the same connection - # This entry allows only $pgxcOwner to connect. - # If you'd like to setup another connection, you should - # supply these entries through files specified below. -# Note: The above parameter is extracted as "host all all 0.0.0.0/0 trust". If you don't want -# such setups, specify the value () to this variable and suplly what you want using coordExtraPgHba -# and/or coordSpecificExtraPgHba variables. - -#---- Master ------------- -coordMasterServers=(node06 node07 node08 node09) # none means this master is not available -coordMasterDirs=($coordMasterDir $coordMasterDir $coordMasterDir $coordMasterDir) -coordMaxWALsernder=5 # max_wal_senders: needed to configure slave. If zero value is specified, - # it is expected to supply this parameter explicitly by external files - # specified in the following. If you don't configure slaves, leave this value to zero. -coordMaxWALSenders=($coordMaxWALsernder $coordMaxWALsernder $coordMaxWALsernder $coordMaxWALsernder) - # max_wal_senders configuration for each coordinator. - -#---- Slave ------------- -coordSlave=y # Specify y if you configure at least one coordiantor slave. Otherwise, the following - # configuration parameters will be set to empty values. - # If no effective server names are found (that is, every servers are specified as none), - # then coordSlave value will be set to n and all the following values will be set to - # empty values. -coordSlaveSync=y # Specify to connect with synchronized mode. -coordSlaveServers=(node07 node08 node09 node06) # none means this slave is not available -coordSlaveDirs=($coordSlaveDir $coordSlaveDir $coordSlaveDir $coordSlaveDir) -coordArchLogDirs=($coordArchLogDir $coordArchLogDir $coordArchLogDir $coordArchLogDir) - -#---- Configuration files--- -# Need these when you'd like setup specific non-default configuration -# These files will go to corresponding files for the master. -# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries -# Or you may supply these files manually. -coordExtraConfig=none # Extra configuration file for coordinators. This file will be added to all the coordinators' - # postgresql.conf -coordSpecificExraConfig=(none none none none) -coordExtraPgHba=none # Extra entry for pg_hba.conf. This file will be added to all the coordinators' pg_hba.conf -coordSpecificExtraPgHba=(none none none none) - -#----- Additional Slaves ----- -coordAdditionalSlaveSet=n # Additional slave can be specified as follows: where you -# coordAdditionalSlaveSet=(cad1 cad2) # Each specifies set of slaves. This case, two set of slaves are - # configured -# cad1_Sync=n # All the slaves at "cad1" are connected with asynchronous mode. - # If not, specify "y" - # The following lines specifies detailed configuration for each - # slave tag, cad1. You can define cad2 similarly. -# cad1_Servers=(node08 node09 node06 node07) # Hosts -# cad1_dir=$HOME/pgxc/nodes/coord_slave_cad1 -# cad1_Dirs=($cad1_dir $cad1_dir $cad1_dir $cad1_dir) -# cad1_ArchLogDir=$HOME/pgxc/nodes/coord_archlog_cad1 -# cad1_ArchLogDirs=($cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir) - - -#---- Datanodes ------------------------------------------------------------------------------------------------------- - -#---- Shortcuts -------------- -datanodeMasterDir=$HOME/pgxc/nodes/dn_master -datanodeSlaveDir=$HOME/pgxc/nodes/dn_slave -datanodeArchLogDir=$HOME/pgxc/nodes/datanode_archlog - -#---- Overall --------------- -#primaryDatanode=datanode1 # Primary Node. -# At present, xc has a priblem to issue ALTER NODE against the primay node. Until it is fixed, the test will be done -# without this feature. -primaryDatanode=datanode1 # Primary Node. -datanodeNames=(datanode1 datanode2 datanode3 datanode4) -datanodePorts=(20008 20009 20008 20009) # Master and slave use the same port! -datanodePgHbaEntries=(192.168.1.0/24) # Assumes that all the coordinator (master/slave) accepts - # the same connection - # This list sets up pg_hba.conf for $pgxcOwner user. - # If you'd like to setup other entries, supply them - # through extra configuration files specified below. -# Note: The above parameter is extracted as "host all all 0.0.0.0/0 trust". If you don't want -# such setups, specify the value () to this variable and suplly what you want using datanodeExtraPgHba -# and/or datanodeSpecificExtraPgHba variables. - -#---- Master ---------------- -datanodeMasterServers=(node06 node07 node08 node09) # none means this master is not available. - # This means that there should be the master but is down. - # The cluster is not operational until the master is - # recovered and ready to run. -datanodeMasterDirs=($datanodeMasterDir $datanodeMasterDir $datanodeMasterDir $datanodeMasterDir) -datanodeMaxWalSender=5 # max_wal_senders: needed to configure slave. If zero value is - # specified, it is expected this parameter is explicitly supplied - # by external configuration files. - # If you don't configure slaves, leave this value zero. -datanodeMaxWalSenders=($datanodeMaxWalSender $datanodeMaxWalSender $datanodeMaxWalSender $datanodeMaxWalSender) - # max_wal_senders configuration for each datanode - -#---- Slave ----------------- -datanodeSlave=y # Specify y if you configure at least one coordiantor slave. Otherwise, the following - # configuration parameters will be set to empty values. - # If no effective server names are found (that is, every servers are specified as none), - # then datanodeSlave value will be set to n and all the following values will be set to - # empty values. -datanodeSlaveServers=(node07 node08 node09 node06) # value none means this slave is not available -datanodeSlaveDirs=($datanodeSlaveDir $datanodeSlaveDir $datanodeSlaveDir $datanodeSlaveDir) -datanodeArchLogDirs=( $datanodeArchLogDir $datanodeArchLogDir $datanodeArchLogDir $datanodeArchLogDir ) - -# ---- Configuration files --- -# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries here. -# These files will go to corresponding files for the master. -# Or you may supply these files manually. -datanodeExtraConfig=none # Extra configuration file for datanodes. This file will be added to all the - # datanodes' postgresql.conf -datanodeSpecificExtraConfig=(none none none none) -datanodeExtraPgHba=none # Extra entry for pg_hba.conf. This file will be added to all the datanodes' postgresql.conf -datanodeSpecificExtraPgHba=(none none none none) - -#----- Additional Slaves ----- -datanodeAdditionalSlaveSet=n # Additional slave can be specified as follows: where you -# datanodeAdditionalSlaveSet=(dad1 dad2) # Each specifies set of slaves. This case, two set of slaves are - # configured -# dad1_Sync=n # All the slaves at "cad1" are connected with asynchronous mode. - # If not, specify "y" - # The following lines specifies detailed configuration for each - # slave tag, cad1. You can define cad2 similarly. -# dad1_Servers=(node08 node09 node06 node07) # Hosts -# dad1_dir=$HOME/pgxc/nodes/coord_slave_cad1 -# dad1_Dirs=($cad1_dir $cad1_dir $cad1_dir $cad1_dir) -# dad1_ArchLogDir=$HOME/pgxc/nodes/coord_archlog_cad1 -# dad1_ArchLogDirs=($cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir $cad1_ArchLogDir) - -#---- WAL archives ------------------------------------------------------------------------------------------------- -walArchive=n # If you'd like to configure WAL archive, edit this section. - # Pgxc_ctl assumes that if you configure WAL archive, you configure it - # for all the coordinators and datanodes. - # Default is "no". Please specify "y" here to turn it on. -# You can setup more than one backup set for various purposes, such as disaster recovery. -walArchiveSet=(war1 war2) -war1_source=master # you can specify master, slave or ano other additional slaves as a source of WAL archive. - # Default is the master -wal1_source=slave -wal1_source=(additiona_coordinator_slave_set additional_datanode_slave_set) -war1_host=node10 # All the nodes are backed up at the same host for a given archive set -war1_backupdir=$HOME/pgxc/backup_war1 -wal2_source=master -war2_host=node11 -war2_backupdir=$HOME/pgxc/backup_war2 -# -# End of Configuration Section -# -#========================================================================================================================== -EOF - chmod +x $configFile -} - - -#=========================================================== -# -# Extract parsed configuration values -# -#=========================================================== - -# $1 is variable name of the array to print -function print_array -{ - echo -n $1 " " - eval echo '$'{$1[@]} -} - - -function print_values -{ - local i - declare -i i - local el - - # Home - echo pgxc_ctl_home $pgxc_ctl_home - echo pgxcInstallDir $pgxcInstallDir - echo configFile $configFile - - # Overall - echo pgxcOwner $pgxcOwner - echo pgxcUser $pgxcUser - echo tmpDir $tmpDir - echo localTmpDir $localTmpDir - echo logOpt $logOpt - echo logDir $logDir - echo configBackup $configBackup - echo configBackupHost $configBackupHost - echo configBackupDir $configBackupDir - echo configBackupFile $configBackupFile - - # GTM overall - echo gtmName $gtmName - - # GTM master - echo gtmMasterServer $gtmMasterServer - echo gtmMasterPort $gtmMasterPort - echo gtmMasterDir $gtmMasterDir - echo gtmExtraConfig $gtmExtraConfig - echo gtmMasterSpecificExtraConfig $gtmMasterSpecificExtraConfig - - # GTM slave - echo gtmSlave $gtmSlave - echo gtmSlaveServer $gtmSlaveServer - echo gtmSlavePort $gtmSlavePort - echo gtmSlaveDir $gtmSlaveDir - echo gtmSlaveSpecificExtraConfig $gtmSlaveSpecificExtraConfig - - # GTM Proxy - echo gtmProxy $gtmProxy - print_array gtmProxyNames - print_array gtmProxyServers - print_array gtmProxyPorts - print_array gtmProxyDirs - echo gtmPxyExtraConfig $gtmPxyExtraConfig - print_array gtmPxySpecificExtraConfig - - # Coordinators overall - print_array coordNames - print_array coordPorts - print_array poolerPorts - print_array coordPgHbaEntries - - # Coordinators master - print_array coordMasterServers - print_array coordMasterDirs - print_array coordMaxWALSenders - - # Coordinators slave - echo coordSlave $coordSlave - echo coordSlaveSync $coordSlaveSync - print_array coordSlaveDirs - print_array coordArchLogDirs - - # Coordinator Configuration files - echo coordExtraConfig $coordExtraConfig - print_array coordSpecificExraConfig - echo coordExtraPgHba $coordExtraPgHba - print_array coordSpecificExtraPgHba - - # Coordinator Additional Slaves - echo coordAdditionalSlaves $coordAdditionalSlaves - if [ $coordAdditionalSlaves == "y" ]; then - print_array coordAdditionalSlaveSet - for ((i=0; i<${#coordAdditionalSlaveSet[@]}; i++)); do - el=${coordAdditionalSlaveSet[$i]} - echo -n ${el}_Sync " " - eval echo '$'"$el"_Sync - print_array ${el}_Servers - print_array ${el}_Dirs - print_array ${el}_ArchLogDirs - done - fi - - # Datanodes overall - echo primaryDatanode $primaryDatanode - print_array datanodeNames - print_array datanodePorts - print_array datanodePgHbaEntries - - # Datanodes masters - print_array datanodeMasterServers - print_array datanodeMasterDirs - print_array datanodeMaxWalSenders - - # Datanodes slaves - echo datanodeSlave $datanodeSlave - print_array datanodeSlaveServers - print_array datanodeSlaveDirs - print_array datanodeArchLogDirs - - # Datanode configuration files - echo datanodeExtraConfig $datanodeExtraConfig - print_array datanodeSpecificExtraConfig - echo datanodeExtraPgHba $datanodeExtraPgHba - print_array datanodeSpecificExtraPgHba - - # Datanodes additional slaves - echo datanodeAdditionalSlaves $datanodeAdditionalSlaves - if [ $datanodeAdditionalSlaves == "y" ]; then - print_array datanodeAdditionalSlaveSet - for ((i=0; i<${#datanodeAdditionalSlaveSet[@]}; i++)); do - el=${datanodeAdditionalSlaveSet[$i]} - echo -n ${el}_Sync " " - eval echo '$'"$el"_Sync - print_array ${el}_Servers - print_array ${el}_Dirs - print_array ${el}_ArchLogDirs - done - fi - - # WAL Archives - echo walArchive $walArchive - print_array walArchiveSet - if [ $walArchive == "y" ]; then - for ((i=0; i<${#walArchvieSet[@]}; i++)); do - print_array ${el}_source - echo -n ${el}_host - eval echo '$'"$el"_host - echo -n ${el}_backupdir - eval echo '$'"$el"_backupdir - done - fi - - # Other options - echo xc_prompt $xc_prompt - echo verbose $verbose - echo bin $bin -} - - - -#============================================================ -# -# Common functions -# -#============================================================ - -# Optionally $1 will be $PGXC_CTL_HOME settings. -function set_home -{ - if [ $# > 1 ]; then - echo "Invalid set_home function call" - return 1 - fi - if [ $# == 1 ]; then - if [ -d $1 ]; then - pgxc_ctl_home=$1 - else - eecho "set_home: $1 is not a directory." - return 1 - fi - elif [ $PGXC_CTL_HOME != "" ]; then - if [ -d $PGXC_CTL_HOME ]; then - pgxc_ctl_home=$PGXC_CTL_HOME - else - eecho "set_home: env PGXC_CTL_HOME($PGXC_CTL_HOME) is not a directory." - return 1; - fi - fi - cd $pgxc_ctl_home; -} - -############################################################################### -# -# EXECUTING SECTION -# -############################################################################### - -#======================================================= -# Things to be done at first -#======================================================= - -# Handle options -progname=$0 -moretodo=y -cmd_with_log=null -#set_home -if [ -f $pgxc_ctl_home/.pgxc_ctl_rc ]; then - source $pgxc_ctl_home/.pgxc_ctl_rc -fi - -while [ $moretodo == y ]; do - if [ $# -gt 0 ]; then - case $1 in - -v ) - shift; - verbose=y; - continue;; - --verbose ) - shift; - verbose=y; - continue;; - --silent ) - verbose=n; - continue;; - -d ) # debug option - shift; - DEBUG=y; - continue;; - --debug ) - shift; - DEBUG=y; - continue;; - -c ) # Configuraton file - shift; - if [ $# -le 0 ]; then - echo ERROR: no -c option value found - exit 1 - else - configFile=$1 - shift - fi; - continue;; - --configuration ) # Configuraion file - shift; - if [ $# -le 0 ]; then - echo ERROR: no --configuration option value found - exit 1 - else - configFile=$1 - shift - fi; - continue;; - --home ) # PGXC_CTL_HOME - shift; - if [ $# -le 0 ]; then - echo ERROR: no pgxc_ctl_home specified - exit 1 - else - pgxc_ctl_home=$1 - cd $pgxc_ctl_home - shift - fi; - continue;; - * ) - moretodo=n - continue;; - esac - else - moretodo=n - fi -done - -# Read configuration file --> Should be activated only when debug option is off -if [ -f $configFile ]; then - source $configFile -fi -# Log option can be overriden by command-line option - -print_values - diff --git a/contrib/pgxc_ctl/pgxc_ctl_bash_2 b/contrib/pgxc_ctl/pgxc_ctl_bash_2 index 21839eae46..804faa2f69 100755 --- a/contrib/pgxc_ctl/pgxc_ctl_bash_2 +++ b/contrib/pgxc_ctl/pgxc_ctl_bash_2 @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Common variables ###################################################################### xc_prompt='PGXC$ ' interactive=n @@ -53,6 +53,7 @@ function print_values # GTM slave echo gtmSlave $gtmSlave + echo gtmSlaveName $gtmSlaveName echo gtmSlaveServer $gtmSlaveServer echo gtmSlavePort $gtmSlavePort echo gtmSlaveDir $gtmSlaveDir diff --git a/contrib/pgxc_ctl/pgxc_ctl_bash_conf_part b/contrib/pgxc_ctl/pgxc_ctl_bash_conf_part deleted file mode 100644 index e69de29bb2..0000000000 --- a/contrib/pgxc_ctl/pgxc_ctl_bash_conf_part +++ /dev/null diff --git a/contrib/pgxc_ctl/pgxc_ctl_conf_part b/contrib/pgxc_ctl/pgxc_ctl_conf_part_full index 9640dc9c41..a97e6b296c 100755 --- a/contrib/pgxc_ctl/pgxc_ctl_conf_part +++ b/contrib/pgxc_ctl/pgxc_ctl_conf_part_full @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # Postgres-XC Configuration file for pgxc_ctl utility. # @@ -51,7 +51,7 @@ pgxcInstallDir=$HOME/pgxc #---- OVERALL ----------------------------------------------------------------------------- # -pgxcOwner=koichi # owner of the Postgres-XC databaseo cluster. Here, we use this +pgxcOwner=$USER # owner of the Postgres-XC databaseo cluster. Here, we use this # both as linus user and database user. This must be # the super user of each coordinator and datanode. pgxcUser=$pgxcOwner # OS user of Postgres-XC owner @@ -71,12 +71,11 @@ configBackupFile=pgxc_ctl.bak # Backup file name --> Need to synchronize when or # GTM master with others. Of course, we provide pgxc_remove_gtm command to remove it. This command # will not stop the current GTM. It is up to the operator. -#---- Overall ------- -gtmName=gtm #---- GTM Master ----------------------------------------------- #---- Overall ---- +gtmName=gtm gtmMasterServer=node13 gtmMasterPort=20001 gtmMasterDir=$HOME/pgxc/nodes/gtm @@ -93,6 +92,7 @@ gtmMasterSpecificExtraConfig=none # Will be added to Master's gtm.conf (done at #---- Overall ------ gtmSlave=y # Specify y if you configure GTM Slave. Otherwise, GTM slave will not be configured and # all the following variables will be reset. +gtmSlaveName=gtmSlave gtmSlaveServer=node12 # value none means GTM slave is not available. Give none if you don't configure GTM Slave. gtmSlavePort=20001 # Not used if you don't configure GTM slave. gtmSlaveDir=$HOME/pgxc/nodes/gtm # Not used if you don't configure GTM slave. @@ -150,6 +150,7 @@ coordPgHbaEntries=(192.168.1.0/24) # Assumes that all the coordinator (master # Note: The above parameter is extracted as "host all all 0.0.0.0/0 trust". If you don't want # such setups, specify the value () to this variable and suplly what you want using coordExtraPgHba # and/or coordSpecificExtraPgHba variables. +#coordPgHbaEntries=(::1/128) # Same as above but for IPv6 addresses #---- Master ------------- coordMasterServers=(node06 node07 node08 node09) # none means this master is not available @@ -244,6 +245,7 @@ datanodePgHbaEntries=(192.168.1.0/24) # Assumes that all the coordinator (master # Note: The above parameter is extracted as "host all all 0.0.0.0/0 trust". If you don't want # such setups, specify the value () to this variable and suplly what you want using datanodeExtraPgHba # and/or datanodeSpecificExtraPgHba variables. +#datanodePgHbaEntries=(::1/128) # Same as above but for IPv6 addresses #---- Master ---------------- datanodeMasterServers=(node06 node07 node08 node09) # none means this master is not available. diff --git a/contrib/pgxc_ctl/pgxc_ctl_conf_part_minimal b/contrib/pgxc_ctl/pgxc_ctl_conf_part_minimal new file mode 100644 index 0000000000..432f3d2ec9 --- /dev/null +++ b/contrib/pgxc_ctl/pgxc_ctl_conf_part_minimal @@ -0,0 +1,267 @@ +#!/usr/bin/env bash +# +# Postgres-XC Configuration file for pgxc_ctl utility. +# +# Configuration file can be specified as -c option from pgxc_ctl command. Default is +# $PGXC_CTL_HOME/pgxc_ctl.org. +# +# This is bash script so you can make any addition for your convenience to configure +# your Postgres-XC cluster. +# +# Please understand that pgxc_ctl provides only a subset of configuration which pgxc_ctl +# provide. Here's several several assumptions/restrictions pgxc_ctl depends on. +# +# 1) All the resources of pgxc nodes has to be owned by the same user. Same user means +# user with the same user name. User ID may be different from server to server. +# This must be specified as a variable $pgxcOwner. +# +# 2) All the servers must be reacheable via ssh without password. It is highly recommended +# to setup key-based authentication among all the servers. +# +# 3) All the databases in coordinator/datanode has at least one same superuser. Pgxc_ctl +# uses this user to connect to coordinators and datanodes. Again, no password should +# be used to connect. You have many options to do this, pg_hba.conf, pg_ident.conf and +# others. Pgxc_ctl provides a way to configure pg_hba.conf but not pg_ident.conf. This +# will be implemented in the later releases. +# +# 4) Gtm master and slave can have different port to listen, while coordinator and datanode +# slave should be assigned the same port number as master. +# +# 5) Port nuber of a coordinator slave must be the same as its master. +# +# 6) Master and slave are connected using synchronous replication. Asynchronous replication +# have slight (almost none) chance to bring total cluster into inconsistent state. +# This chance is very low and may be negligible. Support of asynchronous replication +# may be supported in the later release. +# +# 7) Each coordinator and datanode can have only one slave each. Cascaded replication and +# multiple slave are not supported in the current pgxc_ctl. +# +# 8) Killing nodes may end up with IPC resource leak, such as semafor and shared memory. +# Only listening port (socket) will be cleaned with clean command. +# +# 9) Backup and restore are not supported in pgxc_ctl at present. This is a big task and +# may need considerable resource. +# +#======================================================================================== +# +# +# pgxcInstallDir variable is needed if you invoke "deploy" command from pgxc_ctl utility. +# If don't you don't need this variable. +pgxcInstallDir=$HOME/pgxc +#---- OVERALL ----------------------------------------------------------------------------- +# +pgxcOwner=$USER # owner of the Postgres-XC databaseo cluster. Here, we use this + # both as linus user and database user. This must be + # the super user of each coordinator and datanode. +pgxcUser=$pgxcOwner # OS user of Postgres-XC owner + +tmpDir=/tmp # temporary dir used in XC servers +localTmpDir=$tmpDir # temporary dir used here locally + +configBackup=n # If you want config file backup, specify y to this value. +configBackupHost=pgxc-linker # host to backup config file +configBackupDir=$HOME/pgxc # Backup directory +configBackupFile=pgxc_ctl.bak # Backup file name --> Need to synchronize when original changed. + +dataDirRoot=$HOME/DATA/pgxl/nodes + +#---- GTM ------------------------------------------------------------------------------------ + +# GTM is mandatory. You must have at least (and only) one GTM master in your Postgres-XC cluster. +# If GTM crashes and you need to reconfigure it, you can do it by pgxc_update_gtm command to update +# GTM master with others. Of course, we provide pgxc_remove_gtm command to remove it. This command +# will not stop the current GTM. It is up to the operator. + +#---- Overall ------- +gtmName=gtm + +#---- GTM Master ----------------------------------------------- + +#---- Overall ---- +gtmMasterServer=localhost +gtmMasterPort=20001 +gtmMasterDir=$dataDirRoot/gtm + +#---- Configuration --- +gtmExtraConfig=none # Will be added gtm.conf for both Master and Slave (done at initilization only) +gtmMasterSpecificExtraConfig=none # Will be added to Master's gtm.conf (done at initialization only) + +#---- GTM Slave ----------------------------------------------- + +# Because GTM is a key component to maintain database consistency, you may want to configure GTM slave +# for backup. + +#---- Overall ------ +gtmSlave=n # Specify y if you configure GTM Slave. Otherwise, GTM slave will not be configured and + # all the following variables will be reset. +gtmSlaveName=gtmSlave +gtmSlaveServer=localhost # value none means GTM slave is not available. Give none if you don't configure GTM Slave. +gtmSlavePort=20002 # Not used if you don't configure GTM slave. +gtmSlaveDir=$dataDirRoot/gtm_slv # Not used if you don't configure GTM slave. +# Please note that when you have GTM failover, then there will be no slave available until you configure the slave +# again. (pgxc_add_gtm_slave function will handle it) + +#---- Configuration ---- +#gtmSlaveSpecificExtraConfig=none # Will be added to Slave's gtm.conf (done at initialization only) + +#---- GTM Proxy ------------------------------------------------------------------------------------------------------- +# GTM proxy will be selected based upon which server each component runs on. +# When fails over to the slave, the slave inherits its master's gtm proxy. It should be +# reconfigured based upon the new location. +# +# To do so, slave should be restarted. So pg_ctl promote -> (edit postgresql.conf and recovery.conf) -> pg_ctl restart +# +# You don't have to configure GTM Proxy if you dont' configure GTM slave or you are happy if every component connects +# to GTM Master directly. If you configure GTL slave, you must configure GTM proxy too. + +#---- Shortcuts ------ +gtmProxyDir=$dataDirRoot/gtm_pxy + +#---- Overall ------- +gtmProxy=y # Specify y if you conifugre at least one GTM proxy. You may not configure gtm proxies + # only when you dont' configure GTM slaves. + # If you specify this value not to y, the following parameters will be set to default empty values. + # If we find there're no valid Proxy server names (means, every servers are specified + # as none), then gtmProxy value will be set to "n" and all the entries will be set to + # empty values. +gtmProxyNames=(gtm_pxy1) # No used if it is not configured +gtmProxyServers=(localhost) # Specify none if you dont' configure it. +gtmProxyPorts=(20101) # Not used if it is not configured. +gtmProxyDirs=($gtmProxyDir.1) # Not used if it is not configured. + +#---- Configuration ---- +gtmPxyExtraConfig=n # Extra configuration parameter for gtm_proxy. Coordinator section has an example. + +#---- Coordinators ---------------------------------------------------------------------------------------------------- + +#---- shortcuts ---------- +coordMasterDir=$dataDirRoot/coord_master +coordSlaveDir=$HOME/coord_slave +coordArchLogDir=$HOME/coord_archlog + +#---- Overall ------------ +coordNames=(coord1 coord2) # Master and slave use the same name +coordPorts=(30001 30002) # Master server listening ports +poolerPorts=(30011 30012) # Master pooler ports +coordPgHbaEntries=(::1/128) # Assumes that all the coordinator (master/slave) accepts + # the same connection + # This entry allows only $pgxcOwner to connect. + # If you'd like to setup another connection, you should + # supply these entries through files specified below. +#coordPgHbaEntries=(127.0.0.1/32) # Same as above but for IPv4 connections + +#---- Master ------------- +coordMasterServers=(localhost localhost) # none means this master is not available +coordMasterDirs=($coordMasterDir.1 $coordMasterDir.2) +coordMaxWALsender=5 # max_wal_senders: needed to configure slave. If zero value is specified, + # it is expected to supply this parameter explicitly by external files + # specified in the following. If you don't configure slaves, leave this value to zero. +coordMaxWALSenders=($coordMaxWALsender $coordMaxWALsender) + # max_wal_senders configuration for each coordinator. + +#---- Slave ------------- +coordSlave=n # Specify y if you configure at least one coordiantor slave. Otherwise, the following + # configuration parameters will be set to empty values. + # If no effective server names are found (that is, every servers are specified as none), + # then coordSlave value will be set to n and all the following values will be set to + # empty values. +coordSlaveSync=y # Specify to connect with synchronized mode. +coordSlaveServers=(localhost localhost) # none means this slave is not available +coordSlavePorts=(30101 30102) # coordinator slave listening ports +coordSlavePoolerPorts=(30111 30112) # coordinator slave pooler ports +coordSlaveDirs=($coordSlaveDir.1 $coordSlaveDir.2) +coordArchLogDirs=($coordArchLogDir.1 $coordArchLogDir.2) + +#---- Configuration files--- +# Need these when you'd like setup specific non-default configuration +# These files will go to corresponding files for the master. +# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries +# Or you may supply these files manually. +coordExtraConfig=coordExtraConfig # Extra configuration file for coordinators. + # This file will be added to all the coordinators' + # postgresql.conf +# Pleae note that the following sets up minimum parameters which you may want to change. +# You can put your postgresql.conf lines here. +cat > $coordExtraConfig <<EOF +#================================================ +# Added to all the coordinator postgresql.conf +# Original: $coordExtraConfig +log_destination = 'stderr' +logging_collector = on +log_directory = 'pg_log' +listen_addresses = '*' +max_connections = 100 +hot_standby = off +EOF + +# Additional Configuration file for specific coordinator master. +# You can define each setting by similar means as above. +coordSpecificExtraConfig=(none none) +coordSpecificExtraPgHba=(none none) + +#---- Datanodes ------------------------------------------------------------------------------------------------------- + +#---- Shortcuts -------------- +datanodeMasterDir=$dataDirRoot/dn_master +datanodeSlaveDir=$dataDirRoot/dn_slave +datanodeArchLogDir=$dataDirRoot/datanode_archlog + +#---- Overall --------------- +primaryDatanode=datanode_1 # Primary Node. +datanodeNames=(datanode_1 datanode_2) +datanodePorts=(40001 40002) # Master and slave use the same port! +datanodePoolerPorts=(40011 40012) # Master and slave use the same port! +datanodePgHbaEntries=(::1/128) # Assumes that all the coordinator (master/slave) accepts + # the same connection + # This list sets up pg_hba.conf for $pgxcOwner user. + # If you'd like to setup other entries, supply them + # through extra configuration files specified below. +#datanodePgHbaEntries=(127.0.0.1/32) # Same as above but for IPv4 connections + +#---- Master ---------------- +datanodeMasterServers=(localhost localhost) # none means this master is not available. + # This means that there should be the master but is down. + # The cluster is not operational until the master is + # recovered and ready to run. +datanodeMasterDirs=($datanodeMasterDir.1 $datanodeMasterDir.2) +datanodeMaxWalSender=5 # max_wal_senders: needed to configure slave. If zero value is + # specified, it is expected this parameter is explicitly supplied + # by external configuration files. + # If you don't configure slaves, leave this value zero. +datanodeMaxWALSenders=($datanodeMaxWalSender $datanodeMaxWalSender) + # max_wal_senders configuration for each datanode + +#---- Slave ----------------- +#datanodeSlave=n # Specify y if you configure at least one coordiantor slave. Otherwise, the following + # configuration parameters will be set to empty values. + # If no effective server names are found (that is, every servers are specified as none), + # then datanodeSlave value will be set to n and all the following values will be set to + # empty values. +#datanodeSlaveServers=(localhost localhost) # value none means this slave is not available +#datanodeSlavePorts=(40101 40102) # Master and slave use the same port! +#datanodeSlavePoolerPorts=(40111 40112) # Master and slave use the same port! +#datanodeSlaveSync=y # If datanode slave is connected in synchronized mode +#datanodeSlaveDirs=($datanodeSlaveDir.1 $datanodeSlaveDir.2) +#datanodeArchLogDirs=( $datanodeArchLogDir.1 $datanodeArchLogDir.2) + +# ---- Configuration files --- +# You may supply your bash script to setup extra config lines and extra pg_hba.conf entries here. +# These files will go to corresponding files for the master. +# Or you may supply these files manually. +datanodeExtraConfig=datanodeExtraConfig +cat > $datanodeExtraConfig <<EOF +#================================================ +# Added to all the datanode postgresql.conf +# Original: $datanodeExtraConfig +log_destination = 'stderr' +logging_collector = on +log_directory = 'pg_log' +listen_addresses = '*' +max_connections = 100 +hot_standby = off +EOF +# Additional Configuration file for specific datanode master. +# You can define each setting by similar means as above. +datanodeSpecificExtraConfig=(none none) +datanodeSpecificExtraPgHba=(none none) diff --git a/contrib/pgxc_ctl/signature.h b/contrib/pgxc_ctl/signature.h deleted file mode 100644 index 4268c99d7b..0000000000 --- a/contrib/pgxc_ctl/signature.h +++ /dev/null @@ -1,15 +0,0 @@ -/*------------------------------------------------------------------------- - * - * signature.h - * - * Signature of module of Postgres-XC configuration and operation tool. - * - * Copyright (c) 2013 Postgres-XC Development Group - * - *------------------------------------------------------------------------- - */ -#ifndef SIGNATURE_H -#define SIGNATURE_H -/* Signature file to identify the make */ -#define signature "140731_1647_N" -#endif /* SIGNATURE_H */ |