腾讯金融级分布式数据库TDSQL的前世今生

作者:潘安群,腾讯TEG/计费平台部技术总监,2007年毕业于华中科技大学,随即加入腾讯,一直负责计费领域相关系统建设工作,先后主导账户平台、风控平台、HOLD及TDSQL、计费集群等平台建设。
本文为《程序员》原创文章,未经允许不得转载,更多精彩文章请订阅2017年《程序员》

TDSQL(Tencent Distributed MySQL,腾讯分布式MySQL)是由腾讯技术工程事业群计费平台部针对金融联机交易场景开发的高一致性数据库集群产品。该产品第一个版本诞生于2012年,当时主要承载公司数字支付相关业务,包括Q币Q点、包月、各类点券等核心支付数据的托管;2014年被WeBank选中,作为其核心系统的数据库解决方案;2015年,在腾讯金融云上正式推出,作为唯一一款金融级数据库产品,为金融、政企机构提供数据库的公有云以及私有云服务。

TDSQ作为我们计费平台第四代数据库产品,是计费平台2014年以来,对金融类存储产品的思考沉淀之作,同时作为一款定位于金融的数据库,其产品质量也必须符合金融行业标准:数据多备份高一致、零丢失、高可用。正因如此,本文试着从计费平台(TBOSS)四代存储系统的发展过程,来谈谈TDSQL在存储平台数据一致性、可用性和易用性等方面的一些考量。

何为一致性

谈到一致性,业界常提的有传统关系型数据库ACID理论的C,以及分布式系统中CAP理论的C,虽翻译过来都叫“一致性”,但从狭义角度来看,此C非彼C:ACID中的C通常指事务一致性,CAP中的C通常指数据复制一致性。但从广义角度来看,二者又是相通的。

【ACID中的C】

ACID理论中的C,是在事务执行过程中,对外界应看到系统何种状态的约束(相对的,原子性是对系统如何执行这个事务的约束:要么全部成功,要么全部不执行)。严格意义来说,一致性要求在事务执行过程中,系统不能看到该事务执行过程中的中间状态。举个例子:假如银行里一共有100个个人账户,每人有10块钱余额,彼此之间可以转账,但无论同时发生多少次转账,我们任何时候看到的银行总余额应该始终是1000块,不多不少。

【CAP中的C】

分布式中的C,一般是指数据多副本情况下的复制一致性,即数据虽然多副本,但需要保证任意时刻,从系统中读到的数据都是一致的。例如某人的银行账户需扣款100元,在分布式系统中,执行该操作后,可能部分副本数据已更新为扣除后余额,但是部分副本可能数据还没有更新,那这就是一个中间状态,强一致性则要求这个中间状态不可见。用户在查询个人余额时,不能时而查询到扣除前的余额,时而又查询到扣除后的余额。初看起来,它与ACID中的C是两个概念,但如果把分布式系统中的一个写入操作当作一个事务(这个事务由多个写操作组成,因为需要在不同的服务器写多个副本),那这两个C概念又是相通的。

【一致性、隔离性与锁】

谈了一致性,就不能不谈隔离性。ACID中四种不同的隔离级别,理解起来比较晦涩。我们先抛开具体的隔离级别,而从下面的角度来看,就容易理解得多:系统要实现最严格的事务一致性,最简单的办法就是用一把全局锁,这样就实现了可序列化隔离级别,但这种情况下,系统的吞吐量极差,于是我们考虑将锁粒度缩小,再加入读写锁等机制以提升系统吞吐量。锁的粒度越小,系统的一致性就越弱,于是各种隔离级别应运而生,不同的隔离级别就是系统在吞吐量与一致性之间的不同平衡程度。

备注:在各种数据库实现中,通常为了进一步提升吞吐量,并不是简单地用锁控制并发,往往会结合一些更为复杂的实现,例如MVCC等。

但在分布式系统下,如果继续使用锁机制来实现一致性,会因为各种因素,例如网络时延、网络故障、机器故障等情况,导致这个锁实现异常复杂,需要考虑的情况太多。

