[转帖]PG里面的Citus简介----找时间学习一下.
1. Citus是什么
是PostgreSQL的扩展,可以同PG一同安装,之后通过SQL命令加入到数据库中。
【相关操作】
|
1
2
|
#创建Citus扩展:CREATE EXTENSION citus; |
2. 节点
2.1. 协调节点(coordinator node,简称CN)
存储所有的元数据,不存储实际数据。为应用系统提供服务,向各工作节点发送查询请求,并汇总结果。对于应用系统而言是服务端,对于工作节点而言有点像客户端。
2.2. 工作节点(worker node,简称WN)
不存储元数据,存储实际数据。执行协调节点发来的查询请求。原则上不直接为应用系统提供服务。但是直接操作工作节点上的表也是可以实现的。
【相关操作】
|
1
2
3
4
5
6
7
8
9
10
11
|
#在协调节点上增加工作节点:SELECT * from master_add_node('192.168.7.130', 5432);SELECT * from master_add_node('192.168.7.131', 5432);SELECT * from master_add_node('192.168.7.132', 5432);#查看工作节点:SELECT * FROM master_get_active_worker_nodes();node_name | node_port ---------------+----------- 192.168.7.130 | 5432 192.168.7.131 | 5432 192.168.7.132 | 5432 |
3. 分片(shards)与副本(placement)
将同一张逻辑表中的数据按照一定策略,分别存储到不同的物理表中去。物理表被称为分片。分片和工作节点是不同的概念,同一个工作节点上可以放置许多的分片,甚至可以将一张逻辑表分为两个分片,并将这两个分片都存储在同一个工作节点上。
分片原则
在设计分布式数据库的时候,设计者必须考虑数据如何分布在各个场地上,也就是全局数据应该如何进行逻辑划分和物理划分。哪些数据应该分布式存放,哪些不需要分布式存放,哪些数据需要复制。对系统惊醒全盘考虑,使系统性能最优。但是无论如何进行分片都应该遵循以下原则:
● 完备性:所有全局数据都要映射到某个片段上。
● 可重构性:所有片段必须可以重新构成全局数据。
● 不相交性:划分的个片段所包含的数据无交集。
副本,即分片的冗余。
【相关操作】
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#配置分片策略(在CN上创建表之后):SELECT master_create_distributed_table('test_table', 'id', 'hash');#进行分片操作(将表分为3片,每个分片有2个副本):SELECT master_create_worker_shards('test_table', 3, 2);#查看分片:SELECT * from pg_dist_shard; logicalrelid | shardid | shardstorage | shardminvalue | shardmaxvalue --------------+---------+--------------+---------------+--------------- test_table | 102001 | t | -2147483648 | -1610612737 test_table | 102002 | t | -1610612736 | -1073741825 test_table | 102003 | t | -1073741824 | -536870913#查看分片分布:SELECT * from pg_dist_shard_placement order by shardid, placementid; shardid | shardstate | shardlength | nodename | nodeport | placementid ---------+------------+-------------+---------------+----------+------------- 102001 | 1 | 0 | 192.168.7.130 | 5432 | 33 102001 | 1 | 0 | 192.168.7.131 | 5432 | 34 102002 | 1 | 0 | 192.168.7.131 | 5432 | 35 102002 | 1 | 0 | 192.168.7.132 | 5432 | 36 102003 | 1 | 0 | 192.168.7.132 | 5432 | 37 102003 | 1 | 0 | 192.168.7.130 | 5432 | 38 |
从上面的分析可以看出,表test_table被分成了3个分片(102001,102002,102003),每个分片有2个副本,分别存储在相邻的两个节点上。如下图所示。
分片分布表中shardstate为1时,表示当前副本的状态是有效(同步)的;shardstate为3时,表示当前副本的状态是有无效(失步)的。
4. 数据访问
通过CN对表test_table进行插入操作,根据先前定义的分片策略,citus会根据id的哈希值自动为插入的记录选择一个分片进行写入。
当WN3离线时,通过CN对表test_table进行查询操作,因为WN1和WN2上已经包含了所有的分片,所以查询能够正常返回应有的结果。此时查看分片分布,发现所有副本状态都仍然为有效。
当WN3离线时,通过CN对表test_table进行插入/更新/删除操作,如果受影响的记录属于201001分片,那么citus会修改WN1和WN2上test_table_102001表的数据,且不会对任何副本的状态产生影响;如果受影响的记录属于201002分片,(因为WN3离线),citus会修改WN2上test_table_102002表的数据,并在分布分片信息中将36号副本的状态置为“无效(失步)”,注意此时37号副本的状态仍然是“有效(同步)”。
之后让WN3重新上线,检查分布分片信息,可以看到36号副本的状态仍为“无效(失步)”,可见其不会自动修复。此时对201002分片的所有读写操作,都只对35号副本进行。
5. 分片修复
【相关操作】
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#先查看分片分布:SELECT * from pg_dist_shard_placement order by shardid, placementid; shardid | shardstate | shardlength | nodename | nodeport | placementid ---------+------------+-------------+---------------+----------+------------- 102001 | 1 | 0 | 192.168.7.130 | 5432 | 33 102001 | 1 | 0 | 192.168.7.131 | 5432 | 34 102002 | 1 | 0 | 192.168.7.131 | 5432 | 35 102002 | 3 | 0 | 192.168.7.132 | 5432 | 36 102003 | 1 | 0 | 192.168.7.132 | 5432 | 37 102003 | 1 | 0 | 192.168.7.130 | 5432 | 38#用35号副本的数据去覆盖36号副本:SELECT master_copy_shard_placement(102002, '192.168.7.131', 5432, '192.168.7.132', 5432);#再次查看分片分布:SELECT * from pg_dist_shard_placement order by shardid, placementid; shardid | shardstate | shardlength | nodename | nodeport | placementid ---------+------------+-------------+---------------+----------+------------- 102001 | 1 | 0 | 192.168.7.130 | 5432 | 33 102001 | 1 | 0 | 192.168.7.131 | 5432 | 34 102002 | 1 | 0 | 192.168.7.131 | 5432 | 35 102002 | 1 | 0 | 192.168.7.132 | 5432 | 36 102003 | 1 | 0 | 192.168.7.132 | 5432 | 37 102003 | 1 | 0 | 192.168.7.130 | 5432 | 38#可见36号副本已经修复。 |
当且仅当分片时设置了副本数量大于1,且该分片目前存在有效副本时,才可以进行修复。从目前已知的情况来看,citus不能自动修复。可以通过开发守护进程检测各个节点和副本的状态,当发现出现失效副本时,在服务程序中调用master_copy_shard_placement的方法实现自动修复。
6. 集群性能
通过搭建基于PostgreSQL10的1CN+2WN的Citus集群环境(两分片,单副本)和单节点传统PostgreSQL10进行对比的方法,采用PgBench测试工具的TPC-B模式,在记录数100万的情况下得出如下结果:TPS[Citus]=258,TPS[PG10]=688。即该配置下Citus集群的整体读写效率为传统单节点PG10的37.5%。
通过合理的分片,使得大多数操作可以直接在WN进行,能有有效的提高Citus集群的效率,但是在存在副本的情况下,需要应用程序人为的保证Citus系统同一分片的不同副本间的一致性。
[转帖]PG里面的Citus简介----找时间学习一下.的更多相关文章
- [转帖]PG的简单备份恢复 找时间进行测试
转帖PG的简单使用 https://blog.csdn.net/lk_db/article/details/77971634 一: 纯文件格式的脚本: 示例:1. 只导出postgres数据库的数据, ...
- [转帖]SQL 里面的 case when 的用法
SQL之case when then else end用法介绍 https://www.2cto.com/database/201804/740772.html 要培训了 看到有case when 之 ...
- Unity3D研究之Prefab里面的Prefab关联问题
Unity研究院之Prefab和GameObject的正向和逆向查找引用 我发现很多美工兄弟都爱问程序Unity3d为什么总丢材质? 我不排除U3d有BUG的情况下会丢材质?但是其实很多时候是人为操作 ...
- 学习hash_map从而了解如何写stl里面的hash函数和equal或者compare函数
---恢复内容开始--- 看到同事用unordered_map了所以找个帖子学习学习 http://blog.sina.com.cn/s/blog_4c98b9600100audq.html (一)为 ...
- 如何才能通俗易懂的解释javascript里面的"闭包"?
看了知乎上的话题 如何才能通俗易懂的解释javascript里面的‘闭包’?,受到一些启发,因此结合实例将回答中几个精要的答案做一个简单的分析以便加深理解. 1. "闭包就是跨作用域访问变量 ...
- 读 vue 源码一 (为什么this.message能够访问data里面的message)
12月离职后,打算在年后再找工作了,最近陆陆续续的看了黄轶老师的vue源码解析,趁着还有几天过年时间记录一下. 目标:vue如何实现通过this.key,就能直接访问data,props,method ...
- [教程] 【【【【odex教程之jar】】】】/system/framework里面的jar做odex g13
dexopt-wrapper core.jar core.odex dexopt-wrapper ext.jar ext.odex dexopt-wrapper framework.jar frame ...
- nginx配置文件中,location字段里面的root字段和别名alias
1. location里面的root例子 server{ listen ; server_name www.wzw.com; location /www { root /data/; //设置虚拟主机 ...
- java里面的public static void main(String[] args)
package com.java_1; public class Hello { public static void main(String[] args){ System.out.println( ...
随机推荐
- shiro实战系列(六)之Authorization(授权)
授权,又称作为访问控制,是对资源的访问管理的过程.换句话说,控制谁有权限在应用程序中做什么. 授权检查的例子是:该用户是否被允许访问这个网页,编辑此数据,查看此按钮,或打印到这台打印机?这些都是 决定 ...
- robotframe 自定义开发库
site-packages(这个路径一定要在系统path路径中)下面创建一个UserDefineLibrary文件夹:目录结构如下 ---- ----- UserDefineLibrary __ in ...
- EF(EF Core)中的NotMappedAttribute(转载)
NotMapped特性可以应用到EF实体类的属性中,Code-First默认的约定,是为所有带有get,和set属性选择器的属性创建数据列..NotManpped特性打破了这个约定,你可以使用NotM ...
- 2017-2018 Exp4 恶意代码分析 20155214曾士轩
目录 Exp4 恶意代码分析 实验内容 使用schtasks指令监控系统运行 主要思路 知识点 启发 Exp4 恶意代码分析 本次实验操使用Windows下的schtasks,sysmon,Proce ...
- 20155229《网络对抗技术》Exp3:免杀原理与实践
实验预习 免杀: 看为一种能使病毒木马避免被杀毒软件查杀的技术. 免杀的分类: 开源免杀:指在有病毒.木马源代码的前提下,通过修改源代码进行免杀.. 手工免杀:指在仅有病毒.木马的可执行文件(.exe ...
- TPM及TSS协议栈的安装使用
TPM及TSS协议栈的安装 标签: 可信计算. 目录 安装环境介绍 TPM及TSS安装 软件包下载 TPM 安装 安装TSS 安装tpm-tools 交互过程 编写代码测试TPM是否可用 编写代码测试 ...
- HTML5 本地存储实现购物车功能
在家休陪产假,无聊,看自己以前的项目,突然发现之前写的购物车都是用数据库实现的,数据库实现购物车原则上没什么问题,但是需要和数据库交互,这样无意之间降低了程序的效率.今天突发奇想,如果能用HTML5本 ...
- PowerBI开发 第二篇:数据建模
在分析数据时,不可能总是对单个数据表进行分析,有时需要把多个数据表导入到PowerBI中,通过多个表中的数据及其关系来执行一些复杂的数据分析任务,因此,为准确计算分析的结果,需要在数据建模中,创建数据 ...
- 使用SignalR实时Web应用程序
实时Web应用程序能够实时地将服务器端内容推送到连接的客户端.对于ASP.NET开发人员,ASP.NET SignalR是一个向其应用程序添加实时Web功能的库.它利用了多种传输方式,根据客户端和服务 ...
- docker教程——docker镜像打包上传
在开始使用URLOS进行docker应用开发之前,我们先来了解一下docker镜像的打包方法.首先,安装URLOS,安装完成之后,docker也随之安装到了主机里.执行以下命令安装URLOS: cur ...