问题背景
从原理上将 GBase8s Enterprise Replication 可以实现双写,但在实际经验中不推荐使用双写机制。因其独特的复制技术,在某些场景下存在数据同步冲突的可能性,虽然也提供了一些冲突的解决方案,其本质上已经对数据精准度做了让步。
在实际经验中,更推荐将连接锁定在一个节点上。然而,在运行过程中,不可避免的会发生数据库/服务器故障导致数据库发生切换,在现有机制下,不能保证连接锁定在一个节点,此时可以借用keepalived 非抢占模式的机制,使用虚拟IP锁定连接。
keepalived 原理在本文不做具体介绍,如下提供了一种参考性的实现逻辑
0 gbase 复制集群正常
1 在各节点分别添加一个 0.0.0.0 的监听
gbase8s onsoctcp 0.0.0.0 9088
DBSERVERALIASES gbase8s
2 在各个节点安装keepalived组件
3 keepalived 参考配置
! Configuration File for keepalived
global_defs {
router_id pri
}
vrrp_script chk_db {
script "/home/gbasedbt/chkdb.sh"
interval 30
weight -20
fall 3
rise 2
}
vrrp_instance oldboy {
track_script {
chk_db
}
state BACKUP
interface ens33
virtual_router_id 51
priority 150
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.39.200
}
}
4 切换触发逻辑
#!/bin/bash
source /home/gbasedbt/.bash_profile
timeout 25 dbaccess sysmaster -<<! >/dev/null 2>&1
select 1 from dual;
!
if [ ! $? -eq 0 ];then
killall keepalived
fi