
作者:lixiaojun


(Web3.0云响力峰会精彩瞬间)









说到后台技术栈,脑海中是不是浮现的是这样一幅图?
【图1】 计算机语言
有点眼晕,以上只是我们会用到的一些语言的合集,而且只是语言层面的一部分,就整个后台技术栈来说,这只是一个开始,从语言开始,还有很多很多的内容。今天要说的后台是大后台的概念,放在服务器上的东西都属于后台的东西,比如使用的框架,语言,数据库,服务,操作系统等等,整个后台技术栈我的理解包括4个层面的内容:
-
语言:用了哪些开发语言,如:c++/java/go/php/python/ruby等等;
-
组件:用了哪些组件,如:MQ组件,数据库组件等等;
-
流程:怎样的流程和规范,如:开发流程,项目流程,发布流程,监控告警流程,代码规范等等;
-
系统:系统化建设,上面的流程需要有系统来保证,如:规范发布流程的发布系统,代码管理系统等等;
结合以上的的4个层面的内容,整个后台技术栈的结构如图2所示:
【图2】 后台技术栈结构
以上的这些内容都需要我们从零开始搭建,在创业公司,没有大公司那些完善的基础设施,需要我们从开源界,从云服务商甚至有些需要自己去组合,去拼装,去开发一个适合自己的组件或系统以达成我们的目标。咱们一个个系统和组件的做选型,最终形成我们的后台技术栈。
一、各系统组件选型
1、项目管理/Bug管理/问题管理
项目管理软件是整个业务的需求,问题,流程等等的集中地,大家的跨部门沟通协同大多依赖于项目管理工具。有一些 SAAS 的项目管理服务可以使用,但是很多时间不满足需求,此时我们可以选择一些开源的项目,这些项目本身有一定的定制能力,有丰富的插件可以使用,一般的创业公司需求基本上都能得到满足,常用的项目如下:
-
Redmine:用 Ruby 开发的,有较多的插件可以使用,能自定义字段,集成了项目管理,BUG 问题跟踪,WIKI 等功能,不过好多插件 N 年没有更新了;
-
Phabricator: 用 PHP 开发的,facebook 之前的内部工具,开发这工具的哥们离职后自己搞了一个公司专门做这个软件,集成了代码托管, Code Review,任务管理,文档管理,问题跟踪等功能,强烈推荐较敏捷的团队使用;
-
Jira:用 Java 开发的,有用户故事,task 拆分,燃尽图等等,可以做项目管理,也可以应用于跨部门沟通场景,较强大;
-
悟空CRM:这个不是项目管理,这个是客户管理,之所以在这里提出来,是因为在 To B 的创业公司里面,往往是以客户为核心来做事情的,可以将项目管理和问题跟进的在悟空 CRM 上面来做,他的开源版本已经基本实现了 CR< 的核心 功能,还带有一个任务管理功能,用于问题跟进,不过用这个的话,还是需要另一个项目管理的软件协助,顺便说一嘴,这个系统的代码写得很难维护,只能适用于客户规模小(1万以内)时。
2、DNS
DNS 是一个很通用的服务,创业公司基本上选择一个合适的云厂商就行了,国内主要是两家:
-
阿里万网:阿里 2014 年收购了万网,整合了其域名服务,最终形成了现在的阿里万网,其中就包含 DNS 这块的服务;
-
腾讯 DNSPod: 腾讯 2012 年以 4000 万收购 DNSPod 100% 股份,主要提供域名解析和一些防护功能;
如果你的业务是在国内,主要就是这两家,选 一个就好,像今日头条这样的企业用的也是 DNSPod 的服务,除非一些特殊的原因才需要自建,比如一些 CDN 厂商,或者对区域有特殊限制的。要实惠一点用阿里最便宜的基础版就好了,要成功率高一些,还是用DNSPod 的贵的那种。
在国外还是选择亚马逊吧,阿里的 DNS 服务只有在日本和美国有节点,东南亚最近才开始部点, DNSPod 也只有美国和日本,像一些出海的企业,其选择的云服务基本都是亚马逊。
如果是线上产品,DNS 强烈建议用付费版,阿里的那几十块钱的付费版基本可以满足需求。如果还需要一些按省份或按区域调试的逻辑,则需要加钱,一年也就几百块,省钱省力。
如果是国外,优先选择亚马逊,如果需要国内外互通并且有自己的 APP 的话,建议还是自己实现一些容灾逻辑或者智能调度,因为没有一个现成的 DNS 服务能同时较好的满足国内外场景,或者用多个域名,不同的域名走不同的 DNS 。
3、LB(负载均衡)
LB(负载均衡)是一个通用服务,一般云厂商的 LB 服务基本都会如下功能:
-
支持四层协议请求(包括 TCP、UDP 协议);
-
支持七层协议请求(包括 HTTP、HTTPS 协议);
-
集中化的证书管理系统支持 HTTPS 协议;
-
健康检查;
如果你线上的服务机器都是用的云服务,并且是在同一个云服务商的话,可以直接使用云服务商提供的 LB 服务,如阿里云的 SLB,腾讯云的 CLB, 亚马逊 的 ELB 等等。如果是自建机房基本都是 LVS + Nginx。
4、CDN
CDN 现在已经是一个很红很红的市场,基本上只能挣一些辛苦钱,都是贴着成本在卖。国内以网宿为龙头,他们家占据整个国内市场份额的40%以上,后面就是腾讯,阿里。网宿有很大一部分是因为直播的兴起而崛起。
国外,Amazon 和 Akamai 合起来占比大概在 50%,曾经的国际市场老大 Akamai 拥有全球超一半的份额,在 Amazon CDN入局后,份额跌去了将近 20%,众多中小企业都转向后者,Akamai 也是无能为力。
国内出海的 CDN 厂商,更多的是为国内的出海企业服务,三家大一点的 CDN 服务商里面也就网宿的节点多一些,但是也多不了多少。阿里和腾讯还处于前期阶段,仅少部分国家有节点。
就创业公司来说,CDN 用腾讯云或阿里云即可,其相关系统较完善,能轻松接入,网宿在系统支持层面相对较弱一些,而且还贵一些。并且,当流量上来后,CDN 不能只用一家,需要用多家,不同的 CDN 在全国的节点覆盖不一样,而且针对不同的客户云厂商内部有些区分客户集群,并不是全节点覆盖(但有些云厂商说自己是全网节点),除了节点覆盖的问题,多 CDN 也在一定程度上起到容灾的作用。
5、RPC框架
维基百科对 RPC 的定义是:远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。
通俗来讲,一个完整的RPC调用过程,就是 Server 端实现了一个函数,客户端使用 RPC 框架提供的接口,调用这个函数的实现,并获取返回值的过程。
业界 RPC 框架大致分为两大流派,一种侧重跨语言调用,另一种是偏重服务治理。
跨语言调用型的 RPC 框架有 Thrift、gRPC、Hessian、Hprose 等。这类 RPC 框架侧重于服务的跨语言调用,能够支持大部分的语言进行语言无关的调用,非常适合多语言调用场景。但这类框架没有服务发现相关机制,实际使用时需要代理层进行请求转发和负载均衡策略控制。
其中,gRPC 是 Google 开发的高性能、通用的开源 RPC 框架,其由 Google 主要面向移动应用开发并基于 HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以要实现框架的功能需要进一步的开发。
Hprose(High Performance Remote Object Service Engine) 是一个 MIT 开源许可的新型轻量级跨语言跨平台的面向对象的高性能远程动态通讯中间件。
服务治理型的 RPC 框架的特点是功能丰富,提供高性能的远程调用、服务发现及服务治理能力,适用于大型服务的服务解耦及服务治理,对于特定语言(Java)的项目可以实现透明化接入。缺点是语言耦合度较高,跨语言支持难度较大。国内常见的冶理型 RPC 框架如下:
-
Dubbo: Dubbo 是阿里巴巴公司开源的一个 Java 高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。当年在淘宝内部,Dubbo 由于跟淘宝另一个类似的框架 HSF 有竞争关系,导致 Dubbo 团队解散,最近又活过来了,有专职同学投入。
-
DubboX: DubboX 是由当当在基于 Dubbo 框架扩展的一个 RPC 框架,支持 REST 风格的远程调用、Kryo/FST 序列化,增加了一些新的feature。
-
Motan: Motan 是新浪微博开源的一个 Java 框架。它诞生的比较晚,起于 2013 年,2016 年 5 月开源。Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。
-
rpcx: rpcx 是一个类似阿里巴巴Dubbo 和微博 Motan 的分布式的 RPC 服务框架,基于 Golang net/rpc 实现。但是 rpcx 基本只有一个人在维护,没有完善的社区,使用前要慎重,之前做 Golang 的 RPC 选型时也有考虑这个,最终还是放弃了,选择了 gRPC,如果想自己自研一个 RPC 框架,可以参考学习一下。
6、名字发现/服务发现
名字发现和服务发现分为两种模式,一个是客户端发现模式,一种是服务端发现模式。
框架中常用的服务发现是客户端发现模式。
所谓服务端发现模式是指客户端通过一个负载均衡器向服务发送请求,负载均衡器查询服务注册表并把请求路由到一台可用的服务实例上。现在常用的负载均衡器都是此类模式,常用于微服务中。
所有的名字发现和服务发现都要依赖于一个可用性非常高的服务注册表,业界常用的服务注册表有如下三个:
-
etcd,一个高可用、分布式、一致性、key-value方式的存储,被用在分享配置和服务发现中。两个著名的项目使用了它:k8s和Cloud Foundry。
-
consul,一个发现和配置服务的工具,为客户端注册和发现服务提供了API,Consul还可以通过执行健康检查决定服务的可用性。
-
Apache Zookeeper,是一个广泛使用、高性能的针对分布式应用的协调服务。Apache Zookeeper本来是 Hadoop 的子工程,现在已经是顶级工程了。
除此之外也可以自己实现服务实现,或者用 Redis 也行,只是需要自己实现高可用性。
7、关系数据库
关系数据库分为两种,一种是传统关系数据,如 Oracle, MySQL,Maria, DB2,PostgreSQL 等等,另一种是 NewSQL,即至少要满足以下五点的新型关系数据库:
-
完整地支持SQL,支持JOIN / GROUP BY /子查询等复杂SQL查询;
-
支持传统数据标配的 ACID 事务,支持强隔离级别。
-
具有弹性伸缩的能力,扩容缩容对于业务层完全透明。
-
真正的高可用,异地多活、故障恢复的过程不需要人为的接入,系统能够自动地容灾和进行强一致的数据恢复。
-
具备一定的大数据分析能力
传统关系数据库用得最多的是 MySQL,成熟,稳定,一些基本的需求都能满足,在一定数据量级之前基本单机传统数据库都可以搞定,而且现在较多的开源系统都是基于 MySQL,开箱即用,再加上主从同步和前端缓存,百万 pv 的应用都可以搞定了。
不过 CentOS 7 已经放弃了 MySQL,而改使用 MariaDB。MariaDB 数据库管理系统是 MySQ L的一个分支,主要由开源社区在维护,采用GPL 授权许可。开发这个分支的原因之一是:甲骨文公司收购了 MySQL 后,有将 MySQ L闭源的潜在风险,因此社区采用分支的方式来避开这个风险。
在 Google 发布了 F1: A Distributed SQL Database That Scales 和 Spanner: Google’s Globally-Distributed Databasa 之后,业界开始流行起 NewSQL。于是有了 CockroachDB,于是有了奇叔公司的 TiDB。国内已经有比较多的公司使用 TiDB,之前在创业公司时在大数据分析时已经开始应用 TiDB,当时应用的主要原因是 MySQL 要使用分库分表,逻辑开发比较复杂,扩展性不够。
8、NoSQL
NoSQL 顾名思义就是 Not-Only SQL,也有人说是 No – SQL,个人偏向于Not – Only SQL,它并不是用来替代关系库,而是作为关系型数据库的补充而存在。
常见 NoSQL 有4个类型:
-
键值,适用于内容缓存,适合混合工作负载并发高扩展要求大的数据集,其优点是简单,查询速度快,缺点是缺少结构化数据,常见的有 Redis, Memcache, BerkeleyDB 和 Voldemort 等等;
-
列式,以列簇式存储,将同一列数据存在一起,常见于分布式的文件系统,其中以 Hbase,Cassandra 为代表。Cassandra 多用于写多读少的场景,国内用得比较多的有 360,大概 1500 台机器的集群,国外大规模使用的公司比较多,如 Ebay,Instagram,Apple 和沃尔玛等等;
-
文档,数据存储方案非常适用承载大量不相关且结构差别很大的复杂信息。性能介于 kv 和关系数据库之间,它的灵感来于 lotus notes,常见的有 MongoDB,CouchDB 等等;
-
图形,图形数据库擅长处理任何涉及关系的状况。社交网络,推荐系统等。专注于构建关系图谱,需要对整个图做计算才能得出结果,不容易做分布式的集群方案,常见的有 Neo4J,InfoGrid 等。
除了以上4种类型,还有一些特种的数据库,如对象数据库,XML 数据库,这些都有针对性对某些存储类型做了优化的数据库。
在实际应用场景中,何时使用关系数据库,何时使用 NoSQL,使用哪种类型的数据库,这是我们在做架构选型时一个非常重要的考量,甚至会影响整个架构的方案。
9、消息中间件
消息中间件在后台系统中是必不可少的一个组件,一般我们会在以下场景中使用消息中间件:
-
异步处理:异步处理是使用消息中间件的一个主要原因,在工作中最常见的异步场景有用户注册成功后需要发送注册成功邮件、缓存过期时先返回老的数据,然后异步更新缓存、异步写日志等等;通过异步处理,可以减少主流程的等待响应时间,让非主流程或者非重要业务通过消息中间件做集中的异步处理。
-
系统解耦:比如在电商系统中,当用户成功支付完成订单后,需要将支付结果给通知ERP系统、发票系统、WMS、推荐系统、搜索系统、风控系统等进行业务处理;这些业务处理不需要实时处理、不需要强一致,只需要最终一致性即可,因此可以通过消息中间件进行系统解耦。通过这种系统解耦还可以应对未来不明确的系统需求。
-
削峰填谷:当系统遇到大流量时,监控图上会看到一个一个的山峰样的流量图,通过使用消息中间件将大流量的请求放入队列,通过消费者程序将队列中的处理请求慢慢消化,达到消峰填谷的效果。最典型的场景是秒杀系统,在电商的秒杀系统中下单服务往往会是系统的瓶颈,因为下单需要对库存等做数据库操作,需要保证强一致性,此时使用消息中间件进行下单排队和流控,让下单服务慢慢把队列中的单处理完,保护下单服务,以达到削峰填谷的作用。
业界消息中间件是一个非常通用的东西,大家在做选型时有使用开源的,也有自己造轮子的,甚至有直接用 MySQL 或 Redis 做队列的,关键看是否满足你的需求,如果是使用开源的项目,以下的表格在选型时可以参考:
【图3】 消息中间件
以上图的纬度为:名字、成熟度、所属社区、公司文档、授权方式、开发语言支持的协议、客户端支持的语言、性能、持久化、事务、集群、负载均衡、管理界面、部署方式、评价。
10、代码管理
代码是互联网创业公司的命脉之一,代码管理很重要,常见的考量点包括两块:
-
安全和权限管理,将代码放到内网并且对于关系公司命脉的核心代码做严格的代码控制和机器的物理隔离;
-
代码管理工具,Git 作为代码管理的不二之选,你值得拥有。Gitlab 是当今最火的开源 Git 托管服务端,没有之一,虽然有企业版,但是其社区版基本能满足我们大部分需求,结合 Gerrit 做 Code review,基本就完美了。当然 Gitlab 也有代码对比,但没Gerrit 直观。Gerrit 比 Gitlab 提供了更好的代码检查界面与主线管理体验,更适合在对代码质量有高要求的文化下使用。
11、持续集成
持续集成简称 CI(continuous integration), 是一种软件开发实践,即团队开发成员经常集成他们的工作,每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。持续集成为研发流程提供了代码分支管理/比对、编译、检查、发布物输出等基础工作,为测试的覆盖率版本编译、生成等提供统一支持。
业界免费的持续集成工具中我们有如下一些选择:
-
Jenkins:Jjava写的 有强大的插件机制,MIT协议开源 (免费,定制化程度高,它可以在多台机器上进行分布式地构建和负载测试)。Jenkins可以算是无所不能,基本没有 Jenkins 做不了的,无论从小型团队到大型团队 Jenkins 都可以搞定。不过如果要大规模使用,还是需要有人力来学习和维护。
-
TeamCity:TeamCity与Jenkins相比使用更加友好,也是一个高度可定制化的平台。但是用的人多了,TeamCity就要收费了。
-
Strider:Strider 是一个开源的持续集成和部署平台,使用 Node.js 实现,存储使用的是 MongoDB,BSD 许可证,概念上类似 Travis 和Jenkins。
-
GitLabCI:从GitLab8.0开始,GitLab CI 就已经集成在 GitLab,我们只要在项目中添加一个 .gitlab-ci.yml 文件,然后添加一个Runner,即可进行持续集成。并且 Gitlab 与 Docker 有着非常好的相互协作的能力。免费版与付费版本不同可以参见这里:https://about.gitlab.com/products/feature-comparison/
-
Travis:Travis 和 Github 强关联;闭源代码使用 SaaS 还需考虑安全问题;不可定制;开源项目免费,其它收费;
-
Go: Go是ThoughtWorks公司最新的Cruise Control的化身。除了 ThoughtWorks 提供的商业支持,Go是免费的。它适用于Windows,Mac和各种Linux发行版。
12、日志系统
日志系统一般包括打日志,采集,中转,收集,存储,分析,呈现,搜索还有分发等。一些特殊的如染色,全链条跟踪或者监控都可能需要依赖于日志系统实现。日志系统的建设不仅仅是工具的建设,还有规范和组件的建设,最好一些基本的日志在框架和组件层面加就行了,比如全链接跟踪之类的。
对于常规日志系统ELK能满足大部分的需求,ELK 包括如下组件:
-
ElasticSearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
-
Logstash 是一个完全开源的工具,它可以对你的日志进行收集、分析,并将其存储供以后使用。
-
Kibana 是一个开源和免费的工具,它可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
Filebeat 已经完全替代了 Logstash-Forwarder 成为新一代的日志采集器,同时鉴于它轻量、安全等特点,越来越多人开始使用它。
因为免费的 ELK 没有任何安全机制,所以这里使用了 Nginx 作反向代理,避免用户直接访问 Kibana 服务器。加上配置 Nginx 实现简单的用户认证,一定程度上提高安全性。另外,Nginx 本身具有负载均衡的作用,能够提高系统访问性能。ELK 架构如图4所示:
对于有实时计算的需求,可以使用 Flume+Kafka+Storm+MySQL方案,一 般架构如图5所示:
【图5】 实时分析系统架构图
其中:
-
Flume 是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的日志收集系统,支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume 提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力。
-
Kafka 是由 Apache 软件基金会开发的一个开源流处理平台,由 Scala 和 Java 编写。其本质上是一个“按照分布式事务日志架构的大规模发布/订阅消息队列”,它以可水平扩展和高吞吐率而被广泛使用。
Kafka 追求的是高吞吐量、高负载,Flume 追求的是数据的多样性,二者结合起来简直完美。
13、监控系统
监控系统只包含与后台相关的,这里主要是两块,一个是操作系统层的监控,比如机器负载,IO,网络流量,CPU,内存等操作系统指标的监控。另一个是服务质量和业务质量的监控,比如服务的可用性,成功率,失败率,容量,QPS 等等。常见业务的监控系统先有操作系统层面的监控(这部分较成熟),然后扩展出其它监控,如 zabbix,小米的 open-falcon,也有一出来就是两者都支持的,如 prometheu s。如果对业务监控要求比较高一些,在创业选型中建议可以优先考虑 prometheus。这里有一个有趣的分布,如图6所示:
监控系统只包含与后台相关的,这里主要是两块,一个是操作系统层的监控,比如机器负载,IO,网络流量,CPU,内存等操作系统指标的监控。另一个是服务质量和业务质量的监控,比如服务的可用性,成功率,失败率,容量,QPS 等等。常见业务的监控系统先有操作系统层面的监控(这部分较成熟),然后扩展出其它监控,如 zabbix,小米的 open-falcon,也有一出来就是两者都支持的,如 prometheus。如果对业务监控要求比较高一些,在创业选型中建议可以优先考虑 prometheus。这里有一个有趣的分布,如图6所示:
亚洲区域使用 zabbix 较多,而美洲和欧洲,以及澳大利亚使用 prometheus 居多,换句话说,英文国家地区(发达国家?)使用prometheus 较多。
Prometheus 是由 SoundCloud 开发的开源监控报警系统和时序列数据库( TSDB )。Prometheus 使用 Go 语言开发,是 Google BorgMon 监控系统的开源版本。相对于其它监控系统使用的 push 数据的方式,prometheus 使用的是 pull 的方式,其架构如图7所示:
如上图所示,prometheus 包含的主要组件如下:
-
Prometheus Server 主要负责数据采集和存储,提供 PromQL 查询语言的支持。Server 通过配置文件、文本文件、Zookeeper、Consul、DNS SRV Lookup等方式指定抓取目标。根据这些目标会,Server 定时去抓取 metric s数据,每个抓取目标需要暴露一个 http 服务的接口给它定时抓取。
-
客户端SDK:官方提供的客户端类库有 go、java、scala、python、ruby,其他还有很多第三方开发的类库,支持 nodejs、php、erlang 等。
-
Push Gateway 支持临时性 Job 主动推送指标的中间网关。
-
Exporter Exporter 是Prometheus的一类数据采集组件的总称。它负责从目标处搜集数据,并将其转化为 Prometheus 支持的格式。与传统的数据采集组件不同的是,它并不向中央服务器发送数据,而是等待中央服务器主动前来抓取。Prometheus提供多种类型的 Exporter 用于采集各种不同服务的运行状态。目前支持的有数据库、硬件、消息中间件、存储系统、HTTP服务器、JMX等。
-
alertmanager:是一个单独的服务,可以支持 Prometheus 的查询语句,提供十分灵活的报警方式。
-
Prometheus HTTP API的查询方式,自定义所需要的输出。
-
Grafana 是一套开源的分析监视平台,支持 Graphite, InfluxDB, OpenTSDB, Prometheus, Elasticsearch, CloudWatch 等数据源,其 UI 非常漂亮且高度定制化。
创业公司选择 Prometheus + Grafana 的方案,再加上统一的服务框架(如 gRPC ),可以满足大部分中小团队的监控需求。
14、配置系统
随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、降级开关,灰度开关,参数的配置、服务器的地址、数据库配置等等,除此之外,对后台程序配置的要求也越来越高:配置修改后实时生效,灰度发布,分环境、分用户,分集群管理配置,完善的权限、审核机制等等,在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求,业界有如下两种方案:
-
基于 zk 和 etcd,支持界面和 api ,用数据库来保存版本历史,预案,走审核流程,最后下发到 zk 或 etcd 这种有推送能力的存储里(服务注册本身也是用 zk 或 etcd,选型就一块了)。客户端都直接和 zk 或 etcd 打交道。至于灰度发布,各家不同,有一种实现是同时发布一个需要灰度的 IP 列表,客户端监听到配置节点变化时,对比一下自己是否属于该列表。PHP 这种无状态的语言和其他 zk/etcd 不支持的语言,只好自己在客户端的机器上起一个 Agent 来监听变化,再写到配置文件或共享内存,如 360 的 Qconf。
-
基于运维自动化的配置文件的推送,审核流程,配置数据管理和方案一类似,下发时生成配置文件,基于运维自动化工具如Puppet,Ansible 推送到每个客户端,而应用则定时重新读取这个外部的配置文件,灰度发布在下发配置时指定IP列表。
创业公司前期不需要这种复杂,直接上 zk,弄一个界面管理 zk 的内容,记录一下所有人的操作日志,程序直连 zk,或者或者用Qconf 等基于 zk 优化后的方案。
15、发布系统/部署系统
从软件生产的层面看,代码到最终服务的典型流程如图8所示:
【图8】 流程图
从上图中可以看出,从开发人员写下代码到服务最终用户是一个漫长过程,整体可以分成三个阶段:
-
从代码(Code)到成品库(Artifact)这个阶段主要对开发人员的代码做持续构建并把构建产生的制品集中管理,是为部署系统准备输入内容的阶段。
-
从制品到可运行服务 这个阶段主要完成制品部署到指定环境,是部署系统的最基本工作内容。
-
从开发环境到最终生产环境 这个阶段主要完成一次变更在不同环境的迁移,是部署系统上线最终服务的核心能力。
发布系统集成了制品管理,发布流程,权限控制,线上环境版本变更,灰度发布,线上服务回滚等几方面的内容,是开发人员工作结晶最终呈现的重要通道。开源的项目中没有完全满足的项目,如果只是 Web 类项目,Walle、Piplin 都是可用的,但是功能不太满足,创业初期可以集成 Jenkins + Gitlab + Walle (可以考虑两天时间完善一下),以上方案基本包括 制品管理,发布流程,权限控制,线上环境版本变更,灰度发布(需要自己实现),线上服务回滚等功能。
16、跳板机
跳板机面对的是需求是要有一种能满足角色管理与授权审批、信息资源访问控制、操作记录和审计、系统变更和维护控制要求,并生成一些统计报表配合管理规范来不断提升IT内控的合规性,能对运维人员操作行为的进行控制和审计,对误操作、违规操作导致的操作事故,快速定位原因和责任人。其功能模块一般包括:帐户管理、认证管理、授权管理、审计管理等等
开源项目中,Jumpserver 能够实现跳板机常见需求,如授权、用户管理、服务器基本信息记录等,同时又可批量执行脚本等功能;其中录像回放、命令搜索、实时监控等特点,又能帮助运维人员回溯操作历史,方便查找操作痕迹,便于管理其他人员对服务器的操作控制。
17、机器管理
机器管理的工具选择的考量可以包含以下三个方面:
a. 是否简单,是否需要每台机器部署agent(客户端)
b. 语言的选择(puppet/chef vs ansible/saltstack)开源技术,不看官网不足以熟练,不懂源码不足以精通;Puppet、Chef基于Ruby开发,ansible、saltstack基于python开发的
c. 速度的选择(ansiblevssaltstack) ansible基于SSH协议传输数据,Saltstack使用消息队列zeroMQ传输数据;大规模并发的能力对于几十台-200台规模的兄弟来讲,ansible的性能也可接受,如果一次操作上千台,用salt好一些。
如图9所示:
【图9 机器管理软件对比
一般创业公司选择 Ansible 能解决大部问题,其简单,不需要安装额外的客户端,可以从命令行来运行,不需要使用配置文件。至于比较复杂的任务,Ansible 配置通过名为 Playbook 的配置文件中的 YAML 语法来加以处理。Playbook 还可以使用模板来扩展其功能。
二、创业公司的选择
1、选择合适的语言
-
选择团队熟悉的/能掌控的,创业公司人少事多,无太多冗余让研发团队熟悉新的语言,能快速上手,能快速出活,出了问题能快速解决的问题的语言才是好的选择。
-
选择更现代一些的,这里的现代是指语言本身已经完成一些之前需要特殊处理的特性,比如内存管理,线程等等。
-
选择开源轮子多的或者社区活跃度高的,这个原则是为了保证在开发过程中减少投入,有稳定可靠的轮子可以使用,遇到问题可以在网上快速搜索到答案。
-
选择好招人的 一门合适的语言会让创业团队减少招聘的成本,快速招到合适的人。
-
选择能让人有兴趣的 与上面一点相关,让人感兴趣,在后面留人时有用。
2、选择合适的组件和云服务商
-
选择靠谱的云服务商;
-
选择云服务商的组件;
-
选择成熟的开源组件,而不是最新出的组件;
-
选择采用在一线互联网公司落地并且开源的,且在社区内形成良好口碑的产品;
-
开源社区活跃度;
选择靠谱的云服务商,其实这是一个伪命题,因为哪个服务商都不靠谱,他们所承诺的那些可用性问题基本上都会在你的身上发生,这里我们还是需要自己做一些工作,比如多服务商备份,如用CDN,你一定不要只选一家,至少选两家,一个是灾备,保持后台切换的能力,另一个是多点覆盖,不同的服务商在CDN节点上的资源是不一样的。
选择了云服务商以后,就会有很多的产品你可以选择了,比较存储,队列这些都会有现成的产品,这个时候就纠结了,是用呢?还是自己在云主机上搭呢?在这里我的建议是前期先用云服务商的,大了后再自己搞,这样会少掉很多运维的事情,但是这里要多了解一下云服务商的组件特性以及一些坑,比如他们内网会经常断开,他们升级也会闪断,所以在业务侧要做好容错和规避。
关于开源组件,尽可能选择成熟的,成熟的组件经历了时间的考验,基本不会出大的问题,并且有成套的配套工具,出了问题在网上也可以很快的找到答案,你所遇到的坑基本上都有人踩过了。
3、制定流程和规范
-
制定开发的规范,代码及代码分支管理规范,关键性代码仅少数人有权限;
-
制定发布流程规范,从发布系统落地;
-
制定运维规范;
-
制定数据库操作规范,收拢数据库操作权限;
-
制定告警处理流程,做到告警有人看有人处理;
-
制定汇报机制,晨会/周报;
4、自研和选型合适的辅助系统
所有的流程和规范都需要用系统来固化,否则就是空中楼阁,如何选择这些系统呢?参照上个章节咱们那些开源的,对比一下选择的语言,组件之类的,选择一个最合适的即可。
比如项目管理的,看下自己是什么类型的公司,开发的节奏是怎样的,瀑布,敏捷的 按项目划分,还是按客户划分等等,平时是按项目组织还是按任务组织等等
比如日志系统,之前是打的文本,那么上一个elk,规范化一些日志组件,基本上很长一段时间内不用考虑日志系统的问题,最多拆分一下或者扩容一下。等到组织大了,自己搞一个日志系统。
比如代码管理,项目管理系统这些都放内网,安全,在互联网公司来说,属于命脉了,命脉的东西还是放在别人拿不到或很难拿到的地方会比较靠谱一些。
5、选择过程中需要思考的问题
技术栈的选择有点像做出了某种承诺,在一定的时间内这种承诺没法改变,于是我们需要在选择的时候有一些思考。
看前面内容,有一个词出现了三次,合适,选择是合适的,不是最好,也不是最新,是最合适,适合是针对当下,这种选择是最合适的吗?比如用 Go 这条线的东西,技术比较新,业界组件储备够吗?组织内的人员储备够吗?学习成本多少?写出来的东西能满足业务性能要求吗?能满足时间要求吗?
向未来看一眼,在一年到三年内,我们需要做出改变吗?技术栈要做根本性的改变吗?如果组织发展很快,在 200 人,500 人时,现有的技术栈是否需要大动?
创业过程中需要考虑成本,这里的成本不仅仅是花费多少钱,付出多少工资,有时更重要的是时间成本,很多业务在创业时大家拼的就是时间,就是一个时间窗,过了就没你什么事儿了。
三、基于云的创业公司后台技术架构
结合上面内容的考量,在对一个个系统和组件的分析选型之后,以云服务为基础,一个创业公司的后台技术架构建议如图10所示:
【图10】 后台技术架构
参考资料
http://database.51cto.com/art/201109/291781.htm
https://zh.wikipedia.org/wiki/Kafka
https://prometheus.io/docs/introduction/overview/
http://deadline.top/2016/11/23/配置中心那点事/
http://blog.fit2cloud.com/2016/01/26/deployment-system.html
来源:本文转自公众号智能推荐系统
原文链接:https://mp.weixin.qq.com/s/8eJhR3rWfab_8V2KaSpJOA
点击上方视频 GOPS 看点提前知
近期好文:
一文搞懂 DNS 基础知识,收藏起来有备无患~
“高效运维”公众号诚邀广大技术人员投稿,

