tc9011

ceph集群部署不完全指南

10 min
1
1

Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。

Ceph项目最早起源于Sage Weil就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经过了数年的发展之后,目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack都可与Ceph整合以支持虚拟机镜像的后端存储。

Ceph是一个横向扩展系统:它被设计为先天无单点失效问题,可以扩展到无限个节点,并且节点之间没有耦合关系(无共享架构),而传统存储系统控制器之间总有一些组件是共享的(缓存、磁盘)。

Ceph使用Crush算法对数据进行自动化组织管理。Crush算法负责数据对象在集群内的智能分布,随后使用集群节点作为数据的管理器。

ceph 部署的时候根据官网建议:

  • 机械硬盘最小为1T
  • 磁盘越大,单位GB的存储空间越小,但是需要的内存越多,尤其是在recovery,backfill以及reblance时
  • 不推荐将一个盘分多个区,再跑多个OSD进程
  • 不推荐OSD和mon, 或者OSD和mds跑在同一个硬盘上
  • 很多 slow osd的问题往往是由于对磁盘设备的过度使用,请使用专用的磁盘用于安装操作系统以及软件;专用的磁盘设备用于osd daemon, 专门的磁盘设备用于journal

所以一般 ceph 部署时,一个节点最好挂三块盘,一块盘装操作系统,一块存储 OSD 数据,一块存储 OSD 日志,而存储日志的盘最好是 SSD,以便提高性能。

这里因为某些原因,以三台单盘的机器部署 ceph 集群为例,具体配置如下:

  • 系统:Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-117-generic x86_64)
  • IP 地址及 hostname:
iphostname
172.19.217.71Ceph-master
172.19.217.72Ceph-node1
172.19.217.73Ceph-node2
  • 磁盘状态:
