Vastbase G100高可用集群搭建

苏水的北關注IP屬地: 贵州

0.2112022.06.01 10:42:53字數 4,560閱讀 1,036

1. 概述

Vastbase 集群支持搭建一主一备与一主多备,本文档目的在于指导用户完成 Vastbase 数据库一主两备集群安装。

2. 集群架构

一主两备是典型的数据库集群部署方式,其中 1 个从节点为异步数据复制,另外 1 个 从节点为同步数据复制,其部署架构图如下图所示:

 

image.png

Vastbase 高可用架构组件:

1. dcs:记录节点状态信息;负责 has 集群仲裁;

2. has:自动检测主备状态,根据 dcs 仲裁进行主备切换;执行 switchover、failover; 管理 VIP;

3. Vastbase:数据库,数据存储、读写;负责 1 主、2 从数据同步(同步1,异步1);

4. VIP:对应用提供数据库连接服务,虚拟IP。

注意:该示例数据库集群由 3 台物理服务器组成,每台服务器部署 Vastbase 数据库和集群管 理软件 has 和 dcs,在主节点上通过 VIP 对外提供数据库服务。集群管理软件主要负责数 据库状态的检测,在出现故障时自动执行故障切换。

3. 环境说明和准备:

3.1、环境说明:

 

image.png

 

image.png

3.2、环境准备:

硬件环境准备:

类型主机名IP地址

主库

vastbase1

10.0.0.100

从库1

vastbase2

10.0.0.101

从库2

vastbase3

10.0.0.102

VIP

 

10.0.0.105

软件环境准备:

名称版本用途

OS

CentOS7.6

操作系统

dcs

1.0

分布式配置存储和集群仲裁软件

has

1.2

集群管理软件

Vastbase

2.2.x

数据库软件

数据库目录说明:

相关目录目录用途所属关系目录权限

/home/vastbase/data

数据目录

vastbase:vastbase

700

/home/vastbase/local

安装目录

vastbase:vastbase

775

/home/vastbase/archive

归档目录

vastbase:vastbase

775

/root/test

软件解压目录(解压dcs和has文件会用到)

root:root

755

dcs目录分配及文件说明:

目录目录说明文件名用途

/usr/local/bin/

dcs二进制程序安装目录

dcs、dcsctl

dcs管理命令

/usr/local/etc/

存放dcs主配置文件

dcs_conf.yml

dcs启动调用主配置文件

/usr/lib/systemd/system/

Linux系统systemctl管理服务配置路径

dcs.service

systemctl管理dcs启停

/etc/sysconfig

 

vastbase-dcs

服务启动时的环境变量

/data/dcs/data

存储dcs相关内容

 

 

has目录分配及文件说明:

目录目录说明文件名用途

/home/vastbase/has/bin

has二进制程序安装目录

has、hasctl

has管理命令

/home/vastbase/has/bin

也是存放回调脚本的位置

has_callback.sh

 

/home/vastbase/has/etc

has主配置文件存放目录

vastbase.yml

has主配置文件

/usr/lib/systemd/system/

Linux系统systemctl管理服务配置路径

has.service

systemctl管理has启停

/etc/sysconfig/

 

vastbase-has

服务启动时的环境变量

4. 数据库安装(三台都做):

备注:主库安装数据库软件并初始化数据库,2台从库只安装数据库软件。

4.1、三台服务器环境准备(每台服务器都要执行):

4.1.1、关闭防火墙:

systemctl stop firewalld.service

systemctl disable firewalld.service

4.1.2、修改/etc/selinux/config 文件中的“SELINUX”值为“disabled”:

[root@vastbase1 ~]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

# enforcing - SELinux security policy is enforced.

# permissive - SELinux prints warnings instead of enforcing.

# disabled - No SELinux policy is loaded.

SELINUX=disabled

4.1.3、设置时区和时间:

备注:将各数据库节点的时区设置为相同时区,可以将/usr/share/zoneinfo/目录下的时区文件拷贝为 /etc/localtime 文件

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

4.1.4、IPC参数设置:

1) 修改 /etc/systemd/logind.conf 文件,修改RemoveIPC=no

systemctl daemon-reload

systemctl stop systemd-logind

systemctl start systemd-logind

2)添加RemoveIPC=no到/usr/lib/systemd/system/systemd-logind.service

4.1.5、内核参数调整,修改/etc/sysctl.conf文件:

vim /etc/sysctl.conf

kernel.sem = 4096 2147483647 2147483646 512000

kernel.shmall = 419430

kernel.shmmax = 1200572800

net.core.netdev_max_backlog = 629145

net.core.rmem_default = 21299200

net.core.rmem_max = 21299200

net.core.somaxconn = 65535

net.core.wmem_default = 21299200

net.core.wmem_max = 21299200

net.ipv4.tcp_keepalive_intvl = 30

net.ipv4.tcp_keepalive_time = 30

net.ipv4.tcp_max_syn_backlog = 65535

net.ipv4.tcp_max_tw_buckets = 10000

net.ipv4.tcp_mem = 362715 483620 725430

net.ipv4.tcp_retries1 = 5

net.ipv4.tcp_retries2 = 80

net.ipv4.tcp_rmem = 8192 250000 16777216

net.ipv4.tcp_syn_retries = 5

net.ipv4.tcp_tso_win_divisor = 30

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_wmem = 8192 250000 16777216

net.ipv4.udp_mem = 725430 967240 1450860

内含参数解释说明:

kernel.sem = 4096 2147483647 2147483646 512000 #信号集容纳最大信号数量,所有信号的最大数量,调用单个信号集中最大信号数量,信号集的最大值

kernel.shmall = 1079609302220 #需计算(所有共享内存段相加大小限制,单位page,配小了,库无法启动。建议内存的80%,查看page 大小getconf PAGE_SIZE)

