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的监测节点要保证和集群的通信,还要保证与客户端接节点保持通信,就是内网和外网

由于是练习节环境,这里就不设置两个网卡,内网和外网都是一个
-
ceph1 192.168.20.10
-
ceph2 192.168.20.22
-
ceph3 192.168.20.23
-
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