文章目录
- 一、存储简介
- 1、存储的分类
- 2、存储类型的分类
- 3、分布式存储介绍
- 二、GlusterFS
- 2.1 GlusterFS 集群
- 1、创建集群
- 2、准备存储目录
- 3、创建存储卷
- 4、启动存储卷
- 5、客户端挂载
- 6、卷的删除
- 2.2 GlusterFS 卷类型
- 1、Distributed
- 2、Replicated
- 3、Distributed Replicated
- 4、Dispersed
- 5、Distributed Dispersed
- 2.3 GlusterFS 扩容
- 1、存储卷扩容
- 2、存储节点扩容
- 三、Ceph
- 3.1 Ceph 架构
- 3.2 Ceph 集群
- 1、集群组件
- 2、服务器规划
- 3、设置主机名
- 4、配置本机域名解析
- 5、关闭防火墙与Selinux
- 6、配置 yum 源与 epel 源
- 7、安装基本依赖工具
- 8、配置时间同步
- 9、配置 Ceph 源
- 3.3 Ceph 集群部署
- 1、mon1 配置 ssh 免密
- 2、mon1 安装部署工具
- 3、集群安装 ceph
- 4、部署 Monitor
- 5、创建 Manager
- 6、创建 OSD
- 3.4 集群节点的扩容方法
- 3.5 创建 Ceph 文件存储
- 1、创建文件存储
- 2、客户端挂载文件存储
- 3、删除文件存储
- 3.6 创建 Ceph 块存储
- 1、创建块存储并使用
- 2、删除块存储方法
- 3.7 创建 Ceph 对象存储
- 1、新建网关实例
- 2、创建连接用户
- 3、S3 连接 ceph 对象网关
一、存储简介
1、存储的分类
缩写 | 存储分类 | 描述 |
DAS | 直连式存储 (direct access/attach storage) | 如:机箱里的硬盘,或通过接口直连到系统总线上的存储设备(如 U盘,移动硬盘) |
NAS | 网络附加存储(network attched storage) | 通过交换机,路由器连接起来;共享的是目录。如:nfs,samba,ftp |
SAN | 存储区域网络(storage area network) | 通过交换机,路由器连接起来的高速存储网络,共享的是块设备 |
DAS: 直接连接系统,不受网速限制,速度快;扩展容量有上限。
NAS 与 SAN: 通过网络设备连接的远程存储,速度受网络影响;但扩展方便,几乎无上限。
NAS 和 SAN 都是通过网络(通过了网络设备,如路由器,交换机等)的,但 NAS 共享的是应用层的目录,而 SAN 共享的是 /dev/sdb
或 /dev/sdc
这种块设备。
2、存储类型的分类
存储类型分类 | 描述 |
文件存储 | NAS 都属于这一类。简单来说就是可挂载后直接使用 |
块存储 | SAN 都属于这一类。简单来说就是类似 |
对象存储 | 使用 HTTP 协议,使用的可直接使用程序接口去访问,进行 get 下载与 put 上传 |
文件存储:类似一个大的目录,多个客户端都可以挂载过来使用。
- 优点:利于数据共享
- 缺点:速度较慢
块存储:类似一个 block 设备,客户端可以格式化,挂载并使用,和用一个硬盘一样。
- 优点:和本地硬盘一样,直接使用,速度较快
- 缺点:数据不共享
对象存储:一个对象可以看成一个文件,综合了文件存储和块存储的优点。
- 优点:速度快,数据共享
- 缺点:成本高,不兼容现有的模式
3、分布式存储介绍
分布式存储可以看作拥有多台存储服务器连接起来的存储导出端。把这多台存储服务器的存储合起来做成一个整体再通过网络进行远程共享,共享的方式有目录(文件存储),块设备(块存储),对象网关或者说一个程序接口(对象存储)。
常见的分布式存储开源软件有:GlusterFS,Ceph,HDFS,MooseFS,FastDFS。
分布式存储一般都有以下几个优点:
- 扩容方便,轻松达到 PB 级别或以上
- 提升读写性能(LB)或数据高可用(HA)
- 避免单个节点故障导致整个架构问题
- 价格相对便宜,大量的廉价设备就可以组成
二、GlusterFS
- 介绍
GlusterFS 是一个免费、开源、可扩展的网络文件系统(它属于文件存储类型)。
- 安装
IP | 主机名 | 版本 | 硬盘 |
192.168.1.4 | client1.server | - | |
192.168.1.5 | client2.server | - | |
192.168.1.6 | node1.server | 9.4 | sdb 10G |
192.168.1.7 | node2.server | 9.4 | sdb 10G |
192.168.1.8 | node3.server | 9.4 | sdb 10G |
192.168.1.9 | node4.server | 9.4 | sdb 10G |
- 环境初始化脚本
服务器初始化脚本,所有服务器执行,只需修改主机名即可
vi init.sh
内容
# 主机名
hostname='client1.server'
# 初始化
hostnamectl set-hostname $hostname
systemctl stop firewalld.service && systemctl disable firewalld.service
setenforce 0 && sed -i 's/enforcing/disabled/g' /etc/selinux/config
mv /etc/yum.repos.d/CentOS-* /tmp/
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all && yum makecache
# 安装依赖
yum install -y vim wget net-tools ntp bash-completion
source /usr/share/bash-completion/bash_completion
# 配置时间同步
cat > /etc/ntp.conf << EOF
driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
server 0.cn.pool.ntp.org
server 1.cn.pool.ntp.org
server 2.cn.pool.ntp.org
server 3.cn.pool.ntp.org
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
EOF
systemctl stop chronyd && systemctl disable chronyd
systemctl start ntpd && systemctl enable ntpd
ntpdate -u 0.cn.pool.ntp.org
hwclock --systohc
source init.sh
- 安装 GluterFS
这里只需要四台 node 主机安装即可
yum install -y centos-release-gluster
yum install -y glusterfs-server
启动并设置开机自启
systemctl start glusterd && systemctl enable --now glusterd
查看版本
[root@192 ~]# glusterfs -V
glusterfs 9.4
2.1 GlusterFS 集群
1、创建集群
GlusterFS 属于无中心节点的分布式结构,即所有节点又要管理集群又要工作,由于该特性,所以将来集群中的每一个节点都可以是管理节点,即对整个集群进行操作。使用命令将所有 node 服务器建立连接,成为一个集群。
随便找一台 node 节点连接其他三台主机
[root@node1 ~]# gluster peer probe 192.168.1.7
peer probe: success
[root@node1 ~]# gluster peer probe 192.168.1.8
peer probe: success
[root@node1 ~]# gluster peer probe 192.168.1.9
peer probe: success
然后在所有存储上都可以使用下面命令来验证检查
[root@node1 ~]# gluster peer status
Number of Peers: 3
Hostname: 192.168.1.7
Uuid: 46f490b9-aaaf-4e64-b342-70e70ef1590a
State: Peer in Cluster (Connected)
Hostname: 192.168.1.8
Uuid: 3dbd57a1-7e98-4ca7-a7c5-6ac2b1dd6d2d
State: Peer in Cluster (Connected)
Hostname: 192.168.1.9
Uuid: 974774b6-ec69-46ba-a537-80c8fa320177
State: Peer in Cluster (Connected)
2、准备存储目录
查看当前存储设备
[root@node1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 10G 0 disk
sr0 11:0 1 4.4G 0 rom
将每个 node 节点服务器的 sdb
挂载到 /data/
目录
# 格式化 /dev/sdb 为 ext4 格式
mkfs.ext4 /dev/sdb
# 创建目录
mkdir /data
# 挂载到 /mnt 目录
mount /dev/sdb /data
# 设置开机自动挂载
echo "/dev/sdb /data ext4 defaults 0 0" >> /etc/fstab
3、创建存储卷
每个节点创建一个卷目录
mkdir /data/gv01
创建一个名为 gv_01
的复制卷
# replica 4 表示是在 4 台上做复制模式(类似raid1)
[root@node1 ~]# gluster volume create gv_01 \
replica 4 \
192.168.1.6:/data/gv01 \
192.168.1.7:/data/gv01 \
192.168.1.8:/data/gv01 \
192.168.1.9:/data/gv01
volume create: gv_01: success: please start the volume to access data
查看创建的卷
[root@node1 ~]# gluster volume info gv_01
Volume Name: gv_01
Type: Replicate
Volume ID: 823c4bf4-e8d5-487e-84d4-e05a97cab9c3
Status: Created
Snapshot Count: 0
Number of Bricks: 1 x 4 = 4
Transport-type: tcp
Bricks:
Brick1: 192.168.1.6:/data/gv01
Brick2: 192.168.1.7:/data/gv01
Brick3: 192.168.1.8:/data/gv01
Brick4: 192.168.1.9:/data/gv01
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
4、启动存储卷
[root@node1 ~]# gluster volume start gv_01
volume start: gv_01: success
以上步骤 GlusterFS 集群搭建完毕,并创建了一个类似 Raid1 模式的存储卷
5、客户端挂载
客户端上操作,安装客户端软件
yum install -y glusterfs glusterfs-fuse
挂载到 /test0
目录
[root@client1 ~]# mkdir /test0
[root@client1 ~]# mount -t glusterfs 192.168.1.6:gv_01 /test0/
[root@client1 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 898M 0 898M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.6M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 1.8G 16G 11% /
/dev/sda1 xfs 1014M 151M 864M 15% /boot
tmpfs tmpfs 182M 0 182M 0% /run/user/0
192.168.0.13:gv_01 fuse.glusterfs 9.8G 137M 9.2G 2% /test0
这里 client1 是挂载 node1,也可以挂载 node2,node3,node4 任意一个。
client2 也可以挂载,而且他们文件共享,同步写入,同步读取。
replica 卷测试
在客户端使用 dd 命令往挂载目录里写文件,然后查看在 node 节点上的分布情况
[root@client1 ~]# dd if=/dev/zero of=/test0/file1 bs=1M count=100
测试后会发现每个节点都会有一个 file1 文件,与 Raid1 存储相同。
6、卷的删除
停止 gv_01 并删除
[root@node1 ~]# gluster volume stop gv_01
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: gv_01: success
[root@node1 ~]# gluster volume delete gv_01
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: gv_01: success
2.2 GlusterFS 卷类型
卷模式 | 描述 |
Distributed | 分布式卷 |
Replicated | 复制卷,类似raid1 |
Distributed Replicated | 分布式复制卷 |
Dispersed | 纠删卷,类似 raid5,raid6 |
Distributed Dispersed | 分布式纠删卷 |
1、Distributed
文件随机地分布在卷中的各个单元上。
注意:分布式卷中的磁盘/服务器故障可能导致严重的数据丢失,因为目录内容是随机分布在卷中的各个单元上的。
创建命令,不指定任何类型,默认就是 Distributed 模式卷
mkdir -p /data/distributed
gluster volume create gv1 \
192.168.1.6:/data/distributed \
192.168.1.7:/data/distributed \
192.168.1.8:/data/distributed \
192.168.1.9:/data/distributed
gluster volume start gv1
[root@node1 ~]# gluster volume info gv1
Volume Name: gv1
Type: Distribute
Volume ID: be55efa8-90be-45bf-8b9b-336d091e76ff
Status: Started
Snapshot Count: 0
Number of Bricks: 4
Transport-type: tcp
Bricks:
Brick1: 192.168.1.6:/data/distributed
Brick2: 192.168.1.7:/data/distributed
Brick3: 192.168.1.8:/data/distributed
Brick4: 192.168.1.9:/data/distributed
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
2、Replicated
复制卷在集群中的多个单元之间创建文件副本。
replica 4 表示是在 4 台上做复制模式(类似raid1)
mkdir -p /data/replicated
gluster volume create gv2 \
replica 4 \
192.168.1.6:/data/replicated \
192.168.1.7:/data/replicated \
192.168.1.8:/data/replicated \
192.168.1.9:/data/replicated
gluster volume start gv2
[root@node1 ~]# gluster volume info gv2
Volume Name: gv2
Type: Replicate
Volume ID: 06c328b6-812a-4fec-ab66-831358ecd5cb
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 4 = 4
Transport-type: tcp
Bricks:
Brick1: 192.168.1.6:/data/replicated
Brick2: 192.168.1.7:/data/replicated
Brick3: 192.168.1.8:/data/replicated
Brick4: 192.168.1.9:/data/replicated
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
3、Distributed Replicated
将文件分发到复制卷上。结合了 Distributed 与 Replicated 的优点,可以扩容,也有HA特性。
创建一个具有双向镜像的四节点分布(复制)卷
mkdir -p /data/distributed_replicated
gluster volume create gv3 \
replica 2 \
192.168.1.6:/data/distributed_replicated \
192.168.1.7:/data/distributed_replicated \
192.168.1.8:/data/distributed_replicated \
192.168.1.9:/data/distributed_replicated
如果出现
Replica 2 volumes are prone to split-brain. Use Arbiter or Replica 3 to avoid this.
应该是新版本防止脑裂,推荐使用 3 的倍数组
gluster volume start gv3
[root@node1 ~]# gluster volume info gv3
Volume Name: gv3
Type: Distributed-Replicate
Volume ID: 47f437cf-05d9-4a00-9531-94888ddaf120
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: 192.168.1.6:/data/distributed_replicated
Brick2: 192.168.1.7:/data/distributed_replicated
Brick3: 192.168.1.8:/data/distributed_replicated
Brick4: 192.168.1.9:/data/distributed_replicated
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
4、Dispersed
分散卷是 v3.6 版本后发布的一种卷模式,冗余了块校验盘,类似于 raid5/6
mkdir -p /data/dispersed
gluster volume create gv4 \
disperse 4 \
192.168.1.6:/data/dispersed \
192.168.1.7:/data/dispersed \
192.168.1.8:/data/dispersed \
192.168.1.9:/data/dispersed
gluster volume start gv4
[root@node1 ~]# gluster volume info gv4
Volume Name: gv4
Type: Disperse
Volume ID: 8a42dc5e-8bd4-4f88-a4a4-6a779584d40f
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x (3 + 1) = 4
Transport-type: tcp
Bricks:
Brick1: 192.168.1.6:/data/dispersed
Brick2: 192.168.1.7:/data/dispersed
Brick3: 192.168.1.8:/data/dispersed
Brick4: 192.168.1.9:/data/dispersed
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
5、Distributed Dispersed
分布式分散卷与分布式复制卷是等价的,但是分散的分散卷取代了复制卷。
mkdir -p /data/distributed_dispersed_1
mkdir -p /data/distributed_dispersed_2
gluster volume create gv5 \
disperse 3 \
192.168.1.6:/data/distributed_dispersed_1 \
192.168.1.7:/data/distributed_dispersed_1 \
192.168.1.8:/data/distributed_dispersed_1 \
192.168.1.6:/data/distributed_dispersed_2 \
192.168.1.7:/data/distributed_dispersed_2 \
192.168.1.8:/data/distributed_dispersed_2
gluster volume start gv5
[root@node1 ~]# gluster volume info gv5
Volume Name: gv5
Type: Distributed-Disperse
Volume ID: 6dd43b6e-8dfb-4872-b2cf-dd6369a85c5c
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x (2 + 1) = 6
Transport-type: tcp
Bricks:
Brick1: 192.168.1.6:/data/distributed_dispersed_1
Brick2: 192.168.1.7:/data/distributed_dispersed_1
Brick3: 192.168.1.8:/data/distributed_dispersed_1
Brick4: 192.168.1.6:/data/distributed_dispersed_2
Brick5: 192.168.1.7:/data/distributed_dispersed_2
Brick6: 192.168.1.8:/data/distributed_dispersed_2
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
2.3 GlusterFS 扩容
1、存储卷扩容
给 gv1 添加一个存储单元
gluster volume add-brick gv1 192.168.1.6:/data/add
[root@node1 ~]# gluster volume info gv1
Volume Name: gv1
Type: Distribute
Volume ID: be55efa8-90be-45bf-8b9b-336d091e76ff
Status: Started
Snapshot Count: 0
Number of Bricks: 5
Transport-type: tcp
Bricks:
Brick1: 192.168.1.6:/data/distributed
Brick2: 192.168.1.7:/data/distributed
Brick3: 192.168.1.8:/data/distributed
Brick4: 192.168.1.9:/data/distributed
Brick5: 192.168.1.6:/data/add
Options Reconfigured:
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
2、存储节点扩容
直接命令添加安装了 gluster.server 的主机
[root@node1 ~]# gluster peer probe 192.168.1.5
peer probe: success
[root@node1 ~]# gluster pool list
UUID Hostname State
46f490b9-aaaf-4e64-b342-70e70ef1590a 192.168.1.7 Connected
3dbd57a1-7e98-4ca7-a7c5-6ac2b1dd6d2d 192.168.1.8 Connected
974774b6-ec69-46ba-a537-80c8fa320177 192.168.1.9 Connected
8eb7690c-6632-43f1-bab8-eca4455985d3 192.168.1.5 Connected
eca057e8-44a9-435a-9d57-872d02e1ccdf localhost Connected
三、Ceph
Ceph 是一个能提供文件存储(File system)、块存储(Block storage)、和对象存储(Object storage) 的分布式存储系统。它提供了一个可无限伸缩的 Ceph 存储集群。官方自称:"The Future of Storage "。
官方网站:https://ceph.com 中文文档:http://docs.ceph.org.cn/ 安装文档:https://docs.ceph.com/en/latest
3.1 Ceph 架构
RADOS:Ceph 的高可靠,高可拓展,高性能,高自动化都是由这一层来提供的,用户数据的存储最终也都是通过这一层来进行存储的。
可以说 RADOS 就是 Ceph 底层原生的数据引擎,但实际应用时却不直接使用它,而是分为如下 4 种方式来使用:
- LIBRADOS 是一个库,它允许应用程序通过访问该库来与 RADOS 系统进行交互,支持多种编程语言。如 Java,PHP,Python,C,C++等。
- CEPH FS 通过 Linux 内核客户端和 FUSE 来提供文件系统。(文件存储)
- RBD 通过 Linux 内核客户端和 QEMU/KVM 驱动来提供一个分布式的块设备。(块存储)
- RADOSGW 是一套基于当前流行的 RESTFUL 协议的网关,并且兼容 S3 和 Swift。(对象存储)
3.2 Ceph 集群
1、集群组件
Ceph 将数据作为对象存储在逻辑存储池中。使用 CRUSH 算法,Ceph 计算哪个 PG(Placement group)应该包含对象,并进一步计算哪一个 Ceph OSD 守护进程应该存储 PG。CRUSH 算法使 Ceph 存储集群能够进行伸缩、重新平衡和动态恢复。
- OSDs
Ceph OSD(Object Storage Daemon) 功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他 OSD 守护进程的心跳来向 Ceph Monitors 提供一些监控信息。通常至少需要 3 个 Ceph OSD 以实现冗余和高可用性。
- Monitors
Ceph Monitor 是一个监视器,监视 Ceph 集群状态和维护集群中的各种关系,包括 Monitor 映射、 Manager 映射、 OSD 映射、 MDS 映射和 CRUSH 映射,Monitor 还负责管理守护进程和客户端之间的身份验证。通常情况下,维持集群高可用性至少需要 3 个 Monitor 节点。
- Managers
Ceph Manager 负责检测 Ceph 集群的当前状态,包括存储利用率、当前性能和系统负载。Ceph Manager 守护进程还托管基于 python 的模块,以管理和展示 Ceph 集群信息,包括基于 web 的 Ceph Dashboard 和 REST API。通常至少需要 2 个 Manager 实现高可用。
- MDSs
MDS( Metadata Server)为 Ceph 文件系统存储元数据。Ceph MDS 允许 POSIX 文件系统用户执行基本命令(如 ls、 find 等) ,而不会给 Ceph 存储集群带来巨大的负担。
2、服务器规划
- 按照官方推荐的基本高可用架构:3 Monitor、2 Manager、3 OSD,配置不够的可将 Monitor 和 Manager 放在一起
- 官方推荐的
Cephadm
(基于容器,Octopus 版本后支持)Rook
(基于Kubernetes,Nautilus 版本后支持)两种部署方式,虽然部署简单,但是要在不利于学习,所以本文使用ceph-deploy
方式部署- 注意:
ceph-deploy
工具并没有在Nautilus
之后的版本中测试过,而且最新的 RHEL8, CentOS 8 等也没有进行测试,所以本文使用Nautilus 14.2.22
版本、CentOS 7.9
系统。ceph-deploy
方式部署文档:https://docs.ceph.com/projects/ceph-deploy/en/latest
主机名 | IP | 角色 | 硬盘 |
client | 192.168.1.3 | ceph-comon | - |
mon1 | 192.168.1.4 | ceph-mon、cephadm | - |
mon2 | 192.168.1.5 | ceph-mon、ceph-mgr | - |
mon3 | 192.168.1.6 | ceph-mon、ceph-mgr | - |
node1 | 192.168.1.7 | ceph-osd | sdb 20G |
node2 | 192.168.1.8 | ceph-osd | sdb 20G |
node3 | 192.168.1.9 | ceph-osd | sdb 20G |
以下步骤 3 ~ 9 为主机初始化,所有节点都要进行操作
3、设置主机名
# client
hostnamectl set-hostname client;su
# mon1
hostnamectl set-hostname mon1;su
# mon2
hostnamectl set-hostname mon2;su
# mon3
hostnamectl set-hostname mon3;su
# node1
hostnamectl set-hostname node1;su
# node2
hostnamectl set-hostname node2;su
# node3
hostnamectl set-hostname node3;su
4、配置本机域名解析
cat >> /etc/hosts << EOF
192.168.1.3 client
192.168.1.4 mon1
192.168.1.5 mon2
192.168.1.6 mon3
192.168.1.7 node1
192.168.1.8 node2
192.168.1.9 node3
EOF
5、关闭防火墙与Selinux
systemctl stop firewalld.service && systemctl disable firewalld.service
setenforce 0 && sed -i 's/enforcing/disabled/g' /etc/selinux/config
6、配置 yum 源与 epel 源
mv /etc/yum.repos.d/CentOS-* /tmp/ && \
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && \
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo && \
yum clean all && yum makecache
7、安装基本依赖工具
yum install -y vim wget net-tools ntp bash-completion python2-pip* && \
source /usr/share/bash-completion/bash_completion
8、配置时间同步
配置 ntp 国内时钟源
cat > /etc/ntp.conf << EOF
driftfile /var/lib/ntp/drift
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
server 0.cn.pool.ntp.org
server 1.cn.pool.ntp.org
server 2.cn.pool.ntp.org
server 3.cn.pool.ntp.org
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
EOF
启动时间同步
systemctl stop chronyd && systemctl disable chronyd && \
systemctl start ntpd && systemctl enable ntpd && \
ntpdate -u 0.cn.pool.ntp.org && \
hwclock --systohc
9、配置 Ceph 源
本文使用阿里云 ceph 源,nautilus 版本
cat >> /etc/yum.repos.d/ceph.repo << EOF
[ceph]
name=ceph
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/x86_64/
enabled=1
gpgcheck=0
priority=1
[ceph-noarch]
name=cephnoarch
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch/
enabled=1
gpgcheck=0
priority=1
[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMS/
enabled=1
gpgcheck=0
priority=1
EOF
3.3 Ceph 集群部署
1、mon1 配置 ssh 免密
ceph-deploy
必须作为具有无密码、sudo 特权的用户登录到 Ceph 各个节点
以 mon1 为 ceph-deploy 部署配置节点,配置 ssh 免密,要求 ssh 其他节点都要免密码
# 生成密钥
[root@mon1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:0pKkCx+y0A3YnXFP3NjkfmXI6txJVJA4i+82MkZRJ44 root@mon1
The key's randomart image is:
+---[RSA 2048]----+
| . ...=...o. |
| o . + oo.B.oo |
|. o o . .=.=+ o |
| . o o oE.oo o |
|. + + + Soo o |
| . = o o.o.+ . |
| . o . .o o |
| + + |
| . + . |
+----[SHA256]-----+
密钥发送到其他节点
[root@mon1 ~]# for i in client mon2 mon3 node1 node2 node3;do ssh-copy-id $i;done
2、mon1 安装部署工具
[root@mon1 ~]# yum install -y ceph-deploy
3、集群安装 ceph
# 陆续在指定的节点上安装 ceph 软件
[root@mon1 ~]# ceph-deploy install client mon1 mon2 mon3 node1 node2 node3
如果嫌 ceph-deploy 队列安装速度慢,可以在每台节点上执行
yum install -y ceph ceph-radosgw
命令,手动安装。(前提是需要配置过 yum 源,3.2 中的第9 步)
安装完 ceph 之后,集群中的每台主机都可以查看版本
[root@mon1 ~]# ceph -v
ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautilus (stable)
4、部署 Monitor
[root@mon1 ~]# cd /etc/ceph/
# --public-network 指定集群公共网络
[root@mon1 ceph]# ceph-deploy new mon1 mon2 mon3 --public-network 192.168.1.1/24 --cluster-network 192.168.1.1/24
创建监控节点,并同步配置到所有节点
# 初始化监控节点,生成 keyring 文件
[root@mon1 ceph]# ceph-deploy mon create-initial
# 将配置文件信息同步到所有节点
[root@mon1 ceph]# ceph-deploy admin mon1 mon2 mon3 node1 node2 node3 client
# 查看集群监控状态
[root@mon1 ceph]# ceph -s
cluster:
id: cf9823c8-2cbd-4654-975d-d29ff246906c
health: HEALTH_WARN
mons are allowing insecure global_id reclaim
services:
mon: 3 daemons, quorum mon1,mon2,mon3 (age 64s)
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
5、创建 Manager
# 创建三个 mgr 节点
[root@mon1 ceph]# ceph-deploy mgr create mon1 mon2 mon3
# 查看集群状态
[root@mon1 ceph]# ceph -s
cluster:
id: cf9823c8-2cbd-4654-975d-d29ff246906c
health: HEALTH_WARN
mons are allowing insecure global_id reclaim
services:
mon: 3 daemons, quorum mon1,mon2,mon3 (age 2m)
mgr: mon1(active, since 11s), standbys: mon2, mon3
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
6、创建 OSD
# 将 node 节点上的 /dev/sdb 创建为 osd
[root@mon1 ceph]# ceph-deploy osd create --data /dev/sdb node1
[root@mon1 ceph]# ceph-deploy osd create --data /dev/sdb node2
[root@mon1 ceph]# ceph-deploy osd create --data /dev/sdb node3
# 查看集群状态
[root@mon1 ceph]# ceph -s
cluster:
id: cf9823c8-2cbd-4654-975d-d29ff246906c
health: HEALTH_WARN
mons are allowing insecure global_id reclaim
services:
mon: 3 daemons, quorum mon1,mon2,mon3 (age 4m)
mgr: mon1(active, since 2m), standbys: mon2, mon3
osd: 3 osds: 3 up (since 25s), 3 in (since 25s)
task status:
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 3.0 GiB used, 57 GiB / 60 GiB avail
pgs:
3.4 集群节点的扩容方法
假设再加一个新的集群节点 node4
- 主机名本地解析配置与服务器初始化
- 在 node4 上
yum install -y ceph ceph-radosgw
安装软件 - 在部署节点 mon1 上同步配置文件给 node4.
ceph-deploy admin node4
- 按需求选择在 node4 上添加
mon
或mgr
或osd
等
3.5 创建 Ceph 文件存储
Ceph 文件系统要求 Ceph 存储集群内至少有一个 Ceph 元数据服务器。
Ceph MDS:Ceph 文件存储类型存放与管理元数据 metadata 的服务
1、创建文件存储
第1步:在 mon1 部署节点上创建 mds 服务
[root@mon1 ceph]# ceph-deploy mds create mon1 mon2 mon3
第2步:一个 Ceph 文件系统需要至少两个 RADOS 存储池,一个用于数据、一个用于元数据。
确定 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 工具
[root@mon1 ceph]# ceph osd pool create cephfs_data 64
pool 'cephfs_data' created
[root@mon1 ceph]# ceph osd pool create cephfs_metadata 64
pool 'cephfs_metadata' created
第3步:创建 Ceph 文件系统,并确认客户端访问的节点
# 创建好存储池后,你就可以用 ceph fs new 命令创建文件系统了
[root@mon1 ceph]# ceph fs new cephfs cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1
# 查看创建的文件系统
[root@mon1 ceph]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
# 文件系统创建完毕后, MDS 服务器就能达到 active 状态了:
[root@mon1 ceph]# ceph mds stat
cephfs:1 {0=mon1=up:active} 2 up:standby
2、客户端挂载文件存储
ceph 默认启用了cephx 认证,所以客户端的挂载必须要验证
# 查看 key 值
[root@mon1 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQC6ya1h4NjXNRAA/a5IK5Y3pM3yq5GQc9ivxA==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
在客户端上创建一个文件记录密钥字符串
[root@client ~]# echo 'AQC6ya1h4NjXNRAA/a5IK5Y3pM3yq5GQc9ivxA==' > admin.key
客户端挂载,需要安装 yum install -y ceph-common
挂载 ceph 集群中跑了 monitor 的节点,mon 服务端口为 6789
[root@client ~]# mount -t ceph mon1:6789:/ /mnt/ -o name=admin,secretfile=/root/admin.key
开机启动挂载追加以下内容至 /etc/fstab
文件
mon1:6789:/ /mnt/ ceph name=admin,secretfile=/etc/ceph/secret.key,noatime 0 2
3、删除文件存储
第1步:在客户端上删除数据,并umount所有挂载
[root@client ~]# rm -rf /mnt/*
[root@client ~]# umount /mnt/
第2步:停掉所有节点的 mds (只有停掉 mds 才能删除文件存储)
[root@mon1 ~]# systemctl stop ceph-mds.target
[root@mon2 ~]# systemctl stop ceph-mds.target
[root@mon3 ~]# systemctl stop ceph-mds.target
第3步:删除
# 先添加一条允许删除 pool 的配置,注意命令运行目录要在 ceph 配置目录
[root@mon1 ceph]# echo 'mon allow pool delete = true' >> /etc/ceph/ceph.conf
# 同步配置
[root@mon1 ceph]# ceph-deploy --overwrite-conf admin mon2 mon3 node1 node2 node3 client
[root@mon1 ceph]# systemctl restart ceph-mon.target
# 删除 cephfs 文件存储
[root@mon1 ceph]# ceph fs rm cephfs --yes-i-really-mean-it
# 删除 cephfs 池
[root@mon1 ceph]# ceph osd pool rm cephfs_data cephfs_data --yes-i-really-really-mean-it
[root@mon1 ceph]# ceph osd pool rm cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it
第4步: 再次 mds 服务再次启动
[root@mon1 ~]# systemctl start ceph-mds.target
[root@mon2 ~]# systemctl start ceph-mds.target
[root@mon3 ~]# systemctl start ceph-mds.target
3.6 创建 Ceph 块存储
1、创建块存储并使用
第1步:在 mon1 上同步配置文件到 client
[root@mon1 ceph]# ceph-deploy admin client
第2步:建立存储池,并初始化
注意:在客户端操作
[root@client ~]# ceph osd pool create rbd_pool 128
pool 'rbd_pool' created
[root@client ~]# rbd pool init rbd_pool
第3步:创建一个存储卷(我这里卷名为 volume1,大小为 2048 M)
[root@client ~]# rbd create --size 2048 rbd_pool/volume1
[root@client ~]# rbd info rbd_pool/volume1
rbd image 'volume1':
size 2 GiB in 512 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 5e451a6d39a0
block_name_prefix: rbd_data.5e451a6d39a0
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Mon Dec 6 17:24:12 2021
access_timestamp: Mon Dec 6 17:24:12 2021
modify_timestamp: Mon Dec 6 17:24:12 2021
第4步: 将创建的卷映射成块设备
- 因为rbd镜像的一些特性,OS kernel 并不支持,所以映射报错
[root@client ~]# rbd map rbd_pool/volume1
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable rbd_pool/volume1 object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
- 解决方法: disable 掉相关特性
[root@client ~]# rbd feature disable rbd_pool/volume1 exclusive-lock object-map fast-diff deep-flatten
- 再次映射
[root@client ~]# rbd map rbd_pool/volume1
/dev/rbd0
第5步: 查看映射(如果要取消映射, 可以使用rbd unmap /dev/rbd0
)
[root@client ~]# rbd showmapped
id pool image snap device
0 rbd_pool volume1 - /dev/rbd0
第6步: 格式化,挂载
[root@client ~]# mkfs.xfs /dev/rbd0
[root@client ~]# mount /dev/rbd0 /mnt/
[root@client ~]# df -h |tail -1
/dev/rbd0 4.9G 33M 4.9G 1% /mnt
2、删除块存储方法
[root@client ~]# umount /mnt/
[root@client ~]# rbd unmap /dev/rbd0
[root@client ~]# ceph osd pool delete rbd_pool rbd_pool --yes-i-really-really-mean-it
pool 'rbd_pool' removed
3.7 创建 Ceph 对象存储
1、新建网关实例
[root@mon1 ceph]# ceph-deploy rgw create mon1
[root@mon1 ceph]# lsof -i:7480
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
radosgw 3898 ceph 47u IPv4 33726 0t0 TCP *:7480 (LISTEN)
radosgw 3898 ceph 48u IPv6 33728 0t0 TCP *:7480 (LISTEN)
2、创建连接用户
为了使用 REST 接口,首先需要为S3接口创建一个初始 Ceph 对象网关用户。
# 保留 "access_key","secret_key" 的值用于连接验证
[root@client ~]# radosgw-admin user create --uid="testuser" --display-name="First User"
{
"user_id": "testuser",
"display_name": "First User",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"subusers": [],
"keys": [
{
"user": "testuser",
"access_key": "QSPB8IZ1ZC0GWCJNJAXA",
"secret_key": "0qaBfvQF1kYT3phVgIigHW4lYgwpmOaDzqqcmZam"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
3、S3 连接 ceph 对象网关
AmazonS3 是一种面向 Internet 的对象存储服务.我们这里可以使用 s3 工具连接 ceph 的对象存储进行操作
第1步: 客户端安装 s3cmd 工具,并编写 ceph 连接配置文件
[root@client ~]# yum -y install s3cmd
创建并编写下面的文件,key文件对应前面创建测试用户的key
[root@client ~]# vim /root/.s3cfg
[default]
access_key = QSPB8IZ1ZC0GWCJNJAXA
secret_key = 0qaBfvQF1kYT3phVgIigHW4lYgwpmOaDzqqcmZam
host_base = mon1:7480
host_bucket = mon1:7480/%(bucket)
cloudfront_host = mon1:7480
use_https = False
第2步: 命令测试
# 创建桶
[root@client ~]# s3cmd mb s3://test_bucket
# 列出 bucket,可以查看到先前测试创建的 my-new-bucket
[root@client ~]# s3cmd ls
2021-12-06 10:05 s3://test_bucket
# 上传文件到桶
[root@client ~]# s3cmd put /etc/fstab s3://test_bucket
upload: '/etc/fstab' -> 's3://test_bucket/fstab' [1 of 1]
501 of 501 100% in 1s 303.34 B/s done
# 下载到当前目录
[root@client ~]# s3cmd get s3://test_bucket/fstab
# 更多命令请见参考命令帮助
[root@client ~]# s3cmd --help