ElasticSearch 7.6.1 环境搭建

博文目录


ElasticSearch 单机环境安装

创建普通用户

ES不能使用root用户来启动,必须使用普通用户来安装启动(root启动后, log文件被改成root用户了, 然后启动时会报一个 java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender 这样的异常, 把log清空重新用非root用户启动即可)。这里我们创建一个普通用户以及定义一些常规目录用于存放我们的数据文件以及安装包等

# 1)创建 elasticsearch 用户组
[root@localhost ~]# groupadd elasticsearch
		
# 2)创建用户 es 并添加到 elasticsearch 用户组, 然后设置密码, 密码要求8位至少
[root@localhost ~]# useradd es -g elasticsearch
[root@localhost ~]# passwd es

# 3)设置sudo权限, 为了让普通用户有更大的操作权限,我们一般都会给普通用户设置sudo权限,方便普通用户的操作
[root@localhost ~]# visudo

# 在root ALL=(ALL) ALL 一行下面
# 添加es用户 如下:
es ALL=(ALL) ALL
			 
# 添加成功保存后切换到es用户操作
[root@localhost ~]# su es
[es@localhost root]$

上传压缩包并解压, 所有者设置为es用户

使用用户es将es的安装包下载并上传到服务器某路径下,然后进行解压

# 切换到es用户
su es
// 解压Elasticsearch到/application下, -C 是 tar 的参数, 代表 change
tar -zxf elasticsearch-7.6.1-linux-x86_64.tar.gz -C /application

# 并修改owner为es用户
[root@localhost ~]# chown -R es /application/elasticsearch-7.6.1

修改配置文件

elasticsearch.yml

cd /application/elasticsearch-7.6.1
mkdir log
mkdir data
cd config
rm -rf elasticsearch.yml # ???????
vim elasticsearch.yml
cluster.name: elasticsearch
node.name: node-1
path.data: /application/elasticsearch-7.6.1/data
path.logs: /application/elasticsearch-7.6.1/log
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["192.168.2.134"]
cluster.initial_master_nodes: ["node-1"]
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
http.cors.enabled: true
http.cors.allow-origin: "*"
详细配置信息参考(ES7之前的旧版本的配置)
cluster.name: elasticsearch
# 配置的集群名称,默认是elasticsearch,es服务会通过广播方式自动连接在同一网段下的es服务,通过多播方式进行通信,同一网段下可以有多个集群,通过集群名称这个属性来区分不同的集群。

node.name: "Franz Kafka"
# 当前配置所在机器的节点名,你不设置就默认随机指定一个name列表中名字,该name列表在es的jar包中config文件夹里name.txt文件中,其中有很多作者添加的有趣名字。

node.master: true
指定该节点是否有资格被选举成为node(注意这里只是设置成有资格, 不代表该node一定就是master),默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master。

node.data: true
# 指定该节点是否存储索引数据,默认为true。

index.number_of_shards: 5
# 设置默认索引分片个数,默认为5片。

index.number_of_replicas: 1
# 设置默认索引副本个数,默认为1个副本。如果采用默认设置,而你集群只配置了一台机器,那么集群的健康度为yellow,也就是所有的数据都是可用的,但是某些复制没有被分配
# (健康度可用 curl 'localhost:9200/_cat/health?v' 查看, 分为绿色、黄色或红色。绿色代表一切正常,集群功能齐全,黄色意味着所有的数据都是可用的,但是某些复制没有被分配,红色则代表因为某些原因,某些数据不可用)。

path.conf: /path/to/conf
# 设置配置文件的存储路径,默认是es根目录下的config文件夹。

path.data: /path/to/data
# 设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径,用逗号隔开,例:
# path.data: /path/to/data1,/path/to/data2

path.work: /path/to/work
# 设置临时文件的存储路径,默认是es根目录下的work文件夹。

path.logs: /path/to/logs
# 设置日志文件的存储路径,默认是es根目录下的logs文件夹 

path.plugins: /path/to/plugins
# 设置插件的存放路径,默认是es根目录下的plugins文件夹, 插件在es里面普遍使用,用来增强原系统核心功能。

bootstrap.mlockall: true
# 设置为true来锁住内存不进行swapping。因为当jvm开始swapping时es的效率 会降低,所以要保证它不swap,可以把ES_MIN_MEM和ES_MAX_MEM两个环境变量设置成同一个值,并且保证机器有足够的内存分配给es。 同时也要允许elasticsearch的进程可以锁住内# # 存,linux下启动es之前可以通过`ulimit -l unlimited`命令设置。

