Elasticsearch基础(一)- 环境搭建

目录

1、单节点部署

来自大佬的一文读懂elasticsearch:https://zhuanlan.zhihu.com/p/62892586

Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:

分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。 实时分析的分布式搜索引擎。 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。

lucene:就是一个jar包,里面包含了封装好的各种建立倒排索引,以及进行搜索的代码,包括各种算法

1. 解压

官网:https://www.elastic.co/

下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch

tar xf /opt/src/elasticsearch-8.2.0-linux-x86_64.tar.gz -C /opt/
mv elasticsearch-8.2.0/ elasticsearch

2. 添加es用户并修改es服务权限

useradd es

chown -R es:es /opt/elasticsearch

1)修改系统vm.max_map_count

es至少需要的内存权限为:262144,默认用户的内存权限为:65530

# 查看用户内存权限
sysctl -a|grep vm.max_map_count

# 设置用户内存权限
vim /etc/sysctl.conf
# 禁止内存与硬盘交换
vm.swappiness=1
# 设置虚拟内存大小,Elasticsearch使用了 NioFs(非阻塞文件系统)和 MMapFs(内存映射文件系统)。
# 配置最大映射数量,以便有足够的虚拟内存可用于mmapped文件
vm.max_map_count=262144

# 是配置生效
sysctl -p

2)修改打开文件数

默认打开文件描述符为4096,es至少需要65535

vim /etc/security/limits.conf
# 追加一下内容(es是用户,也可以使用*代替所有用户)
es soft nofile 65536
es hard nofile 65536
# 内存锁定交换
* soft memlock unlimited
* hard memlock unlimited

# 重新登陆用户并查看
[root@k8s-node1 ~]# su es
[es@k8s-node1 elasticsearch]$ 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) 31118
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
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) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[es@k8s-node1 root]$ ulimit -Sn
65536
[es@k8s-node1 root]$ ulimit -Hn
65536
[es@k8s-node1 root]$ 

ulimit -Hn: 是查看max number of open file descriptors的hard限制 ulimit -Sn: 是查看max number of open file descriptors的soft限制

3. 修改配置文件

1)关闭geoip数据库的更新

/opt/elasticsearch/config/elasticsearch.yml中添加如下配置:

ingest.geoip.downloader.enabled: false

没有关闭,在启动时会存在以下错误信息:

[2022-05-07T14:52:09,893][ERROR][o.e.i.g.GeoIpDownloader ] [k8s-node1] exception during geoip databases update java.net.SocketTimeoutException: Connect timed out

这是一个bug,没有关闭geoip数据库的更新导致启动过程出现的错误

2)禁用SSL安全协议

没有关闭ssl访问时会存在一下错误

[2022-05-07T15:01:20,068][WARN ][o.e.x.s.t.n.SecurityNetty4HttpServerTransport] [k8s-node1] http client did not trust this server’s certificate, closing connection Netty4HttpChannel{localAddress=/192.168.6.21:9200, remoteAddress=/192.168.6.1:11447}

这是由于es开启了ssl安全认证,修改配置文件关闭认证即可

xpack.security.http.ssl:enabled 设置成 false

证书配置

改配置是基于集群内部9300通信的,开启了ssl,浏览器访问时还是通过http的方式即可

elasticsearch-certutil ca
elasticsearch-certutil cert --ca elastic-stack-ca.p12

生成的证书文件必须放到config目录下,否则启动报错,无法读取

3)关闭账号登陆认证

修改xpack.security.enabled:false,否则访问时会验证登陆

或者配置账号密码进行访问(推荐)

4)配置账号密码

为了保证服务安全性,建议配置账号密码的方式进行访问

# 配置账号密码前需要修改一下配置
xpack.security.enabled: true
# xpack.license.self_generated.type: basic
#xpack.security.transport.ssl.enabled: true

启动服务

配置密码需要先启动服务

# 配置密码之前需要先启动服务
/opt/elasticsearch/bin/elasticsearch -d

# 查看是否启动成功
netstat -tnlp | grep 9200
tail -f elasticsearch.log 

