当前位置: 首页 > news >正文

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

#作者:西门吹雪

文章目录

  • 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

相关文章:

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

#作者:西门吹雪 文章目录 micro-Services-TutorialCeph分布式文件共享方案部署Ceph集群使用CephCeph在kubernetes集群中的使用 micro-Services-Tutorial 微服务最早由Martin Fowler与James Lewis于2014年共同提出&#xff0c;微服务架构风格是一种使用一套小服务来开发单个应…...

数据结构——用数组实现栈和队列

目录 用数组实现栈和队列 一、数组实现栈 1.stack类 2.测试 二、数组实现队列 1.Queue类 2.测试 查询——数组&#xff1a;数组在内存中是连续空间 增删改——链表&#xff1a;链表的增删改处理更方便一些 满足数据先进后出的特点的就是栈&#xff0c;先进先出就是队列…...

vue3typescript,shims-vue.d.ts中declare module的vue声明

webpack已经有了vue-loader这些loader了&#xff0c;为什么还需要declare module *.vue’呢&#xff1f; declare module 是为了告诉 tsc 这是一个“模块”。 如果不声明&#xff0c; IDE 里因为 tsc 类型检查&#xff0c; lint 会标红。 但vue-loader 是在 Webpack 构建阶段使…...

C/C++基础知识复习(30)

1) 什么是 C 中的 Lambda 表达式&#xff1f;它的作用是什么&#xff1f; Lambda 表达式&#xff1a; 在 C 中&#xff0c;Lambda 表达式是一种可以定义匿名函数的机制&#xff0c;可以在代码中快速创建一个内联的函数对象&#xff0c;而不需要显式地定义一个函数。Lambda 表…...

【NLP 1、人工智能与NLP简介】

人人都不看好你&#xff0c;可偏偏你最争气 —— 24.11.26 一、AI和NLP的基本介绍 1.人工智能发展流程 弱人工智能 ——> 强人工智能 ——> 超人工智能 ① 弱人工智能 人工智能算法只能在限定领域解决特定的问题 eg&#xff1a;特定场景下的文本分类、垂直领域下的对…...

网络安全事件管理

一、背景 信息化技术的迅速发展已经极大地改变了人们的生活&#xff0c;网络安全威胁也日益多元化和复杂化。传统的网络安全防护手段难以应对当前繁杂的网络安全问题&#xff0c;构建主动防御的安全整体解决方案将更有利于防范未知的网络安全威胁。 国内外的安全事件在不断增…...

Swagger记录一次生成失败

最近在接入Swagger的时候遇到一个问题&#xff0c;就是Swagger UI可以使用的&#xff0c;但是/v3/docs 这个接口的json返回的base64类型的json&#xff0c;并不是纯json&#xff0c;后来检查之后是因为springboot3里面配置了json压缩。 Beanpublic HttpMessageConverters cusHt…...

Go 语言常用工具方法总结

在 Go 语言开发中&#xff0c;常常需要进行一些常见的类型转换、字符串处理、时间处理等操作。本文将总结一些常用的工具方法&#xff0c;帮助大家提高编码效率&#xff0c;并提供必要的代码解释和注意事项&#xff08;go新人浅浅记录一下&#xff0c;以后来翻看&#x1f923;&…...

ThingsBoard规则链节点:GCP Pub/Sub 节点详解

目录 引言 1. GCP Pub/Sub 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 数据传输 3.2 数据分析 3.3 事件通知 3.4 任务调度 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0…...

【Linux】select,poll和epoll

select&#xff0c;poll&#xff0c;epoll都是IO多路复用的机制。I/O多路复用就通过一种机制&#xff0c;可以监视多个描述符fd&#xff0c;一旦某个描述符就绪(一般是读就绪或者写就绪)&#xff0c;系统会通知有I/O事件发生了&#xff08;不能定位是哪一个&#xff09;。但sel…...

Qt程序发布及打包成exe安装包

参考:Qt之程序发布以及打包成exe安装包 目录 一、简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno Setup 打包工具打包成一个 exe 安装包,就可以…...

python怎样运行js语句

1. 安装 pip install PyExecJS # 需要注意&#xff0c; 包的名称&#xff1a;PyExecJS 2. 简单使用 import execjs execjs.eval("new Date") 返回值为&#xff1a; 2018-04-04T12:53:17.759Z execjs.eval("Date.now()") 返回值为&#xff1a;152284700108…...

汽车渲染领域:Blender 和 UE5 哪款更适用?两者区别?

在汽车渲染领域&#xff0c;选择合适的工具对于实现高质量的视觉效果至关重要。Blender和UE5&#xff08;Unreal Engine 5&#xff09;作为两大主流3D软件&#xff0c;各自在渲染动画方面有着显著的差异。本文将从核心定位与用途、工作流程、渲染技术和灵活性、后期处理与合成四…...

JAVA实现将PDF转换成word文档

POM.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…...

前端-Git

一.基本概念 Git版本控制系统时一个分布式系统&#xff0c;是用来保存工程源代码历史状态的命令行工具 简单来说Git的作用就是版本管理工具。 Git的应用场景&#xff1a;多人开发管理代码&#xff1b;异地开发&#xff0c;版本管理&#xff0c;版本回滚。 Git 的三个区域&a…...

如何分析Windows防火墙日志

Windows防火墙&#xff0c;也被称为Windows Defender Firewall&#xff0c;是一种内置的安全功能&#xff0c;可以主动监控和分析运行Windows操作系统的计算机上通过Windows防火墙的网络流量&#xff0c;主要目的是作为计算机和互联网或其他网络之间的屏障&#xff0c;使管理员…...

工作坊报名|使用 TEN 与 Azure,探索你的多模态交互新场景

