跳到主要内容

部署Ceph对象存储集群服务

悦库网盘集群化由悦库服务集群、MGR(MySQL Group Replication)集群、Ceph存储集群 以及虚拟路由器 4个子模块组成,本文指导用户部署Ceph对象存储集群,图中红线框所示。

v2-f64bf97be5accba57b1d8e40d00ae243_720w

实现方案

使用Ceph分布式存储系统,提供高性能、高可用和高可扩展性的S3服务;通过Keepalived + LVS实现S3服务的负载均衡和高可用。

本文中,使用如下Ceph组件: 1. Monitor(mon) 用于维护集群状态的映射信息 2. Manager(mgr) 跟踪运行时指标和Ceph集群的当前状态 3. OSD(osd) 用于存储和维护数据 4. Radosgw(rgw) 对象存储的网关服务,提供S3的标准API支持

更多Ceph相关请参阅官方文档

环境准备

主机名IP地址操作系统角色部署模块
node-01192.168.0.201Ubuntu18Ceph集群节点docker、mon、mgr、osd、rgw
node-02192.168.0.202Ubuntu18Ceph集群节点docker、mon、mgr、osd、rgw
node-03192.168.0.203Ubuntu18Ceph集群节点docker、mon、mgr、osd、rgw
lb-01192.168.0.191Ubuntu18虚拟路由节点Keepalived
lb-02192.168.0.192Ubuntu18虚拟路由节点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
  • 重要配置说明:
配置项说明
fsidbc7e5644-d399-42e2-ac99-b8eb5470e360GUID,唯一标识一个Ceph集群,所有集群的节点必需一致
mon host192.168.0.201,192.168.0.202,192.168.0.203集群Monitor节点的IP地址,使用“,”分割
public network192.168.0.0/24供客户端访问的网段
cluster network192.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服务。

相关教程

集群版用户故事

部署高可用、负载均衡的MySQL集群服务

部署悦库服务集群