用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.mzph.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 是一个单例类,也就是全局只…