Ceph RGW + lvs vip导致集群通信问题处理
1. 问题描述
服务 | IP |
---|---|
LVS VIP | 172.26.2.60⁄16 |
rgw 所在osd服务器ip | 172.26.2.52⁄16 |
CEPH public network | 172.26.0.0/16 |
CEPH cluster network | 172.30.0.0/16 |
在lvs + rgw的实践中,rgw 部署在ceph osd 服务器中,lvs 配置过程中需要在RealServer lo接口上设置 VIP,因为VIP 跟public network 是同个网段,也就是说ceph 服务器有两个 172.26.0.0/16网段的IP,一个在lo:0 , 一个在eth0,在通讯的时候,ceph 所有的进程都会使用vip去跟其他服务器的osd通讯,但是因为这是个环回接口,根本无法进行通讯,导致所有的进程都无法通讯。
2.解决
可以肯定的是,这个vip的使用是ceph决定的,可能的获取逻辑是,符合public network 的第一个IP,因为vip是第一个所以就拿vip来通讯了。
- 通过netstat 可以看到有大量的tcp连接,源ip地址和目的ip地址都使用了vip
# netstat -anp | grep "172.26.2.60"
tcp 0 0 172.26.2.60:45752 172.26.2.60:6822 ESTABLISHED 990602/ceph-osd
tcp 0 0 172.26.2.60:21585 172.26.2.60:6821 ESTABLISHED 990602/ceph-osd
tcp 0 0 172.26.2.60:58544 172.26.2.60:6813 ESTABLISHED 990627/ceph-osd
通过查询ceph的配置,可以显式的指定ceph 进程使用的IP 通过配置项public_addr 和 cluster_addr
- 查看配置vip后,并没有设置public_addr的情况下,osd 进程使用的public_addr 地址
# ceph daemon osd.1 config show | grep "public_addr" "public_addr": "172.26.2.60:0/0",
确实osd使用的是vip地址
- 在配置文件中显式的设置public_addr
[global] public_addr = 172.26.2.52 cluster_addr = 172.30.2.52 public_network = 172.26.2.0/16 cluster_network = 172.30.0.0/16
重启所有ceph进程后查看
# systemctl restart ceph.target # ceph daemon osd.1 config show | grep "public_addr" "public_addr": "172.26.2.52:0/0",
集群一切正常
- 查看配置vip后,并没有设置public_addr的情况下,osd 进程使用的public_addr 地址