贝尔链

解析物联网的五种数据模型 译文

交易教程 2022-11-23 10:59140www.foodpouchpackaging.com未知

译者 | 李睿

审校 | 孙淑娟

Apache Cassandra是大规模管理物联网和时间序列数据的一个靠谱选择。在Cassandra中存储、查看和剖析物联网设施生成的时间序列的最潮用例已经得到非常不错的理解和记录。在一般情况下,时间序列是依据其源物联网设施存储和查看的。但,还有另一类物联网应用程序需要迅速访问由一组物联网设施基于已知状况生成的最新数据。此类应用程序需要回答的问题是:什么物联网设施或传感器目前正在报告特定状况?本文将重点关注这个问题,并提供五种可能的数据建模解决方法,以便在Cassandra中有效地回答这个问题。

1、介绍

物联网正在生成很多需要存储、查看和剖析的时间序列数据。Apache Cassandra是这项任务的好选择:不只由于它的速度、靠谱性和可扩展性,还由于它的内部数据模型内置了对时间排序数据的支持。

在Cassandra中,时间序列一般由源(比如物联网设施或传感器)或主题(比如参数或指标)存储和检索。有很多非常不错的资源很详细地介绍了这个主题,包含这个会议演示视频,与用于传感器数据和时间序列的即用型Cassandra数据模型。

本文研究了一些有关的物联网用例,它们需要管理来自很多物联网设施的最新数据的网站快照。除此之外,需要依据物联网设施报告的特定状况来查看或过滤如此的网站快照。换句话说,应该可以在Cassandra中迅速回答这个问题:什么物联网设施目前正在报告特定状况?对于很多现实日常的用例,这个问题听起来更像是:

  • 智能家居中什么灯是打开的?
  • 停车点中目前有什么停车位被占用(空置)?
  • 目前在特定地方附近有什么汽车可用(不可用)?
  • 目前在某个地区触发(激活或禁用)什么安全警报?
  • 建筑物中目前打开(关闭、锁定、解锁)什么门?
  • 什么失火探测传感器目前报告传感器互联网中的异常(正常待机、错误)状况?

本文章愈加正式地概念了这类问题,并通过示例CQL达成提出了五个好用的解决方法。

2、问题的概念

给定一组物联网设施或传感器,它们生成包括时间戳、数据点和状况的按时间顺序排列的事件序列,查找所有物联网设施报告的具备已知状况的最新事件。这个问题的三个重要组成部分如下所示:

  • 输入由物联网设施生成的时间序列组成。时间序列一般存储在一个或多个Cassandra表中。
  • 中间视图只是物联网设施报告的最新事件的网站快照。可以单独显式存储最新事件,也可以参考输入动态计算它们。
  • 最后结果是所有具备已知状况的最新事件。具备相同状况的最新事件应该存储在一块或易于计算。

3、基于状况管理最新的物联网事件

以下确定了基于状况管理最新物联网事件的几个挑战:

  • 最新事件的网站快照不断进步。可能需要额外的工作来增量捕获任何更改。
  • 事件发生的频率一般是不可预测的。仅基于事件的时间戳组件可能很难对事件进行分区和组织。
  • 一个状况一般只能使用几个唯一值。基于低基数列对数据进行分区和索引或许会致使大分区。

用以下运行示例作为起点。表events_by_device是输入。这张具备多行分区的表旨在存储时间序列,如此每一个分区对应一个设施,分区中的行表示具备时间戳、状况和值的事件。每一个分区中的事件一直按其时间戳降序排序。该表事实上为每一个分区存储一个时间序列。将五个事件插入表中并检索一个设施的时间序列。除此之外,在第二个查看中,演示可以动态计算所有设施的所有最新事件。应该注意的是不应该依靠这个查看来解决问题:它或许会变得代价高昂,由于它访问表中的每一个分区。

模式:

CQL

1 -- All events by device
2
3 CREATE TABLE events_by_device , timestamp)
14
15 ) WITH CLUSTERING ORDER BY ;

数据:

CQL

1 -- Event 1-1

2

3 INSERT INTO events_by_device

4

5

6

7 VALUES ;

10

11 -- Event 1-2

12

13 INSERT INTO events_by_device

14

15

16

17 VALUES ;

20

