文档章节

[喵咪Liunx(7)]Ceph分布式文件共享解决方案

喵了_个咪
 喵了_个咪
发布于 07/13 09:52
字数 2310
阅读 1631
收藏 49

前言

哈喽大家好呀! 这次给大家带来的Liunx软件分享是鼎鼎大名的Ceph分布式文件系统,笔者了解到Ceph也是遇到了一个问题就是在使用Kubeneters的时候在各个容器中都需要使用同一套文件,但是使用NAS盘的方式不管是更新还是读取都要忍受2分钟之久而且还会出现文件占用失败的问题,笔者找了找现有和Kuberneters结合比较好的文件系统才发现Ceph,那么就开始进行Ceph的搭建和使用吧

附上:

喵了个咪的博客:w-blog.cn

Ceph官网 :https://ceph.com/

1. 环境准备

首先需要3台服务器来做集群,ceph默认会进行文件三份的冗余来保障文件不易丢失,服务器IP地址如下:

PS:这里使用的是Centos7的系统版本

192.168.3.101 ceph-1
192.168.3.102 ceph-2
192.168.3.103 ceph-3

这里使用docker的方式进行安装不会应为安装过程污染环境方便删除重试:

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce

需要配置好国内docker源来提高速度并且配置好开启自启(需要使用自己的阿里云账号获取加速地址)

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

2. 集群部署

在各个节点上拉取需要使用到的Docker镜像

docker pull ceph/daemon

在node1节点上运行 mon

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

查看docker运行状态,并且执行命令查看ceph的集群情况

