构建Ceph分布式文件共享系统:手动部署指南

news/2024/12/2 18:46:48/

#作者:西门吹雪

文章目录

  • micro-Services-Tutorial
  • Ceph分布式文件共享方案
  • 部署Ceph集群
  • 使用Ceph
  • Ceph在kubernetes集群中的使用

micro-Services-Tutorial

微服务最早由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。然而微服务又需要限流器(Rate Limiter),数据传输(Trasport 序列化和反序列化),日志(Logging),指标(Metrics)
,断路器(Circuit breaker),请求追踪(Request tracing ),服务发现(Service Discovery),因此就想写一篇关于微服务和微服务组件的总结来记录下自己使用优化的过程.

Ceph分布式文件共享方案

在使用Kubeneters的时候在各个容器中都需要使用同一套文件,但是如果使用NAS盘的方式话,无论是在更新或者是读取时候都要几分钟时间去部署,而且有时候还会出现文件占用失败的问题,调研了一段时间之后发现Kuberneters结合比较好的文件系统用Ceph分布式文件共享方案去解决这样的问题.

  • 环境准备
    在安装分布式之前需要先进行环境准备,需要3台服务器来做集群,ceph默认会进行保存三份文件来保障数据安全,服务器系统是centos7.3:
主机名IP部署服务
host1120.92.172.35主机1
host2120.92.169.191主机2
host3120.92.165.229主机3

首先安装docker环境,这个可以根据电脑系统的不同,选择不同的安装方式。

  • Mac安装
  • Ubantu安装
  • Windows安装
  • centos安装

我这里是用脚本直接在centos上直接安装的:

yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo;yum-config-manager --enable docker-ce-edge;yum-config-manager --disable docker-ce-edge;yum install docker-ce;systemctl start docker.service;
systemctl enable docker.service;

安装成功之后可以查看下:

> docker --verison
Docker version 18.06.0-ce, build 0ffa825

注意:这里需要配置好国内docker源,这样可以提高速度

> mkdir -p /etc/docker
> tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF> systemctl daemon-reload
> systemctl restart docker
> systemctl enable docker

部署Ceph集群

在主机1上部署运行mon,用以让客户端连接 Ceph 监视器:

node1> docker run -d \--name=mon \--net=host \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph/ \-e MON_IP=120.92.172.35 \-e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \ceph/daemon mon

查看docker和ceph运行状态:

> docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS               NAMES
b0c9d7680461        ceph/daemon         "/entrypoint.sh mon"   About a minute ago   Up About a > docker exec mon ceph -s
cluster:id:     da8f7f5b-b767-4420-a510-287f4ced25dehealth: HEALTH_OKservices:mon: 1 daemons, quorum ceph-1mgr: no daemons activeosd: 0 osds: 0 up, 0 indata:pools:   0 pools, 0 pgsobjects: 0  objects, 0 Busage:   0 B used, 0 B / 0 B availpgs:     

由于我们没有映射端口,但是Ceph容器会把后续需要使用到的端口映射出来:

node1> yum install tcping
node1> tcping 120.92.172.35 6789
120.92.172.35 port 6789 open

通常Ceph有两种方式实现在各个节点之间共享配置,第一种是以文件的方式实现共享,需要把第一个启动起来的节点的文件CP到其他节点,另外一种是使用配置服务(比如etcd或者consul). 这里我使用的第一种共享配置,将主机1上的配置文件复制到主机2和主机3,复制的路径包含/etc/ceph和/var/lib/ceph/bootstrap-*下的所有内容。

node2 > mkdir -p /var/lib/ceph
node1> scp -r /etc/ceph root@120.92.169.191:/etc
node1> scp -r /var/lib/ceph/bootstrap* root@120.92.169.191:/var/lib/cephnode3 > mkdir -p /var/lib/ceph
node1 > scp -r /etc/ceph root@192.168.3.103:/etc
node1 > scp -r /var/lib/ceph/bootstrap* root@120.92.165.229:/var/lib/ceph

启动主机2和主机3上的mon,在主机2上执行以下命令启动 mon,修改 MON_IP:

> docker run -d \--net=host \--name=mon \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph/ \-e MON_IP=120.92.169.191 \-e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \ceph/daemon mon

在主机3上执行以下命令启动 mon,修改 MON_IP:

> docker run -d \--net=host \--name=mon \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph/ \-e MON_IP=120.92.165.229 \-e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \ceph/daemon mon

在节点上在查看ceph集群状态可以看到有三个mos上线了:

