ElasticSearch核心之——分布式特性

ElasticSearch核心之——分布式特性,第1张

ES支持集群模式,是一个分布式系统,其好处主要有两个∶

es集群由多个ES 实例组成。不同集群通过集群名字来区分,可通过 clustername 进行修改,默认为elasticsearch。每个ES实例本质上是一个 JVM 进程,且有自己的名字,通过 nodename 进行修改

ES集群相关的数据称为 cluster state ,主要记录如下信息∶节点信息,比如节点名称、连接地址等;索引信息,比如索引名称、配置等

可以修改 cluster state 的节点称为master节点,一个集群只能有一个 cluster state 存储在每个节点上,master维护最新版本并同步给其他节点

master节点是通过集群中所有节点选举产生的,可以被选举的节点称为 master-eligible 节点 ,相关配置如下: nodemaster: true

处理请求的节点即为coordinating节点,该节点为所有节点的默认角色,不能取消。路由请求到正确的节点处理,比如创建索引的请求到master节点

存储数据的节点即为data节点,默认节点都是data类型,相关配置如下∶ nodedata: true

谈及副本和分片两个概念之前,我们先说一下这两个概念存在的意义: 解决系统可用性和增大系统容量

我们想象这样一个场景,我们的数据只存放在一台ES服务器上,那么一旦这台ES出现宕机或者其他不可控因素影响的话,我们除了丧失了服务的可用性外,可能还存在着数据丢失的可能。同时,单机服务的存储容量也无法应对项目对大数据量的要求。

系统可用性可以分为 服务可用性 数据可用性

服务可用性 含义为:当前服务挂掉后,是否有其他服务器顶替当前节点提供服务支持。

数据可用性 含义为:当前服务挂掉后,存储在当前服务器上的数据,是否还可以对外提供访问和修改的服务。

副本可以理解为是某个数据的复制体,副本和源数据内容一致。副本的存在可以有效地满足系统可用性的需求,比如说,我们可以在原有节点的基础上复制一个和源节点一模一样的节点,这样一旦原有节点挂掉了,另外一个节点也还是可以替代源节点提供服务,而且复制出来的节点拥有和源节点一样的数据,这样也保障了数据可用性。

我们在上一小节讲到可以使用副本来解决系统可用性的问题,但是这里存在一个问题,不管存在多少个副本(节点),都无法增大源节点的存储空间。在这个问题上,ES引入了Shard分片这个概念来解决问题。

看完分片的特点后可能还有人不太清楚到底什么是分片,其实分片是n/1个源节点数据。比如说原ES集群中只有一个主节点,所有的索引数据都存储在这个节点上。现在我们将某个索引数据分成3份,分别存放在3个ES节点上,那么每台ES服务器上就各自有1个分片shard。该索引的所有节点Shard分片的集合,就是索引的全部数据。

下面我们来演示一下:

为了更好的了解ES的分片机制,大家不妨在上面的案例上进一步思考两个问题:

答案是不能。原因是我们创建索引时定义的分片数量只有3个,且都已经落在了3个节点上。所以即使再增加多一个节点,也不会有对应的Shard分片可以落在新的节点上,并不能扩大 test_shard_index 的数据容量。

答案是不能。因为新增的副本也是分布在这3个节点上,还是利用了同样的资源。如果要增加吞吐量,还需要新增节点。

通过上面两个问题,相信大家已经可以认识到分片的重要性,分片数过小,会导致后续无法通过增加节点实现水平扩容;(副本)分片数过大会导致一个节点上分布过多分片,造成资源浪费,同时会影响查询性能

集群健康状况,包括以下三种: green健康状态,指所有主副分片都正常分配; yellow指所有主分片都正常分配,但是有副本分片未正常分配; red表示有主分片未分配

我们可以通过这个api查看集群的状态信息: GET _cluster/health

我们也可以通过cerebro或者head插件来直接获取当前集群的状态

需要注意的是,即使当前集群的状态为 red ,也并不代表当前的ES丧失了提供服务的能力。只是说未被分配主分片的索引无法正常存储和操作而已。

这里故障转移的意思是,当ES集群出现某个或者多个节点宕机的情况,ES实现服务可用性的应对策略。

这里我们新建一个分片为3,副本为1的索引,分片分别分布在三个节点,此时集群为 green

当master节点所在机器宕机导致服务终止,此时集群会如何处理呢

我们可以看到,从node1主节点宕机到ES恢复集群可用性的过程中,ES有着自己的故障转移机制,保障了集群的高可用性。我们也可以在自己的本地上去进行试验,建好索引后,kill掉主节点,观察集群状态就行。

同时,此时就算node2宕机了,那么node3也能够很快的恢复服务的提供能力。

