>[info] keepalived + haproxy + mysql雙主高可用
### **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. 可靠性與穩定性都非常出色,可與硬件級設備媲美。
2. 支持連接拒絕,可以用于防止 DDoS 攻擊
3. 支持長連接、短連接和日志功能,可根據需要靈活配置
4. 路由 HTTP 請求到后端服務器,基于 cookie 作會話綁定;同時支持通過獲取指定的 url 來檢測后端服務器的狀態
5. HAProxy 還擁有功能強大的 ACL 支持,可靈活配置路由功能,實現動靜分離,在架構設計與實現上帶來很大方便
6. 可支持四層和七層負載均衡,幾乎能為所有服務常見的提供負載均衡功能
7. 擁有功能強大的后端服務器的狀態監控 web 頁面,可以實時了解設備的運行狀態 ,還可實現設備上下線等簡單操作。
8. 支持多種負載均衡調度算法,并且也支持 session 保持。
9. Haproxy 七層負載均衡模式下,負載均衡與客戶端及后端的服務器會分別建立一次 TCP連接,而在四層負載均衡模式下(DR),僅建立一次 TCP 連接;七層負載均衡對負載均衡設備的要求更高,處理能力也低于四層負載均衡
~~~
**1. haproxy 的配置文件由兩部分組成:**
1. 全局設定(global settings)
2. 對代理的設定(proxies)
> 全局設定
global settings:主要用于定義 haproxy 進程管理安全及性能相關的參數
> 代理設定
proxies 共分為4段:defaults,frontend,backend,listen
~~~
proxies:代理相關的配置可以有如下幾個配置端組成
defaults:為除了 global 以外的其它配置段提供默認參數,默認配置參數可由下一個 “defaults” 重新設定。
frontend:定義一系列監聽的套接字,這些套接字可接受客戶端請求并與之建立連接。
backend:定義 “后端” 服務器,前端代理服務器將會把客戶端的請求調度至這些服務器。
listen:定義監聽的套接字和后端的服務器。類似于將 frontend 和 backend 段放在一起
所有代理的名稱只能使用大寫字母、小寫字母、數字、-(中線)、_(下劃線)、.(點號)和:(冒號)。此外,ACL 名稱會區分字母大小寫。
~~~
### **haproxy配置文件詳細介紹**
**注:** 此處只做配置文件介紹,不做為后期負載均衡配置
~~~cfg
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開始;
cpu-map 2 1
cpu-map 3 2
cpu-map 4 3
cpu-map 5 4
cpu-map 6 5
cpu-map 7 6
cpu-map 8 7
cpu-map 9 8
cpu-map 10 9
cpu-map 11 10
cpu-map 12 11
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 # 開啟一個統計報告服務(frontend 和 backend 的組合體,監控組的名稱,按需自定義名稱)
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 # (leastconn :基于最少連接數 roundrobin:輪詢 source:ip 最近原則)
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 定義一條ACL,ACL是根據數據包的指定屬性以指定表達式計算出的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
~~~
```
global # 全局配置
log 127.0.0.1 local0 # 定義全局的 syslog 服務器,最多可以定義兩個
chroot /var/lib/haproxy # 將當前目錄為指定目錄,設置超級用戶權限啟動進程,提高安全性
pidfile /var/run/haproxy.pid # 將 HAProxy 進程寫入 PID 文件
maxconn 4000 # 設置每個 HAProxy 進程鎖接受的最大并發連接數
user haproxy # 同 uid 參數,使用是用戶名
group haproxy # 同 gid 參數,建議專用用戶組
nbproc 40 # 啟動多個進程來轉發請求,需要調整到足夠大的值來保證 HAProxy 本身不會成為瓶頸
daemon # 讓 HAProxy 以守護進程的方式工作于后臺,等同于“-D”選項的功能。當然,也可以在命令行中用“-db”選項將其禁用。
stats socket /var/lib/haproxy/stats # 定義統計信息保存位置
defaults # 默認配置
log global # 日志繼承全局配置段的設置
retries 2 # 向上游服務器嘗試連接的最大次數,超過此值就認為后端服務器不可用
timeout connect 2s # HAProxy 與后端服務器連接超時時間,如果在同一個局域網內可設置成較短的時間
timeout client 30000s # 定義客戶端與 HAProxy 連接后,數據傳輸完畢,不再有數據傳輸,即非活動連接的超時時間
timeout server 30000s # 定義 HAProxy 與上游服務器非活動連接的超時時間
listen admin_stats # frontend 和 backend 的組合體,監控組的名稱,按需自定義名稱
bind 0.0.0.0:8080 # 配置監聽端口
mode http # 配置監控運行的模式,此處為 `http` 模式
option httplog # 表示開始啟用記錄 HTTP 請求的日志功能
maxconn 10 # 最大并發連接數
stats refresh 30s # 配置每隔 30 秒自動刷新監控頁面
stats uri /haproxy # 配置監控頁面的 URL
stats realm HAProxy # 配置監控頁面的提示信息
stats auth admin:pingcap123 # 配置監控頁面的用戶和密碼 admin,可以設置多個用戶名
stats hide-version # 配置隱藏統計頁面上的 HAProxy 版本信息
stats admin if TRUE # 配置手工啟用/禁用,后端服務器(HAProxy-1.4.9 以后版本)
listen tidb-cluster # 配置 database 負載均衡
bind 0.0.0.0:3390 # 配置浮動 IP 和 監聽端口
mode tcp # HAProxy 中要使用第四層的應用層
balance leastconn # 連接數最少的服務器優先接收連接。`leastconn` 建議用于長會話服務,例如 LDAP、SQL、TSE 等,而不是短會話協議,如 HTTP。該算法是動態的,對于實例啟動慢的服務器,權重會在運行中作調整。(leastconn :基于最少連接數 roundrobin:輪詢 source:ip 最近原則)
server tidb-1 10.9.18.229:4000 check inter 2000 rise 2 fall 3 # 檢測 4000 端口,檢測頻率為 2000 毫秒。如果檢測出 2 次正常就認定機器已恢復正常使用,如果檢測出 3 次失敗便認定該服務器不可用。
server tidb-2 10.9.39.208:4000 check inter 2000 rise 2 fall 3
server tidb-3 10.9.64.166:4000 check inter 2000 rise 2 fall 3
```
### **haproxy安裝與環境配置**
**前期:** 環境搭建準備:
**流程:** 寫操作去找主節點192.168.244.20(master),讀的時候通過負載均衡 haproxy,在所有的從節點 192.168.244.30(slave),192.168.244.40(slave) 前面搭載負載均衡 proxy 節點,這個節點 1192.168.244.10(haproxy)就維護了所有節點的列表,當應用過來的時候只需要請求 haproxy 節點就可以了,這個節點對我們的請求內容進行分發到下面 192.168.244.30(slave),192.168.244.40(slave) 各節點,返回數據該由(haproxy) 節點返回。
| 服務器名稱 | IP | 操作系統 | 安裝服務 |
| --- | --- | --- | --- |
| mysql-master | 192.168.244.20 | CentOS7 | mysql |
| mysql-slave1 | 192.168.244.30 | CentOS7 | mysql|
| mysql-slave2 | 192.168.244.40 | CentOS7 | mysql|
| mysql-haproxy| 192.168.244.10 | CentOS7 | haproxy|
**1. 在 192.168.244.10 安裝haproxy負載均衡器**
```
yum install -y haproxy
```
**2. 配置haproxy配置文件,目錄:/etc/haproxy/haproxy.cfg**
**2.1 haproxy 客戶端配置:**
~~~
# haproxy 客戶端
listen http_front
# 配置監聽端口
bind 0.0.0.0:8100
# 配置監控運行的模式,此處為 `http` 模式
mode http
# 表示開始啟用記錄 HTTP 請求的日志功能
option httplog
# 配置ui 后綴
stats uri /haproxy
# web界面用戶和密碼
stats auth root:0000
# 配置每隔 10 秒自動刷新監控頁面
stats refresh 10s
# 啟用
stats enable
~~~
**2.1.1 訪問方式:** ip:8100/haproxy

