1、简介
CTDB(Cluster Trivial Database,集群琐碎数据库)是一种轻量级的集群数据库实现,是集群Samba的集群数据库组件,主要用于处理Samba的跨节点消息以及在所有集群节点上实现分布式的TDB数据库。
CTDB的主要功能:
1) 提供TDB数据库的集群版本,并在节点故障时自动重建/恢复数据库;
2) 监视集群中的节点和每个节点上运行的服务;
3) 管理用于向客户端提供服务的公共IP地址池。或者,CTDB可与LVS一起使用;
现今,CTDB不仅支持管理Samba,而且也支持管理NFS、HTTPD、VSFTPD、ISCSI、WINBIND等应用。
2、CTDB的运行机制
为了使用CTDB,需要一个分布式文件系统(比如:GFS、CephFS、OCFS2等)为集群中的所有节点共享。CTDB 管理节点成员、执行恢复/故障切换、IP 重新定位以及监控管理服务的状态。
集群中每个节点都运行了一个CTDB的守护进程ctdbd,以Samba为例,应用服务并不是直接向其TDB数据库写入数据,而是与它的本地ctdbd守护进程进行交互,守护进程会通过网络与TDB数据库中的元数据进行交互。但是对于具体的数据写和读操作,一般是在本地存储上维护一个本地的副本。
CTDB拥有两种TDB文件:普通的和持久性的。根据不同的需求,CTDB对这两种TDB文件的处理方式完全不同:
1) 持久性的TDB文件会实时更新,并在每个节点上存储一个最新的副本。为了读写性能的考虑,持久性的TDB文件保存在本地存储上而不是共享存储中。数据在写入持久TDB时,它会锁定整个CTDB数据库,然后执行读/写操作,事务提交操作最终会被分发到所有节点,并在每个节点的本地写入。
2) 普通TDB文件是临时维护的,其原则是:每个节点不必知道数据库中的所有记录,只需知道影响它自己的客户端连接的记录就足够了。所以,即使某个节点宕机,丢失了此节点相关的所有普通TDB记录,也不会影响其他节点。
CTDB的运行机制如下图所示。
CTDB与Samba在集群之间的关系如下图所示:
3、CTDB进程
CTDB主要有两个进程:ctdb_daemon和ctdb_recoverd。
1) ctdb_daemon进程
ctdb_daemon 进程的工作如下:
a) 负责与外部进行通信,提供 tdb 操作及处理来自其它节点的消息,并处理来自本节点的消息(包括设置服务状态,TDB操作,IP takeover,来自节点recoverd的消息等);
b) 定期检查监控的服务状态,通过运行监控脚本,查询各个服务的运行状态;
c) 期检查检查ctdb_recoverd进程是否在运行,如果未运行,则重建该进程;
d) 将其它节点发给 ctdb_recoverd 的消息转给 ctdb_recoverd;
e) 当本节点是修复节点时(recmaster),将修复相关的请求转给ctdb_recoverd进程处理,包括选举修复节点,强制重新分配公共IP,以及将修复消息转发给其它节点等。
ctdb_daemon进程通过epoll机制处理事件,比如:定期查看各节点状态,当状态异常时,执行相应的处理。
2)ctdb_recoverd进程
ctdb_recoverd进程负责定期向ctdb_daemon进程查询系统状态;当需要修复时,发起选举过程,选出修复节点。在需要修复且被选为修复节点时,启动修复过程:通知所有节点进入修复状态、修复TDB、公共IP重新分配对接管的公共IP,主动触发TCP重连。
说明:
CTDB本身不是HA解决方案,但与集群文件系统相结合,它可以提供简单且高效的HA集群解决方案:
集群配置两组IP:Private IP用于heartbeat和集群内部通信。Public IP用于对外提供虚拟访问IP,当内部的节点发生宕机故障时,CTDB将调度其他可用节点接管其原先分配的Public IP,故障节点恢复后,漂移的Public IP会重新被接管,保证服务不中断。
这个过程对客户端是透明的,保证应用不会中断,也就是我们这里所说的高可用HA。