006 CentOS 7.9 elasticsearch7.10.0安装及配置

Elasticsearch官方网址:https://www.elastic.co

Elasticsearch中文官网地址:https://www.elastic.co/cn/products/elasticsearch

https://www.elastic.co/cn/downloads/logstash

https://www.elastic.co/cn/downloads/kibana
https://dev.mysql.com/downloads/connector/j/

Logstash与Java 8适配的版本取决于你所使用的Elasticsearch(ES)版本。根据Elastic Stack的兼容性建议:

对于ES 6.7.x之前的版本,推荐Java 8。

对于ES 6.7.x到7.17.x的版本,Java 8或Java 11都是推荐的。但请注意,虽然这些版本的ES支持Java 8,但Elasticsearch 7.10是官方支持Java 8的最后一个版本。

对于ES 8.x及之后的版本,推荐使用Oracle/OpenJava 11或Oracle/OpenJava 17。

至于Logstash,从7.8.0版本开始,它支持Azul Zulu JDK,这对于使用M1 Mac的用户是一个好的选择。但是,对于Java 8的适配,你应该选择与你的Elasticsearch版本兼容的Logstash版本。

在CentOS 7.9上安装Elasticsearch 7.10.0和Logstash 7.10.0,并确保远程可以访问,你可以按照以下步骤进行:

一、安装Elasticsearch 7.10.0

下载RPM包:

从Elasticsearch官网下载Elasticsearch 7.10.0的RPM包(elasticsearch-7.10.0-x86_64.rpm)。

安装Elasticsearch:

使用rpm命令安装下载的RPM包。

java 复制代码
sudo rpm -ivh elasticsearch-7.10.0-x86_64.rpm

配置Elasticsearch:

java 复制代码
编辑Elasticsearch的配置文件/etc/elasticsearch/elasticsearch.yml
java 复制代码
cluster.name: "my-cluster-name"
node.name: "my-node-name"
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["my-node-name"]
# 如果启用了X-Pack安全功能,请确保设置了正确的xpack配置  
# # xpack.security.enabled: true  
# # xpack.license.self_generated.type: basic  
# # ... 其他xpack相关配置 ...


# 集群和节点名称一定要设置吗?

# 集群名称(cluster.name):推荐设置。它有助于标识和管理Elasticsearch集群,特别是当您有多个集群时。
# 节点名称(node.name):不是必须设置,但推荐设置。如果不设置,Elasticsearch将自动为节点生成一个名称。但自定义节点名称可以使管理更加容易,特别是在大型集群中。
java 复制代码
sudo vi /etc/elasticsearch/jvm.options
java 复制代码
-Xms128m
-Xmx128m

启动Elasticsearch服务:

使用systemctl命令启动Elasticsearch服务,并设置为开机自启。

java 复制代码
sudo systemctl daemon-reload   # 重新加载 systemd 配置文件
sudo systemctl start elasticsearch  
sudo systemctl enable elasticsearch

二、安装Logstash 7.10.0

下载RPM包:

从Logstash官网下载Logstash 7.10.0的RPM包(logstash-7.10.0-x86_64.rpm)。

安装Logstash:

使用rpm命令安装下载的RPM包。

java 复制代码
sudo rpm -ivh logstash-7.10.0-x86_64.rpm

配置Logstash:

创建或编辑Logstash的配置文件(例如logstash.conf),配置输入(input)、过滤(filter)和输出(output)。对于从MySQL读取数据并发送到Elasticsearch的场景,你需要使用jdbc插件作为输入,并使用elasticsearch插件作为输出。

以下是一个简单的配置示例:

java 复制代码
input {  
  jdbc {  
    jdbc_driver_library => "/path/to/mysql-connector-java.jar"  
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"  
    jdbc_connection_string => "jdbc:mysql://localhost:3306/your_database"  
    jdbc_user => "your_username"  
    jdbc_password => "your_password"  
    statement => "SELECT * FROM your_table"  
  }  
}  
 
output {  
  elasticsearch {  
    hosts => ["localhost:9200"]  
    index => "your_index_name"  
    document_id => "%{some_field}"  
  }  
}

请根据你的实际情况替换数据库连接字符串、用户名、密码等。

java 复制代码
sudo vi /etc/logstash/jvm.options
java 复制代码
-Xms123m  
-Xmx128m

使用命令行参数:

当启动Logstash时,你可以使用-w标志来指定工作线程的数量。例如,要设置工作线程数为2,你可以使用以下命令启动Logstash:

java 复制代码
bin/logstash -f <config-file> -w 2

其中<config-file>是你的Logstash配置文件的路径。

修改配置文件:

在某些情况下,你可能需要在Logstash的配置文件中直接指定工作线程的数量。这通常涉及到修改pipeline的配置。然而,请注意,直接在配置文件中设置工作线程数量可能不是所有Logstash版本都支持的功能。在这种情况下,使用命令行参数可能是更可靠的方法。

确认Logstash是否安装成功

java 复制代码
sudo rpm -qa | grep logstash

检查服务单元文件是否存在

java 复制代码
ls /usr/lib/systemd/system/logstash.service
java 复制代码
sudo rpm -ivh logstash-7.10.0-x86_64.rpm

检查Logstash安装目录

java 复制代码
sudo find / -name logstash.service 2>/dev/null

创建一个新的 logstash.service 文件在 /usr/lib/systemd/system/ 目录下,并填入适当的配置。例如:

java 复制代码
[Unit]  
Description=Logstash  
After=network.target  

[Service]  
Type=simple  
User=logstash  
Group=logstash  
Environment=JAVA_HOME=/usr/share/logstash/jdk  
ExecStart=/usr/share/logstash/bin/logstash "-f" "/etc/logstash/conf.d/"  
Restart=always  

[Install]  
WantedBy=multi-user.target
java 复制代码
sudo systemctl daemon-reload
java 复制代码
sudo systemctl enable logstash  
sudo systemctl start logstash

检查 SELinux 状态:

如果您的系统上启用了 SELinux,并且它在阻止某些操作,您可能需要调整 SELinux 策略或将其设置为 Permissive 模式进行测试。使用 getenforce 命令来检查 SELinux 的状态。

查看 Logstash 和系统的日志文件:

查看 Logstash 的日志文件(通常位于 /var/log/logstash/)以及系统的日志文件(如 /var/log/messages 或使用 journalctl 命令),以获取更多关于安装或配置问题的信息。

查看日志:

如果 Logstash 服务没有按预期运行,您可能需要查看其日志文件以获取更多信息。Logstash 的日志文件通常位于 /var/log/logstash/ 目录下。

使用 journalctl 命令也可以查看 systemd 服务的日志:

java 复制代码
journalctl -u logstash
java 复制代码
sudo groupadd logstash  
sudo useradd -g logstash logstash

验证配置:

在启动Logstash之前,验证您的配置文件是否正确。您可以使用Logstash的-t或--config.test_and_exit选项来测试配置文件的语法是否正确。

java 复制代码
sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/ --config.test_and_exit

运行Logstash:

使用Logstash命令行工具运行你的配置文件。

java 复制代码
sudo /usr/share/logstash/bin/logstash -f /path/to/logstash.conf

安装Logstash:

使用rpm命令安装下载的RPM包。

bash

sudo rpm -ivh logstash-7.10.0-x86_64.rpm

二、配置Logstash

编辑Logstash配置文件:

Logstash的配置文件通常位于/etc/logstash/logstash.yml。你可能需要编辑这个文件来设置一些基本的Logstash参数,如节点名称等。但是,对于允许远程访问,主要的配置在pipeline配置文件中完成。

创建或编辑pipeline配置文件:

Logstash使用pipeline配置文件来描述数据处理的流程。你需要创建一个或多个这样的文件来定义你的数据处理逻辑。对于允许远程访问,你需要确保Logstash监听在所有接口上,以便可以从远程机器接收数据。

例如,创建一个名为logstash-sample.conf的pipeline配置文件,并在其中设置输入和输出插件。对于允许远程访问,你可能需要使用像beats这样的输入插件,它监听在特定端口上等待数据。

conf

input {

beats {

port => 5044

}

}

output {

elasticsearch {

hosts => ["localhost:9200"] # 这里可以替换为你的Elasticsearch实例的地址

index => "your_index_name"

}

}

在这个例子中,Logstash使用beats输入插件监听在5044端口上。确保你的防火墙允许对这个端口的访问。

测试配置文件:

在启动Logstash之前,你可以使用Logstash的-f选项和--config.test_and_exit标志来测试你的配置文件是否有语法错误。

bash

sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-sample.conf --config.test_and_exit

配置防火墙:

确保你的防火墙规则允许对Logstash监听的端口的访问。例如,如果你使用beats输入插件并监听在5044端口上,你需要打开这个端口。

bash

复制代码

sudo firewall-cmd --zone=public --add-port=5044/tcp --permanent

sudo firewall-cmd --reload

三、配置防火墙和网络访问

开放Elasticsearch端口:

默认情况下,Elasticsearch使用9200端口进行HTTP通信。你需要确保防火墙规则允许对该端口的入站连接。

使用firewall-cmd命令开放端口:

java 复制代码
sudo firewall-cmd --zone=public --add-port=9200/tcp --permanent  
sudo firewall-cmd --reload

配置Elasticsearch的网络访问:

