模拟分布式存储和计算环境的一种简单方法是将Virtualbox作为VM(“虚拟机”)的提供者,将Vagrant作为配置,启动和停止这些VM的前端脚本引擎。这篇文章的目标是构建一个集群虚拟设备,将Elasticsearch作为可由主机使用/控制的服务提供。可以从Github下载本文中使用的工件。
面对不断增长的前端需求,后端容量扩展通常通过用功能更强大的CPU / RAM /dish wise即所谓的“垂直缩放”来替换较弱的服务器来解决。这与“横向缩放”相反,其中只需将更多服务器添加到混合中以处理额外需求。直觉上,后一种模式很有吸引力,因为它看起来不那么重要!在传统的以RDBMS为中心的应用程序中,没有选择,垂直扩展实际上是有意义的,因为很难在大型分布式数据表中进行连接。但垂直缩放有其局限性,更重要的是,在达到这些限制之前,它们变得非常昂贵。为了实现更简单的水平伸缩而跳过关系(RDBMS的“R”)的NoSQL数据库如今已成为需要像facebook/google一样进行大规模伸缩的应用程序的常用数据存储。
读者可以参考Hadoop:权威指南,其中Tom White深入研究了这些规模问题。在分布式存储和CPU上运行的应用程序必须处理自己的问题,例如让CPU忙于“本地”数据,确保集群成员彼此了解并知道谁拥有哪些数据,并且可能根据需要选择leader/master进行协调,写作等,因为实施细节因系统而异。我们不打算深入研究这一切,但我们对这篇文章的目标更加务实:
我们使用Oracle的Virtualbox作为来宾虚拟主机的提供商。Virtualbox可以免费使用,在我的Linux笔记本电脑上运行得非常好(我的笔记本电脑上是Ubuntu 15.04 64位,8核i7,2.2GHz CPU,16GB RAM),并且有关于如何控制要创建的主机的各个方面的大量文档。还有预先构建的图像以及任何数量的开源Linux发行版,您可以简单地为客户操作系统添加这些图像。它提供了各种网络选项(有时我发现令人生畏),以扩展/限制guest的可访问性/功能。出于我们的目的,我们更喜欢具有以下标准的“仅限主机”,“私人”网络。
安装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)无缝协作,因此只需更改提供者名称即可重复使用相同的配置文件/脚本。从我的笔记本电脑中挖出资源来构建虚拟机在这里可以很好地降低机制,但它不会给出高性能的集群!
花了很多话来试图到达这里,我们没有进一步的追求。我们准备一个名为'Vagrantfile'的文本文件,其中包含我们要构建的集群的高级详细信息。在命令提示符下运行将生成一个可以根据自己的喜好进行编辑的示例文件。以下是我们的文件如何满足第2节中规定的要求。
Vagrantfile
# - * - mode:ruby - * -
它是一个Ruby脚本,但是我不需要知道很多Ruby。这是它的作用的快速概述。
对于Vagrant来说,这一切都是真的。其余的都是很好的旧shell脚本,我们老手 - 很棒!一旦脚本准备就绪,我们就会运行以启动集群,完成我们的工作并运行以关闭群集。在我们运行之前,集群将保留其apps / config / data,以便我们可以随时运行以使用集群及其服务。
这非常简单。关键是要知道Vagrant会自动在主机和来宾之间启用一个共享目录。这是文件'Vagrantfile'所在的目录。在guest虚拟机上,此目录以“/ vagrant”的形式访问。因此,如果我们在主机上有'Vagrantfile'的位置有'a / b / c / some_file'文件,则'some_file'可以作为'/ vagrant / a / b / c / some_file'在访客上访问。我们使用此功能来共享我们需要在guest虚拟机上安装的预先下载的软件包,以及我们想要在启动时间之后运行的任何脚本。 bootstrap.sh
脚本如下。
#!/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
#!/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'将使用该群集的所有成员列表进行扩充。
discovery.zen.ping.unicast.hosts :[ “guest-es1:9310” ,“guest-es2:9310” ]
setEtcHosts
功能附加
到每个guest虚拟机上的'/ etc / hosts'文件并重新启动网络。下面为'guest2'准备的start-node.sh
脚本运行以下命令来启动Elasticsearch节点'guest-es2-node1'。
start-node.sh
/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》
译者:February
不代表云加社区观点,更多详情请查看原文链接
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有