在 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