单机是不能实现ceph的, ceph是一堆服务器. 是需要成本支持以及维护成本
Ceph
是一个统一的分布式存储系统,最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),随后贡献给开源社区。其设计初衷是提供较好的性能、可靠性和可扩展性。在经过多年的发展之后,目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack都可与Ceph整合以支持虚拟机镜像的后端存储
Ceph的底层是RADOS,RADOS本身也是分布式存储系统,Ceph所有的存储功能都是基于RADOS实现的。RADOS采用C++开发,所提供的原生Librados API包括C和C++两种。Ceph的上层应用调用本机上的librados API,再由后者通过socket与RADOS集群中的其他节点通信并完成各种操作。
RADOS GateWay、RBD其作用是在librados库的基础上提供抽象层次更高、更便于应用或客户端使用的上层接口。其中RADOS GW是一个提供与Amazon S3和Swift兼容的RESTful API的gateway,以供相应的对象存储应用开发使用。RBD则提供了一个标准的块设备接口,常用于在虚拟化的场景下为虚拟机创建volume。目前,RedHat已经将RBD驱动集成在KVM/QEMU中,以提供虚拟机访问性能。这两种方式目前在云计算中应用的比较多。
CephFS则提供了POSIX接口,用户可直接通过客户端挂载使用。它是内核态的程序,所有无需调用用户空间的librados库。它通过内核中的net模块来与RADOS进行交互
高性能
ceph
支持三种调用接口, 这三种接口可以一同使用
Monitor
, MDS
要与OSD
分离部署在不同的机器上, OSD
使用SATA即可ceph OSD
的心跳来向ceph Monitor
和Manages
提供一些监控信息, 本质上Ceph OSD
就是一个个host主机上的存储磁盘, 真正提供存储空间Ceph MDS
raft
协议实现节点间的信息同步说明: x是大版本, z是小版本
RBD
, CephFS
, Object Gateways
, 但是数据无论是从三个接口哪一种写入的,最终都要切分成对象存储到底层的RADOS
中。逻辑上通过算法先映射到PG上,最终存储进OSD节点里主机名 | 说明 | IP |
---|---|---|
cong-1 | manage, osd, monitor | 192.168.100.11 |
cong-2 | osd | 192.168.100.12 |
cong-3 | osd | 192.168.100.13 |
cong-4 | client | 192.168.100.14 |
# 查看是否有新加入的磁盘
lsblk
# 关闭防火墙,selinux略
# 源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 时间同步, 启动时钟同步,手动同步,必须做
yum -y install chrony; systemctl enable chronyd --now; timedatectl set-ntp true; chronyc -a makestep
# chrony配置文件
vim /etc/chrony.conf
# 管理节点秘钥,并推送到其他节点,免密登录
ssh-keygen
cat >>/etc/yum.repos.d/ceph.repo<<EOF
[ceph]
name=ceph
baseurl=http://mirrors.163.com/ceph/rpm-luminous/el7/x86_64/
gpgcheck=0
[ceph-noarch]
name=ceph-noarch
baseurl=http://mirrors.163.com/ceph/rpm-luminous/el7/noarch/
gpgcheck=0
EOF
# 安装其他工具
yum -y install epel-release yum-plugin-priorities yum-utils ntpdate
ceph-deploy
的工具来安装集群# ceph安装, 可以直接安装
yum -y install ceph-deploy ceph ceph-radosgw snappy leveldb gdisk python-argparse gperftools-libs yum-plugin-priorities
# 也可以下载到本地,创建ceph目录
mkdir /root/ceph/
yum -y install --downloadonly --downloaddir=/root/ceph/ ceph-deploy ceph ceph-radosgw snappy leveldb gdisk python-argparse gperftools-libs
# 如果是下载到本地直接这样安装
cd /root/ceph/
yum -y localinstall *rpm
在cong-1
上
在/etc/ceph
操作, 创建一个新的集群, 并设置cong-1为monitor
节点
# 创建一个集群,集群名字为cong-1
cd /etc/ceph
[root@cong-1 /etc/ceph]# ceph-deploy new cong-1
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (2.0.1): /usr/bin/ceph-deploy new cong-1
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] func : <function new at 0x7f255c53a2a8>
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7f255c5615f0>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] ssh_copykey : True
[ceph_deploy.cli][INFO ] mon : ['cong-1']
[ceph_deploy.cli][INFO ] public_network : None
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] cluster_network : None
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.cli][INFO ] fsid : None
[ceph_deploy.new][DEBUG ] Creating new cluster named ceph
[ceph_deploy.new][INFO ] making sure passwordless SSH succeeds
[cong-1][DEBUG ] connected to host: cong-1
[cong-1][DEBUG ] detect platform information from remote host
[cong-1][DEBUG ] detect machine type
[cong-1][DEBUG ] find the location of an executable
[cong-1][INFO ] Running command: /usr/sbin/ip link show
[cong-1][INFO ] Running command: /usr/sbin/ip addr show
[cong-1][DEBUG ] IP addresses found: [u'192.168.100.11']
[ceph_deploy.new][DEBUG ] Resolving host cong-1
[ceph_deploy.new][DEBUG ] Monitor cong-1 at 192.168.100.11
[ceph_deploy.new][DEBUG ] Monitor initial members are ['cong-1']
[ceph_deploy.new][DEBUG ] Monitor addrs are ['192.168.100.11']
[ceph_deploy.new][DEBUG ] Creating a random mon key...
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...
# 创建集群后,多了些文件
[root@cong-1 /etc/ceph]# ll
总用量 16
-rw-r--r-- 1 root root 198 6月 8 22:13 ceph.conf
-rw-r--r-- 1 root root 2933 6月 8 22:13 ceph-deploy-ceph.log
-rw------- 1 root root 73 6月 8 22:13 ceph.mon.keyring
-rw-r--r-- 1 root root 92 1月 31 2020 rbdmap
# ceph配置文件最后加一行,他的意思是osd的数量为2,但是我们集群是有3个osd,为什么配置数量为2呢,因为ceph的crush算法,如果有一个osd故障了,通过这个算法能将故障的osd踢出掉,将另一个填充进来,通过分布式一致性算法进行同步,形成活动清除状态 active + clean
[root@cong-1 /etc/ceph]# vim ceph.com
osd_pool_default_size = 2
cong-1
上[root@cong-1 /etc/ceph]# ceph-deploy mon create cong-1
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (2.0.1): /usr/bin/ceph-deploy mon create cong-1
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] subcommand : create
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_
[root@cong-1 /etc/ceph]# ceph-deploy gatherkeys cong-1
# 查看文件, 创建出来的是.keyring的文件,也就是一些凭证文件,可以cat一下,其中client.admin.keyring是连接ceph集群的admin账号秘钥
[root@cong-1 /etc/ceph]# ll
总用量 48
-rw------- 1 root root 71 6月 8 22:29 ceph.bootstrap-mds.keyring
-rw------- 1 root root 71 6月 8 22:29 ceph.bootstrap-mgr.keyring
-rw------- 1 root root 71 6月 8 22:29 ceph.bootstrap-osd.keyring
-rw------- 1 root root 71 6月 8 22:30 ceph.bootstrap-rgw.keyring
-rw------- 1 root root 63 6月 8 22:29 ceph.client.admin.keyring
-rw-r--r-- 1 root root 223 6月 8 22:26 ceph.conf
-rw-r--r-- 1 root root 15544 6月 8 22:30 ceph-deploy-ceph.log
-rw------- 1 root root 73 6月 8 22:13 ceph.mon.keyring
-rw-r--r-- 1 root root 92 1月 31 2020 rbdmap
cong-1上执行即可
ceph12部署osd格式化命令和之前的不同, 添加完硬盘直接使用,不要分区
# 为了保证磁盘的感觉,先提前清理下磁盘
[root@cong-1 /etc/ceph]# ceph-deploy disk zap cong-1 /dev/sdb
[root@cong-1 /etc/ceph]# ceph-deploy disk zap cong-2 /dev/sdb
[root@cong-1 /etc/ceph]# ceph-deploy disk zap cong-3 /dev/sdb
# 添加osd节点
[root@cong-1 /etc/ceph]# ceph-deploy osd create cong-1 --data /dev/sdb
[root@cong-1 /etc/ceph]# ceph-deploy osd create cong-2 --data /dev/sdb
[root@cong-1 /etc/ceph]# ceph-deploy osd create cong-3 --data /dev/sdb
# 查看是否添加成功
[root@cong-1 /etc/ceph]# ceph-deploy osd list cong-1 cong-2 cong-3
manage
管理服务, 也可以同时在cong-2
, cong-3
上来部署manage
, 实现高可用, 这里我并没有实现高可用, 就部署了一个, 他的作用就是辅助管理monitor
的[root@cong-1 /etc/ceph]# ceph-deploy mgr create cong-1
monitor
地址和ceph.clieng.admin.keyring
[root@cong-1 /etc/ceph]# ceph-deploy admin cong-1 cong-2 cong-3
# 秘钥文件权限
[root@cong-1 /etc/ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
[root@cong-2 /etc/ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
[root@cong-3 /etc/ceph]# chmod +r /etc/ceph/ceph.client.admin.keyring
cephfs
的时候才需要他, 而且云计算中使用更广泛的是另外两种存储方式, mds虽然是元数据服务器, 但是他不负责存储元数据, 元数据是被切换成对象存在各个osd节点中的# 给cong-2 cong-3创建文件系统
[root@cong-1 /etc/ceph]# ceph-deploy mds create cong-2 cong-3
# 查看mds服务, up状态
[root@cong-1 /etc/ceph]# ceph mds stat
, 2 up:standby
# 查看ceph集群的状态
[root@cong-1 /etc/ceph]# ceph -s
id: 5a72430d-b363-4ea3-959a-2dc2dfdaeedd
health: HEALTH_OK
services:
mon: 1 daemons, quorum cong-1
mgr: cong-1(active)
osd: 3 osds: 3 up, 3 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 3.01GiB used, 2.98GiB / 5.99GiB avail
pgs:
pg_num
的, 这个pg_num
的设置直接影响集群的行为, 以及出错的数据持久性
pg_num
定义为128即可osd
5~10个, pg_num
定义为512osd
10~50个, pg_num
定义为4096osd
大于50个, pg_num
借助工具去计算pgcalc# 创建之前查看文件系统, 因为之前已经清空磁盘中的数据,所有没有文件系统开启
[root@cong-1 /etc/ceph]# ceph fs ls
No filesystems enabled
# 设置pg_num
[root@cong-1 /etc/ceph]# ceph osd pool create cephfs_data 128
pool 'cephfs_data' created
# 创建存储池
[root@cong-1 /etc/ceph]# ceph osd pool create cephfs_metadata 128
pool 'cephfs_metadata' created
# 创建文件系统
[root@cong-1 /etc/ceph]# ceph fs new cephfs cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1
# 查看文件系统
[root@cong-1 /etc/ceph]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
# 再次查看mds状态
[root@cong-1 /etc/ceph]# ceph mds stat
cephfs-1/1/1 up {0=cong-3=up:active}, 1 up:standby
在cong-4上
内核驱动挂载ceph文件系统, 要挂载ceph文件系统, 如果知道monitor的ip地址可以用mount命令, 或者用mount.ceph工具来自动解析监视器的IP地址
# 在client端创建挂载目录来测试挂载
[root@cong-4 ~/ceph]# mkdir -p /data/aa
# cong-1上查看client的秘钥
[root@cong-1 /etc/ceph]# cat ceph.client.admin.keyring
[client.admin]
key = AQBmsqBi29c6FBAA2ju5LlbvUqBPGLW2G8dy2g==
# 测试挂载monitor上看是否可以挂载,如果是多个monitor,可以随便指定一个就可以,但是生产这样挂载是不允许的,因为在命令行输入了key值,这是非常危险的
[root@cong-4 /etc/ceph]# mount -t ceph 192.168.100.11:6789:/ /data/aa -o name=admin,secret=AQBmsqBi29c6FBAA2ju5LlbvUqBPGLW2G8dy2g==
# 查看是可以挂载上的,可以在cong-4上创建文件测试下
[root@cong-4 /etc/ceph]# mount -t ceph 192.168.100.11:6789:/ /data/aa -o name=admin,secret=AQBmsqBi29c6FBAA2ju5LlbvUqBPGLW2G8dy2g==
[root@cong-4 /etc/ceph]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 20G 2.1G 18G 11% /
devtmpfs 900M 0 900M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.5M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
tmpfs 182M 0 182M 0% /run/user/0
192.168.100.11:6789:/ 1.4G 0 1.4G 0% /data/aa
# umount,如果报错
[root@cong-4 /etc/ceph]# umount /data/aa
umount: /data/aa:目标忙。
(有些情况下通过 lsof(8) 或 fuser(1) 可以
找到有关使用该设备的进程的有用信息)
# 报错就用过提示用lsof查看进程,然后kill -9 干掉再umount即可
lsof /data/aa
ceph-common-12.2.13
, 版本要和ceph集群的版本一致, 否则也是无法使用秘钥文件进行挂载的# 上面如果没安装的,客户端需要安装ceph-common, 这个是之前ceph下载到本地中的有的
yum install ceph-common-12.2.13 -y
# 创建文件直接写入里面
[root@cong-4 /etc/ceph]# vim /etc/ceph/admin.secret
AQBmsqBi29c6FBAA2ju5LlbvUqBPGLW2G8dy2g==
# 然后挂载,这样卸载的时候就不会报错
[root@cong-4 /etc/ceph]# mount -t ceph 192.168.100.11:6789:/ /data/aa -o name=admin,secretfile=/etc/ceph/admin.secret
[root@cong-4 /etc/ceph]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 20G 2.2G 18G 11% /
devtmpfs 900M 0 900M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.5M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
tmpfs 182M 0 182M 0% /run/user/0
192.168.100.11:6789:/ 1.4G 0 1.4G 0% /data/aa
[root@cong-4 /etc/ceph]# umount /data/aa
[root@cong-4 /etc/ceph]#
ceph-fuse
的包[root@cong-4 /etc/ceph]# yum -y install ceph-fuse
# 将cong-1的client的key文件scp过去
[root@cong-1 /etc/ceph]# scp -rp ceph.client.admin.keyring cong-4:/etc/ceph
# 然后直接挂载
[root@cong-4 /etc/ceph]# ceph-fuse -m 192.168.100.11:6789 /data/aa
# 查看, 这样就隐藏了ceph的ip地址信息
[root@cong-4 /etc/ceph]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda1 20G 2.2G 18G 11% /
devtmpfs 900M 0 900M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.5M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
tmpfs 182M 0 182M 0% /run/user/0
ceph-fuse 1.4G 0 1.4G 0% /data/aa
[下载](git clone https://github.com/Crapworks/ceph-dash.git)
[root@cong-1 /etc/ceph]# git clone https://github.com/Crapworks/ceph-dash.git
# 下载完后解压
[root@cong-1 ~/ceph-dash-1.7.1]# ll
总用量 52
drwxrwxr-x 7 root root 118 12月 3 2021 app
-rwxrwxr-x 1 root root 104 12月 3 2021 ceph-dash.py
-rw-rw-r-- 1 root root 1157 12月 3 2021 ChangeLog
-rw-rw-r-- 1 root root 794 12月 3 2021 config.grahite.json
-rw-rw-r-- 1 root root 980 12月 3 2021 config.influxdb.json
-rw-rw-r-- 1 root root 45 12月 3 2021 config.json
drwxrwxr-x 7 root root 71 12月 3 2021 contrib
drwxrwxr-x 3 root root 121 12月 3 2021 debian
-rw-rw-r-- 1 root root 532 12月 3 2021 Dockerfile
-rw-rw-r-- 1 root root 1303 12月 3 2021 LICENSE
-rw-rw-r-- 1 root root 10518 12月 3 2021 README.md
-rw-rw-r-- 1 root root 28 12月 3 2021 requirements.txt
drwxrwxr-x 2 root root 153 12月 3 2021 screenshots
-rw-rw-r-- 1 root root 21 12月 3 2021 test-requirements.txt
drwxrwxr-x 2 root root 72 12月 3 2021 tests
-rw-rw-r-- 1 root root 353 12月 3 2021 tox.ini
# 执行, 监听的5000端口,要修改端口直接改ceph-dash.py
[root@cong-1 ~/ceph-dash-1.7.1]# ./ceph-dash.py
* Running on http://0.0.0.0:5000/
* Restarting with reloader
# 端口修改
app.run(host='0.0.0.0',port=5001,debug=True)
# 查看服务
[root@cong-1 ~/ceph]# systemctl restart ceph-radosgw.target
[root@cong-1 ~/ceph]# cd /etc/ceph/
[root@cong-1 ~/ceph]# ceph-deploy rgw create cong-1
# curl
[root@cong-1 /etc/ceph]# curl cong-1:7480
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>[root@cong-1 /etc/ceph]#
# 查看pool池
[root@cong-1 /etc/ceph]# ceph osd pool ls
cephfs_data
cephfs_metadata
.rgw.root
default.rgw.control
default.rgw.meta
default.rgw.log
# 端口修改, 配置文件添加/etc/ceph/ceph.conf, 配置修改完成之后我们需要将ceph.conf配置文件同步到集群中的所有节点, 并重启ceph-radosgw
[global]
fsid = 5a72430d-b363-4ea3-959a-2dc2dfdaeedd
mon_initial_members = cong-1
mon_host = 192.168.100.11
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd_pool_default_size = 2
[client.rgw.cong-1]
rgw_frontends = "civetweb port=80"
# 将2个节点加入到RGW, 当然端口也可以改为其他的,并分发给其他节点
[root@cong-1 /etc/ceph]# ceph-deploy rgw create cong-2
[root@cong-1 /etc/ceph]# ceph-deploy rgw create cong-3
s3cmd
是提供访问RGW的开源命令行工具,通过这个工具我们可以实现类似于s3接口的访问方式,下面通过 s3cmd 实现对象存储的管理。RGW对象存储提供了独立的认证方式用于访问对象存储网关,因此我们需要先创建认证访问的账户。由于RGW能兼容与S3风格的API,同时也能兼容于Swift风格API,创建认证账户也是有所区别的。这里我们先创建S3风格的API为例演示s3cmd命令行接口的使用# 通过 radosgw-admin 创建一个访问的用户,创建输出结果和文件存储一样, 可以看到access_key和secret_key,这两个key非常关键,需要用于后续key访问RGW对象存储
# 创建用户,可以看到access_key,secret_key,同时也能够看到关于bucket,user配额相关的内容,radowsgw-admin还提供了其他用户管理相关的命令,比如查看用户的列表
[root@cong-1 /etc/ceph]# radosgw-admin user create --uid rgw-s3 --display-name="Ceph RGW S3 Style User"
{
"user_id": "rgw-s3",
"display_name": "Ceph RGW S3 Style User",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [],
"keys": [
{
"user": "rgw-s3",
"access_key": "2YD97LGL5Q7Q3UGQA6RC",
"secret_key": "fKYJbQ9dENCRmsWCu2ncvrHNzdEzXa5OdqzjXmk7"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"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"
}
# 查询用户信息
[root@cong-1 /etc/ceph]# radosgw-admin user info --uid rgw-s3
# 客户端安装s3cmd, AmazonS3是一种面向Internet的对象存储服务.客户端需要安装s3cmd工具
[root@cong-4 /etc/ceph]# yum install s3cmd -y
# 客户端配置
s3cmd --configure