You need to enable JavaScript to run this app.
导航
读写分离策略
最近更新时间:2023.01.03 17:17:15首次发布时间:2023.01.03 17:17:15

开启读写分离后,用户查询将会被发送到主节点或只读节点。如果希望一个符合负载均衡条件的 SQL 在开启读写分离后不被负载均衡、继续发送到主节点,可以采用在 SQL 前加 hint 的方式,通常使用 /*NO LOAD BALANCE*/

发送到主节点的查询

标准 SQL 查询

  • INSERTUPDATEDELETECOPY FROMTRUNCATECREATEDROPALTERCOMMENT

  • SELECT ... FOR SHARE | UPDATE

  • DECLAREFETCHCLOSE

  • SHOW

  • ROW EXCLUSIVE MODE 更严格的 LOCK 命令

  • 在事务隔离级别 SERIALIZABLE 中的 SELECT

  • 部分事务性命令:

    • BEGIN READ WRITESTART TRANSACTION READ WRITE

    • SET TRANSACTION READ WRITESET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE

    • SET transaction_read_only = off

  • 两阶段提交命令:PREPARE TRANSACTIONCOMMIT PREPAREDROLLBACK PREPARED

  • LISTENUNLISTENNOTIFY

  • VACUUM

  • 大对象创建命令

  • 多语句查询(multiple SQL commands on single line)

  • 一些序列方法(nextval and setval)

自定义 SQL 查询

当前版本默认定义了一些函数和 SQL 模板,包含这些函数或者匹配上 SQL 模板的查询会转发到主节点。

  • 包含 nextvalsetvallastvalcurrvaltxid_currentgin_clean_pending_list 函数的查询

  • 包含以 pg_catalogpg_current_cursor_ 作为前缀的函数的查询

  • 符合查询模板 .*for update.* 的查询

发送到只读节点的查询

  • 不包含在上述的 SELECT 查询

  • COPY TO STDOUT

  • EXPLAIN

  • EXPLAIN ANALYZE and the query is SELECT not including writing functions

发送到主节点和只读节点

  • SET

  • DISCARD

  • DEALLOCATE ALL

显式事务转发策略

  • 在显示事务中,BEGIN 会被同时转发到主节点和只读节点。

  • 在显式事务中,遇到不能在只读节点执行的查询语句(如 INSERT)之前的查询语句,会发送到只读节点。

  • 在显式事务中,遇到不能在只读节点执行的查询语句(如 INSERT),会发送到主节点。在这之后的查询语句都会发送到主节点上,这是为了让 SELECT 立即看到 INSERT 的结果。 此行为一直持续到事务关闭或终止。