# 部署 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 文件。 2. 准备1台主机 各个节点上即将安装的组件如下表所示: | 主机 | host1 | | ---- | ---------------------- | | IP | 192.168.1.11 | | role | Lava Master
PG Master | 3. 配置yum源 从 yum 源所在机器获取 repo 文件: ```shell # 从yum源所在机器获取repo文件 scp oushu@192.168.1.10:/etc/yum.repos.d/oushu.repo /etc/yum.repos.d/oushu.repo ``` 4. 安装lava命令行管理工具 ```shell yum clean all yum makecache yum install lava ``` 5. 验证安装结果 安装完之后,运行如下命令检查安装结果,命令运行成功并且返回的版本号是期望的版本号,则证明安装成功。 ```shell lava version ``` 6. 创建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,机器信息必须完整。 ```shell #!/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 ``` 2. 上传 License 文件 上传 license 至 /usr/local/oushu/conf/lava-server/ 目录,名字必须为skylab.license。 3. 启动 Lava ``` lava infra-start master // 注意:如果手动启动各组件,需要先启动lava-server,之后再启动其他组件 ``` 4. 注册 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](./images/index.png) ### 使用/运维 下表中是 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](./images/HA-structure.png) ### 前提 本节默认 yum 源已经配置在 IP 为 192.168.1.10 的机器。安装过程需要使用 root 用户。 1. 准备 License 文件 安装过程中,需要提前准备好与软件版本(包含所有需要安装、使用的产品)相匹配的 License 文件。 2. 准备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 | 3. 为 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 ``` 4. 配置 yum 源 在 Master 节点和每一个 Standby 节点分别配置 yum 源: ``` # 从yum源所在机器获取repo文件 scp oushu@192.168.1.10:/etc/yum.repos.d/oushu.repo /etc/yum.repos.d/oushu.repo ``` 5. 安装 Lava 命令行管理工具 在 Master 节点和每一个 Standby 节点分别安装 Lava 命令行工具: ``` yum clean all yum makecache yum install lava ``` 6. 验证安装结果 在每一个节点安装完之后,运行如下命令检查安装结果,命令运行成功并且返回的版本号是期望的版本号,则证明安装成功。 ``` lava version ``` ### 安装 #### 安装 Keepalived Keepalived 的安装包和安装方式需要参考官网:https://www.keepalived.org/。 需要在其中两台机器上安装 Keepalived,并配置 VIP1 可以跳转访问两台机器。 1. 下载 Keepalived 安装 tar 包并解压。 2. 进入解压后的 Keepalived 目录并运行 make。 ``` sudo ./configure sudo make && sudo make install ``` 3. 创建检测脚本文件。 ``` sudo touch /home/oushu/check_nginx.sh sudo chmod 755 /home/oushu/check_nginx.sh ``` 脚本内容如下: ``` #!/bin/bash exit 0 ``` 4. 修改配置文件 /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 } } ``` 5. 启动。 ``` sudo systemctl start keepalived.service ``` 6. 验证安装结果。 在 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 ``` *上述操作完成之后及时验证部署是否成功 ```azure 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,之后再启动其他组件 ``` 2. 安装 Standby 节点: 在每一个准备安装 Standby 的节点上,运行如下命令安装 PG Standby、 PGPool 与 Lava Standby, 并启动 Lava: ``` lava postgres-install standby lava postgres-install pgpool ``` *上述部署完成验证是否部署成功 ```azure 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相关服务 ```azure lava infra-install standby lava infra-start standby ``` 3. 注册: 安装完成之后,在 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](./images/index.png) ### 配置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](./images/img_4.png) 2. 将密钥写在一个文件中,例如 ```shell ./.lavatoken ``` 3. 将token读至变量$token ```shell lavatoken=`cat ./.lavatoken` ``` 4. 使用$token作为认证,调用接口 ```shell curl -l -k -H "Content-type:application/json" -H "Token:$lavatoken" -X GET localhost:1652/admin/deploy/getAllMachines ``` #### pg高可用集群修改pg用户密码 ```azure #停止所有节点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` 2. 看修改具体配置项决定重新加载配置或者重新启动服务 `pg_ctl -D $PGDATA reload/restart` reload: 重新读取配置。 restart: 重启 PG 服务,会导致预期内的高可用集群主从故障转移。 3. 通过 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 & ``` 2. 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 ``` 3. 若各节点 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失败:没有到主机的路由 ```azure 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 pgpool` 与 `ps 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 &" ``` 2. 执行 show pool_nodes 获得 PG 节点的 ID (node_id字段) ``` bash-4.2$ psql -h VIP2 -p 9999 -Upgpool postgres=# show pool_nodes; ``` 3. 退出 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](./images/node-manager-sidebar.png) 在节点管理页面中,点击新建新建节点,弹出窗中根据网络环境配置子网信息,地域,可用区,这里的子网是一个逻辑网络分组的概念,每个子网中必须要有管理节点(带管理网卡IP的节点),地域和可用区只是在本逻辑分组中的字符标签,没有实际逻辑意义。 根据节点信息在子网中添加节点,注意这里的用户需要在机器上有sudo免密的权限。 ![image-20221103144433556](./images/new-node.png) 添加节点成功后,在节点列表页面将会有对应节点的展示。 ![image-20221103123114553](./images/node-list.png) 如果添加失败,则在节点添加的日志中有报错信息,根据报错信息修改节点或连接配置即可。 ![image-20221103123115223](./images/node-add-failed.png) ## 安装其他产品/组件 注册机器之后,即可安装其他产品/组件(如 OushuDB 集群),其他产品/组件的安装,详见相关产品/组件的安装部署章节。 ## 组件相关配置 ### 功能说明 1. 配置修改最新配置展示 2. 配置修改 3. 配置版本管理 4. 配置回滚 5. 配置对比 6. 视图切换 ### 前提 1. 配置状态说明: 1. **当前版本:** 指当前集群运行使用的配置版本,并不一定为文件系统上的配置内容。 2. **最新版本:** 集群各节点的文件系统上的版本内容,当重启集群时改配置才可以生效,生效后状态变为当前版本。 2. 版本保存说明 1. **仅保存新版本:** 该操作仅将skylab平台上修改的配置内容分发到指定机器的各节点配置目录下,并不会应用修改后的配置。 2. **保存并重启集群:** 该操作包含分发修改后的配置到各节点且重启集群各角色,最终使集群应用修改后的配置。 ### 使用说明 ***注:以下说明基于Hive组件,其他组件同理***。 1. 新建集群时skylab为您提供足以启动该类集群的默认的配置,但是如果您有配置修改的需求,您可以在这一步对配置文件做您期待的修改。如图您可以在每个配置文件中新增参数、修改属性及其对应的值,同时您也可以删除skylab提供的默认参数。最终该配置将会作为当前集群的初始配置。 ![](./images/auto-deloy-config.png) 2. 新建集群后您可以选择*集群配置*使用配置功能。 ![](./images/config-button.png) 3. 在配置详情页面可查看当前集群*最新版本*,在当前页面您不仅可以查看最新的配置,同时skylab还提供了修改/切换配置展示视图/保存新版本。 ![](./images/show-lastest-config.png) 4. 您可以在配置文件右上脚选择切换当前视图,skylab提供由key&value形式的展示转化为指定配置类型的文本模式且提供重做/注释等快捷操作。 key&value切换为文本模式如下图: ![](./images/change-kv-txt.png) 当您处于文本模式下时再次点击右上角即可切换为key&value视图模式。 5. 当您在配置详情处完成了预期配置修改,您可以点击保存新版本button去应用您的最新配置到集群上,弹窗中的版本名称为必填项。您有两种配置保存策略,仅保存新版本只会分发配置并不会让修改后的配置生效,保存并重启集群会将新版本生效。 ![](./images/save-config.png) 6. 保存新版本后您可查看当前版本历史,如下图: ![](./images/confighistorylist.png) 7. 在版本历史中skylab提供配置对比功能,您可以选中两个版本进行配置对比,以发现配置之间的区别。如下图: ![](./images/configfunc.png) ![](./images/compareconfig.png) ![](./images/comparetextconfig.png) 8. 在版本历史列表中您可以选择回滚到指定版本中。 ![](./images/rollbackconfig.png) 回滚后版本历史状态同步发生改变,回滚过程中集群服务会先被停止掉再重新启动,回滚前请确认是否期待停止集群再重启。 ![](./images/rollbackconfigresult.png) ### 原理说明 1. 配置回滚功能简述: 由skylab平台提供默认配置,并将页面输入的自定义配置存储到数据库中,数据库中的配置内容为集群内所有角色的的公有配置项。由于不同角色的配置文件存在特异化的配置项,skylab为争取做到最大程度的覆盖所有组件,便不将特殊化配置项纳入平台数据库管理内。当您在skylab生成新的配置版本时,skylab借助后台助手将集群完整的配置落盘。当您回滚时后台助手会帮您完成版本的覆盖。 2. 视图切换功能简述: skylab平台内支持大部分配置类型的视图转化,包括xml、json、conf、yaml等。但目前暂不支持env类型配置文件查看文本类型。