21 -- Event 1-3

22

23INSERT INTO events_by_device

24

25

26

27VALUES ;

30

31 -- Event 2-1

32

33 INSERT INTO events_by_device

34

35

36

37VALUES ;

40

41 -- Event 3-1

42

43 INSERT INTO events_by_device

44

45

46

47 VALUES ;

查看:

CQL

1-- Find all events for a device

2

3 SELECT device_id, timestamp, state, value

4

5 FROM events_by_device

6

7 WHEREdevice_id = 11111111-aaaa-bbbb-cccc-12345678abcd;

8

9

10

device_id | timestamp| state | value

11

12--------------------------------------+---------------------------------+-------+-----------

13

1411111111-aaaa-bbbb-cccc-12345678abcd | 2021-01-01 03:33:33.000000+0000 |on | event 1-3

15

1611111111-aaaa-bbbb-cccc-12345678abcd | 2021-01-01 02:22:22.000000+0000 | off | event 1-2

17

1811111111-aaaa-bbbb-cccc-12345678abcd | 2021-01-01 01:11:11.000000+0000 |on | event 1-1

19

20

21-- Find the latest events for all devices

22

23 SELECT device_id, timestamp, state, value

24

25 FROM events_by_device

26

27 PER PARTITION LIMIT 1;

28

29

30device_id | timestamp | state | value

31

32--------------------------------------+---------------------------------+-------+-----------

33

34 33333333-aaaa-bbbb-cccc-12345678abcd | 2021-03-03 01:11:11.000000+0000 | off | event 3-1

35

36 22222222-aaaa-bbbb-cccc-12345678abcd | 2021-02-02 01:11:11.000000+0000 | off | event 2-1

37

3811111111-aaaa-bbbb-cccc-12345678abcd | 2021-01-01 03:33:33.000000+0000 |on | event 1-3

查看:

CQL

1-- Find all events for a device

2

3 SELECT device_id, timestamp, state, value

4

5 FROM events_by_device

6

7 WHEREdevice_id = 11111111-aaaa-bbbb-cccc-12345678abcd;

8

9

10

device_id | timestamp | state | value

11

12--------------------------------------+---------------------------------+-------+-----------

13

1411111111-aaaa-bbbb-cccc-12345678abcd | 2021-01-01 03:33:33.000000+0000 |on | event 1-3

15

1611111111-aaaa-bbbb-cccc-12345678abcd | 2021-01-01 02:22:22.000000+0000 | off | event 1-2

17

1811111111-aaaa-bbbb-cccc-12345678abcd | 2021-01-01 01:11:11.000000+0000 |on | event 1-1

19

20

21-- Find the latest events for all devices

22

23 SELECT device_id, timestamp, state, value

24

25 FROM events_by_device

26

27 PER PARTITION LIMIT 1;

28

29

30device_id | timestamp | state | value

31

32--------------------------------------+---------------------------------+-------+-----------

33

34 33333333-aaaa-bbbb-cccc-12345678abcd | 2021-03-03 01:11:11.000000+0000 | off | event 3-1

35

36 22222222-aaaa-bbbb-cccc-12345678abcd | 2021-02-02 01:11:11.000000+0000 | off | event 2-1

37

3811111111-aaaa-bbbb-cccc-12345678abcd | 2021-01-01 03:33:33.000000+0000 |on | event 1-3

应该注意,可以假设每一个设施的事件数低于10万件。不然,可能不能不通过在其分区键概念中引入另一列来进一步拆分表events_by_device中的分区。因为这对于本文中解决的问题并无关紧要,所以尽可能维持容易。

鉴于问题概念和物联网事件的运行CQL示例,在此筹备描述具备不同特点的五种解决方法。

4、解决方法1、物化视图

第一个解决方法需要一个新表和一个物化视图。表latest_events_by_device是一个单行分区表,其中每一个分区对应一个设施,每一行对应最新的已知事件。此表的目的是仅获得物联网设施报告的最新事件的网站快照。该表也是物化视图latest_events_by_state的基表,可以用状况查看最新事件。

应该注意,一模一样的数据被插入到表events_by_device和latest_events_by_device中。对于后者,插入变为更新插入,将行更新为最新事件。

模式:

CQL

1 -- Latest known events by device

2