**2.2 192.168.244.10 haproxy 服務配置:**
~~~
# mysql 負載均衡服務
listen mysql_server
# 配置監聽端口
bind 0.0.0.0:3307
# 配置監控運行的模式,此處為 `tcp` 模式
mode tcp
# 日志繼承全局配置段的設置
log global
# balance:基于最少連接數 roundrobin:輪詢
balance roundrobin
# 服務(rise 2是2次正確認為服務器可用,fall 3是3次失敗認為服務器不可用)
server mysql_server_1 192.168.244.30:3306 check inter 5s rise 2 fall 3
server mysql_server_2 192.168.244.40:3306 check inter 5s rise 2 fall 3
~~~
**2.2.1 在 兩臺192.168.244.30(slave)192.168.244.40(slave) 添加用戶授權**
```
grant all privileges on *.* to 'wangqianshun'@'%' identified by 'wangqianshun';flush privileges;
```

**2.2.2 直接連接 192.168.244.10(haproxy)端口:3307 進行測試**
```
mysql -uwangqianshun -pwangqianshun -h192.168.244.10 -P 3307
```

**2.2.3 查看 server_id**
```
# 只要配置了不同的 server_id 多次退出重新登錄 mysql 查看 server_id 則 實現輪詢
show variables like 'server_id';
```

