在虚拟机中快速搭建 Ansible 跟 Ceph 环境

在上一篇文章 Vagrant 单机快速模拟集群 https://imquanquan.net/archives/Vagrant-single-machine-fast-simulation-cluster.html 中,介绍了如何在本机中,快速利用 Vagrant 虚拟机管理工具快速起四台虚拟机来模拟集群,这篇文章将利用这些虚拟机来搭建一个 Ansible 跟 Ceph 的集群环境。

虚拟机配置

未分类

以上是各虚拟机节点的配置情况。四各节点内存都是 512 M,CPU 一核,系统 Dabian 9。

安装过程

1. 改 hostname 跟 hosts 文件

改 hostname 跟 hosts 有利于识别节点还有可以让节点之间靠 hostname 来通信。

创建虚拟机的时候已经设好了 hostname,把下面一段加入每个节点的 /etc/hosts 即可:

10.1.0.101    node1
10.1.0.102    node2
10.1.0.103    node3
10.1.0.104    deploy

2. 添加用户

下一件要做的就是,让添加部署的时候要用的用户了。在每个节点都执行:

sudo useradd -d /home/test -m test
sudo echo "test ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/test
sudo chmod 0440 /etc/sudoers.d/test
sudo passwd test

还顺便添加了无密码 sudo 的权限

3. 无密码 ssh 登录

添加部署节点 deploy 对 node 的无密码 ssh 登录,以搭建 Ansible 然后可以批量对 node 执行操作。在 deploy 执行:

su test
ssh-keygen
cat /home/test/.ssh/id_rsa.pub

三下回车生成密钥对,然后拷贝 /home/test/.ssh/id_rsa.pub 文件的内容到各个 node 节点:

su test
mkdir ~/.ssh
vi ~/.ssh/authorized_keys
sudo chmod 600 ~/.ssh/authorized_keys

编辑 ~/.ssh/config 文件:

Host node1
User test
Port 22

Host node2
User test
Port 22

Host node3
User test
Port 22

安装 Ansible

以下操作无特殊说明都在 deploy 节点进行操作。

1. 从包管理工具安装

sudo apt update && sudo apt install ansible

2. 修改 Ansible 配置文件

在 /etc/ansible/hosts 文件加入:

[ceph-deploy]
localhost  ansible_connection=local


[ceph-node]
node1
node2
node3

3. 验证&&测试:

ansible all -m ping

Ceph deploy 节点安装

1. 从包管理工具安装

添加 release key,软件源。这里安装的是 jewel 版本的 ceph:

wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -
echo deb http://download.ceph.com/debian-jewel/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list

更新,安装:

sudo apt-get update && sudo apt-get install ceph-deploy

Ceph 节点安装准备

1. 安装 ntp

修改时区:

ansible all -a "cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime" --sudo

建议在所有 Ceph 节点上安装 NTP 服务(特别是 Ceph Monitor 节点),并跟同一个 ntp 服务器进行时间同步,以免因时钟漂移导致故障:

ansible all -a   "apt update" --sudo
ansible all -a   "apt install ntp -y" --sudo

编辑 ntp 配置文件:

vi ntp.conf

restrict cn.pool.ntp.org
server cn.pool.ntp.org

分发,重启服务:

ansible all -m copy -a "src=/home/test/ntp.conf dest=/etc/ntp.conf" --sudo
ansible all -a "systemctl restart ntp" --sudo 

2. 安装依赖

安装 python-minimal:

ansible all -a "apt -y install python-minimal -y" --sudo

3. 开放端口

ansible all -a "iptables -A INPUT -i eth0 -p tcp -s 10.1.0.0/24 --dport 6789 -j ACCEPT" --sudo
ansible all -a "iptables -A INPUT -i eth0 -p tcp -s 10.1.0.0/24 --dport 6800:7300 -j ACCEPT" --sudo
ansible all -a "iptables-save" --sudo

ceph-mon 安装

1. 添加 mon 节点

mkdir ceph-cluster && cd ceph-cluster
ceph-deploy new node1 node2 node3

2. 修改配置文件

修改 ceph.conf 文件,添加:

# osd 节点个数
osd_pool_default_size = 3
# osd 节点最小个数
osd_pool_default_min_size = 1
# ceph 公共网络
public network = 10.1.0.0/24

2. 安装 ceph 节点

使用华中科大镜像源安装:

ansible all -a "wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add -" sudo
ceph-deploy install --repo-url http://mirrors.ustc.edu.cn/ceph/debian-jewel/ node1 node2 node3

3. 初始化 mon 节点

ceph-deploy mon create-initial
ceph-deploy admin  node1 node2 node3

ceph osd 节点安装

1. 查看集群 uuid

集群的 uuid 就是这个 ceph 集群的唯一标识,后面要用:

cat ceph.conf

[global]
fsid = 88fc281e-b9d0-4de3-b662-eaf3bef46943
mon_initial_members = node1, node2, node3
mon_host = 10.1.0.101,10.1.0.102,10.1.0.103
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

osd_pool_default_size = 3
osd_pool_default_min_size = 1
public network = 10.1.0.0/24

其中 88fc281e-b9d0-4de3-b662-eaf3bef46943 就是 uuid

2. 安装 osd

ssh 到各个节点,执行以下命令:

mkdir /home/test/osd0
sudo chown ceph: /home/test/osd0/
sudo ceph-disk prepare --cluster ceph   --cluster-uuid 88fc281e-b9d0-4de3-b662-eaf3bef46943 --fs-type  ext4 /home/test/osd0/
sudo ceph-disk activate /home/test/osd0/

以上命令是在 node1 上执行的,请将 uuid 替换成自己的,–fs-type 是 ext4,请换成自己的类型。然后将 osd0 替换掉对应节点的 osd 编号。

3. 查看集群健康状况

当所有节点都安装完成,可以在任一节点执行以下命令查看集群健康状况:

ceps -s

kubernetes集群使用Ceph

https://blog.csdn.net/aixiaoyang168/article/details/78999851

经实验,在一个node上多个Pod是可以以ReadWrite模式挂载同一个CephRBD,但是跨node则不行,会提示image xxx is locked by other nodes。而我们的应用场景是需要多个node挂载一个ceph的,在我们的应用场景需要使用CephFS。

使用cephfs的场景:创建一个fs,挂载的时候指定path。

kubernetes使用CephFS的两种方式:

1.直接通过pod挂载

apiVersion: v1
kind: Pod
metadata:
name: cephfs2
spec:
containers:
- name: cephfs-rw
image: busybox
command: ["sleep", "60000"]
volumeMounts:
- mountPath: "/mnt/cephfs"
name: cephfs
volumes:
- name: cephfs
cephfs:
monitors:
- '<your_etcd_ip>:6789'
user: admin
secretRef:
name: ceph-secret
readOnly: false

2.通过创建pv、pvc挂载

在ceph集群上找到key:

[cephd@<your_ceph_machine> ~]$ ceph auth get-key client.admin | base64
QVFBNEhnNWJpQmN1RWhBQUhWSmJKZTVtOG9jWUdkNmlYMnA5dmc9PQ==

创建secret:

apiVersion: v1
kind: Secret
metadata:
name: ceph-secret
data:
key: QVFBNEhnNWJpQmN1RWhBQUhWSmJKZTVtOG9jWUdkNmlYMnA5dmc9PQ==

PV:

apiVersion: v1
kind: PersistentVolume
metadata:
name: cephfs-pv
spec:
capacity:
storage: 1Gi
accessModes:
– ReadWriteMany
cephfs:
monitors:
– <your_etcd_ip>:6789

path: /sns
user: admin
secretRef:
name: ceph-secret
readOnly: false
persistentVolumeReclaimPolicy: Recycle

PVC:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: cephfs-pv-claim
spec:
accessModes:
– ReadWriteMany
resources:
requests:
storage: 1Gi

创建POD:

apiVersion: v1
kind: Pod
metadata:
labels:
test: cephfs-pvc-pod
name: cephfs-pv-pod1
spec:
containers:
– name: cephfs-pv-busybox1
image: busybox
command: [“sleep”, “60000”]
volumeMounts:
– mountPath: “/mnt/cephfs”
name: cephfs-vol1
readOnly: false
volumes:
– name: cephfs-vol1
persistentVolumeClaim:
claimName: cephfs-pv-claim

遇到的问题:

1.映射到内核的时候报错RBD image feature set mismatch

http://blog.51cto.com/hipzz/1888048

–image-format format-id

format-id取值为1或2,默认为 2。

format 1 – 新建 rbd 映像时使用最初的格式。此格式兼容所有版本的 librbd 和内核模块,但是不支持较新的功能,像克隆。

format 2 – 使用第二版 rbd 格式, librbd 和 3.11 版以上内核模块才支持(除非是分拆的模块)。此格式增加了克隆支持,使得扩展更容易,还允许以后增加新功能。

