文章目录
- 1.RGW对象存储高可用集群架构
- 1.1.环境规划
- 1.2.高可用集群架构图
- 2.部署RGW对象存储高可用集群
- 2.1.在所有的Ceph节点中部署RGW
- 2.2.部署Haproxy负载均衡服务
- 2.3.配置Haproxy负载均衡三个节点中的RGW
- 2.4.配置Keepalived实现RGW高可用集群
- 2.5.启动Keepalived并观察VIP地址
- 2.6.使用高可用地址访问RGW对象存储服务
- 3.配置S3以及Swift客户端连接RGW的高可用地址
- 3.1.配置S3客户端连接RGW对象存储的地址
- 3.2.配置Swift客户端连接RGW对象存储的地址
- 4.RGW高可用集群测试
1.RGW对象存储高可用集群架构
在前面的文章中,讲解了单节点RadosGW的部署与使用,但是随着业务量的不断扩展,单节点很容易产生瓶颈,为了能承载更多的并发使用,需要为RGW对象存储组件部署高可用集群。
1.1.环境规划
由于服务器数量有限,因此将Haproxy和Keepalived组件都部署在了Ceph节点中,如果条件可以,可以将这两个服务单独部署在两台服务器中。
主机名 | IP地址 | 端口号 | 软件 | VIP地址 |
---|---|---|---|---|
ceph-node-1 | 192.168.20.20 | Haproxy:80 RGW:7480 | keepalived+Haproxy+RGW | 192.168.20.30:80 |
ceph-node-2 | 192.168.20.21 | Haproxy:80 RGW:7480 | keepalived+Haproxy+RGW | |
ceph-node-3 | 192.168.20.22 | Haproxy:80 RGW:7480 | RGW |
1.2.高可用集群架构图
我们分布在Ceph的每一个节点中都部署一个RGW组件,一共部署三个RGW组件,通过Haproxy组件将三个RGW组件形成负载均衡,为了实现高可用机制,Haproxy会部署两套,每一套都会去负载均衡三个RGW组件,最后将两个Haproxy配置成高可用集群,提供一个虚拟IP,客户端直接通过这个虚拟IP来访问RGW对象存储。
2.部署RGW对象存储高可用集群
两个keepalive—>两个Haproxy—>三个RGW
2.1.在所有的Ceph节点中部署RGW
1)在所有节点中安装radosgw组件
[root@ceph-node-1 ~]# yum -y install ceph-radosgw
[root@ceph-node-2 ~]# yum -y install ceph-radosgw
[root@ceph-node-3 ~]# yum -y install ceph-radosgw
2)使用ceph-deploy工具配置各个节点中的radosgw组件
端口号无需修改,使用默认的7480就行,因为在后面还会去配置Haproxy充当负载均衡
[root@ceph-node-1 ~]# cd /data/ceph-deploy/
[root@ceph-node-1 ceph-deploy]# ceph-deploy --overwrite-conf rgw create ceph-node-1 ceph-node-2 ceph-node-3
3)重启每个节点的radosgw组件
[root@ceph-node-1 ceph-deploy]# for i in {1..3}; do ssh ceph-node-${i} "systemctl restart ceph-radosgw.target" ; done
4)查看每个节点启动的端口号
[root@ceph-node-1 ceph-deploy]# for i in {1..3}; do ssh ceph-node-${i} "echo ceph-node-${i}: && netstat -lnpt | grep radosgw" ; done
ceph-node-1:
tcp 0 0 0.0.0.0:7480 0.0.0.0:* LISTEN 79136/radosgw
tcp6 0 0 :::7480 :::* LISTEN 79136/radosgw
ceph-node-2:
tcp 0 0 0.0.0.0:7480 0.0.0.0:* LISTEN 45456/radosgw
tcp6 0 0 :::7480 :::* LISTEN 45456/radosgw
ceph-node-3:
tcp 0 0 0.0.0.0:7480 0.0.0.0:* LISTEN 46969/radosgw
tcp6 0 0 :::7480 :::* LISTEN 46969/radosgw
5)测试rgw是否可用
curl 127.0.0.1:7480
<?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>
2.2.部署Haproxy负载均衡服务
在ceph-node-1和ceph-node-2节点中部署,部署两套Haproxy负载均衡,最后由Keepalived形成高可用集群。
直接使用yum部署即可。
[root@ceph-node-1 ~]# yum -y install haproxy
2.3.配置Haproxy负载均衡三个节点中的RGW
分别将两个Haproxy配置负载均衡三个节点的RGW组件。
1)编写配置文件
[root@ceph-node-1 ~]# cat /etc/haproxy/haproxy.cfg
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 main *:80 #端口号
mode http #协议使用http
default_backend rgw_cluster #关联资源池
backend rgw_cluster #定义资源池
balance roundrobin #调度算法使用轮询
mode http #类型http
server ceph-node-1 192.168.20.20:7480 check #各节点的地址
server ceph-node-2 192.168.20.21:7480 check
server ceph-node-3 192.168.20.22:7480 check
2)将配置文件拷贝至另外的Haproxy中
[root@ceph-node-1 ~]# scp /etc/haproxy/haproxy.cfg root@192.168.20.21:/etc/haproxy/
haproxy.cfg
3)重启所有的Haproxy服务
[root@ceph-node-1 ~]# systemctl start haproxy && systemctl enable haproxy
[root@ceph-node-2 ~]# systemctl start haproxy && systemctl enable haproxy
4)测试是否可以访问到RGW
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>
2.4.配置Keepalived实现RGW高可用集群
1)在两台服务器中部署Keepalived
[root@ceph-node-1 ~]# yum -y install keepalived
[root@ceph-node-2 ~]# yum -y install keepalived
2)将ceph-node-1节点的Keepalived配置成Master节点
ceph-node-1节点设置为主Keepalived,当主keepalived挂掉之后,再由ceph-node-2节点的备用keepalived升级为主节点。
[root@ceph-node-2 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER
}
vrrp_script chk_haproxy { #健康检查脚本,检测到haproxy异常时优先级降低20,降低20后优先级就会比备用节点低,从而使备用节点升级为主节点
script "/etc/keepalived/chk_haproxy.sh" #当执行脚本的返回状态码大于0则将优先级降低20
interval 2 #检查间隔
weight -20 #优先级降低20
}
vrrp_instance RGW_CLUSTER {
state MASTER #状态为MASTER
interface ens192 #将VIP绑定在哪块网卡上
virtual_router_id 51 #实例ID,集群所有节点都要保持一致
priority 100 #优先级,255最高
advert_int 1 #指定VRRP心跳包通告间隔时间,默认1秒
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.20.30/23 #定义VIP地址
}
track_script {
chk_haproxy #健康检查脚本
}
}
3)将ceph-node-2节点的Keepalived配置成BACKUP节点
ceph-node-2节点设置为备用Keepalived,当主keepalived挂掉之后,由ceph-node-2节点的备用keepalived升级为主节点。
[root@ceph-node-2 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER
}
vrrp_script chk_haproxy { #健康检查脚本,检测到haproxy异常时权重降低20
script "/etc/keepalived/chk_haproxy.sh"
interval 2
weight -20
}
vrrp_instance RGW_CLUSTER {
state BACKUP #状态为BACKUP
interface ens192 #将VIP绑定在哪块网卡上
virtual_router_id 51 #实例ID,集群所有节点都要保持一致
priority 90 #优先级要比主节点低
advert_int 1 #指定VRRP心跳包通告间隔时间,默认1秒
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.20.30/23 #定义VIP地址
}
track_script {
chk_haproxy #健康检查脚本
}
}
3)检测Haproxy组件运行状态的脚本
vim /etc/keepalived/chk_haproxy.sh
haproxy_process_count=`ps aux | grep haproxy.cfg | grep -v grep | wc -l`
if [ $haproxy_process_count -eq 0 ];then
exit 1
else
exit 0
fi
chmod a+x /etc/keepalived/chk_haproxy.sh
2.5.启动Keepalived并观察VIP地址
1)启动Keepalived服务
[root@ceph-node-1 ~]# systemctl start keepalived && systemctl enable keepalived
[root@ceph-node-2 ~]# systemctl start keepalived && systemctl enable keepalived
2)观察Keepalived生成的虚拟地址
ceph-node-1节点是Keepalived的主节点,虚拟地址也会生成在这个节点中,通过这个虚拟地址来充当服务的高可用入口。
[root@ceph-node-1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:b7:aa:0c brd ff:ff:ff:ff:ff:ff
inet 192.168.20.20/23 brd 192.168.21.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet 192.168.20.30/23 scope global secondary ens192
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:feb7:aa0c/64 scope link
2.6.使用高可用地址访问RGW对象存储服务
浏览器访问虚拟IP测试能否访问到RGW对象存储服务。
3.配置S3以及Swift客户端连接RGW的高可用地址
RGW高可用集群已经搭建完成,下面配置S3以及Swift这两个客户端连接RGW的地址,修改成RGW的高可用地址。
3.1.配置S3客户端连接RGW对象存储的地址
1.在s3的配置文件中修改连接RGW对象存储的地址
[root@ceph-node-1 ~]# vim .s3cfg
host_base = 192.168.20.30
host_bucket = 192.168.20.30/%(bucket)s
2.验证是否可用正常使用RGW对象存储
#查看对象存储中的Bucket
[root@ceph-node-1 ~]# s3cmd ls
2022-04-03 01:51 s3://cephrgw-s3-bucket
2022-04-03 02:43 s3://s3cmd-test-data
#创建一个Bucket
[root@ceph-node-1 ~]# s3cmd mb s3://test-bucket-1
Bucket 's3://test-bucket-1/' created
#删除Bucket
[root@ceph-node-1 ~]# s3cmd rb s3://test-bucket-1
Bucket 's3://test-bucket-1/' removed
3.2.配置Swift客户端连接RGW对象存储的地址
1.在swift的环境变量中修改连接RGW对象存储的地址
[root@ceph-node-1 ~]# vim /etc/profile
export ST_AUTH=http://192.168.20.30/auth
export ST_USER=cephrgw-swift-user:swift
export ST_KEY=QrRc6zzMaDj0ayxwuaFsxnOT8kRYZxfuGBqkQLDu
2.验证是否可用正常使用RGW对象存储
#查看对象存储中的Bucket
[root@ceph-node-1 ~]# swift list
bucket-2
#创建一个Bucket
[root@ceph-node-1 ~]# swift post test-bucket
#删除Bucket
[root@ceph-node-1 ~]# swift delete test-bucket
test-bucket
4.RGW高可用集群测试
我们停掉一个节点的Haproxy来测试RGW集群的高可用性,观察当一个节点的Haproxy挂掉后,Keepalived是否会自动切换主备模式,让正常的Haproxy来提供服务。
1)停掉ceph-node-1节点的Haproxy服务。
[root@ceph-node-1 ~]# systemctl stop haproxy
停掉ceph-node-1节点的Haproxy服务后,Keepalived随之就检测到Haproxy的服务异常了,并且自动将优先级下降20,原本主节点keepalived的优先级为100,备用节点的keepalived优先级的为90,主节点下降20后,优先级变成了80,优先级比备用节点低,此时备用节点就认为自己是主节点,从而抢占了主节点的VIP地址,并将自己升级为了主节点,此时的主节点也知道优先级比它低,故而放弃主节点和VIP地址。
这个切换速度是非常快的,用户几乎无感知。
2)观察RGW服务可用继续提供服务,高可用测试通过。
3)当ceph-node-1节点中的Haproxy正常运行后,原本为Master节点的Keepalived会再次增加优先级,故而抢占备用节点上的VIP地址,重新成为集群服务的提供者。