在 GCP 环境中尝试使用 GCE discovery 插件!

首先

我想介绍一个在使用GCP构建Elasticsearch集群时会很有用的插件。
那就是GCE discovery plugin。
通过使用这个插件,您无需使用Unicast来指定主机名或IP地址,它会自动帮您组建集群。

我之前介绍了EC2发现插件,但在实例宕机时遇到了节点ID重复的问题。
本次将包括改进在内进行记录。

那么就开始吧,我们立刻开始构建吧( ゚Д゚)ゞビシッ

设置防火墙规则

创建防火墙规则。
为了在节点之间进行通信,释放端口9200至9300。
同时,也会释放端口9200以接收HTTP通信。

$ gcloud compute firewall-rules create elasticsearch --direction=INGRESS \
 --priority=1000 --network=default --action=ALLOW \
 --rules=tcp:9200,tcp:9300-9400 --source-ranges=0.0.0.0/0

使用gcloud SDK创建一个实例

由于已经准备好构建实例,我们将开始构建实例。
请确保已经安装了可运行gcloud的环境。
如果没有gcloud的运行环境,请参考Cloud SDK安装网站。

$ gcloud compute instances create es-gce-discovery \
  --machine-type=n1-standard-2 --subnet=default \
  --min-cpu-platform=Automatic \
  --tags=elasticsearch,http-server,https-server \
  --image=ubuntu-1604-xenial-v20180306 \
  --image-project=ubuntu-os-cloud \
  --boot-disk-size=10GB --boot-disk-type=pd-standard \
  --boot-disk-device-name=sgce-discovery --scopes=compute-ro

由于实例已启动,我们将通过SSH进行连接。

gcloud compute ssh es-gce-discovery

安装Java

在实例上安装JDK 8。

$ sudo apt-get update
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
$ sudo apt-get install oracle-java8-set-default
$ java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

安装Elasticsearch和GCE发现插件。

使用Debian软件包安装Elasticsearch时,需要安装PGP密钥。

$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

接下来,我们要安装”apt-transport-https”。

$ sudo apt-get install apt-transport-https

添加存储库。

$ echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

我将安装Elasticsearch。

$ sudo apt-get update && sudo apt-get install elasticsearch
$ sudo /usr/share/elasticsearch/bin/elasticsearch -version
Version: 6.2.4, Build: ccec39f/2018-04-12T20:37:28.497551Z, JVM: 1.8.0_171

接下来,安装 “GCE discovery 插件”。

$ sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install discovery-gce

由于安装已完成,我们将在Elasticsearch的配置文件中添加设置。

$ sudo vim /etc/elasticsearch/elasticsearch.yml
### クラスタ名はデフォルト"elasticsearch"
cluster.name: lannister
### ノード名を動的に設定するため、${HOSTNAME} を使用する
node.name: ${HOSTNAME}
### GCEのホスト名をネットワークサービスにバインド
network.host: _gce:hostname_
### スプリットブレインを避けるため、適正なノード数にする
discovery.zen.minimum_master_nodes: 2
### "GCE discovery plugin"の設定をする
cloud.gce.project_id: "your Project-Name"
cloud.gce.zone: us-east1-b
discovery.zen.hosts_provider: gce

开始运行Elasticsearch。

$ sudo /etc/init.d/elasticsearch start

使用 curl 命令来确认服务的启动。

$ curl ${HOSTNAME}:9200

由于确认启动成功,我将从实例中注销。

顺便提一下,如果在启动Elasticsearch后查看日志,会一直输出”WARN”,请忽略它。
这是因为只有一个节点,所以会因为节点数不足而发生这种情况。

$ sudo tail -f /var/log/elasticsearch/lannister.log
[2018-05-13T07:45:11,358][WARN ][o.e.d.z.ZenDiscovery     ] [es-gce-discovery] not enough master nodes discovered during pinging (found [[Candidate{node={es-gce-discovery}{SAFhkm66S7eGgURWMHS3Ww}{EHnLunWFQTuYHgVJ-WXDkA}{es-gce-discovery.c.winter-jet-194500.internal}{10.142.0.2:9300}, clusterStateVersion=-1}]], but needed [2]), pinging again

创建一个GCE自定义镜像

创建一个存储本地环境中磁盘映像的存储桶。

$ gsutil mb -p "your Project-Name" -c regional -l us-east1 gs://es-test-bucket/

停止具有Elasticsearch安装的实例。

$ gcloud compute instances stop es-gce-discovery

获取停止实例的快照。

$ gcloud compute disks snapshot es-gce-discovery \
  --snapshot-names=es-gce-discovery-snapshot

使用已经获取的快照来创建GCE磁盘。

$ gcloud compute disks create es-gce-discovery-disk \
  --source-snapshot es-gce-discovery-snapshot

根据原始映像盘创建一个比原本的盘大50%的临时盘。因为原始盘是10GB,所以临时盘将被创建为15GB。

$ gcloud compute disks create es-gce-discovery-temp-disk --size 15GB

使用范围storage-rw,在一个临时的实例上挂载了两个磁盘。