配置账号密码

执行设置用户名和密码的命令,这里需要为4个用户分别设置密码,elastic, kibana, logstash_system,beats_system

# 交互式配置密码
./bin/elasticsearch-setup-passwords interactive

# 后期想要更改密码
curl -XPOST -u elastic "localhost:9200/_security/user/elastic/_password" -H 'Content-Type: application/json' -d'{"password" : "abcd1234"}'

5)最终的配置文件

path.data: /data/es
path.logs: /data/logs
http.port: 9200

# 集群名
cluster.name: cluster-es
# 节点名
node.name: ${HOSTNAME}-node
# 监听ip
network.host: 192.168.6.22
# 开启x-pack插件,用于添加账号密码
xpack.security.enabled: true
#xpack.license.self_generated.type: trial
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /opt/elasticsearch/config/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /opt/elasticsearch/config/elastic-certificates.p12

transport.port: 9300
discovery.seed_hosts: ["192.168.6.22:9300"]
# 首次启动指定的master节点
cluster.initial_master_nodes: ["192.168.6.22:9300"]

IP和端口根据自己实际的配置

4. 启动

su es
# 启动
/opt/elasticsearch/bin/elasticsearch

# 后台启动
/opt/elasticsearch/bin/elasticsearch -d

1)root用户启动错误

ES不支持root用户启动,会报错:

ERROR: Aborting auto configuration because of config dir ownership mismatch. Config dir is owned by es but auto-configuration directory would be owned by root

5. 测试

默认端口:9200

使用一下命令本地测试,或者浏览器访问

