/ 前言 /
ElasticSearch作为一个分布式搜索引擎有着广泛的应用场景, 而搜索服务在在一个项目中的权重还是比较高的, 所以我们要想办法去提高搜索服务的可用性, 这就是ElasticSearch集群的作用, 为搜索服务提供高可用
的特性
何为高可用呢, 其实就是字面意思, 假设我们的搜索服务可以一直不停的提供服务, 那么高可用性就是100%, 如果一周之内停机了30分钟, 那可用性就是99.7%
本文主要包含以下内容
ElasticSearch的信息存储机制 |
---|
ElasticSearch的节点类型 |
ElasticSearch启动常见异常及解决方案 |
如何搭建ElasticSearch集群 |
如何关闭ElasticSearch服务(附Shell脚本) |
/ 1 / 了解ElasticSearch
1 . 1 ElasticSearch版本的事情
这里我们重点关注7.x版本, 这个版本有俩个事情需要知道
- 内置JDK(根据ES版本内置不同版本的JDK), 如7.7内置的就是JDK13
- Security功能免费使用, 但是高级安全功能任然需要付费
1 . 2 集群如何保证数据不会丢失(信息存储机制)
我们知道宕机是无法避免的, 我们只能减小因宕机而造成的损失, 那么ElasticSearch集群是如何避免的呢?
我们需要先了解俩个概念, 分片(Shard)和副本(Replica)
- 分片(Shard) : 我们知道ElasticSearch中会存在多个数据库, 每个数据库会生成5(默认)个分片, 数据存储在分片中, ElasticSearch会将分片均匀的分布在进群中, 避免一台主机宕机后数据无法访问
- 副本(Replica) : 每个分片同时会生成一个副本, 副本的内容同分片一致, 分片和副本几乎不会被分配在同一台主机, 这样做是为了防止分片所在的主机和数据库所在的主机同时宕机后导致这部分数据无法访问
总结来说就是ElasticSearch会为当前的数据库默认生成5个分片和5个副本, 副本是分片中数据的备份, ElasticSearch会将其尽可能的均匀分布开来, 分片和对应的副本尽量不会分配到同一台主机, 这样就可以保证即使有一台主机突然宕机了我还可以用过分片或者副本将数据还原
1 . 3 集群中的节点
主节点(Master)
:主
这个概念大家应该不陌生了, 它就相当于管理者, 负责管理集群, 分片和副本的分配也是它负责的, 没了管理者的后果是什么啊, 那就是分裂山头, 各自为王, 你不搭理我我不搭理你, 所以主节点非常重要, 一般都会有替补, 因为我们上面已经说过了, 宕机是不可避免的, 我们能做的只有尽量避免因宕机而造成的损失数据节点(Data)
: 存储数据的节点, 负责数据的增删改查, 对内存及磁盘要求较高, 一般数据节点在集群中的占比最高路由/负载节点(client)
: 负责搜索请求的分发, 协调节点将请求转发到保存数据的数据节点, 并将结果返回给路由节点, 减缓数据节点的压力, 一般在大型集群中可以看到 . 如果当前节点既不是主节点也不是数据节点, 那么就会成为路由节点- 部落节点(tribe) : 在7.x中被删除, 负责协调多个ES集群, 充当联络官, 会将所有集群合并为全局集群, 可以对全局集群中单独的节点执行本地读写操作, 但是无法操作全局集群中重复的索引
提取节点(Ingest)
: 负责对文档进行预处理操作, 例如进行数据转换, 将String转换为日期或是将整数/浮点数转换为字符串 . 默认情况下, 所有节点都支持提取功能
如何进行节点的配置
- 一个节点 : 当前节点既是主节点也是数据节点
- 3 - 5个节点 : 通常为所有节点都是数据存储节点, 并全部设置为主节点, 让集群自动选举. 也可以根据数据量和请求流量来进行拆分为单独的主节点及数据节点. 并且为了防止发生脑裂, 主节点数量必须>=((节点数量/2) + 1)
- 6 - n : 拆分独立的主节点、数据节点、路由节点, 并且要保证主节点的数量, 防止发生脑裂
/ 2 / 搭建ElasticSearch集群
2 . 1 搭建前准备
-
准备主机
192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.4 192.168.0.5
-
主机之间相互可以ping通
-
建议关闭所有主机的防火墙, 或者打开9200及9300的端口
-
ElasticSearch7.x以下版本需要准备JDK, 并且版本必须跟ElasticSearch对应
2 . 2 安装ElasticSearch
ElasticSearch官方下载地址
-
下载安装包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.7.0-linux-x86_64.tar.gz
-
解压安装包
# /opt是你指定的安装目录 tar -xf elasticsearch-7.7.0-linux-x86_64.tar.gz -C /opt
-
建立软链接
# /elasticsearch是指定的软连接目录,可以为空,在建立软连接是自动创建 ln -s /opt/elasticsearch-7.7.0 /opt/elasticsearch
软连接建立失败的话
elasticsearch
文件夹是红色, 建立成功是蓝色的
2 . 3 修改配置文件
elasticsearch.yml
# 集群名称
cluster.name: es-cluster
# 节点名称,注意:同一集群内节点名称不能相同
node.name: "node-1"
# 当前节点是否是主节点
node.master: true
# 当前节点是否是数据节点
node.data: true
# 是否禁用提取节点
node.ingest: false
# 一台主机能运行的节点最大数量
node.max_local_storage_nodes: 1
# 集群中符合主节点条件的节点数量, 数量为(节点数量 / 2 + 1)
discovery.zen.minimum_master_nodes: 2
# 集群自举配置, 只在首次启动集群时游泳, 集群初始化时会读取该参数去寻找符合主节点条件的节点的主机名或 IP 地址
cluster.initial_master_nodes: ["node-1","node-2"]
#cluster.initial_master_nodes: ["192.168.0.1","192.168.232.137"]
# 绑定的ip地址,当前主机的ip地址
network.bind_host: 192.168.0.1
# 节点交互的端口,注意该端口仅负责节点之间交互,无法直接访问
transport.tcp.port: 9300
# 对外服务的端口,可以根据该端口查看当前节点状态和集群状态
http.port: 9200
# 是否允许跨域
http.cors.enabled: true
# 允许跨域的地址
http.cors.allow-origin: "http://192.168.0.1:8080"
# 集群中其它节点与当前节点通信的ip地址,可以设置为当前主机ip,也可根据实际情况设置
network.publish_host: 192.168.0.1
# 设置为当前主机ip不允许外网访问,想要允许外网访问可以设置为0.0.0.0
network.host: 192.168.0.1
# 所有的主节点列表, 用于被集群发现
discovery.zen.ping.unicast.hosts: ["192.168.0.1:9300","192.168.0.2:9300"]
不同的主机修改node.name
、network.host
、network.bind_host
即可
2 . 4 启动ElasticSearch
ElasticSearch从5.0版本开始就不允许再使用root用户启动服务了, 所以我们需要为单独创建一个用户用来启动ES
# 创建用户,除了root用户外,其余用户都可以存放在/home下
useradd -d /home/es es
# 赋予用户权限
chmod -R es /opt/elasticsearch
启动ElasticSearch
cd elasticsearch
# 切换为ES启动用户
su es
# 日志打印在终端中
./bin/elasticsearch
# 后台启动
./bin/elasticsearch -d
# 后台启动并将日志打印到文件中
nohup ./bin/elasticsearch -d &
启动时会输出一条日志, 无需理会
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
验证是否启动
curl 192.168.0.1:9200
{
"name" : "node-1",
"cluster_name" : "es-cluster",
"cluster_uuid" : "ijsTRA5iSPiS84B91-skwQ",
"version" : {
"number" : "7.4.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
"build_date" : "2019-10-28T20:40:44.881551Z",
"build_snapshot" : false,
"lucene_version" : "8.2.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
当返回数据中cluster_uuid
有值就代表着集群已经启动了
ElasticSearch常见启动异常及解决方案请看我的另一篇博文
ElasticSearch常见启动异常及解决方案
查看集群状态,数据太多了我们就只展示一部分
curl 192.168.0.1:9200/_cluster/state?pretty
{
"cluster_name" : "es-cluster",
"cluster_uuid" : "ijsTRA5iSPiS84B91-skwQ",
"version" : 23,
"state_uuid" : "BBECx15qS5iEV8TQ36Lb4Q",
# 主节点的uuid,我们可以看到当前主节点是node-2
"master_node" : "jj2lwwPTT_-RC6Hj6Hv5Ww",
"blocks" : { },
# 集群的全部节点
"nodes" : {
"jj2lwwPTT_-RC6Hj6Hv5Ww" : {
"name" : "node-2",
"ephemeral_id" : "F_pgnQRYS_2W7CR3f-L0BQ",
"transport_address" : "192.168.232.137:9310",
"attributes" : {
"ml.machine_memory" : "1019826176",
"ml.max_open_jobs" : "20",
"xpack.installed" : "true"
}
},
"KfUN9MUtTGCM8qMpsWX-Zw" : {
"name" : "node-1",
"ephemeral_id" : "mjcI-PyqRnukT15-KfxVLg",
"transport_address" : "192.168.232.136:9310",
"attributes" : {
"ml.machine_memory" : "1019826176",
"ml.max_open_jobs" : "20",
"xpack.installed" : "true"
}
}
},
"metadata" : {
"cluster_uuid" : "ijsTRA5iSPiS84B91-skwQ",
"cluster_coordination" : {
"term" : 2,
"last_committed_config" : [
"jj2lwwPTT_-RC6Hj6Hv5Ww"
],
"last_accepted_config" : [
"jj2lwwPTT_-RC6Hj6Hv5Ww"
],
"voting_config_exclusions" : [ ]
},
...
}
...
}
/ 3 / 关闭ElasticSearch
ElasticSearch的关闭只能通过kill命令来杀掉ES的进程
ps -ef|grep elasticsearch
kill -9 12311
为大家提供一个Shell脚本来实现关闭ES
PID=$(ps -ef|grep elasticsearch|grep -v grep|awk '{print $2}')
if [ -z $PID ]; then
echo "process elasticsearch not exist"
exit
else
echo "process id: $PID"
kill -9 ${PID}
echo "process elasticsearch killed"
fi
[es@node-1 opt]$ sh kill.sh
process id: 9292
process elasticsearch killed
参考文章 :
ElasticSearch官方文档