1 安装docker-compose

## 下载docker-compose
wget https://github.com/docker/compose/releases/download/v2.34.0/docker-compose-linux-x86_64
## 移动到自己习惯的路径
mv docker-compose-linux-x86_64 /usr/bin/docker-compose
## 授权
chmod +x /usr/bin/docker-compose
## 检查是否安装成功
docker-compose version

这样代表我们已经将docker-compose安装完毕

2 准备工作

## 创建所需文件夹
mkdir -p /opt/es-cluster/node-{1..5}/{config,plugins,data,log}
## 文件赋权
chmod 777 /opt/es-cluster/node-{1..5}/{config,plugins,data,log}

## 创建kibana挂载目录并赋权
mkdir -p /opt/kibana/config/
chmod 777 /opt/kibana/config/

## 修改linux句柄数
vim /etc/sysctl.conf
## 添加如下内容
vm.max_map_count=655360

## 创建大量线程
vim /etc/security/limits.conf
## 修改或添加如下内容
* soft nofile 65536
* hard nofile 131072
* soft nproc 4096
* hard nproc 4096
## 重启
reboot

3 获取ik 分词器 并设置ik分词器进行本地文件热更和mysql热更

3.1 找到对应版本的ik 分词器

分词器下载地址
下载对应版本的分词器

3.2 将文件上传到ik(我的文件都存在/home中)

## 上传压缩包
mkdir ik && cd ik
 rz elasticsearch-analysis-ik-7.17.28.zip
 ## 解压当前文件
 unzip elasticsearch-analysis-ik-7.17.28.zip
## 删除 压缩包
 rm -rf elasticsearch-analysis-ik-7.17.28.zip

3.3 创建本地热词和配置

## 创建扩展热词文件
mkdir -p /opt/es-cluster/common/custom && cd /opt/es-cluster/common/custom
vi extend.dic

## 修改ik配置文件
vim /home/ik/config/IKAnalyzer.cfg.xml 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
        <comment>IK Analyzer 扩展配置</comment>
        <!--用户可以在这里配置自己的扩展字典。如果是多个用;分开 -->
        <entry key="ext_dict">custom/extend.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

3.4 基于ik分词器 根据mysql 进行热更新

3.4.1 下载源码

源码下载地址
下载对应版本的ik分词器源码

3.4.2 新增配置文件

新增配置文件

将下列配置信息写入配置文件

jdbc.url=jdbc:mysql://*.*.*.*:3306/es_hot_word?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8  
jdbc.user=root  
jdbc.password=********  
jdbc.reload.sql=select word from hot_words  
jdbc.reload.stopword.sql=select stopword as word from hot_stopwords
3.4.3 在plugin.xml配置文件中新增mysql驱动配置

配置驱动

<dependencySet>  
    <outputDirectory/>  
    <useProjectArtifact>true</useProjectArtifact>  
    <useTransitiveFiltering>true</useTransitiveFiltering>  
    <includes>  
        <include>mysql:mysql-connector-java</include>  
    </includes>  
</dependencySet>
3.4.4 在pom中新增mysql驱动依,并根据ik分词器的版本修改版本号

版本号
mysql驱动

## 修改版本号
<elasticsearch.version>7.17.28</elasticsearch.version>

## 新增依赖
<dependency>  
    <groupId>mysql</groupId>  
    <artifactId>mysql-connector-java</artifactId>  
    <version>8.0.29</version>  
</dependency>
3.4.5 修改源码

在Dictionary.java 中新增如下代码

private static Properties prop = new Properties();  

static {  
    try {  
       Class.forName("com.mysql.cj.jdbc.Driver");  
    } catch (ClassNotFoundException e) {  
       logger.error("MySQL驱动加载异常:", e);  
    }  
}

所有词

/**  
 * 所有词  
 */  
public void mysqlRemoteExtDict(){  
    this.loadMySQLStopwordDict();  
    this.loadMySQLExtDict();  
}

热词更新

/**  
 * 热词更新  
 */  