我们知道,我们创建的文档最终会存储在分片上,那么在分布式集群的基础上,ES集群是怎么判断当前该文档最终应该落在哪一个分片上呢?

很显然,我们需要一个可以实现文档均匀分布到各个分片上的映射算法,那么常见的随机算法和round-robin(轮询)算法可以满足需要吗?答案是不可以,这两个算法虽然可以实现文档均匀分布分片的存储需要,但是当我们通过 DocumentId 查询文档时,ES并不能知道这个文档ID到底存储在了哪个节点的分片上,所以只能够从所有分片上检索,时间长。如果我们为这个问题建立一个文档和分片映射关系的表,虽然确实可以快速定位到文档对应的存储分片,但是当文档的数据量很大的时候,那么检索的效率也会随之变低。

对于上面这个问题,ES提供的解决方法是 建立文档到分片的映射算法

es 通过如下的公式计算文档对应的分片:

hash算法 保证可以将数据均匀地分散在分片中

routing 是一个关键参数,默认是文档id,也可以自行指定

number_of_primary_shards 是主分片数

我们可以看到,该算法与主分片数相关, 这也是分片数一旦确定后便不能更改的原因

我们已经知道了ES是如何将文档映射到分片上去了,下面我们就来详细讲解一下文档创建、读取的流程。

脑裂问题,英文为 split-brain ,是分布式系统中的经典网络问题,如下图所示:

3个节点组成的集群,突然node1的网络和其他两个节点中断

解决方案为 仅在可选举master-eligible节点数大于等于quorum时才可以进行master选举

在讲文档搜索实时性之前,先讲一下倒排索引的不可变更特性。由于倒排索引一旦生成,不可变更的特定,使得其有着以下3点好处:

下面,将针对Lucene实现文档实时性搜索的几个动作进行讲解,分析其是如何在新增文档后实现ES的搜索实时性的。

我们从上面的描述中知道,当我们新增了一个文档后会新增一个倒排索引文件 segment ,但是 segment 写入磁盘的时间依然比较耗时(难以实现实时性),所以ES借助文件系统缓存的特性, 先将 segment 在缓存中创建并开放查询来进一步提升实时性 ,该过程在es中被称为refresh。

在refresh之前文档会先存储在一个buffer中,refresh时将 buffer中的所有文档清空并生成 segment

es默认每1秒执行一次refresh,因此文档的实时性被提高到1秒 ,这也是es被称为近实时(Near Real Time)的原因

reflush虽然通过 将文档存放在缓存中 的方式实现了秒级别的实时性,但是如果在内存中的segment还没有写入磁盘前发生了宕机,那么其中的文档就无法恢复了,如何解决这个问题呢

ES 引入 translog 机制。写入文档到 buffer 时,同时将该操作写入 translog 中。

translog文件会即时写入磁盘(fsync),在ES 6x中,默认每个请求都会落盘,我们也可以修改为每5秒写一次,这样风险便是丢失5秒内的数据,相关配置为indextranslog。同时ES每次启动时会检查translog 文件,并从中恢复数据。

flush 负责将内存中的segment写入磁盘,主要做如下的工作:

Reflush和Flush执行的时机

ES的做法是 首先删除文档,然后再创建新文档

我们上面提到,新增文档是通过新建segment来解决,删除文档是通过维护del文件来进行的,假如现在我们设置的 reflush 时间间隔为1秒,那么一小时单个ES索引就会生成3600个segment,一天下来乃至一个月下来会产生的segment文件数量更是不可想象。为了解决Segment过多可能引起的性能下降问题,ES中采用了Segment Merging(即segment合并)的方法来减少segment的数量。

执行合并操作的方式有两种,一种是ES定时在后台进行 Segment Merging 操作,还有一种是我们手动执行 force_merge_api 命令来实现合并操作。

一、NodeJS介绍:

NodeJS是一个让开发者可以快速创建网络应用的服务器端JavaScript平台,同时运用JavaScript进行前端与后端编程,开发者可以更专注于系统的设计以及保持其一致性。

在这篇文章中,我们将向您介绍如何在Ubuntu1404服务器上开始您的NodeJS神奇之旅。

二、如何安装发行稳定版的NodeJS

Ubuntu 1404为了保证跨平台服务体验的一致性,在它的仓库中默认包含了一个版本为01025的NodeJS,这个可能不是最新版本,但是却一定是标准发行版本。

要想获取这个版本的NodeJS,我们只要通过apt包管理工具来安装就可以。在安装之前,最好先更新一下apt包管理工具的本地索引,然后再从Ubuntu仓库中安装NodeJS。

sudo apt-get update

sudo apt-get install nodejs

