用Docker搭建Elasticsearch集群

用Docker搭建Elasticsearch集群

對于用Docker搭建分布式Elasticsearhc集群的一個介紹,以及一些實施中遇到問題的總結

搜索服務簡述

結合業務的場景,在目前的商品體系需要構建搜索服務,主要是為了提供用戶更豐富的檢索場景以及高速,實時及性能穩定的搜索服務。作為使用Java技術棧的團隊來說,可以選擇使用比較好上手的三方搜索服務。另外一種選則就是搭建自己的搜索集群。結合自己公司的業務和場景來說,搭建搜索集群在投入使用后的成本可控,搜索服務和線上的其他微服務可以通過集群的內網IP通訊。

安裝Elasticsearch的Docker鏡像

目前Elasticsearch 版本到了5.X, Springboot 目前不支持5.X以上的elasticsearch。所以還是選擇了2.2.4。

Dockerfile

關于ES的鏡像,可以直接去Dockerhub上pull.但是官方版本一般都是ES的基礎鏡像,在實際的需求場景下,還需要安裝一些插件,(比如ES的刪除api插件。分詞器插件等)所以可以選擇pull基礎鏡像后,再重新tag,push到自己的鏡像倉庫中之后,用Dokcerfile重新build一個定制版的ES鏡像。
如下就是一個基于基礎鏡像的,安裝了analysis-ik分詞器,以及ES官方的delete-by-query插件的dockerfile。定制完之后,重新tag然后push到自己的docker倉庫就可以了。

FROM yourRegistry/elasticsearch:2.4.4
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update && apt-get install zip
RUN mkdir -p /usr/share/elasticsearch/plugins/ik
RUN cd /usr/share/elasticsearch/plugins/ik && wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v1.10.4/elasticsearch-analysis-ik-1.10.4.zip && unzip elasticsearch-analysis-ik-1.10.4.zip
RUN /usr/share/elasticsearch/bin/plugin install delete-by-query

分詞器

關于分詞器的選擇,還是要根據不同的場景去判斷。因為ES對于中文分詞做的比較差,所以中文分詞一般都需要另外安裝其他分詞器插件。本文以分詞器ik為例。
需要注意的是Analysis-ik 的官方的插件版本需要和安裝的Elasticsearch版本一致。具體的使用版本可以在官方的版本列表中查詢:

Analysis-ik版本

Elasticsearch其他插件

在上述的Dockerfile 中添加了 delete-by-query插件。delete-by-query插件提供了對于多個Document的刪除API。還可以選擇的插件有:Elasticsearch API extension plugins 。
添加方式也是類似,在Dockerfile中添加 RUN /usr/share/elasticsearch/bin/plugin install XX 即可。

elasticsearch.yml配置

