keepalived 配置笔记


keepalived+nginx,实现nginx高可用

  1. VIP不需要在服务器网络配置文件中配置。一般为未使用的IP充当虚拟IP
  2. nginx主不可用时,需要kill掉nginx主的keepalived服务,这样才可以实现VIP切换,因为主的keepalived优先级高。
  3. 故障切换即keepalived主备切换 触发notify_maste(节点变成主节点)指定的脚本
  4. keepalived自带的邮件通知基于sendmail 不推荐使用
  5. 配置文件 /etc/keepalived/keepalived.conf

全局配置

  1. # 全局def配置块
  2. global_defs {
  3. # 将接收通知邮件的电子邮件帐户
  4. notification_email {
  5. coldsmog@foxmai.com
  6. email
  7. }
  8. # sendmail 发送者
  9. notification_email_from coldsmog.work@foxmai.com
  10. # smtp 用于发送邮件通知的服务器地址
  11. smtp_server host
  12. # 指定SMTP处理超时
  13. smtp_connect_timeout 30
  14. # 指定LVS主管的姓名 一般为本机的hostname
  15. lvs_id string
  16. }

虚拟服务器配置

  1. # 虚拟服务器定义块
  2. virtual_server (@IP PORT)|(fwmark num) {
  3. # 以秒为单位指定两次检查之间的间隔
  4. delay_loop 6
  5. # 选择特定的调度程序(rr|wrr|lc|wlc|sh|dh|lblc)
  6. lb_algo rr
  7. # 选择特定的转发方式(NAT|DR|TUN)
  8. lb_kind NAT
  9. # 如果您不将LVS与Linux内核2.2系列一起使用,则“ nat_mask”关键字已过时。该标志使您能够定义反向NAT粒度。
  10. (nat_mask @IP)
  11. # 指定持久连接的超时值
  12. persistence_timeout 50
  13. # 为持久连接指定粒度掩码
  14. persistence_granularity @IP
  15. # 指定用于HTTP | SSL_GET的HTTP虚拟主机
  16. virtualhost string
  17. # 指定协议种类(TCP|UDP)
  18. protocol TCP
  19. # 如果所有真实服务器都已关闭,则将服务器添加到池中
  20. sorry_server @IP PORT
  21. # 指定一个真实的服务器成员
  22. real_server 192.168.201.100 443 {
  23. # 权重
  24. weight 1
  25. # 使用TCP连接检查实际服务器的可用性
  26. TCP_CHECK {
  27. connect_port num
  28. connect_timeout num
  29. }
  30. }
  31. real_server 192.168.200.1 1358 {
  32. weight 1
  33. # 使用用户定义的脚本检查实际服务器的可用性
  34. MISC_CHECK {
  35. # 不需要携带参数
  36. misc_path /path_to_script/script.sh
  37. # 对于需要自变量的脚本,路径和参数必须用双引号(“)引起来
  38. (or misc_path /path_to_script/script.sh <arg_list>”)
  39. }
  40. }
  41. real_server 192.168.200.2 1358 {
  42. weight 1
  43. # 使用(HTTP_GET|SSL_GET)请求检查实际服务器的可用性
  44. HTTP_GET {
  45. # 可以添加多个URL块
  46. url {
  47. path /testurl/test.jsp
  48. digest 640205b7b0fc66c1ea91c463fac6334d
  49. }
  50. url {
  51. path /testurl2/test.jsp
  52. digest 640205b7b0fc66c1ea91c463fac6334d
  53. }
  54. connect_timeout 3
  55. retry 3
  56. delay_before_retry 3
  57. }
  58. }
  59. }