【Paxos、ZAB、Raft】

在分布式系统中确保各个节点数据一致性,Paxos是业界指定的唯一算法,经过严格数学证明,但是很不好理解,而且工程实现难度很高,所以后面出现了一些变种,例如ZooKeeper的ZAB协议,以及现在比较火的Raft协议,均是Paxos协议变种,但是从工程角度来看,无论可理解性,还是可实现性,均有大幅提升。

【CAP】

这里补充说明一下,CAP理论作者Eric Brewer,在2012年在《Computer》杂志发表新文章《CAP Twelve Years Later: How the“Rules”Have Changed》,中文版《CAP理论十二年回顾:“规则”变了》:
“首先,由于分区很少发生,那么在系统不存在分区的情况下没什么理由牺牲C或A。其次,C与A之间的取舍可以在同一系统内以非常细小的粒度反复发生,而每一次的决策可能因为具体的操作,乃至因为牵涉到特定的数据或用户而有所不同。最后,这三种性质都可以在程度上衡量,并不是非黑即白的有或无。可用性显然是在0%到100%之间连续变化的,一致性分很多级别,连分区也可以细分为不同含义,如系统内的不同部分对于是否存在分区可以有不一样的认知。”

在文章后面,我们也会来看看我们对CAP的理解。

何为可用性?

对于存储系统来说,可用性一般要处理下面这两种情况:

  1. 出现故障时,如何处理请求。分布式系统中,故障的情况有很多,例如网络故障、服务器故障、软件故障等;
  2. 出现性能或容量瓶颈时,导致的系统吞吐量降低,时耗增加等不可用问题。

何为易用性?

对于一套存储系统,易用性主要包含两个方面:

  1. 提供给业务开发人员的API接口。例如常见的存储系统接口有:标准SQL、KV等。一般来说SQL比KV功能更丰富,易用性更高。此外是更强的一致性,应用程序无需考虑数据不一致的情况,易用性也更高。
  2. 提供给DBA运维人员的运维接口。例如监控体系、发布体系、故障定位及处理体系、备份系统等。一般来说周边配套设施越完善,易用性越高。

TBOSS存储平台的历程

下面,我们将从TBOSS存储平台从1.0到4.0的发展历程,来谈谈TDSQL在数据一致性、可用性及易用性等方面的考虑。

【2002-2008:1.0,MySQL热备】

1.0属于起始阶段,数据的备份容灾,主要依赖于MySQL的异步复制机制,主MySQL提供服务,备MySQL Standby,按天冷备数据到异地。该架构的优势是简单粗暴,但数据备份依赖于MySQL的异步复制机制,在主备数据同步有延迟时,如果主机发生故障,系统会有数据丢失,业务系统不能直接切换到备机。所以通常情况下,如果主机发生了故障,对于账户类数据,需要先利用业务日志来修复备机数据后,再切换到备机。

图1  主备切换

一致性与可用性:从CAP角度来看,在P发生时,备机数据恢复之前,直接让系统此时不可用,也就是完全忽略A,保障C。

易用性:系统足够简单,开发、运营易用性均比较高。

【2008-2013:2.0,TBOSS 7*24容灾】

1.0架构在故障(P)时,要么忽略A保障C,要么忽略C保障A的机制,明显控制粒度过大。我们其实知道在故障发生时,主备MySQL没有同步的数据只是极少数,其他绝大部分数据都已同步,是一致的。有没有可能出现故障时,只让未完成同步的数据不可用,而大部分已经一致的数据继续可用呢?这也就达到了更细粒度的控制:在P发生时,仅仅牺牲少量可用性,来保证一致性。

于是我们在2.0架构里,引入了一个中间模块,叫一致性控制中心(CC)。如果从ACID事务角度来看一致性,那CC可以看到是一个事务管理器;如果从锁机制来看一致性,那它就可以视作一个锁管理器。应用层在每次更新数据之前,先告之CC,即将更新某数据,麻烦先将该数据加“锁”。“锁”的释放由CC来负责,CC会根据版本号不断比对主备数据之间的一致性,一旦数据一致,则释放锁,否则继续持有。大部分情况下,这把锁会很快被释放。一旦故障发生,CC中会持有全部未同步数据的锁(黑名单),此时如果应用层需要切换到备机,需要先到CC拉取这份黑名单,将这些数据置为不可用状态,而其他数据则可以直接访问备机。此外,需要注意的是,这把锁是异步的,在故障未发生的情况下,它释放与否,并不影响正常的数据访问及更新。

