Jak skonfigurować klaster ES?

81

Zakładając, że mam 5 maszyn, na których chcę uruchomić klaster elastycznego wyszukiwania, i wszystkie są podłączone do dysku współdzielonego. Umieściłem jedną kopię elastycznego wyszukiwania na tym dysku współdzielonym, aby wszyscy trzej mogli ją zobaczyć. Czy po prostu uruchomię wyszukiwanie elastyczne na tym dysku współdzielonym na wszystkich moich komputerach, a grupowanie automatycznie zadziała? A może musiałbym skonfigurować określone ustawienia, aby elastyczne wyszukiwanie zdało sobie sprawę, że działa na 5 komputerach? Jeśli tak, jakie są odpowiednie ustawienia? Czy powinienem martwić się konfiguracją pod kątem replik, czy jest to obsługiwane automatycznie?

Rolando
źródło
3
Nie zamierzasz używać udostępnionego folderu jako indeksu, prawda?
javanna

Odpowiedzi:

53

to bardzo łatwe.

Będziesz potrzebować każdej maszyny, aby mieć własną kopię ElasticSearch (po prostu skopiuj tę, którą masz teraz) - powodem jest to, że każda maszyna / węzeł zachowa swoje własne pliki, które są podzielone na fragmenty w klastrze.

Jedyną rzeczą, którą naprawdę musisz zrobić, jest edycja pliku konfiguracyjnego, aby zawierał nazwę klastra.

Jeśli wszystkie komputery mają tę samą nazwę klastra, elastsearch wykona resztę automatycznie (o ile wszystkie maszyny znajdują się w tej samej sieci)

Przeczytaj tutaj, aby zacząć: https://www.elastic.co/guide/en/elasticsearch/guide/current/deploy.html

Tworząc indeksy (gdzie trafiają dane) określasz w tym czasie ile replik chcesz (będą one rozprowadzane po klastrze)

Transact Charlie
źródło
9
Również - zainstaluj wtyczkę głowy. To znacznie ułatwia monitorowanie stanu indeksów. mobz.github.io/elasticsearch-head
Transact Charlie
1
Dlaczego musisz mieć oddzielne kopie na każdym komputerze? W oparciu o to, co widziałem w przypadku maszyn z jednym węzłem, możesz zmienić nazwę węzła, aby mieć wiele instancji działających z tą samą kopią: concept47.com/austin_web_developer_blog/elasticsearch/ ... Czy nie ma to zastosowania, gdy masz oddzielne maszyny z jednym dyskiem współdzielonym ? Pomyślałbym, że jeśli ustawię nazwę klastra dla pojedynczej kopii, mógłbym uruchomić tę pojedynczą kopię na każdym z komputerów, więc nazwa klastra byłaby teoretycznie taka sama, czy jestem niepoprawna?
Rolando
Każda maszyna (lub węzeł) będzie potrzebować własnego obszaru plików do zapisywania plików indeksu Lucene. jeśli zmienisz plik konfiguracyjny (sprawdź link), aby wskazywał na inny katalog w węźle lokalnym, to może działać.
Transact Charlie
Miałem wrażenie, że różne nazwy węzłów w każdym klastrze, ponieważ pojedyncza instancja elastsearch byłaby w stanie automatycznie stwierdzić, że inna instancja już działa, elastsearch utworzy oddzielne katalogi w oparciu o węzeł. (popraw mnie, jeśli to nie jest prawidłowe założenie)
Rolando
1
dlaczego nie spróbować - zawsze możesz to posprzątać? Zgłoś się - byłbym zainteresowany. W przeszłości instalowałem na każdym komputerze, ponieważ wydawało się to bardziej zbędne i bezpieczne.
Transact Charlie
53

Zwykle jest obsługiwany automatycznie.

Jeśli automatyczne wykrywanie nie działa. Edytuj plik konfiguracyjny wyszukiwania elastycznego, włączając wykrywanie emisji pojedynczej

Węzeł 1:

    cluster.name: mycluster
    node.name: "node1"
    node.master: true
    node.data: true
    discovery.zen.ping.multicast.enabled: false
    discovery.zen.ping.unicast.hosts: ["node1.example.com"]

Węzeł 2:

    cluster.name: mycluster
    node.name: "node2"
    node.master: false
    node.data: true
    discovery.zen.ping.multicast.enabled: false
    discovery.zen.ping.unicast.hosts: ["node1.example.com"]

i tak dalej dla węzła 3, 4, 5. Uczyń węzeł 1 głównym, a resztę tylko węzłami danych.

Edycja: Zwróć uwagę, że zgodnie z regułą ES, jeśli masz Nwęzły, to zgodnie z konwencją N/2+1węzły powinny być mistrzami mechanizmów przełączania awaryjnego. Mogą jednak być węzłami danych lub nie.

Ponadto, jeśli automatyczne wykrywanie nie działa, najbardziej prawdopodobną przyczyną jest to, że sieć na to nie zezwala (a zatem jest wyłączona). Jeśli zbyt wiele pingów automatycznego wykrywania ma miejsce na wielu serwerach, zasoby do zarządzania tymi pingami uniemożliwi prawidłowe działanie innych usług.

Na przykład, pomyśl o klastrze 10 000 węzłów i wszystkich 10 000 węzłów wykonujących automatyczne pingi.

