安装配置

本节介绍cluster的安装配置

在开始前请参考udb文档先完成udb的安装和主从配置.

节点规划

主机名 IP 用途
- 192.168.2.98 高可用ip
clus-91 192.168.2.91 负载均衡节点
clus-92 192.168.2.92 负载均衡节点
clus-n 192.168.2.x 更多集群节点
udb-81 192.168.2.81 数据库节点
udb-82 192.168.2.82 数据库节点
udb-n 192.168.2.x 更多数据库节点

所有节点放行 tcp: 5678 9999 9898 9000 udp: 9694 端口

准备

所有节点时间保持一致 所有节点添加host解析

cat /etc/hosts
192.168.2.81 udb-81
192.168.2.82 udb-82
192.168.2.91 clus-91
192.168.2.92 clus-92

所有节点添加udb用户

useradd udb

所有节点允许sudo udb免密码操作

sudoedit /etc/sudoers #添加以下行
udb     ALL=(ALL)       NOPASSWD: ALL

cluster安装

cluster准备

特别注意所有cluster节点都需要以下配置

注意:

  1. 因为cluster进程需要自动维护高可用浮动IP,如果以docker方式运行,建议使用–network=host参数,使用host网络模式运行.

  2. 因为cluster进程需要远程ssh登录udb节点,执行主备切换动作,所以udb节点需要开启ssh服务,并允许所有cluster节点远程登录.

配置免密钥登录

因为cluster需要登录到udb上执行故障转移操作,所以需要配置密钥免密码登录。

[udb@clus-91 data]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/udb/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/udb/.ssh/id_rsa.
Your public key has been saved in /home/udb/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:AbJLImtkOUNEFvnq348KOaeupD9L0x02gck7MQzuARQ udb@clus-91
The key's randomart image is:
+---[RSA 2048]----+
|=E= . .          |
|o+.+ = .         |
|.*= X . .        |
|o+o= = . .       |
|..o + + S        |
|.... + o         |
|.=o.. .          |
|oo*.. .          |
|=++=.o..         |
+----[SHA256]-----+
[udb@clus-91 data]$ 

分发密钥

[udb@clus-91 data]$ ssh-copy-id udb-81
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/udb/.ssh/id_rsa.pub"
The authenticity of host 'udb-81 (192.168.2.81)' can't be established.
ECDSA key fingerprint is SHA256:24wLc0iIONqlwbNd/iCKjkUlQ9aTe6AfKhYi38gVcaQ.
ECDSA key fingerprint is MD5:49:1c:3b:36:a5:78:f1:cd:c4:1e:a3:ba:13:eb:ad:24.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
udb@udb-81's password: 
Number of key(s) added: 1
Now try logging into the machine, with:   "ssh 'udb-81'"
and check to make sure that only the key(s) you wanted were added.
[udb@clus-91 data]$ ssh-copy-id udb-82
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/udb/.ssh/id_rsa.pub"
The authenticity of host 'udb-82 (192.168.2.82)' can't be established.
ECDSA key fingerprint is SHA256:24wLc0iIONqlwbNd/iCKjkUlQ9aTe6AfKhYi38gVcaQ.
ECDSA key fingerprint is MD5:49:1c:3b:36:a5:78:f1:cd:c4:1e:a3:ba:13:eb:ad:24.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
udb@udb-82's password: 
Number of key(s) added: 1
Now try logging into the machine, with:   "ssh 'udb-82'"
and check to make sure that only the key(s) you wanted were added.

验证密钥

[udb@clus-91 data]$ ssh udb-81
Last login: Mon Aug 22 14:47:27 2022
[udb@udb-81 ~]$ exit
logout
Connection to udb-81 closed.
[udb@clus-91 data]$ ssh udb-82
Last login: Mon Aug 22 15:29:32 2022
[udb@udb-82 ~]$ exit
logout
Connection to udb-82 closed.

准备udb用户

create user super superuser password '超级用户密码';
-- 创建超级用户super,用于后端udb状态检查。

安装流程

注:要特别注意用户权限问题。

sudo mkdir -p /data/soft /data/udb-clus
unzip unvdbcluster-22.4.2-linux-x86_64.zip -d /data/soft
ln -s /data/soft/unvdbcluster-22.4.2-linux-x86_64/ /data/soft/unvdbcluster
sudo chown -R udb.udb /data/udb-clus /data/soft
cd /data/soft/unvdbcluster-22.4.2-linux-x86_64/
su udb

执行安装程序

[udb@clus-91 unvdbcluster-22.4.2-linux-x86_64]$ ./setup.sh 
===============================================================================
Welcome
-------
This installer will guide you through the installation of UnvDBmgr.
Version:  22.4
Web:      http://www.unvdb.com
Tel:      0755-84185890
You may quit the installer by typing "Exit",
or press <ENTER> key to continue: 
===============================================================================
License Agreement
-----------------
Installation and Use of UnvDBmgr Requires Acceptance of the Following 
License Agreement:
UniversalDB (Shenzhen) Technology Co., Ltd.
"SOFTWARE END-USER LICENSE AGREEMENT"
The "software product" includes computer software, and may include 
associated media, documentation.
This "software product" includes any upgrade and supplemental 
materials to the original "software product" provided by UnvDB.
SOFTWARE PRODUCT LICENSE
The "software product" is under the protection of Copyrights 
and International Conventions.
You may disagree the license by typing "Exit",
or press <ENTER> key to continue: 
===============================================================================
Choose Data Folder
------------------
Please choose a data folder for this installation.
The data folder must be empty and writable.
Default Data Folder: /data/soft/unvdbcluster-data
Enter the absolute path, 
or press <ENTER> key to accept the default, 
    : /data/udb-clus  #输入数据目录
