高可用

1    基于Keepalived的高可用支持

Keepalived开源项目提供Linux服务器的Keepalive后台进程,一个管理虚拟路由(虚拟IP地址)的虚拟路由冗余协议(VRRP)实现,和一个健康检查设施决定是否一个服务(例如,Web服务器,PHP后端或数据库服务器)是可用的。如果服务失败,Keepalived将主(活跃)节点重新分配虚拟IP地址到备用节点。

VRRP确保同时只有一个主节点。备用节点监听VRRP来自主节点的广播。如果超过三倍广播时间间隔没有收到广播包,备用节点接管主节点和虚拟IP地址。

2    配置高可用

注意:该解决方案设计的工作环境是能通过标准操作系统调用控制IP地址,通常不会再通过使用云设施的接口控制IP地址的云环境中工作。

运行nginx-ha-setup脚本(在nginx-ha-keepalived包中)两个节点作为root用户。脚本配置高可用主备Nginx环境。它提示输入以下数据:

  • 本地IP地址和远程节点(将配置为主备的节点)

  • 一个自由的IP地址用作集群终端的(漂浮)虚拟IP地址

Keepalived后台的配置记录在/etc/keepalived/keepalived.conf文件中。文件中的配置块控制通知设置、虚拟IP地址和健康监测。以下是CentOS7上的nginx-ha-setup脚本创建的配置文件。

vrrp_script chk_nginx_service {

    script "/usr/libexec/keepalived/nginx-ha-check"

    interval 3

    weight 50

}

 

vrrp_instance VI_1 {

    interface eth0

    state BACKUP

    priority 101

    virtual_router_id 51

    advert_int 1

    unicast_src_ip 192.168.100.100

    unicast_peer {

        192.168.100.101

    }

    authentication {

        auth_type PASS

        auth_pass f8f0e5114cbe031a3e1e622daf18f82a

    }

    virtual_ipaddress {

        192.168.100.150

    }

    track_script {

         chk_nginx_service

    }

    notify "/usr/libexec/keepalived/nginx-ha-notify"

}

 配置描述:

  • 在HA安装的每个节点需要一个配置文件备份,使用适合节点角色(主/备)的priority、unicast_src_ip和unicast_peer指令的值。

  • priority指令控制成为主节点的主机,下一节中描述。

  • notify指令指定通知脚本,当状态过渡或发生错误时用于产生系统消息(或其它通知)。

  • vrrp_instance VI_1块中的virtual_router_id的值是51;必须在环境中唯一。

如果你有多对Keepalived实例(或其它VRRP实例)运行在本地网络,为每个实例使用唯一名称(像VI_1)和virtual_router_id号创建一个vrrp_instance块。

3    使用健康检查脚本控制主控权

如果两个节点成对不知道对方,每个节点假设自己是主节点并分配虚拟IP地址给自己。为了避免这种情况,配置文件定义可执行脚本机制,chk_nginx_service运行一个脚本定期检查是否Nginx是运行的,基于脚本的返回代码调整本地节点的优先级。代码0表示正确运行,代码1(或任意非0代码)表示错误。

在脚本的配置实例中,weight指令设置为50,意味着当检查脚本成功(返回代码0):

  • 第一个节点的优先级设置为151(基础优先级是101)

  • 第二个节点的优先级设置为150(基础优先级是100)

第一个节点有更高的优先级(151),成为主节点。

interval指令指定检查脚本多久执行一次,单位为秒。注意,如果超时检查失败(默认,超时时间与检查周期相同)。

rise和fall指令(实例中没有使用)指定脚本必须成功或失败多少次才采取行动。

4    禁用节点状态

为了查看当前那个节点是指定虚拟IP地址的主节点,运行ip addr show命令:

centos7-1 # ip addr show eth0

2: eth0: <BROADCAST ,MULTICAST ,UP,LOWER_UP > mtu 1500 qdisc pfifo_fast state

     UP qlen 1000

    link/ether 52:54:00:33:a5:a5 brd ff:ff:ff:ff:ff:ff

    inet 192.168.100.100/24 brd 192.168.122.255 scope global dynamic eth0

       valid_lft 3071sec preferred_lft 3071sec

    inet 192.168.100.150/32 scope global eth0

       valid_lft forever preferred_lft forever

 

centos7-2 # ip addr show eth0

2: eth0: <BROADCAST ,MULTICAST ,UP,LOWER_UP > mtu 1500 qdisc pfifo_fast state

     UP qlen 1000

    link/ether 52:54:00:33:a5:87 brd ff:ff:ff:ff:ff:ff

    inet 192.168.100.101/24 brd 192.168.122.255 scope global eth0

       valid_lft forever preferred_lft forever

 在该输出中,centos7-1的第二个inet表示它是主节点——定义虚拟IP地址(192.168.100.150)分配给它。另一个inet行显示它的真实IP地址(192.168.100.100),备份节点的Ip地址(192.168.100.101)。