private void loadMySQLExtDict() {  
    Connection conn = null;  
    Statement stmt = null;  
    ResultSet rs = null;  
  
    try {  
       Path file = PathUtils.get(getDictRoot(), "jdbc-reload.properties");  
       prop.load(new FileInputStream(file.toFile()));  
  
       logger.info("jdbc-reload.properties");  
       for(Object key : prop.keySet()) {  
          logger.info(key + "=" + prop.getProperty(String.valueOf(key)));  
       }  
  
       logger.info("query hot word dict from mysql, " + prop.getProperty("jdbc.reload.sql") + "......");  
  
       conn = DriverManager.getConnection(  
             prop.getProperty("jdbc.url"),  
             prop.getProperty("jdbc.user"),  
             prop.getProperty("jdbc.password"));  
       stmt = conn.createStatement();  
       rs = stmt.executeQuery(prop.getProperty("jdbc.reload.sql"));  
  
       while(rs.next()) {  
          String theWord = rs.getString("word");  
          logger.info("hot word from mysql: " + theWord);  
          _MainDict.fillSegment(theWord.trim().toCharArray());  
       }  
    } catch (Exception e) {  
       logger.error("erorr", e);  
    } finally {  
       if(rs != null) {  
          try {  
             rs.close();  
          } catch (SQLException e) {  
             logger.error("error", e);  
          }  
       }  
       if(stmt != null) {  
          try {  
             stmt.close();  
          } catch (SQLException e) {  
             logger.error("error", e);  
          }  
       }  
       if(conn != null) {  
          try {  
             conn.close();  
          } catch (SQLException e) {  
             logger.error("error", e);  
          }  
       }  
    }  
}  
  
	/**
	 * 停用词
	 */
	private void loadMySQLStopwordDict() {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;

		try {
			Path file = PathUtils.get(getDictRoot(), "jdbc-reload.properties");
			prop.load(new FileInputStream(file.toFile()));

			logger.info("jdbc-reload.properties");
			for(Object key : prop.keySet()) {
				logger.info(key + "=" + prop.getProperty(String.valueOf(key)));
			}

			logger.info("query hot stopword dict from mysql, " + prop.getProperty("jdbc.reload.stopword.sql") + "......");

			conn = DriverManager.getConnection(
					prop.getProperty("jdbc.url"),
					prop.getProperty("jdbc.user"),
					prop.getProperty("jdbc.password"));
			stmt = conn.createStatement();
			rs = stmt.executeQuery(prop.getProperty("jdbc.reload.stopword.sql"));

			while(rs.next()) {
				String theWord = rs.getString("word");
				logger.info("hot stopword from mysql: " + theWord);
				_StopWords.fillSegment(theWord.trim().toCharArray());
			}
		} catch (Exception e) {
			logger.error("erorr", e);
		} finally {
			if(rs != null) {
				try {
					rs.close();
				} catch (SQLException e) {
					logger.error("error", e);
				}
			}
			if(stmt != null) {
				try {
					stmt.close();
				} catch (SQLException e) {
					logger.error("error", e);
				}
			}
			if(conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					logger.error("error", e);
				}
			}
		}
	}

新增本地线程

public class MySQLDictReloadThread implements Runnable{  
    private static  final Logger logger = ESPluginLoggerFactory.getLogger(MySQLDictReloadThread.class.getName());  
  
    @Override  
    public void run() {  
        logger.info("reloading hot_word and stop_word dict from mysql");  
        Dictionary.getSingleton().mysqlRemoteExtDict();  
    }  
}

在字典初始化方法中新增代码
更新所有词
热更

## org.wltea.analyzer.dic.Dictionary#initial 增加定时

pool.scheduleAtFixedRate(new MySQLDictReloadThread(), 10, 60, TimeUnit.SECONDS);

## org.wltea.analyzer.dic.Dictionary#loadMainDict 方法中增加mysql热更
		//自定义mysql
		this.mysqlRemoteExtDict();
3.4.6 使用maven打包生成elasticsearch-analysis-ik-7.17.28.jar包

打包

3.4.7 删除/home/ik 目录下的elasticsearch-analysis-ik-7.17.28.jar

删除原jar包

rm -rf elasticsearch-analysis-ik-7.17.28.jar
3.4.8 上传我们修改好的代码生成的jar包
rz elasticsearch-analysis-ik-7.17.28.jar
3.4.9 因为我们的配置文件没有打在jar包内,所以要将jdbc-reload.properties文件上传到/home/ik/config中
rz jdbc-reload.properties
3.4.10 因为mysql的驱动器,所以要将mysql的驱动也上传到/home/ik目录中
rz mysql-connector-java-8.0.29.jar

