0%

说起环境变量,可能首先想到的是shell中敲入env所看到的这些。没错,这些的确是环境变量。

还有吗。。。
有!你再试试set命令,看看是不是比env的多啊。是不是有点儿小懵逼。怎么还不一样呢!set看到的是shell变量,那shell变量是环境变量吗?是。

还有吗。。。
有!在你输入set的时候你看到$@$?这些了吗?貌似没有吧。据说这些属于系统变量。(听说而已。。。)

还有吗。。。
目前为止,我只知道这么多,如果我了解到更多的再补充吧。

说了这么多,上一张图,就一目了然了。

linux_env_variable

参考&鸣谢

RGW == Rados Gateway 中文名字叫对象存储网关。

问题

  • 一个RGW能承载的访问量是有限的,若出现故障或性能瓶颈怎么办?若是部署成多个,业务低谷时造成资源浪费
  • 一个集群与单节点有何区别,若整个集群崩溃宕机是小,丢数据为大
  • 客户端的访问协议千奇百怪若只支持S3不足以服众
  • 单纯的V2认证安全性差
  • 客户端压缩、加密数据代价太大,而且难以实现
  • 所有用户、bucket在一个命名空间内安全性太差

为解决上述问题,提出如下方案

方案

rgwcluster.png

  • 管理控制I/O与数据读写I/O分开处理
    管理控制I/O负责设置获取RGW集群信息;
    数据读写I/O负责上传下载对象或上传下载文件。
  • 不同Ceph集群之间互为主备关系
    主集群采用副本集数据保护机制;
    备份集群采用EraseCode数据保护机制。
  • RGW实例由K8s对外发布并提供服务
    利用K8s的Autoscaling可以根据负载情况动态调整RGW实例数量;
    利用K8s的分布式LB可以有效的分散RGW上访问压力。

涉及到的模块

  • RGW Cluster Manager
  • S3 API
  • NFS
  • Admin API
  • RGW

功能

资源管理功能

存储资源管理

  • 存储资源分配
    按容量(初始容量)优先分配
    按性能优先分配
  • 存储资源回收
  • 存储资源使用情况查询
    可以为计费模块统计提供资源使用情况

用户及权限管理

  • 用户管理
    用户的增加、删除、属性修改
  • 用户权限管理
    用户权限的授权、回收

配额管理

  • user 配额设置
    针对用户名下的对象数量、可使用容量(byte)进行配额设置
  • bucket 配额设置
    针对bucket下的对象数量、可使用容量(byte)进行配额设置

RGW节点网络控制管理

  • 访问RGW节点客户端黑、白名单机制
  • RGW节点接收请求的流量配额管理
  • RGW节点读写Ceph集群的流量配额管理

数据压缩、加密

  • RGW节点接收数据后在Server端完成对数据的压缩,压缩算法需要由用户或运维人员指定
  • RGW节点接收数据后在Server端完成对数据的加密,加密使用的密钥可人为指定

多种认证支持

  • MFA(Multi-Factor Authentication)认证
  • keystone认证
  • LDAP认证
  • V4认证

多租户管理

对多租户的支持可以允许不同的租户使用相同的用户名、bucket名。更友好的隔离数据,防止对用户和bucket的嗅探。

接口功能

支持Compatible-S3、Swift、NFS等多种接口。

NFS

支持将S3接口导出为NFS接口,方便符合POSIX标准的请求使用。

故障切换

RGW故障

由于RGW采用分布式部署方式,单个RGW的故障不影响整体使用。RGW由K8s发布提供服务,即使出现性能不足或多点故障,也都由K8s调度恢复。

Ceph集群故障

由于集群之间采用主备方式存储数据,即使主集群停止服务,也可通过备集群继续提供服务。

环境

硬件环境

  • CPU
  • 内存
  • 硬盘
    SAS 300G x 2
    SATA 6T x 4
    SSD 480G x 6

软件环境

  • 操作系统
    Centos 7.6.1810
  • Ceph软件版本
    14.2.2

部署方案

changcun_ceph_solution.png

OS

两个SAS盘(300G)做成RAID1,用于存储操作系统。

SATA Pool

  • OSD Data
    每个SATA(6T)做成RAID0,用于存储每个OSD数据
  • OSD Journal
    两个SSD(480G)做成RAID1,再分成4个分区给每台主机中的4个OSD提供Journal数据存储服务
  • ObjectStore
    OSD后端存储引擎使用Filestore
  • Replication
    副本数:3
    最小允许副本数:1

SSD Pool

  • OSD
    每个SSD(480G)做成RAID0,用于存储每个OSD的数据
  • ObjectStore
    OSD后端存储引擎使用Bluestore
  • Replication
    副本数:3
    最小允许副本数:1

部署步骤

Ceph集群部署

Ceph集群的节点分为管理节点、MON节点、OSD节点

节点 用途
MON节点 用于监控集群、为客户端提供ClusterMap等服务
OSD节点 数据存储节点,用于完成数据的持久化工作
ADMIN节点 集群维护管理节点,提供管理员权限
MDS节点 提供Cephfs服务
RGW节点 提供对象存储服务
MGR节点 提供监控(zabbix、prometheus等)、dashboard等服务
iSCSI-GW节点 提供iSCSI Target 服务

更多Ceph内容,请见此链接

  • 需要在部署集群前,做通管理节点与集群节点(包括:MON节点、OSD节点)之间的ssh无密码访问。
  • 将各个节点的hostname和ip地址对应后,写入/etc/hosts文件,并将此文件同步到各个节点上
    以ceph13为例:
    1
    2
    3
    4
    5
    6
    7
    [root@ceph13 cluster]# cat /etc/hosts
    127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

    10.53.2.13 ceph13 ceph13
    10.53.2.16 ceph16 ceph16
    10.53.2.19 ceph19 ceph19

Ceph-deploy 安装

在管理节点上安装Ceph-deploy工具。

安装EPEL

1
yum install -y epel-release

修改/增加ceph.repo,并安装ceph-deploy

1
2
3
4
5
6
7
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-nautilus/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
1
2
yum update -y
yum install -y ceph-deploy

Create the cluster

1
2
3
mkdir {my-cluster}
cd {my-cluster}
ceph-deploy new {initial-monitor-node(s)}

eg:

1
2
3
[root@ceph13 ~]# mkdir cluster
[root@ceph13 ~]# cd cluster
[root@ceph13 cluster]# ceph-deploy new ceph13 ceph16 ceph19

修改集群初始化配置

修改{my-cluster}目录中的ceph.conf