network.bind_host: 192.168.0.1
# 设置绑定的ip地址,可以是ipv4或ipv6的,默认为0.0.0.0,绑定这台机器的任何一个ip。

network.publish_host: 192.168.0.1
# 设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址。

network.host: 192.168.0.1
# 这个参数是用来同时设置bind_host和publish_host上面两个参数。

transport.tcp.port: 9300
# 设置节点之间交互的tcp端口,默认是9300。

transport.tcp.compress: true
# 设置是否压缩tcp传输时的数据,默认为false,不压缩。

http.port: 9200
# 设置对外服务的http端口,默认为9200。

http.max_content_length: 100mb
# 设置内容的最大容量,默认100mb

http.enabled: false
# 是否使用http协议对外提供服务,默认为true,开启。

gateway.type: local
# gateway的类型,默认为local即为本地文件系统,可以设置为本地文件系统,分布式文件系统,hadoop的HDFS,和amazon的s3服务器等。

gateway.recover_after_nodes: 1
# 设置集群中N个节点启动时进行数据恢复,默认为1。

gateway.recover_after_time: 5m
# 设置初始化数据恢复进程的超时时间,默认是5分钟。

gateway.expected_nodes: 2
# 设置这个集群中节点的数量,默认为2,一旦这N个节点启动,就会立即进行数据恢复。

cluster.routing.allocation.node_initial_primaries_recoveries: 4
# 初始化数据恢复时,并发恢复线程的个数,默认为4。

cluster.routing.allocation.node_concurrent_recoveries: 2
# 添加删除节点或负载均衡时并发恢复线程的个数,默认为4。

indices.recovery.max_size_per_sec: 0
# 设置数据恢复时限制的带宽,如入100mb,默认为0,即无限制。

indices.recovery.concurrent_streams: 5
# 设置这个参数来限制从其它分片恢复数据时最大同时打开并发流的个数,默认为5。

discovery.zen.minimum_master_nodes: 1
# 设置这个参数来保证集群中的节点可以知道其它N个有master资格的节点。默认为1,对于大的集群来说,可以设置大一点的值(2-4)
# 7中已经没有 discovery.zen 开头的配置了, 一些被删除, 一些被改名

discovery.zen.ping.timeout: 3s
# 设置集群中自动发现其它节点时ping连接超时时间,默认为3秒,对于比较差的网络环境可以高点的值来防止自动发现时出错。

discovery.zen.ping.multicast.enabled: false
# 设置是否打开多播发现节点,默认是true。

discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "host3[portX-portY]"]
# 设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点。

elasticsearch7版本引入的新集群协调子系统, 新增两个如下配置项 discovery 和 cluster,以便群集中的节点可以相互发现并选择主节点。

#设置提供群集中其他节点的列表,这些节点符合主要条件且可能是实时且可联系的,以便为发现过程设定种子。 此设置通常应包含群集中所有符合主节点的节点的地址。 此设置包含主机数组或逗号分隔的字符串。 每个值应采用host:port或host的形式
discovery.seed_hosts

#当您第一次启动全新的Elasticsearch集群时,会出现一个集群引导步骤,该步骤确定在第一次选举中计票的主要合格节点集因此当您在生产模式下启动全新集群时,必须明确列出符合条件的节点的名称或IP地址,这些节点的投票应在第一次选举中计算 集群中第一个主节点启动 许设置此项
# 你可以通过为 cluster.initial_master_nodes 参数设置一系列符合主节点条件的节点的主机名或 IP 地址来引导启动集群。你可以在命令行或 elasticsearch.yml 中提供这些信息。你还需要配置发现子系统,这样节点就知道如何找到彼此。
cluster.initial_master_nodes

ES6.0.0官方参考指南翻译 模块-网络设置

jvm.option

修改jvm.option配置文件,调整jvm堆内存大小

vim jvm.options
-Xms2g
-Xmx2g

修改系统配置,解决启动时候的问题

启动失败, 内容如下

[es@mrathena bin]$ ./elasticsearch -d
future versions of Elasticsearch will require Java 11; your Java version from [/application/jdk-1.8.0.202/jre] does not meet this requirement
[es@mrathena bin]$ ERROR: [2] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
ERROR: Elasticsearch did not exit normally - check the logs at /application/elasticsearch-7.6.1/log/elasticsearch.log