我们ik文件夹最终的文件是这样的
所有文件

3.4.11 新增权限配置(如果不进行此操作,7x版本会有一堆报错)
mkdir -p /opt/es-cluster/common && cd /opt/es-cluster/common
vi java.policy
3.4.12 把下列配置信息写入到文件中
grant {
  permission java.net.SocketPermission "*:3306", "connect,resolve";
  permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
  permission java.io.FilePermission "<<ALL FILES>>", "read,write,delete";
  permission java.util.PropertyPermission "*", "read,write";
  permission javax.security.auth.AuthPermission "getSubject";
  permission javax.security.auth.AuthPermission "modifyPrincipals";
  permission javax.security.auth.AuthPermission "getLoginConfiguration";
  permission java.lang.RuntimePermission "createClassLoader";
  permission java.lang.RuntimePermission "getClassLoader";
  permission java.lang.RuntimePermission "setContextClassLoader";
  permission java.lang.RuntimePermission "accessClassInPackage.sun.misc";
  permission java.lang.RuntimePermission "accessClassInPackage.sun.nio.ch";
  permission java.lang.RuntimePermission "accessDeclaredMembers";
  permission java.lang.RuntimePermission "loadLibrary.jaas_unix";
  permission java.lang.RuntimePermission "shutdownHooks";
  permission java.lang.RuntimePermission "createSecurityManager";
  permission java.lang.RuntimePermission "closeClassLoader";
  permission java.net.SocketPermission "*:3306","connect,resolve";
  permission java.security.SecurityPermission "setProperty.networkaddress.cache.ttl";
  permission java.security.SecurityPermission "setProperty.networkaddress.cache.negative.ttl";
  permission java.lang.RuntimePermission "accessClassInPackage.sun.util.logging";
  permission java.lang.RuntimePermission "accessClassInPackage.org.apache.logging.log4j.core";
  permission java.io.FilePermission "/usr/share/elasticsearch/log/*", "read,write,delete";
  permission java.lang.RuntimePermission "getenv.*";
  permission java.lang.RuntimePermission "getStackWalkerWithClassReference";
  permission java.security.SecurityPermission "setProperty.policy.expandProperties";
  permission java.lang.RuntimePermission "accessClassInPackage.org.apache.logging.log4j.*";
  permission java.lang.RuntimePermission "accessDeclaredMembers";
  permission java.lang.RuntimePermission "setSecurityManager";
  permission javax.management.MBeanServerPermission "createMBeanServer";
  permission javax.management.MBeanPermission "*", "*";
  permission javax.management.MBeanTrustPermission "register";
};
3.4.13 将文件cp到各个plugins中
cp -R ik/ /opt/es-cluster/node-1/plugins/
cp -R ik/ /opt/es-cluster/node-2/plugins/
cp -R ik/ /opt/es-cluster/node-3/plugins/
cp -R ik/ /opt/es-cluster/node-4/plugins/
cp -R ik/ /opt/es-cluster/node-5/plugins/

4 创建各个node的配置文件

vi /opt/es-cluster/node-1/config/elasticsearch.yml
node-1

