从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 | cluster.name: testes |
实例2:
1 | cluster.name: testes |
配置部署
默认情况下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 |