MogileFS Rebalance(文件的重新均衡)
为什么需要 Rebalance
Rebalance 这个功能并不是 MogileFS 中所必需的操作.但有时,它对于你要改变存储设备容量到不同的设备和机器上来讲是一个很好的东西,比如有不同大小的硬盘可以混用,不同空间大小的机器可以混用,可以确保文件应该怎么样平均分布在所有的主机上,就算你的主机空间不一样.
例如,你新添加了三个新的空的服务器,通常对存在的文件存放进行重新洗牌是必要的,调整原有集群上的现有文件到这些新的服务器上面.
MogileFS 的 Rebalance 提供了大量的选项来帮助你进行文件复制和均衡.
Rebalance 的策略
通过策略来控制新的 rebalance/drain 这个系统怎么样工作,你需要使用定义了的字符串的选项,系统会自动评估分析这个选项,并作出决定.
写一个 rebalance 是使用下面的结构,下面的选项只是一个例子,并不是所有可用的选项。
显示 rebalance 的设置:
1
2 |
$ mogadm rebalance settings rebal_policy = from_percent_used=95 to_percent_free=50 limit_type=device limit_by=size limit=5g fid_age=old |
设置它们:
1 |
$ mogadm rebalance policy --options= "from_hosts=3 to_percent_free=50" |
当第一次启动 rebalance 这个功能时, MogileFS 会扫描并保存源硬盘设备的清单.然而,每隔几秒钟,将重新评估和检查目标硬盘设备的列表.
这是为避免乒乓状态和TPO,总能找到最佳的目标候选设备。
策略选项
以下是默认的选项
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23 |
# source from_hosts => [], # host ids (not names). from_devices => [], # device ids. from_percent_used => undef , # 0.nn * 100 from_percent_free => undef , from_space_used => undef , from_space_free => undef , fid_age => 'old' , # old|new limit_type => 'device' , # global|device limit_by => 'none' , # size|count|percent|none limit => undef , # 100g|10%|5000 # target to_hosts => [], to_devices => [], to_percent_used => undef , to_percent_free => undef , to_space_used => undef , to_space_free => undef , not_to_hosts => [], not_to_devices => [], use_dest_devs => 'all' , # all|N (list up to N devices to rep pol) leave_in_drain_mode => 0, |
- from_(percent|space)_*: 从硬盘设备拉文件(fids),拉的源是有几种选择,已经使用的空间和百分比的空闲的空间,空间的选项是表示以 M 兆为单位。
- to_(percent|space)_*:意思和上面一样,除了使用限制可能的目标设备。
- (from|to)_hosts: 使用逗号分隔的主机 ID 的列表,选择这些主机的所有设备
- (from|to)_devices:直接指定你想从哪个硬盘设备上拉, 其他选项可能会进一步减小这个列表(percent_used等).注意: 这是一个逗号分隔的硬盘设备 ID 列表,例如 from_devices=199,201,233
- not_to_*: 从目的地筛选出特定的设备或主机.
- fid_age: 定义 rebalance 的选项,是指从硬盘设备操作的文件列表, "old" 时是使用升序编号或“new”是使用降序编号的文件列表,由于 MogileFS 使用增量 FID ,文件自然是按年龄排序.
- limit_type: (global|device) 指定的限制是否适是全局的(在任何设备 drain 5000g),或每个设备(选择 12 个设备,并给每个设备 drain 10g)
- limit_by: (size|count|percent|none) 定义限制什么.注意百分比未实现.你可以限制 'count',这将是移动的文件数量.'size',指定复制的字节的具体数量. 'none' 这意味着要放满所有设备文件.
- limit: 上面定义的限制的数字. 'size' 限制在默认情况下,用字节表示,要修改的话,可以使用人类容易读的(500M,10G,13t 等等)
- use_dest_devs: (all|N) 应用所有过滤器后,你可以有任意数量的目标设备.极少数,几十,几百.这就限制合计的设备,稍后会要用来复制的.这主要是优化,如果您有很多硬盘设备,你可能想设置一些合理的数量。
- leave_in_drain_mode: (0|1) 在以前版本中设置设备为'drain'的意思,mogile 将这个 drain 的设备自动删除文件.现在,这仅仅意味着,不要把放新的文件到这里.而 rebalance 时在设备上工作,它是从 alive 模式转到 drain 模式.
- 如果你想模仿旧的 old drain 的行为,将此值设置为1.设置任何限制并启用这个,会从设备中删除的所有文件,并不允许再次添加新的.
运行 Rebalance
测试 rebalance 的策略
如上所述,创建你的策略。您可以通过 mogadm rebalance 设置
01
02
03
04
05
06
07
08
09
10
11
12
13
14 |
$ mogadm rebalance test Tested rebalance policy... Policy: etc Source devices: - 100 - 102 - 103 - 104 Destination devices: - 156 - 157 - 158 - 159 |
开始 rebalance 之前,你应该重新看看策略所匹配到的设备是否是你计划的那样,所以一定要记得运行上面的 test 的命令来确认.
希望未来的版本将显示更多的设备信息,现在你只可以手工的靠 mogadm check 输出设备列表.
开始执行重新均衡
1
2
3 |
$ mogadm rebalance start $ mogadm rebalance stop $ mogadm rebalance reset |
Rebalance 可以通过 stop 来暂停,但在 REBAL_QUEUE 中的现有条目将继续运行.
您可以通过 mogstats -stats="general-queues" 查看.再次开始之前完成,比较明智的做法是等待这个完成.
如果你乱写了一个 rebalance 策略,需要重新开始 rebalance ,要么改变策略或当停止后运行 mogadm rebalance reset.
监视 rebalance 的状态
01
02
03
04
05
06
07
08
09
10 |
$ mogadm rebalance status Rebalance is running Rebalance status: bytes_queued = 126008251219 completed_devs = ,102,125,151,148 fids_queued = 519021 sdev_current = 119 sdev_lastfid = 54646960511250969 sdev_limit = 2840763873 source_devs = 108,115,103,113,152,142,107,141,100 |
这个输出只是从 rebalance 中简单的 dump 内部状态来输出,通过保持一些计数器,数据是在 job master 运行之后每隔几秒钟更新一次.
- sdev_current 是工作的硬盘设备
- sdev_limit 是保存的 rebalance 尝试移动的 bytes (or 文件的数量).
- fids_queued 全局的份数是多少 fids 在 queued 中
- bytes_queued 从开始起被移动的 bytes 的数量.
如果 rebalance 运行完了之后这个信息是不会改变,所以你可能见到最后的状态信息.
rebalance 期间查看 mogile 的 syslog 输出通常是一个好主意,如果你有个 fids 因为一些原因不能 rebalance.这些信息会被发送到 syslog.(也可以 telnet 到 tracker 中通过 !watch 来查看).
优化 reblance 的速度
很多 FSCK 的优化可以应用到 Rebalance 可以看: http://code.google.com/p/mogilefs/wiki/FSCK#Tuning_FSCK 文章了解如何加快这个进程.
基本要做的就是在你的 tracker 中增加你 replicate jobs 的数量.
1
2 |
$telnet trackername trackerport !want 5 replicate |
这是配置设置.有一个可配置的设定: queue_rate_for_rebal 默认60 (in Mogilefs 2.45). 大多的时候你并不需要动这个参数.如果调整 replicate 的进程并不能帮助你提高速度时,这时如果 trackers/database 的压力不高,你可以调整这个参数.
Rebalance 的例子
下面有二种示例, 有关使用这个的方法:
1.从那个快用光的硬盘上.来计算要移出多少空间到其它的硬盘.你可以象下面这样来写:
1 |
from_percent_used=90 to_percent_used=10 limit_type=device limit_by=size limit=5g |
如果你有二台服务器上各有四个快用光的硬盘,还有二个服务器上有空的硬盘.这时大约会移动 40g 的数据到新的主机.
2. 运行 rebalance .直接到 mogadm rebalance test 时指出 doesn't pick any new devices to work on.
1 |
from_percent_used=51 to_percent_free=51 limit_type=device limit_by=size limit=1g |
这个会从任何超过 51% 的硬盘上取文件,然后大约每个硬盘复制 1g 的数据到任何一个空过 50% 的硬盘.理论上,过一定的时间这个文件就会平衡.要留意,如果你的整个集群是超过 50%,
你可能会 rebalance 永远不能停止.
Rebalance是怎么工作的.
过滤设备
简而言之,这个文档会要告诉您如何通过字符串来建立一个有关过滤的设备的列表,并选择哪些应该或不应该使用,或应该或不应该被复制到上面.一旦设备被选中后, rebalance 将运行段时间, FID 的队列由 replication 的 worker 来进行实际平衡所需要的操作.
Rebalance 内部
下面是高深点的例子,有关 replicate worker 的平衡流.看下面的例子,可能对你非常有用
- 有个 fid 5 的文件.它有 3 份复制的复本文件,存在 dev 31,32,33 上面.
- 决定从 dev33 上删除这个文件来放到其它的机器来达到 rebalance.
上面的内容对 Rebalance 的命令来讲,在设置完后,相当于告诉 replication 的代码 "复制 FID 为 5 的文件,这时其实会假设 dev33 上并不存在这个文件,并且你不能 put 这个 FID 5 的文件给 dev33"
这是一种约束, rebalance 之前并不能删除这个文件,只能这样,假设少一个文件,才会开始复制的工作.所以复制完后,它应该是的"too_happy",这是为了保证只能够移动一个有效的副本的 FIDS .
- 现在这有 4 个文件的复本,这个 rebalance 的代码会删除那个在 dev33 上的那个文件.
- 现在起有 3 个文件的复本并且现在在 dev33 上不存在这个文件.
建议继续学习:
- MogileFS 的介绍(MogileFS 系列1) (阅读:4130)
- 在 MogileFS 中使用 Nginx (阅读:2689)
- MogileFS 的客户端和API(MogileFS 系列4) (阅读:2505)
- MogileFS 的安装(MogileFS 系列2) (阅读:2483)
- MogileFS 的设置和管理(MogileFS 系列3) (阅读:2062)
- MogileFS 研究 (阅读:1915)
- MogileFS 文件系统检查 (阅读:1655)
- MogileFS 排错小技巧 (阅读:1573)
- 为 MogileFS 配置使用多个网络段/多数据中心 (阅读:1554)
- MogileFS 对大文件的支持 (阅读:1429)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:扶 凯 来源: 扶凯
- 标签: MogileFS Rebalance
- 发布时间:2012-03-31 23:31:30
- [41] 界面设计速成
- [36] Oracle MTS模式下 进程地址与会话信
- [33] IOS安全–浅谈关于IOS加固的几种方法
- [33] 如何拿下简短的域名
- [32] 视觉调整-设计师 vs. 逻辑
- [32] 程序员技术练级攻略
- [32] 图书馆的世界纪录
- [31] android 开发入门
- [31] 【社会化设计】自我(self)部分――欢迎区
- [28] 读书笔记-壹百度:百度十年千倍的29条法则