部署 Skylab 基础服务 Lava#

Lava 是 Skylab 基础组件,包含 Lava 命令行工具与 Lava 基础服务两部分。Lava 命令行工具包含了平台组件部署所需命令,比如 lava scp, lava ssh 等。Lava 基础服务提供基础的可视化部署 Web UI 与服务。本节主要介绍 Lava 基础组件的安装流程。

Lava 支持单点部署与高可用部署,您可以根据需求选择单点或者高可用的部署方式,具体步骤参见相应章节。

安装单节点 Lava#

前提#

本节默认 yum 源已经配置在 IP 为 192.168.1.10 的机器。安装过程需要使用 root 用户。

  1. 准备 License 文件

安装过程中,需要提前准备好与软件版本(包含所有需要安装、使用的产品)相匹配的 License 文件。

  1. 准备1台主机

各个节点上即将安装的组件如下表所示:

主机

host1

IP

192.168.1.11

role

Lava Master
PG Master

  1. 配置yum源

从 yum 源所在机器获取 repo 文件:

# 从yum源所在机器获取repo文件
scp oushu@192.168.1.10:/etc/yum.repos.d/oushu.repo /etc/yum.repos.d/oushu.repo
  1. 安装lava命令行管理工具

yum clean all
yum makecache
yum install lava
  1. 验证安装结果

安装完之后,运行如下命令检查安装结果,命令运行成功并且返回的版本号是期望的版本号,则证明安装成功。

lava version
  1. 创建log目录

在数据盘创建log目录,并link到 /usr/local/oushu/log,防止log或监控信息过多导致系统盘满。

安装 Lava 基础服务#

准备配置文件#

修改安装脚本配置/usr/local/oushu/lava/conf/lava-env.sh

  1. 把配置文件中 standalone 设置为 true。

  2. master 节点机器信息(master_hostname,master_username,master_password,master_data_ip,master_manage_ip)为必填项, 这些信息为当前机器 linux ssh 登录信息。

  3. 注意:无论单点还是HA,机器信息必须完整。

#!/bin/bash

############ deploy mode ################
export standalone=true                  # lava deploy in standalone mode
export start_mode=premise               # premise / k8s / cloud

######## machine basic config ###########
export master_hostname=                 # hostname of master machine
export master_username=                 # ssh username of master machine
export master_password=                 # ssh password of master machine
export master_data_ip=                  # data ip of master machine
export master_manage_ip=                # manage ip of master machine

export standby_hostname=                 # hostname of standby machine
export standby_username=                 # ssh username of standby machine
export standby_password=                 # ssh password of standby machine
export standby_data_ip=                  # data ip of standby machine
export standby_manage_ip=                # manage ip of standby machine

######## postgres basic config ##########
export PGDATA=/usr/pgdata               # postgres data dir
export PGPORT=4432                      # postgres listener port
export PGUSER=oushu                     # postgres default user
export PGPASSWORD=Oushu6@China          # postgres default password
export PGMASTER=${master_data_ip}       # postgres master ip
export PGSTANDBY=${standby_data_ip}     # postgres standby ip (empty if postgres run as standalone)
export PGHOME=/usr/pgsql-14             #
export POSTGRES_VIP=                    # postgres vip entry (only works in ha mode)
export POSTGRES_VIP_PORT=9999           # postgres vip entry port (only works in ha mode)

######## nginx basic config #############
export nginx_vip=                       # nginx entry ip (standalone nginx ip or vip)

########## web port config ##############
export SSL=false                        #
export LAVASERVER_HTTPS_PORT=1611       #
export LAVASERVER_HTTP_PORT=1612        #
export LAVASERVER_HTTP_PROXY_PORT=1614  #
export LAVASERVER_HTTPS_PROXY_PORT=1616 #
export LAVASERVER_RPC_PORT=1613         #
export LAVASERVER_RPC_PROXY_PORT=1615   #
export LAVAADMIN_HTTPS_PORT=1651        #
export LAVAADMIN_HTTP_PORT=1652         #
export LAVAADMIN_TCP_PROXY_PORT=1655    #
export LAVAADMIN_RPC_PORT=1653          #
export LAVAADMIN_RPC_PROXY_PORT=1656    #
export LAVADATAEND_HTTP_PORT=1671       #
export LAVADATAEND_HTTPS_PORT=1671      #
export LAVADATAEND_TCP_PROXY_PORT=1673  #

配置文件中的如下配置项通常必须要修改,如果没有特殊需求,其他配置项可以保持默认值不变:

  1. standalone: 设置为 true,意为安装 单点 的 Lava。

  2. 机器基础配置(machine basic config)部分:为当前机器 linux ssh 登录信息。所有”master_xxx” 配置项为必填项。 无论单点还是 HA 部署,机器信息必须完整。

执行安装命令#

注意看日志,如果有报错,处理完报错后再继续下一步!

  1. 安装 Lava

lava postgres-install master
lava infra-install master
  1. 上传 License 文件

上传 license 至 /usr/local/oushu/conf/lava-server/ 目录,名字必须为skylab.license。

  1. 启动 Lava

lava infra-start master

