之前开发装了个时序数据库Cassandra的集群,一共3个节点,用于存储底层MQTT上报的数据,通过SpringBoot在网页展示,最近Cassandra开始反复出问题。
Java后台打印日志CQL报错 Not enough replicas avaiable for query at consistency LOCAL_ONE (1 required but only 0 alive)这个错误其实说的很清楚:没有足够的副本可用于一致性为1的查询(需要1个,但只有0个有效)。Cassandra运行query需要至少1个节点,而节点数量为0。这就很奇怪,明明之前部署了3个节点,怎么会1个都访问不到。
排查3个节点的具体情况,发现有1个节点服务器下线了,但是另外两个均正常运行。我们的情况暂时无法重启节点服务器,所以需要从其他方向入手。
搜索错误之后决定排查keyspace的replication_factor复制因子情况,通过正常节点所在的服务器,命令行进入数据库./cqlsh xxx.xxx.xxx.xxx,在数据库中查询keyspace具体情况desc keyspacename; 找到replication_factor,果然,这里对应数字为1。3个节点的集群算是白部署了,keyspace的replication_factor为1,读写都有可能会遇到查询那个坏了的节点,从而导致查询失败的情况。这里需要改写复制因子来对应集群节点,运行以下命令:
alter keyspace keyspacename with replication = {'class': 'SimpleStrategy', 'replication_factor': 3};
这里执行需要一点时间,等待执行完后再运行desc keyspacename; 确认replication_factor修改完毕。
再度检查Java程序,程序正常运行。
另外,Cassandra集群中的节点服务器下线,有可能导致各种报错,以下三种情况,怀疑全部是由于节点下线和复制因子设置为1导致,有待进一步确认:
1. 读写Cassandra数据可能会出现NoHostAvailable错误
2. 更新keyspace时,会因为节点下线产生版本不一致报错schema version mismatch detected; check the schema versions of your nodes in system.local and system.peers.
3. Java后台日志出现system.peers相关错误query 'SELECT * FROM system.peers' timed out after PT0.5S