关于nosql:MongoDB

MongoDB概念:MongoDB是一个文档型的NoSql数据库,和关系型数据库相比,没有结构化的存储要求,扩大更灵便。 存储构造:DataBase:相似于关系数据库中的DataBase。Collection:相似于关系数据库中的表。Document:MongoDB中的最小存储单元,相似于关系数据库中的行。每一个Document都是一个BSON键值对。 BSON:是一种网络数据交换格局,是JSON的二进制示意。构造相似于JSON。扩大了JSON反对的数据格式:date,byte array。BSON内元素前记录了此元素的字节长度,因而绝对于JSON,遍历更快,解决更高效。毛病是须要更多的存储空间。 索引单键索引最常见的索引类型,基于一个字段进行索引,能够疾速定位到指定字段的值。 复合索引基于多个字段组合创立的索引,能够放慢多个字段的查问效率,实用于多字段联结查问。 惟一索引确保索引字段的唯一性,避免反复值的插入和更新。 文本索引用于全文搜寻,反对文本关键字的匹配和查问。 多键索引用于索引数组或嵌套文档中的多个键值,实用于查问和筛选数组字段中的值。 TTL索引Time-to-Live Index,依据指定的工夫字段主动删除过期的文档,实用于数据的主动清理和过期治理。 hash索引将索引字段的值进行散列哈希,用于疾速查找和比拟,不反对范畴查问。 wiredTiger存储引擎wiredTiger是用B+树,写操作会先写到内存中,并记录日志。每过一段时间,会生成一个内存快照,而后以page为根本单位往磁盘读写数据,每一次写都会从新生成新的root page。 适宜场景适宜存价值不高,构造灵便扩大,数据结构比较复杂。

February 27, 2024 · 1 min · jiezi

关于nosql:Redis配置文件补充

配置文件补充昨天回去想了一想,配置文件还有一个十分重要的知识点没说到位,上面我在给大家补充补充这块,十分重要,十分重要。 int main(int argc , char* argv[]){ //... initServerConfig() //... loadServerConfig(server.configfile, config_from_stdin, options); //...}在执行loadServerConfig函数之前呢,还须要执行initServerConfig函数,该函数的作用如下: initServerConfig()函数的作用是将Redis服务器的配置构造体struct redisServer的各个成员变量初始化为默认值。该函数在Redis服务器启动时被调用,以确保服务器的配置在开始时被正确设置。在该函数中,所有配置选项的默认值都被设置,例如服务器监听端口、日志文件名、长久化选项等等。该函数代码我粘贴给大家看看: void initServerConfig(void) { int j; char *default_bindaddr[CONFIG_DEFAULT_BINDADDR_COUNT] = CONFIG_DEFAULT_BINDADDR; initConfigValues(); updateCachedTime(1); getRandomHexChars(server.runid,CONFIG_RUN_ID_SIZE); server.runid[CONFIG_RUN_ID_SIZE] = '\0'; changeReplicationId(); clearReplicationId2(); server.hz = CONFIG_DEFAULT_HZ; /* Initialize it ASAP, even if it may get updated later after loading the config. This value may be used before the server is initialized. */ server.timezone = getTimeZone(); /* Initialized by tzset(). */ server.configfile = NULL; server.executable = NULL; server.arch_bits = (sizeof(long) == 8) ? 64 : 32; server.bindaddr_count = CONFIG_DEFAULT_BINDADDR_COUNT; for (j = 0; j < CONFIG_DEFAULT_BINDADDR_COUNT; j++) server.bindaddr[j] = zstrdup(default_bindaddr[j]); /* //相干参数的初始化,我就不粘贴了 */ /* Client output buffer limits */ for (j = 0; j < CLIENT_TYPE_OBUF_COUNT; j++) server.client_obuf_limits[j] = clientBufferLimitsDefaults[j]; /* Linux OOM Score config */ for (j = 0; j < CONFIG_OOM_COUNT; j++) server.oom_score_adj_values[j] = configOOMScoreAdjValuesDefaults[j]; /* Double constants initialization */ R_Zero = 0.0; R_PosInf = 1.0/R_Zero; R_NegInf = -1.0/R_Zero; R_Nan = R_Zero/R_Zero; /* Command table -- we initialize it here as it is part of the * initial configuration, since command names may be changed via * redis.conf using the rename-command directive. */ server.commands = dictCreate(&commandTableDictType); server.orig_commands = dictCreate(&commandTableDictType); populateCommandTable(); /* Debugging */ server.watchdog_period = 0;}1 代码阐明-默认绑定 char *default_bindaddr[CONFIG_DEFAULT_BINDADDR_COUNT] = CONFIG_DEFAULT_BINDADDR;这行代码定义了一个指针数组default_bindaddr,其每个元素都是一个指向字符数组的指针,每个字符数组存储了Redis默认绑定的IP地址。 ...

April 9, 2023 · 8 min · jiezi

关于nosql:官宣首届阿里云NoSQL数据库峰会来袭火速收藏

简介:8月25日下午2点,阿里云NoSQL数据库峰会2022,无型有限,一起摸索无束可能!8月25日下午2点,由阿里云主办,阿里云天池、阿里云数据库承办的“阿里云NoSQL数据库峰会2022”将在线上举办。围绕NoSQL数据库技术与利用,阿里云与泛滥行业、畛域技术大咖解码技术,分享案例实际,论道产业倒退。 阿里云NoSQL数据库峰会2022,无型有限,咱们一起摸索无束可能! 点击返回官网,查看精彩内容 三大亮点领先看 理解本次峰会 视频号直播互动赢好礼!立刻预约,不容错过! 长按辨认二维码 关注“阿里云数据库”视频号 查看更多一手视讯! 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

August 19, 2022 · 1 min · jiezi

关于nosql:求索NoSQL的现在与未来第五届-Techo-TVP-开发者峰会圆满落幕

引言日益剧增的数据洪流与改革迅速的新兴业务,既引发了互联网企业对数据库技术的从新思考,也带来了传统行业对数据库利用的二次迷思。以灵便、易扩大著称的NoSQL在企业数字化转型的过程中,到底施展着怎么的作用?其重要性体现在哪?将来NoSQL数据库又将迎来怎么的倒退? 2022年5月14-15日,第五届 Techo TVP 开发者峰会 “数「聚」将来,岂止于快——NoSQL引爆数据效率与价值”正式落下帷幕,12位来自NoSQL畛域的出名技术首领和专家,从性能、效率与数据价值三大方向,与数据库从业者一起独特探讨了面向未来的NoSQL之路。 一、Day1:NoSQL前沿技术趋势(一)主持人收场峰会第一天聚焦在NoSQL的将来趋势剖析与新技术解读,由天翼云首席专家、腾讯云TVP 侯圣文老师负责主持人。会议伊始,侯老师提出,大数据时代,数据量持续性爆炸式的增长,数据存储构造的灵活多样,新兴业务的日益改革,这些需要催生出数据库及利用零碎的存在模式愈发丰盛,也对数据库的各类能力提供了十分多的一些场景和需要,也给技术人带来了极大的挑战和要求。 (二)嘉宾致辞 腾讯云副总裁林晓斌的致辞,正式拉开了本届 Techo TVP 开发者峰会的帷幕。他指出,数字化浪潮中,数据已成为企业最重要的资产,数据库作为数据存储的重要基础设施,工作重大。过来十年间,基础设施降级、数字化过程减速、云计算的遍及,带来了数据库行业的二次高速发展期,云计算服务商在其中施展了微小的作用。 随着云数据库服务进入云原生时代,数据库+云的翻新模式将进一步推动云数据库技术的变革。NoSQL是数据库中十分重要的一大分支,其在海量并发拜访及大规模数据场景下劣势显著,在软件架构层面上具备高并发、易扩大、灵便易用等特点。简而言之,NoSQL数据库曾经成为古代企业不可或缺的数据库服务类型。 腾讯云在NoSQL畛域始终继续着策略级的投入,从产品设计、技术创新、客户服务、再到生态建设,都有着经久不息的摸索和实际。腾讯云私有云曾经提供了包含缓存、文档、时序、KV等在内的数据库服务,并仍在继续丰盛服务品种。与此同时,腾讯云也在踊跃推动内部单干,比方与MongoDB签订策略单干协定。 他最初总结道,腾讯云NoSQL数据库曾经笼罩了包含金融、电力、电商、游戏、视频等数十个典型行业利用场景,将来,腾讯云将在NoSQL数据库畛域继续投入,保持技术创新,以服务企业为基本,助力企业降本增效,晋升生产力。 (三)解放生产力:腾讯云NoSQL的趁势而为与改革翻新 腾讯云数据库副总经理罗云带来了题为《解放生产力:腾讯云 NoSQL 的趁势而为与改革翻新》的主题演讲。 他首先向与会者介绍了过来十年,NoSQL数据库的倒退历程。他示意,随着互联网业务的快速增长,海量用户、海量数据、实时体验、疾速迭代的要求带来了NoSQL的飞速发展。腾讯云NoSQL的发展史也是趁势而为,一脉相承,在缓存、KV、文档、图、时序、宽列、表格这系列的场景中,腾讯云都有提供相应的产品服务。 家喻户晓,Redis在过来5年间始终是最受欢迎的NoSQL数据库产品,然而Redis的利用场景早已冲破了缓存的领域,特地是在存储场景中的利用越来越宽泛,然而企业在存储场景中应用Redis会面临着规模、老本、长久化的难题,业界往年多有推出Redis的长久化产品,然而大多数产品通常可能满足业务在性能、老本、长久化、规模4个诉求中的2~3个,很少有4个诉求能同时满足的。罗云老师示意,腾讯云通过创新性的软硬联合提供极致性能、三级存储解决性能、长久化、老本、规模难题的解法,KeeWiDB团队实现了极致的冲破,做到了: 性能(单节点):20万读取,18万写入,P99<2ms可程度重叠,性能线性晋升;老本:三级存储,冷数据老本降落97%;长久化:命令级长久化;毫秒级稳固写入提早;SSD提供低成本长久化;大容量:单节点提供TB级容量空间;集群形式提供100TB容量空间。分享最初,罗云老师示意,技术人的终极目标是让整个社会的生产效率变得更高,让整个社会的生产力可能变得更好,心愿能够用技术的形式去实现这些美妙的欲望。(四)新硬件赋能翻新:数据发展趋势及软硬件交融解决方案 随着技术的倒退,新硬件的呈现带来了更多可能。英特尔数据库及大数据资深首席工程师、腾讯云TVP 程从超&英特尔数据平台事业部傲腾产品事业部中国技术核心工程部经理吴国安联手带来了题为《新硬件赋能翻新-数据发展趋势及软硬件交融解决方案》的主题演讲。 程从超老师向与会者介绍道,数据处理架构畛域目前有以下几个非常明显的趋势:从Scale up到Scale out;从物理机到云原生;从share-everything到share nothing再到share everything;内存数据库+对象存储;行存和列存并存。因而,数据处理端到端、系统优化端到端成了其中至关重要的局部。 吴国安老师接棒解说了英特尔傲腾新硬件的当先个性,其能够升高数据中心的老本、能够整合工作负载,尝试对数据做更多的事件,在开释数据潜能方面具备弱小能力。英特尔傲腾在NoSQL数据库、举荐零碎、KV存储等方面均有着卓越的用例。 吴国安老师最初总结道: 数据分析的倒退,须要更多的软硬件一体的交融解决方案;英特尔®傲腾™带来新的内存和存储层,更容易的扩大内存和减速存储;更加平衡的老本和性能,为你的业务提供更多、更好的抉择;新硬件带来了新的业务翻新,让不可能成为可能;更加凋谢的生态,更加凋谢互连的零碎,更多的客户拥抱新硬件。(五)MongoDB利用数据平台技术洞悉与实际分享 MongoDB北亚区技术总监林涛带来了题为《MongoDB利用数据平台技术洞悉与实际分享》的主题演讲。 分享伊始,林涛老师抛出了一个令人惊心动魄的数据:70%的企业数字化转型都以失败告终。究其原因,在于大部分数据基础设施依然围绕传统的关系数据库构建,无奈满足以后企业应用和解决数据、构建程序的需要。围绕这些需要,抉择增加专用的NoSQL数据存储,又带来了新的问题。 林涛老师介绍道,扭转简单的数据存储构造、让开发效率变得更高、让架构变得更简略、同时具备安全性和易管理性等个性,正是MongoDB想要实现的。具体而言,MongoDB提供了以下产品能力助力企业腾飞: 提供灵便的文档模型;提供对立的接口;分布式的架构;冷热数据的主动迁徙;客户端字段级加密。最初,林涛老师介绍了多个应用MongoDB构建数据平台的最佳实际案例,通过数据平台的形式,让开发人员和企业可能以更低的老本减速翻新。(六)直面海量图数据挑战,腾讯在图数据库的业务实际与利用 腾讯云图数据库技术负责人肖品带来了题为《直面海量图数据挑战,腾讯在图数据库的业务实际与利用》的主题演讲。 肖品老师示意,随着大数据爆发式的增长,数据之间的关系更加简单多样,对关系数据的关联性计算和剖析成为常态需要,由此带来了图数据库技术的腾飞。在腾讯外部,图技术被广泛应用在图数据库、图计算、图可视化等畛域。 肖品老师重点介绍了腾讯图数据库KonisGraph的架构、性能及应用案例等要害内容。KonisGraph在架构层面采纳的是接口层、计算层、分布式缓存、存储层的模式,设计准则是存算拆散,保障部署的灵活性。在优化策略上,也做了异步并行、向量化、批量预取以及计算下推等优化。此外,在缓存、索引等策略上也都有独到的设计理念。 除此之外,肖品老师还分享了GraphIdex图可视化的设计理念及性能成果、Angel Graph图计算及其框架性能,以及KonisGraph图数据库的相干用例。他最初示意,KonisGraph将来将在以下方向继续优化,欠缺本身。 交融图计算引擎;GQL语法的反对;自研存储层;缓存层欠缺;欠缺周边组件及平台能力。(七)云原生多模NoSQL在特色存储上的利用实际 腾讯PCG利用架构平台部NoSQL开发负责人赵政,为咱们带来了题为《云原生多模NoSQL在特色存储上的利用实际》的主题演讲。 赵政老师介绍道,云原生多模数据库是以后很多私有云厂商提供云托管存储服务的形式。腾讯自研的云原生多模型NoSQL数据库,通过形象高扩大的数据以及高复用的工作流框架,构建了具备容灾备份、数据分层、多种一致性等能力的通用平台底座,依据业务需要灵便定制可插件化的存储引擎框架和扩大API,提供数据模型的灵便扩大和疾速接入能力。 在特色存储的主题上,赵政老师具体分享了“特色”存储的特点、技术挑战,企业需要和以后的解决方案等背景信息。基于这样的背景,腾讯云原生多模NoSQL在零碎设计和实际上要思考要害的两点:首先要反对多级存储能力,第二是存算拆散。在存储引擎方面,要思考到同时实用于内存、长久化存储的需要。除此之外,其余需要则能够靠多模NoSQL的平台来提供撑持。这其中波及到的诸多技术挑战,赵政老师都十分粗疏地向与会者做了剖析。 分享最初,赵政老师示意,腾讯云原生多模NoSQL平台已接入五大业务,日均调用量超过千亿,TB级全量数据更新低于1H,分钟级GB增量数据更新,显著实现了降本增效的业务收益。谈到腾讯云原生多模NoSQL的将来瞻望,他向与会者描述了一幅搜广推场景存储和索引云一体化解决方案的美好蓝图。 二、Day2:NoSQL技术实际与利用峰会第二天聚焦于NoSQL数据库在各行各业的最佳实际利用,由CCIA常务理事、腾讯云TVP 韩锋老师负责主持人。 (一)主持人收场 韩锋老师提出,随着数字化转型的深刻,数据越来越失去人们的器重,挪动互联网的蓬勃发展产生了大量语音、图像、视频等非结构化的数据,这些数据蕴含了十分丰盛的信息,如何把这些数据的价值开掘进去,如何利用NoSQL来助力翻新业务的落地,赋能业务疾速倒退成为企业数字化转型中至关重要的一环。 (二)金融场景下的NoSQL实战:微众银行Redis利用实际 微众银行数据平台数据库负责人、腾讯云TVP 胡盼盼带来了题为《金融场景下的NoSQL实际:微众银行Redis利用实际》的主题演讲。 分享伊始,胡盼盼老师为与会者介绍了社区版Redis的痛点。他示意,分片架构主节点异样对集群有影响,权限治理性能无限,资源统计和资源管制性能十分无限,短少对立的运维与治理平台是微众银行在应用社区版Redis遇到的痛点问题。 为此,微众银行自研了基于Redis的分布式缓存平台WeRedis,除领有开源 Redis的个性外,还有如下个性: 多租户与细粒度的鉴权;资源管制;子系统进行资源管制;高危操作隔离;扩展性更高;可用性更高;智能剖析与管控。胡盼盼老师示意,WeRedis目前曾经利用在全行所有的业务场景,有300+ 零碎接入、87套集群、4000+实例数。随后,他具体介绍了WeRedis的跨 IDC部署架构,以及运维过程中在性能、高可用、容量等问题上踩过的坑,并自私分享了从复盘中一直优化来的WeRedis利用开发标准。随后,他还分享了包含WeRedis治理台性能、鉴权治理及高可用相干的设计与思考。他最初示意,将来WeRedis将在容器化、降级到Redis Cluster 6.0以及长久化架构等方面持续打磨精进。 (三)腾讯音乐NoSQL利用与实际:基于Redis和MongoDB构建社交类业务后盾 全民K歌根底研发后盾Leader李革委带来了题为《腾讯音乐NoSQL的利用与实际:基于Redis和MongoDB构建社交类业务平台》的主题演讲。 分享伊始,李革委老师为与会者介绍了腾讯音乐NoSQL的利用详情,据他介绍,腾讯音乐旗下QQ音乐、酷狗音乐、酷我音乐、全民K歌四大App的特点是多媒体社交+多媒体内容,大量利用了NoSQL数据库。 李革委老师示意,从业务架构的层面看,数据库选型须要思考的是匹配业务模型、扛住海量申请、均衡老本开销三大关键点。在这样的准则登程下,腾讯音乐在Redis和MongoDB两种开源数据库产品下都有深厚的利用实际。 具体到Redis下,实际维度包含: KV读写;CAS解决方案;分布式锁;轻重拆散;列表排序;Bitmap;分布式定时器。在MongoDB下,实际维度包含: ...

June 1, 2022 · 1 min · jiezi

关于nosql:分布式存储论文研读三DynamoDB

这篇博客,分享另一个云端巨头:Amazon的DynamoDB数据库的实现论文,“Dynamo: Amazon's Highly Available Key-value Store”。 BackgroundSystem Assumptions and Requirements与GFS,Bigtable等一样,DynamoDB有一些实用的场景。文章做出以下假如,并依据这些假如进行零碎的设计,会更有针对性: Query Model:读写操作简略,且均基于主键。没有跨多行的操作,也不须要关系语义。存储对象通常在1MB以下。ACID Properties:Dynamo提供的一致性较弱,不保障隔离性(isolation),且只执行单主键(单行)的更新。Efficiency:零碎须要满足高效率,须要在性能、老本效益、可用性和Durability保障之间进行衡量。数据库用于外部零碎,不会被针对性攻打,不须要进行鉴权受权。数据库的指标是扩大到上百个数据节点。Service Level Agreements (SLA)在做数据库的性能评估时,亚马逊更偏向于应用99.9%的散布值来进行掂量,代替罕用的平均值、中位数、方差冀望等等。这和咱们在做一些性能测试时很相像,TP999更能反馈零碎的个别状况,笼罩近乎所有人,而非大部分人的体验。 Design ConsiderationsCAP实践阐明,在区间通信失败或一些网络失败时,数据一致性和高可用性无奈同时保障。DynamoDB冀望保障数据的最终一致性,就义了肯定的一致性等级来保护服务高可用。此时就须要对一些批改抵触进行解决。很多传统数据库通常在写时进行抵触解决,保障读的逻辑简洁,这会导致一些无奈写到所有分片的写操作失败。而DynamoDB心愿能有一个始终可写的数据存储,不心愿驳回用户的写申请。那么此时就会把一些抵触解决迁徙到读的过程中去。 另一个设计理念,是确立由谁来解决写抵触。DynamoDB设计为能够由服务调用方来应用不同的规定解决批改抵触,也能够将这一职责下放到数据库,由数据库执行一些简略的策略,如“last write wins”。 Dynamo还应该被设计为能够继续扩大,即在原有集群上能程度扩大一个节点,同时不对原零碎产生太多的影响。 Dynamo的所有节点职责应该是统一的,也就是没有“主节点”的概念,简化零碎的运维工作。这称为“Symmetry” 比Symmentry更进一步,是Decentralization,去中心化,应用点对点而非核心管制的模式。 最初介绍的一个设计理念是“Heterogeneity”,异质性,零碎该当有利用根底硬件异质性的能力,如在机器间依据其理论能力进行平衡负载。 异质性这部分更多的是我集体的了解,还须要在后续的浏览中明确是否统一。Related Work第一代P2P零碎,称为非结构化P2P网络,如Freenet,Gnutella,罕用于文件分享,会做分布式存储,但每个申请会尽可能申请所有节点来获取数据。第二代P2P零碎,称为结构化网络,能够进行正当正确地路由,快速访问有所须要数据的节点。代表如Pastry和Chord。在此基础上,搭建了不少数据存储系统,如Oceanstore和PAST。 除了P2P零碎,也有很多分布式文件存储系统,例如Bayou,Coda,Ficus,Farsite system以及之前研读过的GFS,Bigtable,还有FAB,Antiquity等等。 与所有列举的零碎不一样中央: Dynamo强调始终可写;零碎被预期部署在一个所有节点可信赖的环境中;应用Dynamo的利用不须要反对结构性的命名空间或是简单的关系语义,只须要简略的key-value;Dynamo针对时延敏感利用,须要保障TP999在几百毫秒的级别。System ArchitectureDynamo针对要害性能所采纳的策略见下表: System Interface零碎提供简略的put和get接口来操作数据。get能够获取到一个数据,也能够是一组抵触的数据,交由利用来解决抵触。put则须要加上context信息,蕴含了一些版本信息等。零碎通过对key进行128位的MD5 hash来决定存储数据的服务器。 Partitioning Algorithm分区算法要求可能动静地将数据均衡散布到各个节点。Dynamo次要通过对key进行hash,值域失去一个环,而后散布到各个节点中去。每个数据会放在hash失去对应的节点,以及其后一个节点上。 这是最根本的哈希一致性算法,其问题是随机调配会导致数据和地位在环上不平均,同时也疏忽了节点性能的异质性。为此Dynamo做了hash算法的变种,每个实体节点会调配多个环中的虚构节点。这样有几点益处: 如果一个实在节点不可用,其负载会被残余节点平分(设想每个数据有两个正本,实在节点1可能存储的是虚构1、4、7节点,挂掉时会拜访对应的2、5、8节点散布在三个不同的实在节点上)。当一个节点复原可用,或退出到零碎中时,各个其余可用节点能够分担数据迁徙的压力。一个节点具体负责的虚构节点数量能够依据其容量,性能动静调整,能够感触到硬件节点的异质性。Replication为了保障数据的高可用性,每条数据都会保留N个正本。当一个数据被调配到一个节点上时,这个节点还会负责将这份数据放到它的前N-1个虚构节点上。 负责保留同一份数据的节点列表被称为一个“preference list”,为了保障节点故障时数据仍可用,preference list数量通常会多于N。另外,因为应用了虚构节点的概念,几个虚构节点可能处在同一个物理节点上,为了解决这一问题,preference list会在环中跳跃式调配,保障整个列表蕴含不同的物理节点。 此处的跳跃调配形式也不是很分明。有待后续补充。Data VersioningDynamo保障数据的最终一致性,也就意味着对同一份数据的多个正本流传批改能够是异步的,通常不须要期待所有分片都写完即可向用户返回后果。造成的问题之前也提到过,在一些特定的谬误场景,如网络分区稳定或服务器宕机等状况下,改变可能无奈传递到所有分片。 在亚马逊平台中,有不少利用其实是能够容忍这种谬误的,例如增加购物车场景,当用户增加时,申请不会被回绝,如果此时最新版本的购物车数据不可达,那么就将数据保留在老一些版本的数据中,这两份不同版本的数据会在获取时进行交融。当然,此时会呈现的另一个问题是,交融过程中被删除的item可能从新呈现在列表中。这个过程要求设计的应用程序能感知并解决批改抵触。 Dynamo应用向量钟(vector clocks)来确定不同版本之间的先后关系。那么此时各个正本中不仅保留了各自的数据,还会保留该数据的多个版本。保留的版本数量无限(如10个),当感知到其余分片上的批改时,判断本人分片上的版本全副低于该批改的最新版本,那么本人分片的内容就会被笼罩。否则,则仍会保留多个版本,待读取时进行抵触解决。 Execution of get() and put() Operationsget和put操作有两种形式来找到对应须要操作的节点: 将申请发送到一个通用的负载均衡器,由它来依据内容进行路由。这种办法利用不须要本人保护连贯Dynamo的代码。应用一个能够感知分区的client库来将本人的申请路由到对应的节点。这种办法提早更低,因为少了一层转发(见后续形容)。通常承受get和put操作的是preference list中的第一个节点(如果是通过负载平衡的申请,可能会路由到list中任意一个节点,此时申请会再被转发到第一个节点)。写和读操作波及N个节点,和很多仲裁零碎(quorum system)一样,须要保障 R + W > N。R即读申请时须要收到的分片响应数量,相应的,W即写申请时须要收到的分片回复数量(蕴含自身解决申请的节点本地读写)。在这种模型中,申请的提早取决于最慢的R个读或W个写节点。也因而,R和W能够获得尽可能小。 Handling Failures: Hinted HandoffDynamo实际上不须要零碎保障所有的quorum节点可用。它应用一种“sloppy quorum”的策略。简略来说,一份数据贮存在ABC三个节点中。当A节点宕机或不可达时,就长期贮存在D节点中。D节点独自有一块区域存储这些本不属于本人的数据,并进行定时轮询。如果发现A节点可用,就将数据传输回去并删掉本地的正本。始终保持三个节点的数据正本。(留神此处抉择D不是任意的,应该是在环中最近一个衰弱节点,这样能力保障故障时读写数据能找到该节点)。 与此同时,Amazon为了保障Dynamo的高可用性,还会将数据存储节点散布在多个数据中心中,数据中心间通过高速通道连贯,防止自然灾害等导致一个数据中心同时宕机的危险。当然这样的部署对于小型机构来说是根本不可能的,仍须要依赖于Amazon平台的基础设施。 ...

April 16, 2022 · 1 min · jiezi

关于nosql:分布式存储论文研读二BigTable

首先和论文无关,还是想分享一下来自Malte Schwarzkopf博士毕业论文Operating System support for warehouse-scale computing的一张Google根底服务架构图: GFS和Bigtable都在其中,关系高深莫测。 Data ModelBigtable从实质上来讲应该相似于一种NoSQL数据库,同时又提供了一般的数据库所没有的接口。它的数据模型如下: (row:string, column:string, time:int64) -> string之后的一些NoSQL数据库如Cassandra,HBase等均有相似构造。构造中有以下几个组成部分: Row:能够看作每条数据是一行,对一行数据的读写操作是原子的。Bigtable会对row key进行字典序排列,只管每张表的行范畴分区随机,但设计良好的row key就能使相干数据相邻间断排列。读取时也只须要拜访多数几台机器。Column:column key会被组织成column family,语法是column:qualifier。column family中几个key的取值类型个别雷同,设计心愿column family是事后设计好的,比拟固定,且数量不多(但column的数量不限)。column family是访问控制的最小单位。Timestamp:工夫戳最重要的性能是记录同一个值的不同版本。同时也能针对column family定义管理机制:只保留多久版本的记录,或保留最近几个版本。APIBigtable提供了一系列API供用户进行数据操作。有几个要点: 容许应用正则匹配列名,对匹配后果加以限度。反对单行的事务。不反对跨行事务。Integer数据可用作计数器。反对在服务器地址空间执行客户端提供的脚本。反对脚本,但脚本不能写回Bigtable是什么意思?脚本不能写入数据,但能进行数据转换,数据过滤,数据汇总等“查问”类操作。Bigtable的一大特点就是反对配合MapReduce应用。 Building BlocksBigtable作为比拟下层的利用,依赖于一系列Google产品。 首先它的数据和日志文件是存储在GFS上的。 其次,它存储数据的数据结构是Google SSTable,这种数据结构将数据分为小块(64KB),并作索引。不便查找和映射到内存空间。 Bigtable还依赖于分布式锁服务:Chubby。Chubby具备较高的可用性,通常会维持5个分片并选举一个master。应用Paxos算法来保障分片一致性。Chubby提供一个由目录和文件组成的命名空间(namespace),每个目录或文件都能够作为锁,保障读写一个文件是原子操作。应用Chubby,Bigtable能够: 保障只有一个master节点(Bigtabled的master节点,可持续看下一章);存储Bigtable数据的bootstrap地位;存储Bigtable的Schema信息;存储Bigtable的access control列表。ImplementationBigtable零碎由三大部分组成: 一个所有客户端连贯的library。master服务器负责调配分片到分片服务器,探测新退出和过期的分片服务器,平衡分片服务器负载,做GFS文件的垃圾回收,以及解决schema变动。分片服务器治理一系列分片,解决分片的读写申请,数据都不会通过master节点。同时分片服务器也会对过大的分片进行切片。最终的分片大小大略在100-200MB左右,合乎GFS的存储特点。Table Location下图是Bigtable中tablet的分层构造: 第一层的Chubby蕴含了root tablet的地位,root table是METADATA table的第一个tablet,存储了其余MEATADATA tablet的地位,且不可拆分,保障了整体最多三层的构造。METADATA tablet存储了各张表的地位,每条记录1KB左右,METADATA总大小限度在128MB,曾经足够绝大多数零碎应用。 在此架构上,一个client进行寻址须要拜访3次(从拜访Chubby开始),如果缓存过期,则最多须要6次访问。且只须要拜访内存数据。同时还会通过一次性读多个tablet来预读取进行进一步优化。 为什么缓存生效时须要读6次?缓存的具体是什么?这不是意味着不必缓存更好么?Table AssignmentBigtable应用Chubby来追踪tablet server的在线状况。在线的tablet server会继续占有一个特定文件的锁,如果锁被开释则server也进入不可用状态。如果有一个tablet没有被调配,又有适宜的server,master就会向对应的server发送tablet load申请。 应用锁来断定服务是否存在是一个很乏味的办法,具体的逻辑如下: master发现有server开释了锁,或是某个server的最近几次申请均失败。master尝试申请该server占有的锁。获取锁胜利,阐明master和Chubby存活,server宕机,master删除该server信息,进行tablets的重新分配如果tablet server意外宕机,并没有被动开释锁,那么锁何时会开释?是否是通过过期工夫?而如果master无奈和Chubby通信,本人的session过期,就会被动kill本人。此时重启一台master,做如下操作: 向Chubby获取一个master锁,保障没有其它的master节点启动。扫描Chubby中的server信息。和每个tablet server交互获取tablet调配信息。扫描METADATA table,没有被调配的tablet放入未调配组,期待进行调配。tablets会产生新建,删除,合并和决裂操作,前三者均有master发动,最初一点由tablet server触发,并会将记录上报给METADATA table,并告诉master。 Tablet ServingTablet的工作流大抵如下图: 当写申请来时,会进行权限校验,而后记录到tablet log中去。最新的批改存入内存中的memtable,老的申请写到GFS上的SSTable Files中去落盘。 如果须要复原一块tablet,就须要从METADATA中读到它的SSTable地址,以及一些日志中的redo points,将SSTable读到内存并重做日志记录,重构memtable。 对于读申请,则在权限校验后,将须要的SSTable内容和memtable内容组合起来发给Client。 Compactions对于上一大节中写操作,具体来说,当memtable一直变大并达到肯定阈值时,就会被解冻并由一个新的memtable承受输出。被解冻的memtable则转化为SSTable存入GFS。此时就能清理server的内存,同时也能够缩小log中的对应日志。这一操作被称为“minor compaction”。 而因为通过minor compaction生成的SSTable比拟小,后台任务还会定时合并这些SSTable和memtable到一个SSTale中去,称为“major compaction”。在minor compaction中生成SSTable可能蕴含已删除的数据,而在通过major compaction后就会理论删除数据,回收对应空间。 ...

April 15, 2022 · 1 min · jiezi

关于nosql:分布式存储论文研读一GFS

为了在分布式系统的技术栈中有更深的意识和更松软的根底,筹备在这个季度破费工作外的工夫对Google和Amazon一系列分布式数据的论文进行研读学习,并将研读后果整顿为博客记录。 本篇研读的论文是The Google File System,发表于2003年的SOSP,介绍了Google的GFS文件存储系统。 Design OverviewAssumptionsGFS自身属于分布式存储系统,其设计次要针对以下几点假如: 零碎构建于便宜的部件上,部件生效是失常事件。零碎存储的是数量较少的大文件。具体来说,预期文件数量在百万级,每个文件大小通常会达到100MB以上,也会有文件达到几个GB的大小。零碎上文件的读场景次要有两种。一种是每次读取操作会拜访几百K甚至1MB以上间断数据的大规模流式读取。一种则是一次读取几百K随机地位数据的小规模随机读取。零碎上会有大量程序写入的append操作,数据量与读操作相当,且一旦写入很少会进行批改。零碎须要无效地实现定义良好的语义来反对多客户端的并发操作。其重点是应用起码的同步开销来保障操作原子性。相比于低提早,继续的高带宽更重要。这些假如实际上也就是GFS分布式文件系统的需要。为了准确匹配这些需要,GFS做了许多非凡设计和优化操作。 而从零碎设计的角度来说,没有哪一种设计是可能服务所有场景的。在进行零碎、算法、数据结构的设计之前,咱们都应该为它建设一个精准的场景假如,从而在计划取舍时有明确的倾向性,也合乎程序“do one thing and do it well”的哲学。 ArchitectureGFS的次要架构如下图: 零碎由一个master节点和多个chunk server节点组成。数据文件都被切分成了固定大小的chunk,并由一个64bit的chunk handle惟一标识。同时每个chunk会保留3份正本以保障高可用性。 Single Master单个主节点可能简化整个集群的设计,主节点可能实现所有的决策工作。但同时,为了保障主节点不会成为性能瓶颈,设计时做了几点优化: master节点从不负责数据传输,只负责控制协议,即告知client申请的chunk在哪个chunk server上。client对同一个chunk的申请只须要一次和master的交互,之后会缓存chunk的信息直到过期。client能够一次申请多个chunk信息。master也能够返回申请chunk之后紧跟着的chunk信息给client,缩小client和master节点的交互。能够看到,大部分的优化都利用了程序的局部性,简略且实用。 Chunk在GFS零碎中,为了应答非凡的大数据需要,chunk设计也有如下特点: chunk大小为64MB,远高于传统的文件系统。chunk存储采纳惰性空间调配,尽可能防止碎片。chunk设计的很大,一方面实用于大数据利用的场景,另一方面缩小了client和master、chunk server的交互。同样的数据量下,chunk的地位信息和元数据也更少,client更容易缓存,master也更容易存储。 这种chunk设计也有一个毛病,就是如果一份文件比拟小,只占用几个或只有一个chunk,同时又是一个热点文件时,会造成存储这份文件的几个chunk server负载过重。论文中给出了两个计划: 疾速的解决方案是减少热点文件的正本数量,扩散client的读取。更长期的解决方案,是容许一个client从其它client上读取热点数据。Metadata主节点保留了所有的元数据。元数据包含文件和chunk的namespace、文件到chunk的映射关系、以及各个chunk所在节点的信息。为了保障整个集群的高可用性,对metadata有以下非凡解决: 所有的metadata均保留在master节点的内存中。这里再次显示出大chunk设计的劣势,每个chunk通常只须要64 bytes的metadata。如果数据量进一步减少,只须要再减少master节点的内存即可。master节点并不会长久化存储chunk server存储的chunk正本信息,而是在启动时,以及chunk server退出集群时向chunk server查问。同时通过监控和心跳包时刻放弃信息更新。起因则是chunk server是很有可能呈现故障的,理论的chunk地位信息也可能会因为各种起因产生扭转。GFS会长久化存储的是operation log,操作日志。它记录了并时序化了整个零碎metadata的变动信息,所有事件的前后程序以操作日志记录为准。操作日志通常会保留多个近程正本,只有在所有正本都同步后才会响应metadata的批改操作。同时当master节点宕机时也会通过反复操作日志来复原,master节点会在操作日志达到肯定大小时在本地保留checkpoint,每次复原从上一个checkpoint开始反复执行无限的操作。checkpoint是一个压缩B树,能够不便的映射到内存。Consistency Model首先定义:一块文件区域是“consistent”,代表无论从哪个分片,读取到的数据是统一的。一块文件区域是“defined”,代表在一次数据扭转之后,这块文件区域是“consistent”,且所有客户端能够察看到这次操作所作的具体批改。这里的批改示意“Write”随机写操作和“append”开端增加操作。 GFS对于零碎的一致性有如下的保障: 文件命名空间的扭转(例如创立文件)是原子的。这部分操作由master节点加锁实现,会通过操作日志造成一个惟一的时序动作。一次胜利的批改操作,在没有并发生产者的烦扰下,文件区域是“defined”的。一次胜利的并发“write”操作,文件区域是“consistent”的。客户端尽管能读到同样的数据,然而并不能确定每一次操作具体批改了哪一部分。一次胜利的并发“append”操作,文件区域是“defined”的。起因是append的地位是由零碎算法抉择的,并会返回给客户端以标记出此批改的开始和完结地位。一次失败的批改操作,会导致文件区域“inconsistent”。System Interactions为了实现上一章中形容的架构,达成一致性模型,GFS零碎外部通过通信合作实现三类次要工作:批改数据,原子的append操作以及快照。 Data Flow数据批改的流程如下图: 首先须要阐明,在一个chunk的多个正本中,有一个正本作为“primary”正本。primary正本会整合对chunk的所有写操作,造成一个线性序列。 client询问master节点持有chunk lease的正本以及其它chunk正本的地位。如果还没有调配lease,则由master节点进行调配。master节点回复primary和其它正本的地位信息,client会缓存这些信息。client将批改推送到所有正本。每个chunk server会将批改缓存到LRU的缓冲区,直到被生产或过期。图中能够看到数据流和控制流进行理解耦,使得数据流的流向能够依据拓扑决定,例如图中正本A离Client更近,数据再由正本A发往primary正本。primary正本再发到正本B,是一条依据最近准则形成的转发链。当所有正本都收到批改数据后,client向primary正本发送一个写申请。primary正本会对相似的所有client发来的申请进行排序,并按程序执行。primary正本再告诉其它正本依照同样的程序执行批改。其它正本批改完后就告知primary正本。primary正本将批改后果告知client。如果这其中有任何的谬误,client都会重试步骤3-7若干次。此时如上一章所述,文件区域是“inconsistent”的。 而如果一次批改波及到多个chunk,那么client就会把它合成为对应各个chunk的若干个独自批改。此时如果还有其它client在并发批改,那么文件区域就处于“consistent”但不“defined”状态。各个分片上的数据是统一的,但批改是混合的。 Atomic Record Appendsappend的数据流与数据批改基本一致。不同点在于,primary在接到写申请后,会计算写的起始和完结地位,并告知其它正本截然不同的地位。而此时并发的其它写操作,则会在排序后在上一个写操作之后的高地址进行。操作间不会写同一块文件区域。也因而append操作是原子的,且文件区域是“defined”。 须要留神的是,当append操作失败时,同样会进行重试,而此时重试会产生在新的高地址中。也因而chunk中会蕴含一条record的反复数据。此时须要生产端通过记录的校验和和惟一标识等进行判断。 那么问题是,这里为什么不设计成在原地址上进行重试呢?:在旧址上进行重试就变成了overwrite而不是append操作了。实际上append操作要比overwrite高效很多,因为它不用思考过多的分布式锁等问题。那么能够看到,GFS在这里宁愿多节约存储空间,也要应用append操作晋升性能。SnapshotGFS创立快照利用了已有的copy-on-write技术。顾名思义,这种办法在拷贝时会首先创立新的虚拟空间指向原空间,在有写改变时再进行理论的复制。 在GFS中,当创立快照的申请到来时,master会先发出所有待拷贝的chunk租约,保障后续的写申请会先通过和master节点交互。发出租约后就复制原有chunk的metadata,此时新的chunk其实依然指向旧的空间。接着当一个新的写申请到来时,须要向master询问primary chunk信息,master会筛选一个新的chunk持有租约,并告诉所有chunk原来地位的chunk server本地复制chunk,失去新的chunk并开始失常的写操作。 Master Operations能够看到,整个GFS零碎逻辑最简单的中央其实是master节点。论文第四章就单列一章讲述了master节点做各种操作的办法。 NamespaceGFS不会像传统文件系统一样对每个目录产生具体的数据结构,而是将每个文件和它后面残缺的目录前缀映射到metadata中。例如“/d1/d2/.../dn/leaf”,作为一个残缺的文件门路进行映射。 为了反对并发操作,文件的读操作会依目录程序顺次申请各级目录的读锁:“/d1”、“/d1/d2”、“/d1/d2/.../dn/”、“/d1/d2/.../dn/leaf”,而写操作则会顺次申请各级目录的读锁,和最终写文件的写锁“/d1/d2/.../dn/leaf”。 这种机制在保障并发操作正确性的状况下,提供了很好的并发性能。 Chunk Replica在创立chunk正本时,master主机会思考: 将chunk放在磁盘负载低于平均水平的机器上,保障负载平衡。限度每台主机最近新增的chunk数量,保障写操作可能扩散。将多个正本放在多个机架多个机房的主机上,可能容灾以及在读操作时最大限度利用带宽(当然写操作时也减少了带宽,是一个trade off)。当chunk正本数量低于预期时,master会对须要复原的chunk进行排序,而后就像新建chunk一样申请新的地位并从还剩下的valid chunk中复制数据。排序次要遵循以下几点: 正本少于冀望的数量越多,优先级越高。仍然存在的chunk优于文件曾经被删除的chunk阻塞了客户端过程,也即正在应用的chunk优先级更高。master节点也会定期进行零碎的rebalance,而不是新增一台chunk server后就把所有新的chunk创立在这台机器上。这会造成短时间内的写入峰值。 ...

April 14, 2022 · 1 min · jiezi

关于nosql:天翼云联手平凯星辰共建开源分布式数据库实验室

数字时代下,数据成为新的外围生产因素。数据库作为整个数据价值体系中的基石,施展着越来越重要的作用。近日,天翼云与平凯星辰签订策略单干协定,正式达成全面策略合作伙伴关系。基于天翼云在 TiDB 开源社区的长期关注和奉献,单方将共建开源分布式数据库实验室,独特摸索云原生 HTAP 分布式数据库在电信及政企行业的利用场景,制订相应的运维标准,减速中国电信行业软件国产化过程。随着云计算技术的规模化利用,企业数字化的场景曾经渗透到了生产、办公、生存等各个方面,数字化转型曾经全面进入智能降级新阶段。作为国内当先的云服务商,天翼云一直晋升技术自研能力,以自主可控的国产化技术构建“云网数智安”一体化服务能力,研发全栈云平台,打造出具备实时数据服务能力的数字基座,继续推动数字化转型降级。此次单干将在肯定水平上晋升数据库多元化的服务能力,天翼云总经理示意,单方将独特推动发行版数据库的研发及我的项目单干,以及在公有云、私有云层面发展深度单干,实现商机互通、品牌双赢,同时实现在政企、金融行业和新经济等畛域的宽泛互动。据理解,天翼云TeleDB是一款兼容开源TiDB协定的企业级智能化分布式数据库引擎,反对在线事务处理(OLTP)和在线剖析解决(OLAP),是一款高性能 HTAP交融型 NewSQL 数据库,实用于数据大规模、高可用、高吞吐等业务场景。TeleDB数据库采纳容器化技术和分布式块存储技术,通过云原生技术改造业务,使得数据库服务器的 CPU、内存可能疾速扩容,通过动静增减节点晋升性能和节省成本,存储空间无需手动配置,实现主动弹性伸缩。目前,TeleDB已研发外围PaaS技术20余项,取得外围专利技术16项,实现了技术齐全自主可控,时至今日已全面撑持企业IT上云和业务上云,稳定性失去充沛验证。同时,TeleDB 构建了凋谢的生态体系,高度兼容 TiDB、MySQL、PostgreSQL、openGauss,寻求社区深度单干,在强化本身能力的同时反哺社区,晋升代码自主可控能力及数据库团队的社区影响力,并建设人才引入及造就机制。此次单方携手并进,进一步强化了TeleDB交融型数据库内核研发能力,实现产品定制化开发,晋升了TeleDB数据库产品行业化服务能力和性能指标,致力独特打造TeleDB数据库行业标杆,助力政企客户数字化转型。作为企业级开源分布式数据库的领导企业,平凯星辰创建的TIDB 我的项目在GitHub上已总计取得超过30000+颗星,累计超过1600位开源贡献者,是寰球数据库活跃度排名前三的开源我的项目,也是中国排名前三的开源我的项目。目前,平凯星辰曾经服务寰球2000多家企业用户,取得多家金融机构的信赖,TiDB胜利利用于浦发银行、北京银行、浙商银行、中国人寿、安全科技、微众银行等金融企业的联机交易、在线领取、信贷管理、实时风控等场景。技术架桥,开源铺路。面对新时代的全新时机与挑战,单方策略单干的达成,标记着天翼云与平凯星辰的全面单干关系跃升到新的台阶。将来单方将施展各自劣势通力合作,为用户带去更优质的产品和服务体验,摸索实现跨越式倒退的新门路。

March 17, 2022 · 1 min · jiezi

关于nosql:TA业界领先的全球分布式多模型-NoSQL-数据库

游戏开发者越来越关注全托管 NoSQL 云数据库服务。NoSQL 云数据库服务宽泛应用在游戏玩家信息和状态治理、配对、排行榜、配备财产清单、社交、埋点数据捕捉与剖析等场景,它能够在寰球范畴内提供更低提早的多玩家体验,并大幅缩小数据库治理运维工作。 《我的世界:地球(Minecraft:Earth)》、《酒囊饭袋:无人之地(The Walking Dead: No Man’s Land)》、《光环5:守护者》、《World War Z》、《Magic the gathering: Arena》等游戏,以及 Xbox Live、Windows Store 都采纳了 Azure Cosmos DB 数据库服务。 一句话定义:“Azure Cosmos DB is Microsoft’s globally distributed, horizontally partitioned, multi-model database service。” Azure Cosmos DB 诞生于 2010 年,目前数以万计的客户应用 Cosmos DB 并将其配置为多区域进行寰球复制。Cosmos DB 是用于任何规模的寰球分布式多模型 NoSQL 数据库服务。所谓多模型数据库服务,意思是说数据能够以多种不同的形式存储。目前,Cosmos DB 提供 4 种数据模型,开发者能够应用 Azure 原生及开源 API、多种 SDK、主动 Schema-Agnostic 索引、寰球散布多主写入、non-ETL HTAP 剖析(无需数据抽取即可实现 OLAP) 等性能个性,实现简化开发的指标。 Azure Cosmos DB 提供无可比拟的、SLA 财务承诺的性能、可用性和一致性的保障(留神:性能和一致性也有 SLA),即任何规模下 99% 工夫内读写响应工夫 <10 毫秒的性能,99.999% 的可用性以及逻辑分区范畴内 100% 读取申请满足所选一致性级别。Azure Cosmos DB 能够主动即时扩大伸缩,能够满足每秒几亿 QPS 的拜访申请。Azure Cosmos DB 引擎应用快照隔,反对满足 ACID 的事务以及乐观并发管制(OCC)。 在逻辑分区范畴内反对多记录事务,即基于 JavaScript 的存储过程、触发器、UDF 蕴含的所有数据库读写操作都能够囊括在一个满足 ACID 事务中,该事务在逻辑分区内的所有记录(我的项目)之间应用快照隔离。快照隔离能够保障读操作读取的行是事务开始时可用的最初提交版本,保障读取的是曾经提交过的数据,并且能够实现可反复读,也能确保不会幻读。 ...

March 15, 2022 · 2 min · jiezi

关于nosql:HBase的RowKey设计原则含案例全

#### 前言HBase的RowKey的行由行键按字典程序排序,这样的设计优化了扫描,容许存储相干的行或者那些将被一起读的邻近的行。然而,设计不好的行键是导致 hotspotting 的常见起因。当大量的客户端流量( traffic )被定向在集群上的一个或几个节点时,就会产生 hotspotting。这些流量可能代表着读、写或其余操作。流量超过了承载该地区的单个机器所能负荷的量,这就会导致性能降落并有可能造成地区的不可用。在同一 RegionServer 上的其余地区也可能会受到其不良影响,因为主机无奈提供服务所申请的负载。设计使集群能被充沛平均地应用的数据拜访模式是至关重要的。 为了避免在写操作时呈现hotspotting,设计行键时应该使得数据尽量同时往多个RegionServer 上写,而防止只向一个RegionServer 写,除非那些行真的有必要写在一个RegionServer 里。HBase的排序问题按字典序rowkey排序,从小到大,如果工作为了取得最新的工夫数据可用用工夫戳反转,或者用long.maxvalue - timestamp #### 设计准则依照 散列 惟一 长度 程序 散列散列和预分区能够放在一起 比方事后分10个region 缩小热点问题能够将id %10 做结尾 然而如果id规律性强的话 能够用(id+年月日)%10惟一必须在设计上保障其唯一性,rowkey是依照字典程序排序存储的,因而,设计rowkey的时候,要充分利用这个排序的特点,能够将常常读取的数据存储到一块,将最近可能会被拜访的数据放到一块。能够用工夫戳放在其中 hbase是按字典序排序 要思考始终单分区写状况长度rowkey作为二进制码流最大为64kb 最好不要超过16个字节 设计过长会占memstore空间程序 HBase的rowkey装置字典序顺序排列 从小到大,所以须要最新数据时须要翻转工夫戳或者自增id 可枚举属性值较少的属性放在rowkey后面rowkey是由多个字段组合而成,这多个字段的先后秩序和拜访的效率有间接的关系。一个广泛的规定是:数量较少,可控的字段放在rowkey靠前地位(如eengine_type,provinc等);反之放在前面(如vin,timestamp等)。这样做的起因是可控属性放在后面,对各种不同查问需要的平衡性强一些,反之平衡性较差。 案例1:YCK09360-60-1638290481900-9011D6L00124 434.7 YCK09360-60-1638290482900-9011D6L00124 76.1 YCK09360-60-1638290483900-9011D6L00124 18.6 YCK09360-60-1638290484900-9011D6L00124 150.1 YCK09360-60-1638290485900-9011D6L00124 96.1 YCK09360-60-1638290586900-9011D6L00124 35.7ENGINE_TYPE 可枚举,并且数量较少,放在后面;而vin确很多,因而放在前面。这样的设计可能适应如下两种需要,复杂度都比拟小:1) 查问,某段时间内 YCK09360-60的所有数据。这种需要设置scan的startrow=‘YCK09360-60_工夫戳’,endrow=‘YCK09360-60_工夫戳’,即可。2) 查问某段时间内的所有9011D6L00124 的数据。这种需要下,依据scan rowkey间断的准则,这种需要设置scan的startrow=‘YCK09360-60_工夫戳_9011D6L00124 ’,endrow=‘YCK09360-60_工夫戳_9011D6L00124 ’,即可。然而,如果将vin放在后面,如下所示,适应性就差一些,如下所示案例2: 9011D6L00124-YCK09360-60-1638290481900 434.7 9011D6L00124-YCK09360-60-1638290482900 76.1 9011D6L00124-YCK09360-60-1638290483900 18.6 9011D6L00124-YCK09360-60-1638290484900 150.1 9011D6L00124-YCK09360-60-1638290485900 96.1 9011D6L00124-YCK09360-60-1638290586900 35.71)查问某段时间内的所有9011D6L00124 的数据。这种需要下,设置scan的startrow=‘9011D6L00124-YCK09360-60-工夫戳,endrow=‘9011D6L00124-YCK09360-60-工夫戳’,即可。2) 查问某段时间内 YCK09360-60的所有数据。这种需要设置scan是要取的YCK09360-60小所有的vin号并放在rowkey的最前段,启动多个scan 去扫描多组数据HBase的rowkey装置字典序顺序排列 从小到大,所以须要最新数据时须要翻转工夫戳或者自增id ,所以在应用工夫戳字段是最好是应用long.maxvalue-timestamp/1000 ,这样保障最新的数据总是在较新的地位,不便读取预分区的设置也是由必要的,避免数据热点问题.,能够应用hash取余的形式去要害分区字段,保障了分区平均性所以最初设计的计划分区字段-标识字段-标识字段-long.maxvalue-timestamp其余我感觉有意义的点缩小列族及缩小数据存储的开销,必要时缩小限定符 ,间接将数据写成独自一条,其余解决代码中进行宰割. 在HBase中,value永远和它的key一起传输的。当具体的值在零碎间传输时,它的rowkey,列名,工夫戳也会一起传输。如果你的rowkey和列名很大,HBase storefiles中的索引(有助于随机拜访)会占据HBase调配的大量内存,因为具体的值和它的key很大。能够减少block大小使得storefiles索引再更大的工夫距离减少,或者批改表的模式以减小rowkey和列名的大小。压缩也有助于更大的索引。管制rowkey在16个字节以下 并维持在8的整数倍,合乎64位零碎的8字节对齐 ,最大不要超过64位业务拜访中权重高的key放在后面例如URLRecords表的主要用途是用来计算当天的URL拜访排名。依据业务需要,须要拜访某天的所有URL,因而date是主键,权重更高,放在后面,而URL则放在前面。结构冗余数据例如,percontent的数据蕴含了URL Records的数据,URL Records的数据是冗余存储的,区别在于percontent的URL放在date后面,而URL Records表的URL放在date前面。这就是因为URL在满足不同需要的时候,权重不同,因为URL Records须要的数据量不大,因而采纳冗余的机制解决该矛盾。衡量需要的重要性和零碎忍耐度抉择一种计划当两种需要有矛盾,但其中一方属于主要需要,并且在零碎忍耐度范畴之内的话,能够舍弃一种计划。优先满足需要更强的一方Rowkey的工夫属性问题循环key应用(1)存在问题如果rowkey中有工夫属性,并且随着工夫的减少,rowkey会一直的增大上来的话,会造成region数量一直地减少。如果应用TTL来控制数据的生命周期,一些老的数据就会过期,进而导致老的region数据量会逐步缩小甚至成为空的region。这样一方面region总数在一直减少,另外一方面老的region在一直的成为空的region,而空的region不会主动合并,进而造成过多空的region占用负载和内存耗费的状况。(2)解决办法这种状况下,能够应用循环key的办法来解决。思路是依据数据的生命周期设定rowkey的循环周期,当一个周期过来当前,通过工夫映射的办法,持续应用老的过期数据的rowkey。例如,key的格局如下:YY-MM-DD-URL。如果数据的生命周期是一年,则能够应用MM-DD-URL的格局。这样以后一年过来当前,数据曾经老化,后一年的数据能够持续写入前一年的地位,应用前一年数据的rowkey。这样能够防止空的region占用资源的状况。依据hbase的原理,key的周期须要至多比TTL大2* hbase.hregion.majorcompaction(默认24小时)的工夫,才可能保障过期的数据可能在key循环回来之前失去齐全清理。依照工夫周期进行建表的形式也能够解决空region的问题,和循环key办法相比拟,循环key的长处如下:操作简略,不须要反复建表,零碎主动解决同样,循环key具备如下劣势:须要应用TTL来老化数据,可能会减少compact累赘须要保障查问操作不会查问到过期数据,否则会影响零碎性能。如果在零碎压力不是特地大,须要长期运行,可能管制查问不会查问到过期数据的场景下,倡议应用TTL+循环key的形式,否则倡议应用依照工夫周期进行建表的形式。通过rowkey设计来管制并发度在雷同业务模式下,不同的rowkey设计零碎的并发度不一样。和按天建表的思路相似,通过rowkey管制并发度的准则是激活的region总数适中,每个regionserver的激活Region数大于1,小于(写操作内存/flushsize)为宜。为了实现这一点,能够将可枚举、数量无限的属性放在rowkey的后面,工夫放在前面的形式来进步并发度;通过将大粒度的工夫属性(如天、小时等)放在rowkey后面,数量很大的可枚举属性(如电话号码、URL等)放在前面的办法来管制激活的region数。电信手机行业案例案例一 xx_yy_zz_工夫戳 xx为分区字段 必须散列 yy 和zz为标识查问字段 若可枚举依照字段枚举个数从小到大 不便查问 工夫戳为最好查问字段标识 若表的用处是为了统计当天数据 能够将年月日放入rowkey 并排在yy之前 场景题 应用场景: 电信案例:查问某个人(手机号)某年[某月某日](工夫)的通话详情。 1) 预分区 (1) 评估将来半年到一年的数据增长,不让其主动分区(10G) (2) 确定分区键 00| 01| 02| ... 000| 001| ... 2) 设计RowKey (1) 确定分区号 (散列性) 00_ 01_ 02_... 手机号%分区数 不够散列 (手机号+年月日)%分区数 依照月份、年进行查问 不不便 (手机号+年月)%分区数 (2) 拼接字段 (唯一性、长度) XX_手机号_工夫戳 XX_手机号_年月日 时分秒 XX_工夫戳_手机号 XX_年月日 时分秒_手机号 (3) 校验 13412341234 2021-09-07 XX_手机号_年月日 时分秒 startRow:05_13412341234_2021-09-07 stopRow :05_13412341234_2021-09-08 05_13412341234_2021-09-07| XX_年月日 时分秒_手机号 startRow:05_2021-09-07 00:00:00_13412341234 stopRow :05_2021-09-08 00:00:00_13412341234 13412341234 2021-09 2021-11 XX_手机号_年月日 时分秒 startRow:05_13412341234_2021-09 stopRow :05_13412341234_2021-09| 05_13412341234_2021-10 startRow:03_13412341234_2021-10 stopRow :03_13412341234_2021-11 startRow:04_13412341234_2021-11 stopRow :04_13412341234_2021-12

March 1, 2022 · 1 min · jiezi

关于nosql:学了那么多NoSQL数据库NoSQL究竟是啥

文章内容:学了那么多NoSQL数据库NoSQL到底是啥 作者:优极限 NoSQL 简史 NoSQL 一词最早呈现于 1998 年,是 Carlo Strozzi 开发的一个轻量、开源、不提供 SQL 性能的关系数据库。 2009 年,Last.fm 的 Johan Oskarsson 发动了一次对于分布式开源数据库的探讨,来自 Rackspace 的 Eric Evans 再次提出了 NoSQL 的概念,这时的 NoSQL 次要指非关系型、分布式、不提供 ACID 的数据库设计模式。 2009 年在亚特兰大举办的"no:sql(east)"讨论会是一个里程碑,其口号是"select fun, profit from real_world where relational=false"。因而,对 NoSQL 最广泛的解释是"非关联型的",强调 Key-Value Stores 和文档数据库的长处,而不是单纯的拥护 RDBMS。 什么是 NoSQL NoSQL(Not Only SQL),意思是"不仅仅是 SQL",指的是非关系型数据库,是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL 用于超大规模数据的存储。这些类型的数据存储不须要固定的模式,无需多余操作就能够横向扩大。 为什么应用 NoSQL 随着互联网的飞速发展与遍及,网民上网冲浪时所产生数据也逐日增多,从 GB 到 TB 到 PB。这些数据有很大一部分都是由关系型数据库管理系统(RDBMS)来进行解决的。 因为关系型数据库的范式束缚、事务个性、磁盘 IO 等特点,若服务器应用关系型数据库,当有大量数据产生时,传统的关系型数据库曾经无奈满足疾速查问与插入数据的需要。NoSQL 的呈现解决了这一危机。它通过升高数据的安全性,缩小对事务的反对,缩小对简单查问的反对,获取性能上的晋升。然而,在某些特定场景下 NoSQL 依然不是最佳人选,比方一些相对要有事务与平安指标的场景。 ...

January 20, 2022 · 1 min · jiezi

关于nosql:1月19日14001600-跟微软和合作伙伴一起畅聊开源数据技术探讨新一代数据栈

1月19日14:00-16:00 跟微软和合作伙伴一起畅聊开源数据技术,探讨新一代数据栈! 在这里,你能够失去热门开源NoSQL数据库Cassandra的实战奥义,理解“宇宙万能数据库”Cosmos DB如何与“网红文档数据库”MongoDB的实战奥义,理解“宇宙万能数据库”Cosmos DB如何与“网红文档数据库”MongoDB深度联合,实际全托管模式下的高可用MySQL…… 还等什么,连忙扫描海报二维码连忙报名吧

January 18, 2022 · 1 min · jiezi

关于nosql:日志结构流派存储引擎的演化

本文次要内容来自于《数据密集型利用零碎设计》 第三章,内容对我很有启发,所以分享给大家,举荐看原作。背景存储引擎存在着两个次要流派: 日志构造流派,只容许追加式更新/删除文件,不会批改已写入的文件,Bitcast,SSTables,LSM-Tree,LevelDB,RocksDB,Cassandra,HBase,Lucene 等属于此类原地更新流派,将磁盘视为能够笼罩的一组固定大小的页。B-tree 就是这一流派的典型代表,已用于所有支流关系型数据库,以及大量的非关系数据库大部分人曾经对原地更新流派中 B-tree 曾经比拟相熟了,但对日志构造流派并不是很理解,本文率领大家理解下其演化过程及 LSM-tree 与 B-tree 的比照 演化过程1. 一个最简略的数据库基本原理由两个 Bash 函数实现: db_set(){ echo "$1,$2" >> database}db_get(){ grep "^$1," database | sed -e "s/^$1,//" | tail -n 1}插入/更新数据: 往 database 文本中追加一行 <key,value> 查问数据: 查找文本中最初一次呈现的 <key,value> 例如: ➜ ~ db_set key1 val1➜ ~ db_set key2 val2➜ ~ db_set key1 val3➜ ~ cat databasekey1,val1key2,val2key1,val3➜ ~ db_get key1val3局限性db_set: 追加式写,性能高。但db_get: 从头扫描到尾,性能很差 如何解决: 减少一个数据结构:索引 索引:原始数据派生的额定数据结构,适当的索引能够减速,然而加索引会减慢写的速度 2. 哈希索引基本原理为了解决上述追加式文件读性能太差的问题,能够在内存中保护一个 <key, offset> 的 哈希表,如下图所示。offset 代表此 key 在文件中偏移量,所以 get 不须要遍历整个文件了。 ...

January 7, 2022 · 2 min · jiezi

关于nosql:结果能够实现所要求的功能

CAE 的关注点和出发点在于解决理论工程问题,无论是电磁仿真剖析还是流体受力剖析等理论问题在工程中都最终被形象为了一个个数学方程,遴选公务员而得出仿真后果的过程就是求解数学问题的过程。 在CAE畛域利用比拟多的有有限元剖析、无限差分法、加权余量法等求解方程的经典办法,所以CAE的外围在于解方程,这一过程也凝聚了工程师的智慧输入,所以说CAE和工程联合最为严密,同时门槛极高;op-down的设计须通过“设计—验证—批改设计—再验证”的过程,一直重复。 直到后果可能实现所要求的性能,并在速度、功耗、价格和可靠性方面实现较为正当的均衡。 与之绝对的是自底向上的设计(Bottom-up设计) 由遴选公务员设计者调用设计库中的元件(如各种门电路、加法器、计数器等) ,设计组合出满足本人须要的零碎 毛病:效率低、易出错好家伙,这不是Altuim Designer的设计格调吗?http://lx.gongxuanwang.com/ss...

November 24, 2021 · 1 min · jiezi

关于nosql:命令行的方式生成几个按钮

PushButton 按钮组件: 在QT中任何组件都能够用两种创立形式,咱们能够通过应用new关键字动态创建按钮,也能够应用QT的图形化工具主动生成。遴选公务员首先咱们通过命令行的形式生成几个按钮,导入QPushButton包,而后定义如下代码,通过调用connect()可实现对特定按钮赋予特定的函数事件。 是流,失去这个流之后,咱们须要从流中取出对应的数据。从Stream中取出数据有两种形式,第一种就是应用Stream自身的API来获取Stream中的数据。最简略的就是调用stream的listen办法: 且创立 Deployment、Service(在三章中解说),遴选公务员本篇将介绍利用 kubeadm 部署多节点集群,并学会 装置以及应用 kubernetes 的命令行工具,疾速创立集群实例,实现部署 hello world 利用的实际。上用来启动 Pod 和容器等,每个节点必须有,绝对于节点与集群的网络代理。kubectl:用来与集群通信/交互的命令行工具,与 kubernetes API-Server 通信,是咱们操作集群的客户端。http://lx.gongxuanwang.com/ss...

November 24, 2021 · 1 min · jiezi

关于nosql:mongo慢日志字段含义

查看目前集群的慢日志配置 db.getProfilingStatus(); // 如果slowms:示意慢日志配置的工夫db.getProfilingLevel(); // 示意是否将慢日志写入零碎表db.system.profile中,0示意敞开,1,开启。mongo的lock ModeMode DescriptionR Represents Shared (S) lock. // 共享W Represents Exclusive (X) lock. // 排他r Represents Intent Shared (IS) lock. w Represents Intent Exclusive (IX) lock.mongo慢日志含意 2021-08-13T23:52:53.546+0800 I COMMAND [conn125972] command wisteria_assets.cmcc_detect_abnormallogin command: aggregate { aggregate: "cmcc_detect_abnormallogin", pipeline: [ { $match: { abnormal: 1, loginTime: { $gte: 1628784000, $lte: 1628869500 } } } ], allowDiskUse: true, fromMongos: true, cursor: { batchSize: 2147483647 }, useNewUpsert: true, shardVersion: [ Timestamp(0, 0), ObjectId('000000000000000000000000') ], $clusterTime: { clusterTime: Timestamp(1628869497, 1), signature: { hash: BinData(0, C001936257A29DCD858A0256B8540A51EE813919), keyId: 6958721217163427843 } }, $audit: { $impersonatedUsers: [ { user: "qingteng", db: "admin" } ], $impersonatedRoles: [ { role: "root", db: "admin" } ] }, $client: { driver: { name: "mongo-java-driver", version: "3.4.3-dirty" }, os: { type: "Linux", name: "Linux", architecture: "amd64", version: "3.10.0-957HG.el7.x86_64" }, platform: "Java/Oracle Corporation/1.8.0_172-b11", mongos: { host: "WXJD-PSC-P9F1-SPOD2-VM-OS01-BCSAFEBOX-CSCENTER19:27017", client: "10.175.218.65:41057", version: "4.2.10" } }, $configServerState: { opTime: { ts: Timestamp(1628869497, 1), t: 44 } }, $db: "wisteria_assets" } planSummary: COLLSCAN // 全表扫描 IXSAN:全索引扫描, COLLSCAN:全表扫描, IDHACK : id 查问 keysExamined:0 // MongoDB为执行操作而扫描的索引键的数量 docsExamined:76476 // MongoDB为了执行操作而扫描的汇合中的文档数 cursorExhausted:1 numYields:824 //// 退让次数,操作时让其余的操作实现的次数。 nreturned:23 // 操作返回的文档数 queryHash:AF74EFB7 planCacheKey:03E2CBD0 //应用的缓存key reslen:11512 // 返回数据的大小,单位字节 locks:{ ReplicationStateTransition: { acquireCount: { w: 825 } }, // 获取ReplicationStateTransition写锁的次数 Global: { acquireCount: { r: 825 } }, // 获取全局读锁的次数 Database: { acquireCount: { r: 825 } }, // 获取数据库读锁次数 Collection: { acquireCount: { r: 825 } }, Mutex: { acquireCount: { r: 2 } } } flowControl:{ acquireCount: 2, acquireWaitCount: 2, timeAcquiringMicros: 34859732 // 示意flow耗费的工夫,这个 } storage:{ data: { bytesRead: 37201774, bytesWritten: 35637499, timeReadingMicros: 9355695, // 读数据破费的工夫奥妙 timeWritingMicros: 2719607 // 写数据破费的工夫奥妙 }, timeWaitingMicros: { cache: 4760364 } //花在期待的工夫 } protocol:op_msg 473472ms // 操作的破费的工夫

October 18, 2021 · 2 min · jiezi

关于nosql:Redis源码阅读adlist10

双端链表adlist.c .h Redis里的List是双端链表的模式 typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 void *value;} listNode; /* * 双端链表构造 */typedef struct list { // 表头节点 listNode *head; // 表尾节点 listNode *tail; // 节点值复制函数 void *(*dup)(void *ptr); // 节点值开释函数 void (*free)(void *ptr); // 节点值比照函数 int (*match)(void *ptr, void *key); // 链表所蕴含的节点数量 unsigned long len;} list; /* * 双端链表迭代器 */typedef struct listIter { // 以后迭代到的节点 listNode *next; // 迭代的方向 int direction;} listIter;/* Directions for iterators * * 迭代器进行迭代的方向 */// 从表头向表尾进行迭代#define AL_START_HEAD 0// 从表尾到表头进行迭代#define AL_START_TAIL 1留神这里的表头和表尾的next都是指向null的所以永远无环链表节点是应用的void*指针来保留节点值的 所以链表能够保留各种不同类型的值void指针能够指向任意类型的数据,就是说能够用任意类型的指针对void指针赋值 ...

August 25, 2021 · 2 min · jiezi

关于nosql:Redis源码阅读dict-11

dictRedis字典是应用了哈希表作为底层实现的,一个哈希表里能够有多个哈希表节点,每一个哈希表节点保留字典的一个键值对。 /* Hash Tables Implementation. * * This file implements in-memory hash tables with insert/del/replace/find/ * get-random-element operations. Hash tables will auto-resize if needed * tables of power of two in size are used, collisions are handled by * chaining. See the source code for more information... :) * * 这个文件实现了一个内存哈希表, * 它反对插入、删除、替换、查找和获取随机元素等操作。 * * 哈希表会主动在表的大小的二次方之间进行调整。 * * 键的抵触通过链表来解决。数据结构字典/* * 字典 */typedef struct dict { // 类型特定函数 dictType *type; // 公有数据 void *privdata; // 哈希表 dictht ht[2]; // rehash 索引 // 当 rehash 不在进行时,值为 -1 int rehashidx; /* rehashing not in progress if rehashidx == -1 */ // 目前正在运行的平安迭代器的数量 int iterators; /* number of iterators currently running */} dict;/* * 字典类型特定函数 */typedef struct dictType { // 计算哈希值的函数 unsigned int (*hashFunction)(const void *key); // 复制键的函数 void *(*keyDup)(void *privdata, const void *key); // 复制值的函数 void *(*valDup)(void *privdata, const void *obj); // 比照键的函数 int (*keyCompare)(void *privdata, const void *key1, const void *key2); // 销毁键的函数 void (*keyDestructor)(void *privdata, void *key); // 销毁值的函数 void (*valDestructor)(void *privdata, void *obj);} dictType;void *provdata 保留须要传给那些类型特定函数的可选参数。 ...

August 25, 2021 · 2 min · jiezi

关于nosql:对话李飞飞揭秘国际体育赛事风云背后的黑科技

简介:家喻户晓,在重大体育赛事中,如何进步运动员的问题,如何改善观众的参加体验,是体育组织越来越器重的问题。那么阿里云技术是如何帮忙解决这个问题的呢? 明天,咱们有幸邀请到阿里巴巴团体副总裁、阿里云智能数据库产品事业部负责人、ACM卓越科学家李飞飞为咱们揭秘国内体育赛事风“云”背地的黑科技。Q:作为一名数据科学家,在较量中你最关注什么数据? 李飞飞:作为数据科学家,我关怀大型体育赛事的一些要害指标。比方体育赛事在哪个国家或地区举办,较量级别,也就是参赛运动员的竞争力如何,在同种赛事中他们的体现如何,是否处于领先地位,观众能够期待他们在较量中有怎么的体现,要害运动员的过往问题如何等等。 除此之外,作为一名数据科学家,我还关怀运动员的生理数据,包含他们的耐力、力量、静止速度等。这些对我来说是要害指标,能够预测他们在较量中的体现。还有一些环境因素,如观众反对谁、天气状况,以及所有推动胜利的竞技较量的因素。 Q:咱们都晓得运动员都要通过多年艰辛训练能力加入较量,你能不能跟咱们分享一下,咱们的数据技术如何帮忙运动员在训练期间进步问题,如何给观众带来更好的体验?** 李飞飞:咱们以多种不同的形式应用数据驱动的数据分析来领导决策,在训练期间帮忙运动员进步问题。 例如,英特尔和阿里巴巴为运动员提供了互联工具。该技术旨在带来更深刻的洞察力,使运动员的训练更高效。例如,在100米长跑较量中,咱们正在应用基于人工智能的技术来帮忙运动员及其教练取得近乎实时的洞察力和叠加可视化,使解说员、教练和受训者都能够利用这些洞察。 该技术由英特尔硅谷总部开发,并托管在阿里云基础设施上。它联合了计算机视觉技术、数据库技术和被称为“3DAT”(3D Athlete Tracking)的数据驱动剖析。该技术采纳摄像头实时捕获较量状况,应用实时算法剖析每个长跑运动员动作的生物力学,并联合该长跑赛事回放中产生的数据。这让运动员、教练和观众可能更好地享受较量,改良训练打算,做出实时数据驱动的决策。 除了“3DAT”技术之外,咱们还应用多种数据驱动的技术来帮忙运动员、教练和观众在大型体育赛事中进步问题,改善参观体验。例如,咱们将实时捕捉较量相干的数据,并将这些数据转储到数据库中。在数据库外部,咱们进行简单的剖析和实时数据处理,以帮忙赛事组织者、观众、运动员、教练和所有参与者更好地享受较量,做出数据驱动的决策。例如,有多少观众观看某场较量,实时天气状况如何,较量相干的工夫和空间状况如何。这些不仅联合了阿里云基础设施上的数据驱动技术,还联合了连贯运动员、观众与物理世界的物联网技术,以便他们在较量过程中更好地互动。以上这些联合在一起,让参与者在一场大型体育赛事中取得无可比拟的体验。 Q:那阿里云数据库又如何撑持大型体育赛事呢?** 李飞飞:阿里云致力于提供世界领先的数据库产品和技术,以进步大型体育赛事的经营效率和有效性,从而晋升运动员、观众和工作人员的体验。咱们通过反对这种大型体育赛事展现了数据库技术,尤其是云原生数据库产品和技术如何为不同行业带来改革。 大型体育赛事是一项简单工程,波及比赛、技术、物流、交通、媒体经营等数十个职能部门。一场大型体育赛事往往须要主办城市破费近十年的工夫来筹备,力求让每个方面都尽如人意。而胜利实现这个工作的要害是利用与较量相干的所有数据,将整个过程数字化。也就是说,数字化是最要害的。数十个职能部门依附云原生数据库技术的高性能做出所有实时数据决策,为部门合作、经营和数据分析发现有用的洞察,帮忙运动员、观众、赛事组织者等更好的参加组织较量。 为此,阿里云数据库产品,包含咱们的RDS、NoSQL数据库、云原生关系型数据库PolarDB和云原生数据仓库AnalyticDB,被用于撑持大型体育赛事的简单的流动管理系统,如比赛日程服务、后勤经营以及所有赛事经营相干事项。这对于大型体育赛事至关重要,是大型体育赛事顺利承办的基础设施。 所有与赛事相干的数据都在阿里云数据库平台上实时写入和解决。这确保了数据在阿里云RDS上100%平安、100%牢靠且被实时处理。咱们确保跨AZ高可用性、弹性以及横向可扩展性。所有这些要害个性对大型简单体育赛事的胜利经营至关重要。除此之外,咱们还提供数据仓库解决方案,如应用咱们的云原生数据仓库AnalyticDB来帮忙运动员和赛事组织者做出更好的决策,从收集的数据中取得洞察。总而言之,咱们为大型简单体育赛事数据管理的整个生命周期提供一站式解决方案。 Q:是否为咱们总结一下阿里云数据库领有哪些劣势? 李飞飞:阿里云数据库是寰球数据库产品和技术的领先者之一,尤其是在云原生数据库产品和技术畛域。正如驰名的奥运口号“更高、更快、更强”一样,阿里云数据库的口号是“更快、更稳、更平安”。咱们在响应客户需要方面一直获得重大进展,咱们亲密关注客户需要,将客户反馈纳入咱们世界领先数据库技术的产品开发周期,致力于为客户提供最好的云原生数据库产品。 事实上,咱们在2020年Gartner寰球数据库魔力象限评估中,进入领导者象限。阿里云数据库市场份额在亚太地区排名第一,在寰球所有云供应商中排名第四,在中国市场无疑是排名第一。咱们的技术是业内最先进的技术之一,例如,咱们的云原生数据仓库AnalyticDB在Forrester Wave最新云化数据仓库钻研报告中进入“强劲表现者”象限,咱们在业界宽泛承受的规范TPC-DS基准测试中排名第一,这个基准测试用于评估数据仓库产品的性能和老本效益。 整合咱们从关系型数据库、数据仓库到NoSQL数据库的所有产品,阿里云数据库提供一站式全链路数据库治理与服务。咱们能够满足客户在整个数据管理生命周期的需要,从数据生产和集成到数据实时处理与存储,到数据分析和发现,最初到数据开发和治理。 在数据生产和集成阶段,咱们的DTS、DBS和DMS别离代表数据传输服务、数据库备份服务、数据管理服务,提供从源头到任何目的地的一站式解决方案。在这两者之间,咱们提供ETL和其余整体性能以不便咱们的客户。 而在数据实时处理与存储方面,咱们的云原生关系型数据库PolarDB和云数据库服务RDS提供了云原生解决方案,助力打造企业数据管理解决方案。联合自治服务,客户能够在咱们的云平台上体验最好的云原生数据库服务。 最初,在数据分析和发现方面,咱们的云原生数据仓库AnalyticDB,可能帮忙客户从收集的所有数据中取得数据驱动的洞察。而应用咱们的数据管理服务DMS,您就能够治理上述提到的所有服务和产品,无论是关系型数据库还是NoSQL数据库。咱们的数据仓库提供一站式对立用户界面和平台,可满足与数据管理生命全周期相干的所有需要,如数据开发、平安问题、工作流治理等。 这就是我明天想分享的全部内容。心愿您在参观任何大型体育赛事时感觉我明天分享的内容有所帮忙,您还能够在咱们网站和其余渠道上找到更多对于阿里云数据库的信息。 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

August 9, 2021 · 1 min · jiezi

关于nosql:阿里云上海ACE同城会-数据库前沿技术解读及行业应用

简介:本期同城会由阿里云数据库团队资深技术大咖独特打造,围绕阿里云原生分布式数据库PolarDB的核心技术和利用场景、RDS MySQL和PG管控架构演进、云原生内存数据库Tair在游戏行业的最佳实际进行技术分享,期待你的到来! 流动介绍: 本期同城会由阿里云数据库团队资深技术大咖独特打造,围绕阿里云原生分布式数据库PolarDB的核心技术和利用场景、RDS MySQL和PG管控架构演进、云原生内存数据库Tair在游戏行业的最佳实际进行技术分享,期待你的到来! 流动地址: 上海市浦东新区上科路366号张江人工智能岛A2栋1楼聚义堂 流动工夫: 2021年06月26日 13:30-16:30 报名形式(以下形式均可): 链接报名:https://hd.aliyun.com/form/597 流动行报名:http://hdxu.cn/mR3yf 流动流程: 13:00-13:30,签到入座 13:30-13:40,阿里云ACE同城会介绍 13:40-14:10,议题1:《云原生分布式数据库PolarDB-X》 14:10-14:40,议题2:《RDS MySQL云原生架构实际》 14:40-15:00,茶歇 15:00-15:30,议题3:《RDS PostgreSQL平安最佳实际》 15:30-16:00,议题4:《内存数据库在游戏行业的现状、倒退和思考》 16:00-16:10,抽奖合影 流动奖品: 阿里云双肩包、T恤等 阿里云ACE 阿里云ACE即全称 Alibaba Cloud Engineer,是意为阿里云的工程师、代表着云计算的建设者。同时“ACE”又是扑克牌中的“A”,因而阿里云ACE也寓意着是云计算畛域王牌的一群人。在线上,ACE领有专属的页面和29个社群,承载论坛及专栏等内容; 在线下,ACE通过组织丰盛的流动,包含技术沙龙、TechDay、Meetup、官网互动等来造成本地化的开发者的学习、社交平台。 通过ACE组织的各种流动,ACE用户能够结识本地的开发者,播种前沿常识,积攒行业教训,并加深对阿里云的理解。 流动海报: 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。

June 21, 2021 · 1 min · jiezi

关于nosql:TcaplusDB君-行业新闻汇编5月11日

TcaplusDB君始终亲密关注着游戏行业和数据库行业的动静。以下是TcaplusDB君收集的近期的游戏行业和数据库行业的新闻,汇编整顿,献给大家观看。(本篇文章局部内容来自网络) 2020年信创典型解决方案名单公示2021年4月20日,工业和信息化部网络安全产业倒退核心公示了《2020年信息技术利用翻新解决方案》入围名单。 总共有70个解决方案入围,其中腾讯云(腾讯云TDSQL),人大金仓,中兴通讯(GoldenDB),神舟通用 4家国产数据库厂商在列。不仅如此,更颁布了9个创新奖,其中中兴通讯GoldenDB的银行外围零碎分布式数据库解决方案是惟一的数据库产品代表。 中国游戏产业研究院落地上海张江国家数字出版基地研究院成立之后,将定位为一个“三型”的机构,即智库型、服务型、数据型,以制作产业报告、分享产业资讯、制订行业标准等多种形式来推动产业倒退。次要工作还是以钻研为主。 除此之外,研究院心愿能为治理部门、企业及整个产业行业搭建一个平台,共享信息并提供一些前瞻性的思考,将成为一个分享行业资讯的平台——发展工作以来,研究院曾经做了5期月刊,其中囊括了国内外的行业资讯,还包含了封面故事、游戏企业风采、每月数据等多个内容。 2021年5月国产数据库排行榜出炉2021年5月国产数据库排行榜新鲜出炉,榜单TOP10铜墙铁壁。 同时排名较往期变动较小,其中过半产品(6款)得分呈负增长,TiDB、OceanBase 和 PolarDB持续放弃着上个月的“T-O-P”阵容,GaussDB回升至第六位与TDSQL调换程序,其余8款产品均无排名变动。 数据起源:墨天轮 4月移动游戏销售179亿,同比增13%近期,伽马数据公布了《2021年4月移动游戏报告》,报告显示,2021年4月,中国移动游戏市场理论销售收入179.06亿元,相比3月,降落4.48%,不过与去年4月相比,增长13.29%。 伽马数据钻研显示:间断两月,中国移动游戏支出走低,这次要受《原神》《穿梭前线:枪战王者》等头部产品和《提灯与地下城》《天地劫:幽城再临》等次新游产品流水回落影响;不过新游《航海王热血航线》《坎特伯雷公主与骑士唤醒冠军之剑的奇幻冒险》在本月下旬上线,流水增量将在下月显著体现。 数据起源:伽马数据 以上就是TcplusDB君收集的近期的游戏行业和数据库行业的新闻,感激大家的浏览哦。 TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码齐全自研。具备缓存+落地交融架构、PB级存储、毫秒级时延、无损程度扩大和简单数据结构等个性。同时具备丰盛的生态、便捷的迁徙、极低的运维老本和五个九高可用等特点。客户笼罩游戏、互联网、政务、金融、制作和物联网等畛域。

May 11, 2021 · 1 min · jiezi

关于nosql:TcaplusDB五一结束假期返工

完结了轻松又愉悦的五一五天长假,明天又是元气满满的一天! 关掉早起的闹铃,喝上晚上的咖啡,调整好状态,TcaplusDB人er们返工啦~ 长假休身不休心,努力奋斗步步高升!TcaplusDB的工作人员们也迅速从“假期状态"切换到”工作模式“,持续以丰满的工作激情、良好的精神状态投身于工作之中,为给客户提供更好的数据服务而持续奔跑! 在将来,腾讯云TcaplusDB将以国产键值型NoSQL数据库领航者的身份,在这条路线上走得更远,依据行业动态为平台引入更多元化的性能。同时,腾讯云TcaplusDB将和行业合作伙伴一起,持续分享腾讯分布式数据库方面的教训,并将踊跃投入基于多模和多负载能力的一站式低成本数据处理能力的研发;满足基于寰球分布式能力,助力企业解决业务出海、寰球同服/多活、跨域数据迁徙等要害业务畛域需要。 TcaplusDB君也揭示各位有“节后综合征”的上班族们:在长假后,应给生理、心理足够的缓冲工夫,采纳正当迷信的形式来调整本身状态,使身心尽快调整到工作状态上。 这里,TcaplusDB君有一份高效返工指南献给大家: (1)调整作息时间,适当静止 (2)合理安排通勤工夫 (3)不焦急干活,梳理思路,做好工作布局 人勤春来早,节后返工忙。“幸福都是奋斗进去的!”,TcaplusDB为各个岗位上的工作者们加油打气,祝大家返工大吉~ TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码齐全自研。具备缓存+落地交融架构、PB级存储、毫秒级时延、无损程度扩大和简单数据结构等个性。同时具备丰盛的生态、便捷的迁徙、极低的运维老本和五个九高可用等特点。客户笼罩游戏、互联网、政务、金融、制作和物联网等畛域。

May 6, 2021 · 1 min · jiezi

关于nosql:TcaplusDB小知识TcaplusDB的技术原理

数据库技术是通过钻研数据库的构造、存储、设计、治理以及利用的根本实践和实现办法,并利用这些实践和办法来实现对数据库中的数据的解决、剖析、转化等操作。数据库技术作为计算机数据处理与信息管理系统的外围,钻研和解决了计算机信息处理过程中大量数据无效地组织和存储的问题,在数据库系统中缩小数据存储冗余、实现数据共享、保障数据安全以及高效地检索数据和解决数据。 在本篇文章中,将会介绍腾讯自研的分布式数据库TcaplusDB的技术原理。 存储原理一个表通过HASH分表,依照路由数组长度(默认为10k)进行取模运算分片(Mod Sharding),所以每张表最多能够分成10k个分片(Shard)。以下图为例,1个TcaplusDB表被分为5个Shard文件散布到不同存储节点,每个结点散布有1个或多个分片的数据。 图3.1 TcaplusDB存储技术示意图3.2 零碎扩容TcaplusDB扩容别离在存储层和接入层进行。从第2章节的架构图中,能够看到接入层即Tcap Proxy层,存储层即Tcapsvr层(主备节点)。对于接入层而言,采纳的是无状态设计,所以能够灵便程度扩缩容,且不影响线上业务,对业务无感知 ; 对于存储层而言,因为表采纳的是分片设计,在扩容时须要将原机器上的分片程度迁徙到新机器上,达到扩容存储空间的目标。以图3.2为例,Table A在扩容前,只有一个分片Shard 1, 路由数组长度为10k。在扩容时,将该表分为两个分片,其中路由项0-5k放在Shard1 , 路由项5001-10k放在Shard2,2个shard别离存储到两个存储节点上。 图3.2 存储节点扩容示意图数据迁徙过程见图3.3,原TcaplusDB Salve节点上数据会复制到新的TcaplusDB Master节点,通过binlog同步放弃数据完整性,接入层tcapoxy的数据申请重定向到新的TcaplusDB集群。 图3.3 扩容后申请重定向示意图接入层扩容,如图3.4所示,通过一致性哈希路由切换,将原来由4个tcaproxy负责转发的路由,平均分配给5个tcaproxy,路由切换过程不会造成音讯失落。 图3.4 接入层扩容示意图TcaplusDB的扩容基于存储节点的磁盘使用率和QPS (Queries per Second) 2个维度。当单台存储节点容量应用达到肯定阈值后即触发扩容操作。 TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码齐全自研。具备缓存+落地交融架构、PB级存储、毫秒级时延、无损程度扩大和简单数据结构等个性。同时具备丰盛的生态、便捷的迁徙、极低的运维老本和五个九高可用等特点。客户笼罩游戏、互联网、政务、金融、制作和物联网等畛域。

April 26, 2021 · 1 min · jiezi

关于nosql:TcaplusDB小知识TcaplusDB的备份与回档机制

[TcaplusDB小常识]TcaplusDB的备份与回档机制随着电子商务和办公线上化的飞速发展,企业对信息系统的依赖性越来越高,数据库作为信息系统的外围担当着重要的角色。对于数据库而言,因为数据量宏大且非常重要,每一个数据的失落,都可能是一笔很大的损失。 但在理论的操作过程中,谁都不能齐全保证数据一点都不失落损坏,因而,为了避免意外删除,自然灾害等造成的损失,保障数据库的一致性,数据库备份是必须要的。 对于一个数据库而言,数据备份非常重要,因而对于DBA来说,理解数据库备份的原理很有必要,备份的原理能够帮忙他们更好地解决数据库备份。 TcaplusDB作为一个nosql分布式数据库,有着十分欠缺的数据备份体系。上面TcaplusDB君将介绍TcaplusDB是如何进行冷备和回档来保障客户的数据安全的。 冷备目前TcaplusDB反对两种形式数据备分:全量数据文件冷备,每日定时进行,表创立好后,主动有脚本去备份存储数据文件,全量备份文件保留周期25天;另一种是增量备份,是在上次全量或增量备份的根底上,对更改过的数据进行的备份。次要基于TcaplusDB的binlog进行,每15分钟进行一次, 增量流水保留周期15天。通过两种形式备份的联合,保障了零碎异样期间通过备份疾速复原的能力。业务数据在存储节点落地时有CRC校验, 若因数据被篡改, CRC校验会失败, 不会因而返回给用户谬误的数据。 冷备份指在数据库敞开后,进行备份,TcaplusDB的备节点在做全量冷备时,冷备开始工夫点全量数据文件处于齐全静止状态,此时全量数据采纳字节copy来进行备份, 齐全无一致性问题。 且在冷备期间,前端读写齐全不受影响,新申请会写入小的批改集,申请会合并全量数据和小批改集。 回档TcaplusDB的回档反对两种形式: 回档形式形容反对形式冷备回档应用备份文件回档到冷备的工夫点,准确到毫秒。临时通过工单反对准确回档应用备份文件和binlog文件回档到任意指定的工夫点,准确到毫秒。临时通过工单反对冷备回档和准确回档反对以下4种回档范畴: 回档范畴形容反对形式全服回档所有表均回档临时通过工单反对单表回档仅单个表回档临时通过工单反对记录回档对单个记录回档, 回档时指定KEY即可腾讯云控制台反对条件回档指定过滤条件回档, 如指定要回档的key临时通过工单反对以上就是对TcaplusDB冷备和回档制度的介绍,在接下来的TcaplusDB知识库系列中,TcaplusDB君将揭晓更多TcaplusDB设计的原理和神秘,尽请期待! TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码齐全自研。具备缓存+落地交融架构、PB级存储、毫秒级时延、无损程度扩大和简单数据结构等个性。同时具备丰盛的生态、便捷的迁徙、极低的运维老本和五个九高可用等特点。客户笼罩游戏、互联网、政务、金融、制作和物联网等畛域。

April 25, 2021 · 1 min · jiezi

关于数据库:TcaplusDB君-行业新闻汇编4月21日

TcaplusDB君始终亲密关注着游戏行业和数据库行业的动静。以下是TcaplusDB君收集的近期的游戏行业和数据库行业的新闻,汇编整顿,献给大家观看。 (本篇文章局部内容来自网络) Epic获10亿美元融资,踊跃回应亏损风闻Epic Games于4月13日称,公司已在新一轮融资中取得了10亿美元。Epic公司估值因而晋升至287亿美元,较上一次融资估值增长了66%。 此次的10亿美元融资也是对之前Epic的亏损风闻的一个侧面音讯,此前Epic CEO Sweeney在推特上针对苹果指出Epic亏损事实进行了回应:“苹果认为这是“亏钱”,而这是胜利的投资。精确来说,咱们正在做的是在将来可能盈利,并牢牢吸引住玩家的投资。” B站获《守望先锋》数年赛事独播权4月15日,哔哩哔哩电竞发表与动视暴雪电竞达成策略单干。 哔哩哔哩电竞将负责《守望先锋联赛》2021赛季中国大陆地区赛事的制作开发、赛事转播、商业权利,同时帮助赛事在国内的宣发推广,此外,哔哩哔哩电竞也领有单干期限内该赛事的独家直播点播版权及分销权。此协定将从2021赛季起,涵盖数年。 此前,B站已领有泛滥热门电比赛事的直播版权,包含《英雄联盟》职业联赛及寰球总决赛、《王者光荣》职业联赛、《战争精英》职业联赛等。本次哔哩哔哩电竞与暴雪电竞的单干将进一步丰盛B站电竞内容生态。 《2021年度第一季度中国游戏产业报告》公布近日,中国音数协游戏工委与中国游戏产业研究院独特公布《2021年度第一季度中国游戏产业报告》。多家游戏厂商凭借推出除夕、春节假期等流动,用户的生产欲望加强,中国游戏产业理论销售收入实现阶段性增长,多款游戏产品获得了比拟好的问题。 本次报告包含了2021年第一季度中国游戏市场理论销售收入与用户规模、2021年第一季度中国自主研发游戏海内市场理论销售收入、2021年第一季度中国游戏细分市场情况、2021年第一季度中国游戏市场特色市场情况及用户规模四个方面。 信息起源:中国游戏产业研究院 2021信息技术利用翻新论坛揭幕4月15日-17日,由中国电子工业标准化技术协会信息技术利用翻新工作委员会、国家工业信息安全倒退钻研核心、山西省工业和信息化厅、太原市人民政府、山西转型综合改革示范区管委会独特主办,以“交融倒退,拥抱生态”为主题的2021信息技术利用翻新论坛在山西太原揭幕。 工业和信息化部副部长王志军在大会主论坛致辞中指出,过来几年里,在党中央的刚强领导下,在用户单位和产业界的共同努力下,咱们在党政、金融等畛域大力推广利用信创产品和技术,推动信创产品减速迭代更新,从“根本可用”逐步变得好用,信创产业增长势头强劲。他对下一步工作提出四点要求:一是增强技术创新,踊跃培养倒退新动能。二是强化能力建设,营造产业倒退新环境。三是保持需要导向,打造信创利用新场面。四是保持问题导向,推动产品质量迈向新台阶。 信息起源:工业和信息化部信息技术倒退司 TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码齐全自研。具备缓存+落地交融架构、PB级存储、毫秒级时延、无损程度扩大和简单数据结构等个性。同时具备丰盛的生态、便捷的迁徙、极低的运维老本和五个九高可用等特点。客户笼罩游戏、互联网、政务、金融、制作和物联网等畛域。

April 22, 2021 · 1 min · jiezi

关于docker:DBA-行业是否将会消亡

DBA 行业是否将会沦亡?最近几年因为企业数据上云、自动化运维、人工智能等技术的疾速倒退,让很多 DBA 感到焦虑,放心技术的改革会让本人饭碗不保,其实大可不必如此。新技术的到来意味着一些简单机械、须要大量人工的工作能够被主动实现,进入 DBA 行业的门槛正在变低,但这绝不意味着 DBA 行业的沦亡,反而随着时代的倒退和数据量的井喷而愈发重要! 首先简略解释一下什么是 DBA 及他们的工作内容?DBA:数据库管理员(Database Administrator,简称DBA),是从事治理和保护数据库治理(DBMS)的相干工作人员的统称,属于运维工程师的一个分支,次要负责业务数据库从设计、测试到部署交付的全生命周期治理。 <u>DBA 的外围指标是保障数据库管理系统的稳定性、安全性、完整性和高性能。</u> DBA 的次要工作内容为数据库的装置、数据库配置和治理、权限及平安方面的治理、监控和性能调节、备份复原、监控、审计数据等等。 ——百度百科 DBA 以后的时代背景和环境:以后是数据时代,巨量的数据正在源源不断的生成,数据的质变必将引起量变,这种量变将会影响着 DBA 的工作内容和职位要求。人工智能(AI)、机器学习、物联网(loT)、云存储、大数据、微服务等的衰亡,引发了大多数企业数字转型的浪潮。去 IOE 过程减速、国产数据库的成熟和衰亡、企业对不同场景的不同需要等等,推动着 DBA 须要更加纵深宽敞的常识储备和能力。开发人员的累赘减轻、开发周期越来越短、大量的软件一直涌入市场中、所有都以更快的速度运行,传统的运维越来越难跟上这种步调......DBA 面临的挑战:迁徙到云:企业中数据迁徙到云并与星散成,这是以后的大趋势。迁徙到新技术的需要:例如须要从一些传统数据库迁徙到国产或新型数据库中等等。治理更多的数据库:将来应用繁多数据库的可能性越来越小,依据企业的业务场景应用更多更适宜的数据库将会成为常态。自动化运维:以后自动化运维曾经越来越多的应用到生产环境中,相比人工而言的更稳固更可控,促使 DBA 向更高阶的中央去。更沉重的部署工作:为了使DevOps无效地工作,必须将数据库无缝地蕴含在软件开发生命周期中。这意味着DBA须要与开发人员更严密地单干,并无效地扭转他们的思维形式,以便在波及数据库时遵循DevOps流程。DBA 迎来的新机遇: 数据时代曾经到来,数据正在成为企业倒退和提高的重要资产和能源,并且数据正以指数的模式扩大暴发,这使得数据的治理成为极其重要的一件事。如此宏大数据的治理,靠一个和几个人的力量将越来越难,由此会引起 DBA 的职能越来越清晰,从业者将会更加聚焦在某一个技术畛域,越来越须要团队的合作与配合。最初,以后正是数据百花齐放的时代,数据库品种繁多,牵涉到数据库利用和部署的技术也纷繁复杂,这将带给 DBA 们泛滥大展身手的空间。 死亡舆论夸大其词在一些论坛中,常会看到 「DBA 行业将死,乘早转行」的舆论,这种舆论背地的焦虑无非是云时代和自动化运维等技术的倒退,让身在此行业中的人感到压力微小而造成的。新技术以更低的老本和更高的稳定性能让很多人饭碗不保。诚然,没有人能抵御历史的车轮,新技术的倒退在为咱们的工作带来便当的同时肯定会让局部人的工作被代替,然而塞翁失马焉知非福?务必须要辩证的对待,感性的看待,谨慎的决定。 DBA 的将来首先,各类数据库管理工具或自动化运维工具的产生并不代表着 DBA 要做的事件变少,很多技术还没有成熟、须要做的工作还很多,DBA 在接下来的很长一段时间内将仍持续存在,而高级或专精某一门技术的 DBA 将会将会被企业愈发器重,前景有限。此外,DBA 因为对数据库的相熟,可转为到数据分析、架构师、数据库工程师等各类各个方向,均有广大空间,而且随着数据库产品软硬件的逐步联合,或者会衍生出咱们未曾想到的职业。 结语数据时代,DBA 的角色不会被代替,它只可能是换了另一种形式存在着,更加深刻的影响着咱们的生存。 对立数据库管理工具 CloudQuery 官网:https://cloudquery.club/

April 20, 2021 · 1 min · jiezi

关于nosql:TcaplusDB知识库TcaplusDB备份与回档机制介绍

[TcaplusDB知识库]TcaplusDB备份与回档机制介绍随着电子商务和办公线上化的飞速发展,企业对信息系统的依赖性越来越高,数据库作为信息系统的外围担当着重要的角色。对于数据库而言,因为数据量宏大且非常重要,每一个数据的失落,都可能是一笔很大的损失。 但在理论的操作过程中,谁都不能齐全保证数据一点都不失落损坏,因而,为了避免意外删除,自然灾害等造成的损失,保障数据库的一致性,数据库备份是必须要的。 对于一个数据库而言,数据备份非常重要,因而对于DBA来说,理解数据库备份的原理很有必要,备份的原理能够帮忙他们更好地解决数据库备份。 TcaplusDB作为一个nosql分布式数据库,有着十分欠缺的数据备份体系。上面TcaplusDB君将介绍TcaplusDB是如何进行冷备和回档来保障客户的数据安全的。 冷备目前TcaplusDB反对两种形式数据备分:全量数据文件冷备,每日定时进行,表创立好后,主动有脚本去备份存储数据文件,全量备份文件保留周期25天;另一种是增量备份,是在上次全量或增量备份的根底上,对更改过的数据进行的备份。次要基于TcaplusDB的binlog进行,每15分钟进行一次, 增量流水保留周期15天。通过两种形式备份的联合,保障了零碎异样期间通过备份疾速复原的能力。业务数据在存储节点落地时有CRC校验, 若因数据被篡改, CRC校验会失败, 不会因而返回给用户谬误的数据。 冷备份指在数据库敞开后,进行备份,TcaplusDB的备节点在做全量冷备时,冷备开始工夫点全量数据文件处于齐全静止状态,此时全量数据采纳字节copy来进行备份, 齐全无一致性问题。 且在冷备期间,前端读写齐全不受影响,新申请会写入小的批改集,申请会合并全量数据和小批改集。 回档TcaplusDB的回档反对两种形式: 回档形式形容反对形式冷备回档应用备份文件回档到冷备的工夫点,准确到毫秒。临时通过工单反对准确回档应用备份文件和binlog文件回档到任意指定的工夫点,准确到毫秒。临时通过工单反对冷备回档和准确回档反对以下4种回档范畴: 回档范畴形容反对形式全服回档所有表均回档临时通过工单反对单表回档仅单个表回档临时通过工单反对记录回档对单个记录回档, 回档时指定KEY即可腾讯云控制台反对条件回档指定过滤条件回档, 如指定要回档的key临时通过工单反对以上就是对TcaplusDB冷备和回档制度的介绍,在接下来的TcaplusDB知识库系列中,TcaplusDB君将揭晓更多TcaplusDB设计的原理和神秘,尽请期待! TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码齐全自研。具备缓存+落地交融架构、PB级存储、毫秒级时延、无损程度扩大和简单数据结构等个性。同时具备丰盛的生态、便捷的迁徙、极低的运维老本和五个九高可用等特点。客户笼罩游戏、互联网、政务、金融、制作和物联网等畛域。

April 20, 2021 · 1 min · jiezi

关于nosql:TcaplusDB直播回顾-数据库架构和实战分析

数据库作为互联网业务的基础设施,作为获取数据、生产加工数据、交付数据的集合体,其重要性显而易见。从传统的数据库到近年以诸多劣势非常热门的分布式数据库,数据库产品层出不穷,作为数据库外围的数据库架构也有很多变动。 数据库我的项目失败的一个常见起因是项目组的开发人员对数据库的理论意识有余,不足对所用工具的根本理解,在本月的1号,腾讯云数据库专家工程师张铭进行了「腾讯游戏外围数据库TcaplusDB的架构与实战直播」,讲述了专为游戏设计的分布式 NoSQL 数据库TcaplusDB的架构与理论应用的操作,强调了TcaplusDB残缺的应用培训体系和敌对的我的项目接入设计。 在本场直播中,直播页面浏览量(拜访PV)达到了21818的人次,观众们反应热烈,在课后的直播问卷反馈中,观众对内容的满意度平均分达到了9分(满分10分), 内容满意度为99%,这证实了本次直播的内容是直播指标观众所心愿听到的,直播嘉宾的解说解决了听众以往对数据库非凡构造以及对反对游戏的数据库的特别之处的纳闷。 直播的最初,设置了自在发问环节,观众与直播嘉宾的互动频繁,不少观众提出了本人的困惑,而老师也在直播中进行了具体的解答。 错过了这次直播的敌人也无需可惜,本次直播的回放就在: 扫码即可观看哦! 腾讯云数据库专家工程师精心筹备的 TcaplusDB 的核心技术、数据库技术推动、TcaplusDB的设计迷信与实际等行业干货等你来! TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码齐全自研。具备缓存+落地交融架构、PB级存储、毫秒级时延、无损程度扩大和简单数据结构等个性。同时具备丰盛的生态、便捷的迁徙、极低的运维老本和五个九高可用等特点。客户笼罩游戏、互联网、政务、金融、制作和物联网等畛域。

April 15, 2021 · 1 min · jiezi

关于docker:程序员快乐的一天

我叫大明,是一名程序员。 90 后,在一家软件开发公司工作,我喜爱打篮球和游戏,但我更爱学习和工作,尽管学习和工作有时并不爱我... 只管不想抵赖,但这就是我。 最近,不晓得是因为春天柳絮的浮荡导致我思路浮荡,还是因为我的工作和学习有些爽朗,导致想给本人找点乐子,所以:我打算开始写日记了! 但不管怎么说,我就要开始写日记!! 然而想想,除了小学的时候被语文老师强制着写过几篇流水账外,就再也没写过日记了,想这事还有点难... emmmm... 但无论怎样,既然决定了,先干再说! 那么,我怎么写?写点什么好呢?emmmm... 思考好久之后,我决定拿出看家本领来写日记: Hello world... <head>... </head> 算了... 还是记流水帐吧。 以下就是我平平无奇的一天。 晚上 8:30 我睡到天然醒。这在你们大多数人眼中极为侈靡的一件事,但对我而言,这却太稀松平时了。 要不是因为间隔我租的房子 20 米处有个每天早上 6 点就动工的大工地,我差点就笑出了猪叫。 幸好,我住的中央间隔公司很近,只有 200 多米,还是一条直线,每天早上我都会骑着从齐齐哈尔淘到的 90 年代的公路自行车,迎着风通过一座小桥去公司。 晚上 9:00,开机 我的豆角包和豆腐包混合着共事们油条、咖啡、酱香饼等多种滋味,由此开启了干(ji)劲(fei)十(gou)足(tiao)的一天。 晚上 9:30关上公司自研的对立数据管控工具 CloudQuery,开始工作。 CloudQuery 这款工具的益处是仅需一个浏览器就能够连贯到所有罕用的数据源,而且反对终端命令,权限管控、组织架构等性能,应用起来很不便,大大晋升了工作效率。 以查询数据库来讲,CloudQuery 已反对了 8 类常见的数据源:Oracle、MySQL、PostgreSQL、MongoDB、MariaDB、Redis、SQLServer、达梦数据库。(当初数据源正在迅速减少中,将来半年左右,CloudQuery 将再减少十余种罕用的数据源,蕴含国产数据源)当初就不须要再关上各种工具进行数据查问了,间接用浏览器登录就能够查问,十分不便。 例如对咱们团队而言,常常会用到 Oracle/MySQL/PG/Redis 数据库,之前每次都要关上相应的工具,十分麻烦,而且数据的流动和治理也是件让人头大的事件,而当初就无需这样做了,在一个平台内就能够操作和治理所有罕用的数据库了,节俭了大量的工夫精力。 与此同时,CloudQuery 齐全满足咱们平时要应用的一系列查问性能,而且更合乎咱们日常的工作习惯。 例如创立表、查看和创立表构造、增加表、清空表、设计表等等。例如在输出编辑区中输出查问语句将会进行主动提醒,并反对快捷键操作等。转储 SQL 文件、以五种格局导出后果集、查看日志等等。 10:00—12:00 沉迷代码,无法自拔,此处省略有数噼里啪啦的键盘声。 12:00—14:00 和共事们到负一楼吃饭,而后沿着公司楼下的那条小河,晒晒太阳,思考一下人生,不多久,骑着自行车回家看 20 分钟的书午休。 14:00—18:00 ...

April 15, 2021 · 1 min · jiezi

关于数据库:NewSQL是伪命题还是真突破NewSQL系统综述

本文选自Andrew Pavlo(卡内基梅隆大学计算机科学系副教授)和Matthew Aslett(451研究所副总裁)在2016年所发表的论文What’s Really New with NewSQL。以下内容为伴鱼技术团队翻译,录信数软进行了二次整顿和编辑。 摘要近年来呈现了一种称为NewSQL的新型数据库管理系统(DBMS),它们号称有能力扩大古代在线交易解决(on-line transaction processing,OLTP)零碎的工作负载,这对于以前的零碎来说是无奈做到的。 鉴于传统的DBMS曾经倒退了近40年,有必要认真斟酌一下NewSQL的劣势是真如他们所说,还是仅仅是一种商业宣传行为。如果真的能够取得更好的性能,那么下一个问题天然就是它们是真的有技术冲破,还是仅仅因为硬件方面的倒退使得原来的问题已不再是瓶颈? 为了探讨这些问题,咱们先探讨了数据库的倒退历史,以此了解NewSQL呈现的背景和起因。而后从一些细节方面深刻探讨了NewSQL的概念,特点,分类,以及在各个分类上面的NewSQL零碎。 一、数据库管理系统(DBMSS)的简要倒退历史世界上第一个数据库系统,IBM IMS诞生于1966年,它被用于存储土星五号(Saturn V)和阿波罗(Apollo)空间摸索我的项目所需的整机和供应商信息。IMS 的次要奉献在于展现了“利用程序逻辑与数据操作逻辑应该拆散”的理念,应用程序开发者只须要关注数据的逻辑变动,而无需关怀其具体实现。在IMS之后,呈现了第一批关系型数据库,其次要代表就是IBM的System R零碎以及加州大学的INGRES,即PostgreSQL的前身。INGRES迅速在其它大学的信息系统中流行起来,并于70年代末商业化。大概在雷同的期间,Oracle采纳相似System R的设计,开发并公布其DBMS的第一个版本。在80年代初期又涌现了一批公司,它们也推出本人的商业化数据库产品,如Sybase和Informix。在System R之后,IBM在1983年公布了新的关系型数据库DB2,后者复用了System R的局部代码,但二者至今未开源。 从80年代末到90年代初,面向对象的语言开始风行,这也催生了一批面向对象的DBMS诞生,以期磨平数据库模型与语言之间的隔膜。然而因为没有相似SQL一样的标准接口,这些面向对象的DBMS始终没有在市场上被宽泛承受,不过它们的一些设计理念逐步被交融进关系型数据库,许多风行的关系型数据库都减少了对Object、XML和JSON数据的反对。除此之外,面向文档(document-oriented)的NoSQL数据库也或多或少是面向对象的DBMS的延长。 90年代的一个大事件就是两个开源关系型数据库的公布,MySQL和PostgreSQL。MySQL于1995年在瑞士诞生,次要基于ISAM的mSQL零碎开发;PostgreSQL于1994年启动,由两名伯克利的学生对QUEL的Postgres源码进行二次开发,减少SQL查询语言的反对。 从2000年后,互联网利用如雨后春笋般呈现,这些利用对各种资源的要求都远超传统的软件服务。互联网利用须要反对大量用户的并发拜访,且对可用性要求极高,最好永远在线。在实践中,数据库开始成为互联网利用的瓶颈。许多厂商尝试纵向扩容,进步单机硬件性能,但这种形式换来的晋升非常无限,体现出显著的边际收益递加。而且纵向扩容通常很不平滑,将数据从一台机器挪动到另一台机器须要长时间下线服务,这对于互联网用户来说无奈承受。为了解决这个问题,一些公司定制化开发中间件(middleware),将数据分片到多个一般单机DBMS上: 对下层利用形象出一个逻辑数据库,而背地则将数据扩散到不同的物理数据库上。当利用发动申请时,这层中间件须要转发或重写这些申请,分发给背地数据库集群的一个或多个节点,待这些节点执行完申请返回数据后,前者再将数据聚合返回给下层利用。从这个思路登程构建的两个比拟驰名的零碎别离是eBay的Oracle-based cluster和Google的MySQL-based cluster。起初Facebook也采纳相似的策略构建外部的MySQL cluster 并沿用至今。只管利用中间件对数据分片的策略,能够解决简略的点读、点写操作,但如果要在一个事务中更新多条数据,或者多表join就变得十分困难。正因为如此,这些晚期的中间件都不反对这类操作,eBay 要求这些中间件的用户必须在应用层逻辑中实现join逻辑。显然这违反了“利用程序逻辑与数据操作逻辑应该拆散”的理念,将数据操作逻辑从新裸露给利用开发者。 最终基于中间件的分片计划被逐步摈弃,各个公司将精力转向自研分布式数据库。除中间件计划暴露出的问题之外,传统数据库解决方案还暴露出两个问题: 第一,传统数据库重视一致性和正确性,在可用性和性能上有所就义。但这种trade-off与重视并发和可用性的互联网利用的需要南辕北辙。 第二,传统关系型数据库的许多性能在互联网利用中并不实用,而反对这些性能却会耗费额定的资源,如果可能应用更轻量的数据库兴许能晋升整体性能。除此之外,关系模型兴许不是表白利用数据的最佳形式,应用残缺的SQL来实现简略查问仿佛是“杀鸡用牛刀”。 这些问题正是2005-2010年间NoSQL静止的起源。NoSQL的拥趸普遍认为妨碍传统数据库横向扩容、进步可用性的起因在于ACID保障和关系模型,因而NoSQL静止的外围就是放弃事务强一致性以及关系模型,拥抱最终一致性和其它数据模型 (如 key/value,graphs 和Documents)。两个最驰名的NoSQL数据库就是Google的BigTable和Amazon的Dynamo,因为二者都未开源,其它组织就开始推出相似的开源代替我的项目,包含Facebook的 Cassandra (基于BigTable和Dynamo)、PowerSet的 Hbase(基于BigTable)。有一些守业公司也退出到这场NoSQL静止中,它们不肯定是受BigTable和Dynamo的启发,但都响应了NoSQL的哲学,其中最闻名的就是MongoDB。 在21世纪00年代末,市面上曾经有许多供用户抉择的分布式数据库产品。应用NoSQL的劣势在于利用开发者能够更关注应用逻辑自身,而非数据库的扩展性问题;但与此同时许多利用,如金融零碎、订单解决零碎,因为无奈放弃事务的一致性要求被拒之门外。一些组织,如Google,曾经发现他们的许多工程师将过多的精力放在解决数据一致性上,这既裸露了数据库的形象、又进步了代码的复杂度,这时候要么抉择回到传统DBMS时代,用更高的机器配置纵向扩容,要么抉择回到中间件时代,开发反对分布式事务的中间件。这两种计划老本都很高,于是NewSQL静止开始酝酿。 二、NewSQL的衰亡本文认为NewSQL是对一类古代关系型数据库的统称,这类数据库对于个别的OLTP读写申请提供可横向扩大的性能,同时反对事务的ACID保障。换句话说,这些零碎既领有NoSQL数据库的扩展性,又放弃传统数据库的事务个性。NewSQL从新将“利用程序逻辑与数据操作逻辑应该拆散”的理念带回到古代数据库的世界,这也验证了历史的倒退总是呈现出螺旋回升的模式。 在21世纪00年代中,呈现了许多数据仓库零碎 (如 Vertica,Greeplum 和AsterData),这些以解决OLAP 申请为设计指标的零碎并不在本文定义的NewSQL范畴内。OLAP 数据库更关注针对海量数据的大型、简单、只读的查问,查问工夫可能继续秒级、分钟级甚至更长。NewSQL数据库设计针对的读写事务有以下特点: 耗时短应用索引查问,波及大量数据 (非全表扫描或者大型分布式 Join)反复度高,通常应用雷同的查问语句和不同的查问参数也有一些学者认为NewSQL零碎是特指实现上应用Lock-free并发控制技术和share-nothing架构的数据库。所有咱们认为是NewSQL的数据库系统的确都有这样的特点。 三、NewSQL的分类既然曾经定义NewSQL,咱们就能够剖析一下现在整个NewSQL数据库的图景。现今市面上的NewSQL数据库大抵能够分为3类: 齐全应用新的架构从新设计开发的NewSQL数据库在中间件层实现NewSQL个性的数据库云计算平台提供的数据库即服务产品(DaaS),通常也是基于新的架构在撰写本文之前,两位作者都将利用“替换单机数据库存储引擎” 的计划划分到NewSQL中。这种计划的典型代表就是一些替换MySQL、InnoDB的计划,如 TokuDB,ScaleDB,Akiban,deepSQL,MyRocks 的等等。应用新存储引擎的益处在于对于利用来说这样的替换毫无感知。但当初,两位作者发出了之前的观点,他们认为通过替换存储引擎和应用插件的形式扩大单机数据库系统并不是NewSQL零碎的典型代表,不属于本文的议论范畴。通常,通过替换MySQL存储引擎来晋升数据库OLTP 场景下性能的计划最终都难逃失败。 接下来咱们将别离探讨这3类NewSQL数据库。 1.新型架构从无到有搭建的NewSQL零碎最令人感兴趣,因为我的项目设计有最大的自由度而无需思考古老零碎在设计、架构方面的累赘。所有属于这类的数据库系统都是基于 shared-nothing的分布式架构,同时蕴含以下模块: 多节点并发管制 (multi-node concurrency control)多正本数据复制 (replication)流量管制 (flow control)分布式查询处理 (distributed query processing)应用新的数据库系统的另一劣势在于各个组件都能够针对多节点环境作出优化,如查问优化器、节点之间的通信协议等等。一个具体的例子就是,大多数的NewSQL数据库都能够在节点之间间接传递同一查问 (intra-query) 外部的数据,而无需像一些基于中间件的计划须要通过核心节点路由数据。 ...

April 8, 2021 · 2 min · jiezi

关于TcaplusDB:TcaplusDB知识库-TcaplusDB技术原理分享

数据库技术是通过钻研数据库的构造、存储、设计、治理以及利用的根本实践和实现办法,并利用这些实践和办法来实现对数据库中的数据的解决、剖析、转化等操作。 数据库技术作为计算机数据处理与信息管理系统的外围,钻研和解决了计算机信息处理过程中大量数据无效地组织和存储的问题,在数据库系统中缩小数据存储冗余、实现数据共享、保障数据安全以及高效地检索数据和解决数据。 在本篇文章中,将会介绍腾讯自研的分布式数据库TcaplusDB的技术原理。 存储原理一个表通过HASH分表,依照路由数组长度(默认为10k)进行取模运算分片(Mod Sharding),所以每张表最多能够分成10k个分片(Shard)。以下图为例,1个TcaplusDB表被分为5个Shard文件散布到不同存储节点,每个结点散布有1个或多个分片的数据。 图3.1 TcaplusDB存储技术示意图 3.2 零碎扩容 TcaplusDB扩容别离在存储层和接入层进行。从第2章节的架构图中,能够看到接入层即Tcap Proxy层,存储层即Tcapsvr层(主备节点)。对于接入层而言,采纳的是无状态设计,所以能够灵便程度扩缩容,且不影响线上业务,对业务无感知 ; 对于存储层而言,因为表采纳的是分片设计,在扩容时须要将原机器上的分片程度迁徙到新机器上,达到扩容存储空间的目标。以图3.2为例,Table A在扩容前,只有一个分片Shard 1, 路由数组长度为10k。在扩容时,将该表分为两个分片,其中路由项0-5k放在Shard1 , 路由项5001-10k放在Shard2,2个shard别离存储到两个存储节点上。 图3.2 存储节点扩容示意图 数据迁徙过程见图3.3,原TcaplusDB Salve节点上数据会复制到新的TcaplusDB Master节点,通过binlog同步放弃数据完整性,接入层tcapoxy的数据申请重定向到新的TcaplusDB集群。 图3.3 扩容后申请重定向示意图 接入层扩容,如图3.4所示,通过一致性哈希路由切换,将原来由4个tcaproxy负责转发的路由,平均分配给5个tcaproxy,路由切换过程不会造成音讯失落。 图3.4 接入层扩容示意图 TcaplusDB的扩容基于存储节点的磁盘使用率和QPS (Queries per Second) 2个维度。当单台存储节点容量应用达到肯定阈值后即触发扩容操作。 TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码齐全自研。具备缓存+落地交融架构、PB级存储、毫秒级时延、无损程度扩大和简单数据结构等个性。同时具备丰盛的生态、便捷的迁徙、极低的运维老本和五个九高可用等特点。客户笼罩游戏、互联网、政务、金融、制作和物联网等畛域。

April 2, 2021 · 1 min · jiezi

关于后端:清明TcaplusDB持续为您保驾护航

清明将至,又到一年休闲踏青,祭拜先人的机会。 清明假期期间,TcaplusDB不停歇,咱们将判若两人地守护您的数据,持续做您最松软的后盾。 在将来,TcaplusDB还将以国产键值型数据库领航者的身份,在这条路线上走得更远,依据行业动态为平台引入更多元化的性能。同时,腾讯云TcaplusDB将和行业合作伙伴一起,持续分享腾讯分布式数据库方面的教训,并将踊跃投入基于多模和多负载能力的一站式低成本数据处理能力的研发;满足基于寰球分布式能力,助力企业解决业务出海、寰球同服/多活、跨域数据迁徙等要害业务畛域需要。 TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码齐全自研。具备缓存+落地交融架构、PB级存储、毫秒级时延、无损程度扩大和简单数据结构等个性。同时具备丰盛的生态、便捷的迁徙、极低的运维老本和五个九高可用等特点。客户笼罩游戏、互联网、政务、金融、制作和物联网等畛域。

April 2, 2021 · 1 min · jiezi

关于nosql:愚人节快乐但TcaplusDB永不愚你

愚人节(别名:万愚节、风趣节,英文名:April Fool's Day或All Fools' Day)是从19世纪开始在东方衰亡风行的民间节日,日期在每年公历的4月1日。对于愚人节的起源有很多种说法:一种说法认为这一风俗源自印度的“诠俚节”。该节规定,每年三月三十一日的节日这天,不分男女老幼,能够互开玩笑、相互愚弄坑骗以换得娱乐。 TcaplusDB在此祝大家愚人节高兴,同时,咱们也保障,TcaplusDB永不愚你! 作为一个数据库,TcaplusDB有十分多的业务在日夜不停井井有条地运行着,肩负着泛滥客户的信赖,咱们深知本人的责任重大,解决好每一条数据,将数据服务做到极致,就是咱们的指标。对于一个数据库来说,是没有开玩笑这一说法的,咱们的每一条数据都很重要,咱们将永远认真谨严地提供最精确的数据服务,TcaplusDB承诺,咱们永不在咱们的服务上开玩笑。 愚人节高兴,TcaplusDB永不愚你,你永远能够信赖TcaplusDB!

April 1, 2021 · 1 min · jiezi

关于c++:管理博文-直播预告4月1日与你相约腾讯云共探TcaplusDB

数据库作为互联网业务的基础设施,作为获取数据、生产加工数据、交付数据的集合体,其重要性显而易见。从传统的数据库到近年以诸多劣势非常热门的分布式数据库,数据库产品层出不穷,作为数据库外围的数据库架构也有很多变动。 本次直播要介绍的TcaplusDB,是专为游戏设计的分布式 NoSQL 数据库,作为腾讯云的数据库服务的一部分,咱们竭力为广大客户提供极致的游戏数据体验。因而,在设计数据库时,咱们也充分考虑了客户的需要,贯彻了数据库架构设计的准则,将高性能,高可用的个性施展到极致。 就在4月1日早晨七点,腾讯云数据库专家工程师张铭将开启「腾讯游戏外围数据库TcaplusDB的架构与实战直播」,全面介绍 TcaplusDB 的核心技术、数据库技术推动、TcaplusDB等,并分享TcaplusDB的设计迷信与实际。 扫码即可收费预约观看,相约腾讯云大学,共探撑持十亿级DAU游戏的数据库的设计神秘,4月1日咱们不见不散!

March 31, 2021 · 1 min · jiezi

关于运维:CloudQuery-v135-上线

盼望着,盼望着,东风来了,CloudQuery v1.3.5 的脚步近了。 一起来看看本次降级新增了哪些性能吧!新增性能 Oracle 现反对后果集排序和筛选。 在后果集左侧的执行日志中,可看到更丰盛具体的信息;可清空所有日志信息;可抉择仅查看错误信息。 Oracle/MySQL/SQLServer/达梦/PostgreSQL/MariaDB 七类数据源现反对导出后果集为 SQL 格局。 SQLServer/PG/MySQL/MariaDB 反对新增、调用、删除函数和存储过程等。 Oracle/MySQL/SQLServer 新增 SDT 菜单栏列类型和主外键显示性能。 数据操作权限新增编辑性能。 审计方面新增用户操作明细性能,可记录用户登录登出及客户端 IP 等信息。优化与修复 下载核心可查看文件下载失败的具体起因。 语句执行明细新增显示客户端明细、连贯名、数据库名和影响行数等信息。 大幅升高 CloudQuery 运行时的内存占用。调整局部页面的款式;优化交互体验。鸣谢 @黄晓鹏——group by sql 查问后果异样已解决。 感激上述同学反馈问题,CloudQuery 社区的倒退离不开大家的参加 直播流动2021 年的第一场直播流动来啦!咱们将在本次直播流动中为大家逐个解说从 CloudQuery v1.3.2 -- v1.3.5 所新增的性能及之后的布局,记得不要错过! 直播工夫:2021 年 3 月 30 日 20:00 直播地址:https://www.modb.pro/event/live/292 社区布告 CloudQuery 问答社区现已正式上线,当前遇到问题,能够在「问答社区」搜寻关键词,说不定立马就能找到答案!如果找不到你想要的答案,能够将你的问题 po 在社区上,咱们会第一工夫解答~ 最初,欢送大家多多在社区沉闷,咱们将不定期筛选沉闷用户发放礼物~ 问答社区地址:https://ask.cloudquery.club/ 产品官方网站:https://www.cloudquery.club

March 30, 2021 · 1 min · jiezi

关于oracle:赵强老师使用Oracle的目录数据库Catalog-DataBase

一、什么是目录数据库?你可能从其他人或书上听过RMAN复原目录(也有可能是其余名字,RMAN Recovery Catalog的翻译较多较杂,以下简称复原目录),旁人的表白或书中模糊不清的形容,导致很多敌人始终对其实际意义和作用感到纳闷。在我看来,能够将其视作存储RMAN备份复原相干信息的数据库(在物理模式上能够对应成Oracle中的一个SCHEMA)。 当没有复原目录时,RMAN相干的备份信息,比方归档文件门路、备份集门路等均存储在指标数据库的管制文件中,不过思考到管制文件并不能有限增长,而且管制文件也不仅仅是用来存储与备份相干的信息,因而RMAN也有一个专门的备份信息存储地,这就是复原目录了,即:目录数据库。当待备份的数据库注册到复原目录之后,RMAN相干的信息除了保留在管制文件中外(管制文件实际上只保留一部分),更加具体的信息就都被存储在复原目录中。如下图所示: 二、创立和应用Oracle的目录数据库首先,应用DBCA创立rcat数据库。这里咱们创立的数据库是:rcat.example.com。如下图所示。 在目录数据库中创立一个新的表空间。这里咱们设置的表空间大小为50M。create tablespace rcat_tbs datafile '/home/oracle/rcat_tbs01.dbf' size 50M;创立用户,可能应用rcat_tbs表空间,并受权可能应用下面的表空间create user rcat_owner identified by password;alter user rcat_owner default tablespace rcat_tbs;alter user rcat_owner quota unlimited on rcat_tbsgrant recovery_catalog_owner to rcat_owner;应用RMAN登录目录数据库,这里应用下面的创立用户rman catalog rcat_owner@rcat创立catalogcreate catalog;将指标数据库(即要执行备份的数据库)注册到目录数据库中;将指标数据库注册到目录数据库中,如下图所示rman target / catalog ract_owner/password@rcat register database; 上面咱们执行一个简略的备份,这里咱们备份一下users表空间。这时候RMAN就会将备份的元信息写入目录数据库中,如下图所示。backup tablespace users; 检查一下目录数据库中的信息,如下图所示。

March 21, 2021 · 1 min · jiezi

关于mysql:DCache-分布式存储系统|Set-ZSet-缓存模块的创建与使用

作者 | Eaton 导语 | 在之前的系列文章中,咱们介绍了 DCache 及其 KV, K-K-Row 和 List 缓存模块的应用,本文将持续介绍如何应用 DCache 中的汇合类型缓存模块 —— Set 和 ZSet 缓存模块。 系列文章 DCache 分布式存储系统|DCache 部署与利用创立DCache 分布式存储系统|Key-Value 缓存模块的创立与应用DCache 分布式存储系统|K-K-Row 缓存模块的创立与应用DCache 分布式存储系统|List 缓存模块的创立与应用DCache 分布式存储系统|Set, ZSet 缓存模块的创立与应用目录Set 与 ZSet 模块简介创立 Set/ZSet 缓存模块调用 Set/ZSet 缓存模块服务 Set 模块读写操作ZSet 模块读写操作实例其它 Set/ZSet 缓存模块服务接口总结DCache 是一个基于 TARS 框架开发的分布式 NoSQL 存储系统,反对多种数据结构,包含了 key-value(键值对),k-k-row(多键值),list(列表),set(汇合),zset(有序汇合)等,满足多种业务需要。 在后面的文章中,咱们介绍过 key-value, k-k-row 和 list 两种类型缓存模块的应用形式,本文将持续介绍汇合类型,set 和 zset 缓存模块的应用。 Set 与 ZSet 模块简介set 即汇合,与 list 相似,以列表模式存储数据。不同的中央在于 set 是会对增加的数据进行排重的。如果你须要存储一个列表数据,又不心愿呈现反复数据时,set 是一个很好的抉择。 ...

March 18, 2021 · 5 min · jiezi

关于Tcaplus:TcaplusDB君-行业新闻汇编3月17日

TcaplusDB君始终亲密关注着游戏行业和数据库行业的动静。以下是TcaplusDB君收集的近期的游戏行业和数据库行业的新闻,汇编整顿,献给大家观看。 (本篇文章局部内容来自网络) 美国手游市场总收入的20%来自中国手游美国作为海内最大的手游市场,Sensor Tower 商店情报数据显示,2020年Q4美国手游在App Store和Google Play的总收入超过58亿美元。共21款中国手游产品入围美区滞销榜Top100,吸金近7.8亿美元,拿下20%的市场份额,中国成为美国手游市场最大的进口国。 数据起源:Sensor Tower 商店 6月1日起,未接入防沉迷零碎的游戏将进行经营2021年2月24日,网络游戏防沉迷实名认证零碎企业接入培训会在线上召开。其中提到,2021年5月31日前,所有游戏企业需实现在经营游戏的防沉迷零碎的接入工作。6月1日起,未接入防沉迷零碎经营游戏要进行经营。除了6月1日所有上线经营的游戏实现接入实名认证零碎外,去年游戏产业年会走漏的另一个信息是,从2021年开始,《网络游戏适龄提醒》个人规范也会是游戏审核上线的必备内容。这份个人规范是在中宣部出版局领导下,由中国音数协联结腾讯、网易、人民网等53家企事业单位独特编制而成,是第一份由官网主导的适龄提醒分类文件。不合规的游戏无奈审核上线,意味着规范正越来越严格。 数据起源: 网络游戏防沉迷实名认证零碎、中宣部出版局 2020年度中国游戏产业年会举办12月17日,由国家新闻出版署主管,中国音像与数字出版协会、中共广州市委宣传部、广州市黄埔区人民政府、广州开发区管委会主办,中国音数协游戏工委、中共广州市黄埔区委宣传部、黄埔文化倒退团体有限公司、黄埔文化游览倒退有限公司承办的2020年度中国游戏产业年会在广州黄埔举办。网易、腾讯团体、完满世界、盛趣、快手游戏、三七互娱、多益网络、上海沐瞳科技有限公司、比特散步、咪咕互娱、创梦天地、可那信息、青瓷数码等游戏企业负责人负责人受邀缺席了此次会议。往年的游戏产业年会主题是“谋求优质倒退,勇担企业责任”。大会上,发言人示意,作为国家文化建设的重要方面,游戏行业要以推动高质量倒退为主题,以深入供应侧结构性改革为主线,以改革翻新为基本能源,以满足人民大众日益增长的美好生活须要为基本目标,更好兼顾倒退和平安,一直进步倒退品质和程度,致力为文化强国建设作出新的更大奉献。 数据起源:人民网 中国人民银行提出确保分布式数据库在金融畛域稳当利用的要求随着金融畛域分布式架构的转型降级,分布式数据库在金融畛域利用逐渐深刻。为标准分布式数据库在金融畛域利用,强化分布式数据库对金融服务的技术撑持,晋升分布式数据库对金融业务连续性和信息安全的保障能力,由中国人民银行科技司提出并负责起草,业内无关单位独特参加,编制分布式数据库金融利用系列规范。 数据起源:《金融科技倒退布局》 以上就是TcplusDB君收集的近期的游戏行业和数据库行业的新闻,感激大家的浏览哦。 TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码齐全自研。具备缓存+落地交融架构、PB级存储、毫秒级时延、无损程度扩大和简单数据结构等个性。同时具备丰盛的生态、便捷的迁徙、极低的运维老本和五个九高可用等特点。客户笼罩游戏、互联网、政务、金融、制作和物联网等畛域。

March 17, 2021 · 1 min · jiezi

关于TcaplusDB:315特别放送TcaplusDB致力于给用户提供安全放心有保障的数据服务

315的脚步越来越近,近日,《政府工作报告》中指出,要精确把握新倒退阶段,深刻贯彻新倒退理念,放慢构建新倒退格局,推动高质量倒退,为全面建设社会主义现代化国家开好局起好步,而往年315晚会的主题也正式颁布——提振生产 从心开始。 每年315,都是一次对品牌与产品品质的大型检阅。315晚会的呈现,对于企业的产品品质提出了更高的要求,而TcaplusDB作为一个历经十年倒退的腾讯齐全自研的数据库,身上承载了太多人的致力与信赖,咱们深知,TcaplusDB的每一步,都离不开广大客户的关注、信赖、反对和参加,您的了解和信赖是咱们提高的弱小能源,您的关怀和反对是咱们成长的不竭源泉。您的了解和信赖是咱们提高的弱小能源,您的关怀和反对是咱们成长的不竭源泉。您的每一次参加、每一个倡议,都让咱们激动不已,促使咱们一直奋进。有了您,咱们后退的征途才有源源不尽的信念和力量。 咱们理解品质对一个产品的重要性,咱们也始终都很重视品质,决不辜负大家对咱们的冀望。 TcaplusDB会始终如一地重视客户体验,谋求做一款兼具性价比和实用性的数据库。

March 15, 2021 · 1 min · jiezi

关于nosql:DCache-分布式存储系统|List-缓存模块的创建与使用

作者 | Eaton 导语 | 在之前的系列文章中,咱们介绍了 DCache 及其 KV 和 K-K-Row 缓存模块的应用,本文将持续介绍如何应用 DCache 中的列表类型缓存模块 —— List 缓存模块。 系列文章 DCache 分布式存储系统|装置部署与利用创立DCache 分布式存储系统|Key-Value 缓存模块的创立与应用DCache 分布式存储系统|K-K-Row 缓存模块的创立与应用DCache 分布式存储系统|List 缓存模块的创立与应用目录List 模块简介创立 List 缓存模块获取 DCache 接口文件创立缓存服务代理调用 List 缓存模块服务 List 模块读写操作实例其它 List 缓存模块服务接口总结DCache 是一个基于 TARS 框架开发的分布式 NoSQL 存储系统,反对多种数据结构,包含了 key-value(键值对),k-k-row(多键值),list(列表),set(汇合),zset(有序汇合)等,满足多种业务需要。 在后面的文章中,咱们介绍过 key-value 和 k-k-row 两种类型缓存模块的应用形式,本文将持续介绍 list 类型缓存模块的应用。 List 模块简介list 即链表,罕用于音讯的排列,比方 QQ、微信的聊天音讯排序。罕用的有单向链表和双向链表,由若干链表节点组成,如下图。 单向链表,每个节点存储该节点的数据和下一个节点的地址;双向链表的每个节点则额定蕴含上一个节点的地址。 DCache 中的 List 模块是基于双向链表实现的,每一个内存数据单元 Block 蕴含两个指针,别离指向前一个 Block 和后一个 Block。DCache 还提供了操作 list 中某一段的 API,你能够间接查问、删除、替换和裁剪 list 中某一段的元素。如下图为双向链表的构造及替换操作的原理。 ...

March 11, 2021 · 4 min · jiezi

关于nosql:TcaplusDB知识库TcaplusDB的存储分配策略图解

前言保留数据的办法多种多样,最间接的办法是在内存中建一个数据结构,保留数据。比方用一个List,每当收到一条数据就向List中追加一条记录。 这个计划非常简单,性能良好,但问题是数据寄存在内存中,一旦服务器停机或重启,数据就会永恒失落。 为了解决数据失落问题,能够把数据长久化寄存在非易失存储介质(比方硬盘)中。能够应用磁盘的文件,每当收到一条数据就向文件中 Append 一行。这是一个长久化存储数据的解决方案,但如果磁盘损坏呢? RAID是一个单机冗余存储计划,那如果主机损坏呢? 网络存储是一个解决方案,通过软件层进行存储正本的复制。仿佛咱们能够解决数据安全问题,然而做存储正本复制过程中是否能保障正本之间的一致性? TcaplusDB的开发人员思考到了这些存储问题,在本期的知识库中,TcaplusDB君将介绍TcaplusDB的存储调配策略,对于数据的读写逻辑咱们将会在下期的知识库中进行介绍。 存储空间调配的根本策略TcaplusDB优先应用数据文件的前1G的空间。起因是存储引擎启动时,会将数据文件的前1G空间通过mmap映射到内存中,拜访效率较高,而残余的空间中数据是间接对接文件IO的形式拜访的;数据的Key比数据的Value更有权力优先应用前1G的空间。起因是通常状况下Key的拜访频率要比Value高。以后1G空间中原先调配给Key应用的闲暇块有余时,会将前1G空间中原先调配给Value应用的闲暇块挪给Key应用;所有数据的Key尽量寄存在一起。这是因为咱们有很多Key遍历的场景(比方数据迁徙),Key放在一起,能够肯定水平上放慢遍历的过程,缩小磁盘IO;闲暇块的查找策略为Best-Fit,即找满足需要的最小闲暇块,目标是为了尽可能的让数据存在同一块中,防止数据的Split。存储空间的具体调配过程参见下图(下图拆分成了两个局部,两幅图通过虚线框的”尝试从文件空间调配“节点分割在一起): <center>存储空间具体调配过程图<center/> <center>从文件空间中调配图<center/> 策略设计的思考存储引擎依据空间调配策略,会先调配数据Value的存储空间,写入数据Value局部后,再调配数据Key的存储空间,并写入数据Key局部。之所以是这样的程序,有两方面的起因: 数据Key的头部须要记录它所指向的Value的存储地址,须要先调配Value的存储空间,失去Value的存储地址头,再写Key;数据拜访入口是Key,依照这个程序,Key写胜利,咱们也根本能够认为Value也是写胜利了,能够缩小数据不统一的状况。最初咱们曾经理解了 TcaplusDB 的存储调配策略,后续咱们将揭开更多TcaplusDB设计的非凡神秘。

March 10, 2021 · 1 min · jiezi

关于nosql:突破关系型数据库桎梏云原生数据库中间件核心剖析

一、数据分片传统的将数据集中存储至繁多数据节点的解决方案,在性能和可用性两方面曾经难于满足互联网的海量数据场景。因为关系型数据库大多采纳B+树类型的索引,在数据量超过阈值的状况下,索引深度的减少也将使得磁盘拜访的IO次数减少,进而导致查问性能的大幅降落;同时高并发拜访申请也使得集中式数据库成为零碎的最大瓶颈。 在传统关系型数据库无奈满足互联网场景须要的状况下,将数据存储至原生反对分布式的NoSQL的尝试越来越多。但NoSQL对SQL的不兼容性以及生态圈的不欠缺,使得它们在与关系型数据库的博弈中始终无奈实现致命一击,关系型数据库的位置仍然不可撼动。 数据分片,指依照某个维度将寄存在繁多数据库中的数据扩散地寄存至多个数据库或表中,以达到晋升性能瓶颈及可用性的成果。数据分片的无效伎俩是对关系型数据库进行分库或分表。分库和分表均能够无效防止因为数据量超过可接受阈值而产生的查问瓶颈。 除此之外,分库还可能用于无效扩散对数据库单点的访问量;而分表则可能提供尽量将分布式事务转化为本地事务的可能。应用多主多从的分片形式,能够无效防止数据单点,从而晋升数据架构的可用性。 1、垂直分片垂直分片又称为纵向拆分,它的核心理念是专库专用。在拆分之前,一个数据库由多个数据表形成,每个表对应着不同的业务。而拆分之后,则依照业务将表进行归类,散布到不同的数据库中,从而将压力分担到不同的数据库之上,如图: 2、程度分片程度分片又称为横向拆分。绝对于垂直分片,程度分片不是将数据依据业务逻辑分类,而是依照某个字段的某种规定将数据扩散到多个库或表中,每个分片仅蕴含其中的一部分数据。 例如,依据ID的最初一位以10取余,尾数是0的放入0库(表),尾数是1的放入1库(表)。如图: 为了解决关系型数据库面对海量数据时因数据量过大而导致的性能问题,将数据进行分片是卓有成效的解决方案。 将集中于繁多节点的数据拆分并别离存储到多个数据库或表,称为分库分表。分库能够无效扩散由高并发所带来的对数据库拜访的压力。分表尽管无奈缓解数据库压力,但仅跨分表的更新操作,仍然能应用数据库原生的ACID事务;而一旦波及到跨库的更新操作,分布式事务的问题就会变得无比简单。 通过分库和分表拆分数据使得各个表的数据量放弃在阈值以下。垂直分片往往须要对架构和设计进行调整,通常来讲,是来不及应答互联网疾速变动的业务需要的,而且它也无奈真正解决单点瓶颈。而程度分片从实践上冲破了单机数据量解决的瓶颈,并且扩大绝对自在,是分库分表的规范解决方案。 分库和读写拆散疏导流量是应答高访问量的常见伎俩。分表尽管能够解决海量数据导致的性能问题,但无奈解决过多申请拜访同一数据库导致的响应变慢问题。所以程度分片通常采取分库的形式,一并解决数据量和访问量微小的问题。读写拆散是另一个疏导流量的方法,但读写数据间的提早是架构设计时须要思考的问题。 尽管分库能够解决上述问题,但分布式架构在取得了收益的同时,也带来了新的问题。面对如此散乱的分库分表之后的数据,利用开发和运维人员对数据库的操作变得异样沉重就是其中的重要挑战之一。他们须要晓得什么样的数据须要从哪个具体的数据库的分表中去获取。 新架构的NewSQL与数据分片中间件在这个性能的解决形式上是不同的: 新架构的NewSQL会从新设计数据库存储引擎,将同一表中的数据存储在分布式文件系统中。数据分片中间件则是尽量透明化分库分表所带来的影响,让应用方尽量像应用一个数据库一样应用程度分片之后的数据库。跨库事务是分布式数据库要面对的辣手事件。正当采纳分表,能够在升高单表数据量的状况下,尽量应用本地事务,长于应用同库不同表可无效防止分布式事务带来的麻烦。在不能防止跨库事务的场景,有些业务仍需放弃事务的一致性。而基于XA的分布式事务因为性能低下,无奈被互联网公司所驳回,大多采纳最终一致性的柔性事务代替分布式事务。 3、读写拆散面对日益减少的零碎访问量,数据库的吞吐量面临着微小瓶颈。对于同一时间有大量并发读操作和较少写操作类型的利用零碎来说,将繁多的数据库拆分为主库和从库,主库负责解决事务性的增删改操作,从库负责解决查问操作,可能无效的防止由数据更新导致的行锁,使得整个零碎的查问性能失去极大改善。 通过一主多从的配置形式,能够将查问申请平均扩散到多个数据正本,可能进一步晋升零碎的解决能力。 应用多主多从的形式,岂但可能晋升零碎的吞吐量,还可能晋升零碎的可用性,能够达到在任何一个数据库宕机,甚至磁盘物理损坏的状况下依然不影响零碎的失常运行。 读写拆散实质上是数据分片的一种。与将数据依据分片键打散至各个数据节点的程度分片不同,读写拆散则是依据SQL语义的剖析,将读和写申请别离路由至主库与从库。读写拆散的数据节点中的数据是统一的,而程度分片每个数据节点的数据内容却并不相同。将程度分片和读写拆散联结应用,可能更加无效的晋升零碎性能,但同时也让系统维护更简单。 尽管读写拆散能够晋升零碎的吞吐量和可用性,但同时也带来了数据不统一的问题,这包含多个主库之间的数据一致性及主库与从库之间的数据一致性问题。并且,读写拆散也带来了与数据分片同样的问题,它也会使得利用开发和运维人员对数据库的操作和运维变得更加简单。 透明化读写拆散所带来的影响,让应用方尽量像应用一个数据库一样应用主从数据库,是读写拆散的次要性能。 4、外围流程数据分片外围是由SQL解析、SQL路由、SQL改写、SQL执行及后果归并的流程组成。为了放弃原有的应用程序实现低接入老本,则需兼容对数据库的拜访,因而须要进行数据库协定的适配。 协定适配 NewSQL对传统关系型数据库的兼容性,除了SQL之外,兼容数据库的协定能够升高应用方的接入老本。开源的关系型数据库均能通过实现它的协定规范,将本人的产品装扮成原生的关系型数据库。 因为MySQL和PostgreSQL风行度较高,很多NewSQL会实现它们的传输协定,让应用MySQL和PostgreSQL的用户可能无需批改业务代码就主动接入NewSQL产品。 MySQL协定 MySQL是以后最为风行的开源数据库。要理解它的协定,能够通过MySQL的根本数据类型、协定包构造、连贯阶段和命令阶段这4方面动手。 根本数据类型 MySQL协定包中所有的内容均由MySQL所定义的根本数据类型组成,具体数据类型参见下表: MySQL根本数据类型 在须要将二进制数据转换为MySQL可了解的数据时,MySQL协定包将依据数据类型事后定义的位数读取,并转换为相应的数字或字符串;反之亦然,MySQL会将每个字段依照标准中规定的长度写入协定包。 协定包构造 MySQL协定由一个或多个MySQL协定包(MySQL Packet)组成。无论类型如何,它均由音讯长度(Payload Length)、序列主键(Sequence ID)和音讯体(Payload)这3局部组成: 音讯长度为int<3>类型。它示意随后的音讯体所占用的字节总数。须要留神的是,音讯长度并不蕴含序列主键的占位在内。序列主键为int<1>类型。它示意一次申请后返回的多个MySQL协定包中,每个协定包的序号。占位为1字节的序列主键最大值为0xff,即十进制的255,但这并非示意每次申请最多只能蕴含255个MySQL协定包,超过255的序列主键将再次从0开始计数。例如一次查问可能返回几十万的记录,那么MySQL协定包只需保障其序列主键间断,将大于255的序列主键重置为0,从新开始计数即可。音讯体的长度为音讯长度所申明的字节数。它是MySQL协定包中真正的业务数据,依据不同的协定包类型,音讯体的内容也不同。连贯阶段用于创立MySQL的客户端与服务端的通信管道。该阶段次要执行替换并匹配MySQL客户端与服务端的版本性能形容(Capability Negotiation)、创立SSL通信管道及验证受权这3个工作。下图以MySQL服务端为视角绘制了连贯创立流程图: MySQL连贯阶段流程图 该图并未蕴含MySQL服务端与客户端的交互。实际上,MySQL的连贯创立是由客户端发动的。 MySQL服务端在接管到客户端的连贯申请后,先进行服务端和客户端版本间所具备的性能信息的替换和匹配(Capability Negotiation),而后依据两端的协商后果生成不同格局的初始化握手协定包,并向客户端写入改协定包。协定包中包含由MySQL服务端调配的连贯主键、服务端以后版本性能形容(Capabilities)以及为验证受权生成的密文。 MySQL客户端在接管到服务端发送的握手协定包后,将发送握手协定响应包。该协定包中次要蕴含的信息是用于数据库拜访的用户名及加密后的明码密文。 MySQL服务端接管到握手协定响应包之后,即进行受权校验,并将校验后果返回至客户端。 命令阶段 连贯阶段胜利之后,则进入命令执行的交互阶段。MySQL一共有32个命令协定包,具体类型参见下图: MySQL命令包 MySQL的命令协定包分为4个大类,别离是:文本协定、二进制协定、存储过程及数据复制协定。 协定包音讯体中的首位用于标识命令类型。协定包依据名称即可顾名思义,在这里无需一一解释它们的具体用处,下文会解析几个重点的MySQL命令协定包: COM_QUERYCOM_QUERY是MySQL用于以明文格局查问的重要命令,它对应JDBC中的java.sql.Statement。COM_QUERY命令自身较为简单,它由标识符和SQL组成: 1              [03] COM_QUERYstring[EOF]    the query the server shall executeCOM_QUERY的响应协定包则较为简单,见下图: MySQL查问命令流程图 COM_QUERY依据其场景有可能返回4种类型,它们是:查问后果、更新后果、文件执行后果及谬误后果。 当执行过程中呈现如网络断开、SQL语法不正确等谬误时,MySQL协定要求将协定包首位设置为0xff,并将错误信息封装至ErrPacket协定包返回。 通过文件执行COM_QUERY的状况并不常见,此处不再过多阐明。 对于更新申请,MySQL协定要求将协定包首位设置为0x00,并返回OkPacket协定包。OkPacket协定包须要蕴含本次更新操作所影响的行记录数及最初插入的主键值信息。 查问申请最为简单,它须要将读取int<lenenc>的形式取得后果集字段的数目创立为独立的FIELD_COUNT协定包返回。而后再顺次将返回字段的每一列详细信息别离生成独立的COLUMN_DEFINITION协定包,查问字段的元数据信息最终以一个EofPacket完结。之后便能够开始逐行生成数据协定包Text Protocol Resultset Row,它自身并不关注数据的具体类型,会对立将其转换为string<lenenc>格局。数据协定包最终仍然以一个EofPacket完结。 ...

March 8, 2021 · 1 min · jiezi

关于nosql:TcaplusDB知识库TcapRecord引擎计算层的介绍

在上次的TcaplusDB知识库中,TcaplusDB君为大家解说了TcaplusDB所用的基于HASH表的Key-value存储引擎TXHDB。存储引擎作为数据库的撑持底盘,其重要性半信半疑,而在本次的知识库系列分享中,TcaplusDB君要跟大家分享一个对于数据库而言也很重要的构造,引擎计算层。 上面我将介绍一下TcaplusDB所用的引擎计算层 TcapRecord的设计逻辑。 TcapRecord的设计逻辑为灵便反对多种表类型及简单数据存储,引擎计算层设计了TcapRecord对象来表白简单数据记录对象,在引擎计算层将简单数据对象转换成简略的key-value二进制数据记录,以对底层引擎屏蔽数据表形容等细节,理论底层只需实现key-value模型的通用存储接口。 TcapRecord反对两种构造,表构造和嵌套数据结构。 表构造TcaplusDB底层是Key-value存储格局, 如何映射到用户的操作的相似Table的构造呢? field1 field2 field3 field4 field5 field6 …. 一个表,有N多字段,在TcaplusDB中能够选定一个表的多个字段做为key,其余字段做为value来存储到TcaplusDB中。 用户还能够选定多个key字段中的局部字段来做索引(留神索引必须蕴含splittablekey — 根据该key来做数据分布)。 引擎计算层负责表构造到Key-value构造的映射. 实质上就是把所有的key字段依据表构造序列化为一个key, 所有的value字段依据表构造序列化为一个value, 如下图所示: 嵌套数据结构应用TcaplusDB的嵌套数据结构,有助于将关系型数据库应用时须要的多张表定义,转化为单张表定义。在解析数据时,对二进制数据进行遍历,依据tag信息解析各字段的field number及value数据。在数据打包时,遍历各字段,依据字段field number,类型,value数据,打包tag及value数据到指定的buffer里。在遇到解析的value为嵌套数据结构时,则依据元数据的定义,将value依照tag、length、value进行一一字段遍历及解析,实现嵌套数据结构的读写能力。 TcaplusDB君本次的知识库分享就到这里完结啦,后续咱们将揭开更多TcaplusDB设计的非凡神秘。

March 6, 2021 · 1 min · jiezi

关于nosql:如何使用IndexedDB-浏览器上的NoSQL数据库

深入研究IndexedDB API及其在实践中的用法。 你是否据说过浏览器上的NoSQL数据库? IndexedDB是大型NoSQL存储系统。它使你简直能够将任何内容存储在用户的浏览器中。除了通常的搜寻,获取和搁置操作外,IndexedDB还反对事务。你能够在上面找到IndexedDB的示例。 在本文中,咱们将重点介绍以下内容。 为什么咱们须要IndexedDB?咱们如何在咱们的应用程序中应用IndexedDB?IndexedDB的性能IndexedDB的局限性IndexedDB是否适宜你的应用程序?为什么咱们须要IndexedDB?IndexedDB被认为比localStorage更弱小! 你晓得背地的起因吗?让咱们找出答案。 能够存储比localStorage大得多的数据量 没有像 localStorage 这样的非凡限度(介于2.5MB和10MB之间)。最大限度取决于浏览器和磁盘空间。例如,基于Chrome和Chromium的浏览器最多容许80%的磁盘空间。如果你有100GB,则IndexedDB最多能够应用80GB的空间,单个origin最多能够应用60GB。Firefox容许每个origin最多2GB,而Safari容许每个起源最多1GB。 能够存储基于{ key: value }对的任何类型的值 存储不同数据类型的灵活性更高。这不仅意味着字符串,而且还意味着二进制数据(ArrayBuffer对象,Blob对象等)。它应用对象存储在外部保留数据。 提供查找界面 这在其余浏览器存储选项(例如 localStorage 和 sessionStorage)中不可用。 对于不须要继续互联网连贯的Web应用程序很有用 IndexedDB对于联机和脱机工作的应用程序都十分有用,例如,它能够用于渐进式Web应用程序(PWA)中的客户端存储。 利用状态能够存储 通过为常常应用的用户存储应用程序状态,能够大大提高应用程序的性能。稍后,应用程序能够与后端服务器同步,并通过提早加载来更新应用程序。 咱们来看看IndexedDB的构造,它能够存储多个数据库。 IndexedDB的构造 咱们如何在咱们的应用程序中应用IndexedDB?在以下局部中,咱们将钻研如何应用IndexedDB疏导应用程序。 1. 应用“window.indexedDB”关上数据库连贯const openingRequest = indexedDB.open('UserDB', 1);在这里 UserDB 是数据库名称,1 是数据库的版本。这将返回一个对象,该对象是 IDBOpenDBRequest 接口的实例。 2. 创建对象存储关上数据库连贯后,将触发 onupgradeneeded 事件,可用于创建对象存储。 // 创立UserDetails对象存储库和索引request.onupgradeneeded = (event) => { let db = event.target.result; // 创立UserDetails对象存储 // 具备主动递增ID let store = db.createObjectStore('UserDetails', { autoIncrement: true }); // 在NIC属性上创立索引 let index = store.createIndex('nic', 'nic', { unique: true });};3. 将数据插入对象存储一旦关上了与数据库的连贯,就能够在 onsuccess 事件处理程序中治理数据。插入数据产生在4个步骤中。 ...

March 1, 2021 · 1 min · jiezi

关于nosql:元宵-TcaplusDB君邀您来猜灯谜

吃汤圆 赏明月 看花灯 猜灯谜 ……. 元宵节标配,都必须安顿上! 快来看看TcaplusDB送大家的元宵节祝愿吧 TcaplusDB祝大家元宵节高兴! 身体健康万事如意 财源广进福分到! 大家记得要吃汤圆哦!   ——来自爱大家的TcaplusDB君 TcaplusDB君也精心筹备了三个灯谜 看看能猜对几个? Ready? Go! 1、老会计喝二锅头(打一热门技术)—— 云计算 2、深夜造访(打一网络安全术语) —— 黑客 3、男女生都一样(打一技术术语)—— 兼容性 祝大家元宵节高兴!

February 26, 2021 · 1 min · jiezi

关于nosql:开工大吉TcaplusDB将持续为您提供可靠的数据服务

新的一年 新的开始 咱们也带着新的情意 向您奔赴而来 在此,TcaplusDB祝广大客户敌人,动工大吉,2021,咱们将判若两人地守护您的数据,持续做您最松软的后盾。 作为专为游戏设计的分布式 NoSQL 数据库,TcaplusDB始终在致力前行,自诞生以来,TcaplusDB就以服务更多开发者为指标,面向领有应用高性能数据库的研发人员,分享通过腾讯外部测验的存储研发教训、工具和行业资源。 目前,咱们已为《王者光荣》、《穿梭前线》、《火影忍者》等千万级 DAU 大作提供了稳固的数据存储服务,依靠腾讯云遍布寰球五大洲(亚洲、欧洲、北美洲、南美洲、大洋洲)的根底设施服务节点提供寰球范畴内的数据服务。 同时, TcaplusDB是首批通过信通院键值型内存数据库评测的数据库,安全性失去证实TcaplusDB是寰球首款反对过亿DAU游戏的数据库,性能失去证实。TcaplusDB社区继续倒退,TcaplusDB和宽广的用户及行业合作伙伴的交换失去保障。TcaplusDB取得了MTCS最高级认证,保障出海企业的数据安全咱们不遗余力...... 而在将来,TcaplusDB还将以国产数据库领航者的身份,在这条路线上走得更远,依据行业动态为平台引入更多元化的性能。同时,腾讯云TcaplusDB将和行业合作伙伴一起,持续分享腾讯分布式数据库方面的教训,并将踊跃投入基于多模和多负载能力的一站式低成本数据处理能力的研发;满足基于寰球分布式能力,助力企业解决业务出海、寰球同服/多活、跨域数据迁徙等要害业务畛域需要。 春节的喜庆氛围还未消散,TcaplusDB曾经整装待发,在新的一年里,咱们将持续为您提供最优质牢靠的数据服务,好高鹜远,再踏征程!

February 26, 2021 · 1 min · jiezi

关于nosql:TcaplusDB知识库概念表键记录索引

 TcaplusDB作为一款NoSQL数据库,语法与传统的SQL关系库有所差别。本文将具体介绍TcaplusDB表、记录、索引这三个数据库中罕用术语在TcaplusDB中的概念与意义。 术语\概念 首先,TcaplusDB与SQL数据库以及MongoDB的术语对比方下图所示: SQL术语/概念MongoDB术语/概念TcaplusDB术语/概念解释/阐明databasedatabasecluster数据库tablecollectiontablegroup/table数据库表/汇合rowdocumentrecord数据记录行/文档columnfieldfield数据字段/域indexindexindex索引primary keyprimary keyprimary key主键,MongoDB主动将_id字段设置为主键TcaplusDB语法比照 表 TcaplusDB表由主键字段和非主键字段两局部组成,主键字段最多能够指定8个,一般字段(非一般字段)最多能够指定256个。 TcaplusDB主键字段图解 记录 TcaplusDB记录由一行字符串组成每个字段的数字都反对嵌套类型,嵌套最多32层。单个记录大小最高10MB,能够将罕用的对象文件序列化成二进制文件存储。 TcaplusDB惯例记录与大记录区别 索引 TcaplusDB反对本地索引和分布式索引两种索引,本地索引须要在表创立时即指定,分布式索引反对任意工夫批改,既能够指定主键字段也也能够指定一般字段。索引广泛应用在条件查问、含糊匹配、范畴查找等场景。 TcaplusDB反对的两种索引 想理解更多的TcaplusDB相干技术问题吗? 咱们的社区:https://tcaplusdb.tencent.com/ 丰盛的技术和产品流动分享等着你哦。 欢送来访! TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码齐全自研。具备缓存+落地交融架构、PB级存储、毫秒级时延、无损程度扩大和简单数据结构等个性。同时具备丰盛的生态、便捷的迁徙、极低的运维老本和五个九高可用等特点。客户笼罩游戏、互联网、政务、金融、制作和物联网等畛域。

February 25, 2021 · 1 min · jiezi

关于nosql:TcaplusDB知识库概念表键记录索引

 TcaplusDB作为一款NoSQL数据库,语法与传统的SQL关系库有所差别。本文将具体介绍TcaplusDB表、记录、索引这三个数据库中罕用术语在TcaplusDB中的概念与意义。 术语\概念 首先,TcaplusDB与SQL数据库以及MongoDB的术语对比方下图所示: SQL术语/概念MongoDB术语/概念TcaplusDB术语/概念解释/阐明databasedatabasecluster数据库tablecollectiontablegroup/table数据库表/汇合rowdocumentrecord数据记录行/文档columnfieldfield数据字段/域indexindexindex索引primary keyprimary keyprimary key主键,MongoDB主动将_id字段设置为主键TcaplusDB语法比照 表 TcaplusDB表由主键字段和非主键字段两局部组成,主键字段最多能够指定8个,一般字段(非一般字段)最多能够指定256个。 TcaplusDB主键字段图解 记录 TcaplusDB记录由一行字符串组成每个字段的数字都反对嵌套类型,嵌套最多32层。单个记录大小最高10MB,能够将罕用的对象文件序列化成二进制文件存储。 TcaplusDB惯例记录与大记录区别 索引 TcaplusDB反对本地索引和分布式索引两种索引,本地索引须要在表创立时即指定,分布式索引反对任意工夫批改,既能够指定主键字段也也能够指定一般字段。索引广泛应用在条件查问、含糊匹配、范畴查找等场景。 TcaplusDB反对的两种索引 想理解更多的TcaplusDB相干技术问题吗? 咱们的社区:https://tcaplusdb.tencent.com/ 丰盛的技术和产品流动分享等着你哦。 欢送来访! TcaplusDB是腾讯出品的分布式NoSQL数据库,存储和调度的代码齐全自研。具备缓存+落地交融架构、PB级存储、毫秒级时延、无损程度扩大和简单数据结构等个性。同时具备丰盛的生态、便捷的迁徙、极低的运维老本和五个九高可用等特点。客户笼罩游戏、互联网、政务、金融、制作和物联网等畛域。

February 25, 2021 · 1 min · jiezi

关于nosql:DCache-分布式存储系统|KKRow-缓存模块的创建与使用

作者 | Eaton 导语 | 随着微服务与云的倒退,分布式架构的需要变得越来越广泛,传统的 SQL 结构化存储计划曾经跟不上脚步,于是 NoSQL 呈现了。DCache 作为基于 TARS 的分布式 NoSQL 缓存零碎,完满反对 TARS 服务。前一篇文章中,咱们介绍了怎么创立并应用 KV 模块,本文将持续介绍如何创立和应用 DCache 中的 K-K-Row 缓存模块。 系列文章 DCache 分布式存储系统|DCache 部署与利用创立DCache 分布式存储系统|Key-Value 缓存模块的创立与应用DCache 分布式存储系统|K-K-Row 缓存模块的创立与应用目录K-K-Row 模块简介创立 K-K-Row 缓存模块获取 DCache 接口文件创立缓存服务代理调用缓存模块服务 K-K-Row 模块读写操作运行示例总结DCache 是一个基于 TARS 框架开发的分布式 NoSQL 存储系统,反对多种数据结构,包含了 key-value(键值对),k-k-row(多键值),list(列表),set(汇合),zset(有序汇合)等,满足多种业务需要。 咱们在文章 Key-Value 缓存模块的创立与应用 中介绍了 key-value 类型的应用,也提到了其在结构化数据存储上的毛病。而 k-k-row 类型就是一种结构化存储计划。 K-K-Row 模块简介k-k-row,与 key-value 类似,但这里 value 不是字符串,而是相当于一张表,可能存储结构化数据。k-k-row 即 key key row,指通过两个 key,即主索引/主键(Main Key)和联结索引(Union Key),可能惟一确定一条记录 row,如下 不难看出,k-k-row 的存储构造和 SQL 数据库很像,主键相当于表名,映射到 Value。既不须要反复存储数据,也不会带来序列化和并发批改管制的问题,很好的解决了问题。 ...

February 25, 2021 · 4 min · jiezi

关于nosql:赵强老师NoSQL数据库之Cassandra基础

一、Cassandra简介Cassandra是一个混合型的非关系的数据库,相似于Google的BigTable。其次要性能比Dynamo (分布式的Key-Value存储系统)更丰盛,但反对度却不如文档存储MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中性能最丰盛,最像关系数据库的。反对的数据结构十分涣散,是相似json的bjson格局,因而能够存储比较复杂的数据类型)。Cassandra最后由Facebook开发,后转变成了开源我的项目。它是一个网络社交云计算方面现实的数据库。以Amazon专有的齐全分布式的Dynamo为根底,联合了Google BigTable基于列族(Column Family)的数据模型。P2P去中心化的存储。很多方面都能够称之为Dynamo 2.0。 二、装置与配置解压安装包tar -zxvf apache-cassandra-3.11.3-bin.tar.gz -C ~/training/设置环境变量CASSANDRA_HOME=/root/training/apache-cassandra-3.11.3export CASSANDRA_HOMEPATH=$CASSANDRA_HOME/bin:$PATHexport PATH将以下三个地址设置为Linux相应的IPlisten_address: 192.168.56.111rpc_address: 192.168.56.111 - seeds: "192.168.56.111"启动Cassandra留神:要以root用户启动Cassandra,须要应用-R参数。命令:cassandra -R验证Cassandra运行环境:nodetool工具命令:nodetool status 从Cassandra 2.1版本开始,日志和数据都被寄存在logs和data的子目录下。老版本默认保留在/var/log/cassandra和 /var/lib/cassandra。 三、Cassandra的配置参数外围配置文件:conf/cassandra.yaml,启动过程中的日志信息如下图所示: 次要的运行时参数cluster_name: 集群的名称storage_port:节点外部通信的端口(默认: 7000)listen_address:Cassandra绑定的、用来连贯其余Cassandra节点的IP地址或者主机名称。(默认: localhost)native_transport_port:客户端监听CQL本地传输的端口(默认: 9042)目录相干的参数data_file_directories:这个目录地位就是表数据存储的中央(在SSTables里)。Cassandra将数据平均的散布在这个地位,受配置的压缩策略粒度的限度。commitlog_directory:这个目录是commit log 寄存的中央。为了获得最佳的写入性能,将commit log放在独自的磁盘分区,或者(现实状况下)和data文件目录离开的物理设施上。commit log只能追加的。saved_caches_directory:这个目录是table key和row缓存寄存的中央。默认地位:$CASSANDRA_HOME/data/saved_cacheshints_directory:设置hints的存储地位(默认: $CASSANDRA_HOME/data/hints)四、Cassandra的基本操作(一)登录CQL客户端:cqlsh localhost 查看表system.local的构造: 查问零碎的信息: 查看表空间:describe keyspaces;查看已有表:describe tables;查看表构造:describe table table_name;(二)应用Cassandra的Java客户端Cassandra应用cql语言作为操作语言,Cassandra在2.0之后,在操作上越来越像sql数据库的操作,这样想从传统关系型数据库,切换到Cassandra的话,上手老本也越来越低。应用官网java驱动操作Cassandra非常简单。maven引入相干的依赖如下所示: <dependency> <groupId>info.archinnov</groupId> <artifactId>achilles-core</artifactId> <version>6.0.0</version> <classifier>shaded</classifier></dependency>上面执行CRUD操作:

February 5, 2021 · 1 min · jiezi

关于nosql:DCache-分布式存储系统|KeyValue-缓存模块的创建与使用

作者 | Eaton 导语 | 随着微服务与云的倒退,分布式架构的需要变得越来越广泛,传统的 SQL 结构化存储计划曾经跟不上脚步,于是 NoSQL 呈现了。DCache 作为基于 TARS 的分布式 NoSQL 缓存零碎,完满反对 TARS 服务。在前一篇文章中,咱们介绍了 DCache 的个性、如何在 TARS 上部署 DCache 并创立一个利用 TestDemo。本文将持续介绍如何创立和应用 DCache 中的 KV 缓存模块。 系列文章 DCache 分布式存储系统|DCache 部署与利用创立DCache 分布式存储系统|Key-Value 缓存模块的创立与应用目录简介利用场景创立 KV 缓存模块获取 DCache 接口文件创立缓存服务代理调用缓存模块服务总结简介DCache 是一个基于 TARS 框架开发的分布式 NoSQL 存储系统,反对多种数据结构,包含了 key-value(键值对),k-k-row(多键值),list(列表),set(汇合),zset(有序汇合)等,满足多种业务需要。 其中 key-value 是最简略也是最罕用的类型,咱们只需实现以下步骤即可在服务中应用 key-value 缓存服务 创立 KV 缓存模块获取 DCache 接口文件创立缓存服务代理调用缓存模块服务DCache 中为 KV 提供了插入、替换、删除和批量操作键值等丰盛的操作接口,应用上十分不便。本文将基于 TestDemo 介绍如何创立 Key-Value 缓存模块,以及怎么在 TARS 服务中调用该服务来缓存数据。 本文应用的示例能够在 GitHub 仓库 DCacheDemo 中查看。利用场景DCache 的 KV 缓存模块为惯例 key-value 缓存利用,一个键 key 对应一个值 value。value 个别为字符串类型。实用于构造简略的数据,罕用于惯例计数,如微博数, 粉丝数等,如下图。 ...

February 3, 2021 · 4 min · jiezi

关于nosql:DBA-的效率加速器CloudQuery-v132-上线

嘿,兄弟,咱们好久不见,你在哪里 嘿,敌人,如果真的是你,请打声招呼 我说好久不见,你去哪里 你却对我说,我去江湖 我去看 CloudQuery v1.3.2,看看新增了哪些好用的小性能! 一、主动/手动提交性能现已反对事务提交和回滚,大家能够依据本人的理论需要抉择手动或主动提交。 二、语句终止执行性能在执行耗时较长语句或长时间得不到反馈时,若想终止执行,点击「终止」按钮即可。 三、后果集大字段二次展现后果集中可查看、复制与编辑单元格内容;可依据数据库内容进行具体展现。 四、集体查问日志在执行历史页面,可查看具体的集体查问日志,蕴含执行连贯,执行数据库,SQL 语句,执行后果,工夫和耗时状况。 注明:咱们现已解决大家提过的一些小 bug,驳回了一些贵重倡议,残余的正在致力中! 以上就是本次降级的次要内容,咱们年底再见???? CloudQuery 官网:http://www.cloudquery.club

January 21, 2021 · 1 min · jiezi

关于nosql:赵强老师MongoDB中的索引下

(四)索引的类型三:复合索引(Compound Index)**MongoDB反对复合索引,行将多个键组合到一起创立索引。该形式称为复合索引,或者也叫组合索引,该形式可能满足多键值匹配查问应用索引的情景。其次复合索引在应用的时候,也能够通过前缀法来应用索引。MongoDB中的复合索引与关系型数据库基本上统一。在关系型数据库中复合索引应用的一些准则同样实用于MongoDB。 在后面的内容中,咱们曾经在emp汇合上创立了一个复合索引,如下: db.emp.createIndex({"deptno":1,"sal":-1})上面应用不同的过滤条件查问文档,查看相应的执行打算: (1)仅应用deptno作为过滤条件 db.emp.find({"deptno":10}).explain() (2)应用deptno、sal作为过滤条件 db.emp.find({"deptno":10,"sal":3000}).explain() (3)应用deptno、sal作为过滤条件,但把sal放在后面 db.emp.find({"sal":3000,"deptno":10}).explain() (4)仅应用sal作为过滤条件 db.emp.find({"sal":3000}).explain() (五)复合索引与排序复合索引创立时按升序或降序来指定其排列形式。对于单键索引,其程序并不是特地重要,因为MongoDB能够在任一方向遍历索引。对于复合索引,按何种形式排序可能决定该索引在查问中是否被应用到。 db.emp.createIndex({"deptno":1,"sal":-1})在后面的内容中,咱们曾经在deptno上依照升序、sal上依照降序建设了复合索引,上面测试不同的排序的下,是否执行了索引: 应用了索引的状况:db.emp.find().sort({"deptno":1,"sal":-1}).explain()db.emp.find().sort({"deptno":-1,"sal":1}).explain()没有应用索引的状况:db.emp.find().sort({"deptno":1,"sal":1}).explain()db.emp.find().sort({"deptno":-1,"sal":-1}).explain()替换两个列的地位,再进行测试。(六)复合索引与索引前缀索引前缀指的是复合索引的子集,如果存在如下索引: db.emp.createIndex({"deptno":1,"sal":-1,"job":1})那么就存在以下的索引前缀:{"deptno":1}{"deptno":1,"sal":-1}在MongoDB中,下列查问过滤条件情景中,索引将会被应用到: db.emp.find().sort({deptno:1,sal:-1,job:1}).explain()db.emp.find().sort({deptno:1,sal:-1}).explain()db.emp.find().sort({deptno:1}).explain()下列查问过滤条件情景中,索引将不会被应用到: db.emp.find().sort({deptno:1,job:1}).explain()db.emp.find().sort({sal:-1,job:1}).explain()(七)小结复合索引是基于多个键(列)上创立的索引复合索引在创立的时候能够为其每个键(列)来指定排序办法索引键列的排序办法影响查问在排序时候的操作,方向统一或相同的能力被匹配复合索引与前缀索引通常在匹配的情景下能力被应用

December 19, 2020 · 1 min · jiezi

关于nosql:图解Janusgraph系列并发安全锁机制本地锁分布式锁分析

图解Janusgraph系列-并发平安:锁机制(本地锁+分布式锁)剖析大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录:整顿所有图相干文章,请移步(超链):图数据库系列-文章总目录 地址:https://liyangyang.blog.csdn.net/article/details/111031257源码剖析相干可查看github(码文不易,求个star~): https://github.com/YYDreamer/janusgraph下述流程高清大图地址:https://www.processon.com/view/link/5f471b2e7d9c086b9903b629 版本:JanusGraph-0.5.2 转载文章请保留以下申明: 作者:洋仔聊编程微信公众号:匠心Java原文地址:https://liyangyang.blog.csdn.net/在分布式系统中,不免波及到对同一数据的并发操作,如何保障分布式系统中数据的并发平安呢?分布式锁! 一:分布式锁罕用的分布式锁实现形式: 1、基于数据库实现分布式锁 针对于数据库实现的分布式锁,如mysql应用应用for update独特竞争一个行锁来实现; 在JanusGraph中,也是基于数据库实现的分布式锁,这里的数据库指的是咱们以后应用的第三方backend storage,具体的实现形式也和mysql有所不同,具体咱们会在下文剖析 2、基于Redis实现的分布式锁 基于lua脚本+setNx实现 3、基于zk实现的分布式锁 基于znode的有序性和长期节点+zk的watcher机制实现 4、MVCC多版本并发管制乐观锁实现 本文次要介绍Janusgraph的锁机制,其余的实现机制就不在此做详解了上面咱们来剖析一下JanusGraph的锁机制实现~ 二:JanusGraph锁机制在JanusGraph中应用的锁机制是:本地锁 + 分布式锁来实现的; 2.1 一致性行为在JanusGraph中次要有三种一致性修饰词(Consistency Modifier)来示意3种不同的一致性行为,来管制图库应用过程中的并发问题的管制水平; public enum ConsistencyModifier { DEFAULT, LOCK, FORK}源码中ConsistencyModifier枚举类次要作用:用于管制JanusGraph在最终统一或其余非事务性后端系统上的一致性行为!其作用别离为: DEFAULT:默认的一致性行为,不应用分布式锁进行管制,对配置的存储后端应用由关闭事务保障的默认一致性模型,一致性行为次要取决于存储后端的配置以及关闭事务的(可选)配置;无需显示配置即可应用LOCK:在存储后端反对锁的前提下,显示的获取分布式锁以保障一致性!确切的一致性保障取决于所配置的锁实现;需management.setConsistency(element, ConsistencyModifier.LOCK);语句进行配置FORK:只实用于multi-edges和list-properties两种状况下应用;使JanusGraph批改数据时,采纳先删除后增加新的边/属性的形式,而不是笼罩现有的边/属性,从而防止潜在的并发写入抵触;需management.setConsistency(element, ConsistencyModifier.FORK);进行配置LOCK在查问或者插入数据时,是否应用分布式锁进行并发管制,在图shcema的创立过程中,如上述能够通过配置schema元素为ConsistencyModifier.LOCK形式管制并发,则在应用过程中就会用分布式锁进行并发管制; 为了提高效率,JanusGraph默认不应用锁定。 因而,用户必须为定义一致性束缚的每个架构元素决定是否应用锁定。 应用JanusGraphManagement.setConsistency(element,ConsistencyModifier.LOCK)显式启用对架构元素的锁定 代码如下所示: mgmt = graph.openManagement() name = mgmt.makePropertyKey('consistentName').dataType(String.class).make() index = mgmt.buildIndex('byConsistentName', Vertex.class).addKey(name).unique().buildCompositeIndex() mgmt.setConsistency(name, ConsistencyModifier.LOCK) // Ensures only one name per vertex mgmt.setConsistency(index, ConsistencyModifier.LOCK) // Ensures name uniqueness in the graph mgmt.commit()FORK因为边缘作为单个记录存储在根底存储后端中,因而同时批改单个边缘将导致抵触。 ...

December 17, 2020 · 5 min · jiezi

关于nosql:用NOSql给高并发系统加速

随着互联网大潮的到来,越来越多网站,利用零碎须要海量数据的撑持,高并发、低提早、高可用、高扩大等要求在传统的关系型数据库中曾经得不到满足,或者说关系型数据库应答这些需要曾经显得力不从心了。关系型数据库通过几十年的倒退曾经很成熟,弱小的sql语句反对,完满的ACID属性的反对,使得关系型数据库广泛应用于各种各样的利用零碎中,然而利用的场景宽泛并非意味着完满 因为关系型数据库是按行进行存储的,在某些只统计一列的需要场景下,也须要把整行读入内存,导致了一个小小的统计需要高IO的毛病关系型数据库无奈存储数据结构,比方:一个商品能够从属于多个分类,业务上的从属关系体现到存储上是一个列表而已,然而关系型数据库须要把这些关系存储为多行,无奈间接存储为一个列表。关系型数据库中的存储单位表的架构是强束缚,操作不存在的列会报出异样,而且增加、更新、删除列必须执行DDL语句,如果表的现存数据量比拟大,会呈现长时间锁表的景象。关系型数据库全文搜寻性能一般比拟弱,用like去匹配关键词的时候,数据量比拟大的状况下会呈现慢查问的景象。关系型数据库基于表格的关系模型使得很难增加新的或不同品种的关联信息。因为以上这些诸多问题,便诞生了以“NOSQL”为口号的很多解决方案。在某些关系型数据库不善于的畛域,Nosql体现的很杰出。入地是偏心的,给你关上了一扇窗户,必会给你关上半扇门,NoSql是以就义ACID某个或者某些个性为代价的。 NoSQL并不是银弹,更多的时候是关系型数据库一个无力补充,或者是特定场景下优于关系型数据库的一种解决方案NoSQLNoSQL,泛指非关系型的数据库。当初大家更喜爱翻译成:not only sql 依据NoSQL的存储等个性,大体能够分为以下几类 键值(Key-Value)存储数据库。相干的产品:Redis、Riak、SimpleDB、Chordless、Scalaris、Memcached。次要解决关系数据库无奈存储数据结构的问题。列存储数据库。相干产品:BigTable、HBase、Cassandra、HadoopDB、GreenPlum、PNUTS。解决关系数据库大数据场景下的 I/O 问题文档数据库。相干产品:MongoDB、CouchDB、ThruDB、CloudKit、Perservere、Jackrabbit。解决关系数据库强 schema 束缚的问题。图形数据库。相干产品:Neo4J、OrientDB、InfoGrid、GraphDB。次要解决大量简单、互连贯、低结构化的图构造场合,如社交网络、举荐零碎等全文搜索引擎。相干产品:Elasticsearch。次要解决关系数据库的全文搜寻性能问题。由此可见,没有哪一种NoSql是完满的,每一种Nosql都有本人善于的畛域,这也是咱们做零碎架构中要思考的重要因素。 场景1电商的商品设计过程中,每种商品的属性都不同,属性数目不同,属性名不同,同一个商品有可能会属于多个分类,而且随着业务的倒退,很多商品会减少新的属性,而且最令程序员头疼莫过于每种属性都有可能有搜寻的可能性(当然搜寻能够利用搜索引擎来实现)。遇到这样的需要场景,如果利用关系型数据库来存储的话,表的字段会十分多,而且字段的定义十分令人头疼。这样的场景非常适合NOsql中的文档型数据库,比方MongoDB。文档型数据库新增字段非常简单,不像关系型数据库须要先执行DDL来减少字段,间接能够利用程序来进行读写,历史数据就算是没有相应的字段也不会有异样的状况产生。最重要的一点,文档型数据库很善于存储简单构造的数据,个别状况下业务上能够利用体现能力很强的json数据结构。 { "Id":1, "ProductName":"杜蕾斯加强版", "Price":100, "Type":[ 1, 2, 4 ], "Length":20, "Height":2 }如果所有商品信息都用mongodb来存储的话,有的场景并不是非常完满。比方商品被胜利购买之后扣库存的问题,联结查问的问题,因为Nosql天生对ACID反对有余的起因,一个事务性的操作很难在Nosql中实现,所以设计零碎的时候在很多状况下是关系数据库+Nosql 来独特实现业务。 场景2很多具体的业务中都有记录数据而后进行统计的需要场景,比方那些统计uv,pv的零碎。日志型的数据量十分大,而且还有可能有峰值的呈现,如果用关系型数据库来存储,很有可能在IO上会呈现瓶颈,而且有可能会影响其余失常的业务,更可怜的是当执行统计语句的时候,性能更是差强人意。这样的日志型统计业务很适宜HBase这样的列式Nosql,业务上要统计一天的uv,pv数据,HBase很适宜统计某一列数据的场景,因为只须要把对应的列进行统计即可,不像关系型数据库那样须要把所有行都加载进内存,而且列式存储个别比行式存储领有更大的压缩比例,占用的磁盘空间会更少。 列式存储的利用场景有肯定的限度,个别用于统计和大数据的剖析中。场景3在少数高并发零碎中都存在缓存的设计,而缓存的个别数据结构都是K-V构造。缓存是一种进步零碎性能的无效伎俩,因其须要提供快速访问的个性,个别缓存都搁置于内存当中。比方当初咱们要设计一个用户管理系统,每个用户信息能够做缓存以便提供高速的拜访,因为很多零碎都采纳分布式的部署形式,所以采纳过程内的缓存形式并不可取,这个时候就须要有一种高速的内部存储来提供这种业务,这正是kv型Nosql的典型利用场景之一。其中以redis为代表,具体的业务中能够以用户id为key,用户的信息为value存储在redis中,而且redis在3.0之后能够做集群了,在高可用和扩大上更能助力业务方。redis反对的数据类型很多,在不同的场景下抉择不同的数据类型。 场景4当一个零碎有搜寻的业务时候,如果搜寻的条件是一些简略的类型搜寻,关系型数据库还能够满足,然而如果有全文搜寻,就是咱们平时sql写的like ‘%xx%’这样的搜寻,关系型数据库可能并不是最好的抉择,全文搜索引擎类型的Nosql兴许是一个更好的解决方案,其中以Elasticsearch 为代表。全文搜索引擎的搜寻的条件能够随便排列组合,并且能够实现关系型数据库like形式的含糊匹配。全文搜索引擎的技术原理称为“倒排索引”(inverted index),是一种索引办法,其基本原理是建设单词到文档的索引。与之绝对是,是“正排索引”,其基本原理是建设文档到单词的索引。 场景5在社交零碎中最常见例子就是社会网络中人与人之间的关系。关系型数据库用于存储“关系型”数据的成果并不好,其查问简单、迟缓、超出预期,而图形数据库的独特设计恰好补救了这个缺点,解决关系型数据库存储和解决简单关系型数据性能较弱的问题。其中以Neo4j为代表。想深入研究的同学请移步百度。 无论是关系型数据库还是nosql数据库都不是银弹,每一种事物都有它最善长的畛域。设计一个好的零碎,须要综合思考各种因素,依据具体的业务场景来抉择最合适的解决方案。 更多精彩文章 分布式大并发系列架构设计系列趣学算法和数据结构系列设计模式系列

October 9, 2020 · 1 min · jiezi

关于nosql:架构制图工具与方法论

简介: 软件工程也是工程,因而传统工程制图的一些根本实践,在软件行业同样实用。但另一方面,软件与实体制造业之间还是有着本质区别,所以在制图方面的需要和形式也天壤之别,无奈间接套用。作为软件行业的从业者,你能够齐全不懂工程制图,但你不得不懂架构制图 —— 这是任何程序员职业生涯的的必修课。 作者 | 楚衡 前言“架构制图”这词乍一听仿佛有些艰涩,但如果提起“工程制图”,置信绝大部分工科背景的程序员们都不会生疏,甚至还能独特感叹下那些年一起伏在宿舍左手圆规,右手直尺,徒手作图到深夜的日子。 软件工程也是工程,因而传统工程制图的一些根本实践,在软件行业同样实用。但另一方面,软件与实体制造业之间还是有着本质区别,所以在制图方面的需要和形式也天壤之别,无奈间接套用。作为软件行业的从业者,你能够齐全不懂工程制图,但你不得不懂架构制图 —— 这是任何程序员职业生涯的的必修课。 本文在后半段将介绍如何用图去形容(describe)和传播(communicate)你的架构设计。值得强调的是,本文并不会侧重于繁多的办法和工具,而是更心愿关注那些优良办法背地的通用方法论,即架构制图的实质、共性和最佳实际。心愿本文能起到引子作用,激发大家对本人日常工作中对于架构和制图局部的关注、扫视与思考;如果还真能帮忙大家晋升一点点制图效率和成果,那就更好不过了。 什么是软件架构?软件架构定义 IEEE 给出的定义:架构是环境中该零碎的一组根底概念(concepts)和属性(properties),具体表现就是它的元素(elements)、关系(relationships),以及设计与演进的根本准则(principles)。 CMU 软件工程研究院的定义:架构是用于推演出该零碎的一组构造(structures),具体是由软件元素(elements)、元素之间的关系(relationships),以及各自的属性(properties)独特组成。 Uncle Bob 在 Clean Architecture 一书中给出的定义:架构是创建者给予该零碎的状态(shape)。这个状态的具体模式来源于对系统组件(components)的划分和排列,以及这些组件之间相互通信的形式。 架构外围因素 综合上述各种权威定义,软件系统的架构通常须要蕴含如下四类外围因素: 元素(elements):将零碎拆分为一组元素 - 模块、组件、构造体、子系统;关系(relationships):不同元素之间的关系 - 交互、依赖 、继承、组合、聚合;属性(properties):每个元素具备的属性 - 名称、职责、接口、实现限度等;原理(principles):为什么这么设计 - 拆分根据、设计准则、决策起因等。为什么架构很重要?架构是零碎实现的蓝图 最近有部很火的网剧叫《摩天大楼》,讲述了一段匪夷所思的悬疑故事。为什么扯这个呢?因为我想借用这个剧的题目来问个问题:摩天大楼是由谁建起来的?兴许你心里会默念:废话,不就是建筑工人们一砖一瓦堆起来的嘛。认真再想想?背地是不是还有一堆操碎了心的修建设计师(比方剧中帅气的林大森)和土木工程师们?他们尽管不搬砖也不扛水泥,但如果没有他们产出的那些繁琐谨严的设计图纸,摩天大楼是是不可能像农村自建房一样仅凭工人们各自的教训与想象力就能疾速安稳地竖立起来的。 正是靠着这些图纸所描绘出来的工程蓝图(blueprints),才让成千盈百工人们的分工合作和验收规范有了根据:大家只须要照着蓝图,循序渐进地把本人所负责的那些砖瓦添上去就行了;只有蓝图正确,且施工过程也没有偏差,最终顺利竣工只是个工夫问题。 与修建、汽车或者任何其余工程行业一样,软件在落地实现(编码)之前也须要先有蓝图;而其中最重要的一份蓝图,就是架构设计。没有架构,仅凭程序员本人脑子里的含糊构想,兴许你能够像传统手艺人一样单独发明出一些美妙有用的小东西(比方 Linux 0.01 版本),但不太可能以工程的形式协同一个团队独特建造起一个与摩天大楼规模相似的简单软件系统(比方古代的 Linux 零碎)。一方面,人类的思维能力终归无限,必须依附架构这种高度形象和简化的蓝图,能力让简单零碎的发明、了解、剖析和治理变得可行;另一方面,量级达到肯定水平的大型零碎,也只能依附多人分工合作能力实现,而架构也正是多人沟通合作的重要根底。 架构是沟通合作的根底 软件我的项目的最终价值产出就是软件系统,而架构作为软件系统的灵魂和骨架,能够起到如下作用: 了解对齐:所有软件系统的目标都是为了实现用户需要,但实现的路径有有限种可能性(相比传统工程行业,软件的灵活性更大、常识迭代更快)。架构设计就是去抉择其中一条最合适的实现路径,因而其中会波及十分多要害的选路决策(为什么要这么拆分?为什么抉择 A 技术而不是 B?)。这些重要的技术决策须要通过架构形容这种模式被记录和同步,能力让项目组所有成员对整个零碎的了解对齐,造成共识。工作量化:项目管理最重要的步骤之一就是工时评估,它是确定我的项目排期和里程碑的间接根据。显然,只通过 PRD / 交互图是无奈迷信量化出我的项目工作量的,因为很难直观判断出一句简短需要或一个简略页面背地,到底要写多少代码、实现起来难度有多大。有了清晰明确的架构之后,实践上绝大部分开发工作都能做到可见、可预测和可拆解,自然而然也就可能被更精确地量化。当然,精准的工作量评估在 IT 行业内也始终是个未解之谜,理论的工期会受太多未知因素影响,包含程序员的技能熟练度、情绪好不好、有没有吃饱等。规范术语:编程作为一种具备创造力的工作,从某种角度看跟写科幻小说是相似的。好的科幻小说都喜爱造概念,比方三体中的智子,如果没看过小说必定不晓得这是个啥玩意儿。软件系统在造概念这一点上,相比科幻小说只有过之而无不及,毕竟小说里的世界通常还是以事实为背景,而软件中的世界就全凭造物者(程序员)的设想(建模)了。略微简单一点的软件系统,都会引入一些畛域特定甚至全新创作的概念。为了防止在我的项目过程中呈现鸡同鸭讲的沟通阻碍和了解歧义,就必须对形容这些概念的术语进行对立。而架构的一个重要目标,就是定义和解释分明零碎中波及的所有要害概念,并在整个架构设计和形容过程中应用规范和统一的术语,真正做到让大家的沟通都在一个频道上。言之有物:就跟探讨产品交互时须要对着原型图、探讨代码细节时须要间接看代码一样,架构是在探讨一些较高维技术问题时的必要实物(具体的实物化模式就是所谓架构形容)。否则,要么一堆人对着空气谈(夸夸其谈都说不上),要么每次沟通时都从新找块白板画一画(费时费力且容易遗落信息,显然不是长久之计)。常识积淀 & 新人培训:架构应该被作为与代码等同重要的文档资产继续积淀和保护,同时也是我的项目新人疾速了解和上手零碎的重要依据。不要让你的零碎跟公司内某些祖传遗留零碎一样 —— 只有代码遗留了下来,架构文档却没有;只能靠一些口口相传的残留设计记忆,苦苦维系着我的项目的生命连续。架构决定了产品质量 如何掂量一个软件产品的品质?上图是 ISO/IEC 25010 规范定义的软件产品品质模型,包含以下 8 个大类: 性能适宜性:性能残缺度、性能正确性和性能失当性;性能效率:工夫体现(e.g. 响应工夫)、资源利用和容量;兼容性:共存能力(e.g. 多版本组件共存)和互操作性;可用性:可学习性、可运维性、用户谬误爱护(e.g. 主动纠错)、UI 好看度、可拜访性;可靠性:成熟度、可用性、容错性、可恢复性;安全性:机密性、完整性、不可伪造性、权威性和可审计;可维护性:模块度、可复用性、可剖析性、可修改性、可测试性;可移植性:可适配性、可安装性、可替代性。上述品质模型中列出的所有点,都是架构设计须要着重思考的。其中除了性能适宜性以外,其余所有点都属于非性能需要的领域,这也是辨别架构好坏的真正分水岭 —— 好的架构设计,不会停留在仅满足性能需要这一最根本的需要档次上(最坏的架构设计也同样能做到),更重要且更难以应答的是其余泛滥的非性能需要。 ...

October 9, 2020 · 3 min · jiezi

关于nosql:NoSql-简介

NoSql 简介1、概述NoSql=Not only sql 意思是不仅仅是sql泛指非关系型数据库,nosql无需当时为要存储的数据建设字段,随时能够存储自定义的数据格式,而在关系数据库里,增删字段是一件十分麻烦的事件,如果是十分大数据量的表,减少字段就很麻烦。 2、Nosql与关系型数据库(RDBMS)的区别NOSQLRDBMS代表着不仅仅是sql高度组织化结构化的数据没有申明性查询语言结构化查询语言sql没有预约义的模式数据和关系都存储在独自的表中键值对存储,列存储,文档存储,图形化数据库数据操纵语言没数据定义语言dml ddl最终一致性,而非acid属性严格的一致性非结构化和不可预知的数据根底事务cap定理(Consistency(一致性), 数据统一更新,所有数据变动都是同步的Availability(可用性), 好的响应性能Partition tolerance(分区容忍性) 可靠性) 高性能,高可用性和可伸缩性 3、NoSql 个性3V+3高 海量Volume多样Variety实时Velocity 高并发 高可扩 高性能 4、当下nosql的经典利用(nosql和sql一起应用)nosql数据模型简介 商品根本信息(名称,价格,出产日期,生产产商等)关系型数据库商品形容,详情,评估信息(多文字类)文档数据库mongDB商品图片 商品图片展示类 分布式的文件系统中(淘宝本人的tfs google的gfs hadoop的hdfs)商品的关键字(搜索引擎 ISearch)商品的波段性的热点高频信息(内存数据库:tair redis memcached)5、NoSql数据模型以一个电商客户、订单、订购、地址模型来比照下关系型数据库和菲关系型数据库 传统形式 1:1 1:N N:N 主外键nosql json{ "customer":{ "id":1136, "name":"Z3", "billingAddress":[{"city":"beijing"}], "orders":[ { "id":17, "customerId":1136, "orderItems":[{"productId":27,"price":77.5,"productName":"thinking in java"}], "shippingAddress":[{"city":"beijing"}] "orderPayment":[{"ccinfo":"111-222-333","txnid":"asdfadcd334","billingAddress":{"city":"beijing"}}], } ] }}6、nosql数据库四大分类KV键值:新浪(berkeley+redis)美团(redis+tair)阿里,百度(memcached+redis)文档型(bson格局较多):CouchDB,MongDB(是一个基于分布式文件存储的数据库,由c++语言编写,旨在为web利用提供可扩大的高性能数据存储解决方案,其介于关系数据库和非关系数据库之间,是非关系数据库当中性能最丰盛的,最像关系数据库的)列存储数据库:Cassandra,Hbase,分布式文件系统图关系数据库(它不是放图形的,放的是关系比方:朋友圈社交网网络,广告举荐):Neo4j.InfoGird

August 11, 2020 · 1 min · jiezi

从马车到电动车TiDB-部署工具变形记

作者:Heng Long打造优秀产品的信念渗透在每一个 TiDB 开发者的血液中,衡量产品的优秀有多个维度:易用性、稳定性、性能、安全性、开放性、拓展性等等。**在部署易用性方面,TiDB 开发者们经过诸多探索和尝试,经过了命令行时代、Ansible 时代,终于在 TiDB 4.0 发布了新一代具有里程碑意义的解决方案——TiUP。 TiUP 的意义不仅仅在于提供了里程碑式的解决方案,更是对 TiDB 开源社区活力的有力证明。TiUP 从 3 月立项进入 PingCAP Incubator 进行孵化,从零开发到最终发布 TiUP 1.0 GA 仅仅只花了两个月。两个月内 40+ 位 Contributor 新增了 690+ 次提交,最终沉淀接近 40k 行代码。 本文会描述整个演进过程,并介绍 TiUP 设计过程中的一些理念和实现细节。 以史为鉴TiUP 的诞生并非一蹴而就,而是有一个演变过程。简要描述这个演变过程,有助于大家更加深入理解 TiUP 的设计和取舍。 纯命令行在没有 TiDB Ansible 的时代,要运行一个 TiDB 集群只能通过命令行的方式。TiDB 集群包含 TiDB/TiKV/PD 三个核心组件, 和 Promethues/Grafana/Node Exporter 监控组件。手动构建一个集群运行需要的所有命令行参数和配置文件比较复杂的。比如,我们想要搭建一个集群,其中启动三个 PD 的命令行参数就有下面这么复杂(可以忽略命令行,仅演示复杂性): $ bin/pd-server --name=pd-0--data-dir=data/Rt1J27k/pd-0/data--peer-urls=http://127.0.0.1:2380--advertise-peer-urls=http://127.0.0.1:2380 --client-urls=http://127.0.0.1:2379 --advertise-client-urls=http://127.0.0.1:2379 --log-file=data/Rt1J27k/pd-0/pd.log --initial-cluster=pd-0=http://127.0.0.1:2380,pd-1=http://127.0.0.1:2381,pd-2=http://127.0.0.1:2383$ bin/pd-server --name=pd-1--data-dir=data/Rt1J27k/pd-1/data--peer-urls=http://127.0.0.1:2381 --advertise-peer-urls=http://127.0.0.1:2381 --client-urls=http://127.0.0.1:2382 --advertise-client-urls=http://127.0.0.1:2382 --log-file=data/Rt1J27k/pd-1/pd.log --initial-cluster=pd-0=http://127.0.0.1:2380,pd-1=http://127.0.0.1:2381,pd-2=http://127.0.0.1:2383$ bin/pd-server --name=pd-2--data-dir=data/Rt1J27k/pd-2/data--peer-urls=http://127.0.0.1:2383 --advertise-peer-urls=http://127.0.0.1:2383 --client-urls=http://127.0.0.1:2384 --advertise-client-urls=http://127.0.0.1:2384 --log-file=data/Rt1J27k/pd-2/pd.log --initial-cluster=pd-0=http://127.0.0.1:2380,pd-1=http://127.0.0.1:2381,pd-2=http://127.0.0.1:2383注:以 $ 开头的表示在命令行执行的命令以上仅仅是启动 PD 就可以发现这种方式显然太复杂、使用门槛太高。尽管我们可以通过把这些东西脚本化,在脚本构建好这些内容,每次执行对应脚本来简化这个过程,但是对于第一次构建脚本的用户来说,也是不小的挑战。 ...

June 16, 2020 · 3 min · jiezi

Spring-Boot-2X六Spring-Boot-集成-Redis

Redis 简介什么是 RedisRedis 是目前使用的非常广泛的免费开源内存数据库,是一个高性能的 key-value 数据库。 Redis 与其他 key-value 缓存(如 Memcached )相比有以下三个特点: 1.Redis 支持数据的持久化,它可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。2.Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。3.Redis 支持数据的备份,即 master-slave 模式的数据备份。Redis 优势如下: 1.性能极高。Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s。2.丰富的数据类型。Redis 支持二进制案例的 Strings,Lists,Sets 及 Ordered Sets 数据类型操作。3.原子性。Redis 所有的操作都是原子性的,意思是要么成功执行要么失败完全不执行。单个操作是原子性的,多个操作也是,通过 MULTI 和 EXEC 指令抱起来。4.丰富的特性。Redis 还支持 publish/subscribe,通知,key 过期等特性。Spring Boot 集成 Redis1.在项目中添加依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.9.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>cn.zwqh</groupId> <artifactId>spring-boot-redis</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-boot-redis</name> <description>spring-boot-redis</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>查看 jar 包时发现,Spring Data Redis 下 org.springframework.data.redis.connection 包路径下面默认有两个包 jedis 和 lettuce,这说明 Spring Boot 已经默认包装适配了这两个 Redis 客户端。 ...

November 5, 2019 · 3 min · jiezi

深入学习Redis四基本类型List剖析

更多精彩文章,关注公众号【ToBeTopJavaer】,更有数万元精品vip资源免费等你来拿!!!接下来我们要剖析的基本类型是List,相信大家对List都不会陌生吧,下面我们将深入源码剖析Redis中List的实现。 存储类型 存储有序的字符串(从左到右),元素可以重复。可以充当队列和栈的角色。 操作命令 元素增减 lpush queue alpush queue b crpush queue d elpop queuerpop queueblpop queuebrpop queue取值 lindex queue 0lrange queue 0 -1 存储( 实现) 原理 在早期的版本中,数据量较小时用 ziplist 存储,达到临界值时转换为linkedlist 进行存储,分别对应 OBJ_ENCODING_ZIPLIST 和OBJ_ENCODING_LINKEDLIST 。 3.2 版本之后,统一用 quicklist 来存储。quicklist 存储了一个双向链表,每个节点都是一个 ziplist。 127.0.0.1:6379> object encoding queue"quicklist"什么是quicklist?quicklist(快速列表)是 ziplist 和 linkedlist 的结合体。 quicklist.h源码如下,head 和 tail 指向双向列表的表头和表尾 typedef struct quicklist { quicklistNode \*head; /\* 指向双向列表的表头 \*/ quicklistNode \*tail; /\* 指向双向列表的表尾 \*/ unsigned long count; /\* 所有的 ziplist 中一共存了多少个元素 \*/ unsigned long len; /\* 双向链表的长度, node 的数量 \*/ int fill : 16; /\* fill factor for individual nodes \*/ unsigned int compress : 16; /\* 压缩深度, 0: 不压缩; \*/} quicklist;redis.conf 相关参数: ...

October 22, 2019 · 2 min · jiezi

深入学习Redis三基本类型Hash剖析

更多精彩文章,关注公众号【ToBeTopJavaer】,更有数万元精品vip资源免费等你来拿!!!接下来我们要剖析的基本类型是Hash,相信大家对Hash都不会陌生吧,下面我们将深入源码剖析Redis中Hash的实现。 首先我们看一张图: 存储类型 包含键值对的无序散列表。value 只能是字符串,不能嵌套其他类型。 同样是存储字符串,Hash 与 String 的主要区别? 1、把所有相关的值聚集到一个 key 中,节省内存空间 2、只使用一个 key,减少 key 冲突 3、当需要批量获取值的时候,只需要使用一个命令,减少内存/IO/CPU 的消耗 Hash 不适合的场景: 1、Field 不能单独设置过期时间 2、没有 bit 操作 3、需要考虑数据量分布的问题(value 值非常大的时候,无法分布到多个节点) 操作命令 存储(实现)原理 Redis 的 Hash 本身也是一个 KV 的结构,类似于 Java 中的 HashMap。 外层的哈希(Redis KV 的实现)只用到了 hashtable。当存储 hash 数据类型时, 我们把它叫做内层的哈希。内层的哈希底层可以使用两种数据结构实现: ziplist:OBJ_ENCODING_ZIPLIST(压缩列表) hashtable:OBJ_ENCODING_HT(哈希表) 如下图所示: 问题一、那么在什么时候会用到ziplist,什么时候用到hashtable呢? 在redis.conf我们可以看到: 在源码中: /* 源码位置: t_hash.c , 当达字段个数超过阈值, 使用 HT 作为编码 */if (hashTypeLength(o) > server.hash_max_ziplist_entries)hashTypeConvert(o, OBJ_ENCODING_HT);/*源码位置: t_hash.c, 当字段值长度过大, 转为 HT */for (i = start; i <= end; i++) {if (sdsEncodedObject(argv[i]) &&sdslen(argv[i]->ptr) > server.hash_max_ziplist_value){hashTypeConvert(o, OBJ_ENCODING_HT);break;}}复制代码从而我们可以得知,当 hash 对象同时满足以下两个条件的时候,使用 ziplist 编码: ...

October 22, 2019 · 3 min · jiezi

MongoDB系列轻松应对面试中遇到的MongonDB索引index问题

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中( 索引存储在特定字段或字段集的值),而且是使用了B-tree结构。索引可以极大程度提升MongoDB查询效率。 如果没有索引,MongoDB必须执行全集合collections扫描,即扫描集合中的每个文档,选取符合查询条件的文档document。 如果查询时存在适当的索引,MongoDB可以使用索引来限制它必须查询的文档document的数量,特别是在处理大量数据时,所以选择正确的索引是很关键的、重要的。 创建索引,需要考虑的问题: 每个索引至少需要数据空间为8kb;添加索引会对写入操作会产生一些性能影响。 对于具有高写入率的集合Collections,索引很昂贵,因为每个插入也必须更新任何索引;索引对于具有高读取率的集合Collections很有利,不会影响没索引查询;处于索引处于action状态时,每个索引都会占用磁盘空间和内存,因此需要对这种情况进行跟踪检测。索引限制: 索引名称长度不能超过128字段;复合索引不能超过32个属性;每个集合Collection不能超过64个索引;不同类型索引还具有各自的限制条件。1. 索引管理1.1 索引创建索引创建使用createIndex()方法,格式如下: db.collection.createIndex(<key and index type specification>,<options>)createIndex() 接收可选参数,可选参数列表如下: ParameterTypeDescriptionbackgroundBoolean建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。uniqueBoolean建立的索引是否唯一。指定为true创建唯一索引。默认值为false.namestring索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。dropDupsBoolean3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.sparseBoolean对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.expireAfterSecondsinteger指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。vindex version索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。weightsdocument索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。default_languagestring对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语language_overridestring对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.1.2 查看索引查看Collection中所有索引,格式如下: db.collection.getIndexes()1.3 删除索引删除Collection中的索引:格式如下: db.collection.dropIndexes() //删除所有索引db.collection.dropIndex() //删除指定的索引 1.4 索引名称索引的默认名称是索引键和索引中每个键的value1或-1,形式index_name+1/-1,比如: db.products.createIndex( { item: 1, quantity: -1 } )----索引名称为item_1_quantity_-1也可以指定索引名称: db.products.createIndex( { item: 1, quantity: -1 } , { name: "inventory" } ) ----索引名称为inventory1.5 查看索引创建过程以及终止索引创建方法解析db.currentOp()查看索引创建过程db.killOp(opid)终止索引创建,其中-opid为操作id1.6 索引使用情况形式解析&dollar;indexStats获取索引访问信息explain()返回查询情况:在executionStats模式下使用db.collection.explain()或cursor.explain()方法返回有关查询过程的统计信息,包括使用的索引,扫描的文档数以及查询处理的时间(以毫秒为单位)。Hint()控制索引,例如要强制MongoDB使用特定索引进行db.collection.find()操作,请使用hint()方法指定索引1.7 MongoDB度量标准MongoDB提供了许多索引使用和操作的度量标准,在分析数据库的索引使用时可能需要考虑这些度量标准,如下所示: 形式解析metrics.queryExecutor.scanned在查询和查询计划评估期间扫描的索引项的总数metrics.operation.scanAndOrder返回无法使用索引执行排序操作的已排序数字的查询总数collStats.totalIndexSize所有索引的总大小。 scale参数会影响此值。如果索引使用前缀压缩(这是WiredTiger的默认值),则返回的大小将反映计算总计时任何此类索引的压缩大小。collStats.indexSizes指定集合collection上每个现有索引的键和大小。 scale参数会影响此值dbStats.indexes包含数据库中所有集合的索引总数的计数。dbStats.indexSize在此数据库上创建的所有索引的总大小1.8 后台索引操作 在密集(快达到数据库最大容量)Collection创建索引:在默认情况下,在密集的Collection(快达到数据库最大容量)时创建索引,会阻止其他操作。在给密集的Collection(快达到数据库最大容量)创建索引时,索引构建完成之前,保存Collection的数据库不可用于读取或写入操作。 任何需要对所有数据库(例如listDatabases)进行读或写锁定的操作都将等待不是后台进程的索引构建完成。 ...

October 17, 2019 · 6 min · jiezi

Redis4014-Cluster-安装部署

Redis-4.0.14 Cluster 安装部署本教程安装环境是kvm虚拟机,nat模式下内网环境。这里为了节约服务器资源采用了在单实例Linux主机上进行演示。生产环境大流量下请勿将多台Redis实例部署到一台Linux服务器上(小流量也不推荐一机多redis实例)。idc机器环境下要保证网卡的并发性、云主机要选用内存型(或者内存io型)。毕竟Redis是高io服务。 Tips:如果Redis是3主3从及以上规模集群建议关闭主服务器上的bgsave操作,改为在从上进行。降低流量高峰时bgsave产生延时影响io吞吐量。Redis下载、安装 cd ~ yum install gcc gcc-c++ -y wget http://download.redis.io/releases/redis-4.0.14.tar.gz tar -zxf redis-4.0.14.tar.gz cd redis-4.0.14 cd deps make hiredis jemalloc linenoise lua geohash-int cd .. make PREFIX=/app/coohua/redis-9701 install make install将redis-cli加入系统路径中[root@redis-nec001 ~]# cp /app/coohua/redis-9701/bin/redis-cli /usr/local/bin/redis-cli[root@redis-nec001 ~]# redis-cli --versionredis-cli 4.0.14制作多副本,生产环境建议每个实例配置一个单独的服务器cd /app/coohua/mkdir -p redis-9701/confcp ~/redis-4.0.14/redis.conf ./redis-9701/conf/cp -arp redis-9701 redis-9702cp -arp redis-9701 redis-9703cp -arp redis-9701 redis-9704cp -arp redis-9701 redis-9705cp -arp redis-9701 redis-9706cp -arp redis-9701 redis-9707修改配置文件redis.conf修改或开启以下几项bind 192.168.100.214port 9701daemonize yespidfile /app/coohua/redis-9701/conf/redis_9701.pidlogfile "/data/coohua/redis-9701/redis.log"dir /data/coohua/redis-9701/maxmemory 4096Mcluster-enabled yescluster-config-file /app/coohua/redis-9701/conf/nodes-9701.conf配置ruby环境RVM方式gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDBcurl -sSL https://get.rvm.io | bash -s stablesource /etc/profile.d/rvm.shrvm install 2.6.4rvm 2.6.4 --defaultgem install rediscp ~/redis/redis-4.0.14/src/redis-trib.rb /usr/local/bin/设置系统内核参数echo never > /sys/kernel/mm/transparent_hugepage/enabledecho "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.localcp ~/redis/redis-4.0.14/src/redis-trib.rb /usr/local/bin/cat /etc/sysctl.confnet.ipv4.ip_forward = 0net.ipv4.conf.default.accept_source_route = 0kernel.core_uses_pid = 1net.bridge.bridge-nf-call-ip6tables = 0net.bridge.bridge-nf-call-iptables = 0net.bridge.bridge-nf-call-arptables = 0kernel.msgmnb = 65536kernel.msgmax = 65536kernel.shmmax = 68719476736kernel.shmall = 4294967296vm.swappiness = 0net.ipv4.neigh.default.gc_stale_time=120net.ipv4.conf.all.rp_filter=0net.ipv4.conf.default.rp_filter=0net.ipv4.conf.default.arp_announce = 2net.ipv4.conf.all.arp_announce=2net.ipv4.conf.lo.arp_announce=2net.core.somaxconn = 262144net.core.netdev_max_backlog = 262144net.ipv4.ip_local_port_range = 1024 65000net.ipv4.tcp_max_tw_buckets = 5000net.ipv4.tcp_max_orphans = 262144net.ipv4.tcp_max_syn_backlog = 262144net.ipv4.tcp_timestamps = 0net.ipv4.tcp_synack_retries = 1net.ipv4.tcp_syn_retries = 1net.ipv4.tcp_fin_timeout = 2net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_syncookies = 0net.ipv4.tcp_keepalive_time = 30net.ipv4.tcp_orphan_retries = 2kernel.core_pattern = /data/coohua/core/core_%e_%pvm.overcommit_memory = 1kernel.sysrq = 1启动Redis(以coohua用户启动) chown -R coohua:coohua /app/coohua/redis* /data/coohua/ su - coohua /app/coohua/redis-9701/bin/redis-server /app/coohua/redis-9701/conf/redis.conf /app/coohua/redis-9702/bin/redis-server /app/coohua/redis-9702/conf/redis.conf /app/coohua/redis-9703/bin/redis-server /app/coohua/redis-9703/conf/redis.conf /app/coohua/redis-9704/bin/redis-server /app/coohua/redis-9704/conf/redis.conf /app/coohua/redis-9705/bin/redis-server /app/coohua/redis-9705/conf/redis.conf /app/coohua/redis-9706/bin/redis-server /app/coohua/redis-9706/conf/redis.conf /app/coohua/redis-9707/bin/redis-server /app/coohua/redis-9707/conf/redis.conf集群创建分为3主、3主3从(这也是最少的集群数量)redis-trib.rb create --replicas 0 192.168.100.214:9701 192.168.100.214:9702 192.168.100.214:9703 #3主模式,最小节点集群,无法提供高可用.redis-trib.rb create --replicas 1 192.168.100.214:9701 192.168.100.214:9702 192.168.100.214:9703 192.168.100.214:9704 192.168.100.214:9705 192.168.100.214:9706 #主从模式,Slave从节点即是Master的备用节点也是数据的读取节点创建1个最小的3主集群[root@redis-nec001 bin]# redis-trib.rb create --replicas 0 192.168.100.214:9701 192.168.100.214:9702 192.168.100.214:9703>>> Creating cluster>>> Performing hash slots allocation on 3 nodes...Using 3 masters:192.168.100.214:9701192.168.100.214:9702192.168.100.214:9703M: fa820855aeebad6551d09d0cd6063aeaefc8f4f9 192.168.100.214:9701 slots:0-5460 (5461 slots) masterM: 517fd7f65b7e653a91b24aa7a06f1ec360bd8220 192.168.100.214:9702 slots:5461-10922 (5462 slots) masterM: ccf082f6516ec23c1aee891358a3daf47d2b5ca7 192.168.100.214:9703 slots:10923-16383 (5461 slots) masterCan I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated>>> Assign a different config epoch to each node>>> Sending CLUSTER MEET messages to join the clusterWaiting for the cluster to join..>>> Performing Cluster Check (using node 192.168.100.214:9701)M: fa820855aeebad6551d09d0cd6063aeaefc8f4f9 192.168.100.214:9701 slots:0-5460 (5461 slots) master 0 additional replica(s)M: 517fd7f65b7e653a91b24aa7a06f1ec360bd8220 192.168.100.214:9702 slots:5461-10922 (5462 slots) master 0 additional replica(s)M: ccf082f6516ec23c1aee891358a3daf47d2b5ca7 192.168.100.214:9703 slots:10923-16383 (5461 slots) master 0 additional replica(s)[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.查看集群状态[root@redis-nec001 bin]# redis-cli -h 192.168.100.214 -p 9701 -c192.168.100.214:9701> cluster nodes517fd7f65b7e653a91b24aa7a06f1ec360bd8220 192.168.100.214:9702@19702 master - 0 1568616352578 2 connected 5461-10922ccf082f6516ec23c1aee891358a3daf47d2b5ca7 192.168.100.214:9703@19703 master - 0 1568616353579 3 connected 10923-16383fa820855aeebad6551d09d0cd6063aeaefc8f4f9 192.168.100.214:9701@19701 myself,master - 0 1568616352000 1 connected 0-5460192.168.100.214:9701> 添加从节点到集群中,升级为3主3从高可用方式redis-trib.rb add-node --slave 其中 --slave表示添加的节点为从节点 其Master主节点用--master-id方式,其后是要加入的从节点ip及端口,最后是随机选择一个主节点完成命令的格式完成,不知道Redis设计时是如何思考的。非要添加一个无关紧要的参数,但是又不可少。[root@redis-nec001 coohua]# redis-trib.rb add-node --slave --master-id fa820855aeebad6551d09d0cd6063aeaefc8f4f9 192.168.100.214:9704 192.168.100.214:9701>>> Adding node 192.168.100.214:9704 to cluster 192.168.100.214:9701>>> Performing Cluster Check (using node 192.168.100.214:9701)M: fa820855aeebad6551d09d0cd6063aeaefc8f4f9 192.168.100.214:9701 slots:0-5460 (5461 slots) master 0 additional replica(s)M: 517fd7f65b7e653a91b24aa7a06f1ec360bd8220 192.168.100.214:9702 slots:5461-10922 (5462 slots) master 0 additional replica(s)M: ccf082f6516ec23c1aee891358a3daf47d2b5ca7 192.168.100.214:9703 slots:10923-16383 (5461 slots) master 0 additional replica(s)[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.>>> Send CLUSTER MEET to node 192.168.100.214:9704 to make it join the cluster.Waiting for the cluster to join.>>> Configure node as replica of 192.168.100.214:9701.[OK] New node added correctly.添加主节点分配槽位流程 主节点的添加配置略为复杂,先要将存储为空的Redis实例添加到集群,再'合理'的分配槽位给它。如果源集群是3主,又添加3主这样比较好分配,原来的节点每个分配一般槽位给新加入的节点即: 节点1分配新节点1一半 节点2分配新节点2一半 节点3分配新节点3一半非对称方式添加 前提是各主节点槽位数一致、或者接近一致现节点槽位数=总槽位数/集群节点数(包含最新的)各节点需要迁移槽位数=源各节点槽位数-现节点槽位数添加主节点redis-trib.rb add-node 192.168.100.214:9707 192.168.100.214:9701查看各主节点槽位 可以看到除了新节点外,每个主节点的槽位数基本都是5461.现节点槽位数(迁移分配后)=16384/4=4096旧主节点需要迁移槽位数=5461-4094=1365 ...

October 15, 2019 · 3 min · jiezi

MongoDB系列深入理解MongoDB聚合Aggregation

关注公众号【Ccww笔记】,领取干货资料 MongoDB中聚合(aggregate) 操作将来自多个document的value组合在一起,并通过对分组数据进行各种操作处理,并返回计算后的数据结果,主要用于处理数据(诸如统计平均值,求和等)。MongoDB提供三种方式去执行聚合操作:聚合管道(aggregation pipeline)、Map-Reduce函数以及单一的聚合命令(count、distinct、group)。 1. 聚合管道(aggregation pipeline)1.1聚合管道 聚合管道是由aggregation framework将文档进入一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的聚合结果。如图所示: 聚合管道操作: db.orders.aggregate([ { $match: { status: "A" } }, { $group: { _id: "$cust_id", total: { $sum: "$amount" } } }])&dollar;match阶段:通过status字段过滤出符合条件的Document(即是Status等于“A”的Document); &dollar;group 阶段:按cust_id字段对Document进行分组,以计算每个唯一cust_id的金额总和。1.2 管道 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数,MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。 最基本的管道功能提供过滤器filter,其操作类似于查询和文档转换,可以修改输出文档的形式。 其他管道操作提供了按特定字段或字段对文档进行分组和排序的工具,以及用于聚合数组内容(包括文档数组)的工具。 此外,管道阶段可以使用运算符执行任务,例如计算平均值或连接字符串。总结如下: 管道操作符 常用管道解析$group将collection中的document分组,可用于统计结果$match过滤数据,只输出符合结果的文档$project修改输入文档的结构(例如重命名,增加、删除字段,创建结算结果等)$sort将结果进行排序后输出$limit限制管道输出的结果个数$skip跳过制定数量的结果,并且返回剩下的结果$unwind将数组类型的字段进行拆分表达式操作符 常用表达式含义$sum计算总和,{&dollar;sum: 1}表示返回总和×1的值(即总和的数量),使用{&dollar;sum: '&dollar;制定字段'}也能直接获取制定字段的值的总和$avg求平均值$min求min值$max求max值$push将结果文档中插入值到一个数组中$first根据文档的排序获取第一个文档数据$last同理,获取最后一个数据为了便于理解,将常见的mongo的聚合操作和MySql的查询做类比: MongoDB聚合操作MySql操作/函数$matchwhere$groupgroup by$matchhaving$projectselect$sortorder by$limitlimit $sumsum()$lookupjoin1.3 Aggregation Pipeline 优化聚合管道可以确定它是否仅需要文档中的字段的子集来获得结果。 如果是这样,管道将只使用那些必需的字段,减少通过管道的数据量管道序列优化化管道序列优化化: 1).使用&dollar;projector/&dollar;addFields+&dollar;match 序列优化:当Aggregation Pipeline中有多个&dollar;projectior/&dollar;addFields阶段和&dollar;match 阶段时,会先执行有依赖的&dollar;projector/&dollar;addFields阶段,然后会新创建的$match阶段执行,如下, { $addFields: { maxTime: { $max: "$times" }, minTime: { $min: "$times" } } }, { $project: { _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1, avgTime: { $avg: ["$maxTime", "$minTime"] } } }, { $match: { name: "Joe Schmoe", maxTime: { $lt: 20 }, minTime: { $gt: 5 }, avgTime: { $gt: 7 } } }优化执行: ...

October 14, 2019 · 2 min · jiezi

Redis持久化之AOF

一、是什么以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。 二、appendonly.aof 文件配置默认关闭,开启appendonly yes优先级同时开启了rdb和aof两种模式,aof优先三、AOF启动/修复/恢复正常恢复启动:设置Yes将数据的aof文件复制一份保存到对应的目录恢复:重启redis然后重新加载异常恢复启动:设置Yes备份被写坏的AOF文件修复:Redis-check-aof --fix 进行修复恢复:重启redis然后重新加载四、Rewrite是什么AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阀值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof#appendfsync always // 每次数据变更会被立即记录到磁盘,性能差数据保存完整appendfsync everysec // 出厂默认设置,异步操作,每秒记录,一秒宕机会丢失数据#appendfsync no 重写原理 AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据内容用命令的方式重写了一个新的aof文件,这点和快照有点类似触发机制 Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍,且文件大于64M时触发auto-aof-rewrite-percentage 100 // 设置重写的基准值auto-aof-rewrite-min-size 64mb // 设置重写的基准值

October 6, 2019 · 1 min · jiezi

Redis持久化之RDB

一、是什么在指定的时间内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接读到内存中。Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束,再用这个临时文件替换上次持久化的文件,整个过程中,主进程时不进行任何IO操作的,这就是确保了极高的性能,如果需要进行大规模数据的恢复,且对于数据的完整性不是非常敏感,那RDB方式比AOF方式更加高效,RDB的缺点是最后一次持久化的数据可能丢失。 二、ForkFork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都与原进程一致,但是是一个全新的进程,并作为原进程的子进程。 三、dump.rdb文件配置这是我的配置路径如何触发RDB快照 save 900 1 // 900秒内有1次改动,则持久化一次save 300 10 // 300秒内有10次改动,则持久化一次save 60 10000 // 60秒内有10000次改动,则持久化一次以上三个任意满足一个条件即可 save 或bgsave命令执行flushall命令也会产生rdb文件,不过是空的,无意义 四、优势与劣势优势适合大规模的数据恢复对数据完整性和一致性要求不高劣势在一定间隔时间做一次备份,所以如果redis意外down的话,就会丢失最后一次快照后的所有修改。Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑。

October 6, 2019 · 1 min · jiezi

MongoDB-自动删除集合中过期的数据TTL索引

简介 TTL (Time To Live, 有生命周期的) 索引是特殊单字段索引,MongoDB可以用来在一定时间后自动从集合中删除文档的特殊索引。 这对于某些类型的数据非常好,例如机器生成的事件数据,日志和会话信息,这些信息只需要在数据库中保留一段时间。 创建 TTL 索引,只需要在使用 db.collection.createIndex() 方法,对字段值为日期或者包含日期的数组设置 expireAfterSeconds 选项即可。 1、如果字段是一个数组,并有多个日期值时,MongoDB使用最低(即最早)日期值来计算失效阈值。2、如果字段不是日期类型也不是一个包含日期的数组类型那么文档就永远不会过期。 3、如果一个文档不包含索引字段,该文档也不会到期。 示例// 创建一个 TTL 索引db.eventlog.createIndex( { "lastModifiedDate": 1 }, { expireAfterSeconds: 600 } )// 修改TTL索引的过期时间db.runCommand( { collMod: "eventlog", index: { keyPattern: { lastModifiedDate: 1 }, expireAfterSeconds: 3600 }})删除操作过期数据的删除工作是由 mongod 后台线程来执行,每60秒进行一次。 对于复制集情况, TTL 后台线程只会删除主节点上过期的数据,从节点过期文档删除则依赖主节点(从节点的 TTL 后台线程是停止状态)。 索引区别对于查询而言,TTL 索引和其他索引没有区别。 TTL索引有哪些限制单字段索引,复合索引时 expireAfterSeconds 会别忽略掉。_id 字段不支持减 TTL 索引。不能在固定集合上创建 TTL 索引,因为固定集合不支持删除操作。不能使用 createIndex() 去修改一个已存在索引的 expireAfterSeconds 。相反,可以使用collMod 命令来修改。否则,改变现有索引的选项的值,你必须删除索引,重新创建。如果一个非TTL单字段索引字段已经存在,您不能再创建一个同字段的TTL索引,因为不能创建相同键不同选项的多个索引。改变非TTL单字段索引成TTL索引,首先你必须先删除索引再现expireAfterSeconds选项创建索引。官网文档: ...

September 30, 2019 · 1 min · jiezi

阿里云HBase-Ganos全新升级推空间时空遥感一体化基础云服务

1、HBase Ganos是什么Ganos是阿里云时空PaaS服务的自研核心引擎。Ganos已作为云数据库时空引擎与数据库平台融合,建立了以自研云原生数据库POALRDB为基础,联合NoSQL大数据平台(Ali-HBASE和X-Pack Spark)的完整时空地理信息云化管理解决方案。 HBase Ganos是为PB级分布式、大规模时空数据管理而生,主打NoSQL时空大数据处理能力,兼容HBase、Spark、GeoMesa、GeoServer等广泛开源生态,内置了高效的时空索引算法、空间拓扑几何算法、遥感影像处理算法等,可广泛应用于空间/时空/遥感大数据存储、查询、分析与数据挖掘场景。 2、新版本重要特性全球首发时空栅格引擎云服务,支撑航天航空遥感云计算与智能化发展对地观测技术的快速发展正促使遥感应用走向在线化和服务化。全新的云上时空栅格数据引擎面向未来遥感大数据云端智能分析计算需求而设计,采用了极为灵活的时空数据组织方式,在保留多时相、多分辨率且每一寸像素光谱信息的同时,兼顾传统遥感应用的快速浏览需求。引擎内置的ETL工具可以打通OSS、HBase、POLARDB/PG等数据存储产品,支持栅格数据的全自动化快速入库,包含投影转换、数据分块和索引创建等。栅格数据存储组织支持多种模式,常用的包括全球标准格网剖分和本地坐标系格网剖分(见下图)。 此外,2.5版本发布全新的时空Cover数据模型。Cover模型物理上维护每一幅遥感影像的独立性,同时支持海量遥感影像基于时相和空间条件的动态拼接,逻辑上实时生成时空动态一张图,为遥感智能化分析计算应用提供强大数据模型支撑。 与X-Pack Spark、 GeoTools集成,提供兼容OGC标准的空间数据访问接口2.5版本提供了更全面的访问方式,包括基于GeoTools API的访问、支持GeoJson作为时空数据结构的REST API、以及空间GeoSQL支持,可最大程度兼容不同用户需求。其中,Ganos Spark模块提供了一系列UDF空间算子实现了基于OGC标准的GeoSQL的空间数据查询,例如: 这些空间算子主要包括Geometry Constructors函数、Geometry Accessors函数、Geometry Cast函数、Geometry Editors函数、Geometry Outputs函数、Spatial Relationships函数以及Geometry Processing函数等,算子功能将按需扩展。 支持时空几何、时空轨迹数据建模,成本、性能获得综合优化2.5版本支持丰富的时空几何数据、时空轨迹数据建模,数据类型包括点、线、面等时空对象。在此基础上,还提供了完备的时空模型操作能力,既可以支持空间范围查询,也支持“时间+空间”的多维查询。 在性能优化方面,采用了空间谓词下推技术,查询时可将空间过滤条件下推到存储层执行,从而减少I/O开销,降低查询时延。另外,结合阿里云X-Pack可构建强大的时空分析平台,借助空间分区、分区索引、基于内存索引以及Fast Spatial Jion等性能优化手段,可大幅提高查询分析性能。 在成本控制方面,针对时空数据写入膨胀的问题,新版本在索引生成、时空模型编码、冷热分离存储等方面进行了全面优化。在索引生成阶段,对索引的控制力度更细,可按需建立索引;在时空编码方面,使用了TWKB编码,同时用户可指定写入数据的精度,减少数据的存储长度;在冷热分离存储方面,借助阿里云OSS存储,可使得存储成本下降70%以上。 3、典型应用场景航天航空遥感应用对地观测、商业航天、无人机测绘等快速发展,积累了大量的遥感影像数据。数据规模的不断扩大给数据时空化组织以及大数据和智能化应用带来了极大挑战。未来需要探索数据在线、应用能力在线、用户购买服务模式。Ganos可以为云平台商、卫星数据厂商、平台服务商等构建遥感智能化大数据云平台提供时空云基础设施支撑,解决最底层关键技术,并在传统编目化管理和切片化应用基础上获得全新架构的快速演进,从而在遥感智能化浪潮中聚焦业务并获得先机。 互联网出行互联网出行涉及到运力的调度、拼车、供需预测、热力图等业务。以供需预测为例,基于对历史轨迹数据的分析,并结合实时订单数据,预测当前订单密集区域的分布,提高接单概率并减少司机空驶时间。这背后涉及到大量时空型数据和业务信息的快速读取,并结合业务算法进行预测,利用HBase Ganos可有力支持该业务场景。 传感网与实时GIS在环保、气象、水利、航海航空监测等领域,需要通过各种传感器获取天、空、地、海不同地理现象、事件、要素的全生命周期多尺度监测指标,比如污染监测、水位监测、降雨量监测、航标监测等。HBase Ganos可以为构建实时GIS大数据应用提供稳定、可靠、弹性、免运维的PaaS服务,为地理国情常态化监测和智慧城市建设提供基础平台。 车联网海量的车辆终端在不断地产生轨迹数据,轨迹数据包含了时间和空间位置。利用HBase Ganos,实时监测车辆的行驶轨迹、是否偏航、是否进入某个限制区域等。除了实时监控外,还可以进行时空查询,如查询某段时间的轨迹,某段时间进入该区域的车辆等。结合大数据分析框架(如Spark)还可以进行穿越分析、区域分布热力图等。 智慧物流与外卖递送在物流与外卖等领域,需要实时监控车辆、骑手的位置,以便进行可靠的时间预测等服务。车辆和骑手的位置需要实时上报,云端需要处理高并发写入并进行实时路径规划、偏航监测等计算,背后都需要大量的时空计算。 4、典型案例&架构航海船舶大数据平台场景:全球AIS船舶实时位置数据,每天上亿条轨迹写入,要求轨迹时空/时序查询秒级响应,具体包括:• 监管区域实时地理围栏判断;• 轨迹区域回放(指定区域+指定时间段);• 轨迹回放(指定时间段查询)。架构说明:• AIS等数据经过Spark平台清洗、融合完成后,构建数仓;• 对外提供查询的数据存储到HBase Ganos中,可供前端各类应用进行时空查询(如地理围栏、轨迹回放等);• 整体系统的查询时间在毫秒级,数据清洗在分钟级。 位置服务平台场景:实时采集车辆设备轨迹,40万+终端设备,3万+轨迹点/秒峰值;对外提供实时位置查询、地理围栏、轨迹相似度判断等服务;架构说明:• 利用POLARDB Ganos的MOD移动对象数据库保存业务、GIS和行程轨迹现势数据,而HBase Ganos保留所有历史轨迹库;• 当历史数据量较大时,可通过冷数据自动转储功能,将数据存放到OSS中,减少70%以上的成本;• 百亿量级的轨迹查询(比如查询某段时间、某空间范围内经过的轨迹)只需亚秒级;与X-Pack Spark平台无缝衔接,可以提供类似轨迹相似度、OD分析等强大功能。 遥感大数据管理与智能服务平台场景:完全在线化大规模遥感影像数据入库、查询、分析和AI智能服务。痛点:• 遥感影像数据体量大且增量快,存储、计算扩展不灵活;• 以原始文件为单位管理模式粗放,数据结构不统一,上层调用复杂;• 传统静态切片方式管理显示速度快,但光谱信息丢失,无法有效支撑实时分析场景和AI场景;• 多源空间数据融合查询分析困难。架构说明:• 原始数据采用OSS高性价比存储,冷热分离;• 影像数据库采用SQL+NoSQL构建时空序列影像,容量无上限,存储与计算分离,极致弹性;• 数据完全结构化存储和组织,保留原始像元信息,有效支撑各类分析计算场景;• 与X-Pack Spark集成,ETL与多源空间数据分析处理更便捷,可进一步集成阿里天巡平台,实现遥感AI能力集成。 ...

September 10, 2019 · 1 min · jiezi

Timestream开发最佳实践

背景Timestream模型是针对时序场景设计的特有模型,可以让用户快速完成业务代码的开发,实现相关业务需求。但是,如果业务系统不仅想实现基础的相关业务功能,还要达到最佳的性能,并且兼顾到未来的扩展性的话,就不是一件特别容易的事情。 本文会以共享汽车管理平台为例,介绍一系列的timestream最佳设计和使用,给业务设计和使用提供一些参考。关于共享汽车管理平台的场景,细节请参考:《基于Tablestore的共享汽车管理平台》。 场景和模型简介 在共享汽车管理平台这个场景中,主要是对车辆的状态轨迹监控、车俩元数据以及订单元数据进行管理。另外,还会对相关的数据进行计算分析并存储相关结果: 车辆状态轨迹:记录了车辆的状态监控,比如车速、位置、续航等数据,另外还需要记录车辆行驶过程中的违章记录,比如:是否超速、是否闯红灯等等;车辆元数据:记录车辆的基本属性信息,便于用户进行车辆检索,比如:车型、车牌、颜色等;订单元数据:订单相关信息记录,包含行程的起止时间、车辆、用户、费用等信息业务主要是对上面三部分数据进行查询和检索,满足业务场景的需求。其中车辆元数据以及状态轨迹数据是典型的时序序列,可以很方便的映射到Timestream模型中。 下图是数据模型的映射: 下面介绍一下模型设计的细节以及设计中需要注意的一些优化点,这些优化点对于业务功能以及性能上都有一定的提升。 业务模型设计在Timestream模型中,主要包含了元数据和数据点两部分数据,分别使用一个元数据表以及若干个数据表进行存储。下面介绍这两类数据在存储设计的关键点。 元数据表设计在共享汽车这个场景下,元数据表主要存储两类数据:车辆的基本信息、车辆的最近状态数据(位置、续航、状态、违章统计等),业务会根据各类信息进行多条件的组合查询符合条件的车辆。 如上图所示,Timestream的元数据表会通过多元索引来提供丰富的数据检索能力。在Timestream模型的元数据中,包含了name、tags、attributes三类数据,其中name、tags默认会提供数据检索能力,attributes则需要在创建Meta表的时候指定需要索引的attributes字段以及相关信息,默认attributes并不支持检索。需要注意的是,目前并不支持动态修改Meta表的索引字段,所以最好能在设计之初能够考虑到当前以及未来的功能需求,下面介绍一下相关信息是如何映射到模型以及相关的设计。 name设计name字段的选取是很关键的,是数据检索性能的一个重要影响因素,不同的name字段设计可能会导致查询延时相差一个数量级。name字段的选取建议满足以下条件: 绝大多数查询场景都会对该字段进行精确查询该字段单个取值下的最大记录数不宜过多,比如说不超过一千万条记录在共享汽车管理平台这个场景下,管理的是各个平台的车辆,而在车辆检索的时候,一定会指定的条件是平台的名字,并且某个平台的车辆其实也不会太多,一般也就百万量级,所以这里可以将平台作为name。 tags设计在Timestream模型中,Name和Tags可以唯一确定某个元数据,在这个场景中,唯一确定某辆车的信息是:平台、车辆ID,其中平台是name,所以,tags中只需要存储ID即可。tags设计需要注意: tags的总长度尽可能的短,只把唯一确定主体的信息放到tag中,其余信息均放到attributes中tag只支持string类型的数据,如果业务字段是数值类型,需要将其转成string进行存储attributes设计attributes是主体的可变属性,也可以用来存储主体的非唯一属性。在这个场景中,车辆的基本信息以及当前状态都是用attributes来进行存储。attributes设计关键点: 创建meta表的时候需要指定有检索需求的attributes以及相关属性,默认attributes是不支持索引的数值型数据尽可能使用int来存储,attribute支持多类型的数据,但在数据检索过程中,int类型的数据检索效率比string类型高的多,建议使用int,索引类型为LONG考虑未来系统的扩展性,可以预留一列作为扩展字段,索引类型为KEYWORD,并且是Array索引创建示例代码: public void createMetaTable() { db.createMetaTable(Arrays.asList( new AttributeIndexSchema("地区", AttributeIndexSchema.Type.KEYWORD), ... // 数值类型索引 new AttributeIndexSchema("座位", AttributeIndexSchema.Type.LONG), ... // 扩展字段,数组类型索引 new AttributeIndexSchema("配置1", AttributeIndexSchema.Type.KEYWORD).isArray() ));数据表设计Timestream可以支持多个数据表的存储,来满足不同的业务场景需求。另外,为了能够利用底层引擎所做的性能优化,我们推荐append的写入方式,即不会对已有数据进行修改,所以在以下场景中,我们建议业务将数据分到不同数据表中进行存储: 数据精度不同,特别是在监控场景下,这个需求更加突出。按数据精度分表便于后续数据的查询,如果查询长周期的数据可以去查询低精度的表,减少查询的数据量,提高查询效率需要对数据进行加工处理,也就是会对数据进行更新,建议将处理之后的数据写到另外一张表中在共享汽车这个场景中,需要对车辆的状态轨迹数据进行流式处理,比如检测是否超速等违章、车辆状态轨迹是否异常等,然后将处理之后的数据写到另外一张表中,提供给业务进行查询。 sdk使用前面介绍了业务模型设计需要注意的地方,对业务功能拓展能力以及性能都有一定的提升。下面介绍一下timestream sdk使用的一些性能优化点。 数据写入元数据元数据写入支持两种方式:put和update。其中put会删除老的记录,并且插入一个全新行;update则是对原有记录的部分attributes进行更新。建议尽量使用Put的方式进行写入。示例代码: public void writeMeta() { TimestreamIdentifier identifier = new TimestreamIdentifier.Builder("*滴") .addTag("ID", carNo) .build(); TimestreamMeta meta = new TimestreamMeta(identifier) .addAttribute("地区", "杭州") .addAttribute("座位", 4) ... .addAttribute("状态", "闲置"); // 插入车辆信息 metaWriter.put(meta);}数据点数据点写入也提供了两种方式:同步和异步。其中异步接口底层是通过TableStoreWriter进行异步写入,其写入吞吐能力更高,对写入延时不是特别敏感的业务建议使用异步方式。示例代码: ...

August 28, 2019 · 1 min · jiezi

开发进阶篇书写高效的SQL语句

调查显示,SQL是目前第二大编程语言,自诞生以来40多年一直发挥着重要的作用,有50%的开发者都在使用SQL。虽然使用非常广泛,但是SQL的质量水平却并不令人满意。 根据经验,80%的数据库问题是由于SQL引起的,而80%的SQL问题来自于20%的SQL语句,在一些高并发高负载的系统中,由于一条SQL的性能问题导致数据库整体出现异常的情况屡见不鲜。 那么,面对SQL引起的数据库问题,我们又该如何解决呢? 虽然我们都知道问题,但是该如何解决?如果你对SQL有一些了解,想必也就知道,大体有四种能力是必备的: 1.充分理解新特性的功能以及其适用场景 2.将数据整理处理作为思路 3.从一开始就考虑好这个SQL的执行计划,驱动表是谁,采用何种JOIN方式连接到被驱动表 4.严格过滤不必要的数据 可见,如果你能够拥有以上四种能力,必然可以解决SQL引起的数据库问题,也必然会成为SOL语句编写市场上极具价值、抢手的存在。 但是此刻,也许你会有个疑惑:我要如何才能拥有这些能力呢? 这也正是我们今天想要给你的答案:其实墨天轮里面一门课程可以帮你完美锻炼这四项能力,成为真正能通过SQL语句编写解决实际业务问题的稀缺人才。 这门课程就是——ACOUG 核心专家、Oracle ACE 总监,号称"Oracle 的百科全书"——杨廷琨老师主讲的《高效SQL语句编写》 至今,这门课程已经全部完结,饱受好评,想要得到解决问题的你,快戳下方链接领取99元优惠券,免费的观看学习吧(注:本课程原价99,优惠券99,课程完全免费哦~) 优惠券:https://cs.enmotech.com/invit... 领完优惠券快戳课程链接学习吧~ 课程链接:https://cs.enmotech.com/course/6接下来,我们再详细介绍下这门《高效SQL语句编写》课程凭什么可以帮你解决SQL引起的数据库问题 第一,这门课程足够系统和深入,能够让你全面的了解到SQL语句编写引起的问题,从而重视SQL的执行效率。 第二,这门课程中有众多真实需求和案例,结合理论逐一找到完美解决方案,项目组可以直接使用。 一名合格的开发人员,要成为更有价值的存在,仅仅只有单点技能,是远远不够的,你需要了解的足够全面,小到数据处理,大到执行计划的制定,你需要了解的足够全面。 基于此,帮助更多的开发人员解决SQL引起的数据库问题是《高效SQL语句编写》课程的初衷。 所以,这门课程几乎涵盖了SQL引起的数据库问题的全部知识点。(下面放上课程大纲供你参考) 第三,专业的主讲人老师,在《高效SQL语句编写》课程中,主讲老师是ACOUG 核心专家、Oracle ACE 总监,号称"Oracle 的百科全书"——杨廷琨老师 杨廷琨先生是中国地区的第一批Oracle ACE总监,也是 ITPUB 论坛上最活跃的分享者之一,他日均一篇的博客更新坚持了10年之久,影响了很多Oracle DBA和开发者的学习和成长,他在SQL开发方向的积累丰富,对于性能和效率具有深刻理解。 适用人群:需要解决SQL引起的数据库问题,从而完成从低阶到高阶的跃迁的开发人员。 还有重要的一点,就是使用优惠券观看学习可立减99元!此课程原价99,使用优惠券就是免费!数量有限(仅100张),先到先得!(优惠券使用方式:扫描下方二维码——进入优惠券页面——输入手机号,获取优惠券——注册登录——点击购买——购买成功——学习观看)以上,介绍得差不多了,抢完优惠券的话,赶快戳下方链接观看学习吧! 学习地址:https://cs.enmotech.com/course/6

July 9, 2019 · 1 min · jiezi

积压修饰最佳实践-Best-Practices-for-Backlog-Grooming

如上所述,积压修饰正在进行中。通常,这些更新是在与相关利益相关方会面时进行的。产品所有者将主持会议并让每个人查看现有的用户故事,以决定哪些可以从积压列表中删除。此时也可以添加用户故事,或者拆分用户故事以使其更易于管理。以下是一些提高进度效率的技巧。 先让较高级的项目深入敏捷倡导者Roman Pichler提出了首字母缩略词DEEP,它代表了详细的,适当的,估计的,紧急的和优先的。这些描述了管理良好的积压。 “适当详细”意味着优先级较高的项目应具有比优先级较低的项目更多的细节。应该“估计”积压项目以了解实施的成本。“紧急”表示积压是动态的,总是从想法转向完成工作。“优先排序”说明哪个项目最重要,必须在其他项目之前解决。它们位于列表的顶部,最后移动到最低优先级。 有更好的会议积压修饰 (backlog grooming) 的工作通常在会议中完成,因此更有效地开展这些会议可以提高订单的效率。因此,您并不总是要邀请所有人。唯一重要的人是产品所有者。之后,只邀请那些相关的人。如果需要来自会议中不需要的其他人的输入,则在会议之前获取该信息。 和任何会议一样,准备好了。制定一份明确规定目标的议程,并确保所有人都了解这些目标是什么以及预期如何为实现目标做出贡献。最后,保持会议简短。会议往往会很长,但最好是保持简短。知道必须做什么,并且可能每两周才会遇到一两个小时。 牢记顾客积压修饰必须遵循lodestar,指南始终是客户。将它们视为优先处理积压工作。客户可以像其他所有衡量标准一样。该产品正在为客户生产,因此客户是始终保持视线的目的地。 识别依赖关系有时会有用户故事或任务在另一个完成之前无法启动。如果未识别,这些依赖关系可能会阻止团队成员,延迟进度并阻碍团队生产力。因此,请确保在积压修饰时识别任何依赖关系。 疏理有太约两个Sprints的用户故事的量 (而不是一个Sprint)完成备份修饰会话后,应该有两个可用于团队准备工作的用户故事冲刺。通过这种方式,他们有足够的工作让他们保持参与,直到下一次积压工作,并且如果优先级发生变化團隊也可以继续补上其他工作。 倾听这个建议适用于无数的个人和专业情况,无论如何重复,它总是需要进一步关注。虽然具有既定目标的议程对于智能积压培训至关重要,但这并不意味着它是一成不变的。产品所有者必须保持开放的心态,倾听团队的意见,并根据需要进行调整。 专业在积压的修饰会议中会有不同的意见,但团队中的每个人都在努力创造最好的产品。他们可能会在如何做到这一点上发生冲突,但他们的动机是激情和经验。产品所有者或经理必须牢记这一点并对所有人采取友好行动。让每个人都听到并受到尊重,但让团队保持专注。

July 4, 2019 · 1 min · jiezi

redis专题3命令语法介绍之list

通过链表结构可以模仿队列结构与堆栈结构;关于队列结构和堆栈结构可以查看 【SPL标准库专题(6)】Datastructures:SplStack & SplQueue 增lpush key value1 value2 value3...作用: 把值插入到链表头部 rpush key value1 value2 value3...127.0.0.1:6379> rpush zimu a b c d e f(integer) 6作用: 把值插入到链接尾部 删rpop key作用: 返回并删除链表尾元素 lpop key作用: 返回并删除链表头元素 lrem key count value作用: 从key链表中删除 value值注: 删除count的绝对值个value后结束Count > 0 从表头删除Count < 0 从表尾删除 lrem key 2 b 从表头开始找b,找到就给删除,删除2个;lrem key -2 b 从表尾开始找b,找到就给删除,删除2个; 改ltrim key start stop作用: 剪切key对应的链表,切[start,stop]一段,并把该段重新赋给key lindex key index作用: 返回index索引上的值,如 lindex key 2 llen key作用:计算链接表的元素个数 ...

July 2, 2019 · 1 min · jiezi

Feed流系统设计总纲

简介差不多十年前,随着功能机的淘汰和智能机的普及,互联网开始进入移动互联网时代,最具代表性的产品就是微博、微信,以及后来的今日头条、快手等。这些移动化联网时代的新产品在过去几年间借着智能手机的风高速成长。 这些产品都是Feed流类型产品,由于Feed流一般是按照时间“从上往下流动”,非常适合在移动设备端浏览,最终这一类应用就脱颖而出,迅速抢占了上一代产品的市场空间。 Feed流是Feed + 流,Feed的本意是饲料,Feed流的本意就是有人一直在往一个地方投递新鲜的饲料,如果需要饲料,只需要盯着投递点就可以了,这样就能源源不断获取到新鲜的饲料。 在信息学里面,Feed其实是一个信息单元,比如一条朋友圈状态、一条微博、一条咨询或一条短视频等,所以Feed流就是不停更新的信息单元,只要关注某些发布者就能获取到源源不断的新鲜信息,我们的用户也就可以在移动设备上逐条去浏览这些信息单元。 当前最流行的Feed流产品有微博、微信朋友圈、头条的资讯推荐、快手抖音的视频推荐等,还有一些变种,比如私信、通知等,这些系统都是Feed流系统,接下来我们会介绍如何设计一个Feed流系统架构。 Feed流系统特点Feed流本质上是一个数据流,是将 “N个发布者的信息单元” 通过 “关注关系” 传送给 “M个接收者”。 Feed流系统是一个数据流系统,所以我们核心要看数据。从数据层面看,数据分为三类,分别是: 发布者的数据:发布者产生数据,然后数据需要按照发布者组织,需要根据发布者查到所有数据,比如微博的个人页面、朋友圈的个人相册等。关注关系:系统中个体间的关系,微博中是关注,是单向流,朋友圈是好友,是双向流。不管是单向还是双向,当发布者发布一条信息时,该条信息的流动永远是单向的。接收者的数据:从不同发布者那里获取到的数据,然后通过某种顺序(一般为时间)组织在一起,比如微博的首页、朋友圈首页等。这些数据具有时间热度属性,越新的数据越有价值,越新的数据就要排在最前面。针对这三类数据,我们可以有如下定义: 存储库:存储发布者的数据,永久保存。关注表:用户关系表,永久保存。同步库:存储接收者的时间热度数据,只需要保留最近一段时间的数据即可。设计Feed流系统时最核心的是确定清楚产品层面的定义,需要考虑的因素包括: 产品用户规模:用户规模在十万、千万、十亿级时,设计难度和侧重点会不同。关注关系(单向、双写):如果是双向,那么就不会有大V,否则会有大V存在。上述是选择数据存储系统最核心的几个考虑点,除此之外,还有一些需要考虑的:如何实现Meta和Feed内容搜索? 虽然Feed流系统本身可以不需要搜索,但是一个Feed流产品必须要有搜索,否则信息发现难度会加大,用户留存率会大幅下降。Feed流的顺序是时间还是其他分数,比如个人的喜好程度? 双向关系时由于关系很紧密,一定是按时间排序,就算一个关系很紧密的人发了一条空消息或者低价值消息,那我们也会需要关注了解的。单向关系时,那么可能就会存在大V,大V的粉丝数量理论极限就是整个系统的用户数,有一些产品会让所有用户都默认关注产品负责人,这种产品中,该负责人就是最大的大V,粉丝数就是用户规模。接下来,我们看看整个Feed流系统如何设计。Feed流系统设计上一节,我们提前思考了Feed流系统的几个关键点,接下来,在这一节,我们自顶向下来设计一个Feed流系统。 1. 产品定义第一步,我们首先需要定义产品,我们要做的产品是哪一种类型,常见的类型有: 微博类朋友圈类抖音类私信类接着,再详细看一下这几类产品的异同: 类型关注关系是否有大V时效性排序微博类单向有秒~分时间抖音类单向/无有秒~分推荐朋友圈类双向无秒时间私信类双向无秒时间上述对比中,只对比各类产品最核心、或者最根本特点,其他次要的不考虑。比如微博中互相关注后就是双向关注了,但是这个不是微博的立命之本,只是补充,无法撼动根本。 从上面表格可以看出来,主要分为两种区分: 关注关系是单向还是双向: 如果是单向,那么可能就会存在大V效应,同时时效性可以低一些,比如到分钟级别;如果是双向,那就是好友,好友的数量有限,那么就不会有大V,因为每个人的精力有限,他不可能主动加几千万的好友,这时候因为关系更精密,时效性要求会更高,需要都秒级别。排序是时间还是推荐: 用户对feed流最容易接受的就是时间,目前大部分都是时间。但是有一些场景,是从全网数据里面根据用户的喜好给用户推荐和用户喜好度最匹配的内容,这个时候就需要用推荐了,这种情况一般也会省略掉关注了,相对于关注了全网所有用户,比如抖音、头条等。确定了产品类型后,还需要继续确定的是系统设计目标:需要支持的最大用户数是多少?十万、百万、千万还是亿?用户数很少的时候,就比较简单,这里我们主要考虑 亿级用户 的情况,因为如果系统能支持亿级,那么其他量级也能支持。为了支持亿级规模的用户,主要子系统选型时需要考虑水平扩展能力以及一些子系统的可用性和可靠性了,因为系统大了后,任何一个子系统的不稳定都很容易波及整个系统。 2. 存储我们先来看看最重要的存储,不管是哪种同步模式,在存储上都是一样的,我们定义用户消息的存储为存储库。存储库主要满足三个需求: 可靠存储用户发送的消息,不能丢失。否则就找不到自己曾经发布到朋友圈状态了。读取某个人发布过的所有消息,比如个人主页等。数据永久保存。所以,存储库最重要的特征就是两点: 数据可靠、不丢失。由于数据要永久保存,数据会一直增长,所以要易于水平扩展。综上,可以选为存储库的系统大概有两类: 特点分布式NoSQL关系型数据库(分库分表)可靠性极高高水平扩展能力线性需要改造水平扩展速度毫秒无常见系统Tablestore、BigtableMySQL、PostgreSQL对于可靠性,分布式NoSQL的可靠性要高于关系型数据库,这个可能有违很多人的认知。主要是关系型数据库发展很长时间了,且很成熟了,数据放在上面大家放心,而分布式NoSQL数据库发展晚,使用的并不多,不太信任。但是,分布式NoSQL需要存储的数据量更多,对数据可靠性的要求也加严格,所以一般都是存储三份,可靠性会更高。目前在一些云厂商中的关系型数据库因为采用了和分布式NoSQL类似的方式,所以可靠性也得到了大幅提高。水平扩展能力:对于分布式NoSQL数据库,数据天然是分布在多台机器上,当一台机器上的数据量增大后,可以通过自动分裂两部分,然后将其中一半的数据迁移到另一台机器上去,这样就做到了线性扩展。而关系型数据库需要在扩容时再次分库分表。所以,结论是: 如果是自建系统,且不具备分布式NoSQL数据库运维能力,且数据规模不大,那么可以使用MySQL,这样可以撑一段时间。如果是基于云服务,那么就用分布式NoSQL,比如Tablestore或Bigtable。如果数据规模很大,那么也要用分布式NoSQL,否则就是走上一条不归路。如果使用Tablestore,那么存储库表设计结构如下: 主键列第一列主键第二列主键属性列属性列列名user_idmessage_idcontentother解释消息发送者用户ID消息顺序ID,可以使用timestamp。内容其他内容到此,我们确定了存储库的选型,那么系统架构的轮廓有了: 3. 同步系统规模和产品类型,以及存储系统确定后,我们可以确定同步方式,常见的方式有三种: 推模式(也叫写扩散):和名字一样,就是一种推的方式,发送者发送了一个消息后,立即将这个消息推送给接收者,但是接收者此时不一定在线,那么就需要有一个地方存储这个数据,这个存储的地方我们称为:同步库。推模式也叫写扩散的原因是,一个消息需要发送个多个粉丝,那么这条消息就会复制多份,写放大,所以也叫写扩散。这种模式下,对同步库的要求就是写入能力极强和稳定。读取的时候因为消息已经发到接收者的收件箱了,只需要读一次自己的收件箱即可,读请求的量极小,所以对读的QPS需求不大。归纳下,推模式中对同步库的要求只有一个:写入能力强。拉模式(也叫读扩散):这种是一种拉的方式,发送者发送了一条消息后,这条消息不会立即推送给粉丝,而是写入自己的发件箱,当粉丝上线后再去自己关注者的发件箱里面去读取,一条消息的写入只有一次,但是读取最多会和粉丝数一样,读会放大,所以也叫读扩散。拉模式的读写比例刚好和写扩散相反,那么对系统的要求是:读取能力强。另外这里还有一个误区,很多人在最开始设计feed流系统时,首先想到的是拉模式,因为这种和用户的使用体感是一样的,但是在系统设计上这种方式有不少痛点,最大的是每个粉丝需要记录自己上次读到了关注者的哪条消息,如果有1000个关注者,那么这个人需要记录1000个位置信息,这个量和关注量成正比的,远比用户数要大的多,这里要特别注意,虽然在产品前期数据量少的时候这种方式可以应付,但是量大了后就会事倍功半,得不偿失,切记切记。推拉结合模式:推模式在单向关系中,因为存在大V,那么一条消息可能会扩散几百万次,但是这些用户中可能有一半多是僵尸,永远不会上线,那么就存在资源浪费。而拉模式下,在系统架构上会很复杂,同时需要记录的位置信息是天量,不好解决,尤其是用户量多了后会成为第一个故障点。基于此,所以有了推拉结合模式,大部分用户的消息都是写扩散,只有大V是读扩散,这样既控制了资源浪费,又减少了系统设计复杂度。但是整体设计复杂度还是要比推模式复杂。用图表对比: 类型推模式拉模式推拉结合模式写放大高无中读放大无高中用户读取延时毫秒秒秒读写比例1:9999:1~50:50系统要求写能力强读能力强读写都适中常见系统Tablestore、Bigtable等LSM架构的分布式NoSQLRedis、memcache等缓存系统或搜索系统(推荐排序场景)两者结合架构复杂度简单复杂更复杂介绍完同步模式中所有场景和模式后,我们归纳下: 如果产品中是双向关系,那么就采用推模式。如果产品中是单向关系,且用户数少于1000万,那么也采用推模式,足够了。如果产品是单向关系,单用户数大于1000万,那么采用推拉结合模式,这时候可以从推模式演进过来,不需要额外重新推翻重做。永远不要只用拉模式。如果是一个初创企业,先用推模式,快速把系统设计出来,然后让产品去验证、迭代,等客户数大幅上涨到1000万后,再考虑升级为推拉集合模式。如果是按推荐排序,那么是另外的考虑了,架构会完全不一样,这个后面专门文章介绍。如果选择了Tablestore,那么同步库表设计结构如下: 主键列第一列主键第二列主键属性列属性列属性列列名user_idsequence_idsender_idmessage_idother解释消息接收者用户ID消息顺序ID,可以使用timestamp + send_user_id,也可以直接使用Tablestore的自增列。发送者的用户IDstore_table中的message_id列的值,也就是消息ID。通过sender_id和message_id可以到store_table中查询到消息内容其他内容,同步库中不需要包括消息内容。确定了同步库的架构如下: 4. 元数据前面介绍了同步和存储后,整个Feed流系统的基础功能完成了,但是对于一个完整Feed流产品而言,还缺元数据部分,接下来,我们看元数据如何处理: Feed流系统中的元数据主要包括: 用户详情和列表。关注或好友关系。推送session池。我们接下来逐一来看。 4.1 用户详情和列表 主要是用户的详情,包括用户的各种自定义属性和系统附加的属性,这部分的要求只需要根据用户ID查询到就可以了。 可以采用的分布式NoSQL系统或者关系型数据库都可以。 如果使用NoSQL数据库Tablestore,那么用户详情表设计结构如下: 主键顺序第一列主键属性列-1属性列-2......字段名user_idnick_namegenderother备注主键列,用于唯一确定一个用户用户昵称,用户自定义属性用户性别,用户自定义属性其他属性,包括用户自定义属性列和系统附加属性列。Tablestore是FreeSchema类型的,可以随时在任何一行增加新列而不影响原有数据。4.2 关注或好友关系 这部分是存储关系,查询的时候需要支持查询关注列表或者粉丝列表,或者直接好友列表,这里就需要根据多个属性列查询需要索引能力,这里,存储系统也可以采用两类,关系型、分布式NoSQL数据库。 如果已经有了关系型数据库了,且数据量较少,则选择关系型数据库,比如MySQL等。如果数据量比较大,这个时候就有两种选择: 需要分布式事务,可以采用支持分布式事务的系统,比如分布式关系型数据库。使用具有索引的系统,比如云上的Tablestore,更简单,吞吐更高,扩容能力也一并解决了。如果使用Tablestore,那么关注关系表设计结构如下: Table:user_relation_table 主键顺序第一列主键第一列主键属性列属性列Table字段名user_idfollow_user_idtimestampother备注用户ID粉丝用户ID关注时间其他属性列多元索引的索引结构: Table字段名user_idfollow_user_idtimestamp是否Index是是是是否enableSortAndAgg是是是是否store是是是查询的时候: 如果需要查询某个人的粉丝列表:使用TermQuery查询固定user_id,且按照timestamp排序。如果需要查询某个人的关注列表:使用TermQuery查询固定follow_user_id,且按照timestamp排序。当前数据写入Table后,需要5~10秒钟延迟后会在多元索引中查询到,未来会优化到2秒以内。除了使用多元索引外,还可以使用GlobalIndex。4.3 推送session池 ...

July 2, 2019 · 1 min · jiezi

redis专题2命令语法介绍之string

REDIS有6大数据结构:string,link,sortedset,sets,hash,Geo。 这6个结构我将用6篇文章来记录各自是怎么用的,然后再用一篇文章来说一下各自的应用场景; string增set key value [ex 秒数] / [px 毫秒数] [nx] /[xx] set a 1 ex 10 , 10秒有效Set a 1 px 9000 , 9秒有效将key和value对应。如果key已经存在了,它会被覆盖,而不管它是什么类型。 注: 如果ex,px同时写,以后面的有效期为准如 set a 1 ex 100 px 9000, 实际有效期是9000毫秒(9秒) nx: 表示key不存在时,执行操作xx: 表示key存在时,执行操作 mset multi setmset key1 v1 key2 v2 ....一次性设置多个键值 删删除一个key并返回key的数量 del key# Exampleredis> SET key2 "World"OKredis> DEL key1 key2 key3(integer) 2redis>改rename oldkey newskey将key重命名为newkey,如果key与newkey相同,将返回一个错误。如果newkey已经存在,则值将被覆盖。 renamenx oldkey newskeynx -> not exits 当且仅当 newkey 不存在时,将 key 改名为 newkey 。当 key 不存在时,返回一个错误。 ...

June 30, 2019 · 2 min · jiezi

redis专题1安装与启动

简介REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo(redis之父)写的key-value存储系统。Redis提供了一些丰富的数据结构,包括 lists, sets, ordered sets 以及 hashes还有和Memcached一样的strings结构.Redis当然还包括了对这些数据结构的丰富操作。 总之它具有以下特点: 数据结构丰富持久化支持简单事务主从配置方便redis和memcached相比redis可以用来做存储(storge), 而memccached只能用来做缓存(cache),这个特点主要因为其有"持久化"的功能.存储的数据有"结构",对于memcached来说,存储的数据,只有1种类型--"字符串",而redis则可以存储字符串,链表,哈希结构,集合,有序集合.安装Linux(centOS)下安装rediswget http://download.redis.io/releases/redis-3.0.7.tar.gztar zxvf redis-3.0.7.tar.gzcd redis-3.0.7# 源码是官方configure过的,这个地方可以跳过configure,直接make,但是在make的时候有可能遇到时间错误,原因是源码是在官方configure时,生成的文件有时间戳信息,Make只能发生在configure之后,如果虚拟机时间不对的话,就要重写时间# date -s 'yyyy-mm-dd hh:mm:ss'# clock -wmake PREFIX=/usr/local/redis install # 注意PREFIX是大写# 可选步骤 make test 测试编译情况安装完成之后得到以下几个文件: redis-benchmark 性能测试工具redis-check-aof 日志文件检测工具(比如断电造成日志损坏,可以检测并修复)redis-check-dump 快照文件检测工具,效果类上redis-cli 客户端redis-server 服务端Linux(centOS)下php-redis扩展编译到pecl.php.net 搜索redis下载stable版(稳定版)扩展解压进入,执行/php/path/bin/phpize (作用是检测PHP的内核版本,并为扩展生成相应的编译配置)./configure --with-php-config=/usr/bin/php-configmake && make install编译完以后最后一行 Installing shared extensions: /usr/lib/php/modules/告之扩展在哪里;然后在php.ini中添加既可;[info] 也可以直接使用compose包predis/prediswindows下安装redis不建议在windows上使用,如果因为开发等因素的确需要安装的话,主要参考以下链接安装即可 redis在windows下的安装:http://www.cnblogs.com/linjiq... php-redis扩展的安装:http://blog.chinaunix.net/uid... redis的githubhttps://github.com/dmajkic/re... php-redis.dll的githubhttps://github.com/nicolasff/... 启动启动服务让redis以后台进程的形式运行,编辑conf配置文件,修改如下内容:daemonize yes /path/redis-server /path/redis.conf #这里的conf可以自由指定,可以先通过 --help来看一下启动客户端path/to/redis/bin/redis-cli [-h localhost -p 6379 ] # 如果是要在redis的shell中显示中文的话可以加上 --raw 启动

June 29, 2019 · 1 min · jiezi

墨天轮DBASK技术专家邀请函

各位数据库管理员、工程师们: 大家好,感谢大家一直以来对墨天轮DBASK的支持。DBASK 是一个开放、互助、便捷的数据库问答社区。在遇到任何数据库疑难杂症都可在DBASK上提问,平台认证的技术专家免费在线解答,最后归档沉淀为一个开放的知识库。 最近注意到Oracle官方文档中部分视图已经没有了说明,MOS上很多文档也隐藏了起来,开源公司不断被资本收购,但是我们始终向往构建一个开放开源、互帮互助的社区环境。 现在诚挚邀请您成为DBASK的技术专家,与我们一起讨论交流回复数据库相关问题,创建一个开放互助的数据库技术社区。 另外,近几年来,TiDB、达梦、巨杉等国产数据库也在不断成长,砥砺前行,还有阿里、华为等云上数据库作为新兴力量的加入,相信未来国产数据库一定会大有作为。另外,我们也会陆续在DBASK中开放国产数据库的专区,特别欢迎国产数据库相关的专家入驻DBASK,为国产数据库添砖加瓦! 专家权利:a.可以看到平台上所有的问题,参与讨论或者学习b.身份象征:平台标注技术专家的标识c.定期邀请您参加我们的线下专家交流会d.赠送技术嘉年华等大会门票、文化衫、书籍e.在 DBASK上回答问题、上传技术文档等可以获得墨值,墨值可用于兑换话费、京东卡等等 (PS:成为专家后自动赠送50墨值)。 DBASK小程序: 随着用户的不断增多,为了用户使用更方便,DBASK发布了微信小程序。小程序的发布可以让大家随时随地提问,专家也可在小程序内即时回复,减少了提问的门槛,加快问题交互的流程。另外可以在微信小程序中浏览知识库,方便查找学习相关问题。 DBASK常驻专家团下面是墨天轮DBASK常驻专家团队(其中囊括了国内IT服务商中绝大部分的Oracle ACE和Oracle ACE总监级别的技术专家)。我们特别欢迎数据库管理员、工程师们入驻DBASK,为墨天轮DBASK专家团队注入新鲜的血液。 如何成为DBASK技术专家?网页登录DBASK:https://cs.enmotech.com/issue,点击右上角【申请成为专家】。即可加入墨天轮DBASK专家团队!(PS:审核通过后须重新登录)

June 18, 2019 · 1 min · jiezi

10分钟搞懂亿级用户的分布式数据存储解决方案

分布式数据库和分布式存储是分布式系统中难度最大、挑战最大,也是最容易出问题的地方。互联网公司只有解决分布式数据存储的问题,才能支撑更多次亿级用户的涌入。 接下来,你将花费十分钟掌握以下三方面内容: 1、MySQL复制:包括主从复制和主主复制; 2、数据分片:数据分片的原理、分片的方案、分片数据库的扩容; 3、数据库分布式部署的几种方案。 一、MySQL复制 1.MySQL的主从复制 MySQL的主从复制,就是将MySQL主数据库中的数据复制到从数据库中去。 主要目的是实现数据库读写分离,写操作访问主数据库,读操作访问从数据库,从而使数据库具有更强大的访问负载能力,支撑更多的用户访问。 它的主要的复制原理是:当应用程序客户端发送一条更新命令到数据库的时候,数据库会把这条更新命令同步记录到Binlog中,然后由另外一个线程从Binlog中读取这条日志,然后通过远程通讯的方式将它复制到从服务器上面去,从服务器获得这条更新日志后,将其加入到自己的Relay log中,然后由另外一个SQL执行线程从Relay log中读取这条新的日志,并把它在本地的数据库中重新执行一遍。 这样当客户端应用程序执行一个update命令的时候,这个命令会在主数据库和从数据库上同步执行,从而实现了主数据库向从数据库的复制,让从数据库和主数据库保持一样的数据。 2.MySQL的一主多从复制 MySQL的主从复制是一种数据同步机制,除了可以将一个主数据库中的数据同步复制到一个从数据库上,还可以将一个主数据库上的数据同步复制到多个从数据库上,也就是所谓的MySQL的一主多从复制。 多个从数据库关联到主数据库后,将主数据库上的Binlog日志同步地复制到了多个从数据库上。通过执行日志,让每个从数据库的数据都和主数据库上的数据保持了一致。这里面的数据更新操作表示的是所有数据库的更新操作,除了不包括SELECT之类的查询读操作,其他的INSERT、DELETE、UPDATE这样的DML写操作,以及CREATE TABLE、DROPT ABLE、ALTER TABLE等DDL操作也都可以同步复制到从数据库上去。 3.一主多从复制的优点 一主多从复制有四大优点,分别是分摊负载、专机专用、便于冷备和高可用。 a.分摊负载 将只读操作分布在多个从数据库上,从而将负载分摊到多台服务器上。 b.专机专用 可以针对不同类型的查询,使用不同的从服务器。 c.便于进行冷备 即使数据库进行了一主多从的复制,在一些极端的情况下。也可能会导致整个数据中心的数据服务器都丢失。所以通常说来很多公司会对数据做冷备,但是进行冷备的时候有一个困难点在于,数据库如果正在进行写操作,冷备的数据就可能不完整,数据文件可能处于损坏状态。使用一主多从的复制就就可以实现零停机时间的备份。只需要关闭数据的数据复制进程,文件就处于关闭状态了,然后进行数据文件拷贝,拷贝完成后再重新打开数据复制就可以了。 d.高可用 如果一台服务器宕机了,只要不发请求给这台服务器就不会出问题。当这台服务器恢复的时候,重新发请求到这台服务器。所以,在一主多从的情况下,某一台从服务器宕机不可用,对整个系统的影响是非常小的。 4.MySQL的主主复制 但是一主多从只能够实现从服务器上的这些优点,当主数据库宕机不可用的时候,数据依然是不能够写入的,因为数据不能够写入到从服务器上面去,从服务器是只读的。 为了解决主服务器的可用性问题,我们可以使用MySQL的主主复制方案。所谓的主主复制方案是指两台服务器都当作主服务器,任何一台服务器上收到的写操作都会复制到另一台服务器上。 如上主主复制原理图,当客户端程序对主服务器A进行数据更新操作的时候,主服务器A会把更新操作写入到Binlog日志中。然后Binlog会将数据日志同步到主服务器B,写入到主服务器的Relay log中,然后执Relay log,获得Relay log中的更新日志,执行SQL操作写入到数据库服务器B的本地数据库中。B服务器上的更新也同样通过Binlog复制到了服务器A的Relay log中,然后通过Relay log将数据更新到服务器A中。 通过这种方式,服务器A或者B任何一台服务器收到了数据的写的操作都会同步更新到另一台服务器,实现了数据库主主复制。主主复制可以提高系统的写可用,实现写操作的高可用。 5.MySQL的主主失效恢复 使用MySQL服务器实现主主复制时,数据库服务器失效该如何应对? 正常情况下用户会写入到主服务器A中,然后数据从A复制到主服务器B上。当主服务器A失效的时候,写操作会被发送到主服务器B中去,数据从B服务器复制到A服务器。 主主失效的维护过程如下: 最开始的时候,所有的主服务器都可以正常使用,当主服务器A失效的时候,进入故障状态,应用程序检测到主服务器A失效,检测到这个失效可能需要几秒钟或者几分钟的时间,然后应用程序需要进行失效转移,将写操作发送到备份主服务器B上面去,将读操作发送到B服务器对应的从服务器上面去。 一段时间后故障结束,A服务器需要重建失效期间丢失的数据,也就是把自己当作从服务器从B服务器上面去同步数据。同步完成后系统才能恢复正常。这个时候B服务器是用户的主要访问服务器,A服务器当作备份服务器。 5.MySQL复制注意事项 使用MySQL进行主主复制的时候需要注意的事项如下: a.不要对两个数据库同时进行数据写操作,因为这种情况会导致数据冲突。 b.复制只是增加了数据的读并发处理能力,并没有增加写并发的能力和系统存储能力。 c.更新数据表的结构会导致巨大的同步延迟。 需要更新表结构的操作,不要写入到到Binlog中,要关闭更新表结构的Binlog。如果要对表结构进行更新,应该由运维工程师DBA对所有主从数据库分别手工进行数据表结构的更新操作。 二、数据分片 数据复制只能提高数据读并发操作能力,并不能提高数据写操作并发的能力以及数据整个的存储容量,也就是并不能提高数据库总存储记录数。如果我们数据库的写操作也有大量的并发请求需要满足,或者是我们的数据表特别大,单一的服务器甚至连一张表都无法存储。解决方案就是数据分片。 1.数据分片介绍 a.主要目标:将一张数据表切分成较小的片,不同的片存储到不同的服务器上面去,通过分片的方式使用多台服务器存储一张数据表,避免一台服务器记录存储处理整张数据表带来的存储及访问压力。 b.主要特点:数据库服务器之间互相独立,不共享任何信息,即使有部分服务器故障,也不影响整个系统的可用性。第二个特点是通过分片键定位分片,也就是说一个分片存储到哪个服务器上面去,到哪个服服务器上面去查找,是通过分片键进行路由分区算法计算出来的。在SQL语句里面,只要包含分片键,就可以访问特定的服务器,而不需要连接所有的服务器,跟其他的服务器进行通信。 c.主要原理:将数据以某种方式进行切分,通常就是用刚才提到的分片键的路由算法。通过分片键,根据某种路由算法进行计算,使每台服务器都只存储一部分数据。 2.硬编码实现数据分片 如图例子,通过应用程序硬编码的方式实现数据分片。假设我们的数据库将数据表根据用户ID进行分片,分片的逻辑是用户ID为奇数的数据存储在服务器2中,用户ID为偶数的数据存储在服务器1中。那么,应用程序在编码的时候,就可以直接通过用户ID进行哈希计算,通常是余数计算。如果余数为奇数就连接到服务器2上,如果余数为偶数,就连接到服务器1上,这样就实现了一张用户表分片在两个服务器上。 这种硬编码主要的缺点在于,数据库的分片逻辑是应用程序自身实现的,应用程序需要耦合数据库分片逻辑,不利于应用程序的维护和扩展。一个简单的解决办法就是将映射关系存储在外面。 3.映射表外部存储 应用程序在连接数据库进行SQL操作的时候,通过查找外部的数据存储查询自己应该连接到哪台服务器上面去,然后根据返回的服务器的编号,连接对应的服务器执行相应的操作。在这个例子中,用户ID=33查找服务器是2,用户ID=94查找服务器也是2,它们根据查找到的用户服务器的编号,连接对应的服务器,将数据写入到对应的服务器分片中。 4.数据分片的挑战及解决方案 数据库分片面临如图的挑战: 现在有一些专门的分布式数据库中间件来解决上述这些问题,比较知名的有Mycat。Mycat是一个专门的分布式数据库中间件,应用程序像连接数据库一样的连接Mycat,而数据分片的操作完全交给了Mycat去完成。 如下这个例子中,有3个分片数据库服务器,数据库服务器dn1、dn2和dn3,它们的分片规则是根据prov字段进行分片。那么,当我们执行一个查询操作”select * from orders where prov=‘wuhan’“的时候,Mycat会根据分片规则将这条SQL操作路由到dn1这个服务器节点上。dn1执行数据查询操作返回结果后,Mycat再返回给应用程序。通过使用Mycat这样的分布式数据库中间件,应用程序可以透明的无感知的使用分片数据库。同时,Mycat还一定程度上支持分片数据库的联合join查询以及数据库事务。 ...

June 12, 2019 · 1 min · jiezi

NoSQL-数据库不应该放弃-Consistency

本文发于infoq,https://www.infoq.cn/article/rhzs0KI2G*Y2r9PMdeNv 。转回自己的博客。 谈到 NoSQL,一定会提及一致性(Consistency),按照 CAP 定理,有些 NoSQL 数据库放弃了一致性,但是 NoSQL 放弃是必然的选择吗? 从 1970’s,关系型数据库(RDB,Relational Database)被发明以来,关系型数据库就是构建应用的通常的选择。关系型数据库对用户提供 ACID 保证,非常方便开发者使用。从 1990’s 开始,NoSQL 系统开始出现。NoSQL 系统是一类对立于关系数据库的数据库系统,他们从架构上放弃了传统的关系型数据库的的关系模型和 SQL 的接口。 与 NoSQL 系统相伴而来的 2 个词是 BASE 和 CAP,这 2 个词对分布式系统有着非常深远的影响。我相信就是在这 2 个词的影响下,很多 NoSQL 系统从架构的初始就放弃了一致性(consistency)选择了一种最终一致性(Eventual consistency)和可用性 (Availability)。虽然我非常认同 CAP 和 BASE 这 2 个词,但是我不认为在 CAP 和 BASE 的作用下,NoSQL 系统选择放弃一致性是一个必然的事情。 首先来回顾一下 CAP 和 BASE 这 2 个概念的历史。这 2 个概念都是由 Eric Brewer 提出的,Brewer 目前是 Google 公司的基础设施部门(Infrastructure)的副总裁(VP,Vice President)。在 1997 年,在 SOSP(Symposium on Operating Systems Principles) 上,名为的演讲 [1] 总结了 Brewer 等人的近期工作,演讲中说他们正在工作的集群服务并没有采用当时公认的具有 ACID 特性的关系型数据库作为架构,而是在架构上放弃了关系型数据库的 ACID 特性。并且为他们的这个架构选择构造了一个新的词 BASE,BASE 这个词的选择有刻意为之成分,ACID 在英语里有酸性的意思,而 BASE 有碱性的意思,很明显 BASE 是与?ACID 对立的。 ...

June 12, 2019 · 2 min · jiezi

FortuneCommons正式开源啦

Fortune Commons 是笔者在工作以来的一些技术积累,虽然是很[低端],但是对于Java入门或者初入Java开发的工作者来说,也是一个不错的学习资源,今天特地整合出来。Github地址:https://github.com/landy8530/... 版本说明版本约束Spring:5.x+JDK:1.8+版本计划为适应目前国内各个行业不同的技术分布,目前计划三个大版本的计划,说明如下: 版本功能说明1.x数据缓存处理和excel/pdf导出组件,集成Spring MVC2.x数据缓存处理和excel/pdf导出组件,集成Restful API3.x数据缓存处理和excel/pdf导出组件,集成Restful API,并且计划加入Spring Boot/Spring Cloud等注意:以上各个版本都可以增加其他组件。 工程说明目前最新版本为v1.0.x,含有以下子工程(子模块),分别说明如下(也可参考wiki): commons-core主要是本项目所需的一些核心功能实现,比如BeanCopier工具封装,读取yml文件工具,Freemarker解析实现,ApplicationContext工具类,Spring容器初始化后统一操作的listener实现以及其他一些工具类支持。 commons-datacache本模块动态实现了各主流缓存中间件的实现,可以自由切换,依赖于commons-nosql模块。目前实现了以下几种: 本地内存(Memory)MongodbMemcachedRedis(即将实现)commons-nosqlNoSql模拟关系型数据库的CRUD操作,目前有Mongodb实现。 commons-export实现了excel和pdf导出组件 commons-web封装了web端常见的一些配置操作 commons-web-springmvc封装了spring mvc的一些配置操作,依赖于commons-web子模块。 fortune-commons-example本项目的演示模块,主要是用于测试用途。 如何对该开源项目进行贡献代码大多是手敲,所以难免会有错误,你可以帮我Bug,提交issues或者PR。很多知识点我可能没有涉及到,所以你可以对其他知识点进行补充或者加入其他的组件。为了使项目更加的透明化,便利化,也可以参与wiki的编写工作。为什么要做这个开源组件?初始想法源于自己工作中遇到的各种坑,主要目的是为了通过这个开源平台来帮助一些在学习 Java 或者直接在自己公司中使用或者扩展自己的项目。 Git操作说明切换分支fork本工程后可以按照如下操作即可, 切换到master分支,并且更新最新远程库中的代码 git checkout mastergit pull/git fetch创建分支创建自己的本地分支,以master为源创建 git checkout -b fortune-commons-export查看是否创建成功 git branch fortune-commons-beanutils* fortune-commons-export fortune-commons-memcached master星号(*)表示当前所在分支。现在的状态是成功创建的新的分支并且已经切换到新分支上。 同步分支把新建的本地分支push到远程服务器,远程分支与本地分支同名(当然可以随意起名) git push origin fortune-commons-export:fortune-commons-export创建标签git tag -a v1.0.1 -m "fortune commons v1.0.1"git push origin v1.0.1

May 26, 2019 · 1 min · jiezi

BigData-NoSQL-ApsaraDB-HBase数据存储与分析平台概览

一、引言时间到了2019年,数据库也发展到了一个新的拐点,有三个明显的趋势: 越来越多的数据库会做云原生(CloudNative),会不断利用新的硬件及云本身的优势打造CloudNative数据库,国内以阿里云的Cloud HBase、POLARDB为代表,此块文章会有一定的引述,但不是本文的重点。NoSQL正在解决BigData领域的问题。根据Forrester NoSQL的报告,BigData NoSQL是提供 存储、计算处理、支持水平扩展、Schemaless以及灵活的数据模型,特别提到需要支持复杂计算,一般通过集成Spark或者实现单独的计算引擎实现。Cassandra商业化公司Datastax提供的产品是直接在Cassandra之上集成了Spark,另外ScyllaDB公司首页的宣传语就是The Real-Time Big Data Database。大数据的5V特性,包括 Volume:数据量大,包括采集、存储和计算的量都非常大;Variety:种类和来源多样化,包括结构化、半结构化和非结构化数据;Value:数据价值密度相对较低,或者说是浪里淘沙却又弥足珍贵;Velocity:数据增长速度快,处理速度也快,时效性要求高;Veracity:数据的准确性和可信赖度,即数据的质量需要高。5V特性可以使用BigData NoSQL数据库很好的满足,且又能满足实时的写入,分析及展现。越来越多的公司或者产品都是融合多个能力,Strapdata公司把Cassandra及ElasticSearch的能力融合在一起;Datastax直接在Cassandra之上集成了Spark;SQLServer也是融合了Spark,打造Native Spark满足DB计算能力外延的商业诉求。阿里云HBase经过公共云两年(单独的HBase在阿里内部已经发展快9年)的发展,融合开源Apache HBase、Apache Phoenix、Apache Spark、Apache Solr等开源项目,再加上一系列自研特性,满足 【一体化数据处理平台,提供一站式能力】 , 基本架构如下: 我们是站在Apache巨人的肩膀上,自研了 ApsaraDB Filesystem、HBase冷热分离、SearchIndex、SparkOnX、BDS等模块,优化了HBase、Phoenix、Spark等内核一些patch,并反馈到社区,维护打造了多模服务、数据工作台等一些列的平台能力。自研部分是我们平台核心的核心竞争力,每一层每一个组件都是我们精心打造,满足客户数据驱动业务的实际需求。为了降低客户的准入门槛,我们在Github上提供了Demo支持:aliyun-apsaradb-hbase-demo,欢迎大家关注,并贡献代码。接下来笔者会介绍各层,力求简单通俗,文中有大量的链接以衍生阅读。 二、业务视角及数据流作为一个存储计算平台,价值在满足不同的业务需求。见下图:此图描述了数据的来源、通道到沉淀到云HBase平台,再通过平台提供的Spark引擎去挖掘价值反馈给业务系统。此类似一个循环系统,在阿里内部形象称为【业务数据化,再数据业务化】。 结合架构图及业务图,此平台融合了 存储(包括实时存储及离线存储)、计算、检索等技术。整个系统都打造在ApsaraDB Filesystem统一文件层之上,把检索通过Phoenix的SearchIndex包装以降低易用性,打造领域引擎满足领域的需求,内置BDS(数据通道)实时归档数据到列存,再通过Spark引擎挖掘价值。详细参考:【选择阿里云数据库HBase版十大理由】 三、统一文件访问层ApsaraDB Filesystem(简称ADB FS)以Hadoop FileSystem API为基础构建了云HBase生态文件层底座。面向HBase生态提供了无感知的混合存储能力,极大简化了HBase生态接入云端多存储形态的复杂环境。支持OSS、阿里云HDFS、基于云盘或者本地盘构建的HDFS以及基于共享云盘构建的系统。每种分布式文件系统所用的硬件不同、成本不同、延迟不同、吞吐量不同(这里不展开)。我们可以不断扩展,只要添加一个实现xxxFileSystem即可。基于OSS直接实现的FS是无法具备原子性的元数据管理能力的,实现方案是在HDFS的namenode存元数据,实际的存储存放在OSS之上。对Rename操作只需要移动元数据,所以非常轻量。 四、HBase KV层HBase是基于Bigtable在hadoop社区的开源实现,提供了如:稀疏宽表、TTL、动态列等特性。HBase在阿里已经发展9年,已经有数位PMC及Committer,可以说在国内阿里在HBase的影响力还是数一数二的。社区也有不少的Patch也是阿里贡献。在18年,云HBase首家商业化了HBase2.0,并贡献了数十个BugFix给社区。有不少客户单独使用HBase API满足业务需求,也有不少客户使用Phoenix NewSQL层,NewSQL层提升易用性及提供了很多好用的功能。在HBase层面,除了修复社区的Bug以外,也做了几个较大的特性。在对比关系型数据方面,HBase也有天然的优势,参考:对比MySQL,一文看透HBase的能力及使用场景 冷热分离冷热分离可以降低存储成本66%左右。广泛应用于车联网、冷日志等场景下。我们把冷数据存放到OSS之上,且用户还可以使用HBase的API访问。基本原理是:把Hlog存在HDFS之上,再把冷的HFile存放在OSS之上。 GC优化GC一直是Java应用中讨论的一个热门话题,尤其在像HBase这样的大型在线存储系统中,大堆下(百GB)的GC停顿延迟产生的在线实时影响,成为内核和应用开发者的一大痛点。平台实现了CCSMap新的内存存储结构,结合offheap及新的ZenGC等一列的优化,在生产环境young GC时间从120ms减少到15ms,在实验室进一步降低到5ms左右。可以参考文章:如何降低90%Java垃圾回收时间?以阿里HBase的GC优化实践为例五、检索层HBase底层基于LSM,擅长前缀匹配和范围查找,数据模型上属于行存,大范围扫描数据对系统影响很大。我们知道,用户的需求往往是各式各样,不断变化的。对于要求高TPS,高并发,查询业务比较固定且简单的场景,HBase可以很好满足。更复杂一些,当用户对同一张表的查询条件组合有固定多个时,可以通过二级索引的方式来解决,但是二级索引有写放大问题,索引数量不能太多,一般建议不超过10个。当面对更复杂的查询模式,比如自由条件组合,模糊查询,全文查询等,用当前的索引技术是无法满足的,需要寻求新的解决方案。我们容易想到,搜索引擎,比如Lucene、Solr以及ElasticSearch,是专门面向复杂查询场景的。为了应对各种复杂的查询需求,搜索引擎运用到了大量跟LSM Tree十分不同的索引技术,比如倒排、分词、BKD Tree做数值类型索引、roaring bitmap实现联合索引、DocValues增强聚合和排序等。使用搜索引擎的技术来增强HBase的查询能力是一个十分值得深入探索的技术方向。 当前用户要想实现,复杂查询,只能重新购买新的搜索集群,通过导数据的方式将数据导入到新的搜索服务中。这种方式存在很多这样那样的问题:维护成本比较高,需要购买在线数据库,分析数据库和数据传输服务;学习门槛高,需要同时熟悉至少上诉三种服务;无法保证实时性,在线库入库和检索库入库效率不匹配;数据冗余存储,在线库索引数据和结果数据设计的所有数据都需要导入;数据一致性难保证,数据乱序问题十分常见,特别是对于分布式在线库更是如此。云HBase引入Solr,并在产品和内核上做了一系列工作,将其打造成统一的产品体验,一揽子解决了前述所有问题。用户在控制台上一键可以开通检索服务,参考文章:云HBase发布全文索引服务,轻松应对复杂查询。 检索服务的架构如上图所示,最底层是分布式文件系统的统一抽象,HBase的数据和Solr中的数据都会存储在分布式文件系统中。最上层是分布式协调服务Zookeeper,HBase、Indexer、Solr都是基于其实现分布式功能。Indexer实现了存量HBase数据的批量导入功能,有针对性地实现了数据批量导入的分布式作业机制。Indexer服务也实现了实时数据的异步同步功能,利用HBase的后台Replication机制,Indexer实现了Fake HBase功能,接收到HBase的数据后,将其转换为Solr的document,并写入solr。针对HBase写入速度比Solr快的问题,我们设计并实现了反压机制,可以将Solr中数据的延迟控制在用户设定的时间范围内,该机制同时也避免了HLog消费速度过慢的堆积问题。实时同步和批量导入可以同时运行,我们通过保序的时间戳保证了数据的最终一致性。为了提高产品的易用性,我们还基于Phoenix 实现了检索服务的SQL封装,并在存储查询等方面做了一系列优化升级,该部分在下个章节将会介绍。 六、NewSQL PhoenixPhoenix是HBase之上的SQL层,Phoenix让HBase平台从NoSQL直接进化到了NewSQL。在HBase的基础之上,再支持了Schema、Secondary Indexes、View 、Bulk Loading(离线大规模load数据)、Atomic upsert、Salted Tables、Dynamic Columns、Skip Scan等特性。目前云上最大客户有200T左右,且50%+的客户都开通了Phoenix SQL服务。我们修复了社区数十个Bug及提了不少新特性,团队也拥有1位Committer及数位contributor。在18年我们在充分测试的基础上,先于社区正式商业化了Phoenix5.0,并支持了QueryServer,支持轻量的JDBC访问。同时,社区的5.0.1也将由我们推动发布。 Phoenix本身我们做了一系列稳定性,性能等方面的优化升级,主要有:客户端优化MetaCache机制,大数据量简单查询性能提升一个数量级;索引表回查主表,使用lookupjoin的方式优化,性能提升5到7倍;轻客户端优化batch commit,性能提升2到3倍;解决Phoenix时区问题,提高易用性,降低数据一致性问题概率;禁用DESC,扫全表等有风险功能;实现大批量数据导入的Bulkload功能;等等。这些稳定性和性能方面的提升,在用户侧得到了很好的反馈。 Phoenix目前基本的架构如图所示,我们让Phoenix支持了HBase和Solr双引擎,用户可以使用SQL实现对HBase和Solr数据的管理和查询,大大提高了系统的易用性。Solr和HBase之间的同步机制可以参考上节。在支持复杂查询方面,我们设计并实现了一种新的索引:Search Index,使用方式跟Phoenix的Global Index类似,主要区别在于Search Index的索引数据存储在Solr里面,而Global Index的索引数据是一张单独的HBase表。直接通过SQL管理Search Index的生命周期、数据同步和状态,自动映射数据字段类型,并通过SQL支持复杂查询,这极大降低了用户的使用门槛。Search Index可以统一根据HBase和Solr的特性做优化,由于原表在HBase中可以通过RowKey高效查询,Solr中只需要存储作为查询条件的字段的索引数据,查询字段的原数据不需要存储在Solr中,表中的非查询字段则完全不需要存储到Solr中。相对于用户单独购买检索产品,并同步数据的方案,Search Index可以大大降低存储空间。同时,根据索引特性,Phoenix在做执行计划优化时,可以动态选择最优的索引方案。 ...

May 22, 2019 · 1 min · jiezi

mongodb的model名称细节

最近研究api设计,顺便研究了下mongodb,教程没有仔细看过,所以使用过程中也遇到了一些诡异的现象。 比如我使用中发现,我创建的模型名称,在对应数据库的collections内的名称不一致。我很纳闷,比如我创建的如下: const PersonModel = Mongoose.model("person", { firstname: String, lastname: String});当我将一条数据写入后,用工具Robo 3T发现,名称居然变成了people。 后来查了相关资料,原来mongodb有自己的一套规则,详细的规则,比如我这条:mongoose/lib/utils.js。当然这个是历史版本的例子了。关于这个现象,最新文档中也指出: The first argument is the singular name of the collection your model is for. Mongoose automatically looks for the plural version of your model name. For example, if you use const MyModel = mongoose.model('Ticket', mySchema);Then Mongoose will create the model for your tickets collection, not your ticket collection. 一般情况他会创建一个复数的model,这种person算特殊的了。所以你写得model不一定在查询的时候会一样,即便不一样也不要惊讶哦~

May 22, 2019 · 1 min · jiezi

Tedis基于-TiKV-构建的-NoSQL-数据库

作者介绍:陈东明,饿了么北京技术中心架构组负责人,负责饿了么的产品线架构设计以及饿了么基础架构研发工作。曾任百度架构师,负责百度即时通讯产品的架构设计。具有丰富的大规模系统构 建和基础架构的研发经验,善于复杂业务需求下的大并发、分布式系统设计和持续优化。个人微信公众号 dongming_cdm。Tedis(https://github.com/eleme/tedis)是基于开源 TiKV 的兼容 Redis 协议的强一致性的 NoSQL 数据库开源项目。 本文介绍一下 Tedis 开源项目的架构设计和特性,以及架构背后的一些思考(包括为何选择 TiKV 和 Redis 协议)。 先来讨论为什么基于 TiKV 构建我们自己的 NoSQL 数据库。 首先简述一下 TiKV[1],TiKV 是 TiDB 的一个子项目,TiDB 是一个分布式的关系型数据库 [2],TiKV 是 TiDB 的存储层。TiKV 本身是可独立于 TiDB 的单独项目。它是一个强一致、可水平扩展的、高可用的分布式 Key-Value 存储系统。 选择 TiKV 的第一个原因是 TiKV 是一个强一致的系统。 在我的另外一篇文章中(发表在 InfoQ, 参看 https://www.infoq.cn/article/rhzs0KI2G*Y2r9PMdeNv ),我阐述了一个观点:NoSQL 数据库应该具有一致性,并且通过多副本技术达到实际的高可用,也就是说 NoSQL 数据库应该是一个“实际上的 CA” (effectively CA)系统。但是在这篇文章中我并没有明确说明 NoSQL 该具有的一致性是哪种一致性。实际上,我所说的一致性其实就是一种强一致性 [3],或者更准确的说是线性一致性 [4]。TiKV 正是具有这种线性一致性。TiKV 中的每个数据都会保存 3 个副本,在只有一个副本的节点宕机或者出现网络分区的情况下,另外 2 个副本仍然能够对外提供服务。理论上来讲,同时出现 2 个以上副本同时坏掉的可能性很小,也就是理论上可以达到非常高的可用性。通过 TiKV 滚动升级等运维辅助,如果在实际的生产中,有良好的运维,可以达到实际上非常高的可用性。也就是称为一个“实际上的 CA”(effectively CA)系统。 TiKV 通过 Raft [5] 协议实现了线性一致性和高可用 2 个特性。Raft 是一种分布式共识协议,通过 Raft 协议,数据可以被认为是原子的写入到 3 个副本上。共识协议的一个特点就是要写入大多数,才会认为写入成功,3 个副本的大多数就是 2 个,也就是在只有一个副本宕机或者网络分区的情况下,仍然可以成功写入,并且提供读服务。 ...

May 22, 2019 · 2 min · jiezi

从实现角度看redis-lazy-free的使用和注意事项

众所周知,redis对外提供的服务是由单线程支撑,通过事件(event)驱动各种内部逻辑,比如网络IO、命令处理、过期key处理、超时等逻辑。在执行耗时命令(如范围扫描类的keys, 超大hash下的hgetall等)、瞬时大量key过期/驱逐等情况下,会造成redis的QPS下降,阻塞其他请求。近期就遇到过大容量并且大量key的场景,由于各种原因引发的redis内存耗尽,导致有6位数的key几乎同时被驱逐,短期内redis hang住的情况 耗时命令是客户端行为,服务端不可控,优化余地有限,作者antirez在4.0这个大版本中增加了针对大量key过期/驱逐的lazy free功能,服务端的事情还是可控的,甚至提供了异步删除的命令unlink(前因后果和作者的思路变迁,见作者博客:Lazy Redis is better Redis - <antirez>) lazy free的功能在使用中有几个注意事项(以下为个人观点,有误的地方请评论区交流): lazy free不是在遇到快OOM的时候直接执行命令,放后台释放内存,而是也需要block一段时间去获得足够的内存来执行命令lazy free不适合kv的平均大小太小或太大的场景,大小均衡的场景下性价比比较高(当然,可以根据业务场景调整源码里的宏,重新编译一个版本)redis短期内其实是可以略微超出一点内存上限的,因为前一条命令没检测到内存超标(其实快超了)的情况下,是可以写入一个很大的kv的,当后续命令进来之后会发现内存不够了,交给后续命令执行释放内存操作如果业务能预估到可能会有集中的大量key过期,那么最好ttl上加个随机数,匀开来,避免集中expire造成的blocking,这点不管开不开lazy free都一样具体分析请见下文 参数redis 4.0新加了4个参数,用来控制这种lazy free的行为 lazyfree-lazy-eviction:是否异步驱逐key,当内存达到上限,分配失败后lazyfree-lazy-expire:是否异步进行key过期事件的处理lazyfree-lazy-server-del:del命令是否异步执行删除操作,类似unlinkreplica-lazy-flush:replica client做全同步的时候,是否异步flush本地db以上参数默认都是no,按需开启,下面以lazyfree-lazy-eviction为例,看看redis怎么处理lazy free逻辑,其他参数的逻辑类似 源码分析命令处理逻辑int processCommand(client *c)是redis处理命令的主方法,在真正执行命令前,会有各种检查,包括对OOM情况下的处理 int processCommand(client *c) { // ... if (server.maxmemory && !server.lua_timedout) { // 设置了maxmemory时,如果有必要,尝试释放内存(evict) int out_of_memory = freeMemoryIfNeededAndSafe() == C_ERR; // ... // 如果释放内存失败,并且当前将要执行的命令不允许OOM(一般是写入类命令) if (out_of_memory && (c->cmd->flags & CMD_DENYOOM || (c->flags & CLIENT_MULTI && c->cmd->proc != execCommand))) { flagTransaction(c); // 向客户端返回OOM addReply(c, shared.oomerr); return C_OK; } } // ... /* Exec the command */ if (c->flags & CLIENT_MULTI && c->cmd->proc != execCommand && c->cmd->proc != discardCommand && c->cmd->proc != multiCommand && c->cmd->proc != watchCommand) { queueMultiCommand(c); addReply(c,shared.queued); } else { call(c,CMD_CALL_FULL); c->woff = server.master_repl_offset; if (listLength(server.ready_keys)) handleClientsBlockedOnKeys(); } return C_OK;内存释放(淘汰)逻辑内存的释放主要在freeMemoryIfNeededAndSafe()内进行,如果释放不成功,会返回C_ERR。freeMemoryIfNeededAndSafe()包装了底下的实现函数freeMemoryIfNeeded() ...

May 18, 2019 · 2 min · jiezi

PyMongo-基础操作指令

1. 创建连接Connectionimport pymongoconn = pymongo.MongoClient('localhost',27017) # 安装完成启动服务后,默认本地连接conn = pymongo.MongoClient()默认上述地址以及端口conn = pymongo.MongoClient() #连接数据库db = conn['like_name'] #获取名字的数据库col = db['name_list'] #获取名字的集合2. 查看全部聚集名称db.collection_names()3.查看聚集的一条记录db.Account.find_one()db.Account.find_one({"UserName":"keyword"})4.查看聚集的记录统计db.Account.find().count()5.聚集查询结果排序db.Account.find().sort("UserName") --默认为升序db.Account.find().sort("UserName",pymongo.ASCENDING) --升序db.Account.find().sort("UserName",pymongo.DESCENDING) --降序6.聚集查询结果多列排序db.Account.find().sort([("UserName",pymongo.ASCENDING),("Email",pymongo.DESCENDING)])7.添加记录db.Account.insert({"AccountID":21,"UserName":"baiyun"})8.修改记录db.Account.update({"UserName":"baiyun"},{"$set":{"Email":"zte_bjc@126.com","Password":"666"}})9.删除记录db.Account.remove() -- 全部删除db.Test.remove({"UserName":"keyword"}) -- 按照条件删除10.原子操作常用命令$set用来指定一个键并更新键值,若键不存在并创建。 { $set : { field : value } }$unset 用来删除一个键 { $unset : { fiel- d : 1} }$inc $inc可以**对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。 { $inc : { field : value } }$push 用法:{ $push : { field : value } }把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去。$pushAll 同$push,只是一次可以追加多个值到一个数组字段内。 { $pushAll : { field : value_array } }$pull ...

May 13, 2019 · 1 min · jiezi

系统的讲解-PHP-缓存技术

概述缓存已经成了项目中是必不可少的一部分,它是提高性能最好的方式,例如减少网络I/O、减少磁盘I/O 等,使项目加载速度变的更快。 缓存可以是CPU缓存、内存缓存、硬盘缓存,不同的缓存查询速度也不一样(CPU缓存 > 内存缓存 > 硬盘缓存)。 接下来,给大家逐一进行介绍。 浏览器缓存浏览器将请求过的页面存储在客户端缓存中,当访问者再次访问这个页面时,浏览器就可以直接从客户端缓存中读取数据,减少了对服务器的访问,加快了网页的加载速度。 强缓存用户发送的请求,直接从客户端缓存中获取,不请求服务器。 根据 Expires 和 Cache-Control 判断是否命中强缓存。 代码如下: header('Expires: '. gmdate('D, d M Y H:i:s', time() + 3600). ' GMT');header("Cache-Control: max-age=3600"); //有效期3600秒Cache-Control 还可以设置以下参数: public:可以被所有的用户缓存(终端用户的浏览器/CDN服务器)private:只能被终端用户的浏览器缓存no-cache:不使用本地缓存no-store:禁止缓存数据协商缓存用户发送的请求,发送给服务器,由服务器判定是否使用客户端缓存。 代码如下: $last_modify = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);if (time() - $last_modify < 3600) { header('Last-Modified: '. gmdate('D, d M Y H:i:s', $last_modify).' GMT'); header('HTTP/1.1 304'); //Not Modified exit;}header('Last-Modified: '. gmdate('D, d M Y H:i:s').' GMT');用户操作行为对缓存的影响操作行为ExpiresLast-Modified地址栏回车有效有效页面跳转有效有效新开窗口有效有效前进/后退有效有效F5刷新无效有效Ctrl+F5刷新无效无效文件缓存数据文件缓存将更新频率低,读取频率高的数据,缓存成文件。 比如,项目中多个地方用到城市数据做三级联动,我们就可以将城市数据缓存成一个文件(city_data.json),JS 可以直接读取这个文件,无需请求后端服务器。 全站静态化CMS(内容管理系统),也许大家都比较熟悉,比如早期的 DEDE、PHPCMS,后台都可以设置静态化HTML,用户在访问网站的时候读取的都是静态HTML,不用请求后端的数据库,也不用Ajax请求数据接口,加快了网站的加载速度。 ...

May 10, 2019 · 2 min · jiezi

现代IM系统中的消息系统架构-模型篇

前言在架构篇中我们介绍了现代IM消息系统的架构,介绍了Timeline的抽象模型以及基于Timeline模型构建的一个支持『消息漫游』、『多端同步』和『消息检索』多种高级功能的消息系统的典型架构。架构篇中为了简化读者对Tablestore Timeline模型的理解,概要性的对Timeline的基本逻辑模型做了介绍,以及对消息系统中消息的多种同步模式、存储和索引的基本概念做了一个科普。 本篇文章是对架构篇的一个补充,会对Tablestore的Timeline模型做一个非常详尽的解读,让读者能够深入到实现层面了解Timeline的基本功能以及核心组件。最后我们还是会基于IM消息系统这个场景,来看如何基于Tablestore Timeline实现IM场景下消息同步、存储和索引等基本功能。 Timeline模型Timeline模型以『简单』为设计目标,核心模块构成比较清晰明了,主要包括: Store:Timeline存储库,类似数据库的表的概念。Identifier:用于区分Timeline的唯一标识。Meta:用于描述Timeline的元数据,元数据描述采用free-schema结构,可自由包含任意列。Queue:一个Timeline内所有Message存储在Queue内。Message:Timeline内传递的消息体,也是一个free-schema的结构,可自由包含任意列。Index:包含Meta Index和Message Index,可对Meta或Message内的任意列自定义索引,提供灵活的多条件组合查询和搜索。Timeline Store Timeline Store是Timeline的存储库,对应于数据库内表的概念。上图是Timeline Store的结构图,Store内会存储所有的Timeline数据。Timeline是一个面向海量消息的数据模型,同时用于消息存储库和同步库,需要满足多种要求: 支撑海量数据存储:对于消息存储库来说,如果需要消息永久存储,则随着时间的积累,数据规模会越来越大,需要存储库能应对长时间积累的海量消息数据存储,需要能达到PB级容量。低存储成本:消息数据的冷热区分是很明显的,大部分查询都会集中在热数据,所以对于冷数据需要有一个比较低成本的存储方式,否则随着时间的积累数据量不断膨胀,存储成本会非常大。数据生命周期管理:不管是对于消息数据的存储还是同步,数据都需要定义生命周期。存储库是用于在线存储消息数据本身,通常需要设定一个较长周期的保存时间。而同步库是用于写扩散模式的在线或离线推送,通常设定一个较短的保存时间。极高的写入吞吐:各类场景下的消息系统,除了类似微博、头条这种类型的Feeds流系统,像绝大部分即时通讯或朋友圈这类消息场景,通常是采用写扩散的消息同步模式,写扩散要求底层存储具备极高的写入吞吐能力,以应对消息洪峰。低延迟的读:消息系统通常是应用在在线场景,所以对于查询要求低延迟。Tablestore Timeline的底层是基于LSM存储引擎的分布式数据库,LSM的最大优势就是对写入非常友好,天然适合消息写扩散的模式。同时对查询也做了极大优化,例如热数据进缓存、bloom filter等等。数据表采用Range Partition的分区模式,能提供水平扩展的服务能力,以及能自动探测并处理热点分区的负载均衡策略。为了满足同步库和存储库对存储的不同要求,也提供了一些灵活的自定义配置,主要包括: Time to live(数据生命周期):可自定义数据生命周期,例如永久保存,或者保存N天。Storage type(存储类型):自定义存储类型,对存储库来说,HDD是最好的选择,对同步库来说,SSD是最好的选择。Timeline Module Timeline Store内能存储海量的Timeline,单个Timeline的详细结构图如上,可以看到Timeline主要包含了三大部分: Timeline Meta:元数据部分,用于描述Timeline,包括:Identifier:用于唯一标识Timeline,可包含多个字段。 Meta:用于描述Timeline的元数据,可包含任意个数任意类型的字段。Meta Index:元数据索引,可对元数据内任意属性列建索引,支持多字段条件组合查询和检索。Timeline Queue:用于存储和同步消息的队列,队列中元素由两部分组成:Sequence Id:顺序ID,队列中用于定位Message的位点信息,在队列中顺序ID保持递增。 Message:队列中承载消息的实体,包含了消息的完整内容。Timeline Data:Timeline的数据部分就是Message,Message主要包含:Message:消息实体,其内部也可以包含任意数量任意类型字段。 Message Index:消息数据索引,可对消息实体内任意列做索引,支持多字段条件组合查询和检索。IM消息系统建模 以一个简易版IM系统为例,来看如何基于Tablestore Timeline模型建模。按照上图中的例子,存在A、B、C三个用户,A与B发生单聊,A与C发生单聊,以及A、B、C组成一个群聊,来看下在这个场景下消息同步、存储以及读写流程分别如何基于Tablestore Timeline建模。 消息同步模型 消息同步选择写扩散模型,能完全利用Tablestore Timeline的优势,以及针对IM消息场景读多写少的特性,通过写扩散来平衡读写,均衡整个系统的资源。写扩散模型下,每个接收消息的个体均拥有一个收件箱,所有需要同步至该个体的消息需要投递到其收件箱内。图上例子中,A、B、C三个用户分别拥有收件箱,每个用户不同的设备端,均从同一个收件箱内拉取新消息。 消息同步库 收件箱存储在同步库内,同步库中每个收件箱对应一个Timeline。根据图上的例子,总共存在3个Timeline作为收件箱。每个消息接收端保存有本地最新拉取的消息的SequenceID,每次拉取新消息均是从该SequenceID开始拉取消息。对同步库的查询会比较频繁,通常是对最新消息的查询,所以要求热数据尽量缓存在内存中,能提供高并发低延迟的查询。所以对同步库的配置,一般是需要SSD存储。消息如果已经同步到了所有的终端,则代表收件箱内的该消息已经被消费完毕,理论上可以清理。但设计上来说不做主动清理,而是给数据定义一个较短的生命周期来自动过期,一般定义为一周或者两周。数据过期之后,如果仍要同步拉取新消息,则需要退化到读扩散的模式,从存储库中拉取消息。 消息存储库 消息存储库中保存有每个会话的消息,每个会话的发件箱对应一个Timeline。发件箱内的消息支持按会话维度拉取消息,例如浏览某个会话内的历史消息则通过读取发件箱完成。一般来说,新消息通过在线推送或者查询同步库可投递到各个接收端,所以对存储库的查询会相对来说较少。而存储库用于长期存储消息,例如永久存储,相对同步库来说数据量会较大。所以存储库的选择一般是HDD,数据生命周期根据消息需要保存的时间来定,通常是一个较长的时间。 消息索引库 消息索引库依附于存储库,使用了Timeline的Message Index,可以对存储库内的消息进行索引,例如对文本内容的全文索引、收件人、发件人以及发送时间的索引等,能支持全文检索等高级查询和搜索。 总结本篇文章主要对Tablestore Timeline模型进行了详解,介绍了Timeline各模块包括Store、Meta、Queue、Data和Index等,最后以一个简单的IM场景举例如何基于Timeline来建模。在下一篇实现篇中,会直接基于Tablestore Timeline来实现一个简易版的支持单聊、群聊、元数据管理以及消息检索的IM系统,敬请期待。 本文作者:木洛阅读原文 本文为云栖社区原创内容,未经允许不得转载。

May 8, 2019 · 1 min · jiezi

洞见数据库前沿-集结阿里云数据库最强阵容-DTCC-2019-八大亮点抢先看

摘要: 作为DTCC的老朋友和全球领先的云计算厂商,阿里云数据库团队受邀参加本次技术盛会,不仅将派出重量级嘉宾阵容,还会为广大数据库业内人士和行业用户奉上8场精彩议题。下面小编就为大家提前梳理了8大亮点,并附上阿里云议题全集,精彩一网打尽。2019年5月8日-5月10日,由国内知名IT技术社区主办的数据库技术交流盛会——DTCC 2019将在北京新云南皇冠假日大酒店召开。数据风云,十年变迁,DTCC见证并铭记了国内数据库技术的关键成长历程。作为DTCC的老朋友和全球领先的云计算厂商,阿里云数据库团队受邀参加本次技术盛会,不仅将派出重量级嘉宾阵容,还会为广大数据库业内人士和行业用户奉上8场精彩议题,精彩不容错过。 本次DTCC大会云集多位阿里云数据库顶级大咖,将为您带来最具价值的技术交流和探讨,干货满满。由阿里巴巴集团副总裁、达摩院数据库首席科学家、阿里云智能事业群数据库产品事业部总负责 李飞飞博士领衔,Google第一代分布式SQL系统Tenzing核心人物、阿里云OLAP产品分析引擎负责人林亮,数据库内核团队资深技术专家何登成等核心团队成员将依次亮相,分别就云原生数据库、新一代自研分析型数据库、分布式数据库、时序数据库、图数据库等最in的技术话题,展开深入讨论,分享最佳实战经验。同时,李飞飞博士还将作为DTCC大会的专家顾问,把握数据技术的主题内容与方向。 洞见前沿技术趋势,见证阿里云数据库成长历程。在这场数据库领域从业人士难得的年度盛会和交流平台上,阿里云技术大牛们将带来怎样的饕餮盛宴? 下面小编就为大家提前梳理了8大亮点,并附上阿里云议题全集,精彩一网打尽。期待与您共聚一堂,共话行业未来! 温馨提示不在北京?到不了现场?没关系,我们为您准备了议题直播,欢迎点击下面的直播链接,尽情围观!5月9日-5月17日,每天下午15:00敬请锁定云栖社区直播,关注这场数据库技术干货的大咖SHOW 点击直播链接,预约观看就可领取阿里云数据库超值代金券!数量有限,先到先得哦! 亮点1:阿里云云原生数据库——我们不一样作为基础软件之一,数据库一直是企业IT系统的核心。随着云计算的到来及相关技术的不断成熟,推动了数据库行业的快速发展,传统数据库铁打的防线也正在被撕裂。 在云计算时代,云原生数据库开始崛起,通过弹性扩展、按量付费等特性获得了大量企业用户的青睐,挑战 Oracle 等传统数据库厂商的位置。在2018年,Gartner发布的数据库魔力象限中,云数据库厂商的表现极为抢眼,作为国内云计算行业的佼佼者,阿里云数据库更是跻身“远见者”象限。 为了满足弹性扩展、弹性计算、以及按需按量付费等云上应用需求,云原生数据库需要利用软硬件一体化设计,基于新兴的 RDMA、NVM 等高速硬件,研发全用户态的 IO 与网络协议栈以提供极低的延迟。 同时探索新的体系架构例如通过 shared-storage 来实现 shared-everything 和存储计算分离,提供一写多读的扩展能力。在某些高并发、对水平拓展有强需求的应用场景下,云原生数据库同时也需要探索基于 shared-nothing 的分布式架构来提供分布式数据库能力来处理分布式 SQL 查询和分布式事务处理。金融级高可用、异地多活等技术挑战也是云原生数据库所必须提供的关键能力。 演讲主题:《云时代数据库的演进》演讲嘉宾:李飞飞(花名:飞刀),阿里巴巴集团副总裁,达摩院首席数据科学家,阿里云智能事业群数据库产品事业部负责人 议题简介:阿里巴巴数据库团队自主研发的存储引擎 X-Engine 充分利用数据的冷热特性以及计算机系统结构的分层内存体系,通过冷热数据分离存储技术,提升写性能的同时降低成本。基于对以上技术挑战的不断探索和实践,阿里巴巴数据库团推出了云原生数据库 POLARDB 和其分布式版本 POLARDB-X,经受了2018年阿里巴巴双十一的交易峰值挑战并在阿里云上取得了商业化的成功。 本次分享将基于阿里云数据库近期在 VLDB,SIGMOD 上的论文内容,结合核心系统设计原理,介绍云原生数据库技术的挑战和发展趋势。 演讲时间:5月8日11:05-11:45主会场场次:主场1——数据架构 十年变迁直播时间:5月9日 15:00-16:00直播链接:https://yq.aliyun.com/live/1043?utm_content=g_1000056249亮点2:数据库内核研究,深度解码阿里数据库实现演讲主题:《POLARDB-X架构和技术演进》演讲嘉宾:何登成(花名:圭多),阿里云智能数据库产品事业部资深技术专家,DTCC的老朋友。从2005年开始一直坚守在数据库内核研发领域,先后在神州通用、网易和阿里从事数据库内核产品研发工作,目前带领团队打造阿里新一代分布式数据库POLARDB-X。 议题简介:作为阿里自研的新一代分布式数据库,POLARDB-X支撑了阿里巴巴90%以上的在线数据库应用。从AliSQL到POLARDB-X,经历了怎样的思考?在过去的一年,POLARDB-X在技术上有了哪些演进?希望能在DTCC的舞台上,跟朋友们进行深度的分享和交流。 演讲时间:5月8日16:20-17:10专场场次:数据库内核技术直播时间:5月9日 16:00-17:00直播链接:https://yq.aliyun.com/live/1045?utm_content=g_1000056250亮点3:海量数据毫秒级分析背后的架构挑战以及工程实践演讲主题:《超大规模实时数仓架构挑战与实践解析》 演讲嘉宾:林亮(花名:意博),阿里云智能数据库产品事业部研究员,曾就职Google十多年,在超大规模SQL Engine和规模存储引擎上经验丰富。目前在负责阿里云PB级分析型数据库AnalyticDB架构工作。 议题简介:数据分析领域目前正在朝着在线化方向演进,数据业务在海量数据实时写入、高并发分析、稳定性、灵活性上挑战巨大。分析型数据库AnalyticDB是阿里巴巴自主研发的超大规模PB级实时数据仓库, 近2年在上述挑战背后的技术领域稳扎稳打,做了大量的难点突破和技术创新,本次演讲深入分析AnalyticDB海量数据毫秒级分析背后的架构挑战以及工程实践。 演讲时间:5月9日09:40-10:20主会场场次:主场2——数据架构 十年变迁直播时间:5月10日 15:00-16:00直播链接:https://yq.aliyun.com/live/1047?utm_content=g_1000056251亮点4:教你解锁时序时空数据库的种种黑科技演讲主题:《阿里云TSDB: 拥抱物联网的新一代时序时空数据库》演讲嘉宾:伊翼(花名:老滚)。阿里云智能数据库产品事业部技术专家,从事TSDB核心引擎的研发工作。 议题简介:阿里云TSDB是阿里自研的一种高性能,低成本,稳定可靠的在线时序时空数据库产品。该产品统一了阿里巴巴集团90%以上的APM数据和事件型数据的存储和计算,并在广泛应用于外部的物联网,工业制造,电力,化工以及IT运维等行业。本演讲将介绍该时序时空数据库的种种黑科技:・提供千万级并发读写・双十一写入TPS达到6000万/秒・十倍以上压缩比低成本存储・PB级时序时空数据秒级聚合・每天百亿时间线的集群规模等等 演讲时间:5月8日15:50-16:30专场场次:NoSQL技术与实践直播时间:5月13日 15:00-16:00直播链接:https://yq.aliyun.com/live/1044?utm_content=g_1000056252亮点5:把握数据库发展趋势 DBA应如何避免“踩坑”?进行云时代以后,IT行业各工种的职责都在发生变化,云数据库使得日常DBA管理实现更多的自动化,大大提高日常管理效率,同时也对于企业整体投资产出可以更快获得成效。对于DBA职位的而言,当前是一个转变期,不少企业从业务开始之初就直接使用云计算。 演讲主题:《如何构建云时代DBA的知识体系》演讲嘉宾:萧少聪(花名:铁庵),阿里云智能数据库产品事业部高级产品专家,PostgreSQL中国社区常委 议题简介:如何构建云时代DBA的知识体系?通过本次演讲,希望能够协助行业中已有的DBA转型及新就业进入DBA的技术人员对云DBA加深了解,让大家在转型过程少走弯路。 云数据库 vs 传统数据库管理模式对比;云DBA知识体系构成:基础、云主机、云数据库、智能化管理;直接使用云数据库与在云主机中自建数据库的管理差异;如何成长为一名优秀的云DBA。演讲时间:5月8日11:05-11:45专场场次:云时代的数据库(上)**直播时间:5月14日15:00-16:00直播链接:https://yq.aliyun.com/live/1046?utm_content=g_1000056253亮点6:关于数据库灾备,你想知道的都在这里演讲主题:《云时代数据库迁移 & 容灾技术新进展与应用》 演讲嘉宾:付大超(花名:千震),2012年加入阿里巴巴,目前负责DTS&DBS团队和研发,在阿里云提供迁移、同步和容灾的服务,支持阿里巴巴、蚂蚁、阿里云等异地多活单元化架构,曾负责阿里全球最大的HBase集群的开发和维护工作,曾先后工作于IBM、Cisco。 议题简介:迁移&容灾是数据库的强需求,传统的迁移&容灾技术已经发展多年,随着云时代的来临,在迁移&容灾的使用场景、网络、技术都有很大的变化,如何在云时代下更简单的实现数据库的迁移&容灾,云厂商如何通过新的技术实现弯道超车,本次topic主要分享阿里云在此领域的技术新进展和应用。 演讲时间:5月9日17:10-18:00专场场次:云时代数据库(下)直播时间:5月15日15:00-16:00直播链接:https://yq.aliyun.com/live/1048?utm_content=g_1000056254亮点7:NoSQL——如何拥有居家必备的企业级能力当整个世界由IT走向DT时代,数据库领域也发生了重大变化,NoSQL已成为企业应用常态 演讲主题:《NoSQL数据库最新技术发展趋势》 演讲嘉宾:朱洁(花名:所在),阿里云智能数据库产品事业部高级产品专家,当前为阿里云数据库NoSQL数据库产品Leader。10+数据库/大数据研发管理经验,专注于数据库/大数据服务平台建设、规划和实践应用,著有畅销书《大数据架构详解:从数据获取到深度学习》。 议题简介:企业IT系统面临层出不穷的新业务,安全,成本等诸多挑战。阿里云NoSQL数据库通过与企业业务深度结合,快速创新,提供最新的技术帮助企业用户迎接挑战,获得金融、社交、直播等众多大客户的信任。 本次演讲重点介绍阿里云NoSQL数据库在全球分布式,多模,弹性,HTAP,cloudNative,图,时序,时空等众多最新领域的创新和技术实践。 演讲时间:5月10日 09:40-10:20专场场次:分布式数据库实践(下)直播时间:5月16日15:00-16:00直播链接:https://yq.aliyun.com/live/1049?utm_content=g_1000056255亮点8:前沿技术应用——图数据库知多少?数据库从业者必看演讲主题:《探索互联数据的奥秘——图数据库GDB》 演讲嘉宾:王炎(花名:夜炎),阿里云智能数据库产品事业部高级技术专家。在分布式系统、存储领域以及NoSQL系统研发领域经验丰富。18年加入阿里巴巴集团,现在阿里负责图数据库系统相关研发工作。 ...

May 8, 2019 · 1 min · jiezi

现代IM系统中的消息系统架构 - 架构篇

前言IM全称是『Instant Messaging』,中文名是即时通讯。在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉、微信、QQ等以IM为核心功能的产品。当然目前微信已经成长为一个生态型产品,但其核心功能还是IM。还有一些非以IM系统为核心的应用,最典型的如一些在线游戏、社交应用,IM也是其重要的功能模块。可以说,IM系统已经是任何一个带有社交属性的应用需要具备的基础功能,网络上对于这类系统的设计与实现的讨论也越来越多。IM系统在互联网初期即存在,其基础技术架构在这十几年的发展中更新迭代多次,从早期的CS、P2P架构,到现在后台已经演变为一个复杂的分布式系统,涉及移动端、网络通信、协议、安全、存储和搜索等技术的方方面面。IM系统中最核心的部分是消息系统,消息系统中最核心的功能是消息的同步、存储和检索:消息的同步:将消息完整的、快速的从发送方传递到接收方,就是消息的同步。消息同步系统最重要的衡量指标就是消息传递的实时性、完整性以及能支撑的消息规模。从功能上来说,一般至少要支持在线和离线推送,高级的IM系统还支持『多端同步』。消息的存储:消息存储即消息的持久化保存,传统消息系统通常只能支持消息在接收端的本地存储,数据基本不具备可靠性。现代消息系统能支持消息在服务端的在线存储,功能上对应的就是『消息漫游』,消息漫游的好处是可以实现账号在任意端登陆查看所有历史消息。消息的检索:消息一般是文本,所以支持全文检索也是必备的能力之一。传统消息系统通常来说也是只能支持消息的本地检索,基于本地存储的消息数据来构建。而现在消息系统在能支持消息的在线存储后,也具备了消息的『在线检索』能力。本篇文章内容主要涉及IM系统中的消息系统架构,会介绍一种基于阿里云表格存储Tablestore的Timeline模型构建的消息系统。基于Tablestore Timeline构建的现代消息系统,能够同时支持消息系统的众多高级特性,包括『多端同步』、『消息漫游』和『在线检索』。在性能和规模上,能够做到全量消息云端存储和索引,百万TPS写入以及毫秒级延迟的消息同步和检索能力。之后我们会继续发表两篇文章,来更详细介绍Tablestore Timeline模型概念及使用:模型篇:详细介绍Tablestore Timeline模型的基本概念和基础数据结构,并结合IM系统进行基本的建模。实现篇:会基于Tablestore Timeline实现一个具备『多端同步』、『消息漫游』和『在线检索』这些高级功能的简易IM系统,并共享我们的源代码。传统架构 vs 现代架构传统架构下,消息是先同步后存储。对于在线的用户,消息会直接实时同步到在线的接收方,消息同步成功后,并不会在服务端持久化。而对于离线的用户或者消息无法实时同步成功时,消息会持久化到离线库,当接收方重新连接后,会从离线库拉取所有未读消息。当离线库中的消息成功同步到接收方后,消息会从离线库中删除。传统的消息系统,服务端的主要工作是维护发送方和接收方的连接状态,并提供在线消息同步和离线消息缓存的能力,保证消息一定能够从发送方传递到接收方。服务端不会对消息进行持久化,所以也无法支持消息漫游。消息的持久化存储及索引同样只能在接收端本地实现,数据可靠性极低。现代架构下,消息是先存储后同步。先存储后同步的好处是,如果接收方确认接收到了消息,那这条消息一定是已经在云端保存了。并且消息会有两个库来保存,一个是消息存储库,用于全量保存所有会话的消息,主要用于支持消息漫游。另一个是消息同步库,主要用于接收方的多端同步。消息从发送方发出后,经过服务端转发,服务端会先将消息保存到消息存储库,后保存到消息同步库。完成消息的持久化保存后,对于在线的接收方,会直接选择在线推送。但在线推送并不是一个必须路径,只是一个更优的消息传递路径。对于在线推送失败或者离线的接收方,会有另外一个统一的消息同步方式。接收方会主动的向服务端拉取所有未同步消息,但接收方何时来同步以及会在哪些端来同步消息对服务端来说是未知的,所以要求服务端必须保存所有需要同步到接收方的消息,这是消息同步库的主要作用。对于新的同步设备,会有消息漫游的需求,这是消息存储库的主要作用,在消息存储库中,可以拉取任意会话的全量历史消息。消息检索的实现依赖于对消息存储库内消息的索引,通常是一个近实时(NRT,near real time)的索引构建过程,这个索引同样是在线的。以上就是传统架构和现代架构的一个简单的对比,现代架构上整个消息的同步、存储和索引流程,并没有变复杂太多。现代架构的实现本质上是把传统架构内本地存储和索引都搬到云上,最大挑战是需要集中管理全量消息的存储和索引,带来的好处是能实现多端同步、消息漫游以及在线检索。可以看到现代架构中最核心的就是两个消息库『消息同步库』和『消息存储库』,以及对『消息存储库』的『消息索引』的实现,接下来我们逐步拆解这几个核心的设计和实现。基础模型在深入讲解消息系统的设计和实现之前,需要对消息系统内的几个基本概念和基础模型有一个理解。网上分析的很多的不同类型的消息系统实现,实现差异上主要在消息同步和存储的方案上,在消息的数据模型上其实有很大的共性。围绕数据同步模型的讨论主要在『读扩散』、『写扩散』和『混合模式』这三种方案,目前还没有更多的选择。而对于数据模型的抽象,还没有一个标准的定义。本章节会介绍下表格存储Tablestore提出的Timeline模型,这是一个对消息系统内消息模型的一个抽象,能简化和更好的让开发者理解消息系统内的消息同步和存储模型,基于此模型我们会再深入探讨消息的同步和存储的选择和实现。Timeline模型Timeline是一个对消息抽象的逻辑模型,该模型会帮助我们简化对消息同步和存储模型的理解,而消息同步库和存储库的设计和实现也是围绕Timeline的特性和需求来展开。如图是Timeline模型的一个抽象表述,Timeline可以简单理解为是一个消息队列,但这个消息队列有如下特性:每条消息对应一个顺序ID:每个消息拥有一个唯一的顺序ID(SequenceId),队列消息按SequenceId排序。新消息写入能自动分配递增的顺序ID,保证永远插入队尾:Timeline中是根据同步位点也就是顺序ID来同步消息,所以需要保证新写入的消息数据的顺序ID绝对不能比已同步的消息的顺序ID还小,否则会导致数据漏同步,所以需要支持对新写入的数据自动分配比当前已存储的所有消息的顺序ID更大的顺序ID。新消息写入也能自定义顺序ID,满足自定义排序需求:上面提到的自动分配顺序ID,主要是为了满足消息同步的需求,消息同步要求消息是根据『已同步』或是『已写入』的顺序来排序。而消息的存储,通常要求消息能根据会话顺序来排序,会话顺序通常由端的会话来决定,而不是服务端的同步顺序来定,这是两种顺序要求。支持根据顺序ID的随机定位:可根据SequenceId随机定位到Timeline中的某个位置,从这个位置开始正序或逆序的读取消息,也可支持读取指定顺序ID的某条消息。支持对消息的自定义索引:消息体内数据根据业务不同会包含不同的字段,Timeline需要支持对不同字段的自定义索引,来支持对消息内容的全文索引,或者是任意字段的灵活条件组合查询。消息同步可以基于Timeline很简单的实现,图中的例子中,消息发送方是A,消息接收方是B,同时B存在多个接收端,分别是B1、B2和B3。A向B发送消息,消息需要同步到B的多个端,待同步的消息通过一个Timeline来进行交换。A向B发送的所有消息,都会保存在这个Timeline中,B的每个接收端都是独立的从这个Timeline中拉取消息。每个接收端同步完毕后,都会在本地记录下最新同步到的消息的SequenceId,即最新的一个位点,作为下次消息同步的起始位点。服务端不会保存各个端的同步状态,各个端均可以在任意时间从任意点开始拉取消息。消息存储也是基于Timeline实现,和消息同步唯一的区别是,消息存储要求服务端能够对Timeline内的所有数据进行持久化,并且消息采用会话顺序来保存,需要自定义顺序ID。消息检索基于Timeline提供的消息索引来实现,能支持比较灵活的多字段索引,根据业务的不同可有自由度较高的定制。消息存储模型如图是基于Timeline的消息存储模型,消息存储要求每个会话都对应一个独立的Timeline。如图例子所示,A与B/C/D/E/F均发生了会话,每个会话对应一个独立的Timeline,每个Timeline内存有这个会话中的所有消息,消息根据会话顺序排序,服务端会对每个Timeline进行持久化存储,也就拥有了消息漫游的能力。消息同步模型消息同步模型会比消息存储模型稍复杂一些,消息的同步一般有读扩散(也叫拉模式)和写扩散(也叫推模式)两种不同的方式,分别对应不同的Timeline物理模型。如图是读扩散和写扩散两种不同同步模式下对应的不同的Timeline模型,按图中的示例,A作为消息接收者,其与B/C/D/E/F发生了会话,每个会话中的新的消息都需要同步到A的某个端,看下读扩散和写扩散两种模式下消息如何做同步。读扩散:消息存储模型中,每个会话的Timeline中保存了这个会话的全量消息。读扩散的消息同步模式下,每个会话中产生的新的消息,只需要写一次到其用于存储的Timeline中,接收端从这个Timeline中拉取新的消息。优点是消息只需要写一次,相比写扩散的模式,能够大大降低消息写入次数,特别是在群消息这种场景下。但其缺点也比较明显,接收端去同步消息的逻辑会相对复杂和低效。接收端需要对每个会话都拉取一次才能获取全部消息,读被大大的放大,并且会产生很多无效的读,因为并不是每个会话都会有新消息产生。写扩散:写扩散的消息同步模式,需要有一个额外的Timeline来专门用于消息同步,通常是每个接收端都会拥有一个独立的同步Timeline(或者叫收件箱),用于存放需要向这个接收端同步的所有消息。每个会话中的消息,会产生多次写,除了写入用于消息存储的会话Timeline,还需要写入需要同步到的接收端的同步Timeline。在个人与个人的会话中,消息会被额外写两次,除了写入这个会话的存储Timeline,还需要写入参与这个会话的两个接收者的同步Timeline。而在群这个场景下,写入会被更加的放大,如果这个群拥有N个参与者,那每条消息都需要额外的写N次。写扩散同步模式的优点是,在接收端消息同步逻辑会非常简单,只需要从其同步Timeline中读取一次即可,大大降低了消息同步所需的读的压力。其缺点就是消息写入会被放大,特别是针对群这种场景。Timeline模型不会对选择读扩散还是写扩散做约束,而是能同时支持两种模式,因为本质上两种模式的逻辑数据模型并无差别,只是消息数据是用一个Timeline来支持多端读还是复制到多个Timeline来支持多端读的问题。针对IM这种应用场景,消息系统通常会选择写扩散这种消息同步模式。IM场景下,一条消息只会产生一次,但是会被读取多次,是典型的读多写少的场景,消息的读写比例大概是10:1。若使用读扩散同步模式,整个系统的读写比例会被放大到100:1。一个优化的好的系统,必须从设计上去平衡这种读写压力,避免读或写任意一维触碰到天花板。所以IM系统这类场景下,通常会应用写扩散这种同步模式,来平衡读和写,将100:1的读写比例平衡到30:30。当然写扩散这种同步模式,还需要处理一些极端场景,例如万人大群。针对这种极端写扩散的场景,会退化到使用读扩散。一个简单的IM系统,通常会在产品层面限制这种大群的存在,而对于一个高级的IM系统,会采用读写扩散混合的同步模式,来满足这类产品的需求。采用混合模式,会根据数据的不同类型和不同的读写负载,来决定用写扩散还是读扩散。典型架构设计如图是一个典型的消息系统架构,架构中包含几个重要组件:端:作为消息的发送和接收端,通过连接消息服务器来发送和接收消息。消息服务器:一组无状态的服务器,可水平扩展,处理消息的发送和接收请求,连接后端消息系统。消息队列:新写入消息的缓冲队列,消息系统的前置消息存储,用于削峰填谷以及异步消费。消息处理:一组无状态的消费处理服务器,用于异步消费消息队列中的消息数据,处理消息的持久化和写扩散同步。消息存储和索引库:持久化存储消息,每个会话对应一个Timeline进行消息存储,存储的消息建立索引来实现消息检索。消息同步库:写扩散形式同步消息,每个用户的收件箱对应一个Timeline,同步库内消息不需要永久保存,通常对消息设定一个生命周期。新消息会由端发出,通常消息体中会携带消息ID(用于去重)、逻辑时间戳(用于排序)、消息类型(控制消息、图片消息或者文本消息等)、消息体等内容。消息会先写入消息队列,作为底层存储的一个临时缓冲区。消息队列中的消息会由消息处理服务器消费,可以允许乱序消费。消息处理服务器对消息先存储后同步,先写入发件箱Timeline(存储库),后写扩散至各个接收端的收件箱(同步库)。消息数据写入存储库后,会被近实时的构建索引,索引包括文本消息的全文索引以及多字段索引(发送方、消息类型等)。对于在线的设备,可以由消息服务器主动推送至在线设备端。对于离线设备,登录后会主动向服务端同步消息。每个设备会在本地保留有最新一条消息的顺序ID,向服务端同步该顺序ID后的所有消息。总结本篇文章主要介绍了现代IM系统中消息系统所需要具备的能力,对比了传统架构和现代架构。为方便接下来的深入探讨,介绍了表格存储Tablestore推出的Timeline模型,以及在IM系统中消息存储和消息同步模型的基本概念和策略,最后介绍了一个典型的架构设计。本文作者:木洛阅读原文本文为云栖社区原创内容,未经允许不得转载。

April 16, 2019 · 1 min · jiezi

腾讯重磅开源分布式NoSQL存储系统DCache

当你在电商平台秒杀商品或者在社交网络刷热门话题的时候,可以很明显感受到当前网络数据流量的恐怖,几十万商品刚开抢,一秒都不到就售罄;哪个大明星出轨的消息一出现,瞬间阅读与转发次数可以达到上亿。作为终端用户的我们可能会思考,服务系统是怎么在这样严峻的流量环境中存活下来的。其实,服务系统的架构中有许多巧妙的设计来应对这样的问题,而在这其中,通常系统都会架设缓存系统,用以缓解海量访问请求与数据带来的冲击,实现高性能访问需求。同时,随着微服务与云等技术的发展,分布式架构的需求变得越来越普遍,再加上今天 Web 上的数据类型已经不再单一,而且数据量也呈爆发式增长,传统的结构化存储方案已经跟不上脚步,对数据库的 SQL 操作不再满足要求,于是 NoSQL 出现。将这几种技术方案整合起来,我们可以设计出分布式 NoSQL 缓存系统,当前这一类系统有一些比较强大的开源方案,比如 Memcached 和 Redis,它们对整个服务系统的可用性、可扩展性与性能起到至关重要的作用。腾讯最近开源了一个分布式 NoSQL 存储系统 DCache,它的典型应用场景就在分布式缓存。根据官方介绍,DCache 基于 TARS 微服务治理方案,它支持 k-v、k-k-row、list、set 与 zset 多种数据结构,数据基于内存存储,同时支持后接 DB 实现数据持久化。DCache 具备快速水平扩展能力,同时配套有 Web 运维平台实现高效的运维操作。我们第一时间采访了 DCache 研发团队成员山宝银,希望对项目的研发背景与相关技术细节有进一步了解。当前开源的分布式缓存系统中,Memcached 与 Redis 是很普遍的选择,腾讯此次为什么要自己造一个系统呢?山宝银介绍,虽然 Memcached 与 Redis 本身都拥有极其强大的能力,但是存在运维困难、缺乏集群化方案与无法应对微服务趋势带来的挑战等问题。举个例子,当前微服务是一大趋势,大家都在说要做微服务,它可以让计算与存储之间解耦,实现轻量级通信。微服务不需要管理生命同期,而作为系统组件的 Redis 则不然,“我们做服务架构设计时希望把逻辑层和数据层分离开来,但是如果使用 Redis 做缓存,缓存与DB之间的数据一致性问题,以及缓存不命中如何解决等问题都需要使用者在业务逻辑中做相关处理,这增加了一定的复杂度和难度,也增加了逻辑层和数据层的耦合度。”另一方面,山宝银介绍,起初面对海量数据和高性能访问需求,腾讯内部各个团队其实都开发了各自的缓存系统,然而这些系统之间协议不统一、服务模型多样化、不具有通用性容错、扩展能力也参差不齐,所以团队就着手研发了 DCache 这一套通用 Cache 系统,希望整体去解决业务、开发、运维和监控面临的各种挑战。所以也可以看到,目前 DCache 已经应用于腾讯内部多个业务上,包括 QQ 浏览器、应用宝、腾讯地图、腾讯电脑管家、手机管家与腾讯游戏等。SQL、分布式与 NoSQL 的取舍SQL 是指数据库的结构化查询语言,它是数据库的操作命令集,传统的关系型数据库都使用标准的SQL语句操作处理数据。分布式是软件系统的一种架构模式,在分布式系统中,多个硬件或软件组件分布在不同计算机上,彼此之间通过消息传递进行通信,对外表现为一个整体,提供统一化的服务。有一种普遍的观点是,数据库 SQL 与分布式之间存在天然对立性,山宝银的理解是:“分布式系统因为数据分散在不同的节点,所以像 SQL 的联表、事务等操作需要全局的锁保护,这样处理起来比较复杂,并且影响性能。”SQL 还有与 NoSQL 的取舍问题,NoSQL 是指一类数据库,主要用于高性能处理超海量数据,它的一大特点是数据结构简单,以key-value为主,数据之间非关联,容易做水平扩展。从字面上看,NoSQL 似乎是与 SQL 对立的,做 NoSQL 似乎就意味着放弃 SQL,然而实际上 NoSQL 本意是 Not Only SQL,它不仅仅是 SQL,那么也就可以包含 SQL 的能力。“NoSQL 也不是一定就得放弃 SQL,其实在代理层可以增加 SQL 的解析、计算逻辑来实现 SQL 操作,但这样会影响性能,所以还是看应用场景和业务需求。”山宝银为我们简单分析了 DCache “分布式 NoSQL”的意义。在SQL处理方面,分布式似乎存在劣势,然而分布式意味着可以联结更多的廉价计算机,充分运用算力,以低成本的方式应对高强度的并发访问请求,此外分布式架构还有不少优势,比如避免系统单点问题导致的整体故障,实现高可用。而另一方面,山宝银也说到:“DCache 因为主要的目标就是高性能,SQL 操作并不是主要想解决的问题,所以 DCache 没有实现 SQL 的功能。”DCache 分布式策略与能力DCache 对外提供服务的粒度是 group,一个 group 负责一部分的数据分片,至于每个 group 服务哪些数据,是根据数据的 key 做 hash 映射后所处的范围来确定的。DCache 会把数据的 key 通过 hash 算法映射到 0~4294967295 (unsigned int) 范围内,然后把 0~4294967295 范围均匀划分到不同的 group 上。例如有两个 group,key 做 hash 后的值在 0~2147483647 范围就分发到 group1,在 2147483648~4294967295 范围就分发到 group2。在一个 group 内,采用主备架构,只有主节点接收读写请求,所以数据一致性是可以保证的,而当主机不可用时,会触发主备自动切换,保证服务持续可用。DCache 架构我们疑惑 DCache 似乎强依赖于 etcd 与 TARS 等中间件,那它本身的核心特性与能力体现在哪里?山宝银解释,DCache 并不强依赖 etcd,“etcd 只涉及了路由服务 RouterServer 的选主,如果 RouterServer 部署单点也是可用的,而且 RouterServer 的宕机不会影响到数据的读写访问,因为所有的 Proxy 与 Cache 服务都有本地的路由缓存”,关于 TARS 的采用,他说:“因为 TARS 是一个非常优秀的服务开发框架,它屏蔽了底层的网络通信细节,且自带了名字服务等很多服务化需要的功能,对于 DCache 来说,使用已有的 TARS 框架可以更好地做到服务化,我们没有必要去重复的造轮子。”至于 DCache 本身的能力,山宝银介绍:“DCache 自身的存储引擎具有很高的性能,而且支持后接 DB,对使用者来说,不需要再关心 DB 和缓存之间的数据一致性,以及缓存不命中带来的一系列问题。”具体来说,DCache 持久化与 Redis 不一样,后者只是把内存中的数据在本地磁盘做一个备份,保证 Redis 重启之后做数据恢复。“Redis 持久化主要是为了数据备份。DCache 后端有了 DB 以后,业务的逻辑与后台的数据可以完全隔开,DCache自身会处理缓存与DB之间的数据一致性问题。DCache会不断的将Cache中的数据落地后端DB,如果 Cache 中存储空间不够,会将已经落地DB的冷数据淘汰掉。在数据查询的过程中,如果查询Cache不命中,会从 DB 读取并重新存到 Cache,以此来保证 Cache中数据的热点性和命中率,同时 DB 与 Cache 的穿透问题也得到解决。另外,数据持久化到后端DB的能力对于一些需要做离线数据分析的业务场景也比较方便。总之你完全不用关心数据的东西,只需要把数据写到 Cache,后端的落地由 DCache 处理。”DCache 特性此外,DCache 的分布式集群化、异地镜像部署、容灾容错能力在实际线上应用中都会提供非常高的价值。用武之地作为一个分布式存储系统,DCache 的应用场景没有限制在缓存上,山宝银介绍,对于有高性能 NoSQL 存储需求的场景,都可以使用 DCache,而且因为 DCache 具备容量淘汰与过期自动清理数据的功能,对于需要存储热点数据(如热门文章)与临时数据(如有时效性的聊天记录)的场景也可以提供很好的支持。山宝银也提供了 DCache 的性能数据:目前腾讯内部包括 QQ 浏览器、应用宝、腾讯地图、腾讯电脑管家、手机管家与腾讯游戏在内的近百个业务都接入了 DCache,这些业务的体量之大可以想象,山宝银补充:“除了提供的这一组简单的数据,DCache 在高效可靠地支撑着近百个业务的运转,日均调用量过万亿次,这也从侧面说明了 DCache 在生产环境的性能与稳定性。”而除了系统本身高性能、高扩展、高可用与数据安全的设计外,Web 可视化的高效运维平台也成了 DCache 不可或缺的重要能力。基于内存的 NoSQL 存储系统在运维上会产生巨大的额外开销,它需要对相关技术进行深入理解,并且在紧要关头果断做出正确决策。DCache 基于 TARS 开发,所以运维平台将 DCache 与 TARS 的服务管理统一做在了一个模块上,山宝银介绍该运维平台将大大提高效率,同时降低了运维门槛,关于服务的部署、上线、迁移、扩容、监控与配置这些操作都可以轻松实现。嘉宾介绍山宝银,腾讯后台高级工程师,专注于分布式 NoSQL 存储领域的技术研发工作,参与腾讯多个自研存储系统的开发,在分布式系统、高可用与高性能服务等领域有较丰富的经验。 ...

April 15, 2019 · 1 min · jiezi

clickhouse两个表关联后出现几十位的小数

问题在一次clickhouse的数据查询的时候,QA反馈说列表中某些指标数据出现了几十位的小数。开始以为是DataFormat时候bug导致的。于是从接口入手开始跟数据,一直跟到数据源,发现几十位的小数点一直都在。最后打印了执行sql在DataGrip中执行。发现sql产生的数据就带有几十位的小数点,详见图例。之前在clickhouse聚合查询的时候会出现小数后面数字浮动的情况,但这种明显又是另一类的问题。解决于是开始分析这个几千行的sql,精简后其实主要是两个表的单独分组聚合然后再进行关联。单独执行子查询数据是正常的。经过反复尝试后,发现是 子查询 子查询 子查询 中使用了 select * 导致的,将这里换成具体查询的字段数据就正常了。这里使用*是因为报表是需要根据用户所选择的字段动态展示。SQLSELECT *FROM ( SELECT fieldsa, fieldsb, fields1c FROM table1 WHERE condition1 ORDER BY fields1c DESC )ANY LEFT JOIN ( SELECT * //将这里换成具体要查询的字段就可以了 FROM ( SELECT fieldsa, fieldsb, round(sum(fields2c) / 1, 2) AS fields2c, round(sum(fields2d) / 1, 2) AS fields2d FROM table2 WHERE condition2 GROUP BY fieldsa,fieldsb ) ALL FULL JOIN ( SELECT fieldsa, fieldsb, round(sum(fields3c) / 1, 2) AS fields3c, round(sum(fields3d) / 1, 2) AS fields3d FROM table3 WHERE condition3 GROUP BY fieldsa,fieldsb ) USING fieldsa,fieldsb WHERE condition4 )USING fieldsa,fieldsb图例 ...

April 10, 2019 · 1 min · jiezi

Linux环境下下安装hbase单机版

环境要求:1.linux 系统2.jdk安装过程1.下载解压安装文件 wget http://mirror.bit.edu.cn/apac... tar xvfz hbase-0.94.16.tar.gz2.启动HBase /usr/hbase-0.94.16/bin/start-hbase.sh如果报错+======================================================================+ Error: JAVA_HOME is not set and Java could not be found Please download the latest Sun JDK from the Sun Java web site > http://java.sun.com/javase/do… < Hadoop requires Java 1.6 or later. NOTE: This script will find Sun Java whether you install using the binary or the RPM based installer. +======================================================================+ 如图所示需要修改HBase的配置文件,配置文件在conf文件夹下 vi conf/hbase-env.sh增加JDK的位置,以本机为例JDK被放在/usr/lib/jdk下export JAVA_HOME=/usr/lib/jdk/jdk1.7.0_51/如果成功启动会有如下提示信息:starting master, logging to /usr/hbase-0.94.16/bin/../logs/hbase-root-master-localhost.localdomain.out3.查看管理界面访问管理界面的地址:http://192.168.105.130:16010/master-status(从1.2.6开始,默认端口改成了16010,如果你是外网访问,如访问不到,应该是防火墙拦截了,因此要开放该端口,然后重启防火墙就生效了)

April 10, 2019 · 1 min · jiezi

表格存储TableStore全新升级,打造统一的在线数据存储平台!

表格存储TableStore是阿里云自研的面向海量结构化和半结构化数据存储的Serverless NoSQL多模型数据库,被广泛用于社交、物联网、人工智能、元数据和大数据等业务场景。表格存储TableStore采用与Google Bigtable类似的宽表模型,天然的分布式架构,能支撑高吞吐的数据写入以及PB级数据存储。原生的宽表数据模型,存在一些天然的缺陷,例如无法很好的支持属性列的多条件组合查询,或者更高级的全文检索或空间检索。另外在与计算系统的对接上,特别是流计算场景,传统的大数据Lambda架构,需要用户维护多套存储和计算系统,没法很天然的支持数据在存储和计算系统之间的流转。以上这些问题,均在表格存储TableStore在支持阿里巴巴集团内、阿里云公共云以及专有云等业务中逐渐暴露出来。表格存储TableStore简单可靠的数据模型和架构,开始承担越来越丰富的不同类型的数据存储,例如时序时空数据、元数据、消息数据、用户行为数据和轨迹溯源数据等。越来越多的客户也开始把表格存储TableStore当做一个统一的在线大数据存储平台,所以我们迫切需要支持海量数据中对数据的高效查询、分析和检索。同时也需要考虑如何更贴近业务,抽象出更贴近业务的数据模型,让数据的接入变得更加简单。在2019年3月6日的云栖发布会,表格存储TableStore对以下几个方面做了重大升级:提供多种数据模型,满足不同数据场景的需求,简化数据建模和开发。提供多元化索引,满足不同场景下简单或复杂条件查询的功能需求。提供实时数据通道,无缝对接流计算引擎,支持表内数据的实时更新订阅。多模型表格存储TableStore在选择要支持的数据模型的时候,更多的综合了当前业务现状以及用户画像,提取大部分客户的通用需求,总结和定义了产品适合的几大类核心数据场景,来抽象和定义数据模型。数据模型的定义分为『具象』和『抽象』:抽象模型是类似于关系模型或者文档模型的能满足大部分类型数据的抽象,属于比较通用的数据模型;具象模型是对某一具体特征场景数据的抽象,适合单一垂直类的数据场景。表格存储TableStore同时提供抽象和具象模型,当然在介绍这些模型之前,先来明确我们的核心数据场景。核心场景表格存储TableStore的核心场景包含这五大类,分别对应不同类型的应用系统,以及每类数据场景下数据有典型的特征和对存储和计算的特殊的需求,简单来说:时序数据:时序数据解决的是对包含4W(Who, When, Where, What)元素数据的抽象,数据量相对比较庞大,需要存储引擎支持对时间线的索引以及对时间线的时间范围查询。时空数据:时空数据是基于时序数据加上了空间的维度,同时可能没有时序数据的连续性。总的来说,特征和时序数据比较类似。消息数据:消息数据广泛存在于消息系统,例如即时通讯消息系统或者Feeds流消息系统内。消息的存储和传递更像是消息队列模型,但是要求消息队列能够提供海量级消息存储以及海量Topic,这是传统专业级消息队列产品所无法支撑的。元数据:这类元数据属于非关系类元数据,例如历史订单数据、图片智能标签元数据点。特点是量级比较大,每个数据存在的属性比较多且是稀疏的,要求存储能够支持对各种维度属性的条件过滤,对查询可用性有比较高的要求。大数据:这是Bigtable模型所对应的最主要数据场景,特点是数据量极其庞大,需要很好的支持批量计算。TableStore多模型基于以上总结的表格存储TableStore所针对的核心数据场景,我们从业务需求中抽象出三大类数据模型,分别是:WideColumn(宽行模型)、Timeline(消息模型)和Timestream(时序模型)。宽行模型宽行模型是由Bigtable提出,特征是:三维数据结构:对比MySQL的二维数据结构,在属性列这一维度上多了版本属性。同一列数据可以存储多个不同版本,并可定义不同的生命周期,主要用于数据的自动化生命周期管理。稀疏列:表不需要有强格式定义,可以任意的对每一行定义列和类型。大表:一张表可以存储万亿行数据,大表数据根据分区键的范围来分区,不同的分区由不同的机器来加载和提供服务,能比较简单的实现分布式。宽行模型主要应用于元数据和大数据场景,一些典型应用场景可参考:《TableStore实战:智能元数据管理方案》《TableStore实战:亿量级订单管理解决方案》《百亿级全网舆情分析系统存储设计》《基于云上分布式NoSQL的海量气象数据存储和查询方案》我们也提供HBase API兼容的Client:《使用HBase Client访问阿里云NoSQL数据库表格存储》。消息模型消息模型是表格存储TableStore针对消息数据所抽象的数据模型,主要适用于消息系统中海量消息存储和同步,特征是:轻量级消息队列:大表中能模拟海量消息队列,虽然不能完全模拟一个真正消息队列的所有能力,但是能满足对消息最基本的存储和同步能力。消息永久存储:能保证对数据的永久存储,消息写入和同步的性能不会受到数据规模的影响。消息同步模型:对消息同步模型没有严格要求,应用层可以根据自己的业务特征,同时实现推模型或者拉模型。消息模型主要应用于消息数据场景,一些典型应用场景可参考:《现代IM系统中消息推送和存储架构的实现》《TableStore Timeline:轻松构建千万级IM和Feed流系统》《如何打造千万级Feed流系统》《基于TableStore构建简易海量Topic消息队列》《如何快速开发一个IM系统》时序模型时序模型主要应用与时序和时空场景,也是表格存储TableStore综合了业界主流的时序数据库,所定义和抽象的数据模型,特征是:海量数据存储:能提供PB级数据存储,可打造多租户的时序数据库底层存储,写入和查询性能不受数据规模的影响。时间线索引:提供对时间线的索引,能满足对时间线Tag的任何条件组合过滤,并且能够支持比较海量的时间线规模。完整的模型定义:在业界标杆的时序数据库模型定义上,补充了空间维度的定义并且提供空间索引,以及支持多列值支持,不限制只对数值类型的支持。时序模型主要应用于时序和时空数据,一些典型应用场景可参考:《TableStore时序数据存储 - 架构篇》《TableStore实战:轻松实现轨迹管理与地理围栏》查询优化上述场景中提到的对于表内数据的查询优化,最基本手段就是需要对数据建立索引。表格存储TableStore选择的做法是,对于不同类型的查询场景,我们需要提供不同类型的索引。业界对海量数据建立索引的方案有多种,在传统技术架构中应用比较多的主要包括Phoenix SQL二级索引或者Elasticsearch搜索引擎。二级索引能提供高效的固定维度的条件查询,查询性能不受数据规模的影响,而Elasticsearch搜索引擎能提供比较灵活的多条件组合查询、全文索引和空间索引。两种类型的索引实现,有不同的优缺点,以及适用于不同的场景。表格存储TableStore的做法是同时实现和这两类索引原理类似的索引,来满足不同场景下对查询的不同需求。全局二级索引当用户创建一张表时,其所有PK列构成了该表的『一级索引』:即给定完整的行主键,可以迅速的查找到该主键所在行的数据。但是越来越多的业务场景中,需要对表的属性列,或者非主键前缀列进行条件上的查询,由于没有足够的索引信息,只能通过进行全表的扫描,配合条件过滤,来得到最终结果,特别是全表数据较多,但最终结果很少时,全表扫描将浪费极大的资源。表格存储TableStore提供的全局二级索引功能支持在指定列上建立索引,生成的索引表中数据按用户指定的索引列进行排序,主表的每一笔写入都将自动异步同步到索引表。用户只向主表中写入数据,根据索引表进行查询,在许多场景下,将极大的提高查询的效率。更多的技术解读,请参考这篇文章《通过全局二级索引加速表格存储上的数据查询》。多元索引表格存储TableStore多元索引是表格存储TableStore重点打造的一个多功能索引能力,旨在补位二级索引无法覆盖的场景,解决大数据场景下的复杂查询和轻量级分析问题,比如多字段组合查询、前缀查询、通配符查询、嵌套查询、全文检索(分词)、地理位置查询、排序和统计聚合等功能。关于对多元索引的更多解读,可以阅读这篇文章《TableStore多元索引,大数据查询的利器》,关于多元索引的更多应用场景,可以参考以下文章:《TableStore:交通数据的存储、查询和分析利器》《TableStore:爬虫数据存储和查询利器》计算衔接表格存储TableStore已经与比较多的开源大数据计算引擎以及阿里云计算产品衔接,例如Hive、Spark、MaxCompute以及DataLakeAnalytics等,覆盖了批量计算和交互式分析。可以由第三方产品提供的数据通道服务,将表格存储TableStore上的数据全量或者增量复制到计算系统,也可以由计算系统通过Connector直接访问表内的数据。批量计算和交互式分析访问数据存储的方式是批量扫描,主要通过自定义数据Connector的方式。但是其他类计算系统例如流计算或者函数计算(Lambda架构),数据是需要流式的并且实时的从存储系统到计算系统。这个能力是传统开源Bigtable类数据库所做不到的,例如HBase或Cassandra。如果表内的数据可以实时的流动,那将给表带来更丰富的计算和处理场景,例如可以做跨域复制、备份,或者接入流计算引擎做实时分析或者函数计算做事件触发式编程,也可以由应用方自定义数据处理,来做个性化数据处理。表格存储TableStore提供了全新的实时数据通道,能支持订阅表内的实时数据更新,来扩充表格存储TableStore的计算能力。通道服务TableStore 通道服务(Tunnel Service)是基于表格存储数据接口之上的全增量一体化服务,通道服务为用户提供了增量、全量、增量加全量三种类型的分布式数据实时消费通道。通过为数据表建立Tunnel Service数据通道,可以简单地实现对表中历史存量和新增数据的消费处理。基于通道服务用户可以轻松的实现如图所示的场景架构:数据同步、搬迁和备份,流式数据处理以及事件驱动架构。关于对通道服务TunnelService更多的技术解读,可以参考这篇文章:《大数据同步利器: 表格存储全增量一体消费通道》。基于通道服务的更多应用场景,可以参考以下文章:《实时计算最佳实践:基于表格存储和Blink的大数据实时计算》《TableStore: 海量结构化数据实时备份实战 》《TableStore: 海量结构化数据分层存储方案》总结表格存储TableStore通过同时提供具象和抽象的数据模型,来满足不同核心数据场景的要求,更贴近业务抽象;提供多元化索引(全局二级索引和多元索引)来满足不同类型场景条件查询需求;提供全新的实时数据通道,来扩充实时计算的能力以及可自定义的实时数据处理。这三大方面的新功能发布,能够让我们在数据模型、灵活查询以及数据分析层面,都有一定的提升,帮助打造统一的在线数据存储平台。本文作者:木洛阅读原文本文为云栖社区原创内容,未经允许不得转载。

March 11, 2019 · 1 min · jiezi

想了解数据库安全?看这一篇文章就够了!

本文由云+社区发表作者:腾讯云数据库互联网时代,人与人、人与社会交互过程中产生的行为数据、画像数据、信息数据等正在呈指数级增长,同时数据的价值和重要性不言而喻。数据库作为数据的载体,产品和技术也越来越成熟。近几年,不论是商业数据库帝国的蓬勃发展,还是开源数据技术的不断推陈出新,数据库技术的焦点似乎都集中在高性能、低延迟、多场景化应用方面,却很少去关注数据库安全。今天我们来好好聊一聊数据库安全。数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或损坏。安全保护措施是否有效是数据库系统的主要技术指标,而数据安全如同一个木桶,整个防护体系是否坚固完全取决于短板。因此即使网络层、操作系统的安全防护已相对完善,如果存放核心信息的数据库得不到应有的保护,同样会造成较为严重的数据安全危机。数据库安全事件时有发生,处理事故时稍有不慎将会酿成灾难性后果。近日,一次波及范围甚广的事故造成大量用户的数据库异常,导致业务停滞,大量网友在微博吐槽致使TO B类业务登上微博热搜榜实属罕见,短时间行业内外用户的朋友圈被事故文章霸屏。这样的数据安全事故正在给高速发展的互联网服务发出一个“数据安全危机”的红色预警。接下来我们一起盘点“数据安全”的几大重灾区——“天灾”(自然灾害、IDC故障)和“人祸”(黑客攻击、数据信息泄露、人为操作失误)。天灾和人祸一、“天灾”火灾、地震、雷击等自然灾害对数据中心造成的物理伤害会导致数据安全危机。比如雷击,轻微情况可引起设备短路故障,严重则会引发火灾。同时IDC也存在着断电、网络故障、设备老化等一系列影响数据安全的因素。某商业银行核心系统数据库中心出现故障,导致存取款、网银、ATM等多项业务中断长达30多个小时,异地分支机构完全依靠手工办理业务。二、“人祸”人为导致的数据安全危机占数据安全故障总数的的70%。怎么样,这个数据是不是触目惊心。其中也可以分为有意操作和误操作。有意操作是指明知道一些操作会造成数据中心故障,仍执意去做的,这些人往往希望通过造成数据库系统运行瘫痪,而达到不可告人的目的。常见的有黑客、情报人员、商业机密小偷等等,他们攻击的对象往往是数据库里的数据。国内知名信息安全团队“雨袭团”发布报告称,在一年半的时间内,高达8.6亿条个人信息数据被明码标价售卖,个人信息泄露造成的总体经济损失达915亿元,在巨额损失背后是隐藏极深却又庞大的黑色产业链,即数据黑产。误操作是指本意并不想破坏数据库系统,但是由于技术积累经验不够或疏忽引发了数据安全故障。这种故障占到了人为故障的80%以上。网上一直以来都个脍炙人口的段子“从删库到跑路”来调侃这一现象。印度McDelivery(麦乐送)应用泄露了220多万麦当劳用户的个人数据。此次用户数据泄露的根源在于McDelivery公开可访问的API端点(用于获取用户详细信息)未受保护。黑客利用该问题枚举该应用的所有用户,并成功窃取了用户的数据。某物流公司工程师在操作删库过程中,错选了RUSS数据库,打算删除执行的SQL。在选定删除时,因其操作不严谨,光标回跳到RUSS库的实例,在未看清所选内容的情况下,便通过执行删除,RUSS库被删去,导致物流系统故障,无法使用并持续约590分钟。该程序员也因为操作问题被“跑路”了。关于数据库安全危机的预防与应对,数据君也走访了诸多初高阶DBA。初级策略:重启系统,重启系统,重启系统,重要的事情说三遍;先冷备恢复,然后从增量log里面恢复实时数据;先策划好方案,没有出来方案之前,先按兵不动,防止二次事故发生;磁盘数据恢复;别自建数据库系统了,用云数据库。不得不说最后一个老兄眼光很是长远~…..高阶观点:数据库系统的监控手段和历史信息记录为系统的稳定运行提供了保障,通过对这些数据分析,不仅可以找到故障原因,还可以根据进行优化,避免发生二次故障;从初期的数据中心规划设计,到机房建成的验收测试,再到机房运营过程中对于机房的定期检测和对于突发状况的预案等,每一项都需要经过严格的审查;禁止使用存储进程,存储进程难以调试和扩展,更没有移植性;数据订正时,要先select,避免误删去,确认无误才能更新句子;重要数据永远不要直接删去,标记为“删去”状态。不能给程序的用户all privileges、delete、drop等高危命令的权限;应用的网络进行分层规划(接入层、应用层、数据层)。数据层只对固定的应用服务器开放,数据库尽量只放在内网;周密的备份,即使管理员跑路也不怕。腾讯云数据库,誓死捍卫数据安全很多用户说了,物理机自建数据库应该会比云数据库更安全吧?数据都在自己手上,总比放在别人篮子里来的靠谱。先不谈数据阴谋论,单就防范黑客恶意窃取数据和防止数据库误操作导致业务停滞的成本来看,云数据库的好处远超自建数据库。腾讯云数据库(TencentDB)在稳定性、可靠性、安全性、扩展性、易用性和成本维度全面秒杀利用云服务器(即腾讯云的CVM)自建的数据库和物理机自建的数据库,具体指标对比参见下图。腾讯云数据库(TencentDB)尤其重视用户数据安全的保护,面对“数据安全”的几大重灾区,提供了全方位的数据安全保障服务。搜索关注腾讯云数据库官方微信,立得10元腾讯云无门槛代金券,体验移动端一键管理数据库,更有从初阶到高阶数据库实战教程等你来约!对于自然灾害和IDC故障这类“天灾”,TencentDB提供了灾备实例/多可用区、数据传输服务DTS、秒级故障切服务帮助用户以较低的成本提升业务连续服务的能力,同时提升数据的可靠性,避免单地IDC故障导致业务完全瘫痪。灾备实例/多可用区 针对业务连续服务和数据可靠性有强需求或是监管需要的场景,TencentDB提供灾备实例/多可用区,可提供跨地域灾备服务(提供实时备份,秒级切换等)。数据传输服务DTS 提供数据迁移、数据同步、数据订阅于一体的数据库数据传输服务,帮助业务不停服的前提下轻松完成数据库迁移,利用实时同步通道轻松构建异地容灾的高可用数据库架构。秒级故障切换 TencentDB会自动处理故障转移,可以快速恢复数据库操作而无需管理干预。出现可用区中断、主数据库实例故障任一条件,主数据库实例会自动切换到备用副本。对于黑客攻击、数据信息泄露、人为操作失误这类“人祸”,TencentDB提供了DDoS 防护、数据加密、数据审计、数据回档等服务。从外部防护、数据安全传输,以及人为故障的监控和恢复方面,为您的云数据库提供完善的安全防护和高效的故障恢复服务,全链路提高数据资产安全。DDoS防护 在用户数据遭到 DDoS 攻击时,能帮助用户抵御各种攻击流量,保证业务的正常运行数据加密 TencentDB提供透明数据加密 TDE 功能,确保落地数据和备份数据的安全。数据审计 数据库审计能够实时记录腾讯云数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行告警,针对数据库 SQL 注入、异常操作等数据库风险行为进行记录与告警。数据回档 可以使用回档工具对腾讯云平台中的数据库或表进行回档操作,回档是基于冷备+binlog,可进行实时数据回档。期间原有数据库或表的访问不受影响。此文已由腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号

March 5, 2019 · 1 min · jiezi

磊哥评测之数据库:腾讯云MongoDB vs自建

本文由云+社区发表作者:磊哥上期文章我们聊到了redis。这期我们来说说另一个网红nosql数据库:MongoDB。有这么一个介绍MongoDB的说法是:MongoDB是非关系数据库当中功能最丰富,最像关系数据库的。这么说是因为作为一个面向文档存储型、数据结构非常松散自由的的数据库,却拥有着丰富的功能特性如强大灵活的查询语言、支持二级索引等特性,新版本的MongDB甚至还支持事务。听小伙伴说MongoDB不仅功能丰富,而且读性能强大到远远把MySQL甩在后面,今天我就代替大家来动手进行一下数据库测试,揭开MongoDB的神秘“面纱”。为了进行数据库对比测试,这次我购买了腾讯云MongoDB的主从版(1主2从),同时在同样配置的云主机自建MongoDB作为对比。下面给出CentOS7 64位上安装MongoDB 3.6的实践如下:vim /etc/yum.repos.d/mongod-org.repo编辑内容如下:[mongodb-org]name=MongoDB Repositorybaseurl=https://repo.mongodb.org/yum/…$releasever/mongodb-org/3.6/x86_64/gpgcheck=1enabled=1gpgkey=https://www.mongodb.org/stati…执行指令yum install mongodb-org -y安装vim /etc/mongod.conf 此处根据自己需求修改bindIp: 0.0.0.0 #监听地址 port: 27017 #监听端口systemctl start mongod.service #开启服务netstat -anpt | grep 27017 #检查是否启动服务开启后可以使用上面的指令测试服务是否启动,如果成功启动的话会看到结果如下图所示:如果无法启动,需要根据日志分析具体原因。根据笔者的实践,大部分的原因会落在配置和权限上。如果排除错误太难,建议重新安装来的快一点。接下来需要安装数据库测试工具,这次我们使用YCSB,雅虎开发的一个很强大的测试工具。在安装YCSB前需要安装Java和Maven,测试前需要在workloads文件夹中创建配置文件,配置如下图所示:考虑到购买的mongoDB是副本集配置,一个主节点带两个从节点,我们在本地也配置好副本集群,使用用 ./mongod –replSet amymongo –dbpath /data/27019 –port 27019 –logpath /var/log/mongodb/27019.log –fork 配置从节点,具体配置和初始化方法参考https://cloud.tencent.com/dev…(当然部署在本机的方案不能保证高可用)在workloads中防止配置文件,我们选择插入1千万条记录,执行1千万次操作,测试两种场景:read/update 9:1和纯insert场景。废话少说,下面就一起来看看测试结果吧。场景读更新read/update 9:1,单位ops/sec:场景纯写入insert,单位ops/sec:场景读更新read/update 9:1,单位us(延时):场景纯写入insert,单位us(延时):看来mongodb真的是一个高性能的数据库,为啥呢,因为mongo的延时单位居然是us微秒、微秒、微秒。。。16GB的内存基本上20线程之后延时就会大大增加,在100线程的时候基本上延时基本在1000us以上,而读多场景跟写入场景相比,写入场景的性能略差一点,随着线程数的增大,写入场景的吞吐量和延时表现和读更新场景的差距会扩大。有读者可能会有疑惑,既然数据库测试是比较云和自建,看起来差距也没有那么大,用自建好像也可以接受啊。这里我要把测试中的发现讲给大家听,听完之后大家就明白了。第一点,笔者买的是16G内存的机器(流下了没有钱的泪水),测试的时候发现cvm的内存占用基本到了百分之60左右,笔者在建立副本集和加大测试数据量(购买数据量的百分之80)之后发现,内存占用基本到了百分之80以上。看来mongo的第一个缺点,就是对内存的消耗真的非常可怕!!如果遇到高并发大数据量读写,恐怕分分钟就存在着存在着OOM的风险。所以这里奉劝各位同学,如果要自建MongoDB,还是尽量购买超大内存满足业务需求,避免在业务高峰的时候被“干掉”。如果因为跟笔者一样贫穷不想买那么大的内存,可以考虑使用云数据库,云MongoDB具备动态伸缩能力,即使没有买够大的内存,也完全来得及在业务高峰扩容, 即使发生故障,也有完善的数据自动备份和无损恢复机制来恢复数据,在可用性上保障就高多了。第二点,笔者在后续测试本地副本集的时候,尝试读secondary节点的数据,结果遇到了读延迟很高的情况。在网上研究了一下发现是因为,MongoDB 复制集里 Secondary 不断从主上批量拉取 oplog,然后在本地重放,以保证数据与 Primary 一致。这里为了防止脏读,会加一个锁阻塞所有的读请求。所以如果遇到 Secondary 重放 oplog 占用锁时间长,读取的延时也会对应变长。这个锁最高能锁多久呢,看到有个案例锁了接近一个小时。。。看到的人内心一定是崩溃的,而在云Mongo测试的时候没有遇到这个情况,我想这一定是针对这个缺陷做了很大的改进,使用了其他方法实现同步。总的来说,MongoDB确实可以不借助其他第三方工具实现高可用和分片功能,具备的高可用的故障切换,分片可以实现数据的分部均衡,大数据量的时候通过路由实现了服务器的负载均衡。所以MongoDB自身的可用性较高,也难怪会在短短时间内成为流行的nosql数据库。但是MongoDB也存在着一些坑:如对内存的占用过高、对网络的占用过高、存在从节点锁导致读几乎不可用的情况,这些情况在实际业务使用的时候会导致很严重的问题,集群宕机、服务瘫痪、数据丢失无时不刻不是覆盖在运维同学心头的阴影。这个时候云MongoDB几乎就是救星,弹性伸缩、随时扩容、真正安全的数据热备以及强大的专业运维架构师团队,才能真的确保业务安全无故障的运行下去。写到这里,笔者也在思考,云数据库到底是什么,它仅仅是把数据库封装一下,改改内核,提供给使用者吗?不,云数据库应当是一整套专业服务,除了数据库之外,还有监控、安全、迁移、灾备、运维等一系列的服务提供。能让业务开发专注于业务本身,把专业的交给专业的人去做。此文已由腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号

February 26, 2019 · 1 min · jiezi

Neo4j入门之中国电影票房排行浅析

什么是Neo4j? Neo4j是一个高性能的NoSQL图形数据库(Graph Database),它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。 作为图形数据库,Neo4j最让人惊喜的功能就是它可以直观地展示图,也就是节点与节点之间的关系,当然,它还有其它的优势,比如:很容易表示连接的数据;检索/遍历/导航更多的连接数据是非常容易和快速的;能轻松地表示半结构化数据;Neo4j CQL查询语言命令类似于SQL,可读性好,容易学习;使用简单而强大的数据模型;不需要复杂的连接来检索连接的/相关的数据。 在本文中,笔者希望能够通过一个简单的例子来展示Neo4j的使用以及它的强大之处,这无疑更适合于初学者,因为笔者也是刚入门。 以下,笔者并不会过多地介绍Neo4j的操作,只是希望读者能对Neo4j的功能有直观的感受,至于教程之类的,可以参考文章最后的参考文献。 下面,让我们进入本次的Neo4j之旅项目展示 由于《流浪地球》的大热以及笔者对此的欣赏,因此,此次的项目为分析中国电影票房排行。我们的数据来自于百度百科,用爬虫得到我们需要的数据,主要是电影的相关信息,如排名,票房,上映日期等,以及电影的主演。将数据储存为CSV文件,并导入至Neo4j,最后得到电影的简单分析及可视化。 整个项目主要是以下三步:数据获取:利用爬虫实现;数据导入:利用Py2neo实现;数据展示:利用Neo4j实现。其中,Py2neo为Neo4j的Python接口。 整个项目的结构如下图: 接下来,笔者将详细地介绍每一步的操作及代码,let’s go 数据获取 数据的获取始终是一个重要的问题,好在我们有爬虫这个工具。为了能够展示中国电影票房排行中的电影信息以及演员与电影的关系,首先的重要一步就是获取我们需要的需要。 我们需要两份数据。第一份数据,就是中国电影票房排行数据,网址为:https://baike.baidu.com/item/…,页面如下: 我们制作爬虫,将这个表格爬取下来,并将表格的第一行(字段名称)作为电影的相关信息,然后储存为movies.csv。整个过程的Python代码(movie.py)如下:(因为这是公开数据,这个爬虫是合理的。)# -- coding: utf-8 --import requestsimport pandas as pdfrom bs4 import BeautifulSoupurl = “https://baike.baidu.com/item/%E4%B8%AD%E5%9B%BD%E7%94%B5%E5%BD%B1%E7%A5%A8%E6%88%BF/4101787"# 请求头部headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36’}r = requests.get(url, headers=headers)soup = BeautifulSoup(r.text.encode(‘ISO-8859-1’),’lxml’)table = soup.find(’table’)(’tr’)movies = []for line in table[1:]: movie = {‘rank’: int(line(’td’)[0].text), ‘src’: line(’td’)1[0][‘href’], ’name’: line(’td’)[1].text, ‘box_office’: line(’td’)[2].text, ‘avg_price’: int(line(’td’)[3].text), ‘avg_people’: int(line(’td’)[4].text), ‘begin_date’: line(’td’)[5].text.strip(), } # print(movie) movies.append(movie)# print(movies)df = pd.DataFrame({‘rank’: [movie[‘rank’] for movie in movies], ‘src’: [movie[‘src’] for movie in movies], ’name’: [movie[’name’] for movie in movies], ‘box_office’: [movie[‘box_office’] for movie in movies], ‘avg_price’: [movie[‘avg_price’] for movie in movies], ‘avg_people’: [movie[‘avg_people’] for movie in movies], ‘begin_date’: [movie[‘begin_date’] for movie in movies] })# print(df.head())df.to_csv(r’./movies.csv’, index=False) movies.csv中的数据如下: OK,第二份数据,每部电影(共20部)的主演,以《流浪地球》为例,网址为:https://baike.baidu.com/item/…,页面如下:我们只需要爬取每部电影的主演就够了,也就是上图中的红色部分,实现的Python代码(actor.py)如下:# -- coding: utf-8 --import requestsimport pandas as pdfrom bs4 import BeautifulSoupdef get_actors(src): url = “https://baike.baidu.com”+src # 请求头部 headers = {‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36’} r = requests.get(url, headers=headers) soup = BeautifulSoup(r.text.encode(‘ISO-8859-1’),’lxml’) names = soup.find_all(‘dt’, class_=“basicInfo-item name”) values = soup.find_all(‘dd’, class_=“basicInfo-item value”) actors = [] for name, value in zip(names, values): # print(name.text) if ‘主’ in name.text and ‘演’ in name.text: # print(name.text.replace(’ ’, ‘’), value.text) actors = value.text.strip().split(’,’) actors = [actor.strip().replace(’\xa0’, ‘’).replace(’\n[6]’, ‘’) for actor in actors if actor] # print(actors) return ‘,’.join(actors)df = pd.read_csv(’./movies.csv’)actors_list = []for name, src in zip(list(df[’name’]), list(df[‘src’])): actors = get_actors(src) # print(name, actors) actors_list.append(actors)new_df = pd.DataFrame({‘actors’: actors_list})new_df[’name’] = df[’name’]# print(new_df)new_df.to_csv(r’./actors.csv’, index=False) 生成的actor.csv数据如下: OK,数据收集的任务就到此完成了,有了爬虫,轻松搞定数据难题。导入数据 接着,我们需要用到刚才储存的movies.csv和actor.csv,利用Py2neo来将数据导入至Neo4j中。 首先,需要确保你的电脑已安装好Neo4j,Py2neo,并开启了Neo4j服务,具体的安装流程可参考网址:https://www.w3cschool.cn/neo4… 。 利用Py2neo,我们就可以用Python轻松地实现将数据导入至Neo4j,实现的功能为:创建电影节点以及演员节点,并创建两者之间的关系,关系名称为“ACT_IN”。实现的Python代码()如下:# -- coding: utf-8 --import pandas as pdfrom py2neo import Graph, Node, Relationship, NodeMatcher# 读取csv文件movies_df = pd.read_csv(r’./movies.csv’)actors_df = pd.read_csv(r’./actors.csv’)# 连接Neo4j服务graph = Graph(host=“localhost://7474”, auth=(“neo4j”, “jc147369”))# 创建电影节for i in range(movies_df.shape[0]): rank = str(movies_df.iloc[i, :][‘rank’]) name = movies_df.iloc[i, :][’name’] box_office = movies_df.iloc[i, :][‘box_office’] avg_price = str(movies_df.iloc[i, :][‘avg_price’]) avg_people = str(movies_df.iloc[i, :][‘avg_people’]) begin_date = movies_df.iloc[i, :][‘begin_date’] node = Node(“Movie”, name=name, rank=rank, box_office=box_office, avg_price=avg_price, avg_people=avg_people, begin_date=begin_date ) # print(movies_df.iloc[i, :][‘rank’]) graph.create(node)print(‘create movie nodes successfully!’)# 创建演员节点all_actors = set()for i in range(actors_df.shape[0]): actor_list = actors_df.iloc[i, :][‘actors’].split(’,’) for actor in actor_list: all_actors.add(actor) for actor in all_actors: node = Node(“Actor”, name=actor) graph.create(node)print(‘create actor nodes successfully!’)# 创建演员——电影关系for i in range(actors_df.shape[0]): name = actors_df.iloc[i, :][’name’] matcher = NodeMatcher(graph) movie_node = matcher.match(“Movie”, name=name).first() actors = actors_df.iloc[i, :][‘actors’].split(’,’) # print(name, actors) for actor in actors: actor_node = matcher.match(“Actor”, name=actor).first() relationship = Relationship(actor_node, ‘ACT_IN’, movie_node) graph.create(relationship)print(‘create relationships successfully!’)print(‘You can check Neo4j now!’) 只要你的电脑已安装好Neo4j,Py2neo,并开启了Neo4j服务,不出意外,那么你的Neo4j已经默默地储存了这些数据,而它们将会给出带来巨大的惊喜:天呐,这竟然是个数据库! 在浏览器中输入“localhost:7474”,并点击左上方的数据库图标,就能看到下图: 可以看到,在Neo4j中,我们创建了142个节点,分为两类:Movie和Actor,以及136对关系,关系名称为ACT_IN. 当然,这些都是枯燥的,那么我们来看看数据展示这步吧,它会给我们带来什么惊喜?数据展示 好不容易到了数据展示这一步,之前的努力都不会白费! 在Neo4j的前端页面(也就是网址:http://localhost:7474)中的命令行中输入命令:MATCH (Movie)RETURN (Movie);运行命令后,很快就能得到整个图(包含电影节点、演员节点以及关系)的可视化展示,由于图像过大,不能看清细节,因此,就局部放大来看,同时得到一些简单的分析。 首先是图一,吴京主演的电影。在中国电影票房排行榜的前20名中,吴京主演了《战狼2》与《流浪地球》,且两者没有其他更多的相同主演。 接着是图二,沈腾主演的电影。在中国电影票房排行榜的前20名中,沈腾主演了《西虹市首富》、《疯狂的外星人》以及《羞羞的铁拳》,这显示了沈腾的票房号召力(他也是笔者喜欢的喜剧演员),不过开心麻花团队的其他成员在这三部电影的拍摄中应该见不到面。 接着是图三,《捉妖记》及《捉妖记2》。捉妖记系列电影无疑是成功的,两部电影都进了票房的前20,他们的共同主演就多了,有曾志伟,吴君如,井柏然,白百何。 接着是图四,主要是看看Neo4j帮我们挖掘了哪些潜在的关系。从《唐人街探案2》到《捉妖记2》,这个不算长的链条给了我们一些惊喜,原来,刘昊然可以通过尚语贤再通过曾志伟认识李宇春,一个very interesting的分析。当然,这个是笔者的分析,他俩到底认不认识笔者是不知道滴 分析到此结束,如果读者想看原图,可以参看该项目的github地址:https://github.com/percent4/N… 。总结 感谢读者不厌其烦地看到了这里,看完了这篇“又臭又长”的文章,好在图比较多,应该能稍微减轻点阅读的压力。 再说说该项目的不足之处:那就是Neo4j的操作语法展示的比较少,约等于没有,这主要是笔者也是初入门,不熟。如果后续对Neo4j的操作语法CQL熟练了,我们就能能到更多有趣的结果,而不是这么一句简单的分析(有敷衍的嫌疑)。 最后,对此项目感兴趣的读者,可以移步该项目的github地址:https://github.com/percent4/N… 。注意:不妨了解下笔者的微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注参考文献Neo4j_百度百科:https://baike.baidu.com/item/…neo4j教程:https://www.w3cschool.cn/neo4…The Py2neo v3 Handbook: https://py2neo.org/v3/index.htmlNeo4j简介及Py2Neo的用法: https://cuiqingcai.com/4778.html ...

February 24, 2019 · 2 min · jiezi

ElasticSearch重要概念及简单用法

接着上一篇ElasticSearch搭建的环境继续学习,从概念开始,本篇文章将介绍ElasticSearch中的一些重要概念及部分原理性概念,以下内容中简称为ES。一、ES部分名词解释1.NRT:英文全称为Near RrealTime。中文意思为近实时,从写入数据到可以被搜索到之间有一个小于1s的延迟,使用ES进行搜索和数据分析可以达到秒级的速度。注:由于ES写入数据到可以被索引到之间有延迟,所以对于业务中包含有保存幂等性需求时,需要注意; 在写完之后手动执行刷新操作,然后再查询,否则会可能出现数据写重的情况。2.cluster:表示由多个节点组成的ES集群(常见集群种类:HA,HB,HP,具体可自行查阅资料)。集群有一个名称,默认是elasticsearch,可以在配置文件中通过cluster.name字段手动指定,集群最小节点数可以为1个。3.node:集群中的节点。节点也有自己的名称,默认是随机分配的,默认情况下,节点启动之后,会自动去寻找名称为cluster.name字段所指定的集群。如果在默认不修改cluster.name的情况下,启动多个节点之后,它们会自动组成一个ES集群。4.document:文档。它是ES中的最小数据单元,通常使用JSON数据结构表示,每个index(索引)的type(类型)中,都可以存储多个Document。5.field:表示字段,具体指的是Document中的某一个数据字段。比如学生信息文档中的学号字段。6.index:索引。是多个有相似结构的文档数据的集合,类似于MySQL数据库中的数据库概念。7.type:类型。表示某个索引下面的某种相同数据结构的结合。在较低版本的ES中,一个索引中可以有多个type,高版本中一个索引下只能有一个类型,官方建议每个索引下最好只有一个type。如果一个index下有多个type,在不同的搜索场景下可能会相互有影响,比如:一个索引下面有一个用于统计分析的type和一个用于搜索的type,如果统计请求比较慢,有可能会阻塞到查询请求。8.shard:每个index会被拆分为多个shard,每个shard就会存放这个index的一部分数据,这此shard会散落在多台服务器上。有了shard就可以进行横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。shard又分为replica shard和primary shard,每个shard都是一个lucene index.9.replica:每个服务器随时可能故障或宕机,此时shard就可以会丢失,因此可以为每一个shard创建多个replica副本。replica可以在shard故障时提供备用服务。保证数据不丢失或者丢失很少,多个replica还可以提升搜索操作的吞吐量和性能。注意:primary shard:建立索引时一次设置,不能修改,默认5个;replica shard:可随时修改,默认1个),默认每个索引10个shard,5个primary shard, 5个replica shard,最小的高可用配置,是2台服务器。二、ES的文档数据格式的优点1.可以提供复杂的面向对象的数据结构;2.如果不适用ES,使用传统的关系型数据库,复杂的对象只能拍平,放到多个关联表中,查询的时候需要查询多个表,而且还得重新组合成复杂对象,特别麻烦;3.基于ES面向文档的特性,而且提供了倒排索引,所以可以胜任复杂的查询和检索需求;4.使用传统,流行的文档对象来存储,很容易处理;三、ES集群简单管理1.集群健康状态使用_cat相关api查看,如下:[root@es-master ~]# curl http://localhost:9200/_cat/health?pretty#返回结果1549092107 02:21:47 elasticsearch green 3 3 134 67 0 0 0 0 - 100.0%可以看出,如果集群中的所有节点都正常启动,整个集群的状态为green;2.集群的三种状态(1)红(red):不是所有的primary shard都是active状态的,部分索引有数据丢失了;(2)黄(yellow):每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态,此时可以继续使用;(3)绿(green):每个索引的primary shard和replica shard都是active状态的;集群启动时状态变化过程:集群启动的时候,首先会有某些节点先启动,这些节点会被作为主节点,在所有的主节点未完全启动之前,集群此时处于red状态;当主节点全部启动之后,集群状态会变为yellow状态;所有的replica节点都启动完成之后,集群中的所有节点都已经齐全,此时集群变为green状态;3._cat中的重要api查看集群中的节点数[root@es-master ~]# curl http://localhost:9200/_cat/nodes?pretty192.168.199.12 29 95 12 0.00 0.08 0.06 mdi * es-node2192.168.199.11 41 88 25 0.64 0.75 0.57 mdi - es-node1192.168.199.11 20 88 25 0.64 0.75 0.57 mdi - es-node3表示集群中有三个节点,es-node1,es-node2,es-node3;查看集群中的分片数[root@es-master ~]# curl http://localhost:9200/_cat/shards?prettystudent_index 3 p STARTED 1 4.3kb 192.168.199.11 es-node1student_index 3 r STARTED 1 4.3kb 192.168.199.11 es-node3student_index 2 p STARTED 2 8.5kb 192.168.199.12 es-node2student_index 2 r STARTED 2 8.5kb 192.168.199.11 es-node3student_index 1 r STARTED 1 4.4kb 192.168.199.11 es-node1student_index 1 p STARTED 1 4.4kb 192.168.199.12 es-node2student_index 4 p STARTED 1 4.4kb 192.168.199.11 es-node1student_index 4 r STARTED 1 4.4kb 192.168.199.11 es-node3student_index 0 p STARTED 0 261b 192.168.199.12 es-node2student_index 0 r STARTED 0 261b 192.168.199.11 es-node3表示student_index索引默认有10个分片,5个primary和5个replica;查看集群中的索引列表[root@es-master ~]# curl http://localhost:9200/_cat/indices?vhealth status index uuid pri rep docs.count docs.deleted store.size pri.store.sizegreen open .monitoring-es-6-2019.01.27 kXMATwLHShGoGrAhOVPZqg 1 1 39439 432 48.3mb 24.1mbgreen open .monitoring-kibana-6-2019.01.27 PpgWm9PSRXKU385_pQis2g 1 1 1512 0 1mb 531.7kbgreen open .elastichq 19vJX4__TcunPjMCfybmdA 5 1 1 0 14kb 7kbgreen open student_index 8VHSS7wyQIadWBcNWJsGPQ 5 1 5 0 43.9kb 21.9kbgreen open student VXHrKYNcSRKELb7WSzToCw 5 1 2 0 23.8kb 11.9kb默认展示的是系统索引和自己创建的索引,参数v表示查看详细信息;_cat还有其他api,但是不是很常用,如果需要,可以通过如下命令查看即可[root@es-master ~]# curl http://localhost:9200/_cat=^.^=/_cat/allocation/_cat/shards/_cat/nodes/_cat/tasks…四、ES简单操作此处以电商系统商品搜索为例,使用kibana图形化操作界面,介绍ES的简单操作。1.创建用法:PUT /index_name/type_name/id{}例如:创建一个索引名称为shop_index,类型为productInfo,id为1的索引PUT /shop_index/productInfo/1{ “name”: “HuaWei Mate8”, “desc”: “Cheap and easy to use”, “price”: 2500, “producer”: “HuaWei Producer”, “tags”: [ “Cheap”, “Fast” ]}2.查询用法:GET /index_name/type_name/id例如:查询id为1的商品信息GET /shop_index/productInfo/1{ “_index”: “shop_index”, “_type”: “productInfo”, “_id”: “1”, “_version”: 1, “found”: true, “_source”: { “name”: “HuaWei Mate8”, “desc”: “Cheap and easy to use”, “price”: 2500, “producer”: “HuaWei Producer”, “tags”: [ “Cheap”, “Fast” ] }}3.修改方法一:替换,通过ID替换,如果文档存在,则直接覆盖用法:PUT /index_name/type_name/id{}例如:将商品价格修改为2400PUT /shop_index/productInfo/1{ “name”: “HuaWei Mate8”, “desc”: “Cheap and easy to use”, “price”: 2400, “producer”: “HuaWei Producer”, “tags”: [ “Cheap”, “Fast” ]}注意:替换某个文档时,需要带着文档中的所有字段,否则未带着的字段会丢失,切记!!!方法二:通过ID更新部分字段用法:POST /index_name/type_name/id/_update{}例如:将上述商品的价格改为2200POST /shop_index/productInfo/1/_update{ “doc”: { “price”: 2200 }}4.删除用法:DELETE /index_index/type_index/id例如:删除id为1的商品记录:DELETE /shop_index/productInfo/1本篇文章简单介绍了ES的一些重要概念及基本用法,为后续内容做铺垫,下篇文章将继续ES的多种搜索方式!欢迎评论转发! ...

February 22, 2019 · 2 min · jiezi

对话 CTO〡和 PingCAP CTO 黄东旭聊开源数据库新蓝海

专栏介绍「对话 CTO」是极客公园的一档最新专栏,以技术人的视角聊聊研发管理者的发展和成长。本专栏由ONES 的创始人&CEO 王颖奇作为特邀访谈者。王颖奇曾参与金山软件 WPS、金山毒霸等大型软件的核心开发工作;2011 年创立了正点科技,旗下产品正点闹钟、正点日历在全球用户过亿;2014 年,王颖奇在知名美元基金晨兴资本任 EIR,并以个人身份参与十余家公司的管理咨询工作;2015 年,王颖奇创立 ONES,致力于提供企业级研发管理解决方案。摘要有像甲骨文这样的统治级巨头在,数据库市场还是个好的创业领域吗?在 PingCAP 联合创始人&CTO 黄东旭眼中,答案是肯定的,数据库行业的转折点已经到了。黄东旭曾在豌豆荚从事 infrastructure 相关工作,在分布式存储领域有着多年的积累和实战经验。在他看来,伴随着分布式数据库理念和技术的成熟,对传统数据库理念和技术的依赖正在走向瓦解。开源理念的普及也在加速数据库行业走向下一个阶段,「像数据库、操作系统、云技术,或者云内部的基础软件,未来只有开源一条路,如果不开源,或者说内核不开源的话,产品的生命力是很差的。」一切正在 PingCAP 中顺利落地。作为开源新型分布式数据库公司,PingCAP 研发了分布式关系型数据库 TiDB 项目,具备「分布式强一致性事务、在线弹性水平扩展、故障自恢复的高可用、跨数据中心多活」等核心特性。目前公司准生产测试用户 1400 余家,涉及互联网、游戏、银行、保险、证券、航空、制造业、电信、新零售、政府等多个行业。本期对话 CTO,我们请到了 PingCAP CTO 黄东旭来谈一谈他对于数据库行业的技术和行业演进的理解,以及商业公司究竟需要什么样的数据库。分布式数据库、开源数据库的蓝海机遇在哪?颖奇:PingCAP做的事情,我认为在中国工业领域上具有很大意义。因为几乎没有其他公司做过,你们是怎么想到做这件事的?黄东旭:中国过去也不是没有做数据库的公司,我们和他们不太一样在于,一是我们是类似于互联网公司,或者说创业公司的路径,是走融资发展的;二是技术上,我们公司是基于分布式数据库的理论成立的。过去三四十年,数据库市场都是依赖像 Oracle、IBM 所建立的理论基础运行。但在 21 世纪,Google 提出分布式系统技术后,随着硬件条件的成熟,像 SSD、万兆的网卡,带来的改变就是处理的数据量在持续地变大。数据库市场到了需要去做修订或者说要有个转折的地方了。数据库行业最根基的东西在发生变化,而这一块还没人做,所以说一定要找到正确的切入点。颖奇:你们找到的切入点是什么?黄东旭:就是分布式理论怎么跟传统关系数据库理论融合的点。最近这些硬件的革新,使得原来很多的假设都不成立了。比如过去大家可能觉得数据库的瓶颈是磁盘,想怎么设计一个更好的 B-Tree 能够让磁盘磁头转得少一点。但现在全是 SSD,甚至未来可能持久化内存的东西都出现了。过去分布式系统的网络这么慢,带宽这么小,所以尽可能都是在单机或者本地上去做。但现在基本上单机访问远程数据库和访问本地数据库在吞吐量上表现差不多了。还有就是选择「开源」。中国传统软件数据库的技术软件商业模式,跟传统的软件很像,就是做一个产品,招一堆销售挨家敲门。我们觉得这样效率太低。就现在而言,基础软件好不好关键是在于怎么在最短的时间找到最多人来去用这个产品,能够让它变得更好,变成一个正向循环。但传统软件招销售并不是一个特别好的选择,因为扩张速度取决于销售敲门的速度。颖奇:靠销售肯定来不及。黄东旭:所以我们喜欢「开源」。「开源」相当于用一些 to C 的方法论,在工程师的社区里通过病毒式传播让产品 adoption,别人用得不爽一定会 feedback 提 issue。用的人越多,它的质量就越好,质量越好,会变成一传十,十传百的这种效应,让产品正向循环下去。对于基础软件,我的观点是像数据库、操作系统、云技术,或者云内部的基础软件,未来只有开源一条路,如果不开源,或者说内核不开源的话,产品的生命力是很差的。不像其他的商业软件,基础软件就像在水管、水电煤这样的基础设施的层面上,你不开源的话别人也不敢用。颖奇:我们看到在中国实际上有两件事情之前没怎么做好。第一是特别基础的软件,第二是做一个特别好的开源公司,你们算是把两种结合起来的「鼻祖」。请问你们具体是怎么做的呢?黄东旭:我觉得有一点是因为 PingCAP 或者 TiDB 选的这个坑特别好。过去大家都知道 MySQL 数量大了以后只能 sharding,现在 TiDB 就是解决这个坑。大家都非常清楚这是个痛点,你不用去跟别人解释这就是一个非常厉害的内核代码。有需求有痛点,然后问题足够清晰,也足够大。颖奇:那你觉得开源这个事情会把PingCAP带到一个什么样的位置上?黄东旭:从数据库的角度上来看,大家会发现,最早的关系数据库 SQL、TSQL,在互联网或者移动互联网开始爆发的时候,数量开始膨胀,单机系统怎么样都搞不定的时候,互联网公司没有办法,只能去做了一套 NoSQL,但 NoSQL 又有点过了,就把原来的传统管理模型全都扔掉,但至少能把数据存下来。所以我觉得历史是螺旋式发展。其实这两年已经开始有这个趋势,就是新一代的数据库又开始回归 SQL 模型,可能未来持续十年会有一个关系型数据库的复兴吧。过去是因为分布式理论,以及硬件环境没有办法去跟这个模型很好地结合在一起。但至少以我们的经验来说,现在分布式基本上能满足很多需求。颖奇:所以传统数据库公司是在单机上解决这种数据的问题?黄东旭:对,我觉得未来数据一定是更大的状态,单机肯定是有问题的。硬件成本持续在下降,一定会到达一个临界点,就是数据本身的价值都比硬件成本要高,这样一来,我肯定是保护数据,怎么样把我的数据能无限存下来,并且能快速通过好用的接口来访问它。我觉得这个市场会很大,所以我从来都不跟别人说这个事情的天花板在哪里,因为我自己也不知道。颖奇:早期还是在数据价值比较大的行业里来应用会更好一些?黄东旭:我们早期策略上分两块,一块就是互联网公司,workload 数量很大,然后有很强的研发团队,开源社区的主力就是这帮人,随便用,而且我会很鼓励你们投人投精力去用它。还有一部分是一些高净值客户,比如银行,业务已经倒逼他们要去用一些互联网的技术去解决问题。比如说即使 Oracle 用得不好,迁到 TiDB 上其实也是很平滑的过程,同时可以保证多数据中心高可用、强一致等这些特性,用起来很省心。我觉得我们就是拿互联网最先进的技术给到传统公司,给他们赋能,而且让对方的迁移成本降得很低。「商业公司」如何管理「开源社区」颖奇:可以跟大家讲一下PingCAP对人才的要求和你们的管理方法吗?黄东旭:我一直信奉一句话,「Hire for attitude, train for skill」。首先你要打心底里认可这个事情,是一切往后谈的基础。这对我们来说不难,很多工程师他们还是有共同理想的。第二点就是研发人才的 skill set,我可能会更倾向于是在互联网,或者说在做这种大规模分布式系统。互联网人有个优势在于他们对新技术的接受度特别高,思想特别开放,没有一些条条框框的东西。第三点就是特别喜欢年轻人,我们会刻意地让团队里面有一些非常新鲜的血液。第四点的话我们并不强求,就是人的责任心和主人公意识,这其实跟我们的晋升体系有关。我们的晋升体系跟 Facebook 很像,团队在实际工作的时候,让员工的特点会慢慢浮现出来。比如说小明,每件事情交给他都特别靠谱。大家都公认觉得他是个靠谱的人,慢慢形成这样的效果。对于小公司来说,没办法把每个人每天的工作,每个任务都亲自去帮你规划好。所以我们的管理风格还算是比较粗放吧。颖奇:你们公司现在是有一些外籍工程师?黄东旭:对,我们也有一些外籍人士,大概七八个人吧。我们比较国际化。因为我们这个项目是开源的,用户用出问题了一般会去上面提一个 issue,很多国内用户直接用中文写 issue 上去,我们还有一个团队专门把中文 issue 翻译成英文,因为这个东西要同步嘛,在别人遇到同样问题去搜索的时候也能看到。颖奇:你们的TiDB或者TiKV里,我看到有几百个contributors,那里面有多少是外籍的?黄东旭:一半。包括我们的文档都是中英文一对一的比例。我觉得在哪做这个事情,这个问题已经不重要了。包括现在我们很多人才,在加入之前就已经是项目的粉丝,有些人甚至都不用面试,都不用看 GitHub,因为这个人天天就在 commit code。我们在国内的招聘方式也是挺特殊的,我们不太关心你到底在哪个城市工作。我们重度依赖像 Google Docs、Slack、GitHub、Jira、Confluence 这种生产力工具,基本上能够摆脱面对面的会议,这个是很重要的。我们不鼓励开长会,如果要开会,就开半个小时、15 分钟的短会。远程有个好处就是它会迫使工程师把所有想做的东西进行文档化,任何东西都可以被检索。我觉得这样更符合现代化的管理模式,有充足的时间,更加灵活地安排自己的生活,是一个更好的工作方式。颖奇:开源社区可能有一套管理模式,商业公司也有自己的管理模式,现在你们在这两边的管理模式是一样的还是说会有一些区别?黄东旭:我们是一样的。你可以认为我们自己的员工跟社区小伙伴的区别,就 TiDB 内核部分的开源来说,唯一区别就是我们给他们工资。颖奇:你觉得未来中国会有很多这样的工作出现吗?黄东旭:我觉得在技术软件行业会越来越多。颖奇:早期美国的很多开源软件没有太多资本介入,所以发展周期会很长。你觉得资本介入会使得开源软件发展周期变短吗?黄东旭:没有资本介入,或者说没有商业公司在后面支持的话,开源软件都不会有太强的生命力。开源我认为是分成两个阶段,一个是 1.0,一个是 2.0。1.0 是当年像 Glue、 GCC、Linux 内核这些项目;2.0 是就最近的这几年像 Eclipse、MongoDB、Databricks 这些开源软件公司,这些模式其实是更先进的,或者更加符合现在时代的做法。中国其实过去没有这样的东西,我们算是第一波。颖奇:早期的开源公司商业化诉求没那么快,所以贡献者相对平等,也没有经济回报。现在您这边的项目里有两种方式,可能一百个工程师是拿回报的,另外一百个可能是不拿回报的。那现在一个项目里混杂了两种组合方式,你们的解决方案是什么?黄东旭:我觉得其实这个问题的本质是:为什么要来(社区)。两种情况,一种就是我实际就在用这个东西,发现这个东西不好,某些地方有 bug 或者说某些地方的功能不是我想要的,我想要去改进它。大多数机构都是出于这种思路来贡献的。第二种人就是纯粹为了做出成就感。觉得这事情很不错,我能参与到这个项目来了,「I want to help」,我想去帮助别人,同时我能够得到证明,我是这个项目的 heavy contributor、committer,得到尊敬或者认同感。对每一个 contributor,哪怕提交一行代码或者修改一个文档,我们都会给他一个大礼包,包括贴纸、杯子等等周边产品。如果贡献比较多的话,我会亲手给你写一封明信片表达感谢,包括我们每年办的这些大会,只要是 contributor 都是免费的。颖奇:我觉得这个挺棒的。再问最后一个问题,你可以推荐几本书,给已经是CTO或准备想当CTO的人学习和借鉴。黄东旭:我有几本书是很喜欢的,《Unix 编程艺术》是到目前来说对我影响最大的跟编程和计算机相关的书。更技术一点的是《Unix 环境高级编程 (APUE) 》。很多人想学编程可能看这本书够了,其他什么书都不用买,就这个。还有《大教堂与集市》,这个介绍 open source 的原始出发点。然后我最近在读《毛选》,还有王小波的小说。颖奇:《Unix编程艺术》这本我也会推荐给年轻人看。这本书对我的影响非常大,读完使得我对整个计算机的软件体系结构有了非常深刻的认识。第一次读是在13年前了,至今对我的工作和创业都有很大的帮助。非常感谢东旭今天的分享。本文作者:王颖奇,联系方式:wangyingqi@gmail.com ...

February 21, 2019 · 1 min · jiezi

Raft leader 选举

通信:两种类型的RPCRequestVote RPCs candidates during elections.AppendEntries RPC leaders to replicate log entries and to provide a form of heartbeat.leader 选举Raft使用一个heartbeat机制触发leader选举。当servers启动,首先成为followers。只要server收到来自leader或candidate的有效RPCs消息,就一直保持follower的状态。Leaders定期给所有的followers发送heartbeat,以维护它的统治。如果一个follower超过一定时间未通信,则叫作election timeout,然后就假设现在没有有效的leader,然后开始选举流程选出新的leader。在选举之前,follower自增它当前的term号,转化为candidate状态。然后投票给自己,并并行地给剩下的每一个server发送 RequestVote RPCs。Candidate保持candidate的状态直到下面的一种情况发生:(a) 此candidate赢得选举;(b) 另一个server已被选为leader;(c ) 一段时间过去后仍没有server胜出。下面的章节将分开讨论这些情况(a) 在同一个term中,如果candidate获得大多数servers的选票,此candidate赢得此次选举。在给定的term中,每一个server最低投票给一个candidate,遵守先来先得的原则。大多数的规则保证最多一个candidate在特定的term中赢得选举。一旦一个candidate赢得选举,它就成为leader。然后就开始发送heartbeat 信息到其他所有的servers来建立它的权威并阻止新的选举。(b)在等待投票的过程中,candidate可能会收到来自其他自称是leader的server的AppendEntries RPC。如果leader的term号至少与candidate的当前term号一样大,则这个candidate就认为这个leader是合理的,然后退回到follower的状态。如果term号小于candidate的,则拒绝RPC并继续保持candidate状态。(c ) 第三种结果是candidate既没有赢也没输:如果许多followers同时成为candidates,可能会发生平票。这种情况下,每一个candidate将timeout,通过递增term开始一个新的选举,产生新一轮的RequestVote RPCs。然而,没有额外的措施,平票会无限重复下去。Raft使用随机生成的选举timeouts来保证平票发生的机会很少,并很快解决。为了第一时间阻止平票,选举timeouts在一个固定区间内随机产生(e.g., 150-300ms),从而保证在大多数情况下,最多有一个server将time out;它赢得选举并在其他servers time out之前发送heartbeats。相同的机制也用来处理平票问题。

January 30, 2019 · 1 min · jiezi

ETCD recover solution

Case of unreachable memberA cluster with etcd containers is created successfully, for example, one of their creation config files looks like:{ “repository_id”: “Etcd”, “image_tag”: “0.2.0-guoxiang”, “name”: “etcd-re-create-guoxiang”, “hostname”: “hostname1”, “datapool”: [{ “mount_id”: “etcd_data”, “mount”: “/data”, “quotagroup”: “etcd-guoxiang-05”, “size”: “600”, “size_unit”: “MB”, “filesystem”: “xfs” }], “ports”: { “2379/tcp”: “3379”, “2380/tcp”: “3380” }, “env”: { “IP”: “10.23.2.109”, “ETCD_ADVERTISE_CLIENT_URLS”: “https://10.23.2.109:3379”, “ETCD_INITIAL_ADVERTISE_PEER_URLS”: “https://10.23.2.109:3380”, “ETCD_INITIAL_CLUSTER”: “hostname1=https://10.23.2.109:3380,hostname2=https://10.23.2.108:3380,hostname3=https://10.23.2.110:3380”, “DATA_CENTER”: “us-south”, “PROFILE”: “production” }}We can check the cluster status with the following command.Tips: You should get client-key.pem, client.pem and ca.pem before you run the command.# etcdctl –endpoint https://10.23.2.109:3379,https://10.23.2.108:3379,https://10.23.2.110:3379 –key-file ./client-key.pem –cert-file ./client.pem –ca-file ./ca.pem cluster-healthIf the cluster is running normally, the output looks like:member 5e9e9b11fe249dad is healthy: got healthy result from https://10.23.2.109:3379member 685a3bee5e91c225 is healthy: got healthy result from https://10.23.2.108:3379member eea45c825bf56feb is healthy: got healthy result from https://10.23.2.110:3379cluster is healthyIf one member failed, the output may look like:failed to check the health of member 5e9e9b11fe249dad on https://10.23.2.109:3379: Get https://10.23.2.109:3379/health: dial tcp 10.23.2.109:3379: connect: connection refusedmember 5e9e9b11fe249dad is unreachable: [https://10.23.2.109:3379] are all unreachablemember 685a3bee5e91c225 is healthy: got healthy result from https://10.23.2.108:3379member eea45c825bf56feb is healthy: got healthy result from https://10.23.2.110:3379cluster is healthyThe reason may meet one of the following four cases.Case 1: The whole environment of an etcd container was destroyed.SolutionRemove the destroyed member with etcdctl.# etcdctl –endpoint https://10.23.2.109:3379,https://10.23.2.108:3379,https://10.23.2.110:3379 –key-file ./client2-key.pem –cert-file ./client2.pem –ca-file ./ca.pem member remove 5e9e9b11fe249dad5e9e9b11fe249dad is memberID of the unreachable member.Create a new etcd container with adding the following environment variables to env in config file.“ETCD_INITIAL_CLUSTER_STATE”: “existing"“ETCD_INITIAL_CLUSTER”: <The cluster peer urls with the new etcd container>An example is as follows.{ “repository_id”: “Etcd”, “image_tag”: “0.2.0-guoxiang”, “name”: “etcd-re-create-guoxiang”, “hostname”: “hostname1”, “datapool”: [{ “mount_id”: “etcd_data”, “mount”: “/data”, “quotagroup”: “etcd-guoxiang-05”, “size”: “600”, “size_unit”: “MB”, “filesystem”: “xfs” }], “ports”: { “2379/tcp”: “3379”, “2380/tcp”: “3380” }, “env”: { “LPAR_IP”: “10.23.2.109”, “ETCD_ADVERTISE_CLIENT_URLS”: “https://10.23.2.109:3379”, “ETCD_INITIAL_ADVERTISE_PEER_URLS”: “https://10.23.2.109:3380”, “ETCD_INITIAL_CLUSTER”: “hostname1=https://10.23.2.109:3380,hostname2=https://10.23.2.108:3380,hostname3=https://10.23.2.110:3380”, “ETCD_INITIAL_CLUSTER_STATE”: “existing”, “DATA_CENTER”: “us-south”, “PROFILE”: “production” }}“hostname2=https://10.23.2.108:3380,hostname3=https://10.23.2.110:3380” in ETCD_INITIAL_CLUSTER are the peer urls of the cluster after removing the destroyed member.Add the new container to the existing cluster.# etcdctl –endpoint https://10.23.2.109:3379,https://10.23.2.108:3379,https://10.23.2.110:3379 –key-file ./client2-key.pem –cert-file ./client2.pem –ca-file ./ca.pem member add <name> <peerURL><name> is hostname in its config file.<peerURL> is one of ETCD_INITIAL_ADVERTISE_PEER_URLS in its config file.Case 2: The etcd container doesn’t exist.SolutionAdd “ETCD_INITIAL_CLUSTER_STATE”: “existing” to the container creation config file. An example is as follows.{ “repository_id”: “DBaaSEtcd”, “image_tag”: “0.2.0-guoxiang”, “name”: “etcd-re-create-guoxiang”, “hostname”: “hostname1”, “datapool”: [{ “mount_id”: “etcd_data”, “mount”: “/data”, “quotagroup”: “etcd-guoxiang-05”, “size”: “600”, “size_unit”: “MB”, “filesystem”: “xfs” }], “ports”: { “2379/tcp”: “3379”, “2380/tcp”: “3380” }, “env”: { “LPAR_IP”: “10.23.2.109”, “ETCD_ADVERTISE_CLIENT_URLS”: “https://10.23.2.109:3379”, “ETCD_INITIAL_ADVERTISE_PEER_URLS”: “https://10.23.2.109:3380”, “ETCD_INITIAL_CLUSTER”: “hostname1=https://10.23.2.109:3380,hostname2=https://10.23.2.108:3380,hostname3=https://10.23.2.110:3380”, “ETCD_INITIAL_CLUSTER_STATE”: “existing”, “DATA_CENTER”: “us-south”, “PROFILE”: “production” }}Create the container with the new config file, but keep the other configurations as same as before.Case 3: The etcd container was stopped.SolutionStart the container.# docker start <container>Case 4: The etcd service was stopped in its container.SolutionRestart the stopped etcd container.# docker restart <container>Case of unhealthy memberIf a member is unhealthy, we can refer to above case 2 to remove its container with metadata, then create a new one to fix it. ...

January 30, 2019 · 3 min · jiezi

Raft协议的一些概念

一些概念相比于其他一致性算法(paxos)的优势更简单,更容易理解描述得很完备被开源项目实现并且被一些公司采用安全性得到了证明有效性可与其他算法相比拟。最关键的优势还是更容易理解。服务器的三种状态:Leader, follower, candidateLeader: 处理客户端的请求Follower: 仅响应来自leaders和candidates的请求Candidate: 选出一个leader.三种状态之间的转换开始时,所有的servers的状态都是follower;其中一个follower最早发现没有leader的heartbeat发送过来,这叫times out,然后此follower就转化为candidate进入选举阶段。选举超时,也叫times out。一旦选举超时,则进入下一个选举阶段;如果一个candidate得到大多数的投票,则成为leader;如果leader发现有更高term的server,则自动转化为follower;如果candidate发现了当前的leade化为follower。Terms描述在Raft中term的角色是一个逻辑时钟如上图所示:term的编号是连续的整数;term都是以选举开始;每个etcd服务器都存储当前的term号,并随时间单调递增;服务器通信时都要交换当前的term号;如果服务器的当前term号小于其他的,则更新到较大的。如果candidate或者leader发现自己的term号过期,则马上退回到follower的状态;如果server收到带有旧的term号的请求,则拒绝。平票问题这种情况下,此任期将无leader选出,一个新的term(选举)将会马上开始。Raft会保证在一个给定的term中最多有一个leader。Raft采用服务器term时长随机生成的方法来保证总会有一个leader产生。

January 29, 2019 · 1 min · jiezi