本文介绍如何在 CentOS 平台上使用 EcoX 搭建 PostgreSQL 高可用集群。这里我们需要使用到 3 个组件:PostgreSQL、ZooKeeper 和 EcoX。

基本环境

下表给出了本次实验的基本环境,包含 3 个 ZooKeeper 仲裁集群节点和 3 个数据库集群节点。

IP 地址 主机名 用途
10.9.10.207 zookeeper01 zookeeper 节点
10.9.10.189 zookeeper02 zookeeper 节点
10.9.10.222 zookeeper03 zookeeper 节点
10.9.10.125 ecox01 数据库节点
10.9.10.202 ecox02 数据库节点
10.9.10.232 ecox03 数据库节点

ZooKeeper 搭建

首先,我们需要搭建 ZooKeeper 集群。ZooKeeper 依赖于 Java,因此,我们需要先安装 Java。

# yum install -y java-1.8.0-openjdk.x86_64

接着,我们下载 ZooKeeper 安装包,校验 sha512,并解压安装。

# wget https://dlcdn.apache.org/zookeeper/zookeeper-3.5.10/apache-zookeeper-3.5.10-bin.tar.gz
# sha512sum apache-zookeeper-3.5.10-bin.tar.gz
fbca82d93fb07534d2cd7d93a399463cfea7e772075285d103e7cda5599d14c2d9996c1e50cc66c7c0dc78f996b20e75b20d74df368eb222dbc3caa0ab2cc14b  apache-zookeeper-3.5.10-bin.tar.gz
# tar xf apache-zookeeper-3.5.10-bin.tar.gz -C /usr/local/

配置环境变量和域名解析文件方便后续操作。

# cat <<END > /etc/profile.d/zookeeper.sh
export ZOO_HOME=/usr/local/apache-zookeeper-3.5.10-bin
export PATH=\$ZOO_HOME/bin:\$PATH
END
# tail -n 3 /etc/hosts
10.9.10.207     zookeeper01
10.9.10.189     zookeeper02
10.9.10.222     zookeeper03

创建用户和组来运行 ZooKeeper,您可能需要根据需要修改用户目录。

# groupadd zook
# useradd -d /home/zook -m -g zook zook

切换到 zook 用户,并创建相应的 ZooKeeper 目录。

# su - zook
$ mkdir -p data/{conf,log,datlog,dat}

创建配置文件,我们可以复制 zoo_sample.cfg 文件并做相应的修改来完成 ZooKeeper 的配置。

$ cp /usr/local/apache-zookeeper-3.5.10-bin/conf/zoo_sample.cfg $HOME/data/conf/zoo.cfg

这里需要修改 dataDirdataLogDir 两个参数,它们分别表示 ZooKeeper 的数据目录和数据日志目录,同时我们还需要增加 ZooKeeper 的节点信息。

dataDir=/home/zook/data/dat
dataLogDir=/home/zook/data/datlog
# 2888 为选举端口,3888 为心跳端口
server.1=zookeeper01:2888:3888
server.2=zookeeper02:2888:3888
server.3=zookeeper03:2888:3888

我们还需设置 ZOO_LOG_DIR 来配置 ZooKeeper 运行时的日志(这里是程序日志)。

$ cat <<END >> ~/.bashrc
export ZOO_LOG_DIR=/home/zook/data/log
END

然后,我们需要根据 server.N 来创建 myid 文件。我们需要在 ZooKeeper 的数据库目录下创建一个 myid 文件,其中包含一个数字,该数字需要和 server.N 中的配置对应起来。如上所示配置,我们需要在 zookeeper01 这个机器上的 myid 文件内容为 1zookeeper02 这个机器上的 myid 文件内容为 2zookeeper03 这个机器上的 myid 文件内容为 3

$ # zookeeper01 节点
$ echo 1 > /home/zook/data/dat/myid

$ # zookeeper02 节点
$ echo 2 > /home/zook/data/dat/myid

$ # zookeeper03 节点
$ echo 3 > /home/zook/data/dat/myid

完成上述配置之后,我们便可以启动 ZooKeeper 集群了。

$ zkServer.sh --config $HOME/data/conf start
/bin/java
ZooKeeper JMX enabled by default
Using config: data/conf/zoo.cfg
Starting zookeeper ... STARTED

三个节点都正常启动了,我们可以使用 zkServer.sh --config $HOME/data/conf status 来查看节点的状态。

$ zkServer.sh --config $HOME/data/conf status
/bin/java
ZooKeeper JMX enabled by default
Using config: data/conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

我们可以使用 stop 子命令来停止 ZooKeeper 节点。

$ zkServer.sh --config $HOME/data/conf stop
/bin/java
ZooKeeper JMX enabled by default
Using config: data/conf/zoo.cfg
Stopping zookeeper ... STOPPED

备注:

  1. 如果您的环境没有外网访问权限,您可以在有外网的主机上通过下面的命令下载相关软件。
    # yum install --downloadonly --downloaddir=/tmp/rpms java-1.8.0-openjdk.x86_64
    
  2. 如果您的环境上已经安装了,可以使用下面的命令来下载 rpm 安装包。
    # yum reinstall --downloadonly --downloaddir=/tmp/rpms java-1.8.0-openjdk.x86_64
    
  3. 在上述的配置中我采用了局部配置的方式,缺点是启动、停止等比较麻烦(需要带上 --config 选项),您可以通过全局配置来避免这一点。
    # cp /usr/local/apache-zookeeper-3.5.10-bin/conf/zoo_sample.cfg /usr/local/apache-zookeeper-3.5.10-bin/conf/zoo.cfg
    

    通过修改全局配置文件 /usr/local/apache-zookeeper-3.5.10-bin/conf/zoo.cfg 来配置 ZooKeeper,这样在启动的时候就可以不需要带上 --config 选项了,同时我们还可以修改 /usr/local/apache-zookeeper-3.5.10-bin/conf/log4j.properties 配置文件来指定程序日志的路径。