#集群名称
cluster.name: elastic
#当前该节点的名称
node.name: node-1
#是不是有资格竞选主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 5
#给当前节点自定义属性(可以省略)
#node.attr.rack: r1
#数据存档位置
path.data: /usr/share/elasticsearch/data
#日志存放位置
path.logs: /usr/share/elasticsearch/log
#是否开启时锁定内存(默认为是)
#bootstrap.memory_lock: true
#设置网关地址,我是被这个坑死了,这个地址我原先填写了自己的实际物理IP地址,
#然后启动一直报无效的IP地址,无法注入9300端口,这里只需要填写0.0.0.0
network.host: 0.0.0.0
#设置映射端口
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
#集群发现默认值为127.0.0.1:9300,如果要在其他主机上形成包含节点的群集,如果搭建集群则需要填写
#es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点,也就是说把所有的节点都写上
discovery.seed_hosts: ["node-1","node-2","node-3","node-4","node-5"]
#当你在搭建集群的时候,选出合格的节点集群,有些人说的太官方了,
#其实就是,让你选择比较好的几个节点,在你节点启动时,在这些节点中选一个做领导者,
#如果你不设置呢,elasticsearch就会自己选举,这里我们把三个节点都写上
cluster.initial_master_nodes: ["node-1","node-2","node-3","node-4","node-5"]
#在群集完全重新启动后阻止初始恢复,直到启动N个节点
#简单点说在集群启动后,至少复活多少个节点以上,那么这个服务才可以被使用,否则不可以被使用,
gateway.recover_after_nodes: 3
#删除索引是是否需要显示其名称,默认为显示
#action.destructive_requires_name: true
# 禁用安全配置,否则查询的时候会提示警告
xpack.security.enabled: false
# 这个配置指定了Elasticsearch HTTP服务监听的IP地址。使用0.0.0.0表示它可以接受来自任何IP地址的请求
http.host: 0.0.0.0
# 这个配置启用了CORS(跨源资源共享)支持
http.cors.enabled: true
# 这个配置定义了哪些域可以跨源访问到Elasticsearch的资源
http.cors.allow-origin: "*"
# 这个配置指定了在跨源请求中允许的HTTP头。X-Requested-With常用于识别Ajax请求,Content-Type用于指示请求中内容的类型,而Content-Length表示请求内容的长度。
http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length"

node-2
vi /opt/es-cluster/node-2/config/elasticsearch.yml

#集群名称
cluster.name: elastic
#当前该节点的名称
node.name: node-2
#是不是有资格竞选主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 5
#给当前节点自定义属性(可以省略)
#node.attr.rack: r1
#数据存档位置
path.data: /usr/share/elasticsearch/data
#日志存放位置
path.logs: /usr/share/elasticsearch/log
#是否开启时锁定内存(默认为是)
#bootstrap.memory_lock: true
#设置网关地址,我是被这个坑死了,这个地址我原先填写了自己的实际物理IP地址,
#然后启动一直报无效的IP地址,无法注入9300端口,这里只需要填写0.0.0.0
network.host: 0.0.0.0
#设置映射端口
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
#集群发现默认值为127.0.0.1:9300,如果要在其他主机上形成包含节点的群集,如果搭建集群则需要填写
#es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点,也就是说把所有的节点都写上
discovery.seed_hosts: ["node-1","node-2","node-3","node-4","node-5"]
#当你在搭建集群的时候,选出合格的节点集群,有些人说的太官方了,
#其实就是,让你选择比较好的几个节点,在你节点启动时,在这些节点中选一个做领导者,
#如果你不设置呢,elasticsearch就会自己选举,这里我们把三个节点都写上
cluster.initial_master_nodes: ["node-1","node-2","node-3","node-4","node-5"]
#在群集完全重新启动后阻止初始恢复,直到启动N个节点
#简单点说在集群启动后,至少复活多少个节点以上,那么这个服务才可以被使用,否则不可以被使用,
gateway.recover_after_nodes: 3
#删除索引是是否需要显示其名称,默认为显示
#action.destructive_requires_name: true
# 禁用安全配置,否则查询的时候会提示警告
xpack.security.enabled: false
# 这个配置指定了Elasticsearch HTTP服务监听的IP地址。使用0.0.0.0表示它可以接受来自任何IP地址的请求
http.host: 0.0.0.0
# 这个配置启用了CORS(跨源资源共享)支持
http.cors.enabled: true
# 这个配置定义了哪些域可以跨源访问到Elasticsearch的资源
http.cors.allow-origin: "*"
# 这个配置指定了在跨源请求中允许的HTTP头。X-Requested-With常用于识别Ajax请求,Content-Type用于指示请求中内容的类型,而Content-Length表示请求内容的长度。
http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length"

node-3
vi /opt/es-cluster/node-3/config/elasticsearch.yml