解决方案1:

更改为格式1,重新映射。

注意:需要重新建立镜像。

[root@ceph1 ~]# rbd create block1 –image-format 1 –size 1024
rbd: image format 1 is deprecated
[root@ceph1 ~]# rbd ls
block1
block
[root@ceph1 ~]# rbd map block1
/dev/rbd0
[root@ceph1 ~]#

d.如上所示,映射正确。

解决方案2:

根据官网介绍,新建rbd默认格式2的rbd 块支持如下特性,并且默认全部开启:

–image-feature:

layering: 支持分层

striping: 支持条带化 v2

exclusive-lock: 支持独占锁

object-map: 支持对象映射(依赖 exclusive-lock )

fast-diff: 快速计算差异(依赖 object-map )

deep-flatten: 支持快照扁平化操作

journaling: 支持记录 IO 操作(依赖独占锁)

接下来尝试少开启一些特性:

[root@ceph1 ~]# rbd create block2 –image-feature layering –size 1024
[root@ceph1 ~]# rbd map block2
/dev/rbd1

2.创建pod挂载的时候遇到rbd: map failed executable file not found in $PATH

k8s集群内的节点上需要安装ceph-client:

yum install ceph–common

3.umount的时候出现target is busy

umount -l xxx

https://www.cnblogs.com/dkblog/archive/2012/07/18/2597192.html

https://blog.csdn.net/u012207077/article/details/21159339

4.如果k8s的node跟ceph集群的node不一样,则需要在k8s的node上部署ceph-common

yum install ceph-common

5.创建pod的时候提示,mount过去的时候提示libceph: bad option

k8s secret 认证 key 需要使用 base64 编码,有可能是secret文件里的key没有base64编码:

在ceph节点上ceph auth get-key client.admin |base64

填到secret文件里面。

6.如果mount fail,则去机器上查看kubelet的日志

7.多用户隔离

https://www.jianshu.com/p/96a34485f0fc

需要用pool,给user指定目录和权限,之后在pv中使用。

8.mount子目录

https://www.spinics.net/lists/ceph-devel/msg34698.html

mount -t ceph >> 172.24.0.4:6789:/volumes/kubernetes/test1 /tmp/mnt -o >> name=bar,secret=AQA+ln9Yfm6DKhAA10k7QkdkfIAKqmM6xeCsxA==

9.写入到共享存储的时候提示File Exists

目录权限问题,需要与Dockerfile中指定的USER的权限一样

Ceph Luminous安装指南

环境说明

未分类

按以上表格所示,设置各台服务器的主机名。

hostnamectl set-hostname 主机名

以下操作需要在所有节点执行。

停止防火墙

systemctl disable firewalld
systemctl stop firewalld

禁止selinux.

vim /etc/selinux/config

配置为disabled

配置/etc/hosts

10.0.0.230 admin
10.0.0.231 node231
10.0.0.232 node232
10.0.0.233 node233
10.0.0.234 client

更换yum源为国内阿里云

http://blog.csdn.net/chenhaifeng2016/article/details/78864541

添加ceph安装源

vim /etc/yum.repos.d/ceph.repo
[Ceph]  
name=Ceph packages for $basearch  
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/$basearch  
enabled=1  
gpgcheck=1  
type=rpm-md  
gpgkey=https://download.ceph.com/keys/release.asc  

[Ceph-noarch]  
name=Ceph noarch packages  
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch  
enabled=1  
gpgcheck=1  
type=rpm-md  
gpgkey=https://download.ceph.com/keys/release.asc  

[ceph-source]  
name=Ceph source packages  
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS  
enabled=1  
gpgcheck=1  
type=rpm-md  
gpgkey=https://download.ceph.com/keys/release.asc  

安装ntp

yum install ntp
systemctl enable ntpd
systemctl start ntpd

查看ntp状态

ntpq -p

重启所有节点

shutdown -r now 或者reboot

以下操作只需在admin节点运行

配置ssh免密登录

ssh-keygen 
ssh-copy-id admin
ssh-copy-id node231
ssh-copy-id node232
ssh-copy-id node233
ssh-copy-id client

安装ceph-deploy

yum install ceph-deploy

创建配置文件目录

mkdir -p /etc/ceph
cd /etc/ceph

创建一个ceph集群

cepy-deploy new node231

在所有节点上安装ceph二进制软件包

ceph-deploy admin node231 node232 node233 client
ceph -v或ceph version

未分类

创建一个Ceph MON

ceph-deploy mon create-initial

创建Ceph OSD

ceph-deploy disk list node231
ceph-deploy disk zap node231:vdb
ceph-deploy disk zap node232:vdb
ceph-deploy disk zap node233:vdb
ceph-deploy --overwrite-conf osd create node231:vdb
ceph-deploy --overwrite-conf osd create node232:vdb
ceph-deploy --overwrite-conf osd create node233:vdb

编辑文件/etc/ceph/ceph.conf添加以下内容

public_network = 10.0.0.0/24

拷贝配置文件到各个节点

ceph-deploy admin client node231 node232 node233

创建MON

ceph-deploy --overwrite-conf mon create node231
ceph-deploy --overwrite-conf admin node231


ceph-deploy --overwrite-conf mon create node232
ceph-deploy --overwrite-conf admin node232


ceph-deploy --overwrite-conf mon create node233
ceph-deploy --overwrite-conf admin node233

这个时候在3个节点分别建立了MON和OSD.

查看一下状态

未分类

有3个MON, 3个OSD, 但是cluster的状态是HEALTH_WARN, 原因为是no active mgr, 接下来创建Ceph MGR

ceph-deploy mgr create node231
ceph-deploy mgr create node232
ceph-deploy mgr create node233

未分类

到这一步,ceph集群已经安装完成。

接下来测试一下块存储, 以下操作在client节点进行。

创建一个新的存储池,而不是使用默认的rbd

ceph osd pool create test 128

创建一个块

rbd create --size 10G disk01 --pool test

查看rbd

未分类

查看块的特性

rbd info --pool test disk01

未分类

由于内核不支持,需要禁止一些特性,只保留layering

rbd --pool test feature disable disk01 exclusive-lock, object-map, fast-diff, deep-flatten

映射块disk01到本地

rbd map --pool test disk01

未分类

格式化块设备

mkfs.ext4 /dev/rbd0

未分类

把rbd0挂载到本地目录

mount /dev/rbd0 /mnt

未分类

这个时候查看集群状态, 集群的状态是HEALTH_WARN

未分类

执行ceph health detail

未分类

根据提示信息执行ceph osd pool application enable test rbd

未分类

集群状态正常了。

Ceph的Python接口

参考文章

ceph的python_api文档: http://docs.ceph.com/docs/master/rados/api/python/

连接ceph集群

import rados
cluster = rados.Rados(conffile='/etc/ceph/ceph.conf')
cluster.connect()

创建与删除池

# 列出可用的池
pools = cluster.list_pools()
for pool in pools:
    print pool
# 创建池test
cluster.create_pool('test')
# 删除池
cluster.delete_pool('test')
# 判断是否存在一个池
cluster.pool_exists('test')

列出池中所有的文件名

ioctx = cluster.open_ioctx('test')
# 列出test池中的所有文件名
object_iterator = ioctx.list_objects()
while True :
    try :
        rados_object = object_iterator.next()
        print "Object contents = " + rados_object.key
    except StopIteration :
        break
ioctx.close()

上传文件

# 连接到test池
ioctx = cluster.open_ioctx('test')
file_name = "yy.mp3"
f = open("yy.mp3", "r")
file_content = f.read()
f.close()
# 将文件写入池
ioctx.write_full(file_name, file_content)
ioctx.close()

下载文件

# 连接到test池
ioctx = cluster.open_ioctx('test')
f = open("yy.mp3", "w")
# 将文件下载(写入)到本地
f.write(ioctx.read("yy.mp3"))
f.close()
ioctx.close()

删除文件

ioctx = cluster.open_ioctx('test')
# 删除test池中的yy.mp3文件
ioctx.remove_object("yy.mp3")
ioctx.close()

断开ceph集群连接

cluster.shutdown()

graphite+grafana监控openstack和ceph

本文环境:CentOS 7.3.1611,openstack+ceph

架构图如下,服务端部分可以分开也可以部署在同一台主机上:

未分类

一、添加epel源和base源,安装carbon和whisper,whisper用于存储监控的数据,类似rrd文件那样固定大小:

yum install python-carbon python-whisper

编辑whisper存储规则,以下是自己写的规则:

vi /etc/carbon/storage-schemas.conf
[carbon]
pattern = ^carbon.
retentions = 60:90d

[vms]
pattern = ^instances.
retentions = 60s:30d,1h:180d,1d:2y,30d:10y

