一、为何要搭建 Elasticsearch 集群
凡事都要讲究个为什么。在搭建集群之前,我们首先先问一句,为什么我们需要搭建集群?它有什么优势呢?
(1)高可用性
Elasticsearch 作为一个搜索引擎,我们对它的基本要求就是存储海量数据并且可以在非常短的时间内查询到我们想要的信息。所以第一步我们需要保证的就是 Elasticsearch 的高可用性,什么是高可用性呢?它通常是指,通过设计减少系统不能提供服务的时间。假设系统一直能够提供服务,我们说系统的可用性是 100%。如果系统在某个时刻宕掉了,比如某个网站在某个时间挂掉了,那么就可以它临时是不可用的。所以,为了保证 Elasticsearch 的高可用性,我们就应该尽量减少 Elasticsearch 的不可用时间。
那么怎样提高 Elasticsearch 的高可用性呢?这时集群的作用就体现出来了。假如 Elasticsearch 只放在一台服务器上,即单机运行,假如这台主机突然断网了或者被攻击了,那么整个 Elasticsearch 的服务就不可用了。但如果改成 Elasticsearch 集群的话,有一台主机宕机了,还有其他的主机可以支撑,这样就仍然可以保证服务是可用的。
那可能有的小伙伴就会说了,那假如一台主机宕机了,那么不就无法访问这台主机的数据了吗?那假如我要访问的数据正好存在这台主机上,那不就获取不到了吗?难道其他的主机里面也存了一份一模一样的数据?那这岂不是很浪费吗?
为了解答这个问题,这里就引出了 Elasticsearch 的信息存储机制了。首先解答上面的问题,一台主机宕机了,这台主机里面存的数据依然是可以被访问到的,因为在其他的主机上也有备份,但备份的时候也不是整台主机备份,是分片备份的,那这里就又引出了一个概念——分片。
分片,英文叫做 Shard,顾名思义,分片就是对数据切分成了多个部分。我们知道 Elasticsearch 中一个索引(Index)相当于是一个数据库,如存某网站的用户信息,我们就建一个名为 user 的索引。但索引存储的时候并不是整个存一起的,它是被分片存储的,Elasticsearch 默认会把一个索引分成五个分片,当然这个数字是可以自定义的。分片是数据的容器,数据保存在分片内,分片又被分配到集群内的各个节点里。当你的集群规模扩大或者缩小时, Elasticsearch 会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里,所以相当于一份数据被分成了多份并保存在不同的主机上。
那这还是没解决问题啊,如果一台主机挂掉了,那么这个分片里面的数据不就无法访问了?别的主机都是存储的其他的分片。其实是可以访问的,因为其他主机存储了这个分片的备份,叫做副本,这里就引出了另外一个概念——副本。
副本,英文叫做 Replica,同样顾名思义,副本就是对原分片的复制,和原分片的内容是一样的,Elasticsearch 默认会生成一份副本,所以相当于是五个原分片和五个分片副本,相当于一份数据存了两份,并分了十个分片,当然副本的数量也是可以自定义的。这时我们只需要将某个分片的副本存在另外一台主机上,这样当某台主机宕机了,我们依然还可以从另外一台主机的副本中找到对应的数据。所以从外部来看,数据结果是没有任何区别的。
一般来说,Elasticsearch 会尽量把一个索引的不同分片存储在不同的主机上,分片的副本也尽可能存在不同的主机上,这样可以提高容错率,从而提高高可用性。
但这时假如你只有一台主机,那不就没办法了吗?分片和副本其实是没意义的,一台主机挂掉了,就全挂掉了。
(2)健康状态
针对一个索引,Elasticsearch 中其实有专门的衡量索引健康状况的标志,分为三个等级:
- green,绿色。这代表所有的主分片和副本分片都已分配。你的集群是 100% 可用的。
- yellow,黄色。所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。不过,你的高可用性在某种程度上被弱化。如果更多的分片消失,你就会丢数据了。所以可把 yellow 想象成一个需要及时调查的警告。
- red,红色。至少一个主分片以及它的全部副本都在缺失中。这意味着你在缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。
如果你只有一台主机的话,其实索引的健康状况也是 yellow,因为一台主机,集群没有其他的主机可以防止副本,所以说,这就是一个不健康的状态,因此集群也是十分有必要的。
(3)存储空间
另外,既然是群集,那么存储空间肯定也是联合起来的,假如一台主机的存储空间是固定的,那么集群它相对于单个主机也有更多的存储空间,可存储的数据量也更大。
所以综上所述,我们需要一个集群!
二、详细了解 Elasticsearch 集群
接下来我们再来了解下集群的结构是怎样的。
首先我们应该清楚多台主机构成了一个集群,每台主机称作一个节点(Node)。
如图就是一个三节点的集群:
在图中,每个 Node 都有三个分片,其中 P 开头的代表 Primary 分片,即主分片,R 开头的代表 Replica 分片,即副本分片。所以图中主分片 1、2,副本分片 0 储存在 1 号节点,副本分片 0、1、2 储存在 2 号节点,主分片 0 和副本分片 1、2 储存在 3 号节点,一共是 3 个主分片和 6 个副本分片。同时我们还注意到 1 号节点还有个 MASTER 的标识,这代表它是一个主节点,它相比其他的节点更加特殊,它有权限控制整个集群,比如资源的分配、节点的修改等等。
这里就引出了一个概念就是节点的类型,我们可以将节点分为这么四个类型:
- 主节点:即 Master 节点。主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的。默认情况下任何一个集群中的节点都有可能被选为主节点。索引数据和搜索查询等操作会占用大量的 cpu,内存,io 资源,为了确保一个集群的稳定,分离主节点和数据节点是一个比较好的选择。虽然主节点也可以协调节点,路由搜索和从客户端新增数据到数据节点,但最好不要使用这些专用的主节点。一个重要的原则是,尽可能做尽量少的工作。
- 数据节点:即 Data 节点。数据节点主要是存储索引数据的节点,主要对文档进行增删改查操作,聚合操作等。数据节点对 CPU、内存、IO 要求较高,在优化的时候需要监控数据节点的状态,当资源不够的时候,需要在集群中添加新的节点。
- 负载均衡节点:也称作 Client 节点,也称作客户端节点。当一个节点既不配置为主节点,也不配置为数据节点时,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节点,客户端节点加入集群可以得到集群的状态,根据集群的状态可以直接路由请求。
- 预处理节点:也称作 Ingest 节点,在索引数据之前可以先对数据做预处理操作,所有节点其实默认都是支持 Ingest 操作的,也可以专门将某个节点配置为 Ingest 节点。
以上就是节点几种类型,一个节点其实可以对应不同的类型,如一个节点可以同时成为主节点和数据节点和预处理节点,但如果一个节点既不是主节点也不是数据节点,那么它就是负载均衡节点。具体的类型可以通过具体的配置文件来设置。
三、怎样搭建 Elasticsearch 6.5.4 集群
1-1、准备环境
采用三台 CentOS6.5 部署 Elasticsearch 集群,部署 Elasticsearch 集群就不得不提索引分片,以下是索引分片的简单介绍。
系统 | 节点名称 | IP 地址 |
---|---|---|
centos 6.5 | els-node1 | 192.168.60.201 |
centos 6.5 | els-node2 | 192.168.60.202 |
centos 6.5 | els-node3 | 192.168.60.203 |
ES 集群中索引可能由多个分片构成,并且每个分片可以拥有多个副本。通过将一个单独的索引分为多个分片,我们可以处理不能在一个单一的服务器上面运行的大型索引,简单的说就是索引的大小过大,导致效率问题。不能运行的原因可能是内存也可能是存储。由于每个分片可以有多个副本,通过将副本分配到多个服务器,可以提高查询的负载能力。
由于 Elasticsearch 6.5.4 要求 linux 内核版本要高于 3.5+,所以我们先要将系统内核升级至 3.5+,详细请移步
1-2、Elasticsearch 集群搭建
1.安装 JDK
Elasticsearch 是基于 Java 开发是一个 Java 程序,运行在 Jvm 中,所以第一步要安装 JDK
yum install -y java-1.8.0-openjdk-devel # 安装 1.8 或 1.8 以上版本
2.下载 elasticsearch
https://www.elastic.co/cn/downloads/elasticsearch,是 ELasticsearch 的官方站点,如果需要下载最新的版本,进入官网下载即可。可以下载到本地电脑然后再导入 CentOS 中,也可以直接在 CentOS 中下载。
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.4.rpm
3.安装 elasticsearch
rpm -ivh elasticsearch-6.5.4.rpm
4.配置目录
安装完毕后会生成很多文件,包括配置文件日志文件等等,下面几个是最主要的配置文件路径
/etc/elasticsearch/elasticsearch.yml # els 的配置文件 /etc/elasticsearch/jvm.options # JVM 相关的配置,内存大小等等 /etc/elasticsearch/log4j2.properties # 日志系统定义 /usr/share/elasticsearch # elasticsearch 默认安装目录 /var/lib/elasticsearch # 数据的默认存放位置
5.创建用于存放数据与日志的目录
数据文件会随着系统的运行飞速增长,所以默认的日志文件与数据文件的路径不能满足我们的需求,那么手动创建日志与数据文件路径,可以使用 NFS、可以使用 Raid 等等方便以后的管理与扩展
mkdir -p /opt/elasticsearch/data mkdir -p /opt/elasticsearch/log chown -R elasticsearch.elasticsearch /opt/elasticsearch/*
6.集群配置
集群配置中最重要的两项是node.name与network.host,每个节点都必须不同。其中node.name是节点名称主要是在 Elasticsearch 自己的日志加以区分每一个节点信息。
discovery.zen.ping.unicast.hosts是集群中的节点信息,可以使用 IP 地址、可以使用主机名(必须可以解析)。
vim /etc/elasticsearch/elasticsearch.yml cluster.name: my-els # 集群名称 node.name: els-node1 # 节点名称,仅仅是描述名称,用于在日志中区分 path.data: /opt/elasticsearch/data # 数据的默认存放路径 path.logs: /opt/elasticsearch/log # 日志的默认存放路径 network.host: 192.168.60.201 # 当前节点的 IP 地址 http.port: 9200 # 对外提供服务的端口,9300 为集群服务的端口 #添加如下内容 #culster transport port transport.tcp.port: 9300 transport.tcp.compress: true discovery.zen.ping.unicast.hosts: ["192.168.60.201", "192.168.60.202","192.168.60.203"] # 集群个节点 IP 地址,也可以使用 els、els 等名称,需要各节点能够解析 discovery.zen.minimum_master_nodes: 2 # 为了避免脑裂,集群节点数最少为 半数+1
#index.number_of_shards: 5 #index.number_of_replicas: 1
(1)cluster.name
集群名字,三台集群的集群名字都必须一致(2)node.name
节点名字,三台 ES 节点字都必须不一样(3)discovery.zen.minimum_master_nodes:2
表示集群最少的 master 数,如果集群的最少 master 数据少于指定的数,将无法启动,官方推荐 node master 数设置为集群数/2+1,我这里三台 ES 服务器,配置最少需要两台 master,整个集群才可正常运行,(4)node.master 该节点是否有资格选举为 master,如果上面设了两个 mater_node 2,也就是最少两个 master 节点,则集群中必须有两台 es 服务器的配置为 node.master: true 的配置,配置了 2 个节点的话,如果主服务器宕机,整个集群会不可用,所以三台服务器,需要配置 3 个 node.masdter 为 true,这样三个 master,宕了一个主节点的话,他又会选举新的 master,还有两个节点可以用,只要配了 node master 为 true 的 ES 服务器数正在运行的数量不少于 master_node 的配置数,则整个集群继续可用,我这里则配置三台 es node.master 都为 true,也就是三个 master,master 服务器主要管理集群状态,负责元数据处理,比如索引增加删除分片分配等,数据存储和查询都不会走主节点,压力较小,jvm 内存可分配较低一点
(5)node.data
存储索引数据,三台都设为 true 即可(6)bootstrap.memory_lock: true
锁住物理内存,不使用 swap 内存,有 swap 内存的可以开启此项(7)discovery.zen.ping_timeout: 10s
自动发现拼其他节点超时时间(8)discovery.zen.ping.unicast.hosts: [“172.16.8.41:9302″,”172.16.8.42:9302″,”172.16.8.43:9302”]
设置集群的初始节点列表,集群互通端口为 9302
es1
cluster.name: framework-cluster
node.name: node-1
node.master: true
node.data: true
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
bootstrap.memory_lock: true
bootstrap.system_call_filter: false
network.host: 0.0.0.0
http.port: 30010
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping_timeout: 10s
transport.port: 9302
discovery.zen.ping.unicast.hosts: ["172.16.8.41:9302","172.16.8.42:9302","172.16.8.43:9302"]
es2
cluster.name: framework-cluster
node.name: node-2
node.master: true
node.data: true
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
bootstrap.memory_lock: true
bootstrap.system_call_filter: false
network.host: 0.0.0.0
http.port: 30010
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping_timeout: 10s
transport.port: 9302
discovery.zen.ping.unicast.hosts: ["172.16.8.41:9302","172.16.8.42:9302","172.16.8.43:9302"]
es3
cluster.name: framework-cluster
node.name: node-3
node.master: true
node.data: true
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
bootstrap.memory_lock: true
bootstrap.system_call_filter: false
network.host: 0.0.0.0
http.port: 30010
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping_timeout: 10s
transport.port: 9302
discovery.zen.ping.unicast.hosts: ["172.16.8.41:9302","172.16.8.42:9302","172.16.8.43:9302"]
7.JVM 配置
由于 Elasticsearch 是 Java 开发的,所以可以通过/etc/elasticsearch/jvm.options
配置文件来设定 JVM 的相关设定。如果没有特殊需求按默认即可。
不过其中还是有两项最重要的-Xmx1g
与-Xms1g
JVM 的最大最小内存。如果太小会导致 Elasticsearch 刚刚启动就立刻停止。太大会拖慢系统本身。
vim /etc/elasticsearch/jvm.options -Xms1g # JVM 最大、最小使用内存 -Xmx1g
8.使用 ROOT 账户执行以下命令
elasticsearch 的相关配置已经完成,下面需要启动 elasticsearch 集群。但是由于安全的考虑,elasticsearch 不允许使用 root 用户来启动,所以需要创建一个新的用户,并为这个账户赋予相应的权限来启动 elasticsearch 集群。
创建 ES 运行用户
# 创建用户组 groupadd es # 创建用户并添加至用户组 useradd es -g es # 更改用户密码(输入 123123) passwd es
修改 ES 目录权限
chown -R es:es /etc/share/elasticsearch/ chown -R es:es /usr/share/elasticsearch/ chown -R es:es /var/log/elasticsearch/ # 以上操作都是为了赋予 es 用户操作权限
启动服务
# 需切换为 es 用户
su es
# 启动服务(当前的路径为:/usr/share/elasticsearch/)
./bin/elasticsearch
后台运行 ES
可以加入-p 命令 让 es 在后台运行, -p 参数 记录进程 ID 为一个文件
# 设置后台启动
./bin/elasticsearch -p /tmp/elasticsearch-pid -d
结束进程
# 查看运行的 pid cat /tmp/elasticsearch-pid && echo # 结束进程 kill -SIGTERM {pid}
验证一下服务是否正常
curl -i "http://192.168.60.200:9200"
二、安装 head 插件
Elasticsearch Head Plugin:head 插件是一个 ES 集群的 web 前端工具,它提供可视化的页面方便用户查看节点信息,对 ES 进行各种操作,如查询、删除、浏览索引等。
1、安装相关依赖包
(1)安装 head
由于 head 插件本质上还是一个 nodejs 的工程,因此需要安装 node,使用npm来安装依赖的包。(npm 可以理解为 maven)
wget https://nodejs.org/dist/v9.3.0/node-v9.3.0-linux-x64.tar.xz # 下载 nodejs 最新的 bin 包
xz -d node-v9.3.0-linux-x64.tar.xz # 解压包
tar -xf node-v9.3.0-linux-x64.tar # 解压包
ln -s ~/node-v9.3.0-linux-x64/bin/node /usr/bin/node # 部署 bin 文件,先确定 nodejs 的 bin 路径
ln -s ~/node-v9.3.0-linux-x64/bin/npm /usr/bin/npm
测试:
node -v
npm
npm 加速 全局安装 cnpm 指定来源淘宝镜像
npm install -g cnpm –registry=https://registry.npm.taobao.org
(2)安装 grunt(安装完 elasticsearch-head 后安装)
grunt 是一个很方便的构建工具,可以进行打包压缩、测试、执行等等的工作,5.0 里的 head 插件就是通过 grunt 启动的。因此需要安装一下 grunt:
cd /usr/local/elasticsearch-head
npm install -g grunt-cli //执行后会生成 node_modules 文件夹
npm install
注:
(1)5.0 以上,elasticsearch-head 不能放在elasticsearch的 plugins、modules 目录下,否则 elasticsearch 启动会报错。
(2)这里如果 grunt 没有安装成功也无所谓,可以通过其他方式启动 elasticsearch-head 插件(npm run start)。
2、安装 elasticsearch-head
另外:5.0 以前的版本可以通过 elasticseach 自带的plugin命令 安装 elasticsearch-head,5.0 以后不支持了。只可以去下载 elasticsearch-head 对应的源码包去安装。
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
配置:
vi _site/app.js # 修改 this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://localhost:9200"; # 在文件的 4354 行附近 # 这里的 localhost 是指进入 elasticsearch-head 页面时默认访问的 ES 集群地址,把她修改为其中一台 ES 节点的地址即可 this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://192.168.60.200:9200";
还要修改 Head 主目录下的 Gruntfile.js,由于默认文件中是没有 hostname 属性的,我们需要手动添加:
为什么需要修改配置文件:
head 插件连接 elasticsearch 需要注意的点:
因为 head 插件是一个独立进程,启动后是一个独立的服务器外加端口,比如我的虚拟机 ip 地址:http://192.168.0.111:9100/
而 elasticsearch 启动后也是一个独立的进程,ip 地址:http://192.168.0.111:9200/
这样两个独立进程,虽然服务器 ip 地址相同,但是端口不同,此时会发生跨域的情况。。
于是官方给出这样一段话,我们在对 elasticsearch 启动的时候追加两个配置文件属性即可防止跨域。
即:在 elasticsearch.yml 文件的最后,添加如下内容:
http.cors.enabled: true
http.cors.allow-origin: "*"
配置完毕。
3、启动 elasticsearch 集群
在三台机器上,分别启动 elasticsearch 即可。
./bin/elasticsearch
4、启动 elasticsearch-head
cd /usr/local/elasticsearch-head //先跳转到 head 目录下
grunt server //若想在后台运行,结尾追加“&”,也可以使用 npm run start 启动
5、访问 elasticsearch-head 界面
http://192.168.60.200:9100
可以看到,三台机器组成了 es 集群。集群的状态为绿色,健康状态。带星标的节点 els-node1 为主节点(选举)。还可以做一些增加/删除索引,查询等操作。
下面还有 ik 分词器的安装,未完待续。。。
参考文档:
https://mp.weixin.qq.com/s/eyfApIiDeg3qv-BD9hBNvw
https://my.oschina.net/u/2403594/blog/2992908
https://my.oschina.net/linch/blog/1816712
https://blog.csdn.net/qq_29860591/article/details/120073353
来源:https://www.cnblogs.com/tianyiliang/p/10291305.html