背景
谈到负载均衡, 对于数据库集群需要区分几个概念:
- 运算的负载均衡, Vertica 本身是 MPP 数据库, SQL 操作自动会利用多台机器来加快处理速度.
- 数据库连接的负载均衡, Vertica 和 Teradata 一样都是无主节点的架构, 这种架构允许客户端连接任意一个节点, 连接后将由这个节点负责和客户端交互.
- 数据库连接的 Fail over, 这个概念不同于会话 node 的负载均衡. 对于多数数据库, 数据库连接字符串(比如 JDBC)只能设定一个 IP 地址, 如果这个 IP 的节点宕机, 客户端就无法连接. Vertica 允许指定多个 IP 地址, 如果第一个 IP 的节点无法连接, Vertica JDBC driver 会使用其他 IP 尝试连接.
上面这几个特性 Vertica 都支持. 另外 Vertica 是一个纯列式数据库, 没有数据倾斜问题. 因为这些特性, 使用上稍加注意, Vertica 就不太容易出现某个节点成为性能瓶颈.
下面重点讲解如何开启数据库连接的 Load balance 和 Fail over.
Server 端的配置
通过 SET_LOAD_BALANCE_POLICY() 函数设置负载均衡策略, 共有三种, 分别是 NONE/ROUNDROBIN/RANDOM , 这三个设置的含意是很显然的, NONE 是禁用负载均衡, ROUNDROBIN 是轮询, RANDOM 是随机, 推荐使用 ROUNDROBIN 策略. 具体设置代码为:
--设置节点load balance的方法, 有NONE/ROUNDROBIN/RANDOM三种
SELECT SET_LOAD_BALANCE_POLICY('ROUNDROBIN');
--查询服务器端的 Load balance 策略
SELECT GET_LOAD_BALANCE_POLICY();
Java代码客户端的配置
下面是一个 JDBC 示例代码, 开启了 Load balance 和 Fail over.
Properties myProp = new Properties();
myProp.put("user", "dbadmin");
myProp.put("password", "vertica");
# 开启 connection failover
myProp.put("BackupServerNode", "VerticaHost02,VerticaHost03");
# JDBC客户端开启Load balance
myProp.put("ConnectionLoadBalance", 1);
conn = DriverManager.getConnection(
"jdbc:vertica://BadVerticaHost:5433/vmart", myProp);
客户端多连接几次, 并执行下面SQL, 观察 node_name 节点是否不同, 就可以验证负载均衡是否工作,
SELECT node_name,client_version FROM CURRENT_SESSION;
DbVisualizer 工具开启负载平衡
Vertica 查询工具并不多, DbVisualizer 工具是最好的一个, 具体配置:
升级 JDBC driver
DbVisualizer 工具自带的 Vertica jdbc driver 版本太低, 要支持负载均衡, JDBC driver 至少是7.0以上, 推荐使用和服务器版本一致的jdbc, 这里使用的是 vertica-jdbc-8.1.1-0.jar .
在 DbVisualizer 工具菜单 Tool/Driver manager界面中, 选择 Vertica 数据库类型, 删除原有的自带老版本的jdbc driver, 增加新版的driver.
修改已有的 Vertica connection
新建或修改一个Vertica connection, 选择 connection 的 Properties - Driver Properties快捷菜单, 找到 connectionloadbalance, 将它的值设置为 true, 点击 Apply 应用.
验证
客户端多连接几次, 并执行下面SQL, 观察 node_name 节点是否不同.
SELECT node_name,client_version FROM CURRENT_SESSION;