===============================================================================
Ready To Install
----------------
It will start to install UnvDBmgr.
Product Name: UnvDBmgr v22.4
Data Folder: /data/udb-clus
You may quit the installer by typing "Exit",
or press <ENTER> key to continue: 
===============================================================================
Installation Complete
---------------------
Congratulations. UnvDBmgr has been successfully installed to:
    /data/udb-clus
You must configure the conf files in the data folder firstly.
If you want to register UnvDBmgr as service, please run
    sudo /data/udb-clus/service.sh
or start UnvDBmgr without service, please run
    /data/udb-clus/start.sh

创建服务

[udb@clus-91 data]$ sudo /data/udb-clus/service.sh

添加环境变量

root用户
source /data/soft/unvdbcluster-22.4.2-linux-x86_64/env.sh #载入环境变量

启动服务

[root@clus-91 data]# systemctl restart unvdbcluster
[root@clus-91 data]# ps aux | grep unvdb
root      3876  0.3 14.3 211944 135820 ?       Ss   15:59   0:00 /data/soft/unvdbcluster-22.4.2-linux-x86_64/bin/unvdbcluster -D -f /data/udb-clus/unvdbcluster.conf -F /data/udb-clus/pcp.conf -a /data/udb-clus/unvdbcluster_hba.conf -k UNVDBMGR_KEY
root      3877  0.0  0.1  78176  1488 ?        S    15:59   0:00 unvdbcluster: logger

cluster配置参数详解

配置文件解释,默认配置文件位于/data/udb-clus/unvdbcluster.conf

[udb@clus-91 udb-clus]$ cat /data/udb-clus/unvdbcluster.conf
##基础配置
backend_clustering_mode = 'streaming_replication'   #配置复制模式。有效值:streaming_replication‌、heter_replication、native_replication‌、logical_replication‌、slony‌、raw、snapshot_isolation。当前最推荐的配置模式是流式复制模式streaming_replication‌:每个服务器通过流复制同步数据。支持最多127个流复制备用服务器,且兼容 Hot Standby 模式。
pid_file_name = '/data/udb-clus/data/unvdbcluster.pid'   #cluster pid文件
logdir = '/data/udb-clus/data'   #unvdbcluster_status 节点状态文件存放目录
listen_addresses = '*'   #cluster监听地址
port = 9999   #cluster监听端口 
pcp_listen_addresses = '*'   #pcp监听地址
pcp_port = 9898   #pcp监听端口
#pcp_socket_dir = '/tmp'   #PCP socket目录,默认值为 /tmp。请注意,此 socket 可能会被 cron 作业删除。我们建议将此项 值设置为 /var/run 或此类目录。

##客户端连接配置
num_init_children = 100   #初始生成的连接池进程数,默认 32。当客户端并发数超过此值时,会将连接放入队列,直到连接数有空闲可用。队列的最大数是此值的2倍。
#child_life_time = 30   #子进程空闲达到此秒数时,它将被终止,一个新的子进程将被创建。防止长时间空闲进程占用内存,导致内存泄露。默认 300秒 
#client_idle_limit = 30   #客户端空闲时间,超过此值时,会断开客户端连接。默认值为 0秒,不主动断开连接
child_max_connections = 1000   #子进程可以处理的最大客户端连接数。默认值为 0,这将关闭该功能。