kernel.shmmax = 1079609302220 #需计算(最大单个共享内存段大小,单位bytes,需大于shared_buffers 值)

net.core.netdev_max_backlog = 65535 #内核从网卡收到数据包后,交由协议栈(如IP、TCP)处理之前的缓冲队列。

net.core.rmem_default = 21299200 #接收套接字(socket)缓冲区大小的默认值(以字节为单位)。

net.core.rmem_max = 21299200 #接收套接字缓冲区大小的最大值(以字节为单位)。

net.core.somaxconn = 65535 #用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制。

net.core.wmem_default = 21299200 #发送套接字缓冲区大小的默认值(以字节为单位)。

net.core.wmem_max = 21299200 #发送套接字缓冲区大小的最大值(以字节为单位)。

net.ipv4.tcp_keepalive_intvl = 30 #探测消息未获得响应时,重发该消息的间隔时间(秒)。

net.ipv4.tcp_keepalive_time = 30 #这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。

net.ipv4.tcp_max_syn_backlog = 65535 #表示那些尚未收到客户端确认信息的连接(SYN消息)队列的长度,加大队列长度为可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_tw_buckets = 10000 #表示系统同时保持TIME_WAIT套接字的最大数量。

net.ipv4.tcp_mem = 362715 483620 725430 #确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)

net.ipv4.tcp_retries1 = 5 #一个TCP连接请求,重传的N次不成功后放弃请求

net.ipv4.tcp_retries2 = 80 #在已经建立通讯状态下的一个TCP数据包,重传的N次不成功后放弃请求。

net.ipv4.tcp_rmem = 8192 250000 16777216 #tcp协议定义的每个socket链路接收窗口大小,单位字节,有三个值:min、default、max。

net.ipv4.tcp_syn_retries = 5 #控制内核向某个输入的SYN/ACK段重新发送相应的次数

net.ipv4.tcp_tso_win_divisor = 30 #单个TSO段可消耗拥塞窗口的比例

net.ipv4.tcp_tw_reuse = 1 #是否允许将处于TIME-WAIT状态的socket(TIME-WAIT的端口)用于新的TCP连接

net.ipv4.tcp_wmem = 8192 250000 16777216 #tcp协议定义的每个socket链路发送窗口大小,单位字节,有三个值:min、default、max。

net.ipv4.udp_mem = 725430 967240 1450860 #设置UDP缓存,避免UDP缓存溢出,出现丢包、无法连接等现象。

4.1.6、修改资源限制:

vim /etc/security/limits.conf

vastbase soft nproc unlimited

vastbase hard nproc unlimited

vastbase soft nofile 102400

vastbase hard nofile 102400

vastbase soft stack unlimited

vastbase hard stack unlimited

vastbase soft core unlimited

vastbase hard core unlimited

vastbase soft memlock unlimited

vastbase hard memlock unlimited

4.1.7、检查依赖包:

yum -y install zlib : 1.2.7

yum -y install libuuid : 2.23.2

yum -y install readline : 6.2

yum -y install python : 2.7.5

yum -y install krb5-libs : 1.15.1

yum -y install libicu : 50.2

yum -y install cracklib : 2.9.0

yum -y install tcl : 8.5.13

yum -y install perl : 5.16.3

yum -y install openldap : 2.4.44

yum -y install pam : 1.1.8

yum -y install systemd-libs : 219

yum -y install bzip2 : 1.0.6

yum -y install gettext : 0.19.8.1

yum -y install openssl : 1.0.2k

yum -y install libxml2 : 2.9.1

yum -y install libaio : 0.3.109

yum -y install ncurses-libs : 5.9

4.1.8、创建vastbase用户:

groupadd -g 1005 vastbase

useradd -g 1005 -u 1005 vastbase

passwd vastbase

4.1.9、登录vastbase用户,创建数据目录:

注意:从库data目录必须设置为700,如果设置了更高权限,会导致随后备库因为该目录权限过高而无法启动。

mkdir data

[vastbase@vastbase1 ~]$ ll

drwx------ 24 vastbase vastbase 4096 May 31 16:50 data

4.1.10、登录vastbase用户,创建archive目录:

mkdir archive

[root@vastbase1 /home/vastbase]# ll

total 123488

drwxrwxr-x 2 vastbase vastbase 294 May 31 16:18 archive

drwx------ 25 vastbase vastbase 4096 May 31 16:49 data

4.1.11、登录root用户,创建test目录,用来存放软件压缩文件:

mkdir test

4.1.12、上传vastbase数据库安装包和license认证文件,进行软件安装(vastbase用户执行):

[vastbase@vastbase1 ~]$ ll

total 123488

drwxrwxr-x 2 vastbase vastbase 70 May 31 10:56 archive

drwx------ 24 vastbase vastbase 4096 May 31 16:50 data

-rw------- 1 vastbase vastbase 39 May 31 10:51 pgpass

-rw-r--r-- 1 root root 126435814 May 25 16:03 Vastbase-G100-installer-2.2_Build_5.100-centos_7-x86_64-20220324.tar.gz

drwxr-xr-x 2 vastbase vastbase 168 Mar 24 14:52 vastbase-installer

-rw-r--r-- 1 root root 260 May 30 16:55 Vastbase_license_20220401_20221001

tar -xvf Vastbase-G100-installer-2.2_Build_5.100-centos_7-x86_64-20220324.tar.gz

cd vastbase-installer/

./vastbase_installer

4.1.13、数据库软件安装目录选择默认,即为/home/vastbase/local,安装完软件后执行source ~/.bashrc:

注意:以上13步,在每个数据库下都要进行。

4.2、主库进行实例化安装:

4.2.1、对主库进行实例初始化安装:(只在主库做)

[vastbase@vastbase1 ~]$vb_initdb -D /home/vastbase/data --nodename vastbase1 -w Wuxin7882832

