4

Chạy trên Elaticsearch trên Docker nghe có vẻ phù hợp tự nhiên - cả hai công nghệ đều hứa hẹn tính đàn hồi. Tuy nhiên, việc chạy một cụm Elaticsearch thực sự co giãn trên Docker Swarm trở nên  hơi khó khăn  với chế độ Docker 1.12 Swarm. Tại sao? Vì Elaticsearch đã từ bỏ phát hiện phát đa hướng (bằng cách di chuyển phát hiện nút phát đa hướng vào một plugin và không bao gồm nó theo mặc định), người ta phải chỉ định địa chỉ IP của tất cả các nút chính để tham gia cụm. Thật không may, điều này tạo ra vấn đề về con gà hoặc quả trứng theo nghĩa là các địa chỉ IP này không thực sự được biết trước khi bạn bắt đầu Elaticsearch như một dịch vụ Swarm! Sẽ thật dễ dàng nếu chúng ta có thể sử dụng cầu nối Docker hoặc mạng máy chủ được chia sẻ và chỉ cần chỉ định các địa chỉ IP của máy chủ Docker, như chúng ta đã quen với nó khi chạy Docker Docker" chỉ huy. Tuy nhiên, dịch vụ docker trên mạng tạo ra từ chối sử dụng mạng cầu hoặc mạng máy chủ. Vì vậy, câu hỏi vẫn còn là:  Làm thế nào chúng ta có thể triển khai Elaticsearch trong cụm Docker Swarm?

May mắn thay, bằng cách sử dụng một vài thủ thuật, có thể tạo một cụm Elaticsearch trên Docker Swarm và để nó tự động tạo thêm nút Elaticsearch trên mỗi nút Docker Swarm khi họ tham gia cụm Swarm!

Chúng tôi giả sử bạn đã có một cụm Docker Swarm hoạt động. Nếu không, chỉ cần chạy dock docker swarm init trên nút chính, sau đó chạy docker swarm tham gia vào các nút worker. 

Chúng ta hãy xem làm thế nào chúng ta có thể giải quyết hai vấn đề này.

Vấn đề Elaticsearch: Khám phá nút không có địa chỉ IP rõ ràng cho Zen Discovery

Chúng tôi sử dụng mạng lớp phủ (mạng ảo giữa các container, có sẵn trên tất cả các nút Swarm) với thiết lập robin vòng DNS. Chúng tôi cũng chỉ định tên dịch vụ Elaticsearch là es esterter 'cho khám phá Zen. Điều này có nghĩa là mỗi bộ chứa Elaticsearch mới sẽ yêu cầu nút El Elearchearch tên là tên es esterter có thể khám phá ra các nút Elaticsearch khác. Thiết lập robin vòng tròn Swarm DNS có nghĩa là mỗi lần địa chỉ IP được trả về sẽ là một IP của một nút Elaticsearch khác nhau / ngẫu nhiên. Sử dụng thủ thuật này, chúng tôi cho phép các nút Elasticesearch khám phá tất cả các nút khác và tạo thành cụm.

Vấn đề về Docker: Kết nối mạng lớp phủ kín với mạng bên ngoài

