当前位置: 首页 > news >正文

重庆定制网站制作价格广州建站方法

重庆定制网站制作价格,广州建站方法,昆明网站建设公司排行,wordpress 4041、ceph纠删码 纠删码(Erasure Code)是比较流行的数据冗余的存储方法#xff0c;将原始数据分成k个数据块(data chunk)#xff0c;通过k个数据块计算出m个校验块(coding chunk)。把nkm个数据块保存在不同的节点#xff0c;通过n中的任意k个块还原出原始数据。EC包含编码和解…1、ceph纠删码 纠删码(Erasure Code)是比较流行的数据冗余的存储方法将原始数据分成k个数据块(data chunk)通过k个数据块计算出m个校验块(coding chunk)。把nkm个数据块保存在不同的节点通过n中的任意k个块还原出原始数据。EC包含编码和解码两个过程。 ceph中的EC编码是以插件的形式来提供的。EC编码有三个指标空间利用率、数据可靠性和恢复效率。ceph提供以下几种纠删码插件clay(coupled-layer)、jerasure、lrc、shec、isa。 clay用于在修复失败的节点/OSD/rack时节省网络带宽和磁盘IO。 jerasure开源库目前ceph默认的编码方式。 isaisa是Intel提供的EC库利用intel处理器指令加速计算只能运行在Intel CPU上。 lrc将校验块分为全局校验块和局部校验块减少单个节点失效后恢复过程的网络开销。 shecshec(k,m,l)k为data chunkm为coding chunkl代表计算coding chunk时需要的data chunk数量。其最大允许失效数据块为ml/k恢复失效的单个数据块data chunk只需要额外读取l个数据块。 2、erasure-code文件结构 erasure-code是ceph的纠删码核心模块包含5个文件夹和ErasureCodeInterface、ErasureCode、ErasureCodePlugin采用工厂模式。 clay、isa、jerasure、lrc、shec是ceph的EC插件。ErasureCodeInterface提供EC插件的共有接口每个接口有详细的说明。ErasureCode提供获取纠删码参数和核心编码、解码接口。ErasureCodePlugin提供纠删方式事件的注册、添加、删除登功能。 3、数据条带化 存储设备都有吞吐量限制它会影响性能和伸缩性所以存储系统一般都支持条带化把连续的信息分片存储于多个设备以增加吞吐量和性能。 基本概念 块chunk基于纠删码编码时每次编码将产生若干大小相同的块要求这些块时有序的否则无法解码。ceph通过数量相等的PG将这些分别存储在不同的osd中。 条带strip如果编码对象太大可分多次进行编码每次完成编码的部分称为条带。同一个对内的条带时有序的。 分片shared同一个对象中所有序号相同的块位于同一个PG上他们组成对象的一个分片分片的编号就是块的序号。 空间利用率rate通过k/n计算。 对象尺寸 Ceph 存储集群里的对象有最大可配置尺寸如 2MB 、 4MB 等等对象尺寸必须足够大以便容纳很多条带单元、而且应该是条带单元的整数倍。 条带数量 Ceph 客户端把一系列条带单元写入由条带数量所确定的一系列对象这一系列的对象称为一个对象集。客户端写到对象集内的最后一个对象时再返回到第一个。 条带宽度 条带都有可配置的单元尺寸如 64KB 。 Ceph 客户端把数据等分成适合写入对象的条带单元除了最后一个。条带宽度应该是对象尺寸的分片这样对象才能 包含很多条带单元。 strip_widthchunk_size*strip_size 假设有ECk4m2strip_size4chunk_size1K那么strip_width4K。在ceph中strip_width默认为4K。 数据条带化过程 如果要处理大尺寸图像、大 S3 或 Swift 对象如视频、或大的 CephFS 目录你就能看到条带化到一个对象集中的多个对象能带来显著的读/写性能提升。当客户端把条带单元并行地写入相应对象时就会有明显的写性能因为对象映射到了不同的归置组、并进一步映射到不同 OSD 可以并行地以最大速度写入。 在上图中客户端数据条带化到一个对象集上图中的objectset1它包含 4 个对象其中第一个条带单元是object0的stripe unit 0、第四个条带是object3的stripe unit 3写完第四个条带客户端要确认对象集是否满了。如果对象集没满客户端再从第一个对象起写入条带上图中的object0如果对象集满了客户端就得创建新对象集上图的object set 2然后从新对象集中的第一个对象上图中的object 4起开始写入第一个条带stripe unit16。 4、源码解析 编码流程 ECUtil::encode是将原始数据按条带宽度进行分割然后对条带数据编码得到条带的数据块和校验块。把每个条带化数据块和校验块有序的链接形成数据块和校验块。 int ECUtil::encode(const stripe_info_t sinfo,ErasureCodeInterfaceRef ec_impl,bufferlist in,const setint want,mapint, bufferlist *out) ....//文件每次按strip_width的大小进行encode编码for (uint64_t i 0; i logical_size; i sinfo.get_stripe_width()) {mapint, bufferlist encoded;bufferlist buf;buf.substr_of(in, i, sinfo.get_stripe_width());//调用对应的纠删码方式进行编码int r ec_impl-encode(want, buf, encoded);ceph_assert(r 0);//将条带化的数据块和校验块追加到outfor (mapint, bufferlist::iterator i encoded.begin();i ! encoded.end();i) {ceph_assert(i-second.length() sinfo.get_chunk_size());(*out)[i-first].claim_append(i-second);}}....return 0; }接下来深入分析ec_impl-encode(want, buf,encoded)ErasureCode是ErasureCodeInterface的子类因此调用ErasureCode::encode。在ErasureCode::encode主要是进行mapint, bufferlist*encoded的内存分配encode_prepare和数据块的编码encode_chunks。 int ErasureCode::encode(const setint want_to_encode,const bufferlist in,mapint, bufferlist *encoded) {unsigned int k get_data_chunk_count();unsigned int m get_chunk_count() - k;bufferlist out;//encoded的内存块分配int err encode_prepare(in, *encoded);if (err)return err;//进行编码操作encode_chunks(want_to_encode, encoded);for (unsigned int i 0; i k m; i) {if (want_to_encode.count(i) 0)encoded-erase(i);}return 0; }ErasureCode::encode_prepare()进行参数初始化和内存分配。 int ErasureCode::encode_prepare(const bufferlist raw,mapint, bufferlist encoded) const {unsigned int k get_data_chunk_count();unsigned int m get_chunk_count() - k;//每个块的大小unsigned blocksize get_chunk_size(raw.length());//空白块的个数unsigned padded_chunks k - raw.length() / blocksize;bufferlist prepared raw;//将数据raw按blocksize大小有序分割并将分割后的块有序写入到encodedfor (unsigned int i 0; i k - padded_chunks; i) {bufferlist chunk encoded[chunk_index(i)];chunk.substr_of(prepared, i * blocksize, blocksize);chunk.rebuild_aligned_size_and_memory(blocksize, SIMD_ALIGN);ceph_assert(chunk.is_contiguous());}if (padded_chunks) {unsigned remainder raw.length() - (k - padded_chunks) * blocksize;bufferptr buf(buffer::create_aligned(blocksize, SIMD_ALIGN));raw.copy((k - padded_chunks) * blocksize, remainder, buf.c_str());buf.zero(remainder, blocksize - remainder);encoded[chunk_index(k-padded_chunks)].push_back(std::move(buf));for (unsigned int i k - padded_chunks 1; i k; i) {bufferptr buf(buffer::create_aligned(blocksize, SIMD_ALIGN));buf.zero();encoded[chunk_index(i)].push_back(std::move(buf));}}for (unsigned int i k; i k m; i) {bufferlist chunk encoded[chunk_index(i)];chunk.push_back(buffer::create_aligned(blocksize, SIMD_ALIGN));}return 0; }以上的工作完成后可以开始正式的编码encode_chunks()。这里假设编码方式为jerasure选用RS码。 int ErasureCodeJerasure::encode_chunks(const setint want_to_encode,mapint, bufferlist *encoded) {char *chunks[k m];for (int i 0; i k m; i)chunks[i] (*encoded)[i].c_str();jerasure_encode(chunks[0], chunks[k], (*encoded)[0].length());return 0; }jerasure_encode()是调用jerasure库的编码函数。 void ErasureCodeJerasureReedSolomonVandermonde::jerasure_encode(char **data,char **coding,int blocksize) {jerasure_matrix_encode(k, m, w, matrix, data, coding, blocksize); }解码流程 ECUtil::decode函数有两个挑个简单的来分析。 下面的decode()函数初始化数据并进行解码。 int ECUtil::decode(const stripe_info_t sinfo,ErasureCodeInterfaceRef ec_impl,mapint, bufferlist to_decode,bufferlist *out) {ceph_assert(to_decode.size());uint64_t total_data_size to_decode.begin()-second.length();....for (uint64_t i 0; i total_data_size; i sinfo.get_chunk_size()) {mapint, bufferlist chunks;for (mapint, bufferlist::iterator j to_decode.begin();j ! to_decode.end();j) {chunks[j-first].substr_of(j-second, i, sinfo.get_chunk_size());}bufferlist bl;int r ec_impl-decode_concat(chunks, bl);ceph_assert(r 0);ceph_assert(bl.length() sinfo.get_stripe_width());out-claim_append(bl);}return 0; }ErasureCode::decode_concat()进行解码并且链接哥哥数据块还原出原数据。 int ErasureCode::decode_concat(const mapint, bufferlist chunks,bufferlist *decoded) {setint want_to_read;for (unsigned int i 0; i get_data_chunk_count(); i) {want_to_read.insert(chunk_index(i));}mapint, bufferlist decoded_map;//解码核心部分int r _decode(want_to_read, chunks, decoded_map);if (r 0) {//将解码后的数据块链接for (unsigned int i 0; i get_data_chunk_count(); i) {decoded-claim_append(decoded_map[chunk_index(i)]);}}return r; }同样地这里也是假设使用纠删码插件为jerasure。jerasure_decode()是调用jerasure库的解码函数。 int ErasureCodeJerasure::decode_chunks(const setint want_to_read,const mapint, bufferlist chunks,mapint, bufferlist *decoded) {unsigned blocksize (*chunks.begin()).second.length();int erasures[k m 1];//记录丢失块的编号int erasures_count 0;//丢失块的个数char *data[k];char *coding[m];for (int i 0; i k m; i) {if (chunks.find(i) chunks.end()) {erasures[erasures_count] i;erasures_count;}if (i k)data[i] (*decoded)[i].c_str();elsecoding[i - k] (*decoded)[i].c_str();}erasures[erasures_count] -1;ceph_assert(erasures_count 0);return jerasure_decode(erasures, data, coding, blocksize); }参考资料 1、体系结构 - Ceph Documentation 2、ceph源码分析 常涛 3、ceph设计原理与实现
http://www.pierceye.com/news/196994/

