容器化部署支持一主多备

This commit is contained in:
xue_meng_en
2024-06-18 09:46:09 +08:00
committed by yaoxin
parent 6f187b8c4d
commit c9694c7c6b
2 changed files with 142 additions and 58 deletions

View File

@ -274,13 +274,13 @@ opengauss_setup_postgresql_conf() {
echo "password_encryption_type = 0"
echo "wal_level = logical"
fi
echo "application_name = '$NODE_NAME'"
if [ -n "$SERVER_MODE" ]; then
echo "listen_addresses = '0.0.0.0'"
echo "most_available_sync = on"
echo "remote_read_mode = non_authentication"
echo "pgxc_node_name = '$NODE_NAME'"
# echo "application_name = '$NODE_NAME'"
if [ "$SERVER_MODE" = "primary" ]; then
echo "max_connections = 100"
else
@ -313,7 +313,7 @@ docker_temp_server_start() {
PGUSER="${PGUSER:-$GS_USER}" \
gs_ctl -D "$PGDATA" \
-w start
-w start $@
}
# stop postgresql server after done setting up user and running scripts

View File

@ -24,53 +24,106 @@
#set OG_SUBNET,GS_PASSWORD,MASTER_IP,SLAVE_1_IP,MASTER_HOST_PORT,MASTER_LOCAL_PORT,SLAVE_1_HOST_PORT,SLAVE_1_LOCAL_PORT,MASTER_NODENAME,SLAVE_NODENAME
read -p "Please input OG_SUBNET (容器所在网段) [172.11.0.0/24]: " OG_SUBNET
OG_SUBNET=${OG_SUBNET:-172.11.0.0/24}
# Define default values
NETWORK_NAME="opengaussnetwork"
OG_SUBNET="172.11.0.0/24"
GS_PASSWORD="Enmo@123"
MASTER_IP="172.11.0.101"
MASTER_HOST_PORT="5432"
MASTER_NODENAME="dn_6001"
VERSION="5.0.0"
# Define default values for slaves
SLAVE_IP=("172.11.0.102" "172.11.0.103" "172.11.0.104" "172.11.0.105" "172.11.0.106" "172.11.0.107" "172.11.0.108" "172.11.0.109")
SLAVE_HOST_PORT=("6432" "7432" "8432" "9432" "10432" "11432" "12432" "13432")
SLAVE_NODENAME=("dn_6002" "dn_6003" "dn_6004" "dn_6005" "dn_6006" "dn_6007" "dn_6008" "dn_6009")
SLAVE_COUNT=1
ARGS=$(getopt -o h --long OG_SUBNET:,GS_PASSWORD:,MASTER_IP:,MASTER_HOST_PORT:,MASTER_LOCAL_PORT:,MASTER_NODENAME:,VERSION:,SLAVE_COUNT:,NETWORK_NAME: -- "$@")
if [ $? != 0 ]; then
echo "参数解析错误"
exit 1
fi
eval set -- "$ARGS"
# Use getopts to process command line arguments
while true; do
case "$1" in
-h)
echo "Usage: $0 [--OG_SUBNET value] [--GS_PASSWORD value] [--MASTER_IP value] [--MASTER_HOST_PORT value] [--MASTER_NODENAME value] [--VERSION value] [--SLAVE_COUNT value] [--SLAVE_NODENAME value] [--SLAVE_IP value] [--SLAVE_HOST_PORT value] [--NETWORK_NAME value]"
shift
;;
--OG_SUBNET)
OG_SUBNET="$2"
shift 2
;;
--GS_PASSWORD)
GS_PASSWORD="$2"
shift 2
;;
--MASTER_IP)
MASTER_IP="$2"
shift 2
;;
--MASTER_HOST_PORT)
MASTER_HOST_PORT="$2"
shift 2
;;
--MASTER_LOCAL_PORT)
MASTER_LOCAL_PORT="$2"
shift 2
;;
--MASTER_NODENAME)
MASTER_NODENAME="$2"
shift 2
;;
--VERSION)
VERSION="$2"
shift 2
;;
--SLAVE_COUNT)
SLAVE_COUNT="$2"
shift 2
;;
--NETWORK_NAME)
NETWORK_NAME="$2"
shift 2
;;
--)
shift
break
;;
*)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
# Output the set values
echo "OG_SUBNET set $OG_SUBNET"
read -p "Please input GS_PASSWORD (定义数据库密码)[Enmo@123]: " GS_PASSWORD
GS_PASSWORD=${GS_PASSWORD:-Enmo@123}
echo "GS_PASSWORD set $GS_PASSWORD"
read -p "Please input MASTER_IP (主库IP)[172.11.0.101]: " MASTER_IP
MASTER_IP=${MASTER_IP:-172.11.0.101}
echo "MASTER_IP set $MASTER_IP"
read -p "Please input SLAVE_1_IP (备库IP)[172.11.0.102]: " SLAVE_1_IP
SLAVE_1_IP=${SLAVE_1_IP:-172.11.0.102}
echo "SLAVE_1_IP set $SLAVE_1_IP"
read -p "Please input MASTER_HOST_PORT (主库数据库服务端口)[5432]: " MASTER_HOST_PORT
MASTER_HOST_PORT=${MASTER_HOST_PORT:-5432}
echo "MASTER_HOST_PORT set $MASTER_HOST_PORT"
read -p "Please input MASTER_LOCAL_PORT (主库通信端口)[5434]: " MASTER_LOCAL_PORT
MASTER_LOCAL_PORT=${MASTER_LOCAL_PORT:-5434}
echo "MASTER_LOCAL_PORT set $MASTER_LOCAL_PORT"
read -p "Please input SLAVE_1_HOST_PORT (备库数据库服务端口)[6432]: " SLAVE_1_HOST_PORT
SLAVE_1_HOST_PORT=${SLAVE_1_HOST_PORT:-6432}
echo "SLAVE_1_HOST_PORT set $SLAVE_1_HOST_PORT"
read -p "Please input SLAVE_1_LOCAL_PORT (备库通信端口)[6434]: " SLAVE_1_LOCAL_PORT
SLAVE_1_LOCAL_PORT=${SLAVE_1_LOCAL_PORT:-6434}
echo "SLAVE_1_LOCAL_PORT set $SLAVE_1_LOCAL_PORT"
read -p "Please input MASTER_NODENAME [opengauss_master]: " MASTER_NODENAME
MASTER_NODENAME=${MASTER_NODENAME:-opengauss_master}
echo "MASTER_NODENAME set $MASTER_NODENAME"
read -p "Please input SLAVE_NODENAME [opengauss_slave1]: " SLAVE_NODENAME
SLAVE_NODENAME=${SLAVE_NODENAME:-opengauss_slave1}
echo "SLAVE_NODENAME set $SLAVE_NODENAME"
read -p "Please input openGauss VERSION [5.0.0]: " VERSION
VERSION=${VERSION:-5.0.0}
echo "openGauss VERSION set $VERSION"
echo "SLAVE_COUNT set $SLAVE_COUNT"
echo "SLAVE_NODENAME set $SLAVE_NODENAME"
echo "SLAVE_IP set $SLAVE_IP"
echo "SLAVE_HOST_PORT set $SLAVE_HOST_PORT"
echo "NETWORK_NAME set $NETWORK_NAME"
# Loop through and process each slave's information
for (( i=0; i<SLAVE_COUNT; i++ )); do
echo "SLAVE_${i}_IP set${SLAVE_IP[$i]}"
echo "SLAVE_${i}_HOST_PORT set${SLAVE_HOST_PORT[$i]}"
echo "SLAVE_${i}_NODENAME set${SLAVE_NODENAME[$i]}"
done
echo "starting "
docker network create --subnet=$OG_SUBNET opengaussnetwork \
# Create the network
docker network create --subnet=$OG_SUBNET $NETWORK_NAME \
|| {
echo ""
echo "ERROR: OpenGauss Database Network was NOT successfully created."
@ -79,13 +132,21 @@ docker network create --subnet=$OG_SUBNET opengaussnetwork \
}
echo "OpenGauss Database Network Created."
docker run --network opengaussnetwork --ip $MASTER_IP --privileged=true \
# Create the master container
REPL_CONN_INFO_MASTER=""
local_info="localhost=$MASTER_IP localport=$((MASTER_HOST_PORT+1)) localservice=$((MASTER_HOST_PORT+4)) localheartbeatport=$((MASTER_HOST_PORT+5))"
for (( i=0; i<SLAVE_COUNT; i++ )); do
remote_port=${SLAVE_HOST_PORT[$i]}
remote_info="remotehost=${SLAVE_IP[$i]} remoteport=$((remote_port+1)) remoteservice=$((remote_port+4)) remoteheartbeatport=$((remote_port+5))"
REPL_CONN_INFO_MASTER+="replconninfo$((i+1)) = '$local_info $remote_info'\n"
done
docker run --network $NETWORK_NAME --ip $MASTER_IP --privileged=true \
--name $MASTER_NODENAME -h $MASTER_NODENAME -p $MASTER_HOST_PORT:$MASTER_HOST_PORT -d \
-e GS_PORT=$MASTER_HOST_PORT \
-e OG_SUBNET=$OG_SUBNET \
-e GS_PASSWORD=$GS_PASSWORD \
-e NODE_NAME=$MASTER_NODENAME \
-e REPL_CONN_INFO="replconninfo1 = 'localhost=$MASTER_IP localport=$MASTER_LOCAL_PORT localservice=$MASTER_HOST_PORT remotehost=$SLAVE_1_IP remoteport=$SLAVE_1_LOCAL_PORT remoteservice=$SLAVE_1_HOST_PORT'\n" \
-e GS_PASSWORD="$GS_PASSWORD" \
-e NODE_NAME="$MASTER_NODENAME" \
-e REPL_CONN_INFO="$REPL_CONN_INFO_MASTER" \
opengauss:$VERSION -M primary \
|| {
echo ""
@ -96,17 +157,40 @@ echo "OpenGauss Database Master Docker Container created."
sleep 30s
docker run --network opengaussnetwork --ip $SLAVE_1_IP --privileged=true \
--name $SLAVE_NODENAME -h $SLAVE_NODENAME -p $SLAVE_1_HOST_PORT:$SLAVE_1_HOST_PORT -d \
-e GS_PORT=$SLAVE_1_HOST_PORT \
-e OG_SUBNET=$OG_SUBNET \
-e GS_PASSWORD=$GS_PASSWORD \
-e NODE_NAME=$SLAVE_NODENAME \
-e REPL_CONN_INFO="replconninfo1 = 'localhost=$SLAVE_1_IP localport=$SLAVE_1_LOCAL_PORT localservice=$SLAVE_1_HOST_PORT remotehost=$MASTER_IP remoteport=$MASTER_LOCAL_PORT remoteservice=$MASTER_HOST_PORT'\n" \
opengauss:$VERSION -M standby \
|| {
echo ""
echo "ERROR: OpenGauss Database Slave1 Docker Container was NOT successfully created."
exit 1
}
echo "OpenGauss Database Slave1 Docker Container created."
# Create the slave containers
for (( i=0; i<SLAVE_COUNT; i++ )); do
# Get the slave's information
REPL_CONN_INFO_SLAVE=""
local_port=${SLAVE_HOST_PORT[$i]}
local_info="localhost=${SLAVE_IP[$i]} localport=$((local_port+1)) localservice=$((local_port+4)) localheartbeatport=$((local_port+5))"
remote_master_info="remotehost=$MASTER_IP remoteport=$((MASTER_HOST_PORT+1)) remoteservice=$((MASTER_HOST_PORT+4)) remoteheartbeatport=$((MASTER_HOST_PORT+5))"
k=1
REPL_CONN_INFO_SLAVE="replconninfo${k} = '$local_info $remote_master_info'\n"
for (( j=0; j<SLAVE_COUNT; j++ )); do
if [[ $i -eq $j ]]; then
continue
fi
k=$((k+1))
remote_port=${SLAVE_HOST_PORT[$j]}
remote_info="remotehost=${SLAVE_IP[$j]} remoteport=$((remote_port+1)) remoteservice=$((remote_port+4)) remoteheartbeatport=$((remote_port+5))"
REPL_CONN_INFO_SLAVE+="replconninfo${k} = '$local_info $remote_info'\n"
done
echo "REPL_CONN_INFO_SLAVE=$REPL_CONN_INFO_SLAVE"
# Create the slave container
docker run --network $NETWORK_NAME --ip ${SLAVE_IP[$i]} --privileged=true \
--name ${SLAVE_NODENAME[$i]} -h ${SLAVE_NODENAME[$i]} -p $local_port:$local_port -d \
-e GS_PORT=$local_port \
-e OG_SUBNET=$OG_SUBNET \
-e GS_PASSWORD="$GS_PASSWORD" \
-e NODE_NAME="${SLAVE_NODENAME[$i]}" \
-e REPL_CONN_INFO="$REPL_CONN_INFO_SLAVE" \
opengauss:$VERSION -M standby \
|| {
echo ""
echo "ERROR: OpenGauss Database ${SLAVE_NODENAME[$i]} Docker Container was NOT successfully created."
exit 1
}
echo "OpenGauss Database ${SLAVE_NODENAME[$i]} Docker Container created."
sleep 30s
done