Ubuntu 20 情况下 patroni 自动化安装,一分钟快速搭建 patroni 集群

[复制链接]
发表于 前天 10:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1,该脚本在Ubuntu 20 下做过细致的测试,pg17+ etcd v3.6.5+ patroni 4.1.3,可极大简化patroni 的安装过程,全程自动完成patroni 的搭建
2,欢迎试用,有发起大概标题请留言
 
0,情况 

1,先编译好PostgreSQL服务,然后克制相干实例,由于patroni初始化的时间会自动重新初始化数据
2,PostgreSQL 17.6,etcd v3.6.5,patroni 4.1.3,patroni启动的是会创建数据目次,因此必要关闭各节点已有的PostgreSQL实例(如果有)。
3,先自动安装etcd集群,安装脚本依次再三台呆板上实验,然后然后patroni集群,同样是安装脚本依次再三台呆板上实验。

该脚本可以在一分钟之内可以搭建一个完备的patroni集群,睁开数据库的下一步工作,而不是浪费大量时间在情况的搭建上。
  1. root@ubuntu11:/usr/local/pg_install_package# cat /etc/hosts
  2. 127.0.0.1 localhost
  3. 127.0.1.1 ubuntu11
  4. # The following lines are desirable for IPv6 capable hosts
  5. ::1     ip6-localhost ip6-loopback
  6. fe00::0 ip6-localnet
  7. ff00::0 ip6-mcastprefix
  8. ff02::1 ip6-allnodes
  9. ff02::2 ip6-allrouters
  10. 192.168.152.121 ubuntu11
  11. 192.168.152.122 ubuntu12
  12. 192.168.152.123 ubuntu13
  13. 192.168.152.124 ubuntu14
复制代码
 

1,情况设置脚本:00_cluster_config.sh

改脚本不必要单独实验,加载再背面两个脚本里
  1. #!/bin/bash
  2. # 00_cluster_config.sh - 集群全局配置文件
  3. # 此文件在所有节点上内容相同
  4. # ==================== 集群节点信息 ====================
  5. # 节点1
  6. export NODE1_NAME="ubuntu11"
  7. export NODE1_IP="192.168.152.121"
  8. # 节点2
  9. export NODE2_NAME="ubuntu12"
  10. export NODE2_IP="192.168.152.122"
  11. # 节点3
  12. export NODE3_NAME="ubuntu13"
  13. export NODE3_IP="192.168.152.123"
  14. # 当前节点名称(在每个节点上手动设置或自动检测)
  15. # 方法1: 自动检测主机名
  16. export CURRENT_NODE_NAME=$(hostname)
  17. # 方法2: 手动设置(取消注释并修改)
  18. # export CURRENT_NODE_NAME="ubuntu11"
  19. # 根据当前节点名获取IP
  20. case ${CURRENT_NODE_NAME} in
  21.     ubuntu11)
  22.         export CURRENT_NODE_IP="${NODE1_IP}"
  23.         export ETCD_NAME="etcd01"
  24.         ;;
  25.     ubuntu12)
  26.         export CURRENT_NODE_IP="${NODE2_IP}"
  27.         export ETCD_NAME="etcd02"
  28.         ;;
  29.     ubuntu13)
  30.         export CURRENT_NODE_IP="${NODE3_IP}"
  31.         export ETCD_NAME="etcd03"
  32.         ;;
  33.     *)
  34.         echo "Error: Unknown node name ${CURRENT_NODE_NAME}"
  35.         exit 1
  36.         ;;
  37. esac
  38. # ==================== 统一路径配置 ====================
  39. # etcd相关目录
  40. export ETCD_VERSION="v3.6.5"
  41. export ETCD_INSTALL_DIR="/usr/local/etcd"
  42. export ETCD_DATA_DIR="/usr/local/etcd/default"
  43. export ETCD_CONF_DIR="/usr/local/etcd"
  44. # PostgreSQL相关目录
  45. export PG_BASE="/usr/local/pgsql17"
  46. export PG_DATA_DIR="${PG_BASE}/pg9000/data"
  47. export PG_BIN_DIR="${PG_BASE}/server/bin"
  48. export PG_WAL_ARCH_DIR="/usr/local/pg9000_wal_arch"
  49. # patroni相关目录
  50. export PATRONI_DIR="${PG_BASE}/patroni"
  51. export PATRONI_CONFIG_FILE="${PATRONI_DIR}/patroni.yml"
  52. export SCOPE_NAME="pg_cluster_wy_prod"
  53. export NAMESPACE="/service/"
  54. # ==================== PostgreSQL 统一密码 ====================
  55. export SUPERUSER_PASSWORD="your_strong_postgres_pwd"
  56. export REPL_PASSWORD="your_strong_repl_pwd"
  57. export REWIND_PASSWORD="your_strong_rewind_pwd"
  58. # ==================== etcd 集群配置 ====================
  59. export ETCD_CLUSTER="etcd01=http://${NODE1_IP}:2380,etcd02=http://${NODE2_IP}:2380,etcd03=http://${NODE3_IP}:2380"
  60. export ETCD_CLUSTER_TOKEN="etcd-cluster"
  61. # ==================== 其他 ====================
  62. export ETCDCTL_API=3
  63. # ==================== 创建必要的目录 ====================
  64. create_required_dirs() {
  65.     local dirs_to_create=(
  66.         "${ETCD_INSTALL_DIR}"
  67.         "${ETCD_DATA_DIR}"
  68.         "${ETCD_CONF_DIR}"
  69.         "${PG_BASE}"
  70.         "${PG_DATA_DIR}"
  71.         "${PATRONI_DIR}"
  72.         "${PG_BIN_DIR}"
  73.         "${PG_WAL_ARCH_DIR}"
  74.     )
  75.    
  76.     for dir in "${dirs_to_create[@]}"; do
  77.         if [ ! -d "${dir}" ]; then
  78.             echo "Creating directory: ${dir}"
  79.             mkdir -p "${dir}"
  80.         fi
  81.     done
  82. }
  83. # 创建必要的目录
  84. create_required_dirs
  85. # ==================== 打印当前配置 ====================
  86. echo "=== Current Node Configuration ==="
  87. echo "Current Node Name: ${CURRENT_NODE_NAME}"
  88. echo "Current Node IP: ${CURRENT_NODE_IP}"
  89. echo "ETCD Name: ${ETCD_NAME}"
  90. echo "ETCD Data Dir: ${ETCD_DATA_DIR}"
  91. echo "PostgreSQL Base: ${PG_BASE}"
  92. echo "Patroni Config: ${PATRONI_CONFIG_FILE}"
  93. echo "PostgreSQL WAL ARCH Dir: ${PG_WAL_ARCH_DIR}"
  94. echo "================================"
