热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:keepalived基于keepalived实现lvs的高可用

篇首语:本文由编程笔记#小编为大家整理,主要介绍了keepalived-基于keepalived实现lvs的高可用相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了keepalived-基于keepalived实现lvs的高可用相关的知识,希望对你有一定的参考价值。






通告:心跳 优先级等 周期性
挂载方式:抢占式 非强制式
安全认证:
1.无认证 2.简单字符认证:预共享密钥 3.MD5
工作模式:
主/备:单虚拟路由器
主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)
keepalived
基于vrrp协议完成地址流动
为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
为ipvs集群的各RS做健康状态检测
基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务
#/etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个
root@wangxiaochun.com
29308620@qq.com
}
notification_email_from keepalived@localhost #发邮件的地址
smtp_server 127.0.0.1 #邮件服务器地址
smtp_connect_timeout 30 #邮件服务器连接timeout
router_id ka1.example.com#每个keepalived主机唯一标识,建议使用当前主机名,但多节点重名
不影响
vrrp_skip_check_adv_addr#对所有通告报文都检查,会比较消耗性能,启用此配置后,如果收到的
通告报文和上一个报文是同一个路由器,则跳过检查,默认值为全检查
vrrp_strict #严格遵守VRRP协议,启用此项后以下状况将无法启动服务:1.无VIP地址 2.配置了单播邻
居 3.在VRRP版本2中有IPv6地址,开启动此项并且没有配置vrrp_iptables时会自动开启iptables防火墙规则,默认导致VIP无法访问,建议不加此项配置
vrrp_garp_interval 0 #gratuitous ARP messages 报文发送延迟,0表示不延迟 vrrp_gna_interval 0 #unsolicited NA messages (不请自来)消息发送延迟
vrrp_mcast_group4 224.0.0.18 #指定组播IP地址范围:224.0.0.0到239.255.255.255,默认
值:224.0.0.18
vrrp_iptables #此项和vrrp_strict同时开启时,则不会添加防火墙规则,如果无配置
vrrp_strict项,则无需启用此项配置
脑裂:主备节点上都有vip。当主备的rout_id或密码不相同等时,俩个keepalived之间通信不成功的时候,双方都会宣告自己是主服务器,都有vip。
抢占模式:
A state master priority 100
B state backup priority 80
A主down后,vip会切换到备份服务器上,当主服务器恢复的时候,vip会立即切换到主服务器上
非抢占模式
keepalived默认为抢占模式 如果需要修改为非抢占模式需要将俩个节点的state 都修改为backup
即 statue backup
A state backup priority 100 nopreempt
B state backup priority 80 nopreempt
A主down后,vip会切换到备份服务器上,当主服务器恢复的时候,vip依旧会在备份服务器上,不会切换到主服务器上。
抢占延迟模式
A state backup priority 100 preempt_delay 60 #延迟抢占的等待时间
B state backup priority 80
A主down后,vip会切换到备份服务器上,当主服务器恢复的时候,vip不会立即切换到主服务器上,等待60s后切换到主服务器上。
实现主备模式
A:172.18.40.14 B:A:172.18.40.15
主配置文件 /etc/keepalived.conf
global_defs {
notification_email {
sysadmin@firewall.loc #报警邮件收件地址
}
notification_email_from Alexandre.Cassen@firewall.loc #邮件发件地址
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id kp #
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 239.1.1.1 #组播地址
}
include /etc/keepalived/conf.d/*.conf #子配置文件存放路径
A B子配置文件
vrrp_instance m44 {
state BACKUP
interface eth0
virtual_router_id 66
priority 80 #优先级 根据优先级决定开始的主备 A 100 B 80
advert_int 1
authentication {
auth_type PASS # 认证类型
auth_pass 123456 #认证密码
}
virtual_ipaddress {
172.18.40.200 dev eth0 label eth0:0 #vip 绑定在当前主机eth0网卡上
}
#实现单播通告
unicast_src_ip 172.18.40.14 #本机ip
unicast_peer{
172.18.40.15 #指向对方主机的ip,如果有多个则执行多个节点ip
}
}
实现keepalived日志另存
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 6"
[root@cen7 conf.d]# vim /etc/sysconfig/
local6.* /var/log/keepalived.log
systemctl retsart keepalived rsyslog
实现IPVS的高可用性
虚拟服务器配置
virtual_server IP port #定义虚拟主机IP地址及其端口
virtual_server fwmark int #ipvs的防火墙打标,实现基于防火墙的负载均衡集群
virtual_server group string #使用虚拟服务器组
virtual_server IP port { #VIP和PORT
delay_loop #检查后端服务器的时间间隔
lb_algo rr|wrr|lc|wlc|lblc|sh|dh #定义调度方法
lb_kind NAT|DR|TUN #集群的类型,注意要大写
persistence_timeout #持久连接时长
protocol TCP|UDP|SCTP #指定服务协议,一般为TCP
sorry_server #所有RS故障时,备用服务器地址
real_server { #RS的IP和PORT
weight #RS权重
notify_up | #RS上线通知脚本
notify_down | #RS下线通知脚本
HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { ... } #定义当前主机健康状
态检测方法
}
}

实现基于基于keepalived的lvs负载均衡

real-server 配置mariadb+apache
RS1和RS2配置如下:
yum -y install httpd mariadb-server;systemc enable --now httpd mariadb;echo `hostname` > /var/www/html/index.html
创建数据库测试账号:test@'172.18.40.%'
临时修改变量让本机vip地址不去回应arp
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
在回环网卡上配置俩个子地址vip
ifconfig lo:2 172.18.40.222 netmask 255.255.255.255
ifconfig lo:2 172.18.40.111 netmask 255.255.255.255
lvs1 集群mysql主,apache备
lvs2 集群mysql备,apache主
lvs1和lvs2安装上keepalived,ipvsad
lvs1配置如下:
[root@lvs1 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
notification_email {
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id kp
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
vrrp_mcast_group4 229.1.1.1
}
include /etc/keepalived/conf.d/*.conf
[root@lvs1 keepalived]# tree
.
├── conf.d
│ ├── lvs_dr_apache.conf
│ ├── lvs_dr_mysql.conf
│ └── t1.conf
└── keepalived.conf
[root@lvs1 keepalived]# cat conf.d/t1.conf
vrrp_instance test_apache {
state BACKUP
interface eth0
virtual_router_id 66
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.40.111 dev eth0 label eth0:1
}
unicast_src_ip 172.18.40.14 #本机ip
unicast_peer {
172.18.40.15 #指向对方主机的ip,如果有多个则执行多个节点ip
}
}
vrrp_instance test_mysql {
state MASTER
interface eth0
virtual_router_id 77
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.40.222 dev eth0 label eth0:2
}
unicast_src_ip 172.18.40.14 #本机ip
unicast_peer {
172.18.40.15 #指向对方主机的ip,如果有多个则执行多个节点ip
}
}
[root@lvs1 keepalived]# cat conf.d/lvs_dr_apache.conf
virtual_server 172.18.40.111 80 {
delay_loop 3
lb_algo rr
lb_kind DR
protocol TCP
sorry_server 127.0.0.1 80
real_server 172.18.40.22 80 {
weight 1
HTTP_GET {
url {
path /monitor.html
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 172.18.40.23 80 {
weight 1
HTTP_GET { #http健康检查 需要在rs1和rs2上配置monitor.html
url {
path /monitor.html
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
}
[root@lvs1 keepalived]# cat conf.d/lvs_dr_mysql.conf
virtual_server 172.18.40.222 3306 {
delay_loop 3
lb_algo wrr
lb_kind DR
protocol TCP
sorry server 127.0.0.1 3306
real_server 172.18.40.22 3306 {
weight 1
TCP_CHECK {
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
connect_port 3306
}
}
real_server 172.18.40.23 3306 {
weight 1
TCP_CHECK {
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
connect_prot 80
}
}
}
lv2的keepalived目录结构相同 主配置文件配置一样
[root@lvs2 conf.d]# cat t1.conf
vrrp_instance test_apache {
state MASTER
interface eth0
virtual_router_id 66
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.40.111 dev eth0 label eth0:1
}
unicast_src_ip 172.18.40.15 #本机ip
unicast_peer {
172.18.40.14 #指向对方主机的ip,如果有多个则执行多个节点ip
}
}
vrrp_instance test_mysql {
state BACKUP
interface eth0
virtual_router_id 77
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
172.18.40.222 dev eth0 label eth0:2
}
unicast_src_ip 172.18.40.15 #本机ip
unicast_peer {
172.18.40.14 #指向对方主机的ip,如果有多个则执行多个节点ip
}
}
[root@lvs2 conf.d]# cat lvs_dr_apache.conf
virtual_server 172.18.40.111 80 {
delay_loop 3
lb_algo wrr
lb_kind DR
protocol TCP
sorry server 127.0.0.1 80
real_server 172.18.40.22 80 {
weight 1
HTTP_GET {
url {
path /monitor.html
status_code 200
}
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
}
}
real_server 172.18.40.23 80 {
weight 1
TCP_CHECK {
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
connect_prot 80
}
}
}
virtual_server 172.18.40.222 3306 {
delay_loop 3
lb_algo wrr
lb_kind DR
protocol TCP
sorry server 127.0.0.1 3306
real_server 172.18.40.22 3306 {
weight 1
TCP_CHECK {
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
connect_port 3306
}
}
real_server 172.18.40.23 3306 {
weight 1
TCP_CHECK {
connect_timeout 1
nb_get_retry 3
delay_before_retry 1
connect_port 3306
}
}
配置完成后启动keepalibed
[root@lvs2 conf.d]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.18.40.111:80 wrr
-> 172.18.40.22:80 Route 1 0 0
-> 172.18.40.23:80 Route 1 0 0
TCP 172.18.40.222:3306 wrr
-> 172.18.40.22:3306 Route 1 0 0
-> 172.18.40.23:3306 Route 1 0 0
可以查看到lvs的俩个集群 mysql 和 http集群
测试:
[root@localhost ~]# mysql -utest -p123456 -h172.18.40.222 -e 'show variables like "hostname";'
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs2 |
+---------------+-------+
[root@localhost ~]# mysql -utest -p123456 -h172.18.40.222 -e 'show variables like "hostname";'
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs1 |
+---------------+-------+
[root@localhost ~]# curl 172.18.40.111
r2.server
[root@localhost ~]# curl 172.18.40.111
r1.server
[root@localhost ~]# curl 172.18.40.111
r2.server
[root@lvs2 conf.d]# hostname -I
172.18.40.15 172.18.40.111
[root@lvs1 keepalived]# hostname -I
172.18.40.14 172.18.40.222
停止lvs2的keepalived服务,测试lvs的负载均衡
[root@lvs1 keepalived]# hostname -I
172.18.40.14 172.18.40.222 172.18.40.111
在从客户端上去访问mysql和http
[root@localhost ~]# mysql -utest -p123456 -h172.18.40.222 -e 'show variables like "hostname";'
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs2 |
+---------------+-------+
[root@localhost ~]#
[root@localhost ~]# mysql -utest -p123456 -h172.18.40.222 -e 'show variables like "hostname";'
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| hostname | rs1 |
+---------------+-------+
[root@localhost ~]# curl 172.18.40.111
r2.server
[root@localhost ~]# curl 172.18.40.111
r1.server
[root@localhost ~]# curl 172.18.40.111
r2.server
恢复lvs2的keepalived服务,发现http的vip又飘回了lvs2,因实现是采取默认模式即抢占模式。





推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 使用这个技巧要达到的目标:一般来说,模型和控制器你都不会有相同的类名字。让我先创建一个取名为post的model。classPostextendsModel{}现在 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Yii framwork 应用小窍门
    Yiiframework应用小窍门1.YiiFramework]如何获取当前controller的名称?下面语句就可以获取当前控制器的名称了!Php代码 ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
author-avatar
书友78403557
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有