TLDR:这是一套三节点的ceph集群,使用2副本的SSD和HDD存储池,提供块存储、文件存储和对象存储。
之前网上流传过这张nas9宫格,我这nas,算是功能扩展形式纯粹吧。
历史版本
硬盘盒DAS时期
最早当笔记本内置硬盘不够用的时候,买块3.5寸硬盘插在硬盘盒上连笔记本用。那会笔记本还是USB2.0口,机身上最快的接口竟然还是esata,随着USB速率提升,esata接口很快退出了历史舞台。
小米路由1
第一次用上SMB共享的时候已经是14年了,买了小米第一代的路由器,含1T硬盘的那个,这会才知道NAS的概念。想想也已经过去10年了,那时候才知道原来可以不用电脑挂机下载,而且文件可以网络共享。
闲置电脑SMB时期
路由器上1T的空间满足不了的时候,就演变成了闲置电脑装光驱位热插拔硬盘架SMB共享的时代,正好吧之前买的几块2T硬盘用上,RDP远程桌面下载机同时提供SMB共享。那个时候迅雷会员还是可以满速下载各种版权资源的。
百花齐放时期
当了解了PC组装的原理之后,各种形态的NAS也就随手拈来。前后用过小机箱+亚克力外置硬盘架模式,像是这样。
或者树莓派+移动硬盘盒模式,虚拟机随便直通块硬盘用容器跑smb,这时候就不在乎形式了,能用就行。
2020铝型材超融合集群
持续的仓鼠症行为让我每半年需要添置一块3T硬盘,硬盘数量超过了普通机箱安装极限的时候,我决定搞波大的。淘了块华擎的j1800,用铝型材设计了一个三层结构,底层是硬盘层,12个3.5寸盘位。第二层是存储节点,第三层是计算节点的主板。存储同时提供iscsi给计算节点的esxi使用,相当于是一个手搓的超融合集群。到现在这台“NAS”还在作为我的冷备份使用。这个时期玩了不少东西,freenas、unrain、winserver、hyperv、esxi,能玩的都玩了一遍。甚至还因为嫌风扇吵用esp8266做了一个远程风扇控制模块,能根据室温或者手动控制风扇启停。
PVE All in one时期
原因是计算容量不够,于是组了一台ryzen平台的主机,跑PVE+黑群晖。虽说是allinone,但是没有把路由器融合进去。PVE的ZFS池如果不限制缓存的话会占用大量内存,后来选择直通硬盘用黑群晖,同时作为k8s集群的存储,这个方案持续了很长时间。
家庭存储1.0
闲扯了一大堆,终于来到了正题,这会的家庭存储我称其为1.0版本,之前的多多少少有些不那么优雅,一直处于勉强能用状态。CEPH也不是什么新玩意,甚至和openstack有点像,已经像是过气的项目了。之前用过很长一段时间的rookceph,感觉不错,磁盘故障甚至是节点故障,对集群的可用性影响极小,唯独只适合用于k8s集群内部,所以这次决定用裸机CEPH作为家里的存储方案。
存储系统选型
目前常用的存储系统中,不管是unraid、黑群晖、truenas都没有针对多活高可用进行设计,由于存算分离,家里一些无盘系统主机和虚拟化计算节点高度依赖存储,不希望对存储节点维护的时候导致业务中断。
ceph算是其中部署比较灵活的产品,可以按照计划对部分节点停机维护,提供大部分种类的存储服务,rbd块、iscsi块、cephfs、nfs、s3。而且块存储甚至可以做异地的镜像,虽然没有尝试过。另外如果是完全云原生场景的话,rook-ceph或者longhorn也是个不错的选择。
硬件选型
开始是用我小黄鱼二手淘的3套r5-1400+a320,加上手搓的硬盘扩展柜,像是这样。
手搓硬盘柜
白嫖了嘉立创的打板服务,画了一个4盘位的SATA背板,12V转5V模块用的ZXDN10,和主板的DC ATX模块一样,直接使用服务器电源输出的12V直流。电路是抄的XIAOLONG的开源项目
按照手头淘到的不知名硬盘托架的尺寸画了一个外壳,
加了把9cm风扇,可以从背板取电也可以直接插主板pwm4pin口。
另外画了一个XT30的分电板,这玩意,卖航模的淘宝店要卖30一块,笑。
之后可能会画个SAS8087接口的版本,然后加个风扇调速。以及,如果要手工焊的话,最小能接受的封装是0603,选错了LED封装,导致我的硬盘指示灯没法用。
无尽的排障
不知道是二手主板的问题还是二手nvme硬盘的问题,节点运行一段时间后不定时地会宕机,或者ip能通但是端口不通。一摸南桥芯片滚烫,于是加了散热。
然而问题依旧,又尝试了增加独立网卡,安装不同的linux发行版,不同的ceph版本,更换系统盘。都没有解决。
走头无路,最终买了2台联想M520准系统,解决了稳定性问题。看来是二手主板的问题。惨痛的经历告诉我,千万不要在硬件这种没有意义的事情上投入过多的精力。
一些不常用的CEPH配置项
关于crushmap
默认是以主机为隔离的故障域,可以通过ceph osd crush命令修改crushmap来规划SSD池和HDD池,以及单节点模拟多host避免存储池拒绝放置副本PG在同一个host上。当然单节点ceph也有其他方法,不过不那么推荐单节点跑ceph就是了。
pool crush rule
默认存储池会使用所有可用osd来放置PG,可以创建自定义crush rule来决定用副本模式还是纠删码模式,并且决定使用哪个故障域的osd以及SSD还是HDD类型的osd。
单节点ceph
如果一定要以单节点运行ceph,官方文档也提到了这三个配置
ceph config set global osd_crush_chooseleaf_type 0
ceph config set global osd_pool_default_min_size 1
ceph config set global mgr_standby_modules false
修改crushmap配置,将故障域设置为osd而不是host,这样可以允许存储池在同一host上的不同osd放置副本PG。
ceph osd getcrushmap -o old_crush_map
crushtool -d old_crush_map -o old.txt
cp old.txt new.txt
#修改new.txt, 将replicated_rule中的step chooseleaf firstn 0 type host改为step chooseleaf firstn 0 type osd
crushtool -c old.txt -o new_crush_map
ceph osd setcrushmap -i new_crush_map
单副本存储池
如果一定要创建单副本节点池,以下配置可以消除告警。
ceph config set osd osd_pool_default_size 1
ceph config set global mon_allow_pool_size_one true
ceph config set global mon_warn_on_pool_no_redundancy false
ceph osd pool set data_pool size 1 --yes-i-really-mean-it
关于混闪
可以使用flashcache或者bcache,通过ssd去加速hdd,随机IO的提升效果也很明显。
我看过华三的uis超融合产品就是这么玩的,用flashcache来加速hdd设备,并且将存储池的db和wal存储到ssd上。
关于PVE连接RBD和CEPHFS
如果用的是中文界面的网页后台,添加RBD类型的存储时,pool会翻译成资源池,实际要填对应的ceph rbd pool的name。另外keyring要填完整的密钥串文件内容,添加cephfs的话填对应用户的key vavlue就行了,也不知道pve是怎么想的,rbd和cephfs的表单设计成两种模式。
后记
至于是否会回归成品NAS。或许等折腾够了,就会像@bboysoul一样一切上云,专注业务本身。只是现在的关注点还在玩硬件上。
接下来会做的,可能是给增加10G光口作为业务口,以及把硬盘柜改成SFF8088接口配合外置SAS HBA卡,做一个正经的JBOD柜。然而,B450主板的PCI插槽只有1个x16和2个x1,SAS HBA和网卡都要X4口,这就又需要一个PCI拆分方案。