Skip to content
Linux双机热备使用手册
目的:
服务器A(例:192.168.1.34)和服务器B(例:192.168.1.35)互为热冗余服务器,以虚拟IP(例:192.168.1.190)对外工作。
实时数据库安装分别在服务器A和服务器B上安装,本程序检测服务器A和B的网络情况,如果主服务器网络中断,则将服务器B作为主服务器。

注意:
1). 只适用于linux平台
2). 和实时数据库配合使用
3). 数据库已经安装,目录为linux-x64

步骤:
文件夹权限需要设置为644
1). 切换到root用户(su - root),或者用sudo执行以下步骤操作命令(sudo需提升到root权限)
2). 拷贝keepalived_20240411.zip到数据库linux-x64文件下
3). 在linux-x64目录下,执行unzip keepalived_20240411.zip解压压缩包,
	会解压出rtnn_keepalived_ctl、X86文件夹、ARM64文件夹和keepalived文件夹
4). 创建检测脚本目录(mkdir /etc/keepalived)
5). 根据系统架构,移动对应架构的检测脚本到/etc/keepalived/路径下,如X86系统,移动X86文件夹下的config.yaml、op_alive到指定目录(mv X86/config.yaml /etc/keepalived/  以及mv X86/op_alive /etc/keepalived/)
6). 配置权限
	移动到数据库目录下,执行以下命令:
	chmod 777 -R /etc/keepalived/
	chmod 777 rtnn_keepalived_ctl
	chmod 777 -R keepalived/
	chmod 644 keepalived/keepalived.conf
7). 修改切换服务配置文件(linux-x64/keepalived文件夹下keepalived.conf),每个服务器均需要修改:
	A.角色(state),可选项为(BACKUP,BACKUP):代表非抢占模式;可选项为(MASTER,BACKUP):代表抢占模式。
	 例如:34服务器 state BACKUP,35服务器state BACKUP;
	B.网卡(interface),通过命令ifconfig查看需要绑定的网卡,如eth0
	B.优先级(priority),角色为MASTER的优先级要大于为BACKUP的优先级(100 > 99,范围0-200),该参数抢占模式有效。
	C.虚拟IP(virtual_ipaddress),同网段未被占用的IP
	D.其他配置保持默认
8). 编辑/etc/keepalived/config.yaml
	数据库IP:ip: "127.0.0.1"
	数据库端口:port: 8200
	数据库用户名:user: "sis"
	数据库密码:password: "openplant"
	连接超时(建议用默认值):connTimeout: 500  # ms
	读写超时(建议用默认值):rwTimeout: 500  # ms
	数据库目录:dbDir: "/home/magus/linux-x64/"
9).  配置两台服务器数据库镜像,参考:
服务器A->B镜像:
<?xml version="1.0" encoding="UTF-8"?>
<openPlant>

        <Replicator PN="mirror" IP="192.168.1.35" PO="8200" SY="1" >         
                <RepItem PN="W3" TN="W3" XF="0" /> 
        </Replicator>

</openPlant>
服务器B->A镜像:
<?xml version="1.0" encoding="UTF-8"?>
<openPlant>

        <Replicator PN="mirror" IP="192.168.1.34" PO="8200" SY="1" >         
                <RepItem PN="W3" TN="W3" XF="0" /> 
        </Replicator>

</openPlant>


8). 用脚本rtnn_keepalived_ctl控制数据库的启停(./rtnn_keepalived_ctl start|stop),
	切换服务会随着数据库的启停而启停
	
9).ip addr查看
单网卡热备配置
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_script chk_rtnn {
   script "/etc/keepalived/op_alive"
   interval 2
}

vrrp_instance VI_1 {
    state MASTER
    interface enp1s0
    virtual_router_id 70
    priority 100
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.3.240 dev enp1s0 label enp1s0:1	
    }
    track_script {
        chk_rtnn
    }
}
双网卡热备配置
! Configuration File for keepalived

