部署 Lava#

简介#

什么是 Lava#

Lava,即 Lava 服务,是偶数数据库管理平台 Skylab 中最基本的服务,由 【Lava 命令行工具】、【Lava 基础服务】和 【PG】 三部分组成。

  • Lava 命令行工具: Lava 命令行工具为您提供部署 SkyLab 服务的命令行,如lava scp、 lava ssh 等。

  • Lava 基础服务: Lava 基础服务为您提供可视化的操作界面(前台服务)和业务服务(后台服务),包含LavaServer、LavaAdmin、DBServer、Dataend

  • PG: PG,即 PostgreSQL,为您存储 Lava 服务过程中所需的数据信息。

部署 Lava#

部署Lava分为【部署单节点 Lava】、【部署高可用 Lava】、【向 Lava 中添加机器】、【安装其他工具/组件】和【组件配置变动】五部分内容。

  • 部署单节点 Lava:即在单个机器上部署 Lava。

  • 部署高可用 Lava:即部署高可用架构的 Lava,也可称为 Lava 的高可用。高可用 Lava 保证在某些机器出现故障时,仍能为您提供正常的服务。 一个高可用 Lava 至少由两台机器组成,一台为 master 节点,一台为 standby 节点,正常运行时,服务由 master 提供,当 master 发生故障时, 由 standby 节点接替 master 进行服务,通过这种机制来实现 Lava 服务的高可用。

  • 向 Lava 中添加机器:在一台或多台机器上已经部署了 Lava ,现需要将新的机器加入 Lava 纳管,这一行为称为【向 Lava 中添加机器】。

  • 安装其他工具/组件: 安装其他产品/组件,指的是向 Lava 管控的节点上安装其他工具或组件,如 OushuDB 集群、HDFS 集群、Hive 集群等。

  • 组件配置变动: 组件配置变动,是关于 Skylab 中修改组件配置和记录配置版本变动的功能,主要由【配置修改】、【配置展示】、【配置版本管理】、【配置回滚】、【配置对比】、【视图切换】等内容组成。

其他定义#

  • yum 源: yum 源在 Skylab 中用于存储软件包(如 rmp 格式的 Lava 安装包)。

操作指南#

部署单节点 Lava(非高可用架构部署 Lava)#

部署单节点 Lava 需要进行的操作流程为:【环境准备】=>【安装 Lava】=>【按需配置服务和路由】=>【验证安装结果】=>【使用/运维】。

本章节以 yum 源已配置在 IP 为 192.168.1.10 的机器为例,演示如何在单节点上部署 Lava,整个安装过程需使用 root 用户。

环境准备#

1. 准备 1 台主机

单节点部署 Lava 需要准备 1 台主机,主机的 IP 和主机上需要安装的内容如下表所示:

主机

主机IP

需要安装的内容

host1

192.168.1.11

Lava Master
PG Master

2. 准备 License 文件

安装过程中,需要提前准备好与所有需要安装和使用的软件版本相匹配的 License 文件,用于安装 Lava 时做认证。

3. 从 yum 源所在机器获取 repo 文件(安装包)

# 从yum源所在机器获取 repo 文件
scp oushu@192.168.1.10:/etc/yum.repos.d/oushu.repo /etc/yum.repos.d/oushu.repo

4. 安装 lava 命令行管理工具

由于 Lava 基础服务的服务的安装依赖于 Lava 命令行管理工具,所以您需要提前安装 Lava 命令行管理工具。

yum clean all
yum makecache
yum install lava

5. 验证 lava 命令行管理工具的安装结果

# 检验安装的版本号,如果返回值为期望的版本号,则证明安装成功
lava version

6. 创建log目录

在数据盘创建 log 目录(用于保存 lava 运行时的日志),并将 log 目录 link 到 /usr/local/oushu/log,以防止 log 或监控信息过多导致系统盘满,如:

# 将 /data1/log link 至 /usr/local/oushu/log
ln -s /data1/log /usr/local/oushu/log

安装 Lava 基础服务#

1. 准备配置文件

由于 Lava 的安装需要使用 Lava 安装脚本来执行,所以您在安装 Lava 之前,需要准备好 Lava 安装脚本的配置文件。

/usr/local/oushu/lava/conf/lava-env.sh文件中修改安装脚本配置,具体修改内容如下(注意对密码加密):

#!/bin/bash
############ Attention: Use "lava encrypt xxxxx" to encrypt passwords! ############
############ 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 lava master machine
export master_username=                       # ssh username of lava master machine
export master_password=                       # ssh password of lava master machine
export master_data_ip=                        # data ip of lava master machine
export master_manage_ip=                      # manage ip of lava master machine

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

export standby1_hostname=                     # hostname of standby machine(If there is third node)
export standby1_username=                     # ssh username of standby machine(If there is third node)
export standby1_password=                     # ssh password of standby machine(If there is third node)
export standby1_data_ip=                      # data ip of standby machine(If there is third node)
export standby1_manage_ip=                    # manage ip of standby machine(If there is third node)

######## postgres basic config ##########
export PGDATA=/usr/pgdata                                             # postgres data dir
export PGPORT=4432                                                    # postgres listener port
export PGUSER=oushu                                                   # postgres default user
export PGPASSWORD=dUPB8nqE1hWHFEm7uIKmwA==                            # 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)
export NET_NAME=eth0                                                  # postgres vip Ethernet Card binded for VIP2(only works in ha mode)
                                                                      # Need change the name according to the existing network card of data ip (only works in ha mode)
export SSHPORT=22                                                     # SSH Port (only works in ha mode)
export PG_USER_POSTGRES=scLIjEphmtmyJ6DTUkYQDITXD5SsovsGTqUxvW+CnQM=  # P for user "postgres" (only works in ha mode)
export PG_USER_PGPOOL=AslbNCmkM7Uphr3WpkC07w==                        # P for user "pgpool" (only works in ha mode)
export PG_USER_REPL=RaJ9lGgCVXy5Tq7FEj1iKA==                          # P for user "repl" (only works in ha mode)
export PCP_COMMAND_P=5peOWwmO2/BiLbkfbamCBQ==                         # P for PCP* command (only works in ha mode)
export PGPOOLLOGFILE=/data/pgpool/pgpool_log                          # PGPool log file folder (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  #

########## decrypt passwords ##############
export master_password=$(lava decrypt "$master_password" silence)
export standby_password=$(lava decrypt "$standby_password" silence)
export standby1_password=$(lava decrypt "$standby1_password" silence)
export PGPASSWORD=$(lava decrypt "$PGPASSWORD" silence)
export PG_USER_POSTGRES=$(lava decrypt "$PG_USER_POSTGRES" silence)
export PG_USER_PGPOOL=$(lava decrypt "$PG_USER_PGPOOL" silence)
export PG_USER_REPL=$(lava decrypt "$PG_USER_REPL" silence)
export PCP_COMMAND_P=$(lava decrypt "$PCP_COMMAND_P" silence)

2. 执行安装命令,Lava 安装脚本开始执行

注:在执行安装命令的过程中,请注意查看日志,如有报错,先处理报错,然后再继续下一步!

(1)安装 Lava

lava postgres-install master
lava infra-install master

(2)上传 License 文件

上传 License 文件至 /usr/local/oushu/conf/lava-server/ 目录,且 License 文件的名称必须为 skylab.license。

(3)启动 Lava 节点

# 注:此命令会启动 Lava 所有组件。如果需要手动单独启动 Lava 各组件,需要先启动 lava-server,之后再启动其他组件。
lava infra-start master

(4)将 Lava 注册到当前用户/租户下

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

