存储基础
- 存储设备
- DAS:IDE、SATA、SCSI、SAS、USB
- NAS:NFS、CIFS
- SAN:SCSI、FC SAN、iSCSI
存储内容包括元数据和数据,名称节点(NameNode)存放元数据,数据节点(DataNode)存放实体数据。
元数据节点通常将随机IO转换为顺序IO进行存取,参考redis的AOF机制。
- 高可用
- 主从复制或者冗余备份
Ceph
- Ceph是一个对象式存储系统,它把每一个待管理的数据流切分为一到多个固定大小的对象数据,并以其为原子单元完成数据存取。
- 对象数据的底层存储服务是由多个主机组成的存储集群,该集群也被称之为RADOS(Reliable Automatic Distributed Object Store)存储集群,即可靠、自动化、分布式对象存储系统。
- librados是RADOS存储集群的API,支持C、C++、Java、Python、Ruby和PHP等编程语言。
- Ceph uniquely delivers object, block, and file storage in one unified system. (RaodsGW、RBD、CephFS)
osd (Object Storage Device)
mon (Monitor):维护集群元数据
mgr (Manager):维护查询类操作
将整个存储空间切分为区,每个分区就是存储池,存储池的大小取决于磁盘大小,
SP (Storage Pool):rados cluster抽象而成的存储池
PG (Placement Group):存储池中可以映射到osd上的归置组,便于管理
存储过程:
对象名称进行一致性hash计算,映射到PG上,根据存储池类型和冗余副本数量,找到足量的osd进行存储。
Monitors
- ceph-mon 维护集群图的状态,包括monitor、manager、OSD、CRUSH
- CephX认证协议,负责维护认证信息并实行认证,任何组件间都需要认证
- 通常至少需要三个monitors用于冗余和高可用
Managers
- ceph-mgr跟踪ceph集群运行时的指标数据,包括存储空间利用率、当前性能指标、系统负载
- 可利用基于python的插件,对于mgr进行功能扩展,本身支持网络面板以及REST API
- 通常至少需要俩个managers用于高可用
RADOS 组件
- Ceph OSDs
- OSD(守护进程,ceph-osd)存储数据、数据复制、恢复、重新均衡,并提供监视信息给mon和mgr通过心跳检查其他守护进程
- 至少需要三个OSDs用于高可用
- MDSs
- MDS存储Ceph文件系统的元数据
- 允许POSIX文件系统用户执行基本的命令
数据抽象接口
- LIBRADOS
- 用户可通过支持的编程语言开发自定义客户端程序通过RADOS协议与存储系统进行交互
- CephFS
- 使用POSIX规范文件系统在Ceph集群存放数据
- 依赖于独立运行的守护进程ceph-mds向客户端提供服务
- Ceph Block Device (RBD)
- 拥有RADOS的功能,如快照、复制、一致性,并使用内核模块或librbd库与OSD进行交互
- 与内核模块、KVMs和云计算系统的交互均可以展现无限伸缩的高性能
- 无须依赖于特定的守护进程,内建了librbd库
- Ceph Object GateWay (RadosGW)
- 在librados基础上提供对REST形式的对象存储功能
- 依赖于守护进程ceph-radosgw,其是一个用于与Ceph集群交互的HTTP服务器
管理节点
- 常用的管理接口是一组命令行工具程序,例如rados、ceph、rbd等命令,管理员可以从某个特定的MON节点执行管理操作,也可使用专用的管理节点
- 专用的管理节点有助于在Ceph相关的程序升级或硬件维护期间为管理员提供一个完整的、独立的并隔离于存储集群之外的操作环境,从而避免因重启或意外中断而导致维护操作异常中断
文件存储方式
-
FileStore:将文件分割成对象,OSD格式化成了XFS文件系统,需要先将对象转换成文件,属组文件级元数据放在元数据区,对象自己的元数据放在levelDB中。
-
BlueStore:OSD就是裸设备不进行格式化,levelDB(RocksDB)配合BlueFS存放元数据,其他地方直接存放并管理数据。
部署
- ceph-deploy (primary, run on admin-host)
- 只用于Ceph部署,并且不会处理客户端配置
- ceph-ansible (recommand)
- ceph-chef
- puppet-ceph
集群拓扑及网络
- 每个节点使用两个网卡
- 一个与客户端交互(public network, mandatory)
- 一个与集群其它节点交互(private network, optional)
部署准备
设备前提
ifconfig
fdisk -l /dev/vd*
cat /etc/hosts
系统设置
设定时钟同步
若可直接访问互联网,启动chronyd服务并设定随系统启动
systemctl start chronyd.service
systemctl enable chronyd.service
配置本地时间服务器,当存在可用本地服务器时,修改节点的/etc/crhony/conf配置文件
server CHRONY-SERVER-NAME-OR-IP iburst
主机名称解析
ip hostname name…
关闭iptables或firewalld服务
在不确定具体启动状态的前提下,同时关闭并禁用二者即可
systemctl stop firewalld.service
systemctl stop iptables.service
systemctl disable firewalld.service
systemctl disable iptables.service
yum仓库配置
在ceph-admin节点上,安装生成所需版本的yum仓库配置
rpm -ivh https://mirrors.aliyun.com/ceph/rom-xxx/xx/xxx/xxxx.rpm
cd /etc/yum.repos.d/
cat ceph.repo
yum install epel-release // 相关依赖库
创建Ceph特定用户账号
ceph-deploy必须以普通用户登录到各目标节点,且此用户需要拥有无密码使用sudo命令的权限,以便在安装软件及生成配置文件的过程中无需中断配置过程。新版ceph-deploy支持使用"–username {username}"选项提供可无密码使用sudo命令的用户名,指定的用户需要能够通过SSH协议自动认证并连接到各个节点
在各个节点创建新用户并设置密码magedu
useradd cephadm && echo “magedu” | passwd --stdin cephadm
确保无密码执行sudo命令 (可直接编辑/etc/sudoers.d/cephadm)
echo “cephadm ALL = (root) NOPASSWD:ALL” | sudo tee /etc/sudoers.d/cephadm
chmod 0440 /etc/sudoers.d/cephadm
sudo -l
su - cephadm
配置用户基于密钥的ssh认证
使用cephadm用户生成密钥
ssh-keygen -t rsa -P ‘’
ssh-copy-id -i .ssh/id_rsa.pub cephadm@localhost
ssh-copy-id -i .ssh/id_rsa.pub cephadm@store01
[scp -rp .ssh/ cephadm@store01:/home/cephadm] // 或者直接copy文件夹
为了方便操作,可修改~/.ssh/config文件,设定访问其它节点默认使用的用户名
Host store01
Hostname store01.magedu.com
User cephadm
…
配置其他节点sudo权限
scp -rp /etc/sudoers.d/cephadm store01:/etc/sudoers.d/
管理节点安装ceph-deploy
yum update
yum install ceph-deploy python-setuptools python2-subprocess32
部署RADOS集群
初始化
创建集群相关配置文件目录
mkdir ceph-cluster
cd ceph-cluster
初始化第一个MON节点
ceph-deploy new {initial-monitor-node(s)} // 名称必须与节点当前使用的主机名称保存一致
编辑生成ceph.conf配置文件,在[global]配置段中设置面向客户端通信使用的IP地址所在网络
public network = 172.20.0.0/16
安装Ceph集群
ceph-deploy install {ceph-node}[{ceph-node}…]
配置初始MON节点,手机所有密钥
ceph-deploy mon create-install
将配置文件和admin密钥拷贝到各节点上,以免每次执行需要指定MON节点和amdin.keyring
ceph-deploy admin store01 …
在需要运行ceph命令的节点上以root身份设定cephadm可以读取keyring文件
setfacl -m u:cephadm:r /etc/ceph/ceph.client.admin.keyring
配置manager节点,启动mgr进程
ceph-deploy mgr create store01
在Ceph集群的各节点上以cephadm用户测试集群的状态
ceph health
ceph -s
向RADOS集群添加OSD
整理磁盘
ceph-deploy disk list {osd-server-name} …
ceph-deploy disk zap {osd-server-name} {disk-name}
【如果对应节点的设备有数据,需要以root身份执行ceph-volumn lvm zap --destroy {DEVICE}】
添加OSD
ceph-deploy osd create {node} --data {data-disk}
ceph-deploy osd list {node} …
ceph osd stat 或者 ceph osd {dump / ls}
移除OSD
ceph osd out {osd-num}
sudo systemctl stop ceph-osd@{osd-num}
ceph osd rm {osd-num}
上传/下载数据对象
ceph osd pool create {pool-name} [rule-num] {PG-num}
rados put {object-name} {obj-location} --pool={pool-name} // 或者使用-p 指定存储池
rados ls --pool = {pool-name}
ceph osd map {pool-name} {object} // 获取在存储池中数据对象的具体位置信息
rados rm {object-name} --pool = {pool-name}
ceph osd pool rm {pool-name} {pooll-name} --yes-i-really-really-mean-it // 需要先启用存储池删除配置
扩展Ceph集群
扩展Monitor节点
ceph-deploy mon add {ceph-nodes} // 最好是奇数个节点
ceph quorum_status --format json-query
扩展Manager节点
ceph-deploy mgr create {ceph-nodes}
ceph -s
访问接口
Ceph块设备接口
创建存储池并启用rbd功能进行初始化
ceph osd pool create {pool-name} {PG-num}
ceph osd pool application enable {pool-name} rbd
rbd pool init -p {pool-name}
按需创建映像,将映像文件作为块设备使用
rbd create {image-name} --size {size} --pool {pool-name}
rbd info // 获取相关信息