• 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

     

  • 相关阅读:
    Swift3 重写一个带占位符的textView
    Swift3 使用系统UIAlertView方法做吐司效果
    Swift3 页面顶部实现拉伸效果代码
    Swift3 倒计时按钮扩展
    iOS 获取当前对象所在的VC
    SpringBoot在IDEA下使用JPA
    hibernate 异常a different object with the same identifier value was already associated with the session
    SpringCloud IDEA 教学 番外篇 后台运行Eureka服务注册中心
    SpringCloud IDEA 教学 (五) 断路器控制台(HystrixDashboard)
    SpringCloud IDEA 教学 (四) 断路器(Hystrix)
  • 原文地址:https://www.cnblogs.com/larry-luo/p/10101823.html
Copyright © 2020-2023  润新知