CTDB入门

引言

CTDB是集群Samba中的集群数据库组件,可提供高可用性负载共享CIFS服务器集群。

CTDB的主要功能是:

  • 提供TDB数据库的集群版本,并在节点发生故障时自动重建/恢复数据库。
  • 监视集群中的节点以及在每个节点上运行的服务。
  • 管理用于向客户端提供服务的公共IP地址池。 另外,CTDB可以与LVS一起使用。

与集群文件系统结合使用CTDB为集群Samba,NFS和其他服务等服务提供了完整的高可用(HA)环境。

设置CTDB

设置集群文件系统后,可以设置CTDB集群。 要使用CTDB,必须为发行版安装ctdb-package。 安装完所有依赖包后,将找到目录/etc/ctdb。 在其目录中,需要一些CTDB的配置文件。

配置CTDB所需的文件。

文件内容
/etc/ctdb/ctdb.conf基本配置
/etc/ctdb/script.options设置事件脚本的选项
/etc/ctdb/nodes所有节点的所有IP地址
/etc/ctdb/public_addresses所有节点的动态IP地址

ctdb.conf文件

ctdb.conf文件与旧的配置样式(<Samba 4.9)相比发生了很大变化。 该文件不再用于配置CTDB管理的其它服务。 目前,在该文件中要做的唯一设置就是设置恢复锁文件。 所有节点都使用此文件来检查是否可以将文件锁在机器中以供排他使用。 如果不使用恢复锁文件,则集群可能会陷入混乱状态。 默认情况下,未设置“恢复锁”。 除非知道自己在做什么,否则不应使用没有恢复锁的CTDB。 该变量必须指向已挂载的gluster-volume中的文件。 要使用恢复锁,请在两个节点上的/etc/ctdb/ctdb.conf中输入以下行:

recovery lock = /glusterfs/ctdb.lock

script.options文件

CTDB提供的所有服务会通过特殊脚本启动。 在此文件中,可以为脚本设置选项。 脚本中显示了一个示例。 服务脚本50.samba.options中名为CTDB_SAMBA_SKIP_SHARE_CHECK的选项,默认情况下设置为yes。 这意味着,每次创建新共享时,CTDB都会检查路径是否存在,如果不存在,则CTDB将停止。 但是,如果使用vfs-module glusterfs,则共享配置中将没有本地路径。 共享指向gluster卷上的目录,因此CTDB无法检查路径。 因此,如果要使用glusterfs,则必须将Samba的此选项设置为no。

因为可以在这个文件中为所有服务脚本设置所有选项,所以不必更改任何服务脚本。可在手册man ctdb-script.options中找到有关所有选项的更多信息。

nodes文件

CTDB必须知道属于该集群的所有主机,在此文件中,必须放置所有节点的心跳网络中的所有IP。 该文件在所有节点上必须具有相同的内容。 只需将两个节点的两个IP放入文件中即可。 在这里,可以看到文件的内容。

192.168.57.42
192.168.57.43

在大多数发行版中,该文件不存在,必须创建它。

public_addresses文件

每当CTDB启动时,它将为CTDB-Cluster中的所有节点提供IP地址,该地址必须是生产网络中的IP地址。

启动集群后,CTDB将处理这些IP地址,并将此列表的IP地址提供给每个CTDB节点。 如果CTDB节点崩溃,则CTDB将从崩溃节点中分配IP地址给另一个CTDB节点。 因此,该文件中的每个IP地址始终分配给节点中的一个。

CTDB正在对服务进行故障转移。 如果一个节点失效,则IP地址将切换到其余节点之一。 然后,所有客户端将重新连接到该节点。 这是可能的,因为所有节点都具有所有客户端的所有会话信息。

对于每个节点,需要一个public_addresses文件。 节点上的文件可以不同,具体取决于要分配节点的子网。 该示例仅使用一个子网,因此两个节点都具有相同的public_addresses文件。 在这里,可以看到文件的内容:

192.168.56.101/24 enp0s8
192.168.56.102/24 enp0s8

第一次启动CTDB

现在,已经在两个节点上都配置了CTDB服务,那么就可以准备开始了。 要查看启动期间会发生什么,您可以打开另一个终端并启动tail -f /var/log/ctdb/ctdb.log以查看消息。 首先使用systemctl restart ctdb启动一个节点,查看日志消息,然后启动第二个节点,并继续关注日志。

