服务器主机配置:
CPU:单核2GHz
RAM:2GB
DISK:30GB HDD

Citus部署配置:
Coordinator X 1 (192.168.7.129)
Worker X 2 (192.168.7.130,192.168.7.131)

1.创建数据库,创建citus插件,部署citus扩展

在所有节点上:

psql -h 192.168.7.129/130/131 -p 5432 -U postgres
create extension citus;

在协调节点上:

psql -h 192.168.7.129 -p 5432 -U postgres
SELECT * from master_add_node('192.168.7.130', 5432);
SELECT * from master_add_node('192.168.7.131', 5432);
SELECT * FROM master_get_active_worker_nodes();

2.创建表,插入初始数据,查看分片分布

在协调节点上:

psql -h 192.168.7.129 -p 5432 -U postgres
#创建表
create table test_table(id int, name varchar(16));
#表分片
SELECT master_create_distributed_table('test_table', 'id', 'hash');
#设定分片个数(2)及每个分片副本数(2)
SELECT master_create_worker_shards('test_table', 2, 2);
#插入初始数据
INSERT INTO test_table VALUES(1,'a');
INSERT INTO test_table VALUES(2,'b');
INSERT INTO test_table VALUES(3,'c');
INSERT INTO test_table VALUES(4,'d');
--查看分片分布情况
SELECT * from pg_dist_shard_placement;shardid | shardstate | shardlength |   nodename    | nodeport | placementid
---------+------------+-------------+---------------+----------+-------------102010 |          1 |           0 | 192.168.7.130 |     5432 |           3102011 |          1 |           0 | 192.168.7.130 |     5432 |           6102010 |          1 |           0 | 192.168.7.131 |     5432 |           4102011 |          1 |           0 | 192.168.7.131 |     5432 |           5
(4 rows)

一共有4个分片,分布在130和131两个工作节点上。
在工作节点上:

psql -h 192.168.7.130/131 -p 5432 -U postgres
\d
               List of relations
 Schema |       Name        | Type  |  Owner
--------+-------------------+-------+----------
 public | test_table_102010 | table | postgres
 public | test_table_102011 | table | postgres
(2 rows)pgbench=# select * from test_table_102010;
 id | name
----+------
  1 | a
  3 | c
  4 | d
(3 rows)pgbench=# select * from test_table_102011;
 id | name
----+------
  2 | b
(1 row)

这里通过查询可知,id=4的记录,经过哈希后,存储在编号为102010的分片上。(下一步实验会用到)

3.断开工作节点131后(拔网线),进行写操作,然后考察分片分布情况

在协调节点上查看数据及分片分布

select * from test_table;
WARNING:  connection error: 192.168.7.131:5432
DETAIL:  could not connect to server: No route to hostIs the server running on host "192.168.7.131" and acceptingTCP/IP connections on port 5432?id | name
----+------1 | a3 | c4 | d2 | b
(4 rows)
SELECT * from pg_dist_shard_placement;shardid | shardstate | shardlength |   nodename    | nodeport | placementid
---------+------------+-------------+---------------+----------+-------------102010 |          1 |           0 | 192.168.7.130 |     5432 |           3102011 |          1 |           0 | 192.168.7.130 |     5432 |           6102010 |          1 |           0 | 192.168.7.131 |     5432 |           4102011 |          1 |           0 | 192.168.7.131 |     5432 |           5
(4 rows)

在对表test_table进行数据查询的时候,出现了节点不可达的警告,但是因为没有写操作,所以所有分片分布状态仍然是正常的(同步的)。

插入id=4的记录

INSERT INTO test_table VALUES(4,'99');
WARNING:  connection error: 192.168.7.131:5432
DETAIL:  could not send data to server: No route to host
could not send SSL negotiation packet: No route to host
INSERT 0 1

根据前面的分析,这条记录应该被哈希到编号为102010的分片上。但此时节点131已经离线,所以只能写到节点位于130的102010号分片。此时再进行分片分布查询,发现节点131上的102010号分片状态从1变成了3,据此推断1表示“同步”,3表示“失步”。

SELECT * from pg_dist_shard_placement;shardid | shardstate | shardlength |   nodename    | nodeport | placementid
---------+------------+-------------+---------------+----------+-------------102010 |          1 |           0 | 192.168.7.130 |     5432 |           3102011 |          1 |           0 | 192.168.7.130 |     5432 |           6102010 |          3 |           0 | 192.168.7.131 |     5432 |           4102011 |          1 |           0 | 192.168.7.131 |     5432 |           5
(4 rows)

4.故障修复

此时接上节点131的网线,再次查询分片分布,发现citus不能自动修复故障节点上的数据。

SELECT * from pg_dist_shard_placement;shardid | shardstate | shardlength |   nodename    | nodeport | placementid
---------+------------+-------------+---------------+----------+-------------102010 |          1 |           0 | 192.168.7.130 |     5432 |           3102011 |          1 |           0 | 192.168.7.130 |     5432 |           6102010 |          3 |           0 | 192.168.7.131 |     5432 |           4102011 |          1 |           0 | 192.168.7.131 |     5432 |           5
(4 rows)

于是,使用master_copy_shard_placement命令将好节点上的分片,复制到坏节点上。

SELECT master_copy_shard_placement(102010, '192.168.7.130', 5432, '192.168.7.131', 5432);master_copy_shard_placement
-----------------------------(1 row)

此时再进行分片分布查询,发现节点131上的分片102010状态已经恢复。

SELECT * from pg_dist_shard_placement;shardid | shardstate | shardlength |   nodename    | nodeport | placementid
---------+------------+-------------+---------------+----------+-------------102010 |          1 |           0 | 192.168.7.130 |     5432 |           3102011 |          1 |           0 | 192.168.7.130 |     5432 |           6102010 |          1 |           0 | 192.168.7.131 |     5432 |           4102011 |          1 |           0 | 192.168.7.131 |     5432 |           5
(4 rows)

