logo资料库

Ceph分布式存储原理总结及部署记录-完整精华版.doc

第1页 / 共26页
第2页 / 共26页
第3页 / 共26页
第4页 / 共26页
第5页 / 共26页
第6页 / 共26页
第7页 / 共26页
第8页 / 共26页
资料共26页,剩余部分请下载后查看
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
分享到:
收藏