设为首页 收藏本站
查看: 1532|回复: 0

[经验分享] 基于keepalived实现LVS的高可用

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-21 08:54:11 | 显示全部楼层 |阅读模式
                      keepalived简介
首先简单介绍一下VRRP协议(虚拟路由器冗余协议)。VRRP是一种容错协议,它可以将一组路由器组织成一个虚拟路由器,这个虚拟路由器仅适用一个IP地址,这个IP地址配置在其中的一台路由器上,这个路由器即为主路由器(MASTER),其余的为备用路由器(BACKUP)。如果这个路由器组内的MASTER路由器出现故障了,BACKUP路由器将会通过选举策略选出一个新的MASTER路由器继续向外提供服务。这样就保证了网络之间的通信不会中断。
keepalived即采用了VRRP协议实现服务器的高可用,在每个节点上运行keepalived进程,每个keepalived进程能够通过VRRP协议相互通信(通告优先级,选举主节点,配置IP地址.......),当主服务器出现故障,备用服务器可自动代替主服务器继续提供服务。相对于Corosync+Pacemaker,keepalived更加轻量级,当然它的适用场景也有限,一般仅对LVS和反向代理服务器做高可用。


keepalived组件介绍
keepalived结构图:
wKioL1XVoufhlDO7AADuUQ3uIiU188.jpg

Netlink reflector:监控网络接口
IPVS wrapper:为ipvs生成规则,并监控ipvs指向的各real server的健康状况(借助checkers完成)
VRRP Stack:vrrp的具体实现
Checkers:监控ipvs指向的各real server的健康状况
其中VRRP Stack和Checkers为核心组件,为了避免其中的任意组建出现故障而导致keepalived服务无法正常工作,由watchdog监控这两个内部进程的正常运行。

LVS的高可用-主备模型
在使用keepalived对LVS实现高可用时,除了高可用的功能外,还可以为前端的Director生成ipvs规则,并对后端的Real Server的健康状况进行监控。LVS的模型为DR模型,前端两个Director,一主一备,就一个VRRP示例。
实验环境:
时间服务器,控制节点:192.168.1.102
2台Director(node1,node2):
    node1:192.168.1.126
    node2:192.168.1.127
VIP:192.168.1.200

Real Server1:192.168.1.124
Real Server2:192.168.1.125
wKioL1XVqiOCF9bBAACbTbazDIw691.jpg

首先利用ansible的playbook完成高可用集群的实现前提:时间同步,基于主机名相互通信。

1
2
3
4
5
6
7
8
[iyunv@www ansible]# vim /etc/ansible/hosts
[lvs]
192.168.1.126              #LVS的节点1(node1)
192.168.1.127              #LVS的节点2(node2)
  
[web]
192.168.1.124              #Real Server1
192.168.1.125              #Real Server2



对应role的目录结构:

1
2
3
4
5
6
7
[iyunv@www common]# tree
.
├── files
│   ├── hosts
│   └── ntp.conf
└── tasks
    └── main.yml



hosts文件配置各节点能够基于主机名相互通信:

1
2
3
[iyunv@www common]# vim files/hosts
192.168.1.126 node1.xiaoxiao.com node1
192.168.1.127 node2.xiaoxiao.com node2



ntp.conf为ntpd服务的配置文件,在其中指定上级时间服务器的地址:

1
2
3
4
[iyunv@www common]# vim files/ntp.conf
......
server 192.168.1.102
......



将hosts文件和ntp.conf复制到各节点,并启动ntpd服务。
1
2
3
4
5
6
7
[iyunv@www ansible]# vim roles/common/tasks/main.yml
- name: hosts file
  copy: src=hosts dest=/etc/hosts
- name: sync time
  copy: src=ntp.conf dest=/etc/ntp.conf
- name: start ntpd
  service: name=ntpd state=started enabled=no



编辑ha.yml,调用对应的role:
1
2
3
4
5
6
7
8
[iyunv@www ansible]# vim ha.yml
- name: install corosync and crmsh
  remote_user: root
  hosts: lvs
  roles:
  - common
  ######################################
[iyunv@www ansible]# ansible-playbook ha.yml





在base源中就有keepalived,利用yum直接下载即可(RedHat6.4之后)
1
[iyunv@www ansible]# ansible lvs -m yum -a 'name=keepalived state=present'