节点的当前状态记录在本地/var/run/nginx-ha-keepalived.state文件中。你能使用cat命令显示它:

centos7-1 # cat /var/run/nginx-ha-keepalived.state

STATE=MASTER

 

centos7-2 # cat /var/run/nginx-ha-keepalived.state

STATE=BACKUP

 5    强制改变状态

为了强制主节点变为备用节点,运行以下命令:

# service keepalived stop

 因为它关闭,Keepalived使用优先级0发送VRRP包给备用节点,导致备用节点接管虚拟IP地址。

6    添加更多虚拟IP地址

通过nginx-ha-setup脚本创建配置是非常基础的,产生单个IP地址的高可用。为了产生更多的高可用IP地址,添加新的IP地址到virtual_ipaddress块中。

virtual_ipaddress {

    192.168.100.150

    192.168.100.200

    1234:5678:9abc:def::1/64

}

 运行service Keepalived reload命令重载Keepalived服务:

centos7-1 # service keepalived reload

 

centos7-2 # service keepalived reload

 如上所示,Keepalived能利用IPv4/IPv6双协议栈环境。

7    Keepalived和VRRP排错

Keepalived守护进程使用系统日志工具记录日志。在基于CentOS、RHEL和SLES的系统,输出通常写入/var/log/messages,然而在基于Ubuntu和Debian的系统,写入/var/log/syslog。日志条目记录事件,例如Keepalived守护进程启动和状态转变。

Feb 27 14:42:04 centos7-1 systemd: Starting LVS and VRRP High Availability Monitor...

Feb 27 14:42:04 Keepalived [19242]: Starting Keepalived v1.2.15 (02/26,2015)

Feb 27 14:42:04 Keepalived [19243]: Starting VRRP child process, pid=19244

Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering Kernel netlink reflector

Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering Kernel netlink command channel

Feb 27 14:42:04 Keepalived_vrrp [19244]: Registering gratuitous ARP shared channel

Feb 27 14:42:05 systemd: Started LVS and VRRP High Availability Monitor.

Feb 27 14:42:05 Keepalived_vrrp [19244]: Opening file '/etc/keepalived/keepalived.conf '.

Feb 27 14:42:05 Keepalived_vrrp [19244]: Truncating auth_pass to 8 characters

Feb 27 14:42:05 Keepalived_vrrp [19244]: Configuration is using: 64631 Bytes

Feb 27 14:42:05 Keepalived_vrrp [19244]: Using LinkWatch kernel netlink reflector...

Feb 27 14:42:05 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Entering BACKUP STATE

Feb 27 14:42:05 Keepalived_vrrp [19244]: VRRP sockpool: [ifindex(2), proto(112), unicast(1), fd(14,15)]

Feb 27 14:42:05 nginx -ha-keepalived: Transition to state 'BACKUP ' on VRRP instance 'VI_1 '.

Feb 27 14:42:05 Keepalived_vrrp [19244]: VRRP_Script(chk_nginx_service) succeeded

Feb 27 14:42:06 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) forcing a new MASTER election

Feb 27 14:42:06 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) forcing a new MASTER election

Feb 27 14:42:07 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Transition to MASTER STATE

Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Entering MASTER STATE

Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) setting protocol VIPs.

Feb 27 14:42:08 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.150

Feb 27 14:42:08 nginx -ha-keepalived: Transition to state 'MASTER ' on VRRP instance 'VI_1 '.

Feb 27 14:42:13 Keepalived_vrrp [19244]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 192.168.100.150

如果系统日志没有说明问题源,使用以下参数运行tcpdump命令显示发送到本地网络的VRRP广播:

# tcpdump -vvv -ni eth0 proto vrrp 

 如果你有多个VRRP实例在本地网络,你只想输出通信节点和关注指定的服务,包括host参数并使用unicast_peer块指定关注着的IP地址:

centos7-1 # tcpdump -vvv -ni eth0 proto vrrp and host 192.168.100.101

tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

14:48:27.188100 IP (tos 0xc0, ttl 255, id 382, offset 0, flags [none],

    proto VRRP (112), length 40)

    192.168.100.100 > 192.168.100.101: vrrp 192.168.100.100 >

        192.168.100.101: VRRPv2 , Advertisement , vrid 51, prio 151,

        authtype simple , intvl 1s, length 20, addrs: 192.168.100.150 auth

        "f8f0e511"

几个对调试输出有用的字段:

  •  authtype——使用的验证类型(通过authentication指令设置)
  • vrip——虚拟路由ID(通过virtual_router_id指令设置)

  • prio——节点的优先级(通过priority指令设置)

  • intvl——发送广播频率(通过advert_int指令设置)

  • auth——身份验证令牌(通过auth_pass指令设置)

8    保持Nginx配置文件同步

Nginx配置文件在两个节点必须定义服务高可用。保持配置文件同步是集群软件之外的范围。配置例子在/usr/share/doc/nginx-ha-keepalived/目录中。

转载于:https://my.oschina.net/leeck/blog/729997

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值