大家好,又见面了,我是你们的朋友全栈君。
ElasticSearch作为一个分布式搜索引擎有着广泛的应用场景, 而搜索服务在在一个项目中的权重还是比较高的, 所以我们要想办法去提高搜索服务的可用性, 这就是ElasticSearch集群的作用, 为搜索服务提供高可用
的特性
何为高可用呢, 其实就是字面意思, 假设我们的搜索服务可以一直不停的提供服务, 那么高可用性就是100%, 如果一周之内停机了30分钟, 那可用性就是99.7%
本文主要包含以下内容
ElasticSearch的信息存储机制 |
---|
ElasticSearch的节点类型 |
ElasticSearch启动常见异常及解决方案 |
如何搭建ElasticSearch集群 |
如何关闭ElasticSearch服务(附Shell脚本) |
这里我们重点关注7.x版本, 这个版本有俩个事情需要知道
我们知道宕机是无法避免的, 我们只能减小因宕机而造成的损失, 那么ElasticSearch集群是如何避免的呢?
我们需要先了解俩个概念, 分片(Shard)和副本(Replica)
总结来说就是ElasticSearch会为当前的数据库默认生成5个分片和5个副本, 副本是分片中数据的备份, ElasticSearch会将其尽可能的均匀分布开来, 分片和对应的副本尽量不会分配到同一台主机, 这样就可以保证即使有一台主机突然宕机了我还可以用过分片或者副本将数据还原
主节点(Master)
: 主
这个概念大家应该不陌生了, 它就相当于管理者, 负责管理集群, 分片和副本的分配也是它负责的, 没了管理者的后果是什么啊, 那就是分裂山头, 各自为王, 你不搭理我我不搭理你, 所以主节点非常重要, 一般都会有替补, 因为我们上面已经说过了, 宕机是不可避免的, 我们能做的只有尽量避免因宕机而造成的损失数据节点(Data)
: 存储数据的节点, 负责数据的增删改查, 对内存及磁盘要求较高, 一般数据节点在集群中的占比最高路由/负载节点(client)
: 负责搜索请求的分发, 协调节点将请求转发到保存数据的数据节点, 并将结果返回给路由节点, 减缓数据节点的压力, 一般在大型集群中可以看到 . 如果当前节点既不是主节点也不是数据节点, 那么就会成为路由节点提取节点(Ingest)
: 负责对文档进行预处理操作, 例如进行数据转换, 将String转换为日期或是将整数/浮点数转换为字符串 . 默认情况下, 所有节点都支持提取功能如何进行节点的配置
准备主机
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对应
下载安装包
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
文件夹是红色, 建立成功是蓝色的
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
即可
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常见启动异常及解决方案请看我的另一篇博文
查看集群状态,数据太多了我们就只展示一部分
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" : [ ]
},
...
}
...
}
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
参考文章 :
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/182460.html原文链接:https://javaforall.cn