Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。
Ceph项目最早起源于Sage Weil就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经过了数年的发展之后,目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack都可与Ceph整合以支持虚拟机镜像的后端存储。
Ceph是一个横向扩展系统:它被设计为先天无单点失效问题,可以扩展到无限个节点,并且节点之间没有耦合关系(无共享架构),而传统存储系统控制器之间总有一些组件是共享的(缓存、磁盘)。
Ceph使用Crush算法对数据进行自动化组织管理。Crush算法负责数据对象在集群内的智能分布,随后使用集群节点作为数据的管理器。
ceph 部署的时候根据官网建议:
- 机械硬盘最小为1T
- 磁盘越大,单位GB的存储空间越小,但是需要的内存越多,尤其是在recovery,backfill以及reblance时
- 不推荐将一个盘分多个区,再跑多个OSD进程
- 不推荐OSD和mon, 或者OSD和mds跑在同一个硬盘上
- 很多 slow osd的问题往往是由于对磁盘设备的过度使用,请使用专用的磁盘用于安装操作系统以及软件;专用的磁盘设备用于osd daemon, 专门的磁盘设备用于journal
所以一般 ceph 部署时,一个节点最好挂三块盘,一块盘装操作系统,一块存储 OSD 数据,一块存储 OSD 日志,而存储日志的盘最好是 SSD,以便提高性能。
这里因为某些原因,以三台单盘的机器部署 ceph 集群为例,具体配置如下:
- 系统:Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-117-generic x86_64)
- IP 地址及 hostname:
ip | hostname |
---|---|
172.19.217.71 | Ceph-master |
172.19.217.72 | Ceph-node1 |
172.19.217.73 | Ceph-node2 |
- 磁盘状态:
1 | $ lsblk |
设置免密登录
选定一个节点作为主控节点(这里选的172.19.217.71
主机),建立从主控节点到其他节点的免密登录。
生成秘钥:
1 | $ ssh-keygen |
拷贝秘钥:
1 | $ ssh-copy-id root@172.19.217.72 |
修改使hostname和ip对应:
在 /etc/hosts
里追加以下信息:
1 | 172.19.217.71 Ceph-master |
安装ntp服务(所有节点)
主要是用于ceph-mon之间的时间同步。在所有 Ceph 节点上安装 NTP 服务(特别是 Ceph Monitor 节点),以免因时钟漂移导致故障。确保在各 Ceph 节点上启动了 NTP 服务,并且要使用同一个 NTP 服务器。
1 | $ sudo apt install ntpdate |
添加ceph用户(所有节点)
1、在各 Ceph 节点创建新用户
1 | $ sudo useradd -d /home/ceph -m ceph |
2、确保各 Ceph 节点上新创建的用户都有 sudo 权限
1 | $ echo "ceph ALL = (root) NOPASSWD:ALL" | tee /etc/sudoers.d/ceph |
tips: 这里虽然添加了 ceph 用户, 但是最后安装时并没有用 ceph 用户来安装, 而是采用 root 用户安装
添加ceph安装源(所有节点)
1 | $ wget -q -O- 'http://mirrors.163.com/ceph/keys/release.asc' | apt-key add - |
安装ceph-deploy部署工具(仅主控节点)
更新仓库,并安装 ceph-deploy:
1 | $ apt update |
ceph安装(仅主控节点)
创建部署目录
1 | $ mkdir ceph-cluster && cd ceph-cluster/ |
配置新节点
1 | $ ceph-deploy new Ceph-master Ceph-node1 Ceph-node2 |
配置完后,目录下会有如下几个文件
1 | $ ls |
安装
1 | $ ceph-deploy install Ceph-master Ceph-node1 Ceph-node2 |
都出现如下输出表示安装成功:
1 | Running command: ceph --version |
配置并启动 ceph-mon(仅主控节点)
1 | $ ceph-deploy mon create-initial |
至此,ceph集群的安装工作完毕。
运行 ceph -s
可以看到当前集群的状态,运行ceph health
查看 ceph health 的状态:
1 | HEALTH_OK |
health 状态应该是 HEALTH_OK
,如果有no osds
的 error,只需按照下面方法添加 osd即可,如果有其他HEALTH_ERROR
,可以参照下面的解决办法去解决。
ceph 鉴权文件分发到各个节点
1 | $ ceph-deploy admin Ceph-master Ceph-node1 Ceph-node2 |
OSD HEALTH不为 OK 的解决办法
- 如果碰到下面的 health err且文件系统是 ext4
1 | $ ceph health |
先用 Tips 中的方法去查看 log,如果 log 中有 filename too long 的 error,先编辑对应的 ceph.conf
:
1 | $ vim ceph.conf |
在末尾添加:
1 | osd_max_object_name_len = 256 |
然后运行下面命令:
1 | $ ceph-deploy install Ceph-master Ceph-node1 Ceph-node2 |
- 如果碰到
too few PGs per OSD (21 < min 30)
的 warning,先查看 pool:
1 | $ sudo ceph osd lspools |
查看 rbd pool 的 pgs 和 pgps以及副本数:
1 | $ sudo ceph osd pool get rbd pg_num |
健康的 pg_num 和 pgp_num 计算方法:
关于pgmap的数目,osd_num *100 / replica_num,向上取2的幂。比如15个osd,三备份,15 *100/3=500,得到pg_num = 512,线上重新设定这个数值时会引起数据迁移,请谨慎处理。
在这里,pgs为64,因为是3副本的配置,所以当有3个osd的时候,3 *100/3=100,得到pg_num = 128
解决办法:修改默认pool rbd 的 pgs 和 pgps:
1 | $ sudo ceph osd pool set rbd pg_num 128 |
- 终极方法
删除 ceph 并清理环境,然后可能就好了~~具体方法见下面 Tips
添加 OSD(仅主控节点)
查看未分配分区:
1 | $ fdisk -l |
这里看到这台机器只有一块盘,所以我们通过目录创建 ceph osd(所有节点):
1 | $ rm -rf /var/lib/ceph/osd/ceph-0 |
添加 OSD(仅主控节点):
1 | $ ceph-deploy osd create Ceph-master |
这个命令相当于下面磁盘准备和启动 OSD 两条命令:
- 磁盘准备(仅主控节点)
1 | $ ceph-deploy osd prepare Ceph-master:/var/lib/ceph/osd/ceph-0 |
- 启动 OSD(仅主控节点)
1 | $ ceph-deploy osd activate Ceph-master:/var/lib/ceph/osd/ceph-0 |
添加 mds(仅主控节点)
为使用 CephFS 添加 mds, 如果不用 CephFS 可以不添加。 此处只在 master 上添加一个 mds
1 | $ ceph-deploy mds create Ceph-master |
配置 mgr
ceph 12.0之后必须配置 manager, 且最好有 moniter 的机器上都部署 mgr:
1 | $ ceph-deploy mgr create Ceph-master |
因为部署的 ceph 版本是 10.2.11,所以这步可以略过。
配置完后用ceph health
命令查看时,ceph 状态为 OK 则部署完成。
Tips
错误排查
查看 log:
1 | $ cd /var/log/ceph |
删除osd
1 | $ ceph osd crush reweight osd.x 0.0 |
如果遇到Error EBUSY: osd.0 is still up; must be down before removal.
可以执行下面命令强行标记为down,之后删除即可:
1 | $ ceph osd down osd.0 |
删除 ceph 并清理环境
1 | #卸载ceph软件包 |