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

阅读原文请点击: 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/

猜你喜欢

转载自1369049491.iteye.com/blog/2381086