前言

elasticsearch(下面称为ES)是一个基于Lucene的搜索服务器(By 百度百科:查看),所以他需要java的环境即jdk。如何安装jdk就不在赘述了,无非就是删除原版本后解压再添加环境变量

注1:如果已经安装了ES和ik,需要重新安装,需要把/usr/share/elasticsearch/plugins/路径下ik删除,避免版本不匹配导致ES不能启动

注2:再往linux中安装软件时,尤其是需要在网页上测试的软件时,需要将防火墙关闭,ES就是,如果不关闭防火墙,可以ping通,但是加上9200端口进行访问时便会连接失败。

注3:在虚拟机或者真正的服务器上,必须要把ip地址写死,否则会出现一些莫名其妙的错误,(今天在虚拟机上搭建es,自动获取ip的状态下宿主机无法ping通,写死之后便可以ping通了)

安装过程

  1. Elasticsearch的官网:下载 Elastic 产品 | Elastic
  2. 使用wget命令获取ES:wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.tar.gz
  3. 解压:tar -xvzf elasticsearch-6.3.1.tar.gz,需要注意的是,处于安全考虑,es是不允许root用户启动的,也就是说必须创建一个普通用户进行解压es安装包,如果用root用户解压之后,则需要将文件的所有者进行改变
    adduser 用户名
    chown -R 用户名:用户名组 目录路径
  4. 修改配置文件:vim elasticsearch-6.3.1/config/elasticsearch.yml 
    在该配置文件的末尾复制添加上如下信息即可,省的一个个找修改再取消注释,如下信息其实就是该文件中需要修改的汇总,为了简便,可以直接复制添加。

    # 集群的名字,需要自定义,如果是想要搭建es集群,则保持此项相同即可
     cluster.name: luying
    # 节点名字,需要自定义,如果想要搭建es集群,则保证此项不同即可
     node.name: luying-master
    # 是否是master
     node.master: true
    # ES的监听地址,这样别的机器也可以访问,有的教程说此项设置成0.0.0.0代表任意ip都可以访问本es,但失
    # 败了,还是写成本机ip为正确写法,不要写成localhost,那样其他ip无法访问,一定要写固定ip
     network.host: 192.168.2.133
    # 默认的就好,es启动后通过web访问es,只需输入ip:9200,出现一个json即代表成功
     http.port: 9200
    # 本机最大允许运行节点个数,默认即可
     node.max_local_storage_nodes: 3
    # 增加新的参数,这样head插件可以访问es,解决跨域访问问题,一把用不到
    # http.cors.enabled: true
    # http.cors.allow-origin: "*"

  5. 启动:./elasticsearch-6.3.1/bin/elasticsearch(注意一定要用普通用户启动才可以)

  6. 检验:使用浏览器,输入ip:9200,出现json返回信息

  7. 关闭:直接使用Ctrl+C可以;但最好是使用命令:./elasticsearch -stop

  8. 后台启动命令:./elasticsearch -d

集群部署

分别拷贝下载的es文件在三个不同的文件夹下,分别配置config/elasticsearch.yml

实例: ES1文件夹下的配置:

.............
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true

# 集群的名字  必须与其他机器相同
cluster.name: niezp

# 节点名字,必须与其他节点不同
node.name: niezp-slave1

# 修改一下ES的监听地址,这样别的机器也可以访问
network.host: 192.168.174.148

#  不能和其他的节点相同
http.port: 9202
#这里要说下,这里的IP地址就是你的mater es的机器ip地址,比如部署在本机可以下127.0.0.1 别的机器就写别的机器的ip
discovery.zen.ping.unicast.hosts: ["192.168.174.148"]
node.max_local_storage_nodes: 3
# 增加新的参数,这样head插件可以访问es
#http.cors.enabled: true
#http.cors.allow-origin: "*"

实例: ES2文件夹下的配置:

.......
# ---------------------------------- Various -----------------------------------
#
# Require explicit names when deleting indices:
#
#action.destructive_requires_name: true

# 集群的名字  必须与其他机器相同
cluster.name: niezp

# 节点名字,必须与其他节点不同
node.name: niezp-slave2

