使用rbd块设备的虚拟机其xml文件中配置有monitor ip,本文讨论下在ceph集群monitor ip更改之后,是否需要更改虚拟机xml中的monitor ip

Ceph中使用最广泛最成熟的应该是RBD块设备,Ceph提供了librbd库,其它应用比如KVM / libvirt可以通过librbd库远程与rbd交互。如下是一台使用rbd的centos虚拟机 rbdguest,我们看下其xml中是如何连接rbd块设备的

  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='network' device='disk'>
      <driver name='qemu' cache='none' io='native'/>
      <auth username='libvirt'>
        <secret type='ceph' uuid='e63e4b32-280e-4b00-982a-9d3859cf46f0'/>
      </auth>
      <source protocol='rbd' name='vms/centos7-20689'>
        <host name='172.16.200.117' port='6789'/>
      </source>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>

可以看到此虚拟机磁盘连接的rbd块设备为vms/centos7-20689,其配置有一台monitor 172.16.200.117,monitor端口为默认的6789。那么,假如我们的ceph集群添加或删除monitor或者某台monitor挂掉,总之就是ceph集群的monmap地址改变了,那怎么处理虚拟机中已经设置的monitor ip呢,虚拟机上可能已运行有业务,不能重启

查看虚拟机当前连接的monitor ip

我们先来做个测试

如下,这里有一个三节点的ceph集群,节点hostname为:host-200116, host-200117, host-200118,在节点host-200116 上有一台测试虚拟机rbdguest。虚拟机xml中配置了一个monitor:172.16.200.117

#查看集群monmap
[root@host-200116 ~]# ceph mon dump
dumped monmap epoch 7
epoch 7
fsid 61b0877f-695e-4405-884e-d639dba405bb
last_changed 2016-12-22 13:05:51.573448
created 2016-10-19 17:20:05.244477
0: 172.16.200.116:6789/0 mon.host-200116
1: 172.16.200.117:6789/0 mon.host-200117
2: 172.16.200.118:6789/0 mon.host-200118

[root@host-200116 ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 3     rbdguest                       running

#xml中配置的monitor 
[root@host-200116 ~]# virsh dumpxml rbdguest |grep "port='6789'"
    <host name='172.16.200.117' port='6789'/>

我们知道kvm虚拟机实际上只是宿主机上的一个qemu-kvm进程,我们在宿主机host-200116上查看此虚拟机的qemu-kvm进程与哪台monitor建立有连接

#获取虚拟机进程 PID
[root@host-200116 ~]# ps -ef |grep rbdguest
qemu      585898       1 56 13:09 ?        00:00:13 /usr/libexec/qemu-kvm -name rbdguest -S -machine ... -drive file=rbd:vms/centos7-20689:id=libvirt:key=AQDDoQdfftbKMhAAIp8Dsi63C5soe+ysHGCqff==:auth_supported=cephx\;none:mon_host=172.16.200.117\:6789,if=none,id=drive-virtio-disk0,format=raw,cache=none,aio=native -device virtio-blk-pci,scsi=off,bus= ...     
#从qemu-kvm进程也可以看到,虚拟机当前设置的monitor为 mon_host=172.16.200.117\:6789       

#查看 PID 585898 当前连接的哪个monitor(monitor默认端口号为6789)       
[root@host-200116 ~]# netstat -tpn |grep 585898 | grep 6789
tcp        0      0 172.16.200.116:11026    172.16.200.117:6789     ESTABLISHED 585898/qemu-kvm

上面可以看到,虚拟机当前与monitor 172.16.200.117:6789 建立有TCP连接

然后,我们关闭节点host-200117上的mon进程,再查看虚拟机所连接monitor是否有变化

#关闭host-200117上的 monitor
[root@host-200117 ~]# systemctl start ceph-mon.target
[root@host-200117 ~]# ps -ef |grep ceph-mon
root     3705983 3689311  0 13:10 pts/3    00:00:00 grep --color=auto ceph-mon
#mon进程已经关闭

#返回节点host-200116上,查看当前虚拟机连接的monitor    
[root@host-200116 ~]# netstat -tpn |grep 585898 | grep 6789
tcp        0      0 172.16.200.116:27739    172.16.200.116:6789     ESTABLISHED 585898/qemu-kvm

当前虚拟机连接的monitor变为172.16.200.116:6789

现在问题是,我们虚拟机xml中配置的monitor是172.16.200.117,之前查看qemu-kvm进程其设置的也只有mon_host=172.16.200.117\:6789,那当monitor 172.16.200.117挂掉之后,虚拟机是如何切换到 monitor 172.16.200.116上的呢

虚拟机连接rbd磁盘过程分析

原因在于虚拟机进程qemu-kvm选择连接哪个monitor是依靠其获取的monmap来决定的,而不是仅仅连接其xml中配置的那个monitor,我们从头来分析下虚拟机启动连接rbd磁盘流程

  • 新建虚拟机rbdguest和其使用的rbd磁盘,这部分就不说了
  • 在xml中配置虚拟机所使用的rbd磁盘并指定集群的monitor ip,就是这一行<host name='172.16.200.117' port='6789'/> (当然还有cephx认证这些)
  • virsh启动虚拟机,启动后,qemu-kvm进程会根据xml中配置的monitor ip和端口去连接ceph集群,从而获取集群monmap,(当前集群有116/117/118这三个monitor),并保存到本地
  • 获取monmap之后,虚拟机就明白我当前共有三个monitor可以连接
  • 然后stop掉host-200117上的mon进程后,集群monmap发生变化,虚拟机进程qemu-kvm会同步更新其保存的monmap
  • 之后虚拟机检测到172.16.200.117这一monitor不可用,然后根据更新后的monmap切换到另一个可用monitor

就算集群中所有的monitor ip都改变也是这个情况。比如现在集群中有A,B,C三个monitor,虚拟机V xml中配置的这三个monitor并且虚拟机处于running状态。现在我们把三个monitor ip分别改为A1,B1,C1(更改步骤一般是先添加一个新的monitor,然后删除旧的monitor),更改过程中虚拟机V也会同步更新其自身保存的monmap。因此不管集群monitor ip如何更改,虚拟机进程qemu-kvm始终能获取最新的monitor ip。于是虚拟机就会去连接A1,B1,C1,尽管此时虚拟机xml中配置的monitor还是A, B, C

要明白的是,虚拟机xml中配置的monitor ip或其qemu-kvm进程参数中设置的mon_host=xxx,其作用仅仅是在虚拟机启动时,告诉虚拟机根据这个ip地址可以获取ceph集群的monmap

总结

因此,结论是不用更改虚拟机设置的monitor ip,当你更改集群的monmap,虚拟机会同步更新其自身保存的monmap,从而使用更新后的ip连接monitor,而连接monitor之后,就能获取集群的osdmap,从而连接rbd设备

当然,为了永久生效,还是应该使用virsh edit更改下xml中配置的monitor,仅仅是为了下次虚拟机关机再开机之后,能够正常连接ceph获取monmap
(本文完)