CTDB使用rados object作为lock file

2018-01-08 13:41:20来源:http://ceph.com/planet/ctdb使用rados-object作为lock-file/作者:Ceph人点击

分享


前言

服务器的服务做HA有很多种方式,其中有一种就是是用CTDB,之前这个是独立的软件来做HA的,现在已经跟着SAMBA主线里面了,也就是跟着samba发行包一起发行


之前CTDB的模式是需要有一个共享文件系统,并且在这个共享文件系统里面所有的节点都去访问同一个文件,会有一个Master会获得这个文件的锁


在cephfs的使用场景中可以用cephfs的目录作为这个锁文件的路径,这个有个问题就是一旦有一个节点down掉的时候,可能客户端也会卡住目录,这个目录访问会被卡住,文件锁在其他机器无法获取到,需要等到这个锁超时以后,其它节点才能获得到锁,这个切换的周期就会长一点了


CTDB在最近的版本当中加入了cluster mutex helper using Ceph RADOS的支持,本篇将介绍这个方式锁文件配置方式


实践过程
安装CTDB

[[email protected] ~]# yum install samba ctdb


检查默认包里面是否有rados的支持



[[email protected] ~]# rpm -qpl ctdb-4.6.2-12.el7_4.x86_64.rpm

usr/libexec/ctdb
/usr/libexec/ctdb/ctdb_event
/usr/libexec/ctdb/ctdb_eventd
/usr/libexec/ctdb/ctdb_killtcp
/usr/libexec/ctdb/ctdb_lock_helper
/usr/libexec/ctdb/ctdb_lvs
/usr/libexec/ctdb/ctdb_mutex_fcntl_helper
/usr/libexec/ctdb/ctdb_natgw
/usr/libexec/ctdb/ctdb_recovery_helper
/usr/libexec/ctdb/ctdb_takeover_helper
/usr/libexec/ctdb/smnotify



这个可以看到默认并没有包含这个rados的支持,这个很多通用软件都会这么处理,因为支持第三方插件的时候需要开发库,而开发库又有版本的区别,所以默认并不支持,需要支持就自己编译即可,例如fio支持librbd的接口就是这么处理的,等到插件也通用起来的时候,可能就会默认支持了


很多软件的编译可以采取源码的编译方式,如果不是有很强的代码合入和patch跟踪能力,直接用发行包的方式是最稳妥的,所以为了不破坏这个稳定性,本篇采用的是基于发行版本,增加模块的方式,这样不会破坏核心组件的稳定性,并且后续升级也是比较简单的,这个也是个人推荐的方式


查询当前使用的samba版本



[[email protected] ~]# rpm -qa|grep samba
samba-4.6.2-12.el7_4.x86_64


打包新的CTDB

可以查询得到这个的源码包为samba-4.6.2-12.el7_4.src.rpm,进一步搜索可以查询的到这个src源码rpm包



http://vault.centos.org/7.4.1708/updates/Source/SPackages/samba-4.6.2-12.el7_4.src.rpm


下载这个rpm包



[[email protected] ~]# wget http://vault.centos.org/7.4.1708/updates/Source/SPackages/samba-4.6.2-12.el7_4.src.rpm


如果下载比较慢的话就用迅雷下载,会快很多,国内的源里面把源码包的rpm都删除掉了,上面的是官网会有最全的包


解压这个rpm包



[[email protected] ~]# rpm2cpio samba-4.6.2-12.el7_4.src.rpm |cpio -div


检查包的内容



[[email protected] myctdb]# ls
CVE-2017-12150.patch samba-v4-6-fix-cross-realm-refferals.patch
CVE-2017-12151.patch samba-v4-6-fix-kerberos-debug-message.patch
CVE-2017-12163.patch samba-v4-6-fix_net_ads_changetrustpw.patch
CVE-2017-14746.patch samba-v4-6-fix-net-ads-keytab-handling.patch
CVE-2017-15275.patch samba-v4-6-fix_path_substitutions.patch
CVE-2017-7494.patchsamba-v4-6-fix_smbclient_session_setup_info.patch
gpgkey-52FBC0B86D954B0843324CDC6F33915B6568B7EA.gpgsamba-v4-6-fix_smbclient_username_parsing.patch
pam_winbind.conf samba-v4.6-fix_smbpasswd_user_pwd_change.patch
README.dcsamba-v4-6-fix-spoolss-32bit-driver-upload.patch
README.downgrade samba-v4-6-fix-vfs-expand-msdfs.patch
samba-4.6.2-12.el7_4.src.rpm samba-v4-6-fix_winbind_child_crash.patch
samba-4.6.2.tar.ascsamba-v4-6-fix_winbind_normalize_names.patch
samba-4.6.2.tar.xz samba-v4.6-graceful_fsctl_validate_negotiate_info.patch
samba.logsamba-v4.6-gss_krb5_import_cred.patch
samba.pamd samba-v4.6-lib-crypto-implement-samba.crypto-Python-module-for-.patch
samba.spec samba-v4.7-config-dynamic-rpc-port-range.patch
samba-v4.6-credentials-fix-realm.patch smb.conf.example
samba-v4-6-fix-building-with-new-glibc.patch smb.conf.vendor


