PingCAP 创始人刘奇:开源分布式数据库如何搞定 OLTP

2023-11-03

7月28日,以“科技,洞见未来”为主题的 QingCloud Insight 2016 大会将在北京召开,连接云计算产业链上下游,展示 IT 领域最新研发成果。作为 NewSQL 技术的代表,PingCAP 联合创始人&CEO 刘奇将在本次大会上讲述开源数据库 TiDB 的设计与研发技术细节。在云和大数据时代,数据库领域发生了什么?新应用需要什么样的数据库?开发者需要哪些新技术?刘奇日前接受 CSDN 记者的专访,从 TiDB 的研发开始,就传统数据库面临的挑战,新型数据库的特性,开源模式的优势,TiDB 的研发进展,以及数据库与云计算资源更好配合的方式等问题进行深入解析。

图片描述

PingCAP联合创始人兼CEO刘奇

刘奇,PingCAP 联合创始人兼 CEO,先后创建了 TiDB、Codis 等知名开源项目。曾任豌豆荚、京东资深系统架构师。同时也是知名的 Go 语言专家和 Redis 专家。现从事开源的分布式 NewSQL 数据库 TiDB(受 Google F1 启发)的开发。擅长高并发、大规模、分布式数据库系统架构设计。

数据库领域的变化

CSDN:首先谈谈您在 QingCloud Insight 2016 上的分享话题。

刘奇:我会讲怎么去构建一个分布式数据库,主要是介绍我们是怎么实现 TiDB 的。经过大约一年半的研发,TiDB 现在已经发布了 Beta 1版本,进入一个快速迭代的周期,预期在三个月内能迭代到一个 GA 的版本。作为一个数据库产品,我们对 TiDB 进行严格的测试,以保证数据不会出问题。

CSDN:哪些人应该了解这个内容?

刘奇:DBA、系统架构师、CTO 甚至 CIO,因为他们需要了解Database 对于企业真正的价值。不同数据的重要性是不一样的,核心价值的数据永远不能丢失。比如说银行,最核心的可能就是账号、存款这些金融相关的这些数据,其次就是和业务相关的,再次就是一些日志。

CSDN:金融等行业核心有传统关系型数据库,也在针对不同数据尝试 NoSQL,为什么还需要 TiDB 这样的 NewSQL 技术?

刘奇:银行其实也面临互联网转型的压力,传统数据库经过这么多年,已经不能适应现在转型期用户数据增长的速度,也不能很好地支持跨数据中心多活——热备都是比较过时的技术。当然银行在很大程度上还要考虑风险,即使有一个新的数据库,他们也很难在短时间内将其部署到最核心的业务,但是可以先从外围开始测试,体验分布式带来的好处,支持业务快速地往前发展。

CSDN:不仅 TiDB,很多分布式的数据库都采用开源的模式,为什么这个领域这么喜欢开源?

刘奇:首先,数据库可以分为 OLAP 和 OLTP 两大类,OLAP 对于数据的安全性重视程度没有 OLTP 那么高,丢失几条数据对于用户行为分析而言关系不大。目前开源领域以 OLAP 居多,因为实现难度和风险更小,但是真正往 OLTP 上走是非常困难的。实际上,在 Google Spanner 论文出来之前,就没有真正的大规模 OLTP 分布式数据库,OLAP 的系统可以轻松扩展到两百台机器,但 OLTP 数据库能上到两百台机器是非常罕见的,以前也没有什么特别好的技术。被 Apple 收购用于提供 Apple 内部服务的 FoundationDB,也就能 Scale 到一百台左右的规模。很多同行都走了很多的弯路,Spanner 一出,架构就得跟着重新去改。

而使用开源数据库,无论是从被绑架的风险,还是说灵活程度,可扩展性,甚至是和其他工具的整合,都有明显的优势。

  • 首先是不会被某个数据库绑架。
  • 其次,开源是大家协作的一个系统,通常你遇到问题很有可能被别人 Fix 掉了,而且你也有很多地方可以交流经验。
  • 同时,很多人会参与贡献,哪怕是一点小需求,只要用的人足够多,官方一般都会接纳——就算官方不接纳,你也可以 Fork 一些分支完成自己的需求,这是商业数据库不可能做得到。
  • 另外是和其他开源工具的整合,开源对开源一般都会很友好,比如整个阿帕奇社区几乎所有的东西都可以很好地整合,Hadoop、Spark、Flink 最终会形成一个相互依存、良性竞争的超级大的生态。

TiDB 的研发思路

CSDN:谈到 Google Spanner 的论文,TiDB 在哪些方面借鉴了它的设计,哪些方面是有独到的一些创意?

刘奇:TiDB 大量地借鉴了 Google 的论文,也做了很多自己的改进。比如说:

  1. Google 使用的是 tech source,尽管有其他的实现,但没有一个真正受过大规模生产环境的考验。我们在协议上选择的 Raft,也是经过了非常严峻的生产环境的考验,比如 etcd 、Hashicorp 都在用 Raft,大家还有很多基于 Raft 专门造的各种轮子,同时 Raft 性能和 Paxos 差不多,但简洁性是后者所不具备的。

  2. 关于协议,还有 Google 内部使用了自己的 ORM,而我们兼容的是 MySQL 协议,在易用性上比 Spanner 或者说比 F1 要好很多,用户不需要重新学一套新的东西就可以直接用;我们接下来还会支持 MySQL 的 Documents store,用起来就更爽了。

  3. 另外在整个架构上,Google 依赖自己的 Colossus 分布式文件系统,而我们是不依赖的。如果依赖一个分布式文件系统,用户需要多部署一个新的组件,同时也会造成一定的 latency 上升,这是我们不希望看到的。

  4. 再一个比较重要的改进就是原子钟,这是 Spanner 最强的地方—— Google 内部有一个原子钟加 GPS 时钟,组成一套精确的时钟系统,这在外面是没有的。我们在事务模型上面使用了 Percolator,是 Google 之前发表的另一篇论文里提到的一个增量处理的事务模型,这也是外面没有原子钟的变通方案。

CSDN:能否解释具体是怎么实现的?

刘奇:按照原来的 Percolator,会有一个 Server 提供直接时钟服务,也就是单调递增的时间戳的分配,它本身是高可用的,通常会部署三到五个副本,大概每秒可以分配四百万到八百万个时间戳。从目前的需求来看,每秒四百万个时间戳是绰绰有余的,这是在没有原子钟的时候的一个替代方案。另外一个方案就是 HLC,但 HLC 如果要保证线性隔离级别,需要设置一个时钟适中的精度,但是没有云厂商明确说时钟精度一定保持在什么范围。这是一个比较大的问题,如果时钟精度超出这个范围,结果就是错的。我们不想因为时钟精度造成用户数据出错的可能,所以就选择一个更加稳定的一个方案。HLC 也是Kudu 和 CockroachDB 采用的几乎同时发表的技术极为相似的两篇论文。

CSDN:兼容 MySQL 的方式是业界通用的做法吗?

刘奇:不是,主流做法是我搞一套我自己的,让用户切进来,这对于新东西的推广的压力非常大。兼容它很重要一点是数据库的测试,我们现在测试用例都是用几百万级的,600 多万个 Tests,可以把 MySQL 的兼容,大量 Test 拿过来用来测试,如果靠人去构建这个 Test 基本上是不现实的事情。MySQL 已经是一个很好的平台,融入平台,可以让大量已有的生产力得到发挥。如果不能很好地兼容这个平台上所有的东西,反而自己去建立一个平台,周期是很吓人的。

CSDN:会追的最新版本的 MySQL 吗?

刘奇:我们现在追的是 5.6,因为 5.7 的官方也还在快速的更新,比如说5.7推出的 Documents store,现在还没有用户,我们这时候去支持它是没有太大的意义。我们做一个东西一定是满足用户需求,然后兼容协议,对用户来说迁移特别简单,就比如说现在直接测试。

CSDN:是否需要开发一些专用的工具来支持 MySQL 到 TiDB 的迁移?

刘奇:不需要其他所谓的第三方工具,直接使用任何已有的 MySQL备份、恢复工具就可以了。我们现在的测试都是直接把 MySQL 数据导出来,导入到 TiDB,再拿 TiDB 的数据导回 MySQL,完全不需要任何新的工具。绝大多数时候一行代码都不改,立刻可以获得所有的新特性和分布式的优势。

CSDN:传统的 DB2、Oracle 的迁移也是一样简单的吗?

刘奇:这个事情就比较麻烦了,因为我们并不兼容这个 Oracle,也不兼容 DB2,而且它们互相也不兼容。这时候用户如果要迁移,用户需要改它的 SQL,需要改掉存储过程,因为我们不支持存储过程、触发器这些前两代单机数据库的技术,对一个分布式系统来说,如果在这个地方写个存储过程,这个存储过程访问的数据,又跑在其他的机器上面,这个时候存储过程的理解,和用户对于前面两代的传统数据库技术的理解是不一样的,那按照它前面这个思路去写现在这个程序有可能会出现一个比较大的问题。所以传统像 DB2,Oracle 迁过来是稍微有点麻烦的,就是他们需要自己去改 SQL。

CSDN:对 NoSQL 端的兼容有什么样的计划?

刘奇:我们不考虑兼容 NoSQL(当然用户可以自己去修改兼容MongoDB 或者 HBase 的 API)。NoSQL 已经是上一代的技术,我们没有必要在上面再做太多的别的一些东西,直接跳到 NewSQL 这一代就可以了。国外有人在 PostgresSQL 上做一套 MongoDB 的兼容,我们认为没什么意义。而我们兼容 MySQL 协议,是给 MySQL 提供了很多原本不能够实现的东西,比如说异地多活,跨数据中心复制和容灾,水平伸缩。

CSDN:水平伸缩能够支持多大的规模?

刘奇:我们的设计,单个数据库支持千级别的机器,如果超过这个数量可以重新再布一个新的实例,又可以支持这种千级别的机器。但目前还没有找到这么大的业务。

CSDN:目前有如何商业化的考虑吗?

刘奇:TiDB 的核心技术是完全开源的,但我们将来会提供企业版。我们有一个 On-Premise 的版本 ,提供的一些监控和管理工具,这些工具就不需要开源了。这其实也是目前开源数据库的主流做法。比如 MongoDB,它的核心东西都是开源的,一般用户从来不用考虑付费问题,但是它会给企业用户提供一套收费的非常漂亮的管理界面,这是一个主流的收费模式。另外还可以给用户提供技术支持和维护的服务,以及咨询服务。开源不影响卖 License,我们仍然为企业提供 License 授权。

云计算环境的整合

CSDN:开源分布式数据库想要在云上做为一个服务提供给用户和开发者,最重要的工作是什么呢?

刘奇:对用户体验最好的,肯定是和云做深度整合,用户不需要关心新启一个机器这种细节,只要设定一个配额,容量不够的时候自动给我扩容就好了(同时发邮件通知),这样 易用性是最友好的,这在国外也比较常见,可以保证业务完全不停,国内很多上第三方市场的方式,就没有和云做深度整合,易用性相对还是弱一点。

CSDN:要满足异地多活等特性,TiDB 对云资源的使用上遇到过一些问题呢?

刘奇:异地多活,起码异地之间的 latency 不能太大,否则用户一个正常请求,尽管 TiDB 是采用 Raft 这样的多数派复制的方案,复制到多个数据中心延迟就比较大了,像 Spanner 可能在百毫秒级别的,它最夸张业务会复制五到七个副本,分布在五个不同的地区。现在国内的普遍做法是同城异地,同城机房可以保持很好的同步,因为 latency 特别小,异地的机房之间仍然保证不中断业务,但 latency 会上来。

CSDN:异地同步可以交给云来自动做吗?

刘奇:这个显然要由数据库层来做,因为只有数据库层才知道这事该怎么做,否则底下的存储层很难做出最优雅的决定,比如说没有这个数据库之前,MySQL 在云上是没有办法 scale 的。但是云可以提供很好的支撑,比如说拉专线让 latency 变小,相当于从硬件层解决问题。简单来讲,数据库可能是造车的,机房的专线就相当于一条高速公路,因为它的 latency 很小,很适合数据库做异地多活。

CSDN:硬件层的故障对 CAP 的影响,要通过什么方式来解决呢?

刘奇:我们使用 Raft 的协议,容灾的能力就是二分之 N(N 为奇数),最多不超过二分之 N 的机器挂掉时候可以正常使用,所以在云上面,如果说一个机器挂掉,对于整个系统是没有影响的,或者一个机器网络出了问题,它被隔离掉也没有影响。机制上它并不依赖与云给它提供的稳定性和安全性,这个协议本身就负责保证它的稳定性和安全性。

CSDN:TiDB 要部署到云上,对于下层 IaaS 的需求就是一个高速公路吗?

刘奇:主要就是高速公路,另外对机器或者容器的弹性支持,因为数据库扩容的前提,是新加一个机器,必须要给我提供一个 API,或者提供API 让我马上加个 Container,无所谓是 Docker 还是 Rocket。

CSDN:开源分布式数据库未来一定要和 Container 结合吗?

刘奇:结合是肯定的事情。未来分布式数据库会往多租户的方向走,但是目前对多租户还没有很好的技术支持,这时候怎么去做隔离,容器化是个很好的思路。但是分布式数据库也不是简单的容器化的问题,因为它被隔离在很多机器上面,它的配额,或者说它的请求,时时刻刻都在变,你对它的约束必须是在整个系统级别的约束,而不是单机上的约束。未来的程序一定是跑在容器里面的,但是存储可能挂在容器外面。目前我们已经初步完成了跟 Kubernetes 的整合,还在做进一步的测试。目前我们希望很好地跟 Kubernetes 或者跟 OpenStack 整合。我们有 Dockerfile,可以直接通过 Container 部署,很多热爱开源的开发者希望自己去编译,也支持直接 apt-get、RPM 来安装。

开发工具与难点

CSDN:使用 Golang 开发的是因为您擅长Go吗?

刘奇:我擅长 Go,也擅长 Rust,但我之前写了六七年的 C++,再之前大概写了两年的 C、一年的汇编,中间还写过大概半年的 C#,C++ 是用得最久的。但 TiDB 其实是两层,包括 SQL 层的 TiDB 和 KV 层的 TiKV,分别对应着 Google 的 F1 和 Spanner。TiDB 之所以用 Go 开发是因为开发速度快——实现 MySQL 兼容需要非常大的工作量(目前为止还没有完全实现兼容),需要选好开发语言让我们很快地适应 MySQL 的变化。另外,TiKV 是用 Rust 写的,Rust 的性能非常好,可以满足 KV 操作的需求;同时它没有 GC,可以避免了 Go 语言里面本身存在的一些问题;此外 Rust 对错误检查又严格无比,这对一个非常重视质量的项目来说非常重要,可以很好地解决了这个多线程数据竞争等问题。

CSDN:Go的 GC 问题如何解决呢?

刘奇:在压力大时候,GC 就是个问题,这需要去不断地优化。我们整个系统的实现,减少内存的分配、重用对象等常规的优化 GC 的算法都用的上。

CSDN:到目前为止,开发过程中最耗费精力的是哪一项工作呢?

刘奇:应该是测试。分布式系统的测试本身就非常困难,对数据库的测试要求就更高了,必须要非常严谨地做所有的可能性的测试,我们需要有工具不断地去模拟机器挂掉、网络断开、磁盘损坏/变慢、程序被kill等所有的故障,我们现在有 Test 不间断地杀程序,杀完之后马上检查数据有没有丢,以保证无论出现什么极端的情况,数据都是正确的、完整的,这种测试是非常重要。然后我们还同时跑着几百万个 Test,目前也是分布式在跑。我们有很多关于分布式系统的论文,但是关于分布式系统的测试的论文其实很少,高质量的就更少,Google 也没有告诉大家说 Spanner、F1 到底怎么做的 Test,外面的经验跟 Google 还是有差距的。

TiDB 的适用场景

CSDN:测试如此重要,那不同行业的数据库应用场景千差万别,我们是要把所有的方向都测试,还是说目前有些侧重的场景?

刘奇:首先我们能够支持传统的 sysbench 之类的常规测试。至于各种行业的不同应用类型,我们不可能完全测试到。我们这边模拟的方案,和用户那边实际报过来的 case,以及用户提供的数据,我们都会进行统一的测试。但是开源带来的好处,是用户可以下载帮我们做测试。

CSDN:你认为哪些场景、哪些应用应该使用 TiDB ?

刘奇:在数据库上遇到瓶颈的地方都可以。数据库不应该是卡住业务的瓶颈,当业务在快速发展的时候,如果这数据库遇到了性能问题、扩展性、数据保护等问题,需要多数据中心的容灾能力,这个时候可以上 TiDB。不一定是场景驱动,只要数据库真的遇到问题,就可以上一个更好的数据库。

CSDN:采用 TiDB 之前,应该做哪些准备工作?

