简介
作为分布式数据库阐述一下几点优势:
数据分散和负载均衡:通过选择合适的分布键,可以将数据均匀地分布在多个节点上,避免数据集中存储在单一节点上的问题。这样可以实现数据的负载均衡,提高整体系统的性能和可扩展性。
查询性能优化:合理选择分布键可以使相同键值的数据存储在同一节点上,这样在进行查询操作时可以减少数据的传输和网络开销,提高查询效率。同时,正确选择分布键也能避免数据倾斜的问题,均衡地分布查询负载。
数据局部性优化:通过选择与查询相关的分布键,可以使查询所需的数据更有可能在同一节点上,减少跨节点的数据传输,加快查询的速度。
对于非分布式数据库,也就是传统的单节点数据库,其优势包括:
简单易用:非分布式数据库通常只需要在单个节点上进行部署和配置,减少了分布式系统的复杂性。操作和管理相对简单,上手较快。
一致性和事务支持:非分布式数据库提供强一致性和完整的事务支持,保证数据的准确性和可靠性。在某些场景下,这种一致性和事务支持是非常重要的,特别是需要严格的数据一致性和事务控制的业务。
较低的延迟:由于非分布式数据库只在单节点上运行,通常具有较低的读/写延迟,特别是对于单个查询和事务操作。
分布式数据库的代表:Greenplum,HBase,HUAWEI GaussDB,MongoDB,OceanBase,Postgres-XC,Redis
本文以Postgres-XC数据库的分布规则举例
Postgres-XC特点
在Postgres-XC数据库中, 系统进行自有的哈希算法对所给的分布键计算其结果,根据结果将所对应的数据分不到各个节点中,
Postgres-XC有如下特点。
1,基于PostgreSQL实现的集群。
·可以使用PostgreSQL的客户端及驱动无差别地连接到Postgres-XC上。客户端与PostgreSQL是完全兼容的。紧跟着PostgreSQL的升级而升级。
2,并不是架构在PostgreSQL数据库之上的中间件。是通过修改PostgtreSQL源代码实现的数据库集群,并不是一些架构在数据库之上的中间件。实现了全局事务,是数据强一致性的。
3,对称集群。
·无中心节点,SQL可以发送给任意一台协调器,可扩展性比较好。·应用可以读写任意节点,结果都是一样的。在整个集群上实现了ACID,所以读任意节点看到的结果都是一致的。
4,线性扩展读和写。
与读写分离的方案不同的是,通过增加节点,不仅可以扩展读还能扩展写的性能。
以下图展示了Postgres-XC性能随数据节点数增长的情况
图中的“Ideal”线代表理想情况下的性能,n个数据节点的性能是单机性能的n倍,“Observed”线是实测的结果。从实例结果中可以看出,当有3个Postgres-XC数据节点时,可达到单个PostgreSQL数据库2倍的性能,5个节点可以达到单个PostgreSQL数据库3倍的性能,10个Postgres-XC数据节点时,基本可以到达单个PostgreSQL数据库6倍的性能。从图中可以看出,随数据节点的增加,Postgres-XC的可扩展能力的增长还是比较线性的
语法
根据数据的分布方式,Postgres-XC可以创建以下两种类型的表。
Replicated tables:
各个底层节点数据库上的表中的数据完全相同。插入数据时,分别在各个底层节点数据库上插入相同的数据。读数据时,只需要读任意一个节点上的数据。
Distributed tables:
根据一个拆分规则把表的数据拆分到各个底层的数据库数据节点上,也就是分布式数据库中常说的Sharding技术。每个底层数据库节点上只保存表的一部分数据。Postgres-XC可以让不同的表的数据分布到不同的部分底层数据库节点上,而不必全部完整地分布到所有的底层数据库节点上。下面通过分析Postgres-XC的建表语句来看它是如何实现上述功能的。建表,需要指定表的数据分布到哪些节点上,Postgres-XC在建表语句中增加了DISTRIBUTE BY子句,此子句的语法如下
[ DISTRIBUTE BY { REPLICATION | ROUNDROBIN | { [HASH | MODULO ] ( column_name ) } } ]
[ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ]
--唯一分布键
create table hash_text(id bigint ,text varchar(50) ,col varcahr(50))
distributed by hash(id)
--联合分布键
create table hash_text(id bigint ,text varchar(50) ,col varcahr(50))
distributed by hash(id,text)
注意:如果不指定DISTRIBUTE BY子句,分布键会自动使用主键,实际上,如果没有主键而有唯一键,Postgres-XC会自动使用唯一键,当也不存在唯一约束时,则会将找到的第一个可以作为分布键的列用作分布键。
Postgres-XC还有以下使用限制:
分布键是不能更新的。
不支持SERIALIZABLE和REPEATABLE READ两种事务隔离级别。
约束只能应用于Datanodes,不支持跨节点的约束。
在PREPARE语句中不支持一些复杂的SQL。
视图上的权限可能工作不正常。
行触发器在COPY命令中并不工作。
REPLICATION的表不支持COPY TO。
plpgsql函数中不能使用DML语句。
不支持CREATE TABLE AS EXECUTE。
不支持WHERE CURRENT OF。
不支持Foreign Data Wrapper。