1)Ceph 简单概述
Ceph 是一个分布式存储系统,诞生于 2004 年,最早致力于开发下一代高性能分布式文件系统的项目。Ceph
源码下载:http://ceph.com/download/ 。随着云计算的发展,ceph 乘上了 OpenStack 的春风,进而成为
了开源社区受关注较高的项目之一。Ceph 可以将多台服务器组成一个超大集群,把这些机器中的磁盘资源整合
到一块儿,形成一个大的资源池(PB 级别),然后按需分配给应用使用。Ceph 分布式存储的优势:
1)CRUSH 算法
Crush 算法是 ceph 的两大创新之一,简单来说,ceph 摒弃了传统的集中式存储元数据寻址的方案,转而使用
CRUSH 算法完成数据的寻址操作。
CRUSH 在一致性哈希基础上很好的考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知
等。
Crush 算法有相当强大的扩展性,理论上支持数千个存储节点。
2)高可用
Ceph 中的数据副本数量可以由管理员自行定义,并可以通过 CRUSH 算法指定副本的物理存储位置以分隔故障域,支
持数据强一致性;
Ceph 可以忍受多种故障场景并自动尝试并行修复;
Ceph 支持多份强一致性副本,副本能够垮主机、机架、机房、数据中心存放。所以安全可靠。
Ceph 存储节点可以自管理、自动修复。无单点故障,容错性强。
3)高性能
因为是多个副本,因此在读写操作时候能够做到高度并行化。理论上,节点越多,整个集群的 IOPS 和吞吐量越高。
另外一点 ceph 客户端读写数据直接与存储设备(osd) 交互。在块存储和对象存储中无需元数据服务器。
4)高扩展性
Ceph 不同于 swift,客户端所有的读写操作都要经过代理节点。一旦集群并发量增大时,代理节点很容易成为单点瓶
颈。
Ceph 本身并没有主控节点,扩展起来比较容易,并且理论上,它的性能会随着磁盘数量的增加而线性增长。
Ceph 扩容方便、容量大。能够管理上千台服务器、EB 级的容量。
5)特性丰富
Ceph 支持三种调用接口:对象存储,块存储,文件系统挂载。三种方式可以一同使用。
在国内一些公司的云环境中,通常会采用 Ceph 作为 openstack 的唯一后端存储来提升数据转发效率。
Ceph 统一存储,虽然 Ceph 底层是一个分布式文件系统,但由于在上层开发了支持对象和块的接口。所以在开源存储
软件中,能够一统江湖。至于能不能千秋万代,就不知了。
Ceph 提供 3 种存储方式分别是对象存储,块存储和文件系统,一般我们主要关心的还是块存储,推荐将虚拟机
后端存储从 SAN 过渡到 Ceph。Ceph 现在是云计算、虚拟机部署的最火开源存储解决方案,据说有 20%的
OpenStack 部署存储用的都是 Ceph 的 block storage。
Ceph 的基本组件
如上图所示,Ceph 主要有三个基本进程
1)Osd
用于集群中所有数据与对象的存储。处理集群数据的复制、恢复、回填、再均衡。并向其他 osd 守护进程发送心跳,
然后向 Mon 提供一些监控信息。
当 Ceph 存储集群设定数据有两个副本时(一共存两份),则至少需要两个 OSD 守护进程即两个 OSD 节点,集群才能
达到 active+clean 状态。
2)MDS(可选)
为 Ceph 文件系统提供元数据计算、缓存与同步。在 ceph 中,元数据也是存储在 osd 节点中的,mds 类似于元数据
的代理缓存服务器。
MDS 进程并不是必须的进程,只有需要使用 CEPHFS 时,才需要配置 MDS 节点。
3)Monitor
监控整个集群 Cluster map 的状态,维护集群的 cluster MAP 二进制表,保证集群数据的一致性。ClusterMAP
描述了对象块存储的物理位置,以及一个将设备
聚合到物理位置的桶列表。
Ceph 要求必须是奇数个 Monitor 监控节点,一般建议至少是 3 个(如果是自己私下测试玩玩的话,可以是 1
个,但是生产环境绝不建议 1 个)用于维护和监控整个集群的状态,每个 Monitor 都有一个 Cluster Map,只
要有这个 Map,就能够清楚知道每个对象存储在什么位置了。客户端会先 tcp 连接到 Monitor,从中获取
Cluster Map,并在客户端进行计算,当知道对象的位置后,再直接与 OSD 通信(去中心化的思想)。OSD 节
点平常会向 Monitor 节点发送简单心跳,只有当添加、删除或者出现异常状况时,才会自动上报信息给
Monitor。
MDS 是可选的,只有需要使用 Ceph FS 的时候才需要配置 MDS 节点。在 Ceph 中,元数据也是存放在 OSD
中的,MDS 只相当于元数据的缓存服务器。
在 Ceph 中,如果要写数据,只能向主 OSD 写,然后再由主 OSD 向从 OSD 同步地写,只有当从 OSD 返回结
果给主 OSD 后,主 OSD 才会向客户端报告写入完成的消息。如果要读数据,不会使用读写分离,而是也需要
先向主 OSD 发请求,以保证数据的强一致性。
cephfs 分布式存储环境的部署过程(一个 ceph cluster 机器,至少需要 1 个 mon 节点和 2
个 osd 节点)
0)基本信息:
这里我只是测试环境,所以使用一个监控节点,两个存储节点,具体如下:
ip 地址
192.168.10.200
192.168.10.201
192.168.10.202
192.168.10.203
主机名
ceph-node1
ceph-node2
ceph-node3
ceph-client
ceph 磁盘
20G
20G
20G
挂载点:/cephfs
备注
作为 mds、mon、osd0
作为 osd1
作为 osd2
ceph 客户端
Ceph 的文件系统作为一个目录挂载到客户端 cephclient 的/cephfs 目录下,可以像操作普通目录一样对此目录进行操作。
1)安装前准备
分别在 ceph 的三个节点机(ceph-node1、ceph-node2、ceph-node3)上添加 hosts
[root@ceph-node1 ~]# cat /etc/hosts
127.0.0.1
::1
192.168.10.200 ceph-node1
192.168.10.201 ceph-node2
192.168.10.202 ceph-node3
localhost localhost.localdomain localhost4 localhost4.localdomain4
localhost localhost.localdomain localhost6 localhost6.localdomain6
添加完 hosts 后,做下测试,保证使用 hosts 中映射的主机名能 ping 通。
[root@ceph-node3 ~]# ping ceph-node1
PING ceph-node1 (192.168.10.200) 56(84) bytes of data.
64 bytes from ceph-node1 (192.168.10.200): icmp_seq=1 ttl=64 time=0.211 ms
64 bytes from ceph-node1 (192.168.10.200): icmp_seq=2 ttl=64 time=0.177 ms
[root@ceph-node3 ~]# ping ceph-node2
PING ceph-node2 (192.168.10.201) 56(84) bytes of data.
64 bytes from ceph-node2 (192.168.10.201): icmp_seq=1 ttl=64 time=1.27 ms
64 bytes from ceph-node2 (192.168.10.201): icmp_seq=2 ttl=64 time=0.169 ms
分别在 ceph 的三个节点机(ceph-node1、ceph-node2、ceph-node3)上创建用户 ceph,密码统一设置为 ceph
[root@ceph-node1 ~]# adduser ceph
[root@ceph-node1 ~]# echo "ceph"|passwd --stdin ceph
Changing password for user ceph.
passwd: all authentication tokens updated successfully.
在每个 Ceph 节点中为用户增加 root 权限
[root@ceph-node1 ~]# echo "ceph ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph
[root@ceph-node1 ~]# chmod 0440 /etc/sudoers.d/ceph
测试是否具有 sudo 权限
[root@ceph-node1 ~]# su - ceph
[ceph@ceph-node1 ~]$ sudo su -
[root@ceph-node1 ~]#
关闭防火墙
[root@ceph-node1 ~]# service iptables stop
[root@ceph-node1 ~]# chkconfig iptables off
[root@ceph-node1 ~]# setenforce 0
[root@ceph-node1 ~]# getenforce
Permissive
[root@ceph-node1 ~]# sed -i 's_SELINUX=enforcing_SELINUX=disabled_g' /etc/sysconfig/selinux
2)Ceph 管理节点部署设置(root 用户操作)。这个只需要在 ceph-node1 监控节点操作即可。
增加 Ceph 资料库至 ceph-deploy 管理节点,之后安装 ceph-deploy。
[root@ceph-node1 ~]# rpm -Uvh http://download.ceph.com/rpm-hammer/el6/noarch/ceph-release-1-1.el6.noarch.rpm
[root@ceph-node1 ~]# yum install ceph-deploy -y
3)数据节点磁盘挂载(root 用户)
在 ceph-node1、ceph-node2、ceph-node3 上分别挂载了一块 20G 大小的磁盘作为 ceph 的数据存储测试使用。
需要将它们分区,创建 xfs 文件系统。
由于本案例中的四个虚拟机均是使用 WebvirtMgr 创建的 kvm 虚拟机
创建 kvm 虚拟机,具体参考:http://www.cnblogs.com/kevingrace/p/5737724.html
现在需要在宿主机上创建 3 个 20G 的盘,然后将这三个盘分别挂载到 ceph-node1、ceph-node2、ceph-node3 这三个虚拟机上
操作记录如下:
在宿主机上的操作
Name
[root@kvm-server ~]# virsh list --all
Id
----------------------------------------------------
1
2
3
4
ceph-node1
ceph-node2
ceph-node3
centos6-04
State
running
running
running
running
#这里的/data/kvm/ios 是 webvirtmgr 里创建虚拟机时定义的镜像存放地址
[root@zabbix-server ~]# ll /data/kvm/ios/*
total 31751800
-rw-r--r--. 1 qemu qemu 3972005888 Jan 16 17:13 CentOS-6.9-x86_64-bin-DVD1.iso
-rw-r--r--. 1 root root 4521459712 Jan 16 17:14 CentOS-7-x86_64-DVD-1708.iso
-rw-------. 1 qemu qemu 4914610176 Feb
-rw-------. 1 qemu qemu 4417716224 Feb
-rw-------. 1 qemu qemu 4405723136 Feb
-rw-------. 1 qemu qemu 3420389376 Feb
6 17:58 ceph-node1.img
6 17:59 ceph-node2.img
6 17:58 ceph-node4.img
6 17:58 disk004.img
创建一个 20G 的新磁盘挂载到 ceph-node1 虚拟机上
[root@zabbix-server ~]# qemu-img create -f raw /data/kvm/ios/ceph01.img 20G
Formatting '/data/kvm/ios/ceph01.img', fmt=raw size=21474836480
[root@zabbix-server ~]# ll /data/kvm/ios/ceph01.img
-rw-r--r--. 1 root root 21474836480 Feb
[root@zabbix-server ~]# du -sh /data/kvm/ios/ceph01.img
0 /data/kvm/ios/ceph01.img
[root@zabbix-server ~]# virsh attach-disk centos6-01 /data/kvm/ios/ceph01.img vdb --cache none
virsh detach-disk centos6-01 /data/kvm/ios/ceph01.img
Disk attached successfully
6 18:00 /data/kvm/ios/ceph01.img
然后到 ceph-node1 虚拟机上查看,发现新建立的 20G 的磁盘/dev/vdb 已经挂载上来了
[root@ceph-node1 ~]# fdisk -l
.........
Disk /dev/vdb: 21.5 GB, 21474836480 bytes
16 heads, 63 sectors/track, 41610 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
在虚拟机上对新挂载的磁盘进行创建 xfs 文件系统操作
[root@ceph-node1 ~]# parted /dev/vdb
GNU Parted 2.1
Using /dev/vdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
Warning: The existing disk label on /dev/vdb will be destroyed and all data on this disk will be lost. Do you want to
continue?
Yes/No? yes
(parted) mkpart primary xfs 0% 100%
(parted) quit
Information: You may need to update /etc/fstab.
//在此输入 yes
//在此输入 mkpart primary xfs 0% 100%
//在此输入 quit
//在此输入 mklabel gpt
[root@ceph-node1 ~]# fdisk -l
.......
Disk /dev/vdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot
/dev/vdb1
Start
1
End
2611
Blocks
20971519+
Id
ee
System
GPT
[root@ceph-node1 ~]# mkfs.xfs /dev/vdb1
meta-data=/dev/vdb1
data
naming
log
=
=
=
=version 2
=internal log
=
realtime =none
isize=256
sectsz=512
bsize=4096
sunit=0
bsize=4096
bsize=4096
sectsz=512
extsz=4096
agcount=4, agsize=1310592 blks
attr=2, projid32bit=0
blocks=5242368, imaxpct=25
swidth=0 blks
ascii-ci=0
blocks=2560, version=2
sunit=0 blks, lazy-count=1
blocks=0, rtextents=0
————————————————————————————————————————————————————————————————————————————————————————————
报错:mkfs.xfs error: command not found.
解决办法:yum install -y xfsprogs kmod-xfs
————————————————————————————————————————————————————————————————————————————————————————————
另外两台虚拟机 ceph-node2 和 ceph-node3 挂载新磁盘以及创建 xfs 文件系统的方法和上面一样,这里不做赘录了。
4)存储集群搭建(ceph 用户)
集群规模:1 个管理节点,1 个监控节点,3 个数据节点。
---------------首先完成 ceph-node1、ceph-node2、ceph-node3 三个节点机在 ceph 用户下的 ssh 无密码登陆的信任关系(ssh 无密码操作过程省略)--
-------------
做完 ceph 用户之间的 ssh 信任关系后,可以简单测试下。
[ceph@ceph-node1 ~]$ ssh -p22 ceph@ceph-node2
[ceph@ceph-node1 ~]$ ssh -p22 ceph@ceph-node3
[ceph@ceph-node2 ~]$ ssh -p22 ceph@ceph-node1
[ceph@ceph-node2 ~]$ ssh -p22 ceph@ceph-node3
[ceph@ceph-node3 ~]$ ssh -p22 ceph@ceph-node1
[ceph@ceph-node3 ~]$ ssh -p22 ceph@ceph-node2
---------------接着在管理节点上使用 ceph-deploy(管理节点上使用 ceph-deploy,所以下面操作都要在 ceph-node1 机器上完成)---------------
[ceph@ceph-node1 ~]$ mkdir ceph-cluster
[ceph@ceph-node1 ~]$ cd ceph-cluster
[ceph@ceph-node1 ceph-cluster]$
创建一个 ceph 新集群(注意下面命令中 ceph-node1 是 monit 监控节点的主机名),设置 ceph-node1 为 mon 节点
[ceph@ceph-node1 ceph-cluster]$ ceph-deploy new ceph-node1
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/ceph/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (1.5.37): /usr/bin/ceph-deploy new ceph-node1
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username
: None