# 出于安全考虑,切记不要带密码执行 lava login 命令(从 lava 6.3.0.0 开始,lava login 支持交互式输入密码)
lava login -u oushu -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://主机IP:3000】,如 http://192.168.1.11:3000

  • 默认登录租户:根租户

  • 默认登录用户:oushu

  • 默认登录密码:Oushu6@China

若能够正常登录到首页(如下图所示),则证明安装成功。

image-20221108113003823

使用/运维#

安装成功后,即可使用 Lava。下表是 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 基础服务的高可用】与 【PG 的高可用】两部分内容。 【Lava 基础服务的高可用】通过 VIP + Keepalived + Nginx 实现,VIP + Keepalived 保证了 Nginx 的高可用,Nginx 通过负载均衡的方式保证了 Lava 基础服务的高可用。 【PG 的高可用】通过 VIP + PGPool 实现。整体架构图如下图所示:

image-20221108113003823

部署高可用架构的 Lava,您需要进行的操作流程为【环境准备】=>【安装 Keepalived 和 Lava 基础服务】=>【按需配置服务和路由】=>【验证安装结果】=>【配置 Keepalievd】=>【使用/运维】。

环境准备#

1. 准备 License 文件

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

2. 准备主机

部署高可用 Lava 需要准备 3 台主机,2个虚拟IP(VIP1 和 VIP2) ,VIP1 用于实现 Lava 基础服务的高可用,VIP2 用于实现 PG 的高可用。

(注:高可用架构最少需要准备 2 台主机,3 台主机为最佳配置,本章节以 3 台主机进行介绍。)

3 台主机上,每个主机的 IP 和需要安装的内容如下表所示:

主机

主机IP

需要安装的 Lava 相关内容

需要安装的 PG 相关内容

host1

192.168.1.11

Keepalived
Nginx Master
Lava Master

PGPool
PG Master

host2

192.168.1.12

Keepalived
Nginx Standby
Lava Standby

PGPool
PG Standby

host3(可选)

192.168.1.13

PGPool
PG Standby

3. 为 PG 配置免密策略

在每一台主机上都执行如下命令:

# 为 postgres 用户设置密码 
sudo passwd postgres
su - postgres
mkdir ~/.ssh
chmod 700 ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa -f id_rsa_pgpool


# 为 postgres 用户配置免密策略(必需)
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

4. 从 yum 源所在机器获取 repo 文件(安装包)

所有主机都需要获取 repo 文件。在每一台主机上都执行如下命令:

# 从 yum 源所在机器获取 repo 文件
scp oushu@192.168.1.10:/etc/yum.repos.d/oushu.repo /etc/yum.repos.d/oushu.repo

5. 安装 Lava 命令行管理工具

在每一台主机上都执行如下命令:

yum clean all
yum makecache
yum install lava

6. 验证安装结果

# 检验安装的版本号,如果返回值为期望的版本号,则证明安装成功,其余任何情况均为安装不成功
lava version

安装 Keepalived 和 Lava 基础服务#

安装 Keepalived#

参考上述【简介】章节的描述,您需要在其中两台机器上安装 Keepalived,并配置 VIP1。Keepalived 用于实现 Nginx 的高可用,VIP1 是 Keepalived 在两台机器之间切换的虚拟路由。

具体步骤如下:

  1. 进入 Keepalived 官网 https://www.keepalived.org/ ,下载 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 {
        # VIP1
    }
    track_script {
        chk_nginx
    }
}
  1. 启动 Keepalived

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

在 Keepalived 所在的主节点上运行命令 ifconfig,查看是否新增了一个虚拟网卡用于绑定 VIP1。

修改安装脚本配置#

由于 Lava 的安装需要使用 Lava 安装脚本来执行,所以您在安装 Lava 之前,需要准备好 Lava 安装脚本的配置文件。

您需要在所有机器的/usr/local/oushu/lava/conf/lava-env.sh文件中修改安装脚本配置,具体修改内容如下(如没有特殊需求, 其他配置项可以保持默认值;注意对配置文件中的密码加密):

