上午午好好的,突然拋了如下異常:
Exception in thread "main" redis.clients.jedis.exceptions.JedisNoReachableClusterNodeException: No reachable node in cluster
at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnection(JedisSlotBasedConnectionHandler.java:57)
at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnectionFromSlot(JedisSlotBasedConnectionHandler.java:74)
at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:116)
at redis.clients.jedis.JedisClusterCommand.run(JedisClusterCommand.java:31)
at redis.clients.jedis.JedisCluster.set(JedisCluster.java:103)
at com.java.example.redis.JedisClusterDemo.setTest(JedisClusterDemo.java:33)
at com.java.example.redis.JedisClusterDemo.main(JedisClusterDemo.java:28)
先說真正原因:
經過查找代碼終於發現,最終是調用JedisCluster.close()方法造成的。
原因:我們使用的是redis3.0的集群,用jedis的JedisCluster.close()方法造成的集群連接關閉的情況。 jedisCluster內部使用了池化技術,每次使用完畢都會自動釋放Jedis因此不需要關閉。如果調用close方法后再調用jedisCluster的api進行操作時就會出現如上錯誤。
----------------------------------------------------------
碰巧當時一個集群節點掛了:
下面是在網上找到的其他原因:
這說明redis集群已經宕機了。下面分析一下造成的原因。該引用來自(http://hot66hot.iteye.com/blog/2050676)
redis-cluster選舉:容錯
(1)領着選舉過程是集群中所有master參與,如果半數以上master節點與master節點通信超過(cluster-node-timeout),認為當前master節點掛掉.
(2):什么時候整個集群不可用(cluster_state:fail)?
a:如果集群任意master掛掉,且當前master沒有slave.集群進入fail狀態,也可以理解成集群的slot映射[0-16383]不完成 時進入fail狀態. ps : redis-3.0.0.rc1加入cluster-require-full-coverage參數,默認關閉,打開集群兼容部分失敗.
b:如果集群超過半數以上master掛掉,無論是否有slave集群進入fail狀態.
ps:當集群不可用時,所有對集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