// 注意:如果手动启动各组件,需要先启动lava-server,之后再启动其他组件
  1. 注册 Lava 到自身

注意:用哪个用户(租户)登录,则注册到哪个用户(租户)名下。

lava login -u oushu -p Oushu6@China -T 根租户
lava infra-register master

配置(按需)#

安装完 Lava 之后,使用默认配置即可启动。也可以根据需要修改端口、最大连接数等配置信息,修改完之后需要重启相应组件。

LavaAdmin 配置:

/usr/local/oushu/conf/lava-admin/basic.config.xml

LavaServer 配置:

/usr/local/oushu/conf/lava-server/basic.config.xml

微前端各前端模块路由配置:

/usr/local/oushu/premise-ui-common/lava-fe-core/conf/routes.json

前端到后端服务的路由配置:

/usr/local/oushu/nginx/include/http/premise-frontend.conf

验证安装结果#

访问并登录 http://192.168.1.11:3000

默认登录租户:根租户

默认登录用户:oushu

默认登录密码:Oushu6@China

可正常登录并在登录之后可以看到首页,则安装成功。如图所示:

image-20221108113003823

使用/运维#

下表中是 Lava 一些常见命令:

常用功能

命令

启动主节点

lava infra-start master

停止主节点

lava infra-stop master

查看状态

lava infra-status

启动postgres

lava postgres-start master

停止postgres

lava postgres-stop master

安装高可用 Lava#

Lava 的高可用包括 Lava 基础服务的高可用与 Lava 的元数据库 PG 的高可用。

Lava 基础服务(包含 LavaServer、LavaAdmin、DBServer、Dataend)的高可用通过 VIP + Keepalived + Nginx 实现,VIP + Keepalived 保证了 Nginx 的高可用,Nginx 通过负载均衡的方式保证了 Lava 基础服务的高可用。

PG 高可用通过 VIP + PGPool 实现。

推荐 Lava 安装两个节点,PG 与 PGPool 安装三个节点。如图所示:

image-20221108113003823

前提#

本节默认 yum 源已经配置在 IP 为 192.168.1.10 的机器。安装过程需要使用 root 用户。

  1. 准备 License 文件

安装过程中,需要提前准备好与软件版本(包含所有需要安装、使用的产品)相匹配的 License 文件。

  1. 准备3台主机

本节安装之前需要准备3台主机(最少2台,3台为最佳),2个虚拟IP(假设为 VIP1 和 VIP2) ,VIP1 保证 Nginx 的高可用,VIP2 保证 PGPool 的高可用。

各个节点上即将安装的组件如下表所示:

主机

host1

host2

host3(可选)

IP

192.168.1.11

192.168.1.12

192.168.1.13

Lava 相关角色

Keepalived
Nginx Master
Lava Master

Keepalived
Nginx Standby
Lava Standby

PG 相关角色

PGPool
PG Master

PGPool
PG Standby

PGPool
PG Standby

  1. 为 PG 配置免密

每一个节点都执行如下操作:

# 为 postgres 用户设置密码 
sudo passwd postgres
su - postgres
mkdir ~/.ssh
chmod 700 ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool
# 必须给hostname做免密
ssh-copy-id -i id_rsa_pgpool.pub postgres@server1
ssh-copy-id -i id_rsa_pgpool.pub postgres@server2
ssh-copy-id -i id_rsa_pgpool.pub postgres@server3
  1. 配置 yum 源

在 Master 节点和每一个 Standby 节点分别配置 yum 源:

# 从yum源所在机器获取repo文件
scp oushu@192.168.1.10:/etc/yum.repos.d/oushu.repo /etc/yum.repos.d/oushu.repo
  1. 安装 Lava 命令行管理工具

在 Master 节点和每一个 Standby 节点分别安装 Lava 命令行工具:

yum clean all
yum makecache
yum install lava
  1. 验证安装结果

在每一个节点安装完之后,运行如下命令检查安装结果,命令运行成功并且返回的版本号是期望的版本号,则证明安装成功。

lava version

安装#

安装 Keepalived#

Keepalived 的安装包和安装方式需要参考官网:https://www.keepalived.org/。

需要在其中两台机器上安装 Keepalived,并配置 VIP1 可以跳转访问两台机器。

  1. 下载 Keepalived 安装 tar 包并解压。

  2. 进入解压后的 Keepalived 目录并运行 make。

sudo ./configure
sudo make && sudo make install
  1. 创建检测脚本文件。

sudo touch /home/oushu/check_nginx.sh
sudo chmod 755 /home/oushu/check_nginx.sh

脚本内容如下:

#!/bin/bash

exit 0
  1. 修改配置文件 /etc/keepalived/keepalived.conf (注释处根据情况修改)。

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id worker
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0.000001
   vrrp_gna_interval 0.000001
}

vrrp_script chk_nginx {
    script "/home/oushu/check_nginx.sh"
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state [MASTER|BACKUP] #俩节点不一样
    nopreempt
    interface eno1
    virtual_router_id 51
    priority [101|100]    #俩节点不一样主节点高1
    advert_int 5
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        #虚拟ip地址VIP1
    }
    track_script {
        chk_nginx
    }
}
  1. 启动。