#unix_socket_directories = '/tmp'   #指定服务器用于监听来自客户端应用的连接的 Unix 域套接字目录。默认值是 /tmp ,但是在编译时可以被改变。
#unix_socket_group = ''   #设置Unix域套接字的拥有组。(拥有用户sockets始终是启动server的用户。组合使用参数 unix_socket_permissions 可以是 用作 Unix 域连接的附加访问控制机制。 默认情况下,这是空字符串,它使用 server 用户。
#unix_socket_permissions = 0777   #设置 Unix 域套接字的访问权限。Unix 域套接字使用通常的 Unix 文件系统权限集。必须以 0 开头,默认权限为 0777,这意味着任何人都可以 连接。合理的替代方案是 0770 (only user 和 group) 和 0700 (仅用户)。请注意:对于 Unix 域套接字,只有写入权限才重要,因此设置或撤销“读取或执行权限”没有意义
#listen_backlog_multiplier = 2   #指定从前端到 cluster 的连接队列长度。默认值为 2。队列长度 = listen_backlog_multiplier * num_init_children。
#serialize_accept = off   #设置为on,在传入的客户端连接上启用序列化。默认值为 off。在没有序列化的情况下,操作系统内核会唤醒所有cluster子进程来执行 accept()。因为子进程唤醒时,会发生大量的上下文切换,影响性能。通过序列化 accept()调用,这样在传入连接时,只有一个cluster进程被唤醒来执行accept()。但是序列化有其自身的开销,建议使用在num_init_children设置较大时才使用序列化,对于num_init_children较小时,serialize accept 可能会降低性能,因为序列化开销。注意:启用 child_life_time 后,serialize_accept 不起作用。如果需要,请确保将 child_life_time 设置为 0 以打开 serialize_accept。 如果担心cluster进程内存泄漏 或者任何潜在的问题,可以改用 child_max_connections。 
#reserved_connections = 0   #设置保留连接数。默认值为 0。
#process_management_mode = dynamic   #指定 cluster 子进程的空闲进程管理方法。 有效选项:static(所有子节点在启动时都是 pre-forked 的)、dynamic(子进程按需生成,最多 num_init_children。 任何时候空闲的子进程数取决于 min_spare_children 和 max_spare_children)。默认值是dynamic。
#process_management_strategy = gentle   #指定进程管理策略以满足备用(空闲)进程计数。有效选项:lazy(使用此策略,将逐步执行缩减 并且仅在冗余进程计数过多时触发 保持高位超过 5 分钟)、gentle(使用此策略,将逐步执行缩减 并且仅在冗余进程计数过多时触发 保持高位超过 2 分钟)、aggressive(使用此策略,将积极执行缩减 ,并且在备用进程较高的情况下会更频繁地触发。 此模式使用更快且智能程度稍低的进程选择标准 确定可以提供服务以满足 max_spare_children)。默认值为 gentle。
#min_spare_children = 5   #指定要保留的备用 (空闲) 子进程的最小数量。如果空闲进程计数低于 min_spare_children, cluster 将产生新的子进程,除非它达到允许的子进程总上限 (num_init_children)。 默认值为 5。
#max_spare_children = 10   #指定要保留的备用 (空闲) 子进程的最大数量。 如果空闲进程数从 max_spare_children 开始增加,cluster 将杀死过多的子进程。 选择标准是选择具有最少池连接数的进程。 默认值为 10。
#reset_query_list = 'ABORT; DISCARD ALL'   #指定在会话结束时要发送的 SQL 命令,用于重置后端连接。可以通过分隔每个命令来指定多个命令 通过 “;”。默认值为 ABORT;DISCARD ALL。

##cluster和后端udb的连接配置
connection_cache = on   #开启cluster和后端的连接缓存
#connection_life_time = 0   #缓存的连接过期秒数,过期的缓存将被关闭,默认 0,表示缓存的连接不被关闭。
max_pool = 4   #cluster和后端建立的最大连接池缓存,默认 4。当有相同的用户连接到相同的数据库时,会重用之前的缓存连接,否则会新建连接。当新连接超过此值时,会断开最旧的连接。客户端和数据库建立的最大连接数是max_pool * num_init_children。

##认证配置
enable_pool_hba = off   #设为on,则cluster将使用pool_hba.conf作为客户端认证。默认值为off,表示关闭cluster认证,直接使用udb认证。
pool_passwd = 'pool_passwd'   #cluster认证密码文件,用于存放客户端登录的账号及其md5认证的密码。如果只填文件名,则存放在与配置文件相同的目录中,也可以填写绝对路径。默认值为“pool_passwd”。如果设为''(空)表示禁用密码文件。(密码可以使用三种格式存储在 pool_passwd 文件中:AES256 加密格式、纯文本格式和 md5 格式)
allow_clear_text_frontend_auth = false   #当unvdbcluster_passwd文件中不存在用户密码时,允许cluster以明文形式向udb进行认证。
authentication_timeout = 60   #客户端认证超时秒数。默认值为60秒,设为0表示不超时

#ssl = off   #设置为 on 时,cluster 为前端和后端通信启用 SSL。 默认值为 off。
#ssl_key = 'server.key'   #指定SSL的私钥文件,要填写绝对路径。此选项没有默认值,如果未设置,则将对传入的前端连接禁用 SSL。
#ssl_cert = 'server.crt'   #指定SSL的公钥文件,要填写绝对路径。此选项没有默认值,如果未设置,则将对传入的前端连接禁用 SSL。
#ssl_ca_cert = ''   #指定 PEM 格式的 CA 证书文件,该证书文件可用于验证后端服务器。
#ssl_ca_cert_dir = ''   #指定包含 PEM 格式 CA 证书文件的目录的路径,该目录可以使用 以验证后端服务器证书。
#ssl_crl_file = ''   #指定包含 SSL 服务器证书的文件 吊销列表 (CRL)。默认值为空,这意味着不会加载任何 CRL 文件。
#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL'   #指定 SSL 密码套件的列表,允许 SSL 连接使用。
#ssl_prefer_server_ciphers = off   #设为on,则使用服务器的 SSL 密码首选项,而不是客户端的 SSL 密码首选项。默认值为off。
#ssl_ecdh_curve = 'prime256v1'   #指定要在 ECDH 密钥中使用的曲线的名称 交换。它需要得到所有连接的客户端的支持。它不需要与服务器的 Elliptic 使用的曲线相同 曲线键。默认值为 prime256v1。
#ssl_dh_params_file = ''   #指定包含 Diffie-Hellman 参数的文件的名称,用于 SSL 密码的临时 DH 系列。默认值为 空,表示使用编译的默认 DH 参数。
#ssl_passphrase_command = ''   #设置一个外部命令,当需要获取解密SSL文件的密码时,调用该命令。默认值为空。