#集群名称
cluster.name: elastic
#当前该节点的名称
node.name: node-3
#是不是有资格竞选主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 5
#给当前节点自定义属性(可以省略)
#node.attr.rack: r1
#数据存档位置
path.data: /usr/share/elasticsearch/data
#日志存放位置
path.logs: /usr/share/elasticsearch/log
#是否开启时锁定内存(默认为是)
#bootstrap.memory_lock: true
#设置网关地址,我是被这个坑死了,这个地址我原先填写了自己的实际物理IP地址,
#然后启动一直报无效的IP地址,无法注入9300端口,这里只需要填写0.0.0.0
network.host: 0.0.0.0
#设置映射端口
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
#集群发现默认值为127.0.0.1:9300,如果要在其他主机上形成包含节点的群集,如果搭建集群则需要填写
#es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点,也就是说把所有的节点都写上
discovery.seed_hosts: ["node-1","node-2","node-3","node-4","node-5"]
#当你在搭建集群的时候,选出合格的节点集群,有些人说的太官方了,
#其实就是,让你选择比较好的几个节点,在你节点启动时,在这些节点中选一个做领导者,
#如果你不设置呢,elasticsearch就会自己选举,这里我们把三个节点都写上
cluster.initial_master_nodes: ["node-1","node-2","node-3","node-4","node-5"]
#在群集完全重新启动后阻止初始恢复,直到启动N个节点
#简单点说在集群启动后,至少复活多少个节点以上,那么这个服务才可以被使用,否则不可以被使用,
gateway.recover_after_nodes: 3
#删除索引是是否需要显示其名称,默认为显示
#action.destructive_requires_name: true
# 禁用安全配置,否则查询的时候会提示警告
xpack.security.enabled: false
# 这个配置指定了Elasticsearch HTTP服务监听的IP地址。使用0.0.0.0表示它可以接受来自任何IP地址的请求
http.host: 0.0.0.0
# 这个配置启用了CORS(跨源资源共享)支持
http.cors.enabled: true
# 这个配置定义了哪些域可以跨源访问到Elasticsearch的资源
http.cors.allow-origin: "*"
# 这个配置指定了在跨源请求中允许的HTTP头。X-Requested-With常用于识别Ajax请求,Content-Type用于指示请求中内容的类型,而Content-Length表示请求内容的长度。
http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length"

node-4
vi /opt/es-cluster/node-4/config/elasticsearch.yml

#集群名称
cluster.name: elastic
#当前该节点的名称
node.name: node-4
#是不是有资格竞选主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 5
#给当前节点自定义属性(可以省略)
#node.attr.rack: r1
#数据存档位置
path.data: /usr/share/elasticsearch/data
#日志存放位置
path.logs: /usr/share/elasticsearch/log
#是否开启时锁定内存(默认为是)
#bootstrap.memory_lock: true
#设置网关地址,我是被这个坑死了,这个地址我原先填写了自己的实际物理IP地址,
#然后启动一直报无效的IP地址,无法注入9300端口,这里只需要填写0.0.0.0
network.host: 0.0.0.0
#设置映射端口
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
#集群发现默认值为127.0.0.1:9300,如果要在其他主机上形成包含节点的群集,如果搭建集群则需要填写
#es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点,也就是说把所有的节点都写上
discovery.seed_hosts: ["node-1","node-2","node-3","node-4","node-5"]
#当你在搭建集群的时候,选出合格的节点集群,有些人说的太官方了,
#其实就是,让你选择比较好的几个节点,在你节点启动时,在这些节点中选一个做领导者,
#如果你不设置呢,elasticsearch就会自己选举,这里我们把三个节点都写上
cluster.initial_master_nodes: ["node-1","node-2","node-3","node-4","node-5"]
#在群集完全重新启动后阻止初始恢复,直到启动N个节点
#简单点说在集群启动后,至少复活多少个节点以上,那么这个服务才可以被使用,否则不可以被使用,
gateway.recover_after_nodes: 3
#删除索引是是否需要显示其名称,默认为显示
#action.destructive_requires_name: true
# 禁用安全配置,否则查询的时候会提示警告
xpack.security.enabled: false
# 这个配置指定了Elasticsearch HTTP服务监听的IP地址。使用0.0.0.0表示它可以接受来自任何IP地址的请求
http.host: 0.0.0.0
# 这个配置启用了CORS(跨源资源共享)支持
http.cors.enabled: true
# 这个配置定义了哪些域可以跨源访问到Elasticsearch的资源
http.cors.allow-origin: "*"
# 这个配置指定了在跨源请求中允许的HTTP头。X-Requested-With常用于识别Ajax请求,Content-Type用于指示请求中内容的类型,而Content-Length表示请求内容的长度。
http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length"