#global_defs {
#   notification_email {         	#设置 keepalived 在发生事件(比如切换)的时候,需要发送到的email地址,可以设置多个,每行一个。
#     acassen@firewall.loc
#     failover@firewall.loc
#     sysadmin@firewall.loc
#   }
#   notification_email_from Alexandre.Cassen@firewall.loc    #设置通知邮件发送来自于哪里,如果本地开启了sendmail的话,可以使用上面的默认值。
#   smtp_server 192.168.200.1   	 #指定发送邮件的smtp服务器。
#   smtp_connect_timeout 30     	 #设置smtp连接超时时间,单位为秒。
#   router_id LVS_DEVEL        		 #是运行keepalived的一个表示,多个集群设置不同。
#}

vrrp_script chk_rtnn {
   script "/etc/keepalived/op_alive"
   interval 2
}

vrrp_sync_group VG1 {     				#下方vrrp实例都放进一个Sync Group,这样的话,group里面任何一个实例出现问题都会发生切换
   group {
      vip_inter     					#实例1
      vip_intra							#实例2
   }
}

vrrp_instance vip_inter {				#实例1配置
    state MASTER						#指定实例初始状态,实际的MASTER和BACKUP是选举决定的。
    interface enp2s0					#指定实例绑定的网卡
    virtual_router_id 51				#设置VRID标记,多个集群不能重复(0..255)
    priority 90							#设置优先级,优先级高的会被竞选为Master,Master要高于BACKUP至少50
    advert_int 1						#检查的时间间隔,默认1s
#   nopreempt            				#设置为不抢占,说明:这个配置只能在BACKUP主机上面设置
#   preempt_delay    			    	#抢占延迟,默认5分钟
#   debug              					#debug级别	
    authentication {					#设置认证
        auth_type PASS					#认证方式,支持PASS和AH,官方建议使用PASS
        auth_pass 1111					#认证的密码
    }
    virtual_ipaddress {					#设置VIP,可以设置多个,用于切换时的地址绑定。格式:#<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL>
        192.168.1.108 dev enp2s0 label enp2s0:1			#IP与网卡名称请根据实际情况修改
    }
    track_script {
        chk_rtnn
    }
}

vrrp_instance vip_intra {				#实例2配置
    state MASTER
    interface enp1s0
    virtual_router_id 52
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.4.203 dev enp1s0 label enp1s0:1			#IP与网卡名称请根据实际情况修改
    }
    track_script {
        chk_rtnn
    }
}

virtual_server  192.168.1.108 8200 {	#VIP地址,要和vrrp_instance模块中的virtual_ipaddress地址一致,请根据真实情况修改
    delay_loop 6						#健康检查时间间隔
    lb_algo sh							#lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind NAT							#负载均衡转发规则NAT|DR|RUN
    nat_mask 255.255.255.0
    protocol TCP
 real_server 192.168.1.107 8200 {		#RS的真实IP地址,请根据真实情况修改
    weight 1   							#默认为1,0为失效
        TCP_CHECK {
                connect_timeout 3		#连接超时时间
#	            nb_get_retry 3 			#重连次数
#	            delay_before_retry 3	#重连间隔时间
        connect_port 8200				#健康检查的端口的端口,请根据真实情况修改
        }
    }

 real_server 192.168.1.106 8200 {		#RS的真实IP地址,请根据真实情况修改
    weight 1   
        TCP_CHECK {
                connect_timeout 3
        connect_port 8200				#健康检查的端口的端口,请根据真实情况修改
        }
    }
}

virtual_server  192.168.4.203 8200 {	#VIP地址,要和vrrp_instance模块中的virtual_ipaddress地址一致,请根据真实情况修改
    delay_loop 6                        #健康检查时间间隔
    lb_algo sh                          #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind NAT                         #负载均衡转发规则NAT|DR|RUN
    nat_mask 255.255.255.0              
    protocol TCP                        
 real_server 192.168.4.161 8200 {       #RS的真实IP地址,请根据真实情况修改
    weight 1                            #默认为1,0为失效
        TCP_CHECK {                     
                connect_timeout 3       #连接超时时间
        connect_port 8200               #健康检查的端口的端口,请根据真实情况修改
        }                               
    }                                   
                                        
 real_server 192.168.4.202 8200 {       #RS的真实IP地址,请根据真实情况修改
    weight 1                            
        TCP_CHECK {                     
                connect_timeout 3       
        connect_port 8200               #健康检查的端口的端口,请根据真实情况修改
        }                               
    }                                   
}