4.2.2、登录主库,并修改vbadmin密码:(只在主库做)

备注:vbadmin账户我们会在后面vastbase.yml文件的pg_hba模块中进行配置,主要是用来进行主备同步恢复使用。

[vastbase@vastbase1 ~]$ vsql -r

vsql ((Vastbase G100 V2.2 (Build 5.100.5683)) compiled at 2022-03-24 14:36:43 commit 0 last mr )

Non-SSL connection (SSL connection is recommended when requiring high-security)

Type "help" for help.

vastbase=# ALTER ROLE vbadmin IDENTIFIED BY 'Wuxing7882832' REPLACE 'Wuxin7882832';

5. dcs安装(三台都做):

备注:dcs软件需要在每台服务器上进行安装。

5.1、安装dcs之前还要给三台服务器进行一些环境配置:

5.1.1、设置数据库用户的sudo权限

root执行visudo,添加如下内容

vastbase ALL=(ALL) NOPASSWD:ALL

vastbase ALL=(ALL) NOPASSWD:/sbin/ip

vastbase ALL=(ALL) NOPASSWD:/usr/sbin/arping

5.1.2、时间同步,或使用 ntpdate 配置时间同步:

备注:首先,如果当前网络环境不存在时间服务器,将数据库主节点设置为时间服务器节点。

vim /etc/ntp.conf

server 127.127.1.0

fudge 127.127.1.0 stratum 10

备注:添加上面2行内容,以上定义的是让 NTP Server 和其自身保持同步,如果在/etc/ntp.conf 中定义的 server 都不可用时,将使用 local 时间作为 ntp 服务提供给 ntp 客户端。

接着启动主节点 ntp 服务:

service ntpd start

备节点添加定时任务:注意:使用 root 用户将数据库主节点 10.0.0.100 设置为时间服务器节点。在备节点 10.0.0.101、10.0.0.102 执行步骤如下:

使用 crontab -e 编辑定时任务,定时同步系统时间,如每 10 分钟同步一次:

*/10 * * * * /usr/sbin/ntpdate -u 10.0.0.100 >> /var/log/ntp.log

5.1.3、把.Vastbase文件,拷贝到2个从库的/home/vastbase/目录下:

备注:拷贝节点vastbase1安装生成的数据库环境配置,覆盖其他节点规划各节点数据库安装目录及数据目录一致,拷贝vastdb1上的 ~/.Vastbase 并覆盖 vastbase2 以及 vastbase3 上对应的文件内容

scp .Vastbase vastbase@10.0.0.101:/home/vastbase

scp .Vastbase vastbase@10.0.0.102:/home/vastbase

5.2、安装部署dcs(3个节点都做):

5.2.1、上传dcs安装包,并解压到test目录下:

[root@vastbase2 ~]# ll

-rw-r--r-- 1 root root 223 May 29 15:25 dcs.service

-rw-r--r-- 1 root root 24383107 May 30 12:54 DCS_VastbaseG100_x86_V1.0_2022012711.zip

[root@vastbase1 ~]#unzip -d test/ DCS_VastbaseG100_x86_V1.0_2022012711.zip

[root@vastbase1 ~/test]# ll

total 54328

-rwxr-xr-x 1 root root 30820331 Jan 27 11:35 dcs

-rwxr-xr-x 1 root root 24806673 Jan 27 11:36 dcsctl

5.2.2、使用 root 用户创建 dcs 数据目录:

mkdir -p /data/dcs/data

5.2.3、把dcs可执行文件全部拷贝到安装目录/usr/local/bin:

[root@vastbase1 ~/test]# cp dcs* /usr/local/bin

5.2.3、安装dcs软件并配置dcs配置文件(dcs_conf.yml):

注意:使用 root 用户创建 dcs 配置文件,默认路径为/usr/local/etc,默认文件名称为 dcs_conf.yml(注意,路径和文件名称需跟 vastbase-dcs 文件中 CONFIG_FILE 所指 定保持一致,vastbase-dcs 文件后续配置服务会使用到)。文件参数说明:

 

image.png

 

image.png

以vastbase2节点为例,配置内容如下:

[root@vastbase2 /usr/local/etc]# cat dcs_conf.yml

name: dcs02

data-dir: /data/dcs/data

initial-advertise-peer-urls: http://10.0.0.101:2380

listen-peer-urls: http://10.0.0.101:2380

listen-client-urls: http://10.0.0.101:2379,http://127.0.0.1:2379

advertise-client-urls: http://10.0.0.101:2379

initial-cluster-token: dcs-cluster-vastbase

initial-cluster: dcs01=http://10.0.0.100:2380,dcs02=http://10.0.0.101:2380,dcs03=http://10.0.0.102:2380

enable-v2: true

initial-cluster-state: new

5.2.4、dcs服务配置,把dcs服务用systemctl命令管理:

备注:Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。 systemctl enable 命令用于在上面两个目录之间,建立符号链接关系。

vim /usr/lib/systemd/system/dcs.service

[Unit]

Description=Vastbase DCS server daemon

After=network.target

[Install]

WantedBy=multi-user.target

[Service]

Type=notify

EnvironmentFile=-/etc/sysconfig/vastbase-dcs

ExecStart=/usr/local/bin/dcs $CONFIG_FILE

Restart=no

注: ExecStart=/usr/local/bin/dcs 配置以实际dcs执行文件路径为准

关键配置项含义如下:

a. ‘After’:指定‘dcs’服务在‘network’服务启动成功后启动。实际生产 环境往往部署 dcs 集群,依赖网络。b. ‘EnvironmentFile’:服务启动的环境变量文件路径。路径名之前‘-’号 含义为如果该文件不存在则忽略。‘该文件路径根据实际部署路径填写’。c. ‘ExecStart’:服务器的启动命令。这里假设‘dcs’安装在‘/usr/local/bin’ 目录下。d. ‘$CONFIG_FILE’是‘EnvironmentFile’中定义的一个环境变量,用来指 定‘dcs’启动时的配置文件,这里假设配置文件在‘/usr/local/etc’目录下。