点击上方蓝色“石杉的架构笔记”,选择“设为星标” 回复“PDF”获取独家整理的学习资料!

长按扫描上方二维码一元购买
阅读本文大约需要 13 分钟。
现如今 Redis 变得越来越流行,几乎在很多项目中都要被用到,不知道你在使用 Redis 时,有没有思考过,Redis 到底是如何稳定、高性能地提供服务的?
你也可以尝试回答一下以下这些问题:
-
我使用 Redis 的场景很简单,只使用单机版 Redis 会有什么问题吗? -
我的 Redis 故障宕机了,数据丢失了怎么办?如何能保证我的业务应用不受影响? -
为什么需要主从集群?它有什么优势? -
什么是分片集群?我真的需要分片集群吗? -
…
如果你对 Redis 已经有些了解,肯定也听说过数据持久化、主从复制、哨兵这些概念,它们之间又有什么区别和联系呢?
如果你存在这样的疑惑,这篇文章,我会从 0 到 1,再从 1 到 N,带你一步步构建出一个稳定、高性能的 Redis 集群。
在这个过程中,你可以了解到 Redis 为了做到稳定、高性能,都采取了哪些优化方案,以及为什么要这么做?
掌握了这些原理,这样平时你在使用 Redis 时,就能够做到「游刃有余」。
这篇文章干货很多,希望你可以耐心读完。