1
2
3
4
5
6
7
8
9
10
11
12
[root@ceph13 cluster]# ls -al
总用量 600
drwxr-xr-x. 2 root root 244 8月 21 15:51 .
dr-xr-x---. 8 root root 4096 8月 11 16:27 ..
-rw-------. 1 root root 113 8月 10 16:17 ceph.bootstrap-mds.keyring
-rw-------. 1 root root 113 8月 10 16:17 ceph.bootstrap-mgr.keyring
-rw-------. 1 root root 113 8月 10 16:17 ceph.bootstrap-osd.keyring
-rw-------. 1 root root 113 8月 10 16:17 ceph.bootstrap-rgw.keyring
-rw-------. 1 root root 151 8月 10 16:17 ceph.client.admin.keyring
-rw-r--r--. 1 root root 293 8月 10 15:15 ceph.conf
-rw-r--r--. 1 root root 580431 8月 10 17:13 ceph-deploy-ceph.log
-rw-------. 1 root root 73 8月 10 15:12 ceph.mon.keyring
  • 配置public、cluster网络
  • 配置osd rebalance
  • 配置scrub和deep-scrub
  • 关闭crushmap 启动更新配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    [global]

    public network = {ip-address}/{bits}
    cluster network = {ip-address}/{bits}

    osd crush update on start = false

    [osd]
    osd max backfills = 1
    osd recovery op priority = 1
    osd recovery max active = 1
    osd client op priority = 63
    osd recovery delay start = 0.5

    osd scrub chunk min = 1
    osd scrub chunk max = 5
    osd scrub sleep = 5
    osd deep scrub interval = 2592000 # 60(秒)*60(分)*24(时)*30(天)

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@ceph13 cluster]# cat /etc/ceph/ceph.conf 
[global]
fsid = 20192dd5-3228-4135-9831-c9d7de74a890
mon_initial_members = ceph13, ceph16, ceph19
mon_host = 10.53.2.13,10.53.2.16,10.53.2.19
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd crush update on start = false

public network = 10.53.2.0/24
cluster network = 10.53.1.0/24

[osd]
osd max backfills = 1
osd recovery op priority = 1
osd recovery max active = 1
osd client op priority = 63
osd recovery delay start = 0.5

osd scrub chunk min = 1
osd scrub chunk max = 5
osd scrub sleep = 5
osd deep scrub interval = 2592000

ceph软件安装

1
ceph-deploy install --stable nautilus {ceph-node(s)}

eg:

1
ceph-deploy install --stable nautilus ceph13 ceph16 ceph19

*** 此处安装过程比较慢,失败的话建议重试几次。***

MON节点创建初始化

1
ceph-deploy mon create-initial

此命令会根据ceph.conf进行MON节点的创建及初始化工作

部署管理节点

1
ceph-deploy admin {ceph-node(s)}

eg:

1
ceph-deploy admin ceph13 ceph16 ceph19

部署mgr节点(可选)

1
ceph-deploy mgr create {ceph-node(s)}

eg:

1
ceph-deploy mgr create ceph13 ceph16 ceph19

*** 若不部署mgr服务,集群会有告警,但不影响使用。***

部署OSD节点(Filestore)

1
ceph-deploy osd create --filestore --data {device path} --journal {device path} {ceph-node} 
  • --filestore
    指定数据存储引擎
  • --data
    指定osd数据存储设备(SATA盘)
  • --journal
    指定osd journal存储设备(SSD Journal盘)
  • ceph-node
    指定osd所在主机的hostname

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
ceph-deploy osd create ceph13 --filestore --data /dev/sdb --journal /dev/sdf1
ceph-deploy osd create ceph13 --filestore --data /dev/sdb --journal /dev/sdf1
ceph-deploy osd create ceph13 --filestore --data /dev/sdc --journal /dev/sdf2
ceph-deploy osd create ceph13 --filestore --data /dev/sdd --journal /dev/sdf3
ceph-deploy osd create ceph13 --filestore --data /dev/sde --journal /dev/sdf4
ceph-deploy osd create ceph16 --filestore --data /dev/sdb --journal /dev/sdf1
ceph-deploy osd create ceph16 --filestore --data /dev/sdc --journal /dev/sdf2
ceph-deploy osd create ceph16 --filestore --data /dev/sdd --journal /dev/sdf3
ceph-deploy osd create ceph16 --filestore --data /dev/sde --journal /dev/sdf4
ceph-deploy osd create ceph19 --filestore --data /dev/sdb --journal /dev/sdf1
ceph-deploy osd create ceph19 --filestore --data /dev/sdc --journal /dev/sdf2
ceph-deploy osd create ceph19 --filestore --data /dev/sdd --journal /dev/sdf3
ceph-deploy osd create ceph19 --filestore --data /dev/sde --journal /dev/sdf4

部署OSD节点(Bluestore)

1
ceph-deploy osd create --data {device path} {ceph-node}
  • --data
    指定osd数据存储设备(SSD盘)
  • ceph-node
    指定osd所在主机的hostname

eg:

1
2
3
4
5
6
7
8
9
10
11
12
ceph-deploy osd create ceph13 --data /dev/sdg
ceph-deploy osd create ceph13 --data /dev/sdh
ceph-deploy osd create ceph13 --data /dev/sdi
ceph-deploy osd create ceph13 --data /dev/sdj
ceph-deploy osd create ceph16 --data /dev/sdg
ceph-deploy osd create ceph16 --data /dev/sdh
ceph-deploy osd create ceph16 --data /dev/sdi
ceph-deploy osd create ceph16 --data /dev/sdj
ceph-deploy osd create ceph19 --data /dev/sdg
ceph-deploy osd create ceph19 --data /dev/sdh
ceph-deploy osd create ceph19 --data /dev/sdi
ceph-deploy osd create ceph19 --data /dev/sdj

部署完所有OSD节点后,此集群部署完成可以通过ceph -s查看集群状态。

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[root@ceph13 cluster]# ceph -s
cluster:
id: 20192dd5-3228-4135-9831-c9d7de74a890
health: HEALTH_OK

services:
mon: 3 daemons, quorum ceph13,ceph16,ceph19 (age 10d)
mgr: ceph13(active, since 10d), standbys: ceph16, ceph19
osd: 24 osds: 24 up (since 9d), 24 in (since 10d)

data:
pools: 3 pools, 1536 pgs
objects: 20.80k objects, 81 GiB
usage: 244 GiB used, 70 TiB / 71 TiB avail
pgs: 1536 active+clean

io:
client: 309 KiB/s rd, 145 KiB/s wr, 41 op/s rd, 12 op/s wr

