文档章节

mnesia fragment分片逻辑

rongtou
 rongtou
发布于 2017/02/24 23:16
字数 445
阅读 59
收藏 0
点赞 0
评论 0

mnesia的disc单表有4GB的大小限制,因此在项目开始之初就要评估下数据大小,避免以后修改,扩容的麻烦。而且用了mnesia分片,读写方法将不能使用mnesia:read,mnesia:write了,需要统一使用mnesia:activity来包装,声明使用mnesia_frag。

mnesia默认使用Linear Hashing进行分片管理,查询。

核心代码mnesia_frag_hash.erl:

init_state(_Tab, State) when State == undefined ->
    #hash_state{n_fragments     = 1,
        next_n_to_split = 1,
        n_doubles       = 0,
        function        = phash2}.

add_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
    P = SplitN + 1,
    NewN = N + 1,
    State2 = case power2(L) + 1 of
         P2 when P2 == P ->
             State#hash_state{n_fragments      = NewN,
                      n_doubles        = L + 1,
                      next_n_to_split = 1};
         _ ->
             State#hash_state{n_fragments     = NewN,
                      next_n_to_split = P}
         end,
    {State2, [SplitN], [NewN]}.

del_frag(#hash_state{next_n_to_split = SplitN, n_doubles = L, n_fragments = N} = State) ->
    P = SplitN - 1,
    if
    P < 1 ->
        L2 = L - 1,
        MergeN = power2(L2),
        State2 = State#hash_state{n_fragments     = N - 1,
                      next_n_to_split = MergeN,
                      n_doubles       = L2},
        {State2, [N], [MergeN]};
    true ->
        MergeN = P,
        State2 = State#hash_state{n_fragments     = N - 1,
                      next_n_to_split = MergeN},
        {State2, [N], [MergeN]}
    end.

key_to_frag_number(#hash_state{function = phash2, n_fragments = N, n_doubles = L}, Key) ->
    A = erlang:phash2(Key, power2(L + 1)) + 1,
    if
    A > N ->
        A - power2(L);
    true ->
        A
    end.

按照代码,列出8个分片生成过程中,各变量的值以及哪些分片的数据需要迁移去新分片

n_fragmentsnext_n_to_splitn_doublessplit_frag(分离分片)write_frag(新增分片)
110
21112
32113
41224
52215
63226
74237
81348

根据源码,我们可以总结出

  • 每次只增加或减少一个分片
  • 扩充时受影响分片中有将近一半数据迁到新分片中
  • 缩减时一个分片中的数据都迁到另一个分片中
  • 在大多数情况下,各分片中数据数量不均衡。因此推荐分片数量为2的N次方个,刚好分出一半数据来做分片,数据能均衡分布。

© 著作权归作者所有

共有 人打赏支持
rongtou

rongtou

粉丝 5
博文 9
码字总数 4533
作品 0
广州
程序员
IP数据报分片——Fragmentation和重组

IP数据报分片-fragmentation和重组 在TCP/IP分层中,数据链路层用MTU(Maximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU是指一次传送的数据最大长度,不包括数据链...

秋风醉了
2015/07/23
0
0
关于IPv4协议的一点看法-地址空间,分段标识,LinuxNAT

IPv4实际上是一个被设计的很勉强的协议,远远没有TCP等传输层协议设计的好。对于它的升级版,IPv6,实际上我也一样不看好,虽然它解决了很多问题,扩展了地址空间,增加了协议堆栈化的支持....

晨曦之光
2012/04/10
359
0
mnesia之inconsistent_database

当mnesia集群出现网络分区(networkpartition)时,各自的分区可能会写入不同的数据,从而出现数据不一致的现象,当网络分区恢复后,mnesia会上报一个inconsistentdatabase的系统事件,并且数...

hncscwc
2013/11/05
0
0
海王星Ivan/Mycat-Server

MyCAT MyCAT is an Open-Source software, “a large database cluster” oriented to enterprises. MyCAT is an enforced database which is a replacement for MySQL and supports transac......

海王星Ivan
2015/04/15
0
0
IP_VFR-4-FRAG_TABLE_OVERFLOW【cisco设备报错】碎片攻击

问题描述: 05-23-2012 21:36:16 Local7.Warning 58.25x.x.x 52: *May 23 21:30:34: %IP_VFR-4-FRAG_TABLE_OVERFLOW:GigabitEthernet0/0: the fragment table hasreached its maximum thresh......

思懿
2016/07/27
0
0
TCP 最大报文段长度 MSS

TCP 最大报文段长度 MSS(Maximum Segment Size) MSS 是TCP选项中最经常出现,也是最早出现的选项。MSS选项占4byte。MSS是每一个TCP报文段中数据字段的最大长度,注意:只是数据部分的字段,...

秋风醉了
2015/07/24
0
0
(转载)低成本和高性能MySQL云数据的架构探索

转载自Erlang非业余研究 本文链接地址: 低成本和高性能MySQL云数据的架构探索 原文地址:http://www.alibabatech.org/article/detail/3405/0?ticket=d69f07f8-b60b-43f8-9572-7d795bb8429d ...

景德真人
2012/10/26
690
2
Java的XML转换框架--Smooks

Smooks 是一款基于 LGPL 协议的开源 Java 框架,主要用于处理 XML 与 non-XML 格式 ( 包括 CSV,EDI,Java) 之间的转换。Smooks 于 2008 年 5 月发布 v1.0,目前最新的版本已是 v1.3.1。正如...

匿名
2008/09/09
7.5K
0
【干货】浅谈分布式数据库中间件之分库分表

分库分表,顾名思义就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。那么关于分库分表,你了解多少呢?接下来,我们将从什么是数据分片及如何...

中间件小哥
07/13
0
0
Live555源代码解读(10)

十一 、h264 RTP传输详解(3) 书接上回:H264FUAFragmenter又对数据做了什么呢? [cpp] view plaincopy void H264FUAFragmenter::doGetNextFrame() { if (fNumValidDataBytes == 1) { // We h......

Sean-x
2016/02/25
12
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
0
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
今天
12
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
今天
1
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
今天
1
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 vim 4.expect [root@yong-01 sbin]# vim 4.expect#!/usr/bin/expectset passwd "20655739"spawn rsync -av ro...

lyy549745
今天
1
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
今天
0
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
今天
2
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部