## mnesia fragment分片逻辑 原

rongtou

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

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

``````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.
``````

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

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

### rongtou

mnesia之inconsistent_database

hncscwc
2013/11/05
0
0
IP数据报分片——Fragmentation和重组

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

2015/07/23
0
0

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

2012/04/10
472
0
IP_VFR-4-FRAG_TABLE_OVERFLOW【cisco设备报错】碎片攻击

2016/07/27
0
0

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......

2015/04/15
0
0

IDE 插件新版本发布，开发效率 “biu” 起来了

41分钟前
6
0

7
0
Kubernetes Client-go Informer 源码分析

4
0

11. 重置密码 密钥和密码都支持远程登陆， 二选一 两个都可以登陆， 密钥相对于密码来说，相对安全一点 本地登陆无法是用密钥 修改密码 root 用户 passwd root 修改普通用户 passwd usernam...

miko0089

6
0
bash特性

1.支持别名 alias 2.命令替换 \$(COMMANS) 或者 `COMMAND` 3. bash支持的引号： `` :命令替换 ""：弱引用，可以实现变量替换 ''：强引用，不实现变量替换 4.文件名通配 globbing：（man 7 glo...

4
0