数据库高可用性postgreSQL

本文详细介绍了PostgreSQL数据库的高可用性原理、功能、发展前景、应用场景和技术实现,包括流复制、负载均衡和多种索引类型。PostgreSQL提供丰富的功能,如复杂查询、外键、触发器和多版本并发控制,支持SQL标准,并具有高度的可扩展性。在应用场景中,PostgreSQL的B-Tree、Hash、GiST等索引类型适用于不同类型的查询。文章还探讨了PostgreSQL在开源数据库领域的地位和未来发展趋势,以及在高可用性方面的实践案例,如通过Pgpool-II和Pgbouncer实现的数据库中间件解决方案。
摘要由CSDN通过智能技术生成

数据库高可用性

原理

多个数据库服务器可以协同工作,比如在主服务器失效的时候备份服务器立即取代它的位置(高可用性),或者几台机器同时服务于同一个数据库(负载均衡)。理想状态多台服务器之间可以无缝协作。为静态页面提供服务的 Web 服务器可以轻松的通过将 web 请求分摊到多台机器从而实现负载均衡。事实上,只读数据库也能轻松的以相同的方法实现负载均衡。不幸的是,大多数数据库服务器都需要同时处理混合的读/写请求,将这些数据库联合起来工作是件很麻烦的事。虽然只读数据只需要在每台服务器上复制一份即可,但是在任何一台服务器上的写动作都必须传播到其它所有服务器上,这样才能保证将来对这些已修改数据的读取返回一致的结果。这个写同步问题就是导致多台服务器协同工作麻烦重重的最基本原因。有多种解决此问题的方法,其思路也各不相同,但都不是既简单又高效的方案。

功能

PostgreSql提供了许多功能,旨在帮助开发人员构建应用程序,管理员保护数据完整性并且构建容错环境,并帮助你管理数据,无论数据集的大小。除了免费和开源之外,Postgre SQL还具有高度的可扩展性。例如,你可以定义自己的数据类型,构建自定义SQL函数,甚至可以编写来自不同编程语言的代码,而不需要重新编译数据库。
PostgreSql试图符合SQL标准,在这种标准中,这种一致性不会与传统特性相矛盾,或者可能导致糟糕的架构决策。支持SQL标准所需的许多功能,但是有时候语法或者功能略有不同。随着时间的推移,可以预期进一步向一致性迈进。从2018年10月发布的11版本开始,PostgreSQL符合SQL:2011核心一致性的179个强制性功能中的至少160个,在此之前,没有任何关系型数据库符合此标准的完全符合。

PostgreSQL是最初的伯克利代码的开源继承者。它支持大部分 SQL 标准并且提供了许多现代特性:复杂查询、外键、触发器、可更新视图、事务完整性、多版本并发控制

同样,PostgreSQL可以用许多方法扩展,比如, 通过增加新的:数据类型、函数、操作符、聚集函数、索引方法、过程语言
并且,因为自由宽大的许可证,任何人都可以以任何目的免费使用、修改和分发PostgreSQL, 不管是私用、商用还是学术研究目的。

