一,概述
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,所以做事儿要细心,一步步来.
