Ceph RGW高可用集群部署

释放双眼,带上耳机,听听看~!

RGW 简介

1647335823899.png

Ceph Object Gateway也称为对象网关 ,RGW支持S2协议和SWIFT协议对外提供对象存储,两者的对象访问方式均以HTTP方式访问。用户的对象经由RGW处理后,会最终存放在后端RADOS系统。

1647332737786.png

  • 对象网关对外提供兼容S3和SWIFT的API
  • 存储网关RGW负责客户端接入
  • RADOS协议实现数据存储(Libradio是Rados提供库,因为RADOS是协议很难直接访问,因此上层的RBD、RGW和CephFs都是通过librados访问的目前提供PHP、Ruby、Java、Python等支持)
  • Monitor 一个Ceph集群需要多个Monitor组成的小集群,它们通过Paxos同步数据,用来保存OSD的元数据
  • OSD 存储数据

RGW对外提供三种基础数据逻辑实体:

  • 用户
  • 存储桶
  • 对象

1.用户

RGW兼容aws s3和OpenStack Switft,用户数据包含:

  • 用户认证信息
  • 访问控制权限信息: 包含操作访问权限和访问控制列表ACL
  • 用户配额信息: 防止某些用户占用过多内存空间,根据用户实际情况分配存储空间

2.存储桶(bucket)

存储桶是对象的容器,为了方便管理和操作具有相同属性的一类对象而引起的一级管理单元
存储桶信息包含:

  • 基础信息 (保存在对应RADOS对象的数据部分) RGW关注的信息,包含bucket配额信息 (最大对象数目和对大对象总和),bucket placement rule,bucket中搜索对象数目等等
  • 扩展信息: (保存在对应RADOS对象的扩展属性)对RGW透明的一些信息,如用户自定义的元数据信息

1647334711353.png

3.对象

RGW中的应用对象对应RADOS对象。应用对象上传分整体上传和分段上传,不同的方式应用对象对应RADOS对象的方式不同

  • rgw_max_chunk_size: 分块大小,RGW下发至RADOS集群的单个IO大小
  • rgw_obj_stripe_size: 条带大小
  • class RGWObjManifest: 管理应用对象和RADOS对象的对应关系

3.1 整体上传

  • 应用对象大小小于等于分块大小: 用户上传的对象只对应一个RADOS对象,该RADOS对象以应用对象名称命名,应用对象元数据也保存在该RADOS对象的扩展属性中

  • 应用对象大小小于分块大小: 对应对象被分解一个大小等于分块大小的售对象,多个大小等于条带大小的中间对象,和一个大小小于等于条带大小的尾对象。首对象以应用对象命名,在RGW中将该对象称为head_obj,该对象的数据部分保存了应用对象前rgw_max_chunk_size字节的数据,扩展属性部分保存了应用对象的元数据信息和manifest信息。

1647335483197.png

3.2 分段上传

RGW依照条带大小将应用对象的每一个分段分成多个RADOS对象,每个分段的第一个 RADOS 对象名称为:

  • multipart” + “用户上传对象名称” + “分段上传ID” + “分段编号”
    其余对象的名称为:
  • shadow” + “用户上传对象名称” + “分段上传ID” + “分段编号” +
 “_” + “条带编号”

当所有的分段上传结束后,RGW 会从 data_extra_pool 中的分段上传临时对象中读取各个分段信息,主要是各分段的 manifest 信息,组成一个 manifest;然后生成一个新的 RADOS 对象,即 head obj,用来保存分段上传的应用对象的元数据信息和各分段的manifest。

1647335544949.png

RGW 高可用架构

1647330779179.png

RGW 添加节点及配置文件修改

Ceph集群信息

IP 服务 主机名 备注
192.168.31.20 mon、mgr、mds(主)、osd、rgw ceph-01 rgw端口都修改为81
192.168.31.21 mon、mgr、mds、osd、rgw添加rgw节点 ceph-02 rgw添加节点
192.168.31.22 mon、mgr(主)、mds、osd ceph-03  
192.168.31.23 osd ceph-04  
192.168.31.120     VIP