从最简单的开始:单机版 Redis
首先,我们从最简单的场景开始。
假设现在你有一个业务应用,需要引入 Redis 来提高应用的性能,此时你可以选择部署一个单机版的 Redis 来使用,就像这样:

这个架构非常简单,你的业务应用可以把 Redis 当做缓存来使用,从 MySQL 中查询数据,然后写入到 Redis 中,之后业务应用再从 Redis 中读取这些数据,由于 Redis 的数据都存储在内存中,所以这个速度飞快。
如果你的业务体量并不大,那这样的架构模型基本可以满足你的需求。是不是很简单?
随着时间的推移,你的业务体量逐渐发展起来了,Redis 中存储的数据也越来越多,此时你的业务应用对 Redis 的依赖也越来越重。
但是,突然有一天,你的 Redis 因为某些原因宕机了,这时你的所有业务流量,都会打到后端 MySQL 上,这会导致你的 MySQL 压力剧增,严重的话甚至会压垮 MySQL。

这时你应该怎么办?
我猜你的方案肯定是,赶紧重启 Redis,让它可以继续提供服务。
但是,因为之前 Redis 中的数据都在内存中,尽管你现在把 Redis 重启了,之前的数据也都丢失了。重启后的 Redis 虽然可以正常工作,但是由于 Redis 中没有任何数据,业务流量还是都会打到后端 MySQL 上,MySQL 的压力还是很大。
这可怎么办?你陷入了沉思。
有没有什么好的办法解决这个问题?
既然 Redis 只把数据存储在内存中,那是否可以把这些数据也写一份到磁盘上呢?
如果采用这种方式,当 Redis 重启时,我们把磁盘中的数据快速恢复到内存中,这样它就可以继续正常提供服务了。
是的,这是一个很好的解决方案,这个把内存数据写到磁盘上的过程,就是「数据持久化」。
数据持久化:有备无患
现在,你设想的 Redis 数据持久化是这样的:

