文档章节

mnesia fragment分片逻辑

rongtou
 rongtou
发布于 2017/02/24 23:16
字数 445
阅读 73
收藏 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
广州
程序员
私信 提问
关于IPv4协议的一点看法-地址空间,分段标识,LinuxNAT

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

晨曦之光
2012/04/10
359
0
IP数据报分片——Fragmentation和重组

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

秋风醉了
2015/07/23
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
mnesia之inconsistent_database

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

hncscwc
2013/11/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

js前端图片处理例子

首先需要了解几个api FileReader FileReader主要用于将文件内容读入内存,通过一系列异步接口,可以在主线程中访问本地文件。 <table> <tr> <th>方法定义</th> <th>描述</th> </tr> <tr> <t......

别人说我名字很长
7分钟前
0
0
前端常用插件、工具类库汇总(下)

前言 对本文感兴趣可以先加个收藏,也可以转发分享给身边的小伙伴,以后遇到类似的场景就来看看具体的插件及其用法。 上一篇《前端常用插件、工具类库汇总(上)》内容摘要: 动画库 滚动库 ...

我的卡
13分钟前
2
0
jq 的 $ 符号冲突解决办法

百度了一下,都是 感觉挺负责的,我只是想当前页面 简单使用jq ,解决冲突即可。 很简单的 将 $ 符号换成 jQuery 即可,就不怕冲突了。 jQuery('#message').val();...

之渊
15分钟前
0
0
如何在Cordova Android 7.0.0 以下版本集成最新插件 极光插件为例

前提 Cordova Android 7.0.0开始改变了项目安卓平台的架构。新建一个空项目分别添加Android 6.4.0 和 Android 7.0.0平台: cordova platform add android@6.4.0cordova platform add androi...

极光推送
23分钟前
0
0
移动端Appium自动化测试框架的优势

众所周知,现在市面上的移动端操作系统已被Android和IOS占领,其中Android的份额更是在80%以上。那么面对市面上林林总总的自动化测试框架和工具,为什么说Appium在自动化测试框架的统治级优势...

程序猿拿Q
37分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部