[root@ceph13 cluster]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-15 5.21997 root ssd
-9 1.73999 host ceph13_ssd
12 ssd 0.43500 osd.12 up 1.00000 1.00000
13 ssd 0.43500 osd.13 up 1.00000 1.00000
14 ssd 0.43500 osd.14 up 1.00000 1.00000
15 ssd 0.43500 osd.15 up 1.00000 1.00000
-11 1.73999 host ceph16_ssd
16 ssd 0.43500 osd.16 up 1.00000 1.00000
17 ssd 0.43500 osd.17 up 1.00000 1.00000
18 ssd 0.43500 osd.18 up 1.00000 1.00000
19 ssd 0.43500 osd.19 up 1.00000 1.00000
-13 1.73999 host ceph19_ssd
20 ssd 0.43500 osd.20 up 1.00000 1.00000
21 ssd 0.43500 osd.21 up 1.00000 1.00000
22 ssd 0.43500 osd.22 up 1.00000 1.00000
23 ssd 0.43500 osd.23 up 1.00000 1.00000
-1 65.41200 root default
-3 21.80400 host ceph13_sata
0 hdd 5.45099 osd.0 up 1.00000 1.00000
1 hdd 5.45099 osd.1 up 1.00000 1.00000
2 hdd 5.45099 osd.2 up 1.00000 1.00000
3 hdd 5.45099 osd.3 up 1.00000 1.00000
-5 21.80400 host ceph16_sata
4 hdd 5.45099 osd.4 up 1.00000 1.00000
5 hdd 5.45099 osd.5 up 1.00000 1.00000
6 hdd 5.45099 osd.6 up 1.00000 1.00000
7 hdd 5.45099 osd.7 up 1.00000 1.00000
-7 21.80400 host ceph19_sata
8 hdd 5.45099 osd.8 up 1.00000 1.00000
9 hdd 5.45099 osd.9 up 1.00000 1.00000
10 hdd 5.45099 osd.10 up 1.00000 1.00000
11 hdd 5.45099 osd.11 up 1.00000 1.00000

iscsi-gw部署

依赖软件安装

iscsi-gw软件在192.168.1.70/home/zhoub/rpms目录下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[zhoub@CentOS ceph-iscsi-rpms]$ ls -al
总用量 588
drwxr-xr-x. 9 zhoub zhoub 4096 6月 19 16:31 .
drwxrwxr-x. 3 zhoub zhoub 53 8月 8 13:42 ..
drwxrwxr-x. 10 zhoub zhoub 4096 6月 19 16:10 ceph-iscsi
drwxrwxr-x. 9 zhoub zhoub 213 6月 19 16:10 configshell-fb
-rw-r--r--. 1 root root 284340 8月 11 2017 libnl3-3.2.28-4.el7.x86_64.rpm
drwxrwxr-x. 2 zhoub zhoub 240 6月 19 15:51 pip
drwxr-xr-x. 2 zhoub zhoub 4096 6月 19 16:10 pip_packages
-rw-r--r--. 1 root root 137912 11月 12 2018 pyOpenSSL-0.13.1-4.el7.x86_64.rpm
-rw-r--r--. 1 root root 96088 7月 4 2014 pyparsing-1.5.6-9.el7.noarch.rpm
-rw-r--r--. 1 root root 58008 7月 4 2014 python-kmod-0.9-4.el7.x86_64.rpm
-rw-r--r--. 1 zhoub zhoub 76 6月 19 16:10 requirement.txt
drwxrwxr-x. 11 zhoub zhoub 223 6月 19 16:10 rtslib-fb
drwxrwxr-x. 10 zhoub zhoub 248 6月 19 16:10 targetcli-fb
drwxr-xr-x. 2 root root 112 6月 19 16:28 tcmu-runner

pip安装

rpms/ceph-iscsi-rpms/pip目录下。

pip 安装依赖的软件

1
2
3
4
5
6
7
8
9
[zhoub@CentOS pip]$ ls -al
总用量 4080
drwxrwxr-x. 2 zhoub zhoub 240 6月 19 15:51 .
drwxr-xr-x. 9 zhoub zhoub 4096 6月 19 16:31 ..
-rw-rw-r--. 1 zhoub zhoub 3700178 6月 19 15:31 pip_19.1.1.tar.gz
-rw-r--r--. 1 root root 5932 3月 14 2015 python-backports-1.0-8.el7.x86_64.rpm
-rw-r--r--. 1 root root 12896 4月 25 2018 python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch.rpm
-rw-r--r--. 1 root root 35176 11月 21 2016 python-ipaddress-1.0.16-2.el7.noarch.rpm
-rw-r--r--. 1 root root 406404 8月 11 2017 python-setuptools-0.9.8-7.el7.noarch.rpm

安装pip及其依赖的软件

1
2
3
4
5
cd pip
yum localinstall *.rpm
tar -xzvf ./pip_19.1.1.tar.gz
cd pip_19.1.1
python setup.py install

安装pip package

在线安装使用rpms/ceph-iscsi-rpms/requirement.txt文件进行安装

1
2
3
4
5
6
7
8
9
[zhoub@CentOS ceph-iscsi-rpms]$  cat requirement.txt
pyudev>=0.16.1
Flask
requests
crypto
netifaces
urwid
pyparsing
cryptography
1
pip install -r ./requirement.txt