复制代码
 
2,etcd集群安装脚本 01_install_etcd.sh

依次在 ubuntu11,ubuntu12,ubuntu13上实验,创建etcd集群
[code]#!/bin/bashset -euo pipefail# 加载设置source ./00_cluster_config.shecho "=== Installing etcd on ${CURRENT_NODE_NAME} ==="# 1. 创建etcd工作目次并切换echo "Step 1: Creating etcd working directory..."mkdir -p /usr/local/etcdcd /usr/local/etcd# 2. 下载etcdecho "Step 2: Downloading etcd..."if [ ! -f "etcd-${ETCD_VERSION}-linux-amd64.tar.gz" ]; then    wget -q https://github.com/etcd-io/etcd/releases/download/${ETCD_VERSION}/etcd-${ETCD_VERSION}-linux-amd64.tar.gzfi# 3. 解压etcdecho "Step 3: Extracting etcd..."# 如果解压目次已存在,先删除if [ -d "etcd-${ETCD_VERSION}-linux-amd64" ]; then    echo "Removing existing etcd directory..."    rm -rf "etcd-${ETCD_VERSION}-linux-amd64"fitar -xzf etcd-${ETCD_VERSION}-linux-amd64.tar.gz# 4. 删除已存在的二进制文件或软链接echo "Step 4: Removing existing etcd binaries..."rm -f /usr/bin/etcd /usr/bin/etcdctl# 5. 复制二进制文件到体系路径echo "Step 5: Copying etcd binaries to /usr/bin..."cp etcd-${ETCD_VERSION}-linux-amd64/etcd /usr/bin/etcdcp etcd-${ETCD_VERSION}-linux-amd64/etcdctl /usr/bin/etcdctlchmod +x /usr/bin/etcd /usr/bin/etcdctl# 6. 创建数据目次echo "Step 6: Creating data directory..."mkdir -p ${ETCD_DATA_DIR}# 7. 天生etcd设置文件echo "Step 7: Generating etcd configuration..."mkdir -p ${ETCD_CONF_DIR}cat > ${ETCD_CONF_DIR}/etcd.conf /dev/null; then        echo "ERROR: Patroni service is currently running on this node."        echo "lease stop Patroni service before reinstalling:"        echo "  systemctl stop patroni"        echo "  systemctl disable patroni"        echo "Exiting installation to avoid conflicts."        exit 1fi# 查抄数据目次是否存在且非空if [ -d "${PG_DATA_DIR}" ] && [ "$(ls -A ${PG_DATA_DIR} 2>/dev/null)" ]; then        echo "WARNING: Data directory ${PG_DATA_DIR} is not empty but Patroni is not running."        read -p "Do you want to clear this directory and continue installation? (yes/no): " choice        if [ "$choice" = "yes" ] || [ "$choice" = "y" ]; then                echo "Cleaning up data directory contents..."                rm -rf ${PG_DATA_DIR}/*                rm -rf ${PG_DATA_DIR}/.[!.]* 2>/dev/null || true                echo "Data directory contents cleared successfully."        else                echo "Exiting installation."                exit 1        fielse        echo "Data directory is empty or does not exist. No cleanup needed."fi# 1. 安装依靠包echo "Step 1: Installing dependencies..."apt updateapt install -y python3 python3-pip libpq-dev gcc# 2. 先升级须要的Python包echo "Step 2: Upgrading Python packages..."pip3 install --upgrade pip setuptools wheel importlib_metadata# 3. 安装Patroniecho "Step 3: Installing Patroni..."pip3 install psycopg2-binarypip3 install patroni[etcd]# 4. 创建目次echo "Step 4: Creating directories..."mkdir -p ${PATRONI_DIR}mkdir -p ${PG_WAL_ARCH_DIR}chown -R postgres:postgres ${PG_BASE}chmod 700 ${PATRONI_DIR}# 授权数据目次,测试过过程中发现只有一台实例patroni无法拉起PostgreSQL进程,授权之后就可以了,希奇,以是这里再次授权chmod 0700 ${PG_DATA_DIR}chown -R postgres:postgres ${PG_DATA_DIR}chmod 0700 ${PG_WAL_ARCH_DIR}chown -R postgres:postgres ${PG_WAL_ARCH_DIR}# 5. 天生Patroni设置文件echo "Step 5: Generating Patroni configuration..."cat > ${PATRONI_CONFIG_FILE}
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表