5.2.5、配置 dcs 服务启动时的环境变量:

配置文件/etc/sysconfig/vastbase-dcsa. 配置‘ETCD_UNSUPPORTED_ARCH=arm64’是为了解决‘ARM’平台无 法运行的问题,ARM 平台才需要,x86 不需要。b. ‘CONFIG_FILE’作为‘dcs’启动时的命令行参数,这个文件其实也就是dcs的配置文件dcs_conf.yml。

vi /etc/sysconfig/vastbase-dcs

#ETCD_UNSUPPORTED_ARCH=arm64

CONFIG_FILE=--config-file /usr/local/etc/dcs_conf.yml

5.2.6、启动dcs服务:

注意:启动 dcs,启动 dcs 第一个节点时会出现阻塞,第二个节点启动后退出阻塞。先启动主库dcs,紧接着启动2个从库dcs。

加载 dcs 服务

systemctl daemon-reload

dcs 服务自启动

systemctl enable dcs

启动 dcs,注意必须关闭 selinux

systemctl start dcs

systemctl status dcs

查看节点状态,进入到 dcs 安装目录,执行如下命令:

cd /usr/local/bin

./dcsctl cluster-health

./dcsctl member list

5.2.7、验证dcs是否启动成功:

[root@vastbase3 /usr/local/bin]# ./dcsctl cluster-health

member 92cfec3e6ff6602a is healthy: got healthy result from http://10.0.0.101:2379

member bc9da4c78543b6a5 is healthy: got healthy result from http://10.0.0.102:2379

member bfa52d3fd6b63d99 is healthy: got healthy result from http://10.0.0.100:2379

cluster is healthy

[root@vastbase3 /usr/local/bin]# ./dcsctl member list

92cfec3e6ff6602a: name=dcs02 peerURLs=http://10.0.0.101:2380 clientURLs=http://10.0.0.101:2379 isLeader=true

bc9da4c78543b6a5: name=dcs03 peerURLs=http://10.0.0.102:2380 clientURLs=http://10.0.0.102:2379 isLeader=false

bfa52d3fd6b63d99: name=dcs01 peerURLs=http://10.0.0.100:2380 clientURLs=http://10.0.0.100:2379 isLeader=false

6. 部署 has 服务(三台都做):

备注:安装 has,使用 root 用户进行如下操作

6.1、创建目录,直接把解压后得到的两个可执行文件拷贝到 has 的安装目录:

mkdir -p /home/vastbase/has/bin

mkdir -p /home/vastbase/has/etc

[root@vastbase1 ~]# unzip -d test/ HAS_VastbaseG100_x86_64_V1.2_2021111511.zip

[root@vastbase1 ~]# cp test/has* /home/vastbase/has/bin/

[root@vastbase1 /home/vastbase/has/bin]# ll

-rwxr-xr-x 1 root root 22143384 May 30 14:59 has

-rwxr-xr-x 1 root root 22890968 May 30 15:00 hasctl

6.2、has数据库参数文件(vastbase.yml)配置:

[root@vastbase1 /home/vastbase/has/etc]# chown vastbase:vastbase vastbase.yml

[root@vastbase1 ~]# vim /home/vastbase/has/etc/vastbase.yml

scope: vastbase_ha_inst # 集群实例名称

namespace: /vastbase/ # 集群实例所在的命名空间,默认是/service

name: 'vastbase_node1' # 节点在集群内的名称,每个节点都必须不一样,通过hasctl list命令查看高可用集群状态时,在Member显示该名称

restapi:

listen: 10.0.0.100:8008 # has服务监听的套接字,172.16.101.101为本节点的IP地址,下面的配置信息涉及172.16.101.101均表示本节点IP地址

connect_address: 10.0.0.100:8008 # 高可用集群内,其他节点通过本参数的地址访问本节点的has服务,

etcd:

hosts: 10.0.0.100:2379,10.0.0.101:2379,10.0.0.102:2379 # dcs地址集

bootstrap:

dcs:

ttl: 60 # 持有单个DCS key的最长时间,单位秒,例如主节点持有leader key,如果不能再该时间内更新leader key,那么可以认为发生failover

loop_wait: 10 # has两次执行工作之间的时间间隔,单位秒

retry_timeout: 10 # 重试次数

maximum_lag_on_failover: 1048576 # 从库允许被参与选举主库,最大的延迟字节数

synchronous_mode: 'true' # 是否开启同步模式,开启后,has会决定哪个节点是同步备库并覆盖数据库配置文件内的synchronous_standby_names参数

postgresql:

use_pg_rewind: true # 是否使用rewind,必须开启

use_slots: true # 是否使用复制槽,必须开启

parameters: # 此处配置的是公共部分的参数,所有节点生成的配置文件都是一致的,如有个性化需求,请在下面的postgresql.parameters部分配置

license_path: '/home/vastbase/Vastbase_license_20220401_20221001' # license证书路径,生产环境应申请license证书

vastbase_login_info: 'off' # 高可用环境必须关闭

listen_addresses: '*' # 一般情况下,设置为*即可。特殊情况根据使用设置

port: 5432 # 非必须参数,根据实际情况调整

max_connections: 200 # 根据使用情况设置,如果开启并行查询,需要设置较大值

session_timeout: 10min

client_min_messages: warning # 输出到客户端的信息级别,如无特殊需求,设置为warning即可

log_min_messages: warning # 日志级别

log_destination: 'stderr' # 日志文件以何种方式输出

logging_collector: on # 是否开启日志收集,如果特殊情况,一般开启