由于现在使用普通用户来安装es服务,且es服务对服务器的资源要求比较多,包括内存大小,线程数等。所以我们需要给普通用户解开资源的束缚

修改完后需要重新连接 xshell 生效

JDK 版本不匹配

future versions of Elasticsearch will require Java 11; your Java version from [/application/jdk-1.8.0.202/jre] does not meet this requirement

提示未来版本的ElasticSearch将需要Java11, 当前版本是向下兼容的, 可以暂时不管, 也可以安装jdk11, 也可以将JAVA_HOME配置到es自带的的jdk目录

普通用户打开文件的最大数限制

错误信息描述:max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]

ES因为需要大量的创建索引文件,需要大量的打开系统的文件,所以我们需要解除linux系统当中打开文件最大数目的限制,不然ES启动就会抛错

sudo vim /etc/security/limits.conf
# 添加如下内容: 注意*不要去掉
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

# 第一列表示用户和组(@开头), *号表示全部用户。第二列表示软限制还是硬限制,第三列表示限制的资源类型,第四列表示限制的最大值
# hard和soft的区别: soft是一个警告值,而hard则是一个真正意义的阀值,超过就会报错,一般情况下都是设为同一个值。
# core是内核文件,nofile是文件描述符,noproc是进程,一般情况下只限制文件描述符数和进程数就够了
普通用户启动线程数限制

错误信息描述:max number of threads [1024] for user [es] likely too low, increase to at least [4096]

无法创建本地线程问题, 用户最大可创建线程数太小, 需要修改 90-nproc.conf 配置文件。

// Centos6
sudo vi /etc/security/limits.d/90-nproc.conf
// Centos7
sudo vi /etc/security/limits.d/20-nproc.conf
* soft nproc 1024 # 修改为
* soft nproc 4096
普通用户调大虚拟内存

错误信息描述:max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

最大虚拟内存太小, 需调大系统的虚拟内存

每次启动机器都手动执行下???

sudo vim /etc/sysctl.conf
# 追加以下内容
vm.max_map_count=262144

# 保存然后执行
sudo sysctl -p

启动ES服务

使用es用户启动

  • 前台启动: bin/elasticsearch, 通过 ctrl+c 停止
  • 后台启动: ./elasticsearch -d, 通过 kill -9 主进程id停止

启动成功之后在 http://192.168.2.134:9200 可查看信息如下

