千锋教育-做有情怀、有良心、有品质的职业教育机构

领取全套视频

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术要点  >  正文
分享到:

手把手带你搭建Elasticsearch集群

时间:2023-05-31 11:20      来源: 作者:lxl

  在之前的课程中,我们都是使用单点的Elasticsearch,接下来我们会学习如何搭建 Elasticsearch 的集群。

  1.1 单点的问题

  单点的 Elasticsearch 存在哪些可能出现的问题呢?

  单台机器存储容量有限,无法实现高存储。

  单服务器容易出现单点故障,无法实现高可用。

  单服务的并发处理能力有限,无法实现高并发。

  所以,为了应对这些问题,我们需要对 Elasticsearch 搭建集群。

  1.2 集群的结构

  1.2.1 数据分片

  首先,我们面临的第一个问题就是数据量太大,单点存储量有限的问题。大家觉得应该如何解决?

  没错,我们可以把数据拆分成多份,每一份存储到不同机器节点(Node),从而实现减少每个节点数据量的目的。这就是数据的分布式存储,也叫做数据分片(Shard)。

搭建Elasticsearch集群

  1.2.2 数据备份

  数据分片解决了海量数据存储的问题,但是如果出现单点故障,那么分片数据就不再完整,这又该如何解决呢?

  没错,就像大家为了备份手机数据,会额外存储一份到移动硬盘一样。我们可以给每个分片数据进行备份,存储到其它节点,防止数据丢失,这就是数据备份,也叫数据副本(replica)。

  数据备份可以保证高可用,但是每个分片备份一份,所需要的节点数量就会翻一倍,成本实在是太高了。为了在高可用和成本间寻求平衡,我们可以这样做:

  首先对数据分片,存储到不同节点。

  然后对每个分片进行备份,放到对方节点,完成互相备份。

  这样可以大大减少所需要的服务节点数量。如下图我们以 3 分片,每个分片备份一份为例。

搭建Elasticsearch集群

  在这个集群中,如果出现单节点故障,并不会导致数据缺失,所以保证了集群的高可用,同时也减少了节点中数据存储量。并且因为是多个节点存储数据,因此用户请求也会分发到不同服务器,并发能力也得到了一定的提升。

  10.3 搭建集群

  1.3.1 搭建集群设计

  集群需要多台机器,我们这里用一台机器来模拟,因此我们需要在一台虚拟机中部署多个 Elasticsearch 节点,每个 Elasticsearch 的端口都必须不一样。

  我们将 Elasticsearch 的安装包解压三份出来,分别修改端口号,修改 data 和 logs 存放位置。而实际开发中,将每个 Elasticsearch 节点放在不同的服务器上。

  我们将集群名称设计为 yx-elastic,并部署 3 个 Elasticsearch 节点。

  TCP:集群间的各个节点进行通讯的端口,默认 9300。

  HTTP:表示使用 HTTP 协议进行访问时使用的端口(Elasticsearch-head、Kibana、ApiPost),默认端口号是 9200。

  1.3.2 搭建集群实现

  1.将 elasticsearch-6.2.4.zip 压缩包解压三份,分别做以下命名。

搭建Elasticsearch集群

  2.修改每一个节点 config 目录下的elasticsearch.yml配置文件。三个节点的配置文件内容几乎一致,除了 node.name、path.data、path.log、http.port、transport.tcp.port 属性的值。

  (1) 配置 node-01 节点。

# 允许跨域名访问
http.cors.enabled: true
# 当设置允许跨域,默认为*,表示支持所有域名
http.cors.allow-origin: "*"
# 允许所有节点访问
network.host: 0.0.0.0
# 集群的名称,同一个集群下所有节点的集群名称应该一致
cluster.name: yx-elastic
# 当前节点名称 每个节点不一样
node.name: node-01
# 数据的存放路径,每个节点不一样,不同es服务器对应的data和log存储的路径不能一样
path.data: /Users/yuanxin/Documents/ProgramSoftware/es-config/es-9201/data
# 日志的存放路径 每个节点不一样
path.logs: /Users/yuanxin/Documents/ProgramSoftware/es-config/es-9201/logs
# HTTP协议的对外端口,每个节点不一样,默认:9200
http.port: 9201
# TCP协议对外端口 每个节点不一样,默认:9300
transport.tcp.port: 9301
# 三个节点相互发现,包含自己,使用TCP协议的端口号
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]
# 声明大于几个的投票主节点有效,请设置为(nodes / 2) + 1
discovery.zen.minimum_master_nodes: 2
# 是否为主节点
node.master: true

   (2) 配置 node-02 节点。

# 允许跨域名访问
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 0.0.0.0
# 集群的名称
cluster.name: yx-elastic
# 当前节点名称 每个节点不一样
node.name: node-02
# 数据的存放路径,每个节点不一样
path.data: /Users/yuanxin/Documents/ProgramSoftware/es-config/es-9202/data
# 日志的存放路径,每个节点不一样
path.logs: /Users/yuanxin/Documents/ProgramSoftware/es-config/es-9202/logs
# HTTP协议的对外端口,每个节点不一样
http.port: 9202
# TCP协议对外端口,每个节点不一样
transport.tcp.port: 9302
# 三个节点相互发现
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]
# 声明大于几个的投票主节点有效,请设置为(nodes / 2) + 1
discovery.zen.minimum_master_nodes: 2
# 是否为主节点
node.master: true

   (3) 配置 node-03 节点。

