当前位置: 代码迷 >> 综合 >> ceph 运维部署文档(cenos 7.0以上)
  详细解决方案

ceph 运维部署文档(cenos 7.0以上)

热度:32   发布时间:2024-01-05 07:43:05.0

ceph块存储设备手动部署指导

Ceph和GPFS比较

  1. GPFS于1993年研发,1995年投入商用,适用于高性能计算和并行处理。之前都是共享存储,从3.5版本开始新增了FPO模式,采用Share Nothing架构,性能好历史悠久,支持AIX、LINUX、windows。CEPH从2010年加入LINUX版本,最初设计的RADOS是为其实现一个高性能的文件系统服务的,后来考虑支持块设备、对象存储,向云计算靠拢。但目前只支持linux,aix、windows的还需要开发才能支持。
  2. 从海量存储架构上看。GPFS通过将文件分布在多个节点和磁盘上,可以超越单一节点和单一文件系统的性能极限,支持PB级海量存储,目前使用模式多是多节点共享存储并行访问。CEPH是统一分布式存储系统,具有优异的性能、可靠性、可扩展性,其CRUSH算法去中心化,从客户端感知数据分布,另外还可以根据机架感知等来调整Crushmap,例如可以具体到某个磁盘,某个机器,某个机架,甚至是某个DC,这样就可以考虑到机房、机架、机器这样的存储层次,在每层设置不同的存储策略,从而达到较好的效果。只有在增加/删除设备时才需要改动存储层次,方便了数据管理和提高了效率。
  3. 从高性能上看。GPFS通过将I/O分布在多个硬盘提高性能,能够高效工作在1个节点到4000多个节点的集群环境中,还有就是很好的支持SSD盘和闪存阵列。Ceph最开始是为HDD设计的,没有充分考虑全SSD,甚至更先进的PCIe SSD和NVRAM的情况NVRAM。导致这些硬件的物理性能在Ceph中无法充分发挥出来,特别是延迟和IOPS,受比较大的影响。
  4. 从可靠性上看。在GPFS的环境中,某一节点的硬盘连接丢失,不会影响到其他的节点,GPFS使用RSCT的功能持续的监控不同文件模块的健康状态,当任一错误被检测到时,相应的恢复动作将自动执行。GPFS还提供了额外的日志和恢复功能,可以维持元数据的一致性。最大三副本,可支持节点的自动Failover。CEPH的rados采用强一致性设计,可容忍网络中断、掉电、服务器宕机、硬盘故障等,并进行自动修复,保证数据的可靠性和系统可用性。也是同样的三副本设计,支持节点的自动Failover。Monitors是Ceph的管家,维护着Ceph的全局状态。Monitors的功能和zookeeper类似,它们使用Quorum和Paxos算法去建立全局状态的共识。其OSDs可以进行自动修复,而且是并行修复。
  5. 从工业标准看。GPFS是商用的,经历大量生产环境和实践的检验,相对来说成熟稳定。CEPH是开源的,2010年加入到LINUX中,还未经历大量生产环境的检验和复杂业务场景的企业实践验证,还不够成熟完善。但总的来说,Ceph瑕不掩瑜,仍然是一个优秀,甚至出色的开源存储系统。

部署前环境配置


  • 环境部署信息
本手顺安装架构:Ceph-deploy 1个MON 2个OSD 3个CentOS 7:ceph-deploy + mon1(mon1)10.53.16.190mon2(mon2)10.53.16.191osd(node1)10.53.16.192osd(node2)10.53.16.193osd(node3)10.53.16.194
  • 修改所有节点的主机名字 以及 /etc/hosts
1. 每个节点修改主机名:hostnamectl set-hostname mon1hostnamectl set-hostname mon2hostnamectl set-hostname node1hostnamectl set-hostname node2hostnamectl set-hostname node32. 修改mon1节点的hosts文件vim /etc/hosts10.53.16.190 mon110.53.16.191 mon210.53.16.192 node110.53.16.193 node210.53.16.194 node33. ping测试节点连通性ping -c 3 mon1ping -c 3 mon2ping -c 3 node1ping -c 3 node2ping -c 3 node3
  • 为mon1添加epel, 更新rpm源