{
  "name" : "node-1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "xVnaHPbOSQqYRNvMoMSxew",
  "version" : {
    "number" : "7.6.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "aa751e09be0a5072e8570670309b1f12348f023b",
    "build_date" : "2020-02-29T00:15:25.529771Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

注意:如果有机器服务启动失败,可以到log日志查看原因

防火墙

关闭Linux防火墙
永久性生效,重启后不会复原
开启: chkconfig iptables on
关闭: chkconfig iptables off
即时生效,重启后复原
开启: service iptables start
关闭: service iptables stop

客户端 Kibana 安装

客户端可以分为图形界面客户端,和代码客户端

ES主流客户端Kibana,开放9200端口与图形界面客户端交互

tar -zxf kibana-7.6.1-linux-x86_64.tar.gz -C /application/
mv kibana-7.6.1-linux-x86_64/ kibana-7.6.1
cd kibana-7.6.1/config
vim kibana.yml
server.port: 5601
server.host: "192.168.2.134"
elasticsearch.hosts: ["http://192.168.2.134:9200"]  # 这里是elasticsearch的访问地址

启动
Kibana同样不能使用root用户启动, 除非添加 --allow-root 参数, 建议同样使用es用户操作就好了

  • 后台启动: nohup ./kibana &
  • 前台启动: /application/kibana-7.6.1/bin/kibana

访问

  • http://192.168.2.134:5601/app/kibana

首次进入时可选是否进入引导
在这里插入图片描述

安装 IK 分词器

Elasticsearch对中文分词不太友好,所以需要单独安装IK分词器插件

https://github.com/medcl/elasticsearch-analysis-ik/releases

cp elasticsearch-analysis-ik-7.6.1.zip /application/elasticsearch-7.6.1/plugins/ik/
cd /application/elasticsearch-7.6.1/plugins/ik
unzip elasticsearch-analysis-ik-7.6.1.zip

重启Elasticsearch

在kibana中测试分词效果(左侧 Dev Tools 工具)

// 使用es默认分词器
POST _analyze
{
	"analyzer":"standard",
	"text":"中华人民共和国"
}

// 使用ik分词器
POST _analyze
{
	"analyzer": "ik_smart",
	"text": "中华人民共和国"
 }
# ik_smart:会做最粗粒度的拆分

// 使用ik分词器
POST _analyze
{
	"analyzer":"ik_max_word",
	"text":"中华人民共和国"
}
#ik_max_word:会将文本做最细粒度的拆分

指定IK分词器作为默认分词器

ES的默认分词设置是standard,这个在中文分词时就比较尴尬了,会单字拆分,比如“清华大学”,会按 “清”,“华”,“大”,“学” 去分词,然后搜出来的都是些 “清清的河水”,“中华儿女”,“地大物博”,“学而不思则罔” 之类的莫名其妙的结果,这里我们要是用ik分词器做中文分词,有两种模式: ik_smart 和 ik_max_word 。

  • ik_smart会将 “清华大学” 整个分为一个词
  • ik_max_word 会将 “清华大学” 分为 “清华大学” ,“清华” 和 “大学”

修改默认分词方法(这里修改school_index索引的默认分词为:ik_max_word):

PUT /school_index
{
	"settings" : {
		"index" : {
			"analysis.analyzer.default.type": "ik_max_word"
		}
	}
}

ElasticSearch 集群环境安装

拷贝两份之前配置好的虚拟机, 清空 log 和 data 目录, 并修改3个节点的 elasticsearch.yml 配置文件中的如下参数

cluster.name: elasticsearch
node.name: 分别是 node-1, node-2, node-3
path.data: /usr/local/es/elasticsearch-7.6.1/data
path.logs: /usr/local/es/elasticsearch-7.6.1/log
network.host: 分别是 192.68.2.134, 192.68.2.135, 192.68.2.136
http.port: 9200
discovery.seed_hosts: ["192.68.2.134", "192.68.2.135", "192.68.2.136"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
http.cors.enabled: true
http.cors.allow-origin: "*"

查看集群状态:

GET _cat/nodes?v
GET _cat/health?v
GET方式访问 http://192.68.2.134:9200/_cat/health?v
GET方式访问 http://192.68.2.134:9200/_cat/nodes?v
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.2.134            7          94  31    0.02    0.12     0.11 dilm      *      node-1
192.168.2.136            7          73   2    0.03    0.19     0.13 dilm      -      node-3
192.168.2.135            8          73   3    0.01    0.10     0.07 dilm      -      node-2
epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1615040488 14:21:28  elasticsearch green           3         3      8   4    0    0        0             0                  -                100.0%

ElasticSearch-head 集群管理插件

ElasticSearch基础介绍:4:可视化工具之elasticsearch-head
ElasticSearch基础介绍:5:可视化工具之cerebro

Chrome插件方式, 简单便捷
安装地址:地址
在这里插入图片描述
上面的是4个index, 我们关注其中的es索引库

当前是默认的1分区1备份, 0代表0号分区(第一个分区), 粗线框代表主分区在节点1上, 细线框代表备份分区在节点2上

下面试试3分区1备份, 012共3个主分区分布在3个节点上, 其备份分区分布在其他节点上, 比较均匀
在这里插入图片描述
试试6分区2备份
在这里插入图片描述

集群健康状态 green, yellow, red

green:每个索引的primary shard和replica shard都是active状态的
yellow:每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态
red:不是所有索引的primary shard都是active状态的,部分索引有数据丢失了

集群什么情况会处于一个yellow状态?

假设现在就一台linux服务器,就启动了一个es进程,相当于就只有一个node。现在es中有一个index,就是kibana自己内置建立的index。由于默认的配置是给每个index分配1个primary shard和1个replica shard,而且primary shard和replica shard不能在同一台机器上(为了容错)。现在kibana自己建立的index是1个primary shard和1个replica shard。当前就一个node,所以只有1个primary shard被分配了和启动了,但是一个replica shard没有第二台机器去启动。

测试:启动第二个es进程,就会在es集群中有2个node,然后那1个replica shard就会自动分配过去,然后cluster status就会变成green状态。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值