**3. 啟動/停止 haproxy**
```
# 啟動方式一:直接啟動
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
# 啟動方式二:systemd 啟動 HAProxy,默認讀取(推薦)
systemctl start haproxy.service
# 停止方式一:
ps -ef | grep haproxy
kill -9 haproxy.pid
# 停止方式二:systemd 停止 haproxy(如果使用 systemd 啟動)
systemctl stop haproxy.service
```
*****
### **keepalived 是什么?**
keepalived 是集群管理中保證集群高可用的一個服務軟件, 用來防止單點故障。
Keepalived的作用是檢測服務器的狀態,如果有一臺服務器宕機,或工作出現故障,Keepalived將檢測到,并將有故障的服務器從系統中剔除,同時使用其它服務器代替該服務器的工作,當服務器工作 正常后Keepalived自動將服務器加入到服務器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復故障的服務器。
*****
### **keepalived 工作原理:**
keepalived 是以 VRRP 協議為實現基礎的,VRRP 全稱 Virtual Router Redundancy Protocol,即虛擬路由冗余協議。

虛擬路由冗余協議,可以認為是實現路由器高可用的協議, 即將 N 臺提供相同功能的路由器組成一個路由器組,這個組 里面有一個 master 和多個 backup,master 上面有一個對外 提供服務的 vip(該路由器所在局域網內其他機器的默認路 由為該 vip),master 會發組播,當 backup 收不到 vrrp 包時就認為 master 宕掉了,這時就需要根據 VRRP 的優先級來選舉一個 backup 當 master。這樣的話就可以保證路由器的高 可用了。
### **keepalived 工具安裝:** (方式一:)
**1. 安裝 keepalived 需要用到 openssl**
```
yum install gcc gcc-c++ openssl openssl-devel
cd /usr/local
# wget -q 不顯示任何下載信息
wget -q https://www.keepalived.org/software/keepalived-1.2.18.tar.gz
```
**2. 解壓并編譯安裝**
```
tar -zxvf keepalived-1.2.18.tar.gz && cd keepalived-1.2.18
./configure --prefix=/usr/local/keepalived
make && make install
```
**3. 將 keepalived 安裝成 Linux 系統服務**
復制默認配置文件到默認路徑:
```
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
```
復制 keepalived 服務腳本到默認的地址:
```
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
```
**4. 設置 keepalived 服務開機啟動**
```
# 開機啟動:
systemctl enable keepalived
# 啟動方式一:on off reset
chkconfig keepalived on
# 啟動方式二:
service keepalived start
# 啟動方式三:
systemctl start keepalived
```
### **keepalived 工具安裝:** (方式二:)
```
yum install keepalived -y
配置文件默認地址:
/etc/keepalived/keepalived.conf
```
>[info] keepalived 示例
### **前期:** 環境搭建準備:
<span style="color:red"><b> 注:</b></span> 已配置好一主二從
| 服務器名稱 | IP | 操作系統 | 安裝服務 |
| --- | --- | --- | --- |
| mysql-master | 192.168.244.20 | CentOS7 | mysql、keepalived |
| mysql-slave1 | 192.168.244.30 | CentOS7 | mysql、keepalived |
| mysql-slave2 | 192.168.244.40 | CentOS7 | mysql|
### **1. keepalived 配置文件:**
**1.1 keepalived master 節點配置文件(192.168.244.20)**
<span style="color:red"><b> 注:</b></span> 直接將文件內容清空
<span style="color:red"><b> 注:</b></span> 只需要修改 2 個 vip ip 和 物理機 ip 即可
<span style="color:red"><b> 注:</b></span> master 和 backup 有其他配置項不一致,請勿直接復制 master 到 backup 修改。
<span style="color:red"><b> 參數:</b></span>
>nopreempt //非搶占,配合backup,防止切換后,主庫服務恢復正常后,IP 漂移過來。(master backup都設置)

