記一次mysql高可用技術分享

HelloWorld-Q發表於2021-02-03

1.1 haproxy介紹

HAProxy 是一個使用C語言編寫的自由及開放原始碼軟體,其提供高可用性、負載均衡,以及基於 TCP 和 HTTP 的應用程式代理。

  • HAProxy 特別適用於那些負載特大的 web 站點,這些站點通常又需要會話保持或七層處理。
  • HAProxy 執行在當前的硬體上,完全可以支援數以萬計的併發連線。並且它的執行模式使得它可以很簡單安全的整合進您當前的架構中, 同時可以保護你的 web 伺服器不被暴露到網路上。
  • HAProxy 實現了一種事件驅動,單一程式模型,此模型支援非常大的併發連線數。多程式或多執行緒模型受記憶體限制 、系統排程器限制以及無處不在的鎖限制,很少能處理數千併發連線。事件驅動模型因為在有更好的資源和時間管理的使用者空間 (User-Space) 實現所有這些任務,所以沒有這些問題。此模型的弊端是,在多核系統上,這些程式通常擴充套件性較差。這就是為什麼他們必須進行優化以使每個 CPU 時間片 Cycle 做更多的工作。
  • 相較與 Nginx,HAProxy 更專注與反向代理,因此它可以支援更多的選項,更精細的控制,更多的健康狀態檢測機制和負載均衡演算法。
  • 包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter 和 Tuenti 在內的知名網站,及亞馬遜網路服務系統都使用了 HAProxy。

Haproxy的特性:

1. 可靠性與穩定性都非常出色,可與硬體級裝置媲美。

  1. 支援連線拒絕,可以用於防止 DDoS 攻擊
  2. 支援長連線、短連線和日誌功能,可根據需要靈活配置
  3. 路由 HTTP 請求到後端伺服器,基於 cookie 作會話繫結;同時支援通過獲取指定的 url 來檢測後端伺服器的狀態
  4. HAProxy 還擁有功能強大的 ACL 支援,可靈活配置路由功能,實現動靜分離,在架構設計與實現上帶來很大方便
  5. 可支援四層和七層負載均衡,幾乎能為所有服務常見的提供負載均衡功能
  6. 擁有功能強大的後端伺服器的狀態監控 web 頁面,可以實時瞭解裝置的執行狀態 ,還可實現裝置上下線等簡單操作。
  7. 支援多種負載均衡排程演算法,並且也支援 session 保持。
  8. Haproxy 七層負載均衡模式下,負載均衡與客戶端及後端的伺服器會分別建立一次 TCP連線,而在四層負載均衡模式下(DR),僅建立一次 TCP 連線;七層負載均衡對負載均衡裝置的要求更高,處理能力也低於四層負載均衡

1.2 配置檔案詳細介紹

注意:此處只做配置檔案介紹,不做為後期負載均衡配置

global
    log 127.0.0.1 local0                                        # 定義全域性的 syslog 伺服器,最多可定義2,格式:log <address> <facility> [max level [min level]]
    chroot /var/lib/haproxy                                     # 修改 haproxy 的工作目錄至指定的目錄並在放棄許可權之前執行,保證haproxy的安全,使用配置檔案預設值即可
    pidfile /var/run/haproxy.pid
    maxconn 10000                                               # 設定每個haproxy程式所接受的最大併發連線數,其等同於命令列選項“-n”;“ulimit -n”自動計算的結果正是參照此引數設定的;
    user haproxy                                                # 以指定的 user 執行haproxy,建議使用專用於執行 haproxy 的 user, 以免因許可權問題帶來風險;
    group haproxy                                               # 以指定的 group 執行haproxy,建議使用專用於執行 haproxy 的 group, 以免因許可權問題帶來風險;
    daemon                                                      # 讓 haproxy 以守護程式的方式工作於後臺,其等同於 “-D” 選項的功能, 當然,也可以在命令列中以 “-db” 選項將其禁用;
    ulimit-n 100000                                             # 設定每程式所能夠開啟的最大檔案描述符數目,預設情況下其會自動進行計算,因此不推薦修改此選項;Linux預設單程式開啟檔案數為1024個
    stats socket /var/lib/haproxy/stats level admin process 1   # 開啟一個 socket 管理介面
    nbproc 12                                                   # 指定啟動的 haproxy 程式個數,只能用於守護程式模式的 haproxy;預設只啟動一個程式,
    cpu-map 1 0                                                 # 繫結 cpu,和 nbproc 數量相對。程式號從1開始,cpu 核數從0開始;