# 修改一下ES的监听地址,这样别的机器也可以访问
network.host: 192.168.174.148

# 不能和其他的节点相同
http.port: 9201
#同实例1说明
discovery.zen.ping.unicast.hosts: ["192.168.174.148"]
node.max_local_storage_nodes: 3
# 增加新的参数,这样head插件可以访问es
#http.cors.enabled: true
#http.cors.allow-origin: "*"

 相关技术

  1. Linux 添加用户、删除用户、用户授权
    1. 添加用户
      1. 命令:只设置账户和密码只用两步
        useradd或adduser命令,使用权限是超级用户(root)。例如:useradd esuser
        passwd命令。例如:passwd esuser    之后输入两次密码即可。
      2. 格式:useradd [-d home] [-s shell] [-c comment] [-m [-k template]] [-f inactive] [-e expire ] [-p passwd] [-r] name
      3. 参数详解:

        -c: 加上备注文字,备注文字保存在passwd的备注栏中。 

        -d:指定用户登入时的主目录,替换系统默认值/home/<用户名> 

        -D:变更预设值。 

        -e:指定账号的失效日期,日期格式为MM/DD/YY,例如06/30/12。缺省表示永久有效。 

        -f:指定在密码过期后多少天即关闭该账号。如果为0账号立即被停用;如果为-1则账号一直可用。默认值为-1. 

        -g:指定用户所属的群组。值可以使组名也可以是GID。用户组必须已经存在的,期默认值为100,即users。 

        -G:指定用户所属的附加群组。 

        -m:自动建立用户的登入目录。 

        -M:不要自动建立用户的登入目录。 

        -n:取消建立以用户名称为名的群组。 

        -r:建立系统账号。 

        -s:指定用户登入后所使用的shell。默认值为/bin/bash。 

        -u:指定用户ID号。该值在系统中必须唯一。0~499默认是预留给系统用户账号,所以该值必须大于499。

      4. 举例:useradd -u 544 -d /usr/testuser1 -g users -m esuser1
        建立一个新用户账户esuser1,并设置UID为544,主目录为/usr/esuser,属于users组。使用useradd命令所建立的账号,实际上是保存在/etc/passwd文本文件中。

    2. 删除用户

      1. 删除用户:userdel esuser 

      2. 删除用户及目录:userdel -f esuser

      3. 无法删除:删除时userdel esuser ,提示userdel: user esuser is currently used by process 1354 
        该提示证明,被删除账户正在使用无法删除,此时只能将该账户强制下线
        使用“w”命令查看此时正在登陆的账户

        使用pkill命令强制退出用户:pkill -kill -t pts/1
    3. 用户权限
      1. 账号属性:使用id命令

        usermod -G GROUPS USERNAME:改变用户的附加组,会完全替换原有的附加组
        usermod -G -a GROUPS USERNAME:在原有附加组的基础上追加附加组
        usermod -d PATH USERNAME:修改家目录。修改后原先家目录中的文件不能访问了,因为在当前的家目录中并不存在这些文件。
        usermod -l NEWNAME USERNAME:改变用户名
        usermod -e USERNAME:指定该用户的过期时间
        usermod -L USERNAME:锁定用户
        usermod -U USERNAME:解锁用户

      2. 密码管理:只能用根用户操作,被操作的只能是非根用户
        passwd –stdio:标准输入读取密码
        passwd -l:锁定用户账号(root only)
        passwd -u username:解锁用户账号(root only)
        passwd -d username:删除用户密码。用户密码删除后不能登录。
        passwd [username] : 修改密码

      3. group管理:​​​​​

    4. 文件权限:
      1. 使用ll命令,共显示七列信息,从左至右依次为:权限、文件数、归属用户、归属群组、文件大小、创建日期、文件名称

        -:第一位表示文件类型
           d 文件夹
              - 普通文件
              l 链接
           b 块设备文件
              p 管道文件
           c 字符设备文件
           s 套接口文件
        owner/group/others三种身份各有自己的read/write/execute权限:
        rwx :第2-4位表示这个文件的属主拥有的权限。r是读、w是写、x是执行 
        rwx :第5-7位表示和这个文件属主所在同一个组的用户所具有的权限 
        rwx :第8-10位表示其他用户所具有的权限

      2. 常用的linux文件权限:

        各权限的分数对照表如下:     r:4   w:2   x:1;每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,下面则是常用的权限示例

        444 r--r--r--
        600 drw-------
        644 drw-r--r--
        666 drw-rw-rw-
        700 drwx------
        744 drwxr--r--
        755 drwxr-xr-x
        777 drwxrwxrwx

      3. 修改文件权限:

        1. 数字类型改变档案权限:chmod [-R] xyz 档案或目录 
          xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。 
          -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有档案都会变更

        2. 符号类型改变档案权限
          文件的九个权限分别对应(1)user (2)group (3)others三种身份,那么我们就可以藉由u, g, o来代表三种身份的权限!此外, a 则代表 all 亦即全部的身份!那么读写的权限就可以写成r, w, x,也就是可以使用底下的方式来看:

          示例:设定一个档案的权限成为『-rwxr-xr-x』

          注意:三种身份之间用“,”连接,中间没有任何空格符,并且可以任意组合。

        3. ACL权限分配:chmod 权限分配是对所有用户进行设置,但在权限细分需求时存在不足, 此时可使用acl权限分配。(ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。它被设计为UNIX文件权限管理的一个补充。ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。)
          什么是ACL权限呢?

    5. ​​​​获取管理员权限:即获取sudo权限

      1. 修改 /etc/sudoers文件:/etc/sudoers文件存放着sudo的相关用户,但是默认没有写权限的,所以需要使用 chmod u+w /etc/sudoers 给 sudoers 授权

      2. 修改 /etc/sudoers 文件

      3. 修改 /etc/passwd 文件


        友情提醒:虽然方法三看上去简单方便,其实是将一般用户完全等同于了root用户,可能会造成一些无法预料的问题,因此一般不推荐使用,推荐使用方法二。​​​​

  2. 修改网卡信息:将ip地址写死,避免出现无法访问的情况。

    1. 修改网卡文件: /etc/sysconfg/network-scripts/...

  3. 关闭防火墙,或者开放对应端口

    1. sudo systemctl stop firewalld.service
      sudo systemctl disable firewalld.service
      sudo systemctl stop iptables.service
      sudo systemctl disable iptables.service

      sudo vim /etc/selinux/config

      在生产环境中,防火墙是不可以关闭的,需要的是开放端口。

      注释下面两行:

      #SELINUX=enforcing

      #SELINUXTYPE=targeted

      sudo setenforce 0

    2. 此处使用一个命令即可:iptables -F  即清除预设表filter中的所有规则链的规则
    3. 开放端口:
      ​​​​​​​
       

