24 Samba 群集 #
群集 Samba 服务器提供异构网络的高可用性解决方案。本章说明了一些背景信息以及如何设置群集 Samba 服务器。
24.1 概念概述 #
Samba 使用 Trivial Database (TDB) 已经许多年了。它允许多个应用程序同时写入。为确保所有写操作都成功执行而不会彼此冲突,TDB 使用内部锁定机制。
Cluster Trivial Database (CTDB) 是现有的 TDB 的小扩展。项目对 CTDB 的描述是:“Samba 和其他项目用于储存临时数据的 TDB 数据库的群集实现”。
每个群集节点都运行本地 CTDB 守护程序。Samba 与其本地 CTDB 守护程序通讯,而非直接写入其 TDB。守护程序通过网络交换元数据,但实际的读写操作是在快速储存的本地副本上进行的。CTDB 的概念如图 24.1 “CTDB 群集的结构”中所示。
CTDB 资源代理的当前实现将 CTDB 配置为只管理 Samba。任何其他功能,包括 IP 故障转移,都应使用 Pacemaker 进行配置。
CTDB 仅支持完全同类的群集。例如,群集中的所有节点都需要具有相同的体系结构。不能混用 x86 与 AMD64。
群集 Samba 服务器必须共享某些数据:
将 Unix 用户和组 ID 与 Windows 用户和组关联的映射表。
用户数据库必须在所有节点间同步。
Windows 域中的成员服务器的连接信息必须在所有节点上都可用。
元数据(如活动 SMB 会话、共享连接和各种锁)需在所有节点上都可用。
目标是:具有 N+1 个节点的群集 Samba 服务器比只有 N 个节点的快。一个节点不会比非群集 Samba 服务器慢。
24.2 基本配置 #
CTDB 资源代理会自动更改 /etc/sysconfig/ctdb
。使用 crm ra
info CTDB
列出可为 CTDB 资源指定的所有参数。
要设置群集 Samba 服务器,请按如下操作:
准备群集:
继续操作之前,请确保以下软件包均已安装:tdb-tools、ctdb 和 samba(
smb
和nmb
资源需要这些软件包)。根据本指南的第 II 部分 “配置和管理”中所述配置您的群集(Pacemaker、OCFS2)。
配置并挂载共享文件系统(如 OCFS2),例如挂载到
/srv/clusterfs
上。有关更多信息,请参见第 19 章 “OCFS2”。要打开 POSIX ACL,请启用它:
对新的 OCFS2 文件系统,使用:
root #
mkfs.ocfs2
--fs-features=xattr ...对现有 OCFS2 文件系统,使用:
root #
tunefs.ocfs2
--fs-feature=xattr DEVICE确保在文件系统资源中指定了
acl
选项。按如下方式使用crm
外壳:crm(live)configure#
primitive
ocfs2-3 ocf:heartbeat:Filesystem params options="acl" ...
确保
smb
、ctdb
和nmb
服务已禁用:root #
systemctl
disable ctdbroot #
systemctl
disable smbroot #
systemctl
disable nmb在所有节点上打开防火墙的端口
4379
。这是为了使 CTDB 能够与其他群集节点通讯。
在共享文件系统上为 CTDB 锁定创建一个目录:
root #
mkdir
-p /srv/clusterfs/samba/在
/etc/ctdb/nodes
中插入包含群集中每个节点的所有私用 IP 地址的所有节点:192.168.1.10 192.168.1.11
配置 Samba。在
/etc/samba/smb.conf
的[global]
部分中添加下面几行。使用所选的主机名取代“CTDB-SERVER”(群集中的所有节点将显示为一个此名称的大节点,以方便操作):[global] # ... # settings applicable for all CTDB deployments netbios name = CTDB-SERVER clustering = yes idmap config * : backend = tdb2 passdb backend = tdbsam ctdbd socket = /var/lib/ctdb/ctdb.socket # settings necessary for CTDB on OCFS2 fileid:algorithm = fsid vfs objects = fileid # ...
使用
csync2
将配置文件复制到您的所有节点:root #
csync2
-xv
有关详细信息,请参见过程 4.6 “使用 Csync2 同步配置文件”。
将 CTDB 资源添加到群集:
root #
crm
configurecrm(live)configure#
primitive
ctdb CTDB params \ ctdb_manages_winbind="false" \ ctdb_manages_samba="false" \ ctdb_recovery_lock="/srv/clusterfs/samba/ctdb.lock" \ ctdb_socket="/var/lib/ctdb/ctdb.socket" \ op monitor interval="10" timeout="20" \ op start interval="0" timeout="90" \ op stop interval="0" timeout="100"crm(live)configure#
primitive
nmb systemd:nmb \ op start timeout="60" interval="0" \ op stop timeout="60" interval="0" \ op monitor interval="60" timeout="60"crm(live)configure#
primitive
smb systemd:smb \ op start timeout="60" interval="0" \ op stop timeout="60" interval="0" \ op monitor interval="60" timeout="60"crm(live)configure#
group
g-ctdb ctdb nmb smbcrm(live)configure#
clone
cl-ctdb g-ctdb meta interleave="true"crm(live)configure#
colocation
col-ctdb-with-clusterfs inf: cl-ctdb cl-clusterfscrm(live)configure#
order
o-clusterfs-then-ctdb Mandatory: cl-clusterfs cl-ctdbcrm(live)configure#
commit
添加群集 IP 地址:
crm(live)configure#
primitive
ip IPaddr2 params ip=192.168.2.222 \ unique_clone_address="true" \ op monitor interval="60" \ meta resource-stickiness="0"crm(live)configure#
clone
cl-ip ip \ meta interleave="true" clone-node-max="2" globally-unique="true"crm(live)configure#
colocation
col-ip-with-ctdb 0: cl-ip cl-ctdbcrm(live)configure#
order
o-ip-then-ctdb 0: cl-ip cl-ctdbcrm(live)configure#
commit
如果
unique_clone_address
设置为true
,IPaddr2 资源代理将向指定的地址添加一个克隆 ID,从而导致出现三个不同的 IP 地址。这些地址通常是不需要的,但有助于实现负载平衡。有关此主题的更多信息,请参见第 15.2 节 “使用 Linux 虚拟服务器配置负载平衡”。提交更改:
crm(live)configure#
commit
检查结果:
root #
crm
status Clone Set: cl-storage [dlm] Started: [ factory-1 ] Stopped: [ factory-0 ] Clone Set: cl-clusterfs [clusterfs] Started: [ factory-1 ] Stopped: [ factory-0 ] Clone Set: cl-ctdb [g-ctdb] Started: [ factory-1 ] Started: [ factory-0 ] Clone Set: cl-ip [ip] (unique) ip:0 (ocf:heartbeat:IPaddr2): Started factory-0 ip:1 (ocf:heartbeat:IPaddr2): Started factory-1从客户端计算机进行测试。在 Linux 客户端上运行以下命令,以检查能否从系统复制文件以及将文件复制到系统:
root #
smbclient
//192.168.2.222/myshare
24.3 加入 Active Directory 域 #
Active Directory (AD) 是 Windows Server 系统的一项目录服务。
下列说明概述了如何将 CTDB 群集加入到 Active Directory 域:
按照过程 24.1 “设置基本的群集 Samba 服务器”中所述创建 CTDB 资源。
安装 samba-winbind 软件包。
禁用
winbind
服务:root #
systemctl
disable winbind定义 winbind 群集资源:
root #
crm
configurecrm(live)configure#
primitive
winbind systemd:winbind \ op start timeout="60" interval="0" \ op stop timeout="60" interval="0" \ op monitor interval="60" timeout="60"crm(live)configure#
commit
编辑
g-ctdb
组,并在nmb
与·smb
资源之间插入winbind
:crm(live)configure#
edit
g-ctdb使用 :–w (
vim
) 保存更改并关闭编辑器。有关如何设置 Active Directory 域的说明,请参见 Windows Server 文档。在此示例中,使用以下参数:
AD 和 DNS 服务器
win2k3.2k3test.example.com
AD 域
2k3test.example.com
群集 AD 成员 NETBIOS 名称
CTDB-SERVER
最后,将群集加入 Active Directory 服务器:
请确保 Csync2 的配置中包含下列文件,才可在所有群集主机上进行安装:
/etc/samba/smb.conf /etc/security/pam_winbind.conf /etc/krb5.conf /etc/nsswitch.conf /etc/security/pam_mount.conf.xml /etc/pam.d/common-session
您也可以为此任务使用 YaST 的第 4.5 节 “将配置传输到所有节点”。
模块,请参见运行 YaST 并从
项中打开 模块。输入域或工作组设置然后单击
完成设置。
24.4 调试和测试群集 Samba #
要调试群集 Samba 服务器,可使用以下作用于不同级别的工具:
ctdb_diagnostics
运行此工具可诊断群集 Samba 服务器。详细的调试消息应有助于您跟踪任何可能存在的问题。
ctdb_diagnostics
命令可搜索以下文件,这些文件必须在所有节点上都可用:/etc/krb5.conf /etc/hosts /etc/ctdb/nodes /etc/sysconfig/ctdb /etc/resolv.conf /etc/nsswitch.conf /etc/sysctl.conf /etc/samba/smb.conf /etc/fstab /etc/multipath.conf /etc/pam.d/system-auth /etc/sysconfig/nfs /etc/exports /etc/vsftpd/vsftpd.conf
如果文件
/etc/ctdb/public_addresses
和/etc/ctdb/static-routes
存在,它们也会被检查。ping_pong
检查文件系统是否支持 CTDB 使用
ping_pong
。它会对群集文件系统执行一致性和性能之类的特定测试(请参见 http://wiki.samba.org/index.php/Ping_pong),从而给出群集在高负载下将会表现如何的一些指示。send_arp
工具和SendArp
资源代理SendArp
资源代理位于/usr/lib/heartbeat/send_arp
(或/usr/lib64/heartbeat/send_arp
)。send_arp
工具发出免费的 ARP(Address Resolution Protocol,地址解析协议)包,可用于更新其他计算机的 ARP 表。它可以帮助确定故障转移过程之后的通讯问题。如果节点对 Samba 显示了群集 IP 地址,但您却无法连接到节点或 ping 到它,请使用send_arp
命令测试节点是否只需要 ARP 表更新。有关详细信息,请参见 https://gitlab.com/wireshark/wireshark/-/wikis/home。
要测试群集文件系统的某些方面,请如下继续操作:
在一个节点上启动命令
ping_pong
,将占位符 N 替换为节点数 + 1。文件ABSPATH/data.txt
在共享存储区中提供,因此在所有节点(ABSPATH 表示绝对路径)上都可以访问到:ping_pong
ABSPATH/data.txt N应该会得到很高的锁定率,因为只运行一个节点。如果程序不打印锁定率,请替换群集文件系统。
使用相同的参数在另一个节点上启动
ping_pong
的第二个副本。应该会看到锁定率急剧下降。如果以下任意情况适用于群集文件系统,请替换它:
ping_pong
不打印每秒锁定率,两个实例中的锁定率并非几乎相等,
启动第二个实例后锁定率未下降。
启动
ping_pong
的第三个副本。添加另一个节点,注意锁定率的变化。逐个终止
ping_pong
命令。应该观察到锁定率上升,直到回到单一节点的情况。如果没有看到预期行为,请参见第 19 章 “OCFS2” 中的详细信息。