ceph实战,基于docker部署

1ceph作用

虚拟存储池,用于超大扩容存储,可以比作粮仓,你有多少粮食都可以往里丢(数据),还不会占用本地的内存大小,网络虚拟磁盘

Ceph 就是一个能把一堆普通服务器的硬盘聚在一起,变成一个超大、超可靠的"虚拟硬盘柜"的软件。(不怕服务器坏单节点故障,降本增效,省钱)

2如何实现

通过三大存储方式实现

1 块存储(最常用数据读写速度适中,需要挂载)

2 对象存储(部署小麻烦,但是存储方便不用挂载,读写速度最快)

3 文件存储(读写速度最慢,需要挂载)

ceph组件的介绍

mon 用于监测

osd 用于存储(分布式存储的总容量取决于 OSD 节点上磁盘的数量)

mgr 主要目标实现 ceph 集群的管理

rgw 提供网关服务用于对象存储

RBD 提供块存储

这三个节点每个节点都部署了个节点

如果只是部署ceph,不用于存储,最快部署只要部署mon sod mgr 三个节点,不过这里我要对ceph各个存储服务演示部署五个服务,生成web界面,更好展示

3我的环境

centos7,三台作为ceph节点,一台作为用于ceph的客户机深度展示ceph作用

企业ceph的监测节点要保证和集群的通信,还要保证与客户端接节点保持通信,就是内网和外网

由于是练习节环境,这里就不设置两个网卡,内网和外网都是一个

  1. ceph1 192.168.20.10

  2. ceph2 192.168.20.22

  3. ceph3 192.168.20.23

  4. client 192.168.20.20

前置部署环境

1关闭防火墙

systemctl stop firewalld

systemctl disable firewalld

关闭selinux sed -i 's/enforcing/disabled/' /etc/selinux/config setenforce 0

设置主机名 分别把三台虚拟机的主机名设置成ceph1,ceph2,ceph3。

hostnamectl set-hostname ceph1

hostnamectl set-hostname ceph2

hostnamectl set-hostname ceph3

布置免密钥环境更好的通信

cat >> /etc/hosts <<EOF

192.168.20.10 ceph1

192.168.20.22 ceph2

192.168.20.23 ceph3

EOF

ssh-keygen

ssh-copy-id ceph1

每个主机执行一遍,但是名字要改出自己外的两个节点

布置时间同步,这是非常重要的必须要有

yum install ntpdate -y

ntpdate服务的作用是用于同步不同机器的时间。

#启动ntpdate服务

systemctl start ntpdate

#查看ntpadate

systecmctl status ntpdate

小总结一下这里的前置环境配置(这几步一定要有)

1 防火墙

2 时间同步

3免秘钥

4主机间保持连通性

4部署docker环境

因为是centos7的系统版本较老,肯定啊第一步就是换源

bash 复制代码
[root@ceph1 ~]# rm -rf /etc/yum.repos.d/*

这里我用的是阿里的源