3 CREATE TABLE latest_events_by_device )

14

15 );

16

17

18 -- Latest events by state

19

20 CREATE MATERIALIZED VIEW latest_events_by_state AS

21

22 SELECT * FROM latest_events_by_device

23

24 WHERE state IS NOT NULL AND device_id IS NOT NULL

25

26 PRIMARY KEY , device_id);

数据:

CQL

1-- Event 1-1

2

3 INSERT INTO latest_events_by_device

4

5

6

7 VALUES ;

10

11 -- Event 1-2

12

13 INSERT INTO latest_events_by_device

14

15

16

17 VALUES ;

20

21 -- Event 1-3

22

23 INSERT INTO latest_events_by_device

24

25

26

27 VALUES ;

30

31 -- Event 2-1

32

33 INSERT INTO latest_events_by_device

34

35

36

37 VALUES ;

40

41 -- Event 3-1

42

43 INSERT INTO latest_events_by_device

44

45

46

47 VALUES ;

查看:

CQL

1 -- Find all the latest events with state 'on'

2

3 SELECT state, device_id, timestamp, value

4

5 FROM latest_events_by_state

6

7 WHEREstate = 'on';

8

9

10 state | device_id | timestamp | value

11

12-------+--------------------------------------+---------------------------------+-----------

13

14 on | 11111111-aaaa-bbbb-cccc-12345678abcd | 2021-01-01 03:33:33.000000+0000 | event 1-3

15

16

17 -- Find all the latest events with state 'off'

18

19 SELECT state, device_id, timestamp, value

20

21 FROM latest_events_by_state

22

23 WHEREstate = 'off';

24

25

26 state | device_id| timestamp | value

27

28-------+--------------------------------------+---------------------------------+-----------

29

30 off | 22222222-aaaa-bbbb-cccc-12345678abcd | 2021-02-02 01:11:11.000000+0000 | event 2-1

31

32 off | 33333333-aaaa-bbbb-cccc-12345678abcd | 2021-03-03 01:11:11.000000+0000 | event 3-1

物化视图形解析决策略具备以下特征:

  • 适用性:基于状况的查看返回100K行/100MB或更少的数据。
  • 优点:视图自动维护和出色的性能。
  • 缺点:物化视图有一些限制;数据分布或许会出现偏差。

为了支持多租户,可以把表的主键改成PRIMARY KEY)或者PRIMARY KEY,device_id),物化视图的主键改成PRIMARY KEY,device_id)。多租户也会能够帮助改变数据分布。

只须知道并想抵消物化视图的限制,这一数据模型就能成为很多应用程序的容易、有效和高效的选择。这种数据模型的另一个不太明显的优势是从Apache Pulsar或Apache Kafka等事件流平台提供数据是多么容易。所有事件都可以转到基表,而其余的由物化视图处置。

5、解决方法2、二级索引

第二种解决方法需要一个新表和一个二级索引。该表与物化视图形解析决策略中的表相同。表latest_events_by_device是一个单行分区表,其中每一个分区对应一个设施,每一行对应最新的已知事件。此表的目的是仅获得物联网设施报告的最新事件的网站快照。为该表创建二级索引latest_events_by_state_2i,用于依据状况查看最新事件。

同样,一模一样的数据被插入到表events_by_device和latest_events_by_device中。对于后者,插入变为更新插入,将行更新为最新事件。

模式:

CQL

1-- Latest known events by device

2

3 CREATE TABLE latest_events_by_device )

14

15 );

16

17

18 -- Latest events by state

19

20 CREATE INDEX latest_events_by_state_2i

21

22 ON latest_events_by_device ;

数据:

CQL

1 -- Event 1-1

2

3 INSERT INTO latest_events_by_device

4

5

6

7 VALUES ;

10

11 -- Event 1-2

12

13 INSERT INTO latest_events_by_device

14

15

16

17 VALUES ;

20

21 -- Event 1-3

22

23 INSERT INTO latest_events_by_device

24

25

26

27 VALUES ;

30

31 -- Event 2-1

32

33INSERT INTO latest_events_by_device

34

35

36

37 VALUES ;

40

41 -- Event 3-1

42

43 INSERT INTO latest_events_by_device

44

45

46

47VALUES ;

查看:

CQL