log_directory: 'log' # 日志文件存放目录,如果配置相对路径,则该目录在数据库实例目录下

log_filename: 'postgresql-%Y-%m-%d_%H%M%S.log' # 日志文件名称

log_rotation_size: 50MB # 日志文件大小达到该值时,触发日志文件切换

log_duration: off # 记录sql语句的执行时长,如果特殊需求,一般关闭

log_statement: 'all' # 根据需要设置,POC测试等功能测试或者试生产阶段等不追求性能的场景可以设置为all,否则根据实际情况考虑

track_activities: on # 必须开启,控制收集每个会话中当前正在执行命令的统计数据,否则pg_stat_replication视图查询不到数据

enable_instr_track_wait: on # 是否开启等待事件信息实时收集功能

enable_instr_rt_percentile: off # 是否开启计算机中85%,90%的SQL的响应时间功能。可根据需要开启

track_counts: on # 是否收集表和索引上的统计信息,默认为on

track_sql_count: off

enable_instr_cpu_timer: off

enable_instance_metric_persistent: off

enable_logical_io_statistics: off

enable_user_metric_persistent: off

enable_resource_track: off

instr_unique_sql_count: 0

plog_merge_age: 0

shared_buffers: 256MB # 建议物理内存40%左右

max_process_memory: 2GB # 建议物理内存80%左右

work_mem: 5MB # tpcc中1mb是可以的,业务测试中建议适当加大,根据业务特点设置大小,参考开发者指南。设置内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小。ORDER BY,DISTINCT和merge joins都要用到排序操作。Hash表在散列连接、散列为基础的聚集、散列为基础的IN子查询处理中都要用到。

cstore_buffers: 16MB # 如果没有列存或者用不到列存,保持最小的16MB就好

maintenance_work_mem: 20MB # 建议适当加大

max_files_per_process: 200 # 允许同时打开的files的最大数量

max_prepared_transactions: 200 # 不能小于max_connections

bulk_write_ring_size: 20MB

wal_level: hot_standby # xlog日志级别,如果开启极致RTO,设置为archive,否则设置为hot_standby

wal_log_hints: on # 设置为on即可

advance_xlog_file_num: 10 # 提前初始化xlog文件的数量,默认值为10,高负载环境下建议适当调大一些

wal_buffers: 5MB

xloginsert_locks: 16

enable_xlog_prune: off

max_wal_senders: 4 # walsender最大数量,根据备机数量设置,建议设置为备机数量的2倍

wal_keep_segments: 128 # 建议设置128及以上,如果太小,在主库重新加入集群时有可能造成增量build失败并触发全量build

max_replication_slots: 8

synchronous_commit: on # 可选值 off、on、remote_receive、remote_write、remote_apply,建议至少为on

enable_mergejoin: on

enable_nestloop: on

enable_hashjoin: on

enable_bitmapscan: on

enable_material: on

enable_codegen: false

enable_opfusion: off #生产环境中,两个fusion参数均关闭

enable_beta_opfusion: off

query_dop: 1 # 2.2.4版本加入的参数,此参数为1,表示不开启并行查询功能。如果query_dop>1,则为开启并行查询的并行度,对于复杂的嵌套查询,可以提升查询性能,但是也会消耗大量的max_connections资源,所以如果query_dop>1,加大max_connections(建议设置为2万以上)

autovacuum: on

autovacuum_mode: vacuum

autovacuum_max_workers: 10

autovacuum_naptime: 20s

autovacuum_vacuum_cost_delay: 10

autovacuum_vacuum_scale_factor: 0.02

autovacuum_analyze_scale_factor: 0.1

enable_save_datachanged_timestamp: false

vacuum_cost_limit: 10000

autoanalyze_timeout: 900

enable_incremental_checkpoint: on # 开启增量检查点

incremental_checkpoint_timeout: 60s

checkpoint_segments: 1024

checkpoint_timeout: 3min # 默认设置15分钟,如果设置过长,在持续高负载环境下,会产生大量脏页造成停库时间比较久,因此根据需要调整,可以适当设置得比默认值小,例如3分钟

checkpoint_completion_target: 0.9

checkpoint_warning: 5min

checkpoint_wait_timeout: 60s

pgxc_node_name: 'vastbase_ha_inst' # 建议与第一行参数scope保持一致

synchronous_standby_names: '*' # 设置为*即可,开启synchronous_mode后,该参数会被has重写

password_encryption_type: 0

password_force_alter = 'False'

most_available_sync: on # 根据需要设置,如果此参数为on,为最大可用模式,备库停机不影响主库业务连续性。但此时不能保证主备数据安全性。

remote_read_mode: non_authentication

hot_standby_feedback: off # 根据需要设置,如果需要保证备库复杂查询不出错,就是设置为on

enable_data_replicate: off

hot_standby: on # 备库是否接受只读连接,如果开启极致RTO,请设置为off,如果在高负载下进行高可用切换测试,建议开启极致RTO,开启方式请参考wiki上的《部署指南》

replication_type: 1 # 标记HA模式,设置为1即可。0 表示主备从模式 1 表示使用一主多备模式

recovery_max_workers: 8 # 开启并行回放时设置最大并行回放线程个数

recovery_parallelism: 1 # 只读参数,实际的回放线程个数,设置为默认值1即可,数据库启动时自动重新计算

recovery_parse_workers: 1 # 极致RTO特征,并行恢复时解析XLOG线程的个数,若与recovery_max_workers同时大于1,则以recovery_parse_workers为准,并行回放特性失效

recovery_redo_workers: 1 # 极致RTO特性,每个解析XLOG线程拥有的REDO线程的个数

recovery_time_target: 0 # 流控参数,设置为0即可,即不开启日志流控

enable_page_lsn_check: on # 默认打开即可