但是,数据持久化具体应该怎么做呢?
我猜你最容易想到的一个方案是,Redis 每一次执行写操作,除了写内存之外,同时也写一份到磁盘上,就像这样:

没错,这是最简单直接的方案。
但仔细想一下,这个方案有个问题:客户端的每次写操作,既需要写内存,又需要写磁盘,而写磁盘的耗时相比于写内存来说,肯定要慢很多!这势必会影响到 Redis 的性能。
如何规避这个问题?
我们可以这样优化:Redis 写内存由主线程来做,写内存完成后就给客户端返回结果,然后 Redis 用另一个线程去写磁盘,这样就可以避免主线程写磁盘对性能的影响。
这确实是一个好方案。除此之外,我们可以换个角度,思考一下还有什么方式可以持久化数据?
这时你就要结合 Redis 的使用场景来考虑了。
回忆一下,我们在使用 Redis 时,通常把它用作什么场景?
是的,缓存。
把 Redis 当做缓存来用,意味着尽管 Redis 中没有保存全量数据,对于不在缓存中的数据,我们的业务应用依旧可以通过查询后端数据库得到结果,只不过查询后端数据的速度会慢一点而已,但对业务结果其实是没有影响的。
基于这个特点,我们的 Redis 数据持久化还可以用「数据快照」的方式来做。
那什么是数据快照呢?
简单来讲,你可以这么理解:
-
你把 Redis 想象成一个水杯,向 Redis 写入数据,就相当于往这个杯子里倒水 -
此时你拿一个相机给这个水杯拍一张照片,拍照的这一瞬间,照片中记录到这个水杯中水的容量,就是水杯的数据快照

也就是说,Redis 的数据快照,是记录某一时刻下 Redis 中的数据,然后只需要把这个数据快照写到磁盘上就可以了。
它的优势在于,只在需要持久化时,把数据「一次性」写入磁盘,其它时间都不需要操作磁盘。
基于这个方案,我们可以定时给 Redis 做数据快照,把数据持久化到磁盘上。

其实,上面说的这些持久化方案,就是 Redis 的「RDB」和「AOF」:
-
RDB:只持久化某一时刻的数据快照到磁盘上(创建一个子进程来做) -
AOF:每一次写操作都持久到磁盘(主线程写内存,根据策略可以配置由主线程还是子线程进行数据持久化)
它们的区别除了上面讲到的,还有以下特点:
-
RDB 采用二进制 + 数据压缩的方式写磁盘,这样文件体积小,数据恢复速度也快 -
AOF 记录的是每一次写命令,数据最全,但文件体积大,数据恢复速度慢
如果让你来选择持久化方案,你可以这样选择:
-
如果你的业务对于数据丢失不敏感,采用 RDB 方案持久化数据 -
如果你的业务对数据完整性要求比较高,采用 AOF 方案持久化数据
假设你的业务对 Redis 数据完整性要求比较高,选择了 AOF 方案,那此时你又会遇到这些问题:
-
AOF 记录每一次写操作,随着时间增长,AOF 文件体积会越来越大 -
这么大的 AOF 文件,在数据恢复时变得非常慢
这怎么办?数据完整性要求变高了,恢复数据也变困难了?有没有什么方法,可以缩小文件体积?提升恢复速度呢?
我们继续来分析 AOF 的特点。
由于 AOF 文件中记录的都是每一次写操作,但对于同一个 key 可能会发生多次修改,我们只保留最后一次被修改的值,是不是也可以?
是的,这就是我们经常听到的「AOF rewrite」,你也可以把它理解为 AOF 「瘦身」。
我们可以对 AOF 文件定时 rewrite,避免这个文件体积持续膨胀,这样在恢复时就可以缩短恢复时间了。