2020/02/11 17:32:53.778637 ctdbd[1926]: monitor event OK - node re-enabled
2020/02/11 17:32:53.778831 ctdbd[1926]: Node became HEALTHY. Ask recovery master to reallocate IPs 
2020/02/11 17:32:53.779152 ctdb-recoverd[1966]: Node 0 has changed flags - now 0x0  was 0x2
2020/02/11 17:32:54.575970 ctdb-recoverd[1966]: Unassigned IP 192.168.56.102 can be served by this node
2020/02/11 17:32:54.576047 ctdb-recoverd[1966]: Unassigned IP 192.168.56.101 can be served by this node
2020/02/11 17:32:54.576254 ctdb-recoverd[1966]: Trigger takeoverrun
2020/02/11 17:32:54.576780 ctdb-recoverd[1966]: Takeover run starting
2020/02/11 17:32:54.594527 ctdbd[1926]: Takeover of IP 192.168.56.102/24 on interface enp0s8
2020/02/11 17:32:54.595551 ctdbd[1926]: Takeover of IP 192.168.56.101/24 on interface enp0s8
2020/02/11 17:32:54.843175 ctdb-recoverd[1966]: Takeover run completed successfully

在这里,可以看到该节点已经使用了两个动态IP地址,可以使用ip a l enp0s8进行检查。

不要使用ifconfig列出IP地址,ifconfig不会列出动态分配的IP地址。

在启动第二个节点之前,请查看具有ctdb状态的CTDB状态。 将看到刚启动的第一个节点的状态为OK,另一个节点的状态为DISCONNECTED | UNHEALTHY | INACTIVE。

root@cluster-01:~# ctdb status
Number of nodes:2
pnn:0 192.168.57.42    OK (THIS NODE)
pnn:1 192.168.57.43    DISCONNECTED|UNHEALTHY|INACTIVE
Generation:1636031659
Size:1
hash:0 lmaster:0
Recovery mode:NORMAL (0)
Recovery master:0

现在,可以使用systemctl restart ctdb在第二个节点上启动CTDB。 在第一个节点的日志中,将看到以下消息:接管成功。 接下来,将看到日志的最后几行:

2020/02/11 17:51:49.964668 ctdb-recoverd[6598]: Takeover run starting
2020/02/11 17:51:50.004374 ctdb-recoverd[6598]: Takeover run completed successfully
2020/02/11 17:51:59.061780 ctdb-recoverd[6598]: Reenabling recoveries after timeout
2020/02/11 17:52:04.632267 ctdb-recoverd[6598]: Node 1 has changed flags - now 0x0  was 0x2
2020/02/11 17:52:04.989395 ctdb-recoverd[6598]: Takeover run starting
2020/02/11 17:52:05.008763 ctdbd[6554]: Release of IP 192.168.56.102/24 on interface enp0s8  node:1
2020/02/11 17:52:05.154588 ctdb-recoverd[6598]: Takeover run completed successfully

如果在下清单中看到很多消息,请检查是否正确安装了gluster-volume,以及/etc/ctdb/ctdb.conf中的recovery lock-option是否正确设置:

2020/02/11 17:51:00.883523 ctdbd[6554]: CTDB_WAIT_UNTIL_RECOVERED
2020/02/11 17:51:00.883630 ctdbd[6554]: ../../ctdb/server/ctdb_monitor.c:324 wait for pending recoveries to end. Wait one more second.

查看状态将显示两个节点都正常,如在ctsdb status中所见

root@cluster-01:~# ctdb status
Number of nodes:2
pnn:0 192.168.57.42    OK (THIS NODE)
pnn:1 192.168.57.43    OK
Generation:101877096
Size:2
hash:0 lmaster:0
hash:1 lmaster:1
Recovery mode:NORMAL (0)
Recovery master:0

每当停止一个节点时,另一个节点将接管CTDB分配的IP地址。 现在,CTDB正在运行,但是您尚未配置任何服务。 如果两个节点都正常,则应仅继续配置服务。

作为测试,可以在一个节点上停止CTDB,然后会看到另一节点将从停止的节点获取IP。 重新启动节点后,会将其中一个IP地址分配给该节点,并且两个节点的状态都将再次变为OK。

下一步将设置samba。

配置Samba

在这一部分中,可了解如何设置Samba集群以向Windows和Linux客户端提供文件服务。 该集群将加入Samba Active Directory域并创建共享。 将描述三种不同的技术来为客户提供共享:

  • 使用本地挂载的gluster-volume创建共享。
  • 使用vfs-module glusterfs直接指向gluster-cluster上的卷,而无需在本地系统上挂载该卷。
  • 使用新的vfs-module glusterfs_fuse。
加入域

要将集群加入域,必须执行以下步骤:

  • 创建DNS记录
  • 通过注册表配置Samba
  • 加入集群
创建DNS记录

要加入域,第一步应该是为集群创建DNS条目。 如果已经配置了反向区域,则可以跳过命令以创建反向区域。

root@addc-01:~# kinit administrator
administrator@EXAMPLE.NET's Password:********