KannarKK
źródło
Dla wyjaśnienia, czy wszystkie „unicast.hosts” powinny być IP / FQDN mastera? Wydaje się, że to właśnie wskazuje twój przykład.
harperville
Zgodnie z komentarzami Flexiblesearch.yml w wersji 1.7.x, jeśli ustawisz „node.master: false”, wówczas węzeł NIGDY nie stanie się mistrzem ....
Jonesome Przywróć Monikę
@Jonesome - mój przykład ilustruje jeden główny i> 1 węzeł danych. jeśli nie chcesz, aby węzeł kiedykolwiek działał jako wzorzec, powinieneś być w porządku, jeśli ustawisz właściwość na fałsz. Jeśli jednak kiedykolwiek chcesz, aby węzeł stał się nadrzędnym, nigdy nie należy dotykać tej właściwości.
KannarKK
@KannarKK Ale w ES, jeśli ustawisz "node.master: false" na każdym węźle z wyjątkiem 1, jeśli master ulegnie awarii, czy cały klaster nie ulegnie awarii? Czy nie jest to sprzeczne z głównym celem klastra? Dlaczego nie pozostawić „node.master” całkowicie poza yml (co domyślnie oznacza, że ​​jest prawdziwe), aby w przypadku śmierci mastera inny węzeł mógł zostać nadrzędnym?
Jonesome Reinstate Monica
@Jonesome - zawarłem już tę informację w odpowiedzi: .... Zwróć uwagę, że zgodnie z regułą ES, jeśli masz N węzłów, to zgodnie z konwencją węzły N / 2 + 1 powinny być wzorcami mechanizmów przełączania awaryjnego. lub mogą nie być węzłami danych. Dlatego jeśli masz> 1 mistrzów, dodaj wszystkie ich informacje do listy hostów
KannarKK
5

Wypróbowałem kroki, które @KannarKK zasugerował w ES 2.0.2, jednak nie mogłem uruchomić i uruchomić klastra. Najwyraźniej coś wymyśliłem, ponieważ ustawiłem numer portu TCP na Master, w konfiguracji Slave discovery.zen.ping.unicast.hosts potrzebuje numeru portu Master wraz z adresem IP (numer portu tcp) do wykrycia. Więc kiedy próbuję wykonać następującą konfigurację, działa to dla mnie.

Węzeł 1

cluster.name: mycluster
node.name: "node1"
node.master: true
node.data: true
http.port : 9200
tcp.port : 9300
discovery.zen.ping.multicast.enabled: false
# I think unicast.host on master is redundant.
discovery.zen.ping.unicast.hosts: ["node1.example.com"]

Węzeł 2

cluster.name: mycluster
node.name: "node2"
node.master: false
node.data: true
http.port : 9201
tcp.port : 9301
discovery.zen.ping.multicast.enabled: false
# The port number of Node 1
discovery.zen.ping.unicast.hosts: ["node1.example.com:9300"]
Somum
źródło
4

Elastic Search 7 zmieniło konfiguracje inicjalizacji klastra. Należy zauważyć, że instancje ES komunikują się wewnętrznie za pomocą warstwy transportowej (TCP), a nie protokołu HTTP, który jest normalnie używany do wykonywania operacji na indeksach. Poniżej znajduje się przykładowa konfiguracja klastra 2 maszyn.

cluster.name: cluster-new
node.name: node-1
node.master: true
node.data: true
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
transport.host: 102.123.322.211
transport.tcp.port: 9300
discovery.seed_hosts: [“102.123.322.211:9300”,"102.123.322.212:9300”]
cluster.initial_master_nodes: 
        - "node-1"
        - "node-2

Konfiguracja maszyny 2: -

cluster.name: cluster-new
node.name: node-2
node.master: true
node.data: true
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
transport.host: 102.123.322.212
transport.tcp.port: 9300
discovery.seed_hosts: [“102.123.322.211:9300”,"102.123.322.212:9300”]
cluster.initial_master_nodes: 
        - "node-1"
        - "node-2”

nazwa_klastra: będzie taka sama na wszystkich komputerach, które będą częścią klastra.

node.name: identyfikator instancji ES. Domyślnie nazwa maszyny, jeśli nie jest podana.

node.master: określa, czy ta instancja ES będzie nadrzędna, czy nie

node.data : określa, czy ta instancja ES będzie węzłem danych, czy nie (zatrzymaj dane)

bootsrap.memory_lock: wyłącz swapping. Możesz uruchomić klaster bez ustawiania tej flagi. Ale zaleca się ustawienie blokady.Więcej informacji: https://www.elastic.co/guide/en/elasticsearch/reference/master/setup-configuration-memory.html

network.host: 0.0.0.0, jeśli chcesz udostępnić instancję ES za pośrednictwem sieci. 0.0.0.0 różni się od 127.0.0.1 (aka localhost lub adres zwrotny). Oznacza to wszystkie adresy IPv4 na komputerze. Jeśli maszyna ma wiele adresów IP, a serwer nasłuchuje na 0.0.0.0, klient może połączyć się z maszyną z dowolnego adresu IPv4.

http.port: port, na którym ta instancja ES będzie nasłuchiwać żądań HTTP

transport.host: adres IPv4 hosta (będzie używany do komunikacji z innymi instancjami ES działającymi na różnych komputerach). Więcej informacji: https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-transport.html

transport.tcp.port: 9300 (port, na którym maszyna będzie akceptować połączenia tcp)

discovery.seed_hosts: To zostało zmienione w ostatnich wersjach. Zainicjuj wszystkie adresy IPv4 z portem TCP (ważne) instancji ES, które będą częścią tego klastra. Będzie to takie samo we wszystkich instancjach ES, które są częścią tego klastra.

cluster.initial_master_nodes: nazwy węzłów (node.name) maszyn ES, które wezmą udział w wyborach głównych. (podejmowanie decyzji w oparciu o kworum: - https://www.elastic.co/guide/en/elasticsearch/reference/current /modules-discovery-quorums.html#modules-discovery-quorums )

Marchewka
źródło