PostgreSQL基于流复制的HA实现

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:
继上两周由 DBA+杭州群联合发起人周正中带来的 数据库安全专题分享,本周起,他将为大家分享数据库管理专题,以下讲解的是PostgreSQL基于流复制的HA实现。

 

专家简介

 
 

周正中

网名:德哥@Digoal

DBA+杭州群联合发起人之一

 

PostgreSQL中国社区发起人之一,负责杭州分会,兼任社区CTO一职。曾就职于斯凯网络,负责数据库部门。现就职于阿里巴巴,负责RDS PG内核组事务。

 

 

 

前段时间弄了个小玩意,适合2台主机,使用PostgreSQL流复制组建HA。

实现自动的failover和failback。

已经提交到github, 主备角色各一个虚拟IP。

https://github.com/digoal/PostgreSQL_HA_with_primary_standby_2vip

有此类需求的朋友可以下载测试。

 

之前还写过一个master对应单个IP,并且不会自动failback的脚本,没有这个复杂,也比较好用。

https://github.com/digoal/sky_postgresql_cluster

 

如果使用RHCS的话,可以组件基于共享存储的HA

 

回到主题,讲一下2台主机如何使用流复制来做HA。

A HA script for PostgreSQL with 2 HOST (one for primary, one for standby), Primary with one VIP, Standby with another VIP. Auto failover and failback.

 

硬件需求:

两台主机,分别负责primary和standby;

2台主机还需要2个fence设备,切换时防止脑裂。

2个虚拟IP,分别对应primary和standby;

三种状态,primary,standby,primary_standby;

 

三种状态自由切换:

当1台主机异常时,另一台主机承担primary_standby角色,并启动2个虚拟IP。

正常情况下两台主机分别承担primary和standby角色, 分别启动一个虚拟IP。

 

应用程序连接虚拟IP,一个虚拟IP对应的是primary, 另一个虚拟IP对应的是standby。

虚拟IP和角色的关系固定,不会变化,例如:

假设192.168.111.130对应primary角色,那么不管怎么切换,他们始终在一起(谁是primary,谁就会启动192.168.111.130)。

 

数据库角色转变和心跳原理:

1. 根据文件recovery.conf是否存在检测本地节点角色

存在(standby),不存在(master)

2. 加载NFS对端归档目录

3. 启动数据库

如果是standby

1 备份上一个控制文件副本

2 备份当前控制文件

3 启动数据库

如果是master

1. 启动数据库

 

启动VIP

如果是standby

1. 启动vips

如果是master

1. 如果vipm已被其他节点启动

降级为standby

启动vips

2. 如果vipm没有被其他节点启动

启动vipm

 

触发第一次心跳

 

循环心跳检测

不同的角色,循环逻辑不同:

 

master角色,循环检查

1. 网关检查,反映本地网络状况

2. 本地心跳检查,反映本地数据库健康状态

3. 本地角色对应IP检查

4. 检查VIPS、PORT、数据库心跳

==如果本地健康,对端不健康

==触发切换

1. 主节点fence standby

2. 主节点接管VIPS

3. 主节点转换master_standby角色

 

standby角色,循环检查

1. 网关检查,反映本地网络状况

2. 本地心跳检查,反映本地数据库健康状态

3. 本地角色对应IP检查

4. 检查备延迟,判断是否允许promote

5. 检查VIPM、PORT、数据库心跳

==如果本地健康,对端不健康

==触发切换

1. 备节点fence master

2. 备节点停库

3. 备节点备份控制文件

4. 备节点注释restore_command

5. 备节点启动数据库

6. 备节点激活数据库

7. 备节点接管VIPM

8. 备节点转换master_standby角色

 

master_standby角色,循环检查

1. 检查对端数据库监听是否启动

==如果对端数据库已启动

==触发释放vips

1. 释放vips

2. 转换为master角色

 

架构图:

 

 

 

 

 

 

[压力测试以及一致性测试]

主192.168.173.37

备192.168.173.42

创建测试表 , 测试函数

postgres=# create table test(id int primary key, info text, crt_time timestamp);

CREATE TABLE

postgres=# create or replace function f_test(i_id int) returns void as $$

declare

begin

update test set info=md5(random()::text),crt_time=now() where id=i_id;

if not found then

insert into test values(i_id,md5(random()::text),now());

end if;

exception when others then

return;

end;

$$ language plpgsql strict;

压力测试脚本

vi test.sql

\setrandom id 1 30000000

select f_test(:id);

压力测试

postgres@db-192-168-173-37-> pgbench -M prepared -n -r -f ./test.sql -c 16 -j 4 -T 3000

在约1分钟后, 关闭主库eth0:1 接口

[root@db-192-168-173-37 ~]# ifdown eth0:1

这期间173.37还在做压力测试, 数据库已经和42产生了差异数据.

看后面37能不能顺利转换成standby

 

触发切换, 备切换成主备角色

[root@db-192-168-173-42 ~]# tail -f -n 1 /tmp/sky_pg_clusterd.log

2015-01-0408:50:42 detecting eth0 192.168.173.130 exists, ps: return 0 exist, other not exist.

checkmaster check times: 3

2015-01-0408:50:45 detecting eth0 192.168.173.130 exists, ps: return 0 exist, other not exist.

checkmaster check times: 4