再进一步思考一下,还有没有办法继续缩小 AOF 文件?
回顾一下我们前面讲到的,RDB 和 AOF 各自的特点:
-
RDB 以二进制 + 数据压缩方式存储,文件体积小 -
AOF 记录每一次写命令,数据最全
我们可否利用它们各自的优势呢?
当然可以,这就是 Redis 的「混合持久化」。
具体来说,当 AOF rewrite 时,Redis 先以 RDB 格式在 AOF 文件中写入一个数据快照,再把在这期间产生的每一个写命令,追加到 AOF 文件中。因为 RDB 是二进制压缩写入的,这样 AOF 文件体积就变得更小了。

此时,你在使用 AOF 文件恢复数据时,这个恢复时间就会更短了!
Redis 4.0 以上版本才支持混合持久化。
这么一番优化,你的 Redis 再也不用担心实例宕机了,当发生宕机时,你就可以用持久化文件快速恢复 Redis 中的数据。
但这样就没问题了吗?
仔细想一下,虽然我们已经把持久化的文件优化到最小了,但在恢复数据时依旧是需要时间的,在这期间你的业务应用还是会受到影响,这怎么办?
我们来分析有没有更好的方案。
一个实例宕机,只能用恢复数据来解决,那我们是否可以部署多个 Redis 实例,然后让这些实例数据保持实时同步,这样当一个实例宕机时,我们在剩下的实例中选择一个继续提供服务就好了。
没错,这个方案就是接下来要讲的「主从复制:多副本」。
主从复制:多副本
此时,你可以部署多个 Redis 实例,架构模型就变成了这样:

我们这里把实时读写的节点叫做 master,另一个实时同步数据的节点叫做 slave。
采用多副本的方案,它的优势是:
-
缩短不可用时间:master 发生宕机,我们可以手动把 slave 提升为 master 继续提供服务 -
提升读性能:让 slave 分担一部分读请求,提升应用的整体性能

这个方案不错,不仅节省了数据恢复的时间,还能提升性能,那它有什么问题吗?
你可以思考一下。
其实,它的问题在于:当 master 宕机时,我们需要「手动」把 slave 提升为 master,这个过程也是需要花费时间的。
虽然比恢复数据要快得多,但还是需要人工介入处理。一旦需要人工介入,就必须要算上人的反应时间、操作时间,所以,在这期间你的业务应用依旧会受到影响。
怎么解决这个问题?我们是否可以把这个切换的过程,变成自动化呢?
对于这种情况,我们需要一个「故障自动切换」机制,这就是我们经常听到的「哨兵」所具备的能力。
哨兵:故障自动切换
现在,我们可以引入一个「观察者」,让这个观察者去实时监测 master 的健康状态,这个观察者就是「哨兵」。
具体如何做?
-
哨兵每间隔一段时间,询问 master 是否正常 -
master 正常回复,表示状态正常,回复超时表示异常 -
哨兵发现异常,发起主从切换

有了这个方案,就不需要人去介入处理了,一切就变得自动化了,是不是很爽?
但这里还有一个问题,如果 master 状态正常,但这个哨兵在询问 master 时,它们之间的网络发生了问题,那这个哨兵可能会误判。

这个问题怎么解决?
答案是,我们可以部署多个哨兵,让它们分布在不同的机器上,它们一起监测 master 的状态,流程就变成了这样:
-
多个哨兵每间隔一段时间,询问 master 是否正常 -
master 正常回复,表示状态正常,回复超时表示异常 -
一旦有一个哨兵判定 master 异常(不管是否是网络问题),就询问其它哨兵,如果多个哨兵(设置一个阈值)都认为 master 异常了,这才判定 master 确实发生了故障 -
多个哨兵经过协商后,判定 master 故障,则发起主从切换
所以,我们用多个哨兵互相协商来判定 master 的状态,这样一来,就可以大大降低误判的概率。
哨兵协商判定 master 异常后,这里还有一个问题:由哪个哨兵来发起主从切换呢?
答案是,选出一个哨兵「领导者」,由这个领导者进行主从切换。
问题又来了,这个领导者怎么选?
想象一下,在现实生活中,选举是怎么做的?
是的,投票。
在选举哨兵领导者时,我们可以制定这样一个选举规则:
-
每个哨兵都询问其它哨兵,请求对方为自己投票 -
每个哨兵只投票给第一个请求投票的哨兵,且只能投票一次 -
首先拿到超过半数投票的哨兵,当选为领导者,发起主从切换
其实,这个选举的过程就是我们经常听到的:分布式系统领域中的「共识算法」。
什么是共识算法?
我们在多个机器部署哨兵,它们需要共同协作完成一项任务,所以它们就组成了一个「分布式系统」。
在分布式系统领域,多个节点如何就一个问题达成共识的算法,就叫共识算法。
在这个场景下,多个哨兵共同协商,选举出一个都认可的领导者,就是使用共识算法完成的。
这个算法还规定节点的数量必须是奇数个,这样可以保证系统中即使有节点发生了故障,剩余超过「半数」的节点状态正常,依旧可以提供正确的结果,也就是说,这个算法还兼容了存在故障节点的情况。
共识算法在分布式系统领域有很多,例如 Paxos、Raft,哨兵选举领导者这个场景,使用的是 Raft 共识算法,因为它足够简单,且易于实现。
现在,我们用多个哨兵共同监测 Redis 的状态,这样一来,就可以避免误判的问题了,架构模型就变成了这样:

好了,到这里我们先小结一下。
你的 Redis 从最简单的单机版,经过数据持久化、主从多副本、哨兵集群,这一路优化下来,你的 Redis 不管是性能还是稳定性,都越来越高,就算节点发生故障,也不用担心了。
你的 Redis 以这样的架构模式部署,基本上就可以稳定运行很长时间了。
…
随着时间的发展,你的业务体量开始迎来了爆炸性增长,此时你的架构模型,还能够承担这么大的流量吗?
我们一起来分析一下:
-
稳定性:Redis 故障宕机,我们有哨兵 + 副本,可以自动完成主从切换 -
性能:读请求量增长,我们可以再部署多个 slave,读写分离,分担读压力 -
性能:写请求量增长,但我们只有一个 master 实例,这个实例达到瓶颈怎么办?
看到了么,当你的写请求量越来越大时,一个 master 实例可能就无法承担这么大的写流量了。
要想完美解决这个问题,此时你就需要考虑使用「分片集群」了。
分片集群:横向扩展
什么是「分片集群」?
简单来讲,一个实例扛不住写压力,那我们是否可以部署多个实例,然后把这些实例按照一定规则组织起来,把它们当成一个整体,对外提供服务,这样不就可以解决集中写一个实例的瓶颈问题吗?
所以,现在的架构模型就变成了这样:

现在问题又来了,这么多实例如何组织呢?
我们制定规则如下:
-
每个节点各自存储一部分数据,所有节点数据之和才是全量数据 -
制定一个路由规则,对于不同的 key,把它路由到固定一个实例上进行读写
而分片集群根据路由规则所在位置的不同,还可以分为两大类:
-
客户端分片 -
服务端分片
客户端分片指的是,key 的路由规则放在客户端来做,就是下面这样:

这个方案的缺点是,客户端需要维护这个路由规则,也就是说,你需要把路由规则写到你的业务代码中。
如何做到不把路由规则耦合在业务代码中呢?
你可以这样优化,把这个路由规则封装成一个模块,当需要使用时,集成这个模块就可以了。
这就是 Redis Cluster 的采用的方案。

Redis Cluster 内置了哨兵逻辑,无需再部署哨兵。
当你使用 Redis Cluster 时,你的业务应用需要使用配套的 Redis SDK,这个 SDK 内就集成好了路由规则,不需要你自己编写了。
再来看服务端分片。
这种方案指的是,路由规则不放在客户端来做,而是在客户端和服务端之间增加一个「中间代理层」,这个代理就是我们经常听到的 Proxy。
而数据的路由规则,就放在这个 Proxy 层来维护。
这样一来,你就无需关心服务端有多少个 Redis 节点了,只需要和这个 Proxy 交互即可。
Proxy 会把你的请求根据路由规则,转发到对应的 Redis 节点上,而且,当集群实例不足以支撑更大的流量请求时,还可以横向扩容,添加新的 Redis 实例提升性能,这一切对于你的客户端来说,都是透明无感知的。
业界开源的 Redis 分片集群方案,例如 Twemproxy、Codis 就是采用的这种方案。

分片集群在数据扩容时,还涉及到了很多细节,这块内容不是本文章重点,所以暂不详述。
至此,当你使用分片集群后,对于未来更大的流量压力,都可以从容面对了!
总结
好了,我们来总结一下,我们是如何一步步构建一个稳定、高性能的 Redis 集群的。
首先,在使用最简单的单机版 Redis 时,我们发现当 Redis 故障宕机后,数据无法恢复的问题,因此我们想到了「数据持久化」,把内存中的数据也持久化到磁盘上一份,这样 Redis 重启后就可以从磁盘上快速恢复数据。
在进行数据持久化时,我们又面临如何更高效地将数据持久化到磁盘的问题。之后我们发现 Redis 提供了 RDB 和 AOF 两种方案,分别对应了数据快照和实时的命令记录。当我们对数据完整性要求不高时,可以选择 RDB 持久化方案。如果对于数据完整性要求较高,那么可以选择 AOF 持久化方案。
但是我们又发现,AOF 文件体积会随着时间增长变得越来越大,此时我们想到的优化方案是,使用 AOF rewrite 的方式对其进行瘦身,减小文件体积,再后来,我们发现可以结合 RDB 和 AOF 各自的优势,在 AOF rewrite 时使用两者结合的「混合持久化」方式,又进一步减小了 AOF 文件体积。
之后,我们发现尽管可以通过数据恢复的方式还原数据,但恢复数据也是需要花费时间的,这意味着业务应用还是会受到影响。我们进一步优化,采用「多副本」的方案,让多个实例保持实时同步,当一个实例故障时,可以手动把其它实例提升上来继续提供服务。
但是这样也有问题,手动提升实例上来,需要人工介入,人工介入操作也需要时间,我们开始想办法把这个流程变得自动化,所以我们又引入了「哨兵」集群,哨兵集群通过互相协商的方式,发现故障节点,并可以自动完成切换,这样就大幅降低了对业务应用的影响。
最后,我们把关注点聚焦在如何支撑更大的写流量上,所以,我们又引入了「分片集群」来解决这个问题,让多个 Redis 实例分摊写压力,未来面对更大的流量,我们还可以添加新的实例,横向扩展,进一步提升集群的性能。
至此,我们的 Redis 集群才得以长期稳定、高性能的为我们的业务提供服务。
这里我画了一个思维导图,方便你更好地去理解它们之间的关系,以及演化的过程。

