CentOS7下源码安装CTDB并尝试使用

CTDB概述
CTDB(Cluster Trivial Database)是一种轻量级的集群数据库实现,是集群Samba的集群数据库组件,主要用于处理Samba的跨节点消息以及在所有集群节点上实现分布式的TDB数据库。
CTDB是一个集群TDB数据库,可以被Samba或者其他的应用使用来存储数据。如果一个应用是使用TDB来暂时存放数据,那么这个应用可以很轻松的使用CTDB扩展为集群模式。CTDB提供与TDB相同的函数接口,并且是构建在多台物理机器上的集群。
CTDB的主要功能:
1) 提供TDB数据库的集群版本,并在节点故障时自动重建/恢复数据库;
2) 监视集群中的节点和每个节点上运行的服务;
3) 管理用于向客户端提供服务的公共IP地址池。或者,CTDB可与LVS一起使用;

现今,CTDB不仅支持管理Samba,而且也支持管理NFS、HTTPD、VSFTPD、ISCSI、WINBIND等应用。

特性:

  • CTDB提供一个横跨多个节点的并且数据一致、锁一致的TDB数据库;
  • CTDB非常快速;
  • 对于节点故障,CTDB将自动恢复和修复其所管理的所有TDB数据库;
  • CTDB是Samba3/4的一个核心组件;
  • CTDB提供高可用特性,例如节点监控、节点切换、IP切换;
  • CTDB为其多个节点上的应用提供可靠的传输通道;
  • CTDB提供可热拔插的后端传输通道,目前实现了TCP和IB;
  • CTDB可以提供为应用指定特定的管理脚本,使得应用能够实现高可用。

CTDB 实现共享层高可用

通常的设计是提供全局命名空间的节点不直接对外提供共享,或者更确切地说不使用实际 IP 对外提供共享。通常几个节点对外提供一组虚拟的 IP ,而虚拟的 IP 与这些实际的节点 IP 有着相应的映射关系。与用户更紧密的虚拟 IP ,用户连接共享时是通过连接虚拟 IP ,他们并不关心实际节点是哪一个。
当某个实际节点宕机之后,对应的虚拟 IP 会转移到其他的实际节点上去,这一过程对于用户来说是透明的,不会影响共享的使用。

而 CTDB 正是承担了这一项工作。

对于个人来说。。没有那么深的理解,学习CTDB的第一个小目标就是先运行起来,然后测试对外提供一个虚拟IP,通过虚拟IP来访问共享。

首先是一个错误。通过yum安装的ctdb无法启动。。。有谁知道怎么解决指教一下吧。

查看可安装版本

yum list samba
yum list ctdb

只有4.9版本
只有4.9版本,说明一下 我的CentOS7镜像应该是目前CentOS最后一版的镜像 CentOS71908。。。
安装

yum -y install samba
yum -y install ctdb

安装完成进入 /etc/ctdb 目录创建一个 nodes 文件 内容就写各个ctdb节点的IP,最后一个IP后面要空一行。否则最后一个IP失效。

192.168.199.81
192.168.199.82

启动ctdb服务 这时候既未指定虚拟IP 也没有指定共享锁,只是测试一下服务是否可以启动。。。

systemctl start ctdb

启动失败
查看日志文件 默认位置 /var/log/log.ctdb
日志文件
这也太笼统了 Faild to run init event 无法执行初始化事件。。。
然后学习他人博客 在所有节点设置配置文件 /etc/ctdb/ctdb.conf 的 在/etc/ctdb目录下 创建public_addresses文件,然后重新启动,还是报错。实在是想不明白为什么。。。
另外,通过YUM安装的ctdb版本是4.9 ,ctdb配置文件的设置风格更像Samba。而不是以前的风格了。所以参考前辈博客时参数设置需要配合官方文档。但是该失败 CTDB服务还是运行不起来。。。
https://wiki.samba.org/index.php/Basic_CTDB_configuration

通过源码安装CTDB

CTDB在不知道哪个版本起完全支持Samba,至多4.2之后,Samba的源码包中会附带安装ctdb。安装过程就和源码安装Samba一致,只不过在构建时./configure加上参数 --with-cluster-support --with-shared-modules=idmap_rid,idmap_tdb2,idmap_ad
This enables clustering support in Samba and includes CTDB in the build(官方原话。百度翻译就是这允许Samba中的集群支持,并在构建中包含cdb。)

安装Samba步骤https://wiki.samba.org/index.php/Build_Samba_from_Source

  1. 安装依赖包 不同的linux系统需要的依赖包可能不同。
  2. 下载Samba源码压缩文件到本地
  3. 解压压缩文件并进入解压后目录
  4. 构建 ./configure --with-cluster-support --with-shared-modules=idmap_rid,idmap_tdb2,idmap_ad
  5. 安装 make && make install
  6. 配置动态链接库
  7. 将相关命令添加到环境变量

