前言
这几天都在学习搭建Ceph集群,这真是一部心酸的血泪史。下面我就将我的安装过程以及踩过坑,一五一十的陈述出来。
创建三台虚拟机,本教程采用的Linux是CentOS7.6版本,Docker的版本是19.03.13,Ceph的版本是nautilus。三台虚拟机的情况如下:
主机名称 | 主机IP | 说明 |
---|---|---|
ceph1 | 192.168.161.137 | 容器主节点(Dashbaord、mon、mds、rgw、mgr、osd) |
ceph2 | 192.168.161.135 | 容器子节点(mon、mds、rgw、mgr、osd) |
ceph3 | 192.168.161.136 | 容器子节点(mon、mds、rgw、mgr、osd) |
部署Ceph之前我们需要对自身机器的环境做一个预检查。主要涉及到防火墙,主机名等设置。
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
PS: 正式环境实际部署时,最好通过加入IP白名单的方式来操作,而不是直接关闭防火墙。
hostnamectl set-hostname ceph1
hostnamectl set-hostname ceph2
hostnamectl set-hostname ceph3
#在192.168.161.133(ceph1)上执行:
ssh-keygen
#把密钥发给ceph2、ceph3
ssh-copy-id ceph2
ssh-copy-id ceph3
cat >> /etc/hosts <<EOF
192.168.161.137 ceph1
192.168.161.135 ceph2
192.168.161.136 ceph3
EOF
#调整内核参数
cat >> /etc/sysctl.conf << EOF
kernel.pid_max=4194303
vm.swappiness = 0
EOF
sysctl -p
# read_ahead, 通过数据预读并且记载到随机访问内存方式提高磁盘读操作,根据一些Ceph的公开分享,8192是比较理想的值
echo "8192" > /sys/block/sda/queue/read_ahead_kb
# I/O Scheduler,关于I/O Scheculder的调整,简单说SSD要用noop,SATA/SAS使用deadline。
echo "deadline" > /sys/block/sda/queue/scheduler
echo "noop" > /sys/block/sda/queue/scheduler
#查看ntp,如果状态是inactive,则表示没启动
systemctl status ntpd
#启动ntp服务
systemctl start ntpd
#设置开启自启动ntp服务
systemctl enable ntpd
echo 'alias ceph="docker exec mon ceph"' >> /etc/profile
source /etc/profile
上面的预检做完之后,下面我们就开始具体的部署。
1. 创建Ceph目录 在宿主机上创建Ceph目录与容器建立映射,便于直接操纵管理Ceph配置文件,以root身份依次在三台节点上创建/usr/local/ceph/{admin,data, etc,lib, logs}目录:
mkdir -p /usr/local/ceph/{admin,data,etc,lib,logs}
该命令会一次创建5个指定的目录,注意逗号分隔,不能有空格。其中:admin文件夹下用于存储启动脚本, data文件夹用于挂载文件, etc文件夹下存放了ceph.conf等配置文件 lib文件夹下存放了各组件的密钥文件 logs文件夹下存放了ceph的日志文件。
chown -R 167:167 /usr/local/ceph/ #docker内用户id是167,这里进行授权
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
sudo systemctl start docker
systemctl enable docker
$ mkdir /etc/docker
$ vim /etc/docker/daemon.json
创建好文件之后再该文件中配置加速器,这里用的是网易云和百度云的加速器
{
"registry-mirrors": [:
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
需要注意的是一定要保证该文件符合json规范,否则Docker将不能启动。之后重启服务
#使配置生效
$ sudo systemctl daemon-reload
#重启docker服务
$ sudo systemctl restart docker
#将docker服务设置成开机自启动
$ systemctl enable docker
mkdir-p/usr/local/ceph-disk ddif=/dev/zero of=/usr/local/ceph-disk/ceph-disk-01bs=1Gcount=10
2.2. 将镜像文件虚拟成块设备: losetup-f/usr/local/ceph-disk/ceph-disk-01
2.3. 格式化(名称根据fdisk -l进行查询): mkfs.xfs-f/dev/loop0
2.4. 挂载文件系统,就是将loop0磁盘挂载到/usr/local/ceph/data/osd/目录下: mount/dev/loop0/usr/local/ceph/data/osd/
mkfs.xfs-f/dev/sdb
3.2 挂载文件系统: mount/dev/sdb/usr/local/ceph/data/osd/
df-h
命令查看挂载结果这里用到了 dockerhub 上最流行的 ceph/daemon 镜像(这里需要拉取nautilus版本的ceph,latest-nautilus)
docker pull ceph/daemon:latest-nautilus
1. start_mon.sh
!/bin/bash
docker run -d --net=host \
--name=mon \
-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=192.168.161.137,192.168.161.135,192.168.161.136 \
-e CEPH_PUBLIC_NETWORK=192.168.161.0/24 \
ceph/daemon:latest-nautilus mon
这个脚本是为了启动监视器,监视器的作用是维护整个Ceph集群的全局状态。一个集群至少要有一个监视器,最好要有奇数个监视器。方便当一个监视器挂了之后可以选举出其他可用的监视器。启动脚本说明:
MON_IP
是Docker运行的IP地址(通过ifconfig来查询,取ens33里的inet那个IP),这里我们有3台服务器,那么MAN_IP需要写上3个IP,如果IP是跨网段的 CEPH_PUBLIC_NETWORK
必须写上所有网段。CEPH_PUBLIC_NETWORK
配置了运行Docker主机所有网段 这里必须指定nautilus版本,不然会默认操作最新版本ceph,mon必须与前面定义的name保持一致。 2. start_osd.sh#!/bin/bash
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
这个脚本是用于启动OSD组件的,OSD(Object Storage Device)是RADOS组件,其作用是用于存储资源。脚本说明:1. name 是用于指定OSD容器的名称
2. net 是用于指定host,就是前面我们配置host 3. restart指定为always,使osd组件可以在down时重启。4.privileged是用于指定该osd是专用的。这里我们采用的是 osd_directory
镜像模式,如果有独立的磁盘我们可以用 osd_ceph_disk
模式,不需要格式化,直接指定设备名称即可 OSD_DEVICE=/dev/sdb
3. start_mgr.sh
#!/bin/bash
docker run -d --net=host \
--name=mgr \
-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
这个脚本是用于启动mgr组件,它的主要作用是分担和扩展monitor的部分功能,提供图形化的管理界面以便我们更好的管理ceph存储系统。其启动脚本比较简单,在此不再赘述。4. start_rgw.sh
#!/bin/bash
docker run \
-d --net=host \
--name=rgw \
-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组件,rgw(Rados GateWay)作为对象存储网关系统,一方面扮演RADOS集群客户端角色,为对象存储应用提供数据存储,另一方面扮演HTTP服务端角色,接受并解析互联网传送的数据。5. start_mds.sh
#!/bin/bash
docker run -d \
--net=host \
--name=mds \
--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 \
ceph/daemon:latest-nautilus mds
该脚本是用来启动mds组件,该组件的作用是 1、跟踪文件层次结构并存储只供CephFS使用的元数据, 2、mds不直接给客户端提供数据,英雌可以避免系统中的单点故障。脚本说明:CEPHFS_CREATE
是为METADATA服务生成文件系统, 0表示不自动创建文件系统(默认值), 1表示自动创建。CEPHFS_DATA_POOL_PG
是数据池的数量,默认为8。CEPHFS_METADATA_POOL_PG
是元数据池的数量,默认为8。
docker ps-a|grep mon
查看启动结果,启动成功之后生成配置数据,在ceph主配置文件中,追加如下内容:cat >>/usr/local/ceph/etc/ceph.conf <<EOF
# 容忍更多的时钟误差
mon clock drift allowed = 2
mon clock drift warn backoff = 30
# 允许删除pool
mon_allow_pool_delete = true
[mgr]
# 开启WEB仪表盘
mgr modules = dashboard
[client.rgw.ceph1]
# 设置rgw网关的web访问端口
rgw_frontends = "civetweb port=20003"
EOF
scp -r /usr/local/ceph ceph2:/usr/local/
scp -r /usr/local/ceph ceph3:/usr/local/
ssh ceph2 bash /usr/local/ceph/admin/start_mon.sh
ssh ceph3 bash /usr/local/ceph/admin/start_mon.sh
启动后通过 ceph-s
查看集群状态,如果能够看到ceph2和ceph3,则表示集群创建成功,此时的状态应该是HEALTH_OK状态。
在执行start_osd.sh脚本之前,首先需要在mon节点生成osd的密钥信息,不然直接启动会报错。命令如下:
docker exec -it mon ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
接着在主节点下执行如下命令:
bash /usr/local/ceph/admin/start_osd.sh
ssh ceph2 bash /usr/local/ceph/admin/start_osd.sh
ssh ceph3 bash /usr/local/ceph/admin/start_osd.sh
全部osd都启动之后,稍等片刻后,执行 ceph-s
查看状态,应该可以看到多了如下信息(总共3个osd)
osd: 3 osds: 3 up, 3 in
PS: osd的个数最好维持在奇数个。
直接在主节点ceph1上执行如下三个命令:
bash /usr/local/ceph/admin/start_mgr.sh
ssh ceph2 bash /usr/local/ceph/admin/start_mgr.sh
ssh ceph3 bash /usr/local/ceph/admin/start_mgr.sh
同样的我们首先还是需要先在mon节点生成rgw的密钥信息,命令如下:
docker exec mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring
接着在主节点ceph1上执行如下三个命令:
bash /usr/local/ceph/admin/start_rgw.sh
ssh ceph2 bash /usr/local/ceph/admin/start_rgw.sh
ssh ceph3 bash /usr/local/ceph/admin/start_rgw.sh
直接在主节点ceph1上执行如下三个命令
bash /usr/local/ceph/admin/start_mds.sh
ssh ceph2 bash /usr/local/ceph/admin/start_mds.sh
ssh ceph3 bash /usr/local/ceph/admin/start_mds.sh
启动完成之后再通过 ceph-s
查看集群的状态
首先确定主节点,通过 ceph-s
命令查看集群状态,找到mgr为active的那个节点,如下:
mgr: ceph1(active), standbys: ceph2, ceph3
这里的主节点就是ceph1节点。
docker exec mgr ceph mgr module enable dashboard
docker exec mgr ceph dashboard set-login-credentials admin test
这里设置用户名为admin,密码为test。
docker exec mgr ceph config set mgr mgr/dashboard/server_port 18080
docker exec mgr ceph config set mgr mgr/dashboard/server_addr 192.168.161.137
docker exec mgr ceph config set mgr mgr/dashboard/ssl false
docker restart mgr
docker exec mgr ceph mgr services
最后通过 http://192.168.161.137:18080/#/dashboard 访问。
在主节点执行即可
docker exec osd ceph osd pool create cephfs_data 128 128
docker exec osd ceph osd pool create cephfs_metadata 128 128
注意:如果受monmaxpgperosd限制, 不能设为128,可以调小点, 改为64。
docker exec osd ceph fs new cephfs cephfs_metadata cephfs_data
将上面的数据池与元数据池关联, 创建cephfs的文件系统。
[root@ceph1 ceph]# docker exec osd ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
至此,整个集群就已经搭建完毕,通过 ceph-s
命令,可以查看整个集群信息,我们规划的所有节点都已创建成功并加入集群
Centos7系统Docker Ceph 集群的安装配置(中篇)[基于Docker部署ceph分布式文件系统MImic13.2