##所有后端udb服务器信息
backend_hostname0 = '192.168.2.81'   #后端数据库IP地址
backend_port0 = 5678   #后端数据库端口
backend_weight0 = 1   #后端udb权重,值越大,被调度的机率越高。
backend_data_directory0 = '/data/udb'   #后端udb数据目录
backend_flag0 = 'ALLOW_TO_FAILOVER'   #允许故障切换或者从集群断开。如果设为DISALLOW_TO_FAILOVER 表示不允许故障切换,需要用户自行维护udb状态。同时cluster中的状态不会变化,需要重启后状态才会更新。请谨慎使用DISALLOW_TO_FAILOVER。

backend_hostname1 = '192.168.2.82'
backend_port1 = 5678
backend_weight1 = 1
backend_data_directory1 = '/data/udb'
backend_flag1 = 'ALLOW_TO_FAILOVER'

##开启负载均衡(负载均衡只对读操作有效)
load_balance_mode = on   #开启负载均衡。在该模式下,写操作只发给主库,读操作会根据下面的规则发给对应节点。如果关闭,读操作只会发给主库
statement_level_load_balance = on   #是否基于sql语句的平衡,默认为off(on表示在同一个连接中重复查询,可以实现负载均衡;off表示同一个连接重复查询不会负载均衡,每个查询都要重新连接才能实现负载均衡)
#database_redirect_preference_list = 'test:1(0.9)'   #自定义调度规则。例如:'test:1(0.9)'表示连接test数据库时90%调度到1号节点
                                                     #test2:primary,db[01]:1(0.3),db2:standby 表示连接到test2数据库时调度到主节点,连接到db0或db1数据库时30%调度到1号节点,连接db2时调度到从节点

#ignore_leading_white_space = on   #当设置为on时,在负载均衡模式中cluster会忽略SQL查询语句前面的空白字符。默认值为on。(如果与DBI/DBD:Pg等API一起使用,则非常有用,因为这些API在其中添加了空格)
#read_only_function_list = ''   #指定视为只读的函数列表,用逗号隔开,列表中的函数将不更新数据库。select此列表中未指定的函数不进行负载均衡。
#write_function_list = ''   #指定视为写的函数列表,用逗号隔开,列表中的函数可以更新数据库。select此列表中指定的函数不进行负载均衡。
#primary_routing_query_pattern_list = ''   #指定哪些sql语句只发送到主节点,多个sql语句要用分号隔开
#disable_load_balance_on_write = 'transaction'   #在显式事务中发出写请求时的负载平衡行为。有效值:transaction(如果发出写请求,则在事务结束之前,后续的读请求将不会进行负载平衡)、trans_transaction(如果发出写请求,则在会话结束之前,显式事务中的后续读请求将不会进行负载平衡)、dml_adaptive(在当前显式事务中已修改的表的查询在事务结束之前不会进行负载平衡)、always(如果发出写请求,则在会话结束之前,读请求将不会进行负载平衡)。默认值是transaction。请注意,除了“always”之外,任何不在显式事务中的查询都不受参数的影响。
#dml_adaptive_object_relationship_list = ''   #用于设置对象发出DML语句后禁用显式事务中依赖对象的负载平衡。格式为[对象]:[依赖对象],多对要用逗号分开。比如在 table_1 上安装了触发器,该触发器对每个触发器执行 table_2 INSERT 在 table_1。然后,需要确保 读取table_2不得在同一事务中进行负载均衡 在 INSERT 后转换为 table_1。 对于此配置,可以设置dml_adaptive_object_relationship_list = ‘table_1:table_2’。注意:此参数仅对 disable_load_balance_on_write=‘dml_adaptive’ 有效;如果要配置对函数的依赖关系,该函数必须存在于 write_function_list
#app_name_redirect_preference_list = ''   #指定“应用名:节点ID”,将 SELECT 查询发送到特定后端节点,实现负载均衡。多组用逗号分开。仅适用于流式复制模式。
#allow_sql_comments = off   #如果启用,在判断是否可以进行负载平衡或查询缓存时忽略SQL注释。如果关闭,SQL注释有效地阻止了判断
#relcache_query_target = primary   #指定查询的目标节点。默认为主节点。若指定了load_balance_node,查询将被发送到负载平衡节点。

##复制延迟检查配置
sr_check_period = 10   #基于流复制的延迟检查间隔秒数
sr_check_user = 'udb超级用户'   #延迟检查使用的用户名
sr_check_password = '超级用户的密码'   #延迟检查使用的密码
sr_check_database = 'unvdb'   #延迟检查使用的数据库
delay_threshold = 1000000   #如果从库延时超过这个字节点,将停止向从库发送查询操作,将所有操作调度到主库。

#replication_stop_on_mismatch = off   #如果设为on,当后端返回的数据不一致时,差异最大的少数节点将停止同步复制;如果设为off,则只需强制退出当前会话。默认值是off。
#delay_threshold_by_time = 0   #主从同步延迟阈值(秒)。如果设为非0,当主从延迟超过该值,则将请求发往主节点或其他延迟较低的从节点,具体要根据prefer_lower_delay_standby来确定。默认值为 0,表示禁用延迟检查
#prefer_lower_delay_standby = off   #配合delay_threshold_by_time使用,设为on,且同时存在多个从节点时,优先选择延迟更低的从节点。设为off,则优先选择主节点。默认值为 off。

##流复制在线恢复配置