[cluster]
pattern = ^servers..*.CephCollector.ceph.mon..*.cluster.
retentions = 60s:30d,1h:180d,1d:2y,30d:10y

[CephStats]
pattern = ^servers..*.CephStatsCollector.
retentions = 60s:30d,1h:180d,1d:2y,30d:10y

[cpu]
pattern = ^servers..*.cpu.
retentions = 60s:30d,1h:180d,1d:2y,30d:10y

[diskspace]
pattern = ^servers..*.diskspace.
retentions = 60s:30d,1h:180d,1d:2y,30d:10y

[iostat]
pattern = ^servers..*.iostat.
retentions = 60s:30d,1h:180d,1d:2y,30d:10y

[loadavg]
pattern = ^servers..*.loadavg.
retentions = 60s:30d,1h:180d,1d:2y,30d:10y

[memory]
pattern = ^servers..*.memory.
retentions = 60s:30d,1h:180d,1d:2y,30d:10y

[network]
pattern = ^servers..*.network.
retentions = 60s:30d,1h:180d,1d:2y,30d:10y

[default_1min_for_1day]
pattern = .*
retentions = 60s:1d

注:监控字段可以在diamond的日志(/var/log/diamond/archive.log)或者grafana查看。

60s:30d,1h:180d 就是30天内的数据保存间隔为60秒,一个月到半年的保存间隔为1小时,规则是按顺序匹配,不是最长匹配,所以 default 规则一定要放最后,default设定为那么小只是为了不存储不需要的数据,diamond监控的字段太多,不需要全部存储。

carbon配置:

vi /etc/carbon/carbon.conf

[cache]部分,MAX_UPDATES_PER_SECOND(每秒钟最大更新条数)和MAX_CREATES_PER_MINUTE(每分钟最大创建文件数,diamon客户端首次推送数据的时候才会创建whisper数据文件)可能需要调整一下。

启动carbon-cache:

systemctl start carbon-cache

二、客户端安装diamond

(1)每个被监控的客户端都需要安装agent程序

在python官网上有,附链接:https://pypi.python.org/pypi/diamond/4.0.515

解压后 python setup.py install 即安装完成。

(2)配置

cd /etc/diamond
cp diamond.conf.example diamond.conf
vi diamond.conf
# Graphite server host
host = 127.0.0.1 #填上carbon-cache服务器IP,本机的话可以不修改。
[[default]]
hostname = test-node1
# 60秒推送一次数据
interval = 60

(3)配置监控项,diamond可以监控的项目很多,包括ceph、libvirt、mysql、haproxy、nginx等等等等

diamond-setup

基本上一直按回车就可以,由于项目太多,用setup也是繁琐,直接把需要监控的项目放到/etc/diamond/collectors/就可以,具体内容可以参照diamond-setup生成的配置文件。

(4)启动

/etc/init.d/diamond start

至此,监控的服务端和客户端已经部署好,接下来的是部署用于展示的web服务,可以使用 graphite-api + Grafana,也可以 graphite-web,graphite-web是基于django的,需要安装的东西也是一大堆,而且用户体验远远不及Grafana这个专业展示软件。

三、安装 graphite-api

graphite-api的作用只是向grafana提供访问whisper数据的接口。

(1)安装

yum install graphite-api

(2)配置

graphite-api默认启动 127.0.0.1:8888,故需要外部调用或者使用其他服务端口的话,修改/etc/sysconfig/graphite-api的GRAPHITE_API_ADDRESS=0.0.0.0或者GRAPHITE_API_PORT
配置文件 /etc/graphite-api.yaml 使用默认即可。

(3)启动

systemctl start graphite-api

四、安装grafana

grafana是个很流弊的画图软件,支持很多种数据源,展示图形也很多种。

官网下载地址:https://grafana.com/grafana/download

(1)yum本地安装,自动安装依赖包:

yum localinstall grafana-4.4.1-1.x86_64.rpm

(2)安装mysql-server并创建数据库:
由于我的grafana直接装在openstack的控制节点上,已经安装好了mysql-server,直接创建数据库:

CREATE DATABASE grafana ;
GRANT ALL PRIVILEGES ON grafana.* TO 'grafana'@'127.0.0.1' IDENTIFIED BY 'grafana';
FLUSH PRIVILEGES;

mysql在这里只是储存grafana的用户信息,dashboard信息等,不会保存监控的数据。

监控的数据是直接调用graphite-api接口读取whisper数据文件。

(3)配置文件:/etc/grafana/grafana.ini
配置url、mysql连接信息,禁止检查更新、自动发送”使用计数”给grafana,登录界面不使用用户注册功能。

[server]
root_url = http://0.0.0.0:3000
[database]
type = mysql
host = 127.0.0.1:3306
name = grafana
user = grafana
password = grafana
[analytics]
reporting_enabled = false
check_for_updates = false
[security]
[snapshots]
external_enabled = false
[users]
allow_sign_up = false

(4)启动 grafana :

/etc/init.d/grafana-server start

五、配置监控

(1)浏览器登录 grafana,默认初始用户名密码是admin/admin,在grafana.ini可配置。

(2)添加数据源:Data Sources ->Add data sources,输入自定义名称,Type选择【graphite】,url为graphite-api的地址和端口,默认本机8888端口即 【http://localhost:8888】,Access选择【proxy】,其他不填,点击保存并测试连接【Save&Test】,正常返回为绿色背景提示文字

"Success
Data source is working"

(3)至此,全部部署完成,直接在页面上添加dashboard->添加panel->编辑panel即可。

附上监控图两张:

未分类

未分类

openstack集成ceph

集成Ceph相关配置

创建Pool

# ceph osd pool create volumes 64
# ceph osd pool create images 64
# ceph osd pool create vms 64

安装Ceph Client包

配置centos7 ceph yum源

在glance-api(控制节点)节点上

yum install python-rbd -y

(计算节点)在nova-compute和cinder-volume节点上

yum install ceph-common -y

openstack安装Ceph客户端认证

集群ceph存储端操作

[root@ceph ~]# ssh controller sudo tee /etc/ceph/ceph.conf < /etc/ceph/ceph.conf

[root@ceph ~]# ssh compute sudo tee /etc/ceph/ceph.conf < /etc/ceph/ceph.conf

如果开启了cephx authentication,需要为Nova/Cinder and Glance创建新的用户,如下

ceph auth get-or-create client.cinder mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=volumes, allow rwx pool=vms, allow rx pool=images'

ceph auth get-or-create client.glance mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=images'

为client.cinder, client.glance添加keyring,如下

ceph auth get-or-create client.glance | ssh controller sudo tee /etc/ceph/ceph.client.glance.keyring

ssh controller sudo chown glance:glance /etc/ceph/ceph.client.glance.keyring



ceph auth get-or-create client.cinder | ssh compute sudo tee /etc/ceph/ceph.client.cinder.keyring

ssh compute sudo chown cinder:cinder /etc/ceph/ceph.client.cinder.keyring

为nova-compute节点上创建临时密钥

ceph auth get-key client.cinder | ssh {your-compute-node} tee client.cinder.key

此处为

ceph auth get-key client.cinder | ssh compute tee client.cinder.key

在所有计算节点上(本例就只有一台计算节点)执行如下操作:在计算节点上为libvert替换新的key

uuidgen
536f43c1-d367-45e0-ae64-72d987417c91

cat > secret.xml <<EOF

粘贴以下内容,注意将红色key替换为新生成的key。

<secret ephemeral='no' private='no'>
<uuid>536f43c1-d367-45e0-ae64-72d987417c91</uuid>
<usage type='ceph'>
<name>client.cinder secret</name>
</usage>
</secret>

EOF
virsh secret-define --file secret.xml

以下—base64 后的秘钥为计算节点上/root目录下的client.cinder.key。是之前为计算节点创建的临时秘钥文件

virsh secret-set-value  536f43c1-d367-45e0-ae64-72d987417c91  AQCliYVYCAzsEhAAMSeU34p3XBLVcvc4r46SyA==
[root@compute ~]#rm –f client.cinder.key secret.xml

Openstack配置

在控制节点操作

vim /etc/glance/glance-api.conf
[DEFAULT]

…

default_store = rbd
show_image_direct_url = True
show_multiple_locations = True

…

[glance_store]
stores = rbd
default_store = rbd
rbd_store_pool = images
rbd_store_user = glance
rbd_store_ceph_conf = /etc/ceph/ceph.conf
rbd_store_chunk_size = 8





取消Glance cache管理,去掉cachemanagement

[paste_deploy]
flavor = keystone

在计算节点操作

vim /etc/cinder/cinder.conf



[DEFAULT]

保留之前的

enabled_backends = ceph
#glance_api_version = 2
…

[ceph]

volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_pool = volumes
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_flatten_volume_from_snapshot = false
rbd_max_clone_depth = 5
rbd_store_chunk_size = 4
rados_connect_timeout = -1
glance_api_version = 2
rbd_user = cinder
volume_backend_name = ceph
rbd_secret_uuid =536f43c1-d367-45e0-ae64-72d987417c91

请注意,每个计算节点uuid不同。按照实际情况填写。本例只有一个计算节点

注意,如果配置多个cinder后端,glance_api_version = 2必须添加到[DEFAULT]中。本例注释了

每个计算节点上,设置/etc/nova/nova.conf

vim /etc/nova/nova.conf

[libvirt]
virt_type = qemu
hw_disk_discard = unmap
images_type = rbd
images_rbd_pool = vms
images_rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = 536f43c1-d367-45e0-ae64-72d987417c91
disk_cachemodes="network=writeback"
libvirt_inject_password = false
libvirt_inject_key = false
libvirt_inject_partition = -2
live_migration_flag=VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_LIVE, VIR_MIGRATE_TUNNELLED

重启OpenStack

控制节点

systemctl restart openstack-glance-api.service

计算节点

systemctl restart openstack-nova-compute.service openstack-cinder-volume.service

配置文件

1、nova

[root@controller nova]# cat nova.conf
[DEFAULT]
enabled_apis = osapi_compute,metadata
rpc_backend = rabbit
auth_strategy = keystone
my_ip = 192.168.8.100
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
[api_database]
connection = mysql+pymysql://nova:Changeme_123@controller/nova_api
[barbican]
[cache]
[cells]
[cinder]
os_region_name = RegionOne
[conductor]
[cors]
[cors.subdomain]
[database]
connection = mysql+pymysql://nova:Changeme_123@controller/nova
[ephemeral_storage_encryption]
[glance]
api_servers = http://controller:9292
[guestfs]
[hyperv]
[image_file_url]
[ironic]
[keymgr]
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = Changeme_123
[libvirt]
[libvirt]
virt_type = qemu
hw_disk_discard = unmap
images_type = rbd
images_rbd_pool = nova
images_rbd_ceph_conf = /etc/cinder/ceph.conf
rbd_user = cinder
rbd_secret_uuid = 457eb676-33da-42ec-9a8c-9293d545c337
disk_cachemodes="network=writeback"
libvirt_inject_password = false
libvirt_inject_key = false
libvirt_inject_partition = -2
live_migration_flag=VIR_MIGRATE_UNDEFINE_SOURCE, VIR_MIGRATE_PEER2PEER, VIR_MIGRATE_LIVE, VIR_MIGRATE_TUNNELLED
[matchmaker_redis]
[metrics]
[neutron]
url = http://controller:9696
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = Changeme_123
service_metadata_proxy = True
metadata_proxy_shared_secret = Changeme_123
[osapi_v21]
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
[oslo_messaging_amqp]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = Changeme_123
[oslo_middleware]
[oslo_policy]
[rdp]
[serial_console]
[spice]
[ssl]
[trusted_computing]
[upgrade_levels]
[vmware]
[vnc]
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = 192.168.8.100
enabled = True
novncproxy_base_url = http://192.168.8.100:6080/vnc_auto.html
[workarounds]
[xenserver]

cinder

[root@controller nova]# cat /etc/cinder/cinder.conf
[DEFAULT]
rpc_backend = rabbit
auth_strategy = keystone
my_ip = 192.168.8.100
glance_host = controller
enabled_backends = lvm,ceph
glance_api_servers = http://controller:9292
[BACKEND]
[BRCD_FABRIC_EXAMPLE]
[CISCO_FABRIC_EXAMPLE]
[COORDINATION]
[FC-ZONE-MANAGER]
[KEYMGR]
[cors]
[cors.subdomain]
[database]
connection = mysql+pymysql://cinder:Changeme_123@controller/cinder
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = Changeme_123
[matchmaker_redis]
[oslo_concurrency]
lock_path = /var/lib/cinder/tmp
[oslo_messaging_amqp]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = Changeme_123
[oslo_middleware]
[oslo_policy]
[oslo_reports]
[oslo_versionedobjects]
[ssl]
[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
iscsi_protocol = iscsi
iscsi_helper = lioadm
[ceph]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_pool = cinder
rbd_ceph_conf = /etc/cinder/ceph.conf
rbd_flatten_volume_from_snapshot = false
rbd_max_clone_depth = 5
rbd_store_chunk_size = 4
rados_connect_timeout = -1
glance_api_version = 2
rbd_user = cinder
rbd_secret_uuid =457eb676-33da-42ec-9a8c-9293d545c337
volume_backend_name = ceph

glance

[root@controller nova]# cat /etc/glance/glance-api.conf

[DEFAULT]
#default_store = rbd
show_image_direct_url = True
#show_multiple_locations = True
[cors]
[cors.subdomain]
[database]
connection = mysql+pymysql://glance:Changeme_123@controller/glance
[glance_store]
stores = rbd
default_store = rbd
rbd_store_pool = glance
rbd_store_user = glance
rbd_store_ceph_conf = /etc/glance/ceph.conf
rbd_store_chunk_size = 8
[image_format]
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
username = glance
password = Changeme_123
project_name = service
[matchmaker_redis]
[oslo_concurrency]
[oslo_messaging_amqp]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_policy]
[paste_deploy]
flavor = keystone
[profiler]
[store_type_location_strategy]
[task]
[taskflow_executor]

ceph

[root@controller nova]# cat /etc/cinder/cinder.conf
[DEFAULT]
rpc_backend = rabbit
auth_strategy = keystone
my_ip = 192.168.8.100
glance_host = controller
enabled_backends = lvm,ceph
glance_api_servers = http://controller:9292
[BACKEND]
[BRCD_FABRIC_EXAMPLE]
[CISCO_FABRIC_EXAMPLE]
[COORDINATION]
[FC-ZONE-MANAGER]
[KEYMGR]
[cors]
[cors.subdomain]
[database]
connection = mysql+pymysql://cinder:Changeme_123@controller/cinder
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = Changeme_123
[matchmaker_redis]
[oslo_concurrency]
lock_path = /var/lib/cinder/tmp
[oslo_messaging_amqp]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = Changeme_123
[oslo_middleware]
[oslo_policy]
[oslo_reports]
[oslo_versionedobjects]
[ssl]
[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
iscsi_protocol = iscsi
iscsi_helper = lioadm
[ceph]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_pool = cinder
rbd_ceph_conf = /etc/cinder/ceph.conf
rbd_flatten_volume_from_snapshot = false
rbd_max_clone_depth = 5
rbd_store_chunk_size = 4
rados_connect_timeout = -1
glance_api_version = 2
rbd_user = cinder
rbd_secret_uuid =457eb676-33da-42ec-9a8c-9293d545c337
volume_backend_name = ceph
[root@controller nova]# cat /etc/glance/glance-api.conf
[DEFAULT]
#default_store = rbd
show_image_direct_url = True
#show_multiple_locations = True
[cors]
[cors.subdomain]
[database]
connection = mysql+pymysql://glance:Changeme_123@controller/glance
[glance_store]
stores = rbd
default_store = rbd
rbd_store_pool = glance
rbd_store_user = glance
rbd_store_ceph_conf = /etc/glance/ceph.conf
rbd_store_chunk_size = 8
[image_format]
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
username = glance
password = Changeme_123
project_name = service
[matchmaker_redis]
[oslo_concurrency]
[oslo_messaging_amqp]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_policy]
[paste_deploy]
flavor = keystone
[profiler]
[store_type_location_strategy]
[task]
[taskflow_executor]

[root@controller nova]# cat /etc/cinder/ceph.conf
[global]
heartbeat interval = 5
osd pool default size = 3
osd heartbeat grace = 10
#keyring = /etc/ceph/keyring.admin
mon osd down out interval = 90
fsid = 5e8080b0-cc54-11e6-b346-000c29976397
osd heartbeat interval = 10
max open files = 131072
auth supported = cephx

[mon]
mon osd full ratio = .90
mon data = /var/lib/ceph/mon/mon$id
mon osd nearfull ratio = .75
mon clock drift allowed = .200
mon osd allow primary affinity = true

[mon.0]
host = csm-node1
mon addr = 192.168.8.102:6789

[mon.1]
host = csm-node2
mon addr = 192.168.8.103:6789

[mon.2]
host = csm-node3
mon addr = 192.168.8.104:6789

[osd]
osd mount options xfs = rw,noatime,inode64,logbsize=256k,delaylog
osd crush update on start = false
filestore xattr use omap = true
#keyring = /etc/ceph/keyring.$name
osd mkfs type = xfs
osd data = /var/lib/ceph/osd/osd$id
osd heartbeat interval = 10
osd heartbeat grace = 10
osd mkfs options xfs = -f
osd journal size = 0

