一、elasticsearch简介
Elasticsearch 是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据。 它被用作全文检索、结构化搜索、分析以及这三个功能的组合。
二、单体环境搭建
1.使用docker命令拉取elasticsearch镜像
docker pull elasticsearch
2.配置文件
-
执行命令mkdir -p /mydata/elasticsearch/{config,data,plugins}创建文件夹
-
并在config文件夹下创建elasticsearch.yml文件,具体配置如下:
http.host: 0.0.0.0 # 监听每一个可用的网络接口 http.cors.enabled: true # 是否支持跨域,默认为false http.cors.allow-origin: "*" # 当设置允许跨域,默认为*,表示支持所有域名
-
将文件权限修改为777
chmod -R 777 /mydata/elasticsearch/
3.启动elasticsearch
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.10.1
- 具体参数含义
-
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" #单节点部署 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" #设置初始堆内存和最大内存 也可以调整虚拟机内存 -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins #挂载文件夹 -d elasticsearch:7.10.1 #使用docker镜像elasticsearch:7.10.1 以后台模式启动
4.安装elasticsearch head插件监控管理
docker pull mobz/elasticsearch-head:5
docker run --name es-head -d -p 9100:9100 docker.io/mobz/elasticsearch-head:5
5.es-head插件不能创建索引问题
控制台中查看请求报错信息为:Content-Type header [application/x-www-form-urlencoded] is not supported
所以我们需要修改一下elasticsearch-head 5的配置文件
1.因为docker容器里面无法使用vi/vim,所以需要先将文件拷贝出来
docker cp es-head:/usr/src/app/_site/vendor.js /mydata/es-head/
2、编辑vendor.js文件
1)6886行
contentType: "application/x-www-form-urlencoded
改成
contentType: "application/json;charset=UTF-8"
2)7573行
var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
改成
var inspectData = s.contentType === "application/json;charset=UTF-8" &&
3.将改完后的文件拷贝回容器
docker cp /mydata/es-head/vendor.js es-head:/usr/src/app/_site/vendor.js
4.无需重启,刷新页面即可
6.展示
使用docker ps -a命令查看容器启动情况
使用9100端口查看elasticsearch-head界面
三、集群环境搭建
为了演示方便,我只是在一台服务器上进行操作,实际业务中,elasticsearch各个节点应分别部署在不同的服务器上,这样保证其健壮性。
1.使用docker命令拉取elasticsearch镜像
docker pull elasticsearch
2.配置文件管理
-
使用命令mkdir -p /mydata/es-cluster/{es-date01,es-date02,es-date03}/{config,data,plugins}创建文件夹
-
分别在/mydata/es-cluster/{es-date01,es-date02,es-date03}/config文件夹下添加elasticsearch.yml文件,具体配置如下
# 集群名称,同一集群环境名称一致 cluster.name: es-cluster # 节点名称,应保证不一致 node.name: es-node-1 # 绑定host,0.0.0.0代表当前节点的ip network.host: 0.0.0.0 # 设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址(本机ip) network.publish_host: 47.94.93.93 # 设置对外服务的http端口,默认为9200,切记与docker-compose文件中端口保持一致 http.port: 9200 # 设置节点间交互的tcp端口,默认是9300 transport.tcp.port: 9300 # 是否支持跨域,默认为false http.cors.enabled: true # 当设置允许跨域,默认为*,表示支持所有域名,如果我们只是允许某些网站能访问,那么可以使用正则表达式。比如只允许本地地址。 /https?:\/\/localhost(:[0-9]+)?/ http.cors.allow-origin: "*" # 表示这个节点是否可以充当主节点 node.master: true # 是否充当数据节点 node.data: true # 所有主从节点ip:port discovery.seed_hosts: ["47.94.93.93:9300","47.94.93.93:9301","47.94.93.93:9302"] #本地只有一个节点,无法正常启动,先注释 # 这个参数决定了在选主过程中需要 有多少个节点通信 预防脑裂 N/2+1 discovery.zen.minimum_master_nodes: 2 #初始化主节点 cluster.initial_master_nodes: ["es-node-1","es-node-2","es-node-3"] #本地只有一个节点,无法正常启动,先注释
3.docker-compose文件编写
使用docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
version: '3'
services:
elasticsearch-1:
image: elasticsearch:7.10.1
restart: always
hostname: es1
container_name: es-date01
volumes:
- /mydata/es-cluster/es-date01/data:/usr/share/elasticsearch/data
- /mydata/es-cluster/es-date01/plugins:/usr/share/elasticsearch/plugins
- /mydata/es-cluster/es-date01/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- '9200:9200'
- '9300:9300'
privileged: true
elasticsearch-2:
image: elasticsearch:7.10.1
restart: always
hostname: es2
container_name: es-date02
volumes:
- /mydata/es-cluster/es-date02/data:/usr/share/elasticsearch/data
- /mydata/es-cluster/es-date02/plugins:/usr/share/elasticsearch/plugins
- /mydata/es-cluster/es-date02/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- '9201:9201'
- '9301:9301'
privileged: true
elasticsearch-3:
image: elasticsearch:7.10.1
restart: always
hostname: es3
container_name: es-date03
volumes:
- /mydata/es-cluster/es-date03/data:/usr/share/elasticsearch/data
- /mydata/es-cluster/es-date03/plugins:/usr/share/elasticsearch/plugins
- /mydata/es-cluster/es-date03/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- '9202:9202'
- '9302:9302'
privileged: true
4.编写es-stop.sh文件,方便集群一键关停
docker stop es-date01;
docker rm es-date01;
docker stop es-date02;
docker rm es-date02;
docker stop es-date03;
docker rm es-date03;
5.使用docker-compose up命令启动elasticsearch集群
-
启动后docker ps -a查看容器如下:
-
在浏览器中查看集群中所有节点
-
使用9100端口查看elasticsearch-head界面,访问集群中其中一个端口,可以显示集群中所有节点,图中可以看到,elasticsearch集群自动分配es-node-3为主节点,其余为从节点。
6.演示当有节点宕机之后的情况
- 使用docker stop es-data03停掉03节点,发现现在只有两个节点,并且图中红框位置9202端口已经访问不到了,同时01节点变为主节点
- 使用docker restart es-data03重新启动03节点后,03节点恢复为从节点
四.IK分词器的安装
1.下载分词器
地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
一定是下载和自己elasticsearch版本一致的ik分词器版本
2.解压
3.使用xftp上传到服务器对应位置
/mydata/es-cluster/{es-date01,es-date02,es-date03}/plugins
4.重启elasticsearch
5.测试分词效果
五.SpringBoot项目配置连接
1.maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.5.0</version>
</dependency>
2.yml文件中配置参数
spring:
data:
elasticsearch:
repositories:
enabled: true
cluster-name: 47.94.93.93:9200,47.94.93.93:9201,47.94.93.93:9202 #如果是单节点,则只需要写一个ip:port即可
cluster-nodes: es-cluster
elasticsearch: #springboot 默认配置 localhost:9200
rest:
uris: ["47.94.93.93:9200","47.94.93.93:9201","47.94.93.93:9202"] #和上方cluster-name保持一致
六.搭建过程中遇到的问题
-
es启动报错:
ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch. bootstrap check failure [1] of [1]: 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 /usr/share/elasticsearch/log/my-es.log
原因是vm虚拟机的内存默认分配的太低了,导致elasticsearch容器启动失败。报错信息提示vm.max_map_count[65530]太低,至少需要262144。
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解决方案:
vim /etc/sysctl.conf 在该文件中添加如下所示配置: vm.max_map_count=655360 保存后退出,并刷新配置 sysctl -p /etc/sysctl.conf 再次启动即可成功
-
Docker在多机器上搭建ES集群,各节点无法互通
1.检查ES的network.*配置 network.host值可以设置为0.0.0.0(表示监听所有网卡)或宿主机Ip(如果设为宿主机Ip则不能通过localhost或127.0.0.1即回环地址进行访问es),我这里设置为0.0.0.0。 network.publish_host表示ES的发布地址,该项地址作为ES节点内部或集群交互地址。建议设置为宿主机地址。 2.按上面配置了,但是各节点不能形成集群,每个节点都作为master节点? 检查data目录是否为空,如果不为空需要把data目录清空,再按上述配置network,搞定。