2015-01-0408:50:48 detecting eth0 192.168.173.130 exists, ps: return 0 exist, other not exist.

checkmaster check times: 5

2015-01-0408:50:51 detecting eth0 192.168.173.130 exists, ps: return 0 exist, other not exist.

checkmaster ipscan timeout: 5

2015-01-0408:50:53 normal fenceing, waiting...

Success: Rebooted

waiting for server to shut down............. done

server stopped

waiting for server to start....LOG: 00000: redirecting log output to logging collector process

HINT: Future log output will appear in directory "pg_log".

LOCATION: SysLogger_Start, syslogger.c:649

.............................. done

server started

2015-01-0408:51:48 promoting database ...

server promoting

2015-01-0408:51:48 testing promote status

2015-01-0408:51:48 promoting...

2015-01-0408:51:49 testing promote status

2015-01-0408:51:49 promote success.

CHECKPOINT

pg_switch_xlog

----------------

1/14C58C30

(1 row)

 

CHECKPOINT

pg_switch_xlog

----------------

1/150000E8

(1 row)

 

CHECKPOINT

2015-01-0408:51:56 eth0:1 if upping. 1.

2015-01-0408:52:00 eth0:1 upped success.

2015-01-0408:52:00 this is m_s

2015-01-0408:52:01 detecting eth0 192.168.173.1 exists, ps: return 0 exist, other not exist.

cluster_keepalive_test

------------------------

 

(1 row)

 

2015-01-0408:52:01 detecting 192.168.173.130 address up on eth0 ....

2015-01-0408:52:01 detecting 192.168.173.131 address up on eth0 ....

2015-01-0408:52:01 detecting postgresql listener on peer host.

connect failed!: Operation now in progress

socket created!

 

在新主节点(192.168.173.42)接着压

postgres@db-192-168-173-42-> pgbench -M prepared -n -r -f ./test.sql -c 16 -j 4 -T 30

 

最后主备一致性检查

新主节点

postgres=# select count(*),sum(hashtext(info)) from test;

count | sum

---------+---------------

1808909 | -680268294581

(1 row)

 

新备节点

postgres=# select count(*),sum(hashtext(info)) from test;

count | sum

---------+---------------

1808909 | -680268294581

(1 row)

 

[参考]

1. https://github.com/digoal/PostgreSQL_HA_with_primary_standby_2vip

2. https://github.com/digoal/sky_postgresql_cluster



本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2015-10-27

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
存储 运维 Cloud Native
【实操系列】基于AnalyticDB PostgreSQL数据共享实现企业级跨多业务的敏捷分析
云数据仓库AnalyticDB PostgreSQL 版发布了最新自研的云原生架构实例,实现了跨实例间的数据共享能力。允许进行跨实例间的实时数据共享且无需进行数据迁移,可支持构建安全、高效、灵活的数据分析场景。本文介绍了依托数据共享实现云数仓跨多业务实例的敏捷数据分析方案;
【实操系列】基于AnalyticDB PostgreSQL数据共享实现企业级跨多业务的敏捷分析
|
SQL 存储 关系型数据库
PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换|学习笔记
快速学习PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换
PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换|学习笔记
|
SQL 存储 Oracle
PostgreSQL 事务隔离级别的实现和多版本并发控制|学习笔记
快速学习 PostgreSQL 事务隔离级别的实现和多版本并发控制
PostgreSQL 事务隔离级别的实现和多版本并发控制|学习笔记
|
SQL 存储 关系型数据库
9 PostgreSQL 点对点多主表级复制-触发器篇|学习笔记
快速学习9 PostgreSQL 点对点多主表级复制-触发器篇
9 PostgreSQL 点对点多主表级复制-触发器篇|学习笔记
|
存储 SQL Oracle
10 PostgreSQL 表级复制-物化视图篇, 支持异地,异构如 Oracle 到 pg 的物化视图|学习笔记
快速学习10 PostgreSQL 表级复制-物化视图篇,支持异地,异构如 Oracle 到 pg 的物化视图
10 PostgreSQL 表级复制-物化视图篇, 支持异地,异构如 Oracle 到 pg 的物化视图|学习笔记
|
存储 SQL 缓存
PostgreSQL 复制原理及高可用集群(一)|学习笔记
快速学习 PostgreSQL 复制原理及高可用集群(一)
411 0
PostgreSQL 复制原理及高可用集群(一)|学习笔记
|
SQL 消息中间件 算法
14 PostgreSQL 表级复制-Londiste3哈希数据分区复制|学习笔记
快速学习14 PostgreSQL 表级复制-Londiste3哈希数据分区复制
14 PostgreSQL 表级复制-Londiste3哈希数据分区复制|学习笔记
|
SQL 消息中间件 存储
PostgreSQL 表级复制-Londiste3安装以及使用|学习笔记
快速学习 PostgreSQL 表级复制-Londiste3安装以及使用
PostgreSQL 表级复制-Londiste3安装以及使用|学习笔记
|
关系型数据库 测试技术 PostgreSQL
postgresql实现影响分析
通过postgresql模仿分析假如城市发布通知,位于街道的人员是否受到了影响
129 0
postgresql实现影响分析
|
关系型数据库 PostgreSQL
《PostgreSQL复制原理及高可用集群》电子版地址
PostgreSQL复制原理及高可用集群
102 0
《PostgreSQL复制原理及高可用集群》电子版地址