bash 复制代码
[root@ceph1 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

清楚一下缓存

bash 复制代码
[root@ceph1 ~]# yum clean all && yum makecache

安装docker依赖,安装docker

bash 复制代码
yum在线安装Docker CE,执行以下命令安装依赖包:
yum install -y yum-utils  device-mapper-persistent-data   lvm2

鉴于国内网络问题,强烈建议使用国内源,执行下面的命令添加yum软件源:
[root@localhost ~]# yum-config-manager  --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

最后,可以安装Docker CE了。
[root@localhost ~]# yum makecache fast
[root@localhost ~]# yum install docker-ce
最后,启动 Docker CE:
[root@localhost ~]# systemctl enable docker
[root@localhost ~]# systemctl start docker

由于国内网络问题访问不到国外网站,或者经常超时,那么我这里加一个docker国内镜像源

bash 复制代码
touch  /etc/docker/daemon.json
vim /etc/docker/daemon.json
{
   "registry-mirrors": ["https://docker.1ms.run"]

}

检验一下我的docker

bash 复制代码
首先检查一下我的docker状态
[root@ceph1 ~]# systemctl  status docker
测速我一下我的镜像能不能访问国外镜像
[root@ceph1 ~]# docker run hello-world

那么就没有问题了docker环境部署完成了

5开始部署ceph-mon

创建ceph目录

bash 复制代码
(3)、创建ceph目录
在宿主机上创建Ceph目录与容器建立映射,便于直接操纵管理Ceph配置文件,以root身份依次在三台节点上创建/usr/local/ceph/{admin,data, etc,lib, logs}目录:
[root@ceph1 admin]# mkdir -p /usr/local/ceph/{admin,data,etc,lib,logs}

[root@ceph1 admin]# chown -R 167:167 /usr/local/ceph/  
注意,这里的167是docker内用户的id号,这里是进行授权,以便docker进程可以操作这些目录

该命令会一次创建5个指定的目录,注意逗号分隔,不能有空格。其中 :

admin文件夹下用于存储启动脚本,

data文件夹用于挂载文件,

etc文件夹下存放了ceph.conf等配置文件

lib文件夹下存放了各组件的密钥文件

logs文件夹下存放了ceph的日志文件。

接着,对docker内用户进行授权

创建OSD磁盘(ceph1、ceph2、ceph3节点都要执行)

如果没有独立磁盘,可以在Linux下面创建一个虚拟磁盘进行挂载,这里以ceph1节点操作为例,首先,初始化10G的镜像文件:(小点没关系以自己机器为主)记着切换目录

bash 复制代码
[root@ceph1 admin]#  mkdir -p /data/ceph-disk
[root@ceph1 admin]#  dd if=/dev/zero of=/data/ceph-disk/ceph-disk-01 bs=1G count=10

接着接着,将镜像文件虚拟成块设备:

bash 复制代码
[root@ceph1 admin]# ​​​losetup -f /data/ceph-disk/ceph-disk-01​​​ 

然后格式化

bash 复制代码
​​ [root@ceph1 admin]# mkfs.xfs -f  /dev/loop0

最后,挂载文件系统,就是将loop0磁盘挂载到/usr/local/ceph/data/osd/目录下:

bash 复制代码
​​ [root@ceph1 admin]# mount /dev/loop0 /usr/local/ceph/data/osd/

推荐在/etc/fstab中配置为自动挂载/dev/loop0 设备。

一个 Ceph 存储集群至少需要一个 Ceph mon(监视器)、Ceph mgr(管理) 和 Ceph OSD(对象存储守护进程),为了达到分布式扩容三种方式,我将docker命令写成了脚本形式,这里我还增加Ceph mds、 Ceph rgw两个组件。(由于我的机器比较少的原因我将三个节点都部署五个服务)

我把所有脚本都放在了admin目录下

这个mon脚本

复制代码
#!/bin/bash
docker run -d --net=host \
    --name=mon \
    --restart=always \
    -v /etc/localtime:/etc/localtime \
    -v /usr/local/ceph/etc:/etc/ceph \
    -v /usr/local/ceph/lib:/var/lib/ceph \
    -v /usr/local/ceph/logs:/var/log/ceph \
    -e MON_IP=172.16.213.66 \
    -e CEPH_PUBLIC_NETWORK=172.16.213.0/24 \
    ceph/daemon:latest-nautilus  mon

其他两节点注意改network-ip就是ip,每个节点只有ip不一样执行这个脚本

将此脚本在三个节点都执行一遍,保证mon容器服务正常启动。Mon服务启动后,会自动生成ceph.client.admin.keyring、ceph.conf 和ceph.mon.keyring文件,将这些文件拷贝到其它两个节点。

执行这个脚本前我建议先拉取这个这个镜像,这个镜像大概有一个左右提取拉取这个镜像会让脚本执行效率变高

bash 复制代码
docker pull  ceph/daemon:latest-nautilus

将这些文件拷贝到其它两个节点。???(为什么要拷贝)这里会出这个三个节点加入不了集群的问题的问题)如果不拷贝,剩下两个集群就会加入失败拷贝前改一下.ceph.conf文件

执行脚本后就出现这三个文件

bash 复制代码
[root@ceph1 ~]#  cat /usr/local/ceph/etc/ceph.conf
[global]
fsid = 39db5c69-9089-4cb7-90a6-785e37146808
mon initial members = ceph1,ceph2,ceph3
mon host = 192.168.20.10,192.168.20.23,192.168.20.22
#这里分为内网外网,内网是mon之间的互相通信,外网是osd与客户机通信
public network = 192.168.20.0/24
cluster network = 192.168.20.0/24
# 容忍更多的时钟误差
mon clock drift allowed = 2
mon clock drift warn backoff = 30
# 允许删除pool
mon_allow_pool_delete=true