1. 添加epel源
sudo yum install -y yum-utils && sudo yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ && sudo yum install --nogpgcheck -y epel-release && sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && sudo rm /etc/yum.repos.d/dl.fedoraproject.org*2. 添加 Ceph 源:
sudo vim /etc/yum.repos.d/ceph.repo[ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-jewel/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc3. 更新软件包:
sudo yum update -y && sudo yum install yum-plugin-priorities

如果yum出现问题,请重新删除repo
rm -f mv /etc/yum.repos.d/epel.repo

  • 为每个节点添加防火墙规则以及关闭selinux
    1. 关闭selinuxsudo setenforce 02. 关闭防火墙或者自己添加防火墙规则1. 添加 Calamari端口sudo firewall-cmd --zone=public --add-port=80/tcp --permanentsudo firewall-cmd --zone=public --add-port=2003-2004/tcp --permanentsudo firewall-cmd --zone=public --add-port=4505-4506/tcp --permanent2. 添加 mon 节点端口sudo firewall-cmd --zone=public --add-port=6789/tcp --permanent3. 添加mon节点和node节点端口sudo firewall-cmd --zone=public --add-port=6800-7300/tcp --permanentsudo firewall-cmd --zone=public --add-port=2003-2004/tcp --permanentsudo firewall-cmd --zone=public --add-port=4505-4506/tcp --permanent
  • 在所有节点安装ntp服务
 sudo yum install ntp ntpdate ntp-doc -y
  • 添加系统账户ceph,并且设置root权限
useradd -d "/home/ceph"  -m ceph
passwd ceph
echo "ceph ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph
sudo chmod 0440 /etc/sudoers.d/ceph
  • 重启所有节点服务器
init 6
  • 配置mon1的ssh, 免密访问所有节点
1. 生成ssh-keyssh-keygen(无需输入任何内容,一直enter生成完成)ssh-copy-id ceph@mon1ssh-copy-id ceph@mon2ssh-copy-id ceph@node1ssh-copy-id ceph@node2ssh-copy-id ceph@node32. 修改 ~/.ssh/config
Host mon1Hostname mon1User ceph
Host mon2Hostname mon2User ceph
Host node1Hostname node1User ceph
Host node2Hostname node2User ceph
Host node3Hostname node3User ceph           
  • 拷贝mon1的服务器的/etc/hosts文件到所有节点
scp /etc/hosts root@mon2:/etc/hosts
scp /etc/hosts root@node1:/etc/hosts
scp /etc/hosts root@node2:/etc/hosts
scp /etc/hosts root@node3:/etc/hosts

ceph集群部署


  • 在mon1节点上安装ceph-deploy服务
sudo yum install ceph-deploy -y
  • 在mon1节点上创建ceph配置目录
mkdir -p ~/ceph_cluster
cd ~/ceph_cluster
  • 指定mon1为管理节点
ceph-deploy new mon1

安装出现以下错误,请重新指定其他其他服务器管理节点
[ceph_deploy][ERROR ] UnsupportedPlatform: Platform is not supported: centos

  • 修改配置文件
vim ceph.conf
osd pool default size = 3    //修改副本数量,建议为3个
public network = 10.53.16.0/24 //注意 mon_host 必须在 public network 网络的网段内
cluster network = 10.0.0.0/8 //集群的工作网段,用于集群的数据同步,心跳等等
  • 在所有节点安装Ceph
sudo ceph-deploy install mon1 node1 node2
  • 初始化 monitor
ceph-deploy mon create-initial
  1. 如果启动失败,请查看当前系统账户是否是ceph账户

  2. 确认是否启动成功

    ps -ef | grep ceph
    root 7097 1289 0 13:35 ? 00:00:00 sshd: ceph [priv]
    ceph 7105 7097 0 13:35 ? 00:00:00 sshd: ceph@pts/1
    ceph 7108 7105 0 13:35 pts/1 00:00:00 -bash
    ceph 7879 1 0 5月11 ? 00:00:13 /usr/bin/ceph-mon -f --cluster ceph --id mon2 --setuser ceph --setgroup ceph
    root 9107 1289 0 14:11 ? 00:00:00 sshd: ceph [priv]
    ceph 9110 9107 0 14:11 ? 00:00:00 sshd: ceph@pts/2
    ceph 9119 9110 0 14:11 pts/2 00:00:00 -bash
    ceph 9174 9119 0 14:11 pts/2 00:00:00 ps -ef
    ceph 9175 9119 0 14:11 pts/2 00:00:00 grep --color=auto ceph

3.使用下面命令确认每个节点是否顺利启动ceph

systemctl status ceph-mon@mon1.service
systemctl status ceph-mon@node1.service
systemctl status ceph-mon@node2.service
  1. 遇到获取keyring失败,查看ceph.conf的public network设置为同一网段或者查看网卡是否存在多个ip地址
    [mon1][ERROR ] "ceph auth get-or-create for keytype admin returned -1
    [mon1][ERROR ] Failed to return 'admin' key from host mon1
    [ceph_deploy.gatherkeys][ERROR ] Failed to connect to host:mon1
    [ceph_deploy.gatherkeys][INFO ] Destroy temp directory /tmp/tmpAz3hQe
    [ceph_deploy][ERROR ] RuntimeError: Failed to connect any mon
如果没有任何日志报错的话,以上ceph集群就顺利启动了

创建OSD磁盘


为每个osd节点分配独立的磁盘,与系统的磁盘隔离开来,以及为ceph日志文件也隔离独立磁盘, 保证数据安全性,可靠性以及性能#### 建议创建osd磁盘在10个以上
  • 使用裸盘作为OSD(推荐使用,这样性能比较好)
    1. 在节点上查看裸盘路径fdisk -l2. 在mon1部署节点上添加裸盘ceph-deploy disk zap node1:/dev/sdb node2:/dev/sdbceph-deploy osd prepare node1:/dev/sdb node2:/dev/sdbceph-deploy osd activate node1:/dev/sdb1 node2:/dev/sdb1
  • 使用文件夹作为OSD
1. 为node1节点和node2节点创建文件夹
ssh ceph@node1
mkdir /var/local/osd1
sudo chmod 777 /var/local/osd1
exitssh ceph@node2
mkdir /var/local/osd2
sudo chmod 777 /var/local/osd2
exit2. 在mon1节点上激活osdceph-deploy osd prepare node1:/var/local/osd1 node2:/var/local/osd2sudo ceph-deploy osd activate node1:/var/local/osd1 node2:/var/local/osd2
3. 查看节点是否成功部署ceph osd tree
  • 推送配置文件到所有节点
ceph-deploy admin mon1 node1 node2
  • 查看ceph集群状态
ceph health
  1. 出现找不到/etc/ceph/ceph.client.admin.keyring的错误,请修改权限 chmod 777 /etc/ceph/ceph.client.admin.keyring
    2018-05-15 20:26:27.442992 7f29a8b6b700 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.admin.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin: (2) No such file or directory
    2018-05-15 20:26:27.443003 7f29a8b6b700 -1 monclient(hunting): ERROR: missing keyring, cannot use cephx for authentication
    2018-05-15 20:26:27.443004 7f29a8b6b700 0 librados: client.admin initialization error (2) No such file or directory
    Error connecting to cluster: ObjectNotFound

ceph节点的增加

  • 增加mon节点
1. 编辑部署节点hosts文件,添加新mon节点的ip,拷贝到要部署的mon节点中sudo scp /etc/hosts root@mon4:/etc/hosts2. 在新的mon节点上安装ntpsudo yum install ntp ntpdate ntp-doc -y3. 在部署节点部署cephceph-deploy install mon44. 将新的节点添加到ceph 集群中ceph-deploy mon add mon4
  1. 出现如下部署错误,请查看部署节点的ceph.conf文件的public network设置为公网的地址

[mon4][ERROR ] RuntimeError: command returned non-zero exit status: 1
[ceph_deploy.mon][ERROR ] Failed to execute command: ceph-mon –cluster ceph –mkfs -i mon4 –monmap /var/lib/ceph/tmp/ceph.mon4.monmap –keyring /var/lib/ceph/tmp/ceph-mon4.mon.keyring –setuser 1001 –setgroup 1001
[ceph_deploy][ERROR ] GenericError: Failed to add monitor to host: mon4

  • 增加osd节点
1. 在新节点上创建文件夹或者裸盘ssh ceph@node3 mkdir /var/local/osd3sudo chmod 777 /var/local/osd3exit2. 在部署节点激活新的osd节点ceph-deploy osd prepare node3:/var/local/osd3    ceph-deploy osd activate node3:/var/local/osd3
3. 推送配置到新的节点ceph-deploy admin node3
4. 查看是否部署成功ceph osd tree
  • 删除mon节点
ceph-deploy mon destroy mon1
  • 删除 osd 节点
1. 踢出osd节点
 ceph osd out osd.42. 在osd节点服务停止ceph服务
 ps -ewf|grep ceph; kill it3. 移除crush节点 
 ceph osd crush remove osd.44. 移除auth认证
 ceph auth del osd.46. 移除osd节点
 ceph osd rm 4 

关于修改osd的journal

osd的数据与journal日志放在不同的磁盘上有助于大幅度提升iops性能和数据安全性。建议把journa放在独立的ssd磁盘上
  • 使用fdisk为新的磁盘创建分区sdb1

  • 停止osd0所在节点的ceph服务

service ceph stop osd.0
  • osd.0刷入所有日志
ceph-osd --flush-journal -i 0

-i 0为osd.o的磁盘编号

  • 挂载journal到独立的磁盘
rm /var/lib/ceph/osd/ceph-0/journal
ln -s /dev/sdb1 /var/lib/ceph/osd/ceph-0/journal
  • 创建新的日志文件
ceph-osd --mkjournal -i 0
service ceph start osd.0

创建pool数据池


  • 显示所有pool池
rados lspools
  • 查看pool ID、副本数量、CRUSH规则集、PG和PGP数量
ceph osd dump |grep pool
  • 创建pool池
    1. 若少于5个OSD, 设置pg_num为128。
    2. 5~10个OSD,设置pg_num为512。
    3. 10~50个OSD,设置pg_num为4096。
    4. 以此类推
ceph osd pool create test-pool 64

test-pool:数据池名字
64:pg数量

  • 调整pool池副本
1. 调整test-pool池的副本数量为2ceph osd pool set test-pool size 2
  • 设置pool配额
1. 设置pool最大存储对象数量,取消最大对象限制设置为0ceph osd pool set-quota test-pool max_objects 100002. 设置pool的最大容量ceph osd pool set-quota test-pool max_bytes $((10 * 1024 * 1024 * 1024))
  • 重命名pool
1. 将test-pool改为image-pool
ceph osd pool rename test-pool image-pool
  • 查看pool状态
rados df
  • 创建pool快照
    1. ceph支持对整个pool创建快照(和Openstack Cinder一致性组区别?),作用于这个pool的所有对象。但注意ceph有两种pool模式:
    2. Pool Snapshot,我们即将使用的模式。创建一个新的pool时,默认也是这种模式。
    3. Self Managed Snapsoht,用户管理的snapshot,这个用户指的是librbd,也就是说,如果在pool创建了rbd实例就自动转化为这种模式。
    4. 这两种模式是相互排斥,只能使用其中一个。因此,如果pool中曾经创建了rbd对象(即使当前删除了所有的image实例)就不能再对这个pool做快照了。反之,如果对一个pool做了快照,就不能创建rbd image了。
ceph osd pool mksnap test-pool test-pool-snap
  • 删除pool快照
ceph osd pool rmsnap test-pool test-pool-snap

test-pool:数据池
test-pool-snap:快照名

创建ceph块设备


  • 在指定的数据池中创建10GB块设备
rbd create  test-rbd --size 10G -p test-pool

test-pool:指定的数据池
test-rbd: 创建的数据

  • 列出数据池的块设备以及详细信息
rbd ls -p test-pool
rbd --image test-rbd info -p test-pool

layering: 支持分层
striping: 支持条带化 v2
exclusive-lock: 支持独占锁
object-map: 支持对象映射(依赖 exclusive-lock )
fast-diff: 快速计算差异(依赖 object-map )
deep-flatten: 支持快照扁平化操作
journaling: 支持记录 IO 操作(依赖独占锁)

rbd image有4个 features,layering, exclusive-lock, object-map, fast-diff, deep-flatten
因为目前内核版本 3.10仅支持layering,修改默认配置
每个ceph node的/etc/ceph/ceph.conf 添加一行
rbd_default_features = 1
这样之后创建的image 只有这一个feature

format 1 - 新建 rbd 映像时使用最初的格式。此格式兼容所有版本的 librbd 和内核模块,但是不支持较新的功能,像克隆。
format 2 - 使用第二版 rbd 格式, librbd 和 3.11 版以上内核模块才支持(除非是分拆的模块)。此格式增加了克隆支持,使得扩展更容易,还允许以后增加新功能

  • 挂载ceph块设备
1. 修改存储特征
rbd feature disable test-rbd -p test-pool exclusive-lock object-map fast-diff deep-flatten
2. 挂载块设备
sudo rbd map --image test-rbd -p test-pool
3. 查看是否挂载成功
rbd showmapped
  • 使用这个块设备
1. 查看容量
sudo fdisk -l /dev/rbd0
2. 格式化xfs文件系统
sudo mkfs.xfs /dev/rbd0
3. 创建挂载路径 
sudo mkdir /mnt/ceph-disk
4. 挂载路径
sudo mount /dev/rbd0 /mnt/ceph-disk
5. 查看是否挂载成功
df -h /mnt/ceph-disk

挂载成功后就可以直接在这个文件里放东西了,相当于网盘了。数据会自动备份在这个osd服务器上了

calamari监控管理平台部署


  • 安装环境

    1. Calamari包含的组件主要有calamari-server;romana;salt-minion;salt-master;diamond。
      这些模块各自的作用:calamari-server 这个是提供一个与集群进行交互,并且自己封装了一个自己的API,做集中管理的地方,这个只需要在集群当中的某一台机器上安装,也可以独立安装

    2. romana 就是原来的calamari-client,这个叫client,其实是一个web的界面,这个叫calamari-web更好,现在已经更名为romana,这个也是只需要在集群当中的某一台机器上安装,也可以独立安装,这个需要跟calamari-server安装在一台机器上
      salt-master 是一个管理的工具,可以批量的管理其他的机器,可以对安装了salt-minion的机器进行管理,在集群当中,这个也是跟calamari-server安装在一起的

    3. salt-minion 是安装在集群的所有节点上的,这个是接收salt-master的指令对集群的机器进行操作,并且反馈一些信息到salt-master上diamond 这个是系统的监控信息的收集控件,提供集群的硬件信息的监控和集群的信息的监控,数据是发送到romana的机器上的,是由romana上的carbon来收取数据并存储到机器当中的数据库当中的

节点情况
需要安装软件
Calamari服务端
calamri-server romana salt-master
集群节点
salt-minion diamond
host文件 拷贝master的host文件

  • 拷贝ceph-deploy的/etc/hosts到各个ceph节点
scp /etc/hosts root@node1:/etc/hosts
scp /etc/hosts root@node2:/etc/hosts
  • 为每个节点软件下载和解压
wget https://file.hfjy.com/index.php/s/t9d49CWvwjhgM15/download unzip download.zip cd centosjewel/
  • ceph-deploy节点安装监控服务端calamari和romana
1. 本地安装 calamari, romana, salt-mastersudo yum localinstall calamari-server-1.3.3-jewel.el7.centos.x86_64.rpm romana-1.2.2-36_gc62bb5b.el7.centos.x86_64.rpm salt-master-2015.8.1-1.el7.noarch.rpm
2. 调整目录权限sudo chmod 777 -R /var/log/calamari/sudo chmod 777 -R /opt/calamari/
3. 安装被监控端而后在继续操作服务端
  • 被监控节点安装(在node节点上安装)
1. 安装salt-minion diamondsudo yum localinstall salt-2015.8.1-1.el7.noarch.rpm salt-minion-2015.8.1-1.el7.noarch.rpm diamond-3.4.68-jewel.noarch.rpm2. 配置salt-minion文件sudo sed -i 's/#master: salt/master:mon1/' /etc/salt/minion

mon1: 为 calamari的主机名字

  1. 添加minion.d附加目录及calamari.conf文件
sudo mkdir /etc/salt/minion.d/
sudo touch /etc/salt/minion.d/calamari.conf
sudo chmod 777 /etc/salt/minion.d/calamari.conf
sudo echo 'master:mon1'> /etc/salt/minion.d/calamari.conf
sudo systemctl restart salt-minion
sudo systemctl enable salt-minion
  • 配置diamond
cd /etc/diamond/ && sudo cp diamond.conf.example diamond.conf
sudo chmod 777 /etc/diamond/diamond.conf
sudo sed -i '/^host/s/graphite/mon1/' /etc/diamond/diamond.conf
sudo systemctl restart diamond
sudo systemctl enable diamond
  1. mon1:calamari服务端的名字
  2. 如果启动diamond失败,请添加服务
    sudo chkconfig --add diamond
  • 所有被监控节点完后,在监控服务端启动服务器
sudo systemctl restart salt-master

管理salt-minion节点(calamari服务端操作)

  • 列出所有节点
sudo salt-key -L
  • 允许所有节点接入
sudo salt-key -A
  • 检测节点链接性
sudo salt '*' test.ping
  • 输出集群状态
sudo salt '*' ceph.get_heartbeats

初始化calamari配置(在服务端操作)

  • 初始化calamari,输入账户和密码,就可以进行web访问了
sudo calamari-ctl initialize

清除ceph安装包


  • 清除安装包
ceph-deploy purge mon1 node1 node2
  • 清除配置信息
ceph-deploy purgedata mon1 node1 node2
ceph-deploy forgetkeys
  • 卸载部署的ceph包
ceph-deploy uninstall mon1 node1 node2
  • 每个节点删除残留的配置文件
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-mon/*
rm -rf /var/lib/ceph/tmp/*
rm -rf /etc/ceph/*
rm -rf /var/run/ceph/*

性能测试

RADOS 性能测试:使用 Ceph 自带的 rados bench 工具
  • 该工具的语法为:rados bench -p
顺序写:
rados bench -p rbd 10 write --no-cleanup
顺序读:
rados bench -p rbd 10 seq
随机读
rados bench -p rbd 10 rand
  • RADOS 性能测试:使用 rados load-gen 工具
语法:
rados -p rbd load-gen 
--num-objects     初始生成测试用的对象数,默认 200
--min-object-size 测试对象的最小大小,默认 1KB,单位byte 
--max-object-size 测试对象的最大大小,默认 5GB,单位byte
--min-op-len      压测IO的最小大小,默认 1KB,单位byte
--max-op-len      压测IO的最大大小,默认 2MB,单位byte
--max-ops         一次提交的最大IO数,相当于iodepth
--target-throughput 一次提交IO的历史累计吞吐量上限,默认 5MB/s,单位B/s
--max-backlog     一次提交IO的吞吐量上限,默认10MB/s,单位B/s
--read-percent    读写混合中读的比例,默认80,范围[0, 100] --run-length 运行的时间,默认60s,单位秒
rados -p pool100 load-gen --read-percent 0 --min-object-size 1073741824 --max-object-size 1073741824 --max-ops 1 --read-percent 0 --min-op-len 4194304 --max-op-len 4194304 --target-throughput 1073741824 --max_backlog 1073741824该命令的含义是:在 1G 的对象上,以 iodepth = 1 顺序写入 block size 为 4M 的总量为 1G 的数据。其平均结果大概在 24MB/s,基本和 rados bench 的结果相当。
在 client 上,同样的配置,顺序写的BW大概在 20MB/s,顺序读的 BW 大概在 100 MB/s。

一些常见问题处理

  • osd节点状态为down(处理情况一)
1. 在mon节点上先踢出
 ceph auth del osd.*
2. 在osd节点上重新激活
 sudo ceph-disk activate-all 

*:为down的节点编号

  • osd节点状态为down(处理情况二)
1. 重新在ceph-deploy激活节点ceph-deploy osd activate node3:/var/local/osd3
  • pg出现down的故障
1. 枚举出down的服务器ceph pg dump_stuck inactiveceph pg {pg id} query2. 找出pg down掉的osd编号, 重启osd服务, 需要等待几分钟,等pg节点为incompletecepg osd {osd.*} lost --yes-i-really-mean-it3. 如果出现 Error ENOENT: i don't have pgid 1.13, 重新创建该pg节点ceph pg force_create_pg {pg id}

ceph常用命令

集群维护常用命令概览

  • 检查集群的状况
启动集群后、读写数据前,先检查下集群的健康状态。你可以用下面的命令检查:
ceph health 
ceph health detail  (详细)
ceph -w(监控当前集群的状态)
ceph df(检查整个集群磁盘使用状况)
  • mon操作相关
ceph mon dump(监视图)
ceph quorum_status(监视器法定人数)
ceph mon remove mon2(删除mon2节点)
ceph mon getmap -o 1.txt(导出mon map)
monmaptool --print 1.txt (导入上面的mon map)
ceph-mon -i nc3 --inject-monmap 1.txt(把上面的mon map注入新加入的节点)
ceph-conf --name mon.nc3 --show-config-value admin_socket(查看mon的amin socket)
ceph-conf --name mon.nc1 --show-config-value log_file  /var/log/ceph/ceph-mon.nc1.log(查看ceph mon log日志所在的目录)
ceph --admin-daemon /var/run/ceph/ceph-mon.nc3.asok config show | less(查看一个集群ceph-mon.nc3参数的配置、输出信息特别详细)
  • mds操作相关
ceph mds dump(查看mds状态)
ceph  mds rm 0 mds.nc1(删除一个mds节点)
ceph mds rmfailed <int[0-]>  (设置mds状态为失败)
ceph mds add_data_pool <poolname>(新建pool)
mds cluster_down(关闭mds集群)
mds cluster_up(启动mds集群)
ceph mds set max_file_size 1024000000000(设置cephfs文件系统存储方式最大单个文件尺寸)
ceph mds fail 0(强制mds状态为featrue)
ceph fs rm leadorfs --yes-i-really-mean-it(删除mds文件系统)
ceph osd pool delete cephfs_data cephfs_data --yes-i-really-really-mean-it(删除fs数据文件夹)
ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it (删除元数据文件夹)
ceph  mds rm 0 mds.node242(拆除文件系统前推荐先删除节点)
  • auth相关
ceph auth list(查看ceph集群中的认证用户及相关的key)
ceph auth get-or-create client.admin mds 'allow' osd 'allow *' mon 'allow *' > /etc/ceph/ceph.client.admin.keyring(为ceph创建一个admin用户并为admin用户创建一个密钥,把密钥保存到/etc/ceph目录下)
ceph auth get-or-create osd.0 mon 'allow rwx' osd 'allow *' -o /var/lib/ceph/osd/ceph-0/keyring(为osd.0创建一个用户并创建一个key)
ceph auth get-or-create mds.nc3 mon 'allow rwx' osd 'allow *' mds 'allow *' -o /var/lib/ceph/mds/ceph-cs1/keyring(为mds.nc3创建一个用户并创建一个key)
ceph auth import   /var/lib/ceph/mds/ceph-cs1/keyring(导入key信息)
ceph auth del osd.0(删除集群中的一个认证用户)
  • osd相关
物理盘
ceph osd tree (查看osd列表)
ceph osd df (检查osd磁盘使用状况)
ceph osd perf(查看数据延迟)
ceph osd down osd.0 (down掉一个osd.0的硬盘)
ceph osd rm osd.0(在集群中删除一个osd.0硬盘)
ceph osd crush rm osd.0(在集群中删除一个osd 硬盘 crush map)
ceph osd crush rm node1 在集群中删除一个osd的host节点
ceph osd getmaxosd(查看最大osd的个数)
ceph osd setmaxosd 2048(设置最大的osd的个数(当扩大osd节点的时候必须扩大这个值)ceph osd crush set {id} {weight} [{loc1} [{loc2} ...]](设置osd crush的权重为1.0)
> ceph osd crush set osd.1 0.5 host=node241
ceph osd reweight 3 0.5(设置osd的权重)
ceph osd out osd.3(把一个osd节点逐出集群)
ceph osd in osd.3(把逐出的osd加入集群)
ceph osd pause(暂停osd, 暂停后整个集群不再接收数据)
ceph osd unpause(再次开启osd, 开启后再次接收数据)
ceph --admin-daemon /var/run/ceph/ceph-osd.0.asok config show | less(查看一个集群osd.0参数的配置、输出信息特别详细,集群所有配置生效可以在此参数下确认)
ceph osd set nodown(设置标志 flags ,不允许关闭osd、解决网络不稳定,osd 状态不断切换的问题)
ceph osd unset nodown(取消设置)
  • pool相关
数据池。
ceph osd lspools(查看ceph集群中的pool数量)
ceph osd pool create rbdtest 100(在ceph集群中创建一个pool,这里的100指的是PG组)
ceph osd dump | grep 'replicated size'(查看集群中所有pool的副本尺寸)
ceph osd pool get rbdpool size(查看pool 最大副本数量)
ceph osd pool get rbdpool min_size(查看pool 最小副本数量)
ceph osd pool set rbdtest pg_num 100(设置一个pool的pg数量)
ceph osd pool set rbdtest pgp_num 100(设置一个pool的pgp数量)ceph osd pool set {pool_name} min_size 1 修改ceph,数据最小副本数、和副本数
ceph osd pool set {pool_name} size 2
> ceph osd pool set rbdpool min_size 1
> ceph osd pool set rbdpool size 2ceph osd pool set rbdtest target_max_bytes 100000000000000(设置rbdtest池的最大存储空间为100T(默认是1T))
ceph osd pool set-quota rbdtest max_objects 10000(为一个ceph pool配置配额、达到配额前集群会告警,达到上限后无法再写入数据)
ceph osd pool delete rbdtest  rbdtest  --yes-i-really-really-mean-it (在集群中删除一个pool,注意删除poolpool 映射的image 会直接被删除,线上操作要谨慎)
ceph osd pool mksnap rbdtest   rbdtest-snap20150924(给一个pool创建一个快照)
rados lssnap -p rbdtest(查看快照信息)
ceph osd pool rmsnap rbdtest  rbdtest-snap20150924(删除pool的快照)
rados lssnap -p rbdtest(验证,剩余一个snap)
  • rados相关
rados 是和Ceph的对象存储集群(RADOS),Ceph的分布式文件系统的一部分进行交互是一种实用工具。
rados lspools(查看ceph集群中有多少个pool (只是查看pool))
rados df(显示整个系统和被池毁掉的使用率统计,包括磁盘使用(字节)和对象计数)
rados mkpool test(创建一个pool)
rados create test-object -p test(创建一个对象object)
rados -p test ls(查看对象文件)
rados rm test-object-1 -p test(删除一个对象)
rados rmpool test test –yes-i-really-really-mean-it(删除foo池 (和它所有的数据))
rados ls -p test | more(查看ceph pool中的ceph object (这里的object是以块形式存储的)
rados -p test mksnap testsnap(为test pool创建快照)
rados -p test lssnap(列出给定池的快照)
rados -p test rmsnap testsnap(删除快照)
rados -p test put myobject blah.txt(上传一个对象到test pool)
  • rbd相关
rbd create -p test --size 10000 kjh(在test池中创建一个命名为kjh的10000M的镜像)
rbd ls test(查看ceph中一个pool里的所有镜像)
rbd -p test info kjh(查看新建的镜像的信息)
rbd info -p test  --image kjh(查看ceph pool中一个镜像的信息)
rbd rm  -p test  kjh(删除一个镜像)
rbd resize -p test --size 20000 kjh(调整一个镜像的尺寸)
rbd -p test info kjh(调整后的镜像大小)
  • pg相关
PG =“放置组”。当集群中的数据,对象映射到编程器,被映射到这些PGS的OSD。
ceph pg dump (查看pg组的映射信息)
ceph pg map 0.3f(查看一个PG的map)
> osdmap e88 pg 0.3f (0.3f) -> up [0,2] acting [0,2]   #其中的[0,2]代表存储在osd.0、osd.2节点,osd.0代表主副本的存储位置ceph pg stat(查看PG状态)
ceph pg  {pg-id} query(查询一个pg的详细信息)
ceph pg scrub {pg-id}(要洗刷一个pg组,执行命令)
ceph pg dump_stuck unclean((不干净)归置组含有复制数未达到期望数量的对象,它们应该在恢复中。)
ceph pg dump_stuck inactive((不活跃)归置组不能处理读写,因为它们在等待一个有最新数据的 OSD 复活且进入集群。)
ceph pg dump_stuck stale((不新鲜)归置组处于未知状态:存储它们的 OSD 有段时间没向监视器报告了(由 mon_osd_report_timeout 配置)。可用格式有 plain (默认)和 json 。阀值定义的是,归置组被认为卡住前等待的最小时间(默认 300 秒) ceph pg dump --format plain(显示一个集群中的所有的pg统计) ceph pg {pg-id} mark_unfound_lost revert|delete(恢复一个丢失的pg, 如果集群丢了一个或多个对象,而且必须放弃搜索这些数据,你就要把未找到的对象标记为丢失( lost )。 如果所有可能的位置都查询过了,而仍找不到这些对象,你也许得放弃它们了。这可能是罕见的失败组合导致的,集群在写入完成前,未能得知写入是否已执行。 当前只支持 revert 选项,它使得回滚到对象的前一个版本(如果它是新对象)或完全忽略它。要把 unfound 对象标记为 lost ) ceph pg ls {pg-id} (查看某个PG内分布的数据状态,具体状态可以使用选项过滤输出)
  • rbd pool 快照功能
ceph osd pool create ptmindpool 256 256(新建个pool叫’ptmindpool’同时在下面创建一个’kjhimage’)
rbd create kjhimage --size 1024 --pool ptmindpool(创建镜像)
rbd --pool ptmindpool ls(查看镜像)
rbd snap create ptmindpool/kjhimage@snapkjhimage(创建snap,快照名字叫’snapkjhimage’)
rbd snap ls ptmindpool/kjhimage(查看kjhimage的snap)
rbd snap rollback ptmindpool/kjhimage@snapkjhimage(回滚快照)
rbd snap rm ptmindpool/kjhimage@snapkjhimage(删除snap 删除snap报(rbd: snapshot 'snapshot-xxxx' is protected from removal.)写保护 ,使用 rbd snap unprotect volumes/snapshot-xxx' 解锁,然后再删除)
rbd snap purge ptmindpool/kjhimage(删除kjhimage的全部snapshot)
rbd export -p ptmindpool --image kjhimage /tmp/kjhimage.img(把ceph pool中的一个镜像导出)
l /tmp/kjhimage.img (验证查看导出文)
rbd import /tmp/kjhimage.img  -p ptmindpool --image importmyimage1(把一个镜像导入ceph中)
rbd -pptmindpool ls(验证查看导入镜像文件)