可以看到在源码包基础上还打入了很多的patch,内部的编译采用的是waf编译的方式,内部的过程就不做太多介绍了,这里只去改动我们需要的部分即可,也就是去修改samba.spec文件


我们先获取相关的编译选项,这个我最开始的时候打算独立编译ctdb的rpm包,发现有依赖关系太多,后来多次验证后,发现直接可以在samba编译里面增加选项的,选项获取方式



[[email protected] samba-4.6.2]# ./configure --help|grep ceph
--with-libcephfs=LIBCEPHFS_DIR
Directory under which libcephfs is installed
--enable-cephfs
Build with cephfs support (default=yes)
--enable-ceph-reclock


这个可以知道需要添加ceph-reclock的支持就添加这个选项,我们把这个选项添加到samba.spec当中


修改samba.spec文件




%configure
--enable-fhs
--with-piddir=/run
--with-sockets-dir=/run/samba
--with-modulesdir=%{_libdir}/samba
--with-pammodulesdir=%{_libdir}/security
--with-lockdir=/var/lib/samba/lock
--with-statedir=/var/lib/samba
--with-cachedir=/var/lib/samba
--disable-rpath-install
--with-shared-modules=%{_samba4_modules}
--bundled-libraries=%{_samba4_libraries}
--with-pam
--with-pie
--with-relro
--enable-ceph-reclock
--without-fam

%dir %{_libexecdir}/ctdb
%{_libexecdir}/ctdb/ctdb_event
%{_libexecdir}/ctdb/ctdb_eventd
%{_libexecdir}/ctdb/ctdb_killtcp
%{_libexecdir}/ctdb/ctdb_lock_helper
%{_libexecdir}/ctdb/ctdb_lvs
%{_libexecdir}/ctdb/ctdb_mutex_fcntl_helper
%{_libexecdir}/ctdb/ctdb_mutex_ceph_rados_helper

%{_mandir}/man1/ctdb.1.gz
%{_mandir}/man1/ctdb_diagnostics.1.gz
%{_mandir}/man1/ctdbd.1.gz
%{_mandir}/man1/onnode.1.gz
%{_mandir}/man1/ltdbtool.1.gz
%{_mandir}/man1/ping_pong.1.gz
%{_mandir}/man7/ctdb_mutex_ceph_rados_helper.7.gz
%{_mandir}/man1/ctdbd_wrapper.1.gz



这个文件当中一共添加了三行内容



--enable-ceph-reclock
%{_libexecdir}/ctdb/ctdb_mutex_ceph_rados_helper
%{_mandir}/man7/ctdb_mutex_ceph_rados_helper.7.gz


把解压后的目录里面的所有文件都拷贝到源码编译目录,就是上面ls列出的那些文件,以及修改好的samba.spec文件都一起拷贝过去



[[email protected] myctdb]# cp -ra * /root/rpmbuild/SOURCES/


安装librados2的devel包



[[email protected] myctdb]# yum install librados2-devel


如果编译过程缺其他的依赖包就依次安装即可,这个可以通过解压源码先编译一次的方式来把依赖包找全,然后再打rpm包


开始编译rpm包



[[email protected] myctdb]# rpmbuild -bb samba.spec


这个可以就在当前的目录执行即可


检查生成的包



[[email protected] myctdb]# rpm -qpl /root/rpmbuild/RPMS/x86_64/ctdb-4.6.2-12.el7.centos.x86_64.rpm|grep rados
/usr/libexec/ctdb/ctdb_mutex_ceph_rados_helper
/usr/share/man/man7/ctdb_mutex_ceph_rados_helper.7.gz