编辑配置文件/etc/keepalived.conf(node1上)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
! Configuration File for keepalived
global_defs {
   notification_email {
     root@localhost             #当有通知信息时发送邮件至root@localhost
   }
   notification_email_from root@xiaoxiao.com
   smtp_server 127.0.0.1        #指定邮件服务器
   smtp_connect_timeout 3
}
  
vrrp_instance VI_1 {            #定义VRRP实例,VI_1为实例名称
    state MASTER                #这个VRRP实例中,本服务器的角色,MASTER为主节点,BACKUP为备节点
    interface eth0              #服务检测的接口
    virtual_router_id 2         #路由标识,同一个实例,路由标识相同
    priority 100                #优先级,数字越大优先级越高
    advert_int 1                #一个VRRP实例中各节点之间同步的时间间隔
    authentication {
        auth_type PASS          #认证方式
        auth_pass ***********   #认证密码
    }
    virtual_ipaddress {
        192.168.1.200          #定义虚拟ip地址,这里也就是VIP
    }
}
  
virtual_server 192.168.1.200 80 {      #虚拟服务器
    delay_loop 3                       #对后端Real Server轮询的时间间隔
    lb_algo rr                         #负载均衡的调度算法
    lb_kind DR                         #LVS的模型
    nat_mask 255.255.255.0             #子网掩码
    persistence_timeout 20             #连接的持久时长
    protocol TCP                       #转发使用的协议
    sorry_server 127.0.0.1 80          #当Real Server全部停止工作时,请求调度至本机的80端口
    real_server 192.168.1.124 80 {     #定义Real Server
        weight 1                       #设置权重
        HTTP_GET {                     #keepalived检查该Real Server时使用的方式
            url {
              path /                   #检测健康状况时获取的页面(默认页面)
              status_code 200          #期望的返回状态码
            }
            connect_timeout 2          #连接超时时长
            nb_get_retry 3             #连接超时后的重试次数
            delay_before_retry 1       #重试间隔
        }
    }
    real_server 192.168.1.125 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}



将配置文件复制到第2个节点并作相应的修改,注意VRRP实例中state,virtual_route_id,priority和认证信息的配置。
1
2
3
4
5
6
7
8
9
10
11
12
vrrp_instance VI_1 {
    state BACKUP                #此节点为备用节点
    interface eth0
    virtual_router_id 2         #同一个VRRP实例中路由标识必须相同
    priority 90                #权重要低于MASTER节点
    advert_int 1
    authentication {              #认证信息必须相同
        auth_type PASS
        auth_pass ***********
    }
  .........
}



在各Real Server上对arp请求和arp通告做相应的配置,并在lo接口上添加VIP(192.168.1.200)。在控制主机上配置如下脚本,并利用ansible在各Real Server上完成执行。
1
2
3
4
5
6
7
8
9
[iyunv@www ansible]# vim realServer_conf
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ip addr add 192.168.1.200/32 label lo:0 brd 192.168.1.200 dev lo
ip route add 192.168.1.200 dev lo:0
#########################################
[iyunv@www ansible]# ansible web -m script -a 'realServer_conf'



最后在real server上配置好html页面,然后启动httpd服务。在个LVS节点上启动keepalived服务。
1
2
[iyunv@www ansible]# ansible web -m shell -a 'service httpd start'
[iyunv@www ansible]# ansible lvs -m shell -a 'service keepalived start'



wKiom1XVyKvSR7PsAAHE-VDsuY0185.jpg
wKioL1XVzA7A4ZBZAAF0ePdFTIo987.jpg
wKioL1XVzhKQe7B5AACZemAMybI038.jpg
wKiom1XVy_fxcnqrAACbZBV2dCM789.jpg
主节点上VIP已经生成,且LVS的各节点上的ipvs规则已启用。访问测试,能够实现轮询调度。
.................^_^


LVS的高可用-双主模型

