0%

ElasticSearch单机双实例的配置方法

从ElasticSearch官方的多份文档中可以看到,官方并不建议部署ES时为实例指定超过32GB的内存,但是现在内存的价格非常便宜,一台实体机服务器仅用32G内存显然是非常浪费的。所以我们要尝试在一个服务器上开多个ES实例,以便达到充分利用资源的目的。本文提供了一些ES单机双实例的配置要点,可扩展至单机多实例,供大家来实际参考。

突破32G

从ElasticSearch官方的多份文档中可以看到,官方并不建议部署ES时为实例指定超过32GB的内存,例如这些写着大字警告用户的文章: Don’t Cross 32 GB!

但是现在内存的价格非常便宜,一台实体机服务器仅用32G内存显然是非常浪费的。所以我们要尝试在一个服务器上开多个ES实例,以便达到充分利用资源的目的。

配置变更

要做到单机上开多个实例,需要修改ES的默认配置,以下是一些配置要点:

node.max_local_storage_nodes

这个配置限制了单节点上可以开启的ES存储实例的个数,我们需要开多个实例,因此需要把这个配置写到配置文件中,并为这个配置赋值为2或者更高。

http.port

这个配置是elasticsearch对外提供服务的http端口配置,默认情况下ES会取用9200~9299之间的端口,如果9200被占用就会自动使用9201,在单机多实例的配置中这个配置实际是不需要修改的。

但是为了更好地进行配置管理,以及和老的配置兼容,我们还是手动将第一个实例的http端口配置为9200,第二个实例配置为9201。

transport.tcp.port

这个配置指定了elasticsearch集群内数据通讯使用的端口,默认情况下为9300,与上面的http.port配置类似,ES也会自动为已占用的端口选择下一个端口号。我们可以将第一个实例的tcp传输端口配置为9300,第二实例配置为9301。
discovery.zen.ping.unicast.hosts

由于到了2.x版本之后,ES取消了默认的广播模式来发现master节点,需要使用该配置来指定发现master节点。这个配置在单机双实例的配置中需要特别注意下,因为习惯上我们配置时并未指定master节点的tcp端口,如果实例的transport.tcp.port配置为9301,那么实例启动后会认为discovery.zen.ping.unicast.hosts中指定的主机tcp端口也是9301,可能导致这些节点无法找到master节点。因此在该配置中需要指定master节点提供服务的tcp端口。

配置示例:

1
discovery.zen.ping.unicast.hosts: ["testes.mydomain:9300"]

其他配置

  • node.name

    同一主机上的两个实例需要使用不同的node.name

  • path.data

    同一主机上两个实例需要对应不同的数据目录

  • path.logs

    由于默认情况下日志用集群名称来命名,因此同一主机两个实例对应的日志目录需要分开

完整配置示例

以下提供两个完整的配置实例供参考:

实例1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cluster.name: testes
node.name: ${HOSTNAME}
node.box_type: M
node.master: false
node.data: true
path.data: /data/disk01
path.logs: /home/centos/elasticsearch/logs/instance1
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["testes.mydomain:9300"]
node.max_local_storage_nodes: 2
threadpool.index.queue_size: 400
threadpool.bulk.queue_size: 5000
bootstrap.mlockall: false

实例2:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cluster.name: testes
node.name: ${HOSTNAME}-2
node.box_type: M
node.master: false
node.data: true
path.data: /data/disk02
path.logs: /home/centos/elasticsearch/logs/instance2
network.host: 0.0.0.0
http.port: 9201
transport.tcp.port: 9301
discovery.zen.ping.unicast.hosts: ["testes.mydomain:9300"]
node.max_local_storage_nodes: 2
threadpool.index.queue_size: 400
threadpool.bulk.queue_size: 5000
bootstrap.mlockall: false

配置部署

默认情况下ES启动时使用ES安装目录的config子目录下的elasticsearch.yml文件来作为配置文件,同时还用到了config子目录下的logging.yml文件来作为日志的配置文件。为了实现单机双实例的分别启动,我们需要创建两个目录来分别存储两个实例的配置文件,如:

在config子目录下创建instance1和instance2两个目录,分别放置两个实例需要的elasticsearch.yml和logging.yml配置文件。

注意,ES的配置文件必须使用elasticsearch.yml这个命名,因此必须创建出两个目录来。

启动实例

以下是两条参考的命令,用于启动单机上的两个实例:

实例1:

1
bin/elasticsearch -Des.path.conf=config/instance1 -d -p /tmp/elasticsearch_1.pid

实例2:

1
bin/elasticsearch -Des.path.conf=config/instance2 -d -p /tmp/elasticsearch_2.pid
如果我的文字帮到了您,那么可不可以请我喝罐可乐?