离线安装包在rpms/ceph-iscsi-rpms/pip_packages

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[zhoub@CentOS pip_packages]$ ls -al
总用量 5828
drwxr-xr-x. 2 zhoub zhoub 4096 6月 19 16:10 .
drwxr-xr-x. 9 zhoub zhoub 4096 6月 19 16:31 ..
-rw-r--r--. 1 zhoub zhoub 101571 6月 19 16:10 asn1crypto-0.24.0-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 157119 6月 19 16:10 certifi-2019.6.16-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 415091 6月 19 16:10 cffi-1.12.3-cp27-cp27mu-manylinux1_x86_64.whl
-rw-r--r--. 1 zhoub zhoub 133356 6月 19 16:10 chardet-3.0.4-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 81299 6月 19 16:10 Click-7.0-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 18019 6月 19 16:10 crypto-1.4.1-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 2288455 6月 19 16:10 cryptography-2.7-cp27-cp27mu-manylinux1_x86_64.whl
-rw-r--r--. 1 zhoub zhoub 12427 6月 19 16:10 enum34-1.1.6-py2-none-any.whl
-rw-r--r--. 1 zhoub zhoub 92053 6月 19 16:10 Flask-1.0.3-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 58594 6月 19 16:10 idna-2.8-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 18155 6月 19 16:10 ipaddress-1.0.22-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 16743 6月 19 16:10 itsdangerous-1.1.0-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 124883 6月 19 16:10 Jinja2-2.10.1-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 24348 6月 19 16:10 MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl
-rw-r--r--. 1 zhoub zhoub 590559 6月 19 16:10 Naked-0.1.31-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 31249 6月 19 16:10 netifaces-0.10.9-cp27-cp27mu-manylinux1_x86_64.whl
-rw-r--r--. 1 zhoub zhoub 158295 6月 19 16:10 pycparser-2.19.tar.gz
-rw-r--r--. 1 zhoub zhoub 62288 6月 19 16:10 pyparsing-2.4.0-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 89469 6月 19 16:10 pyudev-0.21.0.tar.gz
-rw-r--r--. 1 zhoub zhoub 274442 6月 19 16:10 PyYAML-5.1.1.tar.gz
-rw-r--r--. 1 zhoub zhoub 57952 6月 19 16:10 requests-2.22.0-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 4933 6月 19 16:10 shellescape-3.4.1-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 10586 6月 19 16:10 six-1.12.0-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 150942 6月 19 16:10 urllib3-1.25.3-py2.py3-none-any.whl
-rw-r--r--. 1 zhoub zhoub 604167 6月 19 16:10 urwid-2.0.1.tar.gz
-rw-r--r--. 1 zhoub zhoub 327611 6月 19 16:10 Werkzeug-0.15.4-py2.py3-none-any.whl

安装依赖rpms

rpm包在rpms/ceph-iscsi-rpms/目录下。

1
2
3
4
yum localinstall libnl3-3.2.28-4.el7.x86_64.rpm
yum localinstall pyOpenSSL-0.13.1-4.el7.x86_64.rpm
yum localinstall pyparsing-1.5.6-9.el7.noarch.rpm
yum localinstall python-kmod-0.9-4.el7.x86_64.rpm

安装TCMU-RUNNER

rpm包在rpms/ceph-iscsi-rpms/tcmu-runner目录下。

1
2
cd tcmu-runner
yum localinstall *.rpm

启动tcmu-runner服务

1
2
3
systemctl daemon-reload
systemctl enable tcmu-runner
systemctl start tcmu-runner

源码地址:https://github.com/open-iscsi/tcmu-runner
commit:8d8e612e50b7787c57f32f59bba7def9bb06954b

安装RTSLIB-FB

1
2
cd rtslib-fb
python setup.py install

源码地址:https://github.com/open-iscsi/rtslib-fb
commit: 03d6c7813187cd141a3a08f4b7978190187d56c1

安装CONFIGSHELL-FB

1
2
cd configshell-fb
python setup.py install

源码地址:https://github.com/open-iscsi/configshell-fb
commit: 166ba97e36d7b53e7fa53d7853a8b9f5a509503c

安装TARGETCLI-FB

1
2
3
4
cd targetcli-fb
python setup.py install
mkdir /etc/target
mkdir /var/target

源码地址:https://github.com/open-iscsi/targetcli-fb
commit: 85031ad48b011f5626cd0a287749abcaa145277b

安装CEPH-ISCSI

1
2
3
4
cd ceph-iscsi
python setup.py install --install-scripts=/usr/bin
cp ./usr/lib/systemd/system/rbd-target-gw.service /lib/systemd/system/
cp ./usr/lib/systemd/system/rbd-target-api.service /lib/systemd/system/

启动rbd-target-gwrbd-target-api服务

1
2
3
4
5
systemctl daemon-reload
systemctl enable rbd-target-gw
systemctl enable rbd-target-api
systemctl start rbd-target-gw
systemctl start rbd-target-api

源码地址:https://github.com/ceph/ceph-iscsi
commit: c5ebf29e1a0caa2e4bef44370b40fe940b66aaad

配置iscsi-gateway.cfg

创建一个/etc/ceph/iscsi-gateway.cfg文件,在文件中增加如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[config]
# Name of the Ceph storage cluster. A suitable Ceph configuration file allowing
# access to the Ceph storage cluster from the gateway node is required, if not
# colocated on an OSD node.
cluster_name = ceph

# Place a copy of the ceph cluster's admin keyring in the gateway's /etc/ceph
# drectory and reference the filename here
gateway_keyring = ceph.client.admin.keyring


# API settings.
# The API supports a number of options that allow you to tailor it to your
# local environment. If you want to run the API under https, you will need to
# create cert/key files that are compatible for each iSCSI gateway node, that is
# not locked to a specific node. SSL cert and key files *must* be called
# 'iscsi-gateway.crt' and 'iscsi-gateway.key' and placed in the '/etc/ceph/' directory
# on *each* gateway node. With the SSL files in place, you can use 'api_secure = true'
# to switch to https mode.

# To support the API, the bear minimum settings are:
api_secure = false

# Additional API configuration options are as follows, defaults shown.
# api_user = admin
# api_password = admin
# api_port = 5001
# iscsi-gw 最少需要部署两个服务
trusted_ip_list = 10.53.2.13,10.53.2.16,10.53.2.19

重启rbd-target-api服务

1
2
3
systemctl daemon-reload
systemctl stop rbd-target-api
systemctl start rbd-target-api

*** rbd-target-api 需要依赖 rbd pool,若集群中没有rbd pool ,需要手动创建。 ***

配置iscsi-target

在iscsi-gw服务所在节点上输入gwcli进入gw交互模式

创建target iqn

eg:

1
2
/> cd /iscsi-target
/iscsi-target> create iqn.2019-08.com.hna.iscsi-gw:iscsi-igw

创建iscsi-gateway

eg:

1
2
3
4
/iscsi-target> cd iqn.2019-08.com.hna.iscsi-gw:iscsi-igw/gateways
/iscsi-target...-igw/gateways> create ceph13 10.53.2.13
/iscsi-target...-igw/gateways> create ceph16 10.53.2.16
/iscsi-target...-igw/gateways> create ceph19 10.53.2.19

创建gateway时,输入的gateway名称为hostname, ip要与其对应上,并且在/etc/hosts文件中也要将hostnameip对应上。

创建rbd image

eg:

1
2
3
/iscsi-target...-igw/gateways> cd /disks
/disks> create pool=sata image=vol_sata_23t size=23T
/disks> create pool=ssd image=vol_ssd_1800g size=1800G

创建client iqn

eg:

1
2
3
4
5
6
7
8
/disks> cd /iscsi-targets/iqn.2019-08.com.hna.iscsi-gw:iscsi-igw/hosts/
/iscsi-target...csi-igw/hosts> create iqn.2019-08.com.example:2b14c50a

