欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库平滑switchover的要素 - 会话资源漂移 中间件postgresqlsqlLotusJNI 

程序员文章站 2022-05-27 21:47:00
...
阅读原文请点击:http://click.aliyun.com/m/23940/
摘要: 标签 PostgreSQL , 中间件 , 连接池 , 平滑切换 , 会话设置 , 会话状态 , 绑定变量语句 , prepared statement 背景 数据库迁移、切换是很普遍的一个话题,但是大多数的方案,对用户来说都是有感知的,所以用户的体验并不好。

标签

PostgreSQL , 中间件 , 连接池 , 平滑切换 , 会话设置 , 会话状态 , 绑定变量语句 , prepared statement

背景

数据库迁移、切换是很普遍的一个话题,但是大多数的方案,对用户来说都是有感知的,所以用户的体验并不好。

例如用户使用了绑定变量语句,主备角色切换后绑定变量语句没有了,会导致调用报错。

我们需要维护主库的硬件,那么可以在中间件层面,将主备数据库的角色进行平滑调换,维护好硬件,再平滑的调换回来。

数据库主备切换时,如何做到会话级无感知?首先我们要了解会话中都有哪些内容,哪些内容是需要随角色切换一起迁移的。从而做到用户无感知。

(本文HA指中间件层级的HA,并非APP直连数据库,VIP切换的那种HA。)

简单的switchover过程举例:

等待所有会话的事务结束,会话都处于idle状态,冻结会话,不允许提交任何SQL,然后进行角色切换,并将每个会话的资源状态平移。

会话资源状态

会话中有些什么状态?通过discard这条SQL就可以了解。

https://www.postgresql.org/docs/10/static/sql-discard.html

DISCARD — discard session state 
discard all相当于执行如下

SET SESSION AUTHORIZATION DEFAULT; 
RESET ALL; 
DEALLOCATE ALL; 
CLOSE ALL; 
UNLISTEN *; 
SELECT pg_advisory_unlock_all(); 
DISCARD PLANS; 
DISCARD SEQUENCES; 
DISCARD TEMP; 
会话资源中目前可能包含如下(每个PG版本可能有些许差异):

SESSOIN角色、参数设置、绑定变量语句、游标、异步消息监听、AD锁、序列、临时表等。

下面介绍一下每种资源的查询方法,以及在新的主库上进行资源复原的方法。

一、SESSION AUTHORIZATION

超级用户可以将会话用户设置为其他用户,普通用户无权切换用户。

当前用户为postgres,设置SESSION AUTHORIZATION为test

postgres=# set SESSION AUTHORIZATION test; 
SET 
postgres=> show SESSION AUTHORIZATION; 
session_authorization  
----------------------- 
test 
(1 row) 
postgres=> select usename from pg_stat_activity where pid=pg_backend_pid(); 
usename   
---------- 
postgres 
(1 row) 
查询方法

postgres=> show SESSION AUTHORIZATION; 
session_authorization  
----------------------- 
test 
(1 row) 
postgres=> select usename from pg_stat_activity where pid=pg_backend_pid(); 
usename   
---------- 
postgres 
(1 row) 
复原方法

当pg_stat_activity.usename不等于SESSION AUTHORIZATION时,需要通过如下方法复原它。

postgres=# set SESSION AUTHORIZATION test; 
SET 
二、参数
阅读原文请点击:http://click.aliyun.com/m/23940/