对 Kafka 调度程序使用连接负载均衡
在 --dbhost
选项或配置文件中的 dbhost 条目中向调度程序提供 Vertica 节点的名称。调度程序连接到此节点以初始化它用于从 Kafka 加载数据而执行的所有语句。例如,每次执行微批处理时,调度程序都会连接到同一节点来运行 COPY 语句。如果使用单个节点作为所有调度程序操作的启动程序节点,这会影响该节点的性能,进而影响整个数据库的性能。
为了避免单个节点成为瓶颈,可以使用连接负载均衡将运行调度程序语句的负载分散到数据库中的多个节点上。连接负载均衡在负载均衡组内的节点之间分配客户端连接。有关此功能的概述,请参阅关于本机连接负载均衡。
为调度程序启用连接负载均衡是一个两步骤过程:
-
为调度程序选择或创建负载均衡策略。
-
在调度程序中启用负载均衡。
为调度程序选择或创建负载均衡策略
连接负载均衡策略将来自特定网络地址集的传入连接重定向到一组节点。如果您的数据库已定义合适的负载均衡策略,那么可以直接使用它,而不是专门为调度程序创建一个。
如果数据库没有合适的策略,请创建一个。让您的策略将来自运行 Kafka 调度程序的主机的 IP 地址的连接重定向到数据库中的一组节点。您选择的节点组将充当调度程序所执行语句的启动程序。
以下示例演示了如何为三节点数据库中的所有三个节点设置负载均衡策略。调度程序在数据库中的节点 1 上运行,因此路由规则的源地址范围 (192.168.110.0/24) 包含数据库中节点的 IP 地址。示例的最后一步验证是否已对来自第一个节点(IP 地址 10.20.110.21)的连接进行负载均衡。
=> SELECT node_name,node_address,node_address_family FROM v_catalog.nodes;
node_name | node_address | node_address_family
------------------+--------------+----------------------
v_vmart_node0001 | 10.20.110.21 | ipv4
v_vmart_node0002 | 10.20.110.22 | ipv4
v_vmart_node0003 | 10.20.110.23 | ipv4
(4 rows)
=> CREATE NETWORK ADDRESS node01 ON v_vmart_node0001 WITH '10.20.110.21';
CREATE NETWORK ADDRESS
=> CREATE NETWORK ADDRESS node02 ON v_vmart_node0002 WITH '10.20.110.22';
CREATE NETWORK ADDRESS
=> CREATE NETWORK ADDRESS node03 on v_vmart_node0003 WITH '10.20.110.23';
CREATE NETWORK ADDRESS
=> CREATE LOAD BALANCE GROUP kafka_scheduler_group WITH ADDRESS node01,node02,node03;
CREATE LOAD BALANCE GROUP
=> CREATE ROUTING RULE kafka_scheduler_rule ROUTE
'10.20.110.0/24' TO kafka_scheduler_group;
CREATE ROUTING RULE
=> SELECT describe_load_balance_decision('10.20.110.21');
describe_load_balance_decision
--------------------------------------------------------------------------------
Describing load balance decision for address [10.20.110.21]
Load balance cache internal version id (node-local): [2]
Considered rule [kafka_scheduler_rule] source ip filter [10.20.110.0/24]...
input address matches this rule
Matched to load balance group [kafka_scheduler_group] the group has policy [ROUNDROBIN]
number of addresses [3]
(0) LB Address: [10.20.110.21]:5433
(1) LB Address: [10.20.110.22]:5433
(2) LB Address: [10.20.110.23]:5433
Chose address at position [1]
Routing table decision: Success. Load balance redirect to: [10.20.110.23] port [5433]
(1 row)
重要
在 Vertica 节点上运行调度程序时请小心,要么将其 dbhost 名称设置为 localhost,要么不指定值(这意味着 dbhost 默认为 localhost)。到 localhost 的连接使用环回 IP 地址 127.0.0.1,而不是节点的主网络地址。如果创建的负载均衡路由规则重定向来自节点的 IP 地址范围的传入连接,那么它将不适用于使用 localhost 建立的连接。最好的解决方案是使用节点的 IP 地址或 FQDN 作为 dbhost 设置。
如果调度程序从一个没有应用路由规则的 IP 地址连接到 Vertica,将在 vertica.log 中看到类似如下的消息:
[Session] <INFO> Load balance request from client address ::1 had decision:
Classic load balancing considered, but either the policy was NONE or no target was
available. Details: [NONE or invalid]
<LOG> @v_vmart_node0001: 00000/5789: Connection load balance request
refused by server
在调度程序中启用负载均衡
客户端必须选择加入负载均衡,Vertica 才能将连接负载均衡策略应用到连接。例如,必须将 -C
标记传递给 vsql 命令,才能对您的交互式会话实现负载均衡。
调度程序使用 Java JDBC 库连接到 Vertica。要让调度程序选择加入负载均衡,必须将 JDBC 库的 ConnectionLoadBalance 选项设置为 1。有关详细信息,请参阅JDBC 中的负载均衡。
使用 vkconfig 脚本的 --jdbc-opt
选项,或者将 jdbc-opt 选项添加到配置文件中以设置 ConnectionLoadBalance 选项。例如,要使用名为 weblog.conf 的配置文件从命令行启动调度程序,请使用以下命令:
$ nohup vkconfig launch --conf weblog.conf --jdbc-opt ConnectionLoadBalance=1 >/dev/null 2>&1 &
要永久启用负载均衡,可以将负载均衡选项添加到配置文件中。以下示例显示了设置调度程序内配置为使用连接负载均衡的示例中的 weblog.conf 文件。
username=dbadmin
password=mypassword
dbhost=10.20.110.21
dbport=5433
config-schema=weblog_sched
jdbc-opt=ConnectionLoadBalance=1
可通过查询 SESSIONS 表来检查是否正在对调度程序的连接进行负载均衡:
=> SELECT node_name, user_name, client_label FROM V_MONITOR.SESSIONS;
node_name | user_name | client_label
------------------+-----------+-------------------------------------------
v_vmart_node0001 | dbadmin | vkstream_weblog_sched_leader_persistent_4
v_vmart_node0001 | dbadmin |
v_vmart_node0002 | dbadmin | vkstream_weblog_sched_lane-worker-0_0_8
v_vmart_node0003 | dbadmin | vkstream_weblog_sched_VDBLogger_0_9
(4 rows)
在 client_labels 列中,调度程序的连接具有以 vkstream 开头的标签(没有客户端标签的行是交互式会话)。可以看到调度程序打开的三个连接都进入了不同的节点。