图2  访问控制架构

一致性与可用性:引入CC机制后,故障发生时,在C与A之间,我们确实做到了一个不错的平衡。

易用性:但系统在易用性上存在很大问题:在容灾逻辑上,应用层与CC、数据层耦合太紧,例如故障发生时,需要应用层去拉取未同步数据的黑名单,以及应用层决定何时切换到备机模式,每次数据访问需要先上报CC等,这些都使得应用层程序嵌入太多容灾逻辑,开发难度增高。

【2010-至今:3.0,厚德(HOLD)存储平台】

厚德平台试图将CC与应用层剥离,让应用层不再关注容灾逻辑,把容灾逻辑下沉到存储层,让存储系统更加通用。

图3  厚德存储平台

延续2.0的思路,那首先要解决的问题就是如何锁定未同步数据。在2.0时代,由应用层来负责上锁,例如账户系统可以直接按照QQ或OpenID来锁定。但如果让数据层来负责上锁,且继续使用MySQL做存储层,并为应用层提供SQL接口,那CC需要关心每条SQL所对应的PrimaryKey(PK)是什么,以便将数据锁定,但这块难度很大。举几个简单例子:

  1. 建表时,没有指定PK字段,这种除非深入存储引擎层,否则拿不到SQL对应数据的PK。
  2. Where条件中没有明确PK值的SQL语句,如update tbl_name set status=0 where mod_time>11111。

如上面的例子,如果试图去锁定这些SQL对应的数据,无法不在存储引擎层进行。

所以我们换一个思路,自研一套KV系统来做存储引擎,这里有几个好处:

  1. KV系统要求每次访问都通过Key来访问,如此一来,CC就能很方便锁定Key,并在主备实现同步后,将Key对应的锁释放。
  2. 出现故障时,拉取黑名单也不再需要业务层处理,即将接管服务的Cache自动从CC拉取,如果业务继续访问黑名单中的Key,直接报“数据不可用”错误即可。
  3. KV使用全内存存储,性能极高,轻松应对业务高峰。

此外,HOLD实现了在线自动扩容机制,能实现在系统容量不够的情况下,一键扩容,尤其是在业务快速发展期,这个功能尤其重要。举个例子,2013年我们HOLD系统扩容才20+次,到2014年,随着手游业务井喷,HOLD实现扩容496次,这在2.0时代,几乎是不可能完成的事。

但是自研KV系统,也引来了一个新问题——迁移问题。计费作为公司公共服务,要求7*24提供服务,历史数据在线迁移,所以从2.0架构迁移HOLD架构,有诸多困难:

  1. 异构数据平滑迁移:对于每一个应用,我们可能都得要写一个SO来实现数据的在线迁移、比对等工作。
  2. 功能接口变化大:对于现有系统来说,需要从SQL接口切换到KV接口,相当于重写一遍应用程序。
  3. KV提供的功能不够丰富:对于应用程序而言,之前使用SQL做的一些逻辑,需要应用层自己解决,例如HOLD系统不支持范围查询,不支持事务等功能。

当然我们的HOLD系统,提供了一个插件机制,可以在一定程度上扩展系统功能,实现类似Cassandra的Lightweight transactions。例如要实现V=V-1,普通KV系统需要两次请求:get k, v; v1 = v - 1; set k, v1;在HOLD系统中,你可以写一个SO插件,让HOLD提供一个除get和set命令外的扩展命令,例如dec k。

一致性与可用性:HOLD在继续保持2.0时代CA优势的同时,通过自动扩容、全内存存储等机制,解决了系统容量与性能问题,进一步提升了可用性。

