一、数据库
NoSQL数据库:MongoDB、ElasitcSearch、Redis、HBase是现今最火的四款
https://zhuanlan.zhihu.com/p/37964096 关系型数据库:MySQL
1、redis
Redis的最大特点是key-value存储所带来的简单和高性能了。
所谓key-value存储,就是每一条记录只包含一个用于查询数据的Key,以及与之对应的存储数据的value,就如同现实生活中的门牌号与住户,而没有诸如表、字段这些常规数据库中必需有的复杂概念,所有的查询都仅仅依赖于key值。因此,key-value数据库可谓是数据库中数据结构最简单的一种,也得益于这种简单的结构,再加上Redis会把所有数据加载到内存中的,Redis能得到远高于MongoDB这类常规数据库的读写性能。
Redis的key-valule存储带来了性能这个优势,但是也给复杂查询带来了很多局限。由于阉割掉了数据表、字段这样的重要特性,且所有的查询都依赖key,因此Redis无法提供常规数据库所具备的多列查询、区段查询等复杂查询功能。同时,由于Redis需要把数据存在内存中,这也大大限制了Redis可存储的数据量,这也决定了Redis难以用在数据规模很大的应用场景中。
Redis牺牲了常规数据库中的数据表、复杂查询等功能,换来了很大的性能提升,特别适合那些对读写性能要求极高,且数据表结构简单(key-value、list、set之类)、查询条件也同样简单的应用场景。如果你的数据表结构还挺复杂,你还经常需要做一些复杂查询操作,那你最好还是老老实实用MongoDB或者SQL吧。
2、ElasticSearch
严格的说,ES不是一个数据库,而是一个搜索引擎,ES的方方面面也都是围绕搜索设计的。
ES支持全文搜索,这里简单解释下什么是全文搜索:对于“我在北京的一家互联网公司工作”这样的数据,如果你搜索“北京”、“互联网”、“工作”这些关键词都能命中这条数据的话,这就是全文搜索,你每天都在用的百度、Google都属于全文搜索。除了搜索之外,ES还会自动的替你对所有字段建立索引,以实现高性能的复杂聚合查询,因此只要是存入ES的数据,无论再复杂的聚合查询也可以得到不错的性能,而且你再也不用为如何建立各种复杂索引而头痛了。
ES也有很多的短处,最明显的就是字段类型无法修改、写入性能较低和高硬件资源消耗。前边讲到ES会自动的替你建立索引,尽管这能给全文搜索以及聚合查询带来很多好处还能替你省了建索引这一麻烦事,但是这个特性也会带来一堆问题。ES需要在创建字段前要预先建立Mapping,Mapping中包含每个字段的类型信息,ES需要根据Mapping为字段建立合适的索引。由于这个Mapping的存在,ES中的字段一但建立就不能再修改类型了。(例如,你建的数据表的某个字段忘了加全文搜索,你想临时加上,但是表已经建好并且已经有很多数据了,这时候该怎么办呢?不好意思,你只能把整个数据表删了再重建一遍!)因此,ES在数据结构灵活度上高于MySQL但远不如MongoDB。
ES的缺点还不止这些,自动建立索引使得ES的写入性能也收到了影响,要明显低于MongoDB。对于同样的数据ES占用的存储空间也要明显大于MongoDB(建那么多索引能不占空间吗?),对硬件资源的消耗也是非常厉害,大数据量下64G内存+SSD基本是标配,算得上是数据库中的贵族服务了,因此如果你的老板很小气,对于ES的选用可要慎重喽!
ES的全文搜索特性使它成为构建搜索引擎的利器。除此之外,ES很好的支持了复杂聚合查询这一特点还使得ES非常适合拿来作数据分析使用。其实,ES还专门做了与自己配套的ELK套装,给你提供从日志收集到数据可视化分析的一条龙服务,绝对是构建高大上数据分析平台的利器。但是,ES的高成本和低写入性能这些缺点也注定了它不适合用在那些数据价值不高、对写入性能有要求、数据量大而成本受限的场景中。
3、Redis和ES
Redis与ES通过LogStach进行关系建立
Logstash是一个开源的服务器端数据处理管道,可以同时从多个数据源获取数据,并对其进行转换,然后将其发送到你最喜欢的“存储”。(当然,我们最喜欢的是Elasticsearch)。
分布式日志存储系统ELK-------------------
Filebeat:Filebeat是一款轻量级,占用服务资源非常少的数据收集引擎,它是ELK家族的新成员,可以代替Logstash作为在应用服务器端的日志收集引擎,支持将收集到的数据输出到Kafka,Redis等队列。
Logstash:数据收集引擎,相较于Filebeat比较重量级,但它集成了大量的插件,支持丰富的数据源收集,对收集的数据可以过滤,分析,格式化日志格式。
Elasticsearch:分布式数据搜索引擎,基于Apache Lucene实现,可集群,提供数据的集中式存储、分析、以及强大的数据搜索和聚合功能。
Kibana:数据的可视化平台,通过该web平台可以实时的查看 Elasticsearch 中的相关数据,并提供了丰富的图表统计功能。
二、消息队列
1、kafka
作为一个集群运行在一个或多个服务器上。吞吐量大,但从严谨性角度来讲大不如rabbitmq。
https://www.orchome.com/kafka/index
2、RabbitMQ
支持的协议多,非常重量级消息队列,对路由(Routing),负载均衡(Loadbalance)或者数据持久化都有很好的支持。
3、ActiveMQ
类似ZeroMQ,针对大吞吐量的需求场景,擅长的高级/复杂的队列,只提供非持久性的队列。能够以代理人和点对点的技术实现队列。
4、Redis:是一个key-Value的NOSql数据库,但也支持MQ功能,数据量较小,性能优于RabbitMQ,数据超过10K就慢的无法忍受。