1 -- Find all the latest events with state 'on'

2

3 SELECT state, device_id, timestamp, value

4

5 FROM latest_events_by_device

6

7 WHEREstate = 'on';

8

9

10state | device_id| timestamp | value

11

12-------+--------------------------------------+---------------------------------+-----------

13

14on | 11111111-aaaa-bbbb-cccc-12345678abcd | 2021-01-01 03:33:33.000000+0000 | event 1-3

15

16

17 -- Find all the latest events with state 'off'

18

19 SELECT state, device_id, timestamp, value

20

21 FROM latest_events_by_device

22

23 WHEREstate = 'off';

24

25

26state | device_id| timestamp | value

27

28-------+--------------------------------------+---------------------------------+-----------

29

30 off | 33333333-aaaa-bbbb-cccc-12345678abcd | 2021-03-03 01:11:11.000000+0000 | event 3-1

31

32 off | 22222222-aaaa-bbbb-cccc-12345678abcd | 2021-02-02 01:11:11.000000+0000 | event 2-1

二级索引策略具备以下特征:

  • 适用性:基于状况的查看返回100K行/100MBs或更多的数据;基于状况的查看极少实行。
  • 优点:在检索大型结果集时,可以更好地在集群中的节点之间分配查看工作负载。
  • 缺点:二级索引有一些限制;对于实时应用程序,性能或许会变得叫人不认可。

在某些状况下,这个数据模型可能是一个适当的选择。尤其是,当通过将表主键更改为PRIMARY KEY,device_id)来引入多租户时,能达到用二级索引进行实时事务查看的好机会。那是在基于分区键和查看谓词中指定的索引列从大型多行分区中检索行时。

6、解决方法3、状况分区表

第三种解决方法依靠于表latest_events_by_state用状况来组织和查看最新事件。每次向该表中插入具备某种状况的事件时,都需要删除同一物联网设施的具备其他状况的任何过时事件。在这个示例中,每一个事件都有一个插入和一个删除,由于只有两个唯一状况。假如有三种可能的状况,每一个新事件将致使一次插入和两次删除。

模式:

CQL

1 -- Latest events by state

2

3 CREATE TABLE latest_events_by_state , device_id)

14

15 );

数据:

CQL

1-- Event 1-1

2

3 INSERT INTO latest_events_by_state

4

5

6

7 VALUES ;

10

11 DELETE FROM latest_events_by_state

12

13 WHERE state = 'off' AND

14

15 device_id = 11111111-aaaa-bbbb-cccc-12345678abcd;

16

17 -- Event 1-2

18

19 INSERT INTO latest_events_by_state

20

21

22

23 VALUES ;

26

27 DELETE FROM latest_events_by_state

28

29 WHERE state = 'on' AND

30

31device_id = 11111111-aaaa-bbbb-cccc-12345678abcd;

32

33 -- Event 1-3

34

35 INSERT INTO latest_events_by_state

36

37

38

39 VALUES ;

42

43 DELETE FROM latest_events_by_state

44

45 WHERE state = 'off' AND

46

47 device_id = 11111111-aaaa-bbbb-cccc-12345678abcd;

48

49 -- Event 2-1

50

51 INSERT INTO latest_events_by_state

52

53

54

55 VALUES ;

58

59 DELETE FROM latest_events_by_state

60

61 WHERE state = 'on' AND

62

63device_id = 22222222-aaaa-bbbb-cccc-12345678abcd;

64

65 -- Event 3-1

66

67 INSERT INTO latest_events_by_state

68

69

70

71 VALUES ;

74

75 DELETE FROM latest_events_by_state

76

77 WHERE state = 'on' AND

78

79device_id = 33333333-aaaa-bbbb-cccc-12345678abcd;

查看:

CQL

1-- Find all the latest events with state 'on'

2

3 SELECT state, device_id, timestamp, value

4

5 FROM latest_events_by_state

6

7 WHEREstate = 'on';

8

9

10 state | device_id| timestamp | value

11

12-------+--------------------------------------+---------------------------------+-----------

13

14on | 11111111-aaaa-bbbb-cccc-12345678abcd | 2021-01-01 03:33:33.000000+0000 | event 1-3

15

16

17 -- Find all the latest events with state 'off'

18

