当前位置:首页 » 服务存储 » 百亿级存储方案
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

百亿级存储方案

发布时间: 2022-11-19 14:50:55

‘壹’ 如果有几百亿条数据,如何在hbase表中存放

1、首先你有没有那么多台服务器的集群,如果只是几台,你要想够不够,你的hbase 有几百亿,那么你hdfs上的数据可能要有两个备份,你这几百亿条是如何生成的,肯定是maprece跑出来导入到hbase中把,那么原始数据你要不要留,如果留,加上备份就要三份,所以节点的多少要确定。
2、几百亿其实挺多的,hbase 的设计一定要跟你的业务相关,hbase他不能完全像关系型数据库那样去随意查询,到达一定量级,如果设计的不好也是非常之慢的,甚至将hbase搞到崩溃。所以你先去网上看看rowkey的设计原则,比如长度原则等等,然后根据自己业务,哪些查询经常用到,哪些不会用到,想要用hbase实现那种非常灵活的类似关系数据库的查询是不理智的。
3、楼上的兄弟说得对,还有region热点的问题,如果你的hbase数据不是那种每天增量的数据,建议跑个maprece对你的数据进行各评判,看看如何能将数据尽可能均匀的分配到每个region中,当然这需要预先分配region
4、几百亿条数据,如果对rowkey进行模糊过滤一定非常非常之慢,所以可以考虑二级索引或者协处理器

‘贰’ tidb 好不好用

摘要 TiDB 是一款结合了传统的关系型数据库和 NoSQL 数据库特性的新型分布式数据库。

‘叁’ DB2千万或亿级的数据如何存储性能才最好

db2 list db directory $disk $disk 换成你的D:盘或者E:盘,DB2 Windows只允许安装在盘符根目录下,这样就可以查看到盘里是否有数据库,如果发现了catalog一下数据库就回来了

‘肆’ 影像数据是每年增长最快的数据之一,如何有效提高影像数据的存储管理

随着最近几年科技的发展,各类数据呈几何级增长,影像数据在智慧城市、电力、医疗等行业尤其增长迅速,所以企业面临着一个巨大的问题:影像数据该如何存储管理?

面对海量的影像数据,传统的存储方式已经无法满足存储需求了,杉岩数据推出的海量对象存储MOS,完美地解决了这个难题:

杉岩海量对象存储MOS,采用去中心化、分布式技术架构,支持百亿级文件及EB级容量存储,

具备高效的数据检索、智能化标签和分析能力,轻松应对大数据和云时代的存储挑战,为企业发展提供智能决策。

1、容量可线性扩展,单名字空间达EB级

SandStone MOS可在单一名字空间下实现海量数据存储,支持业务无感知的存储服务器横向扩容,为爆炸式增长的视频、音频、图片、文档等不同类型的非结构化数据提供完美的存储方案,规避传统NAS存储的单一目录或文件系统存储空间无法弹性扩展难题

2、海量小文件存储,百亿级文件高效访问

SandStone MOS基于完全分布式的数据和元数据存储架构,为海量小文件存储而生,将企业级NAS存储的千万文件量级提升至互联网规模的百亿级别,帮助企业从容应对几何级增长的海量小文件挑战。

3、中心灵活部署,容灾汇聚分发更便捷

SandStone MOS支持多数据中心灵活部署,为企业数据容灾、容灾自动切换、多分支机构、数据就近访问等场景提供可自定义的灵活解决方案,帮助企业实现跨地域多活容灾、数据流转、就近读写等,助力业务高速发展。

4、支持大数据和AI,统一数据存储和分析

SandStone MOS内置文件智能化处理引擎,实现包括语音识别、图片OCR识别、文件格式转换等批量处理功能,结合标签检索能力还可实现语音、证件照片检索,从而帮助企业更好地管理非结构化数据。同时,SandStone MOS还支持与Hadoop、Spark等大数据分析平台对接,一套存储即可满足企业数据存储、管理和挖掘的需求。

‘伍’ C语言中怎么存放100亿以上的数字

#include <stdio.h>

#define SIZE 500/* 有效位500 */

