首页> 搜索结果页
"鉴权、授权和结算有什么用" 检索
共 5 条结果
谈谈互联网后端基础设施
本文更新于2016.12.12, 加入了扩展章节 对于一个互联网企业,后端服务是必不可少的一个组成部分。抛开业务应用来说,往下的基础服务设施做到哪些才能够保证业务的稳定可靠、易维护、高可用呢?纵观整个互联网技术体系再结合公司的目前状况,个人认为必不可少或者非常关键的后端基础技术/设施如下图所示: Api网关 业务应用和后端基础框架 缓存、数据库、搜索引擎、消息队列 文件存储 统一认证中心 单点登录系统 统一配置中心 服务治理框架 统一调度中心 统一日志服务 数据基础设施 故障监控 扩展 这里的后端基础设施主要指的是应用在线上稳定运行需要依赖的关键组件/服务等。开发或者搭建好以上的后端基础设施,一般情况下是能够支撑很长一段时间内的业务的。此外,对于一个完整的架构来说,还有很多应用感知不到的系统基础服务,如负载均衡、自动化部署、系统安全等,并没有包含在本文的描述范围内。 Api网关 在移动app的开发过程中,通常后端提供的接口需要以下功能的支持: 负载均衡 api访问权限控制 用户鉴权 一般的做法,使用nginx做负载均衡,然后在每个业务应用里做api接口的访问权限控制和用户鉴权,更优化一点的方式则是把后两者做成公共类库供所有业务调用。但从总体上来看,这三种特性都属于业务的公共需求,更可取的方式则是集成到一起作为一个服务,既可以动态地修改权限控制和鉴权机制,也可以减少每个业务集成这些机制的成本。这种服务就是Api网关(http://blog.csdn.net/pzxwhc/article/details/49873623),可以选择自己实现,也可以使用开源软件实现,如Kong。如下图所示: 但是以上方案的一个问题是由于所有api请求都要经过网关,它很容易成为系统的性能瓶颈。因此,可以采取的方案是:去掉api网关,让业务应用直接对接统一认证中心,在基础框架层面保证每个api调用都需要先通过统一认证中心的认证,这里可以采取缓存认证结果的方式避免对统一认证中心产生过大的请求压力。 业务应用和后端基础框架 业务应用分为:在线业务应用和内部业务应用。 在线业务应用:直接面向互联网用户的应用、接口等,典型的特点就是:请求量大、高并发、高可用、对故障的容忍度低。 内部业务应用:这个是面向公司内部的应用。比如,内部数据管理平台、广告投放平台等。相比起在线业务应用,其特点: 数据保密性高、压力小、并发量小、允许故障的发生。 业务应用基于后端的基础框架开发,针对Java后端来说,应该有的几个框架如下: MVC框架:从十年前流行的Struts1、2到现在最为推崇的SpringMVC、Jersey以及国人开发的JFinal、阿里的WebX等等,这些框架尤其是后面流行的这些都是各有千秋的。选型的主要因素是看你的团队是否有一个对某框架能够做二次开发、定制的人在。很多时候,针对这些通用的框架,你是需要做一些特定的开发才能满足特定的需求的。比如,很多团队传递参数使用的都是UnderScore的命名法(下划线连接单词),但是Java中确是使用LowCamel命名的。对于SpringMVC,可以通过注解的alias来指定,但这样需要对每一个参数都要指定alias有点效率太低,此外ModelAttribute也不支持别名,更好的方式是在框架层面统一对参数做Camel命名的转换达到目的。 IOC框架:ioc带来的好处无须多言。目前Java中最为流行的Spring自诞生就天然支持IOC。 ORM框架:MyBatis是目前最为流行的orm框架。此外,Spring ORM中提供的JdbcTemplate也很不错。当然,对于分库分表、主从分离这些需求,一般就需要实现自己的ORM框架来支持了,像阿里的tddl、当当的sharding-jdbc(从datasource层面解决了分库分表、读写分离的问题,对应用透明、零侵入)。此外,为了在服务层面统一解决分库分表、主从分离、主备切换、缓存、故障恢复等问题,很多公司都是有自己的数据库中间件的,比如阿里的Cobar、360的Atlas、网易的DDB,还有官方提供的MySQL Proxy以及开源的MyCat、kingshard和收费的oneproxy。目前,线上有一定规模使用的应该是kingshard,当然如果不缺钱也可以上oneproxy。 缓存框架:缓存框架主要指的是对redis、memcached这些缓存服务器的操作统一封装,一般使用Spring的RedisTemplate即可,也可以使用jedis做自己的封装,支持客户端分布式方案、主从等。 JavaEE应用性能检测框架:对于线上的JavaEE应用,需要有一个统一的框架集成到每一个业务中检测每一个请求、方法调用、jdbc连接、redis连接等的耗时、状态等。jwebap是一个可以使用的性能检测工具,但由于其已经很多年没有更新,有可能的话建议基于此项目做二次开发。 一般来说,以上几个框架即可以完成一个后端应用的雏形。 对于这些框架来说,最为关键的是根据团队技术构成选择最合适的,有能力开发自己的框架则更好。此外,这里需要提供一个后端应用的模板或生成工具(如maven的archetype)给团队成员使用,可以让大家在开发新的应用的时候,迅速的生成雏形应用,而无需再做一些框架搭建的重复性劳动。 缓存、数据库、搜索引擎、消息队列 缓存、数据库、搜索引擎、消息队列这四者都是应用依赖的后端基础服务,他们的性能直接影响到了应用的整体性能,有时候你代码写的再好也许就是因为这些服务导致应用性能无法提升上去。 缓存 如缓存五分钟法则所讲:如果一个数据频繁被访问,那么就应该放内存中。这里的缓存就是一种读写效率都非常高的存储方案,能够应对高并发的访问请求,通常情况下也不需要持久化的保证。但相对其他存储来说,缓存一般是基于内存的,成本比较昂贵,因此不能滥用。 缓存可以分为:本地缓存和分布式缓存。 本地缓存:主要指的是内存中的缓存机制。在Java中,Google Guava中就提供了本地缓存的实现机制。当然使用java的ConncurrentHashMap你也可以实现自己的本地缓存方案。 分布式缓存:指的单独的缓存服务。几年前比较流行的是memcached,但其只是一个KV的存储,支持的数据结构太少。现在最为流行的就是Redis,能够支持丰富的数据结构,基于事件驱动的单线程非阻塞IO也能够应对高并发的场景。集群方案除了官方的redis cluster, 目前比较流行的还有豌豆荚的codis、twitter的twemproxy。 对于缓存的使用,需要注意以下几点: 缓存的失效机制:当给某一个key设置了有效期,那么缓存何时对此key进行删除呢?一般来说会有以下几种方式: 守护进程定时去扫描key,找到已经失效的key,然后删除 读取key的时候先去判断key是否失效,如果失效则删除并返回空。 缓存的淘汰机制:是当缓存内存达到上限时如何删除缓存中的key。Redis提供了以下数据淘汰策略: volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰 volatile-random:从已设置过期时间的数据集中任意选择数据淘汰 allkeys-lru:从数据集中挑选最近最少使用的数据淘汰 allkeys-random:从数据集中任意选择数据淘汰 no-enviction(驱逐):禁止驱逐数据 对于其具体的实现机制,可以参考《Redis设计与实现》一书 缓存的更新机制: 通常来说有四种方式:Cache aside, Read through, Write through, Write behind caching,具体的可见陈皓大神的这篇总结:缓存更新的套路。 缓存的服务过载保护:缓存的服务过载指的是由于缓存失效,而引起后端服务的压力骤增,进一步产生雪崩效应。这个现象和缓存更新是相关的,采取何种策略在缓存失效的时候去更新缓存直接决定了服务过载的保护机制。通常的分为客户端和服务端的应对方案。前者的方案有:基于超时的简单模式、基于超时的常规模式、基于刷新的简单模式、基于刷新的常规模式、基于刷新的续费模式。后者的方案则是很常见的流量控制和服务降级。具体的可以看美团技术团队总结的这篇文章:Cache应用中的服务过载案例研究。 数据库 数据库是后端开发中非常常见的一个服务组件。对于数据库的选型,要根据业务的特点和数据结构的特点来决定。 从存储介质上,数据库可以分为: 内存数据库: 数据主要存储在内存中,同时也可以采取措施对数据进行持久化到硬盘中。如Redis、H2DB的内存模式。对于这种数据库,由于内存成本昂贵,因此一定要做好存储的量化分析、容量预估,防止内存不足造成服务不可用。 硬盘数据库:数据存储在硬盘上的这种数据库是最为常见的。MySQL、Oracle、Postgresql、HBASE、H2DB、SqlLite等等都是硬盘数据库。此外,SSDB是基于SSD硬盘的KV数据库,支持的数据接口很丰富,是Redis的另外一个选择。 从存储数据类型、数据模式上,数据库可以分为: 关系型数据库:MySQL、Oracle、Postgresql都是关系型数据库的,是采用关系模型(关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织)来组织数据的数据库。 非关系型数据库:非关系型数据库是相对关系型数据库来讲的。以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。但是,其没有关系型数据库那种严格的数据模式,并不适合复杂的查询以及需要强事务管理的业务。非关系型数据库又可以分为: KV数据库:主要以(key,value)键值对存储数据的数据库。以Redis、RocksDB(levelDB)、SSDB为代表。 文档数据库:总体形式上也是键值对的形式,但是值里面又可以有各种数据结构:数组、键值对、字符串等等。以mongodb、couchdb为代表。 列数据库:也叫作稀疏大数据库,一般是用来存储海量数据的。相对于行数据库,这种数据库是以列为单位存储数据在介质上的。以Hbase、Cassendra为代表。 和数据库相关的一个很重要的就是数据库的索引。有一种说法是:“掌握了索引就等于掌握了数据库”。暂且不去评判此说法是否真的准确,但索引的确关系着数据库的读写性能。需要对数据库的索引原理做到足够的了解才能更好的使用各种数据库。通常来说,Mysql、Oracle、Mongodb这些都是使用的B树作为索引,是考虑到传统硬盘的特点后兼顾了读写性能以及范围查找需求的选择,而Hbase用得LSM则是为了提高写性能对读性能做了牺牲。 搜索引擎 搜索引擎也是后端应用中一个很关键的组件,尤其是对内容类、电商类的应用,通过关键词、关键字搜索内容、商品是一个很常见的用户场景。比较成熟的开源搜索引擎有Solr和Elasticsearch,很多中小型互联网公司搜索引擎都是基于这两个开源系统搭建的。它们都是基于Lucence来实现的,不同之处主要在于termIndex的存储、分布式架构的支持等等。 对于搜索引擎的使用,从系统熟悉、服务搭建、功能定制,需要花费较长时间。在这个过程中,需要注意以下问题: 搜索引擎与公司现有数据系统的集成。现有的持久化、供搜索的数据的载体是什么, 如何让搜索引擎在全量和增量建索引过程中无缝集成原来的数据载体,才能发挥搜索引擎自身的实时性, 水平扩展性(性能与容量和机器数量成正比)等优势。 和数据库一样,对搜索引擎的索引机制也需要做到深入的了解。 更为详细的对于搜索引擎的工程化实践可以参考有赞工程师的这篇文章:有赞搜索引擎实践(工程篇) 另外,搜索引擎还可以用在数据的多维分析上,就是GrowingIO、MixPanel中的可以任意维度查询数据报表的功能。当然,druid也许是一个更好的实现多维分析的方案,官方也有其与es的比较:http://druid.io/docs/latest/comparisons/druid-vs-elasticsearch.html。 消息队列 软件的组织结构,从开始的面向组件到SOA、SAAS是一个逐渐演变的过程。而到了今天微服务盛行的时代,你都不好意思说自己的系统只是单一的一个系统而没有解耦成一个个service。当然,小的系统的确没有拆分的必要性,但一个复杂的系统拆成一个个service做微服务架构确实是不得不做的事情。 那么问题就来了,service之间的通信如何来做呢?使用什么协议?通过什么方式调用?都是需要考虑的问题。 先抛开协议不谈,service之间的调用方式可以分为同步调用以及异步调用。同步调用的方式无需多说,那么异步调用是怎么进行的呢?一种很常见的方式就是使用消息队列,调用方把请求放到队列中即可返回,然后等待服务提供方去队列中去获取请求进行处理,然后把结果返回给调用方即可(可以通过回调)。 异步调用就是消息中间件一个非常常见的应用场景。此外,消息队列的应用场景还有以下: 解耦:一个事务,只关心核心的流程,需要依赖其他系统但不那么重要的事情,有通知即可,无须等待结果。 最终一致性:指的是两个系统的状态保持一致,要么都成功,要么都失败,可以有一定的延迟,只要最终达到一致性即可。 广播:这是消息队列最基本的功能。生产者只需要发布消息,无须关心有哪些订阅者来消费消息。 错峰与流控:当上下游系统处理能力不同的时候就需要类似消息队列的方式做为缓冲区来隔开两个系统。 目前主流的消息队列软件,主要有以下几种: ActiveMQ:Java中最为简单的消息队列,是对JMS的实现,没有规定消息的顺序、安全、重发等特性。 RabbitMQ:是对AMQP协议的实现,对于消息的顺序性、安全、重发等都做了很好的支持。比较适合不允许数据丢失、有事务需求的业务场景下的消息传输。 Kafka:是基于Log的消息队列,底层依赖于文件的顺序读取,是append-only的。适合对数据丢失不敏感、强调性能的一些海量日志传输场景中。是最近几年大数据领域很火的一个技术。 ZeroMQ:是一个网络编程的Pattern库,将常见的网络请求形式(分组管理,链接管理,发布订阅等)模式化、组件化,简而言之socket之上、MQ之下。对于MQ来说,网络传输只是它的一部分,更多需要处理的是消息存储、路由、Broker服务发现和查找、事务、消费模式(ack、重投等)、集群服务等。 文件存储 不管是业务应用、依赖的后端服务还是其他的各种服务,最终还是要依赖于底层文件存储的。通常来说,文件存储需要满足的特性有:可靠性、容灾性、稳定性,即要保证存储的数据不会轻易丢失,即使发生故障也能够有回滚方案,也要保证高可用率。在底层可以采用传统的RAID作为解决方案,再上一层,目前hadoop的hdfs则是最为普遍的分布式文件存储方案,当然还有NFS、Samba这种共享文件系统也提供了简单的分布式存储的特性。 此外,如果文件存储确实成为了应用的瓶颈或者必须提高文件存储的性能从而提升整个系统的性能时,那么最为直接和简单的做法就是抛弃传统机械硬盘,用SSD硬盘替代。像现在很多公司在解决业务性能问题的时候,最终的关键点往往就是SSD。这也是用钱换取时间和人力成本最直接和最有效的方式。在数据库部分描述的SSDB就是对LevelDB封装之后,利用SSDB的特性的一种高性能KV数据库。 至于HDFS,如果要使用上面的数据,是需要通过hadoop的。类似xx on yarn的一些技术就是将非hadoop技术跑在hdfs上的解决方案(当然也是为了使用MR)。 统一认证中心 统一认证中心,主要是对app用户、内部用户、app等的认证服务,包括 用户的注册、登录验证、token鉴权 内部信息系统用户的管理和登录鉴权 App的管理,包括app的secret生成,app信息的验证(如验证接口签名)等。 之所以需要统一认证中心,就是为了能够集中对这些所有app都会用到的信息进行管理,也给所有应用提供统一的认证服务。尤其是在有很多业务需要共享用户数据的时候,构建一个统一认证中心是非常必要的。此外,通过统一认证中心构建移动app的单点登录也是水到渠成的事情(模仿web的机制,将认证后的信息加密存储到本地磁盘中供多个app使用)。 单点登录系统 目前很多大的在线web网站都是有单点登录系统的,通俗的来说就是只需要一次用户登录,就能够进入多个业务应用(权限可以不相同),非常方便用户的操作。而在移动互联网公司中,内部的各种管理、信息系统同样也需要单点登录系统。目前,比较成熟的、用的最多的单点登录系统应该是耶鲁大学开源的CAS, 可以基于https://github.com/apereo/cas/tree/master/cas-server-webapp来定制开发的。此外,国人开源的kisso的这个也不错。基本上,单点登录的原理都类似下图所示: 统一配置中心 在Java后端应用中,一种读写配置比较通用的方式就是将配置文件写在propeties、yaml、HCON文件中,修改的时候只需要更新文件重新部署即可,可以做到不牵扯代码层面改动的目的。统一配置中心,则是基于这种方式之上的统一对所有业务或者基础后端服务的相关配置文件进行管理的统一服务, 具有以下特性: 能够在线动态修改配置文件并生效 配置文件可以区分环境(开发、测试、生产等) 使用方便: 在java中可以通过注解、xml配置的方式引入相关配置 disconf是可以在生产环境使用的一个方案,也可能根据自己的需求开发自己的配置中心(可以选择zookeeper作为配置存储)。 服务治理框架 对于外部API调用或者客户端对后端api的访问,可以使用http协议或者说restful(当然也可以直接通过最原始的socket来调用)。但对于内部服务间的调用,一般都是通过RPC机制来调用的。目前主流的RPC协议有: RMI Hessian Thrift Dubbo 这些RPC协议各有优劣点,需要针对业务需求做出相应的最好的选择。 这样,当你的系统服务在逐渐增多,RPC调用链越来越复杂,很多情况下,需要不停的更新文档来维护这些调用关系。一个对这些服务进行管理的框架可以大大节省因此带来的繁琐的人力工作。 传统的ESB(企业服务总线)本质就是一个服务治理方案,但esb作为一种proxy的角色存在于client和server之间,所有请求都需要经过esb,使得esb很容易成为性能瓶颈。因此,基于传统的esb,更好的一种设计如下图所示: 如图,以配置中心为枢纽,调用关系只存在于client和提供服务的server之间,就避免了传统esb的性能瓶颈问题。对于这种设计,esb应该支持的特性如下: 服务提供方的注册、管理 服务消费者的注册、管理 服务的版本管理、负载均衡、流量控制、服务降级等 服务的容错、熔断等 阿里开源的dubbo则对以上做了很好的实现,也是目前很多公司都在使用的方案。但由于某些原因,dubbo现已不再维护,推荐大家使用当当后来维护的dubbox。 统一调度中心 在很多业务中,定时调度是一个非常普遍的场景,比如定时去抓取数据、定时刷新订单的状态等。通常的做法就是针对各自的业务依赖Linux的cron机制或者java中的quartz。统一调度中心则是对所有的调度任务进行管理,这样能够统一对调度集群进行调优、扩展、任务管理等。azkaban和oozie是hadoop的流式工作管理引擎,也可以作为统一调度中心来使用。当然,你也可以使用cron或者quartz来实现自己的统一调度中心。 根据cron表达式调度任务 动态修改、停止、删除任务 支持任务工作流:比如一个任务完成之后再执行下一个任务 任务支持脚本、代码、url等多种形式 任务执行的日志记录、故障报警 对于Java的quartz这里需要说明一下:这个quartz需要和spring quartz区分,后者是spring对quartz框架的简单实现也是目前使用的最多的一种调度方式。但其并没有做高可用集群的支持。而quartz虽然有集群的支持,但是配置起来非常复杂。现在很多方案都是使用zookeeper来实现spring quartz集群的。这里有一个国人开源的uncode-shcedule对此实现的还不错,可以根据自己的业务需求做二次开发。此外,当当开源的elastic-job则在此之上又加入了弹性资源利用等更为强大的功能。 统一日志服务 日志是开发过程必不可少的东西。有时候,打印日志的时机、技巧是很能体现出工程师编码水平的。毕竟,日志是线上服务能够定位、排查异常最为直接的信息。 通常的,将日志分散在各个业务中非常不方便对问题的管理和排查。统一日志服务则使用单独的日志服务器记录日志,各个业务通过统一的日志框架将日志输出到日志服务器上。 可以通过实现log4j后者logback的appender来实现统一日志框架,然后通过RPC调用将日志打印到日志服务器上。 数据基础设施 数据是最近几年非常火的一个领域。从《精益数据分析》到《增长黑客》,都是在强调数据的非凡作用。很多公司也都在通过数据推动产品设计、市场运营、研发等。详细的可见之前的一篇《数据杂谈》,对数据相关的东西做过一些总结。这里需要说明的一点是,只有当你的数据规模真的到了单机无法处理的规模才应该上大数据相关技术,千万不要为了大数据而大数据。很多情况下使用单机程序+mysql就能解决的问题非得上hadoop即浪费时间又浪费人力。 这里需要补充一点的是,对于很多公司,尤其是离线业务并没有那么密集的公司,在很多情况下大数据集群的资源是被浪费的。因此诞生了xx on yarn一系列技术让非hadoop系的技术可以利用大数据集群的资源,能够大大提高资源的利用率,如Docker on yarn(Hulu的VoidBox)。 数据高速公路 接着上面讲的统一日志服务,其输出的日志最终是变成数据到数据高速公路上供后续的数据处理程序消费的。这中间的过程包括日志的收集、传输。 收集:统一日志服务将日志打印在日志服务上之后,需要日志收集机制将其集中起来。目前,常见的日志收集方案有:scribe、Chukwa、Kakfa和Flume。对比如下图所示: 传输:通过消息队列将数据传输到数据处理服务中。对于日志来说,通常选择kafka这种消息队列即可。 此外,这里还有一个关键的技术就是数据库和数据仓库间的数据同步问题,即将需要分析的数据从数据库中同步到诸如hive这种数据仓库时使用的方案。比较简单的、用的也比较多的可以使用sqoop进行基于时间戳的数据同步,此外,阿里开源的canal实现了基于binlog增量同步,更加适合通用的同步场景,但是基于canal你还是需要做不少的业务开发工作的。推荐另一款国人开源的MySQL-Binlog,原理和canal类似,默认提供了任务的后台管理功能,只需要实现接收到binlog后的处理逻辑即可。 离线数据分析 离线数据分析是可以有延迟的,一般针对是非实时需求的数据分析工作,产生的也是T-1的报表。目前最常用的离线数据分析技术除了hadoop还有spark。相比hadoop,spark性能上有很大优势,当然对硬件资源要求也高。 对于hadoop,传统的MR编写很复杂,也不利于维护,可以选择使用hive来用sql替代编写mr,但是前提务必要对hive的原理做到了解。可以参见美团的这篇博文来学习:Hive SQL的编译过程。而对于spark,也有类似hive的spark sql。 此外,对于离线数据分析,还有一个很关键的就是数据倾斜问题。所谓数据倾斜指的是region数据分布不均,造成有的结点负载很低,而有些却负载很高,从而影响整体的性能。因此,处理好数据倾斜问题对于数据处理是很关键的。对于hive的数据倾斜,可见:hive大数据倾斜总结。对于spark的倾斜问题,可见:Spark性能优化指南——高级篇。 实时数据分析 相对于离线数据分析,实时数据分析也叫在线数据分析,针对的是对数据有实时要求的业务场景,如广告结算、订单结算等。目前,比较成熟的实时技术有storm和spark streaming。相比起storm,spark streaming其实本质上还是基于批量计算的。如果是对延迟很敏感的场景,还是应该使用storm。 对于实时数据分析,需要注意的就是实时数据处理结果写入存储的时候,要考虑并发的问题,虽然对于storm的bolt程序来说不会有并发的问题,但是写入的存储介质是会面临多任务同时读写的。通常采用的方案就是采用时间窗口的方式对数据做缓冲后批量写入。 此外,实时数据处理一般情况下都是基于增量处理的,相对于离线来说并非可靠的,一旦出现故障(如集群崩溃)或者数据处理失败,是很难对数据恢复或者修复异常数据的。因此结合离线+实时是目前最普遍采用的数据处理方案。Lambda架构就是一个结合离线和实时数据处理的架构方案。 数据即席分析 离线和实时数据分析产生的一些报表是给数据分析师、产品经理参考使用的,但是很多情况下,线上的程序并不能满足这些需求方的需求。这时候就需要需求方自己对数据仓库进行查询统计。针对这些需求方,SQL上手容易、易描述等特点决定了其可能是一个最为合适的方式。因此提供一个SQL的即席查询工具能够大大提高数据分析师、产品经理的工作效率。Presto、Impala、Hive都是这种工具。如果想进一步提供给需求方更加直观的ui操作界面,可以搭建内部的Hue。 故障监控 对于面向用户的线上服务,发生故障是一件很严重的事情。因此,做好线上服务的故障检测告警是一件非常重要的事情。可以将故障监控分为以下两个层面的监控: 系统监控:主要指的对主机的带宽、cpu、内存、硬盘、io等硬件资源的监控。这可以使用开源的nagios、cacti等开源软件进行监控。目前,市面上也有很多第三方服务能够提供对于主机资源的监控,如监控宝等。对于分布式服务集群(如hadoop、storm、kafka、flume等集群)的监控则可以使用ganglia。此外,小米开源的OpenFalcon也很不错,涵盖了系统监控、JVM监控等,也支持自定义的监控机制。 业务监控:是在主机资源层面以上的监控,比如app的pv、uv数据异常、交易失败等。需要业务中加入相关的监控代码,比如在异常抛出的地方,加一段日志记录。 监控还有一个关键的步骤就是告警。告警的方式有很多种:邮件、im、短信等。考虑到故障的重要性不同、告警的合理性、便于定位问题等因素,有以下建议: 告警日志要记录发生故障的机器id,尤其是在集群服务中,如果没有记录机器id,那么对于后续的问题定位会很困难。 要对告警做聚合,不要每一个故障都单独进行告警,这样会对工程师造成极大的困扰。 要对告警做等级划分,不能对所有告警都做同样的优先级处理。 使用微信做为告警软件,能够在节省短信成本的情况下,保证告警的到达率。 故障告警之后,那么最最关键的就是应对了。对于创业公司来说,24小时待命是必备的素质,当遇到告警的时候,需要尽快对故障做出反应,找到问题所在,并能在可控时间内解决问题。对于故障问题的排查,基本上都是依赖于日志的。只要日志打的合理,一般情况下是能够很快定位到问题所在的,但是如果是分布式服务,并且日志数据量特别大的情况下,如何定位日志就成为了难题。这里有几个方案: 建立ELK(Elastic+Logstash+Kibana)日志集中分析平台,便于快速搜索、定位日志。对于ELK的介绍,可以见:使用Elasticsearch + Logstash + Kibana搭建日志集中分析平台实践 建立分布式请求追踪系统(也可以叫全链路监测系统),对于分布式系统尤其是微服务架构,能够极大的方便在海量调用中快速定位并收集单个异常请求信息,也能快速定位一条请求链路的性能瓶颈。唯品会的Mercury、阿里的鹰眼、新浪的WatchMan、Twitter开源的Zipkin基本都是基于Google的Dapper论文而来。此外,腾讯的染色日志机制本质上也是在链路追踪之上根据响应信息做了染色机制。Apache正在孵化中的HTrace则是针对大的分布式系统诸如hdfs文件系统、hbase存储引擎而设计的分布式追踪方案。这里需要提到的一点是,如果你的微服务实现使用了Spring cloud,那么Spring Cloud Sleuth则是最佳的分布式跟踪实现方案。 扩展 一. NetFlix 近几年Netflix开源了其内部很多的服务:https://github.com/Netflix,包括大数据、构建交付工具、通用运行时服务类库、数据持久化、安全等。里面有一些对应了上面所说的基础设施: zuul 这是Netflix所有后端服务最前端的一道门,也就是我们上面说的Api网关, 主要包含了以下功能: 认证授权和安全:识别合法的外部请求,拒绝非法的。 监控:跟踪记录所有有意义的数据以便于给我们一个精确的产品视图。 动态路由:根据需要动态把请求路由到合适的后端服务上。 压力测试:渐进式的增加对集群的压力直到最大值。 限流:对每一种类型的请求都限定流量,拒绝超出的请求。 静态响应控制:对于某些请求直接在边缘返回而不转发到后端集群。 多区域弹性:在aws的多个region中进行请求路由。 Eureka 是Netflix的服务注册发现服务,类似于dubbo的功能。包括负载均衡和容错。 Hystrix hystrix是一个类库。基于命令模式,实现依赖服务的容错、降级、隔离等。在依赖多个第三方服务的时候非常有用。此外,还可以通过自定义实现dubbo的filter来给dubbo添加hystrix的特性支持。 此外,Netflix的这些开源组件统称做Netflix oss,提供了一整套分布式系统解决方案,涵盖了做分布式微服务需要的服务发现、服务容错、负载均衡、权限控制等。当然,如果你直接选用docker的话,那么K8s本身也提供了这些东西。 二. Spring Cloud Spring cloud给我们构建分布式系统提供了一整套开发工具和框架,基本上也涵盖了本文讲述的各个组件,其子项目Spring Cloud Netflix则能够集成Netflix的各个组件。现在很多公司和团队都是基于Spring cloud这一套东西在做微服务实现的。不过,spring cloud包含很多子项目,想要吃透这些得花不小的成本。 Spring Cloud Config 统一配置中心,类似于前文说过的disconf,不过其配置文件时存储在版本管理系统如git、svn上的。其配置的实时在线更新则需要依赖Spring Cloud Bus。 Spring Cloud Security 提供了oauth2客户端的负载均衡以及认证header等安全服务,可以做为Api网关的实现。 Spring Cloud Consul/Zookeepr 服务统一发现、注册、配置服务。类似于dubbo。 Spring Cloud Bus 提供了服务之间通信的分布式消息事件总线,主要用来在集群中传播状态改变(如配置改动)。 Spring Cloud Sleuth 分布式跟踪系统, 能够追踪单次请求的链路轨迹以及耗时等信息。 以上是本人实践的一些经验。由于知识有限,难免有纰漏,敬请指出。 转自:http://www.rowkey.me/blog/2016/08/27/server-basic-tech-stack/
文章
缓存 · 监控 · 大数据 · 数据库 · Spring · Java · 存储
2018-01-15
中机区块链工业应用白皮书
前言 区块链技术将引领互联网数据存储与交换的巨变,开启信任经济时代。 区块链诞生自中本聪的比特币,自2009年以来,出现了各种各样的类比特币的数字货币。由于人们对数字货币的关注,自去年开始,区块链技术独立于比特币,逐渐进入科技公司和人民群众的视野,引发了广泛关注与大量讨论。 人们发现,区块链的意义在于可以构建一个更加可靠的互联网系统,从根本上解决价值交换与转移中存在的欺诈和寻租现象。越来越多的人相信,随着区块链技术的普及,数字经济将会更加真实可信,经济社会由此变得更加公正和透明。 进一步的研究发现,区块链技术具备一种“降低成本”的强大能力,能简化流程,降低一些不必要的交易成本及制度性成本。这种能力应用于许多社会领域中,对于改善当前低迷的经济环境更有现实意义。 然后区块链的开源平台也暴露出读写性能、模块标准化、应用灵活支持、监管和法律认可、安全和隐私保护等多个亟待改善之处。除此之外,区块链领域的人才稀缺也极大抑制着我们对于这项技术的规模化应用。 在这种背景下,中机区块链实验室的成立对构建金融科技底层的信任网络,推动区块链产业发展落地,培养区块链人才,促进区块链技术研究交流和产业落地都有很大的价值和意义。 中机区块链实验室整合区块链行业专家致力于提供社会级区块链基础设施,提供区块链解决方案,行业解决方案,全生命周日服务,以及安全、可靠、灵活的区块链服务。用区块链+人工智能构建高效的新型商业文明社会。 区块链技术概述 上世纪70 年代以来,随着密码学技术、分布式网络、共识算法以及硬件存储计算能力的飞速发展,通过技术手段实现多主体间共识机制建立的条件日趋成熟,为解决多主体环境下的中介机构信任风险、降低交易成本、提升协同效率提供了全新的解决思路。 区块链是一种由多方共同维护,以块链结构存储数据,使用密码学保证传输和访问安全,能够实现数据一致存储、无法篡改、无法抵赖的技术体系。简单的说区块链技术是一种互联网数据库技术,其特点是去中心化、公开透明,让每个人均可参与数据库记录。 区块链有哪些特点 从技术构成的角度来观察区块链有助于我们揭开它的神秘面纱,实事求是地分析区块链,并揭示它的本质特点,理解其价值发挥的内在逻辑。如前所述,区块链并不是一个全新的技术,而是结合了多种现有技术进行的组合式创新,是一种新形式的分布式加密存储系统。 区块链本质上是一种健壮和安全的分布式状态机,典型的技术构成包括共识算法、P2P通讯、密码学、数据库技术和虚拟机。这也构成了区块链必不可少的5 项核心能力: 存储数据——源自数据库技术和硬件存储计算能力的发展,随着时间的累积,区块链的大小也在持续上升,成熟的硬件存储计算能力,使得多主体间同时大量存储相同数据成为可能; 共有数据——源自共识算法,参与区块链的各个主体通过约定的决策机制自动达成共识,共享同一份可信的数据账本;目前典型的共识算法主要有PoW、PoS、PBFT、Raft、Paxos 等。各种共识算法的差异体现在不同阶段采取了不同实现策略。 PoW、PoS 算法在交易扩散和排序时,不采用原子广播协议,同时以随机化的方式选择出leader 节点执行排序,因此会导致交易可能被随机丢弃。 Raft、Paxos 算法对全部交易进行原子广播和排序,但在共识的过程并不处理拜占庭错误。 PBFT 算法对全部交易进行原子广播和排序,同时在共识阶段处理拜占庭错误,不支持动态调整节点。 分布式——源自P2P 通讯技术,实现各主体间点对点的信息传输; 防篡改与保护隐私——源自密码学运用,通过公钥私钥、哈希算法等密码学工具,确保各主体身份和共有信息的安全; 数字化合约——源自虚拟机技术,将生成的跨主体的数字化智能合约写入区块链系统,通过预设的触发条件,驱动数字合约的执行。 区块链适合解决哪些问题 解决中心化的潜在风险 中心化也可能导致互联网不再开放,Facebook 是封闭的系统,微信也是封闭的系统。这些封闭系统制造了信息的孤岛,严重阻碍了信息的流动。用户在这里创造了数据,理论上说用户是拥有它的,但实际上用户拿不到它,甚至没法备份它,只能被企业所用。 随着社会的进步,个人所能创造的价值已经极大的增加,在这样的情况下,中心化体系往往践踏个人的权利,比如垄断企业在不断侵犯消费者权益,比如一些滥用垄断地位绑架消费者的中国互联网企业。 去中心化将给我们一个更自由,更透明,更公平的环境。以去中心化比特币为例,任何人都可以发起一笔交易,任何人也都可以参与验证交易,任何人也都可以同时读取区块链上的所有信息。 降低信任成本 回顾历史,人类文明是建立在信任和共识的基础上搭建起合作网络,从而人类成为地球的主宰。 传统金融的合作网络建立在钢筋水泥的大厦上,所以银行都需要盖大楼,让大家相信他们是值得信任的。政治上的信任构建也大体如此,需要大量的成本。 从个人信任进化到制度信任是人类文明的一大进步,制度的产生源于降低交易成本的需求。通过对符合制度规定的行为进行认可与鼓励,对违反制度规定的行为进行惩戒,引导人们将自己的行为控制在一定的范围内,从而达到降低交易成本的目的。 但制度和国家机器等中心节点为我们建立信用的成本偏高,因为需要很多人来维持这个体系。不管哪个时代,需要大量的人来维持的体系成本必然很高。 区块链技术则用代码构建了一个最低成本的信任方式 —— 机器信任,我们不需要相信语言和故事,也不需要有钢筋水泥、中央机构为基础,不需要靠个人领袖背书,只需要知道那些区块链上的代码会执行,也不需要担心制度会被腐败掉,就可以做到互相协作,低成本构建大型合作网络。 机器信任其实是无须信任的信任。人类历史将第一次可以接近零成本建立地球上前所未有的大型合作网络,这必将是一场伟大的群众运动。区块链有望带领我们从个人信任、制度信任进入到机器信任的时代。 区块链发展面临的挑战 目前人们已经广泛认识到区块链巨大的应用价值,但是区块链的技术发展却还没有到达成熟阶段,尤其在企业级应用方面,区块链的交易并发能力、数据存储能力、通用性、功能完备性都还存在明显不足。 交易并发能力 目前开源的区块链系统的高并发交易能力普遍不高,其中,共识算法是制约性能的重要方面。在区块链中使用的典型共识算法主要有:PoW、PoS、DPoS、PBFT 等,它们的性能对比如下: 制约性能的另一个重要因素是账本结构。目前典型的区块链账本设计为区块的单链结构,意味着从全局来看所有的交易都只能顺序地被处理。由于交易处理缺少并行度,因而难以获得接近于传统中心化系统的性能表现。 数据存储能力 在数据存储能力方面,由于区块链的数据只有追加而没有移除,数据只增不减,随着时间推移,区块链系统对数据存储大小的需要也只能持续地增大,在处理企业数据时这一趋势增长更甚。 通用性 区块链需要适应多样化的业务需求,满足跨企业的业务链条上的数据共享,这意味着区块链对数据的记录方式要有足够的通用和标准,才能表示各种结构化和非结构化的信息,并能够满足随着业务范围拓展所需的跨链要求。目前市面上的区块链系统大多采用特定的共识算法、加密算法、账户模型、账本模型、存储类型,缺少可插拔能力,无法适应不同场景要求。 功能完备性 纵观现有区块链平台,模型抽象单一,难以适应业务系统快速开发的要求。另外,缺少对企业应用中常见的一些功能的支持,例如用户认证、多级授权等。再者,涉及到企业业务协作时,跨企业的事件通知机制显得尤为重要,但少有区块链平台支持。 区块链+人工智能 如果说人工智能的改变是生产力—让机器做更多的工作,让人做更少的工作;那么区块链带来的将是生产关系的颠覆。 人工智能影响区块链 区块链的作用虽然非常强大,但也存在一定的局限性。有些是因为技术本身,而另一些则来因为金融行业落后的管理思想,但所有这些局限性都可能受到AI的影响. 能源消耗:采矿需要大量的能源和金钱(O’Dwyer,David Malone,2014)。AI已经证明在优化能源消耗上的效率很高,所以我相信类似的技术也可以应用在区块链上,这将减少采矿硬件的投资; 可扩展性: 区块链以每10分钟1MB的速度稳步增长,目前已经增加了85GB。中本聪提出的“交易剪枝”(是一种空间回收技术,也就是,删除不必要的完全化交易数据)是一种可行方案,但是AI可以引入新的分布式学习系统,比如联合学习,通过新的数据分离技术,提高系统效率; 安全性:即使区块链几乎不可能被黑,但其进一步的应用是不安全的。近两年机器学习取得了巨大进步,使AI成为了区块链技术安全上的有力保障,尤其是在系统的固定结构方面; 隐私性: 个人数据的隐私问题已经得到了密切关注(UniCredit,2016)。同态加密技术(直接处理加密数据)、Enigma项目(Zyskind等,2015)或Zerocash项目(Sasson等,2014),是可能的解决方案,但我认为这个问题和前两点紧密相连; 功效: Deloitte(2016)估计,花费在区块链上验证和共享交易数据的总运行成本大约6亿美元一年。智能系统能计算出特定节点优先执行任务的概率,从而能提醒矿工找寻其他路径并降低总的运算成本。此外,尽管存在一些结构性限制,但更好的效率和更低的能量消耗也可以减少网络延迟,加快处理速度; 硬件: 矿工(可能是公司或者个人)把大量的钱投入到挖矿专用的硬件系统中。当系统变得更加高效,一些硬件可能被应用到神经网络中使用(挖矿巨头Bitmain做的正是这个); 数据门: 在未来,我们所有的数据都将在区块链上,公司能从我们这里购买数据,我们需要权限访问数据、跟踪数据的使用,然后加快处理个人事务的速度。 区块链影响人工智能 帮助AI解释AI本身:AI的黑盒问题一直困扰着我们,一个清晰的数据检索方案不仅可以提高数据和模型的可信度,还可以提供一条清晰的路径来追溯机器决策过程; 提高AI的有效性: 安全的数据共享意味着每个人都将拥有更多的数据,然后会获得更好的模型,更好的方案,更好的结果和更好的新数据。 降低市场进入壁垒:一步一步的来谈这个问题。区块链技术可以保护您的数据,那你为什么不私下把所有的数据都存储起来,然后卖掉呢?嗯,你可能会。 人工智能和区块链是促进各行业创新和转型的主要技术,对这一点各行业已达成共识。每种技术都有其自身的技术复杂性和商业价值,但如果将两种技术结合使用,可能是对整个技术(甚至人类)的重新定义。 中机区块链技术主要应用场景 工业领域 2018年3月23日工信部组织召开工业领域区块链应用座谈会,座谈会围绕工业领域区块链应用发展情况、面临的问题和挑战、发展趋势等内容进行了广泛交流。中机区块链实验室接下来将继续深入开展调研,总结应用实践,研究探索区块链在工业领域的应用。研究发现在电力,能源,化工等应用广泛。 电力 电力行业偷电偷电现象时常发生,区块链的数据不可篡改性,可以从根源上杜绝这一现象发生,让每一度电都有迹可循。 能源:能源交易的制度性成本高,采用区块链技术将极大的改变能源系统生产,交易模式。交易主体可以越过庞大的电网系统,点对点实现能源产品的生产,交易,能源基础设施共享。 化工 对化工行业,中机区块链技术使用共享数据库,可以自动实时更新,并可借助计算机算法在短短几分钟之内处理交易并结算,无需第三方验证。交易的安全性和效率都得到了显著提升。 中机区块链实验室研发团队,花费2年多的时间,提供了区块链+工业落地方案。 基于区块链智能化车间方案图 工业智能通信协议 供应链领域 区块链技术有助于提升供应链管理效率。更透明地跟踪所有类型的交易,想象它在整个供应链中呈现的可能性。每当产品易手时,交易都可以被记录下来,从制造到销售创建产品的永久历史。这可以大大减少时间延迟,成本增加以及困扰今天交易的人为错误。 所具有的数据不可篡改和时间戳的存在性证明的特质能很好地运用于解决供应链体系内各参与主体之间的纠纷,实现轻松举证与追责。区块链技术可以用于产品防伪。数据不可篡改与交易可追溯两大特性相结合,可根除供应链内产品流转过程中的假冒伪劣问题。 物联网领域 目前的物联网生态体系,依赖中心化的网络管理架构,所有的设备都是通过云服务器连接。随着网络规模的扩大,中心化云服务器、大型服务器和网络设备的基础设施和维护方面将占用高昂成本。在去中心化的物联网愿景中,区块链是发生互动的设备间促进交易处理和协作的框架,网络上的每个设备都可以作为一个独立、微型的商业主体运行。 区块链凭借主体对等、公开透明、安全通信、难以篡改和多方共识等特性,对物联网将产生重要的影响:多中心、弱中心化的特质将降低中心化架构的高额运维成本,信息加密、安全通信的特质将有助于保护隐私,身份权限管理和多方共识有助于识别非法节点,及时阻止恶意节点的接入和作恶,依托链式的结构有助于构建可证可溯的电子证据存证,分布式架构和主体对等的特点有助于打破物联网现存的多个信息孤岛桎梏,促进信息的横向流动和多方协作。 金融领域 金融的核心是信用的建立和传递,区块链以其不可篡改、安全透明、去中心化或多中心化的特点,天然适用于多种金融场景。 交易清结算 交易清结算的过程也是交易双方分别记账的过程,在传统的交易模式中,记账过程是交易双方分别进行的,不仅要耗费大量人力物力,而且容易出现对账不一致的情况,影响结算效率。 通过区块链系统,交易双方或多方可以共享一套可信、互认的账本,所有的交易清结算记录全部在链可查,安全透明、不可篡改、可追溯,极大提升对账准确度和效率。通过搭载智能合约,还可以实现自动执行的交易清结算,大大降低对账人员成本和差错率,特别是在跨境支付场景下,效果尤其明显。 票据 所谓区块链数字票据,并不是新产生的一种实物票据,也不是单纯的虚拟信息流,它是用区块链技术,结合现有的票据属性、法规和市场,开发出的一种全新的票据展现形式,与现有的电子票据相比在技术架构上完全不同,同时,它既具备电子票据所有功能和优点的基础,又融合进区块链技术的优势,成为一种更安全、更智能、更便捷、更具前景的票据形态。所以,数字票据可以理解为基于区块链技术构造的全新形式的电子票据。实现票据价值传递额去中心化,提升运作效率,改变现有的电子商业汇票系统结构等。 资产证券化ABS 传统的资产证券化需要结算机构、交易所和证券公司等多重协调,通过搭载智能合约的联盟链,可以自动实现跨多主体间的证券产品交易。 基于区块链技术的资产证券化管理系统,能够确保消费金融服务公司底层资产数据的真实性,且不可篡改、可追溯,提高机构投资者信心,从而降低消费金融服务公司发行ABS 的门槛和发行成本,同时还可以进行ABS 全生命周期管理,及时识别和管控风险。 公共服务领域 区块链在公共服务领域的应用主要围绕四个类型开展:身份验证、鉴证确权、信息共享以及透明政府。 区块链技术不仅仅意味着无纸化办公、效率成本优化,还意味着从数据管理流程的优化到治理思维的一系列转变。 区块的重点是创造了一种让我们可以创建信的机制、定义新的规则并且快速实现的自由。 身份验证:无论是身份证、护照信息、驾照、出身证明等公民身份证明都可以存储在区块链账本中。将这些数字身份存储在线,不需要任何物理签名,就可以在线处理繁琐的流程,随时掌握这些文件的使用权限。 鉴证确权:公民财产、数字版权相关的所有权证明存储在区块链账本中,大幅减少权益登记和转让的步骤,减少产权交易过程中的欺诈行为。 信息共享:用于机构内部以及机构之间信息共享,实时同步,减少协同中的摩擦。 透明政府:将政府预算、公共政策信息及竞选投票信息用区块链的方式记录及公开,增加公民对政府的信任。 公益慈善领域 区块链上存储的数据,高可靠且不可篡改,天然适合用在社会公益场景。公益流程中的相关信息,如捐赠项目、募集明细、资金流向、受助人反馈等,均可以存放于区块链上,在满足项目参与者隐私保护及其他相关法律法规要求的前提下,有条件地进行公开公示,方便公众和社会监督,助力社会公益的健康发展。 中机区块链核心架构体系 **设计原则**中机区块链在架构和实现上遵循碎片化、区块化、分布式、标签化等原则。 碎片化:将数据打碎处理,最小数据单元,未来走向量子。 区块化:数据按照价值模型做成了最小组合。 分布式:具有高度的内聚性和透明性。 标签化:对每个数据不同价值维度进行的标识。 技术特点 高性能:多处理器处理运算速度快。数据碎片化,轻量化,标签化数据冗余率低,可高效追踪。 功能强大:支持互联网协议,工业协议等。GURU架构的扩展性强。 高安全性:基于中机50多年的电力、能源、化工、制造等领域的项目实践经验,能够有效实现信息共享,保护信息安全,提升系统效率。 中机区块链实验室共享的技术 专家团队 中机区块链实验室现有国内外专家20余名,已经成为了国内首屈一指、国际领先的区块链技术领域的标志性研究机构。 部分专家介绍: Jasmine--美国 SmartFesto 区块链专家、中机区块链实验室首席专家、《区块链4.0》书(筹)作者、中机科学技术研究院副院长 聂潜--中机人工智能实验室首席专家、中机科学技术研究院院长。 JACK ZHANG--中机机器人设计院院长前IBM高级技术架构师 GURU LEE-- 中机首席科学家,前航天信息技术总监 Mark --中机区块链实验室顾问,信息安全专家,密码学专家 中机区块链整体架构 GURU智能架构是一套自设备信号数据处理到云端数据应用的全方位技术架构,支持常见通讯协议下的信号数据传输、电子数据的采集与转换,可实现在计算机与各种终端上跨平台、多语言的应用系统开发、应用于互联网与常见网络协议下的信息处理与云端计算、构建基于标签化、碎片化、去中心化的各类智能平台,通过动态创建组织与权限分配,实现用户自定义工作流程、工作场景配置,搭建人机互动的社会化智能系统平台。 工业技术架构图 智能管理:智能管理是一套智能化管理系统,负责区块链参与者账户管理,权限管理,秘钥管理,反控审计等。 智能服务:智能服务部署在所有区块链的节点上,用来验证业务请求的有效性,并对有效请求完成共识后记录到存储上。对一个新的业务请求,基础服务先对接口适配解析,鉴权处理,然后通过共识算法将交易或者合约加上签名和加密之后,完整一致的存储到共享账本上。共识机制可自适应,在网络和节点都正常情况下具有高并发性,网络异常或者节点欺骗的情况下具有强容错性。 智能合约:负责合约的注册发行以及合约的触发和执行。用户通过某种编程语言定义合约逻辑,发布到区块链上之后,根据合约条款的逻辑,由用户签名或者其他的事件触发执行,完成交易结算等合约的逻辑。 运营监控:负责产品发布过程中的部署、配置修改、合约设置以及产品运行中的实时状态可视化的输出,如:告警、交易量、网络情况、节点健康状态等。 中机区块链解决方案 中机区块链在自主创新的基础上打造了基于企业级服务的解决方案。主要提供以下四点解决方案: 我们认为企业的竞争不应该是企业之间的竞争,应该是企业内部往一个价值目标去努力的竞争。如何让区块链提高企业内部激励,外部参与,资源整合才是核心。接下来分别以制造业,产业园,产业集团中的解决方案进行简述。 制造业 设计:企业在面对专利纠纷频频发生的问题上,耗费了大量的人力和财力。专利制度的核心是一种“公开”的“独占”。一方面,去中心化的区块链不同于常见的中心化信息存储机构,由众多节点共同维护数据的特点确保了信息的开放性和平等性,为专利造福社会的公开特点加码。另一方面,区块链的不可篡改和不可抵赖性确保了专利的所有权独占,让专利信息的存储更加稳定和安全。针对引发专利纠纷的问题,区块链也能抽薪止沸,从根本上解决专利纠纷的问题。以区块链为核心的技术架构,让原有的机器更智能化,数据可信度更高。 采购:面对企业采购过程中原材料在中途流通出现的的问题,区块链可以提高整个供应链中物料的可视性,可实现追溯查询,最快的找到过程中不合理的环节,并且改善。产品质量好必须解决原材料整个过程的可追溯性。 生产:制造业原有的IT系统工作效率低,耗费大量的人力成本。生产工艺车间流转的过程中,数据可信度不高,引发责任争论。利用区块链技术各个车间数据程序化自动执行,改造原有的IT系统。 经营服务:内部员工绩效考核不在依赖于与EXCEL表格统计,而是用基于区块链“中机实验室智能人平台”指标库中大量的指标,匹配 “交付物”,通过智能合约自动执行。企业客户提供有价值的数据获取代币参与企业的经营。企业可根据数据进行生产,减少库存浪费。 产业集团 产业链集中:产业间的信任都是遵循一定的承诺,很难保证信任。区块链通过共识算法,智能合约并利用TOKEN在区块链上的运转和价值流通解决产业之间的信息交换信任问题,助力产业链集中,减少资源浪费。 供应链:针对供应链中结算交易速度低,运营管理成本高,出货速度等问题的困扰。可用代币解决产业与产业的交易产生的各种问题,提升速度。 营销裂变:把产业园的资源进行整合,通过“发行机制”和 “激励机制”让产业园的内部人员和外部人员参与进来,绑定到一起。营销的行为通过 “智能人”记录和奖励。通过奖励,让内部产生激励,外部提供价值数据,实现产业营销裂变。 产业园 组织变革:“中机区块链实验室”推动企业内部变革,员工老板化,员工可以持有公司股权,股权激励。另外员工创业可以享有企业的品牌,知识产权,技术等成为公司的子公司,公司裂变。 组织社会化变革: 通过区块链技术信任被解决之后,组织社会化的价值体系就发生了转变。就可以共享品牌,知识产权,共享技术,共享资产,共享经营管理模式,共享智能人管理系统。 结语 区块链通过整列一系列的技术,建立一套公正、透明、可信的规则,结合物联网对现实世界数据的采集,以及搭建人工智能算法的自动交易和激励系统,有望在未来形成一套无人值守的价值数据交换和交易体系,将人类社会带向数字化的信任经济时代。 中机区块链实验室借助中机50多年的电力、能源、化工、制造等领域的项目实施经验与其美国Smart Festo公司行业应用案例融合中传云在智能媒体领域的研究成果与领先技术为支撑,实验室在全球范围内聚集了领域内的专家就技术研发、商业应用、产业战略等方面进行研究探讨为创业者提供指引,为行业发展和政策制定提供参考,促进区块链技术服务于社会经济的进步发展。 如果说区块链是构建合作伙伴间信任经济的基石,那么就需要区块链或是联盟链在互联网的广泛部署和规模化应用。但正如前面章节中的介绍,目前区块链技术推广仍存在诸多挑战,中机实验室技术团队总结和建议如下: 1,出台扶持区块链技术和应用发展的政策 借鉴发达国家和地区的先进做法,结合我国区块链技术和应用发展情况,及时出台相关扶持政策,重点支持核心关键技术攻关、行业应用解决方案研发、重大应用示范工程、公共服务平台建设等。同时,放宽市场准入限制,加强事中事后监管,优化服务水平。 2,技术平台的不断完善 鼓励国内重点企业、科研机构、高校等加强合作,进行关键技术的攻关。 3,人才的不断培养 科研教育机构加强对区块链人才的培训。比如:在线区块链课程,线下讲座,高校区块链公开课,培训机构区开设区块链学习课程等。让区块链人才辈出,让区块链技术更好的服务社会。 术语解释 1,智能合约 智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。智能合约概念于1994年由Nick Szabo首次提出。 智能合同的目的是提供优于传统合同方法的安全,并减少与合同相关的其他交易成本。 2,分布式系统 分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。 3,共识机制 共识机制是通过特殊节点的投票,在很短的时间内完成对交易的验证和确认;对一笔交易,如果利益不相干的若干个节点能够达成共识,我们就可以认为全网对此也能够达成共识。 4,标签化 对每个数据不同价值维度进行的标识 5,碎片化 最小数据单元,未来走向量子交付物 6,交付物 完成工作的标志 7,PoS & DPoS Proof Of Stake 权益证明共识算法,PoW的替代方案。根据节点所占权益比重,决定其获得区块记账权的概率,权益越多,越有机会获得区块记账权。DPoS 在PoS 的基础上更近一步,节点将权益委托给其他节点,由其代表自己行使权力。 8,POW Proof Of Work 工作量证明共识算法,在比特币中被首次提出。数字货币矿工们通过随机哈希计算获得当前区块的记账权,从而获得区块奖励。PoW的特点是哈希计算随机,难以弄虚作假,且容易被验证。但另一方面,矿工们间的哈希计算竞争浪费了大量资源。 9,梅可尔树 一般意义上来讲,它是哈希大量聚集数据“块”(chunk)的一种方式,它依赖于将这些数据“块”分裂成较小单位(bucket)的数据块,每一个bucket块仅包含几个数据“块”,然后取每个bucket单位数据块再次进行哈希,重复同样的过程,直至剩余的哈希总数仅变为1:即根哈希(root hash)。 10,拜占庭 拜占庭问题,又叫拜占庭将军问题,英文Byzantine Generals Problem。这个问题由Leslie Lamport与另外两人在1982年提出,是为了解释一致性问题的一个虚拟模型。 11,零成本证明 去中心化,无需第三方参与完成证明。 12,TOKEN Token是一种数字化的价值载体,是权益证明。它有两个关键因素,第一,它是所有人都信任的凭证,不可篡改,可以交易,转让,同时可以销毁,不可逆。第二,它一定要代表价值,并且一定要代表真实的价值。 来自中机区块链实验室
文章
区块链 · 存储 · 算法 · 安全 · 人工智能
2019-08-28
中机区块链白皮书,加快推动区块链在工业领域的创新发展
习书记在刚刚的中央政治局会议指出:区块链技术应用已延伸到数字金融、物联网、智能制造、供应链管理、数字资产交易等多个领域。目前,全球主要国家都在加快布局区块链技术发展。我国在区块链领域拥有良好基础,要加快推动区块链技术和产业创新发展,积极推进区块链和经济社会融合发展。 目录前言... 4 区块链技术概述... 6 区块链有哪些特点... 6 区块链适合解决那些问题... 7 区块链发展面临的挑战... 9 区块链+人工智能... 11 中机区块链主要应用场景... 13 工业领域... 13 供应链领域... 15 物联网领域... 15 金融领域... 16 公共服务领域... 17 公益慈善领域... 18 中机区块链核心架构体系... 18 设计原则... 18 技术特点... 19 中机实验室共享的技术... 19 专家团队... 20 中机区块链整体架构... 20 中机区块链解决方案... 23 制造业... 24 产业集团... 25 产业园... 26 结语... 27 术语解释... 28 前言区块链技术将引领互联网数据存储与交换的巨变,开启信任经济时代。 区块链诞生自中本聪的比特币,自2009年以来,出现了各种各样的类比特币的数字货币。由于人们对数字货币的关注,自去年开始,区块链技术独立于比特币,逐渐进入科技公司和人民群众的视野,引发了广泛关注与大量讨论。 人们发现,区块链的意义在于可以构建一个更加可靠的互联网系统,从根本上解决价值交换与转移中存在的欺诈和寻租现象。越来越多的人相信,随着区块链技术的普及,数字经济将会更加真实可信,经济社会由此变得更加公正和透明。 进一步的研究发现,区块链技术具备一种“降低成本”的强大能力,能简化流程,降低一些不必要的交易成本及制度性成本。这种能力应用于许多社会领域中,对于改善当前低迷的经济环境更有现实意义。 然后区块链的开源平台也暴露出读写性能、模块标准化、应用灵活支持、监管和法律认可、安全和隐私保护等多个亟待改善之处。除此之外,区块链领域的人才稀缺也极大抑制着我们对于这项技术的规模化应用。 在这种背景下,中机区块链实验室的成立对构建金融科技底层的信任网络,推动区块链产业发展落地,培养区块链人才,促进区块链技术研究交流和产业落地都有很大的价值和意义。 中机区块链实验室整合区块链行业专家致力于提供社会级区块链基础设施,提供区块链解决方案,行业解决方案,全生命周日服务,以及安全、可靠、灵活的区块链服务。用区块链+人工智能构建高效的新型商业文明社会。 编写单位:中机区块链实验室 指导单位:中机云科学技术研究院,美国Smart Festo区块链实验室 欢迎各位业界合作伙伴来信交流指正! 2019年10月 区块链技术概述上世纪70 年代以来,随着密码学技术、分布式网络、共识算法以及硬件存储计算能力的飞速发展,通过技术手段实现多主体间共识机制建立的条件日趋成熟,为解决多主体环境下的中介机构信任风险、降低交易成本、提升协同效率提供了全新的解决思路。 区块链是一种由多方共同维护,以块链结构存储数据,使用密码学保证传输和访问安全,能够实现数据一致存储、无法篡改、无法抵赖的技术体系。简单的说区块链技术是一种互联网数据库技术,其特点是去中心化、公开透明,让每个人均可参与数据库记录。 区块链有哪些特点从技术构成的角度来观察区块链有助于我们揭开它的神秘面纱,实事求是地分析区块链,并揭示它的本质特点,理解其价值发挥的内在逻辑。如前所述,区块链并不是一个全新的技术,而是结合了多种现有技术进行的组合式创新,是一种新形式的分布式加密存储系统。 区块链本质上是一种健壮和安全的分布式状态机,典型的技术构成包括共识算法、P2P通讯、密码学、数据库技术和虚拟机。这也构成了区块链必不可少的5 项核心能力: 存储数据——源自数据库技术和硬件存储计算能力的发展,随着时间的累积,区块链的大小也在持续上升,成熟的硬件存储计算能力,使得多主体间同时大量存储相同数据成为可能; 共有数据——源自共识算法,参与区块链的各个主体通过约定的决策机制自动达成共识,共享同一份可信的数据账本;目前典型的共识算法主要有PoW、PoS、PBFT、Raft、Paxos 等。各种共识算法的差异体现在不同阶段采取了不同实现策略。 PoW、PoS 算法在交易扩散和排序时,不采用原子广播协议,同时以随机化的方式选择出leader 节点执行排序,因此会导致交易可能被随机丢弃。Raft、Paxos 算法对全部交易进行原子广播和排序,但在共识的过程并不处理拜占庭错误。PBFT 算法对全部交易进行原子广播和排序,同时在共识阶段处理拜占庭错误,不支持动态调整节点。 分布式——源自P2P 通讯技术,实现各主体间点对点的信息传输; 防篡改与保护隐私——源自密码学运用,通过公钥私钥、哈希算法等密码学工具,确保各主体身份和共有信息的安全; 数字化合约——源自虚拟机技术,将生成的跨主体的数字化智能合约写入区块链系统,通过预设的触发条件,驱动数字合约的执行。 区块链适合解决哪些问题 解决中心化的潜在风险中心化也可能导致互联网不再开放,Facebook 是封闭的系统,微信也是封闭的系统。这些封闭系统制造了信息的孤岛,严重阻碍了信息的流动。用户在这里创造了数据,理论上说用户是拥有它的,但实际上用户拿不到它,甚至没法备份它,只能被企业所用。 随着社会的进步,个人所能创造的价值已经极大的增加,在这样的情况下,中心化体系往往践踏个人的权利,比如垄断企业在不断侵犯消费者权益,比如一些滥用垄断地位绑架消费者的中国互联网企业。 去中心化将给我们一个更自由,更透明,更公平的环境。以去中心化比特币为例,任何人都可以发起一笔交易,任何人也都可以参与验证交易,任何人也都可以同时读取区块链上的所有信息。 降低信任成本回顾历史,人类文明是建立在信任和共识的基础上搭建起合作网络,从而人类成为地球的主宰。 传统金融的合作网络建立在钢筋水泥的大厦上,所以银行都需要盖大楼,让大家相信他们是值得信任的。政治上的信任构建也大体如此,需要大量的成本。 从个人信任进化到制度信任是人类文明的一大进步,制度的产生源于降低交易成本的需求。通过对符合制度规定的行为进行认可与鼓励,对违反制度规定的行为进行惩戒,引导人们将自己的行为控制在一定的范围内,从而达到降低交易成本的目的。 但制度和国家机器等中心节点为我们建立信用的成本偏高,因为需要很多人来维持这个体系。不管哪个时代,需要大量的人来维持的体系成本必然很高。 区块链技术则用代码构建了一个最低成本的信任方式 —— 机器信任,我们不需要相信语言和故事,也不需要有钢筋水泥、中央机构为基础,不需要靠个人领袖背书,只需要知道那些区块链上的代码会执行,也不需要担心制度会被腐败掉,就可以做到互相协作,低成本构建大型合作网络。 机器信任其实是无须信任的信任。人类历史将第一次可以接近零成本建立地球上前所未有的大型合作网络,这必将是一场伟大的群众运动。区块链有望带领我们从个人信任、制度信任进入到机器信任的时代。 区块链发展面临的挑战目前人们已经广泛认识到区块链巨大的应用价值,但是区块链的技术发展却还没有到达成熟阶段,尤其在企业级应用方面,区块链的交易并发能力、数据存储能力、通用性、功能完备性都还存在明显不足。 交易并发能力目前开源的区块链系统的高并发交易能力普遍不高,其中,共识算法是制约性能的重要方面。在区块链中使用的典型共识算法主要有:PoW、PoS、DPoS、PBFT 等,它们的性能对比如下: 制约性能的另一个重要因素是账本结构。目前典型的区块链账本设计为区块的单链结构,意味着从全局来看所有的交易都只能顺序地被处理。由于交易处理缺少并行度,因而难以获得接近于传统中心化系统的性能表现。 数据存储能力在数据存储能力方面,由于区块链的数据只有追加而没有移除,数据只增不减,随着时间推移,区块链系统对数据存储大小的需要也只能持续地增大,在处理企业数据时这一趋势增长更甚。 通用性区块链需要适应多样化的业务需求,满足跨企业的业务链条上的数据共享,这意味着区块链对数据的记录方式要有足够的通用和标准,才能表示各种结构化和非结构化的信息,并能够满足随着业务范围拓展所需的跨链要求。目前市面上的区块链系统大多采用特定的共识算法、加密算法、账户模型、账本模型、存储类型,缺少可插拔能力,无法适应不同场景要求。 功能完备性纵观现有区块链平台,模型抽象单一,难以适应业务系统快速开发的要求。另外,缺少对企业应用中常见的一些功能的支持,例如用户认证、多级授权等。再者,涉及到企业业务协作时,跨企业的事件通知机制显得尤为重要,但少有区块链平台支持。 区块链+人工智能如果说人工智能的改变是生产力—让机器做更多的工作,让人做更少的工作;那么区块链带来的将是生产关系的颠覆。 人工智能影响区块链区块链的作用虽然非常强大,但也存在一定的局限性。有些是因为技术本身,而另一些则来因为金融行业落后的管理思想,但所有这些局限性都可能受到AI的影响. 能源消耗:采矿需要大量的能源和金钱(O’Dwyer,David Malone,2014)。AI已经证明在优化能源消耗上的效率很高,所以我相信类似的技术也可以应用在区块链上,这将减少采矿硬件的投资; 可扩展性: 区块链以每10分钟1MB的速度稳步增长,目前已经增加了85GB。中本聪提出的“交易剪枝”(是一种空间回收技术,也就是,删除不必要的完全化交易数据)是一种可行方案,但是AI可以引入新的分布式学习系统,比如联合学习,通过新的数据分离技术,提高系统效率; 安全性:即使区块链几乎不可能被黑,但其进一步的应用是不安全的。近两年机器学习取得了巨大进步,使AI成为了区块链技术安全上的有力保障,尤其是在系统的固定结构方面; 隐私性: 个人数据的隐私问题已经得到了密切关注(UniCredit,2016)。同态加密技术(直接处理加密数据)、Enigma项目(Zyskind等,2015)或Zerocash项目(Sasson等,2014),是可能的解决方案,但我认为这个问题和前两点紧密相连; 功效: Deloitte(2016)估计,花费在区块链上验证和共享交易数据的总运行成本大约6亿美元一年。智能系统能计算出特定节点优先执行任务的概率,从而能提醒矿工找寻其他路径并降低总的运算成本。此外,尽管存在一些结构性限制,但更好的效率和更低的能量消耗也可以减少网络延迟,加快处理速度; 硬件: 矿工(可能是公司或者个人)把大量的钱投入到挖矿专用的硬件系统中。当系统变得更加高效,一些硬件可能被应用到神经网络中使用(挖矿巨头Bitmain做的正是这个); 数据门: 在未来,我们所有的数据都将在区块链上,公司能从我们这里购买数据,我们需要权限访问数据、跟踪数据的使用,然后加快处理个人事务的速度。 区块链影响人工智能 帮助AI解释AI本身:AI的黑盒问题一直困扰着我们,一个清晰的数据检索方案不仅可以提高数据和模型的可信度,还可以提供一条清晰的路径来追溯机器决策过程; 提高AI的有效性: 安全的数据共享意味着每个人都将拥有更多的数据,然后会获得更好的模型,更好的方案,更好的结果和更好的新数据。 降低市场进入壁垒:一步一步的来谈这个问题。区块链技术可以保护您的数据,那你为什么不私下把所有的数据都存储起来,然后卖掉呢?嗯,你可能会。 人工智能和区块链是促进各行业创新和转型的主要技术,对这一点各行业已达成共识。每种技术都有其自身的技术复杂性和商业价值,但如果将两种技术结合使用,可能是对整个技术(甚至人类)的重新定义。 区块链主要应用场景工业领域3月23日工信部组织召开工业领域区块链应用座谈会,座谈会围绕工业领域区块链应用发展情况、面临的问题和挑战、发展趋势等内容进行了广泛交流。中机区块链实验室接下来将继续深入开展调研,总结应用实践,研究探索区块链在工业领域的应用。研究发现在电力,能源,化工等应用广泛。 电力电力行业偷电偷电现象时常发生,区块链的数据不可篡改性,可以从根源上杜绝这一现象发生,让每一度电都有迹可循。 能源:能源交易的制度性成本高,采用区块链技术将极大的改变能源系统生产,交易模式。交易主体可以越过庞大的电网系统,点对点实现能源产品的生产,交易,能源基础设施共享。 化工对化工行业,中机区块链技术使用共享数据库,可以自动实时更新,并可借助计算机算法在短短几分钟之内处理交易并结算,无需第三方验证。交易的安全性和效率都得到了显著提升。 中机区块链实验室研发团队,花费2年多的时间,提供了区块链+工业落地方案。 基于区块链智能化车间方案图 工业智能通信协议供应链领域 区块链技术有助于提升供应链管理效率。更透明地跟踪所有类型的交易,想象它在整个供应链中呈现的可能性。每当产品易手时,交易都可以被记录下来,从制造到销售创建产品的永久历史。这可以大大减少时间延迟,成本增加以及困扰今天交易的人为错误。 所具有的数据不可篡改和时间戳的存在性证明的特质能很好地运用于解决供应链体系内各参与主体之间的纠纷,实现轻松举证与追责。区块链技术可以用于产品防伪。数据不可篡改与交易可追溯两大特性相结合,可根除供应链内产品流转过程中的假冒伪劣问题。 物联网领域 目前的物联网生态体系,依赖中心化的网络管理架构,所有的设备都是通过云服务器连接。随着网络规模的扩大,中心化云服务器、大型服务器和网络设备的基础设施和维护方面将占用高昂成本。在去中心化的物联网愿景中,区块链是发生互动的设备间促进交易处理和协作的框架,网络上的每个设备都可以作为一个独立、微型的商业主体运行。 区块链凭借主体对等、公开透明、安全通信、难以篡改和多方共识等特性,对物联网将产生重要的影响:多中心、弱中心化的特质将降低中心化架构的高额运维成本,信息加密、安全通信的特质将有助于保护隐私,身份权限管理和多方共识有助于识别非法节点,及时阻止恶意节点的接入和作恶,依托链式的结构有助于构建可证可溯的电子证据存证,分布式架构和主体对等的特点有助于打破物联网现存的多个信息孤岛桎梏,促进信息的横向流动和多方协作。 金融领域 金融的核心是信用的建立和传递,区块链以其不可篡改、安全透明、去中心化或多中心化的特点,天然适用于多种金融场景。 交易清结算 交易清结算的过程也是交易双方分别记账的过程,在传统的交易模式中,记账过程是交易双方分别进行的,不仅要耗费大量人力物力,而且容易出现对账不一致的情况,影响结算效率。 通过区块链系统,交易双方或多方可以共享一套可信、互认的账本,所有的交易清结算记录全部在链可查,安全透明、不可篡改、可追溯,极大提升对账准确度和效率。通过搭载智能合约,还可以实现自动执行的交易清结算,大大降低对账人员成本和差错率,特别是在跨境支付场景下,效果尤其明显。 票据 所谓区块链数字票据,并不是新产生的一种实物票据,也不是单纯的虚拟信息流,它是用区块链技术,结合现有的票据属性、法规和市场,开发出的一种全新的票据展现形式,与现有的电子票据相比在技术架构上完全不同,同时,它既具备电子票据所有功能和优点的基础,又融合进区块链技术的优势,成为一种更安全、更智能、更便捷、更具前景的票据形态。所以,数字票据可以理解为基于区块链技术构造的全新形式的电子票据。实现票据价值传递额去中心化,提升运作效率,改变现有的电子商业汇票系统结构等。 资产证券化ABS 传统的资产证券化需要结算机构、交易所和证券公司等多重协调,通过搭载智能合约的联盟链,可以自动实现跨多主体间的证券产品交易。 基于区块链技术的资产证券化管理系统,能够确保消费金融服务公司底层资产数据的真实性,且不可篡改、可追溯,提高机构投资者信心,从而降低消费金融服务公司发行ABS 的门槛和发行成本,同时还可以进行ABS 全生命周期管理,及时识别和管控风险。 公共服务领域 区块链在公共服务领域的应用主要围绕四个类型开展:身份验证、鉴证确权、信息共享以及透明政府。 区块链技术不仅仅意味着无纸化办公、效率成本优化,还意味着从数据管理流程的优化到治理思维的一系列转变。 区块的重点是创造了一种让我们可以创建信的机制、定义新的规则并且快速实现的自由。 身份验证:无论是身份证、护照信息、驾照、出身证明等公民身份证明都可以存储在区块链账本中。将这些数字身份存储在线,不需要任何物理签名,就可以在线处理繁琐的流程,随时掌握这些文件的使用权限。 鉴证确权:公民财产、数字版权相关的所有权证明存储在区块链账本中,大幅减少权益登记和转让的步骤,减少产权交易过程中的欺诈行为。 信息共享:用于机构内部以及机构之间信息共享,实时同步,减少协同中的摩擦。 透明政府:将政府预算、公共政策信息及竞选投票信息用区块链的方式记录及公开,增加公民对政府的信任。 公益慈善领域 区块链上存储的数据,高可靠且不可篡改,天然适合用在社会公益场景。公益流程中的相关信息,如捐赠项目、募集明细、资金流向、受助人反馈等,均可以存放于区块链上,在满足项目参与者隐私保护及其他相关法律法规要求的前提下,有条件地进行公开公示,方便公众和社会监督,助力社会公益的健康发展。 中机区块链核心架构体系设计原则中机区块链在架构和实现上遵循碎片化、区块化、分布式、标签化等原则。 碎片化:将数据打碎处理,最小数据单元,未来走向量子。 区块化:数据按照价值模型做成了最小组合。 分布式:具有高度的内聚性和透明性。 标签化:对每个数据不同价值维度进行的标识。 技术特点 高性能:多处理器处理运算速度快。数据碎片化,轻量化,标签化数据冗余率低,可高效追踪。 功能强大:支持互联网协议,工业协议等。GURU架构的扩展性强。 高安全性:基于中机50多年的电力、能源、化工、制造等领域的项目实践经验,能够有效实现信息共享,保护信息安全,提升系统效率。 中机区块链实验室共享的技术 专家团队 中机区块链实验室现有国内外专家20余名,已经成为了国内首屈一指、国际领先的区块链技术领域的标志性研究机构。 部分专家介绍: Jasmine--美国 SmartFesto 区块链专家、中机区块链实验室首席专家、《区块链4.0》书(筹)作者、中机科学技术研究院副院长 聂潜--中机人工智能实验室首席专家、中机科学技术研究院院长。 JACK ZHANG--中机机器人设计院院长前IBM高级技术架构师 GURU LEE-- 中机首席科学家,前航天信息技术总监 Mark --中机区块链实验室顾问,信息安全专家,密码学专家 中机区块链整体技术架构GURU智能架构是一套自设备信号数据处理到云端数据应用的全方位技术架构,支持常见通讯协议下的信号数据传输、电子数据的采集与转换,可实现在计算机与各种终端上跨平台、多语言的应用系统开发、应用于互联网与常见网络协议下的信息处理与云端计算、构建基于标签化、碎片化、去中心化的各类智能平台,通过动态创建组织与权限分配,实现用户自定义工作流程、工作场景配置,搭建人机互动的社会化智能系统平台。 工业技术架构图智能管理:智能管理是一套智能化管理系统,负责区块链参与者账户管理,权限管理,秘钥管理,反控审计等。 智能服务:智能服务部署在所有区块链的节点上,用来验证业务请求的有效性,并对有效请求完成共识后记录到存储上。对一个新的业务请求,基础服务先对接口适配解析,鉴权处理,然后通过共识算法将交易或者合约加上签名和加密之后,完整一致的存储到共享账本上。共识机制可自适应,在网络和节点都正常情况下具有高并发性,网络异常或者节点欺骗的情况下具有强容错性。 智能合约:负责合约的注册发行以及合约的触发和执行。用户通过某种编程语言定义合约逻辑,发布到区块链上之后,根据合约条款的逻辑,由用户签名或者其他的事件触发执行,完成交易结算等合约的逻辑。 运营监控:负责产品发布过程中的部署、配置修改、合约设置以及产品运行中的实时状态可视化的输出,如:告警、交易量、网络情况、节点健康状态等。 区块链工业化应用解决方案中机区块链在自主创新的基础上打造了基于企业级服务的解决方案。主要提供以下四点解决方案: 我们认为企业的竞争不应该是企业之间的竞争,应该是企业内部往一个价值目标去努力的竞争。如何让区块链提高企业内部激励,外部参与,资源整合才是核心。接下来分别以制造业,产业园,产业集团中的解决方案进行简述。 制造业 设计:企业在面对专利纠纷频频发生的问题上,耗费了大量的人力和财力。专利制度的核心是一种“公开”的“独占”。一方面,去中心化的区块链不同于常见的中心化信息存储机构,由众多节点共同维护数据的特点确保了信息的开放性和平等性,为专利造福社会的公开特点加码。另一方面,区块链的不可篡改和不可抵赖性确保了专利的所有权独占,让专利信息的存储更加稳定和安全。针对引发专利纠纷的问题,区块链也能抽薪止沸,从根本上解决专利纠纷的问题。以区块链为核心的技术架构,让原有的机器更智能化,数据可信度更高。 采购: 面对企业采购过程中原材料在中途流通出现的的问题,区块链可以提高整个供应链中物料的可视性,可实现追溯查询,最快的找到过程中不合理的环节,并且改善。产品质量好必须解决原材料整个过程的可追溯性。 生产:制造业原有的IT系统工作效率低,耗费大量的人力成本。生产工艺车间流转的过程中,数据可信度不高,引发责任争论。利用区块链技术各个车间数据程序化自动执行,改造原有的IT系统。 经营服务:内部员工绩效考核不在依赖于与EXCEL表格统计,而是用基于区块链“中机实验室智能人平台”指标库中大量的指标,匹配 “交付物”,通过智能合约自动执行。企业客户提供有价值的数据获取代币参与企业的经营。企业可根据数据进行生产,减少库存浪费。 产业集团 产业链集中:产业间的信任都是遵循一定的承诺,很难保证信任。区块链通过共识算法,智能合约并利用TOKEN在区块链上的运转和价值流通解决产业之间的信息交换信任问题,助力产业链集中,减少资源浪费。 供应链:针对供应链中结算交易速度低,运营管理成本高,出货速度等问题的困扰。可用代币解决产业与产业的交易产生的各种问题,提升速度。 营销裂变:把产业园的资源进行整合,通过“发行机制”和 “激励机制”让产业园的内部人员和外部人员参与进来,绑定到一起。营销的行为通过 “智能人”记录和奖励。通过奖励,让内部产生激励,外部提供价值数据,实现产业营销裂变。 产业园 组织变革:“中机区块链实验室”推动企业内部变革,员工老板化,员工可以持有公司股权,股权激励。另外员工创业可以享有企业的品牌,知识产权,技术等成为公司的子公司,公司裂变。 组织社会化变革:通过区块链技术信任被解决之后,组织社会化的价值体系就发生了转变。就可以共享品牌,知识产权,共享技术,共享资产,共享经营管理模式,共享智能人管理系统。 结语区块链通过整列一系列的技术,建立一套公正、透明、可信的规则,结合物联网对现实世界数据的采集,以及搭建人工智能算法的自动交易和激励系统,有望在未来形成一套无人值守的价值数据交换和交易体系,将人类社会带向数字化的信任经济时代。 中机区块链实验室借助中机50多年的电力、能源、化工、制造等领域的项目实施经验与其美国Smart Festo公司行业应用案例融合中传云在智能媒体领域的研究成果与领先技术为支撑,实验室在全球范围内聚集了领域内的专家就技术研发、商业应用、产业战略等方面进行研究探讨为创业者提供指引,为行业发展和政策制定提供参考,促进区块链技术服务于社会经济的进步发展。 如果说区块链是构建合作伙伴间信任经济的基石,那么就需要区块链或是联盟链在互联网的广泛部署和规模化应用。但正如前面章节中的介绍,目前区块链技术推广仍存在诸多挑战,中机实验室技术团队总结和建议如下: 1,出台扶持区块链技术和应用发展的政策 借鉴发达国家和地区的先进做法,结合我国区块链技术和应用发展情况,及时出台相关扶持政策,重点支持核心关键技术攻关、行业应用解决方案研发、重大应用示范工程、公共服务平台建设等。同时,放宽市场准入限制,加强事中事后监管,优化服务水平。 2,技术平台的不断完善 鼓励国内重点企业、科研机构、高校等加强合作,进行关键技术的攻关。 3,人才的不断培养 科研教育机构加强对区块链人才的培训。比如:在线区块链课程,线下讲座,高校区块链公开课,培训机构区开设区块链学习课程等。让区块链人才辈出,让区块链技术更好的服务社会。 术语解释1,智能合约 智能合约是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易。这些交易可追踪且不可逆转。智能合约概念于1994年由Nick Szabo首次提出。 智能合同的目的是提供优于传统合同方法的安全,并减少与合同相关的其他交易成本。 2,分布式系统 分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。 3,共识机制 共识机制是通过特殊节点的投票,在很短的时间内完成对交易的验证和确认;对一笔交易,如果利益不相干的若干个节点能够达成共识,我们就可以认为全网对此也能够达成共识。 4,标签化 对每个数据不同价值维度进行的标识 5,碎片化 最小数据单元,未来走向量子交付物 6,交付物 完成工作的标志 7,PoS & DPoS Proof Of Stake 权益证明共识算法,PoW的替代方案。根据节点所占权益比重,决定其获得区块记账权的概率,权益越多,越有机会获得区块记账权。DPoS 在PoS 的基础上更近一步,节点将权益委托给其他节点,由其代表自己行使权力。 8,POW Proof Of Work 工作量证明共识算法,在比特币中被首次提出。数字货币矿工们通过随机哈希计算获得当前区块的记账权,从而获得区块奖励。PoW的特点是哈希计算随机,难以弄虚作假,且容易被验证。但另一方面,矿工们间的哈希计算竞争浪费了大量资源。 9,梅可尔树 一般意义上来讲,它是哈希大量聚集数据“块”(chunk)的一种方式,它依赖于将这些数据“块”分裂成较小单位(bucket)的数据块,每一个bucket块仅包含几个数据“块”,然后取每个bucket单位数据块再次进行哈希,重复同样的过程,直至剩余的哈希总数仅变为1:即根哈希(root hash)。 10,拜占庭 拜占庭问题,又叫拜占庭将军问题,英文Byzantine Generals Problem。这个问题由Leslie Lamport与另外两人在1982年提出,是为了解释一致性问题的一个虚拟模型。 11,零成本证明 去中心化,无需第三方参与完成证明。 12,TOKEN Token是一种数字化的价值载体,是权益证明。它有两个关键因素,第一,它是所有人都信任的凭证,不可篡改,可以交易,转让,同时可以销毁,不可逆。第二,它一定要代表价值,并且一定要代表真实的价值。 专家 nq1919
文章
区块链 · 存储 · 算法 · 安全 · 人工智能
2019-10-26
Redis经典面试题总结
概述 什么是Redis? Redis 是一个使用 C 语言写成的,开源的高性能key-value非关系缓存数据库。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。Redis的数据都基于缓存的,所以很快,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。Redis也可以实现数据写入磁盘中,保证了数据的安全不丢失,而且Redis的操作是原子性的。 Redis有哪些优缺点? 优点 读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。 支持数据持久化,支持AOF和RDB两种持久化方式。 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。 数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。 缺点 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。 Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。 Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。 使用redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都很低 (2)支持丰富数据类型,支持string,list,set,sorted set,hash (3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 (4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除 为什么要用 Redis / 为什么要用缓存 主要从“高性能”和“高并发”这两点来看待这个问题。 高性能: 假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可! 高并发: 直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。 为什么要用 Redis 而不用 map/guava 做缓存? 缓存分为本地缓存和分布式缓存。以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。 使用 redis 或 memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持 redis 或 memcached服务的高可用,整个程序架构上较为复杂。 Redis为什么这么快 1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是O(1); 2、数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的; 3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗; 4、使用多路 I/O 复用模型,非阻塞 IO; 5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求; Redis有哪些数据类型 Redis主要有5种数据类型,包括String,List,Set,Zset,Hash,满足大部分的使用要求 数据类型 可以存储的值 操作 应用场景 String 字符串、整数或者浮点数 对整个字符串或者字符串的其中一部分执行操作 对整数和浮点数执行自增或者自减操作 做简单的键值对缓存 List 列表 从两端压入或者弹出元素 对单个或者多个元素进行修剪, 只保留一个范围内的元素 存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的数据 Set 无序集合 添加、获取、移除单个元素 检查一个元素是否存在于集合中 计算交集、并集、差集 从集合里面随机获取元素 交集、并集、差集的操作,比如交集,可以把两个人的粉丝列表整一个交集 Hash 包含键值对的无序散列表 添加、获取、移除单个键值对 获取所有键值对 检查某个键是否存在 结构化的数据,比如一个对象 ZSet 有序集合 添加、获取、删除元素 根据分值范围或者成员来获取元素 计算一个键的排名 去重但可以排序,如获取排名前几名的用户 Redis的应用场景 计数器 可以对 String 进行自增自减运算,从而实现计数器功能。Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。 缓存 将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。 会话缓存 可以使用 Redis 来统一存储多台应用服务器的会话信息。当应用服务器不再存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一个应用服务器,从而更容易实现高可用性以及可伸缩性。 全页缓存(FPC) 除基本的会话token之外,Redis还提供很简便的FPC平台。以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。 查找表 例如 DNS 记录就很适合使用 Redis 进行存储。查找表和缓存类似,也是利用了 Redis 快速的查找特性。但是查找表的内容不能失效,而缓存的内容可以失效,因为缓存不作为可靠的数据来源。 消息队列(发布/订阅功能) List 是一个双向链表,可以通过 lpush 和 rpop 写入和读取消息。不过最好使用 Kafka、RabbitMQ 等消息中间件。 分布式锁实现 在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。可以使用 Redis 自带的 SETNX 命令实现分布式锁,除此之外,还可以使用官方提供的 RedLock 分布式锁实现。 其它 Set 可以实现交集、并集等操作,从而实现共同好友等功能。ZSet 可以实现有序性操作,从而实现排行榜等功能。 持久化 什么是Redis持久化? 持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。 Redis 的持久化机制是什么?各自的优缺点? Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制: RDB:是Redis DataBase缩写快照 RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。 优点: 1、只有一个文件 dump.rdb,方便持久化。 2、容灾性好,一个文件可以保存到安全的磁盘。 3、性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能 4.相对于数据集大时,比 AOF 的启动效率更高。 缺点: 1、数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候) 2、AOF(Append-only file)持久化方式: 是指所有的命令行记录以 redis 命令请 求协议的格式完全持久化存储)保存为 aof 文件。 AOF:持久化: AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。 当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复 优点: 1、数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次。 2、通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。 3、AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall)) 缺点: 1、AOF 文件比 RDB 文件大,且恢复速度慢。 2、数据集大的时候,比 rdb 启动效率低。 俩种持久化的优缺点是什么? AOF文件比RDB更新频率高,优先使用AOF还原数据。 AOF比RDB更安全也更大 RDB性能比AOF好 如果两个都配了优先加载AOF 如何选择合适的持久化方式 一般来说, 如果想达到足以媲美PostgreSQL的数据安全性,你应该同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。 如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。 有很多用户都只使用AOF持久化,但并不推荐这种方式,因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此之外,使用RDB还可以避免AOF程序的bug。 如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。 Redis持久化数据和缓存怎么做扩容? 如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。 如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。 Redis的过期键的删除策略 我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。 过期策略通常有以下三种: 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。 (expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。) Redis中同时使用了惰性过期和定期过期两种过期策略。 Redis key的过期时间和永久有效分别怎么设置? expire和persist命令。 我们知道通过expire来设置key 的过期时间,那么对过期的数据怎么处理呢? 除了缓存服务器自带的缓存失效策略之外(Redis默认的有6中策略可供选择),我们还可以根据具体的业务需求进行自定义的缓存淘汰,常见的策略有两种: 1、定时去清理过期的缓存; 2、当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。 两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,大家可以根据自己的应用场景来权衡。 MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据 redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。 Redis的内存淘汰策略有哪些 Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。 全局的键空间选择性移除 noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。 allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用的) allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。 设置过期时间的键空间选择性移除 volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。 volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。 volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。 总结 Redis的内存淘汰策略的选取并不会影响过期的key的处理。内存淘汰策略用于处理内存不足时的需要申请额外空间的数据;过期策略用于处理过期的缓存数据。 Redis主要消耗什么物理资源? 内存。 Redis的内存用完了会发生什么? 如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)或者你可以配置内存淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。 Redis如何做内存优化? 可以好好利用Hash,list,sorted set,set等集合类型数据,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起。尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面 线程模型 Redis线程模型 Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器(file event handler)。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。 文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字, 并根据套接字目前执行的任务来为套接字关联不同的事件处理器。 当被监听的套接字准备好执行连接应答(accept)、读取(read)、写入(write)、关闭(close)等操作时, 与操作相对应的文件事件就会产生, 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件。 虽然文件事件处理器以单线程方式运行, 但通过使用 I/O 多路复用程序来监听多个套接字, 文件事件处理器既实现了高性能的网络通信模型, 又可以很好地与 redis 服务器中其他同样以单线程方式运行的模块进行对接, 这保持了 Redis 内部单线程设计的简单性。 事务 什么是事务? 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。 Redis事务的概念 Redis 事务的本质是通过MULTI、EXEC、WATCH等一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。 总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。 Redis事务的三个阶段 事务开始 MULTI 命令入队 事务执行 EXEC 事务执行过程中,如果服务端收到有EXEC、DISCARD、WATCH、MULTI之外的请求,将会把请求放入队列中排队 Redis事务相关命令 Redis事务功能是通过MULTI、EXEC、DISCARD和WATCH 四个原语实现的 Redis会将一个事务中的所有命令序列化,然后按顺序执行。 redis 不支持回滚,“Redis 在事务失败时不进行回滚,而是继续执行余下的命令”, 所以 Redis 的内部可以保持简单且快速。 如果在一个事务中的命令出现错误,那么所有的命令都不会执行; 如果在一个事务中出现运行错误,那么正确的命令会被执行。 WATCH 命令是一个乐观锁,可以为 Redis 事务提供 check-and-set (CAS)行为。 可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC命令。 MULTI命令用于开启一个事务,它总是返回OK。 MULTI执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中,当EXEC命令被调用时,所有队列中的命令才会被执行。 EXEC:执行所有事务块内的命令。返回事务块内所有命令的返回值,按命令执行的先后顺序排列。 当操作被打断时,返回空值 nil 。 通过调用DISCARD,客户端可以清空事务队列,并放弃执行事务, 并且客户端会从事务状态中退出。 UNWATCH命令可以取消watch对所有key的监控。 事务管理(ACID)概述 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 一致性(Consistency) 事务前后数据的完整性必须保持一致。 隔离性(Isolation) 多个事务并发执行时,一个事务的执行不应影响其他事务的执行 持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响 Redis的事务总是具有ACID中的一致性和隔离性,其他特性是不支持的。当服务器运行在_AOF_持久化模式下,并且appendfsync选项的值为always时,事务也具有耐久性。 Redis事务支持隔离性吗 Redis 是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完所有事务队列中的命令为止。因此,Redis 的事务是总是带有隔离性的。 Redis事务保证原子性吗,支持回滚吗 Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。 Redis事务其他实现 基于Lua脚本,Redis可以保证脚本内的命令一次性、按顺序地执行, 其同时也不提供事务运行错误的回滚,执行过程中如果部分命令运行错误,剩下的命令还是会继续运行完 基于中间标记变量,通过另外的标记变量来标识事务是否执行完成,读取数据时先读取该标记变量判断是否事务执行完成。但这样会需要额外写代码实现,比较繁琐 集群方案 1、哨兵模式 哨兵的介绍 sentinel,中文名是哨兵。哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis master 和 slave 进程是否正常工作。 消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。 哨兵用于实现 redis 集群的高可用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作。 故障转移时,判断一个 master node 是否宕机了,需要大部分的哨兵都同意才行,涉及到了分布式选举的问题。 即使部分哨兵节点挂掉了,哨兵集群还是能正常工作的,因为如果一个作为高可用机制重要组成部分的故障转移系统本身是单点的,那就很坑爹了。 哨兵的核心知识 哨兵至少需要 3 个实例,来保证自己的健壮性。 哨兵 + redis 主从的部署架构,是不保证数据零丢失的,只能保证 redis 集群的高可用性。 对于哨兵 + redis 主从这种复杂的部署架构,尽量在测试环境和生产环境,都进行充足的测试和演练。 2、官方Redis Cluster 方案(服务端路由查询) redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗? 简介 Redis Cluster是一种服务端Sharding技术,3.0版本开始正式提供。Redis Cluster并没有使用一致性hash,而是采用slot(槽)的概念,一共分成16384个槽。将请求发送到任意节点,接收到请求的节点会将查询请求发送到正确的节点上执行 方案说明 通过哈希的方式,将数据分片,每个节点均分存储一定哈希槽(哈希值)区间的数据,默认分配了16384 个槽位 每份数据分片会存储在多个互为主从的多节点上 数据写入先写主节点,再同步到从节点(支持配置为阻塞同步) 同一分片多个节点间的数据不保持一致性 读取数据时,当客户端操作的key没有分配在该节点上时,redis会返回转向指令,指向正确的节点 扩容时时需要需要把旧节点的数据迁移一部分到新节点 在 redis cluster 架构下,每个 redis 要放开两个端口号,比如一个是 6379,另外一个就是 加1w 的端口号,比如 16379。 16379 端口号是用来进行节点间通信的,也就是 cluster bus 的东西,cluster bus 的通信,用来进行故障检测、配置更新、故障转移授权。cluster bus 用了另外一种二进制的协议,gossip 协议,用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间。 节点间的内部通信机制 基本通信原理 集群元数据的维护有两种方式:集中式、Gossip 协议。redis cluster 节点间采用 gossip 协议进行通信。 分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡) redis cluster 的 hash slot 算法 优点 无中心架构,支持动态扩容,对业务透明 具备Sentinel的监控和自动Failover(故障转移)能力 客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可 高性能,客户端直连redis服务,免去了proxy代理的损耗 缺点 运维也很复杂,数据迁移需要人工干预 只能使用0号数据库 不支持批量操作(pipeline管道操作) 分布式逻辑和存储模块耦合等 3、基于客户端分配 简介 Redis Sharding是Redis Cluster出来之前,业界普遍使用的多Redis实例集群方法。其主要思想是采用哈希算法将Redis数据的key进行散列,通过hash函数,特定的key会映射到特定的Redis节点上。Java redis客户端驱动jedis,支持Redis Sharding功能,即ShardedJedis以及结合缓存池的ShardedJedisPool 优点 优势在于非常简单,服务端的Redis实例彼此独立,相互无关联,每个Redis实例像单服务器一样运行,非常容易线性扩展,系统的灵活性很强 缺点 由于sharding处理放到客户端,规模进一步扩大时给运维带来挑战。 客户端sharding不支持动态增删节点。服务端Redis实例群拓扑结构有变化时,每个客户端都需要更新调整。连接不能共享,当应用规模增大时,资源浪费制约优化 4、基于代理服务器分片 简介 客户端发送请求到一个代理组件,代理解析客户端的数据,并将请求转发至正确的节点,最后将结果回复给客户端 特征 透明接入,业务程序不用关心后端Redis实例,切换成本低 Proxy 的逻辑和存储的逻辑是隔离的 代理层多了一次转发,性能有所损耗 业界开源方案 Twtter开源的Twemproxy 豌豆荚开源的Codis 5、Redis 主从架构 单机的 redis,能够承载的 QPS 大概就在上万到几万不等。对于缓存来说,一般都是用来支撑读高并发的。因此架构做成主从(master-slave)架构,一主多从,主负责写,并且将数据复制到其它的 slave 节点,从节点负责读。所有的读请求全部走从节点。这样也可以很轻松实现水平扩容,支撑读高并发。 redis replication -> 主从架构 -> 读写分离 -> 水平扩容支撑读高并发 redis replication 的核心机制 redis 采用异步方式复制数据到 slave 节点,不过 redis2.8 开始,slave node 会周期性地确认自己每次复制的数据量; 一个 master node 是可以配置多个 slave node 的; slave node 也可以连接其他的 slave node; slave node 做复制的时候,不会 block master node 的正常工作; slave node 在做复制的时候,也不会 block 对自己的查询操作,它会用旧的数据集来提供服务;但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了; slave node 主要用来进行横向扩容,做读写分离,扩容的 slave node 可以提高读的吞吐量。 注意: 如果采用了主从架构,那么建议必须开启 master node 的持久化,不建议用 slave node 作为 master node 的数据热备,因为那样的话,如果你关掉 master 的持久化,可能在 master 宕机重启的时候数据是空的,然后可能一经过复制, slave node 的数据也丢了。 另外,master 的各种备份方案,也需要做。万一本地的所有文件丢失了,从备份中挑选一份 rdb 去恢复 master,这样才能确保启动的时候,是有数据的,即使采用了后续讲解的高可用机制,slave node 可以自动接管 master node,但也可能 sentinel 还没检测到 master failure,master node 就自动重启了,还是可能导致上面所有的 slave node 数据被清空。 redis 主从复制的核心原理 当启动一个 slave node 的时候,它会发送一个 PSYNC 命令给 master node。 如果这是 slave node 初次连接到 master node,那么会触发一次 full resynchronization 全量复制。此时 master 会启动一个后台线程,开始生成一份 RDB 快照文件, 同时还会将从客户端 client 新收到的所有写命令缓存在内存中。RDB 文件生成完毕后, master 会将这个 RDB 发送给 slave,slave 会先写入本地磁盘,然后再从本地磁盘加载到内存中, 接着 master 会将内存中缓存的写命令发送到 slave,slave 也会同步这些数据。 slave node 如果跟 master node 有网络故障,断开了连接,会自动重连,连接之后 master node 仅会复制给 slave 部分缺少的数据。 过程原理 当从库和主库建立MS关系后,会向主数据库发送SYNC命令 主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来 当快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis 从Redis接收到后,会载入快照文件并且执行收到的缓存的命令 之后,主Redis每当接收到写命令时就会将命令发送从Redis,从而保证数据的一致 缺点 所有的slave节点数据的复制和同步都由master节点来处理,会照成master节点压力太大,使用主从从结构来解决 Redis集群的主从复制模型是怎样的? 为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品 生产环境中的 redis 是怎么部署的? redis cluster,10 台机器,5 台机器部署了 redis 主实例,另外 5 台机器部署了 redis 的从实例,每个主实例挂了一个从实例,5 个节点对外提供读写服务,每个节点的读写高峰qps可能可以达到每秒 5 万,5 台机器最多是 25 万读写请求/s。 机器是什么配置?32G 内存+ 8 核 CPU + 1T 磁盘,但是分配给 redis 进程的是10g内存,一般线上生产环境,redis 的内存尽量不要超过 10g,超过 10g 可能会有问题。 5 台机器对外提供读写,一共有 50g 内存。 因为每个主实例都挂了一个从实例,所以是高可用的,任何一个主实例宕机,都会自动故障迁移,redis 从实例会自动变成主实例继续提供读写服务。 你往内存里写的是什么数据?每条数据的大小是多少?商品数据,每条数据是 10kb。100 条数据是 1mb,10 万条数据是 1g。常驻内存的是 200 万条商品数据,占用内存是 20g,仅仅不到总内存的 50%。目前高峰期每秒就是 3500 左右的请求量。 其实大型的公司,会有基础架构的 team 负责缓存集群的运维。 说说Redis哈希槽的概念? Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。 Redis集群会有写操作丢失吗?为什么? Redis并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。 Redis集群之间是如何复制的? 异步复制 Redis集群最大节点个数是多少? 16384个 Redis集群如何选择数据库? Redis集群目前无法做数据库选择,默认在0数据库。 分区 Redis是单线程的,如何提高多核CPU的利用率? 可以在同一个服务器部署多个Redis的实例,并把他们当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的, 所以,如果你想使用多个CPU,你可以考虑一下分片(shard)。 为什么要做Redis分区? 分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。如果没有分区,你最多只能使用一台机器的内存。分区使Redis的计算能力通过简单地增加计算机得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。 你知道有哪些Redis分区实现方案? 客户端分区就是在客户端就已经决定数据会被存储到哪个redis节点或者从哪个redis节点读取。大多数客户端已经实现了客户端分区。 代理分区 意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分区规则决定请求哪些Redis实例,然后根据Redis的响应结果返回给客户端。redis和memcached的一种代理实现就是Twemproxy 查询路由(Query routing) 的意思是客户端随机地请求任意一个redis实例,然后由Redis将请求转发给正确的Redis节点。Redis Cluster实现了一种混合形式的查询路由,但并不是直接将请求从一个redis节点转发到另一个redis节点,而是在客户端的帮助下直接redirected到正确的redis节点。 Redis分区有什么缺点? 涉及多个key的操作通常不会被支持。例如你不能对两个集合求交集,因为他们可能被存储到不同的Redis实例(实际上这种情况也有办法,但是不能直接使用交集指令)。 同时操作多个key,则不能使用Redis事务. 分区使用的粒度是key,不能使用一个非常长的排序key存储一个数据集(The partitioning granularity is the key, so it is not possible to shard a dataset with a single huge key like a very big sorted set) 当使用分区的时候,数据处理会非常复杂,例如为了备份你必须从不同的Redis实例和主机同时收集RDB / AOF文件。 分区时动态扩容或缩容可能非常复杂。Redis集群在运行时增加或者删除Redis节点,能做到最大程度对用户透明地数据再平衡,但其他一些客户端分区或者代理分区方法则不支持这种特性。然而,有一种预分片的技术也可以较好的解决这个问题。 分布式问题 Redis实现分布式锁 Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系Redis中可以使用setNx命令实现分布式锁。 当且仅当 key 不存在,将 key 的值设为 value。 若给定的 key 已经存在,则 setNx不做任何动作 SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。 返回值:设置成功,返回 1 。设置失败,返回 0 。 使用setNx完成同步锁的流程及事项如下: 使用SETNX命令获取锁,若返回0(key已存在,锁已存在)则获取失败,反之获取成功 为了防止获取锁后程序出现异常,导致其他线程/进程调用setNx命令总是返回0而进入死锁状态,需要为该key设置一个“合理”的过期时间释放锁,使用DEL命令将锁数据删除 如何解决 Redis 的并发竞争 Key 问题 所谓 Redis 的并发竞争 Key 的问题也就是多个系统同时对一个 key 进行操作,但是最后执行的顺序和我们期望的顺序不同,这样也就导致了结果的不同! 推荐一种方案:分布式锁(zookeeper 和 redis 都可以实现分布式锁)。(如果不存在 Redis 的并发竞争 Key 问题,不要使用分布式锁,这样会影响性能) 基于zookeeper临时有序节点可以实现的分布式锁。大致思想为:每个客户端对某个方法加锁时,在zookeeper上的与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点。 判断是否获取锁的方式很简单,只需要判断有序节点中序号最小的一个。 当释放锁的时候,只需将这个瞬时节点删除即可。同时,其可以避免服务宕机导致的锁无法释放,而产生的死锁问题。完成业务流程后,删除对应的子节点释放锁。 在实践中,当然是从以可靠性为主。所以首推Zookeeper。 分布式Redis是前期做还是后期规模上来了再做好?为什么? 既然Redis是如此的轻量(单实例只使用1M内存),为防止以后的扩容,最好的办法就是一开始就启动较多实例。即便你只有一台服务器,你也可以一开始就让Redis以分布式的方式运行,使用分区,在同一台服务器上启动多个实例。 一开始就多设置几个Redis实例,例如32或者64个实例,对大多数用户来说这操作起来可能比较麻烦,但是从长久来看做这点牺牲是值得的。 这样的话,当你的数据不断增长,需要更多的Redis服务器时,你需要做的就是仅仅将Redis实例从一台服务迁移到另外一台服务器而已(而不用考虑重新分区的问题)。一旦你添加了另一台服务器,你需要将你一半的Redis实例从第一台机器迁移到第二台机器。 什么是 RedLock Redis 官方站提出了一种权威的基于 Redis 实现分布式锁的方式名叫 Redlock ,此种方式比原先的单节点的方法更安全。它可以保证以下特性: 安全特性:互斥访问,即永远只有一个 client 能拿到锁 避免死锁:最终 client 都可能拿到锁,不会出现死锁的情况,即使原本锁住某资源的 client crash 了或者出现了网络分区 容错性:只要大部分 Redis 节点存活就可以正常提供服务 缓存异常 什么是redis穿透? 就是用户请求透过redis去请求mysql服务器,导致mysql压力过载。但一个web服务里,极容易出现瓶颈的就是mysql,所以才让redis去分担mysql 的压力,所以这种问题是万万要避免的 解决方法: 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截; 采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力 什么是redis雪崩? 就是redis服务由于负载过大而宕机,导致mysql的负载过大也宕机,最终整个系统瘫痪 解决方法: redis集群,将原来一个人干的工作,分发给多个人干 缓存预热(关闭外网访问,先开启mysql,通过预热脚本将热点数据写入缓存中,启动缓存。开启外网服务) 数据不要设置相同的生存时间,不然过期时,redis压力会大 什么是redis穿透? 高并发下,由于一个key失效,而导致多个线程去mysql查同一业务数据并存到redis(并发下,存了多份数据),而一段时间后,多份数据同时失效。导致压力骤增 解决方法: 分级缓存(缓存两份数据,第二份数据生存时间长一点作为备份,第一份数据用于被请求命中,如果第二份数据被命中说明第一份数据已经过期,要去mysql请求数据重新缓存两份数据) 计划任务(假如数据生存时间为30分钟,计划任务就20分钟执行一次更新缓存数据) 缓存预热 缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据! 解决方案 直接写个缓存刷新页面,上线时手工操作一下; 数据量不大,可以在项目启动的时候自动进行加载; 定时刷新缓存; 缓存降级 当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。 缓存降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。 在进行降级之前要对系统进行梳理,看看系统是不是可以丢卒保帅;从而梳理出哪些必须誓死保护,哪些可降级;比如可以参考日志级别设置预案: 一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级; 警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警; 错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级; 严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。 服务降级的目的,是为了防止Redis服务故障,导致数据库跟着一起发生雪崩问题。因此,对于不重要的缓存数据,可以采取服务降级策略,例如一个比较常见的做法就是,Redis出现问题,不去数据库查询,而是直接返回默认值给用户。 热点数据和冷数据 热点数据,缓存才有价值 对于冷数据而言,大部分数据可能还没有再次访问到就已经被挤出内存,不仅占用内存,而且价值不大。频繁修改的数据,看情况考虑使用缓存 对于热点数据,比如我们的某IM产品,生日祝福模块,当天的寿星列表,缓存以后可能读取数十万次。再举个例子,某导航产品,我们将导航信息,缓存以后可能读取数百万次。 数据更新前至少读取两次,缓存才有意义。这个是最基本的策略,如果缓存还没有起作用就失效了,那就没有太大价值了。 那存不存在,修改频率很高,但是又不得不考虑缓存的场景呢?有!比如,这个读取接口对数据库的压力很大,但是又是热点数据,这个时候就需要考虑通过缓存手段,减少数据库的压力,比如我们的某助手产品的,点赞数,收藏数,分享数等是非常典型的热点数据,但是又不断变化,此时就需要将数据同步保存到Redis缓存,减少数据库压力。 缓存热点key 缓存中的一个Key(比如一个促销商品),在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。 解决方案 对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据或者进入DB查询 常用工具 Redis支持的Java客户端都有哪些?官方推荐用哪个? Redisson、Jedis、lettuce等等,官方推荐使用Redisson。 Redis和Redisson有什么关系? Redisson是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象 (Bloom filter, BitSet, Set, SetMultimap, ScoredSortedSet, SortedSet, Map, ConcurrentMap, List, ListMultimap, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, ReadWriteLock, AtomicLong, CountDownLatch, Publish / Subscribe, HyperLogLog)。 Jedis与Redisson对比有什么优缺点? Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。 其他问题 Redis与Memcached的区别 两者都是非关系型内存键值数据库,现在公司一般都是用 Redis 来实现缓存,而且 Redis 自身也越来越强大了!Redis 与 Memcached 主要有以下不同: 对比参数 Redis Memcached 类型 1. 支持内存 2. 非关系型数据库 1. 支持内存 2. 键值对形式 3. 缓存形式 数据存储类型 1. String 2. List 3. Set 4. Hash 5. Sort Set 【俗称ZSet】 1. 文本型 2. 二进制类型 查询【操作】类型 1. 批量操作 2. 事务支持 3. 每个类型不同的CRUD 1.常用的CRUD 2. 少量的其他命令 附加功能 1. 发布/订阅模式 2. 主从分区 3. 序列化支持 4. 脚本支持【Lua脚本】 1. 多线程服务支持 网络IO模型 1. 单线程的多路 IO 复用模型 1. 多线程,非阻塞IO模式 事件库 自封转简易事件库AeEvent 贵族血统的LibEvent事件库 持久化支持 1. RDB 2. AOF 不支持 集群模式 原生支持 cluster 模式,可以实现主从复制,读写分离 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据 内存管理机制 在 Redis 中,并不是所有数据都一直存储在内存中,可以将一些很久没用的 value 交换到磁盘 Memcached 的数据则会一直在内存中,Memcached 将内存分割成特定长度的块来存储数据,以完全解决内存碎片的问题。但是这种方式会使得内存的利用率不高,例如块的大小为 128 bytes,只存储 100 bytes 的数据,那么剩下的 28 bytes 就浪费掉了。 适用场景 复杂数据结构,有持久化,高可用需求,value存储内容较大 纯key-value,数据量非常大,并发量非常大的业务 memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 redis的速度比memcached快很多 redis可以持久化其数据 如何保证缓存与数据库双写时的数据一致性? 你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,最好不要做这个方案,读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况 串行化之后,就会导致系统的吞吐量会大幅度的降低,用比正常情况下多几倍的机器去支撑线上的一个请求。 还有一种方式就是可能会暂时产生不一致的情况,但是发生的几率特别小,就是先更新数据库,然后再删除缓存。 问题场景 描述 解决 先写缓存,再写数据库,缓存写成功,数据库写失败 缓存写成功,但写数据库失败或者响应延迟,则下次读取(并发读)缓存时,就出现脏读 这个写缓存的方式,本身就是错误的,需要改为先写数据库,把旧缓存置为失效;读取数据的时候,如果缓存不存在,则读取数据库再写缓存 先写数据库,再写缓存,数据库写成功,缓存写失败 写数据库成功,但写缓存失败,则下次读取(并发读)缓存时,则读不到数据 缓存使用时,假如读缓存失败,先读数据库,再回写缓存的方式实现 需要缓存异步刷新 指数据库操作和写缓存不在一个操作步骤中,比如在分布式场景下,无法做到同时写缓存或需要异步刷新(补救措施)时候 确定哪些数据适合此类场景,根据经验值确定合理的数据不一致时间,用户数据刷新的时间间隔 Redis常见性能问题和解决方案? Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。 如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。 为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。 尽量避免在压力较大的主库上增加从库 Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。 为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定,即主从关系为:Master<–Slave1<–Slave2<–Slave3…,这样的结构也方便解决单点故障问题,实现Slave对Master的替换,也即,如果Master挂了,可以立马启用Slave1做Master,其他不变。 Redis官方为什么不提供Windows版本? 因为目前Linux版本已经相当稳定,而且用户量很大,无需开发windows版本,反而会带来兼容性等问题。 一个字符串类型的值能存储最大容量是多少? 512M Redis如何做大量数据插入? Redis2.6开始redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工作。 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来? 使用keys指令可以扫出指定模式的key列表。 对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题? 这个时候你要回答redis关键的一个特性:redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。 使用Redis做过异步队列吗,是如何实现的 使用list类型保存数据信息,rpush生产消息,lpop消费消息,当lpop没有消息时,可以sleep一段时间,然后再检查有没有信息,如果不想sleep的话,可以使用blpop, 在没有信息的时候,会一直阻塞,直到信息的到来。redis可以通过pub/sub主题订阅模式实现一个生产者,多个消费者,当然也存在一定的缺点,当消费者下线时,生产的消息会丢失。 Redis如何实现延时队列 使用sortedset,使用时间戳做score, 消息内容作为key,调用zadd来生产消息,消费者使用zrangbyscore获取n秒之前的数据做轮询处理。 Redis回收进程如何工作的? 一个客户端运行了新的命令,添加了新的数据。 Redis检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收。 一个新的命令被执行,等等。 所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。 如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。 Redis回收使用的是什么算法? LRU算法 参考博客: [1] Redis面试题(总结最全面的面试题)
文章
存储 · 缓存 · 监控 · NoSQL · 算法 · Java · 关系型数据库 · MySQL · Redis · 数据库
2020-09-26
车联网上云最佳实践(三)
三、云上对标架构及技术详解 我们对传统IDC应用架构进行分析之后,我们发现之前的系统架构存在一些不合理的地方导致了很多的痛点,为了解决这些痛点我们最终考虑上云。开始思考怎样利用云上产品来解决目前遇到的痛点。例如       为了解决我们自建IDC底层基础设施可靠性差的问题,我们改用云计算服务,基础设施可靠性,异地容灾,数据备份,数据安全等问题再也不用担心 为了解决存储性能瓶颈以及用户访问体验问题,我们改用云上对象存储OSS服务+CDN; 为了解决单台数据库性能扩展瓶颈,我们改用云上的DRDS分布式关系数据库; 为了解决大规模的车机上报而导致数据写入延迟问题我们改用云上IOT套件+HiTSDB; 为了解决日常以及节假日流量高峰的问题,我们改用云上弹性伸缩服务+按量付费,以最低的成本完美解决日常及节假日流量高峰; 为了解决大数据存储瓶颈以及降低大数据开发分析工作难度,我们改用云上MaxCompute + HBase; 为了解决运维自动化问题以及提高运维工作效率,我们改用云上codepipeine+云监控+日志服务+容器服务; 为了解决安全防御瓶颈,我们改用云上云盾+DDOS高防IP + web应用防火墙+堡垒机; 为了解决负载均衡以及网络扩容瓶颈,我们改用云上SLB; 为了降低上云迁移复杂性,我们改用云上VPC虚拟专用网络,IP地址可以和原来保持不变; 为了解决数据迁移的稳定性和便捷性,我们采用阿里云数据迁移工具DTS 我们云上新的应用架构即会兼容部分老应用架构的特性,同时会采用云上新技术和云上产品来解决我们曾经的痛点和瓶颈。并且云上新架构需要满足未来2-3年的业务发展规划,能够支撑千万级用户规模的应用系统架构。下图为云上应用架构图。 1、云上对标架构介绍   1.1安全: 安全这块以前IDC机房的时候防范能力比较弱。为了解决安全防御瓶颈,我们改用云上云盾+DDOS高防IP + web应用防火墙+堡垒机;   可以通过配置DDoS高防IP,将攻击流量引流到高防IP,确保源站的稳定可靠。DDoS攻击防护峰值带宽 20 Gbps ~ 300 Gbps 。同时,提供按天弹性付费方案,按当天攻击规模灵活付费。 云盾Web应用防火墙可以防御SQL注入、XSS跨站脚本、常见Web服务器插件漏洞、木马上传、非授权核心资源访问等OWASP常见攻击,并过滤海量恶意CC攻击,避免网站资产数据泄露,保障网站的安全与可用性。 关于DDOS高防IP和web应用防火墙产品介绍请详见文章附录第7.1&第7.2小结。   另外选择用堡垒机来替换原来的开源堡垒机,相比开源的产品,阿里云堡垒机多了一些审计合规,高效易用,多协议支持,追溯回放等功能。   1.2负载均衡集群: 为了解决负载均衡以及网络扩容瓶颈,我们改用云上SLB负载均衡。阿里云的SLB负责均衡提供四层(TCP协议和UDP协议)和七层(HTTP和HTTPS协议)的负载均衡服务。四层采用开源软件LVS实现负载均衡,并根据云计算需求对其进行了个性化定制。七层采用Tengine实现负载均衡。Tengine是由淘宝网发起的Web服务器项目,它在Nginx的基础上,针对有大访问量的网站需求,添加了很多高级功能。更多关于阿里云负载均衡介绍请详见文章附录第2.2小结。   负载均衡实例规格选型: 根据当前业务量来看五百万用户,最高峰期间并发最大连接为50万,推荐使用 性能保障型规格5(slb.s3.medium)最大连接数50w,每秒新建连接数5w,QPS支持3w。完全满足当下的企业需求,如果后续业务和用户规模继续增长,仍然可以在线扩容到更高级别规格的SLB实例。如果未来达到千万级用户规模,需要大于100万规格的实例可以联系阿里云客户经理开通。 1.3应用服务器集群: 应用服务器采用阿里云ECS云服务器,来部署应用环境。之前提到运行环境主要为JAVA环境和PHP环境,还有少部分Node.js环境。 Java环境:采用Centos7 + JDK1.7 + Tomcat7 PHP环境:采用Centos7 + PHP5.6.11 Node.js环境:采用Centos7 + Node8.9.3 有2种方式快速构建应用运行环境: 1)   购买ECS服务器后安装操作系统,然后手动部署应用环境,最后将应用环境构建成新的系统镜像。 2)   购买ECS云服务器后直接选择云市场的已经封装好的应用环境镜像即可。 产品选型 ECS产品根据业务场景和使用场景,ECS实例可以分为多种规格族。同一业务场景下,还可以选择新旧多种规格族。同一个规格族里,根据CPU和内存的配置,可以分为多种不同的规格。ECS实例规格定义了实例的CPU和内存的配置(包括CPU型号、主频等)这两个基本属性。根据此前车联网行业特性来看,前端web应用推荐ecs.c5.xlarge(4核8G)规格实例,而后端应用推荐ecs.g5.xlarge(4核16G)规格实例。 1.4分布式服务集群: 分布式服务集群,延用Dubbo + ZooKeeper分布式服务框架。采用7台8核16G SSD磁盘200G ecs.c5.2xlarge规格ECS实例用于构建zookeeper集群。Zookeeper集群节点必须是奇数,因为在zookeeper集群中只要有超过一半的机器是正常工作的,那么整个集群对外就是可用的。   1.5缓存集群: 缓存集群采用阿里云数据库Redis版,传统自建Redis数据库通常存在集群节点扩容复杂,管理维护难等问题。所以我们改用云上数据库 Redis 版来替代,它具有性能卓越,弹性扩容,数据安全性高,可用性高,秒级监控,简单易用等优势。云数据库Redis版支持按量付费和包年包月两种模式,按量付费可转为包年包月模式,反之则不可以。可根据自己的需求自主选择更多关于云数据库Redis介绍请详见文章附录第3.2小结。   1.6消息队列集群: 消息队列采用阿里云的消息队列kafka服务,因为之前开源的kafka消息队列也经常遇到各种问题,也没有相应的能力去修复bug,选择阿里云的消息队列服务之后就不用担心这些问题,因为阿里云有一支专家团队在维护它的日常稳定运行,如出现官方bug他们有能力第一时间修复bug。更多关于阿里云消息队列kafka介绍请详见文章附录第8.2小结。   1.7流计算集群: 云上流计算采用阿里云的流计算服务,相较于其他流计算产品,阿里云流计算提供一些极具竞争力的产品优势,用户可以充分利用阿里云流计算提供的产品优势,方便快捷的解决自身业务实时化大数据分析的问题。产品优势,例如强大的实时处理能力、托管的实时计算服务、良好的流式开发体验、低廉的人力和集群成本。更多关于阿里云流计算介绍请详见文章附录第6.1小结。 1.8数据存储集群: MySQL集群:采用的是阿里云数据库RDS之MySQL版 阿里云数据库 MySQL 版是基于 Alibaba 的 MySQL 源码分支,经过双 11 高并发、大数据量的考验,拥有优良的性能和吞吐量。除此之外,阿里云数据库 MySQL 版还拥有经过优化的读写分离、数据压缩、智能调优等高级功能。当前 RDS for MySQL 支持 5.5、5.6 和 5.7 版本。请详见文章附录第3.1小结。 RDS与自建数据库对比优势: 综合性能对比   云数据库RDS 自购服务器搭建数据库服务 服务可用性 99.95% 需自行保障, 自行搭建主从复制,自建RAID等。 数据可靠性 99.9999% 需自行保障,自行搭建主从复制,自建RAID等。 系统安全性 防DDoS攻击,流量清洗;及时修复各种数据库安全漏洞。 自行部署,价格高昂;自行修复数据库安全漏洞。 数据库备份 自动备份 自行实现,但需要寻找备份存放空间以及定期验证备份是否可恢复。 软硬件投入 无软硬件投入,按需付费 数据库服务器成本相对较高,对于SQL Server需支付许可证费用。 系统托管 无托管费用 每台2U服务器每年超过5000元(如果需要主从,两台服务器需超过10000元/年)。 维护成本 无需运维 需招聘专职DBA来维护,花费大量人力成本。 部署扩容 即时开通,快速部署,弹性扩容,按需开通。 需硬件采购、机房托管、部署机器等工作,周期较长。 资源利用率 按实际结算,100%利用率。 考虑峰值,资源利用率很低。   成本对比   云数据库RDS 自购服务器搭建数据库服务 硬件 费用 和备 品配 件消 耗 以如下实例规格为例: 内存1200MB、存储空间50G(IOPS能力可达到600)的费用是2040元/年。 l  至少需要2台据库集群,每台IOPS能力达到600的服务器费用大约是6000元。 l  1台用于连接前端Web服务器的内网交换机(便宜的1U非网管交换机为1000元左右),后期硬件损坏和更换至少还要消耗30%费用。 l  硬件花费:(6000 × 2 + 1000)× 130% = 16900元。 l  每年费用:16900元/3 = 5633元(硬件按照3年折旧计算) 机房 托管 费用 服务商负责,无需付费。 1U机柜空间托管费用为3000元/年,共有2台1U服务器和1台1U内网交换机需要计费。 机房托管费用:3000 × 3=9000元 带宽 费用 同一地域内,ECS和RDS可以通过内网互通,且不收取费用。但若在不同地域,ECS和RDS可以通过外网互通,需收取外网流量费用,详细收费标准请参见云数据库RDS详细价格信息。 这里假设只用于内网,不产生公网费用。因为各个运营商的网络价格不是很透明(注:在实际使用过程中网络带宽也是一笔不小的费用。) 数据 库运 维工 程师 费用 数据库维护由服务商负责,无人员成本。                                               1个初级DBA工程师月薪至少5000/月,如果按照当前项目占用该工程师30%的工作量: 人员成本:5000 × 12× 30% = 18000元 每年 总费 用 2040元/年   32633元/年     HBase集群:采用的是阿里云数据库HBase版 传统架构中的MongoDBS用来存储车辆上报的原始数据的,这些数据通常情况下写多读少,原始数据的保存可以有利于特殊情况对问题的追溯。或者是数据丢失的情况下可以用原始数据来进行弥补。原来MongoDB集群在达到一定规模之后性能出现断崖下降,因为对MongoDB掌握不够深,没有正确使MongoDB导致。这里改用云上数据库HBase版来替换原来的MongoDB集群。HBase的高并发大数据量等特性非常适合海量数据存储,业务大屏,安全风控,搜索等场景。 HBase主要优势有两点:1)扩展性要强,HBase是专门的列式数据库,具有高并发,低时延的处理能力,支持数据从200G~10PB都适合。数据存储在HDFS,默认具备多副本可靠性和自动扩展能力。2)HBase是天生的hadoop生态系统中的组件,选择HBase,就是选择整个Hadoop生态。云HBase自带的Phoneix组件,支持SQL能力,二级索引等,非常适合IoT实时业务,并且支持带少量更新的TP操作。HBase和MapReduce,spark天然的结合,同一份数据,支持实时业务的同时,可以完成大数据的分析,以及还有时序组件OpenTSDB等。更多关于云数据库HBase介绍请详见文章附录第3.4小结。            为什么我们不自建HBase而选择云数据库HBase呢?云HBase和自建HBase对比有哪些优势呢?   云HBase 自建HBase 产品 阿里巴巴集团5年使用 全托管、SLA 开源软件、半托管、无SLA 双活 支持双活 不支持 性能 性能提升50%-300% 没有优化 专业运维 7*24小时专家运维 缺乏 产品打通 CDP\Blink\ODPS 打通 不支持 成本 综合成本低,而且部署灵活 (冷热分离,计算存储分离多种产品形态) 成本高,而且部署不灵活   自建和服务更多的对比 ,可以参考以下文章: https://yq.aliyun.com/articles/176102?spm=5176.124785.838505.1.1ba352c0NSfA6X   Elasticsearch集群:采用阿里云的Elasticsearch 传统自建Elasticsearch集群存在性能不足,集群节点扩容复杂,管理维护难度大等问题,因此我们改用云上Elasticsearch服务,它具有丰富的预置插件(IK Analyzer,pinyin Analyzer,smart Chinese Analysis Plugin,Mapper Attachments Type plugin等等),还包括集成X-pack插件提供企业级权限管控,实时监控等强大功能。它的特点和优势如下: 分布式的实时文件存储,每个字段都被索引并可被搜索 分布式的实时分析搜索引擎 商业版X-pack插件,提供企业级权限管控、实时系统监控等强大服务 可弹性扩展到上百台服务器规模,处理PB级结构化或非结构化数据 支持IK analyzer插件 Elastic官方技术支持团队7*24小时技术支持 1.9文件存储集群:             文件存储:采用阿里云对象存储OSS 原来自建的NFS文件系统,在扩展和访问速度方面随着文件数量的增加响应也越来越慢,这一块采用阿里云的OSS+CDN解决方案,应用也需要进行小小的改造。 文件系统迁移改造方案请看2.2章节。 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。它具有与平台无关的RESTful API接口,能够提供99.999999999%(11个9)的数据可靠性和99.99%的服务可用性。可以使用阿里云提供的API/SDK接口或者OSS迁移工具轻松地将海量数据移入或移出阿里云OSS。数据存储到阿里云OSS以后,推荐选择标准类型(Standard)的阿里云OSS服务作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问类型(Infrequent Access)和归档类型(Archive)的阿里云OSS服务作为不经常访问数据的备份和归档。更多关于阿里云对象存储服务OSS介绍请详见文章附录第4小结。 1.10 大数据计算平台       大数据计算平台:采用阿里云大数据计算服务 智能车联网平台每天会采集海量车行驶数据,例如车辆发动机状态,驾驶行为,油耗,公里数,行驶轨迹等等,我们需要对这些海量数据进行加工和分析。例如用户每天行驶里程统计,油耗统计,用户驾驶行为月报告等等。因初期数据量相对较小,使用Kettle进行抽取数据等工作,ETL的工作大部分在MySQL数据仓库中完成。多种数据源使用Presto(集群)作为查询中间键进行相应的数据分析。但随着业务的疯狂增长,数据表单表达到数亿后,磁盘容量达几百GB时,数据要求的复杂度逐步提升,使用MySQL作为基础数据仓库的基石已经不足以应付,常出现查询响应时间等待过长,甚至内存崩溃导致执行失败的情况,极大的影响了工作效率。所以云上我们改用阿里云MaxCompute大数据计算服务来构建我们公司大数据开发和分析平台。MaxCompute能够为我们提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决海量数据计算问题,有效帮助我们公司降低成本,并保障数据安全。Dataworks则提供了一站式的数据同步,数据开发,数据管理和数据运维等功能。更多关于阿里云大数据计算服务介绍请详见文章附录第6.2小结。   1.11运维管控集群: 之前的传统运维,基本都是靠人肉运维,脚本运维,运维自动化程度很低,导致故障频发,故障定位难,我们的运维同学大量时间花在了重复的升级发布工作上,花在了填坑以及解决故障上,长此以往运维同学自身发展受限,信心受挫,人员流失比例高的恶性循环的结果。我们迫切希望这种状况可以得到较好的解决。对比之前大量采用开源的监控工具相比,大部分阿里云的产品本身就自带web控制台,也有一些比较实用的运维管控产品,例如云监控,堡垒机,数据管理,数据迁移,容器服务,域名等等。以前的运维痛点可以通过阿里云的运维产品可以很好的得到解决。 日志管理:采用阿里云日志服务解决日志收集,日志分析,日志搜索等问题。 阿里云日志服务是针对日志类数据的一站式服务,在阿里巴巴集团经历大量大数据场景锤炼而成。无需开发就能快捷完成日志数据采集、消费、投递以及查询分析等功能,提升运维、运营效率,建立 DT 时代海量日志处理能力。具有全托管,实时性强,生态丰富,完整API等特点。更多关于阿里云日志服务介绍请详见文章附录第5.7小结。   弹性扩容:采用阿里云弹性伸缩ESS,低成本解决日常以及节假日流量高峰问题。 在车联网行业中有个比较明显的行业特性就是早晚高峰是平时流量的3倍甚至更高,但是平常要应付这么高并发的流量意味着资源投入也要3倍以上。在传统IDC架构中,我们通常是按照平常最高峰流量的1.2倍(1.2倍是为应对特殊情况预留的buffer)来准备相应的服务器资源,在平时资源闲置比较明显,资源利用率不到30%,意味着平常可能100台应用服务器就足够了,但是为了应对高峰流量不出问题我们需要准备360台服务器应对6个小时的高峰流量,其余18小时可能只需要100台服务器。为了确保系统稳定,提升用户体验,当时我们只能投入比平时多几倍的服务器资源。所以在云上我们采用阿里云弹性伸缩服务,它是一种根据业务需求和策略,自动调整其弹性计算资源的管理服务。在满足业务需求高峰增长时无缝地增加ECS实例,并在业务需求下降时自动减少ECS实例以节约成本。更多关于阿里云弹性伸缩服务介绍请详见文章附录第1.2小结。            域名管理:采用阿里云域名服务,一站式解决域名购买,管理,备案等问题。          以前的老万网被阿里云收购之后,变更为阿里云域名服务,它集域名注册、交易、解析、监控和保护为一体的综合域名管理平台。更多关于域名服务介绍请详见文章附录第5.6小结。   持续集成:传统应用升级发布主要靠的人肉升级或者脚本升级,后来尝试过利用开源的Jenkins+docker方式构建一个简单的应用发布系统,我们希望到云上可以继续保持这种发布方式,所以改用云上CodePipeline,阿里云CodePipeline是一款提供持续集成/持续交付能力,并完全兼容Jenkins的能力和使用习惯的SAAS化产品。它无需运维,开箱即用,全量兼容Jenkins插件,支持ECS,容器服务持续部署,快速上手。更多关于codepipeline介绍请详见文章附录第5.9小结。              容器管理:采用阿里云容器服务,一站式解决容器生命周期管理及集群管理问题。 阿里云容器服务提供高性能可伸缩的容器应用管理服务,支持用 Docker 和 Kubernetes进行容器化应用的生命周期管理,提供多种应用发布方式和持续交付能力并支持微服务架构。容器服务简化了容器管理集群的搭建工作,整合了阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器运行环境。阿里云容器服务可以提供一站式容器生命周期管理以及集群管理。更多关于阿里云容器管理介绍请详见文章附录第5.5小结。   统一配置:采用阿里云应用配置管理,传统IDC架构中我们的应用因为微服务架构的需要全部采用了的统一配置管理,将配置中心化管理,保存在zookeeper当中,通过一个web前端进行配置管理。应用通过本地客户端向服务端请求配置。这样做的好处是应用配置可以集中存放,统一配置,方便管理。但是我们的web配置管理中心提供的功能比较简单,甚至不具备权限管理,配置快照,备份和恢复等功能。在云上我们改用阿里云的应用配置管理ACM产品。云上应用配置管理是一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。基于该应用配置中心产品,可以在微服务、DevOps、大数据等场景下极大地减轻配置管理的工作量,增强配置管理的服务能力。阿里云ACM 是分布式系统的配置中心。通过提供配置变更、配置推送、历史版本管理、灰度发布、配置变更审计等配置管理工具,ACM 帮助集中管理所有应用环境中的配置,降低分布式系统中管理配置的成本,并降低因错误的配置变更带来可用性下降甚至发生故障的风险。更多关于阿里云应用配置管理ACM介绍请详见文章附录以及官方网站。   监控系统:采用阿里云监控服务,传统IDC架构中我们的监控系统是自建的zabbix监控系统,随着公司业务快速发展,监控项也急剧增加,由最初的500个监控项增加到3w个监控项,监控系统数据库性能跟不上,查询很慢,告警延迟和误报的现象逐渐增多,监控需求越来越多样化,定制化。传统监控系统已经不能满足未来业务高速发展。 所以我们云上改用云监控,云监控是一项针对阿里云资源和互联网应用进行监控的服务。云监控服务可用于收集获取阿里云资源的监控指标,探测互联网服务可用性,以及针对指标设置警报。云监控对用户提供Dashboard、站点监控、云产品监控、自定义监控和报警服务。更多关于云监控介绍请详见文章附录第5.1小结。                 数据可视化:采用DataV, 解决了运维大屏,监控大屏没有UI设计问题          企业多多少少有些大屏,在公司接待参观考察工作时展示企业形象,企业运营,以及系统运行情况等。为了提升企业形象,有必要针对数据可视化部分进行美化。阿里云的DataV 可以帮助非专业的工程师通过图形化的界面轻松搭建具有专业水准的可视化应用,让更多的人看到数据可视化的魅力。DataV 提供了丰富的可视化模板,极大程度满足会议展览、业务监控、风险预警、地理信息分析等多种业务的展示需求。更多关于阿里云DataV数据可视化介绍请详见文章附录第5.2小结。            数据库运维:采用阿里云数据管理DMS,解决数据库运维管理问题 阿里云数据管理支持MySQL、SQL Server、PostgreSQL、MongoDB、Redis等关系型数据库和NoSQL的数据库管理,同时还支持Linux服务器管理。它是一种集数据管理、结构管理、访问安全、BI图表、数据趋势、数据轨迹、性能与优化和服务器管理于一体的数据管理服务。更多关于阿里云数据管理DMS介绍请详见文章附录第5.8小结。   1.12 尝试新产品解决老问题 问题1:海量车机设备的接入导致网络延时高,设备管理困难,安全性差 解决方案:阿里云物联网套件(iot套件),解决大规模车机管理,数据上报问题。 物联网套件是阿里云专门为物联网领域的开发人员推出的一站式设备管理平台。性能强大的IoT Hub方便设备和云端稳定的进行双向通信;全球多节点的部署让全球设备都可以低延时与云端通信;多重的防护能力保障设备云端安全;功能丰富的设备管理能力帮助用户方便进行远程维护设备;稳定可靠的数据存储能力方便海量设备数据存储和实时访问。物联网套件还提供规则引擎与阿里云众多云产品打通,用户通过规则引擎只需在web上配置规则即可实现数据采集+数据计算+数据存储等全栈服务,灵活快速的构建物联网应用。更多关于阿里云IOT套件介绍请详见文章附录。 问题2:车联网大多应用场景对数据实时性要求非常高,但是目前在数据采集过程中由于数据库写入性能不够,经常出现大量数据写入延迟情况。   解决方案:阿里云高性能时间序列数据库HiTSDB,解决海量数据写入延迟问题。 为什么说时间序列数据库能解决呢? 据有关机构测试发现一辆联网汽车每小时能收集25GB数据。常规数据库在设计之初并非处理这种规模的数据,关系型数据库处理大数据集的效果非常糟糕;NoSQL数据库可以很好地处理规模数据,但是它比不上一个针对时间序列数据微调过的数据库。相比之下,时间序列数据库(可以基于关系型数据库或NoSQL数据库)将时间视作一等公民,通过提高效率来处理这种大规模数据,并带来性能的提升,包括:更高的容纳率(Ingest Rates)、更快的大规模查询(尽管有一些比其他数据库支持更多的查询)以及更好的数据压缩。有兴趣了解更深层次原因的朋友可以参考这个链接: http://www.infoq.com/cn/news/2017/07/Why-time-series-database https://qz.com/344466/connected-cars-will-send-25-gigabytes-of-data-to-the-cloud-every-hour/   阿里云高性能时间序列数据库 (High-Performance Time Series Database , 简称 HiTSDB) 是一种高性能,低成本,稳定可靠的在线时序数据库服务;提供高效读写,高压缩比存储、时序数据插值及聚合计算,广泛应用于物联网(IoT)设备监控系统 ,企业能源管理系统(EMS),生产安全监控系统,电力检测系统等行业场景。 HiTSDB 提供百万级时序数据秒级写入,高压缩比低成本存储、预降采样、插值、多维聚合计算,查询结果可视化功能;解决由于设备采集点数量巨大,数据采集频率高,造成的存储成本高,写入和查询分析效率低的问题。后续文章会详细介绍HiTSDB性能测试内容。更多关于HiTSDB介绍请详见文章附录第。   问题3:车联网行业是典型的大数据行业,有大量的大数据分析应用场景需求,但是自建大数据平台成本高,维护困难,大数据人才不好招。 解决方案: MaxCompute + Dataworks + 云数据库HBase版 阿里云大数据计算服务(MaxCompute,原名 ODPS)是一种快速、完全托管的 GB/TB/PB 级数据仓库解决方案。MaxCompute 提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决海量数据计算问题,有效降低企业成本,并保障数据安全。 同时,DataWorks 和 MaxCompute 关系紧密,DataWorks 为 MaxCompute 提供了一站式的数据同步,任务开发,数据工作流开发,数据管理和数据运维等功能,帮助企业专注于数据价值的挖掘和探索。普通开发人员也可以胜任大数据开发任务。 云数据库 HBase 版(ApsaraDB for HBase)是基于 Hadoop 且100%兼容HBase协议的高性能、可弹性伸缩、面向列的分布式数据库,轻松支持PB级大数据存储,满足千万级QPS高吞吐随机读写场景。阿里集团在10年开始研究HBase并使用在生产之中,目前阿里集团有10000台左右的HBase机器,数百个集群,服务数百个业务。是一款久经沙场的大数据产品。                   问题4:单机MySQL数据库遇到IO性能瓶颈和容量扩容瓶颈,如果业务和用户规模继续增长将面临单机数据库扩展困难。         解决方案:阿里云分布式关系型数据库服务DRDS         阿里云分布式关系型数据库服务专注于解决单机关系型数据库扩展性问题,具备轻量(无状态)、灵活、稳定、高效等特性,是阿里巴巴集团自主研发的中间件产品。DRDS 兼容 MySQL 协议和语法,支持分库分表、平滑扩容、服务升降配、透明读写分离和分布式事务等特性,具备分布式数据库全生命周期的运维管控能力。DRDS 主要应用场景在大规模在线数据操作上,通过贴合业务的拆分方式,将操作效率提升到极致,有效满足用户在线业务对关系性数据库要求。DRDS提供了丰富的功能: l  分库分表 支持 RDS/MySQL 的分库分表,在创建分布式数据库后,只需选择拆分键,DRDS 就可以按照拆分键生成拆分规则,实现数据水平拆分。 l  透明读写分离 通过使用 RDS 只读实例或者 MySQL 备机实现读写分离,帮助应用解决事务、只读实例或者备机挂掉、指定主备访问等细节问题,对应用无侵入,在 DRDS 控制台即可完成读写分离相关操作。 l  数据存储平滑扩容 当出现数据存储容量和访问量瓶颈时,DRDS 支持在线存储容量扩展,扩容无需应用改造,扩容进度支持可视化跟踪。 l  服务升降配 DRDS 实例可以通过改变资源数量实现服务能力的弹性扩展。 l  分布式运维指令集 DRDS 提供独有分布式数据库运维指令集,如 SHOW SLOW、TRACE、SHOW NODE 等指令,有助于快速发现和定位问题。 l  全局唯一数字序列 DRDS 支持分布式全局唯一且有序递增的数字序列。满足业务在使用分布式数据库下对主键或者唯一键以及特定场景的需求。 l  数据库账号权限体系 DRDS 支持类单机 MySQL 账号和权限体系,确保不同角色使用的账号操作安全。 l  分布式事务 DRDS 支持分布式柔性事务,保证分布式数据库数据一致性。 l  监控报警  DRDS 支持对核心资源指标和数据库实例指标的实时监控和报警,如实例 CPU、网络 IO、活跃线程等,帮助实时发现资源和性能瓶颈。         更多关于阿里云分布式关系数据库DRDS介绍请详见文章附录第3.5小结。   2、数据迁移策略 2.1 数据库迁移策略 数据库迁移是整个上云过程中最重要的一环,难度也最大,因为我们在迁移的时候要尽可能的减少业务本身的影响,最好是不停机不中断现有业务。需要制定非常详细的计划和迁移策略: l  迁移工具:推荐阿里云数据传输服务DTS DTS 是阿里云提供的一种支持 RDBMS(关系型数据库)、NoSQL、OLAP 等多种数据源之间数据交互的数据流服务。它提供了数据迁移、实时数据订阅及数据实时同步等多种数据传输能力。通过数据传输可实现不停服数据迁移、数据异地灾备、异地多活(单元化)、跨境数据同步、实时数据仓库、查询报表分流、缓存更新、异步消息通知等多种业务应用场景,助构建高安全、可扩展、高可用的数据架构。 DTS 支持多种数据源类型,例如: Ø  关系型数据库:Oracle、MySQL、SQLServer、PostgreSQL 、RDS For PAAS、DRDS、PetaData、OceanBase。 Ø  NoSQL:MongoDB、Redis 。 Ø  OLAP:ODPS、ADS、流计算。    l  迁移时间:推荐在业务流量最低峰时段例如每天0点至5点   l  迁移方法: 一般情况我们的业务数据库都是有主备的,那么选择从数据库作为源数据库对云上数据库进行同步,这样做的目的是为了减少对主库的影响,有条件的话选择单独的从数据库专门用作对云上数据库进行全量同步迁移。完了之后再切换到主数据库开启增量数据同步(利用DTS可以轻松完成数据库的增量同步)。这样就可以保证线下数据库和线上数据库的一致性了。具体迁移步骤请参考官方文档: https://help.aliyun.com/document_detail/35732.html?spm=a2c4g.11186623.6.638.5X8oE7   2.2 文件系统迁移策略 之前采用的是自建NFS文件系统用于存储图片和文件。随着文件越来越多,图片访问速度越来越慢,搬到云上之后,可以利用阿里云的OSS和CDN服务,构建如下的web端直传OSS存储方案,架构如下: 用户的请求逻辑: 1)   用户向应用服务器取到上传policy和回调设置。 2)   应用服务器返回上传policy和回调。 3)   用户直接向OSS发送文件上传请求。 4)   等文件数据上传完,OSS给用户Response前,OSS会根据用户的回调设置,请求用户的服务器。 5)   如果应用服务器返回成功,那么就返回用户成功,如果应用服务器返回失败,那么OSS也返回给用户失败。这样确保了用户上传成功的照片,应用服务器都已经收到通知了。 6)   应用服务器给OSS返回。 7)   OSS将应用服务器返回的内容返回给用户。 利用阿里云OSS存储代替原来的自建NFS文件系统,优势很明显: 对比项 对象存储OSS 自建服务器存储 可靠性 - 服务设计可用性不低于99.95%。 - 规模自动扩展,不影响对外服务。 - 数据设计持久性不低于99.999999999%。 - 数据自动多重冗余备份。 - 受限于硬件可靠性,易出问题,一旦出现磁盘坏道,容易出现不可逆转的数据丢失。 - 人工数据恢复困难、耗时、耗力。 安全 - 提供企业级多层次安全防护。 - 多用户资源隔离机制,支持异地容灾机制。 - 提供多种鉴权和授权机制及白名单、防盗链、主子账号功能。 - 需要另外购买清洗和黑洞设备。 - 需要单独实现安全机制。 网络 - 多线BGP骨干网络,无带宽限制,上行流量免费。 - 无需运维人员与托管费用,0成本运维。 - 存储受硬盘容量限制,需人工扩容。 - 单线或双线接入速度慢,有带宽限制,峰值时期需人工扩容。 - 需专人运维,成本高。 数据处理能力 - 提供图片处理、音视频转码、内容加速分发、鉴黄服务、归档服务等多种数据增值服务,并不断丰富中。 - 需要额外采购,单独部署。 成本 包年包月或者按量付费,按需购买,价格低廉;以标准型存储为例费用为0.12元/GB/月;请求费用0.01元/万次;外网流量费用:0.25元/GB,CDN回源流出流量:0.15元/GB; 需要购买专门存储硬软件设备,初次投入成本非常高。少则数十万元,多则上百万甚至是上千万的投入。   OSS服务 配合CDN 服务一起使用,则可以加速文件存储和访问速度,提升用户访问体验。 CDN的工作原理就是将源站的资源缓存到各地的边缘节点服务器(CDN节点)上,用户请求访问和获取资源时,就近调用CDN节点上缓存的资源。这种分布式数据传输方式,使得用户请求的资源不需要都回源站获取,从而避免网络拥塞、分担源站压力,保证用户访问资源的速度和体验。 使用CDN后的http请求处理流程如下图 阿里云CDN在全球拥有1300+ 节点,国内完整覆盖 34 个省级区域,大量节点位于省会等一线城市。海外覆盖70 多个国家和地区。阿里云所有节点均接入 万兆 网卡;具备 90 Tpbs 带宽能力储备。单节点存储容量达 40 TB-1.5 PB,带宽负载达到 40 Gbps-200 Gbps。
文章
监控 · 大数据 · 关系型数据库 · 数据库 · 容器
2018-08-23
人工智能
2040 人关注 | 7301 讨论 | 33585 内容
+ 订阅
  • 前端智能化发展现状与未来展望
  • 云上个性化推荐——基于PAI和Hologres的个性化推荐最佳实践
  • 行业首发|阿里云开启超 TB 级复杂数据场景机密计算