易用性:应用程序不再需要关心数据层容灾逻辑,开发及运营体验更佳。对于新建系统,且数据结构简单,性能要求高的使用场景,HOLD对于应用层开发和运营都是友好的。但是对于之前已经使用MySQL,且使用了一些复杂SQL逻辑的应用,则迁移成本较大,不太友好。

【2012-至今:4.0,TDSQL】

TDSQL的诞生,除了要解决HOLD系统所面临的老系统割接困难的问题,还有如下几个契机:

  1. 公司内开始大规模使用SSD,IOPS相对于机械硬盘有质的变化,能满足大部分系统的性能需求。利用好SSD优势,能极大简化存储系统的架构体系。

  2. 以KV为代表的NoSQL无法形成业界标准及规范,反观以Oracle(商业)、MySQL(开源)为代表的传统关系型数据库生态完善,使用范围也更广,更容易被开发人员接受。

  3. MySQL在5.5版本引入半同步复制,5.6版本引入GTID等机制,而且经过5.5,5.6,5.7等几个版本,开源的MySQL在性能、数据强一致性方面有了质的提升。

于是我们思考,能否基于MySQL(我们实际上用的是MariaDB),开发一套存储系统,既能保留原有优势:

  1. 强一致性
  2. 高可用
  3. 自动扩容

这里似乎就有两个思路:

  1. 为HOLD增加一个SQL解析层:

如果坚持这种思路不断优化下去,最终做出来应该就是一个MySQL解析层,外加一个分布式存储引擎。但这将会消耗极大的人力投入,且时间周期会比较长,也难跟上社区的节奏。
备注:其实MySQL官方提供了MySQL Cluster这一个产品,使用NDB这种全内存的存储引擎,但是我们分析后,发现该产品实用价值不大。

  1. 直接基于MySQL做一套全新系统:

这种思路,紧贴社区,充分利用MySQL强大的社区力量,并在此基础之上,加上集群管理功能,来实现故障容灾切换、强同步、自动分库分表等。但在这种思路下,我们原来的黑名单机制已经无法继续使用,必须寻找新思路。

在一致性方面,我们想到MySQL Binlog的严格有序性以及强同步复制机制,再结合Raft协议思想(Raft协议核心两点就是Leader选举、日志复制),我们最终实现了TDSQL的强一致性以及数据零丢失,大体架构图如图4所示。

图4  强一致架构

2-1. 强同步机制:基于MySQL半同步复制优化,对于进入集群的每笔更新操作,都将发到对应Set(每一个Set包含3个MySQL实例:一主两备)的主机上,主机会将Binlog发往两个备机,且收到其中任意一个备机应答后(仅仅是备机收到了Binlog,但可能还没有执行该Binlog),然后才本地提交,并返回给客户端应答,这就能确保数据零丢失。此外,强同步机制势必会影响系统吞吐量,所以我们也优化了MariaDB的线程池实现,以提升并发性能。

2-2. 可用性:在这种强同步机制下,建议是存3个数据副本,且分别分布在3个IDC,这样在任一IDC故障情况下,剩下两个IDC依然能够提供服务。如果仅存2个副本,在某中一个副本故障情况下,系统会变为不可用。

Leader选举: MySQL节点本身无法直接参与选举,于是我们由Scheduler模块来负责这个事,如果主机发生故障,Scheduler会从两个备机中,选择一个数据较新的备机(因为MySQL Binlog是严格有序的,所以谁同步主机Binlog的偏移量更大,谁的数据就更新。当然也可以基于GTID来判断)提升为主机。

图5  TDSQL分支版本比较

自动扩容:目前TDSQL有两个分支版本,一个是No-Sharding版本,一个是Group-Sharding版本,NS版本不支持自动扩容,GS版本支持自动扩容,但是该版本对SQL有比较大的限制。

