用 Patroni 搭建 PolarDB-PG 高可用集群

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 本文详细介绍了如何利用开源PolarDB-PG和Patroni搭建高可用集群。实验环境使用了三台ECS,内核版本为PolarDB-PG 15,Patroni版本为4.0.3,etcd版本为3.5.0。文章依次讲解了ETCD的安装与配置、PolarDB-PG 15的安装与初始化,以及Patroni的配置和启动过程。通过Patroni自动创建备库,实现高可用集群的搭建。最后总结指出,用户可根据需求调整配置,或选择线上PolarDB-PG产品以减少运维成本并提升稳定性。

本文以实践的方式展示如何利用开源PolarDB-PG和Patroni搭建高可用集群。文中使用了三台ECS,内核使用了开源PolarDB-PG 15版本,patroni版本为4.0.3,etcd版本为3.5.0,其它系统资源及部署组件见下表:

如果没有特殊说明,表示命令需要在三台机器上均要执行。

ETCD安装

准备用户

首先需要准备一个用户,用于管理ETCD与初始化数据库,本文使用了同一个用户postgres。也可以使用不同的用户,比如分别用etcdpostgres

useradd postgres

安装ETCD

接下来安装ETCD,这里采用了下载tar安装包的方式手动安装,也可以使用yum install etcd方式安装。

# 获取安装包
wget https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz
tar -xvf etcd-v3.5.0-linux-amd64.tar.gz
cd etcd-v3.5.0-linux-amd64
sudo mv etcd /usr/local/bin/
sudo mv etcdctl /usr/local/bin/
# 创建目录并把权限赋给postgres
mkdir /etc/etcd
mkdir /var/lib/etcd
chown -R postgres:postgres /usr/local/bin/etcd /etc/etcd
chown -R postgres:postgres /usr/local/bin/etcdctl
chown -R postgres:postgres /var/lib/etcd

准备ETCD配置文件

以下分别为三个节点的etcd配置文件,使用的ETCD_DATA_DIR为/var/lib/etcd

cat > /etc/etcd/etcd.conf << EOF
ETCD_NAME=etcd1
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="http://172.17.206.71:2380"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://172.17.206.71:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.17.206.71:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://172.17.206.71:2380,etcd2=http://172.17.206.72:2380,etcd3=http://172.17.206.73:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://172.17.206.71:2379"
EOF
cat > /etc/etcd/etcd.conf << EOF
ETCD_NAME=etcd2
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="http://172.17.206.72:2380"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://172.17.206.72:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.17.206.72:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://172.17.206.71:2380,etcd2=http://172.17.206.72:2380,etcd3=http://172.17.206.73:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://172.17.206.72:2379"
EOF
cat > /etc/etcd/etcd.conf << EOF
ETCD_NAME=etcd3
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="http://172.17.206.73:2380"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://172.17.206.73:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.17.206.73:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://172.17.206.71:2380,etcd2=http://172.17.206.72:2380,etcd3=http://172.17.206.73:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://172.17.206.73:2379"
EOF

配置service并启动ETCD

这一步是为了配置由systemd管理ETCD,这样能实现开机自启动,并且在进程异常退出的时候能自动重启。先创建service文件,

vi /usr/lib/systemd/system/etcd.service

并填为以下内容,这里使用的配置文件是上一节中的/etc/etcd/etcd.conf

