前言

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

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

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

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

实践过程

安装CTDB

[root@customos ~]# yum install samba ctdb

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

[root@customos ~]# rpm -qpl samba-4.8.3-4.el7.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跟踪能力,直接用发行包的方式是最稳妥的,所以为了不破坏这个稳定性,本篇采用的是基于发行版本,增加模块的方式,这样不会破坏核心组件的稳定性,并且后续升级也是比较简单的,这个也是个人推荐的方式

查询centos7.6当前使用的samba版本

[root@customos ~]# rpm -qa|grep samba
samba-4.8.3-4.el7.x86_64

打包新的CTDB

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

http://vault.centos.org/7.6.1810/os/Source/SPackages/samba-4.8.3-4.el7.src.rpm

下载这个rpm包

[root@customos ~]# wget http://vault.centos.org/7.6.1810/os/Source/SPackages/samba-4.8.3-4.el7.src.rpm

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

解压这个rpm包

[root@customos ~]# rpm2cpio samba-4.8.3-4.el7.src.rpm |cpio -div

检查包的内容

[root@customos myctdb]# ls
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编译里面增加选项的,选项获取方式

[root@lab211 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文件都一起拷贝过去

[root@customos myctdb]# cp -ra * /root/rpmbuild/SOURCES/

安装librados2的devel包

[root@customos myctdb]# yum install librados2-devel

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

开始编译rpm包

[root@customos myctdb]# rpmbuild -bb samba.spec

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

检查生成的包

[root@customos 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包,因为名称有改变,会提示依赖问题,这里忽略依赖的问题

[root@customos ~]# rpm -Uvh ctdb-4.6.2-12.el7.centos.x86_64.rpm --nodeps

添加一个虚拟IP配置

[root@customos ~]# cat /etc/ctdb/public_addresses
192.168.0.99/16 ens33

添加node配置

[root@customos ~]# cat /etc/ctdb/nodes
192.168.0.18
192.168.0.201

修改配置文件

[root@customos ~]# 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去生成

[root@customos ~]# systemctl restart ctdb

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

查看进程状态

[root@customos ceph]# ctdb status
Number of nodes:2
pnn:0 192.168.0.18 OK (THIS NODE)
pnn:1 192.168.0.201 OK
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存在的一个问题是主ctdb故障以后,锁不会释放,这个通过查询命令可以看到

[root@lab101 ~]# rados -p rbd lock info lockctdb ctdb_reclock_mutex
{"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,也就是不会释放的

进行更新以后应该是这样的显示

[root@lab101 ~]# rados -p rbd lock info lockctdb ctdb_reclock_mutex
{"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"}]}

查询后,发现新版本已经对这个问题解决了

/*
* During failover it may take up to <lock duration> seconds before the
* newly elected recovery master can obtain the lock.
*/
#define CTDB_MUTEX_CEPH_LOCK_DURATION_SECS_DEFAULT 10

增加了一个锁超时的参数,默认为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

这个涉及的东西比较少,修改一个文件即可

[root@lab101 ~]# cat /etc/ctdb/ctdbd.conf
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

CTDB使用radosobject作为lockfile的更多相关文章

  1. 对TMemoryStream的一些改进(用到了LockFile)

    对TMemoryStream的一些改进 怎么又是关于Stream的,呵呵,应该说只是最近比较关心程序的效率问题,而我对Stream其实并没有什么特别的研究,只是自己发现了一些新的用法,希望能对大家有用 ...

  2. opensuse 15.0 安装ctdb

    问题 1 2019/05/20 15:27:14.574363 ctdb-eventd[26329]: 60.nfs: /etc/ctdb/nfs-linux-kernel-callout: line ...

  3. lockfile - conditional semaphore-file creator

    LOCKFILE(1) LOCKFILE(1) NAME lockfile - conditional semaphore-file creator SYNOPSIS lockfile -sleept ...

  4. 打开并锁定一个文件(使用LockFile API函数)

    var aHandle : THandle; aFileSize : Integer; aFileName : String; procedure TForm1.Button3Click(Sender ...

  5. yum lockfile is held by another process

    使用yum安装软件报错 yum lockfile is held by another process 解决方法 rm -f /var/run/yum.pid

  6. 【异常】lockfile.AlreadyLocked: ~/airflow/airflow-scheduler.pid is already locked

    1 完整异常信息 File "/usr/bin/airflow", line 32, in <module> args.func(args) File "/u ...

  7. CTDB与LVS搭建集群

    搭建一个采用lvs进行负载均衡的CTDB集群,整个集群的架构是采用如图所示 在上图所示的架构图中,后端采用的集群是我们的存储,集群存储的三个samba服务器的node在作为CTDB的节点的同时,也是运 ...

  8. The version of CocoaPods used to generate the lockfile (*) is higher than the version of the current executable (*). Incompatibility issues may arise.

    解决方法: sudo gem update cocoapod

  9. [!] The version of CocoaPods used to generate the lockfile (1.4.0.beta.1) is higher than the version of the current executable (1.3.0.beta.1). Incompatibility issues may arise.

    今天在看一个开源Demo代码的时候,需要执行pod install命令,直接报错如下: 解决方法: 执行:pod update 命令更新资源库即可.

随机推荐

  1. 转 RabbitMQ 入门教程(PHP版) 使用rabbitmq-delayed-message-exchange插件实现延迟功能

    延迟任务应用场景 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单. 场景三:过1分钟给新 ...

  2. ansible用user/group模块管理受控机上的用户和组(ansible2.9.5)

    一,ansible的user/group模块的用途: ansible的user模块用来实现:生成用户.删除用户等用户的管理ansible的group模块用来实现:生成组.删除组等组的管理 说明:刘宏缔 ...

  3. centos8平台安装ansible2.9

    一,ansible的用途: ansible是基于python开发的自动化运维工具, 它基于SSH远程连接服务, 可以实现批量系统配置.批量软件部署.批量文件拷贝.批量运行命令等多个运维功能 因为基于s ...

  4. springboot入门系列(一):简单搭建springboot项目

    Spring Boot 简单介绍 Spring Boot 本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速.敏捷地开发新一代基于Spring框架的应用程序.也就是说,它并不是用来替代S ...

  5. CSS实现鼠标移入弹出下拉框

    前言 最近比较沉迷CSS,所以我现在来做个鼠标的交互效果 HTML <ul> <li>测试</li> <li>测试</li> <li ...

  6. 解决Android RadioGroup跑到输入法上面

    Android开发过程中,发现一个小问题,当我们点击屏幕下面的输入框时,我们的RadioGroup会跑到输入法的上面去,如下图 两种解决方法 1.Manifest.xml文件activity标签中添加 ...

  7. Afinal简介和使用方法

    Afinal简介 Afinal 是一个android的sqlite orm 和 ioc 框架.同时封装了android中的http框架,使其更加简单易用: 使用finalBitmap,无需考虑bitm ...

  8. JavaWeb 图书管理系统

    查看更多系统:系统大全,课程设计.毕业设计,请点击这里查看 01 系统简述 图书管理系统就是利用计算机,结合互联网对图书进行结构化.自动化管理的一种软件,来提高对图书的管理效率. 02 系统特点 集成 ...

  9. docker gitlab搭建

    1,官方查找gitlab docker镜像 2,pull镜像 3,run docker run -d -p 443:443 -p 10080:80 -p 22:22 --name gitlab --r ...

  10. APP后台架构20191205

    1.架构,架构与业务紧密相关,是有业务驱动的. 2.APP后台演进原则. App后台的架构是由业务规模驱动而演进的,App后台是为业务服务的,App后台的价值在于能为业务提供其所需要的功能,不应过度设 ...