最近正在学习Kubernetes,其中会用到Ceph分布式文件存储系统,因此着手搭建测试了一把。为了简单方便,这里依然是基于Docker部署,极大地简化了部署配置的难度。
Ceph是一种为优秀的性能、可靠性和可扩展性而设计的统一的、分布式文件系统。
现在,Ceph已经被集成在主线 Linux 内核中,但只是被标识为实验性的。在这种状态下的文件系统对测试是有用的,但是对生产环境没有做好准备。但是考虑到Ceph 加入到 Linux 内核的行列,不久的将来,它应该就能用于解决海量存储的需要了。
一些开源的云计算项目已经开始支持Ceph,事实上Ceph是目前OpenStack生态系统中呼声最高的开源存储解决方案。这些项目都支持通过libvirt调用Ceph作为块设备进行读写访问。
展开索引
一、环境准备
文中涉及的IP的角色属性清单:
名称 | 服务器IP | 角色 | 备注 |
Ceph测试用集群 | 192.168.1.100 | MON/OSD/RBD/MDS/MGR/RGW | 系统版本:Centos7.2硬件配置: CPU:24核 内存:64GB 硬盘:2TBx11 SATA 网卡:10G全双工 |
192.168.1.101 | MON/OSD/RBD/MDS/MGR/RGW | ||
192.168.1.102 | MON/OSD/RBD/MDS/MGR/RGW |
在3台服务器进行如下初始化:
1、配置hosts
# 定义IP与节点,重要!三台都要设置! vim /etc/hosts 192.168.1.100 ceph1 192.168.1.101 ceph2 192.168.1.102 ceph3
2、建立SSH免密连接
只用在192.168.1.100(ceph1)上执行:
ssh-keygen ssh-copy-id ceph2 ssh-copy-id ceph3
3、磁盘初始化
提示:本文实验服务器环境有11块盘,实际部署时请根据服务器实际情况对下文代码进行调整。
①、格式化
ceph推荐使用XFS格式,这里服务器有11块盘(/dev/sdb~/dev/sdl,不含系统盘),这里循环格式化(格式化之前注意有没有重要数据!):
# 在三台节点上都执行一遍 for i in b c d e f g h i j k l;do mkfs.xfs -f /dev/sd${i}1; done
②、磁盘挂载
为每块磁盘 创建一个挂载点文件夹(/data1~/data11):
# 在三台节点上都执行一遍 mkdir -p /data{1..11}
在/etc/fstab追加如下内容:
# 在三台节点上都执行一遍 vim /etc/fstab /dev/sdb1 /data1 xfs defaults 0 0 /dev/sdc1 /data2 xfs defaults 0 0 /dev/sdd1 /data3 xfs defaults 0 0 /dev/sde1 /data4 xfs defaults 0 0 /dev/sdf1 /data5 xfs defaults 0 0 /dev/sdg1 /data6 xfs defaults 0 0 /dev/sdh1 /data7 xfs defaults 0 0 /dev/sdi1 /data8 xfs defaults 0 0 /dev/sdj1 /data9 xfs defaults 0 0 /dev/sdk1 /data10 xfs defaults 0 0 /dev/sdl1 /data11 xfs defaults 0 0
最后执行mount -a挂载,使用df -h查看挂载情况:
# 显示的效果如下 mount -a /dev/sdb1 1.9T 221M 1.9T 1% /data1 /dev/sdc1 1.9T 213M 1.9T 1% /data2 /dev/sdd1 1.9T 209M 1.9T 1% /data3 /dev/sde1 1.9T 221M 1.9T 1% /data4 /dev/sdf1 1.9T 213M 1.9T 1% /data5 /dev/sdg1 1.9T 213M 1.9T 1% /data6 /dev/sdh1 1.9T 213M 1.9T 1% /data7 /dev/sdi1 1.9T 213M 1.9T 1% /data8 /dev/sdj1 1.9T 214M 1.9T 1% /data9 /dev/sdk1 1.9T 214M 1.9T 1% /data10 /dev/sdl1 1.9T 226M 1.9T 1% /data11
4、安装docker
可自行搞定,也可以如下使用yum安装:
yum install -y docker systemctl enable docker systemctl start docker
更多docker安装教程请参见:
- Docker中文文档(十五):在Red Hat Enterprise Linux(RHEL)系统上安装Docker
- Docker中文文档(十六):在CentOS系统上安装Docker
- Docker中文文档(十七):在Debian系统上安装Docker
- 树莓派Raspberry Pi简单安装Docker教程
5、拉取ceph镜像
这里用到了dockerhub上最流行的ceph/daemon镜像:
docker pull ceph/daemon:latest
6、创建目录
mkdir /data/ceph/{admin,etc,lib,logs} #docker内用户id是167,这里进行授权 chown -R 167:167 /data/ceph/
7、内核优化
#调整内核参数 vim /etc/sysctl.conf kernel.pid_max=4194303 vm.swappiness = 0 #激活调整的参数 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/sd[x]/queue/scheduler echo "noop" > /sys/block/sd[x]/queue/scheduler
8、其他配置
把容器内的ceph命令alias到本地,方便使用,其他ceph相关命令也可以参考添加:
echo 'alias ceph="docker exec mon ceph"' >> /etc/profile source /etc/profile
二、部署ceph
提示:以下操作均在192.168.1.100(ceph1)上进行。
1、编写脚本
vim /data/ceph/admin/start_mon.sh
#!/bin/bash docker run -d --net=host \ --name=mon \ --restart=always \ -v /etc/localtime:/etc/localtime \ -v /data/ceph/etc:/etc/ceph \ -v /data/ceph/lib:/var/lib/ceph \ -v /data/ceph/logs:/var/log/ceph \ -e MON_IP=192.168.1.100,192.168.1.101,192.168.1.102 \ -e CEPH_PUBLIC_NETWORK=192.168.1.0/24 \ ceph/daemon:latest mon
提示:Monitor节点这里有个很关键的配置:MON_IP和CEPH_PUBLIC_NETWORK要写全,比如本文有3台服务器,那么MAN_IP需要写上3个IP,而且如果IP跨网段,那么CEPH_PUBLIC_NETWORK必须写上所有网段,否则就会像网上大部分已有教程一样,只指定一个IP和一个网段是无法启动的!
vim /data/ceph/admin/start_osd.sh
#!/bin/bash # 这里表示有11个分区,及从data1-data11,请根据实际情况修改: for i in {1..11};do docker ps | grep -w osd_data${i} && continue docker ps -a | grep -w osd_data${i} && docker rm -f osd_data${i} docker run -d \ --name=osd_data${i} \ --net=host \ --restart=always \ --privileged=true \ --pid=host \ -v /etc/localtime:/etc/localtime \ -v /data/ceph/etc:/etc/ceph \ -v /data/ceph/lib:/var/lib/ceph \ -v /data/ceph/logs:/var/log/ceph \ -v /data${i}/osd:/var/lib/ceph/osd \ ceph/deamon:latest osd_directory done
vim /data/ceph/admin/start_mds.sh
#!/bin/bash docker run -d \ --net=host \ --name=mds \ --restart=always \ --privileged=true \ -v /etc/localtime:/etc/localtime \ -v /data/ceph/etc:/etc/ceph \ -v /data/ceph/lib/:/var/lib/ceph/ \ -v /data/ceph/logs/:/var/log/ceph/ \ -e CEPHFS_CREATE=0 \ #0表示不自动创建文件系统(推荐),1表示自动创建 -e CEPHFS_METADATA_POOL_PG=512 \ -e CEPHFS_DATA_POOL_PG=512 \ ceph/daemon:latest mds
vim /data/ceph/admin/start_mgr.sh
#!/bin/bash docker run -d --net=host \ --name=mgr \ --restart=always \ --privileged=true \ -v /etc/localtime:/etc/localtime \ -v /data/ceph/etc:/etc/ceph \ -v /data/ceph/lib:/var/lib/ceph \ -v /data/ceph/logs:/var/log/ceph \ ceph/daemon:latest mgr
vim /data/ceph/admin/start_rgw.sh
#!/bin/bash docker run -d \ --net=host \ --name=rgw \ --restart=always \ --privileged=true \ -v /etc/localtime:/etc/localtime \ -v /data/ceph/etc:/etc/ceph \ -v /data/ceph/lib:/var/lib/ceph \ -v /data/ceph/logs:/var/log/ceph \ ceph/daemon:latest rgw
vim /data/ceph/admin/start_rdb.sh
#!/bin/bash docker run -d \ --net=host \ --name=rbd \ --restart=always \ --privileged=true \ -v /etc/localtime:/etc/localtime \ -v /data/ceph/etc:/etc/ceph \ -v /data/ceph/lib:/var/lib/ceph \ -v /data/ceph/logs:/var/log/ceph \ ceph/daemon:latest rbd_mirror
2、启动mon
①、在192.168.1.100(ceph1)上运行start_mon.sh,成功启动后会生成配置数据。接着ceph主配置文件,在追加如下内容:
vim /data/ceph/etc/ceph.conf # 容忍更多的时钟误差 mon clock drift allowed = 2 mon clock drift warn backoff = 30 # 允许删除pool mon_allow_pool_delete = true [mgr] # 开启WEB仪表盘 mgr modules = dashboard
②、拷贝所有数据(已包含脚本)到另外2台服务器:
scp -r /data/ceph ceph2:/data/ scp -r /data/ceph ceph3:/data/
③、通过远程ssh,在ceph2 和ceph3上依次启动mon:
ssh ceph2 bash /data/ceph/admin/start_mon.sh ssh ceph3 bash /data/ceph/admin/start_mon.sh
④、查看集群状态
ceph -s
如果能够看到ceph2和ceph3则表示集群创建成功,此时应该是HEALTH_WARN状态,因为还没有创建osd。
3、启动OSD
虽然ceph/daemon这个docker镜像支持一个镜像来启动多个osd,映射到多块分区,但是为了方便管理,我们需要为每一块磁盘创建一个osd。
在3台服务器上依次执行start_osd.sh脚本:
ssh ceph1 bash /data/ceph/admin/start_osd.sh ssh ceph2 bash /data/ceph/admin/start_osd.sh ssh ceph3 bash /data/ceph/admin/start_osd.sh
全部osd都启动后,稍等片刻后执行ceph -s查看状态,应该可以看到多了如下信息(总共33块盘,33个OSD节点):
osd: 33 osds: 33 up, 33 in (33个osd,启动33,注册33)
4、启动MDS
ssh ceph1 bash /data/ceph/admin/start_osd.sh ssh ceph2 bash /data/ceph/admin/start_osd.sh ssh ceph2 bash /data/ceph/admin/start_osd.sh
5、创建文件系统
# 创建data pool ceph osd pool create cephfs_data 512 512 # 创建 metadata pool ceph osd pool create cephfs_metadata 512 512 # 创建 cephfs ceph fs new iyuwnei cephfs_metadata cephfs_data # 查看信息 ceph fs ls name: iyunwei, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
6、启动MGR
MGR是ceph自带的仪表盘监控,可以在一台服务器上单点启动也可以多点启动实现多活:
ssh ceph1 bash /data/ceph/admin/start_mgr.sh ssh ceph2 bash /data/ceph/admin/start_mgr.sh ssh ceph3 bash /data/ceph/admin/start_mgr.sh
启动后,在ceph1节点上执行如下命令激活仪表盘:
ceph mgr module enable dashboard ceph config-key put mgr/dashboard/server_addr 0.0.0.0 ceph config-key put mgr/dashboard/server_port 7000 #指定为7000端口,这里可以自定义修改
启动成功后,通过浏览器访问http://192.168.1.100:7000即可看到如下仪表盘:
提示:如果这里使用多节点mgr,可以在前面套一层nginx代理即可。关于更多mgr的配置可以参考的官方文档:http://docs.ceph.com/docs/master/mgr/dashboard
https://ceph.com/planet/ceph-luminous-%E6%96%B0%E5%8A%9F%E8%83%BD%E4%B9%8B%E5%86%85%E7%BD%AEdashboard/
7、启动其他组件
①、启动RGW
ssh ceph3 bash /data/ceph/admin/start_rgw.sh ssh ceph1 bash /data/ceph/admin/start_rgw.sh ssh ceph2 bash /data/ceph/admin/start_rgw.sh
②、启动RBD
ssh ceph3 bash /data/ceph/admin/start_rbd.sh ssh ceph1 bash /data/ceph/admin/start_rbd.sh ssh ceph2 bash /data/ceph/admin/start_rbd.sh
8、最终状态
①、docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b301b60b362f ceph/daemon:latest "/entrypoint.sh rgw" 2 weeks ago Up 2 weeks rgw 15fea1a996bd ceph/daemon:latest "/entrypoint.sh mgr" 2 weeks ago Up 2 weeks mgr 00896fe89924 ceph/daemon:latest "/entrypoint.sh rbd_m" 2 weeks ago Up 2 weeks rbd d5e9430a6ea1 ceph/daemon:latest "/entrypoint.sh mds" 2 weeks ago Up 2 weeks mds 05fc2ee09c42 ceph/daemon:latest "/entrypoint.sh osd_d" 2 weeks ago Up 2 weeks osd_data11 9de8cc2728cf ceph/daemon:latest "/entrypoint.sh osd_d" 2 weeks ago Up 2 weeks osd_data10 fc0263931fa8 ceph/daemon:latest "/entrypoint.sh osd_d" 2 weeks ago Up 2 weeks osd_data9 05eb72085c60 ceph/daemon:latest "/entrypoint.sh osd_d" 2 weeks ago Up 2 weeks osd_data8 ec94192d0be4 ceph/daemon:latest "/entrypoint.sh osd_d" 2 weeks ago Up 2 weeks osd_data7 506d7b5ee6bb ceph/daemon:latest "/entrypoint.sh osd_d" 2 weeks ago Up 2 weeks osd_data6 6e1a2c0ecccc ceph/daemon:latest "/entrypoint.sh osd_d" 2 weeks ago Up 2 weeks osd_data5 0d62f76624e8 ceph/daemon:latest "/entrypoint.sh osd_d" 2 weeks ago Up 2 weeks osd_data4 c60a502b8b5f ceph/daemon:latest "/entrypoint.sh osd_d" 2 weeks ago Up 2 weeks osd_data3 693b52b8a60d ceph/daemon:latest "/entrypoint.sh osd_d" 2 weeks ago Up 2 weeks osd_data2 1e776d7df07a ceph/daemon:latest "/entrypoint.sh osd_d" 2 weeks ago Up 2 weeks osd_data1 bdc22da7de73 ceph/daemon:latest "/entrypoint.sh mon" 2 weeks ago Up 2 weeks mon
②、ceph -s
cluster: id: 843ea71c-786d-4c6e-b19d-9c20c47982e8 health: HEALTH_OK services: mon: 3 daemons, quorum ceph1,ceph3,ceph2 mgr: ceph1(active), standbys: ceph2, ceph3 mds: iyunwei-1/1/1 up {0=ceph1=up:active}, 2 up:standby osd: 33 osds: 33 up, 33 in rbd-mirror: 3 daemons active rgw: 3 daemons active data: pools: 6 pools, 1056 pgs objects: 2361 objects, 3213 MB usage: 10288 MB used, 61439 GB / 61449 GB avail pgs: 1056 active+clean io: client: 170 B/s rd, 2299 B/s wr, 0 op/s rd, 1 op/s wr
③、ceph mon dump
dumped monmap epoch 3 epoch 3 fsid 843ea71c-786d-4c6e-b19d-9c20c47982e8 last_changed 2018-04-23 14:38:34.095243 created 2018-04-23 14:35:59.641766 0: 192.168.1.100:6789/0 mon.ceph1 1: 192.168.1.101:6789/0 mon.ceph2 2: 192.168.1.102:6789/0 mon.ceph3
三、Cephfs挂载
ceph 目前支持对象存储(RGW)、块存储RDB以及 CephFS 文件系统这 3 种功能。本文主要记录ceph部署,所以这里仅测试下CephFS的简单挂载,对其他2种感兴趣的同学可以自行测试。
1、网络策略
如果公司内部有网络策略限制(比如我这边),那么先要保证挂载的客户端到OSD端口是畅通的。其中,每一个OSD都会启动一个端口,从6789一次递增,即第一个OSD是6789,第二个则是6790。
2、安装ceph-fuse
由于本文使用的最新版的ceph,而公司内部yum源能支持的ceph-fuse版本太低,会导致挂载卡死不成功问题。所以这里推荐使用官方最新rpm包安装:
yum install -y libibverbs gperftools-libs rpm -Uvh ceph-fuse-12.2.4-0.el7.x86_64.rpm
提示:更多版本下载地址:http://mirrors.aliyun.com/ceph/rpm-luminous/el7/x86_64/
3、查看ceph id 和key
这里图简单,就不再创建新用户,直接使用已有的admin用户,所以我们要在ceph节点上查看admin的密钥:
①、ID
上文中的ceph -s或ceph mon dump信息中都有ceph的ID信息,即:
843ea71c-786d-4c6e-b19d-9c20c47982e8
②、KEY
cat etc/ceph.client.admin.keyring
[client.admin] key = AQDOft1a7JulLhAABGhKyP/v/RfeRvfWHWOwoA== auid = 0 caps mds = "allow" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *"
4、创建配置文件
根据上述拿到的ID和KEY,如下创建配置文件:
mkdir /data/ceph vim /data/ceph/cephfs.conf [global] fsid = 843ea71c-786d-4c6e-b19d-9c20c47982e8 mon_host = 192.168.1.100,192.168.1.101,192.168.1.102 [client] client_mountpoint = / vim cephfs.keyring [client.admin] key = AQDOft1a7JulLhAABGhKyP/v/RfeRvfWHWOwoA==
5、启动挂载
test -d /mnt/ceph_ext || mkdir /mnt/ceph_ext ceph-fuse /mnt/ceph_ext -n client.admin -k /data/ceph/cephfs.keyring -c /data/ceph/cephfs.conf
6、测试读写速度
这里用dd简单测试下,数值仅供参考。
# 测试写入 [andyx-net:/mnt/ceph_ext/backup]# cd /mnt/ceph_ext [andyx-net:/mnt/ceph_ext/backup]# dd if=/dev/zero of=test bs=1M count=1000 1000+0 records in 1000+0 records out 1048576000 bytes (1.0 GB) copied, 5.15503 s, 203 MB/s # 测试读取 [andyx-net:/mnt/ceph_ext/backup]# cd /mnt/ceph_ext [andyx-net:/mnt/ceph_ext/backup]# dd if=test of=test2 bs=1M count=1000 1000+0 records in 1000+0 records out 1048576000 bytes (1.0 GB) copied, 8.69913 s, 121 MB/s # 测试读写 [andyx-net:/mnt/ceph_ext/backup]# cd /mnt/ceph_ext [andyx-net:/mnt/ceph_ext/backup]# dd if=test of=test2 bs=1M count=1000 1000+0 records in 1000+0 records out 1048576000 bytes (1.0 GB) copied, 5.43514 s, 193 MB/s
四、本文小结
本文分享了基于Docker快速拉起了一个ceph集群,并对cephfs文件系统做了简单的挂载测试。由于篇幅有限,文章未分享ceph的对象存储和块存储,也没有做针对性的优化和更专业的测试(因为我也是新手)。希望对初次接触ceph,想快速入门的同学有所帮助!
(END)
文章来自“张戈的博客”,作者“Jager”:https://zhang.ge/5136.html
若需要帮助,请点击以上原文链接联系原作者。