后记
看到这里,我想你对如何构建一个稳定、高性能的 Redis 集群问题时,应该会有自己的见解了。
其实,这篇文章所讲的优化思路,围绕的主题就是「架构设计」的核心思想:
-
高性能:读写分离、分片集群 -
高可用:数据持久化、多副本、故障自动切换 -
易扩展:分片集群、横向扩展
当我们讲到哨兵集群、分片集群时,这还涉及到了「分布式系统」相关的知识:
-
分布式共识:哨兵领导者选举 -
负载均衡:分片集群数据分片、数据路由
当然,除了 Redis 之外,对于构建任何一个数据集群,你都可以沿用这个思路去思考、去优化,看看它们到底是如何做的。
例如当你在使用 MySQL 时,你可以思考一下 MySQL 与 Redis 有哪些不同?MySQL 为了做到高性能、高可用,又是如何做的?其实思路都是类似的。
我们现在到处可见分布式系统、数据集群,我希望通过这篇文章,你可以理解这些软件是如何一步步演化过来的,在演化过程中,它们遇到了哪些问题,为了解决这些问题,这些软件的设计者设计了怎样的方案,做了哪些取舍?
你只有了解了其中的原理,掌握了分析问题、解决问题的能力,这样在以后的开发过程中,或是学习其它优秀软件时,就能快速地找到「重点」,在最短的时间掌握它,并能在实际应用中发挥它们的优势。
其实这个思考过程,也是做「架构设计」的思路。在做软件架构设计时,你面临的场景就是发现问题、分析问题、解决问题,一步步去演化、升级你的架构,最后在性能、可靠性方面达到一个平衡。虽然各种软件层出不穷,但架构设计的思想不会变,我希望你真正吸收的是这些思想,这样才可以做到以不变应万变。