Group-Sharding虽然不支持跨节点事务和JOIN,但是在一个Group内,可以支持JOIN和事务。举个例子,假设有两张表:用户信息表与用户账户表,我们可以将这两张表组成一个逻辑Group,且这两张表都按用户ID字段Sharding,后续Group内任意一张表需要Re-Sharding时,该组内所有表都同时进行Re-Sharding(相当于按Group进行Sharding),这样单个用户相关数据一定会落在一个Shard上(即同一个MySQL实例),于是在单个用户条件下,这些表之间可以做JOIN和关联。

易用性: TDSQL相对于前面3代系统,已经有了大幅提升,但是其分布式OLTP数据库定位,跟传统的关系型数据相比,在JOIN和事务方面,依然有很大差距,这也是我们后续研究的重点。

应用场景:目前TDSQL承担公司计费平台100%的数据存储,也是腾讯金融云的数据库解决方案,为WeBank的核心交易系统提供数据库服务。共计部署服务器数量达1500+。

TDSQL的未来

TDSQL在未来一段时间,将聚焦以下几个方面:

  1. 周边配套工具的完善,例如监控体系、备份机制优化等
  2. 分布式事务
  3. 回馈社区

总结

回顾从主备模式到TDSQL,虽然其间做了很多细节,但核心思想可能就下面几点:

  1. 正确认识CAP理论:在P出现时,CA不是0与1关系,需要根据业务场景在C与A之间做好平衡;在未出现P时,A没有问题,此时需要平衡的是C与延迟(Latency)。

  2. 提升系统易用性:不断将容灾逻辑下沉到存储系统,为开发和运维人员提供更好的交互接口。

  3. 及时更换硬件:充分利用新型硬件,可有效降低系统复杂度。不要一味追求水平扩展,有时垂直扩容效果也不错。

  4. 跟紧业界与社区:TDSQL发展已有2年多,目前来看该思路正确,我们的选型与设计,跟开源社区的发展基本一致。但回想2008年我们开始做TBOSS 2.0时,几乎是自己关起门来,逐个分析需求,逐步讨论并实现,每个细节每个坑都是自己趟出来的,虽最终思路跟业界也是一致的,但耗费的时间太长。尤其现在技术发展越来越快,借助社区的力量,明显更有效率。

  5. 关于回馈社区,目前我们做得还不够,未来不仅要贡献我们的思路,也希望能直接给社区贡献代码。

深入浅出:一文带你全面理解TDSQL分布式数据库 TDSQL是腾讯云推出的一款兼容MySQL协议的分布式数据库服务。它不仅继承了MySQL的易用性和广泛的应用生态,还通过分布式架构实现了高可用性、高扩展性和高性能。TDSQL适用于金融、电商、游戏等多种业务场景,能够满足大规模数据处理和高并发访问的需求。TDSQL作为一款先进的分布式数据库,已经在多个行业得到了广泛应用。通过本文的介绍,相信读者对TDSQL有了更深入的了解。在未来的技术发展中,TDSQL有望成为更多企业和开发者的首选数据库解决方案。 阅读详情

相关推荐

MySQL、MariaDB 和 TDSQL 的区别

类型:关系型数据库管理系统(RDBMS)。开发者:最初由 MySQL AB 开发,后被 Sun Microsystems 收购,最终被 Oracle Corporation 收购。开源:MySQL 是一个开源项目,提供了社区版和商业版。使用场景:广泛用于 Web 应用、内容管理系统(如 WordPress)、电子商务平台等。类型:分布式关系型数据库管理系统。开发者:由腾讯云开发,主要用于云计算环境。使用场景:适用于需要高可用性、高并发和大规模数据处理的应用场景,如金融、电商、社交网络等。

sumatch的博客 1954

浅析MySQL、Oracle、DB2、TDSQL的特点

9,MySQL同时提供高度多样性,能够提供很多不同的使用者介面,包括命令行客户端操作,网页浏览器,以及各式各样的程序语言界面,例如C+,Perl,Java,PHP,以及Python。1,开放性:Oracle能在所有主流平台上运行(包括Windows),完全支持所有的工业标准,采用完全开放策略,可以使客户选择最适合的解决方案,对开发商全力支持。MySQL的最初的核心思想,主要是开源、简便易用。通过优化器的选择,以及无敌的HINT规则,给与了SQL优化极大的自由,对CPU、内存、IO资源进行方方面面的优化。

