单节点ES

启动一台EC2实例配置ES

为了测试方便,EC2在公有子网中启动。生产环境建议放在私有子网的VPC里面。

  • 实例类型选择内存优化r系列(r5.2xlarge 8vcpu 64G ram)。
  • 安全组SSH的22端口禁止,通过System Manager登录到EC2。
  • 安全组添加TCP 9200端口给REST方式调用。
  • 安全组添加TCP 9300端口给内部集群节点通信。

下载ElasticSearch压缩包,解压缩到指定目标文件夹(tar -zxvf)。

修改config/jvm.options,设置heap内存为26G,剩余一半内存可以作为文件系统缓存提高性能。一般设置的heap size不超过服务器可用内存的一半。

  • -Xms26g
  • -Xmx26g

修改config/elasticsearch.yml,简单设置下集群的名字以及数据文件和日志的存储路径:

  1. cluster.name: my-application
  2. node.name: node-a
  3. path.data: /home/ec2-user/esdata
  4. path.logs: /home/ec2-user/eslogs

启动es

  1. ./elasticsearch-7.3.2/bin/elasticsearch > logs/launch.txt &

测试es是否正常启动,返回status 200代表以正常启动

  1. curl -I localhost:9200
  2. TTP/1.1 200 OK
  3. content-type: application/json; charset=UTF-8content-length: 499

到此为止在服务器本地测试都已经成功了,但是在其他机器是没有办法访问的,因为在默认情况下,network.hosts只是绑定了_local_,也就是只能使用localhost访问,在服务器外部是ping不通的。

为了解决这个问题,可以有多种方式:

  1. 通过nginx设置路由代理
  2. 修改config/elasticsearch.yml
  1. network.host: <ec2-private-ip>
  2. iscovery.seed_hosts: ["<ec2-private-ip>"]

修改后重启es服务,发现还会报错:

  1. max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
  2. max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

修复这两个报错的方法:

修改/etc/secuirty/limits.conf es discuss

  1. * soft nofile 65536
  2. * hard nofile 65536

修改/etc/sysctl.conf Virtual memory

  1. vm.max_map_count=262144

为了方便测试,没有添加任何身份验证,只是在安全组允许9200端口的时候来源设置我的ip,这样只能本地可以访问。

本地启动Kibana连接到EC2上的ElasticSearch之后,通过Monitoring就可以监控当前ES的状态了。

AWS上搭建ElasticSearch集群 - 图1

添加第二个节点只作为数据节点

可以首先使用上面的EC2创建一个AMI,从这个AMI启动一个新的EC2实例,这样之前的EC2的配置都会存在。不需要额外重新配置服务器。

实例启动后,首先删除data和log文件夹。避免报重复node id错误。

可以通过配置elasicsearch.yml把原先的节点作为master,新的节点作为slave.

  1. #master-node
  2. node.master: true
  3. node.data: true
  4. #slave-node
  5. node.master: false
  6. node.data: true
  7. ode.master: true
  8. node.data: true

添加master节点, 把新启动的实例的private ip添加到seed_hosts里面,这样启动的时候es会自动去搜索master节点,并尝试加入集群。

  1. discovery.seed_hosts: ["<master-private-ip-1>","<slave-private-ip"]

节点之间相互通信

各个节点的是通过9300端口通信的。默认的安全组是不允许这个端口号的。所以需要配置安全组,添加9300,来源是当前安全组的id.

AWS上搭建ElasticSearch集群 - 图2

最后从Kibana可以看到如下监控:

AWS上搭建ElasticSearch集群 - 图3