可以看到已经生成了这个,把这个包拷贝到需要更新的机器上面


配置ctdb

首先要升级安装下新的ctdb包,因为名称有改变,会提示依赖问题,这里忽略依赖的问题



[[email protected] ~]# rpm -Uvh ctdb-4.6.2-12.el7.centos.x86_64.rpm --nodeps


添加一个虚拟IP配置



[[email protected] ~]# cat /etc/ctdb/public_addresses
192.168.0.99/16 ens33


添加node配置



[[email protected] ~]# cat /etc/ctdb/nodes
192.168.0.18
192.168.0.201


修改配置文件



[[email protected] ~]# cat /etc/ctdb/ctdbd.conf|grep -v "#"
CTDB_RECOVERY_LOCK="!/usr/libexec/ctdb/ctdb_mutex_ceph_rados_helper ceph client.admin rbd lockctdb"
CTDB_NODES=/etc/ctdb/nodes
CTDB_PUBLIC_ADDRESSES=/etc/ctdb/public_addresses
CTDB_LOGGING=file:/var/log/log.ctdb
# CTDB_DEBUGLEVEL=debug


上面为了调试,我开启了debug来查看重要的信息


CTDB_RECOVERY_LOCK=”!/usr/libexec/ctdb/ctdb_mutex_ceph_rados_helper ceph client.admin rbd lockctdb”


最重要的是这行配置文件规则是



CTDB_RECOVERY_LOCK="!/usr/libexec/ctdb/ctdb_mutex_ceph_rados_helper [Cluster] [User] [Pool] [Object]"
Cluster: Ceph cluster name (e.g. ceph)
User: Ceph cluster user name (e.g. client.admin)
Pool: Ceph RADOS pool name
Object: Ceph RADOS object name


在ctdb的机器上面准备好librados2和ceph配置文件,这个配置的rbd的lockctdb对象会由ctdb去生成



[[email protected] ~]# systemctl restart ctdb


配置好了以后就可以启动进程了,上面的/etc/ctdb/ctdbd.conf配置文件最好是修改好一台机器的,然后scp到其它机器,里面内容有一点点偏差都会判断为异常的,所以最好是相同的配置文件


查看进程状态



[[email protected] ceph]# ctdb status
Number of nodes:2
pnn:0 192.168.0.18 OK (THIS NODE)
pnn:1 192.168.0.201OK
Generation:1662303628
Size:2
hash:0 lmaster:0
hash:1 lmaster:1
Recovery mode:NORMAL (0)
Recovery master:1


查看/var/log/log.ctdb日志



2018/01/06 23:18:11.399849 ctdb-recoverd[129134]: Node:1 was in recovery mode. Start recovery process
2018/01/06 23:18:11.399879 ctdb-recoverd[129134]: ../ctdb/server/ctdb_recoverd.c:1267 Starting do_recovery
2018/01/06 23:18:11.399903 ctdb-recoverd[129134]: Attempting to take recovery lock (!/usr/libexec/ctdb/ctdb_mutex_ceph_rados_helper ceph client.admin rbd lockctdb)
2018/01/06 23:18:11.400657 ctdb-recoverd[129134]: ../ctdb/server/ctdb_cluster_mutex.c:251 Created PIPE FD:17
2018/01/06 23:18:11.579865 ctdbd[129038]: ../ctdb/server/ctdb_daemon.c:907 client request 40 of type 7 length 72 from node 1 to 4026531841


日志中可以看到ctdb-recoverd已经是采用的ctdb_mutex_ceph_rados_helper来获取的recovery lock


停掉ctdb的进程,IP可以正常的切换,到这里,使用对象作为lock文件的功能就实现了,其他更多的ctdb的高级控制就不在这个里作过多的说明


总结

本篇是基于发行版本的ctdb包进行模块的加入重新发包,并且把配置做了一次实践,这个可以作为一个ctdb的方案之一,具体跟之前的方案相比切换时间可以改善多少,需要通过数据进行对比,这个进行测试即可


资源

已经打好包的ctdb共享一下,可以直接使用


http://7xweck.com1.z0.glb.clouddn.com/ctdb-4.6.2-12.el7.centos.x86_64.rpm


变更记录

Why
Who
When


创建
武汉-运维-磨渣
2018-01-06

Source: [email protected] ( CTDB使用rados object作为lock file )


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台