Ceph初步了解和ceph集群搭建测试
常用分布式文件系统
- Hadoop
- FastDFS
- Ceph
- GlusterFS
- Lustre(太老了)
Ceph概述
-
Ceph是一个分布式文件系统
-
具有高扩展、高可用(默认3副本存储数据 一个挂了还有两个)、高性能(分布式存储数据 并发存储和读取)的特点
-
Ceph可用提供PB级别的存储空间,同时基于计算的扁平寻址设计使得Ceph客户端可以直接和服务端的任意节点通信,从而避免因为存在访问热点而导致性能瓶颈
-
Ceph的主要目标是设计成基于POSIX的没有单点故障的分布式文件系统,使数据能容错和无缝的复制
-
Ceph是一个统一存储系统,即支持传统的块、文件存储协议,例如SAN和NAS;也支持对象存储协议,例如S3和Swift
Ceph块存储
块存储是存储区域网络中使用的一个数据存储类别
直接在本地分区格式化出数据
- 数据以块(block)的形式存储在卷里,卷会连接到节点上。这些块形成的卷会映射到操作系统中,并被文件系统层控制
- Ceph引入了一个新的RBD协议(Ceph块设备)。RBD为客户端提供了可靠、分布式、高性能的块存储(已经被Linux内核支持),还支持完整和增量式快照,精简的配置,写时复制式克隆以及全内存是缓存
典型设备
- 磁盘阵列
- 硬盘
优点
- 通过Raid与LVM等手段,对数据提供了保护
- 多块廉价的硬盘组合起来,提高容量
- 多块磁盘组合起来的逻辑盘,提升读写效率
缺点
- 采用SAN架构组网时,造价成本高
- 主机之间无法共享数据
使用场景
- docker容器、虚拟机磁盘存储分配
- 日志存储
- 文件存储
- …
Ceph文件系统存储
直接挂载来用 通过本地Linux内核的功能或者Ceph社区提供的ceph-fuse驱动
也可使用第三方开源程序:NFS的ganesha和SMB/CIFS的Samba
- Ceph文件系统(CephFS)是一个兼容POSIX的文件系统,利用Ceph存储集群来保存用户数据。Linux内核驱动程序支持CephFS
- CephFS将数据(block 存储实际内容数据)和元数据(inode 描述存储数据信息的数据)分开存储,为上层的应用程序提供较高的性能以及可靠性
- 在Ceph集群内部,Ceph文件系统库(libcephfs)运行在RADOS库(librados)之上,librados是Ceph存储集群协议,由文件、块和对象存储共用。
- 集群节点上最少要配置一个Ceph元数据服务器(MDS),客户端可以采用多种方式使用CephFS
典型设备
- FTP、NFS服务器
优点
- 造价低,随便一台机器就可以了
- 方便文件共享
缺点
- 读写速率低
- 传输速率慢
使用场景
- 日志存储
- 有目录结构的文件存储
- …
Ceph对象存储
- Ceph是一个分布式对象存储系统,通过它的对象网关(object gateway),也就是RADOS网关(radosgw)提供对象存储接口。RADOS网关利用librgw(RADOS网关库)和librados这些库,允许应用程序跟Ceph对象存储建立连接。Ceph通过RESTful API提供可访问且最稳定的多租户对象存储解决方案之一
- RADOS网关接口(RESTful API)满足以下特点
- 兼容Swift: 为OpenStack Swift API提供的对象存储功能
- 兼容S3: 为Amazon S3 API提供的对象存储功能
- 要访问Ceph的对象存储系统,也可以绕开RADOS网关层,librados软件库允许用户的应用程序通过C、C++、Java、Python、PHP直接访问Ceph对象存储
典型设备
- 内置大容量硬盘的分布式服务器(swift, s3)
优点
- 具备块存储的读写高速
- 具备文件存储的共享等特性
使用场景
- 图片存储
- 视频存储
- …
Ceph组件
- OSDs
- 存储设备(必要)
- Monitors
- 集群监控组件(必要 过半原则(Monitors要奇数台))
- RadosGateway(RGW)
- 对象存储网关
- MDSs
- 存放文件系统的元数据(对象存储和块存储方式不需要该组件)
- Client
- ceph客户端
- Object
- PG
- RADOS
- Libradio
- CRUSH
- RBD
- RGW
- CephFS
可以看看大佬写的这篇https://blog.csdn.net/mingongge/article/details/100788388
测试
前置准备
机子情况
主机名称 | IP地址 |
---|---|
client | 192.168.4.10/24 客户端 |
node1 | 192.168.4.5/24 存储节点服务器 |
node2 | 192.168.4.100/24 存储节点服务器 |
node3 | 192.168.4.200/24 存储节点服务器 |
除client外将Ceph光盘挂载到/myceph目录下 都有20+20G的额外硬盘
测试
#所有机子 将ceph光盘内容挂载到/ceph
mkdir /ceph
vim /etc/fstab
======================================
......
/dev/sr1 /ceph iso9660 defaults 0 0
=========================================
mount -a #测试
#node1
ssh-keygen -f /root/.ssh/id_rsa -N '' #生成秘钥
for i in client node1 node2 node3 #/etc/hosts配置过了 或者直接打ip 全部都发
>do
>ssh-copy-id $i #前面不加用户名@ 默认root@
>done
#随着一串密码输入 发送成功
#提示 主机名和/etc/hosts 里面一致
vim /etc/hosts
=======================
....
192.168.4.10 client
192.168.4.100 node2
192.168.4.200 node3
192.168.4.5 node1
===========================
for i in client node1 node2 node3 #测试环境都需要域名解析
>do
>scp /etc/hosts $i:/etc/
>done
vim /etc/yum.repos.d/ceph.repo #配置cephyum源 createrepo 使rpm包们生成repodata
===============================
[mon]
name=mon
baseurl=file:///myceph/MON
gpgcheck=0
[osd]
name=osd
baseurl=file:///myceph/OSD
gpgcheck=0
[tools]
name=tools
baseurl=file:///myceph/Tools
gpgcheck=0
=================================
for i in node1 node2 node3
>do
>scp /etc/yum.repos.d/ceph.repo $i:/etc/yum.repos.d/
>done
for i in node1 node2 node3
>do
>ssh $i "yum -y install ceph-mon ceph-osd ceph-mds ceph -radosgw"
>done
#到此完成三台节点机器的ceph yum源配置和安装
#给client主机配置NTP服务器
yum -y install chrony
vim /etc/chrony.conf
===========================
...
allow 192.168.4.0/24 #修改26行 运行192.168.4.0网段ip访问
local stratum 10 #修改29行
.....
===========================
systemctl restart chronyd #重启服务
#node1 node2 node3 #三个节点服务器都要和客户端同步时间 测试中方便同步 实际应连公共的NTP服务器 保持时间同步(时间差距过大ceph会报错 默认0.05s)
yum -y install chrony
vim /etc/chrony.conf
===========================
server 192.168.4.10 iburst #配置NTP服务器
============================
systemctl restart chronyd
chronyc sources -v #查看下是否成功
......
^* client 10 6 17 1 -1832ns[ -32us] +/- 161us
# ^*应该就成功了
#node1
yum -y install ceph-deploy #ceph-deploy脚本 帮忙配置ceph配置文件 启动服务的
#ceph-deploy --help ceph-deploy mon --help 来获取帮助
mkdir ceph-cluster
cd ceph-cluster/ #进入工作目录
ceph-deploy new node1 node2 node3 #通过ceph-deploy脚本创建ceph集群配置,在当前目录下生成ceph.conf 生成UUID 所以在配置集群之后不能再生成了(UUID唯一 发送出去了 你又重新生成 UUID自然就对不上了)
ceph-deploy mon create-initial #拷贝当前目录的配置文件到所有节点的/etc/ceph/目录并启动monitors服务(开机自启)
#节点Ip 已经通过上一步 ceph-deploy new xxx 写入到了ceph.conf配置文件中了
#特别提示 之前为什么要用node1发送密钥给节点服务器 就是为了ceph-deploy能够正常执行
#查看节点服务器服务情况
#node1
systemctl status ceph-mon@node1
#node2
systemctl status ceph-mon@node2
#node3
systemctl status ceph-mon@node3
#贴个node3的结果
● ceph-mon@node3.service - Ceph cluster monitor daemon
Loaded: loaded (/usr/lib/systemd/system/ceph-mon@.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2020-12-28 03:37:02 EST; 9min ago
Main PID: 11961 (ceph-mon)
CGroup: /system.slice/system-ceph\x2dmon.slice/ceph-mon@node3.service
└─11961 /usr/bin/ceph-mon -f --cluster ceph --id node3 --setuser ceph --setgroup ceph
Dec 28 03:37:02 node3 systemd[1]: Started Ceph cluster monitor daemon.
Dec 28 03:37:02 node3 systemd[1]: Starting Ceph cluster monitor daemon...
Dec 28 03:37:03 node3 ceph-mon[11961]: starting mon.node3 rank 1 at 192.168.4.200:6789/0 mon_data /var/lib/ceph/mon/ceph-node3 fsid 83f5c0eb-3a00-4b8...675b3368fd
Hint: Some lines were ellipsized, use -l to show in full.
#也可以使用start restart stopp status 启动重启关闭 但是30分钟只能启动3次超过会报错
#StartLimitInterval=30min StartLimitBurst=3
#上面两个参数决定了服务30分钟只能启3次 定义在/usr/lib/systemd/system/ceph-mon@.service里面
#修改了上面那个文件 需要执行systemctl daemon-reload重新加载配置
#node1 查看集群状态 也可以在node2 node3上查询
ceph -s
cluster 83f5c0eb-3a00-4b83-96ac-5c675b3368fd
health HEALTH_ERR #集群失败了HEALTH_ERR
64 pgs are stuck inactive for more than 300 seconds
64 pgs stuck inactive
no osds
monmap e1: 3 mons at {node1=192.168.4.5:6789/0,node2=192.168.4.100:6789/0,node3=192.168.4.200:6789/0}
election epoch 6, quorum 0,1,2 node1,node2,node3
osdmap e1: 0 osds: 0 up, 0 in
flags sortbitwise
pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0 objects
0 kB used, 0 kB / 0 kB avail #共享盘为0KB 没有东西共享
64 creating
#还缺少OSD提供的共享磁盘
#下面开始在node1 node2 node3创建OSD 前置准备添加的40G硬盘
#node1
ceph-deploy disk zap node1:sdb node1:sdc #初始化磁盘 将磁盘分区格式设置为GPT模式(这条命令没加 但是脚本里面默认是GPT)
ceph-deploy disk zap node2:sdb node2:sdc #可以在node1上执行 脚本通过ssh方式操作node2
ceph-deploy disk zap node3:sdb node3:sdc #同上 操作node3
#zap 清除参数
#上面完成分区表 现在开始分区 格式化磁盘 挂载磁盘,启动osd服务共享磁盘
ceph-deploy osd create node1:sdb node1:sdc node2:sdb node2:sdbc node3:sdb node3:sdc
df -Th #查看挂载情况
.....
/dev/sdb1 xfs 15G 35M 15G 1% /var/lib/ceph/osd/ceph-0
/dev/sdc1 xfs 15G 34M 15G 1% /var/lib/ceph/osd/ceph-1
#可以看见有15G被当成共享磁盘挂载了 因为5G(固定)被用来作为Journal日志缓存 剩余空间为数据盘
ceph -s
ceph osd tree #两种命令来查看情况 下面这个可以看清楚osd谁的
#一般可以查看到health HEALTH_OK 如果HEALTH_WARN可以等等再查 或者检查下NTP服务
总结
- 先用ceph安装光盘文件在节点服务器上(node1~3)安装ceph-mon ceph-osd ceph-mds ceph-radosgw 四个包 mon监控包 osd存储数据包 mds元数据服务包 radosgwRADOS网关包
- 因为ceph集群需要时间误差在0.05秒以内 所以配置了NTP服务
- 在node1中安装ceph-deploy工具 ceph-deploy脚本需要ssh执行 所以需要发送密钥给所有节点服务器
- ceph-deploy new 主机名… (域名需要和个节点主机名对应上 所以需要在/etc/hosts写上对应解析 并写每个节点服务器都要设置)来生成ceph.conf配置文件
- ceph-deploy mon create-initial 命令读取ceph.conf配置文件来获取所有节点信息 拷贝当前目录的ceph.conf到所有节点的/etc/ceph/目录下并启动mon服务 所以UUID就固定了(并且发送出去了) 再生成配置文件就会出错(节点之间对不上)
- ceph-deploy disk zap 主机名:磁盘名 命令来初始化清空磁盘数据 默认设置为GPT格式
- ceph-deploy osd create 主机名:磁盘名 命令来创建分区 格式化 挂载 启动osd服务共享磁盘
- df -Th 验证是否已经挂载共享磁盘 ceph -s 查看集群状态 ceph osd tree 查看osd分别情况