写在最后

分片的同步和失步是以分片(shard)而不是节点(node)进行管理的。在本例中,插回131的网线后,在不执行master_copy_shard_placement的情况下,插入id=1、3、4的记录(对应分片102010),只能写入到节点130中,因为节点131上的102010分片状态仍被标记为失步;但是如果插入id=2的记录(对应分片为102011),是能够正常写入到两个节点中去的。

Citus数据分片分布研究(三 节点故障的手动修复)相关推荐

  1. Citus数据分片分布研究(二 副本与故障)

    (本文中凡是未显式指出的SQL,均在协调节点上执行) 工作节点 mydb1=# SELECT * FROM master_get_active_worker_nodes();node_name | n ...

  2. Citus数据分片分布研究(一 在工作节点直接操作表)

    (本文中凡是未显式指出的SQL,均在协调节点上执行) 工作节点 mydb1=# SELECT * FROM master_get_active_worker_nodes();node_name | n ...

  3. 分布式存储系统设计(2)—— 数据分片

    在分布式存储系统中,数据需要分散存储在多台设备上,数据分片(Sharding)就是用来确定数据在多台存储设备上分布的技术.数据分片要达到三个目的: 分布均匀,即每台设备上的数据量要尽可能相近: 负载均 ...

  4. [原创]分布式系统之缓存的微观应用经验谈(三)【数据分片和集群篇】

    分布式系统之缓存的微观应用经验谈(三)[数据分片和集群篇] 前言 近几个月一直在忙些琐事,几乎年后都没怎么闲过.忙忙碌碌中就进入了2018年的秋天了,不得不感叹时间总是如白驹过隙,也不知道收获了什么和 ...

  5. Azure数据仓库表中的数据经常使用的三种分布策略(hash、round_robin 或 replicated)简介

    目录 (一)前言 (二)基础概念 1. Azure Synapse Analytics概念 2. Synapse SQL 体系结构组件 3. Azure 存储 4. 控制节点 5. 计算节点 6. 数 ...

  6. 计算机网络实验IP数据报分片,实验报告三IP数据分片.doc

    实验报告三IP数据分片 计算机网络实验报告 实验名称:IP数据分片 组号:一组 角色号:B 姓 名: 班 级: 学 号: 日 期:2014.4.21 一,实验目的 学习IP数据报分片原理 二,实验步骤 ...

  7. R(13):第三章:3.2数据的分布

    <统计建模与R软件>薛毅 第3章 数据描述性分析 3.2 数据的分布 总结:绘制图形语法,直方图hist(),密度估计函数density(),绘图需配合plot()绘图,例如:plot(d ...

  8. 大数据图数据库之数据分片

    节选自<大数据日知录:架构与算法>十四章,书籍目录在此 对于海量待挖掘数据,在分布式计算环境下,首先面临的问题就是如何将数据比较均匀地分配到不同的服务器上.对于非图数据来说,这个问题解决起 ...

  9. 一文讲透,分布式系统的数据分片难题

    一般来说,数据分片是将整体数据分摊在多个存储设备上,这样每个存储设备的数据量相对就会小很多,以此满足系统的性能需求.本文主要讨论数据分片的三个问题:如何做数据分片.数据分片的特征值以及数据分片元数据的 ...

最新文章

  1. CNN 模型的参数(parameters)数量和浮点运算数量(FLOPs)是怎么计算的
  2. 【转】HTTP Response Header 的 Content-Disposition
  3. WampServer修改MySQL密码的问题
  4. 【opencv系列05】OpenCV4.X鼠标回调函数
  5. Qt QByteArray 转换 QString QT5.12.7
  6. 为啥用redis解决会话呢?
  7. php适用于什么服务器,php – 找不到laravel类(适用于localhost但不适用于DO服务器)...
  8. php this validate,php扩展ZF——Validate扩展
  9. beautifulsoup解析动态页面div未展开_实战|Python轻松实现动态网页爬虫(附详细源码)...
  10. BoltDB 一个简单的纯 Go key/value 存储 [译]
  11. node.js 学习
  12. 什么情况下使用 if()后面的else可以省略不写
  13. 用SetCapture捕获鼠标消息
  14. 总结软考(软件设计师中级)——计算机语言基础的知识
  15. php 7.4 编译安装
  16. 如何使用虚拟机运行“小HomeKit”智汀家庭云
  17. 【游戏开发实战】Unity Unlit ShaderGraph实现与PBR的自发光贴图类似的叠加效果
  18. java语言会在很短的时间内迅速流行_在短时间内流行起来又迅速平息的时尚状态是()A.阵热B.时髦C.时狂D.狂热...
  19. C++画图之GOC编程 第6课 通天云梯
  20. java:java8新特性(Lambda 表达式、方法引用、构造器引用、数组引用、Stream API)

热门文章

  1. ​提高免疫力,没你想得这么难!
  2. QT Creator 代码自动补全---快捷键设定
  3. pr里去频闪的插件叫什么_Ae/Pr 视频去闪烁插件 Digital Anarchy Flicker Free v1.1.6 CE
  4. 京东js加密 nloginpwd 破解
  5. 【AngularJs学习笔记三】Grunt任务管理器
  6. 修改文本文件默认编辑器
  7. 图文详解AO打印(标准模式)
  8. 大学生简单个人静态HTML网页设计作品 HTML+CSS制作我的家乡杭州 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载 HTML5期末大作业
  9. Linux wine 字体发虚,解决QQ(wine)因字体卡死宋体发虚太难看的一种方法
  10. 趣味IT知识:你知道千年虫吗