ES部署过程中的报错解析

  1. elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
    

    ES不能能使用root用户直接运行,必须使用普通用户运行。
    解决办法:添加用户,ES安装目录的所有者。

  2. Exception in thread "main" java.nio.file.AccessDeniedException: /opt/app/elasticsearch-6.6.0/config/jvm.options
    

    使用的用户对安装目录的文件没有权限造成的,(可能是当前登录的用户没有权限,也可能是在更改安装目录的所有者的时候没有递归安装)
    解决办法:
    切换用户在启动es,如果报同样错误,使用chown -R 用户名:用户组名 目录路径更改文件所有者。

  3. [WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [es1] uncaught exception in thread [main]
    org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: Unable to access ‘path.data’ (/var/es/dat)
    

    因为不是root用户,在配置文件的时候。数据目录和日志目录等不能应该放在用户家目录下,防止因为该用户不能在所设置的目录下创建文件而引起报错。

  4. [unknown] unable to install syscall filter: 
    java.lang.UnsupportedOperationException: seccomp unavailable: CONFIG_SECCOMP not compiled into kernel, CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed
    

    Centos6不支持SecComp,而高版本ES在5.X之后默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动
    解决办法(两种):
    1.可以把Centos内核升级到Centos7。
    2.修改配置文件,关闭ES启动时候的安全检测。具体elasticsearch.yml中配置

  5.  initial heap size [104857600] not equal to maximum heap size [209715200]; this can cause resize pauses and prevents mlockall from locking the entire heap
    
    【1】: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536] 
    【2】: max number of threads [1024] for user [es] is too low, increase to at least [4096] 
    【3】: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
    

    【1】系统设置的文件描述符太少了
    【2】为用户设置的可以开启的线程太少了
    这两个可以通过配置文件vi /etc/security/limits.conf 更改,添加如下内容:(这里只为启动ES的es用户更改了安全限制)

    es soft nofile 65536   #solf是软限制的意思,hard是硬限制;软限制可以在程序的进程中自行改变(突破限制),而硬限制则不行(除非程序进程有root权限)
    es hard nofile  65536  #nofile 文件描述符
    es soft nproc 4096    #nproc  进程的限制
    es hard nproc 4096	
    

    这里两个的设置没有让其立即生效的命令,因此如果修改之后重启ES还报该错则需要重启机器。另外网上很多直接把第一项换为“ * ”,*是指所有用户,如果在生产中强烈不建议这样做,可能会对其他用户造成影响。
    其实生产环境,服务器是很难重启的,所以很少有软件安装时需要重启,此处并不需要重启,将当前用户重新登入,就可以了。
    【3】虚拟内存区域最大映射值太小了 通过vi /etc/sysctl.conf 可以更改。
    切换到root用户修改配置sysctl.conf
    vi /etc/sysctl.conf
    添加下面配置:
    vm.max_map_count=655360
    并执行命令:
    sysctl -p(可以使其永久)

  6. 本机可以访问.但是局域网外的其他机器无法访问
    修改elasticsearch.yml配置文件,network.host项,绑定本机的IP
    PS:在配置文件中的localhost,回环IP,路径是tmp的一定要注意更改。

  7. SettingsException[Failed to load settings from [elasticsearch.yml]]; nested: 	ParsingException[Failed to parse object: expecting token of type [START_OBJECT] but found [VALUE_STRING]];
    

    配置文件格式错误:
    配置文件的key:value之间的:后面必须有一个空格。

  8. Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408, 0) failed; error='Cannot allocate memory' (errno=12)
    #
    # There is insufficient memory for the Java Runtime Environment to continue.
    # Native memory allocation (mmap) failed to map 986513408 bytes for committing reserved memory.
    

    内存不足导致Java无法运行,(在elasticsearch和logstash中均可能出现)
    解决办法:
    这个时候查看一下free -m 查看可用内存,然后查看config下的jvm.options文件,-Xms1g-Xmx1g配置的内存大小,更改此而配置项或者添加内存均可。

  9. 第一次启动使用root用户启动,在config目录下创建了文件,需要删除

  10. Error: Port 5601 is already in use. Another instance of Kibana may be running!
    

    这是因为5601的端口被占用了,一般有因为以下几种可能而导致:
    netstat -tunlp|grep 5601   #查看端口占用情况,找到端口对应的进程id
    ps aux | grep PID  #查看对应的进程 
    #然后根据进程情况确定更改哪一个程序的端口号,使其不冲突即可

  11. Caused by: java.net.BindException: Cannot assign requested addres

    配置外网
    进入 config/ elasticsearch.ym
    打开配置文件elasticsearch.yml 将 network.host: 192.168.0.1 修改为本机IP 0.0.0.0

  12. [warning][license][xpack] License information from the X-Pack plugin could not be obtained from Elasticsearch for the [data] cluster. [invalid_index_name_exception] Invalid index name [_xpack], must not start with '_'., with { index_uuid="_na_" & index="_xpack" } :: {"path":"/_xpack","statusCode":400,"response":"{\"error\":{\"root_cause\":[{\"type\":\"invalid_index_name_exception\",\"reason\":\"Invalid index name [_xpack], must not start with '_'.\",\"index_uuid\":\"_na_\",\"index\":\"_xpack\"}],\"type\":\"invalid_index_name_exception\",\"reason\":\"Invalid index name [_xpack], must not start with '_'.\",\"index_uuid\":\"_na_\",\"index\":\"_xpack\"},\"status\":400}"}
    

    Kibana连接elasticsearh的时候,浏览器中报错为
    Cannot connect to the Elasticsearch cluster currently configured for Kibana.
    `To use the full set of free features in this distribution of Kibana, please update Elasticsearch to the default distribution.```
    看报错信息显示因该是版本的问题,但是理论上elatic官网上的一套应该是没有问题的,我试着卸载X-pack,发现es不能卸载,然后尝试了很多办法无果后,提交给了官网,收到回复如下:
     

    您好,
    非常感谢您的回复。
    初步了解您的情况之后,我找到了一个跟您问题相似的帖子,麻烦您参考下
    https://discuss.elastic.co/t/license-information-from-the-x-pack-plugin-could-not-be-obtained-from-elasticsearch-for-the-data-cluster/148030/9

    不知道您是否方便尝试用下oss only的kibana?
    https://www.elastic.co/downloads/kibana-oss

    麻烦您看下是否能帮助解决您的问题~ 如果还有问题欢迎随时与我联系。您也可以加我的微信:(这个就不显示了)

    希望Elastic能带给您一个无与伦比的使用体验!

    Best regards,

    重点在上周新版本更新中,我直接用了最新的6.6.1,然后就没有问题了,哈哈

  13. elasticsearch 6.6.1的新报错
     

    Java HotSpot(TM) 64-Bit Server VM warning: Cannot open file logs/gc.log due to Permission denied
    
    Exception in thread "main" org.elasticsearch.bootstrap.BootstrapException: java.nio.file.AccessDeniedException: /opt/app/elasticsearch-6.6.1/config/elasticsearch.keystore
    Likely root cause: java.nio.file.AccessDeniedException: /opt/app/elasticsearch-6.6.1/config/elasticsearch.keystore
    

    第一次启动es使用了root用户,在config目录下创建了文件elasticsearch.keystore,只需要进入之后把文件删除,然后用es的用户启动就可以了。

  14. 浏览器连接不上Kibana,资源无限重定向(特别早遇到的报错,今天想起来了)
    在使用6.6.1的Kibana的时候,集群跑一个周末,不操作,等到周一的时候,会出现浏览器连接补了Kibana的情况,但是Kibana的进程什么的都正常,报错信息好像是因为资源无限重定向这样的信息。
    这个问题咨询官网好像也是版本问题,具体情况我忘记了,但是现在记得还有一个这样的问题,大家如果遇到了可以

    今天搭建集群的时候遇到新的报错,是因为我在一个节点启动了es,生成了数据文件,然后没有删除数据文件,就把目录用scp拷贝到其他的节点上而造成的,具体的报错信息如下:
     

    failed to send join request to master [{node10}{nIHo2TdDRw-1-nbhr-Lmzw}{n_vGmHO9R2umfw99C5nOSg}{192.168.56.10}{192.168.56.10:9300}{ml.machine_memory=1968349184, ml.max_open_jobs=20, xpack.installed=true, ml.enabled=true}], reason [RemoteTransportException[[node10][192.168.56.10:9300][internal:discovery/zen/join]]; nested: IllegalArgumentException[can't add node {node11}{nIHo2TdDRw-1-nbhr-Lmzw}{XcZDBLmxRCeKsHm4jp2M8w}{192.168.56.11}{192.168.56.11:9300}{ml.machine_memory=1968349184, ml.max_open_jobs=20, xpack.installed=true, ml.enabled=true}, found existing node {node10}{nIHo2TdDRw-1-nbhr-Lmzw}{n_vGmHO9R2umfw99C5nOSg}{192.168.56.10}{192.168.56.10:9300}{ml.machine_memory=1968349184, xpack.installed=true, ml.max_open_jobs=20, ml.enabled=true} 
    with the same id but is a different node instance]; 
    

    删除安装目录下的data文件夹,然后重新启动即可。

  15. 更多问题可以参考博客:elasticsearch部署过程中各种报错解析_wang__xg的博客-CSDN博客_elasticsearch报错 
    csdn作者名字:wang__xg;链接地址:wang__xg的博客_CSDN博客-python,运维,ELK领域博主
    或者
    生产环境使用elasticsearch遇到的一些问题以及解决方法(不断更新)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