使用nodejs进行Cassandra状态检查

时间:2018-03-14 11:23:28

标签: node.js apache cassandra cassandra-3.0

我在三个环境中使用nodejs,而Cassandra在所有三个节点中都运行。

我完全理解使用nodetool status我将能够获得每个节点的状态。但问题是如果我的当前节点已关闭,那么我将无法在当前节点中执行nodetool状态,那么有没有办法使用nodejs Cassandra驱动程序获取状态?

感谢任何帮助。

已编辑:

根据dilsingi的建议,我使用了client.hosts,但问题是,在下面的群集中,172.30.56.61仍然显示为可用。 如何获取每个节点的状态?

const cassandra = require('cassandra-driver');
const client = new cassandra.Client({ contactPoints: ['172.30.56.60','172.30.56.61','172.30.56.62'], keyspace: 'test', policies : { loadBalancing : new cassandra.policies.loadBalancing.RoundRobinPolicy }});

    async function read() {
        client.connect().then(function () {
          console.log('Connected to cluster with %d host(s): %j', client.hosts.length, client.hosts.keys());
          client.hosts.forEach(function (host) {
       console.log(host.address, host.datacenter, host.rack);
    });

        });
    }

    read();

nodeTool状态输出:

Datacenter: newyork
===================
Status=Up/Down

    |/ State=Normal/Leaving/Joining/Moving
    --  Address       Load       Tokens       Owns (effective)  Host ID                               Rack
    UN  172.30.56.62  1.13 MiB   256          34.8%             e93827b7-ba43-4fba-8a51-4876832b5b22  rack1
    DN  172.30.56.60  1.61 MiB   256          33.4%             e385af22-803e-4313-bee2-16219f73c213  rack1
    UN  172.30.56.61  779.4 KiB  256          31.8%             be7fc52e-c45d-4380-85a3-4cbf6d007a5d  rack1


Node Js Code :

    const cassandra = require('cassandra-driver');
    const client = new cassandra.Client({ contactPoints: ['172.30.56.60','172.30.56.61','172.30.56.62'], keyspace: 'qcs', policies : { loadBalancing : new cassandra.policies.loadBalancing.RoundRobinPolicy }});

    async function read() {
        client.connect().then(function () {
          console.log('Connected to cluster with %d host(s): %j', client.hosts.length, client.hosts.keys());
          client.hosts.forEach(function (host) {
               console.log(host.address, host.datacenter, host.rack, host.isUp(), host.canBeConsideredAsUp());
          });

        });
    }

    read();

NodeJs输出:

    Connected to cluster with 3 host(s): ["172.30.56.60:9042","172.30.56.61:9042","172.30.56.62:9042"]
    172.30.56.60:9042 newyork rack1 true true
    172.30.56.61:9042 newyork rack1 true true
    172.30.56.62:9042 newyork rack1 true true

谢谢,
哈利

1 个答案:

答案 0 :(得分:3)

一般的驱动程序(nodejs)都知道整个Cassandra集群拓扑。在初始接触连接字符串中的一个或多个节点ip地址时,驱动程序可以自动识别构成cassandra环的所有节点ips。它足够智能,可以知道节点何时关闭或新节点何时加入群集。它甚至可以继续使用全新的节点(ips)。

因此,不需要对节点状态进行编码,因为驱动程序会自动为您处理。建议在连接字符串中提供1个以上的ip,以便在进行初始连接时提供冗余。

这是nodejs驱动程序documentation,此section描述了"自动节点发现"功能和"群集&架构元数据"。