热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ElasticSearch+LogStash+Kibana+Redis日志服务的高可用方案

http:nkcoder.github.ioblog20141106elkr-log-platform-deploy-ha1.高可用方案的架构

http://nkcoder.github.io/blog/20141106/elkr-log-platform-deploy-ha/


1. 高可用方案的架构

在上一篇文章使用ElasticSearch+LogStash+Kibana+Redis搭建日志管理服务中介绍了日志服务的整体框架以及各组件的搭建部署,本篇文章主要讨论一下日志服务框架的高可用方案,主要从以下三个方面考虑:

  • 作为broker的Redis,可以使用redis cluster或者主备结构代替单实例,提高broker组件的可用性;
  • 作为indexer的LogStash,可以部署多个LogStash实例,协作处理日志信息,提高indexer组件的可用性;
  • 作为search&storage的ElasticSearch,采用ElasticSearch Cluster,提高search&storage组件的性能和可用性;

日志服务的高可用方案的示意图为:

ELKR-log-platform-ha

下面分别予以介绍。

2. Redis Cluster和主备结构

2.1 Redis Cluster

首先需要部署一个redis cluster,为了方便,我在本机上部署了一个三主三从的cluster,端口分别为:7000, 7001, 7002, 7003, 7004, 7005,以端口7000为例,配置文件为:

include ../redis.conf
daemonize yes 
pidfile /var/run/redis_7000.pid
port 7000
logfile /opt/logs/redis/7000.log
appendonly yes 
cluster-enabled yes 
cluster-config-file node-7000.conf

对于redis来说,远程Logstash和中心LogStash都是redis cluster的client,因此只需要与cluster中的任何一个节点连接即可;远程LogStash和中心LogStash的redis配置部分为:

shipper.conf:

output {
	redis {
		host => "20.8.40.49:7000"
		data_type => "list"
		key => "key_count"
	}   
}

central.conf:

input {
	redis {
		host => "20.8.40.49"
		port => 7000
		type => "redis-cluster-input"
		data_type => "list"
		key => "key_count"
	}
}

使用redis cluster的优劣分析:

  • 可以提高broker组件的可用性:当每一个master节点都有slave节点的时候,任何一个节点挂掉,都不影响集群的正常工作;如果启用cluster-require-full-coverage no,则有效节点构成的子集群仍然可用。
  • 当作为broker组件的redis成为瓶颈的时候,redis cluster提供良好的扩展性。但是redis cluster有一个比较头疼的问题,就是在伸缩(增删节点)时,需要手动做sharding,官方提供了redis-trib.rb工具,我自己实现了一个java版本,可以作为参考redis-toolkit。
  • 当前的redis cluster还是RC1版,稳定版还需要等待一段时间。

2.2 redis主备结构

注意,主备不是主从,备用的redis实例只是作为冗余节点,当主节点挂掉时,备用的节点会顶上,任何时刻仅有一个节点在提供服务。无论是远程LogStash还是中心LogStash,都需要明确配置所有主备redis节点的信息,LogStash会轮询节点列表,选择一个可用的节点。比如,配置两个redis实例,6379作为主,6380作为从,则远程LogStash和中心LogStash的配置分别为:

shipper.conf:

output {
	redis {
		host => ["20.8.40.49:6379", "20.8.40.49:6380"]
		data_type => "list"
		key => "key_count"
	}   
}

central.conf:

input {
	redis {
		host => "20.8.40.49"
		port => 6379
		type => "redis-cluster-input"
		data_type => "list"
		key => "key_count"
	} 
	
	redis {
		host => "20.8.40.49"
		port => 6380
		type => "redis-cluster-input"
		data_type => "list"
		key => "key_count"
	} 
}

redis主备结构的优劣分析:

  • 可以提高broker组件的可用性:只要主备节点中有一个节点可用,broker组件服务就是可用的;
  • 主备结构无法解决redis成为瓶颈的情况;

3. 部署多个中心LogStash

当日志信息的量很大时,作为indexer的LogStash很可能成为瓶颈,此时,可以部署多个中心LogStash,它们之间的关系是对等的,共同从broker处提取消息,中心LogStash节点之间是相互独立的。每一个中心LogStash节点的配置是完全一样的,比如当broker是redis cluster时,中心LogStash的配置为:

central.conf:

input {
	redis {
		host => "20.8.40.49"
		port => 7000
		type => "redis-cluster-input"
		data_type => "list"
		key => "key_count"
	}
}

部署多个中心LogStash的优劣分析:

  • 可以提高indexer组件的可用性:多个中心LogStash节点之间是相互独立的,任何一个节点的失效不会影响其它节点,更不会影响整个indexer组件;当broker是redis时,各个中心LogStash都是redis的client,它们都是执行BLPOP命令从redis中提取消息,而redis的任何单个命令都是原子的,因此多中心LogStash不仅可以提高indexer组件的可用性,也可以提高indexer组件的处理能力和效率;
  • 多中心LogStash节点的部署和维护成本,可以借助配置管理工具如Puppet、SaltStack等

4. ElasticSearch Cluster

ElasticSearch原生支持Cluster模式,节点之间通过单播或多播进行通信;ElasticSearch Cluster能自动检测节点的增加、失效和恢复,并重新组织索引。

比如,我们启动两个ElasticSearch实例构成集群,使用默认配置即可,如:

$ bin/elasticsearch -d
$ bin/elasticsearch -d

使用默认配置,两个实例的HTTP监听端口分别为9200和9201,它们的节点间通信端口分别为9300和9301,默认使用多播构成集群,集群的名称为elasticsearch;

中心LogStash只需要配置ElasticSearch的cluster name即可(如果不能发现ES集群,可以指定host: host => "20.8.40.49"),如:

output {
	elasticsearch {
		cluster => "elasticsearch"
		codec => "json"
		protocol => "http"
	}   
}

使用ElasticSearch Cluster的优劣分析:

  • 提高组件的可用性:cluster中任何一个节点挂掉,索引及副本都会自动重新分配;
  • 极佳的水平扩展性:向cluster中增加新的节点即可,索引会自动重新组织;

5. 后续工作

关于ELKR日志服务,下一步的工作方向有:

  • 学习grok正则表达式,匹配自定义的日志输出格式;
  • 研究ElasticSearch的查询功能及原理;
  • 熟悉Kibana丰富的图标展示功能;

Ok,高可用方案的介绍告一段落,如果用到实际的生产环境中,应该会遇到很多意想不到的问题,后续会继续总结和分享。



推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
author-avatar
blg1202702934392
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有