zoukankan      html  css  js  c++  java
  • Centos7安装keepalived(自定义路径安装)-高级篇

    0、Keepalived介绍
      Keepalived是一个基于VRRP协议来实现的服务高可用方案,可以利用其来避免IP单点故障,类似的工具还有heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如lvs、haproxy、nginx)一起工作来达到集群的高可用。
      Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作;当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

      健康检查和失败切换是keepalived的两大核心功能。 所谓的健康检查, 就是采用tcp三次握手, icmp请求, http请求, udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器, 利用VRRP(虚拟路由冗余协议, 可参考RFC文档http://tools.ietf.org/html/rfc5798) 维持主备负载均衡器的心跳, 当主负载均衡器出现问题时, 由备负载均衡器承载对应的业务, 从而在最大限度上减少流量损失, 并提供服务的稳定性。

          Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务。

    上图是Keepalived的功能体系结构,大致分两层:用户空间(user space)和内核空间(kernel space)。 
    内核空间:主要包括IPVS(IP虚拟服务器,用于实现网络服务的负载均衡)和NETLINK(提供高级路由及其他相关的网络功能)两个部份。 
    用户空间

    • WatchDog:负载监控checkers和VRRP进程的状况
    • VRRP Stack:负载负载均衡器之间的失败切换FailOver,如果只用一个负载均稀器,则VRRP不是必须的。
    • Checkers:负责真实服务器的健康检查healthchecking,是keepalived最主要的功能。换言之,可以没有VRRP Stack,但健康检查healthchecking是一定要有的。
    • IPVS wrapper:用户发送设定的规则到内核ipvs代码
    • Netlink Reflector:用来设定vrrp的vip地址等。
    • Keepalived的所有功能是配置keepalived.conf文件来实现的。

    1、VRRP协议
      VRRP全称 Virtual Router Redundancy Protocol,即 虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将N台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个master和多个backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个IP的master实际负责ARP相应和转发IP数据包,组中的其它路由器作为备份的角色处于待命状态。master会发组播消息,当backup在超时时间内收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master,保证路由器的高可用。

      在VRRP协议实现里,虚拟路由器使用 00-00-5E-00-01-XX 作为虚拟MAC地址,XX就是唯一的 VRID (Virtual Router IDentifier),这个地址同一时间只有一个物理路由器占用。在虚拟路由器里面的物理路由器组里面通过多播IP地址 224.0.0.18 来定时发送通告消息。每个Router都有一个 1-255 之间的优先级别,级别最高的(highest priority)将成为主控(master)路由器。通过降低master的优先权可以让处于backup状态的路由器抢占(pro-empt)主路由器的状态,两个backup优先级相同的IP地址较大者为master,接管虚拟IP。

     

    2、与heartbeat/corosync等比较
      Heartbeat、Corosync、Keepalived这三个集群组件我们到底选哪个好,首先我想说明的是,Heartbeat、Corosync是属于同一类型,Keepalived与Heartbeat、Corosync,根本不是同一类型的。Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP);Heartbeat或Corosync是基于主机或网络服务的高可用方式;简单的说就是,Keepalived的目的是模拟路由器的高可用,Heartbeat或Corosync的目的是实现Service的高可用。

      所以一般Keepalived是实现前端高可用,常用的前端高可用的组合有,就是我们常见的LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。而Heartbeat或Corosync是实现服务的高可用,常见的组合有Heartbeat v3(Corosync)+Pacemaker+NFS+Httpd 实现Web服务器的高可用、Heartbeat v3(Corosync)+Pacemaker+NFS+MySQL 实现MySQL服务器的高可用。总结一下,Keepalived中实现轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用。而Heartbeat(或Corosync)一般用于服务的高可用,且需要共享存储,一般用于多节点的高可用。这个问题我们说明白了。

      又有博友会问了,那heartbaet与corosync我们又应该选择哪个好啊,我想说我们一般用corosync,因为corosync的运行机制更优于heartbeat,就连从heartbeat分离出来的pacemaker都说在以后的开发当中更倾向于corosync,所以现在corosync+pacemaker是最佳组合。

    3、Keepalived + nginx
      keepalived可以认为是VRRP协议在Linux上的实现,主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

    一、安装
    1、首先安装依赖包

    查看系统版本
    cat /etc/redhat-release
    CentOS Linux release 7.2.1511 (Core)

    查看内核版本

    ls /usr/src/kernels
    3.10.0-693.2.2.el7.x86_64

    [root@bogon /]# yum install -y libnl*
    [root@bogon /]# yum install -y libnfnetlink-devel zlib zlib-devel gcc gcc-c++ openssl openssl-devel openssh

    pcre: 用来作地址重写的功能。
    zlib:nginx 的gzip模块,传输数据打包,省流量(但消耗资源)。
    openssl:提供ssl加密协议


    2、下载并解压Keepalived
    [root@bogon src]# pwd
    /usr/local/src
    [root@bogon src]# wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
    [root@bogon src]# tar xvf keepalived-1.3.5.tar.gz

    3、编译安装
    [root@bogon src]# cd keepalived-1.3.5
    [root@bogon keepalived-1.3.5]# ./configure --prefix=/usr/local/keepalived
    [root@bogon keepalived-1.3.5]# make
    [root@bogon keepalived-1.3.5]# make install

    二、配置
    keepalived安装完成后默认不会注册为系统服务,所以需要手工添加系统服务脚本。在/etc/init.d目录下新建keepalived文件,并更改权限其即可。

    0、创建keepalived的pid目录

      用于后面手动添加进程号

    [root@Nginx-Master ~]# mkdir -p /usr/local/keepalived/var/run/

    [root@Nginx-Master ~]# vi /usr/local/keepalived/var/run/keepalived.pid 

      建立Nginx用户

    [root@Nginx-Master nginx-1.9.7]# groupadd -g 1001 nginx
    [root@Nginx-Master nginx-1.9.7]# useradd -u 900 nginx -g nginx -s /sbin/nologin
    [root@Nginx-Master nginx-1.9.7]# tail -1 /etc/passwd
    nginx:x:900:1001::/home/nginx:/sbin/nologin

    1、去 keepalived 源码目录下拷贝启动脚本到/etc/init.d/下
    [root@bogon keepalived-1.3.5]# pwd
    /usr/local/src/keepalived-1.3.5
    [root@bogon keepalived-1.3.5]# cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived    /etc/init.d/keepalived
    [root@bogon keepalived-1.3.5]# ll /etc/init.d/ | grep keepalived
    -rwxr-xr-x 1 root root 1308 8月 2 14:15 keepalived

    2、修改/etc/init.d/keepalived启动脚本
      方式1、需要修改的数据有以下几项:

    # config: /etc/keepalived/keepalived.conf 文件的位置;
    # Source configuration file (we set KEEPALIVED_OPTIONS there) 文件的位置。. /etc/sysconfig/keepalived
    修改为实际安装的文件路径,我的安装路径如下:

    # config: /usr/local/keepalived/etc/keepalived/keepalived.conf
    . /usr/local/keepalived/etc/sysconfig/keepalived
    另外添加如下变量,并修改文件中相应的部分:

    keepalived=/usr/local/keepalived/sbin/keepalived
    keepalived_config=/usr/local/keepalived/etc/keepalived/keepalived.conf
    keepalived_pid=/usr/local/keepalived/var/run/keepalived.pid
    [root@bogon keepalived-1.3.5]# vim /etc/init.d/keepalived
    #!/bin/sh
    #
    # Startup script for the Keepalived daemon
    #
    # processname: keepalived
    # pidfile: /usr/local/keepalived/run/keepalived.pid
    # config: /usr/local/keepalived/etc/keepalived/keepalived.conf
    # chkconfig: - 21 79
    # description: Start and stop Keepalived

    # Source function library
    . /etc/rc.d/init.d/functions

    # Source configuration file (we set KEEPALIVED_OPTIONS there)
    . /usr/local/keepalived/etc/sysconfig/keepalived

    keepalived=/usr/local/keepalived/sbin/keepalived
    keepalived_config=/usr/local/keepalived/etc/keepalived/keepalived.conf
    keepalived_pid=/usr/local/keepalived/var/run/keepalived.pid

    RETVAL=0

    prog="keepalived"

    start() {
    echo -n $"Starting $prog: "
    daemon $keepalived -f ${keepalived_config} ${KEEPALIVED_OPTIONS}
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
    }

    2、修改其权限并开机启动

    修改权限:chmod 755  /etc/init.d/keepalived
    加为系统服务:chkconfig  --add keepalived
    开机启动:chkconfig keepalived on  (centos6.0)
    查看开机启动的服务:chkconfig  --list


    3、备注:keepalived服务控制
    systemctl enable keepalived.service #设置开机自动启动  (centos7.0)
    systemctl disable keepalived.service #取消开机自动启动
    systemctl start keepalived.service #启动服务
    systemctl restart keepalived.service #重启服务
    systemctl stop keepalived.service #停止服务
    systemctl status keepalived.service #查看服务状态


      方式2、另一种添加为系统服务的方式
    1、复制相应文件到相应目录下
    # keepalived启动脚本变量引用文件,默认文件路径是/etc/sysconfig/,也可以不做软链接,直接修改启动脚本中文件路径即可(安装目录下)
    [root@bogon /]# cp /usr/local/keepalived/etc/sysconfig/keepalived      /etc/sysconfig/keepalived

    # 将keepalived主程序加入到环境变量(安装目录下)
    [root@bogon /]# cp /usr/local/keepalived/sbin/keepalived      /usr/sbin/keepalived

    # keepalived启动脚本(源码目录下),放到/etc/init.d/目录下就可以使用service命令便捷调用
    [root@bogon /]# cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived     /etc/init.d/keepalived

    # 将配置文件放到默认路径下
    [root@bogon /]# mkdir /etc/keepalived
    [root@bogon /]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf     /etc/keepalived/keepalived.conf

    [root@bogon /]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

    2、设置开机启动
    # 设置开机启动
    [root@bogon /]# chkconfig keepalived on   (centos6.0)

    [root@bogon /]# service keepalived start|stop|restart  (centos7.0)

    附、安装过程中的问题

    0、vrrp无法正常识别物理网卡?

    vrrp_instance VI_1 {
    state MASTER
    interface ens160    #需根据不同的系统进行修改,默认是eth0
    virtual_router_id 51
    mcast_src_ip 192.168.2.146
    priority 100
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    # 192.168.200.16
    #192.168.200.17
    # 192.168.200.18
    192.168.2.147

    }


    1、修改启动脚本 /etc/init.d/keepalived 后,未生效?
    对于此问题一般的解决方法是执行如下命令,重新加载脚本。

    [root@bogon sbin]# systemctl daemon-reload

    以上方法大多时候会生效,但也有例外。此时,可以试试如下方法:

    删除路径 /usr/lib/systemd/system/ 下相应的启动脚本

    [root@bogon /]# chkconfig --del keepalived
    [root@bogon /]# cd /usr/lib/systemd/system/
    [root@bogon system]# ls | grep keepalived
    keepalived.service
    [root@bogon system]# rm keepalived.service
    rm:是否删除普通文件 "keepalived.service"?y

    然后重新注册为系统服务:

    [root@bogon system]# chkconfig --add keepalived

    重新注册后,修改后的配置文件就会生效。

    2、a configured resource limit was exceeded?
    执行 systemctl start keepalived.service 后出现如下错误:

    [root@bogon sbin]# systemctl start keepalived.service

    Job for keepalived.service failed because a configured resource limit was exceeded. See "systemctl status keepalived.service" and "journalctl -xe" for details.
    这个问题在网上找了半天也没找可以解决的方法,但是把 问题1 解决之后 问题2 就没再出现

    3、安装时出现如下问题?

    缺少依赖包,安装一下就好:

    [root@bogon /]# yum install -y libnfnetlink-devel

    4、Failed to start LVS and VRRP High Availability Monitor?

    处理方法:需要将进程号手动写入pid文件

    处理步骤:查看keepalived的进程

    [root@rbtnode1 ~]# ps aux | grep keepalived
    root 10960 0.0 0.0 48028 1044 ? Ss 09:01 0:00 /usr/local/keepalived/sbin/keepalived -D
    root 10961 0.0 0.1 48028 1920 ? S 09:01 0:00 /usr/local/keepalived/sbin/keepalived -D
    root 10962 0.0 0.0 48028 1516 ? S 09:01 0:00 /usr/local/keepalived/sbin/keepalived -D
    root 19427 0.0 0.0 112664 972 pts/0 S+ 10:06 0:00 grep --color=auto keepalived

    将进程号手动写入pid文件

    [root@rbtnode1 ~]# echo 10960 >> /usr/local/keepalived/var/run/keepalived.pid

    5、如果vrrp无法切换,需要关闭防火墙?

    systemctl stop firewalld.service #停止firewall

    systemctl disable firewalld.service #禁止firewall开机启动

    6、无法ping通vip地址?

    vim /etc/keepalived/keepalived.conf

    #vrrp_strict    #在全局配置下面

      

    7、centos7.0系统下添加多个虚拟ip地址

     有时你也许想要给一个网卡多个地址。你该怎么做呢?另外买一个网卡来分配地址?在小型网络中其实不用这么做。我们现在可以在CentOS/RHEL 7中给一个网卡分配多个ip地址。想知道怎么做么?好的,跟随我,这并不难。

     首先,让我们找到网卡的IP地址。在我的CentOS 7服务器中,我只使用了一个网卡。

    用root特权运行下面的命令:

    1. ip addr

    示例输出:

    1. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    2. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    3. inet 127.0.0.1/8 scope host lo
    4. valid_lft forever preferred_lft forever
    5. inet6 ::1/128 scope host
    6. valid_lft forever preferred_lft forever
    7. 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    8. link/ether 08:00:27:80:63:19 brd ff:ff:ff:ff:ff:ff
    9. inet 192.168.1.150/24 brd 192.168.1.255 scope global enp0s3
    10. valid_lft forever preferred_lft forever

    如上所见,我的网卡名是enp0s3,ip地址是192.168.1.150。

    如你所知,网卡的配置文件存储在 /etc/sysconfig/network-scripts/ 目录下。每个网卡的详细内容将会以不同的名字存储,比如ifcfg-enp0s3

    让我们看下ifcfg-enp0s3的细节。

    1. cat /etc/sysconfig/network-scripts/ifcfg-enp0s3

    示例输出:

    1. TYPE="Ethernet"
    2. BOOTPROTO="none"
    3. DEFROUTE="yes"
    4. IPV4_FAILURE_FATAL="no"
    5. IPV6INIT="yes"
    6. IPV6_AUTOCONF="yes"
    7. IPV6_DEFROUTE="yes"
    8. IPV6_FAILURE_FATAL="no"
    9. NAME="enp0s3"
    10. UUID="e9f9caef-cb9e-4a19-aace-767c6ee6f849"
    11. ONBOOT="yes"
    12. HWADDR="08:00:27:80:63:19"
    13. IPADDR0="192.168.1.150"
    14. PREFIX0="24"
    15. GATEWAY0="192.168.1.1"
    16. DNS1="192.168.1.1"
    17. IPV6_PEERDNS="yes"
    18. IPV6_PEERROUTES="yes"

    好的,现在我们将在相同的子网中分配多个地址了。

    编辑文件 /etc/sysconfig/network-scripts/ifcfg-enp0s3

    1. vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

    像下面那样加入额外的IP地址。

    1. TYPE="Ethernet"
    2. BOOTPROTO="none"
    3. DEFROUTE="yes"
    4. IPV4_FAILURE_FATAL="no"
    5. IPV6INIT="yes"
    6. IPV6_AUTOCONF="yes"
    7. IPV6_DEFROUTE="yes"
    8. IPV6_FAILURE_FATAL="no"
    9. NAME="enp0s3"
    10. UUID="933cdc9b-b383-4ddd-b219-5a72c69c9cf0"
    11. ONBOOT="yes"
    12. HWADDR="08:00:27:3F:AB:68"
    13. IPADDR0="192.168.1.150"
    14. IPADDR1="192.168.1.151"
    15. IPADDR2="192.168.1.152"
    16. PREFIX0="24"
    17. GATEWAY0="192.168.1.1"
    18. DNS1="192.168.1.1"
    19. IPV6_PEERDNS="yes"
    20. IPV6_PEERROUTES="yes"

    如你所见,我已经加了两个IP地址:IPADDR1=”192.168.1.151″ & IPADDR2=”192.168.1.152″

    类似地,你可以加入更多的ip地址。

    最后,保存并退出文件。重启网络服务来使更改生效。

    1. systemctl restart network

    现在,让我们检查是否已经加入了ip地址。

    1. ip addr

    示例输出:

    1. : lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    2. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    3. inet 127.0.0.1/8 scope host lo
    4. valid_lft forever preferred_lft forever
    5. inet6 ::1/128 scope host
    6. valid_lft forever preferred_lft forever
    7. 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    8. link/ether 08:00:27:3f:ab:68 brd ff:ff:ff:ff:ff:ff
    9. inet 192.168.1.150/24 brd 192.168.1.255 scope global enp0s3
    10. valid_lft forever preferred_lft forever
    11. inet 192.168.1.151/24 brd 192.168.1.255 scope global secondary enp0s3
    12. valid_lft forever preferred_lft forever
    13. inet 192.168.1.152/24 brd 192.168.1.255 scope global secondary enp0s3
    14. valid_lft forever preferred_lft forever
    15. inet6 fe80::a00:27ff:fe3f:ab68/64 scope link
    16. valid_lft forever preferred_lft forever

    如你所见,单个网卡已经有3个ip地址了。

    让我们ping一下新增的IP地址:

    1. ping -4 192.168.1.151

    示例输出:

    1. PING 192.168.1.151 (192.168.1.151) 56(84) bytes of data.
    2. 64 bytes from 192.168.1.151: icmp_seq=1 ttl=64 time=0.048 ms

    如果你想要使用不同的子网,你要改变PREFIX0=24成不同的子网,比如 PREFIX3=16

    比如,我想要添加一个A类地址(*比如10.0.0.1)到我的网卡中。

    1. TYPE="Ethernet"
    2. BOOTPROTO="none"
    3. DEFROUTE="yes"
    4. IPV4_FAILURE_FATAL="no"
    5. IPV6INIT="yes"
    6. IPV6_AUTOCONF="yes"
    7. IPV6_DEFROUTE="yes"
    8. IPV6_FAILURE_FATAL="no"
    9. NAME="enp0s3"
    10. UUID="933cdc9b-b383-4ddd-b219-5a72c69c9cf0"
    11. ONBOOT="yes"
    12. HWADDR="08:00:27:3F:AB:68"
    13. IPADDR0="192.168.1.150"
    14. IPADDR1="192.168.1.151"
    15. IPADDR2="192.168.1.152"
    16. IPADDR3="10.0.0.1"
    17. PREFIX0="24"
    18. PREFIX3=16
    19. GATEWAY0="192.168.1.1"
    20. DNS1="192.168.1.1"
    21. IPV6_PEERDNS="yes"
    22. IPV6_PEERROUTES="yes"

    你可以看到我已经添加一个A类地址(10.0.0.1)并且前缀是16。

    保存并退出文件。重启网络服务,接着,ping新增的地址:

    1. ping -4 10.0.0.1

     8、开机后keepalived无法正常启动,因为pid号会变化,导致每次需手动更新如下文件?

    [root@rbtnode1 ~]# > /usr/local/keepalived/var/run/keepalived.pid

    9、关闭nginx进程后,keepalived无法正常切换?

    可以改成监控物理接口,监控nginx进程还需修改shell脚本,未完待续!

    强制关闭进程建议用如下命令:

    ps -ef | grep keepalived

    root 3775 1 0 14:05 ? 00:00:00 /usr/local/sbin/keepalived -D
    root 3776 3775 0 14:05 ? 00:00:00 /usr/local/sbin/keepalived -D
    root 3777 3775 0 14:05 ? 00:00:00 /usr/local/sbin/keepalived -D
    root 8257 1269 0 14:41 pts/0 00:00:00 grep --color=auto keepalived

    kill -s 9  3775

     

  • 相关阅读:
    appium的log详细分析
    安卓版本6.0打开uiautomator报错
    wmware搬家
    Appium_Python_Api文档
    EF常用命令行
    Java学习----this和super(在继承中)
    Java学习----到底调用哪一个方法(多态)
    Java学习----方法的覆盖
    Java学习----对象间的继承
    Java学习----一个对象怎么调用另一个对象呢?
  • 原文地址:https://www.cnblogs.com/larry-luo/p/10101823.html
Copyright © 2011-2022 走看看