qq_44912620的博客 4420

TDSQL是什么:腾讯如何打造一款金融级分布式数据库

我们先初步了解TDSQL产品,以及它的适用场景。 首先,TDSQL是腾讯推出的一款兼容MySQL的自主可控、高一致性分布式数据库产品。这里我们强调一点,高度兼容MySQL——TDSQL完全兼容MySQL协议,并且做到完全自主可控、数据强一致性。第二是TDSQL具备分布式的特性,具备一个弹性扩展、高可用的架构。在互联网行业,海量的用户流量场景很常见,如果数据库不具备可伸缩性、可扩展性,是很难应对如:电商的大型促销,春节抢红包等突增流量的场景,这些其实都是对数据库应对海量用户流量的考验。 目前TDSQL已经服

weixin_43872058的博客 6770

TDSQL MySQL版基本原理-水平分表 读写分离 弹性扩展 强同步

TDSQL MySQL版(TDSQL for MySQL)是部署在腾讯云上的一种支持自动水平拆分、Shared Nothing 架构的分布式数据库。TDSQL MySQL版 即业务获取的是完整的逻辑库表,而后端会将库表均匀的拆分到多个物理分片节点。 水平分表 概述 水平拆分方案是 TDSQL MySQL版 的基础原理,它的每个节点都参与计算和数据存储,且每个节点都仅计算和存储一部分数据。因此,无论业务的规模如何增长,我们仅需要在分布式集群中不断的添加设备,用新设备去应对增长的计算和存储需要即可。 通过如下视

weixin_43872058的博客 3160

TDSQL:腾讯金融级分布式数据库解决方案

TDSQL:腾讯金融级分布式数据库解决方案 本博主是腾讯云的使用者与爱好者,前后分别试用了腾讯云服务器、云开发、微搭低代码开发平台,可以说算是见证腾讯的云上历程 本博文将从基础概念、TDSQL介绍、发展历程等多角度介绍TDSQL的使用心得 目录导航TDSQL:腾讯金融级分布式数据库解决方案前言一、概念梳理1、数据库(DataBase,DB)2、数据库管理系统(DataBase Management System ,DBMS)3、数据库系统(DataBase System,DS)4、分布式数据库5、分

qq_46368746的博客 1673

tdsql完全兼容mysql吗_金融级数据库 TDSQL:已支持日 3.6亿+ 的交易量,TPS 10万+

原标题:金融级数据库 TDSQL:已支持日 3.6亿+ 的交易量,TPS 10万+作者:胡盼盼:微众银行数据库平台负责人。硕士毕业于华中科技大学,毕业后加入腾讯,任高级工程师,从事分布式存储与云数据库相关的研发与运营工作;2014 年加入微众银行,负责微众银行的数据库平台的设计规划和运营管理。黄德志:微众银行数据库平台高级 DBA。2009年加入平安科技,先后担任数据库资深开发工程师及资深运维工程...

weixin_42134038的博客 1941

腾讯分布式数据库TDSQL金融级能力的架构原理解读

导语:为帮助开发者更好地了解和学习分布式数据库技术,2020年3月,腾讯云数据库、云加社区联合腾讯TEG数据库工作组特推出为期3个月的国产数据库专题线上...

腾讯技术工程 3895

如何加载交易策略EA到MT4/MT5

1、打开MT4/MT5软件 2、首先,必须有一个EA,而且必须是mq4/ex4为扩展名。点击左上角“文件”—“打开数据文件夹”,找到安装路径 3、将EA的ex4或mq4文件放到MT4目录\MQL4\Experts里面(本文以名为Demo的EA为例) 4、如果有DLL库文件,复制到experts目录下的libraries子目录中 5、如果有tpl模板文件,复制到templates目录中 6、添加完成后重启MT4,点击允许EA运行图标 7、在导航中找到刚才安装的EA,拖拽到...

weixin_41364817的博客 7358

腾讯云 TDSQL 详解:金融级分布式数据库的架构与实战