Ceph基础知识和基础架构

目前我们ceph集群中rgw节点只有一个,只有一个的ceph-01节点。现在我们需要添加一个ceph-02节点,来配合ceph-01添加高可用。

[root@ceph-01 ~]# ceph -s
  cluster:
    id:     c8ae7537-8693-40df-8943-733f82049642
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 37h)
    mgr: ceph-03(active, since 3d), standbys: ceph-02, ceph-01
    mds: cephfs-abcdocker:1 {0=ceph-01=up:active} 2 up:standby
    osd: 4 osds: 4 up (since 3d), 4 in (since 3w)
    rgw: 1 daemon active (ceph-01)

  task status:

  data:
    pools:   9 pools, 384 pgs
    objects: 3.16k objects, 11 GiB
    usage:   36 GiB used, 144 GiB / 180 GiB avail
    pgs:     384 active+clean

我们ceph-01已经有rgw,目前只需要在ceph-02上安装rgw,并且在ceph-01和ceph-02节点同时安装keeplived和haproxy或者nginx进行代理rgw

在ceph-02上安装rgw

#我们ceph-01安装了ceph-deploy,所以需要进入到ceph-deploy节点进行安装配置
[root@ceph-01 ~]# cd ceph-deploy

#通过ceph-deploy创建rgw节点,这里实际上可以参考创建集群的步骤
[root@ceph-01 ceph-deploy]# ceph-deploy rgw create ceph-02
#ceph-02为hostname ceph-02节点

通过ceph -s已经可以看到rgw节点

[root@ceph-01 ceph-deploy]# ceph -s
  cluster:
    id:     c8ae7537-8693-40df-8943-733f82049642
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 11h)
    mgr: ceph-03(active, since 4d), standbys: ceph-02, ceph-01
    mds: cephfs-abcdocker:1 {0=ceph-01=up:active} 2 up:standby
    osd: 4 osds: 4 up (since 4d), 4 in (since 3w)
    rgw: 2 daemons active (ceph-01, ceph-02)    #ceph-02已经添加完毕

  task status:

  data:
    pools:   9 pools, 384 pgs
    objects: 3.16k objects, 11 GiB
    usage:   36 GiB used, 144 GiB / 180 GiB avail
    pgs:     384 active+clean

  io:
    client:   3.2 KiB/s rd, 0 B/s wr, 3 op/s rd, 2 op/s wr

目前我们可以看到rgw默认端口为7480,下面我们需要修改一下默认端口号,将7480修改为81端口

1647412838796.png

修改ceph-01 ceph-02端口号

[root@ceph-01 ceph-deploy]# vim /root/ceph-deploy/ceph.conf  #修改ceph.conf,直接修改ceph-deploy目录下的文件,后面可以通过命令直接分发到各个节点
[client.rgw.ceph-01]
rgw_frontends = "civetweb port=81"

[client.rgw.ceph-02]
rgw_frontends = "civetweb port=81"

#将ceph-01复制为ceph-02,端口都修改为81

1647413758957.png

修改完毕后push config文件到ceph-01 ceph-02节点

[root@ceph-01 ceph-deploy]# ceph-deploy --overwrite-conf config push ceph-01 ceph-02

#接下来手动重启radosgw服务
#ceph-01节点和ceph-02节点都需要手动重启
[root@ceph-01 ceph-deploy]# systemctl restart ceph-radosgw.target
[root@ceph-01 ceph-deploy]# lsof -i:81
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
radosgw 12755 ceph   45u  IPv4 1308899      0t0  TCP *:81 (LISTEN)

#ceph-02节点手动重启
[root@ceph-01 ceph-deploy]# ssh ceph-02
Last login: Wed Feb 23 15:30:58 2022 from ceph-01
[root@ceph-02 ~]# systemctl restart ceph-radosgw.target
[root@ceph-02 ~]# lsof -i:81
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
radosgw 21845 ceph   45u  IPv4 823286      0t0  TCP *:81 (LISTEN)
[root@ceph-02 ~]# curl 127.0.0.01:81
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult

