前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >带有Vagrant和Virtualbox的Elasticsearch集群

带有Vagrant和Virtualbox的Elasticsearch集群

作者头像
February
修改2018-11-26 15:17:32
1.4K0
修改2018-11-26 15:17:32
举报
文章被收录于专栏:技术翻译技术翻译

模拟分布式存储和计算环境的一种简单方法是将Virtualbox作为VM(“虚拟机”)的提供者,将Vagrant作为配置,启动和停止这些VM的前端脚本引擎。这篇文章的目标是构建一个集群虚拟设备,将Elasticsearch作为可由主机使用/控制的服务提供。可以从Github下载本文中使用的工件。

1.背景

面对不断增长的前端需求,后端容量扩展通常通过用功能更强大的CPU / RAM /dish wise即所谓的“垂直缩放”来替换较弱的服务器来解决。这与“横向缩放”相反,其中只需将更多服务器添加到混合中以处理额外需求。直觉上,后一种模式很有吸引力,因为它看起来不那么重要!在传统的以RDBMS为中心的应用程序中,没有选择,垂直扩展实际上是有意义的,因为很难在大型分布式数据表中进行连接。但垂直缩放有其局限性,更重要的是,在达到这些限制之前,它们变得非常昂贵。为了实现更简单的水平伸缩而跳过关系(RDBMS的“R”)的NoSQL数据库如今已成为需要像facebook/google一样进行大规模伸缩的应用程序的常用数据存储。

读者可以参考Hadoop:权威指南,其中Tom White深入研究了这些规模问题。在分布式存储和CPU上运行的应用程序必须处理自己的问题,例如让CPU忙于“本地”数据,确保集群成员彼此了解并知道谁拥有哪些数据,并且可能根据需要选择leader/master进行协调,写作等,因为实施细节因系统而异。我们不打算深入研究这一切,但我们对这篇文章的目标更加务实:

  1. 开发一种方法来运行几个节点(“客户”)的虚拟集群,其中现在的客户是由Virtualbox从我的笔记本电脑中雕刻出来的。
  2. 通过机制在guest虚拟机群集上安装分布式数据存储Elasticsearch。
  3. 确认此“虚拟Elasticsearch设备”从主机提供完全可控的服务。

2. VirtualBox

我们使用Oracle的Virtualbox作为来宾虚拟主机的提供商。Virtualbox可以免费使用,在我的Linux笔记本电脑上运行得非常好(我的笔记本电脑上是Ubuntu 15.04 64位,8核i7,2.2GHz CPU,16GB RAM),并且有关于如何控制要创建的主机的各个方面的大量文档。还有预先构建的图像以及任何数量的开源Linux发行版,您可以简单地为客户操作系统添加这些图像。它提供了各种网络选项(有时我发现令人生畏),以扩展/限制guest的可访问性/功能。出于我们的目的,我们更喜欢具有以下标准的“仅限主机”,“私人”网络。

  • guest和host应该能够互相交谈。我们希望客户组成一个集群并一起工作以启用服务。主机应该能够控制和使用客户群提供的服务。
  • guest应该可以访问互联网。这样他们就可以下载任何操作系统更新,以及运行任何应用程序所需的软件包。
  • guest无法从外面进入guest。这只是一个弥补的要求,因为我不想将服务暴露给外部。主机是服务的使用者,它可以将其转换为它自己的服务,如果它愿意,它可以提供给外部。
  • 最后,为了便于使用和移植,每个访客在创建时应具有IP地址和名称“已分配”。

安装Virtualbox并创建各种VM非常简单。根据我下载的预建图像,我可以按照我想要的方式设置一个VM。使用适用于adapter1的NAT,仅适用于适配器2的NAT,以及激活VM上的仅主机接口。我想克隆它并建立其他客户,但我有可能以可靠/可重复的方式正确地建立网络。网络从来都不是我的强项,在通过GUI和命令行玩网络选项后,我放弃了尝试掌握它。我相信网络专家可以做到这一点,所以它肯定不是Virtualbox的限制,而是我的限制。

但更合理的是,我不想通过VirtualBox提供的GUI登录guest虚拟机来设置内容或更糟糕 - 更改每个guest虚拟机的设置。这肯定不会扩展,重现的痛苦,并且容易出错。我想要一种各种各样的交钥匙解决方案,其中我可以预先编写VM群集创建的所有方面,并且只需运行它就可以在安装,启动和饲养所有工具的情况下创建该群集。

正如我高兴地发现的那样,Vagrant可以轻松地做到这一点。基本上,他们已经确定了'vboxmanage'命令(以及它们的选项)的确切顺序,以运行来设置由某些高级要求指定的集群......这正是我试图做的,而且他们已经完成了!此外,由于使用Vagrant设置的群集是基于文件的,我们可以对其进行版本化并与之共享(与OVA文件相比较小),以便将群集准确地再现到其他位置。也许我有偏见是因为我在网络设置方面遇到的问题,但读者可以参考类似于Why Vagrant? 或者我为什么要使用Vagrant而不仅仅是VirtualBox?的讨论。Vagrant最终对我的真正吸引力在于它可以通过插件与其他VM提供商(如AWS,VMWARE)无缝协作,因此只需更改提供者名称即可重复使用相同的配置文件/脚本。从我的笔记本电脑中挖出资源来构建虚拟机在这里可以很好地降低机制,但它不会给出高性能的集群!