[osd.0]
osd journal = /dev/sdb1
devs = /dev/sdb2
host = csm-node1
cluster addr = 192.168.8.102
public addr = 192.168.8.102

[osd.1]
osd journal = /dev/sdb1
devs = /dev/sdb2
host = csm-node2
cluster addr = 192.168.8.103
public addr = 192.168.8.103

[osd.2]
osd journal = /dev/sdb1
devs = /dev/sdb2
host = csm-node3
cluster addr = 192.168.8.104
public addr = 192.168.8.104

[client.cinder]
keyring=/etc/ceph/ceph.client.cinder.keyring

Ceph出现”1 full osd(s)”,整个集群不可用的问题调查

问题描述

一个服务连接不上ceph的对象存储网关,重启ceph对象存储网关,也不生效。

ceph服务网关的日志如下:

2017-10-31 19:51:21.158008 7f3b789b99c0  0 deferred set uid:gid to 167:167 (ceph:ceph)
2017-10-31 19:51:21.158206 7f3b789b99c0  0 ceph version 10.2.7 (50e863e0f4bc8f4b9e31156de690d765af245185), process radosgw, pid 1321
2017-10-31 19:51:21.244854 7f3b789b99c0  0 client.34193.objecter  FULL, paused modify 0x7f3b7a1388d0 tid 0
2017-10-31 19:56:21.158388 7f3b5dc9b700 -1 Initialization timeout, failed to initialize
2017-10-31 19:56:21.410096 7f918b9bb9c0  0 deferred set uid:gid to 167:167 (ceph:ceph)
2017-10-31 19:56:21.410202 7f918b9bb9c0  0 ceph version 10.2.7 (50e863e0f4bc8f4b9e31156de690d765af245185), process radosgw, pid 1459
2017-10-31 19:56:21.546455 7f918b9bb9c0  0 client.34214.objecter  FULL, paused modify 0x7f918d689c70 tid 0

使用ceph health查看发现:

$ ceph health
1 full osd(s); pool default.rgw.buckets.data has many more objects per pg than average (too few pgs?); full flag(s) set;

问题解决