mon_max_pg_per_osd = 1000

[mgr]
# 开启WEB仪表盘
mgr modules = dashboard

[client.rgw.ceph1]
# 设置rgw网关的web访问端口
rgw_frontends = "civetweb port=20003"

分别拷贝到ceph2 ceph3

bash 复制代码
[root@ceph1 ~]#  scp /usr/local/ceph/etc/* root@ceph3:/usr/local/ceph/etc/

在执行脚本就行

成功后用docker命令看一下集群状态

看到mon是三个

ceph主机无法加入集群状态解决方法

该博主出现无法加入集群,的解决方法一些经验(有可能 错误,我也是在学习状态,哪里不对请纠正哈哈哈)

因为这个里部署的三mon节点,每个节点会生成自己monmap,加入集群的条件就是要有相同monmap,ceph.conf文件只是充分必要条件,里面的ip写的必须也是一样的

我解决方法一些错误的方法,我以为重启ceph.conf并保证里面一样配置就行,结果不行,还有就是时间要统一,ceph节点对时间同步性很高

这是为什么ceph.conf一样为什么加入不了集群的原因

在分别执行脚本没有进行拷贝正确解决方法:

ceph1 2 3 用docker命令停止 mon 删除mon在ceph 1ceph 2 ceph 3 分别执行这个,

