06:keepalive高可用集群(新)


1.1 keepalived高可用軟件介紹

參考:
haproxy:

https://blog.csdn.net/l835311324/article/details/83031084 https://blog.csdn.net/qq_41772936/article/details/80718014
https://blog.51cto.com/3381847248/1977073
keepalive: 
https://blog.csdn.net/celeste7777/article/details/49096167
https://v3u.cn/a_id_117

  1、keepalived--監控檢查

      注:keepalive軟件有兩種功能:監控檢查、VRRP冗余協議

      1. keepalive的作用是檢測web服務器的狀態,如果一台web服務器宕機,會將故障機器從集群中剔除

      2. keepalieve會從以下三層來檢查集群中的服務是否正常:

        1)layer3:通過ICMP協議ping測試

        2)layer4:比如web服務,keepalived檢查80端口是否啟動

        3)layer7:根據用戶的設定檢查服務器程序運行是否正常

  2、keepalived--VRRP冗余協議原理

      注:vrrp是虛擬路由冗余協議,就是當出現單點故障問題通過競選方式決定vip走向的一種機制

      1. Keepalived高可用是通過vrrp協議通信的,vrrp是通過競選機制決定主備

       2. Keepalived 主的服務器會一直發送 VRRP廣播包,告訴備它還活着

      3. 當備機監聽不到主發送的廣播包時,就人為主機不可用,所有備機通過配置文件中的優先級選舉新的主機

      4. 新的主機就會啟動相關服務接管資源,保證業務的連續性

 1.2 keepalive+haproxy高可用集群

  1、真實keepalive集群部署架構圖

    1)haproxy中的配置

        1. haproxy的 frontend模塊配置負責給用戶請求一個接口,backend定義可以定義后端一組服務器(其實就是keepalive主機組)

        2. 一個frontend可以擁有多個backend,一個backend也可以讓多個不同的frontend調用(后端api接口可以被多個前端調用)

        3. 具體流程就是當frontend接受到用戶請求,根據我們的配置交給指定的backend處理請求。

        4. backend再將請求分發到真正的后端服務器

    2)keepalive中的配置

        1. 兩台keepalive服務器同時監聽一個虛擬IP,同一時間只有keepalive-master集群能夠進行服務代理

        2. 當keepalive-master宕機,keepalive-slave會立刻頂替master執行集群代理服務

      

 1.3 使用docker-compose配置keepalive

   1、環境說明(這里借用compose測試)

'''環境中只需要一台虛擬機,然后使用docker-compose來啟動三個docker容器模擬 haproxy、keepalive-master、keepalive-slave '''
# haproxy: 0.0.0.0:8000 (在docker-compose網絡中映射宿主機的8000端口到haproxy) # keepalive-master: 172.20.128.2(VIP:172.20.128.4:80) # keepalive-slave: 172.20.128.3 (VIP:172.20.128.4:80)

  2、部署keepalive項目代碼

version: "3"
services:
  nginx_master:
    build:
      context: ./
      dockerfile: ./Dockerfile
    volumes:
      - ./index-master.html:/usr/share/nginx/html/index.html
      - ./favicon.ico:/usr/share/nginx/html/favicon.ico
      - ./keepalived-master.conf:/etc/keepalived/keepalived.conf
    networks:
      static-network:
        ipv4_address: 172.20.128.2
    cap_add: 
      - NET_ADMIN
  nginx_slave:
    build:
      context: ./
      dockerfile: ./Dockerfile
    volumes:
      - ./index-slave.html:/usr/share/nginx/html/index.html
      - ./favicon.ico:/usr/share/nginx/html/favicon.ico
      - ./keepalived-slave.conf:/etc/keepalived/keepalived.conf
    networks:
      static-network:
        ipv4_address: 172.20.128.3
    cap_add: 
        - NET_ADMIN
  proxy:
    image: haproxy:1.7-alpine
    ports:
      - 8000:6301
    volumes:
      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
    networks:
      - static-network

networks:
  static-network:
    ipam:
      config:
        - subnet: 172.20.0.0/16