void main(void)
{
int i, j, k;
int count;/* 记数变量 */
int flag;/* 记数变量 */
int lenMax;/* 记录数组sum的长度变量 */
int sum[SIZE] = { 0 };/* 过度数组 */
int [SIZE] = { 0 };/* 将数字拆分保存在里面 */
int tmp[SIZE][SIZE] = { 0 };/* 过度数组 */
char result[SIZE] = {'1', '\0'};/* 保存结果 */

int num;/* 幂 */
char data[SIZE] = { '\0' };/* 数 */

printf("数 : ");
gets(data);

printf("幂 : ");
scanf("%d", &num);

/******************************************/
/*****************核心算法*****************/

for (k=0; k<num; k++)/* 幂 */
{
for (i=0; i<SIZE; i++)/* 初始化sum成员(用于累加) */
{
sum[i] = 0;
}//endfor
lenMax = 0;/* 初始化 */

for (i=0; result[i]!='\0'; i++)
{
for (j=0; data[j]!='\0'; j++)
{
tmp[i][j] = (data[j] - '0') * (result[i] - '0');/* 字符形转整形 */

sum[i+j] += tmp[i][j];/* 保存sum[0]到sum[lenMax]值 */

if (lenMax < (i + j))
{
lenMax = i + j;/* 记录数组sum长度 */
}//endif
}//endfor
}//endfor

for (i=lenMax; i>0; i--)/* 对数据进行处理 */
{
if (sum[i] > 9)
{
sum[i-1] += (sum[i] / 10);
sum[i] %= 10;
}//endif
}//endfor

flag = 0;/* 初始化 */
for (i=0; i<=lenMax; i++)
{

count = 0;/* 初始化 */
if (sum[i] < 10)
{
result[flag++] = sum[i] + '0';/* 赋值 */
}//endif
else/* if (sum[i] >= 10)对数据进行拆分 */
{
for ( ; sum[i]>0; sum[i]/=10)
{
[count++] = sum[i] % 10;
}//endfor
for (count--; count>=0; count--)
{
result[flag++] = [count] + '0';/* 赋值 */
}//endfor
}//endelse
}//endfor
result[flag] = '\0';/* 将save做成完整字符串 */

for (i=0; result[i]!='\0'; i++)/* 为验证结论正确打印所有过程以便观察 */
{
putchar(result[i]);
putchar(' ');
}//endfor
printf("\n");
}//endfor

/*******************************************/

printf("\nResult : ");

for (i=0; result[i]!='\0'; i++)/* 最后结果 */
{
putchar(result[i]);
}//endfor

printf("\n\n\n\n\n");
}

‘陆’ Redis百亿级Key存储设计方案

该应用场景为DMP缓存存储需求,DMP需要管理非常多的第三方id数据,其中包括各媒体cookie与自身cookie(以下统称supperid)的mapping关系,还包括了supperid的人口标签、移动端id(主要是idfa和imei)的人口标签,以及一些黑名单id、ip等数据。

在hdfs的帮助下离线存储千亿记录并不困难,然而DMP还需要提供毫秒级的实时查询。由于cookie这种id本身具有不稳定性,所以很多的真实用户的浏览行为会导致大量的新cookie生成,只有及时同步mapping的数据才能命中DMP的人口标签,无法通过预热来获取较高的命中,这就跟缓存存储带来了极大的挑战。

经过实际测试,对于上述数据,常规存储超过五十亿的kv记录就需要1T多的内存,如果需要做高可用多副本那带来的消耗是巨大的,另外kv的长短不齐也会带来很多内存碎片,这就需要超大规模的存储方案来解决上述问题。

人⼝标签主要是cookie、imei、idfa以及其对应的gender(性别)、age(年龄段)、geo(地域)等;mapping关系主要是媒体cookie对supperid的映射。以下是数据存储⽰示例:

媒体编号-媒体cookie=>supperid

supperid => { age=>年龄段编码,gender=>性别编码,geo=>地理位置编码 }

imei or idfa => { age=>年龄段编码,gender=>性别编码,geo=>地理位置编码 }

显然PC数据需要存储两种key=>value还有key=>hashmap,⽽而Device数据需要存储⼀一种

key=>hashmap即可。

存储吃紧的一个重要原因在于每天会有很多新数据入库,所以及时清理数据尤为重要。主要方法就是发现和保留热数据淘汰冷数据。

网民的量级远远达不到几十亿的规模,id有一定的生命周期,会不断的变化。所以很大程度上我们存储的id实际上是无效的。而查询其实前端的逻辑就是广告曝光,跟人的行为有关,所以一个id在某个时间窗口的(可能是一个campaign,半个月、几个月)访问行为上会有一定的重复性。

