• [交流吐槽] 进大厂必看的 MongoDB 面试题集锦
    1、MongoDB是什么?MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB旨在给Web应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组。2、MongoDB有哪些特点? MongoDB是一个面向文档存储的数据库,操作起来比较简单和容易。 你可以在MongoDB记录中设置任何属性的索引(如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。 如果负载的增加(需要更多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上这就是所谓的分片。 MongoDB支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。 MongoDB使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段。 MongoDB中的Map/Reduce主要是用来对数据进行批量处理和聚合操作。 Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。 Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。 GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。 MongoDB允许在服务端执行脚本,可以用JavaScript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。3、你说的NoSQL数据库是什么意思?NoSQL与RDBMS直接有什么区别?为什么要使用和不使用NoSQL数据库?说一说NoSQL数据库的几个优点?NoSQL是非关系型数据库,NoSQL = Not Only SQL。关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。在处理非结构化/半结构化的大数据时,在水平方向上进行扩展时,随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。再考虑数据库的成熟度,支持,分析和商业智能,管理及专业性等问题时,应优先考虑关系型数据库。4、NoSQL数据库有哪些类型?NoSQL数据库的类型例如:MongoDB、Cassandra、CouchDB、Hypertable、Redis、Riak、HBASE、Memcache等.5、MySQL与MongoDB之间最基本的差别是什么?MySQL和MongoDB两者都是免费开源的数据库。MySQL和MongoDB有许多基本差别包括数据的表示(data representation),查询,关系,事务,schema的设计和定义,标准化(normalization),速度和性能。通过比较MySQL和MongoDB,实际上我们是在比较关系型和非关系型数据库,即数据存储结构不同。6、你怎么比较MongoDB、CouchDB及CouchBase?MongoDB和CouchDB都是面向文档的数据库。MongoDB和CouchDB都是开源NoSQL数据库的最典型代表。除了都以文档形式存储外它们没有其他的共同点。MongoDB和CouchDB在数据模型实现、接口、对象存储以及复制方法等方面有很多不同。7、MongoDB成为最好NoSQL数据库的原因是什么?以下特点使得MongoDB成为最好的NoSQL数据库: 面向文件的 高性能 高可用性 易扩展性 丰富的查询语言8、journal回放在条目(entry)不完整时(比如恰巧有一个中途故障了)会遇到问题吗?每个journal(group)的写操作都是一致的,除非它是完整的否则在恢复过程中它不会回放。9、分析器在MongoDB中的作用是什么?MongoDB中包括了一个可以显示数据库中每个操作性能特点的数据库分析器。通过这个分析器你可以找到比预期慢的查询(或写操作);利用这一信息,比如,可以确定是否需要添加索引。10、namespace是什么?MongoDB存储BSON对象在丛集(collection)中。数据库名字和丛集名字以句点连接起来叫做namespace。11、如果用户移除对象的属性,该属性是否从存储层中删除?是的,用户移除属性然后对象会重新保存(re-save())。12、能否使用日志特征进行安全备份?是的。13、允许空值null吗?对于对象成员而言,是的。然而用户不能够添加空值(null)到数据库丛集(collection)因为空值不是对象,然而用户能够添加空对象{}。14、更新操作立刻fsync到磁盘?不会,磁盘写操作默认是延迟执行的。写操作可能在两三秒(默认在60秒内)后到达磁盘。例如,如果一秒内数据库收到一千个对一个对象递增的操作,仅刷新磁盘一次。(注意,尽管fsync选项在命令行和经过getLastError_old是有效的)15、如何执行事务/加锁?MongoDB没有使用传统的锁或者复杂的带回滚的事务,因为它设计的宗旨是轻量,快速以及可预计的高性能。可以把它类比成MySQL MylSAM的自动提交模式。通过精简对事务的支持,性能得到了提升,特别是在一个可能会穿过多个服务器的系统里。16、为什么我的数据文件如此庞大?MongoDB会积极的预分配预留空间来防止文件系统碎片。17、启用备份故障恢复需要多久?从备份数据库声明主数据库宕机到选出一个备份数据库作为新的主数据库将花费10到30秒时间。这期间在主数据库上的操作将会失败——包括写入和强一致性读取(strong consistent read)操作。然而,你还能在第二数据库上执行最终一致性查询(eventually consistent query)(在slaveOk模式下),即使在这段时间里。18、什么是master或primary?它是当前备份集群(replica set)中负责处理所有写入操作的主要节点/成员。在一个备份集群中,当失效备援(failover)事件发生时,一个另外的成员会变成primary。19、什么是secondary或slave?Seconday从当前的primary上复制相应的操作。它是通过跟踪复制oplog(local.oplog.rs)做到的。20、我必须调用getLastError来确保写操作生效了么?不用。不管你有没有调用getLastError(又叫Safe Mode)服务器做的操作都一样。调用getLastError只是为了确认写操作成功提交了。当然,你经常想得到确认,但是写操作的安全性和是否生效不是由这个决定的。21、我应该启动一个集群分片(sharded)还是一个非集群分片的MongoDB环境?为开发便捷起见,我们建议以非集群分片(unsharded)方式开始一个MongoDB环境,除非一台服务器不足以存放你的初始数据集。从非集群分片升级到集群分片(sharding)是无缝的,所以在你的数据集还不是很大的时候没必要考虑集群分片(sharding)。22、分片(sharding)和复制(replication)是怎样工作的?每一个分片(shard)是一个分区数据的逻辑集合。分片可能由单一服务器或者集群组成,我们推荐为每一个分片(shard)使用集群。23、数据在什么时候才会扩展到多个分片(shard)里?MongoDB分片是基于区域(range)的。所以一个集合(collection)中的所有的对象都被存放到一个块(chunk)中。只有当存在多余一个块的时候,才会有多个分片获取数据的选项。现在,每个默认块的大小是64Mb,所以你需要至少64Mb空间才可以实施一个迁移。24、当我试图更新一个正在被迁移的块(chunk)上的文档时会发生什么?更新操作会立即发生在旧的分片(shard)上,然后更改才会在所有权转移(ownership transfers)前复制到新的分片上。25、如果在一个分片(shard)停止或者很慢的时候,我发起一个查询会怎样?如果一个分片(shard)停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片(shard)响应很慢,MongoDB则会等待它的响应。26、我可以把moveChunk目录里的旧文件删除吗?没问题,这些文件是在分片(shard)进行均衡操作(balancing)的时候产生的临时文件。一旦这些操作已经完成,相关的临时文件也应该被删除掉。但目前清理工作是需要手动的,所以请小心地考虑再释放这些文件的空间。27、我怎么查看MongoDB正在使用的链接?db._adminCommand("connPoolStats"); 28、如果块移动操作(moveChunk)失败了,我需要手动清除部分转移的文档吗?不需要,移动操作是一致(consistent)并且是确定性的(deterministic);一次失败后,移动操作会不断重试;当完成后,数据只会出现在新的分片里(shard)。29、如果我在使用复制技术(replication),可以一部分使用日志(journaling)而其他部分则不使用吗?可以。30、当更新一个正在被迁移的块(Chunk)上的文档时会发生什么?更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。31、MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?不会,只会在A:{B,C}上使用索引。32、如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?如果一个分片停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片响应很慢,MongoDB会等待它的响应。33、MongoDB支持存储过程吗?如果支持的话,怎么用?MongoDB支持存储过程,它是JavaScript写的,保存在db.system.js表中。34、如何理解MongoDB中的GridFS机制,MongoDB为何使用GridFS来存储文件?GridFS是一种将大型文件存储在MongoDB中的文件规范。使用GridFS可以将大文件分隔成多个小文档存放,这样我们能够有效的保存大文档,而且解决了BSON对象有限制的问题。35、为什么MongoDB的数据文件很大?MongoDB采用的预分配空间的方式来防止文件碎片。36、分析器在MongoDB中的作用是什么?分析器就是explain显示每次操作性能特点的数据库分析器。通过分析器可能查找比预期慢的操作。37、如何执行事务/加锁?因为MongoDB设计就是轻量高性能,所以没有传统的锁和复杂的事务的回滚。38、getLastError的作用?调用getLastError可以确认当前的写操作是否成功的提交。39、MongoDB的结构介绍?数据库中存储的对象设计bson,一种类似json的二进制文件,由键值对组成。40、数据库的整体结构?键值对–》文档–》集合–》数据库41、MongoDB是由哪种语言写的?MongoDB用C++编写的,流行的开源数据库MySQL也是用C++开发的。C++于1983年发行,是一种使用广泛的计算机程序设计语言。它是一种痛用程序设计语言,支持多种编程模式。42、MongoDB的优势有哪些? 面向文档的存储:以JSON格式的文档保存数据。 任何属性都可以建立索引。 复制以及高可扩展性。 自动分片。 丰富的查询功能。 快速的即时更新。 来自MongoDB的专业支持。43、什么是集合?集合就是一组MongoDB文档。它相当于关系型数据库(RDBMS)中的表这种概念。集合位于单独的一个数据库中。一个集合内的多个文档可以有多个不同的字段。一般来说,集合中的文档都有着相同或相关的目的。44、什么是文档?文档由一组key value组成。文档是动态模式,这意味着同一集合里的文档不需要有相同的字段和结构。在关系型数据库中table中的每一条记录相当于MongoDB中的一个文档。45、什么是“mongod”?mongod是处理MongoDB系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操作。当我们运行mongod命令意味着正在启动MongoDB进程,并且在后台运行。46、“mongod”参数有什么? 传递数据库存储路径,默认是“/data/db” 端口号默认是“27017”47、什么是“mongo”?它是一个命令行工具,用于连接一个特定的mongod实例。当我们没有带参数运行mongo命令,它将使用默认的端口号和localhost连接。48、在MongoDB中如何创建一个新的数据库?MongoDB用use+数据库名称的方式来创建数据库。use会创建一个新的数据库,如果该数据库存在,则返回这个数据库。49、什么是非关系型数据库?非关系型数据库是对不同于传统关系型数据库的统称。非关系型数据库的显著特点是不使用SQL作为查询语言,数据存储不需要特定的表格模式。由于简单的设计和非常好的性能所以被用于大数据和Web Apps等。50、非关系型数据库有哪些类型? -Key-Value 存储,eg:Amazon S3 图表,eg:Neo4J 文档存储,eg:MongoDB 基于列存储,eg:Cassandra51、为什么用MongoDB? 架构简单 没有复杂的连接 深度查询能力,MongoDB支持动态查询 容易调试 容易扩展 不需要转化/映射应用对象到数据库对象 使用内部内存作为存储工作区,以便更快的存取数据52、在哪些场景使用MongoDB? 大数据 内容管理系统 移动端Apps 数据管理53、MongoDB中的命名空间是什么意思?MongoDB内部有预分配空间的机制,每个预分配的文件都用0进行填充。数据文件每新分配一次,它的大小都是上一个数据文件大小的2倍,每个数据文件最大2G。MongoDB每个集合和每个索引都对应一个命名空间,这些命名空间的元数据集中在16M的*.ns文件中,平均每个命名占用约628字节,也即整个数据库的命名空间的上限约为24000。如果每个集合有一个索引(比如默认的_id索引),那么最多可以创建12000个集合。如果索引数更多,则可创建的集合数就更少了。同时,如果集合数太多,一些操作也会变慢。要建立更多的集合的话,MongoDB也是支持的,只需要在启动时加上“--nssize”参数,这样对应数据库的命名空间文件就可以变得更大以便保存更多的命名。这个命名空间文件(.ns文件)最大可以为2G。每个命名空间对应的盘区不一定是连续的。与数据文件增长相同,每个命名空间对应的盘区大小都是随分配次数不断增长的。目的是为了平衡命名空间浪费的空间与保持一个命名空间数据的连续性。需要注意的一个命名空间$freelist,这个命名空间用于记录不再使用的盘区(被删除的Collection或索引)。每当命名空间需要分配新盘区时,会先查看$freelist是否有大小合适的盘区可以使用,如果有就回收空闲的磁盘空间。54、哪些语言支持MongoDB?C、C++、C#、Java、Node.js、Perl、PHP等。55、在MongoDB中如何查看数据库列表?使用命令:show dbs 
  • [其他] 创建失败,执行到RdsCreateInstanceTask失败
    创建失败,执行到RdsCreateInstanceTask【问题现象】    创建集群,创建失败,大概在创建到3x%时创建失败,执行到RdsCreateInstanceTask失败,三个节点有两个节点实例创建成功,一个节点失败【分析过程】        1.查看数据库中的失败步骤            1)登录dwscontroller服务后台数据库mysql           2)执行select task.job_id, task.task_name, task.begin_time, task.listener_num, task.retry_num, task.execution_status from rds_instance ins left join  taskmgr_task task on ins.jobId=task.job_id left JOIN taskmgr_job  job on  task.job_id=job.job_id where ins.`name` like '%集群名称%' order by task.job_id,task.begin_time;           3)查看execution_status列为"FAIL"及 对应的job_id        2.根据job_id从dwscontroller日志获取具体的错误信息           #grep {job_id} ossres-dws.log           有错误信息:"error_code":"BMS.0042","error_code":"BMS.0006"        3.bms0042是规格问题需要核对裸金属规格和controller数据库中的底层规格是否一致    1)mysql中查询对应的底层规格    select c.* from rds_cluster_spec a ,rds_cluster_instance_resspec b,rds_resSpecAttr c    where a.id=b.cluster_spec_id and b.instance_spec_id=c.specId    and a.`code`='集群使用的裸金属规格';            2)查询serviceOM中裸金属的对应的规格信息           核对标准 cpu,dataDisk,diskNum,dnNum,mem,raidNum需要对应一致        4.规格核对没有问题,发现ManageOne SC DWS数据仓库里面添加不上裸金属的可用分区 普通发放BMS的时候可以选择到这个可用分区下发集群的可用分区与裸金属的可用分区不一致;解决方法:https://bbs.huaweicloud.com/forum/thread-124480-1-1.html
  • [技术干货] InfluxDB的基本操作
    InfluxDB是一个当下比较流行的时序数据库,InfluxDB使用 Go 语言编写,无需外部依赖,安装配置非常方便,适合构建大型分布式系统的监控系统。一、InfluxDB操作方式InfluxDB提供三种操作方式:1)客户端命令行方式2)HTTP API接口3)各语言API库今天主要以命令行为例,为大家介绍下InfluxDB的基本操作,HTTP API接口和各种语言API库会在以后的文章中为大家详细介绍。二、InfluxDB数据库操作如同MYSQL一样,InfluxDB提供多数据库支持,对数据库的操作也与MYSQL相同。1)显示数据库:> show databasesname: databases---------------nametelegraf_internallirtestDBtestMyDb2)新建数据库:> create database test> show databasesname: databases---------------nametelegraf_internallirtestDBtestMyDbxk_nametest3)删除数据库> drop database test> show databasesname: databases---------------nametelegraf_internallirtestDBtestMyDbxk_name4)使用某个数据库> use xk_nameUsing database xk_name三、InfluxDB数据表操作在InfluxDB当中,并没有表(table)这个概念,取而代之的是MEASUREMENTS,MEASUREMENTS的功能与传统数据库中的表一致,因此我们也可以将MEASUREMENTS称为InfluxDB中的表。1)显示所有表> SHOW MEASUREMENTSname: measurements------------------nameweather2)新建表InfluxDB中没有显式的新建表的语句,只能通过insert数据的方式来建立新表。如下所示:insert disk_free,hostname=server01 value=442221834240i 1435362189575692182其中 disk_free 就是表名,hostname是索引,value=xx是记录值,记录值可以有多个,最后是指定的时间执行后结果如下> select * from disk_freename: disk_free---------------time hostname value1435362189575692182 server01 4422218342403)删除表> drop measurement disk_free> show measurementsname: measurements------------------nameweather四、数据操作1)增加数据增加数据采用insert的方式,要注意的是 InfluxDB的insert中,表名与数据之间用逗号(,)分隔,tag和field之间用 空格分隔,多个tag或者多个field之间用逗号(,)分隔。> insert disk_free,hostname=server01 value=442221834240i 1435362189575692182> select * from disk_freename: disk_free---------------time hostname value1435362189575692182 server01 442221834240在这条语句中,disk_free是表名,hostname=server01是tag,属于索引,value=xx是field,这个可以随意写,随意定义。2)查询数据查询语句与SQL一样,在此不再赘述。3)修改和删除数据InfluxDB属于时序数据库,没有提供修改和删除数据的方法。但是删除可以通过InfluxDB的数据保存策略(Retention Policies)来实现,这个会在以后的文章中讲到。五、series操作series表示这个表里面的数据,可以在图表上画成几条线,series主要通过tags排列组合算出来。我们可以查询表的series,如下所示:> show series from memkeymem,host=ResourcePool-0246-billing07mem,host=billing07六、界面操作InfluxDB还提供了管理界面,大大降低了入门难度,在启动了InfluxDB服务之后,直接输入 <IP>:8083 即可访问界面。
  • [行业资讯] 什么是时序数据库
    1.时序数据库的定义时序数据是随时间不断产生的一系列数据,简单来说,就是带时间戳的数据。时序数据库 (Time Series Database,TSDB) 是优化用于摄取、处理和存储时间戳数据的数据库。此类数据可能包括来自服务器和应用程序的指标、来自物联网传感器的读数、网站或应用程序上的用户交互或金融市场上的交易活动。时序数据的主要数据属性如下:每个数据点都包含用于索引、聚合和采样的时间戳。该数据也可以是多维的和相关的;写多读少,需要支持秒级和毫秒级甚至纳秒级高频写入;查询通常是多维聚合查询,对查询的延迟要求比较高数据的汇总视图(例如,下采样或聚合视图、趋势线)可能比单个数据点提供更多的洞察力。例如,考虑到网络不可靠性或传感器读数异常,我们可能会在一段时间内的某个平均值超过阈值时设置警报,而不是在单个数据点上这样做;分析数据通常需要在一段时间内访问它(例如,给我过去一周的点击率数据);虽然其他数据库也可以在数据规模较小时一定程度上处理时间序列数据,但 TSDB可以更有效地处理随时间推移的数据摄取、压缩和聚合。以车联网场景为例,20000辆车,每个车60个指标,假设每秒采集一次,那么每秒将上报20000 * 60 = 1200000指标值,即120W数据指标值每秒,每个指标值为16字节(假设仅包括8字节时间戳和8字节的浮点数),则每小时将产生64G左右的数据。而实际上每个指标值还会附带标签等额外数据,实际需要存储空间会更大。简而言之,时序数据库是专门用于存储和处理时间序列数据的数据库,支持时序数据高效读写、高压缩存储、插值和聚合等功能。2.时序数据库相关概念时序数据库是专门处理时序数据的数据库,因此其相关概念是和时序数据紧密联系的,下面是时序数据库的一些基本概念。* 度量 Metric:Metric 类似关系型数据库里的表(Table),代表一系列同类时序数据的集合,例如为空气质量传感器建立一个 Table,存储所有传感器的监测数据。* 标签 Tag:Tag 描述数据源的特征,通常不随时间变化,例如传感器设备,包含设备 DeviceId、设备所在的 Region 等 Tag 信息,数据库内部会自动为 Tag 建立索引,支持根据 Tag 来进行多维检索查询;Tag 由 Tag Key、Tag Value 组成,两者均为 String 类型。* 时间戳 Timestamp:Timestamp代表数据产生的时间点,可以写入时指定,也可由系统自动生成;* 量测值 Field:Field描述数据源的量测指标,通常随着时间不断变化,例如传感器设备包含温度、湿度等Field;* 数据点Data Point: 数据源在某个时间产生的某个量测指标值(Field Value)称为一个数据点,数据库查询、写入时按数据点数来作为统计指标;* 时间线 Time Series :数据源的某一个指标随时间变化,形成时间线,Metric + Tags + Field 组合确定一条时间线;针对时序数据的计算包括降采样、聚合(sum、count、max、min等)、插值等都基于时间线维度进行;3.时序数据库的发展趋势时序数据库的发展趋势,可以从DB-engines(Knowledge Base of Relational and NoSQL Database Management Systems)获取获取到,下图是DB-engines收录的数据库近24个月的发展趋势,其中时序数据库的活跃度最高,且随时间呈现越来越活跃的趋势。下图是DB-engines收录的时序数据库的排名,其中排名最高的时序数据库是2013年开源的InfluxDB。时序数据库应用场景时序数据库的应用场景在物联网和互联网APM等场景应用比较多,下面是列举了一些时序数据库的应用场景,但不是全部:* 公共安全:上网记录、通话记录、个体追踪、区间筛选;* 电力行业:智能电表、电网、发电设备的集中监测;* 互联网:服务器/应用监测、用户访问日志、广告点击日志;* 物联网:电梯、锅炉、机械、水表等各种联网设备;* 交通行业:实时路况、路口流量监测、卡口数据;* 金融行业:交易记录、存取记录、ATM、POS机监测;
  • [酷哥说库] 【技术之声】第二十二期(20220606)数据库资讯精选
    大家好!我是酷哥,数据库相关资讯,带您速览,欢迎大家阅读。 ------------------------------------------------ **本期精选** ------------------------------------------------ - 计世指数-数据库产品影响力指数发布会成功召开 - 数据库未来:湖仓一体新趋势 - 推动数据中心绿色高质量发展的技术趋势和解决思路 - 数据资产如何确权认责 - 大数据时代的“冷热数据”管理 - Gartner发布2022年银行技术趋势,包含隐私增强计算 - 摘取皇冠上的明珠,华为云数据库的创新与探索 ------------------------------------------------ **资讯摘要** ------------------------------------------------ - 计世指数-数据库产品影响力指数发布会成功召开 **摘要:** 5月28日,围绕数据库产品,成功举办“计世指数-数据库产品影响力指数”线上发布会。本次发布会包括30个分布式数据库产品和8个集中式数据库产品。 数据库是IT系统存储和计算的基础,广泛应用于各行业,随着数据资源的爆发式增长,数字经济的发展壮大,迎来高速发展的重要机遇。数据库产品影响力指数旨在能够客观反映我国数据库的发展及应用情况,促进技术产品创新和行业应用,推动数据库产业高质量发展。 **文章详情:** [https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=189787](https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=189787) - 数据库未来:湖仓一体新趋势 **摘要:** 随着企业数字化转型的推进,越来越多的企业视湖仓一体为数字化变革的契机。当然,关注度越高,市场上嘈杂的声音也就越多。 在实际业务场景中,数据的移动不只是存在于数据湖和数据仓库之间,湖仓一体不仅需要把数仓和数据湖集成起来,还要让数据在服务之间按需流动。 湖仓一体化架构,可以方便、快捷地将大量数据从数仓转移至数据湖内,同时这些移到湖里的数据,仍然可以被数仓查询使用。 目前湖仓一体已广泛应用于金融、电信、交通等行业。在PB级的数据量下,可以为企业节省上百万的服务器采购成本,充分实现了降本提效的目标。 **文章详情:** [https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=189797](https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=189797) - 推动数据中心绿色高质量发展的技术趋势和解决思路 **摘要:** 5月26日,在贵州举行的2022中国国际大数据产业博览会“东数西算:构建国家算力网络体系”论坛上,由华为技术有限公司(以下简称“华为”)与国家信 息 中心、贵州省大数据发展管理局和粤港澳大湾区大数据研究院联合发布了《“碳达峰、碳中和”背景下数据中心绿色高质量发展研究报告》(以下简称《研究报告》)。 在推动数据中心绿色高质量发展的技术趋势和解决思路专项建议中,《研究报告》重点阐述了四大存储技术方向。即如何利用全闪存储技术、存算分离架构、数据重删压缩、数据密集型存储等技术推动在“东数西算”的背景下高质量达成数据中心“碳中和、碳达峰”目标。 **文章详情:** [https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=189523](https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=189523) - 数据资产如何确权认责 **摘要:** 2020年04月10日,中 共 中 央、国务院印发《关于构建更加完善的要素市场化配置体制机制的意见》,将数据定义为与土地、劳动力、资本、技术并列的第五大生产要素——数字化时代的一种新型的生产要素。数据的价值越来越重要!然而对于“数据”,各个国家的法律似乎还没有准确界定数据资产权责体系。 所谓数据确权,就是确定数据的权利属性,主要包含两个层面:第一是确定数据的权利主体,即谁对数据享有权利。第二是确定权利的内容,即享有什么样的权利。 从这两个层面看,数据从产生到消亡的整个生命周期中,主要涉及四类角色,即:数据所有者、数据生产者、数据使用者和数据管理者。而确权就是针对特定的数据资产明确定义这四类角色的过程。也就是说,不同的数据资产其所有者、生产者、使用者和管理者可能不同。 **文章详情:** [https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=189529](https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=189529) - 大数据时代的“冷热数据”管理 **摘要:** 冷热数据主要从数据访问频度、更新频度进行划分。冷数据,即实际生产中被访问、更新频度比较低、概率比较低的数据。热数据,访问、更新频度较高,未来被调用的概率较高的数据。冷数据在业务场景中计算时效要求慢,可以做集中化部署,可以对数据进行压缩、去重等降低成本的方法。热数据因为访问频次需求大,效率要求高,可以高性能存储与就近计算部署; 数据冷热管理最核心目标提高算力利用率,所谓算力通常包含CPU、GPU、内存、带宽等能力,算力瓶颈在于单位时间内处理数据能力。视频、人工智能等领域的算力消耗集中在对大规模数据及参数的“算法”的计算处理。在传统行业领域以结构化数据为主,算力消耗集中在“订单、客户、事件”三大类数据的搬运、数据排序、数据关联、数据合并、数据算术运算、数据的查询等。 希望通过对数据冷热区分,精准识别出“热”数据,减少对“冷数据”的搬运、关联、排序、计算等,把算力集中在刀刃上,实现数据处理“提速、降本”。 **文章详情:** [https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=190217](https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=190217) - Gartner发布2022年银行技术趋势,包含隐私增强计算 **摘要:** 数博5月31日消息,Gartner发布了2022年银行和投资服务行业的三大热门技术趋势,分别是:生成式AI、自主系统和隐私增强计算。Gartner指出,这三项趋势将在未来两到三年内继续增长,推动金融服务机构的增长和转型。 Gartner研究副总裁Moutusi Sau表示:“虽然金融服务机构的首要事项是增长,但他们同样需要新的技术创新来管理风险、优化成本和提高效率。银行首席信息官可以通过生成式AI为追求收入增长的业务提供技术解决方案,而自主系统和隐私增强计算是能够为金融服务业务转型带来各种新选项的长期解决方案。” **文章详情:** [https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=189958](https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=189958) - 摘取皇冠上的明珠,华为云数据库的创新与探索 **摘要:** 在国内做数据库,是一件很具挑战性的事情,因为这是基础软件皇冠上的明珠,是卡脖子的关键技术。 从海外厂商攻城略池的垄断到国产数据库厂商的艰难成长,从去IOE浪潮下的国产替代再到如今的百花齐放的市场局面,国产数据库产业一路走来,背后都是一批批企业和个人的信念与坚守。 目前,GaussDB立足创新与自研,基于同一架构,一方面拥抱并兼容主流关系型数据库生态如MySQL及非关系型数据库 MongoDB、Redis等生态,另一方面围绕自身开源的openGauss生态,打造面向政企客户,强调高性能、高可靠、高安全的产品。 **文章详情:** [https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=190216 ](https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=190216) 上一期:[【技术之声】第二十一期(20220530)数据库资讯精选](https://bbs.huaweicloud.com/forum/thread-189422-1-1.html) *声明:文章源于第三方公开的信息,如果存在侵权或信息不实时,请及时联系处理。* 整理者:酷哥
  • [行业资讯] 2021年七个优秀的PostgreSQL GUI软件
    51CTO.com快译】什么是PostgreSQL GUI?它如何帮助企业管理PostgreSQL数据库?人们需要了解2021年一些优秀的PostgreSQL GUI软件。PostgreSQL是一种先进的开源对象关系数据库管理系统,可以支持SQL和JSON查询。根据Stack Overflow公司的一项调查,PostgreSQL是目前仅次于MySQL的第二大常用数据库。在对7万多名受访者的调查中,超过40%的人表示更喜欢采用PostgreSQL,而不是SQLite、MongoDB、Redis等其他数据库。作为Postgres用户,有两种方法来管理数据库:通过命命令行界面(CLI)编写查询(并非所有人都喜欢)。使用Postgres GUI,该界面由PostgreSQL管理工具之一构建。Postgres GUI比命令行界面(CLI)方便得多。此外,它还可以提高企业的工作效率。以下了解一下Postgres GUI和最常用的PostgreSQL GUI工具。什么是PostgreSQL GUI?PostgreSQL GUI是PostgreSQL数据库的管理工具。它允许企业或数据库用户查询、可视化、操作、分析其Postgres数据。还可以通过Postgres GUI访问数据库服务器。很多用户更喜欢Postgres GUI而不是CLI的主要原因是:漫长的学习曲线和复杂的使用流程。CLI界面不便于使用。控制台提供的信息不足。难以通过控制台浏览和监控数据库。反过来,使用Postgres GUI可为企业提供以下优势:快捷方式可用于更快、更简单的工作。丰富的数据可视化机会。可以访问远程数据库服务器。轻松地访问操作系统。优秀的PostgreSQL GUI软件对于某些用户来说,以Postgres为中心的pgAdmin并不是目前唯一可用的Postgres GUI工具,这可能出乎人们的意料。以下了解一下如今流行的一些PostgreSQL GUI管理工具。也许其中之一将会显著简化Postgres数据库管理。1.pgAdminpgAdmin是一个开源的跨平台PostgreSQL GUI工具。优点:与Linux、Windows、macOS兼容。允许同时使用多个服务器。CSV文件导出。查询计划功能。能够通过仪表板监控会话、数据库锁定。SQL编辑器中的快捷方式,使工作更方便。内部程序语言调试器旨在帮助代码调试。完整的文档和充满活力的社区。缺点:与一些付费的工具相比,其用户界面运行缓慢且不直观。笨重。不易上手。企业需要高级技能才能同时使用多个数据库。2.DBeaver这是一个支持多数据库的开源PostgreSQL管理工具。优点:跨平台。支持80多个数据库。作为可视化查询生成器,允许企业在没有SQL技能的情况下添加SQL查询。具有多个数据视图。CSV、HTML、XML、JSON、XLS、XLSX中的数据导入/导出。高级数据安全性。全文数据搜索和将搜索结果显示为表格/视图的能力。提供免费计划。缺点:与竞争对手相比运行速度较慢。更新过于频繁,令人烦恼。在闲置一段时间后,DBeaver会断开与企业的数据库的连接。企业需要重新启动应用程序。3.Navicat这是一个非常直观的Postgres数据库管理图形工具。Navicat并不是开源的工具。优点:非常容易和快速安装。获得Windows、Linux、macOS、iOS支持。方便快捷的可视化SQL构建器。具有代码自动完成功能。数据建模工具:操作企业的数据库对象、设计模式。作业调度程序:运行作业,在作业完成时获得通知。内置团队协作。数据源同步。以Excel、Access、CSV和其他格式导入/导出数据。通过SSH隧道和SSL确保数据保护。与亚马逊、谷歌和其他公司的云计算服务商合作。缺点:GUI工具性能不高。与竞争对手相比价格偏高。一个许可证只限于一个平台(用户需要PostgreSQL和MySQL两个单独的许可证)。许多高级功能需要时间来学习如何使用。使用不方便:添加行时需要更新应用程序。4.DataGrip由JetBrains构建的支持多个数据库的高级IDE。优点:跨平台(Windows、macOS、Linux支持)。简单的架构导航。带有查询控制台的可自定义用户界面(UI),可确保企业的工作进度安全。提示错误检测。内置版本控制系统。MySQL、SQLite、MariaDB、Cassandra和其他数据库支持。清晰的报告,能够将它们与图表和图形集成。强大的自动完成功能,建议相关代码完成。缺点:相当昂贵。消耗内存。复杂的错误调试过程。DataGrip和JetBrains具有长期的学习曲线。难以用作基于云计算的管理Web应用程序。不适合同时管理多个数据库。5.HeidiSQL这是一个开源Postgres(不仅仅是)GUI工具。现在仅支持Windows。优点:易于安装,与竞争对手相比非常轻巧。PostgreSQL、MySQL、Microsoft SQL Server、MariaDB支持。能够在一个窗口中连接和管理多个数据库服务器。从一个数据库或服务器到另一个数据库或服务器的直接SQL导出。通过简单易用的网格进行批量表格浏览和编辑。代码完成和语法突出显示功能。活跃的支持社区定期增强这个GUI工具。网格和数据导出为Excel、HTML、JSON、PHP文件。100%加密数据连接。缺点:不能跨平台使用(仅支持Windows)。问题频繁出现。没有程序语言调试器来简单地进行代码调试。6.TablePlus用于管理SQL和NoSQL数据库的原生GUI软件。TablePlus并不是开源的工具。优点:根据用户的反馈提供高性能和速度。高度可定制的用户界面:根本无需求助于Mojave。支持语法突出显示。快捷方式可以节省时间并提高效率。由于客户端-服务器连接的端到端加密,确保了更高级别的数据安全。缺点:当企业使用PostgreSQL以外的其他数据库时,经常出现用户体验不佳的问题。价格昂贵。而免费试用的功能进行严格限制。客户支持还有很多需要改进的地方。7.OmniDB这是一个简单的PostgreSQL开源GUI管理工具。优点:跨平台(获得Windows、Linux、macOS支持)。获得PostgreSQL、Oracle、MySQL、MariaDB支持。与某些替代品相比,响应速度快且更加轻巧。SQL自动完成功能。具有语法高亮显示功能。能够创建可定制的图表以显示相关的数据库指标。内置调试​​功能。缺点:如果同时使用多个数据库,则不是很适合。缺乏支持和学习文件。结语当企业选择GUI软件时,应该基于以下几个方面做出最终决定:团队规模。操作系统。数据库类型。计划使用的多个数据库。DBeaver、DataGrp和HeidiSQL更适合个人使用的数据库。由于具有GUI工具协作功能,Navicat是团队的最佳选择。除了支持Windows的HeidiSQL之外,几乎所有提到的工具都是跨平台的。pgAdmin以PostgreSQL为中心,作为PostgreSQL GUI工具的功能相当强大。但是采用可视化的内部工具构建器有UI Bakery。如果需要将多个不同的数据源集成在一起,那么这个低代码开发平台非常有用——无论是数据库、第三方工具还是API。而企业不必只局限在一个生态系统中。UI Bakery不是Postgres原生的。但是,它的数据可视化功能允许企业根据从PostgreSQL、MySQL、MS SQL Server、MongoDB、Redis、Salesforce和一系列其他数据库和应用程序中提取的数据,构建真正美观、易懂的图表、表格和图形。企业还可以使用预构建的用户界面(UI)组件和模板,避免从头开始构建,并节省更多的时间。如果企业不确定内部工具构建器适合自己的特定需求,可以继续进行尝试。整个GUI工具开发过程可能需要数小时的时间,有时甚至低至数分钟,具体取决于企业的开发经验。pgAdmin和其他经典的GUI软件似乎正在失去吸引力。Postgres和其他数据库管理的低代码方法使企业可以在更短的时间内获得更好的结果。原文标题:Top 8 PostgreSQL GUI Software in 2021,作者:Ilon Adams【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】
  • [技术干货] 1机or双机
    # 首先发一个私货,小编独创的作品,自我估值百万 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/6/1654482666934792153.gif) # 好消息好消息,只需要一台机器,就可以使用om安装opengauss一主一备,一主两备,一主三备。。。 # gitee下载[opengauss-OM主仓](https://gitee.com/opengauss/openGauss-OM)最新代码,重新编辑xml xml如下,主要是把clusterType的值设置为single-inst-one-node,然后给每个实例配置端口和目录 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/6/1654482703608598509.PNG) 演示环境使用的是openeuler22.03,自带的python3.9 ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/6/1654482734503432944.PNG) 由于om自带的三方库不匹配python3.9,需要自行安装paramiko,psutil,netifaces,命令如下 ``` yum install python3-devel pip install paramiko pip install psutil pip install netifaces ``` 按步骤执行预安装,--unused-third-party 参数表示放弃使用om的三方库,使用系统自带的 ``` ./script/gs_preinstall -U hj0601 -G hj0601 -X single.xml --unused-third-party ``` ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/6/1654483629542985336.gif) 再执行安装 ``` gs_install -X /opt/software/single.xml ``` ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/6/1654483662988148747.gif) 安装完毕,验货,查看数据库状态并访问数据库,主库正常操作,备机只读,okey~~ ``` gs_om -t status --detail ``` ![](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/6/1654483685760717728.gif)
  • [技术干货] 摘取皇冠上的明珠,华为云数据库的创新与探索
    在国内做数据库,是一件很具挑战性的事情,因为这是基础软件皇冠上的明珠,是卡脖子的关键技术。 从海外厂商攻城略池的垄断到国产数据库厂商的艰难成长,从去IOE浪潮下的国产替代再到如今的百花齐放的市场局面,国产数据库产业一路走来,背后都是一批批企业和个人的信念与坚守。 冯柯便是其中的一员,在20年的技术一线工作中,他见证了国产数据库的蹒跚前进,也亲身参与到互联网和云时代,由市场主导的分布式数据库建设浪潮中。 作为华为数据库领域科学家、华为云数据库GaussDB首席架构师,冯柯正在推动着数字化转型下国产分布式数据库在关键行业的深入应用。本期的 《云享人物·大咖面对面》,华为云开发者社区将以这位数据库行业领军人物的视角,去探索数据库产业冰山之下的世界。(如果你也对数据库感兴趣,文末彩蛋藏有最完整的数据库学习路径、最干货的实战训练资料包,一定不能错过哦!) < 那些年,与国产数据库共沉浮 >上个世纪90年代,以Oracle、DB2为代表的国际商业数据库进入国内市场,拿下电信、金融、政务等重要行业的大单,应用于各类核心系统和周边系统。 彼时的国内数据库产业刚刚起步,在国家政策主导下,最早一批成立的数据库公司主要由高校和科研院所主导,技术上也以跟随国际厂商为主。 也正是在这样的时代背景下,当时在浙大研究数据存储的冯柯,加入到了学校和企业联合的数据库产品化项目中,自此踏上数据库研发生涯,一直到今天。 冯柯强调,“在这个时期,国内的数据库完成了初始的技术和产业积累,更重要的是,它给我们这个行业培养了一大批骨干人才。”如果没有这些人,高技术壁垒的数据库产业会如同无源之水,无本之木。于国内数据库产业来说,地利与人和均已就位,就差天时了。 进入互联网时代,当人们的衣食住行都转向在线服务化,传统的商业数据库愈发显得力不从心。与此同时,国产数据库的产品在广度和深度都有了新的变化,关系型、非关系型、图数据库、时序数据库……百花齐放。 而云计算的发展,好似平地一声雷,将数据库产业推入了一个新的浪潮里。 当前,千行百业都在向数字化转型,应用上云已经是大势所趋,而云也成为数据库部署的主要形态。Gartner的统计显示,2022年云数据库在整个数据库市场中的占比首次达到50%;在中国,到2025年,81%的数据库将会跑在云平台之上。 随着数据库和云的理念深度结合,华为也将早年为解决电信领域数据问题而研发的华为数据库进行全面战略升级,打造了涵盖关系型与非关系型数据库在内的GaussDB系列全场景云服务。冯柯和其团队当前的工作重点,就是华为云GaussDB数据库的研发和产业化应用。 冯柯认为“云计算拉低了数据库行业的应用门槛,单点的技术已经不再是市场发展的绝对性瓶颈,数据库的技术壁垒开始松动。比如对云上数据库的评价更多的是集中在服务能力,也就是说如何让用户能像使用云资源一样随时随地可获得数据库服务。” 云的发展推动了整个国产数据库市场的快速崛起,冯柯感慨道:“我们看到金融行业的头部客户,以及一些互联网头部厂商,在他们的核心业务中开始落地使用国产数据库,这是在过去10年无法想象的事情。“ 他表示,这些变化也意味着国产数据库已经从政策驱动转向了产品市场主导。 而行业的嬗变也不断地重塑着他对技术的理解,尤其是分布式数据库这个具有代表性的技术产业赛道。 < 厚积薄发,分布式数据库的春天 >互联网及云化时代的到来,使得企业业务架构产生巨大变化。过去的集中式数据库已经无法满足越来越多的业务场景,市场的需求推动了底层数据库的分布式改造。另一方面,企业对自身IT架构的开放性和自主诉求也越来越高,这进一步牵引了分布式数据库的普及应用。 虽然去O呼声高涨,但是打破这种传统商业数据库的“垄断”局面又谈何容易。想要冲出传统数据库的包围圈,冯柯指出数据库产品要能回答这三个核心问题:一是解决高可用问题,如何打消客户对系统可用性可靠性的疑虑;二是解决性能问题,如何解决客户对数据库、以及构建其上的应用性能的疑虑;三是业务的平滑迁移,如何降低整个过程的实施成本和风险。而以上种种又都可以从技术层面解决,这也是冯柯带领的GaussDB在实际业务实践中给客户带来的价值所在。 目前,GaussDB立足创新与自研,基于同一架构,一方面拥抱并兼容主流关系型数据库生态如MySQL及非关系型数据库 MongoDB、Redis等生态,另一方面围绕自身开源的openGauss生态,打造面向政企客户,强调高性能、高可靠、高安全的产品。 冯柯认为,由于分布式数据库经历了一个相对混乱的时代,导致整个产品和解决方案的边界模糊不清。 “有的客户虽然没有应用分布式数据库,但他们在业务架构上做过分布式改造和落地。就产生一个后果:在很多场景下,大家对于分布式数据库应该解决什么问题,哪些问题应该通过数据库来解决,哪些应该通过业务或者中间件层来解决,其实不是非常清楚。” 所以,分布式数据库行业标准的落地,打造重点行业典型应用场景的标杆案例,帮助市场清晰界定应用解决方案与产品的边界显得至关重要。 业内不乏这样成功的案例,比如刚刚过去的4月,中国邮政储蓄银行新一代个人业务分布式核心系统全面投产上线。该系统是大型商业银行中首家同时采用企业级业务建模和分布式微服务架构,基于鲲鹏硬件底座、openGauss开源数据库与GaussDB分布式云数据库共同打造。系统上线后可具备为全行6.37亿个人客户、4万个网点提供日均20亿笔,峰值6.7万笔/秒的交易处理能力。 海量交易数据的背后,也标志着国内的分布式数据库产品在性能和产品成熟度上,逐渐能与国际商业数据库持平甚至超越。 < 揭秘GaussDB冰山下的能力 >GaussDB之所以能够支撑邮政储蓄银行的个人业务分布式核心系统上线,成功实现对国外商业数据库的取代,很关键的一点在于它“集成”了华为自身的三大优势:首先是高研发投入带来的高收益和技术领先,华为布局了全球7大研究所来构建数据库研发能力,汇聚了全球1000+的数据库专家人才。其次是完整的软硬技术栈,涵盖芯片、服务器、存储、网络、操作系统、数据库全栈软硬件,具备数据库软硬性能调优的独特优势。最后是独具一格的生态建设,华为把生态当做业务来做,会去平衡生态中的商业利益共享,去跟伙伴分享市场机会。在此基础上结合对客户业务和需求的理解,GaussDB实现了国产数据库在性能和产品上的突破。以高可用为例,GaussDB两地三中心的高可用解决方案已经在国有大行,从边缘到核心系统全类业务进行了验证,满足金融监管的要求。 在全栈能力方面,GaussDB垂直整合华为软硬件资源,比如将华为在存储上的优势,深入融合到数据库的存算分离架构上,包括NDP(Near Data Processing)近数据处理,让数据库的计算逻辑充分利用下面整个存储池的能力,并且更进一步,将NDP与PQ(Parallel Query)相结合,提高复杂查询处理能力。 同时,通过全密态加密技术来保证保护敏感数据的全生命周期安全。并将AI技术融入到数据库内核中,实现参数自调优和智能索引推荐,降低运维侧的复杂度和成本。 冯柯总结了GaussDB的六大竞争点:高可用、软硬深度协同、企业级混合负载、云原生多主、数据安全与可信、AI-Native(智能运维与调优)。具体可以参考阅读《华为云数据库战略启示录》。https://bbs.huaweicloud.com/blogs/308803在冯柯看来,所有的技术问题来自于你解决什么样的诉求。 对于一些需要云原生数据库的企业来说,GaussDB通过软硬协同、架构的融合、混合负载和智能化运维,让数据库的使用和水电资源一样简单易得。而面向政企,GaussDB在上述基础之上会更强调高可用、安全方面的考量,像使用单机集中式数据库一样可靠可用。 比如在工商银行核心交易系统分布式改造中,他们将贵金属交易系统、渠道类业务、商密公文系统等核心业务从传统封闭的集中式商业数据库平滑切换到华为云GaussDB 分布式数据库之上,在高可用方面,实现了同城单Region 多AZ 互联,支持同城双活,金融级支持三层组网的管控高可用部署方案,支撑日均业务量10万+。 与此同时,工商银行还通过华为云数据库和应用迁移(UGO)与数据复制服务(DRS)一站式迁移工具顺利迁移了数千个实例,单个业务存储过程量就接近两千,节省了80% 的人工工作量。 < 五环理论,生态胜出才是最后赢家 >对于企业来说,在经历了封闭、集中式数据库的痛苦之后,他们也愈加关注基础软件的开源开放和生态建设,没有人想从一个封闭的生态走向另一个封闭的生态。 谈及开源数据库和商业数据库,乃至当下的国内数据库生态建设,冯柯提到了 “五环理论”,这是他对数据库生态认知的自创概念: 最核心的二环是数据库的技术内核,三环是数据库的工具,包括迁移、开发、管理工具等;四环是服务能力;最外面的五环就是生态。 “产品外延能力越强,参与主体的多样性越丰富,生态也就越成熟,当然投入的成本也会越高。不过现在大多数厂商都处在二环和三环之间,即还停留在产品技术的层面。” 冯柯认为只有ORACLE和MySQL这两款数据库真正走到了五环,所以整个国内数据库产业的生态建设都是道阻且长,需要明确自身在哪些环节上是可以去做自我演进和发展。“走到五环是需要一个过程的,而数据库的开源生态建设尤为艰难,我们面临着巨大的挑战。” 早在2019年,华为宣布将其在数据库领域的积累——GaussDB单机主备内核能力开源,并命名为openGauss。2020年6月底,openGauss数据库源代码正式向开发者开放。 冯柯说,“过去我们可能是为了开源而开源,而且以技术的使用为主,但现在诸如openGausss这样的开源,是把产品作为生态建设的载体,产品本身就是开源生态的一部分。 同时在这生态中,也在不断长出更多的数据库产品。” 目前,除了华为云的分布式数据库GaussDB(for openGauss),已经有12家DBV基于openGauss社区版发布了自己的品牌数据库,100+头部企业参与社区共建。 同时,华为积极投入人才培养,与教育部联合建设“智能基座”基地,GaussDB已与72 所国内双一流高校建立合作关系,并在教育部“新工科”项目的80多所高校中开设GaussDB 数据库课程;在高职、专科院校,通过实践实训培养面向社会的应用型人才。开课之外,定期开展师资培训,联合多所顶尖高校教授出版GaussDB 数据库教材、教辅,持续完善GaussDB 数据库的人才培养体系,保障数据库产业未来人才供给。 最后冯柯强调,能否建立一个实现共赢的商业利益分享机制,是整个生态的基础。“这个赛道上,最终能够在生态上胜出的才是真正赢家。” < 结语 >从政策层面到市场需求,今天对于国内数据库厂商来说,可以称得上是最好的时代。 作为基础软件“皇冠上的明珠”,国产数据库的崛起,像梦想照进现实的一道光,每一个在这个产业沉沉浮浮的技术人,通过“创造”出类似GaussDB这样的产品,来承载着他们对基础软件的坚持和梦想,支撑起这个由数据构成的大千世界。 在技术一线坚持20多年后,对于冯柯来说,自己的人生已经和数据库“融为一体”了,采访的尾声,他也以自身为例,分享了技术人的转型经验,以及一些通用的工作方法论,与广大开发者们共勉:《数据库专家20年技术一线工作分享,如何化解35岁危机》。
  • [交流吐槽] SQL 设计模式 | 关系型数据库的幂等性处理
    在 IT 的很多术语中,正向解释非常难,反向描述反而更容易懂。幂等性处理就是这类。举两个数据处理时,非幂等性常见的场景:1.在创建订单时,偶有因网络抖动,痴呆,掉线等因素,造成客户端与服务器之间通讯不畅。比如,客户端发起请求后,在约定时间内(通常 30秒),没有得到服务器的反馈,导致重复发起创建订单的请求,实际上前面看似失败的订单已创建成功,最终造成创建两个甚至多个同样的订单2.重复扣款,扣库存。这个是最不能容忍的。如前所述,客户端重新不断发起扣款、扣库存的请求,会导致账目混乱。由此可见,做好程序的幂等性处理,非常重要!很多教科书,会笼统的说,幂等性处理是一种最终返回结果一致的程序处理。这么讲,不完美。幂等性处理,不仅对结果有约束,对处理造成的负面影响也有约束。来看关系型数据库的 DML 的幂等性处理。在库存管理软件中,对同一批货物操作增删改,就可能带来负面影响。比如在苹果门店的仓库管理软件中,某天门店客流量非常大,操作库存也比平时频繁了很多。这样一来,给库存管理就带来了风险。比如某台结算终端,就因为访问人数过多,经常掉线,超时。小王好不容易卖出去两台,结果死活就是结账不成功,连续操作4,5次后无果后,小王叫店长来重启了电脑。等重启后,结算是成功了,但库存为 0 了。店长跑去仓库一看,10 台 iPhone 13 都好好躺在那里,为什么库存为 0 了呢?这就是非幂等性处理造成的。客户端发起交易后,网络堵塞,结账请求一直没发成功。等计算机重启后,连续将之前的订单,重复发送了 10次,结果库存全扣没了。看下库存表的设计:create table ProductInventory( ProductLotId INT, ProductName VARCHAR(200), ProductInventoryVolume INT )iPhone 13 库存是这样的:ProductLotId ProductName ProductInventoryVolume A0001 iPhone13 10更新程序也挺简单:UPDATE ProductInventory SET ProductInventoryVolume = ProductInventoryVolume - 1 WHERE ProductLotId = 'A0001'由此可见,是连续的交易请求,让库存清 0 了。于是,第一种幂等性处理方法就来了 - UUID 通用唯一标识符:CREATE TABLE ProductSalesTransactionAudit( AuditId BIGINT, RequestUUID UniqueIdentifier, RequestCompleted BIT )在每次请求中,加入一个 RequestUUID(Universally Unique Identifier,通用唯一标识符, Java/C#/Python 等编程语言均有实现 UUID 的库)在数据库端维护一张表 ProductSalesTransactionAudit,若有请求被数据库接收到,先去该表查询是否存在.若存在且 RequestCompleted 为1,就表示该请求被数据库正确处理过,可以跳过这次处理,并将 RequestCompleted 返回给客户端;没有,则在这表里插入一行,且把数据库的处理结果,更新到 RequestCompleted.这样,一个可行的幂等性处理,就完成了。但不是十分完美,因为该表数据量,会显著性增长,造成性能缓慢。于是,要寻找下一种幂等性处理方案。接下来再看这个例子,依旧是以苹果这家门店为例。某天仓库中剩余 10只 iPhone 13. 小王和小黄同时销售出去 2只,理论上剩下 6只。按照正常操作,小王和小黄在操作库存时,同时看到有 10只,每人减去 2只,剩余 8只,由于看不到对方的操作,因此显示 8只剩余时,两个人都没觉得库存错了。create table ProductInventory( ProductLotId INT, ProductName VARCHAR(200), ProductInventoryVolume INT )小王和小黄,同时查询 iPhone 的库存时,是这样:ProductLotId ProductName ProductInventoryVolume A0001 iPhone 13 10他俩抓取后,经过他俩各自的本地计算(网页端或手持设备),变成了这样:ProductLotId ProductName ProductInventoryVolume A0001 iPhone 13 8当他们把本地数据上传时,无论谁先,数据库最终的 iPhone 13 的存量,都成了 8. 但事实上,错的离谱,店长要骂娘!那么平时我们设计系统时,该怎么处理这种意料中的错误呢,这里涉及到事务管理的技巧。有一种乐观派做法是,在库存表上,加一列,标识行的版本。当本行数据更新时,首先对比这个版本列,若相同,则更新,若不同,则报 ”您修改的数据,已被其他人抢先更新,请确定后再次保存“ 的提示,最后标识列会被自动更新。接下来,实现上面这种版本控制的做法:create table ProductInventory( ProductLotId INT, ProductName VARCHAR(200), ProductInventoryVolume INT, ProductLotTS timestamp)原库存是这样:ProductLotId ProductName ProductInventoryVolume ProductLotTS A0001 iPhone 13 10 2022050114364700001他俩抓取后,经过各自的本地计算,变成了这样:ProductLotId ProductName ProductInventoryVolume ProductLotTS A0001 iPhone 13 8 2022050114364700001当小王上传数据时,程序会同时以 A0001 + 2022050114364700001 作为更新条件,先将 ProductInventoryVolume 更新成8,同时因 timestamp 是系统自动更新的对象,已经变成了 2022050114364700002 .等到小黄再更新,程序也同样同时以 A0001 + 2022050114364700001 作为更新条件,发现 ProductLotTS 已经改变了,意味着在读取数据后,有别人先一步做了更新,此时小黄更新库存就会失败。他必须重新读取数据后,再操作。只要一次更新成功,ProductLotTS 就会改变,即使相同的请求再发送一遍,也会因为 ProductLotTS 不匹配,导致失败!这就是第二种幂等性处理程序,不仅仅做了防重复处理,还能省去一张表的维护代价。
  • [行业资讯] 6 月数据库排行榜:Oracle、PG 和 MongoDB 分数上涨
    DB-Engines 数据库流行度排行榜发布了 6 月份的更新。可以看到,分数明显上涨的数据库包括 Oracle、PostgreSQL 和 MongoDB,其中 Oracle 分数上涨最多 —— 较上个月增加了 24.92 分。MySQL 和 Redis 的分数则略有下跌,尤其是 MySQL 的分数已连续下跌了两个月。下图是 TOP 10 数据库的最新分数和变化情况。排名方面,Snowflake 较上个月上升了 1 个名次,目前的排名是 13,看来有望进入前十。Snowflake 去年曾获得 “2021 年度数据库” 称号。继续看看主流数据库的分数趋势变化:最后看看各类型数据库的排名情况。关系数据库前 10 名Key-Value 数据库前 10 名文档数据库前 10 名时序数据库前 10 名图数据库前 10 名DB-Engines 根据流行度对数据库管理系统进行排名,排名每月更新一次。排名的数据依据 5 个不同的指标:Google 以及 Bing 搜索引擎的关键字搜索数量Google Trends 的搜索数量Indeed 网站中的职位搜索量LinkedIn 中提到关键字的个人资料数Stackoverflow 上相关的问题和关注者数量这份榜单分析旨在为数据库相关从业人员提供一个技术方向的参考,其中涉及到的排名情况并非基于产品的技术先进程度或市场占有率等因素。无论排名先后,选择适合与企业业务需求相比配的技术才是最重要的。
  • [实践系列] 数仓SLA目标建设
    第1章. 项目背景和目的首先,了解项目的背景和目的,才能设计出满足客户需求的建设方案。1.1. 项目背景比如:XX银行在经过一系列软硬件升级后,已经具备了达到希望的SLA的基础条件,但是,由于种种原因,目前尚未达到SLA目标,所以,需要分析优化。1.2. 项目目标比如:SLA目标:在xx点完成率达到xx%,在yy点完成率达到100%。第2章. 整体分析及优化思路2.1 整体优化思路2.2 现状调研与分析根据数仓系统的建设及运营经验,现状调研主要包括三个方面,分别为:批量运行情况;资源使用情况和重点作业情况。• 批量运行情况根据数据库并发或者调度并发的趋势图,通常可以识别整体批量的波峰和波谷,进而将整体批量划分为不同的阶段,针对每一个阶段的特点进行深入分析,找出批量SLA的关键卡点。通过作业运行时长的分类可以识别出哪些作业需要优化。通过并发情况,可以识别出依赖是否存在瓶颈。• 资源使用情况资源使用情况主要分析数仓节点的资源使用情况,但是,在某些情况下,也需要考虑与之相关的上下文的系统的资源使用情况。资源使用主要包括cpu使用率、内存使用率、io使用率和网络IO使用率。秉持“系统资源充分利用且稳定运行”的原则,即要保持资源充分利用,又不能影响系统的稳定性,所以,要合理设置调度并发和数据库并发。• 重点作业情况重点作业可以通过业务角度和技术角度两个方面来识别;从业务角度来讲:比如监管报送是重点作业。从技术角度来讲:比如某个作业的下游依赖特别多,即该作业处在批量调度的关键路径上。2.3 优化方案数据链路优化通过现状调研和分析,找出批量调度的卡点作业,针对这些卡点作业与上游业务系统沟通协调供数时间,通过供数时间的提前,使得批量可以提前运行。平台优化根据现状调研和分析,判断资源是否有充分利用或者是否有过渡使用;平台优化的原则是“首先,保障系统稳定运行;其次,资源也要充分利用”。作业优化通常可以通过作业运行时间,识别出运行时间较长的作业,之后,分类判断哪些作业需要优化,列出清单,由各相关应用负责优化。调度优化主要包括调度并发优化、分时段动态并发优化等,该项优化与平台优化联系紧密,相互配合优化。无效或者低效作业识别在某些数仓环境下,随着业务的变化,有些作业已经不再被使用,这些作业理论上应该做下线处理;但是,由于业务人员通常更关心新增业务的发展,对不再使用的作业忘记处理;所以,需要通过技术识别出来并与业务人员沟通后再下线。 通常通过以上方法就可以满足SLA目标的建设。
  • [交流吐槽] Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
    原始数据存储在 DB 中(如 MySQL、Hbase 等),但 DB 的读写性能低、延迟高。比如 MySQL 在 4 核 8G 上的 TPS = 5000,QPS = 10000 左右,读写平均耗时 10~100 ms。用 Redis 作为缓存系统正好可以弥补 DB 的不足,「码哥」在自己的 MacBook Pro 2019 上执行 Redis 性能测试如下:$ redis-benchmark -t set,get -n 100000 -qSET: 107758.62 requests per second, p50=0.239 msecGET: 108813.92 requests per second, p50=0.239 msecTPS 和 QPS 达到 10 万,于是乎我们就引入缓存架构,在数据库中存储原始数据,同时在缓存总存储一份。当请求进来的时候,先从缓存中取数据,如果有则直接返回缓存中的数据。如果缓存中没数据,就去数据库中读取数据并写到缓存中,再返回结果。这样就天衣无缝了么?缓存的设计不当,将会导致严重后果,本文将介绍缓存使用中常见的三个问题和解决方案:缓存击穿(失效);缓存穿透;缓存雪崩。缓存击穿(失效)高并发流量,访问的这个数据是热点数据,请求的数据在 DB 中存在,但是 Redis 存的那一份已经过期,后端需要从 DB 从加载数据并写到 Redis。关键字:单一热点数据、高并发、数据失效但是由于高并发,可能会把 DB 压垮,导致服务不可用。如下图所示:解决方案过期时间 + 随机值对于热点数据,我们不设置过期时间,这样就可以把请求都放在缓存中处理,充分把 Redis 高吞吐量性能利用起来。或者过期时间再加一个随机值。设计缓存的过期时间时,使用公式:过期时间=baes 时间+随机时间。即相同业务数据写缓存时,在基础过期时间之上,再加一个随机的过期时间,让数据在未来一段时间内慢慢过期,避免瞬时全部过期,对 DB 造成过大压力预热预先把热门数据提前存入 Redis 中,并设热门数据的过期时间超大值。使用锁当发现缓存失效的时候,不是立即从数据库加载数据。而是先获取分布式锁,获取锁成功才执行数据库查询和写数据到缓存的操作,获取锁失败,则说明当前有线程在执行数据库查询操作,当前线程睡眠一段时间在重试。这样只让一个请求去数据库读取数据。伪代码如下:public Object getData(String id) {    String desc = redis.get(id);        // 缓存为空,过期了        if (desc == null) {            // 互斥锁,只有一个请求可以成功            if (redis(lockName)) {                try                    // 从数据库取出数据                    desc = getFromDB(id);                    // 写到 Redis                    redis.set(id, desc, 60 * 60 * 24);                } catch (Exception ex) {                    LogHelper.error(ex);                } finally {                    // 确保最后删除,释放锁                    redis.del(lockName);                    return desc;                }            } else {                // 否则睡眠200ms,接着获取锁                Thread.sleep(200);                return getData(id);            }        }}缓存穿透缓存穿透:意味着有特殊请求在查询一个不存在的数据,即数据不存在 Redis 也不存在于数据库。导致每次请求都会穿透到数据库,缓存成了摆设,对数据库产生很大压力从而影响正常服务。如图所示:解决方案缓存空值:当请求的数据不存在 Redis 也不存在数据库的时候,设置一个缺省值(比如:None)。当后续再次进行查询则直接返回空值或者缺省值。布隆过滤器:在数据写入数据库的同时将这个 ID 同步到到布隆过滤器中,当请求的 id 不存在布隆过滤器中则说明该请求查询的数据一定没有在数据库中保存,就不要去数据库查询了。BloomFilter 要缓存全量的 key,这就要求全量的 key 数量不大,100 亿 条数据以内最佳,因为 100 亿条数据大概要占用 3.5GB 的内存。说下布隆过滤器的原理吧BloomFilter 的算法是,首先分配一块内存空间做 bit 数组,数组的 bit 位初始值全部设为 0。加入元素时,采用 k 个相互独立的 Hash 函数计算,然后将元素 Hash 映射的 K 个位置全部设置为 1。检测 key 是否存在,仍然用这 k 个 Hash 函数计算出 k 个位置,如果位置全部为 1,则表明 key 存在,否则不存在。如下图所示:哈希函数会出现碰撞,所以布隆过滤器会存在误判。这里的误判率是指,BloomFilter 判断某个 key 存在,但它实际不存在的概率,因为它存的是 key 的 Hash 值,而非 key 的值。所以有概率存在这样的 key,它们内容不同,但多次 Hash 后的 Hash 值都相同。对于 BloomFilter 判断不存在的 key ,则是 100% 不存在的,反证法,如果这个 key 存在,那它每次 Hash 后对应的 Hash 值位置肯定是 1,而不会是 0。布隆过滤器判断存在不一定真的存在。缓存雪崩缓存雪崩指的是大量的请求无法在 Redis 缓存系统中处理,请求全部打到数据库,导致数据库压力激增,甚至宕机。出现该原因主要有两种:大量热点数据同时过期,导致大量请求需要查询数据库并写到缓存;Redis 故障宕机,缓存系统异常。缓存大量数据同时过期数据保存在缓存系统并设置了过期时间,但是由于在同时一刻,大量数据同时过期。系统就把请求全部打到数据库获取数据,并发量大的话就会导致数据库压力激增。缓存雪崩是发生在大量数据同时失效的场景,而缓存击穿(失效)是在某个热点数据失效的场景,这是他们最大的区别。如下图:缓存雪崩-大量缓存同时失效解决方案过期时间添加随机值要避免给大量的数据设置一样的过期时间,过期时间 = baes 时间+ 随机时间(较小的随机数,比如随机增加 1~5 分钟)。这样一来,就不会导致同一时刻热点数据全部失效,同时过期时间差别也不会太大,既保证了相近时间失效,又能满足业务需求。接口限流当访问的不是核心数据的时候,在查询的方法上加上接口限流保护。比如设置 10000 req/s。如果访问的是核心数据接口,缓存不存在允许从数据库中查询并设置到缓存中。这样的话,只有部分请求会发送到数据库,减少了压力。限流,就是指,我们在业务系统的请求入口前端控制每秒进入系统的请求数,避免过多的请求被发送到数据库。如下图所示:缓存雪崩-限流Redis 故障宕机一个 Redis 实例能支撑 10 万的 QPS,而一个数据库实例只有 1000 QPS。一旦 Redis 宕机,会导致大量请求打到数据库,从而发生缓存雪崩。解决方案对于缓存系统故障导致的缓存雪崩的解决方案有两种:服务熔断和接口限流;构建高可用缓存集群系统。服务熔断和限流在业务系统中,针对高并发的使用服务熔断来有损提供服务从而保证系统的可用性。服务熔断就是当从缓存获取数据发现异常,则直接返回错误数据给前端,防止所有流量打到数据库导致宕机。服务熔断和限流属于在发生了缓存雪崩,如何降低雪崩对数据库造成的影响的方案。构建高可用的缓存集群所以,缓存系统一定要构建一套 Redis 高可用集群,比如 《Redis 哨兵集群》或者 《Redis Cluster 集群》,如果 Redis 的主节点故障宕机了,从节点还可以切换成为主节点,继续提供缓存服务,避免了由于缓存实例宕机而导致的缓存雪崩问题。总结缓存穿透指的是数据库本就没有这个数据,请求直奔数据库,缓存系统形同虚设。缓存击穿(失效)指的是数据库有数据,缓存本应该也有数据,但是缓存过期了,Redis 这层流量防护屏障被击穿了,请求直奔数据库。缓存雪崩指的是大量的热点数据无法在 Redis 缓存中处理(大面积热点数据缓存失效、Redis 宕机),流量全部打到数据库,导致数据库极大压力。
  • [交流吐槽] 光知道分库分表可不敢直接去面试,分表后读扩散怎么解决才是重点
    分库分表大家可能听得多了,但 读扩散 问题大家了解吗?这里涉及到几个问题。分库分表是什么?读扩散问题是什么?分库分表为什么会引发读扩散问题?怎么解决读扩散问题?这些问题还是比较有意思的。相信兄弟们也一定有机会遇到哈哈哈。我们先从分库分表的话题聊起吧。分库分表我们平时做项目开发。一开始,通常都先用一张数据表,而一般来说数据表写到2kw条数据之后,底层B+树的层级结构就可能会变高,不同层级的数据页一般都放在磁盘里不同的地方,换言之,磁盘IO就会增多,带来的便是查询性能变差。 如果对上面这句话有疑惑的话,可以去看下我之前写的文章。于是,当我们单表需要管理的数据变得越来越多,就不得不考虑数据库 分表 。而这里的分表,分为 水平分表和垂直分表 。垂直分表的原理比较简单,一般就是把某几列拆成一个新表,这样单行数据就会变小,B+树里的单个数据页(固定16kb)内能放入的行数就会变多,从而使单表能放入更多的数据。垂直分表没有太多可以说的点。下面,我们重点说说最常见的 水平分表 。水平分表有好几种做法,但不管是哪种,本质上都是将原来的 user 表,变成 user_0, user1, user2 .... uerN 这样的N多张小表。从读写一张user 大表 ,变成读写 user_1 … userN 这样的N张 小表 。每一张小表里,只保存一部分数据,但具体保存多少,这个自己定,一般就订个 500w~2kw 。那分表具体怎么做?根据id范围分表我认为最好用的,是根据id范围进行分表。我们假设每张分表能放 2kw 行数据。那user0就放主键id为 1~2kw 的数据。user1就放id为 2kw+1 ~ 4kw ,user2就放id为 4kw+1 ~ 6kw , userN就放 2N kw+1 ~ 2(N+1)kw 。根据id范围分表假设现在有条数据,id=3kw,将这个 3kw除2kw = 1.5 ,向下取整得到 1 ,那就可以得到这条数据属于 user1表 。于是去读写user1表就行了。这就完成了数据的路由逻辑,我们把这部分逻辑封装起来,放在数据库和业务代码之间。这样。 对于业务代码来说 ,它只知道自己在读写一张 user 表,根本不知道底下还分了那么多张小表。对于数据库来说,它并不知道自己被分表了,它只知道有那么几张表,正好名字长得比较像而已。这还只是在 一个数据库 里做分表,如果范围再搞大点,还能在 多个数据库 里做分表,这就是所谓的 分库分表 。不管是单库分表还是分库分表,都可以通过这样一个中间层逻辑做路由。还真的就应了那句话,没有什么是加中间层不能解决的。如果有,就多加一层。至于这个中间层的实现方式就更灵活了,它既可以像 第三方orm库 那样加在业务代码中。通过orm读写分表也可以在mysql和业务代码之间加个 proxy服务 。如果是通过第三方orm库的方式来做的话,那需要根据不同语言实现不同的代码库,所以不少厂都选择后者加个proxy的方式,这样就不需要关心上游服务用的是什么语言。通过proxy管理分表根据id取模分表这时候就有兄弟要提出问题了,"我看很多方案都 对id取模 ,你这个方案是不是不完整?"。取模的方案也是很常见的。比如一个id=31进来,我们一共分了5张表,分别是user0到user4。对 31%5=1 ,取模得 1 ,于是就能知道应该读写 user1 表。根据id取模分表优点当然是比较简单。而且读写数据都可以很均匀的分摊到每个分表上。但 缺点 也比较明显,如果想要扩展表的个数,比如从5张表变成8张表。那同样还是id=31的数据, 31%8 = 7 ,就需要读写user7这张表。跟原来就对不上了。这就需要考虑 数据迁移 的问题。很头秃。为了避免后续扩展的问题,我见过一些业务一开始就将数据预估得很大,然后心一横,分成100张表,一张表如果存个2kw条,那也能存20亿数据了。也不是说这样不行吧,就是这个业务直到最后放弃的时候,也就存了百万条数据,每次打开数据库表能看到茫茫多的user_xx,就是不太舒服,专业点,叫增加了程序员的 心智负担 。而上面一种方式,根据id范围去分表,就能很好的解决这些问题,数据少的时候,表也少,随着数据增多,表会慢慢变多。而且这样表还可以无限扩展。那是不是说取模的做法就用不上了呢?也不是。将上面两种方式结合起来id取模的做法,最大的好处是,新写入的数据都是实实在在的分散到了 多张表 上。而根据id范围去做分表,因为id是递增的,那新写入的数据一般都会落到 某一张表 上,如果你的业务场景写数据特别频繁,那这张表就会出现 写热点 的问题。这时候就可以将id取模和id范围分表的方式结合起来。我们可以在某个id范围里,引入取模的功能。比如 以前 2kw~4kw 是user1表,现在可以在这个范围 再分成5个表 ,也就是引入user1-0, user1-2到user1-4,在这5个表里取模。举个例子,id=3kw,根据范围,会分到user1表,然后再进行取模 3kw % 5 = 0,也就是读写user1-0表。这样就可以将写单表分摊为写多表。这在分库的场景下优势会更明显,不同的库,可以把服务部署到不同的机器上,这样各个机器的性能都能被用起来。根据id范围分表后再取模读扩散问题我们上面提到的好几种分表方式,都用了id这一列作为 分表的依据 ,这其实就是所谓的 分片键 。实际上我们一般也是用的 数据库主键 作为 分片键 。这样,理想情况下我们已知一个id,不管是根据哪种规则,我们都能很快定位到该读哪个分表。但很多情况下,我们的查询又不是只查主键,如果我的数据库表有一列name,并且加了个普通索引。这样我执行下面的sqlselect * from user where name = "小白";由于name并不是分片键,我们没法定位到具体要到哪个分表上去执行sql。于是就会对 所有分表 都执行上面的sql,当然不会是串行执行sql,一般都是 并发 执行sql的。如果我有100张表,就执行100次sql。如果我有200张表,就执行200次sql。随着我的表越来越多,次数会越来越多,这就是所谓的 读扩散问题 。读扩散问题这是个比较有趣的问题,它确实是个问题,但大部分的业务不会去处理它,读100次怎么了,数据增长之后读的次数会不断增加又怎么了?但架不住我的 业务不赚钱 啊,也根本 长不了那么多数据 啊。话是这么说没错,但面试官问你的时候,你得知道怎么处理啊。引入新表来做分表问题的核心在于,主键是分片键,而普通索引列并不分片。那好办,我们单独建个 新的分片表 ,这个新表里的列就只有旧表的主键id和普通索引列,而这次换普通索引列来做分片键。通过新索引表解决读扩散问题这样当我们要查询普通索引列时,先到这个新的分片表里做一次查询,就能迅速定位到对应的主键id,然后再拿主键id去旧的分片表里查一次数据。这样就从原来漫无目的的全表扩散查询,缩减为只查固定几个表了。举个例子。比如我的表原本长下面这样,其中id列是主键,同时也是分片键,name列是非主键索引。为了简化,假设三条数据一张表。此时分表里 id=1,4,6 的都有 name="小白" 的数据。当我们执行 select * from user where name = "小白"; 则需要并发查3张表,随着表变多,查询次数会变得更多。举例说明读扩散问题但如果我们为name列 建个新表(nameX),以name为新的分片键 。这样我们可以先执行 select id from nameX where name = "小白";再拿着结果里的ids去查询 select * from user where id in (ids); 这样就算表变多了,也可以迅速定位到某几张具体的表,减少了查询次数。举例说明通过新索引表解决读扩散问题但这个做法的缺点也比较明显,你需要维护两套表,并且普通索引列更新时,要两张表同时进行更改。有一定的开发量有没有更简单的方案?使用其他更合适的存储我们常规的查询是通过id主键去查询对应的name列。而像上面的方案,则通过引入一个新表, 倒过来 ,先用name查到对应的id,再拿id去获取具体的数据。这其实就像是建立了一个新的索引一样,像这种,通过name列反查原数据的思想,其实就很类似于 倒排索引 。相当于我们是利用了倒排索引的思路去解决分表下的数据查询问题。回想下,其实我们的 原始需求 无非就是在大量数据的场景下依然能提供普通索引列或其他更多维度的查询。这种场合,更适合使用es,es天然分片,而且内部利用 倒排索引 的形式来加速数据查询。哦?兄弟萌,又是它, 倒排索引 ,又是个极小的细节,做好笔记。举个例子,我同样是一行数据 id,name,age。在mysql里,你得根据id分片,如果要支持name和age的查询,为了防止读扩散,你得分别再建一个name的分片表和一个age的分片表。而如果你用es,它会在它内部以id分片键进行分片,同时还能建一个name到id,和一个age到id的倒排索引。这是不是就跟上面做的事情没啥区别。而且将mysql接入es也非常简单,我们可以通过开源工具 canal 监听mysql的 binlog 日志变更,再将数据解析后写入es,这样es就能提供 近实时 的查询能力。mysql同步es觉得es+mysql还是繁琐?有没有其他更简洁的方案?有。别用mysql了,改用 tidb 吧,相信大家多少也听说过这个名称,这是个 分布式数据库 。它通过引入 Range 的概念进行数据表分片,比如第一个分片表的id在0~2kw,第二个分片表的id在2kw~4kw。哦?有没有很熟悉,这不就是文章开头提到的根据id范围进行数据库分表吗?它支持普通索引,并且普通索引也是分片的,这是不是又跟上面提到的倒排索引方案很类似。又是个极小的细节。并且tidb跟mysql的语法几乎一致,现在也有非常多现成的工具可以帮你把数据从mysql迁移到tidb。所以开发成本并不高。总结mysql在单表数据过大时,查询性能会变差,因此当数据量变得巨大时,需要考虑水平分表。水平分表需要选定一个分片键,一般选择主键,然后根据id进行取模,或者根据id的范围进行分表。mysql水平分表后,对于非分片键字段的查询会有读扩散的问题,可以用普通索引列作分片键建一个新表,先查新表拿到id后再回到原表再查一次原表。这本质上是借鉴了倒排索引的思路。如果想要支持更多维度的查询,可以监听mysql的binlog,将数据写入到es,提供近实时的查询能力。当然,用tidb替换mysql也是个思路。tidb属实是个好东西,不少厂都拿它换个皮贴个标,做成自己的 自研数据库 ,非常推荐大家学习一波。不要做过早的优化,没事别上来就分100个表,很多时候真用不上。参考资料《图解分库分表》https://mp.weixin.qq.com/s/OI5y4HMTuEZR1hoz9aOMxg最后当年我还在某个游戏项目组里做开发的时候,从企鹅那边挖来的策划信誓旦旦的说,我们要做的这款游戏老少皆宜,肯定是爆款。要做成全球同服。上线至少 过亿注册 , 十万人同时在线 。要好好规划和设计。我们算了下,信他能有个1亿注册。用了id范围的方式进行分片,分了 4张表 。搞得我热血沸腾。那天晚上下班,夏蝉鸣泣,从赤道吹来的热风阵阵拂过我的手臂,我听着泽野弘之的歌,就算是开电瓶车,我都感觉自己像是在开高达。一年后。游戏上线前一天通知运维加机器,怕顶不住,要整夜关注。后来上线了,全球最高在线人数 58 人。其中有 7 个是项目组成员。还是夏天,还是同样的下班路,想哭,但我不能哭,因为骑电瓶车的时候擦眼泪不安全。
  • [技术干货] python练习题-原创 难度从小到中到大~欢迎评论交流
    编写100以内逢7拍手游戏(含7和7倍数的数用@替换)。for i in range(1, 101):     # 把i转成字符串,使用find方法(字符串中不包含时,返回-1)     include = str(i).find("7")     # 判断条件:既不包含7,也不是7的倍数     if include == -1 and int(i) % 7 != 0:         # 输出,去掉了换行符,加了、         print(i, end="、")         # 如果包含7 输出*     elif include != -1 or int(i) % 7 == 0:         print("*", end='、') 输入100以内整数,5次机会猜此数。import randomprint("猜数字游戏,输入一个1-100以内的数字")random_num = random.randint(1, 100)# print(random_num)  # 打开注释可查看生成的随机数for frequency in range(1,6):    number = input("请输入一个数字:")    if number.isdigit() is False:        print('请输入一个正确的数字')    elif int(number) < 0 or int(number) > 100:        print("请输入1-100范围的数字")    elif random_num == int(number):        print("恭喜你用了%d次猜对了" % frequency)        break    elif random_num > int(number):        print("很遗憾,你猜小了")    else:        print("很遗憾,你猜大了")    if frequency == 5:        print("很遗憾,%d次机会已用尽,游戏结束,答案为%d" %              (frequency, random_num)) 列表中存放若干商品的价格,输入价格区间上限和下限,输出该区间所有价格。num = [399, 4369, 539, 288, 109, 749, 235, 190, 99, 1000]a = int(input("请输入最大价格:"))b = int(input("请输入最小价格:"))c = input('''1.价格降序排序2.价格升序排序请选择...:''')num1 = []for i in num:    if i >= b and i <= a:        num1.append(i)if c == '1':    d = sorted(num1, reverse=True)    print(d)if c == '2':    num1.sort()    print(num1) 列表(namel)中存放若干老师姓名,嵌套列表(officelJ, L. OI)三个子列表(办公室)随机存储name中各老师姓名,输出office内容。import randomteachers=['A','B','C','D','E','F','G','H']offices=[[],[],[]]for name in  teachers:    num=random.randint(0,2)    offices[num].append(name)i=0for i in offices:    m=len(i)    print(m)print(offices) 编写函数:输入两个数和运算符输出运算结果。a = int(input("请输入第一个数:"))b = int(input("请输入第二个数:"))symbol = input("请输入四则运算符号:(+-*/%)")if symbol == "+":    print("%s%s%s=%s"%(a,symbol,b,a+b))elif symbol == "-":    print("%s%s%s=%s"%(a,symbol,b,a-b))elif symbol == "*":    print("%s%s%s=%s"%(a,symbol,b,a*b))elif symbol == "/":    if b == 0:        print("除数不能为零")    else:print("%s%s%s=%s"%(a,symbol,b,a/b))elif symbol=="%":    print("%s%s%s=%s"%(a,symbol,b,a%b))else:    print("符号输入有误,请重新输入!!!") 编写函数:输出20项斐波那契数列项。listnum = []for x in range(1, 21):    if x == 1 or x == 2:        listnum.append(x)    else:        listnum.append(listnum[x-2]+listnum[x-3])print(listnum) 设计编写长方体类,输入长、宽和高,输出面积和体积。import mathimport decimalclass Rect(object):    def __init__(self,l,h,z):        self.l = l        self.h = h        self.z = z    def length(self):        return 2*(self.l+self.h)    def area(self):        return self.l*self.hclass Cubic(Rect):    def __init__(self,l,h,z):        super(Cubic,self).__init__(l,h,z)    #表面积    def area(self):        return 2*(self.l*self.h) + 2*(self.h*self.z) + 2* (self.l*self.z)    #体积    def tj(self):        return super(Cubic,self).area() * self.z    def show(self):        print('{} {}'.format(decimal.Decimal(self.area()).quantize(decimal.Decimal('0.00')),decimal.Decimal(self.tj()).quantize(decimal.Decimal('0.00'))),end=' ')if __name__ == '__main__':    while True:        a = float(input('请输入长:'))        b = float(input('请输入宽:'))        c = float(input('请输入高:'))        if a <= 0 or b <= 0 or c <= 0:            print('0.00 0.00 0.00 0.00')        else:            m = Cubic(a, b, c)            m.show() 设计编写动物类Animal,属性、函数自定义;子类鸟Bird,属性继承父类属性,函数完成属性值的输出。编写代码执行子类函数。class Animal(object):    """定义动物类"""    name = ""    time = 0    def __init__(self, name, time):        self.setName(name)        self.setTime(time)    def setName(self, name):        self.name = name    def setTime(self, time):        if not isinstance(time, int):            print('必须是整数')        self.time = time    def tell(self):        print("动物名称: " + self.name)        print("喂食次数: " + str(self.time))class brid(Animal):    """定义猫类"""    color = ""    def __init__(self, name, time, color):        Animal.__init__(self, name, time)        self.color = color    def tell(self):        Animal.tell(self)        print("动物颜色: " + self.color)    def feed(self):        self.time += 1if __name__ == "__main__":    Brid1 = brid("小鸟1号", 0, "花色")    Brid1.tell()    Brid1.feed()    Brid1.tell() 登陆mysql数据库的用户名密码自定义,数据库名为mydb。数据表为login,包含uname、upassword字段。要求完成注册和登陆功能,注册:输入用户名和密码,如果login表无此用户则插入到login中否则显示'用户已存在; ⑵登陆:输入用户名和密码,如果login表有此用户则'登陆成功'否则显示'登陆失败'。"""mysql1.创建数据库create database python charset=uft8;2.创建表create table py_users(id int unsigned auto_increment not null primary key,uname varchar(20) not null,upwd char(40) not null,);"""# 注册import pymysql, pymongo, osdef login():    """    登录    :return:    """    try:        # 接收输入用户名、密码        uname = input('请输入用户名:')        upwd = input('请输入密码:')        print(uname+upwd)        # 根据用户名查询密码        # 先到mongodb上查,没有再到mysql上查        #client = pymongo.MongoClient('localhost', 27017)        # 连接数据库        #db = client.py3        # 连接py_users集合        #result = db.py_users.find_one({'uname': uname})        # 如果集合中的数据为空,在mysql中查询        #if result is None:        conn = pymysql.connect(host='localhost', port=3306, database='mydb2', user='root', password='wzh123sal',                               charset='utf8')        if conn:            print('connect successful')        cur = conn.cursor()        sql = 'select * from py_users where uname=%s and upwd=%s;'        sql1 = "select * from py_users ;"        params = [uname, upwd]        #cur.execute(sql)        cur.execute(sql,params)        if cur:            print('cur successful')        result = cur.fetchone()        if result :            print(result[0]+':'+result[1])            print('登录成功')            show_stu()        else:            print('用户名不存在')        #else:        #    print('登录成功')    except:        print("用户名未注册,请先注册")        sel = input("是否需要注册:1:注册  2:退出")        if sel == '1':            registered()        else:            os._exit(0)def show_stu():    try:        conn = pymysql.connect(host='localhost', port=3306, database='mydb2', user='root', password='wzh123sal',                               charset='utf8')        if conn:            print('connect successful')        cur = conn.cursor()        sql = "select * from student2;"        cur.execute(sql)        if cur:            print('cur successful')        results = cur.fetchall()        print('studentid'+' '+'studentname'+' '+'age'+' '+'gender')        print('-' * 30)        for row in results:            # studentid = row[0]            # studentname = row[1]            # age = row[2]            # gender = row[3]            print(f'{row[0]}',end='\t')            print(f'{row[1]}',end='\t')            print(f'{row[2]}',end='\t')            print(f'{row[3]}')            print('-'*30)    except:        print("no such tables!")def registered():    """    注册    :return:    """    uname = input('请输入用户名:')    upwd = input('请输入密码:')    sql = 'select upwd from py_users where uname=%s'    params = [uname]    # 打开与数据库的连接    try:        conn = pymysql.connect(host='localhost', port=3306, database='mydb2', user='root', password='wzh123sal',                               charset='utf8')        cur = conn.cursor()        # 判断用户名是否存在        sql = 'select count(*) from py_users where uname=%s'        params = [uname]        cur.execute(sql, params)        result = cur.fetchone()        if result[0] == 1:            print('用户名已经存在,注册失败')        else:            # 用户名不存在            sql = 'insert into py_users(uname,upwd) values(%s,%s)'            params = [uname, upwd]            result = cur.execute(sql, params)            conn.commit()            if result == 1:                print('注册成功')            else:                print('注册失败')        cur.close()    except Exception as e:        print('注册失败,原因是:%s' % e)    finally:        conn.close()def main():    # 打印菜单    print('————功能选择——————')    print('1.登录')    print('2.注册')    sel = input("登录(1)or 注册(2)?")    try:        if sel == '1':            login()        elif sel == '2':            registered()    except Exception as e:        print('程序错误,%s'%e)if __name__ == '__main__':    main() 
  • [技术干货] 数据库未来:湖仓一体新趋势
    摘要:本文回顾了“湖仓一体”概念提出的相关背景,详细地阐述了为什么需要“湖仓一体”以及“湖仓一体”数据架构的具体设想。最后对数据仓库、数据湖以及“湖仓一体”进行了具体的比较。数据仓库自 20 世纪 80 年代末以来,数据仓库在决策支持和商业智能应用领域中发挥了重要作用。数据湖虽然数据仓库非常适合结构化数据,但许多现代企业必须处理非结构化数据,半结构化数据。数据湖是企业卸载所有数据的地方,因为其低成本存储系统具有文件API,可以保存通用和开放文件格式的数据,例如Apache Parquet和ORC。开放格式的使用还使数据湖中的数据可以直接被各种其他分析引擎(如机器学习系统)访问。一开始,人们认为所需要的只是提取数据并将其放入数据湖中。一旦进入数据湖,最终用户就可以潜入并找到数据并进行分析。然而,组织很快发现,使用数据湖中的数据与仅仅将数据放置在湖中完全不同。换句话说,最终用户的需求与数据科学家的需求有很大不同。最终用户遇到了各种各样的障碍:需要的数据在哪里?一个数据单位如何与另一个单位的数据相联系数据?数据是否是最新的?数据的准确性如何?由于缺乏一些关键的基础设施功能,数据湖的许多承诺尚未实现:不支持事务,不强制执行数据质量或治理,以及性能优化不佳。结果,企业中的大多数数据湖都变成了数据沼泽。当前数据架构的挑战当前常见的数据架构是使用多个系统 (一个数据湖、多个数据仓库和其他专用系统)来平衡数据仓库和数据湖的优劣势。但是,这会导致三个常见问题:昂贵数据移动成本超过90%的模拟/物联网数据存储在数据湖中,因为它具有开放直接访问文件的灵活性和低成本,因为它使用廉价的存储。为了克服数据湖缺乏性能和质量问题,企业使用ETL(提取/转换/加载)将数据湖中的一小部分数据复制到下游数据仓库,用于最重要的决策支持和BI应用程序。这种双系统架构需要对数据湖和仓库之间的ETL数据进行持续工程设计。每个 ETL 步骤都有发生故障或引入降低数据质量的错误的风险 — 保持数据湖和数据仓库的一致性既困难又昂贵。同时,ETL可以整合数据。限制了对机器学习的支持尽管对机器学习和数据管理的融合进行了大量研究,但没有一个领先的机器学习系统,如TensorFlow,PyTorch和XGBoost,在仓库之上工作得很好。与提取少量数据的商业智能(BI)不同,机器学习系统使用复杂的非SQL代码处理大型数据集。缺乏开放性数据仓库将数据锁定为专有格式,这会增加将数据或工作负载迁移到其他系统的成本。鉴于数据仓库主要提供仅SQL访问,因此很难针对数据仓库运行任何其他分析引擎,例如机器学习系统。“湖仓一体”的出现在数据湖的基础上,出现了一种新的数据架构,称为”湖仓一体“。采取Lake-First的方法论利用数据湖中已有的模拟和物联网数据,因为数据湖已经将大多数结构化、文本和其他非结构化数据存储在低成本存储(如 Amazon S3、Azure Blob Storage 或 Google Cloud)上。为数据湖带来可靠性和质量支持ACID支持Sechema,提供星型、雪花等模型分析能力,提供强大的治理和审计机制。支持Sechema强制检查,从而防止错误数据导致数据损坏。架构演进允许数据不断更改,使最终用户能够对可自动应用的 schema 进行更改,而无需繁琐的DDL。添加治理和安全控制通过 Scala、Java、Python 和 SQL API 支持 DML,以合并、更新和删除数据集,从而符合 GDPR 和 CCPA,并简化变更数据捕获等用例。历史记录提供有关对数据所做的每个更改的记录详细信息,从而提供更改的完整审核跟踪。数据快照使开发人员能够访问和恢复到早期版本的数据,以进行审核、回滚或重现实验。基于角色的访问控制为表的行/列级别提供细粒度的安全性和治理。优化性能通过利用文件统计信息和数据压缩来调整文件大小,实现各种优化技术,例如缓存、多维聚类、z-ordering、data skipping等。支持机器学习支持多种数据类型来存储、优化、分析和访问许多新应用程序的数据,包括图像、视频、音频、半结构化数据和文本。高效直接读取大量数据(非SQL),以便使用 R 和 Python 库运行机器学习试验。通过内置支持 DataFrame API 声明性 DataFrame API,可针对机器学习工作负载中的数据访问进行查询优化,因为 TensorFlow、PyTorch 和 XGBoost 等机器学习系统已采用 DataFrames 作为操作数据的主要抽象。机器学习实验的数据版本控制,提供数据快照,使数据科学和机器学习团队能够访问和恢复到早期版本的数据以进行审核和回滚或重现机器学习实验。提供开放性开放文件格式,如Apache Parquet和ORC。Open API提供了一个开放的API,可以直接高效地访问数据,而无需专有引擎和供应商锁定。语言支持,不仅支持SQL访问,还支持各种其他工具和引擎,包括机器学习和Python/R库。数据仓库 vs 数据湖 vs 湖仓一体下图表是对数据仓库、数据湖、湖仓一体的比较:思考与讨论你认为湖仓一体架构必须具有哪些功能,才能称为真正的”湖仓一体“,而不是炒作概念。事务(ACID)支持开放文件格式数据安全、数据治理其它HashData湖仓一体应用实践随着企业数字化转型的推进,越来越多的企业视湖仓一体为数字化变革的契机。当然,关注度越高,市场上嘈杂的声音也就越多。在实际业务场景中,数据的移动不只是存在于数据湖和数据仓库之间,湖仓一体不仅需要把数仓和数据湖集成起来,还要让数据在服务之间按需流动。HashData采用湖仓一体化架构,可以方便、快捷地将大量数据从数仓转移至数据湖内,同时这些移到湖里的数据,仍然可以被数仓查询使用。目前,HashData已广泛应用于金融、电信、交通等行业,服务超过50家行业客户。在能源领域,HashData为某大型央企设计了基于计算存储分离的架构数据湖, 相比计算存储绑定的架构,HashData云端数据湖在保证查询需求的同时,减少了服务器资源成本。在PB级的数据量下,可以为企业节省上百万的服务器采购成本,充分实现了降本提效的目标。