19 SELECT state, device_id, timestamp, value

20

21 FROM latest_events_by_state

22

23 WHEREstate = 'off';

24

25

26 state | device_id| timestamp | value

27

28-------+--------------------------------------+---------------------------------+-----------

29

30 off | 22222222-aaaa-bbbb-cccc-12345678abcd | 2021-02-02 01:11:11.000000+0000 | event 2-1

31

32 off | 33333333-aaaa-bbbb-cccc-12345678abcd | 2021-03-03 01:11:11.000000+0000 | event 3-1

状况分区表解决方法具备以下特征:

  • 适用性:基于状况的查看返回100K行/100MB或更少的数据。
  • 优点:出色的性能。
  • 缺点:需要额外的删除来维护表;可能需要采取手段预防Cassandra的问题;数据分布或许会出现偏差。

在大部分状况下,这三个缺点都不应被视为紧急障碍。额外的删除等于额外的写入,Cassandra可以轻松扩展以处置更多写入。鉴于插入和删除一次又一次地应用于相同的行,Cassandra非常可能在MemTable中而不是在SSTable中得到解决,这可以显著地降低Cassandra的总数。比如,对于一个给定的物联网设施,即便是频繁的状况更新都命中同一个MemTable也只能致使一个Cassandra。仍然建议监控表指标以排除任何潜在问题。最后但同样要紧的是,数据分布取决于数据和应用程序特点。在本文的最后一个解决方法中,完全控制了数据分布。

可以通过将表主键更改为PRIMARYKEY,device_id)轻松支持多个租户。多租户也会能够帮助改变数据分布。总体而言,在性能方面,该解决方法应该可以与物化视图形解析决策略相媲美。

7、解决方法4、多个表

第四种解决方法的特征是每一个状况都有一个单独的表格。对表latest_on_events_by_device的每次插入都需要随着着从表latest_off_events_by_device中删除,反之亦然。这是为了确保最新事件一直取消同一设施的任何具备不同状况的过时事件。对表的基于状况的查看或许会变得本钱特别高昂,由于它们需要扫描表中的所有分区。

模式:

CQL

1 -- Latest 'on' events by device

2

3 CREATE TABLE latest_on_events_by_device )

12

13 );

14

15

16-- Latest 'off' events by device

17

18 CREATE TABLE latest_off_events_by_device )

27

28 );

数据:

CQL

1 - Event 1-1

2

3 INSERT INTO latest_on_events_by_device

4

5

6

7

VALUES ;

10

11 DELETE FROM latest_off_events_by_device

12

13 WHERE device_id = 11111111-aaaa-bbbb-cccc-12345678abcd;

14

15-- Event 1-2

16

17 INSERT INTO latest_off_events_by_device

18

19

20

21 VALUES ;

24

25 DELETE FROM latest_on_events_by_device

26

27 WHERE device_id = 11111111-aaaa-bbbb-cccc-12345678abcd;

28

29-- Event 1-3

30

31 INSERT INTO latest_on_events_by_device

32

33

34

35 VALUES ;

38

39 DELETE FROM latest_off_events_by_device

40

41 WHERE device_id = 11111111-aaaa-bbbb-cccc-12345678abcd;

42

43-- Event 2-1

44

45 INSERT INTO latest_off_events_by_device

46

47

48

49 VALUES ;

52

53 DELETE FROM latest_on_events_by_device

54

55 WHERE device_id = 22222222-aaaa-bbbb-cccc-12345678abcd;

56

57

-- Event 3-1

58

59 INSERT INTO latest_off_events_by_device

60

61

62

63 VALUES ;

66

67 DELETE FROM latest_on_events_by_device

68

69 WHERE device_id = 33333333-aaaa-bbbb-cccc-12345678abcd;

查看:

CQL

1 -- Find all the latest events with state 'on'

2

3 SELECT device_id, timestamp, value

4

5FROM latest_on_events_by_device;

6

7

8 device_id | timestamp | value

9

10--------------------------------------+---------------------------------+-----------

11

12 11111111-aaaa-bbbb-cccc-12345678abcd | 2021-01-01 03:33:33.000000+0000 | event 1-3

13

14

15-- Find all the latest events with state 'off'

16

17 SELECT device_id, timestamp, value

18