defaults
    log global
    option tcplog                                               # 啟用日誌記錄;tcplog 請求;
    option dontlognull                                          # 日誌中將不會記錄空連線;
    retries 3                                                   # 定義連線後端伺服器的失敗重連次數
    timeout connect 2s                                          # 定義 haproxy 將客戶端請求轉發至後端伺服器所等待的超時時長
    timeout client 3600s                                        # 客戶端非活動狀態的超時時長
    timeout server 3600s                                        # 客戶端與伺服器端建立連線後,等待伺服器端的超時時長
    maxconn 10000                                               # 預設和前段的最大連線數,但不能超過 global 中的 maxconn 限制數

listen admin_stats                                              # 開啟一個統計報告服務
    bind *:1080                                                 # 監聽1080埠
    mode http                                                   # 基於http協議
    maxconn 10
    stats refresh 10s                                           # 統計頁面自動重新整理時間間隔
    stats uri /haproxy                                          # url 地址
    stats realm Haproxy                                         # 統計頁面密碼框上提示文字
    stats auth admin:admin                                      # 賬號:密碼
    stats hide-version                                          # 隱藏統計報告版本資訊
    stats admin if TRUE                                         # 在制定條件下開啟admin 功能

frontend haproxy                                                # 前端應用
    bind *:40000                                                # 埠
    mode tcp                                                    # tcp 模式
    default_backend tidb                                        # 此前端對應的後端應用

backend tidb                                                    # 後端應用
    balance leastconn                                           # balance 基於最少連線數
    mode tcp                                                    # tcp 模式
    # acl internal_networks src 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 127.0.0.1  定義一條ACLACL是根據資料包的指定屬性以指定表示式計算出的true/false值。
    # tcp-request content reject if ! internal_networks
    # option mysql-check user haproxy post-41
    server tidb1 10.0.1.4:4000 check                            # 後端應用地址,代理將會將對應客戶端的請求轉發至這些伺服器。
    server tidb2 10.0.1.10:4000 check

1.3 haproxy安裝與環境配置

在192.168.199.175與192.168.199.172(負載均衡伺服器)中安裝與配置如下:

  1. 安裝haproxy負載均衡器
yum install haproxy -y
  1. 配置haproxy配置檔案,目錄:/etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    mode                   tcp
    log                     global
    option                  tcplog
    option                  dontlognull
    option http-server-close
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend    mysql
    bind        0.0.0.0:3307
    mode       tcp
    log             global
    default_backend         mysql_server

backend     mysql_server
    balance     roundrobin
    server  mysql1 192.168.199.172:3306 check inter 5s rise 2 fall 3
    server  mysql2 192.168.199.175:3306 check inter 5s rise 2 fall 3

listen stats
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats hide-version
    stats uri /haproxyadmin?stats
    stats realm Haproxy\ Statistics
    stats auth admin:admin
    stats admin if TRUE
  1. 啟動haproxy負載均衡
./usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
  1. 檢視狀態

192.168.126.101:1080/haproxyadmin?s...

2.1 Keepalived介紹

Keepalived的作用是檢測伺服器的狀態,如果有一臺伺服器當機,或工作出現故障,Keepalived將檢測到,並將有故障的伺服器從系統中剔除,同時使用其它伺服器代替該伺服器的工作,當伺服器工作 正常後Keepalived自動將伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的伺服器。

2.2 Keepalived安裝

  1. 安裝Keepalived需要的擴充套件
[root@localhost keepalived]# yum install gcc gcc-c++ openssl openssl-devel
[root@localhost home]# wget -q https://www.keepalived.org/software/keepalived-1.2.18.tar.gz

2.解壓Keepalived並安裝

[root@localhost home]# tar -zxvf keepalived-1.2.18.tar.gz
[root@localhost home]# cd keepalived-1.2.18
[root@localhost keepalived-1.2.18]# ./configure --prefix=/usr/local/keepalived
[root@localhost keepalived-1.2.18]# make && make install
  1. 將 keepalived 安裝成 Linux 系統服務