##健康检查配置
health_check_period = 10   #每隔10秒做一次后端udb健康检查
health_check_timeout = 20   #cluster定期连接后端udb检查状态,此值是连接的最大超时秒数。
health_check_max_retries = 0   #指定在运行状况检查失败时放弃并启动故障转移之前要进行的最大重试次数,默认值为0,表示不重试。
health_check_retry_delay = 0   #指定两次失败的健康检查重试之间的睡眠时间(以秒为单位)(除非health_check_max_retries > 0,否则不使用)。如果为0,则立即重试而不会延迟。
connect_timeout = 10000   #指定放弃使用connect()系统调用连接到后端之前的时间(以毫秒为单位)。默认值为10000毫秒(10秒)。不稳定的网络用户可能希望增加该值,0表示没有超时。
health_check_user = 'udb超级用户'   #执行健康检查的用户名
health_check_password = '超级用户的密码'  #执行健康检查的密码
health_check_database = 'unvdb'   #执行健康检查的数据库

##数据库故障转移脚本
#设置故障转移命令脚本,当主节点发生故障时,调用此脚本切换到其他从节点,从节点提升为主节点:
#failover_command = '/data/udb-clus/data/etc/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'
failover_command = '/data/udb-clus/data/etc/failover_stream.sh %H %R'
#设置故障恢复命令脚本,当故障节点修复后,手动加入集群时,触发执行此脚本,新加入的节点跟随主节点并成为从节点:
#failback_command = '/data/udb-clus/data/etc/follow_primary.sh %d %h %p %D %m %H %M %P %r %R'
#当主节点故障,切换某个从节点为新主节点时,自动触发此脚本,使其他从节点跟随新的主节点:
#follow_primary_command = '/data/udb-clus/data/etc/follow_primary.sh %d %h %p %D %m %H %M %P %r %R'
#可用的字符
# 1)  %d = failed node id                        #断开连接的节点的节点ID。
# 2)  %h = failed node hostname                  #断开连接的节点的主机名。
# 3)  %p = failed node port number               #断开连接的节点的端口号。
# 4)  %D = failed node database cluster path     #断开连接的节点的数据目录。
# 5)  %m = new main node id                      #新的主节点的节点ID。
# 6)  %H = new main node hostname                #新的主节点的主机名。
# 7)  %M = old main node id                      #旧的主节点的节点ID。
# 8)  %P = old primary node id                   #旧的第一节点的节点ID。
# 9)  %r = new main port number                  #新的主节点的端口号。
# 10) %R = new main database cluster path        #新的主节点的数据目录。
# 11) %N = old primary node hostname             #旧的主节点的主机名
# 12) %S = old primary node port number          #旧的主节点的端口号
# 13) %% = '%' character                         #'%' 字符

#failover_if_affected_tuples_mismatch = off   #如果设为on,当 UPDATE/DELETE 对各节点影响的行数不一致时,触发故障转移;如果设为off,则只需中止事务以保持一致性。默认值为 off。
#failover_on_backend_error = on   #设为on,当后端通信 socket 失败时触发故障转移。设为off,cluster只报告一个错误,并断开会话连接。默认值为on。
#failover_on_backend_shutdown = off   #设为on,在会话中,当cluster检测到一个通过检查特定错误代码 57P01 和 57P02 上的 backend shutdown 事件时,会在该节点上触发故障转移。设为off,cluster只报告一个错误,并断开会话连接。默认值为off。

#detach_false_primary = off   #设为on,则分离false的主节点。默认值为off。此参数仅在流式复制中有效
#auto_failback = off   #设为on,当故障恢复后,流复制正常时,从节点自动加入集群,但如果使用了复制槽则该参数不生效。设为off,故障恢复后,要手动将从节点加入集群。默认值为off。(小规模可自动;大规模建议人工确认)。如果计划分离备用节点进行维护,要事先将此参数设置为 off。
#auto_failback_interval = 60   #指定自动故障恢复的执行间隔的最小时间(以秒为单位)。
#recovery_user = 'nobody'   #指定要执行联机恢复的 udb 用户名。
#recovery_1st_stage_command = ''   #在线恢复第一阶段执行的脚本(拉取基础备份,如 pg_basebackup),脚本要放在cluster的数据目录中
#recovery_2nd_stage_command = ''   #在线恢复第二阶段执行的脚本 (应用 WAL 或恢复配置),脚本要放在cluster的数据目录中
#recovery_timeout = 90   #等待恢复完成的超时时间(秒),防止无限等待。默认90秒
#search_primary_node_timeout = 300   #指定在发生故障切换时搜索主节点的超时时间(以秒为单位),如果在此配置的时间内未找到,cluster将放弃寻找 primary 节点。默认值为 300 秒,将此参数设置为 0 表示永远尝试。该参数仅适用于流式复制模式。
#client_idle_limit_in_recovery = 0   #在恢复的第二阶段生效,从执行最后一个查询后空闲到 client_idle_limit_in_recovery 秒的客户端将被断开连接。默认值为 0,表示本功能不启用。

##后端udb数据库的其他配置
#replicate_select = off   #是否将 SELECT 语句也复制到所有节点。默认值为 off。
#insert_lock = off   #设置为on,使用INSERT语句自动锁定虚拟行或表,以保持SERIAL类型字段的数据的一致性, 若无SERIAL类型字段,则不会发放任何锁(多主写场景必需;单主写可关闭提高性能)。默认值为 on
#lobj_lock_table = ''   #指定用于大型对象复制控制的表名。如果指定,cluster将锁定 lobj_lock_table 指定的表并生成 通过查看系统目录pg_largeobject然后调用 lo_create 来创建大型对象 ID 大型物体。 此过程保证 cluster 在复制模式下的所有 DB 节点中将获得相同的大对象 ID。