#!/bin/bash
############ Attention: Use "lava encrypt xxxxx" to encrypt passwords! ############
# 1.将下述 standalone 设置为 false,意为安装高可用的 Lava

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



# 2.填写机器基础配置,机器基础配置需要作为 master 所在机器的 Linux SSH 登录信息使用。

# 此部分内容中,所有以 “master_” 开头的配置项为【必填项】,且必须填写完整。
# standby 节点的配置项数量需要与您配置的 standby 节点数量对应
# 如当您只部署了一个 standby 节点时,需填写以 "standby_” 开头的配置项;如果您部署了两个 standby 节点,需要填写以 “standby” 开头的配置项和以 “standby1” 开头的配置项。

######## 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 standby machine(If there is third node)
export standby1_username=                     # ssh username of standby machine(If there is third node)
export standby1_password=                     # ssh password of standby machine(If there is third node)
export standby1_data_ip=                      # data ip of standby machine(If there is third node)
export standby1_manage_ip=                    # manage ip of standby machine(If there is third node)

# 3.postgres的基础配置

# 其中 “POSTGRES_VIP” 需要填写 VIP2 的值,“NET_NAME” 需要修改为 PGPool 安装的机器的数据网卡(内网网卡)的名称。

######## postgres basic config ##########
export PGDATA=/usr/pgdata                                             # postgres data dir
export PGPORT=4432                                                    # postgres listener port
export PGUSER=oushu                                                   # postgres default user
export PGPASSWORD=dUPB8nqE1hWHFEm7uIKmwA==                            # 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                                                  # postgres vip Ethernet Card binded for VIP2(only works in ha mode)
                                                                      # Need change the name according to the existing network card of data ip (only works in ha mode)
export SSHPORT=22                                                     # SSH Port (only works in ha mode)
export PG_USER_POSTGRES=scLIjEphmtmyJ6DTUkYQDITXD5SsovsGTqUxvW+CnQM=  # P for user "postgres" (only works in ha mode)
export PG_USER_PGPOOL=AslbNCmkM7Uphr3WpkC07w==                        # P for user "pgpool" (only works in ha mode)
export PG_USER_REPL=RaJ9lGgCVXy5Tq7FEj1iKA==                          # P for user "repl" (only works in ha mode)
export PCP_COMMAND_P=5peOWwmO2/BiLbkfbamCBQ==                         # P for PCP* command (only works in ha mode)
export PGPOOLLOGFILE=/data/pgpool/pgpool_log                          # PGPool log file folder (only works in ha mode)

# 4.Nginx 基础配置

# 其中 “nginx_vip” 为 VIP1 的值,此配置用于保证 Nginx 的高可用

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


# 5.网络端口配置,如没有特殊需求可以保持不变

########## 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  #

########## decrypt passwords ##############
export master_password=$(lava decrypt "$master_password" silence)
export standby_password=$(lava decrypt "$standby_password" silence)
export standby1_password=$(lava decrypt "$standby1_password" silence)
export PGPASSWORD=$(lava decrypt "$PGPASSWORD" silence)
export PG_USER_POSTGRES=$(lava decrypt "$PG_USER_POSTGRES" silence)
export PG_USER_PGPOOL=$(lava decrypt "$PG_USER_PGPOOL" silence)
export PG_USER_REPL=$(lava decrypt "$PG_USER_REPL" silence)
export PCP_COMMAND_P=$(lava decrypt "$PCP_COMMAND_P" silence)
安装 Lava 基础服务#

注:在执行安装命令的过程中,请注意查看日志,如有报错,先处理报错,然后再继续下一步!

1. 在 master 节点上安装 lava

(1)在准备安装 lava 的 master 节点上,执行如下命令:

# 安装 PG Master、PGPool 与 Lava Master

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

(2)检验上述命令是否执行成功