数据初始化之前,我们先利用hbase将日志的id聚合去重,划定TTL的范围,一般是35天,这样可以砍掉近35天未出现的id。另外在Redis中设置过期时间是35天,当有访问并命中时,对key进行续命,延长过期时间,未在35天出现的自然淘汰。这样可以针对稳定cookie或id有效,实际证明,续命的方法对idfa和imei比较实用,长期积累可达到非常理想的命中。

Hash表空间大小和Key的个数决定了冲突率(或者用负载因子衡量),再合理的范围内,key越多自然hash表空间越大,消耗的内存自然也会很大。再加上大量指针本身是长整型,所以内存存储的膨胀十分可观。先来谈谈如何把key的个数减少。

大家先来了解一种存储结构。我们期望将key1=>value1存储在redis中,那么可以按照如下过程去存储。先用固定长度的随机散列md5(key)值作为redis的key,我们称之为BucketId,而将key1=>value1存储在hashmap结构中,这样在查询的时候就可以让client按照上面的过程计算出散列,从而查询到value1。

过程变化简单描述为:get(key1) -> hget(md5(key1), key1) 从而得到value1。

如果我们通过预先计算,让很多key可以在BucketId空间里碰撞,那么可以认为一个BucketId下面挂了多个key。比如平均每个BucketId下面挂10个key,那么理论上我们将会减少超过90%的redis key的个数。

具体实现起来有一些麻烦,而且用这个方法之前你要想好容量规模。我们通常使用的md5是32位的hexString(16进制字符),它的空间是128bit,这个量级太大了,我们需要存储的是百亿级,大约是33bit,所以我们需要有一种机制计算出合适位数的散列,而且为了节约内存,我们需要利用全部字符类型(ASCII码在0~127之间)来填充,而不用HexString,这样Key的长度可以缩短到一半。

下面是具体的实现方式

参数bit决定了最终BucketId空间的大小,空间大小集合是2的整数幂次的离散值。这里解释一下为何一个字节中只有7位可用,是因为redis存储key时需要是ASCII(0~127),而不是byte array。如果规划百亿级存储,计划每个桶分担10个kv,那么我们只需2^30=1073741824的桶个数即可,也就是最终key的个数。

碎片主要原因在于内存无法对齐、过期删除后,内存无法重新分配。通过上文描述的方式,我们可以将人口标签和mapping数据按照上面的方式去存储,这样的好处就是redis key是等长的。另外对于hashmap中的key我们也做了相关优化,截取cookie或者deviceid的后六位作为key,这样也可以保证内存对齐,理论上会有冲突的可能性,但在同一个桶内后缀相同的概率极低(试想id几乎是随机的字符串,随意10个由较长字符组成的id后缀相同的概率*桶样本数=发生冲突的期望值<<0.05,也就是说出现一个冲突样本则是极小概率事件,而且这个概率可以通过调整后缀保留长度控制期望值)。而value只存储age、gender、geo的编码,用三个字节去存储。

另外提一下,减少碎片还有个很low但是有效的方法,将slave重启,然后强制的failover切换主从,这样相当于给master整理的内存的碎片。

推荐Google-tcmalloc, facebook-jemalloc内存分配,可以在value不大时减少内存碎片和内存消耗。有人测过大value情况下反而libc更节约。

1)kv存储的量级必须事先规划好,浮动的范围大概在桶个数的十到十五倍,比如我就想存储百亿左右的kv,那么最好选择30bit 31bit作为桶的个数。也就是说业务增长在一个合理的范围(10 15倍的增长)是没问题的,如果业务太多倍数的增长,会导致hashset增长过快导致查询时间增加,甚至触发zip-list阈值,导致内存急剧上升。

2)适合短小value,如果value太大或字段太多并不适合,因为这种方式必须要求把value一次性取出,比如人口标签是非常小的编码,甚至只需要3、4个bit(位)就能装下。

3)典型的时间换空间的做法,由于我们的业务场景并不是要求在极高的qps之下,一般每天亿到十亿级别的量,所以合理利用CPU租值,也是十分经济的。

4)由于使用了信息摘要降低了key的大小以及约定长度,所以无法从redis里面random出key。如果需要导出,必须在冷数据中导出。

5)expire需要自己实现,目前的算法很简单,由于只有在写操作时才会增加消耗,所以在写操作时按照一定的比例抽样,用HLEN命中判断是否超过15个entry,超过才将过期的key删除,TTL的时间戳存储在value的前32bit中。