##看门狗配置
use_watchdog = on   #开启看门狗
wd_priority = 1   #本节点看门狗优先级,越高,越被容易选为领导者
wd_escalation_command = 'date'   #看门狗升级为领导者时执行的命令
enable_consensus_with_half_votes = on   #节点仲裁,节点为偶数时需要开启此配置
wd_lifecheck_method = 'heartbeat'   #看门狗存活检查方式
wd_heartbeat_keepalive = 2   #心跳检查间隔,单位是秒
wd_heartbeat_deadtime = 30   #如果在此时间内节点无响应,则标记为故障,单位是秒
wd_interval = 10   #看门狗检查周期,单位是秒
wd_life_point = 3   #生命周期检查失败的次数
wd_lifecheck_query = 'SELECT 1'   #看门狗检查语句
wd_lifecheck_dbname = 'unvdb'   #看门狗检查的数据库
wd_lifecheck_user = 'udb超级用户'   #看门狗检查的用户名
wd_lifecheck_password = '超级用户的密码'   #看门狗检查的密码
#wd_ipc_socket_dir = '/tmp'   #看门狗进程间通信(IPC)套接字的Unix域套接字路径。默认为/tmp。请注意,此套接字可能会被 cron 作业删除。 建议将此值设置为 ‘/var/run/unvdb’ 或此类目录。
#clear_memqcache_on_escalation = on   #设置为on,看门狗会清除共享内存中的所有查询缓存。当 cluster 升级为 active 时,这可以防止新的活动 cluster 使用与旧活动 cluster 不一致的旧查询缓存。默认值为 on。这仅在 memqcache_method 为 ‘shmem’ 时有效。
#wd_de_escalation_command = ''   #当领导看门狗退出领导职责时,看门狗会在该节点上执行此命令。
#trusted_servers = ''   #网络连通性检测的可信服务器列表(可以指定多台主机做外部连通性检测)
#trusted_server_command = 'ping -q -c3 %h'   #指定 cluster 检查时要运行的用户命令,受信任的服务器会响应 ping。字符串中的 %h 是由trusted_servers指定的主机名。默认值为 ping -q -c3 %h。
#wd_monitoring_interfaces_list = ''   #指定要由 watchdog 进程监控的网络设备名称列表,用逗号隔开。如果列表中的任何接口处于活动状态,监视器将认为网络正常。如果列表中的所有网络接口都变为非活动状态 (禁用或拔下电缆),则看门狗会将其视为完全的网络故障 而 cluster 节点将自杀。 指定 ‘’(空) 列表将禁用网络接口监控。 将其设置为 ‘any’ 可对所有可用网络接口进行监控 但 loopback 除外。默认值为 ‘’ 空列表(禁用监控)。

##所有看门狗节点信息
hostname0 = '192.168.2.91'   #看门狗节点1 IP
wd_port0 = 9000   #看门狗节点1端口
pgpool_port0 = 9999   #看门狗节点1 cluster服务端口

hostname1 = '192.168.2.92'   #看门狗节点2 IP
wd_port1 = 9000   #看门狗节点2端口
pgpool_port1 = 9999   #看门狗节点2 cluster服务端口

##看门狗心跳检查
heartbeat_hostname0 = '192.168.2.91'   #发送看门狗心跳的地址
heartbeat_port0 = 9694   #发送看门狗心跳的端口
heartbeat_device0 = 'eth0'   #发送看门狗心跳的网口,注意要填写服务器实际的网络设备名称

heartbeat_hostname1 = '192.168.2.92'   #发送看门狗心跳的地址
heartbeat_port1 = 9694   #发送看门狗心跳的端口
heartbeat_device1 = 'eth0'   #发送看门狗心跳的网口,注意要填写服务器实际的网络设备名称

##高可用ip及绑定的网卡设备,需按实际修改
delegate_IP = '192.168.2.98'   #高可用浮动IP
if_cmd_path = '/sbin'   #用于切换 IP 地址的命令所在路径
if_up_cmd = '/sbin/ip addr add $_IP_$/24 dev eth0 label eth0:0'   #启用高可用IP的命令,注意要填写实际的网络设备名称
if_down_cmd = '/sbin/ip addr del $_IP_$/24 dev eth0'   #关闭高可用IP的命令,注意要填写实际的网络设备名称
arping_path = '/usr/sbin'   #用于arping的命令所在路径
arping_cmd = '/usr/sbin/arping -U $_IP_$ -w 1 -I eth0'   #用于发送arping的命令,注意要填写实际的网络设备名称
#ping_path = '/bin'   #指定 ping 命令的路径,用于检查虚拟 IP 的启动情况。 设置包含 ping 实用程序的目录的唯一路径, 例如 “/bin” 或此类目录。 默认值为 /bin。此参数只能在服务器启动时设置。

