入坑第一难:搭建ElasticSearch,Kibana

395 阅读7分钟

1.使用docker安装

1.1 docker安装ElasticSearch

  1. 拉取镜像
docker pull elasticsearch:7.7.0
  1. 启动镜像
docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" -p 9200:9200 -p 9300:9300 --restart=true elasticsearch:7.7.0

访问访问localhost:9200 出现以下内容表示安装成功。

{
  "name" : "ece13c2201ae",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "PyT_-BOASeCwRolhP3I39A",
  "version" : {
    "number" : "7.7.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "81a1e9eda8e6183f5237786246f6dced26a10eaf",
    "build_date" : "2020-05-12T02:01:37.602180Z",
    "build_snapshot" : false,
    "lucene_version" : "8.5.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

1.2 安装es-header插件

  1. 拉取镜像
docker pull mobz/elasticsearch-head:5
  1. 创建容器
docker create --name elasticsearch-head -p 9100:9100 mobz/elasticsearch-head:5
  1. 启动容器
docker start elasticsearch-head
or
docker start 容器id (docker ps -a 查看容器id

访问localhost:9100 出现插件管理控制台 说明安装成功。


尝试连接easticsearch会发现无法连接上,由于是前后端分离开发,所以会存在跨域问题,需要在服务端做CORS的配置。

解决办法:修改docker中elasticsearch的elasticsearch.yml文件。

docker exec -it elasticsearch /bin/bash (进不去使用容器id进入)
  1. 在Es容器内操作
vi config/elasticsearch.yml

# 在最下面添加2行
http.cors.enabled: true 
http.cors.allow-origin: "*"

# 退出并重启
exit
  1. 退出Es容器后执行
docker restart 容器id

bug修复:ElasticSearch-head 操作时不修改配置,默认会报 406错误码。

  1. 进入es-haed 插件容器
docker exec -it elasticsearch-head /bin/bash
  1. 在容器内操作
# 编辑他的前端交互js文件
vim /usr/src/app/_site/vendor.js

第6886行:把 application/x-www-form-urlencoded 改成 application/json;charset=UTF-8

第7574行:把 application/x-www-form-urlencoded 改成 application/json;charset=UTF-8

#保存退出,重启容器,成功查询到es数据

1.3 安装IK分词器

  1. 进入Es容器
docker exec -it elasticsearch /bin/bash (进不去使用容器id进入)
  1. 容器内操作
cd /usr/share/elasticsearch/plugins

mkdir ik

cd ik 

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.0/elasticsearch-analysis-ik-7.7.0.zip

#解压
unzip elasticsearch-analysis-ik-7.7.0.zip

#删除压缩包
rm -rf elasticsearch-analysis-ik-7.7.0.zip

完成后退出容器并重启。

1.4 安装Kibana

  1. 拉镜像
docker pull kibana:7.7.0
  1. 在服务器/物理机上创建本地目录文件
mkdir /es/kibana

cd /es/kibana

vim kibana.yml

#加入以下内容:

server.host: "0.0.0.0"
# ip为es的docker容器ip
elasticsearch.hosts: ["http://172.17.0.5:9200"]
xpack.monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"

# 保存退出
:wq! 
  1. 启动容器
docker run --name kibana -v /es/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml -p 5601:5601 -d --restart=true kibana:7.7.0

有可能kibana连接不上es,几个注意点:

  1. 保证Es和Kibana在同一个网段。
  2. 或者使用桥接的方式连接二者
  3. 注意版本对应
  4. 注意配置文件的冒号后面有空格

可能请求之后发现跨域,这个直接根据浏览器F12提示找到对应的源码,改一下就行了。

2. Linux物理机安装

2.1 单机安装Es

软件包下载地址

  1. 解压软件
# 解压缩
tar -zxvf elasticsearch-7.8.0-linux-x86_64.tar.gz -C /opt/module
# 改名
mv elasticsearch-7.8.0 es

解压后可以看到 ES 的文件目录结构如下:

目录描述
bin包含一些执行脚本,其中ES的启动文件和脚本安装文件就在这里
config包含集群的配置文件(elasticsearch.yml),jvm配置文件(jvm.options),user等相关配置
JDKES7.0版本以后默认带有JDK
libjava的一些类库
pluginsES插件的安装目录
modules包含所有的ES模块
  1. 创建用户

因为安全问题,Elasticsearch 不允许 root 用户直接运行,所以要创建新用户,在 root中创建新用户。

useradd es #新增 es 用户
passwd es #为 es 用户设置密码
userdel -r es #如果错了,可以删除再加
chown -R es:es /opt/module/es #文件夹所有者
  1. 修改配置文件

修改/opt/module/es/config/elasticsearch.yml文件

# 加入如下配置
cluster.name: elasticsearch
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
path.data: ./data
path.logs: ./logs
discovery.seed_hosts: ["localhost"]
  • discovery.seed_hosts:默认本机的情况下无需扫描,Es会默认的扫描本机的9300-9305端口,一旦进行了网络环境配置,这个默认扫描就会失效。discovery.seed_hosts 配置为 master 候选者节点即可。  如果需要指定端口的话,其值可以为:["localhost:9300", "localhost:9301"]
  • cluster.initial_master_nodes 指定新集群 master 候选者列表,其值为节点的名字列表。这里配置了 node.name: node-1,所以其值为 ["node-1"],而不是 ip 列表 !
  • network.host 和 http.port 是 ES 提供服务的监听地址和端口,线上一定不能配置 ip 为 0.0.0.0,这是非常危险的行为!!!

怎么样来理解这个 discovery.seed_hostscluster.initial_master_nodes 呢?

cluster.initial_master_nodes 是候选者列表,一般我们线上环境候选者的数量会比较少,毕竟是用来做备用的。而且这个配置只跟选举 master 有关,也就是跟其他类型的节点没有关系,其他类型的节点不需要配置这个也是可以的。

discovery.seed_hosts 这个可以理解为是做服务或者节点发现的,其他节点必须知道他们才能进入集群,一般配置为集群的 master 候选者的列表。

在现实环境中是这些 master 候选者(组织联系人)可能会经常变化,那怎么办呢?discovery.seed_hosts 这个配置项除了支持 ip 外还支持域名,所以可以用域名来解决这个问题。其他类型节点的配置上写的是域名,域名解析到对应的 ip,如果机器挂了,新的节点 ip 换了,就把域名解析到新的ip即可,这样其他节点的配置就不用修改了。所以非 master 候选节点要配 discovery.seed_hosts (组织联系人)才能顺利加入到集群中来。

修改/opt/module/es/config/jvm.options文件

# 设置堆内存最小值 
-Xms1g 
# 设置堆内存最大值 
-Xmx1g

JVM 配置需要以下几点:

  • -Xms 和-Xmx 这两个 JVM 的参数必须配置为一样的数值。服务在启动的时候就分配好内存空间,避免运行时申请分配内存造成系统抖动。
  • Xmx 不要超过机器内存的 50%,留下些内存供 JVM 堆外内存使用
  • 并且 Xmx 不要超过 32G建议最大配置为 30G。接近 32G,可能会导致 JVM 压缩指针的功能失效,导致性能下降。

修改/etc/security/limits.conf

# 在文件末尾中增加下面内容
# 每个进程可以打开的文件数的限制
es soft nofile 65536
es hard nofile 65536

修改/etc/security/limits.d/20-nproc.conf

# 在文件末尾中增加下面内容
# 每个进程可以打开的文件数的限制
es soft nofile 65536
es hard nofile 65536
# 操作系统级别对每个用户创建的进程数的限制
* hard nproc 4096
# 注:* 代表 Linux 所有用户名称

修改/etc/sysctl.conf

# 在文件中增加下面内容
# 一个进程可以拥有的 VMA(虚拟内存区域)的数量,默认值为 65536
vm.max_map_count=655360

重新加载

sysctl -p
  1. 使用 ES 用户启动
cd /opt/module/es/
#启动
bin/elasticsearch
#后台启动
bin/elasticsearch -d
# 查看日志:elasticsearch 指定的配置文件配置的cluster.name
tail -n 100 -f logs/elasticsearch.log

启动时,会动态生成文件,如果文件所属用户不匹配,会发生错误,需要重新进行修改用户和用户组。

2.2 集群安装Es

修改 /opt/module/es/config/elasticsearch.yml 文件,分发文件.

# 加入如下配置
#集群名称
cluster.name: cluster-es
#节点名称,每个节点的名称不能重复
node.name: node-1
#ip 地址,每个节点的地址不能重复
network.host: linux1
#是不是有资格主节点
node.master: true
node.data: true
http.port: 9200
# head 插件需要这打开这两个配置
http.cors.allow-origin: "*"
http.cors.enabled: true
http.max_content_length: 200mb
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举 master
cluster.initial_master_nodes: ["node-1"]
#es7.x 之后新增的配置,节点发现
discovery.seed_hosts: ["linux1:9300","linux2:9300","linux3:9300"]
gateway.recover_after_nodes: 2
network.tcp.keep_alive: true
network.tcp.no_delay: true
transport.tcp.compress: true
#集群内同时启动的数据任务个数,默认是 2 个
cluster.routing.allocation.cluster_concurrent_rebalance: 16
#添加或删除节点及负载均衡时并发恢复的线程个数,默认 4 个
cluster.routing.allocation.node_concurrent_recoveries: 16
#初始化数据恢复时,并发恢复线程的个数,默认 4 个
cluster.routing.allocation.node_initial_primaries_recoveries: 16

其余修改同单机安装。

2.3 安装Kibana

Kibana 与 ES 的版本是有对应关系的,所以需要下载与 ES 同版本的 Kibana,在这里下载 Kibana 7.8.0。 使用 wget 下载并且解压安装 Kibana:

# 进入刚才安装ES的目录

cd ES

wget https://artifacts.elastic.co/downloads/kibana/kibana-7.8.0-linux-x86_64.tar.gz

tar xvf kibana-7.8.0-linux-x86_64.tar.gz

# 重命名

mv kibana-7.8.0-linux-x86_64 kibana

cd kibana

# 需要注意的是,线上一定不能配置ip为 0.0.0.0,这是非常危险的行为!!!

echo -e '\nserver.host: "0.0.0.0"' >> config/kibana.yml

echo -e '\nelasticsearch.hosts: ["http://localhost:9211"]' >> config/kibana.yml

./bin/kibana >> run.log 2>&1 &

安装完成后,在浏览器中访问 localhost:5601,如果运行成功可以进入到如下界面:

image.png