在主备模型中,如果主节点没有发生故障,则备用节点一直处于空闲状态,而在高并发的状态下,主节点又很有可能成为系统性能的瓶颈。这时候,可以将备用节点也利用起来,这就是双主模型,在双主模型中,LVS的两个节点上运行两个VRRP实例,其中一个VRRP实例使用IP1(192.168.1.200),且在这个实例中node1为主节点,node2为备用节点,另一个VRRP实例使用IP2(192.168.1.100),这个实例中node1为备用节点,node2为主节点,两个节点都将请求调度至后方的Real Server1和2。其中一个节点故障时,其上的IP地址和对应的ipvs规则转移至另一个节点上,则另一个节点上有两个VIP和两个集群服务。双主模型下,需要两个IP地址,利用DNS服务器在解析时轮询返回这两个IP地址,使用户的请求分散到这两个节点上。这样有效地利用了资源,也提升了服务器的性能。
实验环境:
时间服务器:192.168.1.102
2台Director(node1,node2):
    node1:192.168.1.126
    node2:192.168.1.127
VIP1:192.168.1.200
VIP2:192.168.1.100
Real Server1:192.168.1.124
Real Server2:192.168.1.125
wKiom1XVuO_xFWf5AADLhvglB6s741.jpg
同前一个案例一样,各节点首先完成时间同步,能够基于主机名相互通信,安装keepalived。

编辑配置文件/etc/keepalived.conf(node1上):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
.........
.........
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.1.200
    }
}

vrrp_instance VI_2 {                  #定义第二个VRRP实例
    state BACKUP
    interface eth0
    virtual_router_id 52                #路由标识不同于上一个实例
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass abcdef
    }
    virtual_ipaddress {
        192.168.1.100
    }
}

virtual_server 192.168.1.200 80 {       #两个集群服务除了VIP不一样其他的都一样
    delay_loop 3
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 20
    protocol TCP
    sorry_server 127.0.0.1 80
    real_server 192.168.1.124 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            nb_get_retry 3
            delay_before_retry 1
        }
    }
    real_server 192.168.1.125 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

virtual_server 192.168.1.100 80 {
    delay_loop 3
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 20
    protocol TCP
    sorry_server 127.0.0.1 80
    real_server 192.168.1.124 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            nb_get_retry 3
            delay_before_retry 1
        }
    }
    real_server 192.168.1.125 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}



将配置文件同步至node2上做响应的修改:
1
2
3
4
5
6
7
8
9
10
11
12
13
vrrp_instance VI_1 {
    state BACKUP
    virtual_router_id 51
    priority 90
    .............
}

vrrp_instance VI_2 {
    state MASTER
    virtual_router_id 52
    priority 100
    ...............
}



由于前段的LVS节点上有两个VIP所以后端的Real Server上两个VIP都需要添加。

1
2
3
4
5
6
7
8
9
10
11
[iyunv@www ansible]# vim realServer_conf
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
ip addr add 192.168.1.200/32 label lo:0 brd 192.168.1.200 dev lo
ip route add 192.168.1.200 dev lo:0
ip addr add 192.168.1.100/32 label lo:0 brd 192.168.1.100 dev lo
ip route add 192.168.1.100 dev lo:0
#################################################
[iyunv@www ansible]# ansible lvs -m shell -a 'service keepalived restart'



然后在各节点上启动httpd和keepalive服务。
node1上:
wKiom1XV2EHjwPOsAAIdlA5SIvg151.jpg
node2上:
wKioL1XV2m2SIdr4AAIZRPl2SHA905.jpg
两个节点上集群服务:

wKiom1XV2LzAhZh9AAH_TXtk37M253.jpg
可以看到node1和node2上各自的VIP已经启用,且两节点都为主节点。
现在在node1上停止keepalived服务:
1
2
[iyunv@node1 keepalived]# service keepalived stop
Stopping keepalived:                                       [  OK  ]



wKiom1XV2Wei5ijJAAJW4udn6l4959.jpg
对应的VIP已转移至node2上。
现在停止其中一台Real Server上的httpd服务。
1
2
[iyunv@node1 ~]# service httpd stop
Stopping httpd:                                            [  OK  ]



wKioL1XV3HXAGrM8AAGeW6ZlCvg993.jpg

集群服务上显示仅有192.168.1.125一台Real Server。若停止所有的Real Server。则请求会按照配置文件中的定义,调度至本地的80端口。

wKioL1XV3WXhNcXYAAGR2J_vJfw142.jpg

wKioL1XV3aqTd1jRAACbqkDhfJY106.jpg
测试完成!!!.................^_^
                   


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-101877-1-1.html 上篇帖子: 使用keepalived实现nginx的高可用性 下篇帖子: keepalived+lvs实现调度、高可用、高性能集群
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表