Merhabalar,
Bu makalemizde elasticsearch cluster’ımızda tüm Elasticsearch Master Node Kaybetmek durumunda ayakta olan data node’larındaki datalarımıza nasıl ulaşabileceğimizi anlatacağım.
Bildiğiniz gibi elasticsearch’te bir çok role bulunuyor. İhtiyacımıza göre node sayısı ve role’ler ile oynayarak istediğimiz altyapıyı kuruyoruz.
Master node’lar, Elasticsearch kümesinin yönetiminden sorumlu olan node’lardır. Aşağıdaki bilgileri tutarlar:
Normal şartlarda master node’ları yedekli kurarız ve bir sorun anında en az 1 adet master node’un erişilebilir olması bizim için yeterli olacaktır. Ancak bazı durumlarda, yaşanan olumsuz case’ler sonucu tüm master’ları kaybetmek gibi bir senaryo ile karşılaşabiliriz.
Tüm master node’ları kaybettiğimiz anda, elasticsearch data node’ları aşağıdaki gibi “master not discovered yet” log’ları basmaya başlayacak.
[2023-03-02T03:37:32,365][WARN ][o.e.c.c.ClusterFormationFailureHelper] [elasticnode2] master not discovered yet: have discovered [{elasticnode2}{0I4cPAmNRe6dJ0xXeRtWMw}{huYvO2bIRasdsadsadsad_Q}{192.168.10.52}{192.168.10.52:93
00}{cdfhilrstw}]; discovery will continue using [192.168.10.49:9300, 192.168.10.50:9300, 192.168.10.51:9300, 192.168.10.53:9300, 192.168.10.54:9300, 192.168.10.55:9300, 192.168.10.56:9300] from hosts providers and [] from last-known
cluster state; node term 42, last-accepted version 59797 in term 42
[2023-03-02T03:37:42,367][WARN ][o.e.c.c.ClusterFormationFailureHelper] [elasticnode2] master not discovered yet: have discovered [{elasticnode2}{0I4cPAmNRe6dJ0xXeRtWMw}{huYvO2bIRasdsadsadsad_Q}{192.168.10.52}{192.168.10.52:93
00}{cdfhilrstw}]; discovery will continue using [192.168.10.49:9300, 192.168.10.50:9300, 192.168.10.51:9300, 192.168.10.53:9300, 192.168.10.54:9300, 192.168.10.55:9300, 192.168.10.56:9300] from hosts providers and [] from last-known
cluster state; node term 42, last-accepted version 59797 in term 42
Bu tarz bir durumda master node’lar olmadan cluster’ı ayağa kaldırıp indexlerimize ulaşamayız. İlk denememiz gereken şey her zaman master node’ları tekrar sağlıklı olarak çalışabilir hale getirmek. Bunu yapamadığımız bir senaryoda veri kaybını ve tutarsızlığını göze alıyorsanız aşağıdaki adımları izleyerek index’lerinize ulaşmanız mümkün.
Dikkat! Veri kaybı yaşayabilirsiniz!
Öncelikle kendimize yeni bir master kuracağız. Burada kuracağımız master tamamen sıfır, daha önceki cluster’dan tamamen bağımsız olabilir veya mevcut data node’larından bir tanesini master role’unu de ekleyerek ayağa kaldırabiliriz.
Bizim envanterimizde bir adet coordinator node mevcuttu bu nedenle biz de bu node’a master role’u ekleyerek ayağa kaldırdık. elasticsearch.yml’a eklediğimiz parametreler aşağıdaki gibi;
node.master: true
node.data: false
Master ayağa kalktıktan sonra data node’larındaki seed.hosts parametresinde yeni master’ı gösterdik. seed.hosts parametresini güncelleyip data node’larını restart ettiğimizde tabi ki cluster otomatik açılmadı. Bunun nedeni data node’ları ile master node’larının cluster UUID’lerinin eşleşmiyor olması. Aşağıdaki gibi hatalar aldık normal olarak.
Caused by: org.elasticsearch.transport.RemoteTransportException: [elasticnode2][192.168.10.52:9300][internal:cluster/coordination/join/validate]
Caused by: org.elasticsearch.cluster.coordination.CoordinationStateRejectedException: This node previously joined a cluster with UUID [ioyasdasd123kQXtA] and is now trying to join a different cluster with UUID [2ttasdasd123ig5lrFw]. This is forbidden and usually indicates an incorrect discovery or cluster bootstrapping configuration. Note that the cluster UUID persists across restarts and can only be changed by deleting the contents of the node's data pa
th [/data] which will also remove any data held by this node.
Bu sorunu aşmak için data node’larında bir kaç işlem yapmamız gerekli. Öncelikle data node’larındaki elasticsearch servislerini kapatıyoruz. Ardından data node’larını detach ediyoruz.
/usr/share/elasticsearch/bin/elasticsearch-node detach-cluster
Detach işleminden sonra data node’ları açtığımızda otomatik olarak yeni cluster UUID’sine kendisini register edecektir. Bu adımda artık cluster açık olduğu için elasticsearch’e sorgu atılabilir. Ancak hala daha indekslerimize erişilemez durumda. Bunun nedeni index’lerimizin dangling mode’da kalmış olması. Veri kaybı ihtimaline karşı bu index’leri tekrar kullanılabilir yapmak için manuel müdahele etmemiz gerekli.
Öncelikle aşağıdaki komut ile dangling mode’daki index’leri listeliyoruz.
curl -X GET "http://192.168.10.52:9200/_dangling"
Bu bize aşağıdaki gibi bir liste veriyor.
{
"_nodes":{
"total":3,
"successful":3,
"failed":0
},
"cluster_name":"prod-cluster",
"dangling_indices":[
{
"index_name":"my_data_index",
"index_uuid":"2J5lasdasdikhc7g",
"creation_date_millis":1675252933198,
"node_ids":[
"0I4cPAmNasdsadXeRtWMw",
"OxSVBKRpasdasdQ8JMfg"
]
},
{
"index_name":"my_log_index",
"index_uuid":"Lj6asdsadF-Q",
"creation_date_millis":1677667547101,
"node_ids":[
"0I4cPasdasdxXeRtWMw",
"OxSVBasdasd8Q8JMfg"
]
}
Tüm index’lerin uuid’lerini aldıktan sonra aşağıdaki komut ile index’lerimizi tekrar import ederek kullanılabilir hale getiriyoruz.
curl -X POST "http://172.0.101.49:9200/_dangling/2J5lasdasdikhc7g?accept_data_loss=true"
curl -X POST "http://172.0.101.49:9200/_dangling/Lj6asdsadF-Q?accept_data_loss=true"
Umarım faydalı olmuştur. Bizimle iletişime geçmek isterseniz info@forenda.com.tr adresine yazabilirsiniz.
Kaynaklar;
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/modules-gateway.html#dangling-indices
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/dangling-index-import.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/node-tool.html#node-tool-detach-cluster