##cluster缓存配置
#relcache_expire = 0   #系统目录表缓存过期时间(以秒为单位)。默认值为 0,这意味着缓存永不过期。
#relcache_size = 256   #系统目录表缓存过期条目数。默认值为256。缓存创建时,每个表大约有10个条目。所以可以估计「使用表的数 * 10」所需的关联缓存数。
#check_temp_table = catalog   #临时表检查方式:catalog / trace / none(无临时表环境可设 none)。默认值为 catalog。
#check_unlogged_table = on   #设置为 on,在 SELECT 语句中启用无日志记录表检查。如果确定系统从未使用未记录的表,可以安全地关闭 check_unlogged_table。默认值为 on。
#enable_shared_relcache = on   #是否共享子进程间的关系缓存(启用可以提升缓存命中率)。默认值为 on。
#memory_cache_enabled = off   #是否启用内存查询缓存。默认不启用
#memqcache_method = shmem   #缓存存储方式。可选值:shmem(shared memory)、Memcached。默认值是shmem。(分布式场景可选 memcached)
#memqcache_memcached_host = localhost   #指定 memcached 在其上运行的主机名或 IP 地址。如果 memcached 和 cluster 位于同一台服务器上,可以使用“localhost”。默认值是localhost。
#memqcache_memcached_port = 11211   #指定 memcached 的端口号。 默认值为 11211。
#memqcache_total_size = 67108864   #内存缓存总大小(不指定单位,默认单位是节点)。默认值为 64MB。
#memqcache_max_num_cache = 1000000   #最大缓存条目数。默认值为 1000000。
#memqcache_expire = 0   #缓存条目过期时间(以秒为单位)。 默认值为 0,这意味着没有缓存过期和缓存保留。注意:memqcache_expire 和 memqcache_auto_cache_invalidation 彼此正交。
#memqcache_auto_cache_invalidation = on   #设置为on,则自动删除与更新的table相关的缓存。关闭时,不会删除缓存。默认值为on。注意:此参数和 memqcache_expire 彼此正交。
#memqcache_maxcache = 409600   #单次 SELECT 最大缓存大小(不指定单位时,默认以字节为单位)。默认值为 400KB。注意:对于共享内存 query(‘shmem’) 缓存,memqcache_maxcache必须设置为低于 memqcache_cache_block_size,对于 ‘memcached’,它必须小于 slab 的大小
#memqcache_cache_block_size = 1048576   #缓存块大小(不指定单位时,默认以字节为单位)。默认值为 1MB。
#cache_safe_memqcache_table_list = ''   #指定一个以逗号分隔的表名列表,其 SELECT 结果由 cluster 缓存。
#cache_unsafe_memqcache_table_list = ''   #指定一个以逗号分隔的表名列表,其 SELECT 结果不被 cluster 缓存。注意:cache_unsafe_memqcache_table_list优先于cache_safe_memqcache_table_list

##日志配置   -- 数据库中查不到以下参数,参数模板文件中有这些参数
logging_collector = on   #启用日志收集   
log_directory = '/data/udb-clus/data/log'   #日志存放路径
log_filename = 'unvdbcluster-%a.log'   #日志文件名格式,支持strftime简写,%a表示星期几。默认为'unvdbcluster-%Y-%m-%d_%H%M%S.log'。详情参考 https://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html
log_truncate_on_rotation = on   #开启日志覆盖,off表示追加到日志文件。配合log_filename,实现日志保留最近1周。默认值为off
log_rotation_age = 1d   #单个日志文件最长时间,超过此值会生成新文件。默认值为 24 小时。
log_rotation_size = 0   #指定单个日志文件的最大值(默认单位是KB),超过此值会生成新文件。默认值是10MB,0表示不限制日志大小。
#log_destination = 'stderr'   #设置日志记录目的地,用于记录 cluster 消息。cluster支持两个目的地:stderr 和 syslog。默认是仅记录到 stderr 。
#log_line_prefix = '%m: %a pid %p: '   #在每行日志的开头输出指定字符串。默认值为 '%m: %a pid %p: ',它打印时间戳、应用程序名称和进程 ID。其他选项要查printf表
#log_error_verbosity = default   #控制应发出多少关于错误的详细信息。有效值为:terse、default、verbose messages。其中 TERSE 不包括 DETAIL、HINT、QUERY 和 CONTEXT 错误信息的日志记录。
#client_min_messages = notice   #控制发送到客户端的最小消息级别。有效值为:DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、LOG、NOTICE、WARNING 和 ERROR。每个级别包括 它之后的所有级别。默认值为 NOTICE。
#log_min_messages = warning   #控制向 log 发出的最小消息级别。 有效值为 DEBUG5、DEBUG4、DEBUG3、DEBUG2、DEBUG1、INFO、NOTICE、WARNING、ERROR、LOG、FATAL和 和 PANIC。 每个级别都包含其后的所有级别。 默认值为 WARNING。
#log_connections = off   #设置为 on,则打印从日志到日志的所有客户端连接。默认值为off。
#log_disconnections = off   #设置为 on,则将所有客户端连接终止打印到日志中。默认值为off。
#log_hostname = off   #设置为 on,则打印主机名而不是 IP 地址 在 ps 命令结果和连接日志中 (当 log_connections 处于打开状态时)。默认值为off。
#log_statement = off   #设置为 on,将所有 SQL 语句打印到日志中。默认值为off。
#log_per_node_statement = off   #与 log_statement 类似,不同之处在于它包含节点和后端信息。确保 复制或负载平衡正在运行。默认值为off。
#log_client_messages = off   #设置为 on,将客户端消息打印到日志中。默认值为off
#log_standby_delay = 'if_over_threshold'   #指定复制延迟的记录策略。有效值:always(如果备用延迟大于 0,则在每次检查复制延迟时记录备用延迟)、if_over_threshold(仅当待机延迟超过 delay_threshold或 delay_threshold_by_time值(默认值)时,才记录待机延迟)、none(从不记录待机延迟)。默认值为 if_over_threshold。
#syslog_facility = 'LOCAL0'   #当log_destination = 'syslog'时,此参数才生效。有效值为:LOCAL0、LOCAL1、LOCAL2、LOCAL3、LOCAL4、LOCAL5、LOCAL6、LOCAL7。默认值为 LOCAL0。另请参阅系统的 syslog 守护程序的文档。
#syslog_ident = 'unvdbcluster'   #用于设置 syslog 日志中 cluster 消息的程序名称。默认为 pgpool。当log_destination = 'syslog'时,此参数才生效。