audit_enabled: off # 审计日志配置,若无特别需要,直接关闭审计功能

audit_login_logout: 7

audit_user: '*'

audit_user_locked: 1

audit_grant_revoke: 1

audit_system_object: 12295

audit_dml_state: 0

audit_dml_state_select: 0

audit_function_exec: 0

audit_copy_exec: 0

audit_set_parameter: 1 # whether audit set parameter operation

audit_operation_result: 0 # selective audit based on audit results (0 disables the feature, 1 success, 2 failure)

fsync: on # 必须开启

full_page_writes: off # 开启增量检查点,full_page_writes会被关闭

enable_double_write: on # 必须开启,增量检查点开关打开时,不再使用full_page_writes防止半页写问题,而是依赖双写特性保护

allow_concurrent_tuple_update: true

enable_alarm: off

use_workload_manager: off

transaction_isolation: 'read committed'

default_transaction_isolation: 'read committed'

update_lockwait_timeout: 20min

pagewriter_sleep: 5ms

# ------线程池部分,根据实际平台进行配置------

enable_thread_pool: on # 根据实际情况开启

numa_distribute_mode: 'none' # all/none:只有在aarch64平台release版本才支持all,其他平台都是none

initdb:

- encoding: UTF8

pg_hba:

- host all vastbase 10.0.0.101/32 trust # 配置集群内所有节点的${initdb_user}用户远程访问为trust,否则增量build失败,${initdb_user}为初始化实例的用户,一般与操作系统用户同名;如果是IPV6地址,需要替换IP为IPV6,例如:- host all ${initdb_user} 2001:0:3238:e1:63::133/24 trust

- host all vastbase 10.0.0.102/32 trust

- host all vastbase 10.0.0.103/32 trust

- host all all 0.0.0.0/0 md5 # 此行配置必须在最后;如果是IPV6地址,需要替换IP为IPV6,例如:- host all all ::0/0 md5

postgresql:

callbacks:

on_start: /home/vastbase/has/bin/has_callback.sh # 回调脚本路径,一般用于管理VIP

on_stop: /home/vastbase/has/bin/has_callback.sh

on_role_change: /home/vastbase/has/bin/has_callback.sh

listen: 0.0.0.0:5432

connect_address: 10.0.0.100:5432

use_unix_socket: true

use_extreme_rto: false # 如果开启极致RTO,该参数必须设置为true,开启极致RTO后,备机不可读

pg_ctl_timeout: 600 # 数据库启动超时时间,根据实际情况设置

data_dir: /home/vastbase/data # 数据库实例路径

config_dir: /home/vastbase/data # 数据库实例配置文件路径

bin_dir: /home/vastbase/local/vastbase/bin # 数据库可执行文件路径

vastbase_lib_dir: /home/vastbase/local/vastbase/lib:/home/vastbase/local/vastbase/jre/lib/aarch64:/home/vastbase/local/vastbase/jre/lib/aarch64/server # 数据库共享库路径

vastbase_home: /home/vastbase/local/vastbase # 数据库安装路径

authentication:

replication:

username: vbadmin

password: Wuxin7882832

superuser:

username: vbadmin

password: Wuxin7882832

parameters: # 个性化配置部分,以下配置项建议写到该部分

application_name: vastbase_node1 # 数据库节点名称,建议与第3行的name参数保持一致,否则synchronous_mode开后后不生效,此外,此参数不要写在bootstrap部分

archive_mode: on # 是否开启归档,根据实际情况

archive_command: 'cp %p /home/vastbase/archive/%f' # 根据实际情况配置

archive_dest: '/home/vastbase/archive' # 直接指定归档目录,效率比archive_command高,设置本参数后archive_command参数失效

unix_socket_directory: '/tmp' # v2.2.9版本以上的库不能配置此参数

replconninfo1: 'localhost=10.0.0.100 localport=55434 localheartbeatport=55435 localservice=55436 remotehost=10.0.0.101 remoteport=55434 remoteheartbeatport=55435 remoteservice=55436'

replconninfo2: 'localhost=10.0.0.100 localport=55434 localheartbeatport=55435 localservice=55436 remotehost=10.0.0.102 remoteport=55434 remoteheartbeatport=55435 remoteservice=55436'

重要参数说明:注意:每个节点不同的配置,以及各文件绝对文件名配置。 具体注意事项:1)如果开启了归档,如上面的配置,需要创建归档的目录(我们在上面已经创建):mkdir -p /home/vastbase/archivechown -R vastbase.vastbase /home/vastbase/archive

2)主备复制会在节点间进行远程连接,注意网络配置,如果没有设置dns,且参数log_hostname=on时,日志搜集主机名会因为找不到dns导致连接超时,从而主备配置失败。

该配置文件中有如下配置回调脚本,on_start: /home/vastbase/has/bin/has_callback.shon_stop: /home/vastbase/has/bin/has_callback.shon_role_change: /home/vastbase/has/bin/has_callback.sh

4)每个节点中上述配置文件,单独的ip配置不同, 每个节点的如下配置也不同,根据实际情况修改对应的名称和ip:scope: vastbase_ha_inst # 集群实例名称,默认即可namespace: /vastbase/ #默认即可name: 'vastbase_node1' #每个节点名称不可以重复application_name: vastbase_node1 #数据库节点名称,建议与第3行的name参数保持一致connect_address:10.0.0.100:8008 #配置本机IP地址connect_address:10.0.0.100:5432 #配置本机IP地址5)每个节点中有如下复制连接的配置,每个节点中都有针对其他的每一个节点的一条记录。replconninfo1代表的就是每条复制通道,有几个从库,就需要配置几条replconninfo:

replconninfo1: 'localhost=10.0.0.100 localport=55434 localheartbeatport=55435 localservice=55436 remotehost=10.0.0.101 remoteport=55434 remoteheartbeatport=55435 remoteservice=55436'