#执行如下命令
bash-4.2$ psql -h 10.0.*.* -p 9999 -U pgpool
test=# show pool_nodes;


# 若能返回以下内容,则证明安装 PG Master、PGPool 与 Lava Master 成功
|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)

(3)将 License 文件上传至路径/usr/local/oushu/conf/lava-server/skylab.license,否则后续注册步骤会失败

(4)执行命令lava infra-start master,启动 Master 节点。如果需要手动启动各组件,则需要先启动 lava-server,再启动其他组件。

2. 在 standby 节点上安装 lava

(1)在所有准备安装 standby 的节点上,执行如下命令:

# 安装 PG standby、 PGPool 与 lava standby, 并启动 lava
lava postgres-install standby
lava postgres-install pgpool

(2)检验上述命令是否执行成功

#执行如下命令
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)

(3)继续在 standby 节点上安装 lava

lava infra-install standby
lava infra-start standby

3. 注册 master 和 standby 节点

在 master 节点和 standby 节点均安装完成 lava 之后,在 master 节点上执行如下命令,以完成 Lava 基础服务的安装。

# 该命令会将各节点注册到 Lava 中(只有注册到 Lava 中,Lava 才能知道本环境中有哪几个节点)
# 注册 -u:用户;-p:密码;-T:租户名称或者租户编码
# 默认会将各节点注册至【根租户】的【oushu】用户下,如果您希望注册到其他租户或用户下,请修改第一行命令(lava login …)中的租户名称、
# 用户名称和密码(出于安全考虑,切记不要带密码执行 lava login 命令(从 lava 6.3.0.0 开始,lava login 支持交互式输入密码))。

lava login -u oushu -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://host1的IP:3000】,如 http://192.168.1.11:3000

  • 默认登录租户:根租户

  • 默认登录用户:oushu

  • 默认登录密码:Oushu6@China

若能够正常登录到首页(如下图所示),则证明安装成功。

image-20221108113003823

配置 Keepalived#

高可用 Lava 安装成功后,您需要修改 Keepalived 的监听脚本来配置 Keepalived。进入到文件/home/oushu/check_nginx.sh,执行下述命令:

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

配置完成之后,若您够成功登录网址 http://VIP1:3000,即证明 Keepalived 配置成功(默认登录租户:根租户,默认登录用户: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 master

lava postgres-start master

停止 postgres master

lava postgres-stop master

启动 postgres standby

lava postgres-start standby

停止 postgres standby

lava postgres-stop standby

重写 pgpool 相关脚本

lava postgres-install pgpool-shell

修改 postgres 用户密码脚本

lava postgres-edit -u pgpool(pg user) -r master|standby(master:PG主节点;standby:PG从节点)

登录Lava

lava login -T 租户名称|租户编码 -u 登录用户名(密码需要交互式输入)

加解密

lava encrypt|decrypt 需要加密、解密的字符串

PGPool 常用命令#

Lava 使用 PGPool-Ⅱ为您提供服务。若您希望监控和管理 PGPool 的服务,您可以使用 PGPool-Ⅱ内置的名为 PCP 的工具来进行操作。以下为 PCP 的一些常用命令和使用方法(建议使用 postgres 用户运行 PCP 的命令):

1. 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:该参数用于查看命令帮助。

2. 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

3. 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

4. pcp_recovery_node 命令

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

使用参数:

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

例:

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

5. pcp_reload_config

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

参数:

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

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

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

例:

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

6. show pool_nodes 命令

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

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

# 默认连接的端口号为 9999,默认使用 PG 的用户名和密码连接 PGPool
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-Ⅱ版本而异,不是所有版本都显示此列)。

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

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

以不使用明文密码的方式执行 lava login 命令#
  1. 依次点击右上角【头像】=>【账号管理】=>【新建密钥】,生成一条 API 密钥。