3. Vagrant

花了很多话来试图到达这里,我们没有进一步的追求。我们准备一个名为'Vagrantfile'的文本文件,其中包含我们要构建的集群的高级详细信息。在命令提示符下运行将生成一个可以根据自己的喜好进行编辑的示例文件。以下是我们的文件如何满足第2节中规定的要求。

Vagrantfile

代码语言:javascript
复制
# -  *  -  mode:ruby  -  *  - 

它是一个Ruby脚本,但是我不需要知道很多Ruby。这是它的作用的快速概述。

  • 我们想要建立一个2节点集群(第3行)。
  • 我们选择每个上的操作系统映像。如果之前尚未将图像下载到本地仓库('VirtualBox的默认机器文件夹')(第4行),Vagrant会下载它。
  • 我的笔记本电脑有16GB RAM,我想在任何时候都为主机留下8gb。其余部分由guest平分。同样,客户仅限于部分使用CPU。(第5,6行)
  • 我们遍历每个guest:
    • 设置图像(#13)和名称(#14)。
    • 我们选择' private_network '模式并设置IP地址(#15)。这为我们提供了第2节中我们想要的网络模型。
    • #19行,即将供应的工具和应用程序的虚拟机。非常强大和方便。我们可以使用我们希望客户负责的应用程序自动化启动集群中每个成员的过程。无需为每位guest提供服务并进行单独安装 - 节省大量时间!除了简单的shell脚本外,Vagrant还允许其他机制,如Docker,Chef,Ansible,Puppet等,用于配置过程。在这里,我们使用shell脚本'bootstrap.sh'来传递我们需要的参数,以设置Elasticsearch。

对于Vagrant来说,这一切都是真的。其余的都是很好的旧shell脚本,我们老手 - 很棒!一旦脚本准备就绪,我们就会运行以启动集群,完成我们的工作并运行以关闭群集。在我们运行之前,集群将保留其apps / config / data,以便我们可以随时运行以使用集群及其服务。

4.供应Elasticsearch

这非常简单。关键是要知道Vagrant会自动在主机和来宾之间启用一个共享目录。这是文件'Vagrantfile'所在的目录。在guest虚拟机上,此目录以“/ vagrant”的形式访问。因此,如果我们在主机上有'Vagrantfile'的位置有'a / b / c / some_file'文件,则'some_file'可以作为'/ vagrant / a / b / c / some_file'在访客上访问。我们使用此功能来共享我们需要在guest虚拟机上安装的预先下载的软件包,以及我们想要在启动时间之后运行的任何脚本。 bootstrap.sh 脚本如下。

代码语言:javascript
复制
#!/usr/bin/env bash
nguests=$1
guestNumber=$2
memory=$3
ipAddressStart=$4
# Install some utilities that we will need
apt-get -y install unzip
apt-get -y install curl
# Install java
mkdir -p /opt/software/java
cd /opt/software/java ; tar zxvf /vagrant/tools/jdk-8u65-linux-x64.tar.gz
# Install & Start up elasticsearch
/vagrant/scripts/elastic.sh $nguests $guestNumber $memory $ipAddressStart

我们在第9行和第10行安装了一些我们需要的实用工具。从第13行和第14行的共享位置安装java。最后,我们运行下面的脚本在第17行安装Elasticsearch。

elastic.sh

代码语言:javascript
复制
#!/usr/bin/env bash
usage="Usage: elastic.sh nguests thisguest memory ipAddressStart. Need the number of guests in the cluster, this guest number, es-heap memory in MB like 2048m, and startingIp like 192.168.0.5 if clustered ... "
# Install Elastic,  Configure & Start
function setUnicastHosts() {
  local unicast_guests="discovery.zen.ping.unicast.hosts: ["
  for i in $(seq 1 $nguests); do
    unicast_guests+='"guest-es'$i
    unicast_guests+=':9310"'
    if [ "$i" -ne "$nguests" ]; then
      unicast_guests+=','
    fi
  done
  unicast_guests+=']'
  echo "$unicast_guests"
}
# Add to /etc/hosts for convenience & restart networking...
function setEtcHosts() {
  guest_list=""
  for i in $(seq 1 $nguests); do
          guest_list+=$ipAddressStart$i' guest-es'$i
\n'
  done
  echo "$guest_list" > guests_to_be_added
  cat /etc/hosts guests_to_be_added > tmp ; mv tmp /etc/hosts
  /etc/init.d/networking restart
}
if [ "$#" -eq 4 ]; then
  nguests=$1
  thisguest=$2
  memory=$(expr $3 / 2)
  memory+="m"
  ES_HEAP_SIZE=$memory
  ipAddressStart=$4
  ES_HOME=/opt/software/elasticsearch/elasticsearch-1.7.2
  mkdir -p /opt/software/elasticsearch
  cd /opt/software/elasticsearch ; unzip /vagrant/tools/elasticsearch-1.7.2.zip
  cp /vagrant/elastic/start-node.sh $ES_HOME
  cp /vagrant/elastic/stop-node.sh $ES_HOME
  cp /vagrant/elastic/elasticsearch.yml $ES_HOME/config
  guest_name="guest-es"$thisguest
  node_name=$guest_name"-node1"
  unicast_guests=$(setUnicastHosts)
  if [ "$thisguest" -eq 1 ]; then
    mkdir -p $ES_HOME/plugins/kopf
    cd $ES_HOME/plugins/kopf ; tar zxvf /vagrant/elastic/kopf.tar.gz
  fi
  perl -0777 -pi -e "s|ES_HOME=/opt/elasticsearch|ES_HOME=$ES_HOME|" $ES_HOME/start-node.sh
  perl -0777 -pi -e "s/ES_HEAP_SIZE=2g/ES_HEAP_SIZE=$memory/" $ES_HOME/start-node.sh
  perl -0777 -pi -e "s/host_name=localhost/host_name=$guest_name/" $ES_HOME/start-node.sh
  perl -0777 -pi -e "s/host_name=localhost/host_name=$guest_name/" $ES_HOME/stop-node.sh
  perl -0777 -pi -e "s/node_name=node0/node_name=$node_name/" $ES_HOME/start-node.sh
  perl -0777 -pi -e "s/$/\n$unicast_guests/" $ES_HOME/config/elasticsearch.yml
else
  echo $usage
  exit 1
fi
setEtcHosts
$ES_HOME/start-node.sh

Elasticsearch节点是Elasticsearch的运行实例,服务器可以运行多个实例 - 当然资源允许。属于群集的所有节点都具有相同的“cluster.name”。从主机和guest虚拟机之间共享的一些样板配置文件开始,上面的脚本根据在配置期间传递给每个guest虚拟机的参数来修改它们。所有访客节点的文件'config / Elasticsearch.yml'将使用该群集的所有成员列表进行扩充。

代码语言:javascript
复制
discovery.zen.ping.unicast.hosts :[ “guest-es1:9310” ,“guest-es2:9310” ]

setEtcHosts 功能附加

  • 192.168.1.51 guest-es1
  • 192.168.1.52 guest-es2

到每个guest虚拟机上的'/ etc / hosts'文件并重新启动网络。下面为'guest2'准备的start-node.sh脚本运行以下命令来启动Elasticsearch节点'guest-es2-node1'。

start-node.sh

代码语言:javascript
复制
/opt/software/elasticsearch/elasticsearch-1.7.2/bin/elasticsearch -d 
-Des.cluster.name=es-dev 
-Des.node.name=guest-es2-node1 
-Des.http.port=9210 
-Des.transport.tcp.port=9310 
-Des.path.data=/opt/software/elasticsearch/elasticsearch-1.7.2/data 
-Des.path.logs=/opt/software/elasticsearch/elasticsearch-1.7.2/logs 
-Des.path.plugins=/opt/software/elasticsearch/elasticsearch-1.7.2/plugins 
-Des.path.conf=/opt/software/elasticsearch/elasticsearch-1.7.2/config 
-Des.path.work=/opt/software/elasticsearch/elasticsearch-1.7.2/tmp 
-Des.network.host=guest-es2 -Des.network.publish_host=guest-es2 
-p /opt/software/elasticsearch/elasticsearch-1.7.2/pid

其中'es-dev'是我们正在构建的集群的名称。'guest1'启动'guest-es1-node1'的命令与上面的命令相同,只是用'es1'替换'es2'。

我们只需运行vagrant up即可启动虚拟弹性群集 。因为我们在配置期间在'guest1'上安装了'kopf'插件,所以我们可以验证群集已启动,可从主机访问并准备投入使用。

我们通过运行vagrant halt关闭群集。每当我们准备好从主机再次使用它时,我们只需运行vagrant up并且群集将被备份。成功!我们已经建立了一种机制,可以根据虚拟集群的需要将Elasticsearch作为一项服务。

这就是这篇文章的全部内容。在以后的帖子中,我们将考虑扩展这个以在AWS上创建设备,以便我们可以做真正的工作。

原文标题《Elasticsearch Cluster with Vagrant and Virtualbox》

作者:Ashok Chilakapati

译者:February

不代表云加社区观点,更多详情请查看原文链接

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.背景
  • 2. VirtualBox
    • 3. Vagrant
      • 4.供应Elasticsearch
      相关产品与服务
      Elasticsearch Service
      腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档