/disks> cd /iscsi-targets/iqn.2019-08.com.hna.iscsi-gw:iscsi-igw/hosts/
/iscsi-target...csi-igw/hosts> create iqn.2019-08.com.example:479172ae

/disks> cd /iscsi-targets/iqn.2019-08.com.hna.iscsi-gw:iscsi-igw/hosts/
/iscsi-target...csi-igw/hosts> create iqn.2019-08.com.example:066f5c54

设置chap用户名密码
eg:

1
2
3
4
5
6
7
8
/> cd iscsi-targets/iqn.2019-08.com.hna.iscsi-gw:iscsi-igw/hosts/iqn.2019-08.com.example:2b14c50a/
/iscsi-target...mple:2b14c50a> auth username=iqn.2019-08.com.example password=1qaz2wsx3edc

/> cd iscsi-targets/iqn.2019-08.com.hna.iscsi-gw:iscsi-igw/hosts/iqn.2019-08.com.example:479172ae/
/iscsi-target...mple:479172ae> auth username=iqn.2019-08.com.example password=1qaz2wsx3edc

/> cd iscsi-targets/iqn.2019-08.com.hna.iscsi-gw:iscsi-igw/hosts/iqn.2019-08.com.example:066f5c54/
/iscsi-target...mple:066f5c54> auth username=iqn.2019-08.com.example password=1qaz2wsx3edc

创建host-groups

eg:

1
2
/> cd iscsi-targets/iqn.2019-08.com.hna.iscsi-gw:iscsi-igw/host-groups/
/iscsi-target...w/host-groups> create xen

添加client iqn

eg:

1
2
3
4
/> cd iscsi-targets/iqn.2019-08.com.hna.iscsi-gw:iscsi-igw/host-groups/xen/
/iscsi-target...st-groups/xen> host add iqn.2019-08.com.example:066f5c54
/iscsi-target...st-groups/xen> host add iqn.2019-08.com.example:2b14c50a
/iscsi-target...st-groups/xen> host add iqn.2019-08.com.example:479172ae

添加rbd image

eg:

1
2
3
/> cd iscsi-targets/iqn.2019-08.com.hna.iscsi-gw:iscsi-igw/host-groups/xen/
/iscsi-target...st-groups/xen> disk add sata/vol_sata_23t
/iscsi-target...st-groups/xen> disk add ssd/vol_ssd_1800g

至此iscsi-gw的搭建及配置完成,客户端可以通过iscsi协议访问ceph存储了。

eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/> ls
o- / ......................................................................................................................... [...]
o- cluster ......................................................................................................... [Clusters: 1]
| o- ceph ............................................................................................................ [HEALTH_OK]
| o- pools .......................................................................................................... [Pools: 3]
| | o- rbd ................................................................... [(x3), Commit: 0.00Y/21703946M (0%), Used: 6823b]
| | o- sata ......................................................... [(x3), Commit: 23.0T/21703946M (111%), Used: 14325219841b]
| | o- ssd ........................................................ [(x3), Commit: 1800G/1744741760K (108%), Used: 27569961653b]
| o- topology ............................................................................................... [OSDs: 24,MONs: 3]
o- disks ...................................................................................................... [25352G, Disks: 2]
| o- sata ......................................................................................................... [sata (23.0T)]
| | o- vol_sata_23t .................................................................................. [sata/vol_sata_23t (23.0T)]
| o- ssd ........................................................................................................... [ssd (1800G)]
| o- vol_ssd_1800g ................................................................................. [ssd/vol_ssd_1800g (1800G)]
o- iscsi-targets ............................................................................... [DiscoveryAuth: None, Targets: 1]
o- iqn.2019-08.com.hna.iscsi-gw:iscsi-igw ........................................................................ [Gateways: 3]
o- disks .......................................................................................................... [Disks: 2]
| o- sata/vol_sata_23t ....................................................................................... [Owner: ceph13]
| o- ssd/vol_ssd_1800g ....................................................................................... [Owner: ceph19]
o- gateways ............................................................................................ [Up: 3/3, Portals: 3]
| o- ceph13 ................................................................................................ [10.53.2.13 (UP)]
| o- ceph16 ................................................................................................ [10.53.2.16 (UP)]
| o- ceph19 ................................................................................................ [10.53.2.19 (UP)]
o- host-groups .................................................................................................. [Groups : 1]
| o- xen ................................................................................................ [Hosts: 3, Disks: 2]
| o- iqn.2019-08.com.example:066f5c54 ............................................................................... [host]
| o- iqn.2019-08.com.example:2b14c50a ............................................................................... [host]
| o- iqn.2019-08.com.example:479172ae ............................................................................... [host]
| o- sata/vol_sata_23t .............................................................................................. [disk]
| o- ssd/vol_ssd_1800g .............................................................................................. [disk]
o- hosts .............................................................................................. [Hosts: 3: Auth: CHAP]
o- iqn.2019-08.com.example:2b14c50a .............................................. [LOGGED-IN, Auth: CHAP, Disks: 2(25352G)]
| o- lun 0 ....................................................................... [sata/vol_sata_23t(23.0T), Owner: ceph13]
| o- lun 1 ....................................................................... [ssd/vol_ssd_1800g(1800G), Owner: ceph19]
o- iqn.2019-08.com.example:479172ae .............................................. [LOGGED-IN, Auth: CHAP, Disks: 2(25352G)]
| o- lun 0 ....................................................................... [sata/vol_sata_23t(23.0T), Owner: ceph13]
| o- lun 1 ....................................................................... [ssd/vol_ssd_1800g(1800G), Owner: ceph19]
o- iqn.2019-08.com.example:066f5c54 .............................................. [LOGGED-IN, Auth: CHAP, Disks: 2(25352G)]
o- lun 0 ....................................................................... [sata/vol_sata_23t(23.0T), Owner: ceph13]
o- lun 1 ....................................................................... [ssd/vol_ssd_1800g(1800G), Owner: ceph19]

参考&鸣谢

部署创建

可以使用ceph-osd命令单独创建初始化OSD日志

1
ceph-osd -i {osd-id} --mkjournal

默认在/var/lib/ceph/osd/ceph-{osd.id}目录下的journal文件中初始化日志数据;也可以通过-c制定配置文件ceph.conf,再在配置文件中制定OSD日志所在路径。

配置

osd journal

journal所在的位置,默认为/var/lib/ceph/osd/{cluster}-{osd.id}/jouranl。可以是一个文件也可以是一个块设备。

osd jouranl size