因為沒有使用 keepalived 的預設路徑安裝(預設是/usr/local) ,安裝完成之後,需要做一些工作 複製預設配置檔案到預設路徑

[root@localhost keepalived-1.2.18]# mkdir /etc/keepalived
[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

複製 keepalived 服務指令碼到預設的地址

[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@localhost keepalived-1.2.18]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/

設定 keepalived 服務開機啟動

[root@localhost keepalived-1.2.18]# chkconfig keepalived on

3. mysql高可用搭建

3.1 Keepalived配置

keepalived主機配置

! Configuration File for keepalived
global_defs {
    router_id LVS_MASTER
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh" ## 檢測 haproxy 狀態的指令碼路徑
    interval 2 ## 檢測時間間隔
    weight 2 ## 如果條件成立,權重+2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 79
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.29.101
    }
    track_script {
        chk_haproxy
    }
}
# 寫VIP virtual_server,只配置本地機器
virtual_server 192.168.29.101 3307 {# 定義虛擬伺服器,地址與上面的virtual_ipaddress相同
    delay_loop 3 # 健康檢查時間間隔,3秒
    lb_algo rr # 負載均衡排程演算法:rr|wrr|lc|wlc|sh|dh|lblc
    lb_kind DR # 負載均衡轉發規則:NAT|DR|TUN
    # persistence_timeout 5 # 會話保持時間5秒,動態服務建議開啟
    protocol TCP # 轉發協議protocol,一般有tcp和udp兩種
    real_server 192.168.29.106 3307 {
        weight 1 # 權重越大負載分越大,0表示失效
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

Keepalived從機配置

! Configuration File for keepalived
global_defs {
    router_id LVS_MASTER
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh" ## 檢測 haproxy 狀態的指令碼路徑
    interval 2 ## 檢測時間間隔
    weight 2 ## 如果條件成立,權重+2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 79
    priority 90
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.29.101
    }
    track_script {
        chk_haproxy
    }
}
# 寫VIP virtual_server,只配置本地機器
virtual_server 192.168.29.101 3307 {# 定義虛擬伺服器,地址與上面的virtual_ipaddress相同
    delay_loop 3 # 健康檢查時間間隔,3秒
    lb_algo rr # 負載均衡排程演算法:rr|wrr|lc|wlc|sh|dh|lblc
    lb_kind DR # 負載均衡轉發規則:NAT|DR|TUN
    # persistence_timeout 5 # 會話保持時間5秒,動態服務建議開啟
    protocol TCP # 轉發協議protocol,一般有tcp和udp兩種
    real_server 192.168.29.107 3307 {
        weight 1 # 權重越大負載分越大,0表示失效
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

啟動

[root@localhost keepalived]# service keepalived start

haproxy狀態檢測指令碼

 touch /etc/keepalived/haproxy_check.sh
#!/bin/bash
START_HAPROXY="/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg" #haproxy啟動命令
LOG_FILE="/usr/local/keepalived/log/haproxy-check.log" # 日誌檔案
HAPS=`ps -C haproxy --no-header |wc -l` # 檢測haproxy的狀態,0代表未啟動,1已經啟動
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE #在日誌檔案當中記錄檢測時間
echo "check haproxy status" >> $LOG_FILE # 記錄haproxy的狀態
if [ $HAPS -eq 0 ];then #執行haproxy判斷
  echo $START_HAPROXY >> $LOG_FILE #記錄啟動命令
  /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg #啟動haproxy
  sleep 3
  if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
    echo "start haproxy failed, killall keepalived" >> $LOG_FILE
    killall keepalived
    service keepalived stop
  fi
fi

測試 網路卡漂移

D:\phpstudy_pro\Extensions\MySQL5.7.26\bin>mysql -h192.168.126.33 -uslave -p1234
5678 -P3307  -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+

D:\phpstudy_pro\Extensions\MySQL5.7.26\bin>mysql -h192.168.126.33 -uslave -p1234
5678 -P3307  -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 3     |
+---------------+-------+

D:\phpstudy_pro\Extensions\MySQL5.7.26\bin>mysql -h192.168.126.33 -uslave -p1234
5678 -P3307  -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 3     |
+---------------+-------+
本作品採用《CC 協議》,轉載必須註明作者和本文連結
有夢想的人睡不著,沒有夢想的人睡不醒。

相關文章