分布式架构+多模正在成为新一代数据库技术的主流技术架构,其中处理非结构化数据的能力成为新一代数据库的关键功能点。本文也将从一个实际企业案例出发,介绍分布式数据库在影像数据管理场景下的最佳实践。
内容数据管理需求
需要实现跨业务的企业内容管理系统整合和处理,由于部分业务系统企业内容数据独立,未形成企业级内容统一存储,造成在需要企业内容数据跨业务进行处理和展现时,不同业务系统对企业内容数据的调用处理复杂 数据量增长太快,传统企业内容管理系统依赖于关系型数据库,在记录数超过亿级别之后,检索内容记录的响应时间变慢,很难实时过滤企业内容数据特征比如基于内容标签的实时推荐,并且无法在全表多索引数据回溯 传统企业内容管理系统建设成本较高,水平扩展复杂。在银行海量数据存储需求的背景下,需要高性价比的数据存储持续在线,保留源结构的长期数据并且能做到秒级快速索引数据回溯,以满足复杂在线交易和历史数据查询需求,因此,未来企业内容管理系统需满足在线水平扩展
技术要点
用低成本的分布式存储管理海量数据
非结构化数据和结构化数据的统一管理
高并发处理能力,随集群水平扩展性能线性提升
同城灾备或异地灾备
多中心部署
整体架构及功能介绍

批次服务
文档服务
检入检出
版本控制
访问控制
数据归档
内容管理
数据同步管理
配置管理
系统管理
报表展现
门户
技术难点
每个业务系统使用独立的域进行存储(可以在同一个物理设备上,但是域要独立,数据域之间可以重叠数据组) 每个业务划分为结构化域和非结构化域 结构化域里面保存元数据信息,使用主子表按照时间切分,每个子表按照ID散列分布到域所对应的所有机器上 非结构化域里面保存对象数据,LOB不支持垂直分区,为了避免集群扩容对象数据重新均衡,在存储规划时可根据对象数据总的存储量及增长量采用按年或者按月的方式进行写入,LOB写入对应的集合空间和集合名称由接入平台维护 结构化域扩容可使用增加数据组再进行数据均衡切分到新扩容的机器上或者指定子表所属数据组在新扩容机器的数据组上 非结构化域扩容创建集合时所属数据组直接指定到新扩容机器的数据组上(这种方式适合前期规划时按月或年的方式,对应规划时存储在一个集合中的情形扩容后增加数据组需数据均衡)
结构化数据以主子表的方式进行存储
非结构化数据以月为单位创建表进行存储
操作示例
db.createDomain('metaCSDomain',["group1","group2"],{AutoSplit:true});db.createDomain('lobCSDomain',["group1","group2"],{AutoSplit:true});
db.createCS('metaCS', {"Domain":'metaCSDomain'});db.createCS('lobCS', {"Domain":'lobCSDomain',"LobPageSize":logPageSize});
db.metaCS.createCL('metaCL',{"ShardingKey":{"CREATETIME":1},"ShardingType":"range",ReplSize:-1,"Compressed":true,"CompressionType":"lzw","IsMainCL":true});db.metaCS.createCL('metaCLMin',{"ShardingKey":{"_id":1},"ShardingType":"hash",ReplSize:-1,"Compressed":true,"CompressionType":"lzw","AutoSplit":true,"EnsureShardingIndex":false});db.metaCS.createCL('metaCL2017',{"ShardingKey":{"_id":1},"ShardingType":"hash",ReplSize:-1,"Compressed":true,"CompressionType":"lzw","AutoSplit":true,"EnsureShardingIndex":false});db.metaCS.createCL('metaCL2018',{"ShardingKey":{"_id":1},"ShardingType":"hash",ReplSize:-1,"Compressed":true,"CompressionType":"lzw","AutoSplit":true,"EnsureShardingIndex":false});db.metaCS.createCL('metaCLMax',{"ShardingKey":{"_id":1},"ShardingType":"hash",ReplSize:-1,"Compressed":true,"CompressionType":"lzw","AutoSplit":true,"EnsureShardingIndex":false});db.metaCS.getCL('metaCL').attachCL('metaCLMin',{"LowBound":{"CREATETIME":{$minKey:1}},"UpBound":{"CREATETIME":"20170101"}});db.metaCS.getCL('metaCL').attachCL('metaCL2017',{"LowBound":{"CREATETIME":"20170101"},"UpBound":{"CREATETIME":"20180101"}});db.metaCS.getCL('metaCL').attachCL('metaCL2018',{"LowBound":{"CREATETIME":"20180101"},"UpBound":{"CREATETIME":"20190101"}});db.metaCS.getCL('metaCL').attachCL('metaCLMax',{"LowBound":{"CREATETIME":"20200101"},"UpBound":{"CREATETIME":{$maxKey:1}}});
db.lobCS.createCL('lobCL201701', {"ShardingKey":{"_id":1},"ShardingType":"hash",ReplSize:-1,"AutoSplit":true});db.lobCS.createCL('lobCL201702', {"ShardingKey":{"_id":1},"ShardingType":"hash",ReplSize:-1,"AutoSplit":true});db.lobCS.createCL('lobCL201703', {"ShardingKey":{"_id":1},"ShardingType":"hash",ReplSize:-1,"AutoSplit":true});db.lobCS.createCL('lobCL201704', {"ShardingKey":{"_id":1},"ShardingType":"hash",ReplSize:-1,"AutoSplit":true});...db.lobCS.createCL('lobCL201912', {"ShardingKey":{"_id":1},"ShardingType":"hash",ReplSize:-1,"AutoSplit":true});
小结
往期技术干货巨杉Tech | SequoiaDB高可用原理详解
巨杉Tech | 分布式数据库负载管理WLM实践
巨杉Tech | 巨杉数据库的HTAP场景实践
巨杉Tech | SequoiaDB SQL实例高可用负载均衡实践
巨杉Tech | 并发性与锁机制解析与实践
巨杉Tech | 几分钟实现巨杉数据库容器化部署
巨杉Tech | “删库跑路”又出现,如何防范数据安全风险?
巨杉Tech | 分布式数据库千亿级超大表优化实践
社区分享 | SequoiaDB + JanusGraph 实践
巨杉Tech | 巨杉数据库的并发 malloc 实现
巨杉数据库无人值守智能自动化测试实践



最后修改时间:2020-06-13 09:42:00
文章转载自巨杉数据库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