Elasticsearch 最重要的配置文件就是elasticsearch.yml了。在elasticsearch.yml 中需要配置ES集群的信息。具體配置內容如下(一下只是一個舉例:
配置Elasticsearch的集群名稱,默認是elasticsearch

# ======================== Elasticsearch Configuration =========================
#
# ---------------------------------- Cluster -----------------------------------
#
# 配置Elasticsearch的集群名稱,默認是elasticsearch
#
cluster.name: elasticsearch
#
# ------------------------------------ Node ------------------------------------
#
# 節點名,默認隨機指定一個name列表中名字。集群中node名字不能重復
node.name: search01-node1
#
#
#################################### Index ####################################
#
# 設置每個index默認的分片數,默認是5
#
index.number_of_shards: 2
# 
# 設置每個index的默認的冗余備份的分片數,默認是1
index.number_of_replicas: 1
# ----------------------------------- Paths ------------------------------------
#
# 索引數據的存儲路徑,默認是es根目錄下的data文件夾
#
# path.data: /path/to/data
#
# 日志路徑:
#
# path.logs: /path/to/logs
#
# ----------------------------------- Memory -----------------------------------
#
# 啟動時開啟內存鎖,防止啟動ES時swap內存。
#
bootstrap.memory_lock: true
#
#
# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
# 綁定的ip地址, 可以是hostname或者ip地址,用來和集群中其他節點通信,同時會設置network.publish_host,以及network.bind_host
network.host: 0.0.0.0
#設置綁定的ip地址,生產環境則是實際的服務器ip,這個ip地址關系到實際搜索服務通信的地址,和服務在同一個集群環境的可以用內網ip,默認和network.host相同。
network.publish_host: 0.0.0.0
#設置綁定的ip地址,可以是ipv4或ipv6的,默認和network.host相同。
network.bind_host: 0.0.0.0
#節點間交互的tcp端口,默認是9300
transport.tcp.port: 9300
#設置對外服務的http端口,默認為9200
http.port: 9200
transport.tcp.compress: true
設置是否壓縮tcp傳輸時的數據,默認為false,不壓縮。
#
# --------------------------------- Discovery ----------------------------------
#
# 啟動時初始化集群的服務發現的各個節點的地址。
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300","host2:9300","host3:9300"]#設置這個參數來保證集群中的節點可以知道其它N個有master資格的節點。默認為1。為了防止選舉時發生“腦裂”,建議配置master節點數= (總結點數/2 + 1)
discovery.zen.minimum_master_nodes: 1
#
# ---------------------------------- Gateway -----------------------------------
#
# 設置集群中N個節點啟動之后才可以開始數據恢復,默認為1。
gateway.recover_after_nodes: 1
#
# ---------------------------------- Various -----------------------------------
#
# node.max_local_storage_nodes: 1
#
# 設置刪除索引時需要指定索引name,防止一條命令刪除所有索引數據。默認是true
#
action.destructive_requires_name: true

對于集群環境的配置,需要注意的點整理了一下:

  1. network.publish_host:對外通信的ip,這里設置成宿主機的內網IP,如果使用默認值 你會發現當其他節點找到了這臺宿主機和端口 就是連接不上這個節點
  2. discovery.zen.ping.unicast.hosts:主節點搜索列表 建議最好帶上端口號 比如[“127.0.0.1:9300”,”host1:9300”] Elasticsearch默認使用服務發現(Zen discovery)作為集群節點間發現和通信的機制。Azure、EC2和GCE也有使用其他的發現機制。服務發現由discovery.zen.*開頭的一系列屬性控制。
  3. discovery.zen.minimum_master_nodes: 1 設置這個參數來保證集群中的節點可以知道其它N個有master資格的節點。默認為1,對于大的集群來說,可以設置大一點的值(2-4)。
  4. index.number_of_shards:這里只是一個全局的索引分片數的默認值。默認是5,可以在創建索引的時候重新定義分片數量 。分片越多檢索越快,索引能力越強,但不表示寫入更快
  5. index.number_of_replicas:同上,也是全局的默認值,可以在創建索引時重新定義值 。屬于數據備份數,防止數據丟失。通過url:http://localhost:9200/A/_status 可以查詢指定索引的狀態。

Docker-Compose在集群node的配置

在所有的集群的節點,可以使用docker compose來啟動容器。通過volumes變量配置映射的本地配置以及本地的備份數據data目錄。基礎鏡像就是已經build好的,帶有分詞器插件的鏡像。最好tag后綴和基礎鏡像區別開,如用elasticsearch:2.4.4_ik

elasticsearch-node1:image: yourRegistry/elasticsearch:2.4.4_ikcontainer_name: elasticsearch-node1ulimits:memlock:soft: -1hard: -1mem_limit: 1gvolumes:- ~/elasticsearch/data:/usr/share/elasticsearch/data
      - ~/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:- 9200:9200

啟動好了之后,可以通過http的健康檢查請求來查看集群的配置。
http://your_domain:9200/_cluster/health?pretty=true 返回如下:

{"cluster_name" : "elasticsearch","status" : "green","timed_out" : false,"number_of_nodes" : 3,"number_of_data_nodes" : 3,"active_primary_shards" : 0,"active_shards" : 0,"relocating_shards" : 0,"initializing_shards" : 0,"unassigned_shards" : 0,"delayed_unassigned_shards" : 0,"number_of_pending_tasks" : 0,"number_of_in_flight_fetch" : 0,"task_max_waiting_in_queue_millis" : 0,"active_shards_percent_as_number" : 100.0
}

Logstash & Kibana

為了方便數據的全量,增量的同步,可以在搜索服務基礎上增加Logstash。Losstash也可以使用Docker容器進行部署。相關可以查看: Logstash-docker 以及 增量數據同步-logstash 介紹 。如要和mysql數據庫進行數據同步,需要安裝logstash-input-jdbc插件。具體的部署方式可以看:
migrating-mysql-data-into-elasticsearch-using-logstash。
和Elasticsearch以及Logstash可以搭配使用的還有Kibana,Kibana可以提供可視化的索引數據管理。網上關于E.L.K的文章也比較多,這里不再具體介紹了。Kibana 是為 Elasticsearch 設計的開源分析和可視化平臺。你可以使用 Kibana 來搜索,查看存儲在 Elasticsearch 索引中的數據并與之交互。你可以很容易實現高級的數據分析和可視化,以圖標的形式展現出來。Kibana的docker部署可以查看:Configuring Kibana on Docker,相關配置:
Kibana Default settings 。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536087.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536087.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536087.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go實現簡單的RESTful_API

Go實現簡單的RESTful_API 何為RESTful API A RESTful API is an application program interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. A RESTful API – also referred to as a RESTful web service – is based on representational state t…

Docker使用Dockerfile構建簡單鏡像

Docker使用Dockerfile構建簡單鏡像 首先確保系統已經安裝docker 構建鏡像 安裝基礎鏡像 sudo docker pull ubuntu 查看鏡像是否已經拉取成功 REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu …

Weave Scope安裝

Weave Scope安裝 首先確保已經安裝docker 實時了解Docker容器狀態 查看容器基礎設施的概況,或者專注于一個特殊的微服務。從而輕松發現并糾正問題,確保你的容器化應用的穩定與性能。 內部細節與深度鏈接 查看容器的指標、標簽和元數據。 在一個可擴展…

MYSQL導入數據出現ERROR 1049 (42000): Unknown database 'n??;'

MYSQL導入數據出現ERROR 1049 (42000): Unknown database ‘n??;’ 背景 我需要將一個csv表中的數據導入數據庫創建好的表中,產生的問題如下: 原因尋找 因為我并沒有使用’n??;的數據庫,所以很好奇這個錯怎么來的,嘗試如下…

Win10忘記ubuntu子系統密碼

Win10忘記ubuntu子系統密碼 目前新版win10已經支持ubuntu子系統,如果忘記子系統密碼怎么辦? linux單用戶模式 在ubuntu中如果忘記密碼,可以在啟動的時候,在grub內更改用戶為root進入,這樣就可以使用最高權限的單用戶…

藍橋杯練習系統,入門訓練,Java版

藍橋杯練習系統,入門訓練,Java版序列求和圓的面積Fibonacci數列希望大家提建議我加以修改序列求和 import java.util.*; public class Main {public static void main(String[] args) {Scanner cinnew Scanner(System.in);long ncin.nextLong();System.…

SVG入門理解

SVG入門SVG 元素簡單的形狀rectcircleellipselinetextpath SVG 樣式分層和繪圖順序透明度 SVG入門 當我們用SVG生成和操作一些炫酷的效果時,D3是最佳選擇。使用div和其他原生HTML元素繪圖也是可以的,但是太笨重,而且會受到不同瀏覽器的限制&#xff0c…

【哈佛幸福課筆記】【1】

【哈佛幸福課筆記】【1】 ? ? 一個月的時間看完了哈佛幸福課,正如Tal所說課程的結束才是學習的開始。對于課程觀點的思考,對于個人習慣的培養,對于思維模式的轉變還需要花大量的時間去練習。這個系列的帖子將作為我個人的讀書筆記&#x…

Angular 6+ 之新版service

Angular 6+ 之新版service Angular 6已經發布了,Angular 6中有一些新功能,其中一個就是提供service的共享實例。 回首Angular 5- 下面是一段熟悉的代碼,可以為整個應用程序提供服務。我們將它添加到AppModule中的providers[]。 自定義服務類 // data.service.ts export c…

Angular CDK Layoout 檢測斷點

Angular CDK檢測斷點 Angular CDK有一個布局包,其服務可以輕松檢測窗口大小并與媒體查詢匹配。這使得你可以完全控制UI并適應不同的屏幕尺寸。 讓我們快速了解一下如何使用CDK的布局模塊。 Setup 首先,您需要確保在您的應用中安裝了Angular CDK: $ npm install @angular/c…

Angular Render2

Angular Render2 Renderer2類是Angular以service的形式提供的抽象,允許操作應用程序的元素而無需直接觸摸DOM。這是推薦的方法,因為它可以更容易地開發可以在沒有DOM訪問的環境中呈現的應用程序,例如在服務器上,web worker,或者原生移動上。 需要注釋的是,現在已棄用原始…

數據分析方法

數據分析方法 什么是數據分析 從數據到信息的這個過程,就是數據分析。數據本身并沒有什么價值,有價值的是我們從數據中提取出來的信息。 分類 分類分析的目標是:給一批人(或者物)分成幾個類別,或者預測他們屬于每個類別的概率…

RAID陣列基礎知識

RAID陣列基礎知識 獨立硬盤冗余陣列 (RAID, Redundant Array of Independent Disks),舊稱廉價磁盤冗余陣列(Redundant Array of Inexpensive Disks),簡稱磁盤陣列。 RAID的種類 這里我們只介紹比較常用的RAID類型&am…

timeshift備份你的Linux系統

timeshift備份你的Linux系統 安裝 打開終端(ctrl alt T)并逐個執行以下命令 sudo apt-add-repository -y ppa:teejee2008/ppa sudo apt-get update sudo apt-get install timeshift 創建 點擊Create按鈕 默認不能備份用戶下的文件,所以…

Go語言vscode環境配置

Go語言vscode環境配置 此教程在GO已經安裝成功的前提下。 安裝vscode擴展 在vscode擴展里面搜索go,然后下載擴展。 安裝go 插件 在$GOPATH目錄下創建bin,pkg,src切換到$GOPATH/bin目錄下,打開終端輸入以下命令,不需要翻墻: go…

Angular實現懸浮球組件

Angular實現懸浮球組件 在手機 App 上,我們經常會看到懸浮球的東東,用著可能很舒服,但是 web 網頁上卻很少見,今天我們就通過 Angular 來實現,當然使用其他框架也是可以的。 功能要求: 支持設置直徑支持點擊觸發信號支持設置鼠標按壓時間實現的過程中省略的部分天填坑過…

Docker+Nginx部署Angular國際化i18n

Docker+Nginx部署Angular國際化i18n 在Angular項目中添加default.conf文件 default.conf 為了支持局域網,增加一個域名,即本地的局域網ip地址。 server {listen 80;server_name localhost;server_name 192.168.2.172;location / {root /usr/share/nginx/html;lo…

消息隊列-Message Queue

消息隊列-Message Queue 目前隨著互聯網的普及以及上網用戶的增多,擁有一套 安全、穩定、低耦合、高性能的內部通信工具尤為重要。 什么是消息隊列? 消息隊列(英語:Message queue)是一種進程間通信或同一進程的不同線…

Angular 第一章 開始

第一章 開始 用 JavaScript 開發應用程序是一個很大的挑戰。由于它的延展性和缺少類型檢查,在 JavaScript 中構建一個適當大小的應用程序是很困難的。除此之外,我們對所有類型的處理都使用JavaScript,例如用戶界面(UI),操作、客戶端-服務器交互和業務處理/驗證。因此,我們…

Typescript實現單例之父類調用子類

Typescript實現單例之父類調用子類 設計要求 在程序中,需要一個對象可以全局使用,并且只有一個實例Breakpoint 類是一個可以被繼承的類,然后子類必須實現 updateView函數updateView 這個函數可以被自動調用,當窗口發生變化的時候構思 UML 圖 Layout 是一個單例類,也就是全局只…