具体一点 本人下载的是Samba4.4.3的源码包Samba的各个版本安装包
安装依赖环境 如果使用VMware等虚拟机管理 。不要安装完依赖环境后克隆。。。可能导致 构建失败

yum install attr bind-utils docbook-style-xsl gcc gdb krb5-workstation \
       libsemanage-python libxslt perl perl-ExtUtils-MakeMaker \
       perl-Parse-Yapp perl-Test-Base pkgconfig policycoreutils-python \
       python2-crypto gnutls-devel libattr-devel keyutils-libs-devel \
       libacl-devel libaio-devel libblkid-devel libxml2-devel openldap-devel \
       pam-devel popt-devel python-devel readline-devel zlib-devel systemd-devel \
       lmdb-devel jansson-devel gpgme-devel pygpgme libarchive-devel -y

下载压缩包到本地 略过
解压并进入解压目录

tar -zxvf samba-4.4.3.tar.gz 
cd samba-4.4.3

构建 这一步不设置其它参数将会把软件全部都安装在 /usr/local/samba 其它参数设置参考官方文档。

./configure --with-cluster-support --with-shared-modules=idmap_rid,idmap_tdb2,idmap_ad

构建成功
安装

make &&make install

安装成功
安装完成后,我们需要配置动态链接库路径,因为运行samba的进行smbd和nmbd需要到目录/usr/local/samba/lib下的动态链接库文件。但是该目录不是系统默认的动态链接库文件搜索路径,于是我们需要将该目录添加到文件ld.so.conf中。执行下面的命令

vi /etc/ld.so.conf

打开ld.so.conf文件,并在该文件中加入下面这一行内容。

/usr/local/samba/lib

然后执行命令来更新动态链接库缓冲。

ldconfig

将命令等添加到环境变量,方式有多种。如编辑 当前用户家目录的 .bashrc 文件,最后一行添加

export PATH=/usr/local/samba/bin/:/usr/local/samba/sbin/:$PATH
vi ~/.bashrc

添加完成后生效 source ~/.bashrc
这样 通过源码安装Samba就算完成了,ctdb的相关进程文件和命令也随着Samba一起安装了。。。

没有按照官方所说将ctdb加入到系统服务,暂时先以进程的方式运行 测试

说明一下。源码安装4.4.3版本,如果步骤和我的一样,那么ctdb的配置目录应该是

/usr/local/samba/etc/ctdb/

默认是没有配置文件的。而Samba4.8版本之前的配置文件名是 ctdbd.conf


一,安装官方基本设置测试ctdb的启动。

设置一个节点集群,每个节点都在运行CTDB。集群中每个节点都运行一个CTDB的守护进程ctdbd

集群将没有用处。特别是:

Samba将不由cdb管理。
将不配置cdb公共ip地址。
将不配置cdb恢复锁。
但是,所有有用的配置都是默认配置的扩展,因此首先测试这一点非常重要。

1 准备三个安装有ctdb的主机 节点 IP分别是
192.168.199.41
192.168.199.42
192.168.199.43

节点之间可以互相ping 通

2 在三个节点的 /usr/local/samba/etc/ctdb/ 目录新增文件 nodes 文件内容是 三个节点的ip

vim /usr/local/samba/etc/ctdb/nodes

注 最后一个节点后要Enter(官方建议,否则无法初始化)

192.168.199.41
192.168.199.42
192.168.199.43

3 依次启动三个节点中的ctdbd 守护线程。

可以先查看一下未启动线程时 状态
无法连接client socket
启动守护线程 为什么是这样启动的,下文有解释,也不一定正确。。。欢迎指教(CTDB看了好多博客,都说启动是否简单。。。可能确实简单吧。。。但是我就是没通过服务启动成功过)

 ctdbd_wrapper /var/run/ctdb/ctdbd.pid start

未设置恢复锁
过一会再查看 当前节点的状态。需要时间来初始化

ctdb status

ctdb status
另外两个节点还没有启动守护进程。所以状态不是 OK。。。先查看一下守护进程

ps -ef | grep ctdb

守护线程
当其他两个节点也启动了守护进程后,再从某一节点查看 ctdb status
Status OK
可以看到三个节点的状态都是OK的。。。

通过 守护进程(ctdbd) 为ctdb提供的各种操作访问。因此关闭该线程的方法有两种
推荐使用第一种

 ctdbd_wrapper /var/run/ctdb/ctdbd.pid stop

或者 直接根据进程 PID号杀死进程 1124 是进程号,基本每次都不相同。

kill -9 1124

由于一切都是默认配置。所以日志文件是 /usr/loacl/samba/var/log/log.ctdb 可以查看一下 挺长的

cat /usr/local/samba/var/log/log.ctdb 

