使用elasticsearch的默认配置的话,一台机器上只能启动一个elasticsearch实例,下面是配置多实例的过程。 1.环境介绍 操作系统:centos7 elasticsearch版本:5.6.1 启动实例个数:2个 elasticsearch安装方式:使用官方yum源,yum安装。 2.elasticsearch配置 2.1 配置目录结构 [root@localhost etc]# tree /etc/elasticsearch /etc/elasticsearch ├── elasticsearch-config-9200 │   ├── elasticsearch.yml │   ├── jvm.options │   ├── log4j2.properties │   └── scripts ├── elasticsearch-config-9201 │   ├── elasticsearch.yml │   ├── jvm.options │   ├── log4j2.properties │   └── scripts 默认的话,elasticsearch的配置文件放在/etc/elasticsearch目录下。 多实例的话,在/etc/elasticsearch下分别创建elasticsearch-config-9200和elasticsearch-config-9201两个目录,jvm.options根据自身情况修改。 2.2 配置文件内容 2.2.1 9200es节点的配置文件内容 [root@localhost etc]# egrep -v "^$|^#" /etc/elasticsearch/elasticsearch-config-9200/elasticsearch.yml cluster.name: sfbest-es node.name: es-7-168-9200 path.data: /home/es-data-9200 path.logs: /var/log/elasticsearch-9200 bootstrap.memory_lock: false network.host: 0.0.0.0 http.port: 9200 transport.tcp.port: 9300 http.cors.enabled: true http.cors.allow-origin: "" node.max_local_storage_nodes: 2 //单机上最大允许运行的es实例个数 discovery.zen.ping.unicast.hosts: ["10.10.10.245","10.10.10.168:9300","10.10.10.168:9301"] action.destructive_requires_name: true cluster.routing.allocation.same_shard.host: true //如果是多实例的话,为防止索引分片丢失,需要开启这个参数。 2.2.2 9201es节点的配置文件内容 cluster.name: sfbest-es node.name: es-7-168-9201 path.data: /home/es-data-9201 path.logs: /var/log/elasticsearch-9201 bootstrap.memory_lock: false network.host: 0.0.0.0 http.port: 9201 transport.tcp.port: 9301 http.cors.enabled: true http.cors.allow-origin: "" node.max_local_storage_nodes: 2 discovery.zen.ping.unicast.hosts: ["10.10.10.245","10.10.10.168:9300","10.10.10.168:9301"] action.destructive_requires_name: true cluster.routing.allocation.same_shard.host: true