6)桶的消耗统计是需要做的。需要定期清理过期的key,保证redis的查询不会变慢。

人口标签和mapping的数据100亿条记录。

优化前用2.3T,碎片率在2左右;优化后500g,而单个桶的平均消耗在4左右。碎片率在1.02左右。查询时这对于cpu的耗损微乎其微。

另外需要提一下的是,每个桶的消耗实际上并不是均匀的,而是符合多项式分布的。

上面的公式可以计算桶消耗的概率分布。公式是唬人用的,只是为了提醒大家不要想当然的认为桶消耗是完全均匀的,有可能有的桶会有上百个key。但事实并不没有那么夸张。试想一下投硬币,结果只有两种正反面。相当于只有两个桶,如果你投上无限多次,每一次相当于一次伯努利实验,那么两个桶必然会十分的均匀。概率分布就像上帝施的魔咒一样,当你面对大量的桶进行很多的广义的伯努利实验。桶的消耗分布就会趋于一种稳定的值。接下来我们就了解一下桶消耗分布具体什么情况:

通过采样统计

31bit(20多亿)的桶,平均4.18消耗

100亿节约了1.8T内存。相当于节约了原先的78%内存,而且桶消耗指标远没有达到预计的底线值15。

对于未出现的桶也是存在一定量的,如果过多会导致规划不准确,其实数量是符合二项分布的,对于2 30桶存储2 32kv,不存在的桶大概有(百万级别,影响不大):

Math.pow((1 - 1.0 / Math.pow(2, 30)), Math.pow(2, 32)) * Math.pow(2, 30);

对于桶消耗不均衡的问题不必太担心,随着时间的推移,写入时会对HLEN超过15的桶进行削减,根据多项式分布的原理,当实验次数多到一定程度时,桶的分布就会趋于均匀(硬币投掷无数次,那么正反面出现次数应该是一致的),只不过我们通过expire策略削减了桶消耗,实际上对于每个桶已经经历了很多的实验发生。

总结:信息摘要在这种场景下不仅能节约key存储,对齐了内存,还能让Key按照多项式分布均匀的散列在更少量的key下面从而减少膨胀,另外无需在给key设置expire,也很大程度上节约了空间。

这也印证了时间换空间的基本理论,合理利用CPU租值也是需要考虑的。

关注分布式存储技术以及分布式计算方法

‘柒’ 非结构化数据的云计算与非结构化数据

据IDC的一项调查报告中指出:企业中80%的数据都是非结构化数据,这些数据每年都按指数增长60%。非结构化数据,顾名思义,是存储在文件系统的信息,而不是数据库。据报道指出:平均只有1%-5%的数据是结构化的数据。如今,这种迅猛增长的从不使用的数据在企业里消耗着复杂而昂贵的一级存储的存储容量。如何更好的保留那些在全球范围内具有潜在价值的不同类型的文件,而不是因为处理它们却干扰日常的工作?当然你可以采购更多的就地存储设备,但这总会有局限性的。云存储是越来越多的IT公司正在使用的存储技术。下面的分段解释了一些关于存储在云中的商业信息的关键要点。员工面临新挑战 数据如何被管理?
当企业参与到全球经济竞争中,IT员工面临着让分布在全球的员工能够有效访问重要数据的新挑战。全球分布的团队需要共享对大型的文件和数据集的读写访问,但这显然增加了数据管理的复杂性。另外不断地采用数据同步功能和精确度的问题都影响企业的工作效率。
云存储业务外包 降低成本是否可行?
随着基于云存储服务项目的增长,各种类型的企业都有能力将数据存储业务外包。利用这些外包服务,企业能大幅减少存储基础架构成本,在减少人工管理非结构化数据所需时间的同时增加了存储的灵活性,这在以前的企业中从未被使用过。另外,云服务也带来了巨大的经济效益。
云存储有多大 价格是否更合理?
大多数服务提供商对于云存储的定价都是根据实际使用了多少存储容量而决定的。支付多少钱就享用多少容量。因此不再需要存储架构师,也不再需要安装和管理存储设备。
如果你使用200TB的存储容量,你就只需支付200TB存储的这部分钱即可。如果你的公司突然需要在明天增加34TB的存储容量,你不需要增加任何存储设备,只需要在开账单的周期支付存储多增加出来的钱即可。如果其中一部分存储容量只是暂时性的话,你可以轻松地从云中删除不需要的数据,以减少使用的容量,并送交最终的账单。但本地的存储基础设施并没有这些功能。
数据中心安全第一 有害访问强制隔离
如果你曾配置过数据中心,必须要保证物理安全。未经授权的人通过各种层级的物理安全获得数据的机会是几乎不可能的。检查存储供应商提供的服务,你会发现这些数据中心不仅是保障不能出现有害的物理访问,还在于保护通过任何自然和人为操作所产生的灾难
云存储网关发威 恶意访问皆退散
物理安全对于企业去阻止恶意访问来说是非常重要的。越来越多的厂商提供云存储网关(cloud storage gateway)应用,无论是在传输中还是在静止中都能够保证高级别的数据安全。网关能够处理前端数据的存储进程。数据实际被存储在服务商提供的基础设施中,像是Rackspace、AT&T、i365、Amazon S3等等。
备份记录复杂昂贵云存储简单方便
随着备份和灾难恢复的处理和要求变得越来越复杂、昂贵以及耗费时间。云存储服务能够大大地减少这种复杂性和成本。当在云中存储一个大数据集的时候,答案可以像复制数据到多重地理分布位置一样的简单。
单一技术非万能 分析思考更有效
像任何技术一样,根本不存一个万能的解决方案,云存储也是如此。仔细地检查当前的存储基础设施,创建数据的应用以及数据的用户。只有更仔细的分析,才能更加的清楚:基于云的存储通常完美适用于第二层级(Tier 2)的数据,以及那些需要在多个位置共享的数据。