ctdb 日志文件

尝试将进程添加进服务 使用systemctl 管理。(这个我失败了,服务怎么样都启动不了4.4.3)

首先参考他人博客。如何设置自定义服务。CentOS7,应该是systemctl 基本取代了 service 。可以看看这一篇(网上大神好多)
https://www.cnblogs.com/dsc65749924/p/5841731.html
基本了解概念后。。。根据官方的文档 This will depend on how CTDB was installed. If installing from source, consider installing the provided init script (ctdb/config/ctdb.init) or system service file (ctdb/config/ctdb.system) in the appropriate place. A binary package should already contain the correct method of starting CTDB.

在解压缩的文件夹里 可以找到两个文件 samba-4.4.3/ctdb/config/ctdb.init samba-4.4.3/ctdb/config/ctdb.service

网上也可以找到加入到系统服务的方法。。。
一种是编写可执行shell脚本。格式类似于samba-4.4.3/ctdb/config/ctdb.init 将其放入到 /etc/init.d/ 目录然后重新加载服务 systemctl daemon-reload 然后就可以 使用 systemctl 控制了
另一种 是 编写格式类似于 samba-4.4.3/ctdb/config/ctdb.service 的文件,将其放入 /usr/lib/systemd/system/ 目录,然后重新加载服务systemctl daemon-reload 就可以 使用 systemctl 控制了

两者任选一种,不过CentOS7 版本 基本使用第二种 方式。。。可以查看ctdb.service 文件内容

[Unit]
Description=CTDB
After=network.target

[Service]
Type=forking
LimitCORE=infinity
PIDFile=/run/ctdb/ctdbd.pid
ExecStart=/usr/sbin/ctdbd_wrapper /run/ctdb/ctdbd.pid start
ExecStop=/usr/sbin/ctdbd_wrapper /run/ctdb/ctdbd.pid stop
KillMode=control-group
Restart=no

[Install]
WantedBy=multi-user.target

文 件分为三个小节。第一个是[Unit]部分,这里仅仅有一个描述信息。after 应该标明该服务启动应该在上述服务启动之后。第二部分是 Service 定义ExecStart 定义启动服务的具体命令行语法。ExecStop就是定义停止服务的具体命令语法。第三部分是[Install],WangtedBy 表明这个服务是在多用户模式下所需要的。
修改一下PIDFile和ExexStart 和ExecStop 的具体命令。

PIDFile=/var/run/ctdb/ctdbd.pid
ExecStart=/usr/local/samba/sbin/ctdbd_wrapper /var/run/ctdb/ctdbd.pid start
ExecStop=/user/local/samba/usr/sbin/ctdbd_wrapper /var/run/ctdb/ctdbd.pid stop

将ctdb.service 文件放入 /usr/lib/systemd/system/ 目录,重新加载服务systemctl daemon-reload 然后启动该服务。。。

systemctl start ctdb

不知其他人如何,反正我启动一直失败。日志文件大概如下。