# 允许跨域名访问
http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 0.0.0.0
# 集群的名称
cluster.name: yx-elastic
# 当前节点名称,每个节点不一样
node.name: node-03
# 数据的存放路径,每个节点不一样
path.data: /Users/yuanxin/Documents/ProgramSoftware/es-config/es-9203/data
# 日志的存放路径,每个节点不一样
path.logs: /Users/yuanxin/Documents/ProgramSoftware/es-config/es-9203/logs
# HTTP协议的对外端口,每个节点不一样
http.port: 9203
# TCP协议对外端口,每个节点不一样
transport.tcp.port: 9303
# 三个节点相互发现
discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]
# 声明大于几个的投票主节点有效,请设置为(nodes / 2) + 1
discovery.zen.minimum_master_nodes: 2
# 是否为主节点
node.master: true

   3.将下载的 elasticsearch-analysis-ik-6.2.4.zip 的压缩包解压到集群中每个 elasticsearch 的 plugins 目录下,并将解压后的目录重命名成 analysis-ik。

  4.启动集群。进入 elasticsearch 安装目录下的 bin 目录下通过启动文件来启动 Elasticsearch。把三个节点分别启动,启动时不要着急,要一个一个地启动。启动 Elasticsearch 服务即可加载 IK 分词器。

# Mac系统下启动方式-双击下面的文件运行
./elasticsearch

# Windows系统下启动方式-在终端执行下面的文件
elasticsearch.bat

   1.4 测试集群中创建索引库

  1.4.1 Kibana 访问集群

  1.进入 Kibana 安装目录下的 config 目录,修改 kibana.yml 文件,添加 Elasticsearch 服务地址的配置(注释放开即可)。

# url访问的端口修改成9201或9202或9203都可以
elasticsearch.url: "http://localhost:9201"

   2.进入 Kibana 安装目录下的 bin 目录,通过运行启动文件来启动 Kibana。前提是先启动 Elasticsearch 服务集群,再启动 Kibana 服务。

# Mac系统下启动方式-双击下面的文件运行
./kibana

# Windows系统下启动方式-在终端执行下面的文件
kibana.bat

   3.然后访问 Kibana 地址http://127.0.0.1:5601,进行集群测试。

  1.4.2 elasticsearch-head 访问集群

  1.通过谷歌浏览器打开 elasticsearch-head 扩展程序。

  2.在打开的窗口中输入 http://localhost:9201 地址(可以是集群中任一一台服务器地址)来查看 Elasticsearch 集群的启动情况。

搭建Elasticsearch集群

  1.4.3 集群中创建索引库

  搭建集群以后就要创建索引库了,那么问题来了,当我们创建一个索引库后,数据会保存到哪个服务节点上呢?如果我们对索引库分片,那么每个片会在哪个节点呢?

  1.通过 Kibana 创建索引

  通过 API 创建索引库,设置集群的分片和备份值。示例:

PUT /yx
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}

  2.通过 elasticsearch-head 创建索引

  在 elasticsearch-head 控制台通过【索引】选项可以新建索引。这个要亲自尝试才知道。

搭建Elasticsearch集群

  3.elasticsearch-head 创建索引失败

  在通过 elasticsearch-head 创建索引时,点击新建索引窗口的【OK】按钮,没有任何响应,无法在页面新建索引。针对此问题,打开浏览器控制台,提示“Not Acceptable”错误。

图片6

  解决方案见下:

  1.打开 elasticsearch-head 安装目录下的 vendor.js 文件。

  2.修改 contentType 属性的取值。

  (1) 找到第 6886 行代码。

contentType: "application/x-www-form-urlencoded",

   (2) 将 6886 行代码改成如下内容。

contentType: "application/json;charset=UTF-8",

   3.修改 s.contentType 属性值的比较。

  (1) 找到第 7573 行代码。

var inspectData = s.contentType === "application/x-www-form-urlencoded" &&

   (2) 将 7573 行代码改成如下内容。

var inspectData = s.contentType === "application/json;charset=UTF-8" &&

   4.重新通过 elasticsearch-head 工具在控制台点击【索引】选项进行新建索引的测试。

  4.使用 elasticsearch-head 查看集群

  通过 Chrome 浏览器的 elasticsearch-head 插件查看索引,我们可以查看到分片的存储结构:

搭建Elasticsearch集群

  可以看到,yx 这个索引库,有三个分片,分别是 0、1、2,每个分片有 1 个副本,共 6 份。

  node-01 上保存了 0 号分片和 1 号分片的副本

  node-02 上保存了 1 号分片和 2 号分片的副本

  node-03 上保存了 2 号分片和 0 号分片的副本

  1.5 集群工作原理

  1.5.1 shard 与 replica 机制

  1.一个 index 包含多个 shard,也就是一个 index 存在多个服务器上。

  2.每个 shard 都是一个最小工作单元,承载部分数据,比如有三台服务器,现在有三条数据,这三条数据在三台服务器上各方一条。

  3.增减节点时,shard 会自动在 nodes 中负载均衡。

  4.primary shard(主分片)和 replica shard(副本分片),每个 document 肯定只存在于某一个 primary shard 以及其对应的 replica shard 中,不可能存在于多个 primary shard。

  5.replica shard 是 primary shard 的副本,负责容错,以及承担读请求负载。

  6.primary shard 的数量在创建索引的时候就固定了,replica shard 的数量可以随时修改。

  7.primary shard 的默认数量是 5,replica 默认是 1(每个主分片一个副本分片),默认有 10 个 shard,5 个 primary shard,5 个 replica shard。

  8.primary shard 不能和自己的 replica shard 放在同一个节点上(否则节点宕机,primary shard 和副本都丢失,起不到容错的作用),但是可以和其他 primary shard 的 replicashard 放在同一个节点上。

  1.5.2 集群写入数据

  在 Elasticsearch 集群中写入数据的步骤:

  1.客户端选择一个 node 发送请求过去,这个 node 就是 coordinating node(协调节点)。

  2.coordinating node 对 document 进行路由,将请求转发给对应的 node,根据一定的算法选择对应的节点进行存储。

  3.实际上,node 上的 primary shard 处理请求,将数据保存在本地,然后将数据同步到 replica node。

  4.coordinating node 如果发现 primary node 和所有的 replica node 都搞定之后,就会返回请求到客户端。

  这个路由简单的说就是取模算法,比如说现在有 3 台服务器,这个时候传过来的 id 是 5,那么 5%3=2,就放在第 2 台服务器。

  1.5.3 ES 查询数据

  1.倒排序算法

  查询有个算法叫倒排序。简单的说就是,通过分词把词语出现的 id 进行记录下来,在查询的时候先去查到哪些 id 包含这个数据,然后再根据 id 把数据查出来。

  2.查询过程

  1.客户端发送一个请求给协调节点(coordinate node)。

  2.协调节点将搜索的请求转发给所有的 shard 对应的 primary shard 或 replica shard。

  3.查询阶段(query phase),每一个 shard 将自己搜索的结果(其实也就是一些唯一标识),返回给协调节点,由协调节点进行数据的合并、排序和分页等操作,产出最后的结果。

  4.获取阶段(fetch phase),接着由协调节点,根据唯一标识去各个节点进行拉取数据,最终返回给客户端。

相关文章

上一篇:编码和字符集的区别是什么?
下一篇:
  • 北京总部地址:北京市海淀区宝盛北里西区28号中关村智诚科创大厦4层
    北京沙河校区:北京市昌平区沙阳路18号北京科技职业技术学院广场服务楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 深圳校区地址:深圳市宝安区宝安大道5010号西部硅谷B座C区1层108
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 上海校区地址:上海市宝山区同济支路199号智慧七立方3号楼2-4层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 广州校区地址:广州市白云区永平街永泰学山塘学山文化创意谷A1栋六楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 郑州二七区校区地址:郑州市二七区航海中路60号海为科技园C区10层
    郑州高新区校区地址:郑州市高新区金梭路与银杏路交叉口教育科技产业园南门D座4层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 大连校区地址:辽宁省大连市高新园区爱贤街10号大连设计城A座901
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 武汉金融港校区地址:武汉市东新区光谷大道77号金融港B18栋三、四层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 成都校区地址:成都市高新区肖家河沿街138号肖家河大厦三楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 西安校区地址:西安市雁塔区高新六路52号立人科技C座西区4楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 杭州旺田校区:浙江省杭州市上城区九堡镇旺田书画城A座4层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 青岛校区地址:青岛市市北区龙城路31号卓越世纪中心4号楼5层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 重庆校区地址:重庆市九龙坡区科园一路3号渝高大厦9楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 长沙校区地址:湖南省长沙市岳麓区麓谷企业广场A2栋三单元306号
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 哈尔滨校区地址:哈尔滨市松北区世泽路689号 科技创新城4号楼405
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 南京校区地址:南京市建邺区应天大街780号弘辉产业园1栋2层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 太原校区地址:太原市小店区长治路230号能源互联网大厦6层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 沈阳校区地址:辽宁省沈阳市浑南区世纪路16号东大软件园B园B1座A201
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 合肥校区地址:合肥市包河区徽州大道396号东方广场B座12A
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 贵阳校区地址:贵阳市云岩区延安东路37号物资大厦老楼9楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、网络营销培训、好程序员
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 济南校区地址:济南市历下区历山路36号齐鲁师范学院利宝产业大厦3F
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python人工智能+数据分析培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、网络安全培训、区块链培训、影视剪辑包装培训、游戏原画培训、全媒体运营培训
    认证课程:软考、、PMP认证、红帽RHCE认证
  • 千锋教育服务号

    了解千锋动态
    关注千锋教育服务号

  • 千锋教育移动站

    扫一扫快速进入
    千锋移动端页面

  • 千锋互联服务号

    扫码匿名提建议
    直达CEO信箱