如何对ceph集群进行配置,同时运行多个mds服务?

1回答

GaryyGaryy  系统工程师 , 某保险
花花世界小罗泊涯等赞同了此回答
cephfs多mds默认是动态负载均衡的,为了负载文件系统请求到多个mds。cephfs会根据每个mds计算一个热点值,热点高的mds缓存中的目录会往热点低的mds迁移,缓存中的目录在迁移的过程中是被锁定的,应用层的IO不能访问正在迁移的目录或文件,会导致部分IO访问中断几秒。于是用户就感...显示全部

cephfs多mds默认是动态负载均衡的,为了负载文件系统请求到多个mds。cephfs会根据每个mds计算一个热点值,热点高的mds缓存中的目录会往热点低的mds迁移,缓存中的目录在迁移的过程中是被锁定的,应用层的IO不能访问正在迁移的目录或文件,会导致部分IO访问中断几秒。于是用户就感觉卡了。
有2种方案,两种方案是独立使用的。

一,使用静态负载均衡,我们把业务绑定到mds,每次来业务我们根据mds性能监控报表,把业务绑定到负载低的mds上去,也叫手动负载均衡。操作过程如下:

1,把业务的根目录pin到mds上。
假设给用户a分配了目录/A ,用户b分配了目录/B,用户c分配了目录/C。那么我们把a用户分配到mds0,把b用户分配到mds1,把c用户分配到mds2。
setfattr -n ceph.dir.pin -v 0 /A
setfattr -n ceph.dir.pin -v 1 /B
setfattr -n ceph.dir.pin -v 2 /C

2, 设置cephfs的mds不迁移
只需要设置cephfs的mds不迁移,就能让子目录不迁移。
打开/etc/ceph/ceph.conf文件配置
mds_bal_min_rebalance=1000
每个mds都会产生一个热点值,这个热点值除以集群的总热点,然后和mds_bal_min_rebalance比较,超过mds_bal_min_rebalance就会迁移,但mds的热点值经过计算后怎么都不会超过1000的,所以只要配置mds_bal_min_rebalance=1000,多MDS之间就不会相互迁移缓存目录(不会产生负载均衡),既然不迁移,子目录就会跟着父母走,/A/AA会跟着父目录/A绑定到mds0上,而/A/AA/AAA会跟着父目录/A/AA绑定到mds0上。所以只要绑定了业务的根目录,并且设置了mds_bal_min_rebalance=1000,用户目录就被固定到了mds上。多个用户可以绑定到同一个mds上。
注意:只要使用这种模式,一定要绑定所有业务到mds上,否则业务会被默认分配到mds0上,造成mds0超载。

二,使用动态负载均衡。
依然采用默认的动态负载均衡,但是把迁移敏感度调小,让多mds之间迁移的粒度变小,而不是一下子迁移整个大目录,导致卡了很长时间。目录迁移的速度变快了,访问目录延迟的时间可以忽略不计。
1, 使多mds之间迁移粒度变小
mds_max_export_size = 20971520

2, 使mds之间热度的检测频繁变迟钝(根据场景适当调整)
mds_bal_interval = 10
mds_bal_sample_interval = 3.000000

这样既可以使用动态负载,也能避免负载均衡时候数据迁移导致的IO夯死。

收起
 2019-11-25
浏览895

提问者

haozhangsir系统工程师, 银华

分布式块存储选型优先顺序调查

发表您的选型观点,参与即得50金币。

问题状态

  • 发布时间:2019-11-13
  • 关注会员:2 人
  • 问题浏览:1478
  • 最近回答:2019-11-25