elasticsearch原来是这样工作的(附安装和集群部署笔记

2021-10-22  本文已影响0人  张清柏

千万人的失败,都有是失败在做事不彻底,往往做到离成功只差一步就终止不做了。

什么是elasticsearch

Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。Elasticsearch是用Java开发的,并在Apache许可证下作为开源软件发布。Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。

elasticsearch的集群架构

这篇文章对集群的讲解很到位
参考文章

在这里插入图片描述

3c和脑裂

1.共识性(consensus),即在分布式系统中,所有的节点必须对给定的数据或者节点状态达成共识,elasticsearch使用zen discovery完成共识
2.并发(concurrency),我们知道,elasticsearch 是一个分布式系统,当一个写请求到达主分片之后,还需要同步给备份分片,那么为什么会有备份分片呢?我们看下面这个图

在这里插入图片描述

我们先考虑一下为什么会有分片,首先我们知道,一个索引可以存储超出单个节点硬件限制的大量数据。比如集群里面,每个节点最多存储500g数据,但是我们又10亿文档索引,需要占据1tb的磁盘空间,怎么办?这个时候,我们就可以像把一桶水倒入 多个水杯一样,一个水杯放不下,我们就多使用几个水杯,这里的水杯就是我们的分片,分片不单单解决了数据量大的问题,而且提高了服务的性能,所以说分片有两个作用:1.允许水平分割或者扩展内容容量 2.允许你再分片上进行分布式、并行的操作,提高服务的性能和io
那么好了,既然我们的对数据的操作是基于分片实现的,那么会不会某个分片就丢了,坏了的情况呢?或者某个节点暂停服务了,那么这个节点上面的分片的数据也就查询不到了。怎么办?Elasticsearch允许你创建分片的一份或多份拷贝,这些拷贝叫做备份分片,备份分片提高了系统的高可用,另一方面,备份分片也可以用于搜索。

备份分片的数量可以在创建索引的 时候指定,也可以动态指定。但是分片的数量必须在索引创建的时候指定,并且不可修改,所以至于指定多少分片,我们可以根据实际的存储量决定,一般一个分片可以容纳20-40g的容量

我们接着说并发,Elasticsearch怎么来控制并发带来的数据不同步问题呢?当然是上锁,Elasticsearch使用的是乐观锁,乐观锁有两种

3.一致性(consistency):Elasticsearch集群保证写一致性的方式是在写入之前先检查集群的状态,看看又多少分片可以写入,如果达到某个调价,就写入,否则就等待,默认一分钟后重试,而这个条件是可以设置的

这样,无论搜索请求至哪个分片都会返回最新的文档。但是如果我们的应用对写要求很高,就可以通过设置 replication=async 来提升写的效率,如果设置 replication=async,则只要主分片的写完成,就会返回写成功。

4.脑裂
在集群中,主节点会定时ping 其他节点的可用状态,其他节点也ping主节点,当集群网络不稳定的时候,可能会发生一个节点ping不通主节点,那么就认为主节点宕机,就会重新选举一个新的主节点,这个时候一个集群就会出现多个master,这就是脑裂,当一个集群中出现多个master的时候,可能会导致数据丢失。

如何理解倒排索引?

参考文章
我们知道,Lucene是基于倒排表存储索引的。elasticsearch也是基于Lucene做的封装,那么什么是倒排索引呢?如果我让你找包含 故乡 这个词的诗句,你可能要犹豫一下,然后想起来 《静夜思》低头思故乡 和 《月夜忆舍弟》 月是故乡明;但是如果如果直接问你 静夜思和月夜忆舍弟,你很快就背诵出来了。我们往往都记得标题,忘了内容。那么怎么样我们搜索内容的时候,才可以快速找到标题呢,这就用到了倒排索引,我们给每一篇文章打上tag ,再根据tag 找到对应的文章

在这里插入图片描述
在这里插入图片描述
参考文章

演示环境

下载elasticsearch

下载地址

简单启动

useradd elastic
#下载tar包并解压目录
[elastic@localhost ~]$ tar zxvf elasticsearch-7.2.0-linux-x86_64.tar.gz  
#进入目录启动
[elastic@localhost bin]$ pwd
/home/elastic/elasticsearch-7.2.0/bin
#启动
[elastic@localhost bin]$ ./elasticsearch
max number of threads [3795] for user [elastic] is too low, increase to at least [4096]

原因是 elasticsearch 启动的时候要求当前用户最大线程数至少为 4096 个线程,而操作系统限制该用户最大线程数为 3795,只需要修改当前用户的最大线程数即可。可以使用ulimit -a查看当前用户允许的最大线程数

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3795
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3795
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

可以看到 max user processes 确实为 3795

在 Linux 中,用户允许的最大线程数的配置文件为/etc/security/limits.conf,我们需要在该配置文件中添加下面配置

# elastic是登录用户名,配置完毕后需要退出重新登录
elastic  -  nproc  65535

[elastic@localhost ~]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 3795
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65535
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 65535
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited 

开启一个节点

在这里插入图片描述

多个节点的部署

参考文章

可以使用多台服务器部署 ,或者同一台服务器多个节点部署也可以,端口号不一样就行了,来看一下节点1的配置

[elastic@localhost bin]$ cat ../config/elasticsearch.yml
# ======================== Elasticsearch Configuration =========================
#集群名称
cluster.name: cluster1
#节点名称 集群中保证唯一
node.name: node1
#主节点属性值,表示是否有成为主节点的资格
node.master: true
# 节点是否存储数据
node.data: true
# 本节点的ip
network.host: 172.16.131.5
# 本节点的端口
http.port: 9200
# 集群之间的通讯端口
transport.port: 9300
# 种子节点
discovery.seed_hosts: ["172.16.131.5:9300","172.16.131.5:9301","172.16.131.5:9302"]
# 初始化的时候需要配置一些具有主节点属性的节点
cluster.initial_master_nodes: ["172.16.131.5:9300","172.16.131.5:9301","172.16.131.5:9302"] 
[elastic@localhost ~]$ cp -r elasticsearch-7.2.0  elasticsearch2
[elastic@localhost ~]$ cp -r elasticsearch-7.2.0  elasticsearch3
[elastic@localhost ~]$ ls
elasticsearch2  elasticsearch3  elasticsearch-7.2.0  elasticsearch-7.2.0-linux-x86_64.tar.gz
[elastic@localhost config]$ cat elasticsearch.yml
# ======================== Elasticsearch Configuration =========================

cluster.name: cluster1
node.name: node2
node.master: true
node.data: true
node.ingest: true
network.host: 172.16.131.5
http.port: 9201
transport.port: 9301
discovery.seed_hosts: ["172.16.131.5:9300","172.16.131.5:9301","172.16.131.5:9302"]
cluster.initial_master_nodes: ["172.16.131.5:9300","172.16.131.5:9301","172.16.131.5:9302"] 
cluster.name: cluster1
node.name: node3
node.master: true
node.data: true
node.ingest: true
network.host: 172.16.131.5
http.port: 9202
transport.port: 9302
discovery.seed_hosts: ["172.16.131.5:9300","172.16.131.5:9301","172.16.131.5:9302"]
cluster.initial_master_nodes: ["172.16.131.5:9300","172.16.131.5:9301","172.16.131.5:9302"] 
在这里插入图片描述
在这里插入图片描述
cluster.name: cluster1
node.name: node2
node.master: true
node.data: true
node.ingest: true
network.host: 172.16.131.5
http.port: 9201
transport.port: 9301
discovery.seed_hosts: ["172.16.131.5:9300","172.16.131.5:9301"]
cluster.initial_master_nodes: ["node1","node2"] 
[elastic@localhost config]$ cat jvm.options  
#启动时分配的内存
-Xms1g
#运行过程中分配的最大内存
-Xmx1g 

[elastic@localhost config]$ cat /proc/meminfo | grep Mem
MemTotal:         995672 kB
MemFree:          490128 kB
MemAvailable:     476936 kB

使用docker安装elastic和启动方式(单机)
使用docker安装elastic和启动方式(集群)

安装kibana

相关参考

server.port: 5601
server.host: "172.16.131.5"
elasticsearch.hosts: ["http://172.16.131.5:9200"]
                                                   


# 启动kibana
nohup ./bin/kibana --allow-root & > /dev/null 2>&1
上一篇 下一篇

猜你喜欢

热点阅读