如何在Centos7上安装Elasticsearch7.6并运行集群

如何在Centos7上安装Elasticsearch7.6并运行集群
Elasticsearch是一个开源的分布式全文本搜索和分析引擎。它支持RESTful操作,并可以实时存储,搜索和分析大量数据,可以在很多场景中得到运用,如大型电子商务商店和分析应用程序。本文将介绍如何在CentOS7上安装Elasticsearch并启动多节点搭建集群。

前提条件

登录需有sudo权限或者直接使用root用户进行安装,我这里首先使用root用户进行登录。

软硬环境

硬件:单核,4G内存,20G磁盘
系统:CentOS Linux release 7.7.1908 (Core)

1、安装JDK

因为Elasticsearch使用的是Java技术,所以我们需要先安装Java环境,Elasticsearch7.6需要Java8或更高版本。
可以参考官方支持列表:https://www.elastic.co/cn/support/matrix#matrix_jvm
elasticsearch-jdk-env

我这里使用的是OpenJDK 8,使用如下命令进行安装:

[root@myserver ~]# yum install java-1.8.0-openjdk-devel

安装完成后检验是否安装成功:

[root@myserver ~]# java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

如果出现类似如上的输出结果,则说明jdk安装成功。

2、安装Elasticsearch

下载安装包

[root@myserver ~]# curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.1-linux-x86_64.tar.gz

然后解压安装

[root@myserver ~]# tar -xvf elasticsearch-7.6.1-linux-x86_64.tar.gz

启动Elasticsearch

[root@myserver ~]# cd elasticsearch-7.6.1/bin
[root@myserver bin]#./elasticsearch

注意,使用root用户启动会失败,并看到如下错误:

OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
[2020-03-12T14:21:48,939][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [MiWiFi-R3P-srv] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:174) ~[elasticsearch-7.6.1.jar:7.6.1]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:161) ~[elasticsearch-7.6.1.jar:7.6.1]
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.6.1.jar:7.6.1]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:125) ~[elasticsearch-cli-7.6.1.jar:7.6.1]
    at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.6.1.jar:7.6.1]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:126) ~[elasticsearch-7.6.1.jar:7.6.1]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.6.1.jar:7.6.1]
Caused by: java.lang.RuntimeException: can not run elasticsearch as root
    at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:105) ~[elasticsearch-7.6.1.jar:7.6.1]
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:172) ~[elasticsearch-7.6.1.jar:7.6.1]
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:349) ~[elasticsearch-7.6.1.jar:7.6.1]
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:170) ~[elasticsearch-7.6.1.jar:7.6.1]
    ... 6 more

这个错误是因为elasticsearch不允许使用root用户启动,我们需要使用其它非root用户启动。可以考虑新建用户,并将Elasticsearch解压目录的权限修改为此用户。

[root@myserver ~]# cd ~
[root@myserver ~]# adduser test
[root@myserver ~]# passwd test
给test用户添加sudo权限
[root@myserver ~]# whereis sudoers
[root@myserver ~]# ls -l /etc/sudoers  //查看文件权限,默认为只读
[root@myserver ~]# chmod -v u+w /etc/sudoers  //修改文件权限为可编辑
[root@myserver ~]#  vi /etc/sudoers //进入文件编辑器
 文件内容改变如下:
root ALL=(ALL) ALL 已有行
test ALL=(ALL) ALL 新增这一行
[root@myserver ~]#  chmod -v u-w /etc/sudoers  //修改文件权限为只读
将elasticsearch解压目录移动到test用户路径下
[root@myserver ~]# mv elasticsearch-7.6.1 /home/test/
[root@myserver ~]# cd /home/test
将elasticsearch解压目录权限修改为test用户和test组
[root@myserver test]# chown -R test:test elasticsearch-7.6.1/
[root@myserver test]# su - test
[test@myserver ~]$ cd elasticsearch-7.6.1/bin
然后运行elasticsearch
[test@myserver bin]$ ./elasticsearch

然后我们使用API检测是否启动成功:

[test@myserver ~]$ curl http://localhost:9200/_cat/health?v
输出结果:
epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1583995591 06:46:31  elasticsearch green           1         1      0   0    0    0        0             0                  -                100.0%

如果看到如上的输出结果则说明启动成功。

3、多节点集群

步骤2中的启动方式只是单节点的Elasticsearch,如果要启动多个节点建立集群,我们需要在启动时指定数据和日志路径。比如我们再添加两个节点:

[test@myserver bin]$ ./elasticsearch -Epath.data=data2 -Epath.logs=log2
[test@myserver bin]$ ./elasticsearch -Epath.data=data3 -Epath.logs=log3

Elasticsearch会自动为节点分配唯一ID,因为我们是在本地运行,新启动的节点会自动加入第一个节点形成集群。

然后使用API查看集群信息

[test@myserver ~]$ curl http://localhost:9200/_cat/health?v
输出结果:
epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1583996452 07:00:52  elasticsearch green           3         3      0   0    0    0        0             0                  -                100.0%

如果输出类似如下信息则说明集群搭建成功。

4、开启远程访问

默认启动elasticsearch服务后,只能通过127.0.0.1:9200来访问。如果需要远端访问,则需要修改elasticsearch.yml中的network.host参数。方法如下:

[test@myserver  config]$ vi elasticsearch.yml
network.host: 0.0.0.0  //允许所有IP访问

修改完后我们需要修改防火墙,开启9200端口

[test@myserver  config]$ sudo firewall-cmd --permanent --add-port=9200/tcp
[test@myserver  config]$ sudo  firewall-cmd --reload
[test@myserver  config]$ sudo firewall-cmd --list-ports
9200/tcp

修改完后就可在浏览器使用API方式进行ElasticSearch访问了:
http://192.168.31.100:9200
输出结果如下:

{
    name: "node-1",
    cluster_name: "elasticsearch",
    cluster_uuid: "dvFfvtvVQqiX8uoE-2V-YA",
    version: {
        number: "7.6.1",
        build_flavor: "default",
        build_type: "tar",
        build_hash: "aa751e09be0a5072e8570670309b1f12348f023b",
        build_date: "2020-02-29T00:15:25.529771Z",
        build_snapshot: false,
        lucene_version: "8.4.0",
        minimum_wire_compatibility_version: "6.8.0",
        minimum_index_compatibility_version: "6.0.0-beta1"
    },
    tagline: "You Know, for Search"
}

使用cat API : http://192.168.31.100:9200/_cat/

=^.^=
/_cat/allocation
/_cat/shards
/_cat/shards/{index}
/_cat/master
/_cat/nodes
/_cat/tasks
/_cat/indices
/_cat/indices/{index}
/_cat/segments
/_cat/segments/{index}
/_cat/count
/_cat/count/{index}
/_cat/recovery
/_cat/recovery/{index}
/_cat/health
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/{alias}
/_cat/thread_pool
/_cat/thread_pool/{thread_pools}
/_cat/plugins
/_cat/fielddata
/_cat/fielddata/{fields}
/_cat/nodeattrs
/_cat/repositories
/_cat/snapshots/{repository}
/_cat/templates

5、错误解决

在启动过程中可能会遇见下面的错误:
ERROR: [3] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[3]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured

错误1:[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
意思是说,对于elasticsearch需要将每个进程最大同时打开文件数由4096改为65535个。解决方法如下:

[test@myserver ~]$ su - root
[root@myserver ~]# vi /etc/security/limits.conf

在文件末尾添加如下内容

*    soft    nofile    65536
*    hard   nofile    65536

验证是否修改成功

[root@myserver ~]# ulimit -Hu
65536
[root@myserver ~]# ulimit -Su
65536

错误2:[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
意思是说,对于elasticsearch需要将虚拟内存大小由65530改为262144个。解决方法如下:

[root@myserver ~]# vi /etc/sysctl.conf

在文件末尾添加如下配置

vm.max_map_count = 262144

验证是否修改成功

[root@myserver ~]# sysctl -p
vm.max_map_count=262144

错误3:[3]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
意思是说,对于生产环境,现在的服务发现配置不能满足要求,至少得设置discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes中的一个。参数说明如下:

  • discovery.seed_hosts:自动发现设置,配置之后集群的主机之间可以自动发现。
  • discovery.seed_providers:基于文件的自动发现设置,配置之后集群的主机之间可以自动发现。
  • cluster.initial_master_nodes:设置一系列符合主节点条件的节点的主机名或IP地址来引导启动集群。如果手动设置了node.name,还可以设置为此节点的名称。

解决方法如下:

[test@myserver  config]$ vi elasticsearch.yml
# custom config
node.name: "node-1"
discovery.seed_hosts: ["127.0.0.1", "[::1]"]
cluster.initial_master_nodes: ["node-1"]

重点是node.namecluster.initial_master_nodes

错误1、错误2需要重新登录用户已才能起作用。错误3需要重启ElasticSearch才能生效。

the end

热门文章