GGV有话说:
《GGV中美企服20年采访札记》系GGV过去20年中,在企业服务行业大浪淘金后的成果和收获,通过GGV投资人与企业创始人或高管的对谈,呈现其成功背后的商业逻辑与格局。
本系列共15篇章,聚焦云基础设施、企业软件消费化以及电商服务三大板块。每一篇都回顾了企业生根发芽的发展进程,也展示出企业破土而出的精彩时刻;翻阅历史的同时,思考当下的步伐,为各领域致力于开拓创新的创业者和试图改变世界的开荒人提供一份宝贵的创业启示录。
《GGV中美企服20年采访札记》的第四篇,我们将和你讲述我们为什么看好开源商业?
编辑:张颖
2015年,PingCAP 创始人兼 CEO刘奇、PingCAP 联合创始人兼 CTO黄东旭、PingCAP 联合创始人兼CFO崔秋三人创办了PingCAP,主打产品是分布式关系型数据库产品TiDB。在他们的商业版图里,“开源”(Open-Source)极其重要,TiDB的发起、完善等各环节均依托于开源。
这使PingCAP成为了当年中国极其少见的“出生即开源”并以创业者身份运营的企业之一,它的源代码从始至终都可供任何程序员查看和使用。在全球最大开源开发者社区GitHub上,TiDB共计获得27000+的Star,集合了超过1200位开源代码贡献者,是基础架构领域的明星开源项目。
虽然在程序员群体里口碑爆棚,但对于PingCAP是否能成为一家伟大的企业,业界仍在持续观察,在很多人眼中,这些“开源英雄”能否成功,还要看他们在商业化的成就。
开源的商业化从来都不是一件容易的事情。创办3年后,PingCAP的商业化进程开始逐渐加速。在CEO刘奇的介绍中,截至2020年底,它拥有超过1500个客户,其中付费客户超过百家,中国客户最高客单价规模为百万人民币,尤以中国银行、中国人寿、国泰君安、陆金所等金融企业为主要付费客户。2020年PingCAP完成了2.7亿美元的D轮融资,从融资阶段到额度,都是中国创办的开源产品之最。
GGV纪源资本管理合伙人符绩勋认为,中国公有云化现在进入到0到1的成长阶段,这意味着企业互联网和SaaS服务的崛起。SaaS公司现在越来越多在强调SaaS属性和功能,真正做到了软件即服务。中国整体已经在往积极的方向去努力,我们也看到一大批企业服务公司业务的增长在加快,其中更包括开源产品的进化和迭代。
作为PingCAP的投资机构,GGV纪源资本一直是开源产品的坚定支持者。在海外,GGV投资了全球最顶尖的云公司之一HashiCorp,它的开源软件每年下载量接近8000万,全球500强企业里有100家以上为其客户,最近一轮的估值高达51亿美元;GGV也投资了人工智能和机器学习框架开发商Streamlit,在程序员群体中熟知的API自动化服务Kong,还有总部位于柏林的开源神经搜索初创公司Jina AI。
而在中国,除PingCAP之外,GGV纪源资本企业服务团队分别投资了2014年开始正式商业化运作的RT-Thread以及2019年正式开源的涛思数据。
如果说软件正在吞噬世界,那么开源则正在改写整个软件界。
PingCAP走过的路:
“那帮理想主义者还没饿死”
当一款产品在C端迅速走红或出圈,随后带来的最大风险是什么?
在拥有14亿人口的中国市场,潜在的最大风险其实是数据库宕机。
数据库作为快速成长企业当中最容易滋生痛点的基础设施,在数据暴涨或难以预知数据爆发节点的情况下,一旦数据库出现问题,就如同飞机在飞行过程中不得不更换引擎。
PingCAP团队5年前创办时预测:大数据驱动下,全球数据量过载将是必然趋势,单机MySQL数据库难以满足企业要求,更多企业将选择一款云端的弹性化数据库。这成为了PingCAP创立的初衷:PingCAP立志为这些快速成长的企业做好云端的数据库服务。
而此时,数据库市场还是Oracle等巨头的天下,做数据库研发的创业公司凤毛麟角,用PingCAP投资方、GGV纪源资本执行董事吴陈尧的评价来概括:“想攀登珠峰的人并不多”。
PingCAP海外的支持者分布图
更有意思的是,从创办第一天起,PingCAP就公开了源代码,PingCAP CEO刘奇介绍,所有贡献者都可以提交代码修改,并有可能改变PingCAP的主干代码,这些代码修改形成一个大循环,迅速更新和完善数据库性能。
这也是PingCAP另一个颇为“另类”的决定:开源。
在开源社区这个“委员会”之中,任何企业的程序员都能成为开源社区的贡献者,而这些企业就像派驻了一位代表加入这个“委员会”,他们的意见一定程度上代表了自己所在企业的思考与需求,他们的修改造就了PingCAP的迭代升级。
2015年的互联网行业,举起开源这杆大旗的人并不多,PingCAP为此花费了大量精力,主办了以交流国内外基础架构技术为主题的InfraMeetup,如今算下来,总计举办次数已经超过130期。
在创业者后辈的眼中,PingCAP的成功是有自己的独特策略和打法的。这套策略并不比别人高深多少,也并非像电影里的绝世高手突然机缘巧合收获了一份武功秘籍,而是来源于坚持不懈、源源不断地在几件重要的事情上倾注力量:
比如坚持常年在一线苦心研究技术,比如坚持举办开源技术交流论坛和线下活动,并把自己的钻研所得分享出去,毫不吝啬地发表内容并鼓励大家发言,作为领头人引导社区内容蓬勃发展。
“PingCAP特别主张技术驱动,它的开源方式甚至不像一家中国公司。”同为企业服务市场创业者,身份云平台Authing创始人谢扬认为PingCAP的策略是站在技术制高点上:“它发表的内容质量极高,而且从架构师到开发者都在持续发文章到全球最顶尖的工程师平台,其中很多篇甚至是英文文章,吸引中国的译者翻译回来,发表在中国的各类技术营销渠道上。”
另一个让后辈钦佩的特点是,PingCAP前面两年的重心是技术累积,对商业化并不着急。直到2018年,搭载着云端SaaS服务,它的商业化才随之而来。
“云”不仅将企业服务软件的交付进行了标准化,也将提供服务的方式进一步标准化。
首先,PingCAP的产品更新会实时同步给所有客户——这与传统软件厂商的长达几个月的响应时间大相径庭;
此外,通过SaaS,PingCAP实现了高效部署,传统数据库产品需要一年时间部署,PingCAP为代表的云端数据库只需要一两个月;SaaS为PingCAP本身则带来了更为灵活的销售模式,中小企业客户只要绑定信用卡,就可以立即开始使用。
CTO黄东旭记得,刚上线没多久,一家台湾企业就直接绑了一万美金开始使用,很久一段时间PingCAP都不清楚这家企业的业务是什么。
在美团、哔哩哔哩、小米、摩拜等企业迎接用户量暴增的时候,这些企业们同时也成为了PingCAP用户,这意味着它们拥有了更灵活的架构和弹性数据库,不需要由于双十一带来的多倍销售而购买更多服务器。
在国内以金融类为代表的企业需要私有云部署,刘奇曾透露,国内的客单价在百万元量级,国外更是数倍之高。由此它的出海效应也相继产生,公司陆续服务于Square(美国)、PayPay(日本)、Dailymotion(法国)、Shopee(新加坡)、ZaloPay(越南)、BookMyShow(印度)等海外产品。
开源为PingCAP带来的优势不止于此,因为开源,大厂工程师们对开源产品的贡献更是让PingCAP受益匪浅。“现在实际上参与开发PingCAP的人员,已经有1000多个人了。很难想象一个公司,在某一个单项产品上面,投入1000多个研发是个什么概念?而这还只是开发人员。”刘奇说。
在刘奇与团队看来,单点上的巨大投入是让创业公司“活下来、参与竞争,甚至跟巨头去PK”的条件。
这些使PingCAP的TiDB成为了中国本土诞生的现象级开源产品,三位创始人成为了开源商业的传教士。
“PingCAP带了一波节奏,不少开源爱好者也陆续出来创业了,”PingCAP认为,“我们能做的就是让大家看到,在中国还能有这么一帮理想主义者在坚持,同时也没饿死。”涛思数据创始人陶建辉在2019年7月宣布将产品TDengine开源,背后也有老友PingCAP的助力,TDengine将最核心的存储引擎和计算引擎上传到GitHub的两周时间,收集到的Star已经超过了7300。
而作为背后的投资机构,在GGV看来,“开源”是这些toB 产品最重要的加分项,而“开源商业”也成为了一个投资主题。
无论是底层数据处理还是数据产出层,或者更前端的应用;无论是数据库还是物联网、人工智能,理论上,一切产品皆可开源。
TDengine与RT-Thread背后所搭载的是物联网这个万亿市场,但开源为它们插上了翅膀。“尽管目前的开源产品数量不多,但趋势已经形成,将开源产品商业化的创业者会越来越多。”吴陈尧说。
为什么一定要开源?
PingCAP CTO黄东旭在2020年发表了一篇文章,《大教堂终将倒下,但集市永存》,这篇文章的标题与开源爱好者的圣经《大教堂与集市》(Eric Raymond著)呼应:集市的特点是开放式建设、成本低、周期短、品质平庸;大教堂的特点是封闭式建设、成本高、周期长、品质优异。
黄东旭认为,以开源为代表的“集市”将永存。在文章中,他拆解了程序员不愿将自己的代码开放,企业经营者不认可开源作为核心竞争力的逻辑。在他的解读中,除非某家企业能在自己的行业达到彻彻底底的人才垄断,否则它们的“核心”算法都将是对手也能得到的。唯有开源带来的持续迭代与产品升级才能为一家公司赋予生命力。
任何信仰的传教士都肩负重任。“开源”诞生以来,曾带来不少质疑,他身上的标签不仅有“共享智慧”和“无国界”,也有“免费”二字。以至于很多人质疑:开源就意味着源代码免费共享,而免费又如何能形成商业化?
然而,“免费”并非开源的宿命。
1984年,麻省理工大学(MIT)的计算机教授理查德·斯托曼(Richard Stallman)成立基金会FSF(Free Software Foundation),最初目的是以自由免费对抗大公司的授权费要求,但此后基金会成员认为FSF使用的“自由(Free)”这个词让人想到免费使用,而这不是自由软件的内核,他们不希望将开源商业变为公益机构,所以用“开源”(Open-Source)取代了“自由(Free)”。
开源运动的背景下诞生的典型代表就是Linux。
Linux拥有无数系统开发商,它所开创的模式是由多家公司共同主导一款开源产品的商业化变现,最大的一家Linux系统开发商RedHat在2018年以340亿美元被IBM收购,被称为使IBM“付出了60%溢价”;依托Linux开发而成的Android横空出世并成为全球第一大智能手机操作系统,直接威胁了苹果的地位;全球最大开源开发者社区GitHub被微软75亿美元收购……这些“戏剧性”事件让我们看到开源产品的商业价值。
PingCAP早期的手绘产品图
尽管开源产品的底层系统(如Hadoop等)来自于大公司的开发成果,尽管拥有全球规模最大且最优秀程序员的Google,Facebook等具备闭源的开发实力,但依托于社会资源的聚集,开源仍然成为了带动科技创新最重要的力量——以至于全球最大的开源公司并非别人,而是Google,Facebook等大厂——每家内部都堪称开源项目的驱动中心。
开源传教士们验证了他们的判断。PingCAP的两组数据尤其值得关注:从2018到2020年的一年多时间,TiDB的SQL层项目发生了30000多次提交,有接近60%的源码被修改。从代码修改效率到提升空间来看,开源项目的表现都十分亮眼。
然而,开源软件商业化却从不是一件容易的事情。全球的开源软件项目有数千万个,三大基金会(Linux、Apache、CNCF)的托管项目有600+,但是真正商业化成功的开源软件的公司却只有10余家,国外的典型代表有Red Hat、Databricks、MongoDB、Elastics、Confluent、HashiCorp等(GGV纪源资本投资了其中的多家企业),而PingCAP则是国内企业的佼佼者。
在商业化方面,PingCAP给出了自己的观点:开源软件本质上是通过放弃一部分通过信息不对称产生的潜在利润,换取了极其高效的传播和场景触及效率,但是有意思的是,实际上牺牲掉的这些潜在利润大概率也不一定真的牺牲掉。
因为,一来可能本身付费能力有限,二来可能实际上这些用户通过宣传站台二次传播或者代码贡献等方式回馈了项目本身;如果一款产品是闭源的,这款产品解决的问题又足够普遍且高价值,那么长远来看一定会有一个开源的解决方案吞掉一切。
吴陈尧则认为,开源模式在增长和商业上都跟To C端互联网公司有着类似的逻辑:
To C端产品在打磨和增长过程中,崇尚通过大量的用户反馈和数据来实现迭代,而开源产品也在高度依赖在社区中去搜集bug和对新功能的需求;
在商业上,伟大的To C产品通常是以先创造用户价值,再探索变现方式的路径实现商业价值,也就是巨大的用户价值(通常可以以用户数和依赖程度来衡量)最终一定会有巨大的商业价值与之相匹配,而开源模式也将用户的喜爱视为一个项目或社区存在的最高目的,坚信商业价值是一个自然而然的过程。
不仅如此,GGV企业服务投资团队认为,开源优势能够做到品牌效应、规模效应以及极低的获客成本,这在巴菲特所提出的护城河即商业壁垒中极为关键。
而我们不能忽略的重要一点是,开源带来的护城河由何而来?
首先,开源社区让无数程序员注意、甚至贡献代码进入某款开源产品,而这些程序员对于自己参与“养成”的产品极其关注并愿意使用。
PingCAP对程序员群体的理解是,很多程序员对物质没有太大的感觉,但骨子里有理想主义情怀,他们更希望做一些影响世人的事情,“想要攀登珠穆朗玛峰”。
也正因此,随着开源社区产品的知名度增高,程序员群体中影响力变强,就出现了越来越多的“销售线索”,因此形成了商业壁垒,并逐渐积累了口碑。
此外,在美国与如今的中国互联网行业,大多IT基础设施的采购是自下而上的,这意味当底层的程序员可以做决策时,他们自然会推荐自己所认可的开源产品。
GGV投资的另一款产品RT-Thread创办于2006年,创始人熊谱翔曾谈到商业化转型中的顺利之处:很多自己上下游企业的CTO与技术团队都贡献了代码到RT-Thread,与他们的合作多是一拍即合,根本无需对产品做过多介绍,积累十几年的影响力已经足以形成转化为销售的势能。
再次,GGV企业服务投资团队认为:互联网行业对开源产品的使用本身已经成为趋势,在当今各类互联网产品团队的代码库中,开源代码的比例在逐渐上升。开源代码不仅免费,而且质量已经被认可,能够为企业节省人力成本和时间成本。
对一家VC而言,一款有极低获客成本的产品意味着足够强的吸引力。不过,在GGV对开源产品的观察中发现,“是否开源”与一款产品的性质有关,偏底层的IT基础设施与操作系统“值得”开源,甚至以开源为最佳、最简单的方案,但是一些前端应用即使开源也很难获得更大的商业化空间。
PingCAP的TiDB,涛思的TDengine,RT-Thread都是底层产品,而且PingCAP的TiDB作为数据库产品所产生的更换成本极高,客户将数据库放入系统后,几乎很难更换,这带来了极高的客户流程。
“是否开源”与这款产品所在的竞争格局也有关,如果所在的市场已有巨头提出解决方案,那么创业公司将不得不用开源的方式实现弯道超车。
RT-Thread创始人熊谱翔提到市场所带来的机遇,在RT-Thread所在的IoTOS赛道上,华为等中外硬件大厂均拥有自己的OS,但很多中小客户宁愿寻找一套中立的系统,而这就带来了RT-Thread等第三方IoTOS的机会。而巨头的解决方案往往可能只适合巨头,并不如创业公司的产品更加专注。
除此之外,开源将无疑助推企业服务产品的出海进程。海外客户对中国诞生的产品普遍仍有一些顾虑,“中国公司出海开源其实是一个比较有机会的模式,甚至有可能是唯一的模式。”吴陈尧说。
开源英雄的时代
让一向深耕企业服务市场的GGV格外关注开源商业的是一系列案例:MongoDB和Elastic是两家开源代表企业,从传统软件企业的销售方式到开源+SaaS服务之后,市值分别从上市时的18亿美金和25亿美金涨到了如今的247亿美金和140亿美金;GGV在2012年投资的HashiCorp近年客单价增加,并且获得了一系列大客户的青睐,以至于全球500强企业里有100家以上为其客户,而在GGV最初投资的时候,除了Redhat没有其他开源公司上市,况且Redhat的模式也只是基于开源项目Linux进行商业开发。
在大洋彼岸的中国市场,开源的声音从未停止。首先,越来越多的中国开源爱好者成为开源贡献者。中文IT技术交流平台CSDN曾提到,从数量和贡献度上,中国的开发者都已经达到了GitHub全球4000万的注册用户中的第二位;中国的活跃开源项目贡献者,有40%以上都是在2019年内加入的,其中大多都是90后的年轻人。在Github全球公司开源项目贡献榜上,阿里巴巴与腾讯分别位列第5位与第9位。
真正纵身跳入开源创业的中国创业者是少数,但也已形成趋势。这其中,有些是以开源撬动发展的创始人,如PingCAP的刘奇、黄东旭、崔秋和涛思创始人陶建辉,有些则是“老版主”终于选择创业,如熊谱翔。借用HashiCorp创始人Mitchell的话来说,他们的出现是“酝酿了十年的一夜成名”。在开发者社区SegmentFault思否发布的《中国开源先锋33人之心尖上的开源人物》榜单中,黄东旭、陶建辉、熊谱翔均已上榜,而其中更多开源英雄还在大公司麾下。或许几年后,他们姓名前的职称将被书写成为自己创办的企业。
所幸这个市场需要更多开源创业者去改写。Oracle等传统软件巨头是软件创业者的挑战对象。在PingCAP刚成立的2015年,Oracle在中国数据库市场的占有率高达56%,也是很多金融行业客户的首选。但它在中国企业服务尚未起飞的前几年也曾折戟,“中国市场曾是地狱级,”PingCAP透露,“Oracle在整个中国的收入占全球的比例,大概不到3%。”
在中国,企业服务软件不仅有中国巨大的成长空间也有最极端的互联网环境。一方面,在竞争之下,每家企业都渴望自己的架构更灵活,更新速度更快;另一方面,网民数量外加“双十一”等大型事件营销会对各类互联网公司带来不可小视的数据冲击,刘奇认为Google的成功建立在数据处理量极其庞大的前提下。而对于数据库来说,中国市场“场景够极端,能打磨产品”。
凌驾在中国企业服务的大势上,开源创业者将面临特殊的机会。吴陈尧对中国开源创业者的建议是:注重社区的搭建,以技术作为立身之本;从创办之初就注重国际化,鼓励中外工程师共同参与;商业化进程视具体服务的客户群来决定,在社区形成一定的规模后就可以商业化。
推荐阅读






