打造集群高可用分布式存储
Ceph

很早以前在玩集群的时候就折腾过分布式存储服务来作为跨节点的数据共享和可靠存储,以前尝试过GlusterFS,但是由于读写速度实在是太低,就放弃了。见基于GlusterFS设计 Docker集群存储方案。

后来的解决方案是所有机器都挂载了 NAS ,读写速度是提升上去了,但是存在着几个问题:

    一是 NAS 的单点故障问题,虽然 NAS 做过了RAID,但是故障率还是很高。(后来的事实证明,NAS 确实坏了,集群所有数据都丢了)
    另一个是安全性问题,NFS 协议没有验证机制(或者说需要设置),存在安全性问题。
    规模受限,当集群规模扩大到数十个节点时,读写性能就很受影响了。

最近接触到了 Ceph,看上去比 GlusterFS 要好很多,正好最近在实验室折腾集群docker化,搞大数据的人连抗单点故障的分布式存储都没有着实是让人嘲笑的。(以及前几天因为服务器故障,组里的服务全挂了,好几天都没恢复,实验室官网也访问不了,想想还是蛮尴尬的。。。)

关于 Ceph 的介绍,就不搬运了,最近事多,也没怎么深入研究。
部署

使用了 5 个节点,系统都是刚装上的 CentOS Linux release 7.6.1810 (Core)。

Ceph 集群中必需的有:

    若干个 monitor (mon) 服务
    若干个 数据存储 (osd) 服务
    独立的管理 (mgr) 服务,在 luminous 之后是必须的

此外,还有可选的 mds 服务等,这个服务仅在需要使用 CephFS 时才需要

因为倾向于所有东西都放在docekr里,尽量保持宿主机的纯净,所以不太想安装ceph的客户端,而且发现 centos 默认就能挂载ceph类型的文件系统,所以采用了 CephFS 方式,需要部署一个 mds 服务。

以下是每个节点上规划的 Ceph 服务。
hostname     ip     roles
node1     192.168.1.1     mon, mgr, mds
node2     192.168.1.2     mon, osd
node3     192.168.1.3     osd
node4     192.168.1.4     mon, osd
node5     192.168.1.5     osd

node1 节点作为 master 节点,重要的服务都放在这上面,为了保持该节点的性能,该节点不部署 osd 服务。(实际上,该服务器在真实集群中作为跳板机使用,且做了RAID,磁盘空间较小)

理论上还是存在单点故障,不过考虑到node1作为跳板机,它挂了,所有节点都连不上,而且即便是挂了,数据也不会丢失,在可以接受的范围之内。

以下服务都是基于 docker 部署的,可以说,本次部署 Ceph 不需要宿主机安装任何额外的软件。
部署 monitor

首先在 node1 上执行以下命令启动一个 mon 服务 (需要提前新建 /data/ceph/etc 以及 /data/ceph/lib 目录)

docker run \
        --name=ceph_mon \
        -d \
        --net=host \
        --restart=always \
        -v /data/ceph/etc:/etc/ceph \
        -v /data/ceph/lib:/var/lib/ceph \
        -e MON_IP=192.168.1.1 \
        -e CEPH_PUBLIC_NETWORK=192.168.1.1/24 \
        ceph/daemon mon

待服务启动一段时间后(自动初始化,容器启动后数十秒即可)。

使用命令 docker exec -it ceph_mon ceph -s 查看当前集群情况,如果一切正常,会看到结果里显示 HEALTH_OK。

a690e4459f321b5b9a298efe077159be.md.png

使用命令 docker rm -f ceph_mon 停止mon服务,然后编辑 /data/eph/etc/ceph.conf 并在最后添加两行:

osd max object name len = 256
osd max object namespace len = 64

具体原因稍后再说。

使用命令 scp -r /data/ceph 192.168.1.x:/data 将生成的配置文件复制到其他节点上(/data目录都预先建立好了)。

然后在 node1、node2、node4 上执行上述命令,启动另外两个 mon 服务(需要修改其中的 MON_IP 为各自节点的IP)。

再次执行命令 docker exec -it ceph_mon ceph -s 查看当前集群情况,多刷新几次,这次应该就能看到集群内有了三个mon服务。
部署 mgr

在 node1 节点上执行命令,启动一个 mgr 服务