[root@ceph-1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS               NAMES
b0c9d7680461        ceph/daemon         "/entrypoint.sh mon"   About a minute ago   Up About a minute                       mon
[root@ceph-1 ~]# docker exec mon ceph -s
  cluster:
    id:     da8f7f5b-b767-4420-a510-287f4ced25de
    health: HEALTH_OK
 
  services:
    mon: 1 daemons, quorum ceph-1
    mgr: no daemons active
    osd: 0 osds: 0 up, 0 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:     

虽然我们没有映射端口,Ceph容器会把后续需要使用到的端口映射出来

[root@ceph-1 ~]# yum install tcping
[root@ceph-1 ~]# tcping 192.168.3.101 6789
192.168.3.101 port 6789 open

Ceph有两种方式在各个节点之间共享配置,一种是文件的方式需要吧第一个启动起来的节点的文件CP到其他节点,另外一种是使用配置服务(比如etcd或者consul) 这里使用的文件的方式存放公共配置问题复制配置文件 将 node1 上的配置文件复制到 node02 和 node03,复制的路径包含/etc/ceph和/var/lib/ceph/bootstrap-*下的所有内容。


ssh root@192.168.3.102 mkdir -p /var/lib/ceph
scp -r /etc/ceph root@192.168.3.102:/etc
scp -r /var/lib/ceph/bootstrap* root@192.168.3.102:/var/lib/ceph

ssh root@192.168.3.103 mkdir -p /var/lib/ceph
scp -r /etc/ceph root@192.168.3.103:/etc
scp -r /var/lib/ceph/bootstrap* root@192.168.3.103:/var/lib/ceph

启动第二个和第三个 mon 在 node02 上执行以下命令启动 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=192.168.3.102 \
        -e CEPH_PUBLIC_NETWORK=192.168.3.0/24 \
        ceph/daemon mon

在 node03 上执行以下命令启动 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=192.168.3.103 \
        -e CEPH_PUBLIC_NETWORK=192.168.3.0/24 \
        ceph/daemon mon

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

[root@ceph-1 ~]# docker exec mon ceph -s
  cluster:
    id:     da8f7f5b-b767-4420-a510-287f4ced25de
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3
    mgr: no daemons active
    osd: 0 osds: 0 up, 0 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:  

接着就需要运行osd服务把某个磁盘给ceph作为文件共享系统的基础存储,所以我们需要为三台服务器挂载对应的磁盘(笔者这里使用的是阿里云的云服务器,这里挂载了100GB的SSD)

[root@ceph-1 ~]# 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: 0x0008d73a

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    83884031    41940992   83  Linux

Disk /dev/vdb: 107.4 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个节点已经上线了

[root@ceph-1 ~]# docker exec mon ceph -s
  cluster:
    id:     da8f7f5b-b767-4420-a510-287f4ced25de
    health: HEALTH_WARN
            no active mgr
 
  services:
    mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3
    mgr: no daemons active
    osd: 3 osds: 3 up, 3 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:     
 

但是我们并看不到有存储空间,主要是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

初始化完成

[root@ceph-1 ~]# docker exec mon ceph -s
  cluster:
    id:     da8f7f5b-b767-4420-a510-287f4ced25de
    health: HEALTH_OK
 
  services:
    mon: 3 daemons, quorum ceph-1,ceph-2,ceph-3
    mgr: ceph-1(active)
    mds: cephfs-1/1/1 up  {0=ceph-1=up:active}
    osd: 3 osds: 3 up, 3 in
    rgw: 1 daemon active
 
  data:
    pools:   6 pools, 48 pgs
    objects: 209  objects, 3.4 KiB
    usage:   6.0 GiB used, 292 GiB / 298 GiB avail
    pgs:     48 active+clean

3. 简单使用和性能

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

mkdir /mnt/mycephfs
[root@ceph-1 ~]# cat /etc/ceph/ceph.client.admin.keyring 
[client.admin]
        key = AQBXv0VbKtikExAAwHHp+F2HJSnYIIqaozjt3g==
        auid = 0
        caps mds = "allow"
        caps mgr = "allow *"
        caps mon = "allow *"
        caps osd = "allow *"

mount -t ceph 192.168.3.101,192.168.3.102,192.168.3.103:/ /mnt/mycephfs -o name=admin,secret=AQBhlz1bZBHcLxAAt6eIyBxnAxFoyA7PDTqAkQ==
umount /mnt/mycephfs


[root@ceph-1 ~]# lsof  /mnt/mycephfs
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF          NODE NAME
bash    10486 root  cwd    DIR    0,0        2 1099511627781 /mnt/mycephfs/data/dev/code

这样只是最简单的使用,还有关于rdb对象存储以及Ceph还有快照功能

在搭建好整个集群之后进行测试文件速度(这里主要测试的是5000多个小文件拷贝速度)如下:

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

大家可以看到CEPH的速度对于NAS盘提升不是一点两点是质的提升,面对本地磁盘差距也没有到不能接受的情况

4. Kubernetes使用

笔者的最终目的是在K8S中可以使用ceph作为高速共享盘,那么就需要借助K8S支持的cephFS文件挂载,具体对应的编排如下

因为使用ceph需要密码所以我们先创建一个secret

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

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

apiVersion: v1
kind: PersistentVolume
metadata:
  name: cephfs-pv
spec:
  capacity:
    storage: 200Gi
  accessModes:
    - ReadWriteMany
  cephfs:
    monitors:
      - 192.168.3.101:6789
      - 192.168.3.102:6789
      - 192.168.3.103:6789
    user: admin
    secretRef:
      name: ceph-secret
    readOnly: false
  storageClassName: ceph
  persistentVolumeReclaimPolicy: Recycle
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: cephfs-pv-claim
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Gi
  storageClassName: ceph

5. 小技巧

如果大家没有搞定也可以先试试官方也提供整合好的demo 不需要开这么多组件才能使用,只需要以下命令即可:

docker run -d \
        --net=host \
        -v /etc/ceph:/etc/ceph \
        -e MON_IP=172.16.0.13 \
        -e CEPH_PUBLIC_NETWORK=172.16.0.0/24 \
        ceph/demo

被ceph占用的磁盘会自己划分分区,无法在被二次使用了,如果需要重新初始化可以使用命令对磁盘进行全盘格式

 
[root@ceph-1 ~]# 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: 0x0008d73a

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048    83884031    41940992   83  Linux
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/vdb: 107.4 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
Disk label type: gpt
Disk identifier: 17E24D34-44A5-46BB-8753-A882133156FF


#         Start          End    Size  Type            Name
 1         2048       206847    100M  unknown         ceph data
 2      3483648    209715166   98.3G  unknown         ceph block
 3       206848      2303999      1G  unknown         ceph block.db
 4      2304000      3483647    576M  unknown         ceph block.wal

如果需要重新部署需要先,清理磁盘可以通过以下命名进行格式化

docker run -d --privileged=true -v /dev/:/dev/ -e OSD_DEVICE=/dev/vdb ceph/daemon zap_device

© 著作权归作者所有

共有 人打赏支持
喵了_个咪
粉丝 309
博文 146
码字总数 190043
作品 4
杨浦
技术主管
私信 提问
加载中

评论(1)

小瑞猫
小瑞猫
喵了个咪喵呜。。。
[喵咪Golang(2)]安装和Helloworld

哈喽大家好啊!今天我们紧接着来学习关于Go语言的安装和使用Go打印出helloworld,本节内容将会讲解关于Go语言在Liunx下怎么安装,环境变量怎么配置分别起到了什么作用,然后我们把go运行起来并且...

喵了_个咪
2016/05/23
63
0
[喵咪Liunx(4)Monit进程监控

有一段时间没有更新博客了,最近因为公司项目全球化以及最近慢慢在偏向学习团队管理忙的有点不可开交了,不过这次要给大家带来两篇关于Liunx日常开发维护管理中非常好用的两款利器,其中一个就是...

喵了_个咪
2016/10/17
130
0
[喵咪Liunx(3)]端口转发工具rinetd

今天笔者为大家带来了另外一款非常优秀的Liunx工具,这个工具有什么用呢?它能帮助我们解决一些特定场景下的端口转发需求,这个工具就是runetd,runetd可以非常方便的进行端口转发的设置,那就让我...

喵了_个咪
2016/07/26
56
0
[喵咪PHP]页面显示空白问题

哈喽!大家好啊,喵咪PHP第一次和大家见面了,熟悉的朋友呢也之道喵咪我也开了喵咪Liunx和喵咪Golang这两个坑目的呢是吧平常遇到的一些问题或者是在学习中的东西好工具分享出来和大家交流沟通,...

喵了_个咪
2016/06/09
408
0
二, 跨语言微服务框架 - Istio环境搭建

当我们知道Istio是一个好东西,能够帮助我们快速实现微服务化中的一些关键节点,那么下一步就需要考虑怎么使用Istio了,Istio现在版本是和Kubernetes强关联在一起的,如果大家还不是太了解K...

喵了_个咪
11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【实践】如何获得Rinkeby网络的测试以太币

当把智能合约部署到Rinkeby Test Network时,需要获得测试以太币。其网络获取测试以太币的方法同Ropsten Test Network有些不同,本文详细讲解一下。 1 访问网站 访问rinkeby网络(https://w...

HiBlock
29分钟前
1
0
Logback中如何自定义灵活的日志过滤规则

当我们需要对日志的打印要做一些范围的控制的时候,通常都是通过为各个Appender设置不同的Filter配置来实现。在Logback中自带了两个过滤器实现:ch.qos.logback.classic.filter.LevelFilter...

程序猿DD
36分钟前
2
0
ES6中let 和 const 的新特性

在javascript中,我们都知道使用var来声明变量。javascript是函数级作用域,函数内可以访问函数外的变量,函数外不能访问函数内的变量。 ECMAScript 6 是 JavaScript 语言教程,全面介绍 EC...

peakedness丶
43分钟前
2
0
Springboot中Jackson的操作

欢迎工作一到八年的Java工程师朋友们加入Java高级交流:854630135 本群提供免费的学习指导 架构资料 以及免费的解答 不懂得问题都可以在本群提出来 之后还会有直播平台和讲师直接交流噢 表数...

编程SHA
46分钟前
4
0
自定义Maven插件功能

自定义maven插件 创建一个maven 项目 通过上述方式创建,会自动引入maven-plugin-api 依赖和打包方式;如下 <packaging>maven-plugin</packaging><dependency> <groupId>org.apache.mave......

春哥大魔王的博客
57分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部