使用Google Compute Engine建立了具有自动扩展功能的Elasticsearch

因为在GCE上搭建了可以自动扩展的Elasticsearch集群,所以我来总结一下。
基本上,我是通过查看Click to Deploy的Elasticsearch来了解如何进行操作,并从中进行了各种设置,以实现自动扩展的功能。
如果不需要自动扩展的话,我觉得使用Click to Deploy就足够了。
实际上,并不是因为需要自动扩展,而是因为后来发现在需要增加服务器时缺乏灵活性。

我已经将在解释中使用的文件和脚本上传到Github上。

开发者控制台也可以创建以下的集群,但我们基本上都希望能够通过命令行来执行。我们在GitHub上也有相关内容,可以作为参考。

进行网络设置

在创建实例之前,需要事先创建集群并进行网络设置。

创建外部IP地址

请预留一个静态IP地址以实现负载均衡。您可以自由选择所需的地区。

$ gcloud compute addresses create "elasticsearch-ip" \
                                  --region "us-central1"

创建防火墙规则

创建一个允许通过Elasticsearch的9200和9300端口的防火墙。
将适用标签设置为elasticsearch。
使用–source-ranges来指定防火墙范围。
这里将全部范围都允许通过。

$ gcloud compute firewall-rules create "default-allow-elasticsearch" \
                                       --allow tcp:9200,tcp:9300 \
                                       --network "default" \
                                       --source-ranges "0.0.0.0/0" \
                                       --target-tags "elasticsearch"

创建健康检查

我将创建用于监视集群的健康检查工具。请根据需要适当更改命令的阈值,因为默认值仍保持不变。

$ gcloud compute http-health-checks create "elasticsearch-health-check" \
                                           --port "9200" \
                                           --request-path "/" \
                                           --check-interval "5" \
                                           --timeout "5" \
                                           --unhealthy-threshold "2" \
                                           --healthy-threshold "2"

创建网络负载均衡

创建目标池

$ gcloud compute target-pools create "elasticsaerch-lb-pool" \
                                    --region "us-central1" \
                                    --health-check "elasticsearch-health-check" \

创建转发规则

请在”address”字段中指定由外部IP地址创建的IP地址。

$ gcloud compute forwarding-rules create "elasticsearch-lb-rule" \
                                         --region "us-central1" \
                                         --address "${ip_address}" \
                                         --ip-protocol "TCP" \
                                         --port-range "9200" \
                                         --target-pool "elasticsaerch-lb-pool"

网络设置已经完成。

创建实例模板

使用启动脚本进行Elasticsearch的配置设定。

在启动脚本中的实例启动时配置Elasticsearch集群。文件在这里。

請稍微解釋一下這個腳本。

我正在正常地下载和安装Elasticsearch,并安装插件。
如果不需要Cloud Monitoring,可以删除相关的描述。
最后,我会将自己的实例加入到集群网络中。

gcloud compute target-pools add-instances $TARGET_POOL --instances $NODE_NAME --zone $ZONE

我也可以在设置目标池时指定实例组,但考虑到创建顺序,我决定自己参与进来的形式。

将启动脚本上传至GCS。

好的,请上传。
暂时将Git仓库的内容上传。
无需将其上传到GCS,使用Github的URL作为startup-script-url的值也没问题。

gsutil cp setup gs://${bucket_name}/scripts

创建实例模板

–请在machine-type中指定您喜欢的实例机器类型。
–虽然在命令中scopes是具有完全权限的,但在设置中至少需要GCS的读取权限和GCE的权限。
GCE权限是为了将自己加入到负载平衡的目标池中所必需的。
其他磁盘大小等可以根据您的需求自由指定。

只剩下metadata了。
metadata不能换行吗?

请将先前提到的启动脚本的GCS URL放入${startup-script-url}和${shutdown-script-url}中。
请将先前提到的GCS存储桶的名称放入${bucket_name}中。

$ gcloud compute instance-templates create "elasticsearch-template" \
                                           --machine-type "g1-small" \
                                           --network "default" \
                                           --metadata "startup-script-url=${startup-script-url},shutdown-script-url=${shutdown-script-url},CLUSTER_NAME=${cluster_name},TARGET_POOL=elasticsaerch-lb-pool,GCS_BUCKET=${bucket_name}" \
                                           --maintenance-policy "MIGRATE" \
                                           --scopes "https://www.googleapis.com/auth/cloud-platform" \
                                           --tags "elasticsearch" \
                                           --image "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-8-jessie-v20151104" \
                                           --boot-disk-size "300" \
                                           --boot-disk-type "pd-standard" \
                                           --boot-disk-device-name "elasticsearch-template"

创建实例组

首先,按照常规方法创建实例组。

$ gcloud compute instance-groups managed create "elasticsearch-group" \
                                                --zone "us-central1-f" \
                                                --base-instance-name "elasticsearch-group" \
                                                --template "elasticsearch-template" \
                                                --size "1"

自动缩放设置
阈值设置暂时先随意

gcloud compute instance-groups managed set-autoscaling "elasticsearch-group" \
                                                       --zone "us-central1-f" \
                                                       --cool-down-period "60" \
                                                       --max-num-replicas "10" \
                                                       --min-num-replicas "1" \
                                                       --target-cpu-utilization "0.6"

实际上,我没有启用自动缩放。(标题诈骗)
可以随时更改实例组的实例数量。

请使用最初创建的静态IP进行访问。

问题

数据的持久化

目前,Elasticsearch的数据存储在引导磁盘上,我希望将其存储在持久磁盘上。

如果在普通实例模板的基础上创建实例组,只能指定只读的持久磁盘并共享,无法进行写入操作。如果想要使用可写的持久磁盘,就需要进行一些处理。例如,在启动脚本中检查磁盘是否存在,如果不存在则创建。

如果能做到这一点,可能可以通过将实例设置为可抢占的方式来降低成本。但是,可能会导致实例数量的剧烈波动,不够稳定。

自动缩放和Elasticsearch的分布式问题

实际上,仅有当前的设置,自动缩放的最小值和最大值之间的差异相当大,当集群的节点数量较多且分散时,可能会发生数据丢失。
如果通过自动缩放进行缩小,在特定的节点上只有特定的数据,并且该节点正在缩小时,如果没有其他节点存储数据,可能会丢失数据。
通过增加Elasticsearch的分片设置,概率会大大降低。
如果实例缓慢减少,那么也许可以勉强应付。

如果在这方面有什么好办法的话,请告诉我一下。

广告
将在 10 秒后关闭
bannerAds