sudo systemctl start keepalived.service
  1. 验证安装结果。

在 Keepalived 主节点运行 ifconfig,查看是否有新增虚拟网卡绑定 VIP1。

修改安装脚本配置#

在 Master 节点和每一个 Standby 节点分别修改安装脚本配置/usr/local/oushu/lava/conf/lava-env.sh

#!/bin/bash

############ deploy mode ################
export standalone=false                 # lava deploy in standalone mode
export start_mode=premise               # premise / k8s / cloud

######## machine basic config ###########
export master_hostname=                 # hostname of master machine
export master_username=                 # ssh username of master machine
export master_password=                 # ssh password of master machine
export master_data_ip=                  # data ip of master machine
export master_manage_ip=                # manage ip of master machine

export standby_hostname=                 # hostname of standby machine
export standby_username=                 # ssh username of standby machine
export standby_password=                 # ssh password of standby machine
export standby_data_ip=                  # data ip of standby machine
export standby_manage_ip=                # manage ip of standby machine

export standby1_hostname=                 # hostname of the second PG/PGPool standby machine
export standby1_username=                 # ssh username of second PG/PGPool standby machine
export standby1_password=                 # ssh password of second PG/PGPool standby machine
export standby1_data_ip=                  # data ip of second PG/PGPool standby machine
export standby1_manage_ip=                # manage ip of second PG/PGPool standby machine

######## postgres basic config ##########
export PGDATA=/usr/pgdata               # postgres data dir
export PGPORT=4432                      # postgres listener port
export PGUSER=oushu                     # postgres default user
export PGPASSWORD=Oushu6@China          # postgres default password
export PGMASTER=${master_data_ip}       # postgres master ip
export PGSTANDBY=${standby_data_ip}     # postgres standby ip (empty if postgres run as standalone)
export PGHOME=/usr/pgsql-14             #
export POSTGRES_VIP=VIP2                # postgres vip entry (only works in ha mode)
export POSTGRES_VIP_PORT=9999           # postgres vip entry port (only works in ha mode)
export NET_NAME=eth0                    # network card binded for VIP2, need change the name according to the existing network card of data ip (only works in ha mode)
export SSHPORT=22                       # ssh port(PGPool install will use "postgres" system user to ssh)
export PG_USER_POSTGRES_PASSWORD=postgres    # postgres user "postgres" password
export PG_USER_PGPOOL_PASSWORD=pgpool        # postgres user "pgpool" password (only works in ha mode)
export PG_USER_REPL_PASSWORD=repl            # postgres user "repl" password (only works in ha mode)
export PCP_COMMAND_PASS=passwd               # pgpool command PCP* password (only works in ha mode)
export PGPOOLLOGFILE=/data/pgpool/pgpool_log # pgpool log file (only works in ha mode)

######## nginx basic config #############
export nginx_vip=VIP1                   # nginx entry ip (standalone nginx ip or vip)

########## web port config ##############
export SSL=false                        #
export LAVASERVER_HTTPS_PORT=1611       #
export LAVASERVER_HTTP_PORT=1612        #
export LAVASERVER_HTTP_PROXY_PORT=1614  #
export LAVASERVER_HTTPS_PROXY_PORT=1616 #
export LAVASERVER_RPC_PORT=1613         #
export LAVASERVER_RPC_PROXY_PORT=1615   #
export LAVAADMIN_HTTPS_PORT=1651        #
export LAVAADMIN_HTTP_PORT=1652         #
export LAVAADMIN_TCP_PROXY_PORT=1655    #
export LAVAADMIN_RPC_PORT=1653          #
export LAVAADMIN_RPC_PROXY_PORT=1656    #
export LAVADATAEND_HTTP_PORT=1671       #
export LAVADATAEND_HTTPS_PORT=1671      #
export LAVADATAEND_TCP_PROXY_PORT=1673  #

配置文件中的如下配置项通常必须要修改,如果没有特殊需求,其他配置项可以保持默认值不变:

  1. standalone: 设置为 false,意为安装 HA 的 Lava。

  2. 机器基础配置(machine basic config)部分:为当前机器 linux ssh 登录信息。”master_xxx” 配置项是必填项;如果只有一个 Standby 节点,需要填写 “standby_xxx”配置项;如果有两个 Standby 节点,需要填写 “standby_xxx” 与 “standby1_xxx” 配置项。 无论单点还是 HA 部署,机器信息必须完整。

  3. POSTGRES_VIP:PGPool 所使用的 VIP2。

  4. NET_NAME:默认值为 “eth0”,需要修改为 PGPool 安装的机器的数据网卡(内网)名字。

  5. nginx_vip: 设置为 VIP1。 保证 Nginx 高可用,由 Keepalived 负责转发/漂移。

  6. POSTGRES_VIP:设置为 VIP2。 保证 PGPool 高可用,无需要配置在 Keepalived 中。

执行安装命令#

按顺序执行下列命令安装 Lava 基础服务:

注意看日志,如果有报错,处理完报错后再继续下一步!

  1. 安装 Master 节点。

