获得属于具有多个DC的Cassandra集群的每个DC的节点数的最佳方法是什么?

时间:2018-05-09 03:49:29

标签: shell awk cassandra

这是this

的扩展版本

对于单个DC,我可以使用上面链接中描述的命令:

nodetool status | awk '/^(U|D)(N|L|J|M)/' | wc -l

我不知道如何获得多个直流的计数数组。 节点工具输出如下:

Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens       Owns    Host ID                               Rack
DN  xx.xx.xx.xx    446.13 KB    256          ?     968d5d1e-a113-40ce-9521-e392a927ea5e  rack1
DL  xx.xx.xx.xx    446.13 KB    256          ?     fc5c2dbe-8834-4040-9e77-c3d8199b6767  rack1
Datacenter: DC2
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens       Owns    Host ID                               Rack
UN  xx.xx.xx.xx    446.13 KB  256          ?       6d28d540-2b44-4522-8612-b5f70a3d7d52  rack1

上述情况下的预期输出:

2 1

注意:我不想使用peer表,因为某些无效的条目可能会给出错误的结果,但nodetool状态更可靠。

1 个答案:

答案 0 :(得分:4)

Awk 方法:

nodetool status \
| awk '/Datacenter/{ if (cnt) printf cnt OFS; cnt=0 }/^[A-Z]{2} /{ cnt++ }END{ print cnt }'

输出:

2 1
  • /^[A-Z]{2} /{ cnt++ } - 遇到以2个大写节点名称[A-Z]{2}开头的行 - 使用cnt++计算/累计节点数
  • /Datacenter/{ if (cnt) printf cnt OFS; cnt=0 } - 遇到Datacenter部分检查是否有先前的统计信息(节点名称计数),如果是,请将其打印printf cnt OFS并重置cnt变量以分开计数
  • END{ print cnt } - 打印上次统计信息