一句话介绍
sanlock是一个锁管理器,可以使用它锁磁盘,然后防止虚拟机脑裂。
libvirt基于sanlock包装做出了一个插件:libvirt-sanlock
(默认情况下cenotos有安装包,ubuntu下没有包,需要手动编译libvirt包,下面以centos7为例,ubuntu中参考本人这篇博文)
安装配置
先安装libvirt-sanlock的包,然后进行一系列配置。
su - root
# yum install libvirt-lock-sanlock
启动狗
$ su - root
# chkconfig wdmd on
# service wdmd start
启动sanlock
sanlock本身是一个守卫进程,利用paxos协议实现锁功能
libvirt-sanlock在sanlock是一个上层应用,负责相关环境的准备,并且调用sanlock的服务。
换句话说,libvirt-sanlock对sanlock进行了封装,进而使得libvirt可以使用sanlock的功能。
# chkconfig sanlock on
# service sanlock start
配置qemu-sanlock.conf
配置libvirt-sanlock配置文件
host_id需要时1-2000之间的值,需要计算节点各不相同
host_id作为不同主机直接相互区别的标志
$ su - root
# augtool -s set /files/etc/libvirt/qemu-sanlock.conf/host_id 1
需要配置这两项(把这两项放开)
libvirt使用sanlock有两种方式:
1. 自动加锁
在qemu-sanlock.conf中设置auto_disk_lease=1是自动加锁
会在libvirt启动的时候自动初始化__LIBVIRT__DISKS__作为sanlock的LOCKSPACE,并将当期主机自动加入到sanlock中,创建虚拟机的时候也会自动创建sanlock的RESOURCE文件,为磁盘加锁
这种方式需要锁当期主机的所有虚拟机
2. 手动加锁
qemu-sanlock.conf中设置auto_disk_lease=0关闭自动加锁
需手动创建LOCKSPACE文件和RESOURCE文件
sanlock client add_lockspace -s LOCKSPACE:1:/var/lib/libvirt/sanlock/LOCKSPACE:0
将当期主机加到sanlock中
接下来,如下图所示,在虚拟机的配置文件中,磁盘信息中加入如下内容
下面的验证,为了简单使用auto_disk_lease
配置存储
sanlock需要创建租约文件,租约文件存储需要计算节点都可以访问的共享存储
可以是NFS或者是GFS2,这里使用nfs
上面我们配置了disk_lease_dir为/var/lib/libvirt/sanlock
那么更新节点上的/etc/fstab来mount一个共享存储到上述路径
# echo "some.nfs.server:/export/sanlock /var/lib/libvirt/sanlock nfs hard,nointr,bg 0 0" >> /etc/fstab
# mount /var/lib/libvirt/sanlock
some.nfs.server:/export/sanlock是提前搭建好的nfs服务器
注意:这里官网给出的参考文档没有bg参数,可能会存在系统启动卡死情况,见本人博文《nfs lead to Linux halt》
执行完,df -h可以看挂载结果
配置qemu.conf
如果进程启动不是root而是sanlock需要更新/etc/libvirt/qemu.conf
augtool -s set /files/etc/libvirt/qemu-sanlock.conf/user sanlock
augtool -s set /files/etc/libvirt/qemu-sanlock.conf/group sanlock
设置lock_manager为sanlock
augtool -s set /files/etc/libvirt/qemu.conf/lock_manager sanlock
# service libvirtd restart
配置完毕,可通过如下方式简单验证
# ls /var/lib/libvirt/sanlock/
__LIBVIRT__DISKS__
当遇到此目录下没有__LIBVIRT__DISKS__就需要定位了
可以通过本文后面的方法开启libvirtd的日志,或者通过/va r/log/messages
本人遇到如下错误:
通过如下方式解决:
重要
需要关闭selinux
否则sanlock会没有权限读取lockspace,会导致Lunix系统重启
创建虚拟机报错如下:
在/var/log/messages中报错如下:
通过阅读sanlock的代码发现是open方法调用lockspace的时候没有权限导致的
关闭selinux的方法如下:
vi /etc/sysconfig/selinux
将SELINUX项目修改为disabled
(此方法需要重启才能生效)
或者直接执行命令setenforce 0
(此方法重启会失效)
验证方法getenforce
sanlock功能验证
1.创建一个虚拟机磁盘
# qemu-img create /home/disk.img 100M
2.创建虚拟机xml
<domain type='qemu'>
<name>demo1</name>
<memory>219200</memory>
<vcpu>1</vcpu>
<os>
<type arch='x86_64'>hvm</type>
<boot dev='cdrom'/>
</os>
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/home/disk.img'/>
<target dev='vda' bus='virtio'/>
</disk>
</devices>
</domain>
3.创建虚拟机
virsh create vm.xml
4.查看虚拟机
virsh list
验证生效
查看租约文件,可以看到在目录下增加了租约文件
然后把虚拟机的xml名字修改为demo2,再次创建虚拟机
由于虚拟机demo1已经占有磁盘锁,导致虚拟机demo2创建失败
也就是说sanlock锁生效
ceph与sanlock(1)
之前验证,sanlock的租约文件放置到nfs中
由于版本中我们使用ceph作为后端存储,且nfs本身的高可用也需要处理
因此这里使用cephfs
将ceph 挂载到本地,命令如下
sudo mount -t ceph 10.10.200.208:6789/ /mnt/mycephfs -o name=neutron_cinder,secret=AQB4CB5XKK2nCRAAAXsP/0IF7x3+9v3OTvYG5w==
报错mount error 5 = Input/output error
原因是没有安装mds,安装后如下
mount后结果如下
但是我们没有用ceph的filesystem,我们用的是ceph的块设备
ceph与sanlock(2)
当虚拟机的后端存储为ceph的时候,发现libvirt-sanlock的磁盘锁不生效
通过阅读libvirt-sanlock的代码
发现针对ceph类型的磁盘,也就是disk type为network的这种情况 代码直接没有生成租约
问题代码在这里
修改代码
重编libvirt的包,问题解决
libvirt日志开启
在运行libvirtd的时候,我们需要获得lbivirtd的运行信息。
所以我们需要找到他的日志文件。
一般情况下,它是在/var/log/libvirt/libvirtd.log路径下。
可能在这个目录下没有发现这个的日志文件.那么就要配置一些libvitd的参数了
#将日志级别设置为 1(调试)
log_level = 1
#指定日志输出文件名称
log_outputs="1:file:/var/log/libvirt/libvirtd.log"
storage pool
针对存储池也做了相关验证
因为与本题不符,不做展开
详细可以参考这篇和这篇
ubuntu
默认情况下没有开启sanlock选项,故需要重新编译
编译前修改如下:
(1)/debian/rules文件
vim rules
添加“–with-sanlock /” 至DEB_CONFIGURE_EXTRA_FLAGS变量下并保存文件
(2)然后 修改control文件
vim control
添加“libsanlock-dev,” 至Build-Depends列表下. (在“# For make check”前添加即可.)
添加“libsanlock-client1,”至package libvirt-bin下的Depends列表下,保存
ubuntu下编译libvirt包,参考本人这篇博文
参考文献
http://manpages.ubuntu.com/manpages/trusty/man8/sanlock.8.html
http://www.th7.cn/system/lin/201603/157030.shtml
http://www.ibm.com/developerworks/cn/linux/l-cn-libvirt-lvm/
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization_Administration_Guide/create-lvm-storage-pool-virsh.html
https://fedorahosted.org/sanlock/