本文将深入解析 TDSQL 的架构设计、核心特性及最佳实践,助你全面了解这款强大的分布式数据库。

一起探索IT的世界 2258

避开封号风险!wxauto+Claude API实现微信智能客服的合规方案

本文详细介绍了如何利用wxauto和Claude API构建合规的微信智能客服系统,避免封号风险。通过技术选型对比、防封策略设计及大模型接入实践,为企业提供了一套安全高效的解决方案,特别适合中小企业在微信生态中部署AI客服。

sql99的博客 445

字节跳动程序媛教你如何刷算法题:面试手撕代码我就没怕过

本人上一次刷题还是大一的C语言期末考试……但是面试中算法考核截止上岸前一直保持着100%正确率的光辉记录。 本文将给你指明一条刷题的决胜指南。并从算法的重要性、题库的选择以及刷题的三大步骤分别进行讲解,彻底解决你所有关于面试算法所有的困扰。

Stay Hungry Stay Foolish 求知若饥 虚心若愚 2万+

腾讯云数据库TDSQL-学习心得与收获

TDSQL是腾讯推出的一款兼容MySQL,自主可控,兼高一致性的分布式数据库,我来分享下学习心得与收获

IT邦德 8096

大模型推理常见采样策略:Top-k, Top-p, Temperature, Beam Search

大模型推理采样策略,举例通俗易懂汇总介绍

qq_43243579的博客 2万+

腾讯TDSQL:带你认识真正的金融级自主可控分布式数据库

在数字化时代,作为基础软件,数据库的自主可控对于企业的数据安全、业务稳定具有重要意义。只有实现“自主可控”才能从根本上保证信息安全,尤其是涉及重大安全的政府和金融领域,对数据安全的要求进一步加强。因此,在互联网安全上升至国家战略层面的背景下,如何在底层基础数据库层面实现自主可控成为云计算厂商不断追求的目标。 基于微信支付 / 红包的复杂业务场景,腾讯一直致力于实现数据库的自主可控,保证数据强一致性、高可用和水平扩展。实际上,腾讯推出的 TDSQL(TencentDistributed SQL) 金融级分布式

weixin_43872058的博客 913

PHP实现获取当地网络时间​(附完整源码)

