使用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”就可以了。