**注:**9200和9201节点的配置文件,区别就是数据存放目录、日志存放目录、服务端口、集群间相互通信的端口不同,其余都一样;数据目录和日志目录都需手动创建,属主数组都是elasticsearch用户。 注:“cluster.routing.allocation.same_shard.host: true”参数的作用,es天生集群特性,用户只管往es集群里存放数据,es主节点会把数据分布到各个节点,目的是为了保证节点宕机后数据不丢失。如果一台机器上起多个es实例的话,因为es集群默认不知道这个机器上有多个es实例,所以可能会出现把本该分散放到多个机器的某些索引分片,都集中放到了这个多实例的机器上,因为es以为这几个多实例是分布在不同的机器上,假如这个多节点的机器宕机,那就可能会造成丢失数据。上面那个参数的作用就是,允许es主节点探测该物理机是不是存在多个实例,如果存在多个实例,则只给这个机器一份独立数据,也就是说es集群存储数据时,会把这些在一台机器上的多个实例当做一个实例来对待。 **注:**es多实例的好处,因为JVM局限性,es最大分配内存不要超过32G,否则jvm垃圾回收会严重影响性能。es实例最大给32G内存,而物理机内存很大,所以就可以启动多个实例,来提高整个es集群的性能。 3.elasticsearch启动文件修改 3.1 9200es节点的启动文件内容 [root@localhost etc]# egrep -v "^$|^#" /usr/lib/systemd/system/elasticsearch-9200.service [Unit] Description=Elasticsearch Documentation=http://www.elastic.co Wants=network-online.target After=network-online.target [Service] Environment=ES_HOME=/usr/share/elasticsearch Environment=CONF_DIR=/etc/elasticsearch/elasticsearch-config-9200 Environment=DATA_DIR=/var/lib/elasticsearch Environment=LOG_DIR=/var/log/elasticsearch Environment=PID_DIR=/var/run/elasticsearch-9200 EnvironmentFile=-/etc/sysconfig/elasticsearch WorkingDirectory=/usr/share/elasticsearch User=elasticsearch Group=elasticsearch ExecStartPre=/usr/share/elasticsearch/bin/elasticsearch-systemd-pre-exec ExecStart=/usr/share/elasticsearch/bin/elasticsearch
-p ${PID_DIR}/elasticsearch.pid
--quiet
-Edefault.path.logs=${LOG_DIR}
-Edefault.path.data=${DATA_DIR}
-Edefault.path.conf=${CONF_DIR} StandardOutput=journal StandardError=inherit LimitNOFILE=65536 LimitNPROC=2048 LimitAS=infinity LimitFSIZE=infinity TimeoutStopSec=0 KillSignal=SIGTERM KillMode=process SendSIGKILL=no SuccessExitStatus=143 [Install] WantedBy=multi-user.target 3.2 9201es节点的启动文件内容 [root@localhost etc]# egrep -v "^$|^#" /usr/lib/systemd/system/elasticsearch-9201.service
[Unit] Description=Elasticsearch Documentation=http://www.elastic.co Wants=network-online.target After=network-online.target [Service] Environment=ES_HOME=/usr/share/elasticsearch Environment=CONF_DIR=/etc/elasticsearch/elasticsearch-config-9201 Environment=DATA_DIR=/var/lib/elasticsearch Environment=LOG_DIR=/var/log/elasticsearch Environment=PID_DIR=/var/run/elasticsearch-9201 EnvironmentFile=-/etc/sysconfig/elasticsearch WorkingDirectory=/usr/share/elasticsearch User=elasticsearch Group=elasticsearch ExecStartPre=/usr/share/elasticsearch/bin/elasticsearch-systemd-pre-exec ExecStart=/usr/share/elasticsearch/bin/elasticsearch
-p ${PID_DIR}/elasticsearch.pid
--quiet
-Edefault.path.logs=${LOG_DIR}
-Edefault.path.data=${DATA_DIR}
-Edefault.path.conf=${CONF_DIR} StandardOutput=journal StandardError=inherit LimitNOFILE=65536 LimitNPROC=2048 LimitAS=infinity LimitFSIZE=infinity TimeoutStopSec=0 KillSignal=SIGTERM KillMode=process SendSIGKILL=no SuccessExitStatus=143 [Install] WantedBy=multi-user.target

注:9200和9201的启动文件内,修改es配置文件目录和pid存放目录,这两个目录都需要手动创建,属主数组都是elasticsearch用户。

4.启动es多实例 systemctl enable elasticsearch-9200 && systemctl enable elasticsearch-9201

systemctl restart elasticsearch-9200 && systemctl restart elasticsearch-9201 启动后查看es实例日志,没有error就是启动成功了。 5.其它 这一段是为了提醒自己不要忘记配置的,各位也了解了解吧。

yum安装的话,用root用户执行systemctl start elasticsearch也是以elasticsearch这个用户来运行elasticsearch,而elasticsearch用户默认没有锁内存的权限,同时修改最大描述符限制,所以需要在/etc/security/limits.conf 里加入以下内容:

  • soft nofile 1024000
  • hard nofile 1024000 hive - nofile 1024000 hive - nproc 1024000

elasticsearch soft memlock unlimited elasticsearch hard memlock unlimited 在/etc/sysctl.conf里加入一下内容: vm.max_map_count=655360(默认的65535 es会报不够用)

按上面的修改后,启动es还是报这个错,重启系统应该可行,但是没试。 实际解决办法: 官网给出的办法是,要避免使用swap,可以使用以下三种方式: swapoff -a vm.swappiness = 1 bootstrap.mlockall: true 我选择了关闭swap,即“swapoff -a”,并把它加入到/etc/rc.local。所以如果“bootstrap.memory_lock: true”这个参数用不了,而又不是特别依赖swap分区,可以关闭swap分区,然后“bootstrap.memory_lock: false”就可以了。