docker run \
        --name ceph_mgr \
        -d \
        --net=host \
        --restart=always \
        -v /data/ceph/etc:/etc/ceph \
        -v /data/ceph/lib:/var/lib/ceph/ \
        ceph/daemon mgr

部署 mds

在 node1 节点上执行命令,启动一个 mds 服务

docker run \
        --name ceph_mds \
        -d \
        --net=host \
        --restart=always \
        -v /data/ceph/lib:/var/lib/ceph/ \
        -v /data/ceph/etc:/etc/ceph \
        -e CEPHFS_CREATE=1 \
        ceph/daemon mds

部署 osd 服务

在 node2、node3、node4、node5 上执行以下命令,来启动四个 osd 服务。

docker run \
        --name=ceph_osd \
        -d \
        --net=host \
        --restart=always \
        -v /data/ceph/etc:/etc/ceph \
        -v /data/ceph/lib:/var/lib/ceph/ \
        ceph/daemon osd_directory

说明

关于 osd 的挂载问题,一般教程里是选择一整块硬盘,然后全部交由osd管理,不过之前安装系统的时候没有考虑到这些,两块盘已经分配好了,没法重新分配。此外其他的服务也会占用磁盘空间,CephFS 目前没有经过长时间使用,不敢保证可用性。一开始考虑使用 dd 创建一个文件然后 loset 模拟成一块硬盘来交由 osd 管理,但是某次重启机器后发现该osd无法恢复,所以放弃了这种做法,直接采用外挂现有目录的形式。虽然在性能上有一定的损失,但是不失为一种当前环境下的可选方案。

再来说一下前面提到的修改配置文件的问题,同样是因为硬盘已经分配好了,采用了 ext4 的文件格式,而 osd 默认是 XFS 格式,ext4存储xattrs的大小有限制,使得OSD信息不能安全的保存。所以需要修改配置文件来解决。

当然了,最好的情况下还是选择一整块硬盘,然后交由 osd 自己去管理,这种情况下启动 osd 服务的命令就不是上述所说的了。
客户端挂载

docker exec -it ceph_mon ceph auth ls 然后找到一行 client.admin ,后面有一个secret串,记录下来,假设是 SECRET。

在集群中的每个节点上执行命令 mount -t ceph 192.168.1.1:6789:/ /mnt -o name=admin,secret=SECRET 就可以将CephFS 挂载到 /mnt 目录了,不需要安装任何额外的软件支持。
对比 GlusterFS

相对 GlusterFS 来说,CephFS 在速度上可能要更快一些,而且ceph的挂载有权限验证机制,即便是暴露在复杂网络环境下也能一定程度上保护数据安全。

而且,GlusterFS 在创建卷上略显复杂,需要自行指定所有的分布节点,而ceph只需要设置副本数目即可,不用关心数据分布的问题。

ceph 的osd节点加入非常简单,只需要复制配置文件然后启动osd服务即可,ceph集群会自动将数据重新分发,在遇到部分osd当机的时候仍然能保证服务,以及使用 ceph osd out N 命令来下线3号osd,并开始重新均衡数据。

e7880488873e4de180a862cbcf497a5d.md.png

本文所涉及的所有命令脚本可以在 newnius/scripts 找到。
参考

Ceph介绍及原理架构分享

Ceph osd启动报错osd init failed (36) File name too long

在Docker里运行Ceph

Bootstrap your Ceph cluster in Docker

使用Docker快速部署Ceph集群

使用 Docker 部署 Ceph 集群

ceph存储 ceph-deploy部署挂载目录的osd

ceph/ceph

ceph/daemon

Adding/Removing OSDs

Ceph: properly remove an OSD

losetup命令

Ceph运维告诉你分布式存储的那些“坑”

ceph中对象读写的顺序性及并发性保证

    Post author: Newnius
    Post link: https://blog.newnius.com/ceph-distributed-storage-in-cluster-docker.html
    Copyright Notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.