查看更多 >
数据库
100378 人关注 | 34049 讨论 | 27644 内容
+ 订阅
  • 云上个性化推荐——基于PAI和Hologres的个性化推荐最佳实践
  • 事务消息应用场景、实现原理与项目实战(附全部源码)
  • 面向K8s设计误区
查看更多 >
开发与运维
3853 人关注 | 92020 讨论 | 88720 内容
+ 订阅
  • 实时计算 Flink 新中级训练营最后一期限时报名!3天get开发高阶技能,结营礼抢定制Polo!
  • 云上个性化推荐——基于PAI和Hologres的个性化推荐最佳实践
  • 方法一:使用rocketmq-spring-boot-starter来配置、发送和消费RocketMQ消息
查看更多 >
安全
732 人关注 | 21423 讨论 | 26602 内容
+ 订阅
  • SpringBoot Admin2.0 集成 Java 诊断神器 Arthas 实践
  • 行业首发|阿里云开启超 TB 级复杂数据场景机密计算
  • 阿里云CIAM完整落地某国际大型零售企业
查看更多 >
大数据
20008 人关注 | 13832 讨论 | 28812 内容
+ 订阅
  • 云上个性化推荐——基于PAI和Hologres的个性化推荐最佳实践
  • 行业首发|阿里云开启超 TB 级复杂数据场景机密计算
  • 自建Kubernetes集群如何使用事件中心
查看更多 >