> docker exec mon ceph -scluster:id:     da8f7f5b-b767-4420-a510-287f4ced25dehealth: HEALTH_OKservices:mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3mgr: no daemons activeosd: 0 osds: 0 up, 0 indata:pools:   0 pools, 0 pgsobjects: 0  objects, 0 Busage:   0 B used, 0 B / 0 B availpgs:  

然后需要运行osd服务把磁盘给ceph作为文件共享系统的基础存储,因此我们需要为三台服务器挂载对应的磁盘(这里选择挂载100GB的SSD云磁盘).

> fdisk -l
Disk /dev/vda: 42.9 GB, 42949672960 bytes, 83886080 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
Disk label type: dos
Disk identifier: 0x0008d73aDevice Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    83884031    41940992   53  LinuxDisk /dev/vdb: 107.5 GB, 107374182400 bytes, 209715200 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

这时候在三台服务器上分别运行(如果需要挂载多块可以运行多个osd):

> docker run -d \--net=host \--name=osd \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph/ \-v /dev/:/dev/ \--privileged=true \-e OSD_FORCE_ZAP=1 \-e OSD_DEVICE=/dev/vdb \ceph/daemon osd_ceph_disk

此时我们查看发现osd3个节点就可以看到已经上线了:

>  docker exec mon ceph -scluster:id:     da8f7f5b-b767-4420-a510-287f4ced25dehealth: HEALTH_WARNno active mgrservices:mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3mgr: no daemons activeosd: 3 osds: 3 up, 3 indata:pools:   0 pools, 0 pgsobjects: 0  objects, 0 Busage:   0 B used, 0 B / 0 B availpgs:     

但是这个时候我们还看不到存储空间,这是因为mgr没有启动,我们把mds和rgw也一起跑起来在node1节点上:

> docker run -d \--net=host \--name=mgr \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph/ \ceph/daemon mgr> docker run -d \--net=host \--name=mds \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph/ \-e CEPHFS_CREATE=1 \ceph/daemon mds     
> docker run -d \--name=rgw \-p 80:80 \-v /etc/ceph:/etc/ceph \-v /var/lib/ceph/:/var/lib/ceph/ \ceph/daemon rgw        

这个时候就可以看到初始化完成了:

>  docker exec mon ceph -scluster:id:     da8f7f5b-b767-4420-a510-287f4ced25dehealth: HEALTH_OKservices:mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3mgr: ceph-1(active)mds: cephfs-1/1/1 up  {0=ceph-1=up:active}osd: 3 osds: 3 up, 3 inrgw: 1 daemon activedata:pools:   6 pools, 48 pgsobjects: 209  objects, 3.4 KiBusage:   6.0 GiB used, 292 GiB / 298 GiB availpgs:     48 active+clean

使用Ceph

我们可以使用ceph挂载磁盘进行使用,但是ceph有很强的用户校验机制所以这里需要先拿到访问key ,而且在使用过程中可以指定多个节点形成负载均衡,然后用内核驱动挂载 Ceph 文件系统 — Ceph Documentation.

> mkdir /mnt/cephfile
> cat /etc/ceph/ceph.client.admin.keyring 
[client.admin]key = AQBXv0VbKtikExAAwHHp+F2HJSnYIIqaozjt3g==auid = 0caps mds = "allow"caps mgr = "allow *"caps mon = "allow *"caps osd = "allow *"mount -t ceph 120.92.172.35,120.92.169.191,120.92.165.229:/ /mnt/cephfile -o name=admin,secret=AQBhlz1bZBHcLxAAt6eIyBxnAxFoyA7PDTqAkQ==
umount /mnt/cephfile>  lsof  /mnt/cephfile
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF          NODE NAME
bash    10356 root  cwd    DIR    0,0        2 1099511627781 /mnt/cephfile/data/dev/code

这是最简单的使用,还有关于rdb对象存储以及Ceph还有快照等功能,可以在搭建好整个集群之后进行测试文件速度(这里主要测试的是5000多个小文件拷贝速度)如下:

# NAS盘
>  time cp -rf php/ general/test
real    2m 7.05s
user    0m 0.13s
sys     0m 1.80s# CEPH
> time cp -rf php/ generalceph/test
real    0m 6.88s
user    0m 0.05s
sys     0m 0.39s# 本地磁盘
> time cp -rf php/ php2
real    0m 1.16s
user    0m 0.02s
sys     0m 0.21s

通过对比可以看到CEPH的速度对于NAS盘提升有很多,面对本地磁盘差距也不是很大.

Ceph在kubernetes集群中的使用