$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0  400G  0 disk
`-vda1 253:1    0  400G  0 part /

设置免密登录

选定一个节点作为主控节点(这里选的172.19.217.71主机),建立从主控节点到其他节点的免密登录。

生成秘钥:

$ ssh-keygen

拷贝秘钥:

$ ssh-copy-id root@172.19.217.72 
$ ssh-copy-id root@172.19.217.73

修改使hostname和ip对应:

/etc/hosts 里追加以下信息:

172.19.217.71   Ceph-master
172.19.217.72   Ceph-node1
172.19.217.73   Ceph-node2

安装ntp服务(所有节点)

主要是用于ceph-mon之间的时间同步。在所有 Ceph 节点上安装 NTP 服务(特别是 Ceph Monitor 节点),以免因时钟漂移导致故障。确保在各 Ceph 节点上启动了 NTP 服务,并且要使用同一个 NTP 服务器。

$ sudo apt install ntpdate
$ service ntp stop
$ ntpdate ntp.ubuntu.com
$ service ntp start

添加ceph用户(所有节点)

1、在各 Ceph 节点创建新用户

$ sudo useradd -d /home/ceph -m ceph

2、确保各 Ceph 节点上新创建的用户都有 sudo 权限

$ echo "ceph ALL = (root) NOPASSWD:ALL" | tee /etc/sudoers.d/ceph

$ chmod 0440 /etc/sudoers.d/ceph 

tips: 这里虽然添加了 ceph 用户, 但是最后安装时并没有用 ceph 用户来安装, 而是采用 root 用户安装

添加ceph安装源(所有节点)

$ wget -q -O- 'http://mirrors.163.com/ceph/keys/release.asc' | apt-key add -

$ echo deb http://mirrors.163.com/ceph/debian-jewel/ $(lsb_release -sc) main | tee /etc/apt/sources.list.d/ceph.list

安装ceph-deploy部署工具(仅主控节点)

更新仓库,并安装 ceph-deploy:

$ apt update
$ apt install ceph-deploy

ceph安装(仅主控节点)

创建部署目录

$ mkdir ceph-cluster && cd ceph-cluster/

配置新节点

$ ceph-deploy new Ceph-master Ceph-node1 Ceph-node2

配置完后,目录下会有如下几个文件

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

安装

$ ceph-deploy install Ceph-master Ceph-node1 Ceph-node2

都出现如下输出表示安装成功:

Running command: ceph --version
ceph version 10.2.11 (e4b061b47f07f583c92a050d9e84b1813a35671e)

配置并启动 ceph-mon(仅主控节点)

$ ceph-deploy mon create-initial

至此,ceph集群的安装工作完毕。

运行 ceph -s可以看到当前集群的状态,运行ceph health查看 ceph health 的状态:

HEALTH_OK

health 状态应该是 HEALTH_OK,如果有no osds的 error,只需按照下面方法添加 osd即可,如果有其他HEALTH_ERROR,可以参照下面的解决办法去解决。

ceph 鉴权文件分发到各个节点

$ ceph-deploy admin Ceph-master Ceph-node1 Ceph-node2

OSD HEALTH不为 OK 的解决办法

  • 如果碰到下面的 health err且文件系统是 ext4
$ ceph health
HEALTH_ERR 64 pgs are stuck inactive for more than 300 seconds; 64 pgs stuck inactive; 64 pgs stuck unclean

先用 Tips 中的方法去查看 log,如果 log 中有 filename too long 的 error,先编辑对应的 ceph.conf

$ vim ceph.conf

在末尾添加:

osd_max_object_name_len = 256
osd_max_object_namespace_len = 64
filestore_xattr_use_omap = true # Just 4 ext4

然后运行下面命令:

$ ceph-deploy install Ceph-master Ceph-node1 Ceph-node2

$ ceph-deploy --overwrite-conf admin Ceph-master Ceph-node1 Ceph-node2

$ ceph-deploy --overwrite-conf mon create-initial
  • 如果碰到too few PGs per OSD (21 < min 30)的 warning,先查看 pool:
$ sudo ceph osd lspools
0 rbd,

查看 rbd pool 的 pgs 和 pgps以及副本数:

$ sudo ceph osd pool get rbd pg_num
pg_num: 64

$ sudo ceph osd pool get rbd pgp_num
pgp_num: 64

$ ceph osd dump | grep 'replicated size'
pool 0 'rbd' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 64 pgp_num 64 last_change 1 flags hashpspool stripe_width 0

健康的 pg_num 和 pgp_num 计算方法:

关于pgmap的数目,osd_num *100 / replica_num向上取2的幂。比如15个osd,三备份,15 *100/3=500,得到pg_num = 512,线上重新设定这个数值时会引起数据迁移,请谨慎处理。

在这里,pgs为64,因为是3副本的配置,所以当有3个osd的时候,3 *100/3=100,得到pg_num = 128

解决办法:修改默认pool rbd 的 pgs 和 pgps:

$ sudo ceph osd pool set rbd pg_num 128
$ sudo ceph osd pool set rbd pgp_num 128
  • 终极方法

删除 ceph 并清理环境,然后可能就好了~~具体方法见下面 Tips

添加 OSD(仅主控节点)

查看未分配分区:

$ fdisk -l
Disk /dev/vda: 400 GiB, 429496729600 bytes, 838860800 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x77ba45a4

Device     Boot Start       End   Sectors  Size Id Type
/dev/vda1  *     2048 838858751 838856704  400G 83 Linux

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev             63G     0   63G   0% /dev
tmpfs            13G   15M   13G   1% /run
/dev/vda1       394G  9.8G  364G   3% /
tmpfs            63G     0   63G   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs            63G     0   63G   0% /sys/fs/cgroup
overlay         394G  9.8G  364G   3% /var/lib/docker/overlay2/d64af4717c1a56cf37cf6ba00937888a376304627b0791f19d6e5e707e0165b5/merged

这里看到这台机器只有一块盘,所以我们通过目录创建 ceph osd(所有节点):

$ rm -rf /var/lib/ceph/osd/ceph-0
$ mkdir -p /var/lib/ceph/osd/ceph-0
$ chown ceph:ceph /var/lib/ceph/osd/ceph-0

添加 OSD(仅主控节点):

$ ceph-deploy osd create Ceph-master
$ ceph-deploy osd create Ceph-node1
$ ceph-deploy osd create Ceph-node2

这个命令相当于下面磁盘准备和启动 OSD 两条命令:

  • 磁盘准备(仅主控节点)
$ ceph-deploy osd prepare Ceph-master:/var/lib/ceph/osd/ceph-0

$ ceph-deploy osd prepare Ceph-node1:/var/lib/ceph/osd/ceph-0

$ ceph-deploy osd prepare Ceph-node2:/var/lib/ceph/osd/ceph-0
  • 启动 OSD(仅主控节点)
$ ceph-deploy osd activate Ceph-master:/var/lib/ceph/osd/ceph-0

$ ceph-deploy osd activate Ceph-node1:/var/lib/ceph/osd/ceph-0

$ ceph-deploy osd activate Ceph-node2:/var/lib/ceph/osd/ceph-0

添加 mds(仅主控节点)

为使用 CephFS 添加 mds, 如果不用 CephFS 可以不添加。 此处只在 master 上添加一个 mds

$ ceph-deploy mds create Ceph-master

配置 mgr

ceph 12.0之后必须配置 manager, 且最好有 moniter 的机器上都部署 mgr:

$ ceph-deploy mgr create Ceph-master
$ ceph-deploy mgr create Ceph-node1
$ ceph-deploy mgr create Ceph-node2

因为部署的 ceph 版本是 10.2.11,所以这步可以略过。

配置完后用ceph health命令查看时,ceph 状态为 OK 则部署完成。

Tips

错误排查

查看 log:

$ cd /var/log/ceph
$ cat ceph-osd.0.log

删除osd

$ ceph osd crush reweight osd.x 0.0  
$ ceph osd out osd.x  
$ service ceph stop osd.x
$ ceph osd crush remove osd.x  
$ ceph auth del osd.x  
$ ceph osd rm X

如果遇到Error EBUSY: osd.0 is still up; must be down before removal.可以执行下面命令强行标记为down,之后删除即可:

$ ceph osd down osd.0
$ ceph osd rm 0

删除 ceph 并清理环境

#卸载ceph软件包
$ ceph-deploy purge Ceph-master Ceph-node1 Ceph-node2

#删除各种配置文件和生成的数据文件
$ ceph-deploy purgedata Ceph-master Ceph-node1 Ceph-node2
  • 本文作者: tc9011
  • 本文链接: https://tc9011.com/posts/2018/ceph集群部署不完全指南/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!