在准备安装Lava Master 的节点,运行如下命令安装 PG Master、PGPool 与 Lava Master:

lava postgres-install master
lava postgres-install pgpool
lava infra-install master

*上述操作完成之后及时验证部署是否成功

bash-4.2$ psql -h 10.0.*.* -p 9999 -U pgpool
test=# show pool_nodes;

|node_id | hostname | port  | status | pg_status | lb_weight |  role   | pg_role | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change |
|---------|----------|-------|--------|-----------|-----------|---------|---------|------------|-------------------|-------------------|-------------------|------------------------|---------------------|
|node_id | hostname | port number  | status name | actual backend status | load balance weight |  backend role   | actual backend role | select_cnt | load_balance_node | replication delay | replication state | sync replication state | last status change time |
|0       | /tmp     | 11002 | up     | up        | 0.500000  | primary | primary | 0          | false             | 0                 |                   |                        | 2021-02-27 15:10:19|
|1       | /tmp     | 11003 | up     | up        | 0.500000  | standby | standby | 0          | true              | 0                 | streaming         | async                  | 2021-02-27 15:10:19|
(2 rows)

上传 License 文件到如下路径,否则后面注册步骤会失败:

/usr/local/oushu/conf/lava-server/skylab.license

启动 Lava Master:

lava infra-start master

// 注意:如果手动启动各组件,需要先启动lava-server,之后再启动其他组件
  1. 安装 Standby 节点:

在每一个准备安装 Standby 的节点上,运行如下命令安装 PG Standby、 PGPool 与 Lava Standby, 并启动 Lava:

lava postgres-install standby
lava postgres-install pgpool

*上述部署完成验证是否部署成功

bash-4.2$ psql -h 10.0.*.* -p 9999 -U pgpool
test=# show pool_nodes;

|node_id | hostname | port  | status | pg_status | lb_weight |  role   | pg_role | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change |
|---------|----------|-------|--------|-----------|-----------|---------|---------|------------|-------------------|-------------------|-------------------|------------------------|---------------------|
|node_id | hostname | port number  | status name | actual backend status | load balance weight |  backend role   | actual backend role | select_cnt | load_balance_node | replication delay | replication state | sync replication state | last status change time |
|0       | /tmp     | 11002 | up     | up        | 0.500000  | primary | primary | 0          | false             | 0                 |                   |                        | 2021-02-27 15:10:19|
|1       | /tmp     | 11003 | up     | up        | 0.500000  | standby | standby | 0          | true              | 0                 | streaming         | async                  | 2021-02-27 15:10:19|
(2 rows)

继续安装部署备节点lava相关服务

lava infra-install standby
lava infra-start standby
  1. 注册:

安装完成之后,在 Lava Master 节点执行如下命令,完成注册 Lava 各节点到集群管理元数据中。

注意:默认注册到”根租户”的”oushu”用户,如果您想注册到其他租户、用户下,请修改第一个登录命令(lava login…)中的租户、用户名、密码进行登录。

# 注册 -u:用户;-p:密码;-T:租户名称或者租户编码
lava login -u oushu -p Oushu6@China -T 根租户
lava infra-register ha

配置(按需)#

安装完 Lava 之后,使用默认配置即可启动。也可以根据需要修改端口、最大连接数等配置信息,修改完之后需要重启相应组件。

LavaAdmin 配置:

/usr/local/oushu/conf/lava-admin/basic.config.xml

LavaServer 配置:

/usr/local/oushu/conf/lava-server/basic.config.xml

微前端各前端模块路由配置:

/usr/local/oushu/premise-ui-common/lava-fe-core/conf/routes.json

前端到后端服务的路由配置:

/usr/local/oushu/nginx/include/http/premise-frontend.conf

验证安装结果#

访问并登录 http://192.168.1.11:3000(默认登录租户:根租户,默认登录用户:oushu,默认登录密码:Oushu6@China)

可正常登录并在登录之后可以看到首页,则安装成功。如图所示:

image-20221108113003823

配置Keepalive#

成功访问后,修改 Keepalived 监听脚本/home/oushu/check_nginx.sh

改为监听 Nginx:

#!/bin/bash
killall -0 nginx
if [[ $? -ne 0 ]]; then
sudo systemctl stop keepalived.service
fi

配置完成之后,可访问并登录 http://VIP1:3000(默认登录租户:根租户,默认登录用户:oushu,默认登录密码:Oushu6@China)成功,则证明 VIP 与 Keepalive 配置成功。

使用/运维#

Lava 命令#

Lava 相关命令使用 root 用户执行。

常用功能

命令

启动主节点

lava infra-start master

停止主节点

lava infra-stop master

查看状态

lava infra-status

启动从节点

lava infra-start standby

停止从节点

lava infra-stop standby

启动postgres

lava postgres-start master

停止postgres

lava postgres-stop master

启动postgres

lava postgres-start standby

停止postgres

lava postgres-stop standby

重写pgpool相关脚本

lava postgres-install pgpool-shell

修改postgres用户密码脚本

sudo lava postgres-install postgres-edit pgpool(pg user) wjtest(pgpass) true(是否为pg主节点)

