1 安装前准备
1.1 软硬件配置建议
最好确保各节点间的操作系统、CPU等服务器配置保持一致,否则可能会严重影响集群的整体性能,尤其是故障切换后可能存在响应服务请求慢的情况;
心跳系统对MAL的影响程度较大,如果网络丢包或延迟过大,则会影响系统对于节点状态的判断,严重影响MAL系统的处理能力,导致整个集群响应变慢。为保证集群稳定性,对网络环境的建议配置如下:
- 使用千兆或千兆以上网络;
- 集群间的心跳同步数据时,尽量使用两个交换机构建内网,以实现冗余和负载均衡;
- 两个网卡(使用bond方式等)联结成一个逻辑网卡使用。一般来说,这对外提供一个统一的虚拟网络接口,以提高带宽和冗余度;在Linux中,存在负载均衡(balance-rr)、主动-备用(active-backup)、链路聚合(802.3ad)等方式。
对Vote Disk和DCR Disk / DCRV的简述:
- Vote Disk:主要用于集群仲裁和故障检测,确保在网络分区或节点故障时保持集群的一致性和高可用性;它通过投票机制来决定哪些节点可以继续运行;
- DCR Disk(Disk Configuration Repository Disk):主要用于存储和管理集群配置和状态信息,帮助集群管理系统进行监控、配置和故障恢复。它确保集群在节点故障或重启后能够快速恢复正常运行。
- DCR V(Disk Configuration Repository Volume,磁盘配置存储卷):是用于存储和管理高可用性集群系统中关键配置和状态信息的磁盘卷,基本功能同DCR Disk,只是作业单位不同。
1.2 集群规划
官方文档给出的当在A / B机器上使用两个独立显卡分别承担独立的业务网络IP和心跳网络IP情形下的理论集群规划表如下。在A机器和B机器之外配置确认监视器IP为192.168.1.4。监视器一般设置在独立于主备节点之外的机器上:
A 机器 | B 机器 | |
---|---|---|
业务 IP | 172.16.1.1 | 172.16.1.2 |
心跳 IP | 192.168.1.1 | 192.168.1.2 |
实例名 | GRP1_RT_01 | GRP1_RT_02 |
实例端口 | 5236 | 5236 |
MAL 端口 | 5336 | 5336 |
MAL 守护进程端口 | 5436 | 5436 |
守护进程端口 | 5536 | 5536 |
OGUID | 45331 | 45331 |
守护组 | GRP1 | GRP1 |
安装目录 | /home/dmdba/dmdbms | /home/dmdba/dmdbms |
实例目录 | /dmdata/data | /dmdata/data |
归档上限 | 51200 | 51200 |
通常,心跳IP会配置在一个独立的网络 / 虚拟局域网VLAN上,该网络与业务网络隔离,以确保心跳信号的可靠传输,其实现方式包括独立网卡(适用于数据中心等高可用集群)、VLAN和软件定义网络SDN等,我们这里为简化配置,选择在同一宿主机上用不同的Container的端口映射实现。
1.3 集群架构
搭建的主备集群架构如下图1-1:
1.4 切换模式说明
故障切换方式 | dmarch | dmwatcher | dmmonitor | 监视器要求 |
---|---|---|---|---|
故障手动切换 | ARCH_WAIT_APPLY=0 | DW_MODE=MANUAL | MON_DW_CONFIRM=0 | 1. 配置手动切换:集群各节点的 bin 目录中,存放非确认监视器配置文件。 |
故障自动切换 | ARCH_WAIT_APPLY=0 | DW_MODE=AUTO | MON_DW_CONFIRM=1 | 1. 配置手动切换:集群各节点的 bin 目录中,存放非确认监视器配置文件。 2. 配置自动切换:在确认监视器上(非集群节点),存放确认监视器配置文件,并注册后台自启服务。 |
对ARCH_WAIT_APPLY参数解释如下:
- 该配置用于指定:当备库收到Redo日志后,是否在重演完成之后再响应主库;
- 有两个值可选:当值为0时,备库在收到后立即响应(高性能模式);当值为1时,备库在重演完成后响应(事务一致模式)。
- 配置为及时归档(Timely Archiving)时,默认值为0;配置为实时归档(Real-time Archiving)时,默认值为1;
- 故障手动切换情境下 ARCH_WAIT_APPLY 只能为 0。故障自动切换情境下 ARCH_WAIT_APPLY 可以为 0,也可以为 1。
ARCH_WAIT_APPLY 参数设置的判断依据为业务是否要查询备机最新数据。如果需要,则配置为 1(较大性能衰减);如果不需要,则配置为 0。
2 集群搭建
这里我们使用Docker容器来模拟集群的搭建。
由图1-1所知,在实际生产环境中本次需要用到3台机器,分别作为主库、备库和监视器;而通过Docker,我们可以在同一台主机上创建3个Container来模拟实现,分别用数据库实例A,数据库实例B和监视器C指代。
2.1 配置A机器
2.1.1 创建Business和Heartbeat网络
创建自定义网络并指定子网的命令如下:
[dmdba@VM-8-6-centos ~]$ docker network create --subnet=172.16.1.0/24 dmwatch-test-business
870c978be7747a6922eece5ad9eb960e30190fd0cf4891d16126f9b21eb43e43
[dmdba@VM-8-6-centos ~]$ docker network create --subnet=192.168.1.0/24 dmwatch-test-heartbeat
f0c46f65d5ee0529fead4335f5c34b8c803a248edf8a66f643849412a52c6348
[dmdba@VM-8-6-centos ~]$ docker network ls
NETWORK ID NAME DRIVER SCOPE
a43284433c5f bridge bridge local
870c978be774 dmwatch-test-business bridge local
f0c46f65d5ee dmwatch-test-heartbeat bridge local
1879a5df6908 docker_gwbridge bridge local
665f2e7911f3 host host local
1s23qjcabtlz ingress overlay swarm
9f5805c8eb61 none null local
此时已成功创建业务网络和心跳网络dmwatch-test-business
和dmwatch-test-heartbeat
。创建完成后可以使用如下命令查看网络详情:
[dmdba@VM-8-6-centos ~]$ docker network inspect dmwatch-test-business
[
{
"Name": "dmwatch-test-business",
"Id": "870c978be7747a6922eece5ad9eb960e30190fd0cf4891d16126f9b21eb43e43",
"Created": "2024-08-27T17:27:30.85677936+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {
},
"Config": [
{
"Subnet": "172.16.1.0/24",
"Gateway": "172.16.1.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
},
"Options": {
},
"Labels": {
}
}
]
[dmdba@VM-8-6-centos ~]$ docker network inspect dmwatch-test-heartbeat
[
{
"Name": "dmwatch-test-heartbeat",
"Id": "f0c46f65d5ee0529fead4335f5c34b8c803a248edf8a66f643849412a52c6348",
"Created": "2024-08-27T17:29:18.804362399+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {
},
"Config": [
{
"Subnet": "192.168.1.0/24",
"Gateway": "192.168.1.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
},
"Options": {
},
"Labels": {
}
}
]
可见两个子网的第一个可用设备地址分别都已经作为subnet的Gateway使用,故我们的部署需要从至少第二个可用IP开始分配。根据实际情况调整1.2小节中的集群规划如下:
A 机器 | B 机器 | |
---|---|---|
业务 IP | 172.16.1.2 | 172.16.1.3 |
心跳 IP | 192.168.1.2 | 192.168.1.3 |
实例名 | GRP1_RT_01 | GRP1_RT_02 |
实例端口 | 5236 | 5236 |
MAL 端口 | 5336 | 5336 |
MAL 守护进程端口 | 5436 | 5436 |
守护进程端口 | 5536 | 5536 |
OGUID | 45331 | 45331 |
守护组 | GRP1 | GRP1 |
安装目录 | /home/dmdba/dmdbms | /home/dmdba/dmdbms |
实例目录 | /dmdata/data | /dmdata/data |
归档上限 | 51200 | 51200 |
2.1.2 创建数据库实例并启动服务
执行如下命令创建数据库实例并启动服务。通过该docker run命令,在初始化时指定连接到dmwatch-test-business:
docker run -d --restart=always --name=GRP1_RT_01 --network dmwatch-test-business --ip 172.16.1.2 --privileged=true -e LD_LIBRARY_PATH=/opt/dmdbms/bin -e PAGE_SIZE=32 -e EXTENT_SIZE=32 -e LOG_SIZE=2048 -e UNICODE_FLAG=1 -e INSTANCE_NAME=GRP1_RT_01 -v GRP1_RT_01:/opt/dmdbms/data dm8_single:dm8_20240715_rev232765_x86_rh6_64
初始化完成后,Container已经连接到business网络。此时再将容器与heartbeat网络连接并验证,有:
docker network connect --ip 192.168.1.2 dmwatch-test-heartbeat GRP1_RT_01
docker inspect GRP1_RT_01
#只截取Networks部分返回值
"Networks": {
"dmwatch-test-business": {
"IPAMConfig": {
"IPv4Address": "172.16.1.2"
},
"Links": null,
"Aliases": null,
"MacAddress": "02:42:ac:10:01:02",
"NetworkID": "870c978be7747a6922eece5ad9eb960e30190fd0cf4891d16126f9b21eb43e43",
"EndpointID":