如何在2核2G的云服务器上运行ES服务

359 阅读2分钟

背景:最早的需求是在个人项目的技术栈中增加ES这部分,考虑在自己的电脑直接Windows部署或者虚拟机部署,方便快捷,但是廉颇老矣,不能忍受每次启动项目时机箱的轰鸣,所以想在最便宜的云服务器上搞一个,这篇文章用来记录部署过程遇到的问题。

1. Docker安装elasticsearch

docker pull elasticsearch:7.17.2

2. 根据需求创建对应配置的容器

2.1. 创建数据目录

mkdir -p /data/elasticsearch/config
mkdir -p /data/elasticsearch/data

2.2. 创建配置文件

echo "http.host: 0.0.0.0">>/mydata/elasticsearch/config/elasticsearch.yml

2.3. 创建容器

**注意点:按照你的需求指定-e ES_JAVA_OPTS="-Xms64m -Xmx128m" **

  • -e ES_JAVA_OPTS="-Xms64m -Xmx128m": 这里设置了一个环境变量 ES_JAVA_OPTS,其值为 -Xms64m -Xmx128m。这个环境变量是用来传递给 Elasticsearch 进程的 Java 虚拟机(JVM)选项,用于控制 JVM 启动时的最小和最大堆内存分配。
    • -Xms64m: 设置初始堆内存大小为 64MB。

    • -Xmx128m: 设置最大堆内存大小为 128MB。

      docker run -d \
      --name elasticsearch -p 9200:9200 -p 9300:9300 \
      -e "discovery.type=single-node" \
      -e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
      -v /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
      -v /data/elasticsearch/data:/usr/share/elasticsearch/data \
      -v /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
      elasticsearch:7.17.2
      

3. 测试连接

image.png

4. 问题排查 使用docker logs -f <container_id>排查问题

4.1 启动docker后CPU飙升然后发现对应容器挂掉

4.1.1 权限问题 使用chmod增加文件权限
chmod -R 777 /data/elasticsearch

image.png

4.1.2 设置JVM内存过大,或者没有设置

我这台机器的配置是极低的所以使用了初始值64m, 最大值128为最大值,你可以根据自己的需求调整,官网设置的默认好像是1G

 -e ES_JAVA_OPTS="-Xms64m -Xmx128m"
4.1.3 另外我参考的文章会有ES配置的问题

他们强调elasticsearch.yml中的"http.host: 0.0.0.0" 是有空格的,我这里没有测试不做参考

4.2 docker所在网络配置问题

4.2.1 docker网络问题

这个问题我没解决我创建了一个elasticsearch的网络进行配置,但是发现只有使用默认的桥接才可以,暂时不考虑这里的设置了就,已经满足我的需求,这里看了下调整docker容器所在网络可以如下设置

docker network disconnect elasticsearch <es_docker_id>
docker network disconnect bridge <es_docker_id>
4.2.2 如果因为防火墙问题可以直接去设置出入站规则或者防火墙来解决这里就不赘述了