以上配置文件每个cluster节点都要配置

注意: watchdog(看门狗)节点建议配置三个或者以上。但是如果资源不足的话两个也是可以的但是要开启enable_consensus_with_half_votes = on仲裁节点,此配置默认关闭。

配置故障转移,自动提升从库

vim /data/soft/unvdbcluster/bin/failover_stream.sh
#! /bin/sh
PGDATA=$2
new_master=$1
trigger_command="/data/soft/unvdb/bin/ud_ctl promote -D $PGDATA"
# Prompte standby database.
/usr/bin/ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /home/udb/.ssh/id_rsa udb@${new_master} $trigger_command
exit 0;

赋予执行权
chmod 755 /data/soft/unvdbcluster/bin/failover_stream.sh 

修改权限,使udb有权限执行系统转移操作

chmod u+s /sbin/ifconfig
chmod u+s /usr/sbin
chmod u+s /sbin/ip
chmod u+s /usr/sbin/arping

配置管理用户,默认配置文件位于/data/udb-clus/pcp.conf

echo admin:`ud_md5 admin` >> /data/udb-clus/pcp.conf
[udb@clus-91 udb-clus]$ cat /data/udb-clus/pcp.conf
admin:21232f297a57a5a743894a0e4a801fc3

定义节点id

[udb@clus-91 udb-clus]$ echo 0 > /data/udb-clus/unvdbcluster_node_id

注意:节点id不能相同

启动服务

[root@clus-91 udb-clus]# systemctl start unvdbcluster

检查服务

[root@clus-91 udb-clus]# ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:d2:a6:05 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.91/24 brd 192.168.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.2.98/24 scope global secondary eth0:0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fed2:a605/64 scope link 
       valid_lft forever preferred_lft forever

此时高可用ip已绑定到eth0设备

客户端连接cluster

[root@udb-81 tmp]# ud_sql -U unvdb -p 9999 -h 192.168.2.98
Password for user unvdb: 输入udb的密码
ud_sql (22.4)
Type "help" for help.
unvdb=# show cluster_nodes;
 node_id |   hostname   | port | status | ud_status | lb_weight |  role   | ud_role | select_cnt | load_balance_node | replication_d
elay | replication_state | replication_sync_state | last_status_change  
---------+--------------+------+--------+-----------+-----------+---------+---------+------------+-------------------+--------------
-----+-------------------+------------------------+---------------------
 0       | 192.168.2.81 | 5678 | up     | up        | 0.500000  | primary | primary | 1          | true              | 0            
     |                   |                        | 2022-08-22 16:44:12
 1       | 192.168.2.82 | 5678 | up     | up        | 0.500000  | standby | standby | 0          | false             | 0            
     |                   |                        | 2022-08-22 16:44:12
(2 rows)

此时可以看到192.168.2.81为主节点,192.168.2.82为从节点

docker 方式运行


联系技术支持获取镜像并导入

docker load < 镜像名称.tar.gz 

准备

mkdir -p /data/udb-clus && chown 99:99 /data/udb-clus && chmod 755 /data/udb-clus #准备数据目录

运行

docker run -d --name udb-clus -v /data/udb:/data/udb-clus/ --restart=always --network=host 镜像名称-v /data/udb:/data/udb-clus/ #本地/data/udb-clus目录挂载到容器/data/udb-clus,权限必须是755,用户udi必须是99。如不指定则由docker自动创建volume

检查

docker exec udb-clus /bin/bash -c "ps aux | grep unvdb"  
...
root      1529  0.0  0.1 211944  1948 ?        S    Jan04   0:02 unvdbcluster: wait for connection request
root      1530  0.0  0.1 211944  1948 ?        S    Jan04   0:02 unvdbcluster: wait for connection request
root      1531  0.0  0.0 211944  1736 ?        S    Jan04   0:02 unvdbcluster: wait for connection request
root      1532  0.0  0.1 211944  1948 ?        S    Jan04   0:02 unvdbcluster: wait for connection request
root      1533  0.0  0.1 211944  1944 ?        S    Jan04   0:02 unvdbcluster: wait for connection request
root      1534  0.0  0.1 211944  1948 ?        S    Jan04   0:02 unvdbcluster: wait for connection request
...

全量备份

只需要备份/data/udb-clus 配置文件即可

说明

数据目录位于宿主机 /data/udb-clus/