root@addc-01:~# samba-tool dns zonecreate addc-01 56.168.192.in-addr.arpa -k yes
Zone 56.168.192.in-addr.arpa created successfully

root@addc-01:~# systemctl restart samba-ad-dc

如果正在使用来自Samba的内部DNS服务器,则只需重启DC

root@addc-01:~# samba-tool dns add addc-01 example.net cluster A 192.168.56.101 
Record added successfully

root@addc-01:~# samba-tool dns add addc-01 example.net cluster A 192.168.56.102
Record added successfully

root@addc-01:~# samba-tool dns add addc-01 56.168.192.in-addr.arpa 101 PTR cluster.example.net
Record added successfully

root@addc-01:~# samba-tool dns add addc-01 56.168.192.in-addr.arpa 102 PTR cluster.example.net
Record added successfully

测试名称解析。

root@addc-01:~# host cluster
cluster.example.net has address 192.168.56.101
cluster.example.net has address 192.168.56.102

root@addc-01:~# host 192.168.56.101
101.56.168.192.in-addr.arpa domain name pointer cluster.example.net.

root@addc-01:~# host 192.168.56.102
102.56.168.192.in-addr.arpa domain name pointer cluster.example.net.

在清单中,看到两个动态IP地址都具有相同的DNS名称。 解析主机名将为您提供两个IP地址。 因此,客户端可以连接到这两个地址中的任意一个,并将始终到达集群节点之一。

配置Samba

如果将Samba与CTDB一起使用,则必须使用注册表来配置Samba。 原因是,配置的是集群,而不是每个主机。 集群的所有配置都可以在任一Samba主机上完成。 CTDB-Samba-主机将共享所有TDB文件。 这些文件将存储在本地,但将在所有节点之间提交。

将设置写入注册表的最简单方法是以smb.conf样式写入文件,然后将文件导入注册表。

如果启动Samba,Samba查找任何配置的第一个地方就是smb.conf文件。 这就是为什么用户始终拥有最低smb.conf的原因。 在下面的清单中,将看到配置设置。

[global]
       workgroup = EXAMPLE
       realm = EXAMPLE.NET
       netbios name = CLUSTER
       security = ADS
       template shell = /bin/bash
       winbind use default domain = Yes
       winbind refresh tickets = Yes
       idmap config *:range = 10000-19999
       idmap config samba-ad:range = 1000000-1999999
       idmap config samba-ad:backend = rid

下一步是创建smb.conf来告诉Samba应该使用集群,并且所有配置都来自注册表。

[global]
       clustering = yes
       include = registry

现在,使用命令net conf import /daten/smb.conf.first将配置文件导入注册表。 可以在两个节点上使用net conf list测试导入。 使用两个节点上的testparm测试所有设置。 如果没有错误消息,则可以将集群加入域:

root@cluster-01:/etc/ctdb# net ads join -U administrator
Enter administrator's password: *******

Using short domain name -- EXAMPLE
Joined 'CLUSTER' to dns domain 'example.net'
Not doing automatic DNS update in a clustered setup.
root@cluster-01:~# net ads testjoin
Join is OK

在加入期间无法对集群进行DNS更新,这就是为什么在加入集群之前创建DND记录的原因,但是可以看到使用net ads testjoin是有效的。 另一个测试是查看群集的帐户是否在AD中创建,以便在域控制器上执行 samba-tool computer list。

现在,已将集群加入域。 到目前为止,还没有启动任何Samba服务。 启动和停止服务smbd,nmbd和winbind应该由CTDB而不是通过systemd完成。 因此,在配置CTDB来接管服务之前,必须停止并禁用systemd中的服务:

root@cluster-01:~# systemctl stop smbd nmbd winbind
root@cluster-01:~# systemctl disable smbd nmbd winbind
root@cluster-02:~# systemctl stop smbd nmbd winbind
root@cluster-02:~# systemctl disable smbd nmbd winbind

必须在两个节点上都执行此操作。

配置CTDB以接管samba服务

完成Samba的配置并将群集加入域之后,就可以开始配置CTDB来接管Samba服务。 从Samba 4.9开始,配置CTDB的方式已经发生了很大变化,到目前为止,仅在配置恢复锁时才注意到这一点。 配置服务的旧方法是在ctdb.conf中激活服务。 从已更改的Samba 4.9开始,现在有一个命令来激活服务。

每个服务将通过事件脚本启用。 要启用脚本,请使用命令ctdb。 我们需要Samba脚本和winbind脚本。 在下一个清单中,将看到启用脚本的命令:

root@cluster-01:~# ctdb event script enable legacy 50.samba
root@cluster-01:~# ctdb event script enable legacy 49.winbind
root@cluster-02:~# ctdb event script enable legacy 50.samba
root@cluster-02:~# ctdb event script enable legacy 49.winbind