lava login 命令不使用明文密码的方式#

  1. 在右上角个人中心中,生成API密钥。 image-20221108113003823

  2. 将密钥写在一个文件中,例如

./.lavatoken
  1. 将token读至变量$token

lavatoken=`cat ./.lavatoken`
  1. 使用$token作为认证,调用接口

curl -l -k -H "Content-type:application/json" -H "Token:$lavatoken" -X GET localhost:1652/admin/deploy/getAllMachines

pg高可用集群修改pg用户密码#

#停止所有节点pgpool
pcp_stop_pgpool -h 10.0.*,* -p 9898 -U pgpool -m f -s c

#pg主节点执行
sudo lava postgres-install postgres-edit pgpool(pg user) wjtest(pgpass) true(是否为pg这节点)
#pg 从节点执行(全部从节点)
sudo lava postgres-install postgres-edit pgpool(pg user) wjtest(pgpass) false(是否为pg这节点)
#pg 从节点执行(全部从节点)
export LD_LIBRARY_PATH=/usr/pgsql-14/lib;export PATH=/usr/pgsql-14/bin:$PATH;
pg_ctl -D /usr/pgdata/ stop
#pg主节点执行
export LD_LIBRARY_PATH=/usr/pgsql-14/lib;export PATH=/usr/pgsql-14/bin:$PATH;
pg_ctl -D /usr/pgdata/ restart


启动pg各个节点(全部节点、无顺序)
/bin/pgpool -f /etc/pgpool.conf -n -D > /tmp/pgpool.log 2>&1 &
使用pcp命令一键拉起pg从节点
pcp_recovery_node -h 10.0.192.250 -p 9898 -U pgpool -n 1

1为 pgpool节点 node_id

|node_id | hostname | port  | status | pg_status | lb_weight |  role   | pg_role | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change |
|---------|----------|-------|--------|-----------|-----------|---------|---------|------------|-------------------|-------------------|-------------------|------------------------|---------------------|
|node_id | hostname | port number  | status name | actual backend status | load balance weight |  backend role   | actual backend role | select_cnt | load_balance_node | replication delay | replication state | sync replication state | last status change time |
|0       | /tmp     | 11002 | up     | up        | 0.500000  | primary | primary | 0          | false             | 0                 |                   |                        | 2021-02-27 15:10:19|
|1       | /tmp     | 11003 | up     | up        | 0.500000  | standby | standby | 0          | true              | 0                 | streaming         | async                  | 2021-02-27 15:10:19|

PGPool 相关常用命令#

PGPool-II是一个流行的 PostgreSQL 连接池和复制管理器,它提供了一个名为 PCP(Pgpool-II Connection Provider)的工具,用于监控和管理 Pgpool-II 的服务。本节介绍 PCP 的一些常用命令以及使用方法。

建议使用 postgres 用户运行 PCP 的命令。

通用参数#

-h hostname 或者 –host=hostname 该参数指定服务器所在机器的主机名。如果提供的值以斜杠(/)开头,那么它会被当作Unix域套接字的目录使用。

-p port 或者 –port=port 该参数用于指定PCP服务的端口号。默认情况下,端口号是9898。如果 PGPool 配置了 VIP,则应该输入 VIP。

-U username 或者 –username=username 该参数用于指定 PCP 认证的用户名。如果不指定,默认使用操作系统的当前用户名。根据本文步骤安装 PGPool 之后的用户名是 pgpool,密码是 passwd。

-w 或者 –no-password 这个选项指示在连接时从不提示输入密码。如果没有通过 a.pcppass 文件提供密码,连接尝试将会失败。这个选项在批处理作业和脚本中很有用,因为此时没有用户在场输入密码。

-W 或者 –password 这个选项会强制提示输入密码(通常这是自动发生的)。

-d 或者 –debug 该参数用于开启 debug 级别日志日志.

-v 或者 –verbose 该参数用于开启详细输出。

-V 或者 –version 该参数用于查看命令的版本。

-? 或者 –help 该参数用于查看命令帮助。

pcp_attach_node#

将给定的 PG 节点连接到 Pgpool-II。

参数:

  • -n node_id 或者 –node_id=node_id

    将要绑定的后端节点(PG)节点的 ID。这个 ID 通常在 pgpool.conf 文件中配置,用于标识 pgpool-II 管理的每个后端 PostgreSQL 服务器。

例子:

pcp_attach_node -h VIP2 -p 9898 -U pgpool -n node_id
pcp_watchdog_info#

该命令展示 PGPool 的 watchdog 信息。

例子:

pcp_watchdog_info -h VIP2 -p 9898 -U pgpool
Password:
3 3 YES server1:9999 Linux server1.localdomain server1

server1:9999 Linux server1.localdomain server1 9999 9000 4 LEADER 0 MEMBER
server2:9999 Linux server2.localdomain server2 9999 9000 7 STANDBY 0 MEMBER
server3:9999 Linux server3.localdomain server3 9999 9000 7 STANDBY 0 MEMBER
pcp_recovery_node#

用于将指定的后端节点附加到恢复流程中,旨在恢复该几点的状态。

