cephfs 多MDS负载均衡的使用方式

 最近发现不少朋友,对cephfs的使用方式存在误区。很多朋友线上连接数十几万,IOPS压力巨大,依然在跑着单mds。直接导致单mds session耗尽,mds进程down。或者扛不住那么大的IOPS,性能很慢。要知道cephfs的性能是随着mds的数量增加线性增长的,mds越多cephfs性能越好。灵活的让多个mds分担IOPS,连接压力是最佳选择。但是多mds如果配置不好,会导致IO夯住,这就让cephfs更冷门了。我和朋友tiger认为有必要帮助下社区。下面进入正题。

 

 

            多mds的坑在哪?

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

 

             

cephfs 多MDS负载均衡的使用方式_第1张图片

我们怎么才能让多mds之间缓存目录不迁移,或者尽量少的数据迁移呢?有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不迁移

    有同学会问,你只pin了/A根目录,那/A目录的子目录/A/AA,/A/AA/AAA,不一样会迁移吗?

          我们只需要设置cephfs的mds不迁移,就能让子目录不迁移。

         打开/etc/ceph/ceph.conf文件配置

         mds_bal_min_rebalance=1000

         

 

cephfs 多MDS负载均衡的使用方式_第2张图片

        每个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夯死。

 

总结:两种方案各有优点

1,静态负载均衡用在需要性能稳定的场景。

2,动态负载均衡用在对IOPS需求巨大的场景。一个业务可以跑多个mds。

cephfs 多MDS负载均衡的使用方式_第3张图片

 

你可能感兴趣的:(ceph)