Ceph集概念以及部署
⼀、Ceph基础:
1、基础概念:
ceph 是⼀个开源的分布式存储,同时⽀持对象存储、块设备、⽂件系统
ceph是⼀个对象(object)式存储系统,它把每⼀个待管理的数据流(⽂件等数据)切分伟⼀到多个固定⼤⼩(默认4M)的对象数据,并以其为原⼦单元(原⼦是构成元素的最⼩单元)完成数据的读写
对象数据的底层存储服务是由多个存储主机(host)组成的存储集,该集也被称之为RADOS(reliable automatic distributed object store)存储集,即可靠的、⾃动化的、分布式的对象存储系统
librados是RADOS存储集的API,⽀持C/C++/JAVA/Python/ruby/go/php等多种编程语⾔客户端
2、ceph的设计思想:
ceph的设计宗旨在实现以下⽬标:
每⼀组件皆可扩展
⽆单点故障
基于软件(⽽⾮专业设备)并且开源(⽆供应商)
在现有的廉价硬件上运⾏
尽可能⾃动管理,减少⽤户⼲预
3、ceph版本:
leveldb使用 x.0.z - 开发版
x.1.z - 候选版
x.2.z - 稳定、修正版
4、ceph集⾓⾊定义:
5、ceph集的组成部分:
若⼲的Ceph OSD(对象存储守护进程)
⾄少需要⼀个Ceph Monitor 监视器(数量最好为奇数1,3,5,7........)
两个或以上的Ceph管理器 managers,运⾏Ceph⽂件系统客户端时还需要⾼可⽤的Ceph Metadata Server(⽂件系统元数据服务器)
RADOS Cluster:由多台host存储服务器组成的ceph集
OSD(Object Storage Daemon):每台存储服务器的磁盘组成的存储空间
Mon(Monitor):Ceph的监视器,维护OSD和PG的集状态,⼀个Ceph集⾄少有⼀个Mon节点,可以是⼀三五七等这样的奇数个
Mgr(Manager):负责跟踪运⾏时指标和Ceph集的当前状态,包括存储利⽤率,当前性能指标和系统负载等
6、Ceph集术语详细介绍:
6.1 Monitor(ceph-mon)ceph监视器:
软件包名&进程名:ceph-mon
在⼀个主机上运⾏的⼀个守护进程,⽤于维护集状态映射(maintains maps of the cluster state),⽐如ceph 集中有多少存储池、每个存储池有多少PG 以及存储池和PG的映射关系等, monitor map, manager map, the OSD map, the MDS map, and the CRUSH map,这些映射是Ceph 守护程序相互协调所需的关键集状态,此外监视器还负责管理守护程序和客户端之间的⾝份验证(认证使⽤cephX 协议)。通常⾄少需要三个监视器才能实现冗余和⾼可⽤性。
6.2 Managers
软件包&进程名:ceph-mgr
在⼀个主机上运⾏的⼀个守护进程,Ceph Manager 守护程序(ceph-mgr)负责跟踪运⾏时指标和Ceph 集的当前状态,包括存储利⽤率,当前性能指标和系统负载。Ceph Manager 守护程序还托管基于python 的模块来管理和公开Ceph 集信息,包括基于Web 的Ceph 仪表板和REST API。⾼可⽤性通常⾄少需要两个管理器。
6.3 Ceph OSDs(对象存储守护程序ceph-osd)
软件包名&进程名:ceph-osd
提供存储数据,操作系统上的⼀个磁盘就是⼀个OSD 守护程序,OSD ⽤于处理ceph集数据复
制,恢复,重新平衡,并通过检查其他Ceph OSD 守护程序的⼼跳来向Ceph监视器和管理器提供⼀些监视信息。通常⾄少需要3 个Ceph OSD 才能实现冗余和⾼可⽤性。
6.4 MDS(ceph元数据服务器ceph-mds)
软件包名&进程名:ceph-mds
代表ceph⽂件系统(NFS/CIFS)存储元数据(即Ceph块设备和Ceph对象存储不使⽤MDS)
6.5 Ceph的客户端管理⼯具
例如:rados、ceph、rbd 推荐使⽤部署专⽤节点对ceph进⾏管理、升级和后期维护,⽅便权限管理,避免⼀些不必要的误操作发⽣
7、Ceph逻辑组织架构:
7.1 Pool:存储池,分区、存储池的⼤⼩取决于底层的存储空间
7.2 PG(Placement group):⼀个pool内部可以有多个PG存在,pool和PG都是抽象的逻辑概念,⼀个pool中有多少个PG可以通过公式计算
7.3 OSD(Object Storage Daemon,对象存储设备):每⼀块磁盘都是⼀个osd,⼀个主机由⼀个或多个osd组成
8、向Ceph写⼊数据的⼤致流程:
Ceph集部署好了之后,要先创建存储池才能向ceph写⼊数据,⽂件在向ceph保存之前要先进⾏⼀致性hash计算,计算后会把⽂件保存在某个对应的PG中,此⽂件⼀定属于某个pool的⼀个PG,再通过PG保存在OSD上。数据对象在写到主OSD之后再同步到从OSD以实现数据的⾼可⽤
根据上图总结⼀下存储⽂件到Ceph的流程:
1、计算⽂件到对象的映射:假设file为客户端要读写的⽂件,得到oid(object id)= ino + ono (其中ino:inode number ,file的元数据序列号,file的唯⼀ID;ono:object number,file切分产⽣的某个object的序号,默认以4M切分⼀个块的⼤⼩)
2、通过hash算法计算出⽂件对应的pool中的PG:通过⼀致性hash计算Object到PG,Object-》PG映射hash(oid)&mask-》pgid
3、通过CRUSH把对象映射到PG中的OSD:通过CRUSH算法计算PG到OSD,PG——》OSD映射:[CRUSH(pgid)——》(osd1,osd2,osd3)]
4、PG中的主OSD将对象写⼊到硬盘
5、主OSD将数据同步给备份OSD即从OSD,并等待备份OSD返回确认
6、主OSD将写⼊完成返回给客户端
9、Ceph元数据保存⽅式:
9.1 xattrs(扩展属性):是将元数据保存在对象对应⽂件的扩展属性中并保存到系统盘上,这要求⽀持对象存储的本地⽂件系统(⼀般是XFS)⽀持扩展属性
9.2 omap(object map:对象映射):是将元数据保存在本地⽂件系统之外的独⽴key-value存储系统中,在使⽤filestore时是leveldb;在使⽤bluestore时是rocksdb
9.3 filestore与leveldb
Ceph早期基于filestore使⽤google的leveldb保存对象元数据。Leveldb是⼀个持久化存储的KV系统,与Redis不同的
是,leveldb不会像Redis⼀样将数据放在内存中从⽽占据打两的内存空间,⽽是将⼤部分数据存储到磁盘上,但是需要把磁盘格式化为⽂件系统(XFS)
Filestore将数据保存到与Posix兼容的⽂件系统(Btrfs,XFS,Ext4),缺点:性能、对象属性与磁盘本地的⽂件系统属性匹配存在限制
9.4 bluestore与rocksdb
RocksDB通过中间层BlueRocksDB访问⽂件系统接⼝,这个⽂件系统与传统的Linux⽂件系统(例如Ext4,XFS)不同,它不是VFS下⾯的通⽤⽂件系统,⽽是⼀个⽤户态的逻辑。BlueFS通过函数接⼝(API,⾮POSIX)的⽅式为BlueRocksDB提供类似⽂件系统的能⼒
以上各模块的作⽤:
Allocator:负责裸设备的空间管理分配
RocksDB:基于leveldb的开发的⼀款KV数据库,BlueStore将元数据全部存放⾄RocksDB中,这些元数据包括存储预写⽇志、数据对象元数据、Ceph的omap数据信息、以及分配器的元数据
BlueRocksEnv:这是RocksDB与BlueFS的交互接⼝,RocksDB提供了⽂件操作的接⼝EnvWrapper(Env封装器),可以通过继承实现该接⼝来定义底层的读写操作,BlueRocksEnv就是继承EnvWrapper实现对BlueFS的读写
BlueFS:BlueFS是BlueStore针对RocksDB开发的轻量级⽂件系统,⽤于存放RocksDB产⽣的.sst和.log⽂件
BlockDevice:BlueStore抛弃了传统的ext4、xfs⽂件系统,使⽤直接管理裸盘的⽅式;BlueStore⽀持同时使⽤多种不同类型的设备,在逻辑上BlueStore将存储空间划分为三层:慢速(Slow)空间,⾼速(DB)空间,超⾼速(WAL)空间,不同空间可以指定不同的设备类型,当然也可使⽤同⼀块设备
BlueStore的优势:BlueStore的设计考虑了FileStore中存在的⼀些硬伤,抛弃了传统的⽂件系统直接管理裸设备,缩短了IO路径,同时采⽤ROW的⽅式,避免了⽇志双写的问题,在写⼊性能上有了极⼤的提⾼
10、CRUSH算法简介:
CRUSH:Controllers replication under scalable hashing:可控的、可复制的、可伸缩的⼀致性hash算法,CRUSH是⼀种分布式算法,类似于⼀致性hash算法,⽤于为RADOS存储集控制数据的分配
Ceph使⽤CRUSH算法来存放和管理数据,它是Ceph的智能数据分发机制。Ceph使⽤CRUSH算法
来准确计算数据应该被保存到哪⾥,以及应该从哪⾥读取。和保存元数据不同的是,CRUSH按需计算出元数据,因此它就消除了对中⼼式服务器/⽹关的需求,它使得Ceph客户端能够计算出元数据,该过程也称为CRUSH查,然后和OSD直接通信
这⾥就会有⼀个问题,为什么要这么设计CRUSH算法?如果是把对象直接映射到OSD之上会导致对象与OSD的对应关系过于紧密和耦合,当OSD由于故障发⽣变更时将会对整个Ceph集产⽣影响。于是Ceph将⼀个对象映射到RADOS集的时候分两步⾛:⾸先使⽤⼀致性hash算法将对象名称映射到PG ,然后将PG ID基于CRUSH算法映射到OSD即可查到对象。
以上两个过程都是以”实时计算“的⽅式完成,⽽没有使⽤传统的查询数据与块设备的对应表的⽅式,这样有效的避免了组件的”中⼼化“问题,也解决了查询性能和冗余问题,使得Ceph集扩展不再受查询的性能限制
⼆、Ceph集部署
1、环境准备
系统版本:ubuntu-18.04-lts
内存: 3G
CPU:1C
磁盘:每台主机挂载5块数据盘
ip hostname role
192.168.199.22 ubuntu-node02 ceph-deploy、ceph-mgr、ceph-mon、ceph-node
192.168.199.23 ubuntu-node03 ceph-node
192.168.199.24 ubuntu-node04 ceph-node
2、配置国内ubuntu源
vim /etc/apt/sources.list
# 默认注释了源码镜像以提⾼ apt update 速度,如有需要可⾃⾏取消注释
deb mirrors.tuna.tsinghua.edu/ubuntu/ bionic main restricted universe multiverse
# deb-src mirrors.tuna.tsinghua.edu/ubuntu/ bionic main restricted universe multiverse
deb mirrors.tuna.tsinghua.edu/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src mirrors.tuna.tsinghua.edu/ubuntu/ bionic-updates main restricted universe multiverse
deb mirrors.tuna.tsinghua.edu/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src mirrors.tuna.tsinghua.edu/ubuntu/ bionic-backports main restricted universe multiverse
deb mirrors.tuna.tsinghua.edu/ubuntu/ bionic-security main restricted universe multiverse
# deb-src mirrors.tuna.tsinghua.edu/ubuntu/ bionic-security main restricted universe multiverse
3、配置时间同步:
apt install ntpdate -y
ntpdate ntp1.aliyun
4、配置本地hosts⽂件
vim /etc/hosts
192.168.199.22 ubuntu-node02
192.168.199.23 ubuntu-node03
192.168.199.24 ubuntu-node04
5、导⼊ceph的校验码,添加国内的ceph源
6、配置双⽹卡:
ens33:桥接
ens38:nat
注:另外两台机器只需将IP修改⼀下就可以了
vim /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
dhcp6: no
addresses: [ 192.168.199.22/24 ]
gateway4: 192.168.199.1
nameservers:
search: [ ubuntu-node02 ]
addresses:
- "192.168.199.1"
ens38:
dhcp4: no
dhcp6: no
addresses: [ 172.16.1.22/24 ]
7、创建ceph⽤户并配置可免密登录其他节点
groupadd -r -g 2022 ceph && useradd -r -m -s /bin/bash -u 2022 -g 2022 ceph && echo ceph:123456 | chpasswd ssh-keygen -t rsa
ssh-copy-id ceph@192.168.199.22
ssh-copy-id ceph@192.168.199.23
ssh-copy-id ceph@192.168.199.24
允许ceph⽤户执⾏sudo命令: echo "ceph ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
8、安装ceph部署⼯具ceph-deploy:
apt-cache madison ceph-deploy # 列出ceph-deploy的版本信息
apt install ceph-deploy -y
9、初始化mon节点:
切换到ceph⽤户的家⽬录创建ceph集初始化⽬录:
su - ceph
mkdir ceph-cluster
各节点安装python2并创建软链接
apt install python2.7 -y
ln -sv /usr/bin/python2.7 /usr/bin/python2
ceph-deploy new --cluster-network 172.16.1.0/24 --public-network 192.168.199.0/24 ubuntu-node02
注:
--cluster-network:指定ceph集内部通信的⽹段
--public-network:指定外部访问的⽹段地址
10、初始化node节点:
注意:确保ceph⽤户的家⽬录在/var/lib/ceph并且将原来/home/ceph/⽬录下⾯的ceph-cluster⽬录下⾯的⽂件拷贝
到/var/lib/ceph/ceph-cluster⽬录下
ceph-deploy install --no-adjust-repos --nogpgcheck ubuntu-node02 ubuntu-node03 ubuntu-node04 # 根据情况输⼊yes和主机密码
11、配置mon节点并同步⽣成秘钥:
apt install ceph-mon -y
ceph-deploy mon create-initial # 初始化mon节点
验证mon节点:
分发admin秘钥:
apt-get install ceph-common -y
ceph-deploy admin ubuntu-node02
12、ceph节点验证秘钥:
修改/etc/ceph/ceph.client.admin.keyring⽂件的属主:
sudo chown -R ceph. /etc/ceph/
13、配置manager节点:
sudo apt install ceph-mgr -y # 安装ceph-mgr
ceph-deploy mgr create ubuntu-node02 # 创建管理节点
验证mgr节点:
14、使⽤ceph-deploy管理ceph集:
15、验证ceph命令:
注意:因为重新推送了admin秘钥,所以/etc/ceph/ceph.client.admin.keyring⽂件的属主改变了需要重新修改属主
sudo chown -R ceph. /etc/ceph/
16、集调整:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论