bash 复制代码
41  rm -rf /usr/local/ceph/lib/mon/
 rm -rf/usr/local/ceph/etc/*

把ceph1 里面的ceph三个配置文件给分别传给ceph2 ceph3 ,

ceph1 ceph2 ceph 3 再接跑脚本即可,(尽量保证跑脚本的一致性)


6部署ceph-osd

如果上述mon部署没有问题,,接下来的几个服务应该就不会出错

第二个是启动Ceph osd的脚本start_osd.sh,内容如下:

我编写的脚本都是在admin目录下,

bash 复制代码
[root@ceph1 admin]# cat start_osd.sh
#!/bin/bash
#是在mon节点生成osd的密钥信息,不然启动OSD会报错。
docker exec -it mon ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
docker run -d \
    --name=osd \
    --net=host \
    --restart=always \
    --privileged=true \
    --pid=host \
    -v /etc/localtime:/etc/localtime \
    -v /usr/local/ceph/etc:/etc/ceph \
    -v /usr/local/ceph/lib:/var/lib/ceph \
    -v /usr/local/ceph/logs:/var/log/ceph \
    -v /usr/local/ceph/data/osd:/var/lib/ceph/osd \
    ceph/daemon:latest-nautilus  osd_directory

三个脚本都执行一遍,

docker命令查看一下状态

bash 复制代码
[root@ceph1 admin]# docker  exec mon ceph -s

7 部署 ceph-mgr

三个节点都执行一下

bash 复制代码
#!/bin/bash
docker run -d --net=host  \
  --name=mgr \
  --restart=always \
  -v /etc/localtime:/etc/localtime \
  -v /usr/local/ceph/etc:/etc/ceph \
  -v /usr/local/ceph/lib:/var/lib/ceph \
  -v /usr/local/ceph/logs:/var/log/ceph \
  ceph/daemon:latest-nautilus mgr
bash 复制代码
root@ceph1 admin]# docker  logs  osd

其实大家要养成查看日志的习惯,在真实生成环境安装一个东西虽然表面上没什么报错,但是日志里不一定不会报错,还有就是安装的时候可以看看这个东西具体安装了那些东西--小tops 哈哈

mgr可以就是说一个工具箱,里面装了许多python的工具箱来管理ceph,当然这个还有Dashboard,提供一个web界面来更好的显示ceph存储的数据信息--莫急后面会展示

8部署ceph-rgw

第四个是启动Ceph rgw服务,脚本start_rgw.sh内容如下:

bash 复制代码
#!/bin/bash
#这也是生成密钥信息
docker exec mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring
docker run \
    -d --net=host \
    --name=rgw \
    --restart=always \
    -v /etc/localtime:/etc/localtime \
    -v /usr/local/ceph/etc:/etc/ceph \
    -v /usr/local/ceph/lib:/var/lib/ceph \
    -v /usr/local/ceph/logs:/var/log/ceph \
    ceph/daemon:latest-nautilus rgw

(进行对象存储)--------服务

rgw也叫网关服务存储,主要给对象存储,那个对象调用它,他就为那个对象生成一个桶,那个对象的照片呀日志信息等等放进桶里,这个 也是ceph分布式存储为什么能高可用的重要原因

以下是rgw工作原理,可以放大看一看,

案例----ceph灵魂的之一

  • 海量非结构化数据存储:特别适合存放图片、视频、音频、日志文件等海量非结构化数据。

  • 企业备份与容灾:可作为备份数据的目标存储,并利用多站点复制功能构建跨地域的灾备方案。

  • 云原生与大数据平台:作为 S3 兼容的存储后端,为 Kubernetes 等容器平台或大数据分析应用提供持久化数据支持。

  • 混合云存储:通过在本地部署 RGW,可以构建统一的存储入口,与公有云形成协同。

9最后一个ceph-mds

文件服务存储服务

bash 复制代码
#!/bin/bash
docker run -d \
   --net=host \
   --name=mds \
   --restart=always \
   --privileged=true \
   -v /etc/localtime:/etc/localtime \
   -v /usr/local/ceph/etc:/etc/ceph \
   -v /usr/local/ceph/lib:/var/lib/ceph \
   -v /usr/local/ceph/logs:/var/log/ceph \
   -e CEPHFS_CREATE=0 \
   -e CEPHFS_METADATA_POOL_PG=512 \
   -e CEPHFS_DATA_POOL_PG=512 \

9现在开始部署一下ceph的web界面

这个玩意有个小细节mgr虽然布置了三个节点,但是这里你里面只有一个是up状态,其他两个是备份状态,我的意思是部署这个页面状态,只能在mgr-up状态下的主机布置

我的是吗gr是ceph2 active状态其他都是standbys备份状态,当ceph2down掉后,后通过算法选举出来一个节点当管理者

开始详细部署这个界面

开启dashboard功能

bash 复制代码
docker exec mgr ceph mgr module enable dashboard
docker exec mgr sh -c "echo admin123456 > /tmp/password.txt"

、创建登录用户与密码

bash 复制代码
docker exec mgr ceph dashboard set-login-credentials admin -i /tmp/password.txt
其中,/tmp/password.txt是mgr容器内的路径,内容就是Dashboard管理后台admin用户的密码

配置外部访问端口个,这里指定端口号是18080,可以自定义修改

bash 复制代码
docker exec mgr ceph config set mgr mgr/dashboard/server_port 18080

配置外部访问地址,这里我的主节点IP是192.168.20.22,需要换成自己的IP地址

bash 复制代码
docker exec mgr ceph config set mgr mgr/dashboard/server_addr 192.168.20.22

、关闭https(如果没有证书或内网访问, 可以关闭)

bash 复制代码
docker exec mgr ceph config set mgr mgr/dashboard/ssl false

重启Mgr DashBoard服务

bash 复制代码
docker restart mgr

最后通过 http://192.168.20.22:18080/#/dashboard 即可访问到ceph的Dashboard 页面。

还有就是可能浏览器有问题会阻止你的访问,用谷歌就行

这样我们的部署就到此为止,下一篇来演实战关于ceph三大存储,see you tomorrow

相关推荐
MY_TEUCK4 小时前
【2026最新Linux本地部署Ollama】Ollama Linux 安装全流程(含离线 / 开机自启 / 远程访问)
linux·运维·服务器
无限进步_4 小时前
【Linux】软件包管理器:Linux 的“应用商店”
linux·运维·服务器
蜀道山老天师4 小时前
Docker Compose实战案例:一键部署WordPress+Prometheus监控平台
运维·docker·容器·prometheus
陈陈CHENCHEN5 小时前
【Linux】Rsync + Inotify 实时文件同步案例
linux·运维·服务器
xhbh6665 小时前
光纤端口映射完全教程:光猫虚拟服务器配置+免费穿透工具实战
运维·服务器·网络·智能路由器·端口映射·流量端口转发·ssh端口转发
初雪云5 小时前
让安卓发版再简单一点,体验一键自动化发布
android·运维·自动化
charlie1145141915 小时前
嵌入式Linux嵌入式Linux驱动开发:设备树驱动改造——从硬编码到设备树的实战之旅
linux·运维·驱动开发
再战300年5 小时前
docker快速部署kafka集群
docker·容器·kafka
春天的菠菜5 小时前
【私服】一步部署 Docker 私服
java·docker·容器