19 FROM latest_off_events_by_device;

20

21

22 device_id | timestamp | value

23

24--------------------------------------+---------------------------------+-----------

25

26 33333333-aaaa-bbbb-cccc-12345678abcd | 2021-03-03 01:11:11.000000+0000 | event 3-1

27

28 22222222-aaaa-bbbb-cccc-12345678abcd | 2021-02-02 01:11:11.000000+0000 | event 2-1

多表解决方法具备以下特征:

  • 适用性:基于状况的查看返回100K行/100MBs或更多的数据;基于状况的查看极少实行。
  • 优点:在检索大型结果集时,可以更好地在集群中的节点之间分配查看工作负载。
  • 缺点:实时应用程序的性能可能没办法让人认可;需要额外的删除来维护表;可能需要采取手段预防与Cassandra有关的问题。

该策略在查看性能上与二级索引策略相当。可以通过将表主键更改为PRIMARYKEY)或PRIMARYKEY,device_id)来支持多个租户。虽然在实践中不推荐这种解决方法,但这种数据模型真的有趣的是它怎么样为下面讨论的可定制分区做好筹备。

8、解决方法5、可自概念的分区

最后解决方法基于为每一个状况用单独的表的想法。但这一次,用人工桶对表进行分区。桶值比较容易用来自设施UUID标识符的用户概念函数散列来计算。在这一示例中,该函数从UUID文字中提取前三位,将生成的十六进制数转换为十进制数,并返回十进制数除以3的余数。因此,最多可以有三个桶或每一个表的分区,值为0、1或2。在这一示例中,所有些设施标识符都映射到存储桶0只不过巧合。因为版本4UUID是随机生成的,因此对于很多事件,数据应该多少均匀分布在三个存储桶中。

与之前的数据模型类似,每次对表latest_on_events_by_bucket的插入都需要随着着从表latest_off_events_by_bucket中删除,反之亦然。基于状况的查看的性能取决于分区,并且分区是可定制的。

模式:

CQL

1-- Custom hash function

2

3 CREATE FUNCTION hash

4

5 RETURNS NULL ON NULL INPUT

6

7 RETURNS INT

8

9 LANGUAGE Java AS

10

11 'return Integer.parseInt.substring,16) % 3;';

12

13

14-- Latest 'on' events by device

15

16 CREATE TABLE latest_on_events_by_bucket , device_id)

27

28 );

29

30

31-- Latest 'off' events by device

32

33 CREATE TABLE latest_off_events_by_bucket , device_id)

44

45 );

数据:

CQL

1-- Event 1-1

2

3 INSERT INTO latest_on_events_by_bucket

4

5

6

7 VALUES ,

8

9 11111111-aaaa-bbbb-cccc-12345678abcd,

10

11 '2021-01-01 01:11:11', 'event 1-1');

12

13 DELETE FROM latest_off_events_by_bucket

14

15 WHERE bucket = hash AND

16

17 device_id = 11111111-aaaa-bbbb-cccc-12345678abcd;

18

19-- Event 1-2

20

21 INSERT INTO latest_off_events_by_bucket

22

23

24

25 VALUES ,

26

2711111111-aaaa-bbbb-cccc-12345678abcd,

28

29 '2021-01-01 02:22:22', 'event 1-2');

30

31 DELETE FROM latest_on_events_by_bucket

32

33 WHERE bucket = hash AND

34

35 device_id = 11111111-aaaa-bbbb-cccc-12345678abcd;

36

37-- Event 1-3

38

39 INSERT INTO latest_on_events_by_bucket

40

41

42

43 VALUES ,

44

4511111111-aaaa-bbbb-cccc-12345678abcd,

46

47 '2021-01-01 03:33:33', 'event 1-3');

48

49 DELETE FROM latest_off_events_by_bucket

50

51 WHERE bucket = hash AND

52

53 device_id = 11111111-aaaa-bbbb-cccc-12345678abcd;

54

55 -- Event 2-1

56

57 INSERT INTO latest_off_events_by_bucket

58

59

60

61 VALUES ,

62

6322222222-aaaa-bbbb-cccc-12345678abcd,

64

65 '2021-02-02 01:11:11', 'event 2-1');

66

67 DELETE FROM latest_on_events_by_bucket

68

