前言 服务器的服务做HA有很多种方式,其中有一种就是是用CTDB,之前这个是独立的软件来做HA的,现在已经跟着SAMBA主线里面了,也就是跟着samba发行包一起发行
之前CTDB的模式是需要有一个共享文件系统,并且在这个共享文件系统里面所有的节点都去访问同一个文件,会有一个Master会获得这个文件的锁
在cephfs的使用场景中可以用cephfs的目录作为这个锁文件的路径,这个有个问题就是一旦有一个节点down掉的时候,可能客户端也会卡住目录,这个目录访问会被卡住,文件锁在其他机器无法获取到,需要等到这个锁超时以后,其它节点才能获得到锁,这个切换的周期就会长一点了
CTDB在最近的版本当中加入了cluster mutex helper using Ceph RADOS的支持,本篇将介绍这个方式锁文件配置方式
实践过程 安装CTDB
检查默认包里面是否有rados的支持
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@customos ~] … 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跟踪能力,直接用发行包的方式是最稳妥的,所以为了不破坏这个稳定性,本篇采用的是基于发行版本,增加模块的方式,这样不会破坏核心组件的稳定性,并且后续升级也是比较简单的,这个也是个人推荐的方式
查询centos7.6当前使用的samba版本
1 2 [root@customos ~] samba-4.8.3-4.el7.x86_64
打包新的CTDB 可以查询得到这个的源码包为samba-4.8.3-4.el7.src.rpm,进一步搜索可以查询的到这个src源码rpm包
1 http://vault.centos.org/7.6.1810/os/Source/SPackages/samba-4.8.3-4.el7.src.rpm
下载这个rpm包
如果下载比较慢的话就用迅雷下载,会快很多,国内的源里面把源码包的rpm都删除掉了,上面的是官网会有最全的包
解压这个rpm包
检查包的内容
1 2 3 4 5 6 7 8 9 10 11 12 [root@customos myctdb] CVE-2018-10858.patch samba-4.8.3-4.el7.src.rpm CVE-2018-1139.patch samba-4.8.3-fix_krb5_plugins.patch gpgkey-52FBC0B86D954B0843324CDC6F33915B6568B7EA.gpg samba-4.8.3-fix_winbind_getpwnam_local_user.patch libldb-1.3.4-1.el7.x86_64.rpm samba-4.8.3-smbclient_quiet_argument.patch libldb-devel-1.3.4-1.el7.x86_64.rpm samba-4.8.3.tar.asc pam_winbind.conf samba-4.8.3.tar.xz pyldb-1.3.4-1.el7.x86_64.rpm samba.log pyldb-devel-1.3.4-1.el7.x86_64.rpm samba.pamd README.dc samba.spec README.downgrade smb.conf.example samba-4.8.3 smb.conf.vendor
可以看到在源码包基础上还打入了很多的patch,内部的编译采用的是waf编译的方式,内部的过程就不做太多介绍了,这里只去改动我们需要的部分即可,也就是去修改samba.spec文件
我们先获取相关的编译选项,这个我最开始的时候打算独立编译ctdb的rpm包,发现有依赖关系太多,后来多次验证后,发现直接可以在samba编译里面增加选项的,选项获取方式
1 2 3 4 5 6 [root@lab211 samba-4.6.2] --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文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 … %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 …
这个文件当中一共添加了三行内容
1 2 3 --enable-ceph-reclock \ %{_libexecdir}/ctdb/ctdb_mutex_ceph_rados_helper %{_mandir}/man7/ctdb_mutex_ceph_rados_helper.7.gz
把解压后的目录里面的所有文件都拷贝到源码编译目录,就是上面ls列出的那些文件,以及修改好的samba.spec文件都一起拷贝过去
安装librados2的devel包
如果编译过程缺其他的依赖包就依次安装即可,这个可以通过解压源码先编译一次的方式来把依赖包找全,然后再打rpm包
开始编译rpm包
这个可以就在当前的目录执行即可
检查生成的包
1 2 3 [root@customos myctdb] /usr/libexec/ctdb/ctdb_mutex_ceph_rados_helper /usr/share/man/man7/ctdb_mutex_ceph_rados_helper.7.gz
可以看到已经生成了这个,把这个包拷贝到需要更新的机器上面
配置ctdb 首先要升级安装下新的ctdb包,因为名称有改变,会提示依赖问题,这里忽略依赖的问题
添加一个虚拟IP配置
1 2 [root@customos ~] 192.168.0.99/16 ens33
添加node配置
1 2 3 [root@customos ~] 192.168.0.18 192.168.0.201
修改配置文件
1 2 3 4 5 6 [root@customos ~] 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
上面为了调试,我开启了debug来查看重要的信息
CTDB_RECOVERY_LOCK=”!/usr/libexec/ctdb/ctdb_mutex_ceph_rados_helper ceph client.admin rbd lockctdb” 最重要的是这行配置文件规则是
1 2 3 4 5 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去生成
配置好了以后就可以启动进程了,上面的/etc/ctdb/ctdbd.conf配置文件最好是修改好一台机器的,然后scp到其它机器,里面内容有一点点偏差都会判断为异常的,所以最好是相同的配置文件
查看进程状态
1 2 3 4 5 6 7 8 9 10 [root@customos ceph] Number of nodes:2 pnn:0 192.168.0.18 OK (THIS NODE) pnn:1 192.168.0.201 OK Generation:1662303628 Size:2hash :0 lmaster:0hash :1 lmaster:1 Recovery mode:NORMAL (0) Recovery master:1
查看/var/log/log.ctdb日志
1 2 3 4 5 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存在的一个问题是主ctdb故障以后,锁不会释放,这个通过查询命令可以看到
1 2 [root@lab101 ~] {"name" :"ctdb_reclock_mutex" ,"type" :"exclusive" ,"tag" :"" ,"lockers" :[{"name" :"client.34130" ,"cookie" :"ctdb_reclock_mutex" ,"description" :"CTDB recovery lock" ,"expiration" :"0.000000" ,"addr" :"192.168.0.101:54263" }]}
这里的expiration为0,也就是不会释放的
进行更新以后应该是这样的显示
1 2 [root@lab101 ~] {"name" :"ctdb_reclock_mutex" ,"type" :"exclusive" ,"tag" :"" ,"lockers" :[{"name" :"client.34239" ,"cookie" :"ctdb_reclock_mutex" ,"description" :"CTDB recovery lock" ,"expiration" :"2019-11-04 16:22:18.119080" ,"addr" :"192.168.0.102:0/443078450" }]}
查询后,发现新版本已经对这个问题解决了
1 2 3 4 5 /* * During failover it may take up to <lock duration> seconds before the * newly elected recovery master can obtain the lock. */
增加了一个锁超时的参数,默认为10s 这个需要自己替换一个文件
https://github.com/samba-team/samba/blob/v4-8-stable/ctdb/utils/ceph/ctdb_mutex_ceph_rados_helper.c
路径为ctdb/utils/ceph/ctdb_mutex_ceph_rados_helper.c 这个涉及的东西比较少,修改一个文件即可
1 2 [root@lab101 ~] CTDB_RECOVERY_LOCK="!/usr/libexec/ctdb/ctdb_mutex_ceph_rados_helper ceph client.admin rbd lockctdb 10"
实际上这里的上面的配置文件的参数也可以新增加一个参数进去,不加参数的就是默认为10s,如果需要调整就自己根据需要调整这个就可以了
修改好了以后重新进行一次打包即可
更新历史
why
when
创建
2018-01-06
解决无法释放锁的问题
2019-11-04