刘奇:如果是 MySQL,那比较简单,可以拿真实数据直接去测试,可以像互联网应用常规做法,先导一部分流量进来,可以很好做一个双写,去验证这个系统,并保持这种状态持续一定的时间。然后如果不是MySQL,可能就需要先转化到 MySQL 这种语句,最好是拿自己实际业务去测试,这样发现问题也比较聚焦,不建议只是简单地 bench 一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PingCAP 创始人刘奇:开源分布式数据库如何搞定 OLTP 的相关文章

  • TiDB 的数据迁移工具现已开源

    TiDB 是国内 PingCAP 团队开发的一个分布式 SQL 数据库 xff0c 支持包括传统 RDBMS 和 NoSQL 的特性 现已将 DM xff08 data migration platform xff0c 该数据迁移工具 xf
  • TiDB在Centos7上通过源码编译安装

    这里难以编译安装的是tikv tidb的三大部分tidb pd tikv中tidb pd均是采用go语言编写 xff0c 安装go语言包即可编译 xff0c 唯独tikv是采用rust语言写的 xff0c 他的编译是最复杂的 而且编译环境非
  • TIDB使用时的注意点笔记

    场景 xff1a 虽然TiDB号称完全兼容MySQL 5 7 协议 MySQL 5 7 常用的功能及语法 xff0c 但是其与MySQL数据库仍然存在一些差异 xff0c 可能会导致下游TiDB环境故障 以下是我们使用TiDB时需要重点关注
  • TIDB-Error 1105: Out Of Memory Quota问题解决

    一 背景 复杂sql查询报错 二 原因 单条s q l使用内存默认为1G 三 解决 tiup cluster edit config tidb test server configs tidb mem quota query 4294967
  • rocksdb 编译安装 日志

    Compilation RocksDB s library should be able to compile without any dependency installed although we recommend installin
  • 猿创征文

    猿创征文 国产数据库实战之TiDB 数据库快速入门 一 系统检查 1 检查系统版本 2 查看本地IP地址 3 TiDB集群介绍 二 快速部署本地测试集群 1 安装 TiUP工具 2 声明全局环境变量 3 快速部署TiDB 集群 三 连接 T
  • 从etcd看Raft协议

    首先 什么是etcd 看官方的定义 A highly available key value store for shared configuration and service discovery 翻译过来就是 用于配置共享和服务发现的K
  • TiDB关键字、保留字和注释语法

    关键字和保留字 关键字在 SQL 中有特殊的意义 例如 SELECT UPDATE DELETE 在作为表名跟函数名的时候 需要特殊对待 例如作为表名 保留字需要被反引号包住 CREATE TABLE select a INT ERROR
  • 大数据时代的Tcaplus游戏存储

    大数据时代的Tcaplus游戏存储 shiweizhang 2015 10 27 1 7k浏览 游戏开发数据分析场景 想免费获取内部独家PPT资料库 观看行业大牛直播 点击加入腾讯游戏学院游戏开发行业精英群711501594 摘要 大数据具
  • 分布式系统一致性研究,paxos算法

    感谢eric的敦促 感谢shuai的感召 我尝试记录一点混乱的思考 什么是分布式系统 毋庸置疑 Internet和DNS是两个典型的成功的分布式系统 那么 分布式系统是不是就是计算机网络 1990年 Sun Microsystems 公司提
  • tikv的操作

    tikv的操作 kvproto master proto raft cmdpb proto message Request optional CmdType cmd type 1 optional GetRequest get 2 opti
  • TIDB简介及TIDB部署、原理和使用介绍

    TiDB简介及TiDB部署 原理和使用介绍 从MySQL架构到TiDB 数据库分类 介绍TiDB数据库之前 先引入使用场景 如今的数据库种类繁多 RDBMS 关系型数据库 NoSQL Not Only SQL NewSQL 在数据库领域均有
  • 香橙派4和树莓派4B构建K8S集群实践之八: TiDB

    目录 1 说明 2 准备工作 3 安装 3 1 参考Tidb官方 v1 5安装说明 3 2 准备存储类 3 3 创建crd 3 4 执行operator 3 5 创建cluster dashboard monitor容器组 3 6 设置访问
  • PingCAP 创始人刘奇:开源分布式数据库如何搞定 OLTP

    7月28日 以 科技 洞见未来 为主题的 QingCloud Insight 2016 大会将在北京召开 连接云计算产业链上下游 展示 IT 领域最新研发成果 作为 NewSQL 技术的代表 PingCAP 联合创始人 CEO 刘奇将在本次
  • 基于 TiDB 的 Apache APISIX 高可用配置中心的最佳实践

    项目背景 什么是 Apache APISIX API 网关作为微服务架构中的重要组件 是流量的核心出入口 用于统一处理和业务相关的请求 可有效解决海量请求 恶意访问等问题 保障业务安全性与稳定性 作为开源的云原生 API 网关 Apache
  • Golang Http Server源码阅读

    这篇文章出现的理由是业务上需要创建一个Web Server 创建web是所有语言出现必须实现的功能之一了 在nginx fastcgi php广为使用的今天 这里我们不妨使用Go来进行web服务器的搭建 前言 使用Go搭建Web服务器的包有
  • Raft一致性算法分析与总结

    Raft简介 Raft是一个用于日志复制 同步的一致性算法 它提供了和Paxos一样的功能和性能 但是它的算法结构与Paxos不同 这使得Raft相比Paxos更好理解 并且更容易构建实际的系统 为了强调可理解性 Raft将一致性算法分解为
  • okyo Cabinet简介

    http idning github io ssd cache html http blog 163 com zbr 4690 blog static 126613593200910312346337 http blog chinaunix
  • 猿创征文|国产数据库之TiDB详解和安装使用

    文章目录 前言 1 TiDB简介 2 TiDB架构 3 TiDB的安装使用 3 1 部署本地测试集群 3 2 在单机上模拟部署生产环境集群 4 在生产环境部署TiDB 4 1 软硬件环境需求及前置检查 4 2 环境与系统配置检查 4 3 在
  • /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found错误的解决

    http www cnblogs com weinyzhou p 4983306 html 在安装cmake3 5 1运行 bootstrap的时候出现如下提示 code class hljs asciidoc has numbering