众多功能和标准兼容性
PostgreSQL对SQL标准高度兼容,它实现的功能完全遵守于ANSI-SQL:2008标准。目前完全支持子查询(包括在FROM中的子查询)、授权读取和可序列化的事务隔离级别。同时PostgreSQL也具有完整的关系数据库系统的目录功能,它支持单数据库的多模式功能,每一个目录可通过SQL标准中定义的字典信息模式进行访问。
Data集成性功能包括(复合)主键、含有严格约束或级联更新和删除功能的外键、录入检查约束、唯一性约束和非空约束。
PostgreSQL也具有很多扩展模块和更高级的功能。其中有为方便使用的通过序列实现的自增字段、 允许返回部分记录集的LIMIT/OFFSET选项,也支持复合、唯一、部分和函数式索引,索引并支持B-Tree、R-Tree、Hash或GiST存储方式。
GiST (通用搜索树) 索引是一种高级系统算法,它将不同的排序算法与包含B-Tree、B±Tree、R-Tree、部分汇总树、可加权的B±Tree以及其他多种搜索逻辑结合在一起,它也提供了接口允许创建用户数据类型和扩展的查询方法。这样,GiST提供了用户指定存储和定义新方法进行查询的灵活性—它大大超越了标准B-Tree、R-Tree和其他通用搜索逻辑所能提供的功能。
GiST现在也成为很多其他使用PostgreSQL公共项目的基础,如OpenFTS和PostGIS项目。 OpenFTS(开源全文搜索引擎)项目提供在线索引和数据库搜索的相当权重评分。 PostGIS项目给PostgreSQL增加了地理信息管理功能,允许用户将PostgreSQL作为GIS空间地理信息数据库使用,这和专业的ESRI公司的SDE系统以及Oracle的空间地理扩展模块功能相同。
其他高级功能包括表继承、规则和数据库事件响应功能等。表继承功能可以按原来的一个表创建一个有关系的新表,这样允许数据库设计人员可以将一个表作为基表,从基表派生出新表。并且PostgreSQL甚至可以使用此方式实现单级或多级的继承。
规则功能是用来调用查询的重算功能,允许数据库设计人员根据不同的表或视图来创建规则,以实现动态改变数据库原操作为新的操作的功能。
事件响应功能是一个内部通讯功能,它将系统信息或事件在用户使用的LISTEN和NOTIFY两条指令后进行传递,允许 简要的点对点通讯或是对指定数据库事件的定点通讯。由于信息可以从触发器或是存储过程中发出,PostgreSQL的用户可以监控类似更新、新增或是删除的数据库事件

发展前景

非商业型的开源数据库是在商业数据库成熟并且市场占有率很高的情况下逐步进入市场的。在Linux系统开源的环境下,作为基础应用软件的开源数据库以其“开源”特性和成本优势,受到数据库生产商家和客户越来越广泛的关注。

开源数据库大体上可以分为三种:由大学科研原型系统转变为当今的开放源代码数据库,如PostgreSQL;由一个人或者几个开发人员自发研制的数据库系统,如MySQL;由一些商业数据库为了推广自己的产品,扩大市场份额,而开放了自己的源代码,如FireBird。

开源数据库是开放性资源软件,任何人都可以从因特网上下载并使用,而不需要付出任何费用;任何人都可以根据其授权使用或修改;任何需要的人都可以研究其源代码,并且在符合授权的基础上改变源代码以满足其特定需求。

开源数据库与主流商业数据库之间的竞争关系是显而易见的,但是随着“开源模式”逐渐趋于成熟和稳定,开源数据库必定对商业数据库产生巨大影响,数据库品领域必定会趋向多元化,用户在以后的产品采购决策中,会更加倾向对开源数据库的选择。当然,开源数据库产品在自身技术特性和功能特性的提高和完善上需要在开源和商业之间寻找平衡点,并且需要找出适合自身发展的技术切入点和市场切入点。

开源数据库的发展历程较短,但发展速度很快。一些主流的开源数据库,如PostgreSQL数据库,在性能上已经基本达到商业数据库的水平,满足大多数用户的需求。

开源数据库同商业数据库相比,在价格方面具有绝对的优势。开源数据库在性能方面也同商业数据库一样能满足用户的绝大部分需求,甚至在处理地理空间数据的能力和效率上,PostgreSQL数据库管理系统更具优势,其以对象形式对地理空间要素进行抽象,极大地提高了空间分析的能力。在非超大型项目中,开源数据库以其低廉的成本和强大的功能,将为更多用户所选择,成为商业数据库在这一领域的竞争对手。

应用场景

PostgreSQL提供了几种索引类型:B-tree,hash,GiST,SP-GiST,GIN和BRIN。每个索引类型使用不同的算法,适合不同种类的查询。默认情况下,CREATEINDEX命令创建B-tree索引,这符合最常见的情况。
BTree
1.1应用场景
b-tree适合所有的数据类型,支持排序,支持大于、小于、等于、大于或等于、小于或等于的搜索。索引与递归查询结合,还能实现快速的稀疏检索。
1.2示例

// An highlighted block
postgres=# create table t_btree(id int, info text);  
CREATE TABLE  
postgres=# insert into t_btree select generate_series(1,10000), md5(random()::text) ;  
INSERT 0 10000  
postgres=# create index idx_t_btree_1 on t_btree using btree (id);  
CREATE INDEX  
postgres=# explain (analyze,verbose,timing,costs,buffers) select * from t_btree where id=1;  
                                                          QUERY PLAN                                                             