启用50.samba和49.winbind后,使用systemctl restart ctdb,并在两个节点上重新启动ctdb。

一段时间后,两个CTDB节点再次变为“正常”。 用s | egrep 'mbd|winbind’和ss -tlpn表示Samba服务正在运行。 现在,您已经配置了CTDB以启动和停止所有Samba服务。

当您执行命令时会发生什么? 如果激活脚本,所有事件脚本都位于/usr/share/ctdb/events/legacy中,该脚本将链接到/etc/ctdb/events/legacy/。 如果您看一下脚本,就会看到,它看起来像是服务的初始化脚本,仅此而已。

检查CTDB集群

在CTDB集群运行并且Samba服务处于活动状态之后,让我们看一下一些CTDB测试。

ctdb status

显示整个集群的实际状态。 列出了所有节点,可以看到所有节点的状态。

root@cluster-02:~# ctdb status
Number of nodes:2
pnn:0 192.168.57.42    OK
pnn:1 192.168.57.43    OK (THIS NODE)
Generation:1823539022
Size:2
hash:0 lmaster:0
hash:1 lmaster:1
Recovery mode:NORMAL (0)
Recovery master:1

此处:

  • 集群中的节点数。
  • 所有节点的{pnn} -number,IP地址和状态的列表。
  • Generation只是一个数字,如果进行重新配置,则数字会发生变化。 没有特别的意义。
  • 集群的大小-这里是2个节点。
  • 行hash: lmaster:用于计算lmaster,它是通过哈希值计算的。
  • Recovery mode显示集群中的所有内容是否正常,或者是否正在进行恢复。
  • Recovery master是负责恢复的节点。

如果只想查看所有节点或仅一个节点或某些主机的状态,则可以使用ctdb nodestatus。 使用nodestatus,可以查看实际节点的状态或主机列表:

root@cluster-01:~# ctdb nodestatus
pnn:0 192.168.57.42    OK (THIS NODE)
root@cluster-01:~# ctdb nodestatus 1
pnn:1 192.168.57.43    OK
root@cluster-01:~# ctdb nodestatus 0,1
pnn:0 192.168.57.42    OK (THIS NODE)
pnn:1 192.168.57.43    OK
root@cluster-01:~# ctdb nodestatus all
Number of nodes:2
pnn:0 192.168.57.42    OK (THIS NODE)
pnn:1 192.168.57.43    OK

还有更多检查集群的可能性:

root@cluster-01:~# ctdb uptime
Current time of node 0        :                Wed Feb 12 18:56:14 2020
Ctdbd start time              : (000 04:53:49) Wed Feb 12 14:02:25 2020
Time of last recovery/failover: (000 04:53:43) Wed Feb 12 14:02:31 2020
Duration of last recovery/failover: 0.573115 seconds
root@cluster-01:~# ctdb listnodes
192.168.57.42
192.168.57.43
root@cluster-01:~# ctdb ping
response from 0 time=0.000124 sec  (20 clients)
root@cluster-01:~# ctdb ip
Public IPs on node 0
192.168.56.101 1
192.168.56.102 0

有关测试CTDB集群的更多信息,请参见ctdb的联机帮助页。

检查所有服务

接下来的重要检查是查看CTDB可以提供哪些服务以及实际配置了哪些服务。 可以使用命令ctdb scriptstatus列出所有正在运行的服务,但是不建议使用此命令。 从Samba 4.9开始,应该使用ctdb event status legacy monitor检查事件脚本。 然后,将看到所有正在运行的(受监视的)服务。 要查看所有服务的列表,请执行ctdb event script list legacy。

root@cluster-01:~# ctdb event status legacy monitor
00.ctdb              OK         0.005 Thu Feb 13 18:28:35 2020
01.reclock           OK         0.023 Thu Feb 13 18:28:35 2020
05.system            OK         0.017 Thu Feb 13 18:28:35 2020
10.interface         OK         0.019 Thu Feb 13 18:28:35 2020
49.winbind           OK         0.011 Thu Feb 13 18:28:35 2020
50.samba             OK         0.101 Thu Feb 13 18:28:35 2020
root@cluster-01:~#  ctdb event script list legacy  
* 00.ctdb
* 01.reclock
* 05.system
  06.nfs
* 10.interface
  11.natgw
  11.routing
  13.per_ip_routing
  20.multipathd
  31.clamd
  40.vsftpd
  41.httpd
* 49.winbind
* 50.samba
  60.nfs
  70.iscsi
  91.lvs

第一条命令显示所有正在运行的服务。 第二个命令显示CTDB可以提供的所有服务,所有正在运行的服务都标有*。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值