参数: -n node_id 或者 –node-id=node_id 指定后端节点的 ID。这个 ID 通常在 pgpool.conf 文件中配置,用于标识 pgpool-II 管理的每个后端 PostgreSQL 服务器。

例子:

pcp_recovery_node -h VIP2 -p 9898 -U pgpool -n node_id
pcp_reload_config#

用于重新加载 pgpool-II 的配置文件,而无需重启 pgpool-II 服务。这对于在不中断现有连接的情况下应用配置更改非常有用。

参数: -s scope 或者 –scope=scope 该参数指定命令的影响范围。支持的命令范围如下(默认为 “local”):

  • c, cluster:重新加载集群中所有 pgpool-II 节点的配置文件。

  • l, local:仅重新加载本地 pgpool-II 节点的配置文件。

例子:

pcp_reload_config -h VIP2 -p 9898 -U pgpool -s c
show pool_nodes#

该命令为 PGPool 命令,首先需要通过 psql 命令连接 PGPool(默认9999端口,此处连接 PGPool 的用户名、密码为 PG 的用户名、密码),然后执行该命令。

它用于返回 pgpool-II 当前配置中所有节点的列表。这些信息通常包括节点的 ID、状态(例如,是否在线、是否为主节点等)、后端数据库的连接信息(如主机名、端口号等)以及任何与节点相关的额外配置信息。

例子:

postgres=# show pool_nodes;

node_id

hostname

port

status

pg_status

lb_weight

role

pg_role

select_cnt

load_balance_node

replication_delay

replication_state

replication_sync_state

last_status_change

node_id

hostname

port number

status name

actual backend status

load balance weight

backend role

actual backend role

select_cnt

load_balance_node

replication delay

replication state

sync replication state

last status change time

0

/tmp

11002

up

up

0.500000

primary

primary

0

false

0

2021-02-27 15:10:19

1

/tmp

11003

up

up

0.500000

standby

standby

0

true

0

streaming

async

2021-02-27 15:10:19

node_id:节点的唯一标识符。

hostname:节点的主机名或IP地址。

port:节点监听的端口号。

status:PGPool 端管理的 PG 节点的当前状态,如up(正常)或down(故障)。

pg_status:后台 PG 真实的状态,与 status 状态可能不一致。

lb_weight:负载均衡权重,用于在负载均衡时决定节点的优先级。

role:节点的角色,如 primary(主节点)或 standby(备节点)。

select_cnt:该节点上执行的SELECT查询次数(可能因Pgpool-II版本而异,不是所有版本都显示此列)。

load_balance_node:指示该节点是否参与负载均衡。我们配置的只有主节点对外服务,所以,只有 primary 节点的该字段为 true。

replication_delay:复制延迟,表示备节点相对于主节点的数据延迟(可能因Pgpool-II版本和配置而异,不是所有版本都显示此列)。

修改 PG 与 PGPool 的配置的步骤#

修改 PG 配置#
  1. 需要修改每个节点配置

vi /$PGDATA/postgresql.conf

  1. 看修改具体配置项决定重新加载配置或者重新启动服务

pg_ctl -D $PGDATA reload/restart

reload: 重新读取配置。

restart: 重启 PG 服务,会导致预期内的高可用集群主从故障转移。

  1. 通过 psql 连接 PGPool(默认端口9999,使用 PG 的用户名、密码),查看节点状态

postgres=# show pool_nodes;

如果节点状态不正常,执行修改节点状态命令 pcp_attach_node 更新状态,执行 pcp_recovery_node 重新拉起 PG。

修改 PGPool 配置#

根据实际修改配置项并执行 PGPool 重启命令(使用 postgres 用户)。

sudo su postgres
export LD_LIBRARY_PATH=/usr/pgsql-14/lib;
export PATH=/usr/pgsql-14/bin:$PATH;
/bin/pgpool -f /etc/pgpool.conf -m fast stop
/bin/pgpool -f /etc/pgpool.conf -n -D > /tmp/pgpool.log 2>&1 &

或者使用 PGPool 重新加载配置命令,具体参数查看上文。

pcp_reload_config -h VIP2 -p 9898 -U pgpool -s c

PG 高可用常见问题以及处理方式#

问题排查步骤#

本章节描述了如果出现了 PG 高可用相关问题,如何定位、解决问题。

  1. 查看 PGPool 状态

首先查看 PGPool 服务的状态,如果 PGPool 服务的状态不健康,需要首先修复 PGPool 服务。

pcp_watchdog_info -h VIP2 -p 9898 -U pgpool
Password:
3 3 YES server1:9999 Linux server1.localdomain server1

server1:9999 Linux server1.localdomain server1 9999 9000 4 LEADER 0 MEMBER
server2:9999 Linux server2.localdomain server2 9999 9000 7 STANDBY 0 MEMBER
server3:9999 Linux server3.localdomain server3 9999 9000 7 STANDBY 0 MEMBER

以上是通过 PGPool 命令查看,也可以通过 ps -ef|grep service 查看服务进程是否正常。

如果发现某节点 PGPool 服务下线,检查 /etc/pgpool.conf 然后启动 PGPool,继续执行上述命令验证。

