本部分介绍了 Ceph 集群的常用操作,包括进程的起停、集群的监控、用户管理、MDS/MON/OSD 的增加和删除、存储池(pool)的操作、修改集群的配置,以及 Crushmap 的管理、修改 Monitor 的 IP 等操作。
创建一个存储mds的数据节点:/var/lib/ceph/mds/ceph-{$id}
,id
表示元数据服务器的名称,可根据需求自行定义。
例如:
sudo mkdir /var/lib/ceph/mds/ceph-`hostname`
sudo chown ceph:ceph -R /var/lib/ceph/mds/ceph-`hostname`
修改ceph.conf,增加MDS
[mds.{$id}]
host = {hostname}
例如:
[mds.ceph-1]
host = ceph-1
如果使用了CephX验证,则创建验证密钥;否则调过此步骤
sudo ceph auth get-or-create mds.{$id} mon 'profile mds' mgr 'profile mds' mds 'allow *' osd 'allow *' > /var/lib/ceph/mds/ceph-{$id}/keyring
启动mds服务
sudo cp /usr/lib/systemd/system/[email protected] /usr/lib/systemd/system/ceph-mds@`hostname`.service
sudo systemctl start ceph-mds@`hostname`
sudo systemctl enable ceph-mds@`hostname`
查看mds服务的状态
ceph mds stat
cephfs-1/1/1 up {0=ceph-1=up:active}, 2 up:standby
注意
:在删除元数据服务器之前一定要确保有剩余的备选元数据服务器为ceph客户端提供服务。如果没有的话,那么需要先新增一个元数据服务器(安照上述方法),然后再进行删除。已确保cephfs服务能够正常被使用
如果有备用的元数据服务器,则可以执行下述的删除操作:
停止元数据服务
ceph mds fail <mds name>
例如:
ceph mds fail ceph-1
删除元数据服务的目录
sudo rm -rf /var/lib/ceph/mds/ceph-{$id}
例如:
sudo rm -rf /var/lib/ceph/mds/ceph-ceph-1
使用fdisk
工具格式化磁盘,生成osd进程的磁盘以及journal磁盘
sudo umount /disk3 #先将挂载在/dev/sde上的disk3 umount掉
sudo fdisk /dev/sde
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p(显示该磁盘的分区情况)
Command (m for help): d(删除该磁盘的所有分区)
Command (m for help): g(将磁盘的文件格式变成gpt)
Command (m for help): n(创建新分区,创建两个,一个为journal(10G),一个为data)
Command (m for help): w(保存退出)
2.1 添加一个新osd,id
可以省略,ceph会自动使用最小可用整数,第一个osd从0开始
ceph osd create {id}
ceph osd create
3
2.2 初始化osd目录
创建osd.3目录,目录名格式{cluster-name}-{id}
mkdir /var/lib/ceph/osd/{cluster-name}-{id}
sudo mkdir /var/lib/ceph/osd/ceph-3
2.3 挂载osd.0的数据盘/dev/sde2
sudo mkfs.xfs /dev/sdb2
sudo mount /dev/sdc2 /var/lib/ceph/osd/ceph-3
2.4 初始化osd数据目录
sudo ceph-osd -i 3 --mkfs --mkkey
--mkkey要求osd数据目录为空
这会创建osd.0的keyring /var/lib/ceph/osd/ceph-0/keyring
初始化后,默认使用普通文件/var/lib/ceph/osd/ceph-3/journal作为osd.3的journal分区,普通文件作为journal分区性能不高,若只是测试环境,可以跳过更改journal分区这一步骤
2.5 创建journal
生成journal分区,一般选ssd盘作为journal分区,这里使用ssd的/dev/sde1分区作为journal
使用fdisk工分出磁盘/dev/sde1,
sudo mkfs.xfs /dev/sde1
sudo rm -f /var/lib/ceph/osd/ceph-3/journal
查看分区对应的partuuid, 找出/dev/sdb1对应的partuuid
sudo blkid
sudo ln -s /dev/disk/by-partuuid/b3897364-8807-48eb-9905-e2c8400d0cd4 /var/lib/ceph/osd/ceph-3/journal
sudo chown ceph:ceph -R /var/lib/ceph/osd/ceph-3
sudo chown ceph:ceph /var/lib/ceph/osd/ceph-3/journal
sudo ceph-osd --mkjournal -i 3
sudo chown ceph:ceph /var/lib/ceph/osd/ceph-3/journal
2.6 注册osd.{id},id为osd编号,默认从0开始
sudo ceph auth add osd.{id} osd ‘allow *’ mon ‘allow profile osd’ -i /var/lib/ceph/osd/ceph-{id}/keyring
sudo ceph auth add osd.3 osd 'allow *' mon 'allow profile osd' -i /var/lib/ceph/osd/ceph-3/keyring
2.7 加入crush map
ceph osd crush add-bucket {hostname} host
sudo ceph osd crush add-bucket `hostname` host
2.8 然后把osd节点移动到默认的root default
下面
sudo ceph osd crush move `hostname` root=default
2.9 添加osd.3到CRUSH map中的m1节点下面,加入后,osd.3就能够接收数据
ceph osd crush add osd.{id} 0.4 root=sata rack=sata-rack01 host=sata-node5
sudo ceph osd crush add osd.3 1.7 root=default host=`hostname`
0.4为此osd在CRUSH map中的权重值,它表示数据落在此osd上的比重,是一个相对值,一般按照1T磁盘比重值为1来计算,这里的osd数据盘1.7,所以值为1.7
此时osd.0状态是down
且in
,in
表示此osd位于CRUSH map,已经准备好接受数据,down
表示osd进程运行异常,因为我们还没有启动osd.0进程
2.10 启动ceph-osd进程
需要向systemctl传递osd的id
以启动指定的osd进程,如下,我们准备启动osd.3进程
systemctl start ceph-osd@{id} id表示osd编号,从数字0开始
sudo cp /usr/lib/systemd/system/[email protected] /usr/lib/systemd/system/[email protected]
sudo systemctl start ceph-osd@3
sudo systemctl enable ceph-osd@3
上面就是添加osd.3的步骤,可以查看集群状态 ceph -s。
2.1 修改yum源
这里将yum源修改成aliyun的源,指令如下:
curl http://mirrors.aliyun.com/repo/Centos-7.repo >/etc/yum.repos.d/CentOS-Base.repo
curl http://mirrors.aliyun.com/repo/epel-7.repo >/etc/yum.repos.d/epel.repo
sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo
sed -i '/aliyuncs/d' /etc/yum.repos.d/epel.repo
2.2 添加ceph源
sudo vim /etc/yum.repos.d/ceph.repo
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/x86_64/
gpgcheck=0
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/noarch/
gpgcheck=0
[ceph-source]
name=ceph-source
baseurl=http://mirrors.aliyun.com/ceph/rpm-luminous/el7/SRPMS/
gpgcheck=0
2.3 安装软件
sudo yum install ceph ntp ntpdate ntp-doc openssh-server
验证ceph是否正确安装
ceph -v
ceph version 12.2.10 (177915764b752804194937482a39e95e0ca3de94) luminous (stable)
2.4 关闭防火墙
sudo sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
sudo setenforce 0
sudo systemctl stop firewalld
sudo systemctl disable firewalld
要想缩减集群尺寸或替换硬件,可在运行时删除 OSD 。在 Ceph 里,一个 OSD 通常是一台主机上的一个 ceph-osd
守护进程、它运行在一个硬盘之上。如果一台主机上有多个数据盘,你得逐个删除其对应 ceph-osd
。通常,操作前应该检查集群容量,看是否快达到上限了,确保删除 OSD 后不会使集群达到 near full
比率。
警告: 删除 OSD 时不要让集群达到 full ratio
值,删除 OSD 可能导致集群达到或超过 full ratio
值。
1、停止需要剔除的 OSD 进程,让其他的 OSD 知道这个 OSD 不提供服务了。停止 OSD 后,状态变为 down
。
ssh {osd-host}
sudo stop ceph-osd id={osd-num}
2、将 OSD 标记为 out
状态,这个一步是告诉 mon,这个 OSD 已经不能服务了,需要在其他的 OSD 上进行数据的均衡和恢复了。
sudo ceph osd out {osd-num}
执行完这一步后,会触发数据的恢复过程。此时应该等待数据恢复结束,集群恢复到 HEALTH_OK
状态,再进行下一步操作。
3、删除 CRUSH Map 中的对应 OSD 条目,它就不再接收数据了。你也可以反编译 CRUSH Map、删除 device 列表条目、删除对应的 host 桶条目或删除 host 桶(如果它在 CRUSH Map 里,而且你想删除主机),重编译 CRUSH Map 并应用它。
sudo ceph osd crush remove osd.{osd-num}
该步骤会触发数据的重新分布。等待数据重新分布结束,整个集群会恢复到 HEALTH_OK
状态。
4、删除 OSD 认证密钥:
ceph auth del osd.{osd-num}
5、删除 OSD 。
ceph osd rm {osd-num}
ceph osd rm 1
6、卸载 OSD 的挂载点。
sudo umount /var/lib/ceph/osd/$cluster-{osd-num}
7、登录到保存 ceph.conf
主拷贝的主机。
ssh {admin-host}
cd /etc/ceph
vim ceph.conf
8、从 ceph.conf
配置文件里删除对应条目。
[osd.1]
host = {hostname}
9、从保存 ceph.conf
主拷贝的主机,把更新过的 ceph.conf
拷贝到集群其他主机的 /etc/ceph
目录下。
如果在 ceph.conf
中没有定义各 OSD 入口,就不必执行第 7 ~ 9 步。
所有的osd节点下线删除之后:
ceph osd crush remove {hostname} 将主机条目从crush map中删除
ceph -s 等待集群变为active+clean状态
在ceph.conf文件中增加mon节点信息
mon initial members = hostname1,hostname2,new_mon_hostname
mon host = IP1,IP2,new_mon_ip
创建mon进程
host_name=`hostname`
sudo ceph mon getmap -o /tmp/monmap
sudo rm -rf /var/lib/ceph/mon/ceph-$host_name
sudo ceph-mon -i $host_name --mkfs --monmap /tmp/monmap
sudo chown -R ceph:ceph /var/lib/ceph/mon/ceph-$host_name/
启动mon进程
sudo cp /usr/lib/systemd/system/[email protected] /usr/lib/systemd/system/ceph-mon@$host_name.service
sudo systemctl start ceph-mon@$host_name
sudo systemctl enable ceph-mon@$host_name
ceph-common
sudo yum install ceph-common
mount -t ceph <monitor1-host-name>:6789,<monitor2-host-name>:6789,<monitor3-host-name>:6789:/ <mount-point>
Example:
sudo mkdir -p /gruntdata/lipeibao_ceph
sudo mount -t ceph 11.188.199.210:6789:/ /mnt/mycephfs
ceph-common
,ceph-fuse
sudo yum install ceph-common ceph-fuse
Example:
sudo vim /etc/ceph/ceph.conf
[global]
fsid = $genuuid
mon initial members = hostname1
mon host = IP1,IP2,IP3
rbd default features = 1
auth_cluster_required = none
auth_service_required = none
auth_client_required = none
public network = 11.165.0.0/16
cluster network = 11.165.0.0/16
osd journal size = 1024
osd pool default size = 2
osd pool default min size = 1
osd pool default pg num = 1000
osd pool default pgp num = 1000
osd crush chooseleaf type = 1
mon_max_pg_per_osd = 200
[mon]
mon allow pool delete = true
[mds.hostname1]
host = hostname1
在管理机或者monitor机器上创建客户端用户及权限、密钥
ceph auth get-or-create client.<client-name/id> mon 'allow r' mds 'allow r, allow rw path=' osd 'allow rw pool=' -o <file_name>
Example:
$ ceph auth get-or-create client.1 mon 'allow r' mds 'allow r, allow rw path=/' osd 'allow rw pool=data' -o ceph.client.1.keyring
[client.1]
key = AQACNoZXhrzqIRAABPKHTach4x03JeNadeQ9Uw==
登录主mds服务器, 查看所有连接的客户端信息:
sudo ceph daemon mds.`hostname` session ls
找到需要剔除的客户端id,然后执行下述命令:
sudo ceph tell mds.`hostname` client evict id=客户端id
这是客户端地址会存在blcaklist中,如果要重新挂载,需要将其从blacklist中删除:
sudo ceph osd blcaklist ls
删除对应的address
sudo ceph osd blacklist rm address
ceph osd pool get {pool_name} pg_num
ceph osd pool set {pool_name} pg_num 1024
ceph集群在使用过程中,经常会遇到osd存储分布不均衡的情况,如下图是我们线上ceph集群的osd分布情况:
可参考:https://docs.ceph.com/docs/mimic/mgr/balancer/
具体操作如下:
checklist:
** 1. all buckets should use straw2:**
ceph osd getcrushmap -o crush.map; crushtool -d crush.map | grep straw; rm -f crush.map
253
tunable straw_calc_version 1
alg straw2
alg straw2
alg straw2
alg straw2
alg straw2
alg straw2
alg straw2
alg straw2
alg straw2
alg straw2
alg straw2
alg straw2
alg straw2
alg straw2
alg straw2
alg straw2
alg straw2
如果存在非straw2,update
ceph osd crush set-all-straw-buckets-to-straw2
2. minimum client version is jewel or higher:
ceph osd dump|grep require_min_compat_client;
require_min_compat_client jewel
Ceph distribution balancer:
Activate balancing:
ceph mgr module ls
ceph mgr module enable balancer
ceph balancer on
ceph balancer mode crush-compat
ceph config-key set "mgr/balancer/max_misplaced": "0.01"
Show configuration and state:
ceph config-key dump
ceph balancer status