日志的大小,不同版本其默认值也不一样。通常根据OSD盘的性能来设置其大小。
osd journal size = 2 * 写入带宽 * filestore max sync interval 写入带宽一般是固定的,所以可以根据filestore max sync interval来计算journal的大小。或者根据journal大小来设置filestore max sync interval

更换迁移

更换Journal盘有2种情况

Journal盘挂了

只能删除对应的OSD重新创建

Journal还在运行

  1. 设置noout标记
  2. 停止关联的OSD
  3. 下刷 journal 到 osd ceph-osd -i {osd.io} --flush-journal
  4. 删除旧的 journal 链接
  5. 重建journal 链接
  6. 重建 journal ceph-osd -i {osd.id} --mkjournal
  7. 启动关联的OSD
  8. 去除noout标记

参考&鸣谢

  1. 如果http请求中没有携带身份信息(AccessKey),则改该请求为匿名请求,会被认为是来自匿名用户的访问。
  2. 如果http请求中携带了身份信息(AccessKey),则认为访问来自该AccessKey所对应的用户。由于AccessKey是可以被他人获取到的, 为了防止其他人冒用您的AccessKey来访问服务,请求中还必须携带您的签名。在申请帐号以后,您将得到AccessKey和SecretKey, SecretKey是需要保密的。签名是由此次http请求的相关信息和您的SecretKey计算得到的,其他人因为不知道您的SecretKey,将不能 计算出正确的签名。
  3. 身份信息与签名可以放到请求头(Authorization)中,也可以放到请求参数中。
  4. 签名的方式与Amazon S3的签名方式兼容,支持signature version 2signature version 4

参考&鸣谢

s3 authorization v2

参数传递

通过Authorization请求头

1
Authorization: AWS AWSAccessKeyId:Signature
  • AWSAccessKeyId: 你的AccessKey
  • Signature: 计算得到的签名

eg:

1
Authorization: AWS ziw5dp1alvty9n47qksu:frJIUN8DYpKDtOLCwo//yllqDzg=

通过请求参数

HTTP请求中的参数:

  • AWSAccessKeyId: 你的AccessKey
  • Signature: 计算得到的签名
  • Expires: 签名的过期时间

eg:

1
GET /yourbucket/yourkey?AWSAccessKeyId=ziw5dp1alvty9n47qksu&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D

签名计算

1
Signature = Base64(HMAC-SHA1(YourSecretKey, UTF-8-Encoding-Of(StringToSign)))
  • YourSecretKey: 你的SecretKey
  • StringToSign

StringToSign

1
2
3
4
5
6
StringToSign =  HTTP-Verb + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Date|Expires + "\n" +
CanonicalizedAmzHeaders +
CanonicalizedResource
  • HTTP-Verb: 请求的方法,如:PUTGETDELETEPOST
  • Content-MD5: 请求头Content-MD5的内容,如果没有这个头,由空字符串代替
  • Content-Type: 请求头Content-Type的内容,如果没有这个头,由空字符串代替
  • Date|Expires: 如果使用Authorization头携带签名信息,为Date头的内容,如果没有Date头,由空字符串代替;如果使用请求参数携带签名信息,为参数Expires的内容
  • CanonicalizedAmzHeaders: 请求中所有以x-amz-开始的头所组成的字符串,如果没有这样的头,由空字符串代替
    eg:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    原始请求头:
    Date: Tue, 27 Mar 2007 19:36:42 +0000
    X-Amz-b: Bar
    x-amz-a: foob
    x-Amz-a: fooa
    Host: johnsmith.s3.amazonaws.com

    对应的CanonicalizedAmzHeaders为:
    x-amz-a:fooa,foob
    x-amz-b:Bar
  • CanonicalizedResource: 请求所对应的资源
    eg:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    GET /?foo=bar
    GET /yourbucket/yourkey?foo=bar
    GET /yourbucket/yourkey?acl&foo=bar

    对应的nicalizedResource分别为:


    /yourbucket/yourkey
    /yourbucket/yourkey?acl

参考&鸣谢

s3 authorization v4

参数传递

通过Authorization请求头

eg:

1
Authorization: AWS4-HMAC-SHA256 Credential=ziw5dp1alvty9n47qksu/20160830/us-east-1/s3/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7
  • Credential 由AccessKey,请求的日期,region,服务名,aws4_request五部分组成,各部分之间用斜线分隔
  • SignedHeaders 表示那些头参与了签名的计算,未包含在这里的头不会影响到签名的生成
  • Signature 计算得到的签名

通过请求参数

eg:

1
GET /yourbucket/test.mp4??X-Amz-Algorithm=AWS4-HMAC-SHA256&&X-Amz-Credential=ziw5dp1alvty9n47qksu/20160830/us-east-1/s3/aws4_request&X-Amz-Date=20160830T201207Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7
  • X-Amz-Algorithm 计算签名时使用的Hash算法,指定为AWS4-HMAC-SHA256
  • X-Amz-Credential 包含了AccessKey,日期,region,服务名的信息
  • X-Amz-Date 请求的时间
  • X-Amz-Expires 指定签名在多长时间内有效
  • X-Amz-SignedHeaders 计算签名时用到的头
  • X-Amz-Signature 计算得的到签名

签名计算

1
signature = HexEncode(HMAC-SHA256(kSigning, StringToSign))

kSigning

1
2
3
4
5
kSecret = YourSecretKey
kDate = HMAC("AWS4" + kSecret, Date)
kRegion = HMAC(kDate, Region)
kService = HMAC(kRegion, Service)
kSigning = HMAC(kService, "aws4_request")
  • YourSecretKey 你的SecretKey
  • Date 8位数的日期,应与Credentail中的Date部分一样
  • Region 应与Credential中的region部分一样
  • Service 应与Credential中的服务名部分一样
  • kSigning 为用于计算签名的signing key

StringToSign

1
2
3
4
5
StringToSign  =
Algorithm + '\n' +
RequestDate + '\n' +
CredentialScope + '\n' +
HashedCanonicalRequest
  • Algorithm 指定为AWS4-HMAC-SHA256
  • RequestDate ISO8601 basic 格式的请求时间,如:20160830T123600Z
  • CredentialScope 日期,region,服务名等组成的字符串, 如:20160830/us-east-1/s3/aws4_request
  • HashedCanonicalRequest Hex(SHA256Hash(CanonicalRequest)),即CanonicalRequest的hash的16进制编码

CanonicalRequest

