部署Ceph对象存储集群服务
悦库网盘集群化由悦库服务集群、MGR(MySQL Group Replication)集群、Ceph存储集群 以及虚拟路由器 4个子模块组成,本文指导用户部署Ceph对象存储集群,图中红线框所示。
实现方案
使用Ceph分布式存储系统,提供高性能、高可用和高可扩展性的S3服务;通过Keepalived + LVS实现S3服务的负载均衡和高可用。
本文中,使用如下Ceph组件: 1. Monitor(mon) 用于维护集群状态的映射信息 2. Manager(mgr) 跟踪运行时指标和Ceph集群的当前状态 3. OSD(osd) 用于存储和维护数据 4. Radosgw(rgw) 对象存储的网关服务,提供S3的标准API支持
更多Ceph相关请参阅官方文档
环境准备
主机名 | IP地址 | 操作系统 | 角色 | 部署模块 |
---|---|---|---|---|
node-01 | 192.168.0.201 | Ubuntu18 | Ceph集群节点 | docker、mon、mgr、osd、rgw |
node-02 | 192.168.0.202 | Ubuntu18 | Ceph集群节点 | docker、mon、mgr、osd、rgw |
node-03 | 192.168.0.203 | Ubuntu18 | Ceph集群节点 | docker、mon、mgr、osd、rgw |
lb-01 | 192.168.0.191 | Ubuntu18 | 虚拟路由节点 | Keepalived |
lb-02 | 192.168.0.192 | Ubuntu18 | 虚拟路由节点 | Keepalived |
- 设置主机名
# 在192.168.0.201上执行
hostnamectl set-hostname node-01
# 在192.168.0.202上执行
hostnamectl set-hostname node-02
# 在192.168.0.203上执行
hostnamectl set-hostname node-03
# 在192.168.0.191上执行
hostnamectl set-hostname bl-01
# 在192.168.0.192上执行
hostnamectl set-hostname bl-02
- 部署Docker,并拉取ceph镜像 分别在node-01、node-02和node-03上执行
apt install -y docker.io
docker pull ceph/daemon:latest-octopus
- 部署Keepalived 在bl-01和bl-02上安装Keepalived
apt install -y keepalived
- 准备存储磁盘,并挂载至目录 分别在node-01、node-02和node-03上准备两个磁盘/dev/sdb和/dev/sdc,并挂载至/var/lib/ceph/osd-sdb、/var/lib/ceph/osd-sdc
mkfs.xfs -f /dev/sdb
mkfs.xfs -f /dev/sdc
mkdir -p /var/lib/ceph/osd-sd{b,c}
mount /dev/sdb /var/lib/ceph/osd-sdb
mount /dev/sdc /var/lib/ceph/osd-sdc
部署过程
部署Monitor
- 在node-01上启动Monitor容器
# 创建容器
docker run -d \
--name=mon \
--net=host \
--restart=always \
-v /etc/localtime:/etc/localtime \
-v /opt/ceph/etc:/etc/ceph \
-v /opt/ceph/lib:/var/lib/ceph \
-v /opt/ceph/logs:/var/log/ceph \
-e MON_IP=192.168.0.201 \
-e CEPH_PUBLIC_NETWORK=192.168.0.0/24 \
ceph/daemon:latest-octopus mon
# 禁用不安全认证
docker exec mon ceph config set mon auth_allow_insecure_global_id_reclaim false
- 在node-02和node-03上,启动Monitor节点 修改在node-01的配置文件/opt/ceph/etc/ceph.conf,编辑 /opt/ceph/etc/ceph.conf ,修改mon host 项,追加node-02 和node-03 的IP
mon host = 192.168.0.201,192.168.0.202,192.168.0.203
- 配置文件内容如下:
[global]
fsid = bc7e5644-d399-42e2-ac99-b8eb5470e360
mon initial members = node-01
mon host = 192.168.0.201,192.168.0.202,192.168.0.203
public network = 192.168.0.0/24
cluster network = 192.168.0.0/24
osd journal size = 100
- 重要配置说明:
配置项 | 值 | 说明 |
---|---|---|
fsid | bc7e5644-d399-42e2-ac99-b8eb5470e360 | GUID,唯一标识一个Ceph集群,所有集群的节点必需一致 |
mon host | 192.168.0.201,192.168.0.202,192.168.0.203 | 集群Monitor节点的IP地址,使用“,”分割 |
public network | 192.168.0.0/24 | 供客户端访问的网段 |
cluster network | 192.168.0.0/24 | 集群节点通信的网段 |
- 将node-01的Monitor配置拷贝至node-02和node-03
scp -r /opt/ceph root@node-02:/opt/
scp -r /opt/ceph root@node-03:/opt/
- 在node-02上启动Monitor容器
# 创建容器
docker run -d \
--name=mon \
--net=host \
--restart=always \
-v /etc/localtime:/etc/localtime \
-v /opt/ceph/etc:/etc/ceph \
-v /opt/ceph/lib:/var/lib/ceph \
-v /opt/ceph/logs:/var/log/ceph \
-e MON_IP=192.168.0.202 \
-e CEPH_PUBLIC_NETWORK=192.168.0.0/24 \
ceph/daemon:latest-octopus mon
# 禁用不安全认证
docker exec mon ceph config set mon auth_allow_insecure_global_id_reclaim false
- 在node-03上启动Monitor容器
# 创建容器
docker run -d \
--name=mon \
--net=host \
--restart=always \
-v /etc/localtime:/etc/localtime \
-v /opt/ceph/etc:/etc/ceph \
-v /opt/ceph/lib:/var/lib/ceph \
-v /opt/ceph/logs:/var/log/ceph \
-e MON_IP=192.168.0.203 \
-e CEPH_PUBLIC_NETWORK=192.168.0.0/24 \
ceph/daemon:latest-octopus mon
# 禁用不安全认证
docker exec mon ceph config set mon auth_allow_insecure_global_id_reclaim false
- 验证,查看Monitor集群状态
docker exec mon ceph mon stat
部署Manager
分别在node-01、node-02和node-03上启动Manager容器
docker run -d \
--name=mgr \
--net=host \
--restart=always \
-v /etc/localtime:/etc/localtime \
-v /opt/ceph/etc:/etc/ceph \
-v /opt/ceph/lib:/var/lib/ceph \
-v /opt/ceph/logs:/var/log/ceph \
ceph/daemon:latest-octopus mgr
部署OSD
- 分别在node-01、node-02和node-03上部署OSD容器
- 分别在每个Monitor节点生成osd的密钥环
docker exec mon ceph auth get client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
- 启动osd
# 在目录/var/lib/ceph/osd-sdb上部署osd
docker run -d \
--name=osd-sdb \
--net=host \
--restart=always \
--privileged=true \
--pid=host \
-v /etc/localtime:/etc/localtime \
-v /opt/ceph/etc:/etc/ceph \
-v /opt/ceph/lib:/var/lib/ceph \
-v /opt/ceph/logs:/var/log/ceph \
-v /var/lib/ceph/osd-sdb:/var/lib/ceph/osd \
ceph/daemon:latest-octopus osd_directory
# 在目录/var/lib/ceph/osd-sdc上部署osd
docker run -d \
--name=osd-sdc \
--net=host \
--restart=always \
--privileged=true \
--pid=host \
-v /etc/localtime:/etc/localtime \
-v /opt/ceph/etc:/etc/ceph \
-v /opt/ceph/lib:/var/lib/ceph \
-v /opt/ceph/logs:/var/log/ceph \
-v /var/lib/ceph/osd-sdc:/var/lib/ceph/osd \
ceph/daemon:latest-octopus osd_directory
- 验证
# 查看osd状态
docker exec mon ceph osd stat
docker exec mon ceph osd tree
部署RGW
- 分别在node-01、node-02和node-03上部署radosgw
- 生成rgw的密钥环
docker exec mon ceph auth get client.bootstrap-rgw -o /var/lib/ceph/bootstrap-rgw/ceph.keyring
- 启动rgw容器,默认端口为7480
docker run -d \
--name=rgw \
--net=host \
--restart=always \
-v /etc/localtime:/etc/localtime \
-v /opt/ceph/etc:/etc/ceph \
-v /opt/ceph/lib:/var/lib/ceph \
-v /opt/ceph/logs:/var/log/ceph \
ceph/daemon:latest-octopus rgw
- 配置RGW负载均衡
- 为Ceph集群节点配置VIP转发
- 分别在node-01、node-02和node-03上执行
ifconfig lo:0 192.168.0.200 broadcast 192.168.0.200 netmask 255.255.255.255 up
route add -host 192.168.0.200 dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
- 分别在bl-01、bl-02上,修改/etc/keepalived/keepalived.conf
# 全局配置
global_defs {
router_id LVS_YDISK
}
# 同步组
vrrp_sync_group VG_YDISK {
group {
VI_YDISK
}
}
# 虚拟路由实例配置
vrrp_instance VI_YDISK {
state MASTER
interface enp0s3
virtual_router_id 200
priority 100
virtual_ipaddress {
192.168.0.200
}
}
virtual_server 192.168.0.200 7480 {
delay_loop 5
lb_kind DR
lb_algo rr
protocol TCP
real_server 192.168.0.201 7480 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
real_server 192.168.0.202 7480 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
real_server 192.168.0.203 7480 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
}
- 重启keepalived
systemctl restart keepalived
- 验证
curl http://192.168.0.200:7480
配置对象存储
- 使用命令行进行用户管理
- 创建用户
docker exec mon radosgw-admin user create --uid=ydisk --display-name="悦库"
- 为用户配置管理权限
# 允许ydisk用户操作所有桶
docker exec mon radosgw-admin caps add --uid=ydisk --caps="buckets=*"
- 验证,获取用户的信息
docker exec mon radosgw-admin user info --uid=ydisk
- 使用s3cmd进行桶管理
- 安装命令行工具
# 安装s3cmd工具
apt install s3cmd
# 配置S3
s3cmd --configure
- 创建桶
s3cmd --signature-v2 mb s3://ydisk-bkt
- 配置桶跨域策略
- 编辑cors.xml,填入如下内容
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
<ExposeHeader>ETag</ExposeHeader>
</CORSRule>
</CORSConfiguration>
- 应用cors.xml配置的跨域策略
s3cmd --signature-v2 setcors cors.xml s3://ydisk-bkt
配置STS
- 分别在node-01、node-02和node-03上启用STS配置
- 修改配置文件/opt/ceph/etc/ceph.conf,内容如下:
[client.rgw.node-01]
rgw sts key = HjGkee9IgTyKHlUh
rgw s3 auth use sts = true
配置说明:
- node-01为RGW的主机名
- sts key 为16字符长度的字符串
- 重启容器
docker restart rgw
- 创建用于访问STS的角色for-ydisk-rw
- 创建角色,并配置策略,允许用户承担角色
docker exec mon radosgw-admin role create --role-name=for-ydisk-rw --assume-role-policy-doc=\{\"Version\":\"2012-10-17\",\"Statement\":\[\{\"Effect\":\"Allow\",\"Principal\":\{\"AWS\":\[\"arn:aws:iam:::user/ydisk\"\]\},\"Action\":\[\"sts:AssumeRole\"\]\}\]\}
- 配置策略,对角色赋权
docker exec mon radosgw-admin role-policy put --role-name=for-ydisk-rw --policy-name=policy-ydisk-rw --policy-doc=\{\"Version\":\"2012-10-17\",\"Statement\":\{\"Effect\":\"Allow\",\"Action\":\"s3:*\",\"Resource\":\"arn:aws:s3:::*\"\}\}
- 验证,查看角色列表
docker exec mon radosgw-admin role list docker exec mon radosgw-admin role-procy list --role-name=for-ydisk-rw
验证
- 查看集群状态
docker exec mon ceph -s
- 使用s3cmd,通过虚拟地址
192.168.0.200:7480
访问S3服务。