[root@localhost ~]# rm -rf /etc/yum.repos.d/*.repo
下载阿里云的base源
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@localhost ~]# sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo
[root@localhost ~]# sed -i '/aliyuncs/d' /etc/yum.repos.d/epel.repo
[root@localhost ~]# sed -i 's/$releasever/7.3.1611/g' /etc/yum.repos.d/CentOS-Base.repo
[root@localhost ~]# vi /etc/yum.repos.d/ceph.repo
添加
[ceph]
name=ceph
baseurl=http://mirrors.163.com/ceph/rpm-jewel/el7/x86_64/
gpgcheck=0
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.163.com/ceph/rpm-jewel/el7/noarch/
gpgcheck=0
进行yum的makecache
[root@localhost ~]# yum makecache
[root@admin ceph-cluster]# yum -y install ceph-deploy
1.在管理节点上,进入刚创建的放置配置文件的目录,用 ceph-deploy 执行如下步骤
mkdir /opt/cluster-ceph
cd /opt/cluster-ceph
ceph-deploy new monitor1 monitor2 monitor3
2. 把 Ceph 配置文件里的默认副本数从 3 改成 2 ,这样只有两个 OSD 也可以达到 active + clean 状态。
把下面这行加入 [global] 段:
osd_pool_default_size = 2
3. 如果你有多个网卡,可以把 public network 写入 Ceph 配置文件的 [global] 段下
public network = {ip-address}/{netmask}
4.安装 Ceph
方法一
[root@admin ceph-cluster]# ceph-deploy install monitor1 monitor2 monitor3 osd1 osd2 admin
//
如果下载不了
方法二
下载ceph的相关rpm到本地
[root@localhost ~]# yum install --downloadonly --downloaddir=/tmp/ceph ceph
在每台主机上安装ceph
[root@localhost ~]# yum localinstall -C -y --disablerepo=* /tmp/ceph/*.rpm
方法三
# 替换 ceph 源 为 163 源
sed -i 's/download\.ceph\.com/mirrors\.163\.com\/ceph/g' /etc/yum.repos.d/ceph.repo
yum -y install ceph ceph-radosgw
//
5. 配置初始 monitor(s)、并收集所有密钥:
# 请务必在 ceph-cluster 目录下
[root@admin ceph-cluster]# ceph-deploy mon create-initial
[ceph_deploy.gatherkeys][INFO ] Storing ceph.client.admin.keyring
[ceph_deploy.gatherkeys][INFO ] Storing ceph.bootstrap-mds.keyring
[ceph_deploy.gatherkeys][INFO ] Storing ceph.bootstrap-mgr.keyring
[ceph_deploy.gatherkeys][INFO ] keyring 'ceph.mon.keyring' already exists
[ceph_deploy.gatherkeys][INFO ] Storing ceph.bootstrap-osd.keyring
[ceph_deploy.gatherkeys][INFO ] Storing ceph.bootstrap-rgw.keyring
[ceph_deploy.gatherkeys][INFO ] Destroy temp directory /tmp/tmpJ9K9Z2
6. 初始化 ceph.osd 节点
创建存储空间
[root@osd1 ~]# mkdir -p /opt/ceph-osd
[root@osd1 ~]# chown ceph.ceph /opt/ceph-osd/ -R
[root@osd2 ~]# mkdir -p /opt/ceph-osd
[root@osd2 ~]# chown ceph.ceph /opt/ceph-osd/ -R
创建OSD:
[root@admin ceph-cluster]# ceph-deploy osd prepare osd1:/opt/ceph-osd osd2:/opt/ceph-osd
激活 OSD
[root@admin ceph-cluster]# ceph-deploy osd activate osd1:/opt/ceph-osd osd2:/opt/ceph-osd
用 ceph-deploy 把配置文件和 admin 密钥拷贝到管理节点和 Ceph 节点,这样你每次执行 Ceph 命令行时就无需指定 monitor 地址和 ceph.client.admin.keyring 了
[root@admin ceph-cluster]# ceph-deploy admin monitor1 monitor2 monitor3 osd1 osd2 admin
确保你对 ceph.client.admin.keyring 有正确的操作权限。
chmod +r /etc/ceph/ceph.client.admin.keyring (所有机器)
如果配置文件更改,需要同步配置文件到所有节点
[root@admin ceph-cluster]# ceph-deploy --overwrite-conf admin monitor1 monitor2 monitor3 osd1 osd2 admin
7.检查集群的健康状况。
[root@admin ceph-cluster]# ceph health
查看状态
[root@admin ceph-cluster]# ceph -s
cluster 33411039-d7cb-442d-be2a-77fb9e90eb0a
health HEALTH_OK
monmap e1: 3 mons at {monitor1=192.168.20.223:6789/0,monitor2=192.168.20.224:6789/0,monitor3=192.168.20.225:6789/0}
election epoch 6, quorum 0,1,2 monitor1,monitor2,monitor3
osdmap e12: 2 osds: 2 up, 2 in
flags sortbitwise,require_jewel_osds
pgmap v26: 64 pgs, 1 pools, 0 bytes data, 0 objects
26445 MB used, 63614 MB / 90060 MB avail
64 active+clean
8.查看osd tree
[root@admin ceph-cluster]# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.08578 root default
-2 0.04289 host osd1
0 0.04289 osd.0 up 1.00000 1.00000
-3 0.04289 host osd2
1 0.04289 osd.1 up 1.00000 1.00000
monitor 进程为 /usr/bin/ceph-mon -f --cluster ceph --id monitor1 --setuser ceph --setgroup ceph
systemctl start ceph-mon.target
systemctl enable ceph-mon.target
systemctl start ceph-osd.target
systemctl enable ceph-osd.target
9.扩展集群(扩容)
增加一个 元数据osd
[root@admin ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@osd3
[root@osd3 ~]# rm /etc/yum.repos.d/* -rf
[root@admin ~]# scp /etc/yum.repos.d/*.repo root@osd3:/etc/yum.repos.d/
[root@osd3 ~]# yum makecache
[root@osd3 ~]# yum -y update && yum -y install ceph-deploy
[root@osd3 ~]# yum localinstall -C -y --disablerepo=* /tmp/ceph/*.rpm
[root@osd3 ~]# mkdir -p /opt/ceph-osd
[root@osd3 ~]# chown ceph.ceph /opt/ceph-osd/ -R
[root@admin ~]# ceph-deploy admin osd3
使用ceph-deploy 节点准备 OSD
[root@admin ceph-cluster]# ceph-deploy osd prepare osd3:/opt/ceph-osd
激活 OSD
[root@admin ceph-cluster]# ceph-deploy osd activate osd3:/opt/ceph-osd
##注意: ntp 时间一定要同步
检查Ceph monitor仲裁状态
[root@admin ceph-cluster]# ceph quorum_status --format json-pretty
{
"election_epoch": 10,
"quorum": [
0,
1,
2
],
"quorum_names": [
"monitor1",
"monitor2",
"monitor3"
],
"quorum_leader_name": "monitor1",
"monmap": {
"epoch": 1,
"fsid": "33411039-d7cb-442d-be2a-77fb9e90eb0a",
"modified": "2017-12-21 17:28:21.134905",
"created": "2017-12-21 17:28:21.134905",
"mons": [
{
"rank": 0,
"name": "monitor1",
"addr": "192.168.20.223:6789\/0"
},
{
"rank": 1,
"name": "monitor2",
"addr": "192.168.20.224:6789\/0"
},
{
"rank": 2,
"name": "monitor3",
"addr": "192.168.20.225:6789\/0"
}
]
}
}
CEPH 块设备
块是一个字节序列(例如,一个 512 字节的数据块)。基于块的存储接口是最常见的存储数据方法,它们基于旋转介质,像硬盘、 CD 、软盘、甚至传统的 9 磁道磁带。无处不在的块设备接口使虚拟块设备成为与 Ceph 这样的海量存储系统交互的理想之选。
Ceph 块设备是精简配置的、大小可调且将数据条带化存储到集群内的多个 OSD 。 Ceph 块设备利用 RADOS 的多种能力,如快照、复制和一致性。 Ceph 的 RADOS 块设备( RBD )使用内核模块或 librbd 库与 OSD 交互。
创建存储池 ----- 创建块设备image --------ceph客户端挂载
存储池
如果你开始部署集群时没有创建存储池, Ceph 会用默认存储池存数据。存储池提供的功能:
- 自恢复力: 你可以设置在不丢数据的前提下允许多少 OSD 失效,对多副本存储池来说,此值是一对象应达到的副本数。典型配置存储一个对象和它的一个副本(即 size = 2),但你可以更改副本数;对纠删编码的存储池来说,此值是编码块数(即纠删码配置里的 m=2 )。
- 归置组: 你可以设置一个存储池的归置组数量。典型配置给每个 OSD 分配大约 100 个归置组,这样,不用过多计算资源就能得到较优的均衡。配置了多个存储池时,要考虑到这些存储池和整个集群的归置组数量要合理。
- CRUSH 规则: 当你在存储池里存数据的时候,与此存储池相关联的 CRUSH 规则集可控制 CRUSH 算法,并以此操纵集群内对象及其副本的复制(或纠删码编码的存储池里的数据块)。你可以自定义存储池的 CRUSH 规则。
- 快照: 用 ceph osd pool mksnap 创建快照的时候,实际上创建了某一特定存储池的快照。
- 设置所有者: 你可以设置一个用户 ID 为一个存储池的所有者。
要把数据组织到存储池里,你可以列出、创建、删除存储池,也可以查看每个存储池的利用率。
列出存储池
ceph osd lspools
归置组
确定 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 取值变得更加重要,因为它显著地影响着集群的行为、以及出错时的数据持久性(即灾难性事件导致数据丢失的概率)
归置组是如何使用
储池内的归置组( PG )把对象汇聚在一起,因为跟踪每一个对象的位置及其元数据需要大量计算——即一个拥有数百万对象的系统,不可能在对象这一级追踪位置
Ceph客户端会计算某一对象应该位于哪个归置组里,它是这样实现的,先给对象ID做哈希操作,然后再根据指定存储池里的PG数量,存储池ID做一个运算。详情见PG映射到OSD。
放置组中的对象内容存储在一组OSD中。例如,在大小为2的复制池中,每个放置组将在两个OSD上存储对象,如下所示。
如果OSD#2失败,另一个将被分配到放置组#1,并且将填充OSD#1中的所有对象的副本。如果池大小从两个更改为三个,则会为展示位置组分配一个额外的OSD,并将接收展示位置组中的所有对象的副本。
展示位置组不拥有OSD,他们将其与同一个游泳池中的其他展示位置组或其他游泳池共享。如果OSD#2失败,则位置组#2也将不得不使用OSD#3来恢复对象的副本。
当展示位置组数量增加时,新的展示位置组将被分配OSD。CRUSH功能的结果也将发生变化,以前的放置组中的一些对象将被复制到新的放置组中,并从旧放置组中移除
创建存储池
创建存储池前先看看存储池、归置组和 CRUSH 配置参考。你最好在配置文件里重置默认归置组数量,因为默认值并不理想。关于归置组数量请参考设置归置组数量
创建存储池命令:
ceph osd pool create {pool-name} pg_num
ceph osd pool create data 128
删除存储池
ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
[root@admin ~]# ceph osd pool delete data data --yes-i-really-really-mean-it
#注意要写 2个存储池data
重命名存储池
[root@admin ~]# ceph osd pool rename data fengjian
查看存储池统计信息
[root@admin ~]# rados df
pool name KB objects clones degraded unfound rd rd KB wr wr KB
fengjian 0 0 0 0 0 0 0 0 0
rbd 1 4 0 0 0 98 75 8 2
total used 53286476 4
total avail 85045696
total space 138332172
查看 pool 具体参数
[root@admin ~]# ceph osd dump | grep pool
pool 0 'rbd' replicated size 2 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 38 flags hashpspool stripe_width 0
pool 4 'fengjian' replicated size 2 min_size 1 crush_ruleset 0 object_hash rjenkins pg_num 128 pgp_num 128 last_change 40 flags hashpspool stripe_width 0
rbd 命令可用于创建、罗列、内省和删除块设备image,也可克隆image、创建快照、回滚快照、查看快照等等
创建块设备image
要在 fengjian 这个存储池中创建一个名为 kubernetes-pvc 大小为 20GB 的image
[root@admin ~]# rbd create --size 50000 fengjian/kubernetes-pvc-1
如果创建image时不指定存储池,它将使用默认的 rbd 存储池
罗列块设备image
[root@admin ~]# rbd ls fengjian
kubernetes-pvc-1
如果不写 pool fengjian ,那么默认 显示rbd 这个pool
[root@admin ~]# rbd ls
检索image信息
[root@admin ~]# rbd info fengjian/kubernetes-pvc-1
rbd image 'kubernetes-pvc-1':
size 50000 MB in 12500 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.107c74b0dc51
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
默认不指定pool,默认是rbd pool
调整块设备image大小
Ceph 块设备image是精简配置,只有在你开始写入数据时它们才会占用物理空间。然而,它们都有最大容量,就是你设置的 --size 选项。如果你想增加(或减小) Ceph 块设备image的最大尺寸,执行下列命令:
rbd resize --size 2048 pool/foo (to increase)
rbd resize --size 2048 pool/foo --allow-shrink (to decrease)
增加块设备image大小
[root@admin ~]# rbd resize --size 51000 fengjian/kubernetes-pvc-1
Resizing image: 100% complete...done.
[root@admin ~]# rbd info fengjian/kubernetes-pvc-1
rbd image 'kubernetes-pvc-1':
size 51000 MB in 12750 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.107c74b0dc51
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
减小块设备image大小
[root@admin ~]# rbd resize --size 50000 fengjian/kubernetes-pvc-1 --allow-shrink
Resizing image: 100% complete...done.
[root@admin ~]# rbd info fengjian/kubernetes-pvc-1
rbd image 'kubernetes-pvc-1':
size 50000 MB in 12500 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.107c74b0dc51
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
删除块设备image
rbd rm {pool-name}/{image-name}
[root@admin ~]# rbd rm foo
[root@admin ~]# rbd rm fengjian/kubernetes-pvc-1
映射块设备
用 rbd 把image名映射为内核模块。必须指定image名、存储池名、和用户名。若 RBD 内核模块尚未加载, rbd 命令会自动加载。
rbd map rbd/myimage --id admin
如果你启用了 cephx 认证,还必须提供密钥,可以用密钥环或密钥文件指定密钥。
rbd map rbd/myimage --id admin --keyring /path/to/keyring
rbd map rbd/myimage --id admin --keyfile /path/to/file
查看已映射块设备
可以用 rbd 命令的 showmapped 选项查看映射为内核模块的块设备image
rbd showmapped
取消块设备映射
rbd unmap /dev/rbd/rbd/foo
启动所有守护进程
start ceph-all
停止所有守护进程
stop ceph-all
在 ceph admin 节点上创建 image时,出现报错
创建了一个rbd镜像
$ rbd create --size 50000 docker_test
然后,在Ceph client端将该rbd镜像映射为本地设备时出错。
$ rbd map docker_test --name client.admin
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".
In some cases useful info is found in syslog - try "dmesg | tail" or so.
修改Ceph配置文件/etc/ceph/ceph.conf,在global section下,增加 rbd_default_features = 1
[root@admin ceph-cluster]# echo "rbd_default_features = 1" >> ceph.conf
拷贝到所有的 ceph 节点
[root@admin ceph-cluster]# ceph-deploy --overwrite-conf admin monitor1 monitor2 monitor3 osd1 osd2 osd3
需要重启 ceph 所有节点进程
rdb map出错rbd sysfs write failed
创建了一个rbd镜像
$ rbd create --size 4096 docker_test
然后,在Ceph client端将该rbd镜像映射为本地设备时出错。
$ rbd map docker_test --name client.admin
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable".
In some cases useful info is found in syslog - try "dmesg | tail" or so.
原因:
rbd镜像的一些特性,OS kernel并不支持,所以映射失败。我们查看下该镜像支持了哪些特性。
$ rbd info docker_test
rbd image 'docker_test':
size 4096 MB in 1024 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.43702ae8944a
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
可以看到特性feature一栏,由于我OS的kernel只支持layering,其他都不支持,所以需要把部分不支持的特性disable掉。
方法一:
直接diable这个rbd镜像的不支持的特性:
$ rbd feature disable docker_test exclusive-lock object-map fast-diff deep-flatten
方法二:
创建rbd镜像时就指明需要的特性,如:
$ rbd create --size 4096 docker_test --image-feature layering
方法三:
如果还想一劳永逸,那么就在执行创建rbd镜像命令的服务器中,修改Ceph配置文件/etc/ceph/ceph.conf,在global section下,增加
rbd_default_features = 1
再创建rdb镜像。
$ rbd create --size 4096 docker_test
通过上述三种方法后,查看rbd镜像的信息。
$ rbd info docker_test
rbd image 'docker_test':
size 4096 MB in 1024 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.43a22ae8944a
format: 2
features: layering
flags:
再次尝试映射rdb镜像到本地块设备,成功!
$ rbd map docker_test --name client.admin
/dev/rbd0
k8s node 节点安装ceph
1 在管理节点,通过ceph-deploy 把ceph 安装到 ceph-client 节点
ceph-deploy install node1 node2 node3 node4
2.在管理节点上,用 ceph-deploy 把 Ceph 配置文件和 ceph.client.admin.keyring 拷贝到 ceph-client
ceph-deploy admin node1 node2 node3 node4
#需要注意权限
chmod +r/etc/ceph/ceph.client.admin.keyring
CEPH 文件系统
注释: 不能在admin服务器上建立元数据,可以是monitor 或 osd
Ceph 文件系统( Ceph FS )是个 POSIX 兼容的文件系统,它使用 Ceph 存储集群来存储数据。 Ceph 文件系统与 Ceph 块设备、同时提供 S3 和 Swift API 的 Ceph 对象存储、或者原生库( librados )一样,都使用着相同的 Ceph 存储集群系统。
Ceph 文件系统要求 Ceph 存储集群内至少有一个 Ceph 元数据服务器
增加/拆除元数据服务器
用 ceph-deploy 增加和拆除元数据服务器很简单,只要一个命令就可以增加或拆除一或多个元数据服务器
增加一元数据服务器
部署完监视器和 OSD 后,还可以部署元数据服务器
{host-name}[:{daemon-name}] [{host-name}[:{daemon-name}] ...]
[root@admin ceph-cluster]# cd /opt/ceph-cluster
[root@admin ceph-cluster]# ceph-deploy mds create monitor1 monitor2 monitor3
monitor服务器上,查询mds 进程
拆除一元数据服务器
尚未实现……?
创建 CEPH 文件系统
一个 Ceph 文件系统需要至少两个 RADOS 存储池,一个用于数据、一个用于元数据。
- 为元数据存储池设置较高的副本水平,因为此存储池丢失任何数据都会导致整个文件系统失效。
- 为元数据存储池分配低延时存储器(像 SSD ),因为它会直接影响到客户端的操作延时。
[root@monitor1 ceph-cluster]# ceph osd pool create cephfs_data 128
pool 'cephfs_data' created
[root@monitor1 ceph-cluster]# ceph osd pool create cephfs_metadata 128
pool 'cephfs_metadata' created
创建好存储池后,你就可以用 fs new 命令创建文件系统
[root@monitor1 ceph-cluster]# ceph fs new cephfs cephfs_metadata cephfs_data
new fs with metadata pool 8 and data pool 7
######删除文件系统
1.停止进程
[root@monitor1 ceph-cluster]# systemctl stop ceph-mds.target
2.将mds标记成失效
[root@monitor1 ceph-cluster]# ceph mds fail 0
3. 删除ceph文件系统
[root@monitor1 ceph-cluster]# ceph fs rm cephfs --yes-ireally-really-mean-it
[root@monitor1 ceph-cluster]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
文件系统创建完毕后, MDS 服务器就能达到 active 状态了,比如在一个单 MDS 系统中:
[root@monitor1 ~]# $ ceph mds stat
e5: 1/1/1 up {0=a=up:active}
用内核驱动挂载 CEPH 文件系统
#客户端不用安装ceph-common
1. 加载rbd 内核模块
modprobe rbd
[root@node4 ~]# lsmod | grep rbd
rbd 73158 0
libceph 244999 1 rbd
2. 获取admin key
[root@admin ceph-cluster]# cat ceph.client.admin.keyring
[client.admin]
key = AQDIfjtaCImdLRAAGJ1Q1lwpuMdadUutFrg0Zg==
caps mds = "allow *"
caps mon = "allow *"
caps osd = "allow *"
3. 创建挂载点
[root@node4 ~]# mkdir /root/cephfs/
# 其中192.168.20.223 为monitor节点,并且使用monitor 的端口[root@node4 ~]# mount -t ceph 192.168.20.223:6789:/ /root/cephfs -o name=admin,secret=AQDIfjtaCImdLRAAGJ1Q1lwpuMdadUutFrg0Zg==
4. 如果有多个monitor节点,可以挂在多个节点,保证cephfs的高可用性,
[root@admin ~]# mount -t ceph 192.168.20.223:6789,192.168.20.224:6789,192.168.20.225:6789:/ /root/cephfs -o name=admin,secret=AQDIfjtaCImdLRAAGJ1Q1lwpuMdadUutFrg0Zg==
用户空间挂载 CEPH 文件系统
1. 客户端安装 ceph-fuse 工具包
yum -y install ceph-fuse
mkdir /etc/ceph
从ceph 集群拷贝 ceph.conf 和 ceph.client.admin.keyring 到客户端 /etc/ceph/目录下
并且 属于644 权限 chmod 644 /etc/ceph/ceph.client.admin.keyring
[root@etcd1 ceph]# chmod 644 ceph.client.admin.keyring
2. 使用 ceph-fuse 挂载命令
挂在一个monitor
[root@etcd1 ~]# ceph-fuse -m 192.168.20.225:6789 /root/cephfs
挂在多个monitor[root@etcd1 ~]# ceph-fuse -m 192.168.20.223:6789,192.168.20.224:6789,192.168.20.225:6789 /root/cephfs