在kubernetes集群中可以使用ceph作为高速共享盘,这样可以提高我们的自动化部署更新代码的速度,同时节省更新的时间.

由于kubernetes支持cephFS文件挂载,所以我们只需要用yaml编排文件处理就好,由于使用ceph需要密码所以我们先创建一个secret类型的yaml:

apiVersion: v1
kind: Secret
metadata:name: ceph-secretnamespace: dev
data:key: QVFCMTZWMVZvRjVtRXhBQTVrQ1FzN2JCajhWVUxSdzI2Qzg0SEE9PQ==

然后创建我们需要的volume挂载卷就可以在Pod中正常使用了.

apiVersion: v1
kind: PersistentVolume
metadata:name: cephfs-pv
spec:capacity:storage: 200GiaccessModes:- ReadWriteManycephfs:monitors:- 120.92.172.35:6789- 120.92.169.191:6789- 120.92.165.229:6789user: adminsecretRef:name: ceph-secretreadOnly: falsestorageClassName: cephpersistentVolumeReclaimPolicy: Recycle
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: cephfs-pv-claim
spec:accessModes:- ReadWriteManyresources:requests:storage: 100GistorageClassName: ceph

http://www.ppmy.cn/news/1551818.html

相关文章

网工日记:NAT相关概念

NAT&#xff08;Network Address Translation&#xff09;即网络地址转换&#xff0c;是一种在 IP 网络中广泛应用的技术&#xff0c;用于解决 IP 地址短缺问题以及增强网络安全性。以下是详细内容&#xff1a; 一、NAT 的产生背景 随着互联网的飞速发展&#xff0c;可用的公…

MFC 分段记录时间log类

在开发大型自动化系统或者多线程应用时&#xff0c;日志记录和时间追踪通常是系统调试和性能优化的关键部分。CAuxiliary 类是一个封装了文件日志记录和高精度计时功能的实用工具类&#xff0c;旨在为开发人员提供一种简便的方式&#xff0c;来实现系统运行的日志记录和时间性能…

Oracle--表空间Tablespace

在 Oracle 数据库中&#xff0c;表空间&#xff08;Tablespace&#xff09; 是一种逻辑存储结构&#xff0c;用于组织和管理数据库中物理存储数据文件的方式。以下是表空间相关操作的详细介绍&#xff0c;包括创建、修改、删除、查询以及常见问题处理。 1. 表空间的作用 提供逻…

MySQL 数据库学习教程一:开启数据库探索之旅

在当今数字化时代&#xff0c;数据已然成为企业和组织最为宝贵的资产之一。而数据库管理系统则是存储、管理和操作这些数据的核心工具。MySQL 作为一款广泛应用的开源关系型数据库管理系统&#xff0c;以其可靠性、高性能和易用性而备受青睐。如果你渴望踏入数据库领域&#xf…

七、传统循环神经网络(RNN)

传统循环神经网络 RNN 前言一、RNN 是什么&#xff1f;1.1 RNN 的结构1.2 结构举例 二、RNN 模型的分类2.1 按照 输入跟输出 的结构分类2.2 按照 内部结构 分类 三、传统 RNN 模型3.1 RNN内部结构图3.2 内部计算公式3.3 其中 tanh 激活函数的作用3.4 传统RNN优缺点 四、代码演示…

MATLAB中exportgraphics函数用法

目录 语法 说明 示例 将坐标区导出为图像文件 指定图像分辨率 导出图窗 导出为仅包含向量图的 PDF 导出多页 PDF 导出动画 GIF 导出分块图布局 将热图导出为具有透明背景的 PDF 创建用于保存绘图的 App exportgraphics函数的功能是将绘图或图形内容保存到文件。 语…

网络设备配置指南:交换机、路由器与防火墙的基础配置与管理

在现代网络管理中,交换机、路由器和防火墙是不可或缺的关键设备。掌握这些设备的基本配置与管理,对于确保网络的稳定性、安全性和高效性至关重要。本文将详细介绍交换机、路由器和防火墙的基础配置与管理,并通过代码示例和图示来帮助读者更好地理解和应用。 一、交换机的基…

【新能源汽车电驱动系统测试设备】核心厂商主要包括Team Technik、AVL List、清研凌创、Horiba和ThyssenKrupp等

摘要 根据 HengCe&#xff08;恒策咨询&#xff09;的统计及预测&#xff0c;2023年全球新能源汽车电驱动系统测试设备市场销售额达到了3.8亿美元&#xff0c;预计2030年将达到6.6亿美元&#xff0c;年复合增长率&#xff08;CAGR&#xff09;为7.5%&#xff08;2024-2030&…