LightDB支持从节点转发DML
LightDB, 是一个Enterprise Postgres
, 恒生电子生产.
它在22.1(2022Q1)版引入一个实验性功能, standby(从节点)可接受写数据请求, 转发给主节点处理; 如果是只读请求, 在standby执行.
在ligitdb.conf的shared_preload_libraries选项后面添加lt_standby_forward
以加载插件, 如:
shared_preload_libraries='lt_stat_statements,lt_stat_activity,lt_prewarm,lt_cron,lt_hint_plan,lt_show_plans,lt_standby_forward'
使用lt_standby_forward.enable_forward
控制, session级别, 默认off. 可以写在lightdb.conf中, db实例级别生效.
lt_standby_forward.enable_forward = on
启用后, 如下图, client连standby, 如果发送insert等'写SQL', standby会通过conn2转发给primary.
当客户端使用用户user1
连接standby上的db1
时, 上图conn2的连接参数看起来像下面这样(不需要配置, 举例说明原理):
primary_conninfo dbname=db1 user=user1 application_name=lt_standby_forward options='-c opt1=value1 -c opt2=value2'
使用示例:
-- 连standby $ ltsql -p 18989 -U lightdb ltsql (13.8-22.3) lightdb@lt_test=> lightdb@lt_test=> select pg_is_in_recovery(); pg_is_in_recovery ------------------- t (1 row) lightdb@lt_test=> create table t1(id int); --已加载库, 未启用 ERROR: cannot execute CREATE TABLE in a read-only transaction lightdb@lt_test=> set lt_standby_forward.enable_forward = on; --启用转发功能 SET lightdb@lt_test=> create table t1(id int); CREATE TABLE lightdb@lt_test=> insert into t1 values(1),(2); INSERT 0 2 lightdb@lt_test=> select * from t1; id ---- 1 2 (2 rows) lightdb@lt_test=> select pg_is_in_recovery(); --上面是t(true), 现在是f(false), 说明这条语句被转发了 pg_is_in_recovery ------------------- f (1 row) lightdb@lt_test=> select pid,application_name from pg_stat_replication; -- standby上查不到replication pid | application_name -----+------------------ (0 rows)
上面的连接(ltsql)不要关闭, 新开一个连接连primary
--连primary $ ltsql -p 8989 -U lightdb ltsql (13.8-22.3) lightdb@lt_test=> select pid,application_name from pg_stat_replication; -- primary上可以查到replication pid | application_name -------+------------------ 12556 | walreceiver lightdb@lt_test=> select datname,usename,application_name,client_addr from pg_stat_activity where application_name like '%standby%'; -- primary上可以查到conn2, 前提是前面连standby不要断开 datname | usename | application_name | client_addr ---------+---------+--------------------+------------- lt_test | lightdb | lt_standby_forward | 127.0.0.1 (1 row)
根据文档, 有一些限制:
- 转发delete, update, update, insert, select with modifying CTE
- 转发调用会修改数据 (volatile) 的函数的select/call
- 只读事务在standby执行, 否则转发到primary
- 事务中不能含有DDL
- 视图会在standby展开,转发给primary. 如果视图中有当前用户无权限访问的对象, 则查询失败
- set命令会在standby和primary上都执行; show命令在standby执行; 不支持在连接建立后set xxx_timeout参数; timeout参数在ltsql/jdbc连接串中指定
- 不支持COPY FROM
- 不支持create temp/unlogged table
- 上面未提及的命令会转发到primary
(LightDB, 转发DML, DML转发, forward)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!