69 WHERE bucket = hash AND

70

71 device_id = 22222222-aaaa-bbbb-cccc-12345678abcd;

72

73-- Event 3-1

74

75 INSERT INTO latest_off_events_by_bucket

76

77

78

79 VALUES ,

80

8133333333-aaaa-bbbb-cccc-12345678abcd,

82

83 '2021-03-03 01:11:11', 'event 3-1');

84

85 DELETE FROM latest_on_events_by_bucket

86

87 WHERE bucket = hash AND

88

89 device_id = 33333333-aaaa-bbbb-cccc-12345678abcd;

查看:

CQL

1 -- Find all the latest events with state 'on'

2

3 SELECT bucket, device_id, timestamp, value

4

5 FROM latest_on_events_by_bucket

6

7 WHEREbucket IN ;

8

9

10 bucket | device_id | timestamp| value

11

12--------+--------------------------------------+---------------------------------+-----------

13

14 0 | 11111111-aaaa-bbbb-cccc-12345678abcd | 2021-01-01 03:33:33.000000+0000 | event 1-3

15

16

17-- Find all the latest events with state 'off'

18

19 SELECT bucket, device_id, timestamp, value

20

21 FROM latest_off_events_by_bucket

22

23 WHEREbucket IN ;

24

25

26 bucket | device_id | timestamp | value

27

28--------+--------------------------------------+---------------------------------+-----------

29

300 | 22222222-aaaa-bbbb-cccc-12345678abcd | 2021-02-02 01:11:11.000000+0000 | event 2-1

31

32 0 | 33333333-aaaa-bbbb-cccc-12345678abcd | 2021-03-03 01:11:11.000000+0000 | event 3-1

可定制的分区策略具备以下特征:

  • 适用性:定制时可满足不同需要。
  • 优点:灵活性;可以通过自概念分区来优化性能。
  • 缺点:需要提供好的分区功能;需要额外的删除来维护表;可能需要采取手段预防与Cassandra有关的问题。

选择一个好的分区函数是一个非常不错的问题。虽然这或许会增加一点复杂性,但该解决方法可以完全控制数据分区和查看性能。找到一个好的分区函数将取决于特定的数据和应用程序需要,并且可能需要一些经验和实验。比如,从1个分区检索100行一般比从10个分区检索100行快,但从1个分区检索100万行一般比从10个分区检索100万行慢。下面,额外的删除等于额外的写入,Cassandra可以轻松扩展以处置更多写入。

鉴于插入和删除一次又一次地应用于相同的行,Cassandra非常可能在MemTable中而不是在SS Table中得到解决,这可以显著地降低Cassandra的总数。比如,对于一个给定的物联网设施,即便是频繁的状况更新都命中同一个Mem Table也只能致使一个Cassandra。仍然建议监控表指标以排除任何潜在问题。最后但同样要紧的是,数据分布取决于数据和应用程序特点。在本文的最后一个解决方法中,完全控制了数据分布。

这种数据模型提供了很大的灵活性。通过将每一个表的主键更改为PRIMARY KEY,device_id)可以达成多租户。更要紧的是,可以更改分区函数以增加或降低分区的数目。检索较小结果集的查看应访问较少数目的分区以获得更好的性能。检索更大结果集的查看应访问更多分区以更好地分配工作负载。可以针对不一样的状况和租户用不一样的功能以达成最好性能。更好的分区应该会带来更好的性能。

9、结论

本文概念了基于状况管理最新物联网事件的问题,确定了它的挑战,并描述了怎么样在Apache Cassandra中用五种不一样的数据模型来解决它。除此之外还讲解了每一个数据模型的适用性、优势和弊端。最后的建议是关注物化视图、状况分区表和可自概念的分区数据模型。选择前两个是由于它们容易易用。当使用其他选项时,考虑可定制的分区以获得最大的灵活性。最后,开放探索新的可能解决方法,这类解决方法或许会将一些计算推向应用程序或依靠专门的搜索索引和其他技术。

上一篇:为何 Web3 需要独立的数据可用性层 下一篇:没有了

贝尔链-Baer Chain (BRC)最新价格,行情走势图,币值分析 Copyright © 2002-2021 贝尔链 (http://www.yebogroup.cn/) 网站地图 TAG标签 备案号