PGPool 启动命令(postgres用户):

export LD_LIBRARY_PATH=/usr/pgsql-14/lib;
export PATH=/usr/pgsql-14/bin:$PATH;
/bin/pgpool -f /etc/pgpool.conf -n -D > /tmp/pgpool.log 2>&1 &
  1. PSQL 连接 PGPool

bash-4.2$ psql -h VIP2 -p 9999 -U pgpool
test=# show pool_nodes;

|node_id | hostname | port  | status | pg_status | lb_weight |  role   | pg_role | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change |
|---------|----------|-------|--------|-----------|-----------|---------|---------|------------|-------------------|-------------------|-------------------|------------------------|---------------------|
|node_id | hostname | port number  | status name | actual backend status | load balance weight |  backend role   | actual backend role | select_cnt | load_balance_node | replication delay | replication state | sync replication state | last status change time |
|0       | /tmp     | 11002 | up     | up        | 0.500000  | primary | primary | 0          | false             | 0                 |                   |                        | 2021-02-27 15:10:19|
|1       | /tmp     | 11003 | up     | up        | 0.500000  | standby | standby | 0          | true              | 0                 | streaming         | async                  | 2021-02-27 15:10:19|
(2 rows)

注意:查看 PG 节点是否正常(status 字段是否为 “up”),节点状态都正常或者部分节点正常才能 psql 连接成功,若 PG 节点全部异常,则 psql 连接会失败。

pcp_recovery_node -h VIP2 -p 9898 -U pgpool -n node_id
问题1: psql 连接 PGPool 失败#

通过 psql 连接 PGPool 的时候,有时因为服务异常等原因导致连接失败的问题,本节针对这类问题给出解决排查与解决方案。

报错一:无法接收客户端的请求#
bash-4.2$ psql -h VIP2 -p 9999 -Upgpool
password:
psql: 错误:无法接收客户端的请求

原因: PGPool 中认为 PG 节点全部无法接收请求。

排查步骤:

  1. 查看各 PG 节点运行是否正常

    可以通过 psql 命令连接每一个 PG 节点的 IP 与 PG 的端口,如果连接成功,则相应节点的 PG 服务为正常。

  2. 若 PG 服务正常

    执行 pcp_attach_node 命令修改 PGPool 中 PG 节点的状态。

    注意:先恢复 PG 主节点,再恢复 PG 的从节点。

pcp_attach_node -h VIP2 -p 9898 -U pgpool -n node_id
  1. 若各节点 PG 服务全部不可用

    首先启动 PG 主节点(通过查看 PGDATA 目录下是否存在 standby.signal 文件,存在此文件说明是 PG 从节点,相应不存在则为主节点)。

    pg_ctl -D PGDATA start

    然后查看 PGPool 中高可用集群状态的主节点状态是否恢复(status 为 up)。

bash-4.2$ psql -h VIP2 -p 9999 -Upgpool
postgres=# show pool_nodes;
如果主节点状态已经恢复,则运行如下命令拉起 PG 从节点并在 PGPool 中设置为可用状态。
pcp_recovery_node -h VIP2 -p 9898 -U pgpool -n 1
Password:
pcp_recovery_node -- Command Successful
最后再次通过 `show pool_nodes` 命令查看 PGPool 中高可用集群状态,确保所有节点状态正常(status 为 up)。
bash-4.2$ psql -h VIP2 -p 9999 -Upgpool
postgres=# show pool_nodes;
报错二:端口9999失败:没有到主机的路由#
psql -h VIP2 -p 9999 -Upgpool -d postgres
psql: 错误: 连接到"VIP2"上的服务器,端口9999失败:没有到主机的路由
服务器是否在该主机上运行并接受TCP/IP连接?

原因:

这个错误表明 PGPool 节点状态全部异常。

方案:

按照上述高可用集群问题定位步骤第一步,启动每一个节点的 PGPool 服务。

PGPool 启动命令(postgres用户):

export LD_LIBRARY_PATH=/usr/pgsql-14/lib;
export PATH=/usr/pgsql-14/bin:$PATH;
/bin/pgpool -f /etc/pgpool.conf -n -D > /tmp/pgpool.log 2>&1 &
问题2: PG 与 PGPool 进程宕掉#

当机器重启或者其他原因导致 PG 与 PGPool 进程宕掉(通过 ps aux | grep pgpoolps aux | grep postgres 检查),需要启动 PG 与 PGPool。

  1. 启动 PGPool

su postgres -c "export LD_LIBRARY_PATH=/usr/pgsql-14/lib;export PATH=/usr/pgsql-14/bin:$PATH;/bin/pgpool -f /etc/pgpool.conf -n -D > /tmp/pgpool.log 2>&1 &"
  1. 执行 show pool_nodes 获得 PG 节点的 ID (node_id字段)

bash-4.2$ psql -h VIP2 -p 9999 -Upgpool
postgres=# show pool_nodes;
  1. 退出 psql,根据查看到的 PG 节点状态以及 ID,执行如下系统命令,拉起相应的节点的 PG。

pcp_recovery_node -h VIP2 -p 9898 -U pgpool -n nodeid
问题3: PG 节点意外中断#

