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

ops/2024/11/28 12:45:46/

#作者:西门吹雪

文章目录

  • 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/ops/137358.html

相关文章

【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配

接到一个需求是类似下图的3D多房间视角&#xff0c;需要拖拽屏幕 问题 在做这种屏幕拖拽的时候发现&#xff0c;需要拖拽起来有跟手的感觉&#xff0c;会存在不同分辨率机型的适配问题。 即&#xff1a;美术调整好了机型1的手感&#xff0c;能做到手指按下顶层地板上下挪动&…

综合解析:绝对路径与相对路径的定义、特性及在Windows与Linux系统中的应用

综合解析&#xff1a;绝对路径与相对路径的定义、特性及在Windows与Linux系统中的应用 在计算机系统中&#xff0c;文件和目录的位置可以通过路径来指定。路径分为两种主要类型&#xff1a;绝对路径和相对路径。这两种路径在不同操作系统&#xff08;如Windows和Linux&#xf…

JavaEE 【知识改变命运】03 多线程(2)

文章目录 复习1.1 进程和线程的区别1.2 线程创建的方式1.3 两者创建的区别 2 多线程2.1多线程的优势-增加了运行的速度2.2Thread类及常用的方法2.2.1常用见的构造方法2.2.2获取当前类的信息2.2.3Thread 的⼏个常⻅属性1 演示后台线程2 线程是否存活3 名称4 线程中断5 等待⼀个线…

[代码随想录Day24打卡] 93.复原IP地址 78.子集 90.子集II

93.复原IP地址 一个合法的IP地址是什么样的&#xff1a; 有3个’.分割得到4个数&#xff0c;每个数第一个数不能是0&#xff0c;不能含有非法字符&#xff0c;不能大于255。 这个是否属于合法IP相当于一个分割问题&#xff0c;把一串字符串分割成4部分&#xff0c;分别判断每…

LeetCode 404.左叶子之和

题目&#xff1a;给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 思路&#xff1a;一个节点为「左叶子」节点&#xff0c;当且仅当它是某个节点的左子节点&#xff0c;并且它是一个叶子结点。因此我们可以考虑对整 node 时&#xff0c;如果它的左子节点是一个叶子…

网络药理学之薛定谔Schrödinge Maestro:6、分子对接(Glide、Ligand docking)和可视化

本人是win11&#xff0c;薛定谔版本是12.9。 官网&#xff1a;https://www.schrodinger.com/ 本篇文章的示例大分子蛋白PDB ID为4KNN&#xff0c;小分子配体的MOL ID为MOL004004。 本文部分图源来自知乎https://zhuanlan.zhihu.com/p/416698194&#xff0c;推荐为原作者贡献阅读…

计算机组成原理——数的定点表示和浮点表示

0.11111-2-40.9375的计算 1.1111-&#xff08;1-2-4&#xff09;-0.9375,1.1111中最前面的1是符号位 重要问题&#xff0c;因为计算机中存储的位数有限&#xff0c;所以数在计算机里是离散分布的。因为在某一区间中的数是无限的 2m-1相当于m个1表示的二进制数 -2的2m-1次方…

关于网络安全攻防知识

DNS 劫持 什么是DNS劫持&#xff1f; DNS劫持又叫域名劫持&#xff0c;&#xff08;劫持了路由器或域名服务器等&#xff09;&#xff0c;篡改了域名的解析结果&#xff0c;使得指向该域名的IP指向IP&#xff0c;你想访问正经网站结果给你跳到一个不正经的网站&#xff0c;实现…