- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本篇主要学习 keepalived 配合 nginx 实现nginx的高可用, 也就是需要keepalived检测到nginx宕机时停用keepalived, 备用keepalived会自动接收过来. 。
简单的原理(如下图), 主备服务器会配置相同的vip(虚拟ip), 谁的优先级高谁来接收vip的请求, 然后nginx和keepalived部署在同一个服务器上面, keeplived控制机器接收到vip的请求, 交给了nginx来处理请求. nginx的功能主要是负责负载均衡, nginx的安装配置在此不再赘述, 可以参考这个: ngix安装与使用 。
keepalived功能有很多, 此篇只是最简单的配合ngxin实现高可用的demo. 。
安装常用的的指令包: yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel 。
安装: yum install -y keepalived 。
启动: systemctl start keepalived 。
重启: systemctl restart keepalived 。
关闭: systemctl stop keepalived 。
开机自启: systemctl enable keepalived 。
修改配置文件: vim /etc/keepalived/keepalived.conf 。
! Configuration File for keepalived
# 定义虚拟路由, 必须叫VI_1
vrrp_instance VI_1 {
state MASTER #设置为主服务器, 备份服务器设置为BACKUP
interface enp0s3 #监控的网络接口(ifconfig或者ip addr指令找出网卡)
priority 100 #(优先级, 主机大一点, 备份机小一点)
virtual_router_id 99 #同一个vrrp_instance下routerId必须是一致的
authentication {
auth_type PASS #vrrp认证方式主备必须一致
auth_pass 12345 #密码
}
virtual_ipaddress {
192.168.0.99 #虚拟ip, 主从一致, 可配置多个
}
}
另外一台机相同方法, 相同配置(state改成 BACKUP , priority调整调一下, 此例中是80) 。
vrrp 的主从并不是通过stat配置的 MASTER 和 BACKUP 决定的, 是通过优先级决定的 。
/var/log/message
位置修改参考: keepalived 配置日志方法 参考1: Linux下Keepalived安装与配置 。
参考2: Keepalived原理介绍和配置实践 。
参考3: keepalived介绍、安装及配置详解 。
参考4: https://codor.lanzoue.com/b012qnsvc 密码:1i77 。
使用 tcpdump -i enp0s3 -nn host 224.0.0.18 或者 tcpdump -i enp0s3 | grep VRRP 进行查看, 默认的广播通道为 224.0.0.18 (我把时间删除了, 内容是我改的) 。
192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
192.168.0.117 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 80, authtype simple, intvl 1s, length 20
192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
192.168.0.117 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 80, authtype simple, intvl 1s, length 20
192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
192.168.0.117 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 80, authtype simple, intvl 1s, length 20
如果结果如上, 说明出现了脑裂(主备都向外宣誓我是老大).
出现这种情况的原因是防火墙或者iptables拦截了vrrp请求, 进行放行即可. 。
防火墙(推荐)
firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent
firewall-cmd --reload
iptables
iptables -A INPUT -s 192.168.1.0/24 -d 224.0.0.18 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p vrrp -j ACCEPT
不存在可以进行安装, yum install iptables-services 。
参考1: Keepalived高可用切换过程 。
参考2: centos7 keepalived VRRP协议 firewalld配置 。
参考3: keepalived的脑裂问题与解决 。
参考4: 使用keepalived时iptables需要开放的协议 。
参考5: linux iptables防火墙中的工作常用命令 。
最后附上正常运行结果, 即只有100或者80优先级的机器来广播自己是老大 。
09:26:55.782258 IP 192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
09:26:56.782910 IP 192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
09:26:57.783787 IP 192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
09:26:58.784709 IP 192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
09:26:59.784792 IP 192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
09:27:00.785171 IP 192.168.0.111 > 224.0.0.18: VRRPv2, Advertisement, vrid 99, prio 100, authtype simple, intvl 1s, length 20
ip漂移 : 就是主备切换过程成, vip漂到真实ip上的过程. 也称为 主备切换 . 。
测试过程就是停用master机器上面的keepalived或者关机master机器, 查看backup机器是否正常接过来, 一般1s左右可以切换过去. 当出现脑裂情况的时候切换过程也能实现, 只是很慢大约7s左右. 具体原因未深究. 。
漂移过程可以通过抓包实现, 也可以通过两给ngxin转发到不同tomcat中的项目或网页, 或者修改ngxin的默认网页进行测试都可. 。
至此位置简单使用就完成了, 下面介绍几个功能配置 。
签到keepalived的配置文件夹: cd /etc/keepalived/ 。
创建一个脚本文件: vim nginx_check.sh 。
#!/bin/bash
count=`ps -C nginx --no-header |wc -l`
if [ $count -eq 0 ];then
killall keepalived
fi
赋予执行权限: chmode +x nginx_check.sh 。
引入脚本: vim keepalived.conf 。
与 vrrp_instance 同级, 其中 。
chk_nginx : 脚本名称, 自定义的 。
script : 脚本位置 。
interval : 执行间隔 。
weight : 权重, 如果是负数, 当执行失败时候会影响vrrp_instance中的优先级priority, 因为主备切换是通过优先级的高低的进行切换的, 所以也可以通过这个优先级来进行主动控制主备切换. 而脚本中的内容可以很灵活地实现很多功能. 此个demo中只是简单实现检测到ngxin关闭后自动关闭keepalived, 也可以实现检测启动后进行开启, 然后延迟2s后查看是否启动成功, 未成功再进行关闭keepalived或者降低优先级(配合右键通知). 。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
#weight -30
}
配置到vrrp_instance中, 与authentication和virtual_ipaddress同级 。
track_script {
chk_nginx
}
修改后的配置文件 。
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
#weight -30
}
vrrp_instance VI_1 {
state MASTER
interface enp0s3
priority 100
advert_int 1
virtual_router_id 99
authentication {
auth_type PASS
auth_pass 221531
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.0.99
}
}
测试 。
正常启动时候, 手动关闭nginx, 查看keepalived的状态. 。
参考
参考1: keepalived之vrrp_script详解 。
参考2: Keepalived 的主备切换怎么做 。
邮件功能是linux上面的 mail 指令. 。
安装 mail : yum -y install mailx 。
编辑配置文件(设置发送人信息): vim /etc/mail.rc , 在末尾处添加 。
set from=xxx@163.com
set smtp=smtp.163.com
set smtp-auth-user=xxx@qq.com
set smtp-auth-password=KJFHTOSXZQPNFAIU #邮箱需要开启POP3/SMTP服务并设置密钥
set smtp-auth=login
set ssl-verify=ignore
测试mail功能: echo test mail | mail -s testa 收件人id@qq.com 。
-s 后面是主题的意思 。
echo test maill 中的test mail 是邮件正文. 。
最后跟着收件人 。
配置到keepalived中, 方法1 。
创建脚本 vim mail_send.sh (记得赋予执行权限) 。
可以使用 ./mail_send.sh master 进行测试 。
#!/bin/bash
contact='收件人邮箱@qq.com'
notify() {
mailsubject="$(hostname) to be $1, vip 转移"
mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
修改配置文件: vim keepalived.conf 。
vrrp_instance下与authentication同级处 。
notify_master "/etc/keepalived/mail_send.sh master"
notify_backup "/etc/keepalived/mail_send.sh backup"
notify_fault "/etc/keepalived/mail_send.sh fault"
整体配置文件 。
! Configuration File for keepalived
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
#weight -30
}
vrrp_instance VI_1 {
state MASTER
interface enp0s3
priority 100
advert_int 1
virtual_router_id 99
# 当进入master/backup/fault状态时触发脚本, 可携带参数
notify_master "/etc/keepalived/mail_send.sh master"
notify_backup "/etc/keepalived/mail_send.sh backup"
notify_fault "/etc/keepalived/mail_send.sh fault"
authentication {
auth_type PASS
auth_pass 221531
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.0.99
}
}
配置到keepalived中, 方法2 。
脚本内容, 下面这个是漂移到master时, 另外创建backup和fault 。
#!/bin/bash
contacts='收件人邮箱1, 收件人邮箱2'
ip a > ipa_temp.txt
echo "$(date +'%F %T'): Keepalived instance I became MASTER on $(hostname). --- from master" | mail -s "Master Keepalived notification" -a ipa_temp.txt "$contacts"
修改配置文件: vim keepalived.conf 。
vrrp_instance下与authentication同级处, 后面的 root 是执行人和所在组 。
notify_master /etc/keepalived/mail_send_master.sh root root
notify_backup /etc/keepalived/mail_send_backup.sh root root
notify_fault /etc/keepalived/mail_send_fault.sh root root
测试状态转移时有没有邮箱接收到即可, 通过重启, 停用 。
参考
参考1: keepalived 日志设置 、邮箱设置和通知 。
参考2: keepalived邮件通知 。
参考3: Keepalived故障切换时的邮件通知 。
参考4: mail指令同时发送给多个用户 。
最后此篇关于keepalived的简单使用的文章就讲到这里了,如果你想了解更多关于keepalived的简单使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!