VRRP实例配置

  1. # 标识VRRP同步实例组
  2. vrrp_sync_group string {
  3. group {
  4. string
  5. string
  6. }
  7. # 过渡到主状态、备份状态、故障状态执行的脚本 需要携带参数则“/path_to_script/script_backup.sh <arg_list>”
  8. notify_master /etc/keepalived/send_mail.sh
  9. notify_backup /etc/keepalived/send_mail.sh
  10. notify_fault /etc/keepalived/send_mail.sh
  11. }
  12. # VRRP实例定义块
  13. vrrp_instance VI_1 {
  14. # 声明节点实例状态 (MASTER|BACKUP)
  15. state MASTER
  16. # 指定要在其上运行实例的网络接口 一般为eth0
  17. interface eth0
  18. # 本机IP地址
  19. mcast_src_ip @IP
  20. # 指定要在其上运行lvs_sync_daemon的网络接口
  21. lvs_sync_daemon_interface eth0
  22. # 指定实例所属的VRRP路由器ID, 相同的VRID为一个组,他将决定多播的MAC地址,一般为VIP(xx.xx.xx.73)最后一段
  23. virtual_router_id 73
  24. # 在VRRP路由器中指定实例优先级
  25. priority 100
  26. # 组播信息发送间隔,两个节点设置必须一样,默认1s
  27. advert_int 1
  28. # 激活SMTP通知以进行主状态转换
  29. smtp_alert
  30. #
  31. authentication {
  32. # 指定要使用的身份验证类型(PASS|AH)
  33. auth_type PASS
  34. # 指定要使用的密码字符串 同组节点必须一致
  35. auth_pass string
  36. }
  37. # VRRP VIP定义块 注意VIP必须是没有使用过的IP
  38. virtual_ipaddress { # 限制为20个IP地址
  39. 172.16.xx.73
  40. }
  41. virtual_ipaddress_excluded { # 排查IP地址
  42. @IP
  43. @IP
  44. }
  45. # 过渡到主状态、备份状态、故障状态执行的脚本 需要携带参数则“/path_to_script/script_backup.sh <arg_list>”
  46. notify_master /etc/keepalived/send_mail.sh
  47. notify_backup /etc/keepalived/send_mail.sh
  48. notify_fault /etc/keepalived/send_mail.sh
  49. }

Nginx 检查脚本

如果nginx停止运行,尝试启动,如果无法启动则杀死本机的keepalived进程,keepalied将虚拟ip绑定到BACKUP机器上
vi /etc/keepalived/nginx_check.sh

  1. #!/bin/bash
  2. A=`ps -C nginx –no-header |wc -l`
  3. if [ $A -eq 0 ];then
  4. /usr/sbin/nginx
  5. sleep 2
  6. if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
  7. killall keepalived
  8. fi
  9. fi

来个示例

  1. ! Configuration File for keepalived
  2. global_defs {
  3. router_id esignweb-prod1
  4. vrrp_skip_check_adv_addr
  5. vrrp_strict
  6. vrrp_garp_interval 0
  7. vrrp_gna_interval 0
  8. }
  9. vrrp_script chk_nginx {
  10. script "/etc/keepalived/nginx_check.sh" ## 检测nginx状态的脚本路径
  11. interval 2 ## 检测时间间隔
  12. weight -20 ## 如果条件成立,权重-20
  13. }
  14. vrrp_instance VI_1 {
  15. state BACKUP
  16. interface eth0
  17. virtual_router_id 80
  18. mcast_src_ip 172.16.18.73
  19. priority 99
  20. advert_int 1
  21. authentication {
  22. auth_type PASS
  23. auth_pass 1234
  24. }
  25. ## 将track_script块加入instance 配置块
  26. track_script {
  27. chk_nginx ## 执行Nginx监控的服务
  28. }
  29. ## 虚拟IP池, 两个节点设置必须一样
  30. virtual_ipaddress {
  31. 172.16.18.80
  32. }
  33. }

参考 https://github.com/acassen/keepalived
参考 https://www.cnblogs.com/John-2011/p/7838794.html
参考 http://my.oschina.net/hncscwc/blog/158746


寒烟濡雨 2021年9月1日 14:15 收藏文档