如果Ubuntu软件仓库中的包正好是你所需要的,那么上述步骤就是在Ubuntu1004下安装NodeJS的全部操作过程。大多数情况下,我们还希望也安装一份NodeJS的包管理工具:npm,您可以通过以下命令安装:

sudo apt-get install npm

NPM将让使得安装NodeJS的模块或者源码包变得非常简单。

在您运行NodeJS的时候请一定要注意,因为与别的工具包相冲突的原因,Ubuntu仓库中可执行的名字是nodejs而不是node。

下面,我们将讨论NodeJS更多种灵活的安装方式。

三、如何通过PPA来安装NodeJS?

一个让你可以保持获得NodeJS最新版本的替代方案是加入由NodeSource维护的PPA(Personal Package Archive)私有包档案。这个方式可以让你获得比Ubuntu仓库更多的NodeJS版本。

首先:你得安装PPA以获得访问它内容的权限。

curl -sL https://debnodesourcecom/setup | sudo bash -

通过上面的命令,PPA将加入到您的系统配置中,并且自动的更新您的本地包缓存,安装完成之后,您可以像之前一样通过apt-get来安装NodeJS。

solo apt-get install nodejs

这里的nodejs安装包包含了nodejs二进制执行文件以及npm可执行文件,所以您无须另外安装npm,然而,为了使一些NPM包能正常工作(比如那些需要多源代码编译的包),你还需要安装build-essentials包。

sudo apt-get install build-essential

四、如何使用NVM来安装?

还有一种使用apt来安装NodeJS的替代方案是使用一个特别设计的工具叫NVM,它的标准叫法是NodeJS版本管理工具(Nodejs Version manager)。

使用NVM,您可以安装多个可方便控制的独立NodeJS环境,它将给您最新版本NodeJS的请求权限,但也将允许你根据APP的需要而使用旧版本的NodeJS。

在开始之前,我们需要从Ubuntu仓库中先安装一些依赖包,NVM将利用这些工具来编译需要的组件:

sudo apt-get update

sudo apt-get install build-essential libssl-dev

一旦这些依赖包安装完成,您可以通过NVM的GitHub项目主页将安装脚本下载下来。版本号可能不尽相同,但是正常来说你可以通过以下方式来下载和安装:

curl https://rawgithubusercontentcom/creationix/nvm/v0161/installsh | sh

上面的命令将下载并且运行安装脚本,安装脚本将把软件安装到你home目录的~/nvm目录下,同时也会在~/profile加入必要的配置。

为了使~/profile的配置生效,您可能需要退出并重新登录您的账户,当然,也可以通过source命令来重新导入~/profile的配置:

source ~/profile

现在你已经安装了NVM,你可以安装NodeJS的各个独立版本。为了找出当前的NodeJS可安装版本,你可以敲入以下命令:

nvm ls-remote

回车可能会显示如下内容:

v0116

v0117

v0118

v0119

v01110

v01111

v01112

v01113

如你所见,当前NodeJS的最新可安装版本是v01113,你可以通过如下命令安装这个版本的程序:

nvm install 01113

通常情况下,NVM会自动切换到最新安装的版本,你可以通过以下命令告诉NVM指定使用已经安装的版本:

nvm use 01113

当你使用NVM安装NodeJS,它的可执行名称是node,通过以下信不信你可以知道当前所使用的NodeJS版本:

node -v

显示:

v01113

如果你安装了多个版本的NodeJS,你可以通过以下命令列出已安装版本:

nvm ls

如果你想把其中一个版本设置为默认的版本,你可以这样:

nvm alias default 01113

现在当一个请求发生时,01113这个版本将自动被选择,您也可以通过这样的别名引用它:

nvm use default

每个版本都将保持其独立的模块和包,并且通过独立的NPM来管理它们,你可以使用NPM的普通模式来为NodeJS项目安装独立的第三方包,它将安装到NodeJS的/node_modules目录下:

npm install express

如果你想将第三方包安装成全局模式(将与其它使用同一个版本NodeJS的项目共用),那么通过使用-g参数就可以实现:

npm install -g express

这个时候包将安装到下面这个目录:

~/nvm/node_version/lib/node_modules/package_name

全局模式安装的包将只允许你在命令行下使用,如果你想在在本地项目中使用,你还需要将它连接进来:

npm link express

如果需要帮助,你可以通过以入命令获取帮助:

npm help