docker-compose.yml
# 使用的基礎鏡像源(alpine是精簡的Linux內核)
FROM nginx:1.13.5-alpine
# 更新最新本地鏡像源  && 升級軟件
RUN apk update && apk upgrade
# 安裝keepalived等相關軟件
RUN apk add --no-cache bash curl ipvsadm iproute2 openrc keepalived && \
    rm -f /var/cache/apk/* /tmp/*
# 將nginx和keepalive啟動腳本從宿主機拷貝到docker容器中
COPY entrypoint.sh /entrypoint.sh
# 給啟動腳本添加權限
RUN chmod +x /entrypoint.sh
# 啟動服務
CMD ["/entrypoint.sh"]
Dockerfile 構建keepalive鏡像的dockerfile
# vrrp_script區域主要用來做健康檢查的,當時檢查失敗時會將vrrp_instance的priority減少相應的值
vrrp_script chk_nginx {
    script "pidof nginx"
    interval 2
}

# 設置外網的VIP(虛擬ip)
vrrp_instance VI_1 {
    # 可以是MASTER或BACKUP,不過當其他節點keepalived啟動時會將priority比較大的節點選舉為MASTER
    state MASTER
    # 對外提供服務的網絡接口,用來發VRRP包
    interface eth0
    # 取值在0-255之間,用來區分多個instance的VRRP組播, 同一網段中該值不能重復,並且同一個vrrp實例使用唯一的標識
    virtual_router_id 33
    # 用來選舉master的,要成為master,那么這個選項的值最好高於其他機器50個點,該項取值范圍是1-255(在此范圍之外會被識別成默認值100)
    priority 200
    # 發VRRP包的時間間隔,即多久進行一次master選舉,可以認為是健康查檢時間間隔,單位為秒
    advert_int 1
    # 表示發送VRRP單播報文使用的源IP地址,當前keepalive真實ip
    unicast_src_ip 172.20.128.2
    # 表示對端接收VRRP單播報文的IP地址(防止上游交換機禁用廣播)
    unicast_peer {
        172.20.128.3
    }
    
    authentication {
        # 定義認證類型
        auth_type PASS
        # 認證密碼  這些相當於暗號
        auth_pass letmein
    }
    # keepalive對外的虛擬地址,訪問虛擬地址會訪問keepalive的master地址
    virtual_ipaddress {
        172.20.128.4/24 dev eth0
    }
    # track_script用於追蹤腳本,用以實現某個檢測功能
    track_script {
        chk_nginx
    }
}

# 配置keepalive
virtual_server 172.20.128.2 80 {
    delay_loop 15
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP

    # keepalive代理的真實服務ip
    real_server 172.16.16.177 80 {
         weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 4
        }
    }
    # keepalive代理的真實服務ip
    real_server 172.16.16.178 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 4

        }
    }
}
keepalived-master.conf
vrrp_script chk_nginx {
    script "pidof nginx"
    interval 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 33
    priority 100
    advert_int 1
    unicast_src_ip 172.20.128.3
    unicast_peer {
        172.20.128.2
    }
    
    authentication {
        auth_type PASS
        auth_pass letmein
    }
    
    virtual_ipaddress {
        172.20.128.4/24 dev eth0
    }
    
    track_script {
        chk_nginx
    }
}
keepalived-slave.conf
# global常用配置項
global
    # haproxy默認沒有記錄日志的文件,需要依賴rsyslog收集,具體方法,首先在配置文件的global段添加一條配置項
    log 127.0.0.1 local0
    # 最大並發連接數;默認為2000
    maxconn 4096
    daemon
    # 要啟動的haproxy的進程數量;默認為1個,推薦為1個
    nbproc 4

defaults
    log 127.0.0.1 local3
    mode http
    option dontlognull
    option redispatch
    retries 2
    maxconn 2000
    balance roundrobin
    timeout connect 5000ms
    timeout client 5000ms
    timeout server 5000ms

# frontend部署前端服務,負責給用戶請求一個接口
frontend main
    # 監聽本docker容器中所有訪問6301端口的請求
    # 監聽端口,即haproxy提供web服務的端口,和lvs的vip端口類似
    bind *:6301
    # 定義一個服務器組 http_back
    default_backend webserver

# backend可以定義后端一組服務器
backend webserver
    server ngxin_master 172.20.128.4:80 check inter 2000 rise 2 fall 5
# 具體流程就是當frontend接受到用戶請求,根據我們的配置交給指定的backend處理請求,backend再將請求分發到真正的后端服務器
haproxy.cfg

 

#!/bin/sh

/usr/sbin/keepalived -n -l -D -f /etc/keepalived/keepalived.conf --dont-fork --log-console &

nginx -g "daemon off;"
entrypoint.sh keepalive啟動腳本
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>主機</title>
<style>

#box{ 
    margin: 0px auto;
    font-family: 'Times New Roman', Times, serif; 
    font-size: 30px;
    font-style: initial;
    color: aliceblue;
    }

body{
    background-color: black
}

</style>
</head>
<body>

    <div id="box">

        主機

    </div>
    
</body>
</html>
index-master.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>從機</title>
<style>

#box{ 
    margin: 0px auto;
    font-family: 'Times New Roman', Times, serif; 
    font-size: 30px;
    font-style: initial;
    color: aliceblue;
    }

body{
    background-color: black
}

</style>
</head>
<body>

    <div id="box">

        從機

    </div>
    
</body>
</html>
index-slave.html

  3、測試keepalive

     1)使用docker-compose開啟keepalive集群

[root@linux-node4 nginx_keepalive]# docker-compose up # 使用docker-compose部署keepalive(是在交互窗口運行的)
[root@linux-node4 nginx_keepalive]# docker ps # 部署完成后新打開一個終端查看運行狀態
CONTAINER ID IMAGE PORTS NAMES 8fc6f148f02d nginx_keepalive_nginx_master 80/tcp nginx_keepalive_nginx_master_1 5c94af00a93e nginx_keepalive_nginx_slave 80/tcp nginx_keepalive_nginx_slave_1 93afe48d9b86 haproxy:1.7-alpine            0.0.0.0:8000->6301/tcp nginx_keepalive_proxy_1

        

     2)關閉keepalive-master模擬機器故障測試自動切換

[root@linux-node4 compose_lnmp]# docker stop nginx_keepalive_nginx_master_1 # 關閉keepalive-master模擬機器故障 [root@linux-node4 compose_lnmp]# docker ps # 取到keepalive-master已經關閉
CONTAINER ID IMAGE PORTS NAMES c21d0edda6d3 nginx_keepalive_nginx_slave 80/tcp nginx_keepalive_nginx_slave_1 ab283ebcfaf1 haproxy:1.7-alpine           0.0.0.0:8000->6301/tcp nginx_keepalive_proxy_1 [root@linux-node4 nginx_keepalive]# docker rm -f $( docker ps -a | grep keepalive |awk '{print $1}')  # 如果要停用最好刪除創建的docker鏡像

        

    3)項目地址

         https://gitee.com/xiaonq110/nginx_keepalive.git

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM