一、原理
在搭建好Keepalived主备高可用架构之后,就能满足24小时不间断的服务,在生产环境上,只要主节点不出故障,那么备用节点就永远不会参与工作,这样就会造成资源的浪费,每台服务器的价格都很昂贵,主节点服务器出问题的时间又很少,这样会造成备用节点的资源浪费,双主热备可以解决这种资源浪费的情况。
在两台Nginx服务器上,服务器1和服务器2,建立一个虚拟IP,就可以将两台服务器构造成主备高可用架构,服务器1为主机,服务器2为备用机,在此基础上再创建一个虚拟IP,在新的虚拟IP之下,服务器2为主机,服务器1为备用机,这样就可以使两台服务器互为主备的关系,其中一台服务器宕机之后,另一台服务器就会绑定两个虚拟IP。
DNS负载均衡:一个域名可以同时绑定多个IP,用户请求经过DNS解析的时候,DNS服务器会按照多个IP的权重比例分配用户请求到对应的IP上。
二、双主热备实现
服务器1配置:
! Configuration File for keepalived
global_defs {
# 路由id,当前节点主机的标识符,保证全局唯一
router_id keep_20
}
vrrp_instance VI_1 {
# 标识状态:MASTER表示主节点,BACKUP表示备用节点
state MASTER
# 该实例绑定的网卡,centos7一般是ens33
interface ens33
# 虚拟路由ID,主备节点须保持一致
virtual_router_id 51
# 权重:master权重一般高于backup,如果有多个备用节点,在master节点挂掉以后,backup权重值最大的,就是新的master
priority 100
# 主备之间同步检查时间间隔,单位为妙
advert_int 3
# 认证权限密码,防止非法节点进入
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.161
}
}
vrrp_instance VI_2 {
# 标识状态:MASTER表示主节点,BACKUP表示备用节点
state BACKUP
# 该实例绑定的网卡,centos7一般是ens33
interface ens33
# 虚拟路由ID,主备节点须保持一致
virtual_router_id 52
# 权重:master权重一般高于backup,如果有多个备用节点,在master节点挂掉以后,backup权重值最大的,就是新的master
priority 80
# 主备之间同步检查时间间隔,单位为妙
advert_int 3
# 认证权限密码,防止非法节点进入
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.162
}
}
服务器2配置:
! Configuration File for keepalived
global_defs {
# 路由id,当前节点主机的标识符,保证全局唯一
router_id keep_21
}
vrrp_instance VI_1 {
# 标识状态:MASTER表示主节点,BACKUP表示备用节点
state BACKUP
# 该实例绑定的网卡,centos7一般是ens33
interface ens33
# 虚拟路由ID,主备节点须保持一致
virtual_router_id 51
# 权重:master权重一般高于backup,如果有多个备用节点,在master节点挂掉以后,backup权重值最大的,就是新的master
priority 80
# 主备之间同步检查时间间隔,单位为妙
advert_int 3
# 认证权限密码,防止非法节点进入
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.161
}
}
vrrp_instance VI_2 {
# 标识状态:MASTER表示主节点,BACKUP表示备用节点
state MASTER
# 该实例绑定的网卡,centos7一般是ens33
interface ens33
# 虚拟路由ID,主备节点须保持一致
virtual_router_id 52
# 权重:master权重一般高于backup,如果有多个备用节点,在master节点挂掉以后,backup权重值最大的,就是新的master
priority 100
# 主备之间同步检查时间间隔,单位为妙
advert_int 3
# 认证权限密码,防止非法节点进入
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.40.162
}
}
注: virtual_router_id只能是主备节点相同(类似于集群的名称),因此上面实例中两个VI_1的virtual_router_id是一样的,两个VI_2的virtual_router_id是一样的,但是VI_1和VI_2的virtual_router_id不能一样。