文章目录
前言
一:理论部分
1.1:什么是CEPH?有什么作用?
-
此LOGO的来源是章鱼,是从开发者宠物的名字来的
-
CEPH是一个开源的项目,是一个可大规模扩展,高性能且无单点故障的分布式存储系统,它是软件定义的,统一的存储解决方案。
-
CEPH因为开源,可扩展和分布式的优点,如今称为各种云的主流存储方案
1.2:CEPH的优势和缺点
- ceph发展至今已过10年,随着云计算的发展,ceph与云计算的关系越来越紧密,但是也存在着一些优缺点
1.2.1:优点
- CRUSH算法
- CRUSH算法是Ceph最初的两大创新之一(另一个是基于动态子树分区的元数据集群),也是整个RADOS的基石,是Ceph最引以为豪的地方。
- CRUSH在一致性哈希基础上很好的考虑了容灾域的隔离,能够实现各类负载的副本放置规则,例如跨机房、机架感知等。同时, CRUSH算法支持副本和EC两种数据冗余方式,还提供了四种不同类型的Bucket(Uniform, List, Tree, Straw),充分考虑了实际生产过程中硬件的迭代式部署方式,虽然实际生产中大多数情况下的都是只用了一种Straw。
- 统一存储架构
- Ceph最初设计的RADOS是为其实现一个高性能的文件系统服务的,并没有考虑对于块设备、对象存储的支持,也就没有什么RBD、RADOS GateWay,跟别提OpenStack和qemu之类的了。但由于 RADOS 出色的设计和独立简洁的访问接口,Ceph社区果断推出了用于支持云计算的分布式块存储RBD和分布式对象存储RADOS GateWay,并将开发中心全面转向云计算领域。
- RADOS的设计非常的优秀。从架构上来看,RBD和RADOSGateWay实际上都只是RADOS的客户端而已,但得益于RADOS的优秀设计,RBD和RADOSGateWay的设计和实现都很简单,不需要考虑横向扩展、冗余、容灾、负载平衡的等复杂的分布式系统问题,同时能够提供足够多的特性和足够优秀的性能,因此迅速得到了社区的认可。
- 另一方面,Ceph为OpenStack提供了良好的支持,成为了目前最火的OpenStack底层存储系统。
- 丰富的特性
- Ceph的特性不可谓不多,从分布式系统最基本的横向扩展、动态伸缩、冗余容灾、负载平衡等,到生产环境环境中非常实用的滚动升级、多存储池、延迟删除等,再到高大上的CephFS集群、快照、纠删码、跨存储池缓存等,不可谓不强大。
- 但是就像大多数开源系统一样,Ceph的基本特性,或者说真正在生产环境中用的上的特性还是非常靠谱的,但其他“高级”特性就只能打一个问号了。特别是在CephFS模块,由于Ceph社区目前的开发重点主要还是与云计算相关的部分,即RBD和RADOSGateWay,导致CephFS的开发停滞了很久,相关的特性,例如元数据集群、快照等,目前都不满足生产环境的要求。
1.2.2:缺点
- 代码质量
- Ceph主要使用C/C++语言编写,同时外围的很多脚本和工具用了Python。
- 由于历史问题,ceph部分功能的代码数量有的达到1万多行,且与父级目录没有逻辑关系等等问题
- 性能
- 数据双倍写入
- Ceph本地存储接口(FileStore)为了支持事务,引入了日志(Journal)机制。所有的写入操作都需要先写入日志(XFS模式下),然后再写入本地文件系统。简单来说就是一份数据需要写两遍,日志+本地文件系统。
- IO路径过长
- 这个问题在Ceph的客户端和服务器端都存在。以osd为例,一个IO需要经过message、OSD、FileJournal、FileStore多个模块才能完成,每个模块之间都涉及到队列和线程切换,部分模块在对IO进行处理时还要进行内存拷贝,导致整体性能不高。
- 对高性能硬件的支持有待改进
- 最开始只支持HDD,没有充分考虑SSD
- 数据双倍写入
1.3:什么是集中式存储架构?
- 所谓集中式存储,整个存储是集中在一个系统中的。但集中式存储并不是一个单独的设备,是集中在一套系统当中的多个设备。
- 在集中式存储中通常包含一个机头,这个是存储系统中最为核心的部件。通常在机头中有包含两个控制器,这两个控制器实现互备的作用,避免硬件故障导致整个存储系统的不可用。在该机头中通常包含前端端口和后端端口,前端端口用户为服务器提供存储服务,而后端端口用于扩充存储系统的容量。通过后端端口机头可以连接更多的存储设备,从而形成一个非常大的存储资源池。
- 分布式存储是一个大的概念,其包含的种类繁多,除了传统意义上的分布式文件系统、分布式块存储和分布式对象存储外,还包括分布式数据库和分布式缓存等
1.4:中间控制节点架构(HDFS)
1.5:完全无中心架构—一致性哈希(Swift)
- 与Ceph的通过计算方式获得数据位置的方式不同,另外一种方式是通过一致性哈希方式获得数据位置。一致性哈希的方式就是将设备做成一个哈希环,然后根据数据名称计算出的哈希值映射到哈希环的某个位置,从而实现数据定位。
- 哈希环对服务器设备做映射
1.6:完全无中心架构—计算模式(Ceph)
-
下图是Ceph存储系统的架构,在该架构中与HDFS不同的地方在于该架构中没有中心节点。客户端是通过一个设备映射关系计算出来其写入数据的位置,这样客户端可以直接与存储节点通信,从而避免中心节点的性能瓶颈。
-
ceph 是一种开源存储软件。底层实现了对象存储,并以此为基础对外提供对象存储接口、块存储接口、文件级存储接口。
-
官方架构图
-
通俗转化版
-
名词解释
- RADOS:Reliable Autonomic Distributed Object Store(可靠的,自主的,分布式的对象存储)。在 ceph 中这个名词经常出现,有时会以 R 表示 RADOS。实际上这个词仅仅是对 ceph 的一个修饰词,并不代表 ceph 的组件什么的。粗暴的认为, RADOS = ceph 对象存储集群 即可。
- RGW、RBD、CEPH FS: 这三个就是 ceph clients。
- RGW:对象存储网关,也就是对象存储接口。
- RBD:块设备,也就是块存储接口。
- CEPH FS:ceph 文件系统,也就是文件级存储接口。
-
CEPH基本架构
-
CEPH组件主要分分为两部分:
Ceph Node:构成Ceph集群的基础组件
Ceph Client:对外提供多种方式使用Ceph存储的组件
-
-
CEPH基础组件
-
此部分介绍构成Ceph集群的基础组件,其中包含OSD、Manager、MSD、Monitor
- OSD(ceph-osd):object storage daemon,对象存储进程。ceph 管理物理硬盘时,引入了OSD概念,每一块盘都会针对的运行一个OSD进程。换句话说,ceph 集群通过管理 OSD 来管理物理硬盘。OSD 一般功能为:存储数据、维护数据副本、数据恢复、数据再平衡以及对ceph monitor组件提供相关监控信息.
- Manager(ceph-mgr):用于收集ceph集群状态、运行指标,比如存储利用率、当前性能指标和系统负载。对外提供 ceph dashboard(ceph ui)和 resetful api。Manager组件开启高可用时,至少2个。
- MDS(ceph-mds):Metadata server,元数据服务。为ceph 文件系统提供元数据服务(ceph 对象存储和块存储不需要MDS)。为 posix 文件系统用户提供性能良好的基础命令(ls,find等)。
- Monitor(ceph-mon):维护集群的状态,包含monitor组件信息,manger 组件信息,osd组件信息,mds组件信息,crush 算法信息。还负责ceph集群的身份验证功能,client在连接ceph集群时通过此组件进行验证。Monitor组件开启高可用时,至少3个。
-
Ceph Clients
- 此部分介绍 ceph 对外提供各种功能的组件。其中包含:Block Device、Object Storage、Filesystem。
- Block Device:块存储设备,RBD。
- Object Storage: 对象存储,RGW。对外可提供 swift 、s3 接口类型restful api
- Filesystem:文件系统,CephFS。提供一个兼容POSIX的文件系统。
-
Ceph存储过程
-
在对象存储中,一切都是扁平化的,并且存储的最小单元为对象(OBJ)。
-
ceph 在对象存储的基础上提供了更加高级的思想。当对象数量达到了百万级以上,原生的对象存储在索引对象时消耗的性能非常大。ceph因此引入了 placement group (pg)的概念。一个PG就是一组对象的集合。
-
obj和pg之间的映射由ceph client计算得出。
-
讨论 pg 时,不得不提的另外一个名词:pgp。pgp决定了pg和osd 之间的映射关系。一般将 pgp_num 设置成和 pg_num 一样大小。这里还有一个名词需要提一下,在ceph中会经常见到crush算法。简单来说,crush 算法就是指 ceph 中数据如何存储、读取的过程。由于ceph集群面对许多的独立项目,因此ceph还引入了ceph pool的概念用于划分不同的项目。
ceph pool 是对 ceph 对象的逻辑划分,并不是物理划分。
-
pg和ceph pool的区别:
pg对于用户来说是透明的,只是底层的一种优化方案。
ceph pool对于用户来说,就像mysql中的database。
-
二:实验部分
2.1:环境介绍
-
主机名 操作系统 IP地址 主要软件 ceph01 centos7.7 NAT:192.168.233.128,VM1:192.168.11.128 ceph02 centos7.7 NAT:192.168.233.129,VM1:192.168.11.129 ceph03 centos7.7 NAT:192.168.233.130,VM1:192.168.11.130
2.2:实验拓扑图
2.3:实验过程
2.3.1:开局优化
-
修改IP地址,三台都做,仅展示ceph01的操作
[root@localhost ~]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]# ip addr '//发现需要添加一个ens36的网卡配置' [root@localhost network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36 [root@localhost network-scripts]# vi ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static '//改成static静态' DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=c8c5bb8e-55a1-4a47-9f25-12dd3fa47b64 DEVICE=ens33 ONBOOT=yes '//开启网卡' IPADDR=192.168.233.128 '//设置网卡IP地址' NETMASK=255.255.255.0 GATEWAY=192.168.233.2 DNS1=8.8.8.8 '//设置dns' DNS2=114.114.114.114 [root@localhost network-scripts]# vi ifcfg-ens36 ...省略内容,跟ens33的配置相同 NAME=ens36 '//一下两个修改成ens36,删除UUID' DEVICE=ens36 ONBOOT=yes IPADDR=192.168.11.128 NETMASK=255.255.255.0 '//修改IP地址,删除网关和dns' [root@localhost network-scripts]# systemctl restart network '//重启网卡' [root@localhost network-scripts]# ip addr '//查看是否生效' [root@localhost network-scripts]# ping www.baidu.com '//发现是可以ping通的'
-
修改主机名并配置hosts文件,三台都做,仅展示ceph01的操作
[root@localhost network-scripts]# hostnamectl set-hostname ceph01 [root@localhost network-scripts]# su [root@ceph01 network-scripts]# [root@ceph01 network-scripts]# vi /etc/hosts '//添加一下内容' 192.168.11.128 ceph01 192.168.11.129 ceph02 192.168.11.130 ceph03 [root@ceph01 network-scripts]# ping ceph01 '//测试是否能ping通' [root@ceph01 network-scripts]# ping ceph02 [root@ceph01 network-scripts]# ping ceph03
-
关闭防火墙与核心防护,三台都做,仅展示ceph01的操作
[root@ceph01 network-scripts]# systemctl stop firewalld [root@ceph01 network-scripts]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. [root@ceph01 network-scripts]# setenforce 0 [root@ceph01 network-scripts]# sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux
-
创建免密交互,三台都做,仅展示ceph01的操作
[root@ceph01 network-scripts]# ssh-keygen '//生成密钥对' '//下面的四个交互都直接回车即可' [root@ceph01 network-scripts]# ssh-copy-id root@ceph01 '//上传密钥对' '//交互信息输入yes和对方主机密码' [root@ceph01 network-scripts]# ssh-copy-id root@ceph02 [root@ceph01 network-scripts]# ssh-copy-id root@ceph03 '//测试免秘钥登陆' [root@ceph01 network-scripts]# ssh ceph01 Last login: Mon Mar 30 21:22:24 2020 [root@ceph01 ~]# exit 登出 Connection to ceph01 closed. [root@ceph01 network-scripts]# ssh ceph02 Last login: Mon Mar 30 21:22:51 2020 [root@ceph02 ~]# exit 登出 Connection to ceph02 closed. [root@ceph01 network-scripts]# ssh ceph03 Last login: Mon Mar 30 21:36:46 2020 from ceph03 [root@ceph03 ~]# exit 登出 Connection to ceph03 closed. [root@ceph01 network-scripts]#
-
修改yum源,三台都做,仅展示ceph01的操作
[root@ceph01 network-scripts]# cd /etc/yum.repos.d [root@ceph01 yum.repos.d]# yum -y install wget curl net-tools bash-completion vim '//安装一些环境包' [root@ceph01 yum.repos.d]# mkdir bak [root@ceph01 yum.repos.d]# mv * bak mv: 无法将目录"bak" 移动至自身的子目录"bak/bak" 下 [root@ceph01 yum.repos.d]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo '//下载基础源' [root@ceph01 yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo '//下载epel源' [root@ceph01 yum.repos.d]# vi local.repo '//配置本地源' [ceph] name=Ceph packages for baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/$basearch enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc priority=1 [ceph-noarch] name=Ceph noarch packages baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/ enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc priority=1 [ceph-source] name=Ceph source packages baseurl=https://mirrors.aliyun.com/ceph/rpm-mimic/el7/SRPMS/ enabled=1 gpgcheck=1 type=rpm-md gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc priority=1 [root@ceph01 yum.repos.d]# yum update -y '//进行升级操作'
-
配置NTP服务,CEPH01配置NTP服务即可,其他服务器想CEPH01节点同步
'//ceph01操作' [root@ceph01 yum.repos.d]# yum -y install ntpdate ntp '//三台主机都装' [root@ceph01 yum.repos.d]# ntpdate ntp1.aliyun.com '//ceph01向阿里云同步时间' 30 Mar 21:52:57 ntpdate[66372]: adjust time server 120.25.115.20 offset -0.007958 sec [root@ceph01 yum.repos.d]# clock -w '//将当前系统时间写入到CMOS中' [root@ceph01 yum.repos.d]# vi /etc/ntp.conf '//修改ntp服务配置文件' restrict default nomodify '//第8行改' restrict 192.168.11.0 mask 255.255.255.0 nomodify notrap '//第17行改' '//将21行到24行删除' 21 server 0.centos.pool.ntp.org iburst 22 server 1.centos.pool.ntp.org iburst 23 server 2.centos.pool.ntp.org iburst 24 server 3.centos.pool.ntp.org iburst '//删除的插入下面内容' fudeg 127.127.1.0 stratum 10 server 127.127.1.0 [root@ceph01 yum.repos.d]# systemctl restart ntpd '//重启ntpd服务' [root@ceph01 yum.repos.d]# systemctl enable ntpd '//设置开机自启动' Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service. '//ceph02和ceph03操作' [root@ceph02 yum.repos.d]# ntpdate ceph01 '//同步ceph01的时间' 30 Mar 22:01:11 ntpdate[74462]: adjust time server 192.168.11.128 offset -0.007308 sec [root@ceph02 yum.repos.d]# crontab -e '//设置计划任务' */2 * * * * /usr/bin/ntpdate ceph01 >> /var/log/ntpdate.log [root@ceph01 yum.repos.d]# systemctl restart crond '//重启计划任务' [root@ceph02 yum.repos.d]# crontab -l '//查看计划任务' */2 * * * * /usr/bin/ntpdate ceph01 >> /var/log/ntpdate.log
2.3.2:搭建集群
-
管理节点安装部署工具
[root@ceph01 yum.repos.d]# yum -y install python-setuptools ceph-deploy
-
三个节点创建目录,用于保存ceph-deploy 生成的配置文件和密钥对。三个节点安装ceph
[root@ceph01 yum.repos.d]# mkdir /etc/ceph [root@ceph01 yum.repos.d]# yum -y install ceph
-
管理节点创建mon并初始化,收集秘钥
[root@ceph01 yum.repos.d]# cd /etc/ceph [root@ceph01 ceph]# ceph-deploy new ceph01 ceph02 '//创建mon' [root@ceph01 ceph]# ceph-deploy mon create-initial '//初始化,收集秘钥'
-
查看集群状态
[root@ceph01 ceph]# ceph -s
-
创建osd
[root@ceph01 ceph]# ceph-deploy osd create --data /dev/sdb ceph01 [root@ceph01 ceph]# ceph-deploy osd create --data /dev/sdb ceph02 [root@ceph01 ceph]# ceph -s '//查看集群状态会发现有两个osd加入进来了' [root@ceph01 ceph]# ceph osd tree '//查看osd目录树' ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF -1 1.99799 root default -3 0.99899 host ceph01 0 hdd 0.99899 osd.0 up 1.00000 1.00000 -5 0.99899 host ceph02 1 hdd 0.99899 osd.1 up 1.00000 1.00000 [root@ceph01 ceph]# ceph osd stat '//查看osd状态' 2 osds: 2 up, 2 in; epoch: e9
-
将配置文件和admin秘钥下发到节点并给秘钥增加权限
[root@ceph01 ceph]# ceph-deploy admin ceph01 ceph02 [root@ceph01 ceph]# chmod +r ceph.client.admin.keyring [root@ceph02 ceph]# chmod +r ceph.client.admin.keyring
2.3.3:扩容操作
-
扩容ceph03节点的osd和mon
[root@ceph01 ceph]# ceph-deploy osd create --data /dev/sdb ceph03 [root@ceph01 ceph]# ceph -s '//已经有三个osd了' [root@ceph01 ceph]# vi ceph.conf [global] fsid = b175fb1a-fdd6-4c57-a41f-b2d964dff248 mon_initial_members = ceph01, ceph02, ceph03 '//添加ceph03' mon_host = 192.168.11.128,192.168.11.129,192.168.11.130 '//添加ceph03IP地址' auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx public network = 192.168.11.0/24 '//添加内部通信网段' [root@ceph01 ceph]# ceph-deploy mon add ceph03 '//添加mon'
-
重新下发秘钥和配置文件
[root@ceph01 ceph]# ceph-deploy --overwrite-conf config push ceph01 ceph02 ceph03 [root@ceph01 ceph]# systemctl list-unit-files |grep mon '//查看已启动的含mon列表' [email protected] enabled lvm2-monitor.service enabled ceph-mon.target enabled
-
三台主机重启mon服务
[root@ceph01 ceph]# systemctl restart ceph-mon.target [root@ceph01 ceph]# ceph -s
2.3.4:常用命令操作集锦
-
ceph中osd的删除pool操作
[root@ceph00 ceph]# ceph osd pool rm cinder cinder --yes-i-really-really-mean-it '//删除pool' Error EPERM: pool deletion is disabled; you must first set the mon_allow_pool_delete config option to true before you can destroy a pool [root@ceph00 ceph]# vi /etc/ceph/ceph.conf '//配置文件添加允许' mon_allow_pool_delete = true [root@ceph00 ceph]# systemctl restart ceph-mon.target '//重启mon服务' [root@ceph00 ceph]# ceph osd pool rm cinder cinder --yes-i-really-really-mean-it '//删除成功' pool 'cinder' removed [root@ceph00 ceph]# ceph osd pool ls nova glance [root@ceph00 ceph]# ceph osd pool rename nova nova999 '//重命名pool' pool 'nova' renamed to 'nova999'
-
更多操作请查看之前博客:https://blog.csdn.net/CN_TangZheng/article/details/104758061