Ceph集群部署
环境准备
系统: CentOS7
配置: 1核1G内存,每台node角色的机器至少挂载1块为osd准备的空闲盘
IP hostname role service
192.168.10.11 admin admin, mon ceph-mon@admin.service
192.168.10.12 node1 osd,mds ceph-osd@0.service
192.168.10.13 node2 osd,mds ceph-osd@1.service
192.168.10.14 node3 osd,mds ceph-osd@2.service ceph-mds@osd3
所有机器关闭防火墙, selinux
集群配置好时间同步
所有节点做好互相解析
保证所有节点都能上网
配置过程
- 在node节点上准备osd
[root@node1 ~]# mkfs.xfs /dev/sdb
[root@node1 ~]# mkdir /mnt/osd1
[root@node1 ~]# mount /dev/sdb /mnt/osd1/
[root@node2 ~]# mkfs.xfs /dev/sdb
[root@node2 ~]# mkdir /mnt/osd2
[root@node2 ~]# mount /dev/sdb /mnt/osd2/
[root@node3 ~]# mkfs.xfs /dev/sdb
[root@node3 ~]# mkdir /mnt/osd3
[root@node3 ~]# mount /dev/sdb /mnt/osd3/
- 在管理节点上配置对其他节点免密登录
[root@server-27 ~]# ssh-keygen
[root@server-27 ~]# ssh-copy-id osd1
[root@server-27 ~]# ssh-copy-id osd2
[root@server-27 ~]# ssh-copy-id osd3
-
在管理节点上安装ceph部署工具ceph-deploy
3.1 配置yum源(所有节点), 因种种原因, 官方源速度很慢, 甚至不能访问, 我们在此配置阿里的镜像源
[root@admin ~]# vim /etc/yum.repos.d/ceph.repo
[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
enabled=1
gpgcheck=0
type=rpm-md
priority=1
[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
enabled=1
gpgcheck=0
type=rpm-md
priority=1
[Ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/
enabled=1
gpgcheck=0
type=rpm-md
priority=1
[Ceph-aarch64]
name=Ceph aarch64 packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-jewel/el7/aarch64/
enabled=1
gpgcheck=0
type=rpm-md
[root@admin ~]# scp /etc/yum.repos.d/ceph.repo node1:/etc/yum.repos.d/
[root@admin ~]# scp /etc/yum.repos.d/ceph.repo node2:/etc/yum.repos.d/
[root@admin ~]# scp /etc/yum.repos.d/ceph.repo node3:/etc/yum.repos.d/
3.2 安装ceph-deploy(仅管理节点)
[root@admin ~]# yum install -y ceph-deploy
- 创建monitor服务(仅管理节点)
[root@admin ~]# mkdir /etc/ceph
[root@admin ~]# cd /etc/ceph
[root@admin ceph]# ceph-deploy new admin # mon安装在admin节点上,admin为主机名
[root@admin ceph]# ls # 生成Ceph配置文件、一个monitor密钥环和一个日志文件
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
- 查看配置文件
[root@admin ceph]# vim ceph.conf
[global]
fsid = ff9b5a73-dab8-4d53-ac77-8378efd11502
mon_initial_members = admin
mon_host = 192.168.10.11
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd_pool_default_size = 2 # 配置文件的默认副本数从3改成2,这样只有两个osd也能达到active+clean状态
- 在所有节点安装ceph(在管理节点操作) ********
[root@admin ceph]# ceph-deploy install admin node{1..3}
### 这一步会自动在指定的所有节点上安装epel源及ceph源,然后安装 ceph ###
### 因国内网络原因,自动安装一般会出错,我们可以手动配置上述源并安装 ceph ###
# ceph -v # 安装完成后, 在所有节点上执行, 看看版本是否正确
ceph version 10.2.11 (e4b061b47f07f583c92a050d9e84b1813a35671e)
- 配置初始 monitor(s)、并收集所有密钥(仅管理节点)
[root@admin ceph]# ceph-deploy mon create-initial
[root@admin ceph]# ls
ceph.bootstrap-mds.keyring ceph.bootstrap-rgw.keyring ceph-deploy-ceph.log
ceph.bootstrap-mgr.keyring ceph.client.admin.keyring ceph.mon.keyring
ceph.bootstrap-osd.keyring ceph.conf rbdmap
-
激活第1步中的OSD
8.1 准备OSD(管理节点操作)
[root@admin ceph]# ceph-deploy osd prepare node1:/mnt/osd1
node2:/mnt/osd2 node3:/mnt/osd3
8.2 修改OSD属主属组(所有OSD节点)
[root@node1 ceph]# chown -R ceph.ceph /mnt/osd1
[root@node2 ceph]# chown -R ceph.ceph /mnt/osd2
[root@node3 ceph]# chown -R ceph.ceph /mnt/osd3
8.3 激活OSD(管理节点操作)
[root@admin ceph]# ceph-deploy osd activate node1:/mnt/osd1 node2:/mnt/osd2 node3:/mnt/osd3
========================================
ceph-deploy在osd上的操作(不需要手动操作):
/usr/bin/systemctl start ceph-osd@0
/usr/bin/systemctl start ceph-osd@1
/usr/bin/systemctl start ceph-osd@2
========================================
8.4 查看状态(管理节点操作)
[root@admin ceph]# ceph-deploy osd list node{1..3} #观察是不是所有的OSD状态都OK
-
统一配置
###用 ceph-deploy 把配置文件和 admin 密钥拷贝到管理节点和 Ceph 节点
###这样每次执行 Ceph 命令行时就无需指定 monitor 地址和
ceph.client.admin.keyring 了
[root@admin ceph]# ceph-deploy admin node1 node2 node3 # admin为命令
修改ceph.client.admin.keyring权限
[root@admin ceph]# chmod +r ceph.client.admin.keyring
- 检查集群的健康状况
[root@admin ceph]# ceph health
HEALTH_OK
至此, 基本完成了ceph集群的部署
Ceph 块设备
Ceph 块设备靠无限伸缩性提供了高性能,如向内核模块、或向 abbr:KVM (kernel virtual machines) (如 Qemu 、 OpenStack 和 CloudStack 等云计算系统通过 libvirt 和 Qemu 可与 Ceph 块设备集成)。你可以用同一个集群同时运行 Ceph RADOS 网关、 Ceph FS 文件系统、和 Ceph 块设备。
- 要使用 Ceph 块设备,你必须有一个在运行的 Ceph 集群
要使用 Ceph 块设备命令,你必须有对应集群的访问权限
- 在管理节点上将 配置文件和密钥环拷贝到client
[root@admin ceph]# ceph-deploy admin client
- 修改密钥文件的权限
[root@client ceph]# chmod +r ceph.client.admin.keyring
使用块存储
在 client 节点上操作
3. 创建存储池
语法: ceph osd pool create {pool-name} {pg-num}
参数说明:
pool-name : 存储池名称,必须唯一。
pg-num : 存储池拥有的归置组总数。
下面是pg-num几个常用的值:
• 少于 5 个 OSD 时可把 pg_num 设置为 128
• OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512
• OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096
• OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值
• 自己计算 pg_num 取值时可借助 pgcalc 工具. 随着OSD数量的增加,正确的 pg_num 取值变得更加重要,
因为它显著地影响着集群的行为、以及出错时的数据持久性(即灾难事件导致数据丢失的概率)。
[root@client ceph]# ceph osd pool create mypool 128
- 创建块设备映像 {pool-name}/{image-name}
指定 features: layering,否则 map 可能出错
也可以将 rbd_default_features = 1 添加到 /etc/ceph/ceph.conf 的 [global]
如果创建映像时不指定存储池,它将使用默认的 rbd 存储池
[root@client ceph]# rbd create --size 1024 mypool/myimage --image-feature layering
[root@client ceph]# rbd ls mypool
myimage
[root@client ceph]# rbd info mypool/myimage
rbd image ‘myimage’:
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.5e446b8b4567
format: 2
features: layering
flags:
3. 映射块设备 {pool-name}/{image-name} 必须在client上操作
[root@client ceph]# rbd map mypool/myimage –id admin
/dev/rbd0 # 注:rbd0 说明这是映射的第一个块设备
[root@client ceph]# rbd showmapped
id pool image snap device
0 mypool myimage – /dev/rbd0
[root@client ceph]# ll /dev/rbd/mypool/
lrwxrwxrwx 1 root root 10 Nov 6 10:04 myimage -> …/…/rbd0
4. 使用块设备 /dev/rbd/{pool-name}/{image-name} 创建文件系统
[root@client ceph]# mkfs.xfs /dev/rbd/mypool/myimage
5. 挂载
[root@client ceph]# mkdir /mnt/ceph-block
[root@client ceph]# mount /dev/rbd/mypool/myimage /mnt/ceph-block/
在线扩容
块设备扩容
[root@client ceph]# rbd resize --size 2048 mypool/myimage # 调整块设备大小为2G
Resizing image: 100% complete...done.
文件系统级别在线扩容
[root@client ceph]# xfs_growfs /mnt/ceph-block/
删除块设备
[root@client ~]# umount /mnt/ceph-block/
[root@client ~]# rbd unmap /dev/rbd/mypool/myimage #
解除设备映射 [root@client ~]# rbd showmapped
再次查看,发现/dev/rbd0已经没有了 [root@client ~]# rbd rm mypool/myimage # 删除块设备 Removing image: 100% complete…done.
总结使用块设备的步骤:
1.客户端安装ceph,将密钥环文件传到客户端
2.创建存储池
3.在存储池中创建镜像 ——– 类似于创建一块磁盘
4.rbd映射 ——– 相当于将磁盘插入本机,这一步及后面的步骤一定要在客户端操作
5.格式化
6.挂载
在线扩容:
1.设备级别扩容
2.文件系统级别扩容
ceph文件系统
部署MDS服务
[root@admin ceph]# ceph-deploy mds create node{1…3}
查看状态
[root@admin ceph]# ceph mds stat
e4:, 3 up:standby
查看集群状态
创建ceph文件系统
官方文档: http://docs.ceph.org.cn/cephfs/
一个 Ceph 文件系统需要至少两个 RADOS 存储池,一个用于数据、一个用于元数据。配置这些存储池时需考虑:
• 为元数据存储池设置较高的副本水平,因为此存储池丢失任何数据都会导致整个文件系统失效。
• 为元数据存储池分配低延时存储器(像 SSD ),因为它会直接影响到客户端的操作延时。
创建存储池
[root@admin ceph]# ceph osd pool create cephfs_data 128
pool ‘cephfs_data’ created
[root@admin ceph]# ceph osd pool create cephfs_metadata 128
pool ‘cephfs_metadata’ created
查看存储池
[root@admin ceph]# ceph osd lspools
0 rbd,1 cephfs_data,2 cephfs_metadata, #系统默认有一个名称为 rbd
的存储池
————————————————————————————————————————– 关于存储池: 官方文档: http://docs.ceph.org.cn/rados/operations/pools/
创建文件系统
创建前
[root@admin ceph]# ceph fs ls
No filesystems enabled
创建文件系统
语法: ceph fs new <fs_name>
[root@admin ceph]# ceph fs new cephfs cephfs_metadata cephfs_data
查看
挂载文件系统
有两种不同挂载方式
A. 内核驱动挂载Ceph文件系统
- 安装ceph
- 创建挂载点
[root@client ceph]# mkdir /mnt/cephfs
3. 创建密钥文件
3.1 在admin节点查看密钥内容
[root@admin ceph]# cat ceph.client.admin.keyring
[client.admin]
key = AQBLR7xdckUIFhAA2G05Hidq5aoSse0nxGNdJQ==
3.2 在client节点创建密钥文件
[root@client ceph]# vim /etc/ceph/admin.secret #复制上面文件中的内容,注意不是全部内容
AQBLR7xdckUIFhAA2G05Hidq5aoSse0nxGNdJQ==
-
挂载
[root@client ceph]# mount.ceph 192.168.10.11:6789:/ /mnt/cephfs/ -o name=admin,secretfile=/etc/ceph/admin.secret
B. 用户空间文件系统(FUSE)
先卸载前面挂载的 -
安装ceph-fuse
[root@client ~]# yum install -y ceph-fuse
-
从admin节点拷贝密钥环(ceph.client.admin.keyring文件)
[root@admin ceph]# scp ceph.client.admin.keyring 192.168.10.15:/etc/ceph/ -
挂载
[root@client ~]# ceph-fuse -m 192.168.10.11:6789 /mnt/cephfs/
——————————————————————————— 卸载: fusermount -u
-
注: 从管理节点而非服务器节点挂载 Ceph FS 文件系统
为了安全, 请将密钥文件设置合适的权限
ceph对象存储
官方文档: http://docs.ceph.org.cn/rados/operations/pools/
如果你开始部署集群时没有创建存储池, Ceph 会用默认存储池存数据。存储池提供的功能:
• 自恢复力: 你可以设置在不丢数据的前提下允许多少 OSD 失效,对多副本存储池来说,此值是一对象应达到的副本数。典型配置存储一个对象和它的一个副本(即 size = 2 ),但你可以更改副本数;对纠删编码的存储池来说,此值是编码块数(即纠删码配置里的 m=2 )。
• 归置组: 你可以设置一个存储池的归置组数量。典型配置给每个 OSD 分配大约 100 个归置组,这样,不用过多计算资源就能得到较优的均衡。配置了多个存储池时,要考虑到这些存储池和整个集群的归置组数量要合理。
• CRUSH 规则: 当你在存储池里存数据的时候,与此存储池相关联的 CRUSH 规则集可控制 CRUSH 算法,并以此操纵集群内对象及其副本的复制(或纠删码编码的存储池里的数据块)。你可以自定义存储池的 CRUSH 规则。
• 快照: 用 ceph osd pool mksnap 创建快照的时候,实际上创建了某一特定存储池的快照。
• 设置所有者: 你可以设置一个用户 ID 为一个存储池的所有者。
要把数据组织到存储池里,你可以列出、创建、删除存储池,也可以查看每个存储池的利用率
列出存储池
[guo@node1 ceph-cluster]$ rados lspools #默认情况下只有一个rbd存储池
rbd
[guo@node1 ceph-cluster]$ ceph osd lspools
0 rbd,
创建存储池
[guo@node1 ceph-cluster]$ ceph osd pool create data 128
pool ‘data’ created
[guo@node1 ceph-cluster]$ rados lspools
rbd
data
设置存储池配额
存储池配额可设置最大字节数或每存储池最大对象数
语法:
ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]
例:将data存储池设置只能存储10000个对象
[guo@node1 ceph-cluster]$ ceph osd pool set-quota data max_objects 10000
set-quota max_objects = 10000 for pool data
要取消配额,设置为0
重命名存储池 ceph osd pool rename {current-pool-name} {new-pool-name}
删除存储池 ceph osd pool delete {pool-name} [{pool-name} –yes-i-really-really-mean-it]
查看存储池统计信息 rados df
创建存储池快照 ceph osd pool mksnap {pool-name} {snap-name}
删除存储池快照 ceph osd pool rmsnap {pool-name} {snap-name}
调整存储池选项值 ceph osd pool set {pool-name} {key} {value}
获取存储池选项值 ceph osd pool get {pool-name} {key}
设置对象副本数 ceph osd pool set {poolname} size {num-replicas} #{num-replicas} 包括对象本身,默认为2
获取对象副本数 ceph osd dump | grep ‘replicated size’
查看对象 rados ls -p poolname
存储对象 rados put -p poolname
获取对象 rados get -p poolname
删除对象 rados rm -p poolname
复制对象 rados cp [target-obj] -p poolname
截断对象 rados truncate length -p poolname 把对象内容保留多少长度
例:
-
在管理端将配置文件和密钥环发送到客户端
[root@admin ~]# cd /etc/ceph/
[root@admin ceph]# ceph-deploy admin client client2 -
在任意节点创建存储池cephobj
[root@client2 ceph]# ceph osd pool create cephobj 128 -
在其中一个客户端存入一个对象到cephobj
[root@client2 ceph]# echo “this file upload by client2” > /tmp/a.txt
[root@client2 ceph]# rados put test-file /tmp/a.txt -p cephobj # 存储对象 -
在另外的客户端获取对象
[root@client ~]# rados ls -p cephobj
test-file
[root@client ~]# rados get test-file /opt/a.txt -p cephobj # 取出对象
[root@client ~]# cat /opt/a.txt
this file upload by client2