Ceph-集群内分布式存储解决方案及基于Docker的部署的更多相关文章

  1. 高可用OpenStack(Queen版)集群-13.分布式存储Ceph

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  2. 基于Ubuntu 18.04.5 LTS 部署Ceph集群测试及Ceph RDB的使用。

    1.ceph简介 Ceph在一个统一的系统中独特地提供对象.块和文件存储 1.1 ceph官网架构图 1.2 架构解释   CEPH 对象存储 CEPH 块设备 CEPH 文件系统 RESTful 接 ...

  3. 基于Docker UI 配置ceph集群

    前言 前一篇介绍了docker在命令行下面进行的ceph部署,本篇用docker的UI进行ceph的部署,目前来说市面上还没有一款能够比较简单就能直接在OS上面去部署Ceph的管理平台,这是因为OS的 ...

  4. [自动化]基于kolla-ceph的自动化部署ceph集群

    kolla-ceph来源: 项目中的部分代码来自于kolla和kolla-ansible kolla-ceph的介绍: 1.镜像的构建很方便, 基于容器的方式部署,创建.删除方便 2.kolla-ce ...

  5. [自动化]基于kolla的自动化部署ceph集群

    kolla-ceph来源: 项目中的部分代码来自于kolla和kolla-ansible kolla-ceph的介绍: 1.镜像的构建很方便, 基于容器的方式部署,创建.删除方便 2.kolla-ce ...

  6. 分布式存储ceph集群实践

    1.环境规划,三台主机 10.213.14.51/24            10.213.14.52/24       10.213.14.53/24    集群网络 172.140.140.11. ...

  7. ceph集群部署(基于jewel版)

    环境 两个节点:ceph1.ceph2 ceph1: mon.mds.osd.0.osd.1 ceph2: osd.2.osd.3 网络配置: ceph1: 管理网络,eth0,10.0.0.20 存 ...

  8. 分布式存储系统之Ceph集群启用Dashboard及使用Prometheus监控Ceph

    前文我们了解了Ceph之上的RadosGW基础使用相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16768998.html:今天我们来聊一聊Ceph启 ...

  9. 使用虚拟机CentOS7部署CEPH集群

    第1章   CEPH部署 1.1  简单介绍 Ceph的部署模式下主要包含以下几个类型的节点 Ø CephOSDs: A Ceph OSD 进程主要用来存储数据,处理数据的replication,恢复 ...

  10. CEPH集群操作入门--配置

      参考文档:CEPH官网集群操作文档   概述 Ceph存储集群是所有Ceph部署的基础. 基于RADOS,Ceph存储集群由两种类型的守护进程组成:Ceph OSD守护进程(OSD)将数据作为对象 ...

随机推荐

  1. [转]基于vue-router的matched实现面包屑功能

    原文链接:基于vue-router的matched实现面包屑功能

  2. Jetbrains fleet 配置 C++开发环境(基于CMAKE和MinGW)

    Jetbrains fleet 配置 C++开发环境 1. 安装 Jetbrains Fleet 到Fleet下载页面下载Toolbox并安装 Jetbrains-Fleet下载页 安装完成后在任务栏 ...

  3. CDS标准视图:维护通知原因数据 I_MaintNotificationCauseData

    视图名称:维护通知原因数据 I_MaintNotificationCauseData 视图类型:基础 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'INOTIFCAU ...

  4. 双指针习题:Binary Deque

    14.Binary Deque 题面翻译 Binary Deque - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 有多组数据. 每组数据给出 \(n\) 个数,每个数为 \(0\) ...

  5. Protocol Buffer 使用-copy

    概述Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化.它很适合做数据存储或 RPC 数据交换格式.可用于通讯协议.数据存储等领域的语言无关. ...

  6. Excel函数公式大全(图文详解)

    ---------------------------- ----------------------------------------------------------------------- ...

  7. 如何快速的开发一个完整的iOS直播app(礼物篇)

    搭建礼物列表 使用modal,设置modal样式为custom,就能做到从小往上显示礼物列表,并且能看见前面的直播界面 礼物模型设计 一开始创建3个礼物模型,保存到数组,传入给礼物View展示,本来礼 ...

  8. Graph DataBase介绍-图数据库

    前言分析社会关系这类复杂图壮结构的海量数据,使用图形数据库(Graph DataBase)是最好的选择.– 作者:李祎 <程序员>介绍各种NoSQL 数据库的文章已经很多,不过大部分都是基 ...

  9. Mac配置apache cgi服务

    CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口 Mac上是自带CGI运行程序的,但是直接是不可 ...

  10. centos8网络配置问题

    由于RHEL8与centos8基本一样,所以以下方法同样适用于RHEL8 在centos8上进行网络配置时,出现以下问题: 意思是无法找到network.service 出现错误的原因是centos8 ...