說明:ES部署了3個節點,而一般情況只要這三個節點的IP其中一個都可以連接,Web端口使用的是9500,Client連接使用的是9600,調用程序使用了ES原生Client進行連接。
解決方法:
1、出現這樣的問題,一般檢查集群名稱和IP是否填寫正確。
2、注意,比如提供的IP能Telnet成功,但不一定代表能正常使用Client進行連接。
3、我猜測Client的原理:如果在構造Client對象時,傳入了一個IP之后且連接成功后,ES會返回整個集群的IP給Client,此時的Client會逐個進行連接。
4、如果定位到IP問題之后,建議直接使用內網IP,也就是ES使用的IP進行連接來排查是不是IP問題。
問題解決過程分析:
1、由於生成環境的部署結構復雜且要考慮安全性,所以一般會做很多措施,而提供連接的IP並非是真實ES的內網IP,而其余集群的內網IP不一定能開放訪問。
2、使用netstat -tnp | grep SYN分析出有多少IP在等待連接的,從而分析出到底是不是一直在連接集群中的內網IP。
3、分析出Client在通過提供的不是ES的內網IP連接之后還會連接ES真實的內網IP時,就應該是第一次Client連接ES成功后返回的IP列表,ES通知Client通過這些IP連接ES;解決方法可以這樣:在Linux下使用iptables進行IP轉發,比如提供的IP為192.168.1.2:9600,而ES集群的IP為(192.168.3.2/192.168.3.3/192.168.3.4),那么執行將192.168.3.2~的全部IP轉發到192.168.1.2中。iptables轉發參考:http://www.cnblogs.com/EasonJim/p/7589394.html
后話:
沒錯,我已經入坑了,現在持續填坑中。