$ gcloud compute instances create es-temp-instance --scopes storage-rw \
  --disk name=es-gce-discovery-disk,device-name=es-gce-discovery-disk \
  --disk name=es-gce-discovery-temp-disk,device-name=es-gce-discovery-temp-disk

当创建完成后,将访问临时实例。

$ gcloud compute ssh sherry-temp-instance

我会检查磁盘。

$ ls /dev/disk/by-id/
google-es-gce-discovery-disk        google-persistent-disk-0                           scsi-0Google_PersistentDisk_es-gce-discovery-disk-part1  scsi-0Google_PersistentDisk_persistent-disk-0-part1
google-es-gce-discovery-disk-part1  google-persistent-disk-0-part1                     scsi-0Google_PersistentDisk_es-gce-discovery-temp-disk
google-es-gce-discovery-temp-disk   scsi-0Google_PersistentDisk_es-gce-discovery-disk  scsi-0Google_PersistentDisk_persistent-disk-0

接下来,对磁盘进行格式化,并进行挂载。

$ sudo mkdir /mnt/tmp
$ sudo mkfs.ext4 -F /dev/disk/by-id/google-es-gce-discovery-temp-disk 
$ sudo mount -o discard,defaults /dev/disk/by-id/google-es-gce-discovery-temp-disk /mnt/tmp

加载映像。

$ sudo mkdir /mnt/image-disk
$ sudo mount /dev/disk/by-id/google-es-gce-discovery-disk-part1 /mnt/image-disk

删除Elasticsearch的数据目录。
当Elasticsearch首次启动时,会为每个新实例创建一个Elasticsearch的数据目录。

$ sudo rm -fR /mnt/image-disk/var/lib/elasticsearch/nodes

我将删除SSH密钥。

$ sudo rm -f /mnt/image-disk/home/micci184/.ssh/authorized_keys

卸载映像

$ sudo umount /mnt/image-disk/

我們將從臨時磁碟映像上創建一個名為disk.raw的檔案。

$ sudo dd if=/dev/disk/by-id/google-es-gce-discovery-disk of=/mnt/tmp/disk.raw bs=4096

创建一个.tar文件,其中包含disk.raw文件。

$ cd /mnt/tmp
$ sudo tar czvf es-gce-discovery-disk.tar.gz disk.raw

将tar文件复制到bucket中。

$ gsutil cp /mnt/tmp/es-gce-discovery-disk.tar.gz gs://es-test-bucket/

当文件传输完成后,将临时实例注销掉。
最后创建一个用于新实例的定制镜像。

$ gcloud compute images create es-gce-discovery-image \
  --source-uri=https://storage.googleapis.com/es-test-bucket/es-gce-discovery-disk.tar.gz

根据我们的自定义镜像创建实例。

创建三个新实例。

$ gcloud compute instances create es-instance-1 \
  --machine-type=n1-standard-2 --subnet=default \
  --min-cpu-platform=Automatic --tags=elasticsearch,http-server,https-server \
  --image=es-gce-discovery-image --image-project=winter-jet-194500 \
  --boot-disk-size=20GB --boot-disk-type=pd-standard \
  --boot-disk-device-name=es-instance-1 --scopes=compute-ro

$ gcloud compute instances create es-instance-2 \
  --machine-type=n1-standard-2 --subnet=default \
  --min-cpu-platform=Automatic --tags=elasticsearch,http-server,https-server \
  --image=es-gce-discovery-image --image-project=winter-jet-194500 \
  --boot-disk-size=20GB --boot-disk-type=pd-standard \
  --boot-disk-device-name=es-instance-2 --scopes=compute-ro

$ gcloud compute instances create es-instance-3 \
  --machine-type=n1-standard-2 --subnet=default \
  --min-cpu-platform=Automatic --tags=elasticsearch,http-server,https-server \
  --image=es-gce-discovery-image --image-project=winter-jet-194500 \
  --boot-disk-size=20GB --boot-disk-type=pd-standard \
  --boot-disk-device-name=es-instance-3 --scopes=compute-ro

如果能够创建3个实例,则启动Elasticsearch服务。
如果想要自动启动,请参考Elasticsearch官方网站进行设置。

$ gcloud compute ssh es-instance-1
$ sudo /etc/init.d/elasticsearch start
$ exit
$ gcloud compute ssh es-instance-2
$ sudo /etc/init.d/elasticsearch start
$ exit
$ gcloud compute ssh es-instance-3
$ sudo /etc/init.d/elasticsearch start
$ exit

从 es-instance-1 实例中,使用 curl 命令来确认集群。
只要显示出集群内的三个节点,就表示完成了。

$ curl es-instance-1:9200/_cat/nodes
10.142.0.4 12 30 4 0.09 0.14 0.08 mdi - es-instance-1
10.142.0.5 14 30 8 0.31 0.28 0.13 mdi * es-instance-2
10.142.0.6 15 30 8 0.34 0.29 0.13 mdi - es-instance-3

你对此有何感想?
您可能已经了解到在GCP环境中,可以灵活地构建Elasticsearch集群环境。
非常感谢!

请在中国进行本地化。

在Google Cloud上使用GCE发现插件的入门指南
使用Debian软件包安装Elasticsearch
安装Google Cloud SDK

广告
将在 10 秒后关闭
bannerAds