目前网上已有 pm2-zabbix 工具可以实现Zabbix对Node/greatcare/pm2-zabbixgit 3Zabbix Web管理后台导入模板文件 pm2-zabbix/install/zabbix-server/pm2-zabbixtemplatexml 4Nodejs服务器添加服务,根据服务器操作系统版本选择,并修改服务运行用户和使用PM2启动的Nodejs用户一致 RHEL/CentOS 7系列: cp pm2-zabbix/install/init/systemd/pm2-zabbixservice /usr/lib/systemd/system/ 修改目标文件 pm2-zabbixservice 文件内容 User项: User=root RHEL/CentOS 6或5系列: cp pm2-zabbix/install/init/sysv/pm2-zabbix /etc/initd/ 修改目标文件 pm2-zabbix 文件内容 DAEMON_USER项: DAEMON_USER=root 5新建软连接,根据自己服务器修改软连接指向的真实文件路径 mkdir -p /etc/zabbix ln -s /App/zabbix/etc/zabbix_agentdconf /etc/zabbix/zabbix_agentdconf ln -s /App/zabbix/bin/zabbix_sender /usr/bin/zabbix_sender ln -s `which node` /usr/bin/node ln -s `which pm2-zabbix` /usr/local/bin/pm2-zabbix 6启动 pm2-zabbix 服务 RHEL/CentOS 7系列: systemctl start pm2-zabbix RHEL/CentOS 6或5系列: service start pm2-zabbix 7修改Zabbix Agent配置文件 zabbix_agentdconf,添加包含其它配置 Include=/App/zabbix/etc/zabbix_agentdconfd/conf 8拷贝Zabbix Agent配置 cp pm2-zabbix/install/zabbix-agent/pm2-zabbixconf /App/zabbix/etc/zabbix_agentdconfd/pm2conf 9修改配置 pm2conf 内容 sudo -u 用户和第4步一致,同事修改 pm2-zabbix 路径 UserParameter=pm2processes,sudo -u root /usr/local/bin/pm2-zabbix --discover 10服务器终端执行程序 visudo 添加sudo配置 zabbix ALL=(ALL:ALL) NOPASSWD: /usr/local/bin/pm2-zabbix Defaults:zabbix !requiretty 11重启Nodejs服务器Zabbix Agent服务 /etc/initd/zabbix_agentd restart 12Zabbix Web管理后台设置Nodejs服务器添加链接 Template App PM2 模板 PM2守护进程CPU使用率 PM2守护进程内存占用 PM2管理的Node进程实例CPU使用率 PM2管理的Node进程实例内存占用 以上所述是小编给大家介绍的Zabbix添加Nodejs监控的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

NLB群集可以支持WEB、FTP、***、ISA。那么我们今天就简单做一下基于WEB服务的NLB群集两个节点的实验。NLB群集可以保证web服务的高可用性,windows server 2008操作系统可以支持32个NLB节点。所有节点都在同时提供服务,所以,当其中一台服务器宕机的时候,其他节点服务器依然在提供服务,因此,NLB服务可以保证高可用性。

实验环境:

如上图所示:左边的服务器,我们更改计算机名为:NODE-1、右边服务器的计算机名为NODE-2,NODE-1的ip地址为:19216811,NODE-2的ip地址为:19216812。每台服务器都配置为一块网卡,一个群集ip:1921681254供外网用户访问

实验步骤:

首先,我们搭建NLB群集的环境,所以,我们应该先在两台服务器上安装NLB群集服务。在NODE-1上:

在NODE-2上重复上述步骤。

以上步骤,我们将两个节点的计算机群集环境都安装成功,下面,我们在群集上安装web服务,在node1上:

添加必需的功能

在node-2上,重复上述操作即可,web安装ok,为了验证群集实验是否是连续提供服务,我们还需要在node-1和node-2上创建不同的站点(为了验证实验结果)。此步骤略。。。

到这里,我们群集环境和安装的web服务都已经ok了,下面,就需要我们进行配置群集服务了,以保证群集的高可用性和可靠性。

在NODE-1上:创建新群集

下一步,设置优先级别

下一步,设置群集ip;1921681254

下一步,由于我们群集节点只添加了一块网卡,所以,我们选择“多播”。(原因,在博客里有相应的文章,请仔细阅读。)

删除“端口规则”

下一步,等待群集“已聚合”

Ok,我们已经完成了一个节点的配置,下面我们仍然在NODE-1上添加NODE-2群集

在NODE-1上:选择“添加主机到群集”

通过NODE-2的网卡ip地址连接到NODE-2上:

下一步,设置优先级别:

删除端口规则

两个节点主机全部聚合,此刻,NLB群集配置我们都已经完成了。下面我们进行测试,在client主机的IE输入群集ip进行访问,客户端client的ip地址是1921681100,首先在客户端client上ping群集的ip:1921681254

根据上图所示,客户机client和群集ip是通信的。然后我们再通过http://1921681254来访问web

默认情况下,node-1在提供服务,当我们将node-1模拟宕机后,我们再进行测试

Ok,测试已成功!!!

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » ElasticSearch核心之——分布式特性

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情