-------------------------------------------------------------------------------------------------------------------------------  
 Index Scan using idx_t_btree_1 on public.t_btree  (cost=0.29..3.30 rows=1 width=37) (actual time=0.027..0.027 rows=1 loops=1)  
   Output: id, info  
   Index Cond: (t_btree.id = 1)  
   Buffers: shared hit=1 read=2  
 Planning time: 0.292 ms  
 Execution time: 0.050 ms  
(6 rows)  

2hash
2.1应用场景
hash索引存储的是被索引字段VALUE的哈希值,只支持等值查询。
hash索引特别适用于字段VALUE非常长(不适合b-tree索引,因为b-tree一个PAGE至少要存储3个ENTRY,所以不支持特别长的VALUE)的场景,例如很长的字符串,并且用户只需要等值搜索,建议使用hash index。
2.2示例

// An highlighted block
postgres=# create table t_hash (id int, info text);  
CREATE TABLE  
postgres=# insert into t_hash select generate_series(1,100), repeat(md5(random()::text),10000);  
INSERT 0 100  
  
-- 使用b-tree索引会报错,因为长度超过了1/3的索引页大小
postgres=# create index idx_t_hash_1 on t_hash using btree (info);  
ERROR:  index row size 3720 exceeds maximum 2712 for index "idx_t_hash_1"  
HINT:  Values larger than 1/3 of a buffer page cannot be indexed.  
Consider a function index of an MD5 hash of the value, or use full text indexing.  
  
postgres=# create index idx_t_hash_1 on t_hash using hash (info);  
CREATE INDEX  
  
postgres=# set enable_hashjoin=off;  
SET  
postgres=# explain (analyze,verbose,timing,costs,buffers) select * from t_hash where info in (select info from t_hash limit 1);  
                                                             QUERY PLAN                                                                
-------------------------------------------------------------------------------------------------------------------------------------  
 Nested Loop  (cost=0.03..3.07 rows=1 width=22) (actual time=0.859..0.861 rows=1 loops=1)  
   Output: t_hash.id, t_hash.info  
   Buffers: shared hit=11  
   ->  HashAggregate  (cost=0.03..0.04 rows=1 width=18) (actual time=0.281..0.281 rows=1 loops=1)  
         Output: t_hash_1.info  
         Group Key: t_hash_1.info  
         Buffers: shared hit=3  
         ->  Limit  (cost=0.00..0.02 rows=1 width=18) (actual time=0.012..0.012 rows=1 loops=1)  
               Output: t_hash_1.info  
               Buffers: shared hit=1  
               ->  Seq Scan on public.t_hash t_hash_1  (cost=0.00..2.00 rows=100 width=18) (actual time=0.011..0.011 rows=1 loops=1)  
                     Output: t_hash_1.info  
                     Buffers: shared hit=1  
   ->  Index Scan using idx_t_hash_1 on public.t_hash  (cost=0.00..3.02 rows=1 width=22) (actual time=0.526..0.527 rows=1 loops=1)  
         Output: t_hash.id, t_hash.info  
         Index Cond: (t_hash.info = t_hash_1.info)  
         Buffers: shared hit=6  
 Planning time: 0.159 ms  
 Execution time: 0.898 ms  
(19 rows)  

3gin
3.1原理
gin是倒排索引,存储被索引字段的VALUE或VALUE的元素,以及行号的list或tree。
(col_val:(tid_listortid_tree),col_val_elements:(tid_listortid_tree))
3.2应用场景
1、当需要搜索多值类型内的value时,适合多值类型。例如数组、全文检索、TOKEN。(根据不同的类型,支持相交、包含、大于、在左边、在右边等搜索)
2、当用户的数据比较稀疏时,如果要搜索某个value的值,可以适应btree_gin支持普通btree支持的类型。(支持btree的操作符)
3、当用户需要按任意列进行搜索时,gin支持多列展开单独建立索引域,同时支持内部多域索引的bitmapAnd,bitmapOr合并,快速的返回按任意列搜索请求的数据。
3.3示例
3.3.1多值类型搜索

// An highlighted block
postgres
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值