linux-Keepalived 使用

October 17, 2018

Keepalived 构建一个高可用的集群

参考文档:

一、安装

  • centos上安装:yum install keepalived

  • 源码安装:

    wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz
    tar -zxvf keepalived-1.2.24.tar.gz
    cd keepalived-1.2.24
    ./configure --prefix=/usr/local/keepalived
    make && make install
  • keepalived启动时会从/etc/keepalived目录下查找keepalived.conf配置文件,如果没有找到则使用默认的配置文件,使用源码安装时是没有/etc/keepalived这个文件夹的。

  • 需要将配置文件拷贝到系统对应的目录下

    shell> mkdir /etc/keepalived
    shell> cp /usr/local/keepalived/etc/keepalived.conf /etc/keepalived/keepalived.conf
    shell> cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived
    shell> cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
  • 使用命令介绍

    [root@dev_file keepalived]# service keepalived
    用法:/etc/init.d/keepalived {start|stop|status|restart|condrestart|try-restart|reload|force-reload}
    start:启用
    stop:停止
    status:状态
    restart:重启
  • 另外需要注意的一点是,keepalived启动时不会检查配置文件的语法是否正确,所以我们在编写配置文件时要特别小心,别写错了,否则会出现一些意想不到的现象

  • service keepalived start 执行后服务会加载/etc/keepalived/keepalived.conf下的配置文件,可使用-f 参数指定配置文件的位置。

二、使用Keepalived实现一个故障转移的高可用服务

1、需求

  • 一个golang的服务部署多个节点,之前只有一个节点,现在为了高可用需要部署两个节点
  • 不打算使用nginx

2、准备工作

  • 三个节点最少两台服务器
  • 三台安装了keepalived的机器

3、使用,Keepalived的所有功能都是由配置文件配置的

  • keepalived启动之后的日志路径:/var/log/messages
  • vip 虚ip地址在三台服务器中只会有一台有,ip a 查看是否有虚ips是否生成
  • 如下为MASTER 配置
vrrp_instance VI_1 { #vrrp实例名
	state MASTER # 实例状态,只有MASTER和BACKUP两种状态,并且需要全部大写,抢占模式下,其中MASTER为工作状态,BACKUP为备用状态,当MASTER服务失效时,BACKUP所在的服务会自动把它的状态由BACKUP切换到MASTER状态,当失效的MASTER所在的服务恢复时,BACKUP从MASTER恢复到BACKUP状态
	interface eth0 # 对外提供服务的网卡,即vip绑定的网卡接口,如:eth0,eth1
    virtual_router_id 01 #虚拟路由的ID号,每个节点设置必须一样,可选择IP最后一段使用,相同的 VRID 为一个组,一个keepalived集群这个值必须一样
	priority 100 #节点优先级,取值范围0~254,MASTER要比BACKUP高,值越大,优先级越高
	advert_int 1 # MASTER与BACKUP节点间同步检查的时间间隔,单位为秒
	nopreempt # 禁止抢占服务。默认情况,当MASTER服务挂掉之后,BACKUP自动升级为MASTER并接替它的任务,当MASTER服务恢复后,升级为MASTER的BACKUP服务又自动降为BACKUP,把工作权交给原MASTER。当配置了nopreempt,MASTER从挂掉到恢复,不再将服务抢占过来。
	authentication {      #传递信息的认证方式,密码仅支持8位
    		auth_type PASS # 类型主要有 PASS、AH 两种
    		auth_pass 1111 # 同一vrrp 实例MASTER与BACKUP使用相同的密码才能正常通信
	}
	virtual_ipaddress { #虚拟IP地址池,可以有多个IP,每个IP占一行,不需要指定子网掩码。注意:这个IP必须与我们的设定的vip保持一致。
		255.255.10.99
		### 可以配置多个
	}
}
virtual_server 255.255.10.99 80 { #虚拟服务器virtual_server定义块
	delay_loop 10 #健康检查时间间隔,单位:秒 
	lb_algo wrr # 负载均衡调度算法,互联网应用常用方式为wlc或rr
	lb_kind NAT # 负载均衡转发规则。包括DR、NAT、TUN3种,一般使用路由(DR)转发规则,DR和NAT效率最高,但是有使用场景限制
	persistence_timeout 50 # http服务会话保持时间,单位:秒 
    protocol TCP # 转发协议,分为TCP和UDP两种
   	# 下面的配置用户检测服务故障,然后剔除到vrrp集群中
	real_server 255.255.10.203 8081 { #真实服务器IP和端口,可以定义多个
		weight 2 # 负载权重,值越大,转发的优先级越高 
		HTTP_GET { # 使用HTTP_GET来检查服务的状态,也可以使用 TCP_CHECK
			url {
				path /beat
				digest 7bd3d5f5b3cdb13aed632121206e729c # 这个值是一个md5的求和,安装keepalived之后有一个工具用来求和,
				# genhash -s 255.255.10.203 -p 8081 -u /beat 执行这个命令就可以算出digest值
			}
			connect_timeout 3 #服务连接超时时长,单位:秒 
            retry 3 # 重试次数
            delay_before_retry 2 #重试连接间隔
		}
	}
	
	real_server 255.255.10.204 8081 { #另一个节点
                weight 2
                HTTP_GET {
                        url {
                                path /beat
                                digest 7bd3d5f5b3cdb13aed632121206e729c
                        }
                        connect_timeout 3
                        retry 3
                        delay_before_retry 2
                }
        }
}
  • 如下为BACKUP的配置

    vrrp_instance VI_1 {
            state  BACKUP # BACKUP
    		interface eth0
            virtual_router_id 01
            priority 99 # 比master下
            advert_int 1
    		nopreempt
            authentication {      //传递信息的认证方式,密码仅支持8位
                    auth_type PASS
                    auth_pass 1111
            }
            virtual_ipaddress {
                    255.255.10.99
            }
    }
    virtual_server 255.255.10.99 8000 {
            delay_loop 6
            lb_algo wrr
            lb_kind NAT
            persistence_timeout 50
            protocol TCP
    
            real_server 255.255.10.204 8081 {
                    weight 1
    				HTTP_GET {
    					url {
    						path /beat
    						digest 7bd3d5f5b3cdb13aed632121206e729c
    					}
    					connect_timeout 3
                		retry 3
                		delay_before_retry 2
    			}
            }
    		real_server 255.255.10.203 8081 {
                    weight 2
                    HTTP_GET {
                            url {
                                    path /beat
                                    digest 7bd3d5f5b3cdb13aed632121206e729c
                            }
                            connect_timeout 3
                            retry 3
                            delay_before_retry 2
                    }
            }
    }

  • 日志查看,停止255.255.10.204 8081 上的服务,就会打印如下的日志

    Mar 30 18:36:01 dev_file Keepalived_healthcheckers[23744]: Error connecting server [255.255.10.204]:8081.
    Mar 30 18:36:01 dev_file Keepalived_healthcheckers[23744]: Removing service [255.255.10.204]:8081 from VS [255.255.10.99]:80
  • 日志查看,启动255.255.10.204 8081服务,打印如下日志

    Mar 30 18:36:49 dev_file Keepalived_healthcheckers[23744]: MD5 digest success to [255.255.10.204]:8081 url(1).
    Mar 30 18:36:59 dev_file Keepalived_healthcheckers[23744]: Remote Web server [255.255.10.204]:8081 succeed on service.
    Mar 30 18:36:59 dev_file Keepalived_healthcheckers[23744]: Adding service [255.255.10.204]:8081 to VS [255.255.10.99]:80

参考文档


LRF 记录学习、生活的点滴