Ceph集群磁盘没有剩余空间的解决方法 (http://blog.csdn.net/xiaoquqi/article/details/45539847) 提到:

根据Ceph官方文档中的描述,当一个OSD full比例达到95%时,集群将不接受任何Ceph Client端的读写数据的请求。

通过命令ceph osd df,发现一个osd使用空间超过95:

$ ceph osd df
ID WEIGHT  REWEIGHT SIZE  USE    AVAIL  %USE  VAR  PGS
 0 0.48799  1.00000  499G   295G   204G 59.17 1.32  47
 5 0.97609  1.00000  999G 56253M   944G  5.50 0.12  84
 1 0.48799  1.00000  499G   341G   158G 68.33 1.53  64
 6 0.48318  1.00000  494G 42432k   494G  0.01    0  49
 2 0.48799  1.00000  499G   474G 25533M 95.01 2.13  78
 3 0.48799  1.00000  499G   204G   295G 40.92 0.92  68
 4 0.48799  1.00000  499G   411G 89998M 82.41 1.85  74
              TOTAL 3993G  1783G  2209G 44.66

虽然ceph full或者nearfull的解决方法探究 (https://www.itzhoulin.com/2016/04/20/deal_with_ceph_full/) 也提到,可以先将full的比例提高到98%。但是执行时发现不可更改:

$ ceph tell osd.* injectargs '--mon-osd-full-ratio 0.98'
osd.0: mon_osd_full_ratio = '0.98' (unchangeable)
osd.1: mon_osd_full_ratio = '0.98' (unchangeable)
osd.2: mon_osd_full_ratio = '0.98' (unchangeable)
osd.3: mon_osd_full_ratio = '0.98' (unchangeable)
osd.4: mon_osd_full_ratio = '0.98' (unchangeable)

增加了两块OSD之后,经过了漫长的数据重新分布:

$ ceph health
HEALTH_ERR clock skew detected on mon.registry-ceph02, mon.registry-ceph03; 21 pgs backfill_wait; 2 pgs backfilling; 7 pgs degraded; 6 pgs recovery_wait; 7 pgs stuck degraded; 29 pgs stuck unclean; 1 pgs stuck undersized; 1 pgs undersized; recovery 41684/1371951 objects degraded (3.038%); recovery 694899/1371951 objects misplaced (50.650%); 1 full osd(s); pool default.rgw.buckets.data has many more objects per pg than average (too few pgs?); full flag(s) set; Monitor clock skew detected

当osd使用比例下降到95%以下后,集群恢复正常。

OSD添加方法: http://www.lijiaocn.com/%E6%8A%80%E5%B7%A7/2017/06/01/ceph-deploy.html#%E6%B7%BB%E5%8A%A0osd

用ceph-deploy安装ceph并部署集群

部署安装

关于安装ceph整个过程中遇到的问题,以及靠谱的解决办法,个人亲测有效,不代表广大同行的观点。

我用的是服务器,所以没搞什么用户的问题。机器是centOS7.3。我安装的ceph版本是jewel,目前只用了3个节点。

节点IP      命名    角色

10.0.1.92   e1092   mon 
10.0.1.93   e1093   mon,osd 
10.0.1.94   e1094   mon,osd 

第一步:准备工作(以下工作在所有节点上都要执行)

首先是配置yum源:

需要特别注意的是,Ceph的安装过程还需要第三方组件依赖,其中一些第三方组件在CentOS yum.repo Base等官方源中是没有的(例如LevelDB),所以读者在安装过程中会有一定的几率遇到各种依赖关系异常,并要求先行安装XXX第三方组件的提示(例如提示先安装liblevel.so)。虽然我们后文将会介绍的Ceph辅助部署工具,Ceph-deploy的工作本质还是通过yum命令去安装管理组件,但是既然CentOS yum.repo Base官方源中并没有某些需要依赖的第三方组件,所以一旦遇到类似的组件依赖问题安装过程就没法自动继续了。解决这个问题,本示例中建议引入CentOS的第三方扩展源epel。(我在这上面坑了很久才走出来)。

首先引入第三方扩展源:

# wget  -O  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

配置ceph源:

# vim  /etc/yum.repos.d/ceph.repo   # 增加ceph源,将下面内容输进去
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
gpgcheck=0
priority=1

[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
gpgcheck=0
priority=1

[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.163.com/ceph/rpm-jewel/el7/SRPMS
enabled=0
gpgcheck=1
type=rpm-md
gpgkey=http://mirrors.163.com/ceph/keys/release.asc
priority=1

更新源:

# yum makecache
# yum update

安装ceph(我是在各节点分别安装的,而没有用ceph-deploy一键安装,个人感觉分别安装更不容易犯错):

# yum install  -y  ceph

查看ceph版本:

# ceph -v
ceph version 10.2.9 (2ee413f77150c0f375ff6f10edd6c8f9c7d060d0)

关闭selinux:

# sed  -i  's/SELINUX=.*/SELINUX=disabled/'  /etc/selinux/config
# setenforce  0
setenforce: SELinux is disabled

关闭防火墙firewalld:

# systemctl stop firewalld
# systemctl disable firewalld

安装ntp服务器

为保证各个服务器的时间一致,安装ntp服务器

# yum install -y ntp ntpdate ntp-doc

访问:http://www.pool.ntp.org/zone/cn,获取中国区公用时间同步服务器。如:

server 0.cn.pool.ntp.org 
server 1.asia.pool.ntp.org 
server 2.asia.pool.ntp.org

将这三个服务器添加到/etc/ntp.conf,用#注释掉文件中原有的:

server 0.centos.pool.ntp.org iburst 
server 1.centos.pool.ntp.org iburst 
server 2.centos.pool.ntp.org iburst 
server 3.centos.pool.ntp.org iburst 

再执行下面的命令手工从服务器同步并启动ntp服务:

# ntpdate 0.cn.pool.ntp.org
# hwclock -w
# systemctl enable ntpd.service
# systemctl start ntpd.service

安装ssh服务:

# yum install openssh-server

第二步、准备工作做好了,现在开始部署ceph集群。

备注:以下操作均在admin-node节点执行,在本文中,由于admin-node与e1093共享,所以在e1093上执行就可以了

修改/etc/hosts

# vim /etc/hosts
10.0.1.92 e1092 
10.0.1.93 e1093 
10.0.1.94 e1094 

生成ssh密钥对并复制到各节点

# ssh-keygen
# scp-copy-id e1092
# scp-copy-id e1093
# scp-copy-id e1094

安装部署工具ceph-deploy

# yum install ceph-deploy
# ceph-deploy  --version

创建集群,
这里先要创建一个目录,因为在执行ceph-deploy的过程中会产生一些配置文件。以后只要是执行ceph-deploy的命令所产生的文件都在这个目录下。

# mkdir /home/my-cluster
# cd my-cluster

部署新的monitor节点(我的是把e1093、e1093、e1094都作为mon 节点):

# ceph-deploy new e1092 e1093 e1094

查看my-cluster目录下生成的文件:

# ls 
ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring

修改配置文件:

# vim ceph.conf
mon_initial_members = e1092, e1093, e1094
mon_host = 10.0.1.92,10.0.1.93,10.0.1.94
auth_cluster_required = none
auth_service_required = none
auth_client_required = none
osd pool default size = 2
public network = 10.0.1.0/24

对其中的参数做一下说明:

前面5项是自动生成的,不过我修改了auth_cluster_required,auth_service_required,auth_client_required为none,原始默认是cephx,表示要通过认证,这里我不需要认证,所以设为none。

osd pool default size是副本的个数,我只配置两个副本,所以设为2.
public network是公共网络,是osd之间通信的网络,该项建议设置,如果不设置,后面可能执行命令的时候有警告信息,该参数其实就是你的mon节点IP最后一项改为0,然后加上/24。例如我的节点ip是10.0.1.8*系列的,所以我的public network就是10.0.1.0/24。
部署monitors,并获取密钥key,此命令会在my-cluster目录下生成几个key。

# ceph-deploy  --overwrite-conf mon  create-initial

未分类

未分类

未分类

这里我贴出了一部分输出信息作为参考,看到最后一部分信息表示成功。

查看my-cluster目录下生成的文件:

# ls
ceph.bootstrap-mds.keyring 
ceph.bootstrap-rgw.keyring  
ceph.conf             
ceph.mon.keyring
ceph.bootstrap-osd.keyring  
ceph.client.admin.keyring   
ceph-deploy-ceph.log

查看集群状态:

# ceph -s

未分类

接下来部署osd:

由于没有足够多的磁盘,就用文件夹,我用的就是文件夹,如果用磁盘的话,网上教程更多:

在e1092 e1093 e1094上执行:

# mkdir  /var/local/osd1  
# chmod  777  -R  /var/local/osd1

以下在有ceph-deploy的节点上执行:

准备osd:

# ceph-deploy osd prepare e1092:/var/local/osd1 e1093:/var/local/osd1 e1094:/var/local/osd1

激活osd:

# ceph-deploy osd activate e1092:/var/local/osd1 e1093:/var/local/osd1 e1094:/var/local/osd1

再次查看集群状态,应该没什么问题了。

安装过程中出现的问题以及解决办法:

1、关于yum 源的问题

建议使用国内源,比如:

网易镜像源http://mirrors.163.com/ceph
阿里镜像源http://mirrors.aliyun.com/ceph
中科大镜像源http://mirrors.ustc.edu.cn/ceph
宝德镜像源 http://mirrors.plcloud.com/ceph

以jewel为例:

http://mirrors.163.com/ceph/rpm-jewel/el7
http://mirrors.163.com/ceph/keys/release.asc

2、关于执行ceph-deploy –overwrite-conf mon create-initial出现的问题(最容易出问题的感觉也就是这一条命令)

(1)出现admin-socket问题

当主机名/etc/hostname 和/etc/hosts中给该主机命的名字不一样,例如我之前安装ceph-deploy用的主机是10.0.1.90,我把主机10.0.1.90命名为e1090,即/etc/hostname设为e1090,然而我在/etc/hosts中给该主机取的名字为mon。然后就会出现这个问题,如下所示:

未分类

排查这个问题要注意看ERROR上面的INFO信息:Running command: ceph –cluster=ceph –admin-daemon /var/run/ceph-mon.mon.asok mon_status
这条信息之后就出现了error,说明很有可能它所执行的那条命令没成功,首先进入这个目录查看有没有这个文件:

# ls  /var/run/
ceph-mon.e1090.asok

发现我的这个目录下的文件名为ceph-mon.e1090.asok,而不是INFO中的ceph-mon.mon.asok,所以立马修改/etc/hosts,将名字重新命名为与hostname 一致的名字,然后这个问题就解决了。另外,如果ceph.conf配置文件中没有设置public netmork这一项,也有可能会出现这个问题,所以最好设置。

(2)[WARNIN] monitor e1090 does not exist in monmap

未分类

如果上面(1)那个问题解决之后还出现这个问题,就说明你的这台mon机器down掉了,我刚开始的时候也不敢相信,(纳尼?我刚部署它就down掉了?),其实可以看上面的信息,发现mons这一项中的addr信息是0.0.0.0:0/1,这里就知道了应该就是down掉了,而且注意看name这一项还是之前取的名字mon ,虽然第一个问题解决了,但还是没成功,所以索性换了节点,不用这个节点。

这一条可以自己通过将其他节点也作为mon节点试一下,如果其他节点成功了就该节点不成功,那一定是down掉了,用ceph -s查看集群状态的时候也能够看出来它down了。

(3)failed to connect to host:e1092,e1093, e1094

未分类

看WARNIN信息,发现说:no mon key found in host: e1092,后面的WARNIN也是一样的。这时候可以看下my-cluster目录下有没有生成key,出现这个错误应该是没有生成,解决办法就是将my-cluster目录下的ceph-mon.keying 文件拷贝到所有节点的/var/lib/ceph/mon/ceph-$hostname目录下。即

# cp /root/cluster/ceph.mon.keyring /var/lib/ceph/mon/ceph-1093/keyring
# scp /home/chenjuan/my-cluster/ceph.mon.keyring e1092:/var/lib/ceph/mon/ceph-e1092/keyring
# scp /home/chenjuan/my-cluster/ceph.mon.keyring e1094:/var/lib/ceph/mon/ceph-e1094/keyring

再次执行ceph-deploy –overwrite-conf create-initial,应该就成功了。

Ceph 快速部署 ( Centos7 + Jewel )

这篇文章主要介绍了如何用三台虚拟机搭建一套Ceph分布式系统,步骤简洁但不失准确性。环境清理一小节可以解决绝大多数部署不成功的问题,最后一节介绍了常用的Ceph操作,希望能给刚搭建环境的同学一些帮助。

环境

三台装有CentOS 7的主机,每台主机有三个磁盘(虚拟机磁盘要大于100G),详细信息如下:

[root@ceph-1~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[root@ceph-1 ~]# lsblk 
NAME            MAJ:MINRM   SIZE RO TYPE MOUNTPOINT
sda              8:0    0   128G  0 disk 
├─sda1           8:1    0   500M  0 part /boot
└─sda2           8:2    0 127.5G  0 part 
 ├─centos-root 253:0    0    50G 0 lvm  /
 ├─centos-swap 253:1    0     2G 0 lvm  [SWAP]
  └─centos-home 253:2    0  75.5G  0 lvm /home
sdb              8:16   0     2T  0 disk 
sdc              8:32   0     2T  0 disk 
sdd              8:48   0     2T  0 disk 
sr0             11:0    1  1024M  0 rom  
[root@ceph-1 ~]# cat /etc/hosts
..
192.168.57.222ceph-1                                                                                                                                      
192.168.57.223ceph-2                                                                                                                                      
192.168.57.224 ceph-3

集群配置如下:

未分类

环境清理

如果之前部署失败了,不必删除ceph客户端,或者重新搭建虚拟机,只需要在每个节点上执行如下指令即可将环境清理至刚安装完ceph客户端时的状态!强烈建议在旧集群上搭建之前清理干净环境,否则会发生各种异常情况。

psaux|grep ceph |awk '{print $2}'|xargs kill -9
ps -ef|grep ceph
#确保此时所有ceph进程都已经关闭!!!如果没有关闭,多执行几次。
umount /var/lib/ceph/osd/*
rm -rf /var/lib/ceph/osd/*
rm -rf /var/lib/ceph/mon/*
rm -rf /var/lib/ceph/mds/*
rm -rf /var/lib/ceph/bootstrap-mds/*
rm -rf /var/lib/ceph/bootstrap-osd/*
rm -rf /var/lib/ceph/bootstrap-rgw/*
rm -rf /var/lib/ceph/tmp/*
rm -rf /etc/ceph/*
rm -rf /var/run/ceph/*

yum源及ceph的安装

需要在每个主机上执行以下指令:

yumclean all
rm -rf /etc/yum.repos.d/*.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo
sed -i '/aliyuncs/d' /etc/yum.repos.d/epel.repo
sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo

增加ceph的源:

vim/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

安装ceph客户端:

yummakecache
yum install ceph ceph-radosgw rdate -y
关闭selinux&firewalld
sed-i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0
systemctl stop firewalld 
systemctl disable firewalld

同步各个节点时间:

yum-y install rdate
rdate -s time-a.nist.gov
echo rdate -s time-a.nist.gov >> /etc/rc.d/rc.local 
chmod +x /etc/rc.d/rc.local

开始部署

在部署节点(ceph-1)安装ceph-deploy,下文的部署节点统一指ceph-1:

[root@ceph-1~]# yum -y install ceph-deploy
[root@ceph-1 ~]# ceph-deploy --version
1.5.34
[root@ceph-1 ~]# ceph -v
ceph version 10.2.2 (45107e21c568dd033c2f0a3107dec8f0b0e58374)

在部署节点创建部署目录并开始部署:

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

如果之前没有ssh-copy-id到各个节点,则需要输入一下密码,过程log如下:

[ceph_deploy.conf][DEBUG] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO  ] Invoked (1.5.34): /usr/bin/ceph-deploy newceph-1 ceph-2 ceph-3
[ceph_deploy.cli][INFO  ] ceph-deploy options:
[ceph_deploy.cli][INFO  ] username                     : None
[ceph_deploy.cli][INFO  ] func                         : <function new at 0x7f91781f96e0>
[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 0x7f917755ca28>
[ceph_deploy.cli][INFO  ] cluster                      : ceph
[ceph_deploy.cli][INFO  ] ssh_copykey                  : True
[ceph_deploy.cli][INFO  ]  mon                          :['ceph-1', 'ceph-2', 'ceph-3']
..
..
ceph_deploy.new][WARNIN] could not connect via SSH
[ceph_deploy.new][INFO  ] will connect again with password prompt
The authenticity of host 'ceph-2 (192.168.57.223)' can't be established.
ECDSA key fingerprint is ef:e2:3e:38:fa:47:f4:61:b7:4d:d3:24:de:d4:7a:54.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ceph-2,192.168.57.223' (ECDSA) to the list of knownhosts.
root
root@ceph-2's password: 
[ceph-2][DEBUG ] connected to host: ceph-2 
..
..
[ceph_deploy.new][DEBUG ] Resolving host ceph-3
[ceph_deploy.new][DEBUG ] Monitor ceph-3 at 192.168.57.224
[ceph_deploy.new][DEBUG ] Monitor initial members are ['ceph-1', 'ceph-2','ceph-3']
[ceph_deploy.new][DEBUG ] Monitor addrs are ['192.168.57.222','192.168.57.223', '192.168.57.224']
[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@ceph-1cluster]# ls
ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring

根据自己的IP配置向ceph.conf中添加public_network,并稍微增大mon之间时差允许范围(默认为0.05s,现改为2s):

[root@ceph-1cluster]# echo public_network=192.168.57.0/24 >> ceph.conf 
[root@ceph-1 cluster]# echo mon_clock_drift_allowed = 2 >> ceph.conf 
[root@ceph-1 cluster]# cat ceph.conf 
[global]
fsid = 0248817a-b758-4d6b-a217-11248b098e10
mon_initial_members = ceph-1, ceph-2, ceph-3
mon_host = 192.168.57.222,192.168.57.223,192.168.57.224
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

public_network=192.168.57.0/24
mon_clock_drift_allowed = 2

开始部署monitor:

[root@ceph-1cluster]# ceph-deploy mon create-initial
..
..若干log
[root@ceph-1 cluster]# ls
ceph.bootstrap-mds.keyring  ceph.bootstrap-rgw.keyring ceph.conf            ceph.mon.keyring
ceph.bootstrap-osd.keyring  ceph.client.admin.keyring  ceph-deploy-ceph.log

查看集群状态:

[root@ceph-1cluster]# ceph -s
    cluster 0248817a-b758-4d6b-a217-11248b098e10
     health HEALTH_ERR
            no osds
            Monitorclock skew detected 
     monmap e1: 3 mons at{ceph-1=192.168.57.222:6789/0,ceph-2=192.168.57.223:6789/0,ceph-3=192.168.57.224:6789/0}
            electionepoch 6, quorum 0,1,2 ceph-1,ceph-2,ceph-3
     osdmap e1: 0 osds: 0 up, 0 in
            flagssortbitwise
      pgmap v2: 64 pgs, 1 pools, 0 bytes data, 0objects
            0 kB used, 0kB / 0 kB avail
                 64 creating

开始部署OSD:

ceph-deploy--overwrite-conf osd prepare ceph-1:/dev/sdb ceph-1:/dev/sdc ceph-1:/dev/sddceph-2:/dev/sdb ceph-2:/dev/sdc ceph-2:/dev/sdd ceph-3:/dev/sdb ceph-3:/dev/sdcceph-3:/dev/sdd  --zap-disk
ceph-deploy --overwrite-conf osd activate ceph-1:/dev/sdb1 ceph-1:/dev/sdc1ceph-1:/dev/sdd1 ceph-2:/dev/sdb1 ceph-2:/dev/sdc1 ceph-2:/dev/sdd1ceph-3:/dev/sdb1 ceph-3:/dev/sdc1 ceph-3:/dev/sdd1

我在部署的时候出了个小问题,有一个OSD没成功(待所有OSD部署完毕后,再重新部署问题OSD即可解决),如果不出意外的话,集群状态应该如下:

[root@ceph-1cluster]# ceph -s
    cluster 0248817a-b758-4d6b-a217-11248b098e10
     health HEALTH_WARN
            too few PGsper OSD (21 < min 30)
     monmap e1: 3 mons at{ceph-1=192.168.57.222:6789/0,ceph-2=192.168.57.223:6789/0,ceph-3=192.168.57.224:6789/0}
            electionepoch 22, quorum 0,1,2 ceph-1,ceph-2,ceph-3
     osdmap e45: 9 osds: 9 up, 9 in
            flagssortbitwise
      pgmap v82: 64 pgs, 1 pools, 0 bytes data, 0objects
            273 MB used,16335 GB / 16336 GB avail
                 64 active+clean

去除这个WARN,只需要增加rbd池的PG就好:

[root@ceph-1cluster]# ceph osd pool set rbd pg_num 128
set pool 0 pg_num to 128
[root@ceph-1 cluster]# ceph osd pool set rbd pgp_num 128
set pool 0 pgp_num to 128
[root@ceph-1 cluster]# ceph -s
    cluster 0248817a-b758-4d6b-a217-11248b098e10
     health HEALTH_ERR
            19 pgs arestuck inactive for more than 300 seconds
            12 pgspeering
            19 pgs stuckinactive
     monmap e1: 3 mons at{ceph-1=192.168.57.222:6789/0,ceph-2=192.168.57.223:6789/0,ceph-3=192.168.57.224:6789/0}
            electionepoch 22, quorum 0,1,2 ceph-1,ceph-2,ceph-3
     osdmap e49: 9 osds: 9 up, 9 in
            flagssortbitwise
      pgmap v96: 128 pgs, 1 pools, 0 bytes data, 0objects
            308 MB used,18377 GB / 18378 GB avail
                103 active+clean
                 12 peering
                  9 creating
                  4 activating
[root@ceph-1 cluster]# ceph -s
    cluster 0248817a-b758-4d6b-a217-11248b098e10
     health HEALTH_OK
     monmap e1: 3 mons at {ceph-1=192.168.57.222:6789/0,ceph-2=192.168.57.223:6789/0,ceph-3=192.168.57.224:6789/0}
            electionepoch 22, quorum 0,1,2 ceph-1,ceph-2,ceph-3
     osdmap e49: 9 osds: 9 up, 9 in
            flagssortbitwise
      pgmap v99: 128 pgs, 1 pools, 0 bytes data, 0objects
            310 MB used,18377 GB / 18378 GB avail
                128 active+clean

至此,集群部署完毕。

config推送

请不要使用直接修改某个节点的/etc/ceph/ceph.conf文件的方式,而是去部署节点(此处为ceph-1:/root/cluster/ceph.conf)目录下修改。因为节点到几十个的时候,不可能一个个去修改的,采用推送的方式快捷安全!修改完毕后,执行如下指令,将conf文件推送至各个节点:

[root@ceph-1cluster]# ceph-deploy --overwrite-conf config push ceph-1 ceph-2 ceph-3

此时,需要重启各个节点的monitor服务,见下一节。

mon&osd启动方式

#monitor start/stop/restart
#ceph-1为各个monitor所在节点的主机名。
systemctl start [email protected]
systemctl restart [email protected]
systemctl stop [email protected]

#OSD start/stop/restart 
#0为该节点的OSD的id,可以通过`ceph osd tree`查看
systemctl start/stop/restart [email protected]

[root@ceph-1 cluster]# ceph osd tree
ID WEIGHT   TYPE NAME       UP/DOWNREWEIGHT PRIMARY-AFFINITY 
-1 17.94685 rootdefault                                     
-2  5.98228     hostceph-1                                  
 0  1.99409        osd.0        up 1.00000          1.00000 
 1  1.99409        osd.1        up 1.00000          1.00000 
 8  1.99409        osd.2        up 1.00000          1.00000 
-3  5.98228     hostceph-2                                  
 2  1.99409        osd.3        up 1.00000          1.00000 
 3  1.99409        osd.4        up 1.00000          1.00000 
 4  1.99409        osd.5        up 1.00000          1.00000 
-4  5.98228     hostceph-3                                  
 5  1.99409        osd.6        up 1.00000          1.00000 
 6  1.99409        osd.7        up  1.00000         1.00000 
 7  1.99409        osd.8        up 1.00000          1.00000

ceph运维中常见的pg状态

pg ( placement group ) 是数据存储的重要单位。

在使用 ceph 的时候, pg 会经常发生状态的变化,例如:

  • 当创建池的时候, 将会创建相应的 pg, 那么可以看到 pg creating 状态
  • 当部分 pg 创建成功后, 将会发现 pg 会进入 peering 状态
  • 当所有 pg peering 完成后, 将可见到状态变成 active+clean

常见的 pg 状态

creating (创建中)

PG 正在被创建, 通常当存储池正在卑创建或增加一个存储池的 PG 数量时, PG 会呈现这个状态

Down (失效)

PG 处于失效状态, PG 应该处于离线状态

repair(修复)

PG 正在被检查, 被发现的任何不一致都将尽可能被修复.

peering (等待互联)

  1. 当 ceph peering pg, ceph 将会把 pg 副本协定导入 osd, 当 ceph 完成 peering, 意味着 osd 同意当前 PG 状态, 并允许写入
  2. PG 处于 peering 过程中, peering 由主 osd 发起的使存放 PG 副本的所有 OSD 就 PG 的所有对象和元素数据的状态达成一致的过程, peering 过程完成后, 主 OSD 就可以接受客户端写请求.

Active (活动)

  1. 当 ceph 完成 peering 过程, pg 将会变成 active, active 状态意味着 pg 中的数据变得可用, 主 pg 将可执行读写操作
  2. PG 是活动的, 意味着 PG 中的数据可以被读写, 对该 PG 的操作请求都讲会被处理.

Clean (干净)

  1. 当 pg 显示 clean 状态, 主 osd 与副本 osd 成功同步并且没有异步复制, ceph 在 pg 中所有对象具有正确的副本数量
  2. PG 中的所有对象都已经卑复制了规定的副本数量.

Replay (重做)

某 OSD 崩溃后, PG 正在等待客户端重新发起操作

Degraded (降级)

  1. 当客户端写对象到主 osd, 主 OSD 会把数据写复制到对应复制 OSD, 在主 OSD 把对象写入存储后, PG 会显示为 degraded 状态, 直到主 osd 从复制 OSD 中接收到创建副本对象完成信息

  2. PG 处于 active+degraded 原因是因为 OSD 是处于活跃, 但并没有完成所有的对象副本写入, 假如 OSD DOWN, CEPH 标记每个 PG 分配到这个相关 OSD 的
    状态为 degraded, 当 OSD 重新上线, OSD 将会重新恢复,

  3. 假如 OSD DOWN 并且 degraded 状态持续, CEPH 会标记 DOWN OSD, 并会对集群迁移相关 OSD 的数据, 对应时间由 mon osd down out interval 参数决定

  4. PG 可以被北极为 degraded, 因为 ceph 在对应 PG 中无法找到一个或者多个相关的对象, 你不可以读写 unfound 对象, 你仍然可以访问标记为 degraded PG 的其他数据

  5. PG 中部分对象的副本数量未达到规定的数量

Inconsistent (不一致)

PG副本出现不一致, 对象大小不正确或者恢复借宿后某个副本出现对象丢失现象

recoverying (恢复中)

ceph 设备故障容忍在一定范围的软件与硬件问题, 当 OSD 变 DOWN, 那么包含该 OSD 的 PG 副本都会有问题, 当 OSD 恢复, OSD 对应的 PG 将会更新
并反映出当前状态, 在一段时间周期后, OSD 将会恢复 recoverying 状态

recovery 并非永远都有效, 因为硬件故障可能会导致多个 OSD 故障, 例如, 网络交换机故障, 可以导致集群中的多个主机及主机包含的 OSD 故障
当网络恢复之后, 每个 OSD 都必须执行恢复

CEPH 提供一定数量的设定在新服务请求与恢复 PG 中数据对象时的资源平衡,
osd recovery delay start 设定允许 osd 重启, re-peer 并在启动 恢复之前处理一些回应请求,
osd recovery threads 设定了恢复过程中线程限制 (默认 1 )
osd recovery thread timeout 设定线程超时, 因为可能出现多个 osd 故障, 重启后在 re-peer 过程中可能出现污染
osd recovery max active 设定限制对一个 osd 从故障后, 恢复请求并发数量
osd recovery max chunk 限制恢复时的数据 chunk 大小, 预防网络堵塞

PG 正在迁移或者同步对象及其副本, 一个 OSD 停止服务(DOWN), 其内容将会落后与 PG 内的其他副本, 这时 PG 将会进入 recoverying 状态, 该 OSD 上的对象将从其他副本同步过来

BACK FILLING (回填)

当新 OSD 加入集群, CRUSH 将会为集群新添加的 OSD 重新分配 PG, 强制新的 OSD 接受重新分配的 PG 并把一定数量的负载转移到新 OSD 中
back filling OSD 会在后台处理, 当 backfilling 完成, 新的 OSD 完成后, 将开始对请求进行服务

在 backfill 操作期间, 你可以看到多种状态,
backfill_wait 表示 backfill 操作挂起, 但 backfill 操作还没有开始 ( PG 正在等待开始回填操作 )
backfill 表示 backfill 操作正在执行
backfill_too_full 表示在请求 backfill 操作, 由于存储能力问题, 但不可以完成,

ceph 提供设定管理装载重新分配 PG 关联到新的 OSD
osd_max_backfills 设定最大数量并发 backfills 到一个 OSD, 默认 10
osd backfill full ratio 当 osd 达到负载, 允许 OSD 拒绝 backfill 请求, 默认 85%,
假如 OSD 拒绝 backfill 请求, osd backfill retry interval 将会生效, 默认 10 秒后重试
osd backfill scan min , osd backfill scan max 管理检测时间间隔

一个新 OSD 加入集群后, CRUSH 会把集群先有的一部分 PG 分配给他, 该过程称为回填, 回填进程完成后, 新 OSD 准备好了就可以对外提供服务

REMAPPED (重映射)

当 pg 改变, 数据从旧的 osd 迁移到新的 osd, 新的主 osd 应该请求将会花费一段时间, 在这段时间内, 将会继续向旧主 osd 请求服务, 直到
PG 迁移完成, 当数据迁移完成, mapping 将会使用新的 OSD 响应主 OSD 服务

当 PG 的 action set 变化后, 数据将会从旧 acting set 迁移到新 action set, 新主 OSD 需要过一段时间后才能提供服务, 因此它会让老的主 OSD 继续提供服务, 知道 PG 迁移完成, 数据迁移完成后, PG map 将会使用新 acting set 中的主 OSD

参考例子

[root@hh-yun-ceph-cinder015-128055 ~]# ceph osd map volumes rbd_id.volume-1421625f-a9a2-41d0-8023-4cec54b33a57
osdmap e5276 pool 'volumes' (1) object 'rbd_id.volume-1421625f-a9a2-41d0-8023-4cec54b33a57' -> pg 1.2cdd8028 (1.28) -> up ([32,26,41], p32) acting ([32,26,41], p32)

STALE (旧)

当 ceph 使用 heartbeat 确认主机与进程是否运行, ceph osd daemon 可能由于网络临时故障, 获得一个卡住状态 (stuck state) 没有得到心跳回应
默认, osd daemon 会每 0.5 秒报告 PG, up 状态, 启动与故障分析,
假如 PG 中主 OSD 因为故障没有回应 monitor 或者其他 OSD 报告 主 osd down, 那么 monitor 将会标记 PG stale,
当你重启集群, 通常会看到 stale 状态, 直到 peering 处理完成,
在集群运行一段时候, 看到 stale 状态, 表示主 osd PG DOWN 或者没有主 osd 没有报告 PG 信息到 monitor 中

PG 处于未知状态, monitors 在 PG map 改变后还没有收到过 PG 的更新, 启用一个集群后, 常常会看到主 peering 过程结束前 PG 处于该状态

Scrubbing (清理中)

PG 在做不一至性校验

有问题的 PG

inactive

PG 很长时间没有显示为 acitve 状态, (不可执行读写请求), PG 不可以执行读写, 因为等待 OSD 更新数据到最新的备份状态

unclean

PG 很长时间都不是 clean 状态 (不可以完成之前恢复的操作), PG 包含对象没有完成相应的复制副本数量, 通常都要执行恢复操作

stale

PG 状态很长时间没有被 ceph-osd 更新过, 标识存储在该 GP 中的节点显示为 DOWN, PG 处于 unknown 状态, 因为 OSD 没有报告 monitor 由