如何搭建分布式存储
Ⅰ 基于mogileFS搭建分布式文件系统--海量小文件的存储利器
1.简介
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户访问的服务器。另外,对等特性允许一些系统扮演客户机和服务器的双重角色。例如,用户可以“发表”一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就像使用本地驱动器一样。
当下我们处在一个互联网飞速发展的信息 社会 ,在海量并发连接的驱动下每天所产生的数据量必然以几何方式增长,随着信息连接方式日益多样化,数据存储的结构也随着发生了变化。在这样的压力下使得人们不得不重新审视大量数据的存储所带来的挑战,例如:数据采集、数据存储、数据搜索、数据共享、数据传输、数据分析、数据可视化等一系列问题。
传统存储在面对海量数据存储表现出的力不从心已经是不争的事实,例如:纵向扩展受阵列空间限制、横向扩展受交换设备限制、节点受文件系统限制。
然而分布式存储的出现在一定程度上有效的缓解了这一问题,之所以称之为缓解是因为分布式存储在面对海量数据存储时也并非十全十美毫无压力,依然存在的难点与挑战例如:节点间通信、数据存储、数据空间平衡、容错、文件系统支持等一系列问题仍处在不断摸索和完善中。
2.分布式文件系统的一些解决方案
Google Filesystem适合存储海量大个文件,元数据存储与内存中
HDFS(Hadoop Filesystem)GFS的山寨版,适合存储大量大个文件
TFS(Taobao Filesystem)淘宝的文件系统,在名称节点上将元数据存储与关系数据库中,文件数量不在受限于名称节点的内容空间,可以存储海量小文件LustreOracle开发的企业级分布式系统,较重量级MooseFS基于FUSE的格式,可以进行挂载使用MogileFS
擅长存储海量的小数据,元数据存储与关系型数据库中
1.简介
MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,由LiveJournal旗下DangaInteractive公司开发,Danga团队开发了包括 Memcached、MogileFS、Perlbal等不错的开源项目:(注:Perlbal是一个强大的Perl写的反向代理服务器)。MogileFS是一个开源的分布式文件系统。
目前使用 MogileFS 的公司非常多,比如国外的一些公司,日本前几名的公司基本都在使用这个.
国内所知道的使用 MogileFS 的公司有图片托管网站 yupoo又拍,digg, 薯仔, 豆瓣,1 号店, 大众点评,搜狗,安居客等等网站.基本很多网站容量,图片都超过 30T 以上。
2.MogileFS特性
1) 应用层提供服务,不需要使用核心组件
2)无单点失败,主要有三个组件组成,分为tracker(跟踪节点)、mogstore(存储节点)、database(数据库节点)
3)自动复制文件,复制文件的最小单位不是文件,而是class
4)传输中立,无特殊协议,可以通过NFS或HTTP实现通信
5)简单的命名空间:没有目录,直接存在与存储空间上,通过域来实现
6)不用共享任何数据
3.MogileFS的组成
1)Tracker--跟踪器,调度器
MogileFS的核心,是一个调度器,mogilefsd进程就是trackers进程程序,trackers的主要职责有:删除数据、复制数据、监控、查询等等.这个是基于事件的( event-based ) 父进程/消息总线来管理所有来之于客户端应用的交互(requesting operations to be performed), 包括将请求负载平衡到多个"query workers"中,然后让 mogilefs的子进程去处理.
mogadm,mogtool的所有操作都要跟trackers打交道,Client的一些操作也需要定义好trackers,因此最好同时运行多个trackers来做负载均衡.trackers也可以只运行在一台机器上,使用负载均衡时可以使用搞一些简单的负载均衡解决方案,如haproxy,lvs,nginx等,
tarcker的配置文件为/etc/mogilefs/mogilefsd.conf,监听在TCP的7001端口
2)Database--数据库部分
主要用来存储mogilefs的元数据,所有的元数据都存储在数据库中,因此,这个数据相当重要,如果数据库挂掉,所有的数据都不能用于访问,因此,建议应该对数据库做高可用
3)mogstored--存储节点
数据存储的位置,通常是一个HTTP(webDAV)服务器,用来做数据的创建、删除、获取,任何 WebDAV 服务器都可以, 不过推荐使用 mogstored . mogilefsd可以配置到两个机器上使用不同端口… mogstored 来进行所有的 DAV 操作和流量,IO监测, 并且你自己选择的HTTP服务器(默认为 perlbal)用来做 GET 操作给客户端提供文件.
典型的应用是一个挂载点有一个大容量的SATA磁盘. 只要配置完配置文件后mogstored程序的启动将会使本机成为一个存储节点.当然还需要mogadm这个工具增加这台机器到Cluster中.
配置文件为/etc/mogilefs/mogstored.conf,监听在TCP的7500端口
4.基本工作流程
应用程序请求打开一个文件 (通过RPC 通知到 tracker, 找到一个可用的机器). 做一个 “create_open” 请求.
tracker 做一些负载均衡(load balancing)处理,决定应该去哪儿,然后给应用程序一些可能用的位置。
应用程序写到其中的一个位置去 (如果写失败,他会重新尝试并写到另外一个位置去).
应用程序 (client) 通过”create_close” 告诉tracker文件写到哪里去了.
tracker 将该名称和域命的名空间关联 (通过数据库来做的)
tracker, 在后台, 开始复制文件,知道他满足该文件类别设定的复制规则
然后,应用程序通过 “get_paths” 请求 domain+key (key == “filename”) 文件, tracker基于每一位置的I/O繁忙情况回复(在内部经过 database/memcache/etc 等的一些抉择处理), 该文件可用的完整 URLs地址列表.
应用程序然后按顺序尝试这些URL地址. (tracker’持续监测主机和设备的状态,因此不会返回死连接,默认情况下他对返回列表中的第一个元素做双重检查,除非你不要他这么做..)
1.拓扑图
说明:1.用户通过URL访问前端的nginx
2.nginx根据特定的挑选算法,挑选出后端一台tracker来响应nginx请求
3.tracker通过查找database数据库,获取到要访问的URL的值,并返回给nginx
4.nginx通过返回的值及某种挑选算法挑选一台mogstored发起请求
5.mogstored将结果返回给nginx
6.nginx构建响应报文返回给客户端
2.ip规划
角色运行软件ip地址反向代理nginx192.168.1.201存储节点与调度节点1
mogilefs192.168.1.202存储节点与调度节点2
mogilefs192.168.1.203数据库节点
MariaDB192.168.1.204
3.数据库的安装操作并为授权
关于数据库的编译安装,请参照本人相关博文http://wangfeng7399.blog.51cto.com/3518031/1393146,本处将不再累赘,本处使用的为yum源的安装方式安装mysql
4.安装mogilefs. 安装mogilefs,可以使用yum安装,也可以使用编译安装,本处通过yum安装
5.初始化数据库
可以看到在数据库中创建了一些表
6.修改配置文件,启动服务
7.配置mogilefs
添加存储主机
添加存储设备
添加域
添加class
8.配置192.168.1.203的mogilefs 。切记不要初始化数据库,配置应该与192.168.1.202一样
9.尝试上传数据,获取数据,客户端读取数据
上传数据,在任何一个节点上传都可以
获取数据
客户端查看数据
我们可以通过任何一个节点查看到数据
要想nginx能够实现对后端trucker的反向代理,必须结合第三方模块来实现
1.编译安装nginx
2.准备启动脚本
3.nginx与mofilefs互联
查看效果
5.配置后端truckers的集群
查看效果
大功告成了,后续思路,前段的nginx和数据库都存在单点故障,可以实现高可用集群
Ⅱ 如何实现高性能分布式文件存储
其实分布式文件存储,最复杂的就是元数据的保存和处理,而我使用的XGFS文件存储软件只需要三个全闪存元数据高可用节点,就可以高效保存和处理 100 亿文件规模的数据,可以灵活扩展,满足公司不断增长的业务对性能和容量的需求,XSKY星辰天合这款产品还是很有性价比的。
Ⅲ 如何配置ceph分布式存储方案
1、对象存储:即radosgw,兼容S3接口。通过rest api上传、下载文件。
2、文件系统:posix接口。可以将ceph集群看做一个共享文件系统挂载到本地。
3、块存储:即rbd。有kernel rbd和librbd两种使用方式。支持快照、克隆。相当于一块硬盘挂到本地,用法和用途和硬盘一样。
Ⅳ hadoop分布式部署(转载)--贼靠谱
原文地址:https://blog.csdn.net/sjmz30071360/article/details/79889055
1. 集群搭建形式
Hadoop环境搭建分为三种形式:单机模式、伪分布式模式、完全分布模式
单机模式—— 在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统。
伪分布式—— 也是在一台单机上运行,但不同的是java进程模仿分布式运行中的各类节点。即一台机器上,既当NameNode,又当DataNode,或者说既是JobTracker又是TaskTracker。没有所谓的在多台机器上进行真正的分布式计算,故称为“伪分布式”。
完全分布式—— 真正的分布式,由3个及以上的实体机或者虚拟机组成的机群。一个Hadoop集群环境中,NameNode,SecondaryName和DataNode是需要分配在不同的节点上,也就需要三台服务器。
前两种模式一般用在开发或测试环境下,生产环境下都是搭建完全分布式模式。
从分布式存储的角度来说,集群中的节点由一个NameNode和若干个DataNode组成,另有一个SecondaryNameNode作为NameNode的备份。
从分布式应用的角度来说,集群中的节点由一个JobTracker和若干个TaskTracker组成。JobTracker负责任务的调度,TaskTracker负责并行执行任务。TaskTracker必须运行在DataNode上,这样便于数据的本地计算。JobTracker和NameNode则无须在同一台机器上。
2. 环境
操作系统:CentOS7(红帽开源版)
机器:虚拟机3台,(master 192.168.0.104, slave1 192.168.0.102, slave2 192.168.0.101)
JDK:1.8(jdk-8u162-linux-x64.tar)
Hadoop:2.9.0(http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.9.0/hadoop-2.9.0.tar.gz)
3. 搭建步骤
3.1 每台机器安装&配置JDK(1台做好后,克隆出其它机器)
1) 创建目录 mkdir /usr/java
2) 上传jdk安装包到 /usr/java/
3) 解压 tar -xvf jdk-8u162-linux-x64.tar
4) 追加环境变量 vi /etc/profile
5) 使环境变量生效 source /etc/profile
6) 检测jdk正确安装 java -version
3.2 修改每台机器主机名(hostname)
hostnamectl set-hostname master (立即生效)
hostnamectl set-hostname slave1 (立即生效)
hostnamectl set-hostname slave2 (立即生效)
确认修改
3.3 修改每台机器/etc/hosts文件
vi /etc/hosts
修改其中1台,然后scp到其它机器
scp 文件名 远程主机用户名@远程主机名或ip:存放路径
scp hosts [email protected]:/etc/
scp hosts [email protected]:/etc/
修改完之后,互ping其它机器,能互ping则说明修改OK
ping -c 3 slave1 (※ 3表示发送 3 个数据包)
3.4 配置ssh,实现无密码登录
无密码登录,效果也就是在master上,通过ssh slave1或者ssh slave2就可以登录对方机器,而不用输入密码。
1) 每台机器执行ssh-keygen -t rsa,接下来一路回车即可
执行ssh-keygen -t rsa主要是生成 密钥 和 密钥的存放路径
我们用的root用户,公钥私钥都会保存在~/.ssh下
2) 在master上将公钥放到authorized_keys里,命令:cat id_rsa.pub > authorized_keys
3) 将master上的authorized_keys放到其它机器上
scp authorized_keys root@slave1:~/.ssh/
scp authorized_keys root@slave2:~/.ssh/
4) 测试是否成功
3.5 上传&配置hadoop(配置完master后,将/usr/hadoop/整个目录内容到其它机器)
1) 创建目录 mkdir /usr/hadoop
2) 上传hadoop安装包hadoop-2.9.0.tar.gz到 /usr/hadoop/
3) 解压 tar -xvf hadoop-2.9.0.tar.gz
4) 追加环境变量 vi /etc/profile(其它机器也要相应配置一次hadoop环境变量)
5) 使环境变量生效 source /etc/profile
6) 确认环境变量配置OK
7) 创建HDFS存储目录
cd /usr/hadoop
mkdir hdfs
cd hdfs
mkdir name data tmp
/usr/hadoop/hdfs/name --存储namenode文件
/usr/hadoop/hdfs/data --存储数据
/usr/hadoop/hdfs/tmp --存储临时文件
8) 修改/usr/hadoop/hadoop-2.9.0/etc/hadoop/hadoop-env.sh文件,设置JAVA_HOME为实际路径
否则启动集群时,会提示路径找不到
9) 修改/usr/hadoop/hadoop-2.9.0/etc/hadoop/yarn-env.sh文件,设置JAVA_HOME为实际路径
10) 配置/usr/hadoop/hadoop-2.9.0/etc/hadoop/core-site.xml
增加hadoop.tmp.dir 和 fs.default.name
11) 配置/usr/hadoop/hadoop-2.9.0/etc/hadoop/hdfs-site.xml
dfs.replication:默认值3
dfs.permissions:默认值为true,设置为true有时候会遇到数据因为权限访问不了;设置为false可以不要检查权限就生成dfs上的文件
12) 配置/usr/hadoop/hadoop-2.9.0/etc/hadoop/mapred-site.xml
cd /usr/hadoop/hadoop-2.9.0/etc/hadoop
cp mapred-site.xml.template mapred-site.xml
maprece.framework.name:指定maprece运行在yarn平台,默认为local
13) 配置/usr/hadoop/hadoop-2.9.0/etc/hadoop/yarn-site.xml
yarn.resourcemanager.hostname:指定yarn的resourcemanager的地址
yarn.nodemanager.aux-services:recer获取数据的方式
yarn.nodemanager.vmem-check-enabled:意思是忽略虚拟内存的检查,如果安装在虚拟机上,这个配置很有用,配上去之后后续操作不容易出问题。如果是在实体机上,并且内存够多,可以将这个配置去掉
14) 配置/usr/hadoop/hadoop-2.9.0/etc/hadoop/slaves文件,将里面的localhost删除,配置后内容如下:
15) 整个/usr/hadoop/目录到其它机器
scp -r hadoop root@slave1:/usr/
scp -r hadoop root@slave2:/usr/
3.6 启动Hadoop
1) 启动之前需要格式化一下。因为master是namenode,slave1和slave2都是datanode,所以在master上运行
hadoop namenode -format
格式化成功后,可以看到在/usr/hadoop/hdfs/name目录下多了一个current目录,而且该目录下有一系列文件,如下:
2) 执行启动(namenode只能在master上启动,因为配置在master上;datanode每个节点上都可以启动)
执行 start-all.sh
master上执行jps,会看到NameNode, SecondaryNameNode, ResourceManager
其它节点上执行jps,会看到DataNode, NodeManager
3) 在wins上打开网页,查看HDFS管理页面 http://192.168.0.104:50070查看,提示无法访问
在master上,执行以下命令关闭防火墙,即可访问(为了能够正常访问node节点,最好把其它机器的防火墙也stop了)
systemctl stop firewalld.service
HDFS管理首页
HDFS Datenodes页
访问Yarn管理页: http://192.168.0.104:8088
4)通过主机名也可以访问的设置
win7为例,需要将以下信息追加到C:\Windows\System32\drivers\etc\hosts文件中
192.168.0.104 master
192.168.0.102 slave1
192.168.0.101 slave2
Over!!!搭建成功!!!
4. 运行实例
cd /usr/hadoop/hadoop-2.9.0/share/hadoop/maprece
hadoop jar hadoop-maprece-examples-2.9.0.jar pi 5 10
。。。。。。
=====================================================
如果不关防火墙,子节点可能出现,输入jps后只有jps一个进程,或者是缺进程的情况,关闭防火墙就好了。
Ⅳ 如何实现不同地区文件分布式存储
一种方案是:架设Hadoop集群作为云存储,类似网络云盘。Hadoop集群的每个节点要么在公网要么在内网,如果公网和内网混合就需要用四层交换机把每个节点的端口映射出来。其他的方案可以参考这种模式。
Ⅵ 分布式存储极简艺术Minio解析
MinIO 对象存储系统是为海量数据存储、人工智能、大数据分析而设计,基于
Apache License v2.0 开源协议的对象存储系统,它完全兼容 Amazon S3 接口,单个对象的最大可达 5TB,适合存储海量图片、视频、日志文件、备份数据和容器/虚拟机镜像等。作为一个开源服务,MinIO 在设计上汲取了Glusterfs的相关经验不教训,系统复杂度上作了大量简化,目前大小只有40+M,部署只需要一个命令即可完成!另外,minio舍弃了传统分布式存储扩容所需要的迁移流程,采用联盟模式添加集群的方式,极大简化了扩容流程;除此之外,minio还具有纠删编码、比特位保护、单写多读(worm)、下面来依次简要解析一下Mioio的特点及具体实现:
元数据和数据一起存放在磁盘上。元数据以明文形式存放在元数据文件里(xl.json)。假定对象名字为key_name, 它所在桶的名字是bucket_name, disk路径就是/disk,那么存储路径就是:/disk/bucket_name/key_name,windows下C盘存放桶名为test,对象名为minio.exe示例如图:
其中part.1是实际存储数据(单机模式为原生数据,分布式为纠删码分块),xl.json是如下所示的json字符串:
在同一集群内,MinIO 自己会自劢生成若干纠删组,用于分布存放桶数据。一个纠删组中的一定数量的磁盘发生的故障(故障磁盘的数量小于等于校验盘的数量),通过纠删码校验算法可以恢复出正确的数据。MinIO 集成了 Reed-Solomon 纠删码库,MinIO 存储对象数据时,首先把它分成若干等长的片段(对于大对象,默认按 5MB 切片),然后每一个片段会纠删算法分成若干分片,包括数据分片不校验分片,每个分片放置在一个纠删组的某个节点上。对象的每一个数据分片、校验分片都被“防比特位衰减”算法所保护。
MinIO 会根据对象名(类似于文件系统的全路径名),使用 crc32 哈希算法计算出一个整数。然后使用这个整数除以纠删组的个数,得到一个余数。这个余数,可以作为纠删组的序号,这样就确定了这个对象所在的纠删组。MinIO 采用 CRC32 哈希算法,不 glusterfs 的Davies Meyer哈希算法(性能、冲突概率不md4, md5相近)不一样的是,CRC32算法的哈希值分布较不均匀,但运算速度极快,高出 md4 数倍。相对于容量均衡,MinIO 更看重数据的写入速度。
纠删组如何配置?
官方文档说明如下:
也就是说纠删组的总大小只能从这7中情况中根据你提供的盘的个数(或者说路径个数)来自动选取最大值的,我们 不能灵活地配置m+k纠删存储格式。但这样说又不是很准确 ,因为虽然不能配置任意的m+k,但是在系统已经选取好擦除编码集的的个数后(也就是m+k),可以使用storage class存储类来自定义m和k的数量,默认是1:1的。
存储类:
MinIO支持配置两种存储类别,精简冗余类别和标准类别,默认是标准类别(1:1),可以在启动MinIO服务器之前使用设置的环境变量来定义这些类。使用环境变量定义每个存储类别的数据和奇偶校验磁盘后,您可以 在上传对象时通过请求元数据字段设置对象的存储类别x-amz-storage-class 。然后,MinIO服务器通过将对象保存在特定数量的数据和奇偶校验磁盘中来兑现存储类。具体配置和使用可以参考官方文档 https://github.com/minio/minio/tree/master/docs/erasure/storage-class
传统的扩展方式的劣势
通过增加节点来扩展单集群,一般需要进行数据均衡,否则群集内各存储节点会因负载不均而出现新的瓶颈。除了数据均衡操作的时机这个问题以外,在均衡过程中一般需要仍存储使用率高的节点吐使用率低的节点迁移数据。当集群扩容后,大量已经写入的文件落点会出现改变,文件需要迁移到真实的落点。当存储系统容量比较大时,则会发生大量的文件/对象进行迁移,迁移过程可能由于占用大量资源而导致上层应用性能下降。而且当文件/对象迁移过程中,机器故障可能会导致一些意想不到的情冴,尤其是有大量业务的时候。当然针对此类问题,Gluterfs之类的文件系统有一些比较复杂的处理办法。
不支持扩展优势
Ⅶ 区块链分布式存储:生态大数据的存储新模式
区块链,当之无愧的2019最靓的词,在 科技 领域闪闪发亮,在实体行业星光熠熠。
2019年的1024讲话,让区块链这个词焕然一新,以前它总是和传销和诈骗联系在一起,“区块链”这个词总是蒙上一层灰色。但是如今,区块链则是和实体经济融合紧密相连,成为国家的战略技术, 这个词瞬间闪耀着热情的红色和生意盎然的绿色 。
“产业区块链”在这个时代背景下应运而生, 是继“互联网”后的又一大热门词汇,核心就是区块链必须和实体产业融合,脱虚向实,让区块链技术找到更多业务场景才是正道。
区块链的本质就是一个数据库,而且是采用的分布式存储的方式。作为一名区块链从业者,今天就来讲讲 区块链的分布式存储和生态大数据 结合后,碰撞产生的火花。
当前的存储大多为中心化存储,存储在传统的中心化服务器。如果服务器出现宕机或者故障,或者服务器停止运营,则很多数据就会丢失。
比如我们在微信朋友圈发的图片,在抖音上传的视频等等,都是中心化存储。很多朋友会把东西存储在网上,但是某天打开后,网页呈现404,则表示存储的东西已经不见了。
区块链,作为一个分布式的数据库,则能很好解决这方面的问题。这是由区块链的技术特征决定了的。 区块链上的数字记录,不可篡改、不可伪造,智能合约让大家更高效地协同起来,从而建立可信的数字经济秩序,能够提高数据流转效率,打破数据孤岛,打造全新的存储模式。
生态大数据,其实和我们每天的生活息息相关,比如每天的天气预报,所吃的农产品的溯源数据等等,都是生态大数据的一部分。要来谈这个结合,首先咱们来看看生态大数据存储的特点。
伴随着互联网的发展,当前,生态大数据在存储方面有具有如下特点:
从数据规模来看,生态数据体量很大,数据已经从TB级跃升到了PB级别。
随着各类传感器技术、卫星遥感、雷达和视频感知等技术的发展,数据不仅来源于传统人工监测数据,还包括航空、航天和地面数据,他们一起产生了海量生态环境数据。近10年以来,生态数据以每年数百个TB的数据在增长。
生态环境大数据需要动态新数据和 历史 数据相结合来处理,实时连续观测尤为重要。只有实时处理分析这些动态新数据,并与已有 历史 数据结合起来分析,才能挖掘出有用信息,为解决有关生态环境问题提供科学决策。
比如在当前城市建设中,提倡的生态环境修复、生态模型建设中,需要大量调用生态大数据进行分析、建模和制定方案。但是目前很多 历史 数据因为存储不当而消失,造成了数据的价值的流失。
既然生态大数据有这些特点,那么它有哪些存储需求呢?
当前,生态大数据面临严重安全隐患,强安全的存储对于生态大数据而言势在必行。
大数据的安全主要包括大数据自身安全和大数据技术安全,比如在大数据的数据存储中,由于黑客外部网络攻击和人为操作不当造成数据信息泄露。外部攻击包括对静态数据和动态数据的数据传输攻击、数据内容攻击、数据管理和网络物理攻击等。
例如,很多野外生态环境监测的海量数据需要网络传输,这就加大了网络攻击的风险。如果涉及到军用的一些生态环境数据,如果被黑客获得这些数据,就可能推测到我国军方的一些信息,或者获取敏感的生态环境数据,后果不堪设想。
生态大数据的商业化应用需要整合集成政府、企业、科研院所等 社会 多来源的数据。只有不同类型的生态环境大数据相互连接、碰撞和共享,才能释放生态环境大数据的价值。
以当前的智慧城市建设为例,很多城市都在全方位、多维度建立知识产权、种质资源、农资、农产品、病虫害疫情等农业信息大数据中心,为农业产供销提供全程信息服务。建设此类大数据中心,离不开各部门生态大数据的共享。
但是,生态大数据共享面临着巨大挑战。首先,我国生态环境大数据包括气象、水利、生态、国土、农业、林业、交通、 社会 经济等其他部门的大数据,涉及多领域多部门和多源数据。虽然目前这些部门已经建立了自己的数据平台,但这些平台之间互不连通,只是一个个的数据孤岛。
其次,相关部门因为无法追踪数据的轨迹,担心数据的利益归属问题,便无法实现数据的共享。因此,要想挖掘隐藏在生态大数据背后的潜在价值,实现安全的数据共享是关键,也是生态大数据产生价值的前提和基础。
生态大数据来之不易,是研究院所、企业、个人等 社会 来源的集体智慧。
其中,很多生态大数据涉及到了知识产权的保护。但是目前的中心化存储无法保证知识产权的保护,无法对数据的使用进行溯源管理,容易造成知识产权的侵犯和隐私数据的泄露。
这些就是生态大数据在存储方面的需求。在当前产业区块链快速发展的今天,区块链的分布式存储是可以为生态大数据存储提供全新的存储方式的。 这个核心前提就是区块链的分布式存储、不可篡改和数据追踪特性 。
把区块链作为底层技术,搭建此类平台,专门存储生态大数据,可以设置节点管理、存储管理、用户管理、许可管理、业务通道管理等。针对上层业务应用提供高可用和动态扩展的区块链网络底层服务的实现。在这个平台的应用层,可以搭建API接口,让整个平台的使用灵活可扩展。区块链分布式存储有如下特点:
利用区块链的分布式存储,能够实现真正的生态大数据安全存储。
首先,数据永不丢失。这点对于生态大数据的 历史 数据特别友好,方便新老数据的调用和对比。
其次,数据不易被泄露或者攻击。因为数据采取的是分布式存储,如果遭遇攻击,也只能得到存储在部分节点里的数据碎片,无法完全获得完整的数据信息或者数据段。
区块链能够实现生态数据的存储即确权,这样就能够避免知识产权被侵害,实现安全共享。毕竟生态大数据的获取,是需要生态工作者常年在野外驻守,提取数据的。
生态大数据来之不易,是很多生态工作者的工作心血和结晶,需要得到产权的保护,让数据体现出应用价值和商业价值,保护生态工作者的工作动力,让他们能够深入一线,采集出更多优质的大数据。
同时,利用区块链的数据安全共享机制,也能够打破气象、林业、湿地等部门的数据壁垒,构建安全可靠的数据共享机制,让数据流转更具价值。
现在有部分生态工作者,为了牟取私利,会将生态数据篡改。如果利用区块链技术,则没有那么容易了。
利用加密技术,把存储的数据放在分布式存储平台进行加密处理。如果生态大数据发生变更,平台就可以记录其不同版本,便于事后追溯和核查。
这个保护机制主要是利用了数据的不可篡改,满足在使用生态大数据的各类业务过程中对数据的安全性的要求。
区块链能够对数据提供安全监控,记录应用系统的操作日志、数据库的操作日志数据,并加密存储在系统上,提供日志预警功能,对于异常情况通过区块链浏览器展示出来,便于及时发现违规的操作和提供证据。
以上就是区块链的分布式存储能够在生态大数据方面所起的作用。未来,肯定会出现很多针对生态大数据存储的平台诞生。
生态大数据是智慧城市建设的重要基础资料 ,引用区块链技术,打造相关的生态大数据存储和管理平台,能够保证生态大数据的安全存储和有效共享,为智慧城市建设添砖加瓦,推动产业区块链的发展。
作者:Justina,微信公众号:妙译生花,从事于区块链运营,擅长内容运营、海外媒体运营。
题图来自Unsplash, 基于CC0协议。
Ⅷ B站分布式KV存储实践
在B站的业务场景中,存在很多种不同模型的数据,有些数据关系比较复杂像:账号、稿件信息。有些数据关系比较简单,只需要简单的kv模型即可满足。此外,又存在某些读写吞吐比较高的业务场景,该场景早期的解决方案是通过MySQL来进行数据的持久化存储,同时通过redis来提升访问的速度与吞吐。但是这种模式带来了两个问题,其一是存储与缓存一致性的问题,该问题在B站通过canal异步更新缓存的方式得以解决,其二则是开发的复杂度,对于这样一套存储系统,每个业务都需要额外维护一个任务脚本来消费canal数据进行缓存数据的更新。基于这种场景,业务需要的其实是一个介于Redis与MySQL之间的提供持久化高性能的kv存储。此外对象存储的元数据,对数据的一致性、可靠性与扩展性有着很高的要求。
基于此背景,我们对自研KV的定位从一开始就是构建一个高可靠、高可用、高性能、高拓展的系统。对于存储系统,核心是保证数据的可靠性,当数据不可靠时提供再高的可用性也是没用的。可靠性的一个核心因素就是数据的多副本容灾,通过raft一致性协议保证多副本数据的一致性。
分布式系统,如何对数据进行分片放置,业界通常有两种做法,一是基于hash进行分区,二是基于range进行分区,两种方式各有优缺点。hash分区,可以有效防止热点问题,但是由于key是hash以后放置的,无法保证key的全局有序。range分区,由于相邻的数据都放在一起,因此可以保证数据的有序,但是同时也可能带来写入热点的问题。基于B站的业务场景,我们同时支持了range分区和hash分区,业务接入的时候可以根据业务特性进行选择。大部分场景,并不需要全局有序,所以默认推荐hash分区的接入方式,比如观看记录、用户动态这些场景,只需要保证同一个用户维度的数据有序即可,同一个用户维度的数据可以通过hashtag的方式保证局部有序。
整个系统核心分为三个组件:
Metaserver用户集群元信息的管理,包括对kv节点的健康监测、故障转移以及负载均衡。
Node为kv数据存储节点,用于实际存储kv数据,每个Node上保存数据的一个副本,不同Node之间的分片副本通过raft保证数据的一致性,并选出主节点对外提供读写,业务也可以根据对数据一致性的需求指定是否允许读从节点,在对数据一致性要求不高的场景时,通过设置允许读从节点可以提高可用性以及降低长尾。
Client模块为用户访问入口,对外提供了两种接入方式,一种是通过proxy模式的方式进行接入,另一种是通过原生的SDK直接访问,proxy本身也是封装自c++的原生SDK。SDK从Metaserver获取表的元数据分布信息,根据元数据信息决定将用户请求具体发送到哪个对应的Node节点。同时为了保证高可用,SDK还实现了重试机制以及backoff请求。
集群的拓扑结构包含了几个概念,分别是Pool、Zone、Node、Table、Shard 与Replica。
基于不同的业务场景,我们同时支持了range分区和hash分区。对于range场景,随着用户数据的增长,需要对分区数据进行分裂迁移。对于hash分区的场景,使用上通常会根据业务的数据量做几倍的冗余预估,然后创建合适的分片数。但是即便是几倍的冗余预估,由于业务发展速度的不可预测,也很容易出现实际使用远超预估的场景,从而导致单个数据分片过大。
之所以不在一开始就创建足够的分片数有两个原因:其一,由于每一个replica都包含一个独立的engine,过多的分片会导致数据文件过多,同时对于批量写入场景存在一定的写扇出放大。其二,每一个shard都是一组raftgroup,过多的raft心跳会对服务造成额外的开销,这一点后续我们会考虑基于节点做心跳合并优化减少集群心跳数。
为了满足业务的需求场景,我们同时支持了range和hash两种模式下的分裂。两种模式分裂流程类似,下面以hash为例进行说明。
hash模式下的分裂为直接根据当前分片数进行倍增。分裂的流程主要涉及三个模块的交互。
metaserver
分裂时,metaserver会根据当前分片数计算出目标分片数,并且下发创建replica指令到对应的Node节点,同时更新shard分布信息,唯一不同的是,处于分裂中的shard状态为splitting。该状态用于client流量请求路由识别。当Node完成数据分裂以后上报metaserver,metaserver更新shard状态为normal从而完成分裂。
Node
node收到分裂请求以后,会根据需要分裂的分片id在原地拉起创建一个新的分片。然后对旧分片的数据进行checkpoint,同时记录旧分片checkpoint对应的logid。新分片创建完成后,会直接从旧分片的checkpoint进行open,然后在异步复制logid之后的数据保证数据的一致性。新分片加载完checkpoint后,原来的旧分片会向raftgroup提交一条分裂完成日志,该日志处理流程与普通raft日志一致。分裂完成后上报分裂状态到metaserver,同时旧分片开始拒绝不再属于自己分片的数据写入,client收到分片错误以后会请求metaserver更新shard分布。
完成分裂以后的两个分片拥有的两倍冗余数据,这些数据会在engine compaction的时候根据compaction_filter过滤进行删除。
Client
用户请求时,根据hash(key) % shard_cnt 获取目标分片。表分裂期间,该shard_cnt表示分裂完成后的最终分片数。以上图3分片的分裂为例:
hash(key) = 4, 分裂前shard_cnt为3,因此该请求会被发送到shard1. 分裂期间,由于shard_cnt变为6,因此目标分片应该是shard4, 但是由于shard4为splitting,因此client会重新计算分片从而将请求继续发送给shard1. 等到最终分裂完成后,shard4状态变更为Normal,请求才会被发送到shard4.
分裂期间,如果Node返回分片信息错误,那么client会请求metaserver更新分片分布信息。
类似于MySQL的binlog,我们基于raftlog日志实现了kv的binlog. 业务可以根据binlog进行实时的事件流订阅,同时为了满足事件流回溯的需求,我们还对binlog数据进行冷备。通过将binlog冷备到对象存储,满足了部分场景需要回溯较长事件记录的需求。
直接复用raftlog作为用户行为的binlog,可以减少binlog产生的额外写放大,唯一需要处理的是过滤raft本身的配置变更信息。learner通过实时监听不断拉取分片产生的binlog到本地并解析。根据learner配置信息决定将数据同步到对应的下游。同时binlog数据还会被异步备份到对象存储,当业务需要回溯较长时间的事件流的时候,可以直接指定位置从S3拉取历史binlog进行解析。
基于上述提到的binlog能力,我们还基于此实现了kv的多活。learner模块会实时将用户写入的数据同步到跨数据中心的其他kv集群。对于跨数据中心部署的业务,业务可以选择就近的kv集群进行读取访问,降低访问延时。
kv的多活分为读多活和写多活。对于读多活,机房A的写入会被异步复制到机房B,机房B的服务可以直接读取本机房的数据,该模式下只有机房A的kv可以写入。对于写多活,kv在机房A B 都能同时提供写入并且进行双向同步,但是为了保证数据的一致性,需要业务上做数据的单元化写入,保证两个机房不会同时修改同一条记录。通过将用户划分单元,提供了写多活的能力。通过对binlog数据打标,解决了双向同步时候的数据回环问题。
对于用户画像和特征引擎等场景,需要将离线生成的大量数据快速导入KV存储系统提供用户读取访问。传统的写入方式是根据生成的数据记录一条条写入kv存储,这样带来两个问题。其一,大批量写入会对kv造成额外的负载与写入带宽放大造成浪费。其次,由于写入量巨大,每次导入需要花费较长的时间。为了减少写入放大以及导入提速,我们支持了bulk load的能力。离线平台只需要根据kv的存储格式离线生成对应的SST文件,然后上传到对象存储服务。kv直接从对象存储拉取SST文件到本地,然后直接加载SST文件即可对外提供读服务。bulk load的另外一个好处是可以直接在生成SST后离线进行compaction,将compaction的负载offload到离线的同时也降低了空间的放大。
由于LSM tree的写入特性,数据需要被不断的compaction到更底层的level。在compaction时,如果该key还有效,那么会被写入到更底层的level里,如果该key已经被删除,那么会判断当前level是否是最底层的,一条被删除的key,会被标记为删除,直到被compaction到最底层level的时候才会被真正删除。compaction的时候会带来额外的写放大,尤其当value比较大的时候,会造成巨大的带宽浪费。为了降低写放大,我们参考了Bitcask实现了kv分离的存储引擎sparrowdb.
sparrowdb 介绍
用户写入的时候,value通过append only的方式写入data文件,然后更新索引信息,索引的value包含实际数据所在的data文件id,value大小以及position信息,同时data文件也会包含索引信息。与原始的bitcask实现不一样的是,我们将索引信息保存在 rocksdb。
更新写入的时候,只需要更新对应的索引即可。compaction的时候,只需将索引写入底层的level,而无需进行data的拷贝写入。对于已经失效的data,通过后台线程进行检查,当发现data文件里的索引与rocksdb保存的索引不一致的时候,说明该data已经被删除或更新,数据可以被回收淘汰。
使用kv存储分离降低了写放大的问题,但是由于kv分离存储,会导致读的时候多了一次io,读请求需要先根据key读到索引信息,再根据索引信息去对应的文件读取data数据。为了降低读访问的开销,我们针对value比较小的数据进行了inline,只有当value超过一定阈值的时候才会被分离存储到data文件。通过inline以及kv分离获取读性能与写放大之间的平衡。
在分布式系统中,负载均衡是绕不过去的问题。一个好的负载均衡策略可以防止机器资源的空闲浪费。同时通过负载均衡,可以防止流量倾斜导致部分节点负载过高从而影响请求质量。对于存储系统,负载均衡不仅涉及到磁盘的空间,也涉及到机器的内存、cpu、磁盘io等。同时由于使用raft进行主从选主,保证主节点尽可能的打散也是均衡需要考虑的问题。
副本均衡
由于设计上我们会尽量保证每个副本的大小尽量相等,因此对于空间的负载其实可以等价为每块磁盘的副本数。创建副本时,会从可用的zone中寻找包含副本数最少的节点进行创建。同时考虑到不同业务类型的副本读写吞吐可能不一样导致CPU负载不一致,在挑选副本的时候会进一步检查当前节点的负载情况,如果当前节点负载超过阈值,则跳过该节点继续选择其他合适的节点。目前基于最少副本数以及负载校验基本可以做到集群内部的节点负载均衡。
当出现负载倾斜时,则从负载较高的节点选择副本进行迁出,从集群中寻找负载最低的节点作为待迁入节点。当出现节点故障下线以及新机器资源加入的时候,也是基于均值计算待迁出以及迁入节点进行均衡。
主从均衡
虽然通过最少副本数策略保证了节点副本数的均衡,但是由于raft选主的性质,可能出现主节点都集中在部分少数节点的情况。由于只有主节点对外提供写入,主节点的倾斜也会导致负载的不均衡。为了保证主节点的均衡,Node节点会定期向metaserver上报当前节点上副本的主从信息。
主从均衡基于表维度进行操作。metaserver会根据表在Node的分布信息进行副本数的计算。主副本的数量基于最朴素简单的数学期望进行计算: 主副本期望值 = 节点副本数 / 分片副本数。下面为一个简单的例子:
假设表a包含10个shard,每个shard 3个replica。在节点A、B、C、D的分布为 10、5、6、9. 那么A、B、C、D的主副本数期望值应该为 3、1、2、3. 如果节点数实际的主副本数少于期望值,那么被放入待迁入区,如果大于期望值,那么被放入待迁出区。同时通过添加误差值来避免频繁的迁入迁出。只要节点的实际主副本数处于 [x-δx,x+δx] 则表示主副本数处于稳定期间,x、δx 分别表示期望值和误差值。
需要注意的是,当对raft进行主从切换的时候,从节点需要追上所有已提交的日志以后才能成功选为主,如果有节点落后的时候进行主从切换,那么可能导致由于追数据产生的一段时间无主的情况。因此在做主从切换的时候必须要检查主从的日志复制状态,当存在慢节点的时候禁止进行切换。
3.7 故障检测&修复
一个小概率的事件,随着规模的变大,也会变成大概率的事件。分布式系统下,随着集群规模的变大,机器的故障将变得愈发频繁。因此如何对故障进行自动检测容灾修复也是分布式系统的核心问题。故障的容灾主要通过多副本raft来保证,那么如何进行故障的自动发现与修复呢。
健康监测
metaserver会定期向node节点发送心跳检查node的健康状态,如果node出现故障不可达,那么metaserver会将node标记为故障状态并剔除,同时将node上原来的replica迁移到其他健康的节点。
为了防止部分node和metaserver之间部分网络隔离的情况下node节点被误剔除,我们添加了心跳转发的功能。上图中三个node节点对于客户端都是正常的,但是node3由于网络隔离与metaserver不可达了,如果metaserver此时直接剔除node3会造成节点无必要的剔除操作。通过node2转发心跳探测node3的状态避免了误剔除操作。
除了对节点的状态进行检测外,node节点本身还会检查磁盘信息并进行上报,当出现磁盘异常时上报异常磁盘信息并进行踢盘。磁盘的异常主要通过dmesg日志进行采集分析。
故障修复
当出现磁盘节点故障时,需要将原有故障设备的replica迁移到其他健康节点,metaserver根据负载均衡策略选择合适的node并创建新replica, 新创建的replica会被加入原有shard的raft group并从leader复制快照数据,复制完快照以后成功加入raft group完成故障replica的修复。
故障的修复主要涉及快照的复制。每一个replica会定期创建快照删除旧的raftlog,快照信息为完整的rocksdb checkpoint。通过快照进行修复时,只需要拷贝checkpoint下的所有文件即可。通过直接拷贝文件可以大幅减少快照修复的时间。需要注意的是快照拷贝也需要进行io限速,防止文件拷贝影响在线io.
过期数据淘汰
在很多业务场景中,业务的数据只需要存储一段时间,过期后数据即可以自动删除清理,为了支持这个功能,我们通过在value上添加额外的ttl信息,并在compaction的时候通过compaction_filter进行过期数据的淘汰。level之间的容量呈指数增长,因此rocksdb越底层能容纳越多的数据,随着时间的推移,很多数据都会被移动到底层,但是由于底层的容量比较大,很难触发compaction,这就导致很多已经过期的数据没法被及时淘汰从而导致了空间放大。与此同时,大量的过期数据也会对scan的性能造成影响。这个问题可以通过设置periodic_compaction_seconds 来解决,通过设置周期性的compaction来触发过期数据的回收。
scan慢查询
除了上面提到的存在大批过期数据的时候可能导致的scan慢查询,如果业务存在大批量的删除,也可能导致scan的时候出现慢查询。因为delete对于rocksdb本质也是一条append操作,delete写入会被添加删除标记,只有等到该记录被compaction移动到最底层后该标记才会被真正删除。带来的一个问题是如果用户scan的数据区间刚好存在大量的delete标记,那么iterator需要迭代过滤这些标记直到找到有效数据从而导致慢查询。该问题可以通过添加 CompactOnDeletionCollector 来解决。当memtable flush或者sst compaction的时候,collector会统计当前key被删除的比例,通过设置合理的 deletion_trigger ,当发现被delete的key数量超过阈值的时候主动触发compaction。
delay compaction
通过设置 CompactOnDeletionCollector 解决了delete导致的慢查询问题。但是对于某些业务场景,却会到来严重的写放大。当L0被compaction到L1时候,由于阈值超过deletion_trigger ,会导致L1被添加到compaction队列,由于业务的数据特性,L1和L2存在大量重叠的数据区间,导致每次L1的compaction会同时带上大量的L2文件造成巨大的写放大。为了解决这个问题,我们对这种特性的业务数据禁用了CompactOnDeletionCollector 。通过设置表级别参数来控制表级别的compaction策略。后续会考虑优化delete trigger的时机,通过只在指定层级触发来避免大量的io放大。
compaction限速
由于rocksdb的compaction会造成大量的io读写,如果不对compaction的io进行限速,那么很可能影响到在线的写入。但是限速具体配置多少比较合适其实很难确定,配置大了影响在线业务,配置小了又会导致低峰期带宽浪费。基于此rocksdb 在5.9以后为 NewGenericRateLimiter 添加了 auto_tuned 参数,可以根据当前负载自适应调整限速。需要注意的是,该函数还有一个参数 RateLimiter::Mode 用来限制操作类型,默认值为 kWritesOnly,通常情况该模式不会有问题,但是如果业务存在大量被删除的数据,只限制写可能会导致compaction的时候造成大量的读io。
关闭WAL
由于raft log本身已经可以保证数据的可靠性,因此写入rocksdb的时候可以关闭wal减少磁盘io,节点重启的时候根据rocksdb里保存的last_apply_id从raft log进行状态机回放即可。
降副本容灾
对于三副本的raft group,单副本故障并不会影响服务的可用性,即使是主节点故障了剩余的两个节点也会快速选出主并对外提供读写服务。但是考虑到极端情况,假设同时出现两个副本故障呢? 这时只剩一个副本无法完成选主服务将完全不可用。根据墨菲定律,可能发生的一定会发生。服务的可用性一方面是稳定提供服务的能力,另一方面是故障时快速恢复的能力。那么假设出现这种故障的时候我们应该如何快速恢复服务的可用呢。
如果通过创建新的副本进行修复,新副本需要等到完成快照拷贝以后才能加入raft group进行选举,期间服务还是不可用的。那么我们可以通过强制将分片降为单副本模式,此时剩余的单个健康副本可以独自完成选主,后续再通过变更副本数的方式进行修复。
RaftLog 聚合提交
对于写入吞吐非常高的场景,可以通过牺牲一定的延时来提升写入吞吐,通过log聚合来减少请求放大。对于SSD盘,每一次写入都是4k刷盘,value比较小的时候会造成磁盘带宽的浪费。我们设置了每5ms或者每聚合4k进行批量提交。该参数可以根据业务场景进行动态配置修改。
异步刷盘
有些对于数据一致性要求不是非常高的场景,服务故障的时候允许部分数据丢失。对于该场景,可以关闭fsync通过操作系统进行异步刷盘。但是如果写入吞吐非常高导致page cache的大小超过了 vm.diry_ratio ,那么即便不是fsync也会导致io等待,该场景往往会导致io抖动。为了避免内核pdflush大量刷盘造成的io抖动,我们支持对raftlog进行异步刷盘。
透明多级存储,和缓存结合,自动冷热分离,通过将冷数据自动搬迁到kv降低内存使用成本。
新硬件场景接入,使用SPDK 进行IO提速,使用PMEM进行访问加速。
参考文献
[1] Bitcask A Log-Structured Hash Table for Fast Key/Value Data
[2] Lethe: A Tunable Delete-Aware LSM Engine
Ⅸ 分布式存储有哪些
问题一:当前主流分布式文件系统有哪些?各有什么优缺点 目前几个主流的分布式文件系统除GPFS外,还有PVFS、Lustre、PanFS、GoogleFS等。
1.PVFS(Parallel Virtual File System)项目是Clemson大学为了运行Linux集群而创建的一个开源项目,目前PVFS还存在以下不足:
1)单一管理节点:只有一个管理节点来管理元数据,当集群系统达到一定的规模之后,管理节点将可能出现过度繁忙的情况,这时管理节点将成为系统瓶颈;
2)对数据的存储缺乏容错机制:当某一I/O节点无法工作时,数据将出现不可用的情况;
3)静态配置:对PVFS的配置只能在启动前进行,一旦系统运行则不可再更改原先的配置。
2.Lustre文件系统是一个基于对象存储的分布式文件系统,此项目于1999年在Carnegie Mellon University启动,Lustre也是一个开源项目。它只有两个元数据管理节点,同PVFS类似,当系统达到一定的规模之后,管理节点会成为Lustre系统中的瓶颈。
3.PanFS(Panasas File System)是Panasas公司用于管理自己的集群存储系统的分布式文件系统。
4.GoogleFS(Google File System)是Google公司为了满足公司内部的数据处理需要而设计的一套分布式文件系统。
5.相对其它的文件系统,GPFS的主要优点有以下三点:
1)使用分布式锁管理和大数据块策略支持更大规模的集群系统,文件系统的令牌管理器为块、inode、属性和目录项建立细粒度的锁,第一个获得锁的客户将负责维护相应共享对象的一致性管理,这减少了元数据服务器的负担;
2)拥有多个元数据服务器,元数据也是分布式,使得元数据的管理不再是系统瓶颈;
3)令牌管理以字节作为锁的最小单位,也就是说除非两个请求访问的是同一文件的同一字节数据,对于数据的访问请求永远不会冲突.
问题二:分布式存储是什么?选择什么样的分布式存储更好? 分布式存储系统,是将数据分散存储在多 *** 立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。
联想超融合ThinkCloud AIO超融合云一体机是联想针对企业级用户推出的核心产品。ThinkCloud AIO超融合云一体机实现了对云管理平台、计算、网络和存储系统的无缝集成,构建了云计算基础设施即服务的一站式解决方案,为用户提供了一个高度简化的一站式基础设施云平台。这不仅使得业务部署上线从周缩短到天,而且与企业应用软件、中间件及数据库软件完全解耦,能够有效提升企业IT基础设施运维管理的效率和关键应用的性能
问题三:什么是分布式存储系统? 就是将数据分散存储在多 *** 立的设备上
问题四:什么是分布式数据存储 定义:
分布式数据库是指利用高速计算机网络将物理上分散的多个数据存储单元连接起来组成一个逻辑上统一的数据库。分布式数据库的基本思想是将原来集中式数据库中的数据分散存储到多个通过网络连接的数据存储节点上,以获取更大的存储容量和更高的并发访问量。近年来,随着数据量的高速增长,分布式数据库技术也得到了快速的发展,传统的关系型数据库开始从集中式模型向分布式架构发展,基于关系型的分布式数据库在保留了传统数据库的数据模型和基本特征下,从集中式存储走向分布式存储,从集中式计算走向分布式计算。
特点:
1.高可扩展性:分布式数据库必须具有高可扩展性,能够动态地增添存储节点以实现存储容量的线性扩展。
2 高并发性:分布式数据库必须及时响应大规模用户的读/写请求,能对海量数据进行随机读/写。
3. 高可用性:分布式数据库必须提供容错机制,能够实现对数据的冗余备份,保证数据和服务的高度可靠性。
问题五:分布式文件系统有哪些主要的类别? 分布式存储在大数据、云计算、虚拟化场景都有勇武之地,在大部分场景还至关重要。munity.emc/message/655951 下面简要介绍*nix平台下分布式文件系统的发展历史:
1、单机文件系统
用于操作系统和应用程序的本地存储。
2、网络文件系统(简称:NAS)
基于现有以太网架构,实现不同服务器之间传统文件系统数据共享。
3、集群文件系统
在共享存储基础上,通过集群锁,实现不同服务器能够共用一个传统文件系统。
4、分布式文件系统
在传统文件系统上,通过额外模块实现数据跨服务器分布,并且自身集成raid保护功能,可以保证多台服务器同时访问、修改同一个文件系统。性能优越,扩展性很好,成本低廉。
问题六:分布式文件系统和分布式数据库有什么不同 分布式文件系统(dfs)和分布式数据库都支持存入,取出和删除。但是分布式文件系统比较暴力,可以当做key/value的存取。分布式数据库涉及精炼的数据,传统的分布式关系型数据库会定义数据元组的schema,存入取出删除的粒度较小。
分布式文件系统现在比较出名的有GFS(未开源),HDFS(Hadoop distributed file system)。分布式数据库现在出名的有Hbase,oceanbase。其中Hbase是基于HDFS,而oceanbase是自己内部实现的分布式文件系统,在此也可以说分布式数据库以分布式文件系统做基础存储。
问题七:分布式存储有哪些 华为的fusionstorage属于分布式 您好,很高兴能帮助您,首先,FusionDrive其实是一块1TB或3TB机械硬盘跟一块128GB三星830固态硬盘的组合。我们都知道,很多超极本同样采用了混合型硬盘,但是固态硬盘部分的容量大都只有8GB到32GB之间,这个区间无法作为系统盘来使用,只能作
问题八:linux下常用的分布式文件系统有哪些 这他妈不是腾讯今年的笔试题么
NFS(tldp/HOWTO/NFS-HOWTO/index)
网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS。
NFS允许一个系统在网络上与它人共享目录和文件。通过使用NFS, 用户和程序可以象访问本地文件一样访问远端系统上的文件。它的好处是:
1、本地工作站使用更少的磁盘空间,因为通常的数据可以存放在一台机器上而且可以通过网络访问到。
2、用户不必在每个网络上机器里面都有一个home目录。home目录可以被放在NFS服务器上并且在网络上处处可用。
3、诸如软驱、CDROM、和ZIP之类的存储设备可以在网络上面被别的机器使用。可以减少整个网络上的可移动介质设备的数量。
开发语言c/c++,可跨平台运行。
OpenAFS(openafs)
OpenAFS是一套开放源代码的分布式文件系统,允许系统之间通过局域网和广域网来分享档案和资源。OpenAFS是围绕一组叫做cell的文件服务器组织的,每个服务器的标识通常是隐藏在文件系统中,从AFS客户机登陆的用户将分辨不出他们在那个服务器上运行,因为从用户的角度上看,他们想在有识别的Unix文件系统语义的单个系统上运行。
文件系统内容通常都是跨cell复制,一便一个硬盘的失效不会损害OpenAFS客户机上的运行。OpenAFS需要高达1GB的大容量客户机缓存,以允许访问经常使用的文件。它是一个十分安全的基于kerbero的系统,它使用访问控制列表(ACL)以便可以进行细粒度的访问,这不是基于通常的Linux和Unix安全模型。开发协议IBM Public,运行在linux下。
MooseFs(derf.homelinux)
Moose File System是一个具备容错功能的网路分布式文件统,它将数据分布在网络中的不同服务器上,MooseFs通过FUSE使之看起来就 是一个Unix的文件系统。但有一点问题,它还是不能解决单点故障的问题。开发语言perl,可跨平台操作。
pNFS(pnfs)
网络文件系统(Network FileSystem,NFS)是大多数局域网(LAN)的重要的组成部分。但NFS不适用于高性能计算中苛刻的输入书橱密集型程序,至少以前是这样。NFS标准的罪行修改纳入了Parallel NFS(pNFS),它是文件共享的并行实现,将传输速率提高了几个数量级。
开发语言c/c++,运行在linu下。
googleFs
据说是一个比较不错的一个可扩展分布式文件系统,用于大型的,分布式的,对大量数据进行访问的应用。它运行于廉价的普通硬件上,但可以提供容错功能,它可以给大量的用户提供性能较高的服务。google自己开发的。
问题九:分布式存储都有哪些,并阐述其基本实现原理 神州云科 DCN NCS DFS2000(简称DFS2000)系列是面向大数据的存储系统,采用分布式架构,真正的分布式、全对称群集体系结构,将模块化存储节点与数据和存储管理软件相结合,跨节点的客户端连接负载均衡,自动平衡容量和性能,优化集群资源,3-144节点无缝扩展,容量、性能岁节点增加而线性增长,在 60 秒钟内添加一个节点以扩展性能和容量。
问题十:linux 分布式系统都有哪些? 常见的分布式文件系统有,GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS、FastDFS等。各自适用于不同的领域。它们都不是系统级的分布式文件系统,而是应用级的分布式文件存储服务。
GFS(Google File System)
--------------------------------------
Google公司为了满足本公司需求而开发的基于Linux的专有分布式文件系统。。尽管Google公布了该系统的一些技术细节,但Google并没有将该系统的软件部分作为开源软件发布。
下面分布式文件系统都是类 GFS的产品。
HDFS
--------------------------------------
Hadoop 实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。 Hadoop是Apache Lucene创始人Doug Cutting开发的使用广泛的文本搜索库。它起源于Apache Nutch,后者是一个开源的网络搜索引擎,本身也是Luene项目的一部分。Aapche Hadoop架构是MapRece算法的一种开源应用,是Google开创其帝国的重要基石。
Ceph
---------------------------------------
是加州大学圣克鲁兹分校的Sage weil攻读博士时开发的分布式文件系统。并使用Ceph完成了他的论文。
说 ceph 性能最高,C++编写的代码,支持Fuse,并且没有单点故障依赖, 于是下载安装, 由于 ceph 使用 btrfs 文件系统, 而btrfs 文件系统需要 Linux 2.6.34 以上的内核才支持。
可是ceph太不成熟了,它基于的btrfs本身就不成熟,它的官方网站上也明确指出不要把ceph用在生产环境中。
Lustre
---------------------------------------
Lustre是一个大规模的、安全可靠的,具备高可用性的集群文件系统,它是由SUN公司开发和维护的。
该项目主要的目的就是开发下一代的集群文件系统,可以支持超过10000个节点,数以PB的数据量存储系统。
目前Lustre已经运用在一些领域,例如HP SFS产品等。
Ⅹ CentOS 7部署 Ceph分布式存储架构
随着OpenStack日渐成为开源云计算的标准软件栈,Ceph也已经成为OpenStack的首选后端存储。Ceph是一种为优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统。
Ceph是一个开源的分布式文件系统。因为它还支持块存储、对象存储,所以很自然的被用做云计算框架openstack或cloudstack整个存储后端。当然也可以单独作为存储,例如部署一套集群作为对象存储、SAN存储、NAS存储等。
前三台服务器增加一块硬盘/dev/sdb实验, 创建目录并挂载到/var/local/osd{1,2,3};
规范系统主机名添加hosts文件实现集群主机名与主机名之间相互能够解析(host 文件添加主机名不要使用fqdn方式)可用 hostnamectl set-hostname [name] 设置分别打开各节点的 /etc/hosts 文件,加入这四个节点ip与名称的对应关系:
在管理节点使用ssh-keygen 生成ssh keys 发布到各节点
第一步:增加 yum配置文件(各个节点都需要增加yum源) vim /etc/yum.repos.d/ceph.repo
或阿里的ceph源
复制配置文件到其它节点和客户端
在ceph1更新软件源并安装ceph-deploy 管理工具
配置文件的默认副本数从3改成2,这样只有两个osd也能达到 active+clean 状态,添加行 osd_pool_default_size = 2
(如果网络源安装失败,手工安装epel-release 然后安装yum –yinstall cep-release再yum –y install ceph ceph-radosgw)
错误参考: https://blog.csdn.net/yenai2008/article/details/72457463
添加osd节点 (所有osd节点执行)
我们实验准备时已经创建目录/var/local/osd{id}
(用ceph-deploy把配置文件和admin密钥拷贝到所有节点,这样每次执行Ceph命令行时就无需指定monitor地址和ceph.client.admin.keyring了)
以上基本上完成了ceph存储集群的搭建。
其中: <pg_num> = 128 ,
关于创建存储池
确定 pg_num 取值是强制性的,因为不能自动计算。下面是几个常用的值:
随着 OSD 数量的增加,正确的 pg_num 取值变得更加重要,因为它显着地影响着集群的行为、以及出错时的数据持久性(即灾难性事件导致数据丢失的概率)。
创建好存储池后,你就可以用 fs new 命令创建文件系统了
ceph fs new <fs_name> cephfs_metadata cephfs_data
其中: <fs_name> = cephfs 可自定义
在这里想起没在/etc/fstab配置ceph1、ceph2、ceph3的sdb自动挂载。
ceph在开源社区还是比较热门的,但是更多的是应用于云计算的后端存储。所以大多数在生产环境中使用ceph的公司都会有专门的团队对ceph进行二次开发,ceph的运维难度也比较大。但是经过合理的优化之后,ceph的性能和稳定性都是值得期待的。
清理机器上的ceph相关配置
可以参考内容: http://blog.51cto.com/12270625/1887648