1
2
3
4
5
6
7
CanonicalRequest =
HTTPRequestMethod + '\n' +
CanonicalURI + '\n' +
CanonicalQueryString + '\n' +
CanonicalHeaders + '\n' +
SignedHeaders + '\n' +
HexEncode(Hash(RequestPayload))
  • HTTPRequestMethod 如: PUT, GET, DELETE, POST
  • CanonicalURI 请求的uri
  • CanonicalQueryString 请求参数排序后组成的字符串
  • CanonicalHeaders 需要加入签名计算的头排序后组成的字符串
  • SignedHeaders 加入到签名计算的头的名字的列表,各个名字之间用逗号分隔
  • HexEncode(Hash(RequestPayload)) 请求body的hash的16进制编码,如果通过请求参数携带签名,此处应由字符串UNSIGNED-PAYLOAD代替

参考&鸣谢

PG的全称为Placement Group(放置组),放置顾名思义放置Object的载体。PG的创建是在创建Pool的时候根据指定的数量进行创建。PG的数量与副本数也有关系,比如是3副本的则会有3个相同的pg存在于3个不同的osd上,以filestore为例pg其实在osd的存在形式就是一个目录。其目录的命名规则为 {pool-id}.{pg-id}_head{pool-id}.{pg-id}.TEMP。如果你想找出一个pg对应哪些个osd,可以使用ceph pg map {pgid}的命令。

eg:

1
2
[root@ceph71 ~]# ceph pg map 1.5f
osdmap e30 pg 1.5f (1.5f) -> up [2,0,1] acting [2,0,1]

背景就是介绍这么多吧,接下来说说PG状态。

状态

状态 描述
active 当前拥有最新状态数据的pg正在工作中,能正常处理来自客户端的读写请求。
inactive 正在等待具有最新数据的OSD出现,即当前具有最新数据的pg不在工作中,不能正常处理来自客户端的读写请求。
activating Peering 已经完成,PG 正在等待所有 PG 实例同步并固化 Peering 的结果 (Info、Log 等)
clean pg所包含的object达到指定的副本数量,即object副本数量正常
unclean PG所包含的object没有达到指定的副本数量,比如一个PG没在工作,另一个PG在工作,object没有复制到另外一个PG中。
peering PG所在的OSD对PG中的对象的状态达成一个共识(维持对象一致性)
peered peering已经完成,但pg当前acting set规模小于存储池规定的最小副本数(min_size)
degraded 主osd没有收到副osd的写完成应答,比如某个osd处于down状态
stale 主osd未在规定时间内向mon报告其pg状态,或者其它osd向mon报告该主osd无法通信
inconsistent PG中存在某些对象的各个副本的数据不一致,原因可能是数据被修改
incomplete peering过程中,由于无法选出权威日志,通过choose_acting选出的acting set不足以完成数据修复,导致peering无法正常完成
repair pg在scrub过程中发现某些对象不一致,尝试自动修复
undersized pg的副本数少于pg所在池所指定的副本数量,一般是由于osd down的缘故
scrubbing pg对对象meta的一致性进行扫描
deep pg对对象数据的一致性进行扫描
creating pg正在被创建
recovering pg间peering完成后,对pg中不一致的对象执行同步或修复,一般是osd down了或新加入了osd
recovering-wait 等待 Recovery 资源预留
backfilling 一般是当新的osd加入或移除掉了某个osd后,pg进行迁移或进行全量同步
down 包含必备数据的副本挂了,pg此时处理离线状态,不能正常处理来自客户端的读写请求
remapped 重新映射态。PG 活动集任何的一个改变,数据发生从老活动集到新活动集的迁移。在迁移期间还是用老的活动集中的主 OSD 处理客户端请求,一旦迁移完成新活动集中的主 OSD 开始处理
misplaced 有一些回填的场景:PG被临时映射到一个OSD上。而这种情况实际上不应太久,PG可能仍然处于临时位置而不是正确的位置。这种情况下个PG就是misplaced。这是因为正确的副本数存在但是有个别副本保存在错误的位置上。

异常

active+undersized+degraded

若发现有osd挂掉,先尝试将osd重新拉起来,拉起来后集群会自动重新恢复健康状态。
但是也有可能出现这个osd再也起不来了,比如硬盘损坏了,这时多副本就发挥作用了,因为还有其它副本在其它osd上,这时我们可以通过均衡数据的方法来将集群恢复并将该osd踢出集群。

** 解决 **

  1. 将osd reweight权重置0,将数据分散到其他osd上 ceph osd reweight {osd-id} 0
  2. 待集群rebalance后,开始删除osd

unfound objects

ceph集群知道该对象存在,但无法定位该object在哪时会报这个错误。

** 解决 **

  1. 尝试让失败的osd起来,如果起来后集群恢复正常,则结束
  2. 试将该pg的unfound对象回滚到上一个版本,ceph pg {pgid} mark_unfound_lost revert如果恢复正常,则结束
  3. 如果还是不行,那只有将该object删除掉了,注意这会导致丢失数据,执行ceph pg {pgid} mark_unfound_lost delete删除unfound对象

inconsistent objects

pg中保存的object中有些副本数据不一致,有些事伴随着scrub errors错误

** 解决 **

  1. ceph health detail找出问题pg
  2. 尝试ceph pg repair {pgid},若成功,则结束;不成功进行如下操作。
  3. 使用ceph pg map {pgid}找出主osd,打开日志查看哪个object不一致
  4. 找出所有该objects所有副本存放的位置,用摘要算法(md5sum,sha256)等计算出其hash值,如果是3副本,删除与其他副本不一致的;如果是2副本,则可能会误删。
  5. 再次执行ceph pg repair {pgid}

stale pg

pg出现stale状态,也就是pg处于僵死状态,该状态是无法处理新的请求了的,新的请求过来只会block,这种情况一般是由于所有副本pg的osd都挂了。
Ceph使用心跳来确保主机和进程都在运行,OSD进程如果不能周期性的发送心跳包,那么PG就会变成stuck状态。默认情况下,OSD每半秒钟汇汇报一次PG,up thru,boot, failure statistics等信息,要比心跳包更会频繁一点。如果主OSD不能汇报给MON或者其他OSD汇报主OSD挂了,Monitor会将主OSD上的PG标记为stale。当启动集群后,直到peer过程完成,PG都会处于stale状态。而当集群运行了一段时间后,如果PG卡在stale状态,说明主OSD上的PG挂了或者不能给MON发送信息。

要模拟其实也很简单,比如设置2副本,然后将2个不同故障域的osd挂掉即可出现,最好的恢复方法当然是重新拉起这两个osd,但有时可能出现这样的情况,两个osd永远也拉不起来了,然后你把这两个osd清理出去了,清理完后这些pg当然就是stale的状态,这时的恢复方法只能是丢掉这个pg里的数据了,重新创建pg。

