ceph集群部署不完全指南

2018-12-28 | 技术类 | 104
ceph集群部署不完全指南 - 图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: | ip | hostname | | :—-: | :—-: | | 172.19.217.71 | Ceph-master | | 172.19.217.72 | Ceph-node1 | | 172.19.217.73 | Ceph-node2 |

  • 磁盘状态:

  1. $ lsblk
  2. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
  3. vda 253:0 0 400G 0 disk
  4. `-vda1 253:1 0 400G 0 part /

设置免密登录

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

  1. $ ssh-keygen

拷贝秘钥:

  1. $ ssh-copy-id root@172.19.217.72
  2. $ ssh-copy-id root@172.19.217.73

修改使hostname和ip对应:
/etc/hosts 里追加以下信息:

  1. 172.19.217.71 Ceph-master
  2. 172.19.217.72 Ceph-node1
  3. 172.19.217.73 Ceph-node2

安装ntp服务(所有节点)

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

  1. $ sudo apt install ntpdate
  2. $ service ntp stop
  3. $ ntpdate ntp.ubuntu.com
  4. $ service ntp start

添加ceph用户(所有节点)

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

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

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

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

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

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

  1. $ wget -q -O- 'http://mirrors.163.com/ceph/keys/release.asc' | apt-key add -
  2. $ 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:

  1. $ apt update
  2. $ apt install ceph-deploy

ceph安装(仅主控节点)

创建部署目录

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

配置新节点

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

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

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

安装

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

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

  1. Running command: ceph --version
  2. ceph version 10.2.11 (e4b061b47f07f583c92a050d9e84b1813a35671e)

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

  1. $ ceph-deploy mon create-initial

至此,ceph集群的安装工作完毕。
运行 ceph -s可以看到当前集群的状态,运行ceph health查看 ceph health 的状态:

  1. HEALTH_OK

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

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

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

OSD HEALTH不为 OK 的解决办法

  • 如果碰到下面的 health err且文件系统是 ext4
  1. $ ceph health
  2. 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

  1. $ vim ceph.conf

在末尾添加:

  1. osd_max_object_name_len = 256
  2. osd_max_object_namespace_len = 64
  3. filestore_xattr_use_omap = true # Just 4 ext4

然后运行下面命令:

  1. $ ceph-deploy install Ceph-master Ceph-node1 Ceph-node2
  2. $ ceph-deploy --overwrite-conf admin Ceph-master Ceph-node1 Ceph-node2
  3. $ ceph-deploy --overwrite-conf mon create-initial
  • 如果碰到too few PGs per OSD (21 < min 30)的 warning,先查看 pool:
  1. $ sudo ceph osd lspools
  2. 0 rbd,

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

  1. $ sudo ceph osd pool get rbd pg_num
  2. pg_num: 64
  3. $ sudo ceph osd pool get rbd pgp_num
  4. pgp_num: 64
  5. $ ceph osd dump | grep 'replicated size'
  6. 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:

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

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

添加 OSD(仅主控节点)

查看未分配分区:

  1. $ fdisk -l
  2. Disk /dev/vda: 400 GiB, 429496729600 bytes, 838860800 sectors
  3. Units: sectors of 1 * 512 = 512 bytes
  4. Sector size (logical/physical): 512 bytes / 512 bytes
  5. I/O size (minimum/optimal): 512 bytes / 512 bytes
  6. Disklabel type: dos
  7. Disk identifier: 0x77ba45a4
  8. Device Boot Start End Sectors Size Id Type
  9. /dev/vda1 * 2048 838858751 838856704 400G 83 Linux
  10. $ df -h
  11. Filesystem Size Used Avail Use% Mounted on
  12. udev 63G 0 63G 0% /dev
  13. tmpfs 13G 15M 13G 1% /run
  14. /dev/vda1 394G 9.8G 364G 3% /
  15. tmpfs 63G 0 63G 0% /dev/shm
  16. tmpfs 5.0M 4.0K 5.0M 1% /run/lock
  17. tmpfs 63G 0 63G 0% /sys/fs/cgroup
  18. overlay 394G 9.8G 364G 3% /var/lib/docker/overlay2/d64af4717c1a56cf37cf6ba00937888a376304627b0791f19d6e5e707e0165b5/merged

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

  1. $ rm -rf /var/lib/ceph/osd/ceph-0
  2. $ mkdir -p /var/lib/ceph/osd/ceph-0
  3. $ chown ceph:ceph /var/lib/ceph/osd/ceph-0

添加 OSD(仅主控节点):

  1. $ ceph-deploy osd create Ceph-master
  2. $ ceph-deploy osd create Ceph-node1
  3. $ ceph-deploy osd create Ceph-node2

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

  • 磁盘准备(仅主控节点)
  1. $ ceph-deploy osd prepare Ceph-master:/var/lib/ceph/osd/ceph-0
  2. $ ceph-deploy osd prepare Ceph-node1:/var/lib/ceph/osd/ceph-0
  3. $ ceph-deploy osd prepare Ceph-node2:/var/lib/ceph/osd/ceph-0
  • 启动 OSD(仅主控节点)
  1. $ ceph-deploy osd activate Ceph-master:/var/lib/ceph/osd/ceph-0
  2. $ ceph-deploy osd activate Ceph-node1:/var/lib/ceph/osd/ceph-0
  3. $ ceph-deploy osd activate Ceph-node2:/var/lib/ceph/osd/ceph-0

添加 mds(仅主控节点)

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

  1. $ ceph-deploy mds create Ceph-master

配置 mgr

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

  1. $ ceph-deploy mgr create Ceph-master
  2. $ ceph-deploy mgr create Ceph-node1
  3. $ ceph-deploy mgr create Ceph-node2

因为部署的 ceph 版本是 10.2.11,所以这步可以略过。
配置完后用ceph health命令查看时,ceph 状态为 OK 则部署完成。

Tips

错误排查

查看 log:

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

删除osd

  1. $ ceph osd crush reweight osd.x 0.0
  2. $ ceph osd out osd.x
  3. $ service ceph stop osd.x
  4. $ ceph osd crush remove osd.x
  5. $ ceph auth del osd.x
  6. $ ceph osd rm X

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

  1. $ ceph osd down osd.0
  2. $ ceph osd rm 0

删除 ceph 并清理环境

  1. #卸载ceph软件包
  2. $ ceph-deploy purge Ceph-master Ceph-node1 Ceph-node2
  3. #删除各种配置文件和生成的数据文件
  4. $ ceph-deploy purgedata Ceph-master Ceph-node1 Ceph-node2