新智元报道
新智元报道
来源:外媒
编辑:LQ
【新智元导读】人类大脑一直给研究者提供灵感,神经形态计算就是受到人脑低功耗和快速计算的启发而出现的,但其发展受到传统电子学固有局限的阻碍,最近英国阿斯顿大学研究人员发起项目,计划通过研究复杂的人脑回路来克服目前机器学习方法的局限。
芯片上的大脑
参考链接:
https://eurekalert.org/pub_releases/2021-01/au-sca012621.php
https://futurism.com/the-byte/scientists-weaving-human-brain-cells-microchips

新智元报道
新智元报道
来源:Venturebeat
编辑:LQ
【新智元导读】为了在5年内实现量子计算商业应用,IBM称,它有具体方案来提升其量子硬件的功率和可靠性。IBM的Qiskit的开源量子编程框架将帮助应用程序实现「100倍」加速,这样,目前需要花费几个月时间处理的工作可以在几小时内完成。




量子计算的下一步
量子计算的下一步

Big tech的量子霸权之争
Big tech的量子霸权之争



新智元报道
【新智元导读】近日,《自然》杂志上发表了一个项目,有研究人员建立了一个AI算法项目 ,可以产生新的数学公式,且其中一些公式很难证明是否是正确的。这个项目以印度传奇数学家拉马努金(Srinivasa Ramanujan)命名。
2016年4月,著名投资人尤里·米尔纳 (Yuri Milner) 在自己家中举行了一场小规模的晚宴,到场的嘉宾包括Google CEO 皮查伊、创始人布林、Facebook CEO 扎克伯格及其他数十位硅谷领袖等。
米尔纳当晚放映了一部传记体电影——《知无涯者》,而影片讲述的正是传奇数学家拉马努金的一生。
据报道,宴会结束后,扎克伯格等人是红着眼眶走出来的,他们当即宣布将联手成立一项新基金,以纪念拉马努金。
拉马努金是二十世纪最传奇的数学家之一:他独立发现了近3900个数学公式和命题,几乎没受过正规的高等数学教育的他,却能凭直觉写出不平凡的定理和公式,且往往被证明是正确的。同时还留了世人很多自己的笔记,引发了后来的大量研究。
其中几个由他发现的神奇公式如下:
拉马努金圆周率公式:
拉马努金常数(几乎是一个整数):
拉马努金连根式:
拉马努金余弦立方根公式:
正是这些美妙的数学公式,让激起了研究人员的兴趣。
设计 Ramanujan 机器的目的是产生计算重要数学常数(如 π 或 e)数字的新方法,其中许多常数是无理数,这意味着它们有无数个不重复的小数。
像 e 和 π 这样的基本常数在不同的科学领域无处不在,包括物理学、生物学、化学、几何学和抽象数学。然而,几个世纪以来,与基本常数有关的新的数学公式很少,而且通常是凭借数学直觉或创造力偶尔发现的。
Ramanujan 机器可以从众所周知的公式开始计算数字,例如 π 的前几千位数字。从这些数据中,该算法试图预测一个新的表达式,这个表达也可以做同样的计算得到相同的结果。
这个过程会产生一个很好的猜测(conjecture),然后就要靠人类数学家来证明这个表达式是否能够正确地计算出整个数字。
该团队在2019年开始就在该项目的网站上公开这些推测,研究人员已经证明了其中的一些猜测是正确的。
但有些问题仍有待解决,其中一个是关于 「Apery 常数」的问题,Apery 常数在物理学中有重要应用。「最后一个结果,也是最令人兴奋的一个,但是没有人知道如何证明」,物理学家 Ido Kaminer 说,「但是算法自动创造的推测可以指引数学家们找到人们不知道存在的数学分支之间的联系」。
连分数(Continued fractions)
连分数(Continued fractions)
拉马努金机器目前的应用还十分有限: 到目前为止,算法只能生成一个特定类型的式子,称为连分数。这些分数表示一个数字为一个无限的分数序列,这些分数嵌套在彼此的分母中。
团队人员已经尝试了一系列算法来寻找连分数,并将它们应用到各种概念上重要的数字上。其中一个是加泰罗尼亚常数(Catalan’s constant),这个数字起源于十九世纪比利时数学家欧仁 · 加泰罗尼亚的研究。
加泰罗尼亚常数大约为0.916,但它是如此神秘,以至于没有人知道它是否是有理的,也就是说它是否可以表示为两个整数的分数。
数学家们能做的最好的事情就是证明它的「非理性指数」——用有理数来近似一个数字的难度的度量,这个值至少是0.554。证明加泰罗尼亚常数是无理的等价于证明其非理性指数大于1。而由拉马努金机器生成的公式,使卡米纳的团队在最好的人类结果上略有改善,使指数达到0.567。
增加复杂性(Increasing complexity)
自动生成猜测并不是计算机帮助推动数学发展的唯一领域。
计算机辅助计算在几个引人注目的结果的证明中发挥了关键作用。最近,一些数学家在人工智能方面取得了进展,人工智能不仅能进行重复的计算,还能自己做出证明。另一个正在发展的领域是软件,它可以检查人类写的数学证明,并检查它是否正确。
「最终,人类将会被淘汰」,Zeilberger 说,他是证明自动化领域的先驱,并且帮助证实了 Ramanujan 机器的一些猜想,「随着人工智能产生的数学的复杂性增加,数学家们将只能粗略地理解计算」,他补充道。
不过,尽管计算机可能能够提出数学陈述,甚至证明它们是正确的,但是如果没有人类的干预,目前还不清楚它们是否能够区分深刻的,有趣的陈述,还是仅仅从技术上是正确的而已。
如果感兴趣的话,你可以在下面的链接中运行 Ramanujan 算法来发现新的数学猜想,如果能够证明是正确的,那么发现的新猜想将以你的名字命名!
参考链接:
http://www.ramanujanmachine.com/
Github项目链接:
https://github.com/AnonGit90210/RamanujanMachine


开源最前线(ID:OpenSourceTop) 猿妹综合整理
综合自:https://github.com/HVF/franchise
git clone --depth 1 https://github.com/HVF/franchise.git
cd franchise
yarn install
yarn start
6.在franchise/src里面编辑文件,保存后,浏览器会自动重新加载
7.添加功能并发送PR。

–参考自《https://www.infoq.cn/article/m5m93qyadscnyil3kprv》
-
实时性高,端侧处理可节省数据的网络传输时间。 -
节省资源,充分利用端侧算力和存储空间。 -
隐私性好,产生数据到消费数据都在端侧完成,避免传输引起的隐私泄露风险。
-
设备资源有限,端侧算力、存储是有限的,不能做大规模高强度的持续计算。 -
算法规模小,端侧算力小,而且单用户的数据,在算法上并不能做到最优。 -
用户数据有限,端侧数据不适合长期存储,同时可用数据有限。

-
tensorflow.js(下面简称为tfjs) -
ONNX.js -
WebDNN
cpu(js计算)

WASM

WebGL(GPU)

WASM
WebGL
优化 WebGL 高性能计算的n种姿势
姿势一:计算向量化
姿势二:内存布局优化
姿势三:图优化
姿势四:混合精度计算
姿势n:…
电子书免费下载
《2021前端热门技术解读》
阿里巴巴前端委员会重磅推荐!阿里巴巴前端技术专家为你解读前端技术新趋势以及2021你需要关注的技术热点,覆盖前端安全生产、跨端技术、Node.js(Serverless)以及多样化的前端技术四大方向,是2021不容错过的前端学习手册。
关注 Alibaba F2E 公众号
回复 电子书 马上下载