node-5
vi /opt/es-cluster/node-5/config/elasticsearch.yml

#集群名称
cluster.name: elastic
#当前该节点的名称
node.name: node-5
#是不是有资格竞选主节点
node.master: true
#是否存储数据
node.data: true
#最大集群节点数
node.max_local_storage_nodes: 5
#给当前节点自定义属性(可以省略)
#node.attr.rack: r1
#数据存档位置
path.data: /usr/share/elasticsearch/data
#日志存放位置
path.logs: /usr/share/elasticsearch/log
#是否开启时锁定内存(默认为是)
#bootstrap.memory_lock: true
#设置网关地址,我是被这个坑死了,这个地址我原先填写了自己的实际物理IP地址,
#然后启动一直报无效的IP地址,无法注入9300端口,这里只需要填写0.0.0.0
network.host: 0.0.0.0
#设置映射端口
http.port: 9200
#内部节点之间沟通端口
transport.tcp.port: 9300
#集群发现默认值为127.0.0.1:9300,如果要在其他主机上形成包含节点的群集,如果搭建集群则需要填写
#es7.x 之后新增的配置,写入候选主节点的设备地址,在开启服务后可以被选为主节点,也就是说把所有的节点都写上
discovery.seed_hosts: ["node-1","node-2","node-3","node-4","node-5"]
#当你在搭建集群的时候,选出合格的节点集群,有些人说的太官方了,
#其实就是,让你选择比较好的几个节点,在你节点启动时,在这些节点中选一个做领导者,
#如果你不设置呢,elasticsearch就会自己选举,这里我们把三个节点都写上
cluster.initial_master_nodes: ["node-1","node-2","node-3","node-4","node-5"]
#在群集完全重新启动后阻止初始恢复,直到启动N个节点
#简单点说在集群启动后,至少复活多少个节点以上,那么这个服务才可以被使用,否则不可以被使用,
gateway.recover_after_nodes: 3
#删除索引是是否需要显示其名称,默认为显示
#action.destructive_requires_name: true
# 禁用安全配置,否则查询的时候会提示警告
xpack.security.enabled: false
# 这个配置指定了Elasticsearch HTTP服务监听的IP地址。使用0.0.0.0表示它可以接受来自任何IP地址的请求
http.host: 0.0.0.0
# 这个配置启用了CORS(跨源资源共享)支持
http.cors.enabled: true
# 这个配置定义了哪些域可以跨源访问到Elasticsearch的资源
http.cors.allow-origin: "*"
# 这个配置指定了在跨源请求中允许的HTTP头。X-Requested-With常用于识别Ajax请求,Content-Type用于指示请求中内容的类型,而Content-Length表示请求内容的长度。
http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length"

kibana
vi /opt/kibana/config/kibana.yml

server.host: 0.0.0.0
# 监听端口
server.port: 5601
server.name: "kibana"
 
# kibana访问es服务器的URL,就可以有多个,以逗号","隔开
elasticsearch.hosts: ["http://node-1:9200","http://node-2:9201","http://node-3:9202","http://node-4:9203","http://node-5:9204"]
monitoring.ui.container.elasticsearch.enabled: true
# kibana访问Elasticsearch的账号与密码(如果ElasticSearch设置了的话)
#elasticsearch.username: "kibana"
#elasticsearch.password: "12345"
 
# kibana日志文件存储路径
logging.dest: stdout
# 此值为true时,禁止所有日志记录输出
logging.silent: false
# 此值为true时,禁止除错误消息之外的所有日志记录输出
logging.quiet: false
# 此值为true时,记录所有事件,包括系统使用信息和所有请求
logging.verbose: false
 
ops.interval: 5000
# kibana web语言
i18n.locale: "zh-CN"

5 docker-compose.yml 配置

vi /opt/es-cluster/docker-compose.yml