这个场景包含当 PG 的 Master、Standby 因故障发生切换时,PG 的原 Master 节点通常会被摒弃在 PG 的高可用集群之外。

通过show pool_nodes命令,如果发现某节点的 status 字段为 down,则通过如下命令拉起 PG 节点。

pcp_recovery_node -h VIP2 -p 9898 -U pgpool -n nodeid

例如:

pcp_recovery_node -h 10.0.0.1 -p 9898 -U pgpool -n 2

问题4: PGPool 节点意外中断#

如果PGPool 进程宕掉(通过 ps aux | grep pgpool 检查),需要启动 PGPool:

su postgres -c "export LD_LIBRARY_PATH=/usr/pgsql-14/lib;export PATH=/usr/pgsql-14/bin:$PATH;/bin/pgpool -f /etc/pgpool.conf -n -D > /tmp/pgpool.log 2>&1 &"

添加机器(可选)#

如果您希望通过可视化界面安装或者注册纳管组件,将要安装或纳管的机器需要在节点管理功能中注册。

登陆到平台后,选择自动部署功能,在左侧菜单栏中找到节点管理。

image-20221103143957159

在节点管理页面中,点击新建新建节点,弹出窗中根据网络环境配置子网信息,地域,可用区,这里的子网是一个逻辑网络分组的概念,每个子网中必须要有管理节点(带管理网卡IP的节点),地域和可用区只是在本逻辑分组中的字符标签,没有实际逻辑意义。

根据节点信息在子网中添加节点,注意这里的用户需要在机器上有sudo免密的权限。

image-20221103144433556

添加节点成功后,在节点列表页面将会有对应节点的展示。

image-20221103123114553

如果添加失败,则在节点添加的日志中有报错信息,根据报错信息修改节点或连接配置即可。

image-20221103123115223

安装其他产品/组件#

注册机器之后,即可安装其他产品/组件(如 OushuDB 集群),其他产品/组件的安装,详见相关产品/组件的安装部署章节。

组件相关配置#

功能说明#

  1. 配置修改最新配置展示

  2. 配置修改

  3. 配置版本管理

  4. 配置回滚

  5. 配置对比

  6. 视图切换

前提#

  1. 配置状态说明:

    1. 当前版本: 指当前集群运行使用的配置版本,并不一定为文件系统上的配置内容。

    2. 最新版本: 集群各节点的文件系统上的版本内容,当重启集群时改配置才可以生效,生效后状态变为当前版本

  2. 版本保存说明

    1. 仅保存新版本: 该操作仅将skylab平台上修改的配置内容分发到指定机器的各节点配置目录下,并不会应用修改后的配置。

    2. 保存并重启集群: 该操作包含分发修改后的配置到各节点且重启集群各角色,最终使集群应用修改后的配置。

使用说明#

注:以下说明基于Hive组件,其他组件同理

  1. 新建集群时skylab为您提供足以启动该类集群的默认的配置,但是如果您有配置修改的需求,您可以在这一步对配置文件做您期待的修改。如图您可以在每个配置文件中新增参数、修改属性及其对应的值,同时您也可以删除skylab提供的默认参数。最终该配置将会作为当前集群的初始配置。

  2. 新建集群后您可以选择集群配置使用配置功能。

  3. 在配置详情页面可查看当前集群最新版本,在当前页面您不仅可以查看最新的配置,同时skylab还提供了修改/切换配置展示视图/保存新版本。

  4. 您可以在配置文件右上脚选择切换当前视图,skylab提供由key&value形式的展示转化为指定配置类型的文本模式且提供重做/注释等快捷操作。 key&value切换为文本模式如下图:

    当您处于文本模式下时再次点击右上角即可切换为key&value视图模式。

  5. 当您在配置详情处完成了预期配置修改,您可以点击保存新版本button去应用您的最新配置到集群上,弹窗中的版本名称为必填项。您有两种配置保存策略,仅保存新版本只会分发配置并不会让修改后的配置生效,保存并重启集群会将新版本生效。

  6. 保存新版本后您可查看当前版本历史,如下图:

  7. 在版本历史中skylab提供配置对比功能,您可以选中两个版本进行配置对比,以发现配置之间的区别。如下图:

  8. 在版本历史列表中您可以选择回滚到指定版本中。

    回滚后版本历史状态同步发生改变,回滚过程中集群服务会先被停止掉再重新启动,回滚前请确认是否期待停止集群再重启。

原理说明#

  1. 配置回滚功能简述: 由skylab平台提供默认配置,并将页面输入的自定义配置存储到数据库中,数据库中的配置内容为集群内所有角色的的公有配置项。由于不同角色的配置文件存在特异化的配置项,skylab为争取做到最大程度的覆盖所有组件,便不将特殊化配置项纳入平台数据库管理内。当您在skylab生成新的配置版本时,skylab借助后台助手将集群完整的配置落盘。当您回滚时后台助手会帮您完成版本的覆盖。

  2. 视图切换功能简述: skylab平台内支持大部分配置类型的视图转化,包括xml、json、conf、yaml等。但目前暂不支持env类型配置文件查看文本类型。