相关文章:

  • 宣讲家网站官网加强作风建设网站业务怎么做的
  • 厚街网站建设价格做办公室的网站
  • 青海做网站找谁wordpress gif缩略图
  • 手机网站全屏显示如何把自己做的网站放到微信上
  • 网站建设云雅淇wordpress
  • 工作室网站需要备案吗python基础教程编程题
  • 建设工程人才招聘信息网站响应式网站 cms
  • 设计签名免费网站福州的网站建设
  • 太原这边有做网站的吗wordpress实现pdf浏览
  • 制作微信公众号的网站开发30岁做网站运营
  • 松江手机网站开发正规免费代理
  • 太原市建设路小学网站昆山住房与城乡建设局网站
  • 石家庄的网站的公司计算机应用技术专业网站开发方向
  • 网站优化软件排行榜八年级微机网站怎么做
  • 织梦网站漏洞cms网站开发流程
  • 网站开发规划书怎么写企业cms开源
  • html网站免费下载海珠区建网站
  • 石家庄住房城乡建设厅网站宿迁网站建设推广公司
  • 广州模板网站建设费用2024新闻热点摘抄
  • 河北秦皇岛建设局网站做网站简单的软件
  • 上海网站开发外包公司最新新闻热点事件短篇
  • wordpress实现网站勋章功能网站建设需要什么资质
  • 河北沙河市建设局网站威海好的网站建设公司
  • 网站建设怎么放到云空间上海企业网站模板
  • 设计和建设企业网站心得和体会wordpress和新浪微博同步
  • 网站底部横条导航代码制造业erp系统软件有哪些
  • 网站建设公司antnw企业营销型网站制作
  • 接口网站开发wordpress安装网站无法
  • 九九9九九9视频在线观看优化网站结构一般包括
  • 网站缺点国外网站素材