‘捌’ 企业非结构化数据存储用哪家的比较好要国内的厂商

杉岩、星辰天合、元核云等,这些国内的存储厂商都做得挺好的,也能满足你问题中的需求。

‘玖’ 什么是结构化数据,非结构化数据

(1)结构化数据,简单来说就是数据库。结合到典型场景中更容易理解,比如企业ERP、财务系统;医疗HIS数据库;政府行政审批;其他核心数据库等。这些应用需要哪些存储方案呢?基本包括高速存储应用需求、数据备份需求、数据共享需求以及数据容灾需求。
(2)非结构化数据库是指其字段长度可变,并且每个字段的记录又可以由可重复或不可重复的子字段构成的数据库,用它不仅可以处理结构化数据(如数字、符号等信息)而且更适合处理非结构化数据(全文文本、图像、声音、影视、超媒体等信息)。
面对海量非结构数据存储,杉岩海量对象存储MOS,提供完整解决方案,采用去中心化、分布式技术架构,支持百亿级文件及EB级容量存储,具备高效的数据检索、智能化标签和分析能力,轻松应对大数据和云时代的存储挑战,为企业发展提供智能决策。

‘拾’ 海量数据存储有哪些方式与方法

杉岩海量对象存储MOS,针对海量非结构化数据存储的最优化解决方案,采用去中心化、分布式技术架构,支持百亿级文件及EB级容量存储,

具备高效的数据检索、智能化标签和分析能力,轻松应对大数据和云时代的存储挑战,为企业发展提供智能决策。

1、容量可线性扩展,单名字空间达EB级

SandStone MOS可在单一名字空间下实现海量数据存储,支持业务无感知的存储服务器横向扩容,为爆炸式增长的视频、音频、图片、文档等不同类型的非结构化数据提供完美的存储方案,规避传统NAS存储的单一目录或文件系统存储空间无法弹性扩展难题

2、海量小文件存储,百亿级文件高效访问

SandStone MOS基于完全分布式的数据和元数据存储架构,为海量小文件存储而生,将企业级NAS存储的千万文件量级提升至互联网规模的百亿级别,帮助企业从容应对几何级增长的海量小文件挑战。

3、中心灵活部署,容灾汇聚分发更便捷

SandStone MOS支持多数据中心灵活部署,为企业数据容灾、容灾自动切换、多分支机构、数据就近访问等场景提供可自定义的灵活解决方案,帮助企业实现跨地域多活容灾、数据流转、就近读写等,助力业务高速发展。

4、支持大数据和AI,统一数据存储和分析

SandStone MOS内置文件智能化处理引擎,实现包括语音识别、图片OCR识别、文件格式转换等批量处理功能,结合标签检索能力还可实现语音、证件照片检索,从而帮助企业更好地管理非结构化数据。同时,SandStone MOS还支持与Hadoop、Spark等大数据分析平台对接,一套存储即可满足企业数据存储、管理和挖掘的需求。