PHP实现获取当地网络时间​(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 234

Electron - Electron failed to install correctly, please delete node_modules/electron and try install

Electron安装失败:Electron failed to install correctly, please delete node_modules/electron and try installing again,electron安装报错:Electron failed to install correctly...解决方案,Electron 未能正确安装,请删除 node_modules/electron,然后再次尝试安装,如何解决这个问题,手把手教你解决,在yarn dev时报错,electr

🏆 前端领域优质创作者 4365

必修课!深度解析金融级分布式数据库一致性技术

作为国民经济的命脉和枢纽,金融行业对底层数据库的能力要求正在不断提高。在众多要求中,数据一致性无疑是重中之重,即数据不能出错,最好还能提高并发效率。 TDSQL采用MC(轻量级GTM)+全局MVCC的全局读一致性方案。如果只使用全局事务管理器GTM,除需维护全局序列外,还需要维护全局的事务冲突,这个过程的通信量及与GTM之间的通信频率都会成为瓶颈。TDSQL引入全局MVCC,将每个分片上MVCC版本和全局GTS做映射,通过全局GTS和全局的MVCC映射来管理每个分片上的镜像,进而实现全局的MVCC,从而极大

weixin_43872058的博客 4310

我写了一个自动识别火车车厢位置的算法【lidar点云识别】

我写了一个自动识别火车车厢位置的算法【lidar点云识别】

qq_43212290的博客 797

数据库主备_金融级分布式数据库打造!TDSQL在微众银行的大规模实践

| 导语微众银行在2014年成立之时,就非常有前瞻性的确立了分布式架构的基础架构。当时,腾讯有一款金融级的分布式数据库产品TDSQL,其业务场景和对数据库的可靠性要求,和银行场景非常类似。微众银行和腾讯TDSQL团队合作,共同将TDSQL打造为适合银行核心场景使用的金融级分布式数据库产品,并将TDSQL用于微众银行的核心系统数据库。本文是对整个实践历程的总结。一、背景介绍微众银行在20...

weixin_32054021的博客 890

手把手教你搭建工业级C#上位机:完整架构+通信+配置+日志,新手也能落地(附全套源码)

模型层是“数据容器”,统一数据格式,避免参数传递混乱。本文搭建的C#上位机,采用“分层+模块化”架构,解耦了UI、通信、配置、日志四大核心功能,不仅满足工业场景的基础需求,还为后续扩展打下基础。新手跟着步骤走,既能掌握上位机的核心开发技能,又能理解工业级项目的架构设计思路。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1153

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数据库主备_金融级分布式数据库 TDSQL:在微众银行的大规模实践之路

云技术导读:微众银行在2014年成立之时,就非常有前瞻性的确立了分布式架构的基础架构。当时,腾讯有一款金融级的分布式数据库产品TDSQL,其业务场景和对数据库的可靠性要求,和银行场景非常类似。微众银行和腾讯TDSQL团队合作,共同将TDSQL打造为适合银行核心场景使用的金融级分布式数据库产品,并将TDSQL用于微众银行的核心系统数据库。本文是对整个实践历程的总结。一、2014年:基于分布...

weixin_28748867的博客 795

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

成为金融级数据库,腾讯TDSQL 的底气是什么?

作者 | 宋慧 14.1178 亿,是第七次人口普查,全国人口总数。全国 700 万普查员,首次线上完成普查数据采集,数据直接上报至国家统计局。普查员所使用的线上系统,需要完成数据采集、流转、脱敏、处理和分析过程,扛住并发高峰,保证系统的稳定性,对于背后的技术开发团队,无疑是一次重要且艰巨的挑战。 优快云了解到,第七次人口普查背后,腾讯云数据库提供了擅长 OLTP 场景能力的版本,和擅长联机分析处理 OLAP 场景能力的企业级分布式数据库 TDSQL,通过“双引擎”设计支撑人口普查数据登记与统计分..

C_Database的博客 778

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TDSQL:从自主可控金融级数据库看腾讯“智能+”技术中台之路

作为“互联网+”和“智能+”的主要技术供应商,腾讯提出了“云化”已经成为重要的创新模式,各行各业都将进入“互联网+”的下一站——“智能+”阶段。在此过程中,腾讯云将充分发挥“连接器”的作用,用“智能”连接各行各业。 2019年,3月12日,腾讯云全新发布自主可控金融业务支撑平台,该平台融合了可支撑数百万虚机的专有云平台TCE、服务过380亿账户的分布式数据库TDSQL,以及在腾讯海量业务场景淬炼出来的微服务平台TSF、大数据及人工智能平台TBDS&Ti等在内的优势能力,帮助金融机构打造自主可控,安全

weixin_43872058的博客 716

腾讯云数据库TDSQL——搭建wordpress初体验

腾讯云数据库TDSQL——搭建wordpress初体验

jks212454的博客 2687

TDSQL分布式数据库的HDFS和LOCAL备份配置

产品介绍:TDSQL分布式数据库是腾讯公司结合自身支付、金融等核心业务需求,紧紧抓住了国外传统集中式数据库难以适应业务规模快速增长这一现实问题,从2009年开始研制新一代分布式数据库系统TDSQL。并通过持续的产品化完善,实现国产分布式数据库的市场通用化,助力金融政务等行业实现数据库安全可控,并持续降低IT成本,提升数字化运营效率,从而进一步推动普惠金融、数字政务等传统行业升级发展。 产品特点:TDSQL作为一款具有金融级特性的分布式数据库产品,具备强一致高可用、全球部署架构、分布式水平扩展、高性能、易运维

weixin_43872058的博客 1149
上一篇: 【SDCC 2016】蚂蚁金服高级研究员阳振坤:关系数据库的困境与出路
下一篇: 深度学习应用大盘点
仲培艺
博客等级 码龄10年 750粉丝 264原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值