确保Elasticsearch的配置文件(elasticsearch.yml)中的network.host设置为0.0.0.0,以允许任何IP地址的访问。如果你只想允许特定IP或IP范围访问,可以设置为具体的IP地址或CIDR表示法。

测试远程访问:

从远程计算机尝试访问Elasticsearch的REST API(例如,使用curl命令或浏览器访问http://your_server_ip:9200/),以验证远程访问是否成功。

完成上述步骤后,你应该能够在CentOS 7.9上成功安装和配置Elasticsearch 7.10.0和Logstash 7.10.0,并确保远程可以访问Elasticsearch。请注意,根据你的具体环境和需求,可能还需要进行其他配置和优化。务必参考官方文档以获取更详细的信息和指导。

可能出现的错误

  1. 解决集群发现设置问题
    Elasticsearch的日志中提到:"the default discovery settings are unsuitable for production use"。这意味着默认的集群发现设置不适合生产环境使用。在单节点环境中,您可以通过编辑Elasticsearch的配置文件(通常是/etc/elasticsearch/elasticsearch.yml)来设置cluster.initial_master_nodes来避免这个警告。例如:
java 复制代码
cluster.initial_master_nodes: ["your_node_name"]

将your_node_name替换为您在elasticsearch.yml中设置的节点名称。

如果您打算运行一个多节点的集群,您需要配置discovery.seed_hosts,它指定了Elasticsearch用于发现其他集群成员的主机列表。例如:

java 复制代码
discovery.seed_hosts: ["host1", "host2", "host3"]

将host1、host2和host3替换为您集群中其他节点的实际主机名或IP地址。

  1. 查看启动引导检查失败的具体原因

    日志中提到有启动引导检查失败,但是没有提供具体的失败原因。要查看这些原因,您需要检查Elasticsearch的日志文件,通常位于/var/log/elasticsearch/目录下。查看与您的集群名称相对应的日志文件(例如my-cluster-name.log),文件中应该包含启动引导检查失败的具体原因。

  2. 根据日志中的错误信息进行修复

    一旦您查看了具体的启动引导检查错误信息,您就可以根据这些信息进行修复。一些常见的启动引导检查失败原因包括:

文件描述符限制太低。

内存锁定限制太低(vm.max_map_count)。

使用了不支持的JVM版本。

节点数据目录的权限问题。

  1. 调整系统配置(如果需要)

根据启动引导检查失败的具体原因,您可能需要调整系统配置。例如,如果vm.max_map_count太低,您可以使用以下命令将其设置为一个较高的值(例如655360):

java 复制代码
sudo sysctl -w vm.max_map_count=655360

为了使这个设置永久生效,您可以将上述行添加到/etc/sysctl.conf文件中。

根据启动引导检查失败的具体原因,您可能还需要调整系统配置。例如,增加文件描述符限制、调整内存锁定限制等。这些配置通常可以在操作系统的系统文件中设置,例如/etc/security/limits.conf和/etc/sysctl.conf。

java 复制代码
input {  
  beats {  
    port => 5044  
  }  
}  
  
filter {  
  # 如果需要,可以在这里添加数据过滤逻辑  
  # ...  
}  
  
output {  
  elasticsearch {  
    hosts => ["localhost:9200"]  # 如果Elasticsearch不在同一台机器上,请替换为正确的地址  
    index => "fruit-%{+YYYY.MM.dd}"  # 使用日期作为索引名的一部分,便于管理  
    document_id => "%{fruitId}"  # 假设数据源中包含fruitId字段,用于设置文档ID  
    # 如果Elasticsearch启用了安全性功能,请添加用户名和密码配置  
    # user => "logstash_internal"  
    # password => "your_password"  
  }  
}

配置

java 复制代码
vim /etc/logstash/conf.d/fruit.conf
java 复制代码
input {
  jdbc {
    jdbc_driver_library => "/installer/mysql-connector-j-8.3.0.jar"
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/fshop_app"
    jdbc_user => "root"
    jdbc_password => "Root123_"
    statement => "SELECT fruit_id AS fruitId, category_id AS categoryId, fruit_name AS fruitName, fruit_origin AS fruitOrigin, fruit_price AS fruitPrice, fruit_standard AS fruitStandard, fruit_detail AS fruitDetail, fruit_image_url AS fruitImageUrl, fruit_pick_time AS fruitPickTime, fruit_quality_time AS fruitQualityTime, fruit_inventory AS fruitInventory, fruit_status AS fruitStatus, version, create_time AS createTime, update_time AS updateTime, other1, other2 FROM fruit"
   #statement => "select * from fruit"
         #schedule => "*/1 * * * *"


           # 是否将 sql 中 column 名称转小写
        lowercase_column_names => false
 }
}


output {

 elasticsearch {
    hosts => ["localhost:9200"]
    index => "fruit"
    document_id => "%{fruitId}"
  }


        stdout {
        codec => json_lines
    }

}
java 复制代码
package com.fshop.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * <p>
 * 水果表
 * </p>
 *
 * @author dev
 * @since 2024-04-23
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "fruit")
public class Fruit implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 水果ID
     */
    @TableId(value = "fruit_id", type = IdType.AUTO)
    @Id
    private Integer fruitId;

    /**
     * 分类ID,外键(关联水果分类表)
     */
    private Integer categoryId;

    /**
     * 水果名称
     */
    @Field(type = FieldType.Keyword)
    private String fruitName;

    /**
     * 水果产地
     */
    private String fruitOrigin;

    /**
     * 水果价格(元/箱)
     */
    private BigDecimal fruitPrice;

    /**
     * 水果规格:小0、中1、大2
     */
    private Integer fruitStandard;

    /**
     * 水果特征详细描述
     */
