概述
ceph是一种专为高性能、高可靠性和高扩展性而设计的一种统一的分布式文件系统。随着OpenStack日渐成为开源云计算的标准软件栈,ceph也成为了OpenStack的首选后端存储,因为它支持块存储和对象存储,所以很自然地被用作云计算框架的整个存储后端,当然也可以单独作为存储,例如部署一套集群作为对象存储、共享存储等。
ceph架构
通过架构图可以看到ceph支持:
对象存储
:RADOSGW;兼容S3接口。通过reset api上传和下载文件
文件系统
:FS;兼容POSIX接口。可以将ceph集群看做一个共享文件系统挂载到本地使用。
块存储
:RBD;有kernel rbd和librbd两种使用方式,支持快照、克隆。相当于一块硬盘挂载到了本地,用法和用途都跟本地磁盘一样。比如在OpenStack项目里,ceph的块设备存储可以对接OpenStack的后端存储。
ceph相比其它分布式文件系统有哪些优点呢?
- 统一存储;ceph底层也是一个分布式文件系统(RADOS),但由于在上层开发了支持对象和块的接口,所以在开源存储软件中所占据的地位还是蛮高的。
- 高扩展性;扩容方便、容量大。能够管理上千台服务器和EB级数据的容量。
- 可靠性强;支持多份强 一致性副本,EC。副本能够跨主机、机架和数据中心存放,安全可靠。存储节点也可以自动管理和修复,不存在单点故障,容错性强。
- 高性能;因为是多个副本,因此在读写操作时能够做到高度并行化。理论上,节点越多,整个集群的IOPS和吞吐量越高。另外ceph客户端读写数据直接与存储设备(OSD)交互。
各组件介绍
OSD:ceph的守护进程,功能是存储数据和处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD守护进程的心跳来向monitors提供监控信息,当 Ceph 存储集群设定为有2个副本时,至少需要2个OSD守护进程,集群才能达到active+clean
状态 ,也可以在ceph.conf
文件配置osd_pool_default_size = 2
定义副本数,默认为3个。
Monitors:监视器(mon)。Ceph 客户端读或写数据前必须先连接到某个 Ceph 监视器、获得最新的集群运行图副本。一个 Ceph 存储集群只需要单个监视器就能运行,但它就成了单一故障点(即如果此监视器宕机, Ceph 客户端就不能读写数据了)。
MDS:元数据服务器,为ceph文件系统存储元数据(块设备和对象存储不使用MDS)。元数据服务器使得POSIX文件系统的用户们可以在不对ceph存储集群造成负担的前提下执行比如ls、find等基本命令。
集群部署实验
环境:
主机名 | IP | 描述 |
---|---|---|
node1 | 192.168.8.19/24 | 管理、监视、osd节点 |
node2 | 192.168.8.11 | 守护进程、元数据服务器 |
node3 | 192.168.8.21 | 守护进程、元数据服务器 |
node4 | 192.168.8.30 | ceph客户端 |
- 所有主机配置免密码登录
- OSD节点添加硬盘、格式化、挂载
- 所有节点修改/etc/hosts文件
- 所有主机时间同步
- 管理节点安装ceph-deploy
所有节点增加yum配置文件ceph.repo
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
gpgcheck=0
priority=1
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
gpgcheck=0
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS
gpgcheck=0
priority=1
//yum clean all && yum makecache后开始安装
[root@node1]# yum install -y ceph-deploy
- 在管理节点创建monitor服务
[root@node1]# mkdir /etc/ceph && cd /etc/ceph
[root@node1]# ceph-deploy new node1
如果报以下错误:
[ceph_deploy][ERROR ] File “/usr/lib/python2.7/site-packages/ceph_deploy/cli.py”, line 162, in _main
[ceph_deploy][ERROR ] return args.func(args)
[ceph_deploy][ERROR ] File “/usr/lib/python2.7/site-packages/ceph_deploy/new.py”, line 141, in new
[ceph_deploy][ERROR ] ssh_copy_keys(host, args.username)
[ceph_deploy][ERROR ] File “/usr/lib/python2.7/site-packages/ceph_deploy/new.py”, line 35, in ssh_copy_keys
[ceph_deploy][ERROR ] if ssh.can_connect_passwordless(hostname):
[ceph_deploy][ERROR ] File “/usr/lib/python2.7/site-packages/ceph_deploy/util/ssh.py”, line 15, in can_connect_passwordless
[ceph_deploy][ERROR ] if not remoto.connection.needs_ssh(hostname):
[ceph_deploy][ERROR ] AttributeError: ‘module’ object has no attribute ‘needs_ssh’
[ceph_deploy][ERROR ]
请检查ceph.repo文件是否无误。
执行成功后会生成以下文件:
修改副本数:
[root@node1]# vim ceph.conf
[global]
fsid = 13df1869-a7c2-44e4-9f1f-5e5fb4e3b2af
mon_initial_members = node1
mon_host = 192.168.8.19
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd_pool_default_size = 2 -------------修改默认的副本数
- 在所有节点上安装ceph,还是在node1节点上操作:
[root@node1]# ceph-deploy install node1 node2 node3 node4
//如果网络的原因安装失败=手动执行:
yum install -y epel-release
yum install -y ceph-release
yum install -y install -y ceph ceph-radosgw
- 在管理节点安装ceph monitor
[root@node1:/etc/ceph]# ceph-deploy mon create node1
//收集节点的keyring文件
[root@node1:/etc/ceph]# ceph-deploy gatherkeys node1
- 所有osd节点部署osd服务
[root@node1:/etc/ceph]# ceph-deploy osd prepare node1:/var/local/osd0 node2:/var/local/osd1 node3:/var/local/osd2
//给所有osd节点挂载目录授权
chown -R ceph.ceph /var/local/osd*
//激活osd
[root@node1:/etc/ceph]# ceph-deploy osd activate node1:/var/local/osd0 node2:/var/local/osd1 node3:/var/local/osd2
//把配置文件和admin 密钥拷贝到所有节点,这样每次执行Ceph命令行时就无需指定monitor地址和ceph.client.admin.keyring了
[root@node1:/etc/ceph]# ceph-deploy admin node1 node2 node3
//各节点修改权限
[root@node1:/etc/ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
查看osd状态:
问题原因为集群osd 数量较少,测试过程中建立了大量的pool,每个pool要咋用一些pg_num 和pgs ,ceph集群默认每块磁盘都有默认值,好像每个osd 为128个pgs,默认值可以调整,调整过大或者过小都会对集群性能优影响,此为测试环境以快速解决问题为目的,解决此报错的方法就是,调大集群的此选项的告警阀值;方法如下,在mon节点的ceph.conf
配置文件中添加:
mon_pg_warn_max_per_osd = 1000
//重启
[root@node1:/etc/ceph]# systemctl restart ceph-mon@node1
- 部署mds服务
[root@node1:/etc/ceph]# ceph-deploy mds create node2 node3
//查看mds状态
[root@node1:/etc/ceph]# cdph mds stat
- 创建ceph文件系统
创建存储池:
[root@node1:/etc/ceph]# ceph osd pool create cephfs_data 128
[root@node1:/etc/ceph]# ceph osd pool create cephfs_metadata 128
128什么意思:
128为pg_num,在ceph中取该值是强制性的,因为不能自动计算,常用配置方法如下:
少于 5 个 OSD 时可把 pg_num 设置为 128
OSD 数量在 5~10 个时,可把 pg_num 设置为 512
OSD 数量在 10~50 个时,可把 pg_num 设置为 4096
OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值 自己计算 pg_num 取值时可借助 pgcalc 工具
- 创建文件系统
[root@node1:/etc/ceph]# ceph fs new 128 cephfs_metadata cephfs_data
//查看创建后的ceph fs
[root@node1:/etc/ceph]# ceph fs
//查看mds状态
[root@node1:/etc/ceph]# ceph mds stat
- 客户端节点挂载ceph文件系统
//创建挂载点
[root@node4:/etc/ceph]# mkdir /cephdata
//复制其中一个mds节点/ceph.client.admin.keyring中的秘钥保存到本地的admin.secret文件中
[root@node4:/etc/ceph]# vim /etc/ceph/admin.secret
//挂载
mount -t ceph 192.168.8.19:6789:/ /opt -o name=admin,secretfile=/etc/ceph/admin.secret
//卸载
umount /cephdata
//第二种挂载方法
yum install -y fuse
ceph-fuse -m 192.168.8.19(管理节点ip地址):6789 /ceph(挂载点)
//卸载
fusermount -u /cephdata
挂载成功后能在挂载点目录下写入文件表示挂载成功
注意事项:
- 磁盘挂载的目录必须有权限(chown)
- 设置开机自动挂载磁盘(fstab)
- 客户端的挂载点建议是空目录
- 确保工作目录为/etc/ceph/
处理down状态的osd节点
-
ceph osd tree|grep down|awk '{print$1}
-
ceph osd out osd.ID
ceph osd rm osd.ID
ceph osd crush rm osd.ID
ceph auth del osd.ID
umount /var/lib/ceph/osd/ceph-$ID$ID 为down状态的ID
-
在管理节点重建down掉的OSD
ceph-deploy osd create node3:/var/local/osd2 -
激活集群中dwon状态的osd
ceph-deploy osd activate node1:/var/local/osd0 node2:/var/local/osd1 node3:/var/local/osd2 -
查看一下
ceph osd tree