安装 PostgreSQL

现在我们需要来安装 PostgreSQL 数据库了,您可以参考官方文档安装。

# yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# yum install -y postgresql14-server

PostgreSQL 相关的命令安装在 /usr/pgsql-14 目录下面,同时将会新建一个 postgres 用户。

部署 EcoX

EcoX 依赖

EcoX 依赖于 ifconfigarping 命令,因此,我们需要先安装这些工具。

# yum -y install iputils.x86_64 net-tools.x86_64

EcoX 内部执行某些命令时需要使用到 sudo 进行提取,因此还需要安装 sudo 工具,同时将运行 EcoX 的用户添加到 sudoer 中,这里我们将以 postgres 用户执行 EcoX。

# visudo

postgres ALL=(ALL)	NOPASSWD: ALL

关闭防火墙,否则 EcoX 在做 pg_rewind 时可能会出错,最好的做法是配置相应的防火墙规则。

# systemctl stop firewalld
# systemctl disable firewalld

接着安装 EcoX 软件。

# rpm -ivh EcoX-5.13-1.el7.centos.x86_64.rpm

EcoX 将安装在 /usr/EcoX 目录下,同时,在 postgres 用户下配置 EcoX 环境变量。

$ cat <<END >> ~/.bash_profile
export PATH=/usr/EcoX/bin:\$PATH
export LD_LIBRARY_PATH=/usr/EcoX/lib:\$LD_LIBRARY_PATH
END

现在,EcoX 已经安装完成,接下来我们配置 PostgreSQL 集群。

EcoX 配置运行

首先修改 EcoX 配置文件 /usr/EcoX/etc/ecox.conf,我们可以从模版配置文件拷贝一份,然后对其进行配置。

# cp /usr/EcoX/etc/ecox.conf.sample /usr/EcoX/etc/ecox.conf
root=/EcoX
cluster=WwIT

# ZooKeeper 集群连接地址
zkhost=10.9.10.207:2181,10.9.10.189:2181,10.9.10.222:2181
zktimeout=9000

pgcomaster_num=2
auto_promote_slave=true
use_watch_dog=ture

log_filename=/var/lib/pgsql/ecox.log
log_level=info

# 数据库监听地址,节点配置成各自的 IP 地址
pghost=10.9.10.125
# PostgreSQL 二进制所在路径
pgbin=/usr/pgsql-14/bin
# PostgreSQL 数据库监听端口
pgport=5433
# PostgreSQL 数据目录
pgdata=/var/lib/pgsql/pgdata

# 允许哪些网段访问数据库,目前只支持配置一个网段,该参数只在需要通过
# EcoX 初始化数据库情况下,写入 pg_hba.conf 时使用
pgclient_net=10.9.0.0/16

# 数据库集群中节点之前数据同步使用的网络,该参数只在需要通过 EcoX 初
# 始化数据库情况下,写入 pg_hba.conf 时使用
pgcluster_net=10.9.0.0/16

# 主节点是否开启 VIP 功能,VIP 随着主节点的切换而飘移(用于读写操作)
do_not_use_vip=true

# 直接修改物理网卡的 IP,还是使用物理网卡的虚拟网卡(如 eth0:1)
is_vip_use_real_interface=false
eth_port=eth0
virtual_ip=10.9.10.201
netmask=255.255.255.0

# 从节点是否开启 VIP 功能,VIP 只在 comaster 之间飘移(用于只读操作)
do_not_use_comaster_vip=true
comaster_eth_port=eth0
comaster_virtual_ip=10.10.56.234
comaster_netmask=255.255.255.0

由于 EcoX 需要将进程的 PID 写入到 /usr/EcoX/share/EcoX.pid 中和节点信息写入到 /usr/EcoX/share/node.rd 中,因此,我们需要赋予其适当的权限。

# chown -R postgres:postgres /usr/EcoX/

现在,一切准备就绪,我们使用 EcoX --start 命令来启动 PostgreSQL 集群。

$ EcoX --start
[...]
PostgreSQL 14.* is compatible
Waiting for database starting ....2022-12-23 09:27:43.488 UTC [711017] LOG:  00000: redirecting log output to logging collector process
2022-12-23 09:27:43.488 UTC [711017] HINT:  Future log output will appear in directory "log".
2022-12-23 09:27:43.488 UTC [711017] LOCATION:  SysLogger_Start, syslogger.c:674
done
database start successed

这是一个前台运行的命令,您可以使用封装后的 service 服务来运行。所有节点启动完成之后,可以使用下面的命令查看集群状态:

$ EcoX --show cluster
 node name     :  ip address  |  port  |  online
----------------------------------------------------------
*node0000000000:  10.9.10.125  |  5433  |  TRUE
 node0000000001:  10.9.10.202  |  5433  |  TRUE
 node0000000002:  10.9.10.232  |  5433  |  TRUE
master     : node0000000000
comaster  1: node0000000001
comaster  2: node0000000002
last master: node0000000000
sync replication :node0000000001

备注:

  1. 如果是 SUSE 系统,在普通用户下执行 ifconfig 会报权限不足,您可以执行下面的命令解决这个问题。
    # ln -s /sbin/ifconfig /usr/bin/ifconfig
    
  2. 云平台 lx 虚拟机不支持虚拟 IP。