replconninfo2: 'localhost=10.0.0.100 localport=55434 localheartbeatport=55435 localservice=55436 remotehost=10.0.0.102 remoteport=55434 remoteheartbeatport=55435 remoteservice=55436'

6)注意配置文件中关于数据库安装目录以及实例目录的配置,按实际情况修改7)注意每行前面空格个数, 该配置文件以空格缩进。 同时该配置文件\t为非法字符。

高可用数据库参数暂不支持numa特性,即不能设置 numa_distribute_mode参数

6.3、has 服务配置(使用 root 用户将 has 加入系统服务,便于管理):

配置文件/usr/lib/systemd/system/has.service:

[root@vastbase1 ~]# vim /usr/lib/systemd/system/has.service

[Unit]

Description=Vastbase HAS server daemon

After=network.target

[Install]

WantedBy=multi-user.target

[Service]

Type=simple

User=vastbase

EnvironmentFile=-/etc/sysconfig/vastbase-has

ExecStart=/home/vastbase/has/bin/has $CONFIG_FILE

ExecStopPost=/usr/bin/sudo /usr/sbin/ip addr del ${VIP}/${VIPNETMASKBIT} dev ${VIPDEV} label ${VIPDEV}:${VIPLABEL}

TimeoutStopSec=600

Restart=no

LimitMEMLOCK=infinity

LimitNOFILE=1024000

参数说明:a. ‘After’:指定‘has’服务在‘network’启动成功后启动。b. ‘Type’:一般设置 simple 即可,如操作系统支持 exec,则配置为 exec。c. ‘User’:has 运行过程中可能会初始化或者启动数据库,这些操作不能以 ‘root’用户执行,故指定该服务的用户跟数据库用户一致为‘vastbase’。d. ‘ExecStopPost’:指定‘has’进程终止后执行的命令,需要使用绝对路径 指定命令路径,在 has 服务中,用于释放 VIP。e. ‘TimeoutStopSec’: 设置等待关闭的超时时间

6.4、配置服务启动时的环境变量配置:

配置文件/etc/sysconfig/vastbase-has

vim /etc/sysconfig/vastbase-has

CONFIG_FILE=/home/vastbase/has/etc/vastbase.yml

VIP=10.0.0.105

VIPBRD=10.0.0.255

VIPNETMASK=255.255.255.0

VIPNETMASKBIT=24

VIPDEV=eth0

VIPLABEL=1

6.5、配置 VIP(高可用回调脚本设置):

备注:使用数据库用户进行操作,在/home/vastbase/has/bin 目录下创建 has_callback.sh 文件,需要执行命令 chmod +x 给该文件执行权限,该文件由 has 在节点角色切换时调 用,用于绑定与释放 VIP。

[root@vastbase1 /home/vastbase/has/bin]# chmod +x has_callback.sh

[root@vastbase1 /home/vastbase/has/bin]# chown vastbase:vastbase has_callback.sh

[root@vastbase1 /home/vastbase/has/bin]# ll

total 43988

-rwxr-xr-x 1 root root 22143384 May 30 14:59 has

-rwxr-xr-x 1 vastbase vastbase 1709 May 30 17:40 has_callback.sh

-rwxr-xr-x 1 root root 22890968 May 30 15:00 hasctl

[root@vastbase1 /home/vastbase/has/bin]# cat has_callback.sh

#!/bin/bash

# 由patroni调用该脚本时传入以下三个参数

readonly cb_name=$1

readonly role=$2

readonly scope=$3

# 以下参数请根据实际情况修改填写

VIP=10.0.0.105 # 虚拟IP

VIPBRD=10.0.0.255 # 广播地址

VIPNETMASK=255.255.255.0 # 子网掩码

VIPNETMASKBIT=24 # 网络前缀

#VIPifconfig

VIPDEV=eth0 # vip使用的网卡,填写实际网卡名

VIPLABEL=1 # vip网卡后缀名

例如:

inet 10.0.0.105/24 brd 10.0.0.255 scope global secondary eth0:1

VIPLABEL的网卡后缀名为1

6.6、启动高可用服务(重要):

注意:以服务方式启动‘has’后,数据库进程也属于该服务,若使用‘kill -9’杀死 has 进程,数据库进程也会被杀死。

1、加载 has 服务

systemctl daemon-reload

2、启动has服务

启动:systemctl start has

启动状态查看:systemctl status has

3、has 启动完毕,集群状态查看

[root@vastbase1 ~]#cd /home/vastbase/has/bin

[root@vastbase1 /home/vastbase/has/bin]# ./hasctl -c /home/vastbase/has/etc/vastbase.yml list

6.6.1、先启动主库的has并查看集群状态:

启动主库has:

[root@vastbase1 /home/vastbase/has/etc]# systemctl start has

当主库has成功启动后,并且通过命令能看到如下结果后再开始启动备库.

[root@vastbase1 /home/vastbase/has/bin]# ./hasctl -c /home/vastbase/has/etc/vastbase.yml list

=========================>>> Group:vastbase_ha_inst, Xlog Location:901F338 <<<=========================

+----------------+------------+--------+---------+----+-----------+------------------------------+

| Member | Host | Role | State | TL | Lag in MB | Message |

+----------------+------------+--------+---------+----+-----------+------------------------------+

| vastbase_node1 | 10.0.0.100 | Leader | running | 1 | 0 | promote[2022-06-01 09:00:10] |

+----------------+------------+--------+---------+----+-----------+------------------------------+

此时主库上产生了vip:

 

image.png

6.6.2、再启动从库1的has并查看集群状态:

启动从库1的has:注意:备库启动has会自动从主库复制文件并创建只读备库

[root@vastbase2 ~]# systemctl start has

在主库中查看集群状态:

 

image.png