GPT-4o Realtime API 发布&#xff0c;语音 AI 技术正在进入一场新的爆发。语音AI技术的实时语音和视觉互动能力将为我们带来更多全新创意和应用场景。 实时音频交互&#xff1a; 允许应用程序实时接收并响应语音和文本输入。自然语音生成&#xff1a; 减少 AI 技术生成的语音…...

学习笔记041——Elastic Search的学习与使用以及SpringBoot整合

文章目录 1、Elastic Search介绍1.1、ES 的数据结构1.2、ES 为什么查询快1.3、CRUD 2、Spring Boot 整合 ES 1、Elastic Search介绍 ‌Elasticsearch‌是一个分布式的、基于RESTful API的搜索和分析引擎&#xff0c;广泛用于大规模数据存储和快速检索。它最初由Shay Banon于20…...

R安装rgdal报错 解决办法

尝试了网上很多办法&#xff0c;不知道哪一步解决了&#xff0c;记录一下所有步骤&#xff1a; 1. 尝试github安装 options(repos c(CRAN "https://mirrors.tuna.tsinghua.edu.cn/CRAN/"))install.packages("devtools")library(devtools)devtools::in…...

【智能制造-46】人机工程(工厂自动化)

工作空间设计 设备布局规划 根据人体测量学数据&#xff0c;合理安排自动化设备、生产线和工作区域的布局。例如&#xff0c;考虑工人的操作空间和活动范围&#xff0c;确保他们能够舒适地接近和操作设备。在汽车装配车间&#xff0c;机器人和工人的工作区域应划分明确&#…...

C#笔记(5)

一、winform项目与窗体控件 1、部分类的使用 好处&#xff1a;让自动生成的代码后置&#xff0c;我们编写程序的代码显得更加简洁 特点&#xff1a;在最后编译的时候&#xff0c;仍然编译成一个窗体类。 窗体和控件的基本使用 3、Event事件&#xff08;委托--》事件&#…...

【软件国产化】| Windows和Linux下文件名后缀是否区分大小写

今天在开发过程中遇到了个软件在Linux系统和Windows系统下功能表现不一致的bug&#xff0c;具体表现为&#xff1a; 插入一张图片&#xff08;A文件夹中的001.jpg&#xff09;&#xff0c;然后使用“图片替换”功能&#xff0c;用B文件夹中的图片&#xff08;B文件夹中的001.JP…...

讨论JAVA、JVM与Spring

Q1: 作为一个JAVA开发人员&#xff0c;对于jvm肯定不陌生&#xff0c;但很多人对它不陌生也仅止于概念上&#xff0c;而且对概念也是模糊不清的&#xff0c;但jvm实际是java程序运行在其中的实际存在的环境&#xff0c;对它的理解应该要是具象化的。 我们还是从一项技术产生的…...

【04】MySQL数据库和数据表的基本操作详解与实例

文章目录 一、连接MySQL服务器二、数据库的基本操作2.1数据库的基本操作1. 创建数据库2. 选择数据库3. 删除数据库4.查询所有数据库5.修改数据库的字符集 2.2 数据表的基本操作1. 创建数据表2. 查看数据表结构3. 删除数据表4. 修改数据表5. 插入数据6. 查询数据7. 更新数据8. 删…...

Spring中实现动态数据源切换,基于AbstractRoutingDataSource

背景 在项目开发过程中&#xff0c;我们可能会遇到一个场景&#xff1a;某个类型数据源有多个数据源实例&#xff0c;需要我们按照不同的请求切换到不同数据源去。 而目前绝大多数java应用都是基于Spring框架来开发&#xff0c;我们很多时候相关的数据源连接都是交给了Spring框…...

StarRocks-join优化

1、背景 有两个大表&#xff0c;都是6kw级别上下的&#xff0c;通过SR然后包装了一个接口对外提供查询&#xff0c;当前的问题是&#xff0c;这样大的join查询会导致BE直接宕机。并且这个sql很有代表性&#xff0c;我截图如下&#xff1a; 这个表是个单分区&#xff0c;所以直接…...

js 高亮文本中包含的关键词标红

在开发中&#xff0c;遇到需要将文本中包含的关键字高亮的情况&#xff0c;可以做以下处理。 <div class"title"v-html"highlightKeywords(item.title, state1.tags1.concat(state2.tags2).concat(state3.tags3))"> </div> ...... ...... con…...

DVWA靶场——File Inclusion

File Inclusion&#xff08;文件包含&#xff09;漏洞 指攻击者通过恶意构造输入&#xff0c;利用应用程序错误的文件包含机制&#xff0c;导致程序包含并执行未经授权的本地或远程文件。这类漏洞广泛存在于Web应用程序中&#xff0c;尤其是在那些允许用户提供文件路径或URL的地…...

Android Framework禁止弹出当前VOLTE不可用的提示窗口

文章目录 VoLTE简介VoLTE 的优势 当前VOLTE不可用的弹窗弹窗代码定位屏蔽弹出窗口 VoLTE简介 VoLTE&#xff08;Voice over LTE&#xff09;是一种基于4G LTE网络的语音通话技术。它允许用户在4G网络上进行高质量的语音通话和视频通话&#xff0c;而不需要回落到2G或3G网络。V…...

OceanBase 大数据量导入(obloader)

现需要将源数据库&#xff08;Oracle|MySQL等&#xff09;一些表的海量数据迁移到目标数据库 OceanBase 中&#xff0c;基于常规 jdbc 驱动编码的方式涉及开发工作&#xff0c;性能效率也要看编码的处理机制。 OceanBase 官方提供了的 OceanBase Migration Service (OMS) 数据…...