** 解决 **

  1. 使用命令ceph pg dump |grep stale找出所有的stale的pg,也可以ceph health detail | grep stale
  2. 执行ceph pg force_create_pg {pgid}命令强制重新创建pg,会看到pg转为creating状态
  3. 重启ceph中所有osd服务

Peered

Peering 已经完成,但是 PG 当前 Acting Set 规模小于存储池规定的最小副本数 (min_size)。
如果pool的副本数为3、min_size=2,停掉两个副本所在的osd,此时访问集群的客户端处于blocked状态。

** 解决 **

  1. 先尝试将down掉的两个osd恢复,或至少恢复一个。
  2. 若不能正常恢复,可修改min_size=1,解除客户端blocked状态

鸣谢&参考

Backfill和Recovery都是用来恢复数据的,但二者的区别是Backfill是全量恢复,Recovery是增量恢复。而且在恢复过程中当出现Client访问恢复数据现象时,Backfill不会block client i/o,但Recovery会block client i/o。但二者如果占用带宽过大,还是会影响client i/o的。

环境

Ceph Version : Jewel

优化

  • 默认情况下将Backfill和Recovery对Client I/O的影响降到最小。
  • 当需要Backfill或Recovery时,要根据集群负载动态调整。若集群负载低,可通过ceph tell {osd.id} injectargs "--config value"的放方式动态调整恢复速度,使其快速完成恢复操作。
  • 当恢复完成后,再次将Backfill和Recovery调整回默认值,以降低对Client I/O的影响。

Recovery 参数说明

参数 描述 默认值
osd recovery max active 每个 OSD 一次处理的活跃恢复请求数量,增大此值能加速恢复,但它们会增加集群负载。 15
osd recovery max chunk 一次推送的数据块的最大尺寸。 8 << 20
osd recovery threads 数据恢复时的线程数。 1
osd recovery thread timeout 恢复线程最大死亡时值。 30

Backfill 参数说明

参数 描述 默认值
osd max backfills 单个 OSD 允许的最大回填操作数。 1
osd backfill full ratio OSD 的占满率达到多少时拒绝接受回填请求 0.85
osd backfill retry interval 重试回填请求前等待秒数 10.0

原理

Todo…

问题

  • 增加了RBD Journal的写入操作,是否会产生写放大现象。
  • Ceph-RBD-Mirror回放日志的的时间间隔
  • RBD Journal的容量大小如何配置
  • RBD Journal存储介质是否可以优化

使用

环境

要求

  • Ceph版本必须为Jewel及之后版本
    RBD-Mirror功能从Jewel版本引入,之前版本不支持该feature。本文以jewel版本为例进行演示。
  • RBD feature必须包含journaling
    RBD-Mirror依赖journal完成工作,类似Mysql的主从同步机制。使用日志回放方法备份数据。

准备

  • 准备两个集群分别为cls17和cls26
    cls17为primary集群,cls26为non-primary集群,将cls17内的RBD数据备份到cls26集群内

  • 在这两个集群中创建同名pool——rmp(RBD Mirror Pool)

ceph-rbd-mirror服务

根据RBD-Mirror的原理,需要在non-primery集群上启动ceph-rbd-mirror服务

** 安装 **

1
$ yum install -y rbd-mirror

** 启动 **

1
2
$ systemctl enable ceph-rbd-mirror@admin.service
$ systemctl start ceph-rbd-mirror@admin.service

@admin是ceph中的client.admin用户,只是这里省略了client.。关于Ceph用户管理相关操作可以使用ceph auth命令。

Copy Config & keyring

将cls17集群中的ceph.confceph.client.admin.keyringcopy到cls26集群的/etc/ceph目录中,并重命名成cls17.confcls17.client.admin.keyring。然后在cls26集群中可通过指定--cluster cls17来指定访问集群。

备份Pool中所有RBD

配置

Pool Mirror Mode

需要将两个集群的的rmppool的mirror mode设置成pool

集群cls26

1
$ rbd mirror pool enable rmp pool

集群cls17

1
$ rbd mirror pool enable rmp pool --cluster cls17

Add Peer

将Primary集群信息加入到rmppool中。

集群cls26

1
$ rbd mirror pool peer add rmp client.admin@cls17

查看两个集群的peer信息

1
2
3
4
5
6
7
8
9
$ rbd mirror pool info rmp
Mode: pool
Peers:
UUID NAME CLIENT
2c2c1293-0e97-4c57-9bf1-e5f934274758 cls17 client.admin
$
$ rbd mirror pool info rmp --cluster cls17
Mode: pool
Peers: none

至此备份Pool中所有RBD的配置操作已经完成,接下来进行验证操作。

测试

在集群cls17中rmppool创建RBD,并查看集群cls26中rmppool是否有回放操作(RBD是否备份到cls26集群)。由于整个RBD-Mirror依赖于journalingfeature,所以创建RBD时需要指定该feature。若对当前rmppool中存在RBD进行备份,需要先增加jouranlingfeature,使用rbd feature enable rmp/rd1 journaling命令。

集群cls17

1
$ rbd create -p rmp --image-format 2 --image-feature layering,exclusive-lock,object-map,fast-diff,deep-flatten,journaling -s 1G rd1

集群cls26

1
2
$ rbd -p rmp ls
rd1

备份单个RBD

配置

Pool Mirror Mode

将两个集群的rbdpool的mirror mode设置成image

1
$ rbd mirror pool enable rbd image

Add Peer

将Primary集群信息加入到rbdpool中。具体操作方法,同上。

Enable Image Mirror

集群cls17

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ rbd info rd1
rbd image 'rd1':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.ad616b8b4567
format: 2
features: exclusive-lock, journaling
flags:
journal: ad616b8b4567
mirroring state: disabled
$ rbd mirror image enable rbd/rd1
Mirroring enabled
$ rbd info rd1
rbd image 'rd1':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.ad616b8b4567
format: 2
features: exclusive-lock, journaling
flags:
journal: ad616b8b4567
mirroring state: enabled
mirroring global id: f0c9972d-7585-4bda-a486-baa9a6f96eb5
mirroring primary: true

集群cls26

1
2
3
4
5
6
7
8
9
10
11
12
$ rbd info rd1
rbd image 'rd1':
size 1024 MB in 256 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.8587327b23c6
format: 2
features: exclusive-lock, journaling
flags:
journal: 8587327b23c6
mirroring state: enabled
mirroring global id: f0c9972d-7585-4bda-a486-baa9a6f96eb5
mirroring primary: false

测试

(同上)

*** 无论是全Pool备份,还是单个RBD备份,只要建立mirror关系,只有primary rbd才能处理读写操作 ***