随机推荐

  • Windows 10 自带的远程协助工具 快速助手

    概述 之前一直是使用 Teamviewer 来作为远程协助工具 但是最近发现控制端必须要登录账号才能使用 而且还有设备数量上的限制 所以就打算另找一个软件来代替 无意中发现了 原来在 Windows 10中已经内置了一个远程协助的工具 这下
  • 自学C语言(10)define定义常量和宏 内存 指针变量

    文章前言 学的太多 更新的太少了哈哈 总不能把学的忘记了 回顾知识 继续总结 文章目录 一 define定义常量和宏 1 define定义标识符常量 2 define定义宏 二 内存 内存 如何产生地址 计算机32位 二进制 计算机64位
  • css3——transform:rotate(旋转)、scale(缩放)、skew(拉伸)、translate(平移)、transform-origin

    注意 transform是复合属性 拆开写会替代 先平移再旋转和先旋转再平移的结果是不同的 1 CSS3 转换 transform属性可以对元素进行移动 缩放 转动 拉长或拉伸 注意 Internet Explorer 9 要求前缀 ms
  • git配置公私秘钥-小乌龟TortoiseGit

    1 大致步骤简述 1 需要将公钥放到gitLab上 私钥自己保存 2 使用puttygen exe来生成秘钥对 3 在gitLab上设置中配置SSH公钥 一串ssh rsa开头的 2 标题详细步骤 1 生产公私秘钥 安装好git后 右键打开
  • 数据预处理和特征工程

    数据预处理 从数据中检测 纠正 删除损坏的不准确的或者不适用于模型记录的过程 目的 让数据更加适应模型 匹配模型需求 特征工程 将原始数据转换为更能代表预测模型的潜在问题的特征工程 可以通过挑选最相关特征 提取特征以及创造特征来实现 其中创
  • UEeditor 使用 和图片上传

    首先 页面引入UEditor 下载地址 http ueditor baidu com website 页面引入很简单 这里加两个div的原因 是因为在使用中碰到了一个问题 UEditor把我外层的div样式过滤掉了 UEditor会把引入的
  • Android系统编译模块化

    mm指从当前目录开始编译 mmm是从指定目录下搜寻Android mk编译 模块编译完成后 回到source code所在根目录运行make snod进行打包 repo init u https aosp tuna tsinghua edu
  • mysql添加字段

    MySQL添加字段有两种方式 使用 ALTER TABLE 语句或使用 MySQL Workbench 工具 下面分别介绍这两种方法 使用 ALTER TABLE 语句添加字段 ALTER TABLE 语句可以用于修改表结构 包括添加 删除
  • Vue大屏可视化

    文章目录 前言 一 什么是可视化 二 参考资料 1 站酷 2 DataV组件库 3 DataV组件库示例Demo 三 项目实战 总结 前言 自己也使用Vue挺长时间了 之前一直做可视化相关的领域 但也不全是 考虑到如果有一些可视化模板示例可
  • 浅谈APT攻击

    如今高级持续性威胁 Advanced Persistent Threat APT 已成为人尽皆知的 时髦术语 越来越多的企业开始对其高度关注 政府部门也面临着遭受APT攻击的危险 在安全顾问的每一篇分析报告中都会提及它的 大名 众多企业机构
  • Atari 游戏训练 -- 2. 基于jupyter,图片处理 + state更新 + 经验回放数据初始化

    帧图片处理 openCV step1 图片灰度处理 图片灰度处理后 三通道 RGB gt gt 单通道 两种方式 常用的公式对三通道进行处理 ray R0 299 G0 587 B 0 114 openCV 直接灰度处理 img grey
  • sublime如何自动写出html头部,sublime text3快速生成html头部信息的方法

    sublime text3快速生成html头部信息的方法 发布时间 2020 12 28 09 05 51 来源 亿速云 阅读 107 作者 小新 这篇文章主要介绍sublime text3快速生成html头部信息的方法 文中介绍的非常详细
  • 《你不可不知的50个基因秘密》之同性恋取向

    查看原图 你不可不知的50个基因秘密 近来 公开出柜的明星越来越多 热聊的八卦新闻里也绝对不会缺少关于明星们的性取向问题 王力宏和李云迪的关系还是扑朔迷离 出于这样 那样的考虑 很多时候不是不想说 是不敢说 普通人亦是如此 那同性恋是一种病
  • 创客使用Fusion 360 - 草绘

    细节知识 Fusion 360 本文 您将学习基本的建模技巧 草图 草图是使参数模型参数化的原因 我们将研究工作平面及其设置 编辑和导入草图 了解驱动尺寸和从动尺寸之间的差异 并讨论约束 工作面板 工作平面是在其上绘制草图的网格化表面 下图
  • 在windows平台上使用Hyper-V搭建虚拟机集群环境

    在windows平台上使用Hyper V搭建虚拟机集群环境 开启windows服务 启动服务 下载镜像 创建虚拟机 安装linux系统 工具连接 多个虚拟机 总结 直接使用物理机的网卡 解决虚拟机网络慢的问题 开启windows服务 首先需
  • Java Optional使用指南

    提到NullPointerException 简称NPE 异常 相信每个Java开发人员都不陌生 从接触编程的第1天起 它就和我们如影随形 最近处理的线上bug中 有不少都是对象没判空导致的NullPointerException异常 1
  • Dictionary基本用法

    C 中字典Dictionary的用法 1 创建Dictionary Dictionary
  • 雹暴中心收集数据、大模型加持极端天气预测,「追风者也」正在上演

    内容一览 雷暴 冰雹 龙卷风等极端天气总是让人捉摸不透又避之不及 然而澳洲的研究者们却以身犯险 深入雹暴收集数据 只为让天气预报得更准 在超级计算机和 AI 的加持下 人类能否追上风暴 让混沌的天气系统不再那么捉摸不透 且看这部追风者们主演
  • eterm显示未连接服务器,eterm一直显示未链接服务器

    eterm一直显示未链接服务器 内容精选 换一换 自动恢复 弹性云服务器所在的硬件出现故障时 系统会自动将弹性云服务器迁移至正常的物理机 该过程会导致云服务器重启 云容器引擎CCE在国内首家发布了基于鲲鹏系列芯片的容器服务 鲲鹏容器集群 A
  • PingCAP 创始人刘奇:开源分布式数据库如何搞定 OLTP

    7月28日 以 科技 洞见未来 为主题的 QingCloud Insight 2016 大会将在北京召开 连接云计算产业链上下游 展示 IT 领域最新研发成果 作为 NewSQL 技术的代表 PingCAP 联合创始人 CEO 刘奇将在本次