一,概述
Ceph是一个分布式存储系统,诞生于2004年,最早致力于开发下一代高性能分布式文件系统的项目。随着云计算的发展,ceph乘上了OpenStack的春风,进而成为了开源社区受关注较高的项目之一。
Ceph有以下优势:
1,CRUSH算法
Crush算法是ceph的两大创新之一,简单来说,ceph摒弃了传统的集中式存储元数据寻址的方案,转而使用CRUSH算法完成数据的寻址操作。CRUSH在一致性哈希基础上很好的考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。Crush算法有相当强大的扩展性,理论上支持数千个存储节点。
2,高可用
Ceph中的数据副本数量可以由管理员自行定义,并可以通过CRUSH算法指定副本的物理存储位置以分隔故障域,支持数据强一致性; ceph可以忍受多种故障场景并自动尝试并行修复。
3,高扩展性
Ceph不同于swift,客户端所有的读写操作都要经过代理节点。一旦集群并发量增大时,代理节点很容易成为单点瓶颈。Ceph本身并没有主控节点,扩展起来比较容易,并且理论上,它的性能会随着磁盘数量的增加而线性增长。
4,特性丰富
Ceph支持三种调用接口:对象存储,块存储,文件系统挂载。三种方式可以一同使用。在国内一些公司的云环境中,通常会采用ceph作为openstack的唯一后端存储来提升数据转发效率。
二,部署
系统:centos7
内核:Linux 3.10.0-693.el7.x86_64
环境:ceph01(172.16.10.181),ceph02(172.16.10.182),ceph03(172.16.10.183)
安装ceph前,将所有的服务器设置成免密互访,并且配置hosts将主机名之间可以互访,同时配置好时间同步,关闭firewalld和selinux.
部署工具:
Ceph官方推出了一个用python写的工具 cpeh-deploy,可以很大的简化ceph集群的配置过程,下面是ceph.repo的配置
[Ceph] name=Ceph packages for $basearch baseurl=http://download.ceph.com/rpm-jewel/el7/$basearch enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://download.ceph.com/keys/release.asc priority=1 [Ceph-noarch] name=Ceph noarch packages baseurl=http://download.ceph.com/rpm-jewel/el7/noarch enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://download.ceph.com/keys/release.asc priority=1 [ceph-source] name=Ceph source packages baseurl=http://download.ceph.com/rpm-jewel/el7/SRPMS enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://download.ceph.com/keys/release.asc priority=1
在三台主机上安装工具
yum install -y ceph-deploy
创建ceph用户
useradd -d /home/ceph -m ceph passwd ceph 同时配置免密码登陆,互访,并给予sudo权限 echo "ceph ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph chmod 0440 /etc/sudoers.d/ceph su - ceph ssh-keygen -t rsa ssh-copy-id -i .ssh/id_rsa.pub ceph@ceph02 ssh-copy-id -i .ssh/id_rsa.pub ceph@ceph03 使用ssh配置文件 Host ceph01 Hostname ceph01 Port 22 User ceph Host ceph02 Hostname ceph02 Port 22 User ceph Host ceph03 Hostname ceph03 Port 22 User ceph
创建存储集群
在ceph01上 su - ceph mkdir my-cluster cd my-cluster 创建moniter集群 ceph-deploy new ceph01 ceph02 ceph03 配置文件副本数以及网络 vi ceph.conf [global] fsid = 666f4515-fcbe-4b01-9664-054485ea4117 mon_initial_members = ceph01, ceph02, ceph03 mon_host = 172.16.10.181,172.16.10.182,172.16.10.183 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx mon_pg_warn_max_per_osd = 1000 osd pool default size = 2 public network = 172.16.10.0/24 mon clock drift allowed = 2 mon clock drift warn backoff = 30 #osd pool default size = 2 默认副本数为3,这里改为2 #public network = 172.16.10.0/24 网络设置 #mon clock drift allowed = 2 monitor间的clock drift(时钟嘀嗒数?,默认.05s) #mon clock drift warn backoff = 30 时钟偏移补偿指数(默认5)
#安装ceph
#由于国外访问超级慢这里建议更换成国内的源,清华大学的源很快很稳定 export CEPH_DEPLOY_GPG_URL=https://mirrors.tuna.tsinghua.edu.cn/ceph/keys/release.asc export CEPH_DEPLOY_REPO_URL=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-jewel/el7/ #执行安装 ceph-deploy install ceph01 ceph02 ceph03 #安装失败可以清楚重装 清除所有软件 ceph-deploy purge ceph-node 清除所有数据,配置文件 ceph-deploy purgedata ceph-node 清除所有keys ceph-deploy forgetkeys 激活监控节点 ceph-deploy mon create-initial 完成上述操作后,当前目录里应该会出现这些密钥环: ceph.client.admin.keyring ceph.bootstrap-osd.keyring ceph.bootstrap-mds.keyring ceph.bootstrap-rgw.keyring 部署osd #列出ceph01上所有的可用磁盘 ceph-deploy disk list ceph01 #disk zap 自命令删除现有分区表 ceph-deploy disk zap ceph01:sdb ceph-deploy disk zap ceph02:sdb ceph-deploy disk zap ceph03:sdb #osd create 子命令首先准备磁盘(用xfs文件系统格式化磁盘),然后激活磁盘的第一、第二个分区,作为数据分区和日志分区 ceph-deploy osd create ceph01:sdb ceph-deploy osd create ceph02:sdb ceph-deploy osd create ceph03:sdb #查看状态 ceph -s cluster 710da3e5-61c1-4285-9bf2-45bfa5a88ab0 health HEALTH_OK monmap e2: 3 mons at {ceph01=172.16.10.181:6789/0,ceph02=172.16.10.182:6789/0,ceph03=172.16.10.183:6789/0} election epoch 8, quorum 0,1,2 ceph01,ceph02,ceph03 osdmap e15: 3 osds: 3 up, 3 in flags sortbitwise,require_jewel_osds pgmap v26: 64 pgs, 1 pools, 0 bytes data, 0 objects 100 MB used, 134 GB / 134 GB avail 64 active+clean #健康状态检查 ceph -w cluster 710da3e5-61c1-4285-9bf2-45bfa5a88ab0 health HEALTH_OK monmap e2: 3 mons at {ceph01=172.16.10.181:6789/0,ceph02=172.16.10.182:6789/0,ceph03=172.16.10.183:6789/0} election epoch 8, quorum 0,1,2 ceph01,ceph02,ceph03 osdmap e15: 3 osds: 3 up, 3 in flags sortbitwise,require_jewel_osds pgmap v26: 64 pgs, 1 pools, 0 bytes data, 0 objects 100 MB used, 134 GB / 134 GB avail 64 active+clean 2018-06-29 14:00:00.000167 mon.0 [INF] HEALTH_OK #Ceph monitor仲裁状态 ceph quorum_status --format json-pretty { "election_epoch": 8, "quorum": [ 0, 1, 2 ], "quorum_names": [ "ceph01", "ceph02", "ceph03" ], "quorum_leader_name": "ceph01", "monmap": { "epoch": 2, "fsid": "710da3e5-61c1-4285-9bf2-45bfa5a88ab0", "modified": "2018-06-28 17:54:00.672461", "created": "2018-06-28 17:53:44.843991", "mons": [ { "rank": 0, "name": "ceph01", "addr": "172.16.10.181:6789\/0" }, { "rank": 1, "name": "ceph02", "addr": "172.16.10.182:6789\/0" }, { "rank": 2, "name": "ceph03", "addr": "172.16.10.183:6789\/0" } ] } } 导出monitor信息 ceph mon dump dumped monmap epoch 2 epoch 2 fsid 710da3e5-61c1-4285-9bf2-45bfa5a88ab0 last_changed 2018-06-28 17:54:00.672461 created 2018-06-28 17:53:44.843991 0: 172.16.10.181:6789/0 mon.ceph01 1: 172.16.10.182:6789/0 mon.ceph02 2: 172.16.10.183:6789/0 mon.ceph03 #检查集群使用状态 ceph df GLOBAL: SIZE AVAIL RAW USED %RAW USED 134G 134G 100M 0.07 POOLS: NAME ID USED %USED MAX AVAIL OBJECTS rbd 0 0 0 65579M 0 #检查Ceph monitor、OSD和PG(配置组)状态 [ceph@ceph01 ~]$ ceph mon stat e2: 3 mons at {ceph01=172.16.10.181:6789/0,ceph02=172.16.10.182:6789/0,ceph03=172.16.10.183:6789/0}, election epoch 8, quorum 0,1,2 ceph01,ceph02,ceph03 [ceph@ceph01 ~]$ ceph osd stat osdmap e15: 3 osds: 3 up, 3 in flags sortbitwise,require_jewel_osds [ceph@ceph01 ~]$ ceph pg stat v26: 64 pgs: 64 active+clean; 0 bytes data, 100 MB used, 134 GB / 134 GB avail #列表PG ceph pg dump #列表Ceph存储池 [ceph@ceph01 ~]$ ceph osd lspools 0 rbd, #检查OSD的CRUSH map [ceph@ceph01 ~]$ ceph osd tree ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY -1 0.13170 root default -2 0.04390 host ceph01 0 0.04390 osd.0 up 1.00000 1.00000 -3 0.04390 host ceph02 1 0.04390 osd.1 up 1.00000 1.00000 -4 0.04390 host ceph03 2 0.04390 osd.2 up 1.00000 1.00000 #列表集群的认证秘钥 [ceph@ceph01 ~]$ ceph auth list
#创建cephfs
#要运行 Ceph 文件系统,你必须先装起至少带一个 Ceph 元数据服务器的 Ceph 存储集群。我这里让三台服务器全部成为mds的角色 #进入存放ceph集群配置文件的目录 ceph-deploy mds create ceph01 ceph02 ceph03 #查看mds文件 [ceph@ceph01 my-cluster]$ ls /var/lib/ceph/mds/ceph-ceph01/ done keyring systemd [ceph@ceph01 my-cluster]$ ll /var/lib/ceph/osd/ceph-0/ total 48 -rw-r--r-- 1 root root 484 Jun 28 17:55 activate.monmap -rw-r--r-- 1 ceph ceph 3 Jun 28 17:55 active -rw-r--r-- 1 ceph ceph 37 Jun 28 17:55 ceph_fsid drwxr-xr-x 86 ceph ceph 1439 Jun 28 17:56 current -rw-r--r-- 1 ceph ceph 37 Jun 28 17:55 fsid lrwxrwxrwx 1 ceph ceph 58 Jun 28 17:55 journal -> /dev/disk/by-partuuid/9dc3637d-685b-48ec-81e0-8b87e94343ed -rw-r--r-- 1 ceph ceph 37 Jun 28 17:55 journal_uuid -rw------- 1 ceph ceph 56 Jun 28 17:55 keyring -rw-r--r-- 1 ceph ceph 21 Jun 28 17:55 magic -rw-r--r-- 1 ceph ceph 6 Jun 28 17:55 ready -rw-r--r-- 1 ceph ceph 4 Jun 28 17:55 store_version -rw-r--r-- 1 ceph ceph 53 Jun 28 17:55 superblock -rw-r--r-- 1 ceph ceph 0 Jun 28 17:56 systemd -rw-r--r-- 1 ceph ceph 10 Jun 28 17:55 type -rw-r--r-- 1 ceph ceph 2 Jun 28 17:55 whoami 可以看到mds实际是存在ceph osd上的 #查看元数据状态,可以看到状态均为待机,这是由于未建立存储池 e4:, 3 up:standby #创建存储池,一个用于存储metadata另一个用于存储data ceph osd pool create cephfs_metadata 128 ceph osd pool create cephfs_data 128 #存储池pg_num取值参考 确定 pg_num 取值是强制性的,因为不能自动计算。下面是几个常用的值: *少于 5 个 OSD 时可把 pg_num 设置为 128 *OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512 *OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096 *OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值 *自己计算 pg_num 取值时可借助 pgcalc 工具 随着 OSD 数量的增加,正确的 pg_num 取值变得更加重要,因为它显著地影响着集群的行为、以及出错时的数据持久性(即灾难性事件导致数据丢失的概率)。 #创建好存储后,使用fs new命令创建文件系统 ceph fs new cephfs cephfs_metadata cephfs_data #查看状态 [ceph@ceph01 my-cluster]$ ceph fs ls name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
#这样一个简单的cephfs系统就创建成功了,挂在cephfs系统
客户端: 第一步 创建挂载目录 mkdir /data 第二步 查看cephfs 秘钥 name 和secret 在ceph 的osd 下面目录去获取 cat /etc/ceph/ceph.client.admin.keyring 第三步 mount 文件系统 如果有多个监视器: mount.ceph monhost1,monhost2,monhost3:/ /mnt/foo mount -t ceph 172.16.10.181:6789,172.16.10.182:6789,172.16.10.183:6789:/ /data -o name=admin,secret=$keys 第四步 写入fstab 172.16.10.181:6789,172.16.10.182:6789,172.16.10.183:6789:/ /data ceph name=admin,secret=AQCprj5ZAilVHRAA73bX47zr2fGKpIwgk/DGsA==,noatime,_netdev 0 0 ########################################## ceph-fuse挂在方式 ceph-fuse -c /etc/ceph/ceph.conf /data -o nonempty
#下面两个是部署过程中遇到的问题
cluster 666f4515-fcbe-4b01-9664-054485ea4117
health HEALTH_WARN
clock skew detected on mon.ceph03
Monitor clock skew detected
monmap e1: 3 mons at {ceph01=172.16.10.181:6789/0,ceph02=172.16.10.182:6789/0,ceph03=172.16.10.183:6789/0}
election epoch 22, quorum 0,1,2 ceph01,ceph02,ceph03
fsmap e9: 1/1/1 up {0=ceph02=up:active}, 2 up:standby
osdmap e27: 3 osds: 3 up, 3 in
flags sortbitwise,require_jewel_osds
pgmap v17474: 1314 pgs, 3 pools, 2048 MB data, 532 objects
4230 MB used, 130 GB / 134 GB avail
1314 active+clean
#在我自己测试过程中,我关闭了其中一台服务器,并未影响ceph运行已经数据完整性,但是当我起来的时候莫名报了下列错误,我查询说是时间服务器不同步,这个我之前设置过,其实同步的,因为用的是内网中的一个ntp服务器,所以几乎不存在不同步的问题,后来查询才发现原来是两个参数的问题
#在ceph.conf中增加下列两个参数,同步到集群的node中,重启服务解决 mon clock drift allowed = 2 monitor间的clock drift(时钟嘀嗒数?,默认.05s) mon clock drift warn backoff = 30 时钟偏移补偿指数(默认5) ceph-deploy --overwrite-conf config push ceph01 ceph02 ceph03
admin_socket: exception getting command descriptions: [Errno 2] No such file or directory问题解决
#这个问题困扰了一天,后来仔细查看才发现原来,ceph-deploy后面带的主机名,要能找到对应的主机IP,所以做事儿要细心,一步步来.