感谢参照: https://juejin.cn/post/6859750582115106823
Docker安装 Elasticsearch 5.x/7.x 集群
1. 获取不同版本 elasticsearch 的 docker 镜像, 任选其一
docker pull elasticsearch:5.5
docker pull elasticsearch:7.9.3
7.9.3 版本
准备挂载配置文件 elasticsearch.yml
-为配置文件准备目录
mkdir /usr/share/elastic-config/
-进入目录
cd /usr/share/elasticsearch/config
-创建配置文件
vi elasticsearch.yml
-写入配置信息
# 集群名称
cluster.name: elasticsearch-cluster
# 节点名称
node.name: es-node1
# 绑定host,0.0.0.0代表当前节点的ip
network.host: 0.0.0.0
# 设置其它节点和该节点交互的ip地址,如果不设置它会自动判断,值必须是个真实的ip地址(本机ip)
network.publish_host: 192.168.22.130
# 设置对外服务的http端口,默认为9200
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: ["192.168.22.130:9300"]
# 这个参数决定了在选主过程中需要 有多少个节点通信 预防脑裂(节点需要 3 个以上 )
discovery.zen.minimum_master_nodes: 2
#集群初始化主节点
cluster.initial_master_nodes: ["es-node1","es-node2","es-node3"]
-为配置文件开通权限 777 开通读/写/运行 三个权限
chmod 777 elasticsearch.yml
启动 es
这里-v 后面的参数 冒号前面的是你服务器本地地址(上面创建的目录) , 冒号后面就是你 docker 应用容器的地址 , 这样本地 yml 就映射到了容器里面的 yml , 即便容器因为异常无法启动 , 也可以通过修改本地配置文件来处理异常
docker run -d --name es -p 9200:9200 -p 9300:9300 -v /user/share/elastic-config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:7.9.3
docker run -d --name es -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -v /Users/zyl/Desktop/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:7.9.3
查看容器启动情况 ( Ctrl + C 退出查看)
docker logs -f es
至此一个7.9.3 版本 es 节点部署完完毕 , 其他集群节点如法炮制 , 不要忘记修改配置文件的节点名字和 ip
5.5 版本
这里采用直接修改修改容器里面 es 的elasticsearch.yml 文件的方式来配置 es , 如果仍然想通过挂载方式 , 参照上面
启动容器
docker run -d --name es -p 9200:9200 -p 9300:9300 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" elasticsearch:5.5
进入容器
docker exec -it es /bin/bash
修改 es 的配置文件
由于 5.5 版本容器不自带编辑器 , 需要先安装编辑器
更新容器工具
apt-get update
安装编辑器(中途提示 Y/N , 输入 y 然后回车)
apt-get install vim
5.5 版本编辑配置文件
vim config/elasticsearch.yml
7.9.3 版本自带编辑器 不用 apt-get 进行更新安装即可编辑配置文件
vi config/elasticsearch.yml
进入编辑页面后
输入命令: gg 光标置到文档内容起始点
输入命令: dG 删除全部内容
输入命令: i 开始编辑文档
写入以下编辑信息(直接粘贴的话小心配置前面自动生成的 # , 该删的就删掉)
#集群名称
cluster.name: elasticsearch
#节点名称
node.name: node-1
#是否作为主节点,参与主节点选举
node.master: true
#允许对外提供服务
network.host: 0.0.0.0
#集群节点间数据交互 ip (写你服务器的 ip)
network.publish_host: 172.16.100.4
#集群节点关联 (要部署几个节点 , 下面[]里面就写多少节点的 ip 地址)
discovery.zen.ping.unicast.hosts: ["192.168.1.100:9300"]
#集群服务最少可用节点数(集群必须 3 个节点以上 , 不然就回出现主节点为 null 或者脑裂问题)
discovery.zen.minimum_master_nodes: 2
#elastic-head 可视化插件配置(如果用 kibana 可视化插件的话 就不用写这俩配置)
http.cors.enabled: true
http.cors.allow-origin: "*"
如果上面的配置粘贴到配置文件有中文乱码问题可以直接用下面这个
yml-1
cluster.name: elasticsearch
node.name: node-1
node.master: true
network.host: 0.0.0.0
network.publish_host: 192.168.1.100
discovery.zen.ping.unicast.hosts: ["172.16.100.4","172.16.100.5"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"
yml-2
cluster.name: elasticsearch
node.name: node-2
node.master: true
network.host: 0.0.0.0
network.publish_host: 172.16.100.4
discovery.zen.ping.unicast.hosts: ["192.168.1.100","172.16.100.5"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"
yml-3
cluster.name: elasticsearch
node.name: node-3
node.master: true
network.host: 0.0.0.0
network.publish_host: 172.16.100.5
discovery.zen.ping.unicast.hosts: ["192.168.1.100","172.16.100.4"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"
写完之后按下 Esc 键
输入命令: :wq 退出编辑并保存
输入命令: exit 退出容器
重启容器
docker restart es
自此一个集群节点部署完毕!( 查看启动日志, 命令: docker logs -f es )
打开链接(服务器 ip + 端口 9200)查看安装结果 , 出现几行英文提示信息即运行成功
http://127.0.0.1:9200/
其他节点也如法炮制 , 只是下面三项内容需要根据其他节点自身信息进行修改
node.name: node-*
network.publish_host: 172.16.100.4
discovery.zen.ping.unicast.hosts: ["172.16.100.4:9300","192.168.1.101:9300"]
安装 IK 分词器
Docker-安装 IK 分词器
需要进入容器内才可以安装 , 如果并未退出容器 则不用再进入容器了 ,直接 安装即可
docker exec -it es /bin/bash
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.3/elasticsearch-analysis-ik-7.9.3.zip
安装可视化插件 elastic-head
拉取镜像
docker pull mobz/elasticsearch-head:5
运行容器
docker run -d --name elastic-head -p 9100:9100 mobz/elasticsearch-head:5
打开链接(服务器 ip + 端口 9100)查看安装结果
http://127.0.0.1:9100/
部署 kibana 5.5.2
拉取镜像
docker pull kibana:5.5.2
安装 kibana 容器
docker run --link es:elasticsearch -d --name kibana -p 5601:5601 kibana:5.5.2
在浏览器中输入 http://localhost:5601 查看安装结果
SpringBoot 配置
5.5 版本 pom 依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>es-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.0.6.RELEASE</version>
</dependency>
<!--小辣椒-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
<!--fast json-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.0.6.RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
7.9.3 版本 pom 依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>es-demo2</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.4.1</version>
</dependency>
<!--小辣椒-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.4.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
5.5 版本 application.yml 文件
spring:
application:
name: spring-es
profiles:
active: default
data:
elasticsearch:
cluster-name: elasticsearch
cluster-nodes: 172.16.100.4:9300,127.0.0.1:9300
repositories:
enable: true
7.9.3 版本
debug: true
spring:
application:
name: spring-es
profiles:
active: default
elasticsearch:
rest:
uris: 172.16.100.4:9200,127.0.0.1:9200
data:
elasticsearch:
repositories:
enabled: true
bean文件
如果是 7.x 版本 , 就不用谢 type 属性了 , 直接在 indexName 后面定义索引名称
@Document(indexName = "customerwishclassify")
@Document(indexName = "mysql", type = "customerwishclassify")
public class CustomerWishClassify {
@Id
private String id;
@Field(type=FieldType.Keyword)
private String status;
/**
* 手机号
*/
@Field(type=FieldType.Keyword)
private String customerphone;
get set .......
}
dao 文件
public interface CustomerWishClassifyDao extends ElasticsearchRepository<CustomerWishClassify, String>{
}
Application 文件
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
test 文件
如果是 7.9.3 版本 就不用加 @RunWith(SpringRunner.class)
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyTest {
@Resource
private CustomerWishClassifyDao customerWishClassifyDao;
@Test
public void save() {
CustomerWishClassify obj = new CustomerWishClassify();
customerWishClassifyDao.save(obj);
}
@Test
public void deleteAll() {
customerWishClassifyDao.deleteAll();
}
}
填坑: 有时候直接运行会报 找不到索引异常 , 可以稍微等下 , 因为多个集群多个节点之间关联 需要一定的时间 , 十几秒吧 , 之后在用 test 类方法测试就可以了