Điều này khiến chúng tôi vượt qua một rào cản, nhưng nó khiến chúng tôi phải đối mặt với vấn đề kết nối mạng Docker tiếp theo: Docker không cho phép các kết nối bên ngoài vào các mạng lớp phủ với thiết lập vòng tròn DNS. Điều này được thực hiện theo thiết kế, mặc dù một số người coi đó là một lỗi (xem vấn đề Docker SwarmKit # 1693 , giúp đơn giản hóa việc thiết lập mạng trong tương lai).

Tuy nhiên, bạn thấy điều đó, điều này có nghĩa là trong khi cụm Elaticsearch có thể tìm thấy các nút khác trong mạng lớp phủ bằng thủ thuật cướp vòng DNS đã giải quyết vấn đề ban đầu của chúng tôi, bây giờ chúng tôi phải đối mặt với vấn đề thứ hai - không thể kết nối với cổng 9200 và nói chuyện với Elaticsearch từ bất kỳ mạng nào khác.

Cụm Elaticsearch này chỉ có thể được sử dụng từ các thùng chứa chia sẻ mạng lớp phủ! Để giải quyết vấn đề này, chúng tôi cần một dịch vụ ủy quyền để kết nối mạng bên ngoài với mạng Elaticsearch của chúng tôi. Với một proxy như vậy, chúng ta có thể tiếp cận cụm Elaticsearch từ thế giới bên ngoài thế giới. Chúng tôi sử dụng jwilder / nginx-proxy cực kỳ phổ biến của jwilder , có thể khám phá dịch vụ đích bằng cách sử dụng các thẻ VIRTUAL_HOST và VIRTUAL_PORT, mà chúng tôi phải đặt làm biến môi trường trong dịch vụ Docker của ElSTERearch. Vì chúng tôi không có cấu hình DNS trong quá trình thiết lập này, chúng tôi chỉ đơn giản sử dụng DNS ký tự đại diện công cộng (xem xip.io để biết thêm thông tin) cho tên máy chủ ảo. Sơ đồ sau đây cho thấy mọi thứ được kết nối như thế nào.


Tìm kiếm thông tin trên Docker Swarm: Thiết lập

Bây giờ chúng tôi đã mô tả các vấn đề và giải pháp của chúng tôi cho chúng, hãy thực sự thiết lập Elaticsearch trên Docker Swarm.

Đầu tiên, hãy tạo các mạng bằng cách thực hiện các lệnh này trên các nút chính Swarm:

docker network create -d overlay elasticsearch-backend

docker network create -d overlay elasticsearch-frontend


Tiếp theo, chúng tôi sẽ triển khai proxy NGINX:

docker service create --mode global \

--name proxy -p 80:80 \

--network elasticsearch-frontend \

--network elasticsearch-backend  \

--mount type=bind,src=/var/run/docker.sock,target=/tmp/docker.sock:ro \

jwilder/nginx-proxy


Bây giờ chúng tôi có thể tạo ra dịch vụ Elaticsearch toàn cầu. Proxy NGINX sẽ tự động khám phá mọi vùng chứa Elaticsearch được tạo bởi dịch vụ này:

docker service create \

   --name escluster \

   --network elasticsearch-backend \

   --mode global \

   --endpoint-mode dnsrr \

   --update-parallelism 1 \

   --update-delay 60s \

   -e VIRTUAL_HOST=162.243.255.10.xip.io \

   -e VIRTUAL_PORT=9200 \

   --mount type=bind,source=/tmp,target=/data \

 elasticsearch:2.4 \

   elasticsearch \

   -Des.discovery.zen.ping.multicast.enabled=false \

   -Des.discovery.zen.ping.unicast.hosts=escluster \

   -Des.gateway.expected_nodes=3 \

   -Des.discovery.zen.minimum_master_nodes=2 \

   -Des.gateway.recover_after_nodes=2 \

   -Des.network.bind=_eth0:ipv4_


Chúng ta hãy kiểm tra trạng thái của cụm Elaticsearch của chúng tôi:

> docker service ps escluster

ID                         NAME           IMAGE              NODE                DESIRED STATE  CURRENT STATE          ERROR

30uq0ru7hc0suj500hiu9ojw1  escluster      elasticsearch:2.4  docker-1gb-nyc2-02  Running        Running 6 seconds ago  

7v55bb2l2g5f2gbzqn58nzr2o   \_ escluster  elasticsearch:2.4  docker-1gb-nyc2-03  Running        Running 6 seconds ago  

72le8cee81d03p2u211k7n8m7   \_ escluster  elasticsearch:2.4  docker-1gb-nyc2-04  Running        Running 6 seconds ago  

14mbvsx4su038mw9y3apv4k31   \_ escluster  elasticsearch:2.4  docker-1gb-nyc2-01  Running        Running 6 seconds ago  


Bây giờ chúng ta có thể truy vấn danh sách các nút từ Elaticsearch và sử dụng Elaticsearch từ bất kỳ ứng dụng khách nào khác:

> curl http://162.243.255.10.xip.io/_cat/_nodes
10.0.0.6 10.0.0.6 6 21 0.30 d * Tethlam 
10.0.0.4 10.0.0.4 8 21 0.01 d m Thornn  
10.0.0.7 10.0.0.7 6 21 0.90 d m Sphinx 


Độ co giãn trong hành động

Bây giờ chúng ta hãy quay trở lại vấn đề ban đầu - làm cho các cụm Elaticsearch được triển khai trong Docker Swarm thực sự co giãn. Với tất cả mọi thứ chúng tôi đã làm cho đến nay, khi chúng tôi cần các nút Elaticsearch bổ sung, chúng tôi có thể chỉ cần tạo một máy chủ mới và đưa nó tham gia cụm Swarm:

> ssh root@51.15.46.117 docker swarm join \

--token SWMTKN-1-54ld5e3nz31wloghribbwt8m0px4z5a1qeg17iazm7p2j7g7ke-6zccu9643j0dj7bhwmhqtwh46     162.243.255.10:2377

> This node joined a swarm as a worker.


Tại thời điểm này, nút Elaticsearch mới và nginx-proxy sẽ tự động được triển khai đến nút Swarm mới và nút Elaticsearch mới sẽ tự động tham gia cụm Elaticsearch:

> ssh root@51.15.46.117 docker ps

CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                  PORTS                NAMES

2fc12ed5f1db        jwilder/nginx-proxy:latest   "/app/docker-entrypoi"   3 seconds ago       Up Less than a second   80/tcp, 443/tcp      proxy.0.3gw46kczaiugioc6gdo0414ws

4b4999a6c7b4        elasticsearch:2.4            "/docker-entrypoint.s"   3 seconds ago       Up 1 seconds            9200/tcp, 9300/tcp


Để xem cụm Elaticsearch đang hoạt động, chúng tôi đã triển khai Sematext Docker Agent để thu thập số liệu chứa trong cụm Swarm và sau đó chúng tôi đã lập chỉ mục các tệp nhật ký lớn trong các công việc hàng loạt ngắn bằng Logagent :

> cat test.log | logagent --elasticsearchUrl http://162.243.255.10.xip.io --index logs


Trong thiết lập nhỏ của chúng tôi, Logagent có thể gửi tới 60.000 sự kiện mỗi giây với tối đa 150 ổ cắm HTTP đến cụm năm nút mà không cho biết bất kỳ sự cố mạng nào hoặc yêu cầu từ chối từ Elaticsearch.

Biểu đồ sau đây cho thấy tải của lập chỉ mục được phân bổ đều cho tất cả các thùng chứa Elaticsearch:

Tải CPU cân bằng trên các nút Elaticsearch trong khi lập chỉ mục công việc

Proxy nginx đã hiển thị các xung CPU nhỏ cùng một lúc - bởi vì nó chỉ chuyển tiếp các yêu cầu lập chỉ mục từ mạng mạng el elearchearch-frontend đến mạng mạng el elearchearch-backend , và tải được phân phối trên tất cả các thùng chứa proxy.

Tải CPU cân bằng trên proxy NGINX trong khi lập chỉ mục công việc


Tổng quan về số liệu trong  SPM cho Docker

Thiếu các tính năng trong Elaticsearch (ví dụ: đã loại bỏ phát hiện đa hướng kể từ phiên bản 2.3) và kết nối mạng Docker khiến cho việc triển khai Elaticsearch như một dịch vụ Docker Swarm trở nên khó khăn. Chúng tôi hy vọng các tính năng mới trong Elaticsearch và Docker sẽ đơn giản hóa các thiết lập như vậy trong tương lai.

Chúng tôi đã chứng minh rằng có những cách giải quyết để khắc phục các sự cố phát hiện của Elaticsearch bằng cách sử dụng vòng tròn DNS trong mạng lớp phủ trong Swarm và làm cho cụm Elaticsearch có sẵn cho các ứng dụng bên ngoài không chia sẻ cùng một mạng lớp phủ. Kết quả là một thiết lập có thể tự động mở rộng quy mô Elaticsearch với số lượng nút Swarm, trong khi tất cả các yêu cầu vẫn được cân bằng trên toàn cụm.

|