6.6.3、再启动从库2的has并查看集群状态:

启动从库2的has:注意:备库启动has会自动从主库复制文件并创建只读备库

[root@vastbase3 ~]# systemctl start has

在主库中查看集群状态:

 

image.png

6.6.4、主库has启动失败检查方法(重要):

1、初始化时如果vastbase.yml等配置文件设置错误会导致has启动异常,或数据库实例无法启动.具体报错请通过如下方式进行查看:1.1、systemctl status has1.2、journalctl -xe 查看系统报错日志或者通过 journactl -u has -n 30 -f 指定has查看响应的报错1.3、通过系统日志 /var/log/messages查看对应报错2、主库初始化,当vastbase.yml配置文件在初始化时候读取,如果因为参数错误,导致数据库无法启动,建议重新初始化,步骤为:

systemctl stop has

/usr/local/bin/dcsctl ls

/usr/local/bin/dcsctl rm -r --dir /vastbase

6.7、如果集群损坏,要重新初始化集群:

备注:集群已经搭建完成,需要重新初始化数据库并启动集群,这种情况需要严格按照如下步骤 执行:

6.7.1、先检查dcs,确保dcs识别的主在主库(dcs必须全部正常才可以启动has服务):

[root@vastbase1 /home/vastbase/has/bin]# cd /usr/local/bin

[root@vastbase1 /usr/local/bin]# ./dcsctl cluster-health

member 92cfec3e6ff6602a is healthy: got healthy result from http://10.0.0.101:2379

member bc9da4c78543b6a5 is healthy: got healthy result from http://10.0.0.102:2379

member bfa52d3fd6b63d99 is healthy: got healthy result from http://10.0.0.100:2379

cluster is healthy

[root@vastbase1 /usr/local/bin]# ./dcsctl member list

92cfec3e6ff6602a: name=dcs02 peerURLs=http://10.0.0.101:2380 clientURLs=http://10.0.0.101:2379 isLeader=false

bc9da4c78543b6a5: name=dcs03 peerURLs=http://10.0.0.102:2380 clientURLs=http://10.0.0.102:2379 isLeader=false

bfa52d3fd6b63d99: name=dcs01 peerURLs=http://10.0.0.100:2380 clientURLs=http://10.0.0.100:2379 isLeader=true

6.7.2、停止所有节点 has 服务(先停止备库has,再停止主库has):

systemctl stop has

6.7.3、删除所有备库节点数据库数据(主库在非必要时可以不删除):

在所有备节点数据库用户执行:rm -rf $PGDATA/*

6.7.4、清理节点 dcs 数据:

备注:查看 dcs 配置文件可以获取到 dcs 数据目录,root 用户删除所有节点上 dcs 数据。

/usr/local/bin/dcsctl ls

/usr/local/bin/dcsctl rm -r --dir /vastbase

注意:注:${has_namespace}是 has 配置文件的 namespace 属性,如果配置文件内没有 namespace属性,默认为/service。

6.7.5、重启所有节点 has 服务:

先在主节点上启动 has 服务:在主节点 root 用户执行:systemctl start has等待主节点完成初始化后(可以通过 ps -ef 进程命令查看方式确认数据库已经启动), 启动备节点 has 服务:在备节点 root 用户执行:systemctl start has

7. 集群使用管理:

7.1、集群、启停、查看:

7.1.1、启动所有dcs服务:

启动 dcs,启动 dcs 第一个节点时会出现阻塞,第二个节点启动后退出阻塞。

systemctl start dcs

 

image.png

7.1.2、先启动主库 has,再启动备库 has。注意,必须先保证 dcs 已经启动:

systemctl start has

7.1.3、停止集群需要按特定步骤,以避免出现不必要的问题,具体如下: 先停 has,再停 dcs,注意:先停备库,再停主库,防止先停主库发生不必要的自动切换。

在各服务器执行:systemctl stop has在各服务器执行:systemctl stop dcs

7.1.4、查看集群:

备注:使用数据库用户在安装有 has 的机器上进入安装目录下的 bin 目录执行./hasctl -c list <集群名>,其中<集群名>可以省略。后续默认 hasctl 都在在目录下 运行。如:./hasctl -c /home/vastbase/has/etc/vastbase.yml list vastbase,执行成功后 会显示主备库各节点的信息,下图为一主两备的情况。

cd /home/vastbase/has/bin

./hasctl -c /home/vastbase/has/etc/vastbase.yml list

 

image.png

7.2、主备切换:

使用数据库用户在安装有 has 的机器上进入安装目录执行./hasctl -c switchover <集群名>如:./hasctl -c /home/vastbase/has/etc/vastbase.yml switchover vastbase执行成功后可以使用./hasctl -c /home/vastbase/has/etc/vastbase.yml list命令查看切换后各节点的信息,如:

 

image.png

7.3、修改集群配置:

has 启动后,对配置文件 vastbase.yml 文件的修改并不会被 has 应用,因此,数据库 用户使用 hasctl 命令修改 has 集群参数:在任意节点执行:/home/vastbase/has/bin/hasctl -c /home/vastbase/has/etc/vastbase.yml edit-config

7.4、故障切换:

在主库机器故障时,备库自动升级为主库。模拟该故障的情况可以使用 kill 命令杀掉管 理主库的 has 进程或关掉安装有主库的机器等其它类似操作,然后在安装有备库的机器上 执行 5.2 中命令查看备库节点的信息,此时备库的角色会显示为 leader。故障发生后时, 使用数据库用户用 5.2 中命令行查询各节点信息显示如下:

集群初始阶段

 

image.png

主库停止阶段,state 显示 stopped,备库 role 显示为 leader:

 

image.png

无法获取前主库的信息,只显示当前存活节点信息:

 

image.png

8. 模板文件说明:

 

image.png

 

image.png

查看原文