最近需要研究Ceph,也部署了一下环境,本文分为1,2,3,4章为概念介绍,第5章为实践环节。 1 Ceph基础介绍 Ceph是一个可靠地、自动重均衡、自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储、块设备存储和文件系统服务。在虚拟化领域里,比较常用到的是Ceph的块设备存储,比如在OpenStack项目里,Ceph的块设备存储可以对接OpenStack的cinder后端存储、Glance的镜像存储和虚拟机的数据存储,比较直观的是Ceph集群可以提供一个raw格式的块存储来作为虚拟机实例的硬盘。 Ceph相比其它存储的优势点在于它不单单是存储,同时还充分利用了存储节点上的计算能力,在存储每一个数据时,都会通过计算得出该数据存储的位置,尽量将数据分布均衡,同时由于Ceph的良好设计,采用了CRUSH算法、HASH环等方法,使得它不存在传统的单点故障的问题,且随着规模的扩大性能并不会受到影响。 2 Ceph的核心组件 Ceph的核心组件包括Ceph OSD、Ceph Monitor和Ceph MDS。 Ceph OSD:OSD的英文全称是Object Storage Device,它的主要功能是存储数据、复制数据、平衡数据、恢复数据等,与其它OSD间进行心跳检查等,并将一些变化情况上报给Ceph Monitor。一般情况下一块硬盘对应一个OSD,由OSD来对硬盘存储进行管理,当然一个分区也可以成为一个OSD。 Ceph OSD的架构实现由物理磁盘驱动器、Linux文件系统和Ceph OSD服务组成,对于Ceph OSD Deamon而言,Linux文件系统显性的支持了其拓展性,一般Linux文件系统有好几种,比如有BTRFS、XFS、Ext4等,BTRFS虽然有很多优点特性,但现在还没达到生产环境所需的稳定性,一般比较推荐使用XFS。 伴随OSD的还有一个概念叫做Journal盘,一般写数据到Ceph集群时,都是先将数据写入到Journal盘中,然后每隔一段时间比如5秒再将Journal盘中的数据刷新到文件系统中。一般为了使读写时延更小,Journal盘都是采用SSD,一般分配10G以上,当然分配多点那是更好,Ceph中引入Journal盘的概念是因为Journal允许Ceph OSD功能很快做小的写操作;一个随机写入首先写入在上一个连续类型的journal,然后刷新到文件系统,这给了文件系统足够的时间来合并写入磁盘,一般情况下使用SSD作为OSD的journal可以有效缓冲突发负载。 Ceph Monitor:由该英文名字我们可以知道它是一个监视器,负责监视Ceph集群,维护Ceph集群的健康状态,同时维护着Ceph集群中的各种Map图,比如OSD Map、Monitor Map、PG Map和CRUSH Map,这些Map统称为Cluster Map,Cluster Map是RADOS的关键数据结构,管理集群中的所有成员、关系、属性等信息以及数据的分发,比如当用户需要存储数据到Ceph集群时,OSD需要先通过Monitor获取的Map图,然后根据Map图和object id等计算出数据最终存储的位置。 Ceph MDS:全称是Ceph MetaData Server,主要保存的文件系统服务的元数据,但对象存储和块存储设备是不需要使用该服务的。 查看各种Map的信息可以通过如下命令:ceph osd(mon、pg) dump 3 Ceph基础架构组件 从架构图中可以看到最底层的是RADOS,RADOS自身是一个完整的分布式对象存储系统,它具有可靠、智能、分布式等特性,Ceph的高可靠、高可拓展、高性能、高自动化都是由这一层来提供的,用户数据的存储最终也都是通过这一层来进行存储的,RADOS可以说就是Ceph的核心。 RADOS系统主要由两部分组成,分别是OSD和Monitor。 基于RADOS层的上一层是LIBRADOS,LIBRADOS是一个库,它允许应用程序通过访问该库来与RADOS系统进行交互,支持多种编程语言,比如C、C++、Python等。 基于LIBRADOS层开发的又可以看到有三层,分别是RADOSGW、RBD和CEPH FS。 RADOSGW:RADOSGW是一套基于当前流行的RESTFUL协议的网关,并且兼容S3和Swift。 RBD:RBD通过Linux内核客户端和QEMU/KVM驱动来提供一个分布式的块设备。 CEPH FS:CEPH FS通过Linux内核客户端和FUSE来提供一个兼容POSIX的文件系统。 4 Ceph存储介绍 存储数据与object的关系:当用户要将数据存储到Ceph集群时,存储数据都会被分割成多个object,每个object都有一个object id,每个object的大小是可以设置的,默认是4MB,object可以看成是Ceph存储的最小存储单元。 object与pg的关系:由于object的数量很多,所以Ceph引入了pg的概念用于管理object,每个object最后都会通过CRUSH计算映射到某个pg中,一个pg可以包含多个object。 通过实验总结: (1)PG是指定存储池存储对象的目录有多少个,PGP是存储池PG的OSD分布组合个数 (2)PG的增加会引起PG内的数据进行分裂,分裂相同的OSD上新生成的PG当中 (3)PGP的增加会引起部分PG的分布进行变化,但是不会引起PG内对象的变动 pg和pool的关系:pool也是一个逻辑存储概念,我们创建存储池pool的时候,都需要指定pg和pgp的数量,逻辑上来说pg是属于某个存储池的,就有点像object是属于某个pg的。 以下这个图表明了存储数据,object、pg、pool、osd、存储磁盘的关系 注:以上为引用文章【1】 5 部署 环境准备, 服务器全部安装centos7.5 192.168.3.8 ceph-admin(ceph-deploy) mds1、mon1(也可以将monit节点另放一台机器) 192.168.3.7 ceph-node1 osd1 192.168.3.6 ceph-node2 osd2 ------------------------------------------------- 每个节点修改主机名 # hostnamectl set-hostname ceph-admin # hostnamectl set-hostname ceph-node1 # hostnamectl set-hostname ceph-node2 ------------------------------------------------- 每个节点绑定主机名映射 # cat /etc/hosts 192.168.3.8 ceph-admin 192.168.3.7 ceph-node1 192.168.3.6 ceph-node2 ------------------------------------------------- 每个节点确认连通性 # ping -c 3 ceph-admin # ping -c 3 ceph-node1 # ping -c 3 ceph-node2 ------------------------------------------------- 每个节点关闭防火墙和selinux # systemctl stop firewalld # systemctl disable firewalld # sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # setenforce 0 ------------------------------------------------- 每个节点安装和配置NTP(官方推荐的是集群的所有节点全部安装并配置 NTP,需要保证各节点的系统时间一致。没有自己部署ntp服务器,就在线同步NTP) # yum install ntp ntpdate ntp-doc -y # systemctl restart ntpd # systemctl status ntpd ------------------------------------------------- 每个节点准备yum源 删除默认的源,国外的比较慢 # yum clean all # mkdir /mnt/bak # mv /etc/yum.repos.d/* /mnt/bak/ 下载阿里云的base源和epel源 # wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 添加ceph源 # vim /etc/yum.repos.d/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 ------------------------------------------------------------ 每个节点创建cephuser用户,设置sudo权限 # useradd -d /home/cephuser -m cephuser # echo "cephuser"|passwd --stdin cephuser # echo "cephuser ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephuser # chmod 0440 /etc/sudoers.d/cephuser # sed -i s'/Defaults requiretty/#Defaults requiretty'/g /etc/sudoers 测试cephuser的sudo权限 # su - cephuser $ sudo su - # ------------------------------------------------------------ 配置相互间的ssh信任关系 现在ceph-admin节点上产生公私钥文件,然后将ceph-admin节点的.ssh目录拷贝给其他节点 [root@ceph-admin ~]# su - cephuser [cephuser@ceph-admin ~]$ ssh-keygen -t rsa #一路回车 [cephuser@ceph-admin ~]$ cd .ssh/ [cephuser@ceph-admin .ssh]$ ls id_rsa id_rsa.pub [cephuser@ceph-admin .ssh]$ cp id_rsa.pub authorized_keys [cephuser@ceph-admin .ssh]$ scp -r /home/cephuser/.ssh ceph-node1:/home/cephuser/ [cephuser@ceph-admin .ssh]$ scp -r /home/cephuser/.ssh ceph-node2:/home/cephuser/ 然后在各节点直接验证cephuser用户下的ssh相互信任关系 $ ssh -p22 cephuser@ceph-admin $ ssh -p22 cephuser@ceph-node1 $ ssh -p22 cephuser@ceph-node2 [root@ceph-admin ~]# su - cephuser 安装ceph-deploy [cephuser@ceph-admin ~]$ sudo yum update -y && sudo yum install ceph-deploy -y 创建cluster目录 [cephuser@ceph-admin ~]$ mkdir cluster [cephuser@ceph-admin ~]$ cd cluster/ [cephuser@ceph-admin cluster]$ ceph-deploy new ceph-admin ceph-node1 ceph-node2 [cephuser@ceph-admin cluster]$ vim ceph.conf 将如下内容加入配置文件 osd pool default size = 2 mon_clock_drift_allowed = 1 [cephuser@ceph-admin cluster]$ ceph-deploy install --release=luminous ceph-admin ceph-node1 ceph-node2 初始化monit监控节点,并收集所有密钥 [cephuser@ceph-admin cluster]$ ceph-deploy mon create-initial [cephuser@ceph-admin cluster]$ ceph-deploy gatherkeys ceph-admin 添加OSD到集群 检查OSD节点上所有可用的磁盘 [cephuser@ceph-admin cluster]$ ceph-deploy disk list ceph-node1 ceph-node2 [cephuser@ceph-admin ~]$ ssh ceph-node1 "sudo mkdir /var/local/osd0 && sudo chown ceph:ceph /var/local/osd0" [cephuser@ceph-admin ~]$ ssh ceph-node2 "sudo mkdir /var/local/osd1 && sudo chown ceph:ceph /var/local/osd1" [cephuser@ceph-admin ~]$ ceph-deploy osd prepare ceph-node1:/var/local/osd0 ceph-node2:/var/local/osd1 [cephuser@ceph-admin ~]$ ceph-deploy osd activate ceph-node1:/var/local/osd0 ceph-node2:/var/local/osd1 更新配置 [cephuser@ceph-admin ~]$ ceph-deploy admin ceph-admin ceph-node1 ceph-node2 [cephuser@ceph-admin ~]$ sudo chmod +r /etc/ceph/ceph.client.admin.keyring [cephuser@ceph-admin ~]$ ssh ceph-node1 sudo chmod +r /etc/ceph/ceph.client.admin.keyring [cephuser@ceph-admin ~]$ ssh ceph-node2 sudo chmod +r /etc/ceph/ceph.client.admin.keyring 测试 服务状态 [cephuser@ceph-admin ~]$ ceph health HEALTH_OK [cephuser@ceph-admin ~]$ ceph -s cluster 50fcb154-c784-498e-9045-83838bc3018e health HEALTH_OK monmap e1: 3 mons at {ceph-admin=192.16.3.8:6789/0,ceph-node1=192.16.3.7:6789/0,ceph-node2=192.16.3.6:6789/0} election epoch 4, quorum 0,1,2 ceph-node2,ceph-node1,ceph-admin osdmap e12: 2 osds: 2 up, 2 in flags sortbitwise,require_jewel_osds pgmap v624: 64 pgs, 1 pools, 136 MB data, 47 objects 20113 MB used, 82236 MB / 102350 MB avail 64 active+clean 挂载测试 [cephuser@ceph-admin ~]$ sudo rbd create foo --size 4096 -m ceph-node1 [cephuser@ceph-admin ~]$ sudo rbd map foo --pool rbd --name client.admin -m ceph-node1 [cephuser@ceph-admin ~]$ sudo mkfs.ext4 -m0 /dev/rbd/rbd/foo [cephuser@ceph-admin ~]$ sudo mkdir /mnt/ceph-block-device [cephuser@ceph-admin ~]$ sudo mount /dev/rbd/rbd/foo /mnt/ceph-block-device 基础环境到这就算搭建好了,但是想配置好,还有一些路要走。 如果没有环境的童鞋,可以考虑使用vagrant来模拟,参考资料【2】的连接,是vagrant项目,非常好用。 参考资料: [1]: https://www.cnblogs.com/luohaixian/p/8087591.html [2]: https://github.com/carmstrong/multinode-ceph-vagrant [3]: https://www.cnblogs.com/kevingrace/p/9141432.html 声明:本文版权归原作者所有,文章收集于网络,为传播信息而发,如有侵权,请联系小编及时处理,谢谢! 欢迎加入本站公开兴趣群 软件开发技术群 兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流 QQ群:26931708 |