services:
  node-1:
    image: elasticsearch:7.17.28
    container_name: node-1
    environment:
    ## 内存一定要全部保持一致 要不起不来
      - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m -Djava.security.manager -Djava.security.policy=file:/usr/share/elasticsearch/config/java.policy"
      - "TZ=Asia/Shanghai"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    ports:
      - "9200:9200"
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
    volumes:
      - /opt/es-cluster/node-1/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /opt/es-cluster/node-1/plugins:/usr/share/elasticsearch/plugins
      - /opt/es-cluster/common/custom:/usr/share/elasticsearch/plugins/ik/config/custom
      - /opt/es-cluster/node-1/data:/usr/share/elasticsearch/data
      - /opt/es-cluster/node-1/log:/usr/share/elasticsearch/log
      - /opt/es-cluster/common/java.policy:/usr/share/elasticsearch/config/java.policy
    networks:
      - elastic
  node-2:
    image: elasticsearch:7.17.28
    container_name: node-2
    environment:
      - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m -Djava.security.manager -Djava.security.policy=file:/usr/share/elasticsearch/config/java.policy"
      - "TZ=Asia/Shanghai"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    ports:
      - "9201:9200"
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
    volumes:
      - /opt/es-cluster/node-2/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /opt/es-cluster/node-2/plugins:/usr/share/elasticsearch/plugins
      - /opt/es-cluster/common/custom:/usr/share/elasticsearch/plugins/ik/config/custom
      - /opt/es-cluster/node-2/data:/usr/share/elasticsearch/data
      - /opt/es-cluster/node-2/log:/usr/share/elasticsearch/log
      - /opt/es-cluster/common/java.policy:/usr/share/elasticsearch/config/java.policy
    networks:
      - elastic
  node-3:
    image: elasticsearch:7.17.28
    container_name: node-3
    environment:
      - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m -Djava.security.manager -Djava.security.policy=file:/usr/share/elasticsearch/config/java.policy"
      - "TZ=Asia/Shanghai"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    ports:
      - "9202:9200"
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
    volumes:
      - /opt/es-cluster/node-3/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /opt/es-cluster/node-3/plugins:/usr/share/elasticsearch/plugins
      - /opt/es-cluster/common/custom:/usr/share/elasticsearch/plugins/ik/config/custom
      - /opt/es-cluster/node-3/data:/usr/share/elasticsearch/data
      - /opt/es-cluster/node-3/log:/usr/share/elasticsearch/log
      - /opt/es-cluster/common/java.policy:/usr/share/elasticsearch/config/java.policy
    networks:
      - elastic
  node-4:
    image: elasticsearch:7.17.28
    container_name: node-4
    environment:
      - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m -Djava.security.manager -Djava.security.policy=file:/usr/share/elasticsearch/config/java.policy"
      - "TZ=Asia/Shanghai"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    ports:
      - "9203:9200"
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
    volumes:
      - /opt/es-cluster/node-4/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /opt/es-cluster/node-4/plugins:/usr/share/elasticsearch/plugins
      - /opt/es-cluster/common/custom:/usr/share/elasticsearch/plugins/ik/config/custom
      - /opt/es-cluster/node-4/data:/usr/share/elasticsearch/data
      - /opt/es-cluster/node-4/log:/usr/share/elasticsearch/log
      - /opt/es-cluster/common/java.policy:/usr/share/elasticsearch/config/java.policy
    networks:
      - elastic
  node-5:
    image: elasticsearch:7.17.28
    container_name: node-5
    environment:
      - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m -Djava.security.manager -Djava.security.policy=file:/usr/share/elasticsearch/config/java.policy"
      - "TZ=Asia/Shanghai"
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    ports:
      - "9204:9200"
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
    volumes:
      - /opt/es-cluster/node-5/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /opt/es-cluster/node-5/plugins:/usr/share/elasticsearch/plugins
      - /opt/es-cluster/common/custom:/usr/share/elasticsearch/plugins/ik/config/custom
      - /opt/es-cluster/node-5/data:/usr/share/elasticsearch/data
      - /opt/es-cluster/node-5/log:/usr/share/elasticsearch/log
      - /opt/es-cluster/common/java.policy:/usr/share/elasticsearch/config/java.policy
    networks:
      - elastic
  kibana:
    container_name: kibana
    image: kibana:7.17.28
    volumes:
      - /opt/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
    ports:
      - 5601:5601
    networks:
      - elastic
networks:
  elastic:
    driver: bridge

6 启动docker-compose 并验证

## 启动
docker-compose up -d
## 重启命令
docker-compose restart
## 进去kibana
GET /_cluster/health

7 使用

启动状态
启动状态
kibana执行
执行
日志
日志

mysqlmysql配置

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