image-20221108113003823

  1. 将密钥写在一个文件中,文件的名称和位置可以自行定义,如

./.lavatoken
  1. 将上述文件读至变量$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 用户密码#
# 1.停止所有节点pgpool
pcp_stop_pgpool -h 10.0.*,* -p 9898 -U pgpool -m f -s c

# 2.按顺序执行以下所有命令,注意执行顺序不可更改

# 以下为 PG 主节点执行
sudo lava postgres-edit -u pgpool(此项填 pg user) -r master (master:代表此节点为 PG 主节点)

# 以下为 PG 全部从节点执行
sudo lava postgres-edit -u pgpool(此项填 pg user) -r standby (standby:代表此节点为 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



# 3.启动 PG 各个节点(启动全部节点,无顺序要求)
/bin/pgpool -f /etc/pgpool.conf -n -D > /tmp/pgpool.log 2>&1 &

# 使用 pcp 命令一键拉起 PG 从节点
# “1”代表需要拉起的 pgpool 节点的 node_id
pcp_recovery_node -h 10.0.192.250 -p 9898 -U pgpool -n 1

# 以下为返回结果
|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|

修改 PG 与 PGPool 的配置#
修改 PG 配置#
  1. 修改每个节点的配置

vi /$PGDATA/postgresql.conf
  1. 看修改具体配置项决定重新加载配置或者重新启动服务

pg_ctl -D $PGDATA reload/restart
  • reload: 重新读取配置。

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

  1. 通过 psql 连接 PGPool 并查看节点状态

# 默认连接的端口号为 9999,默认使用 PG 的用户名和密码连接 PGPool
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 高可用常见问题以及处理方式#
问题通用排查步骤#

出现问题时,命令行会出现报错信息,需要人工进行排查。以下时问题排查的具体步骤:

  1. 查看 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

除此之外,您也可以通过命令 ps -ef|grep service 查看服务进程是否正常。

  1. 修复 PGPool 服务(可省)

查看 PGPool 服务状态后,若 PGPool 服务的状态不健康,则需要修复 PGPool 服务。修复 PGPool 的方式为:【检查文件/etc/pgpool.conf的配置项】=>【启动 PGPool】=>【再次执行查看 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 &
  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 失败#

报错一:“无法接收客户端的请求”

例:

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

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

处理方法:

  1. 查看各 PG 服务运行是否正常

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

  2. 若 PG 服务正常

    若 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 &"

向 Lava 中添加机器(可选)#

本章节介绍用可视化操作向 Lava 中添加机器。

  1. 登陆管理平台,选择【菜单栏】=>【安装部署】进入到安装部署模块,点击【节点管理】进入节点管理界面。

image-20221103143957159

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

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

image-20221103144433556

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

image-20221103123114553

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

image-20221103123115223

安装其他工具/组件#

成功将机器注册进 Lava 之后(将机器加入 Lava 纳管),即可安装其他产品或组件(如 OushuDB 集群),其他工具或的安装,详见【安装部署】相关章节。

组件配置变动#

  • 配置状态说明:

    • 当前版本: 当前正在运行的集群所使用的配置版本,并不一定为文件系统上的配置版本。

    • 最新版本: 集群各节点的文件系统上的配置版本,当重启集群时最新版本才可以生效,生效后状态变为“当前版本”。

  • 版本保存说明:

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

    • 保存并重启集群: 该操作不仅将您修改的配置内容分发到指定机器的各节点配置目录下,也会重启集群,最终使集群应用修改后的配置。

使用说明#

注:以下使用Hive组件为例进行展示,其他组件同理

查看配置#

新建集群时,skylab 已为您提供默认配置。您可以在此进行配置修改,如下图所示。如图您可以在每个配置文件中新增参数、修改属性及其对应的值,同时您也可以删除 skylab 提供的默认参数。最终该配置将会作为当前集群的初始配置。

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

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

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

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

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

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

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

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

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

原理说明#

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

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