~~~
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
}
vrrp_sync_group VG1 {
group {
VI_1
}
}
vrrp_script haproxy_check {
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 12345678
}
virtual_ipaddress {
# 該ip為虛擬出來的vip地址(網段內只要不沖突 隨便定義)
192.168.244.240
}
track_script {
haproxy_check
}
}
# 寫VIP virtual_server,只配置本地機器
virtual_server 192.168.244.240 3306 {# 定義虛擬服務器,地址與上面的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 該配置為實際物理機ip地址 以及實際物理機mysql端口
real_server 192.168.244.20 3306 {
weight 1 # 權重越大負載分越大,0表示失效
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
~~~
**1.2 keepalived backup 節點配置文件(192.168.244.30)**
<span style="color:red"><b> 注:</b></span> 直接將文件內容清空
<span style="color:red"><b> 注:</b></span> 只需要修改 2 個 vip ip 和 物理機 ip 即可
<span style="color:red"><b> 注:</b></span> master 和 backup 有其他配置項不一致,請勿直接復制 backup 到 master 修改。
~~~
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
}
vrrp_sync_group VG1 {
group {
VI_1
}
}
vrrp_script haproxy_check {
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 12345678
}
virtual_ipaddress {
# 該ip為虛擬出來的vip地址(網段內只要不沖突 隨便定義)
192.168.244.240
}
track_script {
haproxy_check
}
}
# 寫VIP virtual_server,只配置本地機器
virtual_server 192.168.244.240 3306 {# 定義虛擬服務器,地址與上面的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 該配置為實際物理機ip地址 以及實際物理機mysql端口
real_server 192.168.244.30 3306 {
weight 1 # 權重越大負載分越大,0表示失效
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
~~~
**1.3 haproxy 狀態檢測腳本**
1. 創建檢測日志文件
```
mkdir -p /usr/local/keepalived/log && touch /usr/local/keepalived/log/haproxy-check.log
```
2. 在 192.168.244.20(master)和 192.168.244.30(slave) ``/etc/keepalived/``新建:`haproxy_check.sh`
<span style="color:red"><b> 注:</b></span> windows 的 sh 復制到 linux 會存在 換行符問題

~~~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
~~~
~~~
#!/bin/bash
# 檢測 mysql 服務
/usr/bin/mysql -uroot -p'123456' -e "show status" &>/dev/null
# 服務掛掉
if [ $? -ne 0 ] ;then
# 直接停止 keepalived 讓其漂移
systemctl stop keepalived
fi
~~~
執行授權:
```
chmod +x /etc/keepalived/haproxy_check.sh
```
### **2. 測試一:**
**2.1 先從 192.168.244.30(backup) 啟動 keepalived 使用 ip a 查看是否存在 192.168.244.240 網卡**
```
systemctl restart keepalived
ip a | grep 192.168.244.240
```

**2.2 再從 192.168.244.20(master) 啟動 keepalived 使用 ip a 查看是否存在 192.168.244.240 網卡 存在則ip偏移過來了 則 `backup` 使用 ip a 192.168.244.240 網卡不存在**
```
systemctl restart keepalived
ip a | grep 192.168.244.240
```


**2.3 本地通過 虛擬ip 端口:3306 直接連接 mysql 進行測試 server_id** <span style="color:green"><b>(vip 在 backup master 和外部連接都能成功)</b></span> <span style="color:red"><b>(vip 在 master backup 連接失敗 外部能夠成功)</b></span>
```
mysql -uwangqianshun -pwangqianshun -h192.168.244.240 -P 3306
```
### **3. 測試二:**
1. `master` 或 `backup` 停止 keepalived,查看主從切換。(ip切換)<span style="color:green"><b>(成功)</b></span>
2. 停止 `master` 上 `mysql`,查看主從切換(正常本機 keepalived 檢查到 mysql不在了,會執行 haproxy_check.sh 腳本直接 kill 掉 keepalived 進程)。<span style="color:green"><b>(成功)</b></span>

<span style="color:red"><b> 注:</b></span>
haproxy 狀態檢測腳本不執行問題,如果是使用的 `service keeplived start` 或者是 `systemctl` 方式啟動,腳本可能會不執行,可以使用`keepalived -f /etc/keepalived/keepalived.conf` 方式啟動 keepalived
<span style="color:red"><b> 注:</b></span>
keepalived 配置注意點 - 配置完成但是ip不生效;
1. 查看虛擬機/機器系統時間是否一致
2. virtual_router_id 路由id不對,不能沖突。可以通過 /var/log/messages 查看此錯誤。
如:server-1、server-2為一組,virtual_router_id = 51
如:server-3、server-4為一組,則 virtual_router_id 不能為 51
<span style="color:red"><b> 注:</b></span>
keepalive 默認的日志寫入了 /var/log/messages下。
### **4. 測試三:**
**介紹:**
> 兩臺mysql互為主從,但只有master寫,slave只負責讀。主從通過keepalive做成高可用,當master出問題,由slave接替master工作,即讀寫都在slave操作。當master恢復正常,master自動同步故障時間段數據,接替slave的寫工作。
1. master1 直接停止 mysql 使 keepalived 漂移到 backup


- PHP
- ThinkPHP5
- 變量修飾符:input()
- 常用函數封裝
- 01. 數據集轉為樹(Tree)
- 02. 生成訂單號
- 03. 將時間戳轉換為日期時間
- 04. 將字節轉換為可讀文本
- 05. 首字母頭像
- 06. 隨機小數/截取小數
- 07. 判斷字符串是否序列化
- 08. 根據生日計算年齡
- 09. 判斷是PC或WAP端
- 10. 請求網頁返回code碼狀態
- 11. 計算代碼執行時間
- 12. String 字符處理類
- 13. Http 請求類
- 14. StrRand 隨機生成字符類
- 15. 獲取當天開始時間和結束時間
- 16. 手機郵箱身份證
- 17. jsonEncode和jsonDecode助手函數
- 18. tp6跨域檢測
- 19.日期轉換為時間戳
- 20.excel導入日期格式問題
- 21.取整數函數常用的四種方法
- 22.PHPExcel導入導出
- 23.計算文件大小
- 24.計算按天數
- 25.文件夾不存在則創建
- 26.遞歸獲取部門所有子級id
- 27.根據用戶名生成默認文字頭像
- 28.生成短信驗證碼
- 29.數據脫敏
- 30.根據身份證判斷禁止未成年人下單
- 31.數組向指定位置插入元素
- 32.從字符串中獲取城市名稱
- 33.收貨地址拆分省市區
- 34.根據時間戳獲取本月開始-結束日期
- 35.循環每次查詢指定數據集
- 36.判斷日期是否符合范圍
- Laravel6
- 01.Dingo API 2.0.0 擴展包
- 01.laravel 安裝擴展包
- 02.創建端點
- 03.響應
- 04.api認證
- 監聽sql 語句
- 安裝easywechat
- 路由分組
- ThinkPHP6
- ThinkPHP6讀寫分離
- 定時計劃任務
- 偽靜態
- 多應用模式
- Join關聯查詢
- 跨域中間件
- extend擴展
- 1.操縱文件類
- 2.壓縮包驅動
- Xdebug調試
- Easy Task開發文檔
- 01.EasyTask介紹
- 02.EasyTask環境安裝
- 03.EasyTask基礎入門
- EasySwoole
- 999.狀態類
- 01.EasySwoole快速開始
- 1.EasySwoole介紹
- 2.EasySwoole快速上手
- 3.EasySwoole基本管理命令
- 4.EasySwoole基礎開始示例(CURD)
- 02.EasySwoole協程操作指南
- 1.什么是協程
- MySQL
- MySQL批量修改表前綴
- 重置【主鍵ID】
- 查看【文件存儲位置】
- MySQL主從同步
- 添加用戶權限
- MySQL主從復制集群
- 01.主從復制技術原理介紹
- 02.基于 binlog 主從復制搭建
- 03.基于binlog不影響業務搭建主從
- 04.主從復制 binlog 格式
- 05.主從復制過濾規則
- 06.在線增加從服務器
- 07.MySQL 雙主復制
- 08.雙主如何防止和解決主鍵沖突
- keepalived+haproxy+mysql雙主高可用
- lvs+keepalived+雙主mysql負載均衡
- MyCAT實現MySQL讀寫分離
- 09.多線程復制
- MHA
- 1.理解MHA高可用
- 2.搭建MySQL一主二從
- 3.建立節點互信
- 4.構建MHA
- 5.啟動并測試MHA
- 6.修復宕機的Master
- 重置root密碼
- MySQL 開發規范
- mycat
- 01.mycat 簡介與安裝
- 02.mycat 配置詳解
- 03.mycat 切片規則
- 常用SQL語句大全
- 01.取數騷SQL
- 02.評估表數據體量SQL
- Linux
- Contos 7
- 常用命令
- 解壓【zip】
- vmhgfs 掛載
- 跨主機免密碼認證
- 寶塔Linux面板
- 01.寶塔專業/企業版一鍵腳本破解版
- Windows
- 服務器
- 調出【桌面圖標】
- 查看【端口使用】
- 查看【操作日志】
- 查看【本地組策略】
- HTML
- URL編碼參照表
- RabbitMQ
- 01.rabbitMQ 快速入門
- 1. 認識 RabbitMQ
- 4. 消費者生產者代碼實例
- 3. 安裝 amqp 擴展
- 2. RabbitMQ安裝和啟動
- 02.rabbitMQ 高級特性
- 1. 高級特性前言
- 2. 高級特性之一ack comfirm機制
- 3. 高級特性之二如何保證消息的100%接收(一)
- 4. 高級特性之二如何保證消息的100%接收(二)
- 5. 高級特性之三冪等性
- 6. 高級特性之四 return機制
- 7. 高級特性之五 限流機制
- 8. 高級特性之六 重回隊列
- 9. 高級特性之七 TTL
- 10. 高級特性之八 死信隊列
- 03.tp6簡單應用 RabbitMQ
- 04.fanout 訂閱/廣播模式
- 05.topic 通配符模式
- Composer
- Composer 鏡像
- Compsoer 基礎使用
- Composer require 忽略依賴
- 微信公眾號
- 返回錯誤代碼說明
- 福利專區
- layuiAdmin框架模板
- Swoole
- 01.快速入門
- 1.swoole的概念介紹
- 2.安裝swoole
- 3. 快速運用swoole與理解
- 02.快速上手swoole與網絡協議
- 1.阻塞與非阻塞,同步與異步
- 2.HttpServer 加速php框架
- 3.WebSocket 簡單運用
- 4.tcp 與 upd 與 定時器
- 5.理解進程-非詳細
- 6.swoole結構
- 03.連接與tcp和upd
- 1.短鏈接與長連接
- 2.健康檢查
- 3.tcp 和 udp對比
- 4.tcp粘包的問題
- 5.tcp粘包問題的處理
- 04.理解網絡模型
- 1.linux內核與用戶空間調度
- 2.網絡io模型
- 3.構建worker結構iostar
- 4.理解stream系列函數
- 05.阻塞模型與非阻塞模型
- 1.構建基礎worker結構
- 2.搭建工程的結構
- 3.實現基礎版本的worker
- 4.完善worker模型
- 5.非阻塞模型與stream_select函數
- 6.補充
- 06.實現io復用與信號模型
- 07.實現異步io模型與Reactor模型
- 08.實現多進程reactor
- 09.詳解task進程
- 10.swostar之http與websocket
- 11.think-swoole使用
- 12.swostar之構建基礎核心結構
- 99.其他
- 西部數碼
- 01.NginxSLB搭建
- 02.windows 服務器取消多登錄
- PHP中高級面試題
- PHP基礎面試題
- MySQL面試題
- Redis面試題
- es面試題
- rqbbitMQ面試題
- 魔鬼訓練營
- 現場解答課-面試解答
- Laravel技術社區(干貨題庫匯總)
- 01.干貨題庫(一)
- 02.干貨題庫(二)
- 03.MySQL 常見面試題(1-25)
- 04.MySQL 常見面試題(26-58)
- Redis(2010期)
- 01.認識redis和安裝
- 02.Redis數據類型與string類型與list類型
- 03.Redis數據類型之hash類型與zset類型
- 04.Redis數據類型之set類型與性能檢測
- 05.Redis事務
- 06.Redis發布訂閱與stream應用
- 07.Redis-lua腳本
- 08.緩存擊穿,失效以及維度劃分
- 09.緩存穿透,雪崩問題
- 10.Redis緩存問題以及分布式鎖實現
- 11.redis持久化
- 1.redis-rdb持久化
- 2.redis-aof持久化
- 3.aof 和 rdb對比
- 12.redis主從復制
- 1.主從配置及原理
- 2.全量復制 和 部分復制
- 3.主從問題
- 13.redis哨兵機制
- 1.哨兵初識
- 2.redis哨兵原理
- 3.redis哨兵配置
- 4.redis哨兵問題
- 14.redis集群
- 1.集群搭建
- 2.故障轉移
- 3.redis集群伸縮
- 999.redis 常用命令
- key
- string(字符串)
- hash(哈希)
- list(列表)
- set(集合)
- zset(有序集合)
- Stream
- Redis 發布訂閱
- 事例
- Docker
- 1.docker快速入門
- 01.docker 了解
- 02.docker核心概念介紹
- 2.docker安裝
- 3.docker基本使用
- 01.常用命令(鏡像容器)
- 999.docker基本使用(示例)
- 01.docker部署es
- 02.docker部署lnmp
- 4.portainer可視化面板安裝
- 5.docker鏡像原理
- 01.docker鏡像聯合文件系統
- 02.docker分層理解
- 6.commit鏡像
- 7.docker容器數據卷
- 01.容器數據卷基本使用
- 02.容器數據卷示例
- 03.容器數據卷具名掛載和匿名掛載
- 04.多個容器數據卷數據共享
- 8.dockerFile
- 01.Dockerfile介紹
- 02.Dockerfile指令說明
- 03.發布鏡像到dockerhub
- 04.發布鏡像到阿里云
- 999.Dockerfile示例
- 01.Dockerfile構建 centos 鏡像
- 02.Dockerfile構建 tomcat 鏡像
- 03.Dockerfile構建 redis 鏡像
- 04.Dockerfile構建 lnmp 鏡像
- 9.docker網絡
- 01.理解docker0
- 02.容器互聯-link
- 03.自定義網絡
- 04.網絡互通
- 999.redis集群部署實戰
- 10.docker composer容器編排
- 01.docker-compose 介紹
- 02.安裝docker-compose
- 03.docker-compose 基本命令
- 04.docker-compose yml 常用命令
- 999.docker-compose示例
- 01.構建 nginx 鏡像(docker-compose)
- 02.構建 lnmp 鏡像(docker-compose)
- 11.docker swarm集群
- 12.ci/cd之jenkins
- 01.jenkins介紹
- 02.jenkins安裝(docker-compose)
- 13.k8s
- 01.什么是k8s
- 02.k8s使用場景
- 03.k8s部署架構分析
- 04.k8s運行架構分析
- Git
- 01.git理論和特點
- 02.gitlab安裝配置以及項目創建
- 03.用戶從windows接入并拉取+提交+修改代碼提交
- 04.如何把團隊弄進來一起開發
- 05.git基礎操作,練習命令
- 06.如果你讓三毛自己新建分支,并在上面開發這個時候三毛該怎么辦呢?
- 07.在分支開發完畢之后,如何合并到master
- 08.2個分支合并,發生沖突的演示,以及如何解決?
- 09.為什么要用git工作流,git工作流的好處
- 999.git常用命令
- phpstudy
- localhsot不顯示目錄
- tp6獲取不到header頭Authorization問題(apache)
- 分布式架構
- elk日志系統
- 01.elk為何而生
- 02.標準的日志系統包括哪些
- 03.什么是elk
- 04.架構設計分析
- 05.elk實操部署
- elasticsearch(簡稱:es)
- 01.es的簡介
- 02.es的安裝前提與安裝
- 03.es-head 與 kibana安裝
- 04.es的概念
- 05.ik分詞器
- 06.es對于restful的基本操作
- 07.es花式查詢
- 07.01 基本使用增刪改查
- 07.02 高級查詢
- 07.00 es花式搜索示例
- 01.大型互聯網架構演進過程
- 1.何為大型互聯網架構
- 2.分布式架構的演變過程
- 02.分布式通信技術介紹
- 1.分布式億級架構實戰
- 2.分布式-集群-微服務
- 3.分布式通信
- 4.分布式通信協議
- 03.分布式通信-實戰
- 1.分布式隊列原理
- 2.分布式隊列實戰
- 3.RPC代碼實戰
- 04.主流分布式架構設計詳解
- 1.分布式架構特性
- 2.CAP理論
- 3.BASE理論
- 05.consul服務注冊發現
- 1.consul的工作原理
- 2.consul集群實戰與操作
- 06.consul配置中心與實戰
- 1.配置中心是個什么
- 2.consul實現配置中心
- 3.consul的基本實戰操作
- 4.實戰跨服務調用
- 07.分布式數據庫
- 1.為什么要分庫分表
- 2.動態伸縮
- 08.分布式實戰數據庫實戰
- 09.分布式-分庫分表實戰
- 10.分布式事務
- 1.分布式事務
- 2.2PC-兩階段提交
- 3.3PC-三階段提交
- 4.TCC
- 5.MQ事務最終一致性
- 11.分布式實戰
- 12.elastic
- 13.elastic實戰
- 14.elastic場景實戰分析
- 15.elk
- 16.rabbitMQ
- 17.Kafka
- Redis、Nginx優化(2004期)
- 新能源汽車
- 數據表介紹
- 汽車租賃后臺管理
- 微信小程序授權
- 微信小程序接口
- Go
- Beego 框架
- 命令行大全
- go_zero
- 01.基礎部分
- 1.環境安裝并輸出HelloWorld
- 2.基礎語法與數據類型
- 3.Go語言變量常量定義
- 4.Go語言作用域
- 5.Go常用占位符
- 6.Go異常處理
- 7.Go中的包
- 8.指針與fmt
- 9.下劃線
- 10.數組(Array)
- 11.切片(Slice)
- 12.指針
- 13.Map
- 14.結構體
- 第三方庫
- 01.strconv
- 02.json
- 03.air實時加載
- 04.gjson
- 05.lo
- 06.time
- 07.reflect(反射)
- 08.retry-go(重試機制)
- 09.strings
- 數據庫操作
- 1.go操作mysql
- 2.go操作redis
- MongoDB
- 1.MongoDB 簡介
- 2.MongoDB 安裝
- 3.MongoDB 簡單CURD
- 4.MongoDB 條件操作符
- 5.MongoDB Limit/Skip/Sort方法
- 6.MongoDB 索引
- 7.MongoDB 聚合與管道
- 8.MongoDB 復制(副本集)
- 99. 客戶端安裝與PHP操作
- Swoft
- 01.框架安裝
- simpledingtalk修改點
- ThinkPHP6API基礎模板
- uniapp
- 01.微信小程序獲取頁面路由參數
- 02.通用提示
- 03.緩存
- 04.日期轉時間戳
- 05.VConsole調試
- Tailwind CSS
- 01.安裝以及基礎配置
- Vue
- 助手函數
- 1.時間戳格式化日期倒計時
- 2.獲取不重復的id
- 3.獲取正確的url路經
- 4.Object對象格式化為Query語法
- 5.數組轉Tree
- 6.Tree轉數組
- 7.判斷值是否為空
- 9.數字前置補零
- 10.在線時間
- 11.html轉義
- 12.pid形式數據轉children形式
- 13.遍歷children形式數據
- 14.全屏切換
- 15.獲取屏幕寬高度
- 16.獲取設備信息
- 17.百度高德地圖坐標轉換
- 18.深度克隆
- 19.獲取變量類型
- 20.播放音頻
- 21.導出excel
- 22.數字千分位
- 23.判斷是否是外鏈
- 24.獲取url參數
- ElementUI
- 1.表單驗證
- 模板
- Yii2
- 01.SQL慢查詢分塊