keepalived配置文件详解
- 格式:doc
- 大小:30.50 KB
- 文档页数:6
LVS+Keepalived实现高可用集群一、基础介绍 (2)二、搭建配置LVS-NA T模式 (2)三、搭建配置LVS-DR模式 (4)四、另外一种脚本方式实现上面LVS-DR模式 (6)五、keepalived + LVS(DR模式) 高可用 (8)六、Keepalived 配置文件详细介绍 (11)一、基础介绍(一)根据业务目标分成三类:High Availability 高可用Load Balancing 负载均衡High Performance 高性能(二)实现集群产品:HA类:rhcs、heartbeat、keepalivedLB类:haproxy、lvs、nginx、f5、piranhaHPC类:/index/downfile/infor_id/42(三)LVS 负载均衡有三种模式:LVS-DR模式(direct router)直接路由模式进必须经过分发器,出就直接出LVS-NAT模式(network address translation)进出必须都经过分发器LVS-TUN模式(ip tunneling)IP隧道模式服务器可以放到全国各地二、搭建配置LVS-NAT模式1 、服务器IP规划:DR服务器添加一张网卡eth1,一个网卡做DIP,一个网口做VIP。
设置DIP、VIP IP地址:DIP的eth1和所有RIP相连同一个网段CIP和DIP的eth0(Vip)相连同一个网段Vip eth0 192.168.50.200Dip eth1 192.168.58.4客户机IP:Cip 192.168.50.32台真实服务器IP:Rip1 192.168.58.2Rip2 192.168.58.32 、R ealServer1配置:mount /dev/xvdd /media/vi /var/www/html/index.html写入:this is realserver1启动httpdvi /etc/sysconfig/network-scripts/ifcfg-eth0设置RIP,子网掩码必须设置成DIPIPADDR=192.168.58.2NETMASK=255.255.255.0GA TEWAY=192.168.58.43 、R ealServer2 配置:vi /var/www/html/index.html写入:this is realserver2启动httpdvi /etc/sysconfig/network-scripts/ifcfg-eth0设置RIP,子网掩码必须设置成DIPIPADDR=192.168.58.3NETMASK=255.255.255.0GA TEWAY=192.168.58.44 、在DR服务器上做以下设置:开启IP数据包转发vi /etc/sysctl.confnet.ipv4.ip_forward = 0 ##0改成1 ,此步很重要查看是否开启:sysctl -p5 、安装LVS服务:ipvsadmyum -y install ipvsadmlsmod |grep ip_vsTurbolinux系统没有带rpm包,必须下载源码安装:#ln -s /usr/src/kernels/2.6.18-164.el5-x86_64/ /usr/src/linux##如果不做连接,编译时会包错#tar zxvf ipvsadm-1.24.tar.gz#cd ipvsadm-1.24#make && make install运行下ipvsadm ,就加到ip_vs模块到内核了lsmod | grep ip 可以看到有ip_vs模块了6 、配置DR服务器,添加虚拟服务ipvsadm -L -n 查询信息ipvsadm -A -t 192.168.50.200:80 -s rr #添加集群服务、调度算法,rr为调度算法ipvsadm -a -t 192.168.50.200:80 -r 192.168.58.2 -m -w 1 # -m代表net模式,-w代表权重ipvsadm -a -t 192.168.50.200:80 -r 192.168.58.3 -m -w 2ipvsadm -L -n 再次查看是就有了realserverservice ipvsadm save 保存配置iptables -L 关闭或者清空防火墙watch -n 1 'ipvsadm -L -n' 查看访问记录的数显示如下:-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.50.200:80 rr-> 192.168.58.2:80 Masq 1 0 13-> 192.168.58.3:80 Masq 2 0 12ActiveConn是活动连接数,也就是tcp连接状态的ESTABLISHED;InActConn是指除了ESTABLISHED以外的,所有的其它状态的tcp连接.7 、测试:http://192.168.58.200配完后若想修改算法:ipvsadm -E -t 192.168.58.200:80 -s wlc修改Rip的权重:ipvsadm -e -t 192.168.58.200:80 -r 192.168.58.2 -m -w 1ipvsadm -e -t 192.168.58.200:80 -r 192.168.58.3 -m -w 5三、搭建配置LVS-DR模式lo:1 回应客户端,lo:1上的IP跟机器有关,跟网卡没有关系arp_announce 对网络接口上本地IP地址发出的ARP回应作出相应级别的限制arp_ignore 定义对目标地址为本地IP的ARP询问不同的请求一、3台服务器IP配置规划:DIP:eth0:1 192.168.58.200/32 (VIP)eth0 192.168.58.3/24 (DIP)RIP1 lo:1 192.168.58.200/32 (VIP)eth0 192.168.58.4/24RIP2 lo:1 192.168.58.200/32 (VIP)eth0 192.168.58.5/24 .................................................................RIP n lo:1 192.168.58.200/32 (VIP)eth0 192.168.58.N/24二、每台realserver都加上下面四个步骤配置:1 、配置每台rip的IP、http,web页面2 、关闭每台rip服务器的ARP广播:echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignoreecho 2 > /proc/sys/net/ipv4/conf/lo/arp_announceecho 1 > /proc/sys/net/ipv4/conf/all/arp_ignoreecho 2 > /proc/sys/net/ipv4/conf/all/arp_announce3 、配置VIPifconfig lo:1 192.168.58.200 netmask 255.255.255.255 broadcast 192.168.58.200 up4 、配置网关route add -host 192.168.58.200 dev lo:1三、DR上的配置(DR模式下Dip不用开启转发):1 、配置DIP,在eth0上添加一个子VIP接口:添加VIP:ifconfig eth0:1 192.168.58.200 broadcast 192.168.58.200 netmask 255.255.255.255 up2 、配置网关:route add -host 192.168.58.200 dev eth0:1route -n3 、安装ipvsadm(方法见文档上面)yum -y install ipvsadmlsmod |grep ip_vs4 、配置LVS集群:ipvsadm -A -t 192.168.58.200:80 -s rr #添加集群服务、调度算法,rr为调度算法ipvsadm -a -t 192.168.58.200:80 -r 192.168.58.3 -g -w 1 # -g代表DR模式,-w代表权重ipvsadm -a -t 192.168.58.200:80 -r 192.168.58.2 -g -w 2service ipvsadm saveipvsadm -L -n 查看信息四、测试:http://192.168.58.200四、另外一种脚本方式实现上面LVS-DR模式IP规划:Dip eth0 192.168.58.139VIP:192.168.58.200RIP1:192.168.58.2RIP2:192.168.58.31 、D R服务器上安装ipvsadm#yum -y install ipvsadm#lsmod | grep ip_vs 查看没有输出#modprobe ip_vs 安装即可2 、配置DIP服务器、LVS这里也是个写脚本为了方便vim /etc/init.d/lvsdr#!/bin/bash#lvs of DRVIP=192.168.58.200RIP1=192.168.58.2RIP2=192.168.58.3case "$1" instart)echo "start lvs of DR"/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.0 up echo "1" > /proc/sys/net/ipv4/ip_forward/sbin/iptables -C/sbin/ipvsadm -A -t $VIP:80 -s rr/sbin/ipvsadm -a -t $VIP:80 -r $RIP1:80 -g/sbin/ipvsadm -a -t $VIP:80 -r $RIP2:80 -g/sbin/ipvsadm;;stop)echo "stop lvs of DR"echo "0" > /proc/sys/net/ipv4/ip_forward/sbin/ipvsadm -C/sbin/ifconfig eth0:0 down;;*)echo "Usage :$0 {start|stop}"exit1esacexit 0#chmod o+x /etc/init.d/lvsdr启动脚本:#service lvsdr start3 、2台RIP服务器都配置这里我们也都可以写成脚本开启2台RIP的httpd服务。
keepalived配置⽇志1.编辑配置⽂件/etc/sysconfig/keepalived,将第14⾏的KEEPALIVED_OPTIONS="-D"修改为KEEPALIVED_OPTIONS="-D -d -S 0"sudo sed -i '14 s#KEEPALIVED_OPTIONS="-D"#KEEPALIVED_OPTIONS="-D -d -S 0"#g' /etc/sysconfig/keepalived# 说明:# --dump-conf -d 导出配置数据# --log-detail -D 详细⽇志信息# --log-facility -S 设置本地的syslog设备,编号0-7# -S 0表⽰指定为local0设备2.修改rsyslog的配置⽂件sudo vi /etc/rsyslog.conf,在结尾加⼊如下2⾏内容,将local0设备的所有⽇志都记录到/var/log/keepalived.log⽂件# keepalivedlocal0.* /var/log/keepalived.log在42⾏第⼀列尾加⼊";local0.none",表⽰来⾃local0设备的所有⽇志信息不再记录于/var/log/messages⾥*.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages3.重启rsyslog服务$ sudo service rsyslog restart关闭系统⽇志记录器: [确定]启动系统⽇志记录器: [确定]4.测试keepalived⽇志记录结果。
重启keepalived服务,查看⽇志信息。
$ sudo tail -f /var/log/keepalived.log。
keepalived安装文档1.安装依赖su - rootyum -y install kernel-devel*yum -y install openssl-*yum -y install popt-develyum -y install lrzszyum -y install openssh-clients2.安装keepalived2.1.上传1、cd /usr/local2、rz –y3、选择keepalived安装文件2.2.解压tar –zxvf keepalived-1.2.2.tar.gz2.3.重命名mv keepalived-1.2.2 keepalived2.4.安装keepalived1、cd keepalived2、执行命令./configure --prefix=/usr/local/keepalived -enable-lvs-syncd --enable-lvs --with-kernel-dir=/lib/modules/2.6.32-431.el6.x86_64/build3、编译make4、安装make install2.5.配置服务和加入开机启动cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/mkdir -p /etc/keepalivedcp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ ln -s /usr/local/keepalived/sbin/keepalived /sbin/chkconfig keepalived on2.6.修改配置文件1、vi /etc/keepalived/keepalived.conf23.按照上面步骤安装备机器注意:备的配置文件不相同。
keepalived配置文件详解keepalived配置文件详解2010-12-27 13:40global_defs {notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个sysadmin@fire.loc}notification_email_from Alexandre.Cassen@firewall.loc #指定发件人smtp_server localhost #指定smtp服务器地址smtp_connect_timeout 30 #指定smtp连接超时时间router_id LVS_DEVEL #运行keepalived机器的一个标识}vrrp_sync_group VG_1{ #监控多个网段的实例group {inside_network #实例名outside_network}notify_master /path/xx.sh #指定当切换到master时,执行的脚本netify_backup /path/xx.sh #指定当切换到backup时,执行的脚本notify_fault "path/xx.sh VG_1" #故障时执行的脚本notify /path/xx.shsmtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知}vrrp_instance inside_network {state BACKUP #指定那个为master,那个为backup,如果设置了nopreempt这个值不起作用,主备考priority决定interface eth0 #设置实例绑定的网卡dont_track_primary #忽略vrrp的interface错误(默认不设置)track_interface{ #设置额外的监控,里面那个网卡出现问题都会切换eth0eth1}mcast_src_ip #发送多播包的地址,如果不设置默认使用绑定网卡的primary ipgarp_master_delay #在切换到master状态后,延迟进行gratuitous ARP请求virtual_router_id 50 #VPID标记priority 99 #优先级,高优先级竞选为masteradvert_int 1 #检查间隔,默认1秒nopreempt #设置为不抢占注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高preempt_delay #抢占延时,默认5分钟debug #debug级别authentication { #设置认证auth_type PASS #认证方式auth_pass 111111 #认证密码}virtual_ipaddress { #设置vip192.168.202.200}}virtual_server 192.168.202.200 23 {delay_loop 6 #健康检查时间间隔lb_algo rr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dhlb_kind DR #负载均衡转发规则NAT|DR|RUNpersistence_timeout 5 #会话保持时间protocol TCP #使用的协议persistence_granularity <NETMASK> #lvs会话保持粒度virtualhost <string> #检查的web服务器的虚拟主机(host:头)sorry_server<IPADDR> <port> #备用机,所有realserver失效后启用real_server 192.168.200.5 23 {weight 1 #默认为1,0为失效inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除notify_up <string> | <quoted-string> #在检测到server up后执行脚本notify_down <string> |<quoted-string> #在检测到server down后执行脚本TCP_CHECK {connect_timeout 3 #连接超时时间nb_get_retry 3 #重连次数delay_before_retry 3 #重连间隔时间connect_port 23 健康检查的端口的端口bindto <ip>}HTTP_GET | SSL_GET{url{ #检查url,可以指定多个path /digest <string> #检查后的摘要信息status_code 200 #检查的返回状态码}connect_port <port>bindto <IPADD>connect_timeout 5nb_get_retry 3delay_before_retry 2}SMTP_CHECK{host{connect_ip <IP ADDRESS>connect_port <port> #默认检查25端口bindto <IP ADDRESS>}connect_timeout 5retry 3delay_before_retry 2helo_name <string> | <quoted-string> #smtp helo请求命令参数,可选}MISC_CHECK{misc_path <string> | <quoted-string> #外部脚本路径misc_timeout #脚本执行超时时间misc_dynamic #如设置该项,则退出状态码会用来动态调整服务器的权重,返回0 正常,不修改;返回1,检查失败,权重改为0;返回2-255,正常,权重设置为:返回状态码-2}}。
keepalived配置文件解析系列之(三)配置文件解析过程keepalived配置文件解析系列之(三)配置文件解析过程virHappy(zhuozch@)如(一)所言,keepalived在配置文件解析方面拥有非常灵活的方式,采用关键字分层(每层的关键字数量不限,且关键字的层次也不限制)的方法进行组织一个配置文件,且支持平行或者嵌套地include多个其它配置文件语句和正则表达式记法的配置文件名。
文(二)中介绍了k eepalived关键字的存储和相关的操作,下面将具体分析怎么样解析配置文件。
一、入口点及全局流程位于parser.c文件中的init_data(char *conf_file, vector (*init_keywords) (void))函数是解析配置文件的入口点,该函数第一个参数为需要解析的配置文件名(可以由正则表达式构成,如*.conf),第二个参数为函数指针,指向关键字组织结构(实际取值为check_init_k eywords或者vrrp_init_keywords)。
解析配置文件过程中用到的几个全局变量包括current_keywords(当前关键字列表)、k eywords(层次为0的关键字列表,整个关键字组织的最顶层)、current_stream(当前打开的文件的流,即文件指针,指向当前打开的文件,因为keepalived支持嵌套的文件,所以必须设置这样的变量)、current_conf_file(当前解析的文件的名字,同上,是为支持嵌套的配置文件而设立的)、kw_level(当前关键字列表的层次,处理下一层关键字列表之前递增,回退到上一层关键字列表时递减)。
全局流程如下: 在init_data()中,调用read_conf_file(conf_file),把要解析的配置文件的名字传递给read_conf_file()函数;read_conf_file()函数先利用glob库取得所有的co nf_file(尤其是带正则表达式符号的名字), 然后依次根据当前关键字列表current_keywor ds,调用process_stream(current_keywords)进行配置文件的解析。
keepalived的配置解析安装与爬坑⽬录:⼀. 前情提要⼆. 官⽅配置说明三. 案例解析四. 其他配置⽅式收集五. 爬坑附1: 安装keepalived------------------------⼀. 前情提要以下试验以及说明是经过试验确定了的,准确!!另外,如果想知道每个参数的真正含义,建议看官⽹解决的问题:1,当⼀个节点(Linux设备)挂了,2个VIP都浮动到⼀个节点上2,当这个节点(Linux设备)好了,由于业务有⼀定的延时,所以还不想浮动IP⽴马漂移回来3,如果⼀个节点的业务(设备上运⾏的业务进程)完蛋了,需要⾃⼰主动交出VIP4,等⾃⼰节点的业务(设备上运⾏的业务进程)⼜好了,那么不能⽴马夺权,⽽是有⼀个过渡再夺权⼆. 官⽅配置说明概述:keepalived的具体实现原理这⾥就不做阐述,但是从其配置⽂件的⾓度⼤致将其⼯作模块分成两部分: 全局部分,和VRRP实例部分。
全局部分,顾名思义就是整体相关的配置;VRRP实例部分:⾸先,keepalived通过创建⼀个个VRRP实例来实现浮动IP的管理,⼀个VRRP实例可以看做是⼀个连接实例(使⽤VRRP协议);⼀个实例对应⼀个VIP,⼀台设备可以配置多个VRRP实例即参与多个VIP的抢占;然后,具有相同VRRP实例配置的⼀对设备,会因为实例匹配⽽成功配对;最后,通过协商得到谁是master谁是slave,以及谁来占有VIP。
1. 全局配置部分1. 预定义⼀个脚本以及脚本管理⽅式,之后⽤于VRRP实例引⽤vrrp_script <SCRIPT_NAME> {# 脚本的路径,或者直接就是脚本本⾝script <STRING>|<QUOTED-STRING># 间隔多长时间执⾏⼀次脚本interval <INTEGER>#脚本执⾏如果没有正确返回,则这段时间后就算超时,然后算作是failed了timeout <INTEGER># adjust priority by this weight, (default: 0).For description of reverse, see track_script.# 'weight 0 reverse' will cause the vrrp instance to be down when the script is up, and vice versa.weight <INTEGER:-253..253> [reverse]# required number of successes for OK transitionrise <INTEGER># required number of successes for KO transitionfall <INTEGER># 以哪个⽤户⾝份去执⾏脚本的⼈是谁user USERNAME [GROUPNAME]# 假设初始时脚本是执⾏失败的init_fail}2. VRRP实例部分# Ignore VRRP interface faults (default unset)dont_track_primary #表⽰的含义是,⼀旦接⼝有问题,则忽略之,否则keepalived的代码中对链路有做检查,发现链路down则进⼊fault状态,于是将放弃所有浮动ip# optional, monitor these as well. go to FAULT state if any of these go down if unweighted.# When a weight is specified in track_interface, instead of setting the vrrp instance to the FAULT state in case of failure, its priority will be# increased by the weight when the interface is up (for positive weights), or decreased by the weight's absolute value when the interface is down# (for negative weights), unless reverse is specified, in which case the direction of adjustment of the priority is reversed.# The weight must be comprised between -253 and +253 inclusive.0is the default behaviour which means that a failure implies a# FAULT state. The common practice is to use positive weights to count a limited number of good services so that the server with the highest count# becomes master. Negative weights are better to count unexpected failures among a high number of interfaces, as it will not saturate even with high# number of interfaces. Use reverse to increase priority if an interfaces is downtrack_interface {eth0eth1eth2 weight <-253..253> [reverse]...}# 1 to 255 used to differentiate multiple instances of vrrpd running on the same NIC (and hence same socket).virtual_router_id 51 #⽤来区分多VRRP实例?, 是指为⼀台设备配置多个实例,还是⼀个局域⽹中的多个实例? 貌似是后者,待确认preempt_delay 300 #表⽰的含义是,我当前是backup⾝份,但是我发现对⽅的master不如我,即优先级⽐我低,那么我不会⽴马去抢占,⽽是等五分钟后再去抢占关于weight,rise,fall的综合⽤法A positive weight means that <rise> successes will add <weight> to the priority of all VRRP instances which monitor it.On the opposite, a negative weight will be subtracted from the initial priority in case of <fall> failures解析:rise和正数的weight结合使⽤,如果rise次脚本执⾏都是成功的(返回0),则增加weight数量的优先级fall和负数的weight结合使⽤,如果是fall次脚本执⾏都是失败的(返回1),则减少|weight|数量的优先级其余的组合⽅式不起任何作⽤,即不会影响优先级的增减三. 案例解析节点1:简介:我是backup⾝份,但因为我的优先级⾼,所以是实际的掌权者,当我发现我节点上的业务已经挂了那么我就降低我的级别,让真正的master去掌权直到我的级别⼜上来了,我也不会⽴马夺权,⽽是等待⼀段时间后再夺权vrrp_script chkBackup {##检查进程是否存在,如果存在检查联通性,如果联通了。
Keepalived原理及配置详解-选项参数详细接着上篇,既然做了mysql+keepalived就需要对这些有个了解,以至于有了知道可以从哪里着手及相关配置;本篇是在网易博客上看到的一篇,就记录并且copy了,请大家尊重原创作者,珍惜汗水劳动者;原url /blog/static/1007689 14201191762253640/keepalived的核心vrrp相关知识:/5675165/1179600什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发生,那说到keepalived时不得不说的一个协议就是VRRP协议,可以说这个协议就是keepalived实现的基础,那么首先我们来看看VRRP协议一,VRRP协议二,Keepalived原理Keepalived原理keepalived也是模块化设计,不同模块复杂不同的功能,下面是keepalived的组件core check vrrp libipfwc libipvs-2.4 libipvs-2.6core:是keepalived的核心,复杂主进程的启动和维护,全局配置文件的加载解析等check:负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析vrrp:VRRPD子进程,VRRPD子进程就是来实现VRRP协议的libipfwc:iptables(ipchains)库,配置LVS会用到libipvs*:配置LVS会用到注意,keepalived和LVS完全是两码事,只不过他们各负其责相互配合而已keepalived启动后会有三个进程父进程:内存管理,子进程管理等等子进程:VRRP子进程子进程:healthchecker子进程有图可知,两个子进程都被系统WatchDog看管,两个子进程各自复杂自己的事,healthchecker子进程复杂检查各自服务器的健康程度,例如HTTP,LVS等等,如果healthchecker子进程检查到MASTER上服务不可用了,就会通知本机上的兄弟VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态三,Keepalived配置文件详解keepalived配置详解keepalived有三类配置区域(姑且就叫区域吧),注意不是三种配置文件,是一个配置文件里面三种不同类别的配置区域全局配置(Global Configuration)VRRPD配置LVS配置一,全局配置全局配置又包括两个子配置:全局定义(global definition)静态路由配置(static ipaddress/routes)1,全局定义(global definition)配置范例全局配置解析global_defs全局配置标识,表面这个区域{}是全局配置表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个,每行一个****************************************表示发送通知邮件时邮件源地址是谁smtp_server 127.0.0.1表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现mtp_connect_timeout 30连接smtp连接超时时间router_id node1机器标识2,静态地址和路由配置范例这里实际上和系统里面命令配置IP地址和路由一样例如:192.168.1.1/24 brd + dev eth0 scope global 相当于: ip addr add 192.168.1.1/24 brd + dev eth0 scope global就是给eth0配置IP地址路由同理一般这个区域不需要配置这里实际上就是给服务器配置真实的IP地址和路由的,在复杂的环境下可能需要配置,一般不会用这个来配置,我们可以直接用vi /etc/sysconfig/network-script/ifcfg-eth1来配置,切记这里可不是VIP哦,不要搞混淆了,切记切记!二,VRRPD配置VRRPD配置包括三个类VRRP同步组(synchroization group)VRRP实例(VRRP Instance)VRRP脚本1,VRRP同步组(synchroization group)配置范例http和mysql是实例名和下面的实例名一致notify /path/to/notify.sh:smtp alter表示切换时给global defs中定义的邮件地址发送邮件通知2,VRRP实例(instance)配置范例state:state 指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定,里如果这里设置为master,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为masterinterface:实例绑定的网卡,因为在配置虚拟IP的时候必须是在已有的网卡上添加的dont track primary:忽略VRRP的interface错误track interface:跟踪接口,设置额外的监控,里面任意一块网卡出现问题,都会进入故障(FAULT)状态,例如,用nginx做均衡器的时候,内网必须正常工作,如果内网出问题了,这个均衡器也就无法运作了,所以必须对内外网同时做健康检查mcast src ip:发送多播数据包时的源IP地址,这里注意了,这里实际上就是在那个地址上发送VRRP通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址garp master delay:在切换到master状态后,延迟进行免费的ARP(gratuitous ARP)请求virtual router id:这里设置VRID,这里非常重要,相同的VRID 为一个组,他将决定多播的MAC地址priority 100:设置本节点的优先级,优先级高的为masteradvert int:检查间隔,默认为1秒virtual ipaddress:这里设置的就是VIP,也就是虚拟IP地址,他随着state的变化而增加删除,当state为master的时候就添加,当state为backup的时候删除,这里主要是有优先级来决定的,和state设置的值没有多大关系,这里可以设置多个IP地址virtual routes:原理和virtual ipaddress一样,只不过这里是增加和删除路由lvs sync daemon interface:lvs syncd绑定的网卡authentication:这里设置认证auth type:认证方式,可以是PASS或AH两种认证方式auth pass:认证密码nopreempt:设置不抢占,这里只能设置在state为backup的节点上,而且这个节点的优先级必须别另外的高preempt delay:抢占延迟debug:debug级别notify master:和sync group这里设置的含义一样,可以单独设置,例如不同的实例通知不同的管理人员,http实例发给网站管理员,mysql的就发邮件给DBA3,VRRP脚本首先在vrrp_script区域定义脚本名字和脚本执行的间隔和脚本执行的优先级变更vrrp_script check_running {script"/usr/local/bin/check_running"interval 10 #脚本执行间隔weight 10 #脚本结果导致的优先级变更:10表示优先级+10;-10则表示优先级-10}然后在实例(vrrp_instance)里面引用,有点类似脚本里面的函数引用一样:先定义,后引用函数名track_script {check_running weight 20}注意:VRRP脚本(vrrp_script)和VRRP实例(vrrp_instance)属于同一个级别LVS配置如果你没有配置LVS+keepalived那么无需配置这段区域,里如果你用的是nginx来代替LVS,这无限配置这款,这里的LVS配置是专门为keepalived+LVS集成准备的。
三.keepalived介绍及⼯作原理⼀、keepalived的介绍Keepalived软件起初是专为LVS负载均衡软件设计的,⽤来管理并监控LVS集群系统中各个服务节点的状态,后来⼜加⼊了可以实现⾼可⽤的VRRP功能。
因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的⾼可⽤解决⽅案软件。
Keepalived软件主要是通过VRRP协议实现⾼可⽤功能的。
VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,VRRP出现的⽬的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个⽹络可以不间断地运⾏。
所以,Keepalived⼀⽅⾯具有配置管理LVS的功能,同时还具有对LVS下⾯节点进⾏健康检查的功能,另⼀⽅⾯也可实现系统⽹络服务的⾼可⽤功能。
keepalived:vrrp协议:Virtual Router Redundancy Protocol术语:虚拟路由器:Virtual Router虚拟路由器标识:VRID(0-255),唯⼀标识虚拟路由器物理路由器:master:主设备backup:备⽤设备priority:优先级VIP:Virtual IPVMAC:Virutal MAC (00-00-5e-00-01-VRID)通告:⼼跳,优先级等;周期性⼯作⽅式:抢占式,⾮抢占式安全⼯作:认证:⽆认证简单字符认证:预共享密钥MD5⼯作模式:主/备:单虚拟路径器主/主:主/备(虚拟路径器1),备/主(虚拟路径器2)⼆、Keepalived服务的重要功能1、管理LVS负载均衡软件早期的LVS软件,需要通过命令⾏或脚本实现管理,并且没有针对LVS节点的健康检查功能。
为了解决LVS的这些使⽤不便的问题,Keepalived就诞⽣了,可以说,Keepalived软件起初是专为解决LVS的问题⽽诞⽣的。
keepalived+mysql构建主从HA架构全过程,附配置⽂件我没去公司之前,公司⼀直都是单节点mysql,且mysql的版本和安装⽅式配置⽂件等也不具有统⼀化,初期做了数据库的基础调整,就是做了mysql的默认架构,主从复制,跑了半年,⼀切稳定,为了更加的提升⾃⼰,只能多打打⼩怪兽,持续升级了,否则很快对⼀家公司你就没有特别⼤的利⽤价值,也没有加薪的空间,废话不多说,说⼀下我的部署架构。
⽬前所要构建HA架构的mysql是mysql 5.7版本,数据量极少,⼏⼗M,⽬前没有做MHA的架构需求,和⽼板讨论,加之研究了keepalived+mysql的HA架构,决定⼀试。
⼀.⽬前架构和keepalived+mysql的HA架构和MHA架构的对⽐优势:搭建⽐较简单,只需要主从安装keepalived的服务,启动vip即可以实现。
劣势:1.主从只可以实现⼀次切换,切换后,之前的主库,即使重启也⽆法直接使⽤,因为主从数据不⼀致,⽽需要⼿动创建主从,⽽这个过程可能遇到各种奇葩的问题,需要时间重新构建主从。
2.当主从不同步,此时进⾏主从切换,可能会出现,数据丢失的惨况。
3.受⼀些因素的影响,可能会出现脑裂,⽐如VIP两台服务器都没有,或者同时出现。
⼆.搭建过程1.ip分配如下2.构建mysql主从略。
正常的构建主从,基于GTID配置⽂件:主:[root@im_prod_master ~]# cat /etc/f[mysqld]#************** basic ***************user=mysqlbasedir=/usr/local/mysqldatadir=/data/mysqllog-error=/var/log/mysql.loglog_bin=/data/mysql/binlog/mysql-binserver-id=162sql_mode =STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION skip-name-resolvegtid-mode=onenforce-gtid-consistency=truedefault_storage_engine=InnoDBdefault_tmp_storage_engine=InnoDBinternal_tmp_disk_storage_engine=InnoDBautocommit=1log_timestamps=SYSTEM##***********binlog & relaylog&slow log**************binlog_format=rowbinlog_cache_size=128kbinlog_stmt_cache_size=128kmax_binlog_cache_size=2Gmax_binlog_stmt_cache_size=2Glog-bin-trust-function-creators=1expire_logs_days=7max_binlog_size=500Mslow_query_log=1slow_query_log_file=/data/mysql/slowlog/slow.loglong_query_time=2log_queries_not_using_indexes=ONrelay_log_recovery=ONskip-slave-startlog-bin-trust-function-creators=1##************character set ********************character_set_server=utf8mb4character-set-client-handshake=FALSEcharacter-set-server=utf8mb4collation-server=utf8mb4_general_ci##skip-grant-tables##***********slave config************************log-slave-updates=1##************system*****************************key_buffer_size = 16Mmax_allowed_packet = 16Mthread_stack = 192Kthread_cache_size = 16query_cache_size = 0query_cache_type = OFF[mysql]socket=/tmp/mysql.sock从:[mysqld]#************** basic ***************user=mysqlbasedir=/usr/local/mysqldatadir=/data/mysqllog-error=/var/log/mysql.loglog_bin=/data/mysql/binlog/mysql-binserver-id=161sql_mode =STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION skip-name-resolvegtid-mode=onenforce-gtid-consistency=truedefault_storage_engine=InnoDBdefault_tmp_storage_engine=InnoDBinternal_tmp_disk_storage_engine=InnoDBautocommit=1log_timestamps=SYSTEM##binlog & relaylogbinlog_cache_size=128kbinlog_stmt_cache_size=128kmax_binlog_cache_size=2Gmax_binlog_stmt_cache_size=2Gbinlog_format=rowexpire_logs_days=7max_binlog_size=500Mslow_query_log=1slow_query_log_file=/data/mysql/slowlog/slow.loglong_query_time=2log_queries_not_using_indexes=ONrelay_log_recovery=ONskip-slave-startlog-bin-trust-function-creators=1##************character set ********************character_set_server=utf8mb4character-set-client-handshake=FALSEcharacter-set-server=utf8mb4collation-server=utf8mb4_general_ci#skip-grant-tables#***********slave config************************log-slave-updates=1#read_only=1##************system*****************************key_buffer_size = 16Mmax_allowed_packet = 16Mthread_stack = 192Kthread_cache_size = 16query_cache_limit = 1Mquery_cache_size = 16M[mysql]socket=/tmp/mysql.sock3.安装keepalivedyum install -y keepalived 也可以源码安装編輯keepalived的配置⽂件:主:[root@im_prod_master ~]# cat /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {router_id HA_MySQL ###定义⼀个全局变量}vrrp_script check_mysql {script "/server/scripts/check_mysql.sh" ####监控脚本interval 2}vrrp_instance V1_1 { ####实例名称(主备⼀致)state BACKUP #####主备必须都是backupinterface ens160 #####⽹卡信息virtual_router_id 162 #####路由ID主备必须⼀致,否则会出现脑裂priority 100 ####优先级advert_int 1 #检查间隔,默认1秒 VRRP⼼跳包的发送周期,单位为s 组播信息发送间隔nopreempt ###设置为不抢占两个节点的state都必须配置为BACKUP两个节点都必须加上配置 nopreempt authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.2.22.80 ###设置vip}}track_script {check_mysql ###指定检查脚本,定期运⾏它们来改变优先级,并最终引发主备交换}virtual_server 10.2.22.80 3306 {delay_loop 2 #健康检查间隔时间lb_algo wrr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh wrr加权轮询算法lb_kind DR #负载均衡转发规则NAT|DR|RUNpersistence_timeout 60 #会话保持时间protocol TCP ##使⽤协议real_server 10.2.22.162 3306 {notify_down /server/scripts/kill_keepalived.sh ###keepalived⾃杀脚本TCP_CHECK {connect_timeout 10nb_get_retry 3delay_before_retry 3connect_port 3306}}}.........從:! Configuration File for keepalivedglobal_defs {router_id HA_MySQL}vrrp_script check_mysql {script "/server/scripts/check_mysql.sh"interval 2}vrrp_instance V1_1 {state BACKUPinterface ens160virtual_router_id 162priority 90advert_int 1nopreemptauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {10.2.22.80}}track_script {check_mysql}virtual_server 10.2.22.80 3306 {delay_loop 2lb_algo wrrlb_kind DRpersistence_timeout 60protocol TCPreal_server 10.2.22.161 3306 {notify_down /server/scripts/kill_keepalived.shTCP_CHECK {connect_timeout 10nb_get_retry 3delay_before_retry 3connect_port 3306}}}附:配置⽂件 check_mysql.shMYSQL=/usr/local/mysql/bin/mysqlMYSQL_HOST=localhostMYSQL_USER=rootMYSQL_PASSWORD=1qaz@WSX$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -e "show status;" >/root/check_mysql.logif [ $? == 0 ]thenecho " $host mysql login successfully "exit 0elsesystemctl stop keepalived.serviceexit 2fi[root@im_prod_master ~]# cat /server/scripts/kill_keepalived.sh#!/bin/bashkill -9 $(cat /var/run/keepalived.pid)3.切换测试1). ⾸先kill掉主库,查看ip是否会漂移因为测试时候未截图,但是依以上配置,可以实现vip漂移,并且访问正常,⽆中断2).挂掉主库恢复⾸先将挂掉的主库启动,reset master;reset slave;change master to master_host='10.2.22.161',master_user='repl',master_password='123456' ,MASTER_AUTO_POSITION=1;start slave;show slave status\G;如果正常,就没问题了,如果不正常,建议,直接重新初始化数据库,重新构建和新主库的主从关系,从新主库备份的命令:/usr/local/mysql/bin/mysqldump -uroot -p'1qaz@WSX' -h10.2.22.161 --single-transaction --triggers --set-gtid-purged=ON --routines --events --master-data=2 -A |gzip > $path/im_prod/all_${ttime}.sql.gz。
第03章集群利器Keepalived本章主要了解开源高可用负载均衡集群利器Keepalived,掌握Keepalived的安装,运用Keepalived配置高可用集群,并能够实现Keepalived与负均衡集群LVS的完美组合。
一、Keepalived概述1、什么是Keepalived?keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器2、keepalived理论工作原理Layer3,4&5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。
Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。
Layer4:主要以TCP端口的状态来决定服务器工作正常与否。
如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中删除。
Layer5:Layer5就是工作在具体的应用层了,比Layer3,Layer4要复杂一点,在网络上占用的带宽也要大一些。
Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除。
keepalived配置文件详解
global_defs {
notification_email { #指定keepalived在发生切换时需要发送email 到的对象,一行一个
sysadmin@fire.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #指定发件人
smtp_server localhost #指定smtp服务器地址
smtp_connect_timeout 30 #指定smtp连接超时时间
router_id LVS_DEVEL #运行keepalived机器的一个标识
}
vrrp_sync_group VG_1{ #监控多个网段的实例
group {
inside_network #实例名
outside_network
}
notify_master /path/xx.sh #指定当切换到master时,执行的脚本
netify_backup /path/xx.sh #指定当切换到backup时,执行的脚本
notify_fault "path/xx.sh VG_1" #故障时执行的脚本
notify /path/xx.sh
smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通
知
}
vrrp_instance inside_network {
state BACKUP #指定那个为master,那个为backup,如果设置了nopreempt这个值不起作用,主备考priority决
定
interface eth0 #设置实例绑定的网卡
dont_track_primary #忽略vrrp的interface错误(默认不设置)
track_interface{ #设置额外的监控,里面那个网卡出现问题都会切换 eth0
eth1
}
mcast_src_ip #发送多播包的地址,如果不设置默认使用绑定网卡的primary ip
garp_master_delay #在切换到master状态后,延迟进行gratuitous ARP 请求
virtual_router_id 50 #VPID标记
priority 99 #优先级,高优先级竞选为master
advert_int 1 #检查间隔,默认1秒
nopreempt #设置为不抢占注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
preempt_delay #抢占延时,默认5分钟
debug #debug级别
authentication { #设置认证
auth_type PASS #认证方式
auth_pass 111111 #认证密码
}
virtual_ipaddress { #设置vip
192.168.202.200
}
}
virtual_server 192.168.202.200 23 {
delay_loop 6 #健康检查时间间隔
lb_algo rr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
lb_kind DR #负载均衡转发规则NAT|DR|RUN
persistence_timeout 5 #会话保持时间
protocol TCP #使用的协议
persistence_granularity <NETMASK> #lvs会话保持粒度
virtualhost <string> #检查的web服务器的虚拟主机(host:头)
sorry_server<IPADDR> <port> #备用机,所有realserver失效后启用real_server 192.168.200.5 23 {
weight 1 #默认为1,0为失效
inhibit_on_failure #在服务器健康检查失效时,将其设为0,
而不是直接从ipvs中删除
notify_up <string> | <quoted-string> #在检测到server up 后执行脚本
notify_down <string> | <quoted-string> #在检测到server down后执行脚本
TCP_CHECK {
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 23 健康检查的端口的端口
bindto <ip>
}
HTTP_GET | SSL_GET{
url{ #检查url,可以指定多个
path /
digest <string> #检查后的摘要信息
status_code 200 #检查的返回状态码
}
connect_port <port>
bindto <IPADD>
connect_timeout 5
nb_get_retry 3
delay_before_retry 2
}
SMTP_CHECK{
host{
connect_ip <IP ADDRESS>
connect_port <port> #默认检查25端口
bindto <IP ADDRESS>
}
connect_timeout 5
retry 3
delay_before_retry 2
helo_name <string> | <quoted-string> #smtp helo请求命令参数,可选
}
MISC_CHECK{
misc_path <string> | <quoted-string> #外部脚本路径
misc_timeout #脚本执行超时时间
misc_dynamic #如设置该项,则退出状态码会用来动态调整服务器的权重,返回0 正常,不修改;返回1,
检查失败,权重改为0;返回2-255,正常,权重设置为:返回状态码-2 }
}。