2020/03/20 04:17:13.522092 [10340]: CTDB starting on node
2020/03/20 04:17:13.522201 [10340]: Recovery lock file set to "". Disabling recovery lock checking
2020/03/20 04:17:13.530422 [10341]: Starting CTDBD (Version 4.4.3) as PID: 10341
2020/03/20 04:17:13.530568 [10341]: Created PID file /var/run/ctdb/ctdbd.pid
2020/03/20 04:17:13.530599 [10341]: Set real-time scheduler priority
2020/03/20 04:17:13.530766 [10341]: Set runstate to INIT (1)
2020/03/20 04:17:13.530956 [10341]: Set event helper to "/usr/local/samba/libexec/ctdb/ctdb_event_helper"
2020/03/20 04:17:13.546765 [10341]: 00.ctdb: /usr/local/samba/etc/ctdb/events.d/00.ctdb: line 23: tdbtool: command not found
2020/03/20 04:17:13.550013 [10341]: 00.ctdb: WARNING: The installed 'tdbtool' does not offer the 'check' subcommand.
2020/03/20 04:17:13.550042 [10341]: 00.ctdb:  Using 'tdbdump' for database checks.
2020/03/20 04:17:13.550159 [10341]: 00.ctdb:  Consider updating 'tdbtool' for better checks!
2020/03/20 04:17:13.591690 [10341]: 10.interface: No public addresses file found. Nothing to do for 10.interfaces
2020/03/20 04:17:13.735688 [10341]: PNN is 0
2020/03/20 04:17:13.735999 [10341]: Set runstate to SETUP (2)
2020/03/20 04:17:13.944356 [10341]: Keepalive monitoring has been started
2020/03/20 04:17:13.944416 [10341]: Set runstate to FIRST_RECOVERY (3)
2020/03/20 04:17:13.945475 [recoverd:10439]: monitor_cluster starting
2020/03/20 04:17:13.946740 [recoverd:10439]: Initial recovery master set - forcing election
2020/03/20 04:17:13.946895 [10341]: This node (0) is now the recovery master
2020/03/20 04:17:14.489543 [10341]: Unknown db_id 0x6645c6c4 in ctdb_set_db_priority
2020/03/20 04:17:14.489928 [10341]: This node (0) is no longer the recovery master
2020/03/20 04:17:14.946279 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:15.947274 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:16.948313 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:17.949295 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:17.956282 [recoverd:10439]: Election period ended
2020/03/20 04:17:17.957139 [recoverd:10439]:  Current recmaster node 1 does not have CAP_RECMASTER, but we (node 0) have - force an election
2020/03/20 04:17:17.957517 [10341]: This node (0) is now the recovery master
2020/03/20 04:17:18.460678 [10341]: This node (0) is no longer the recovery master
2020/03/20 04:17:18.945356 [10341]: 192.168.199.41:4379: connected to 192.168.199.42:4379 - 1 connected
2020/03/20 04:17:18.945454 [10341]: 192.168.199.41:4379: connected to 192.168.199.43:4379 - 2 connected
2020/03/20 04:17:18.950345 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:19.951503 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:20.952451 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:21.953527 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:21.965504 [recoverd:10439]: Election period ended
2020/03/20 04:17:21.968265 [recoverd:10439]: Initial interface fetched
2020/03/20 04:17:21.968321 [recoverd:10439]: The interfaces status has changed on local node 0 - force takeover run
2020/03/20 04:17:21.968662 [recoverd:10439]: Trigger takeoverrun
2020/03/20 04:17:22.068728 [10341]: Vacuuming is disabled for persistent database ctdb.tdb
2020/03/20 04:17:22.068793 [10341]: Attached to database '/usr/local/samba/var/lib/ctdb/persistent/ctdb.tdb.0' with flags 0x400
2020/03/20 04:17:22.074453 [10341]: ../ctdb/server/ctdb_monitor.c:523 Node 1 became healthy - force recovery for startup
2020/03/20 04:17:22.074735 [recoverd:10439]: Node 1 has changed flags - now 0x0  was 0x2
2020/03/20 04:17:22.075595 [10341]: ../ctdb/server/ctdb_monitor.c:523 Node 2 became healthy - force recovery for startup
2020/03/20 04:17:22.075822 [recoverd:10439]: Node 2 has changed flags - now 0x0  was 0x2
2020/03/20 04:17:22.087151 [10341]: ../ctdb/server/ctdb_recover.c:958 startrecovery eventscript has been invoked
2020/03/20 04:17:22.315207 [10341]: Freeze db: ctdb.tdb
2020/03/20 04:17:22.315261 [10341]: Set lock helper to "/usr/local/samba/libexec/ctdb/ctdb_lock_helper"
2020/03/20 04:17:22.371747 [10341]: Thaw db: ctdb.tdb generation 1088623483
2020/03/20 04:17:22.371807 [10341]: Release freeze handle for db ctdb.tdb
2020/03/20 04:17:22.372810 [10341]: ../ctdb/server/ctdb_recover.c:567 Recovery mode set to NORMAL
2020/03/20 04:17:22.373438 [10341]: Recovery has finished
2020/03/20 04:17:22.595555 [10341]: Set runstate to STARTUP (4)
2020/03/20 04:17:22.609122 [recoverd:10439]: Disabling takeover runs for 60 seconds
2020/03/20 04:17:22.840576 [recoverd:10439]: Reenabling takeover runs
2020/03/20 04:17:22.841105 [10341]: Recovery has finished
2020/03/20 04:17:22.954484 [10341]: CTDB_WAIT_UNTIL_RECOVERED
2020/03/20 04:17:22.954531 [10341]: ../ctdb/server/ctdb_monitor.c:335 wait for pending recoveries to end. Wait one more second.
2020/03/20 04:17:23.059519 [recoverd:10439]: Disabling takeover runs for 60 seconds
2020/03/20 04:17:23.293229 [recoverd:10439]: Reenabling takeover runs
2020/03/20 04:17:23.611853 [recoverd:10439]: Daemon has exited - shutting down client
2020/03/20 04:17:23.611968 [recoverd:10439]: CTDB recoverd: shutting down

看不出来哪里错了。。。通过上面说的,尽管没有服务没有运行成功。但是也应该知道 为什么 通过ctdbd_wrapper 来启动ctdbd进程了,服务文件中就这样设置的。。。

但是使用 4.6 版本就可以使用systemctl 启动,只是每次启动后再次重启的话会报错,
/usr/local/samba/var/lib/ctdb 中数据库已存在之类的,还要删除后才能再次启动,因此设置为开机自启也是不行。。。不知道原因是不是未设置 初始配置文件?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章