CEPH集群搭建部署与常规操作实战!理论+实战!

前言

一:理论部分

1.1:什么是CEPH?有什么作用?

  • mark

  • 此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的通过计算方式获得数据位置的方式不同,另外一种方式是通过一致性哈希方式获得数据位置。一致性哈希的方式就是将设备做成一个哈希环,然后根据数据名称计算出的哈希值映射到哈希环的某个位置,从而实现数据定位。
  • 哈希环对服务器设备做映射
  • mark

1.6:完全无中心架构—计算模式(Ceph)

  • 下图是Ceph存储系统的架构,在该架构中与HDFS不同的地方在于该架构中没有中心节点。客户端是通过一个设备映射关系计算出来其写入数据的位置,这样客户端可以直接与存储节点通信,从而避免中心节点的性能瓶颈。

  • mark

  • ceph 是一种开源存储软件。底层实现了对象存储,并以此为基础对外提供对象存储接口、块存储接口、文件级存储接口。

  • 官方架构图

    mark

  • 通俗转化版

    mark

  • 名词解释

    • 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)。

    • mark

    • ceph 在对象存储的基础上提供了更加高级的思想。当对象数量达到了百万级以上,原生的对象存储在索引对象时消耗的性能非常大。ceph因此引入了 placement group (pg)的概念。一个PG就是一组对象的集合。

    • mark

    • 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

    mark

2.2:实验拓扑图

  • mark

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

2.3.5:实验结束,谢谢查看!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章