curl -i http://localhost:9200
{
  "name" : "k8s-node1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "wSgiFfiCRiW1NsciEI3zUQ",
  "version" : {
    "number" : "8.2.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "b174af62e8dd9f4ac4d25875e9381ffe2b9282c5",
    "build_date" : "2022-04-20T10:35:10.180408517Z",
    "build_snapshot" : false,
    "lucene_version" : "9.1.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

使用账号密码验证是添加:-u elastic:Gsww_2022即可 curl -i -u elastic:Gsww_2022 http://localhost:9200

6. es实例配置及说明

vim elasticsearch.yml
# 信息如下
cluster.name: es_cluster_single_node_demo
node.name: ${HOSTNAME}-node
path.data: /opt/elasticsearch/data
path.logs: /opt/elasticsearch/logs
network.host: 192.168.6.21
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["192.168.6.21:9300"]
cluster.initial_master_nodes: ["192.168.6.21:9300"]

参数说明:

参数 说明
cluster.name 集群名称,同一ES集群名称必须相同;
node.name 集群中当前节点名称。建议命名较高区分度,如:当前节点hostname,hostip等
path.data ES实例存放数据目录;注:建议生产环境数据目录与应用程序隔离
path.logs ES实例存放日志目录;注:建议生产环境数据目录与应用程序隔离
network.host 当前实例绑定的ip地址,注:如未绑定则无法通过ip地址访问
http.port: ES实例对外提供REST服务的端口,默认9200
transport.port ES实例内部通信端口,默认9300
discovery.seed_hosts 数组形式存储ES集群节点信息,多个以逗号分隔
cluster.initial_master_nodes ES集群启动时,引导默认的master节点,注:仅在集群第一次启动时候此配置有效。

7. 配置es堆内存大小 jvm.options

vim ./config/jvm.options
-Xms2g
-Xmx2g

如何配置:

堆内存大小 = Min(机器内存/2, 32GB) ;

即:取当前环境内存的一半和32GB内存中最小值。但最大配置尽量不等于32G,略小于32G;

2、集群环境搭建-单机群多实例

1. 环境规划

IP 主机名 配置
192.168.6.20 k8s-master1 4U4C及以上
192.168.6.21 k8s-node1 4U4C及以上
192.168.6.22 k8s-node2 4U4C及以上

2. 每台主机上进行部署

根据以上单节点方式部署即可

3. 修改配置

vim /opt/elasticsearch/config/elasticsearch.yml
# ====== 集群信息实例如下 ======
cluster.name: es_cluster_single_node_demo
node.name: ${HOSTNAME}-node
path.data: /opt/elasticsearch/data
path.logs: /opt/elasticsearch/logs
network.host: 192.168.6.21
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["192.168.6.20:9300", "192.168.6.21:9300", "192.168.6.22:9300"]
cluster.initial_master_nodes: ["192.168.6.21:9300"]

network.host 配置项请根据实际节点ip地址配置,其他配置项,节点中配置均相同.

4. jvm配置为本机内存一半

vim /opt/elasticsearch/config/jvm.options
-Xms2g
-Xmx2g

5. 启动并验证

/opt/elasticsearch/bin/elasticsearch -d

浏览器分别访问每个ES,验证启动,并查看启动日志

es集群启动时打印的日志文件是:集群名称.log

http://192.168.6.21:9200/_cat/nodes

3、ES基础安全配置

缺省的es没有任何用户认证,容易被安全软件扫描到,判定为违规,所以为了满足使用要求,给es加上基本的安全防护。

基本的用户密码验证启动后,访问es就需要用户密码了,用浏览器访问会弹框,要求输入用户密码,用api访问,则需要设置BasicAuthentication。

要实现基础安全验证需要两个条件:

(1)启用内置用户安全验证(es内置了几个用户,但没有设置密码,没有生效),

(2)集群的节点之间必须采用加密通信,即:TLS/SSL。(免费开源版本的要求)

修改配置文件,开启安全认证:

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

1. 配置加密认证

生成es ca证书

生成的文件默认放在:/opt/elasticsearch/,也就是bin目录的上级目录下

# 生成CA证书,需要输入用户名和密码,也可不输入直接回车。(Geray/Geray_2022)
# 如果指定了用户名和密码,则产生的文件是用户名
/opt/elasticsearch/bin/elasticsearch-certutil ca

# 使用第一步生成的证书,生成p12密钥,需要输入密码的时候也可以直接回车不输入
/opt/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

会在bin目录的上级目录下生成两个文件:

elastic-stack-ca.p12

elastic-certificates.p12

备份原来证书文件,将新签发的复制过去

mv /opt/elasticsearch/config/certs /opt/elasticsearch/config/certs-bak
mkdir /opt/elasticsearch/config/certs

mv mv elastic-* config/certs

修改配置文件配置证书

xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/elastic-certificates.p12
  truststore.path: certs/elastic-certificates.p12
xpack.license.self_generated.type: basic
#xpack.security.transport.ssl.keystore.password: Geray_2022
#xpack.security.transport.ssl.truststore.password: Geray_2022

2. 配置用户密码访问

初始化密码需要在es启动的情况下进行设置,按照提示输入各个内置用户的密码。

/opt/elasticsearch/bin/elasticsearch-setup-passwords interactive

部署kibana

kibana和es的版本不能高于es,最好保持统一个版本号

配置文件

logging.dest: /opt/kibana/logs/kibana.log
server.host: "192.168.6.22"
server.port: 5601
i18n.locale: "zh-CN"
# es中设置的kibana账号信息
elasticsearch.hosts: ["http://192.168.6.22:9200"]
elasticsearch.username: "kibana"   
elasticsearch.password: "密码"  
elasticsearch.requestTimeout: 90000

如果你不想将用户ID和密码放在kibana.yml文件中明文配置,可以将它们存储在密钥库中。运行以下命令以创建Kibana密钥库并添加配置:

./bin/kibana-keystore create
./bin/kibana-keystore add elasticsearch.username
./bin/kibana-keystore add elasticsearch.password
# 前台启动
./kibana

# 后台启动
nohup ./kibana &

http://192.168.6.22:5601

# 增
PUT /ecommerce/product/1
{
    "name" : "云南白药牙膏",
    "desc" :  "云南白药牙膏",
    "price" :  30,
    "producer" : "云南白药牙膏",
    "tags": [ "meibai", "fangzhu" ]
}

# 查
GET /ecommerce/product/1

# 删
DELETE /ecommerce/product/1