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的系统版本较老,肯定啊第一步就是换源
[root@ceph1 ~]# rm -rf /etc/yum.repos.d/*
这里我用的是阿里的源
[root@ceph1 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
清楚一下缓存
[root@ceph1 ~]# yum clean all && yum makecache
安装docker依赖,安装docker
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国内镜像源
touch /etc/docker/daemon.json
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.1ms.run"]
}
检验一下我的docker
首先检查一下我的docker状态
[root@ceph1 ~]# systemctl status docker
测速我一下我的镜像能不能访问国外镜像
[root@ceph1 ~]# docker run hello-world


那么就没有问题了docker环境部署完成了
5开始部署ceph-mon
创建ceph目录
(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的镜像文件:(小点没关系以自己机器为主)记着切换目录
[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
接着接着,将镜像文件虚拟成块设备:
[root@ceph1 admin]# losetup -f /data/ceph-disk/ceph-disk-01
然后格式化
[root@ceph1 admin]# mkfs.xfs -f /dev/loop0
最后,挂载文件系统,就是将loop0磁盘挂载到/usr/local/ceph/data/osd/目录下:
[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文件,将这些文件拷贝到其它两个节点。
执行这个脚本前我建议先拉取这个这个镜像,这个镜像大概有一个左右提取拉取这个镜像会让脚本执行效率变高
docker pull ceph/daemon:latest-nautilus
将这些文件拷贝到其它两个节点。???(为什么要拷贝)这里会出这个三个节点加入不了集群的问题的问题)如果不拷贝,剩下两个集群就会加入失败拷贝前改一下.ceph.conf文件
执行脚本后就出现这三个文件

[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
[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 分别执行这个,
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目录下,

[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命令查看一下状态
[root@ceph1 admin]# docker exec mon ceph -s

7 部署 ceph-mgr
三个节点都执行一下
#!/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
root@ceph1 admin]# docker logs osd
其实大家要养成查看日志的习惯,在真实生成环境安装一个东西虽然表面上没什么报错,但是日志里不一定不会报错,还有就是安装的时候可以看看这个东西具体安装了那些东西--小tops 哈哈

mgr可以就是说一个工具箱,里面装了许多python的工具箱来管理ceph,当然这个还有Dashboard,提供一个web界面来更好的显示ceph存储的数据信息--莫急后面会展示
8部署ceph-rgw
第四个是启动Ceph rgw服务,脚本start_rgw.sh内容如下:
#!/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
文件服务存储服务
#!/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功能
docker exec mgr ceph mgr module enable dashboard
docker exec mgr sh -c "echo admin123456 > /tmp/password.txt"
、创建登录用户与密码
docker exec mgr ceph dashboard set-login-credentials admin -i /tmp/password.txt
其中,/tmp/password.txt是mgr容器内的路径,内容就是Dashboard管理后台admin用户的密码
配置外部访问端口个,这里指定端口号是18080,可以自定义修改
docker exec mgr ceph config set mgr mgr/dashboard/server_port 18080
配置外部访问地址,这里我的主节点IP是192.168.20.22,需要换成自己的IP地址
docker exec mgr ceph config set mgr mgr/dashboard/server_addr 192.168.20.22
、关闭https(如果没有证书或内网访问, 可以关闭)
docker exec mgr ceph config set mgr mgr/dashboard/ssl false
重启Mgr DashBoard服务
docker restart mgr
最后通过 http://192.168.20.22:18080/#/dashboard 即可访问到ceph的Dashboard 页面。
还有就是可能浏览器有问题会阻止你的访问,用谷歌就行


这样我们的部署就到此为止,下一篇来演实战关于ceph三大存储,see you tomorrow
更多推荐
所有评论(0)