Keeplived搭建

在ceph-01和ceph-02节点上安装keeplived

[root@ceph-01 ~]# yum install -y keepalived
[root@ceph-02 ~]# yum install -y keepalived

备份ceph-01和ceph-02默认配置文件

[root@ceph-01 ~]# mv /etc/keepalived/keepalived.conf{,.bak_2022-03-16}
[root@ceph-02 ~]# mv /etc/keepalived/keepalived.conf{,.bak_2022-03-16}

修改ceph-01配置

VIP:192.168.31.120
network:eth0

cat >>/etc/keepalived/keepalived.conf<<EOF

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight -2

}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.31.120
    }
    track_script {
    chk_haproxy
    }
}
EOF

修改ceph-02配置

cat >>/etc/keepalived/keepalived.conf<<EOF
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight -2

}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.31.120
    }
    track_script {
    chk_haproxy
    }
}
EOF

在ceph-01和ceph-02执行启动命令

systemctl enable --now keepalived

启动完成测试keepalived

[root@ceph-01 ~]# ping 192.168.31.120
PING 192.168.31.120 (192.168.31.120) 56(84) bytes of data.
64 bytes from 192.168.31.120: icmp_seq=1 ttl=64 time=0.138 ms
64 bytes from 192.168.31.120: icmp_seq=2 ttl=64 time=0.134 ms
64 bytes from 192.168.31.120: icmp_seq=3 ttl=64 time=0.123 ms
^C
--- 192.168.31.120 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.123/0.131/0.138/0.014 ms
[root@ceph-01 ~]#

Haproxy 代理RGW

接下来安装haproxy,在ceph-01和ceph-02上执行

 yum install -y haproxy

覆盖ceph-01 和ceph-02配置
具体配置参数根据需求修改,需要修改ip和hostname

cat >/etc/haproxy/haproxy.cfg<<EOF
global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
frontend  http_web *:80
    mode http
    default_backend          rgw
backend rgw
    balance     roundrobin
    mode http
    server  ceph-01 192.168.31.20:81
    server  ceph-02 192.168.31.21:81
EOF

重启ceph-01和ceph-02上的haproxy

systemctl enable --now haproxy

查看服务

[root@ceph-01 ~]# lsof -i:80
COMMAND   PID    USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
haproxy 16030 haproxy    5u  IPv4 1330793      0t0  TCP *:http (LISTEN)

[root@ceph-01 ~]# curl 127.0.0.1
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult>

目前haproxy已经配置完成

[root@ceph-01 ~]# curl 192.168.31.120   #curl vip地址测试
<?xml version="1.0" encoding="UTF-8"?><ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><Owner><ID>anonymous</ID><DisplayName></DisplayName></Owner><Buckets></Buckets></ListAllMyBucketsResult

RGW客户端修改

rgw客户端创建bucket可以参考下面文章

Ceph-deploy 快速部署Ceph集群

之前我们使用的是s3cmd命令,接下来修改rgw地址

sed -i 's/192.168.31.10/192.168.31.120/g' /root/.s3cfg

执行查看bucket

eph-01 ~]#  sed -i 's/192.168.31.20/192.168.31.120/g' /root/.s3cfg
[root@ceph-01 ~]# vim .s3cfg 
[root@ceph-01 ~]# s3cmd ls 
2022-01-27 07:31  s3://ceph-s3-bucket
2022-01-27 10:07  s3://s3cmd-abcdocker-demo

给TA买糖
共{{data.count}}人
人已赞赏
Ceph

Ceph RBD 备份与恢复

2022-3-14 15:02:53

CephKubernetes

Kubernetes(k8s) 1.24 csi-ceph rbd使用手册

2022-6-3 18:48:14

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索