//    @Field(type = FieldType.Text,analyzer = "ik_smart",searchAnalyzer = "ik_max_word")
//    private String fruitDetail;

    @CompletionField(analyzer = "ik_smart", searchAnalyzer = "ik_max_word")
    private String fruitDetail;

    /**
     * 水果主图片URL
     */
    private String fruitImageUrl;

    /**
     * 采摘时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Field( type = FieldType.Date,name = "fruit_pick_time",format = {},
            pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd'T'HH:mm:ss'+08:00' || strict_date_opotional_time || epoch_millis")
    private LocalDateTime fruitPickTime;








    /**
     * 保存时间(天)
     */
    private Integer fruitQualityTime;

    /**
     * 库存(箱)
     */
    private Integer fruitInventory;

    /**
     * 水果状态:已下架0、秒杀中1、售卖中2
     */
    private Integer fruitStatus;

    /**
     * 版本
     */
    private Integer version;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Field( type = FieldType.Date,name = "create_time",format = {},
            pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd'T'HH:mm:ss'+08:00' || strict_date_opotional_time || epoch_millis")
    private LocalDateTime createTime;

    /**
     * 最近更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Field( type = FieldType.Date,name = "update_time",format = {},
            pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd'T'HH:mm:ss'+08:00' || strict_date_opotional_time || epoch_millis")
    private LocalDateTime updateTime;

    private String other1;

    private String other2;

}
sql 复制代码
-- fshop_app.fruit definition

CREATE TABLE `fruit` (
  `fruit_id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '水果ID',
  `category_id` int unsigned DEFAULT NULL COMMENT '分类ID,外键(关联水果分类表)',
  `fruit_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '水果名称',
  `fruit_origin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '水果产地',
  `fruit_price` decimal(10,2) NOT NULL COMMENT '水果价格(元/箱)',
  `fruit_standard` tinyint unsigned NOT NULL COMMENT '水果规格:小0、中1、大2',
  `fruit_detail` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '水果特征详细描述',
  `fruit_image_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '水果主图片URL',
  `fruit_pick_time` datetime NOT NULL COMMENT '采摘时间',
  `fruit_quality_time` int unsigned NOT NULL COMMENT '保存时间(天)',
  `fruit_inventory` int unsigned NOT NULL COMMENT '库存(箱)',
  `fruit_status` tinyint unsigned NOT NULL COMMENT '水果状态:已下架0、秒杀中1、售卖中2',
  `version` int unsigned NOT NULL DEFAULT '1' COMMENT '版本',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '最近更新时间',
  `other1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `other2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  PRIMARY KEY (`fruit_id`) USING BTREE,
  KEY `fk_fruit_category` (`category_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=137 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC COMMENT='水果表';
相关推荐
Luke~~1 小时前
实验室服务器Ubuntu安装使用全流程
linux·运维·ubuntu
hc_bmxxf1 小时前
Linux应用软件编程-多任务处理(线程)
linux·线程
tjjingpan1 小时前
在国产电脑上运行PDFSAM软件使用pdf分割合并交替混合处理pdf文档
linux·pdf
hope_wisdom2 小时前
Linux系统编程之目录遍历
linux·linux编程·readdir·目录遍历·scandir
暗碳3 小时前
华为麦芒5(安卓6)termux记录 使用ddns-go,alist
android·linux
靡樊3 小时前
Linux:基础IO
linux
菜鸟康3 小时前
Linux系统编程——理解系统内核中的信号捕获
linux·运维·服务器
张明奇-琦玉3 小时前
Boost之log日志使用
linux·服务器·算法
云计算DevOps-韩老师4 小时前
【网络云计算】2024第52周-每日【2024/12/26】小测-理论&实操-备份MySQL数据库并发送邮件-解析
linux·开发语言·网络·数据库·mysql·云计算·perl
ac.char4 小时前
Ubuntu系统下 npm install -g tauri 报错问题处理
linux·ubuntu·npm