[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
User=postgres
# set GOMAXPROCS to number of processors
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/local/bin/etcd"
Restart=on-failure
LimitNOFILE=65536
RestartSec=5s
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target

启动service并查看状态,如果使用的是yum install etcd的方式,可以直接跳到这步。

sudo systemctl daemon-reload
sudo systemctl start etcd
sudo systemctl enable etcd
sudo systemctl status etcd

检查状态

具体使用的命令会因为ETCD版本有所不同,可以使用

etcdctl endpoint health --cluster
etcdctl member list

PolarDB-PG15安装

获取rpm包

从github上下载开源PolarDB-PG15的rpm包,并在每台机器上安装。这里使用的是Centos 8系统,因此下载el8的包即可(https://github.com/ApsaraDB/PolarDB-for-PostgreSQL/releases

rpm -ivh /root/PolarDB-15.8.2.0-f3737b0b.el8.x86_64.rpm

初始化数据目录

切换到postgres用户,并在第一台机器上initdb初始化数据目录,本文使用的目录为/home/postgres/polar15,这个步骤只在第一台机器上完成:

su - postgres
mkdir /home/postgres/
/u01/polardb_pg/bin/initdb -D /home/postgres/polar15

接下来可以配置远程登录权限,在/home/postgres/polar15/pg_hba.conf最后加上

# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all 0.0.0.0/0 md5
# replication privilege:
host replication replicator 0.0.0.0/24 md5

/home/postgres/polar15/postgresql.conf中配置listen_addresses = '*'

启动数据库

# 启动
/u01/polardb_pg/bin/pg_ctl -D /home/postgres/polar15 -l logfile start

接下来在第一台机器上连接数据库,并创建流复制需要的ROLE,密码可以按需要设置,例如本文配置为pg_rep

# 创建复制ROLE
/u01/polardb_pg/bin/psql -h localhost -p 5432 -U postgres -d postgres
create role replicator login replication encrypted password 'pg_rep';

patroni安装

接下来进行patroni的安装,首先使用root用户安装patronipython3-psycopg2patroni[etcd]

pip3 install patroni
yum install python3-psycopg2 -y
pip3 install patroni[etcd]

准备配置文件

首先在三台机器都创建需要的目录和配置文件postgres-pg01.yml

su - postgres
mkdir /home/postgres/etc
mkdir /home/postgres/log
vi /home/postgres/etc/postgres-pg01.yml

节点1配置文件

scope: postgres
namespace: /service/
name: postgresql0
restapi:
  listen: 0.0.0.0:8008
  connect_address: 127.0.0.1:8008  
etcd3:
  hosts: 
  - 172.17.206.71:2379
  - 172.17.206.72:2379
  - 172.17.206.73:2379
bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    postgresql:
      use_pg_rewind: true
      parameters:
        max_connections: 100
        max_locks_per_transaction: 64
        max_worker_processes: 8
  initdb:
  - encoding: UTF8
  - data-checksums
  pg_hba:
  - host all all 0.0.0.0/0 md5
  users:
    admin:
      password: adminpassword
      options:
        - createrole
        - createdb
postgresql:
  listen: 0.0.0.0:5432
  connect_address: 172.17.206.71:5432  # 替换为实际的IP地址
  data_dir: /home/postgres/polar15
  pgpass: /tmp/pgpass0
  bin_dir: /u01/polardb_pg/bin/  
  authentication:
    superuser:
      username: postgres
      password: yourpassword
    replication:
      username: replicator
      password: pg_rep
  parameters:
    unix_socket_directories: '/tmp'
tags:
  nofailover: false
  noloadbalance: false
  clonefrom: false
  nosync: false

节点2配置文件

scope: postgres
namespace: /service/
name: postgresql1
restapi:
  listen: 0.0.0.0:8008
  connect_address: 127.0.0.1:8008  
etcd3:
  hosts: 
  - 172.17.206.71:2379
  - 172.17.206.72:2379
  - 172.17.206.73:2379
bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    postgresql:
      use_pg_rewind: true
      parameters:
        max_connections: 100
        max_locks_per_transaction: 64
        max_worker_processes: 8
  initdb:
  - encoding: UTF8
  - data-checksums
  pg_hba:
  - host all all 0.0.0.0/0 md5
  users:
    admin:
      password: adminpassword
      options:
        - createrole
        - createdb
postgresql:
  listen: 0.0.0.0:5432
  connect_address: 172.17.206.72:5432  # 替换为实际的IP地址
  data_dir: /home/postgres/polar15
  pgpass: /tmp/pgpass0
  bin_dir: /u01/polardb_pg/bin/  
  authentication:
    superuser:
      username: postgres
      password: yourpassword
    replication:
      username: replicator
      password: pg_rep
  parameters:
    unix_socket_directories: '/tmp'
tags:
  nofailover: false
  noloadbalance: false
  clonefrom: false
  nosync: false

节点3配置文件

scope: postgres
namespace: /service/
name: postgresql2
restapi:
  listen: 0.0.0.0:8008
  connect_address: 127.0.0.1:8008  
etcd3:
  hosts: 
  - 172.17.206.71:2379
  - 172.17.206.72:2379
  - 172.17.206.73:2379
bootstrap:
  dcs:
    ttl: 30
    loop_wait: 10
    retry_timeout: 10
    maximum_lag_on_failover: 1048576
    postgresql:
      use_pg_rewind: true
      parameters:
        max_connections: 100
        max_locks_per_transaction: 64
        max_worker_processes: 8
  initdb:
  - encoding: UTF8
  - data-checksums
  pg_hba:
  - host all all 0.0.0.0/0 md5
  users:
    admin:
      password: adminpassword
      options:
        - createrole
        - createdb
postgresql:
  listen: 0.0.0.0:5432
  connect_address: 172.17.206.73:5432  # 替换为实际的IP地址
  data_dir: /home/postgres/polar15
  pgpass: /tmp/pgpass0
  bin_dir: /u01/polardb_pg/bin/  
  authentication:
    superuser:
      username: postgres
      password: yourpassword
    replication:
      username: replicator
      password: pg_rep
  parameters:
    unix_socket_directories: '/tmp'
tags:
  nofailover: false
  noloadbalance: false
  clonefrom: false
  nosync: false

启动patroni

三个节点依次启动patroni进程,观察进程是否正常运行,如果异常退出可以在~/log/patroni.log文件中分析原因。

patroni ~/etc/postgres-pg01.yml > ~/log/patroni.log 2>&1 &

查看集群拓扑,发现patroni已经自动根据配置文件使用pg_basebackup创建了备库。

patronictl -c ~/etc/postgres-pg01.yml topology

后续可以使用patronictl来运维数据库,比如修改配置、重启数据库节点、主备切换等操作。还可以把patroni进程托管给systemd管理。

总结

本文简单介绍了通过patroni搭建PolarDB-PG高可用集群,如果希望在本文基础上做更多高可用方面的测试,建议根据需要对文中的配置进行调整。如果想避免私有化部署的运维成本,也可以选用线上PolarDB-PG产品进行试用,线上提供了更丰富的高可用能力,能够有效降低部署的工作量并提高稳定性。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
3月前
|
Cloud Native 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
阿里云PolarDB云原生数据库在TPC-C基准测试中以20.55亿tpmC的成绩刷新世界纪录,展现卓越性能与性价比。其轻量版满足国产化需求,兼具高性能与低成本,适用于多种场景,推动数据库技术革新与发展。
|
2月前
|
存储 关系型数据库 分布式数据库
|
4月前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课13 单机版转换为集群版
本文介绍如何将“本地存储实例”转换为“共享存储实例”,依赖于先前搭建的实验环境。主要步骤包括:准备PFS二进制文件、格式化共享盘为pfs文件系统、启动pfsd服务、停库并拷贝数据到pfs内、修改配置文件,最后启动实例。通过这些操作,成功实现了从本地存储到共享存储的转换,并验证了新实例的功能。相关系列文章和视频链接提供了更多背景信息和技术细节。
77 0
|
2月前
|
Cloud Native 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
云原生数据库PolarDB技术揭秘:Limitless集群和分布式扩展篇
|
2月前
|
存储 关系型数据库 分布式数据库
登顶TPC-C|云原生数据库PolarDB技术揭秘:高可用-无感切换篇
阿里云PolarDB云原生数据库在TPC-C基准测试中以20.55亿tpmC的成绩刷新世界纪录,单位成本仅0.8元人民币。PolarDB通过VotingDisk实现秒级故障切换,RPO=0,提供高可用性。PolarDB还推出国产轻量版,兼具高性能与低成本,满足多样化需求。
|
4月前
|
存储 关系型数据库 分布式数据库
PolarDB开源数据库进阶课12 集群版转换为单机版
本文介绍了如何将“共享存储实例”转换为“本地存储实例”,实验环境依赖于Docker容器中的loop设备模拟共享存储。具体步骤包括准备本地目录、停库、拷贝数据、修改配置文件并启动实例。通过这些操作,可以实现从共享存储到本地存储的平滑转换。相关系列文章详细记录了PolarDB RAC一写多读集群的搭建与管理,提供了丰富的实战经验。
80 3
|
10月前
|
存储 Cloud Native 关系型数据库
PolarDB 高可用架构设计与实践
【8月更文第27天】 在现代互联网应用中,数据库作为核心的数据存储层,其稳定性和可靠性尤为重要。阿里云的 PolarDB 作为一款云原生的关系型数据库服务,提供了高可用、高性能和自动化的特性,适用于各种规模的应用。本文将详细介绍 PolarDB 的高可用架构设计,并探讨其实现数据安全性和业务连续性的关键技术。
297 0
|
11月前
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之“主集群和从集群地域映射表”指的是什么
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
PolarDB产品使用问题之“主集群和从集群地域映射表”指的是什么
|
10月前
|
Kubernetes Cloud Native 关系型数据库
k8s 部署polardb-x集群
k8s 部署polardb-x集群
446 11

相关产品

  • 云原生数据库 PolarDB