Mycat之——高可用負載均衡集羣的實現(HAProxy + Keepalived + Mycat)

轉載請註明出處:http://blog.csdn.net/l1028386804/article/details/76397064

本文是在博文《Mycat之——Mycat集羣部署(基於HAProxy + Mycat)》的基礎上,實現高可用負載均衡,若還沒有閱讀博文《Mycat之——Mycat集羣部署(基於HAProxy + Mycat)》,請先閱讀博文《Mycat之——Mycat集羣部署(基於HAProxy + Mycat)》。

一、本文要解決的問題


在博文《Mycat之——Mycat集羣部署(基於HAProxy + Mycat)》中,我們的架構圖如下:

由上圖可以看出,HAProxy存在單點隱患,一旦這個HAProxy服務宕機,那麼整個服務架構將不可用。那麼,如何解決HAProxy存在的單點隱患問題呢?這就是這篇博文要解決的問題。

二、軟件版本


操作系統:CentOS-6.5-x86_64
JDK版本:jdk1.7.0_80
HAProxy版本:haproxy-1.5.19.tar.gz
Mycat版本:Mycat-server-1.5.1-RELEASE-20170717215510-Linux.tar.gz (自行下載源碼編譯)
keepalived版本:keepalived-1.2.18.tar.gz
MySQL版本:mysql-5.6.32.tar.gz

三、部署規劃


四、 Mycat 高可用負載均衡集羣部署架構圖

圖解說明:
(1) HAProxy 實現了 Mycat 多節點的集羣高可用和負載均衡, 而 HAProxy 自身的高可用則可以通過Keepalived 來實現。 因此, HAProxy 主機上要同時安裝 HAProxy 和 Keepalived, Keepalived 負責爲該服務器搶佔 vip(虛擬 ip,圖中的 192.168.209.130),搶佔到 vip 後,對該主機的訪問可以通過原來的 ip(192.168.209.135)訪問,也可以直接通過 vip(192.168.209.130)訪問。
(2) Keepalived 搶佔 vip 有優先級, 在 keepalived.conf 配置中的 priority 屬性決定。但是一般哪臺主機上的 Keepalived服務先啓動就會搶佔到 vip,即使是 slave,只要先啓動也能搶到(要注意避免 Keepalived的資源搶佔問題)。
(3) HAProxy 負責將對 vip 的請求分發到 Mycat 集羣節點上, 起到負載均衡的作用。 同時 HAProxy 也能檢測到 Mycat 是否存活, HAProxy 只會將請求轉發到存活的 Mycat 上。
(4) 如果 Keepalived+HAProxy 高可用集羣中的一臺服務器宕機, 集羣中另外一臺服務器上的 Keepalived會立刻搶佔 vip 並接管服務, 此時搶佔了 vip 的 HAProxy 節點可以繼續提供服務。
(5) 如果一臺 Mycat 服務器宕機, HAPorxy 轉發請求時不會轉發到宕機的 Mycat 上,所以 Mycat 依然可用。
綜上: Mycat 的高可用及負載均衡由 HAProxy 來實現,而 HAProxy 的高可用,由 Keepalived 來實現。

五、 HAProxy 節點 2 的部署


HAProxy 主機 2(liuyazhuang136, 192.168.209.136)的安裝部署請參考博文《Mycat之——Mycat集羣部署(基於HAProxy + Mycat)》,注意配置文件的調整:
多節點部署時 haproxy.cfg 配置文件中的 node 、 description 配置的值要做相應調整。

HAProxy 主機 2(liuyazhuang136, 192.168.209.136)上的HAProxy配置如下:

## global配置中的參數爲進程級別的參數,通常與其運行的操作系統有關

global

log 127.0.0.1 local0 info ## 定義全局的syslog服務器,最多可以定義2個

### local0是日誌設備,對應於/etc/rsyslog.conf中的配置,默認回收info的日誌級別

#log 127.0.0.1 local1 info

chroot /usr/share/haproxy ## 修改HAProxy的工作目錄至指定的目錄並在放棄權限之前執行

### chroot() 操作,可以提升 haproxy 的安全級別

group haproxy ## 同gid,不過這裏爲指定的用戶組名

user haproxy ## 同uid,但這裏使用的爲用戶名

daemon ## 設置haproxy後臺守護進程形式運行

nbproc 1 ## 指定啓動的haproxy進程個數,

### 只能用於守護進程模式的haproxy;默認爲止啓動1個進程,

### 一般只在單進程僅能打開少數文件描述符的場中中才使用多進程模式

maxconn 4096 ## 設定每個haproxy進程所接受的最大併發連接數,

### 其等同於命令行選項"-n","ulimit-n"自動計算的結果正式參照從參數設定的

# pidfile /var/run/haproxy.pid ## 進程文件(默認路徑 /var/run/haproxy.pid)

node liuyazhuang136 ## 定義當前節點的名稱,用於HA場景中多haproxy進程共享同一個IP地址時

description liuyazhuang136 ## 當前實例的描述信息

## defaults:用於爲所有其他配置段提供默認參數,這默認配置參數可由下一個"defaults"所重新設定

defaults

log global ## 繼承global中log的定義

mode http ## mode:所處理的模式 (tcp:四層 , http:七層 , health:狀態檢查,只會返回OK)

### tcp: 實例運行於純tcp模式,在客戶端和服務器端之間將建立一個全雙工的連接,

#### 且不會對7層報文做任何類型的檢查,此爲默認模式

### http:實例運行於http模式,客戶端請求在轉發至後端服務器之前將被深度分析,

#### 所有不與RFC模式兼容的請求都會被拒絕

### health:實例運行於health模式,其對入站請求僅響應“OK”信息並關閉連接,

#### 且不會記錄任何日誌信息 ,此模式將用於相應外部組件的監控狀態檢測請求

option httplog

retries 3

option redispatch ## serverId對應的服務器掛掉後,強制定向到其他健康的服務器

maxconn 2000 ## 前端的最大併發連接數(默認爲2000)

### 其不能用於backend區段,對於大型站點來說,可以儘可能提高此值以便讓haproxy管理連接隊列,

### 從而避免無法應答用戶請求。當然,此最大值不能超過“global”段中的定義。

### 此外,需要留心的是,haproxy會爲每個連接維持兩個緩衝,每個緩存的大小爲8KB,

### 再加上其他的數據,每個連接將大約佔用17KB的RAM空間,這意味着經過適當優化後 ,

### 有着1GB的可用RAM空間時將維護40000-50000併發連接。

### 如果指定了一個過大值,極端場景中,其最終所佔據的空間可能會超過當前主機的可用內存,

### 這可能會帶來意想不到的結果,因此,將其設定一個可接受值放爲明智絕對,其默認爲2000

timeout connect 5000ms ## 連接超時(默認是毫秒,單位可以設置us,ms,s,m,h,d)

timeout client 50000ms ## 客戶端超時

timeout server 50000ms ## 服務器超時

## HAProxy的狀態信息統計頁面

listen admin_stats

bind :48800 ## 綁定端口

stats uri /admin-status ##統計頁面

stats auth admin:admin ## 設置統計頁面認證的用戶和密碼,如果要設置多個,另起一行寫入即可

mode http

option httplog ## 啓用日誌記錄HTTP請求

## listen: 用於定義通過關聯“前端”和“後端”一個完整的代理,通常只對TCP流量有用

listen mycat_servers

bind :3307 ## 綁定端口

mode tcp

option tcplog ## 記錄TCP請求日誌

option tcpka ## 是否允許向server和client發送keepalive

option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www ## 後端服務狀態檢測

### 向後端服務器的48700端口(端口值在後端服務器上通過xinetd配置)發送 OPTIONS 請求

### (原理請參考HTTP協議) ,HAProxy會根據返回內容來判斷後端服務是否可用.

### 2xx 和 3xx 的響應碼錶示健康狀態,其他響應碼或無響應表示服務器故障。

balance roundrobin ## 定義負載均衡算法,可用於"defaults"、"listen"和"backend"中,默認爲輪詢方式

server mycat_01 192.168.209.133:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10

server mycat_02 192.168.209.134:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10

## 格式:server <name> <address>[:[port]] [param*]

### serser 在後端聲明一個server,只能用於listen和backend區段。

### <name>爲此服務器指定的內部名稱,其將會出現在日誌及警告信息中

### <address>此服務器的IPv4地址,也支持使用可解析的主機名,但要在啓動時需要解析主機名至響應的IPV4地址

### [:[port]]指定將客戶端連接請求發往此服務器時的目標端口,此爲可選項

### [param*]爲此server設定的一系列參數,均爲可選項,參數比較多,下面僅說明幾個常用的參數:

#### weight:權重,默認爲1,最大值爲256,0表示不參與負載均衡

#### backup:設定爲備用服務器,僅在負載均衡場景中的其他server均不可以啓用此server

#### check:啓動對此server執行監控狀態檢查,其可以藉助於額外的其他參數完成更精細的設定

#### inter:設定監控狀態檢查的時間間隔,單位爲毫秒,默認爲2000,

##### 也可以使用fastinter和downinter來根據服務器端專題優化此事件延遲

#### rise:設置server從離線狀態轉換至正常狀態需要檢查的次數(不設置的情況下,默認值爲2)

#### fall:設置server從正常狀態轉換至離線狀態需要檢查的次數(不設置的情況下,默認值爲3)

#### cookie:爲指定server設定cookie值,此處指定的值將會在請求入站時被檢查,

##### 第一次爲此值挑選的server將會被後續的請求所選中,其目的在於實現持久連接的功能

#### maxconn:指定此服務器接受的最大併發連接數,如果發往此服務器的連接數目高於此處指定的值,

#####其將被放置於請求隊列,以等待其他連接被釋放


HAProxy 節點 1 的狀態信息頁:http://192.168.209.135:48800/admin-status

HAProxy 節點 2 的狀態信息頁:http://192.168.209.136:48800/admin-status

六、 Keepalived 介紹


官網: http://www.keepalived.org/

Keepalived 是一種高性能的服務器高可用或熱備解決方案, Keepalived 可以用來防止服務器單點故障的發生,通過配合 Haproxy 可以實現 web 前端服務的高可用。Keepalived 以 VRRP 協議爲實現基礎,用 VRRP 協議來實現高可用性(HA)。 VRRP(Virtual Router Redundancy Protocol)協議是用於實現路由器冗餘的協議, VRRP 協議將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器 IP(一個或多個),而在路由器組內部,如果實際擁有這個對外 IP 的路由器如果工作正常的話就是 MASTER,或者是通過算法選舉產生。 MASTER 實現針對虛擬路由器 IP 的各種網絡功能,如 ARP 請求, ICMP,以及數據的轉發等;其他設備不擁有該虛擬 IP,狀態是 BACKUP,除了接收 MASTER 的VRRP 狀態通告信息外,不執行對外的網絡功能。當主機失效時, BACKUP 將接管原先 MASTER 的網絡功能。VRRP 協議使用多播數據來傳輸 VRRP 數據, VRRP 數據使用特殊的虛擬源 MAC 地址發送數據而不是自身網卡的 MAC 地址, VRRP 運行時只有 MASTER 路由器定時發送 VRRP 通告信息,表示 MASTER 工作正常以及虛擬路由器 IP(組), BACKUP 只接收 VRRP 數據,不發送數據,如果一定時間內沒有接收到 MASTER 的通告信息,各 BACKUP 將宣告自己成爲 MASTER,發送通告信息,重新進行 MASTER 選舉狀態。

七、 Keepalived 的安裝(192.168.209.135、 192.168.209.136)


Keepalived (http://www.keepalived.org/download.html )

1、 上傳或下載 keepalived
上傳或下載 keepalived(keepalived-1.2.18.tar.gz) 到 /usr/local/src 目錄

2、解壓安裝
安裝 keepalived 需要用到 openssl

yum install gcc gcc-c++ openssl openssl-devel
cd /usr/local/src
tar -zxvf keepalived-1.2.18.tar.gz
cd keepalived-1.2.18
./configure --prefix=/usr/local/keepalived
make && make install


3、 將 keepalived 安裝成 Linux 系統服務
因爲沒有使用 keepalived 的默認路徑安裝(默認是/usr/local) ,安裝完成之後,需要做一些工作
複製默認配置文件到默認路徑

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/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/


設置 keepalived 服務開機啓動

chkconfig keepalived on


4、 修改 Keepalived 配置文件
(1) MASTER 節點配置文件(192.168.209.135)

! Configuration File for keepalived
global_defs {
## keepalived 自帶的郵件提醒需要開啓 sendmail 服務。建議用獨立的監控或第三方 SMTP
    router_id liuyazhuang135 ## 標識本節點的字條串,通常爲 hostname
}
## keepalived 會定時執行腳本並對腳本執行的結果進行分析,動態調整 vrrp_instance 的優先級。
## 如果腳本執行結果爲 0,並且 weight 配置的值大於 0,則優先級相應的增加。
## 如果腳本執行結果非 0,並且 weight 配置的值小於 0,則優先級相應的減少。
## 其他情況,維持原本配置的優先級,即配置文件中 priority 對應的值。
vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh" ## 檢測 haproxy 狀態的腳本路徑
    interval 2 ## 檢測時間間隔
    weight 2 ## 如果條件成立,權重+2
}
## 定義虛擬路由, VI_1 爲虛擬路由的標示符,自己定義名稱
vrrp_instance VI_1 {
    state BACKUP ## 默認主設備(priority 值大的)和備用設備(priority 值小的)都設置爲 BACKUP,
    ## 由 priority 來控制同時啓動情況下的默認主備,否則先啓動的爲主設備
    interface eth3 ## 綁定虛擬 IP 的網絡接口,與本機 IP 地址所在的網絡接口相同,我的是 eth3
    virtual_router_id 35 ## 虛擬路由的 ID 號,兩個節點設置必須一樣,可選 IP 最後一段使用,
    ## 相同的 VRID 爲一個組,他將決定多播的 MAC 地址
    priority 120 ## 節點優先級,值範圍 0-254, MASTER 要比 BACKUP 高
    nopreempt ## 主設備(priority 值大的)配置一定要加上 nopreempt,否則非搶佔也不起作用
    advert_int 1 ## 組播信息發送間隔,兩個節點設置必須一樣,默認 1s
    ## 設置驗證信息,兩個節點必須一致
    authentication {
        auth_type PASS
        auth_pass 1111 ## 真實生產,按需求對應該過來
    }
    ## 將 track_script 塊加入 instance 配置塊
    track_script {
        chk_haproxy ## 檢查 HAProxy 服務是否存活
    }
    ## 虛擬 IP 池, 兩個節點設置必須一樣
    virtual_ipaddress {
        192.168.209.130 ## 虛擬 ip,可以定義多個,每行一個
    }
}
(2)BACKUP 節點配置文件(192.168.209.136) 
! Configuration File for keepalived
global_defs {
    router_id liuyazhuang136
}
vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth3
    virtual_router_id 35
    priority 110
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_haproxy
    }
    virtual_ipaddress {
        192.168.209.130
    }
}


特別注意: 如果非搶佔模式不生效, 在 Keepalived 的故障節點恢復後會再次導搶佔 vip,從而因 vip 切換而閃斷帶來的風險(視頻解說)。 按以上配置,配置了 Keepalived 非搶佔模式, 配置及注意點如下:
(1) 主設備、 從設備中的 state 都設置爲 BACKUP
(2) 主設備、從設備中都不要配置 mcast_src_ip (本機 IP 地址)
(3) 默認主設備(priority 值大的 Keepalived 節點) 配置一定要加上 nopreempt,否則非搶佔不起作用
(4) 防火牆配置允許組播(主、備兩臺設備上都需要配置, keepalived 使用 224.0.0.18 作爲 Master 和Backup 健康檢查的通信 IP)

iptables -I INPUT -i eth3 -d 224.0.0.0/8 -p vrrp -j ACCEPT
iptables -I OUTPUT -o eth3 -d 224.0.0.0/8 -p vrrp -j ACCEPT


(eth3 爲主機的網卡設備名稱,生產環境服務器可以用獨立網卡來處理組播和心跳檢測等)

service iptables save


重啓防火牆:

service iptables restart


5、 編寫 Haproxy 狀態檢測腳本
我們編寫的腳本爲/etc/keepalived/haproxy_check.sh (已在 keepalived.conf 中配置)
腳本要求:如果 haproxy 停止運行,嘗試啓動,如果無法啓動則殺死本機的 keepalived 進程,keepalied將虛擬 ip 綁定到 BACKUP 機器上。

# mkdir -p /usr/local/keepalived/log
# vi /etc/keepalived/haproxy_check.sh

haproxy_check.sh腳本內容如下:

#!/bin/bash
START_HAPROXY="/etc/rc.d/init.d/haproxy start"
STOP_HAPROXY="/etc/rc.d/init.d/haproxy stop"
LOG_FILE="/usr/local/keepalived/log/haproxy-check.log"
HAPS=`ps -C haproxy --no-header |wc -l`
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE
echo "check haproxy status" >> $LOG_FILE
if [ $HAPS -eq 0 ];then
echo $START_HAPROXY >> $LOG_FILE
$START_HAPROXY >> $LOG_FILE 2>&1
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
echo "start haproxy failed, killall keepalived" >> $LOG_FILE
killall keepalived
fi
fi


保存後,給腳本賦執行權限: 

chmod +x /etc/keepalived/haproxy_check.sh


6、 啓動 Keepalived

service keepalived start


Starting keepalived: [ OK ]
Keepalived 服務管理命令:
停止: service keepalived stop
啓動: service keepalived start
重啓: service keepalived restart
查看狀態: service keepalived status

八、MyCat的安裝


1、設置MyCat的主機名和IP與主機名的映射

vi /etc/sysconfig/network


NETWORKING=yes
HOSTNAME=liuyazhuang133

vi /etc/hosts


127.0.0.1 liuyazhuang133
192.168.209.131 liuyazhuang131
192.168.209.132 liuyazhuang132
192.168.209.133 liuyazhuang133


2、配置Java環境變量
因爲MyCat是用Java開發的,因此MyCat運行需要安裝JDK(準確來說是JRE就夠了),並且需要JDK1.7或以上版本

vi /etc/profile
## java env
export JAVA_HOME=/usr/local/java/jdk1.7.0_80
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
source /etc/profile
java -version


3、上傳安裝包
上傳Mycat-server-1.5.1-RELEASE-20170717215510-linux.tar.gz 到 MyCat服務器中的/home/mycat目錄,並解壓並移動到 /usr/local/mycat目錄

tar -zxvf Mycat-server-1.5.1-RELEASE-20170717215510-linux.tar.gz
mv /home/mycat/mycat  /usr/local/
cd /usr/local/mycat/
ll

 

4、設置Mycat的環境變量
 

vi /etc/profile

 

## mycat env
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin

 

source /etc/profile、


四、配置MyCat


1、確認MySQL主從複製正常
在配置MyCat前,請確認MySQL的主從複製安裝配置已完成並正常運行。MySQL主從數據的同步在MySQL中配置,MyCat不負責數據同步的問題。
補充:
(1) MySQL主從複製配置中,如果涉及到函數或存儲過程的同步複製,需要在/etc/my.cnf中的[mysqld]段中增加配置log_bin_trust_function_creators=true 或在客戶端中設置 set global log_bin_trust_function_creators = 1;
(2) 如果要做讀寫分離下的主從切換,那麼從節點也有可能會變爲寫節點,因此從節點就不能設置爲只讀 read_only=1 。
(3) Linux版本的MySQL,需要設置爲MySQL大小寫不敏感,否則可能會發生找不到表的問題。可在/etc/my.cnf的[mysqld]段中增加lower_case_table_names=1 。
2、配置MyCat的schema.xml
schema.xml是MyCat最重要的配置文件之一,用於設置MyCat的邏輯庫、表、數據節點、dataHost等內容,

[root@liuyazhuang133 conf]$ cd /usr/local/root/conf/
[root@liuyazhuang133 conf]$ vi schema.xml

 

<?xml version="1.0"?>
 
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
 
<mycat:schema xmlns:mycat="http://org.opencloudb/">
 
      <!-- 定義MyCat的邏輯庫,邏輯庫的概念與MySQL中的 database 概念相同 -->
 
      <!-- schema name="rc_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="rc_dn1"></schema -->
 
        <!--schema name="pay_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="pay_dn1"></schema-->
 
      <schema name="lyz_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="lyz_dn1"></schema>
 
      <schema name="lyz_schema2" checkSQLschema="false" sqlMaxLimit="100" dataNode="lyz_dn2"></schema>
 
        <!-- 其中checkSQLschema表明是否檢查並過濾SQL中包含schema的情況,如邏輯庫爲 TESTDB,則可能寫爲select * from TESTDB.edu_user,此時會自動過濾TESTDB,SQL變爲select * from edu_user,若不會出現上述寫法,則可以關閉屬性爲false -->
 
        <!--sqlMaxLimit默認返回的最大記錄數限制,MyCat1.4版本里面,用戶的Limit參數會覆蓋掉MyCat的sqlMaxLimit默認設置-->
 
      <!-- 定義MyCat的數據節點 -->
 
      <dataNode name="lyz_dn1" dataHost="dtHost2" database="lyzdb1" />
 
      <dataNode name="lyz_dn2" dataHost="dtHost2" database="lyzdb2" />
 
    <!-- dataNode 中的 name 數據表示節點名稱, dataHost表示數據主機名稱, database表示該節點要路由的數據庫的名稱 -->
 
 
 
      <!-- dataHost配置的是實際的後端數據庫集羣(當然,也可以是非集羣) -->
 
      <!-- 注意:schema中的每一個dataHost中的host屬性值必須唯一,否則會出現主從在所有dataHost中全部切換的現象 -->
 
      <!-- 定義數據主機dtHost1,只連接到MySQL讀寫分離集羣中的Master節點,不使用MyCat託管MySQL主從切換 -->
 
      <!--
      <dataHost name="dtHost1" maxCon="500" minCon="20" balance="0"
           writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
           <heartbeat>select user()</heartbeat>
           <writeHost host="hostM1" url="192.168.1.205:3306" user="root" password="lyz" />
      </dataHost>
      -->
 
      <!-- 使用MyCat託管MySQL主從切換 -->
 
      <!-- 定義數據主機dtHost2,連接到MySQL讀寫分離集羣,並配置了讀寫分離和主從切換 -->
 
      <dataHost name="dtHost2" maxCon="500" minCon="20" balance="1"
 
           writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
 
           <!-- 通過show slave status檢測主從狀態,當主宕機以後,發生切換,從變爲主,原來的主變爲從,這時候show slave status就會發生錯誤,因爲原來的主沒有開啓slave,不建議直接使用switch操作,而是在DB中做主從對調。 -->
 
           <heartbeat>show slave status</heartbeat>
 
           <!-- can have multi write hosts -->
 
           <writeHost host="hostM2" url="192.168.209.131:3306" user="root" password="root" />
 
           <writeHost host="hostS2" url="192.168.209.132:3306" user="root" password="root" />
 
      </dataHost>
 
      <!-- 參數balance決定了哪些MySQL服務器參與到讀SQL的負載均衡中 -->
 
        <!-- balance="0",爲不開啓讀寫分離,所有讀操作都發送到當前可用的writeHost上-->
 
      <!-- balance="1",全部的readHost與stand by writeHost參與select語句的負載均衡-->
 
      <!-- balance="2",所有讀操作都隨機的在writeHost、readHost上分發-->
 
      <!-- MyCat1.4版本中,若想支持MySQL一主一從的標準配置,並且在主節點宕機的情況下,從節點還能讀取數據,則需要在MyCat裏配置爲兩個writeHost並設置balance="1" -->
 
      <!-- writeType="0",所有寫操作都發送到可用的writeHost上 -->
 
      <!-- writeType="1",僅僅對於galera for mysql集羣這種多主多節點都能寫入的集羣起效,此時Mycat會隨機選擇一個writeHost並寫入數據,對於非galera for mysql集羣,請不要配置writeType=1,會導致數據庫不一致的嚴重問題 -->
 
</mycat:schema>


MyCat1.4開始支持MySQL主從複製狀態綁定的讀寫分離機制,讓讀更加安全可靠,配置如下:
MyCat心跳檢查語句配置爲 show slave status ,dataHost 上定義兩個新屬性:switchType="2" 與 slaveThreshold="100",此時意味着開啓MySQL主從複製狀態綁定的讀寫分離與切換機制,MyCat心跳機制通過檢測 show slave status 中的
"Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三個字段來確定當前主從同步的狀態以及Seconds_Behind_Master主從複製時延,當Seconds_Behind_Master 大於slaveThreshold時,讀寫分離篩選器會過濾掉此Slave機器,防止讀到很久之前的舊數據,而當主節點宕機後,切換邏輯會檢查Slave上的Seconds_Behind_Master是否爲0,爲0時則表示主從同步,可以安全切換,否則不會切換。
3、配置 server.xml
server.xml 主要用於設置系統變量、管理用戶、設置用戶權限等。

[root@liuyazhuang133 conf]$ vi server.xml
<?xml version="1.0" encoding="UTF-8"?>
 
<!DOCTYPE mycat:server SYSTEM "server.dtd">
 
<mycat:server xmlns:mycat="http://org.opencloudb/">
 
      <system>
 
        <property name="defaultSqlParser">druidparser</property>
 
        <property name="charset">utf8mb4</property>
 
          <!-- <property name="useCompression">1</property>-->
 
          <!--1爲開啓mysql壓縮協議-->
 
          <!-- <property name="processorBufferChunk">40960</property> -->
 
          <!--
          <property name="processors">1</property>
          <property name="processorExecutor">32</property>
           -->
 
               <!--默認是65535 64K 用於sql解析時最大文本長度 -->
 
               <!--<property name="maxStringLiteralLength">65535</property>-->
 
               <!--<property name="sequnceHandlerType">0</property>-->
 
               <!--<property name="backSocketNoDelay">1</property>-->
 
               <!--<property name="frontSocketNoDelay">1</property>-->
 
               <!--<property name="processorExecutor">16</property>-->
 
               <!-- <property name="mutiNodeLimitType">1</property> 0:開啓小數量級(默認) ;1:開啓億級數據排序
                      <property name="mutiNodePatchSize">100</property> 億級數量排序批量
                     <property name="processors">32</property> <property name="processorExecutor">32</property>
                     <property name="serverPort">8066</property> <property name="managerPort">9066</property>
                     <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
                     <property name="frontWriteQueueSize">4096</property>
                <property name="processors">32</property>
               -->
 
          </system>
 
          <!-- 用戶1,對應的MyCat邏輯庫連接到的數據節點對應的主機爲MySQL主從複製配置中的Master節點,沒實現讀寫分離,讀寫都在該Master節點中進行  -->
 
          <!--
          <user name="user1">
               <property name="password">roncoo.1</property>
               <property name="schemas">rc_schema1,pay_schema1</property>
          </user>
          -->
 
          <!-- 用戶2,對應的MyCat邏輯庫連接到的數據節點對應的主機爲主從複製集羣,並通過MyCat實現了讀寫分離 -->
 
          <user name="lyz">
 
               <property name="password">lyz.123</property>
 
               <property name="schemas">lyz_schema1,lyz_schema2</property>
 
          </user>
 
          <!-- 用戶3,只讀權限-->
 
          <user name="userlyz">
 
               <property name="password">lyz.123</property>
 
               <property name="schemas">lyz_schema1,lyz_schema2</property>
 
               <property name="readOnly">true</property>
 
          </user>
 
</mycat:server>


4、防火牆中打開8066和9066端口
MyCat的默認數據端口爲8066,mycat通過這個端口接收數據庫客戶端的訪問請求。
管理端口爲9066,用來接收mycat監控命令、查詢mycat運行狀況、重新加載配置文件等。

[root@liuyazhuang133 mycat] vi /etc/sysconfig/iptables


增加:

## MyCat
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8066 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9066 -j ACCEPT


重啓防火牆:

[root@liuyazhuang133 mycat] service iptables restart


5、修改log日誌級別爲debug
修改log日誌級別爲debug,以便通過日誌確認基於MyCat的MySQL數據庫集羣讀寫分離的數據操作狀態(可以在正式上生產前改成info級別)

[root@liuyazhuang133 conf]$ vi /usr/local/mycat/conf/log4j.xml

6、啓動root

[root@liuyazhuang133 bin]$ cd /usr/local/root/bin/


(1) 控制檯啓動,這種啓動方式在控制檯關閉後,root服務也將關閉,適合調試使用:

[root@liuyazhuang133 bin]$ ./root console


(2) 可以採用以下後臺啓動的方式:

[root@liuyazhuang133 bin]$ ./root start


Starting root-server...
(對應的,重啓: root restart , 關閉: root stop )
7、MyCat連接測試
(1) 如果本地Windows安裝有MySQL,可以使用已有的mysql客戶端遠程操作Mycat


(2) Nativecat連接Mycat

8、讀寫分離測試
(1) 監聽MyCat日誌

[root@liuyazhuang133 ~]$ cd /usr/local/mycat/logs/
[root@liuyazhuang133 logs]$ tail -f mycat.log


(2) 讀測試

$ mysql -uuserlyz -plyz.123 -h192.168.209.233 -P8066
mysql> show databases;

mysql> use lyz_schema2;

mysql> show tables;

mysql> select * from lyz_user_02;

執行上面的查詢語句,此時對應的MyCat日誌信息如下:


多次執行 select * from lyz_user_02 語句,Mycat打印出來的日誌信息顯示讀操作請求都是路由到Slave節點(192.168.209.132)

(2) 寫測試

mysql> insert into lyz_user_02 (userName, pwd) values('liuyazhuang', 'lyz。123');

執行上面的新增插入語句後,此時對應的Mycat日誌信息如下:

多次執行以上插入語句,發現新增數據都是從 Master節點(192.168.209.131)插進入的,並且Slave節點通過Binlog同步了Master節點中的數據。

 

九、 Keepalived + Haproxy 的高可用測試


1、 關閉 192.168.209.135 中的 Haproxy, Keepalived 會將它重新啓動

service haproxy stop

2、 關閉 192.168.209.135 中的 Keepalived, VIP(192.168.209.130) 會被 192.168.209.136 搶佔

service keepalived stop

由上圖可知:Keepalived 停止後, 192.168.209.135 節點的網絡接口中的 VIP(192.168.209.130) 將消失

此時,由上圖可知:在192.168.209.136節點的網絡接口中會出現 VIP(192.168.209.130)。

查看此時 VIP 對應的 MAC, Windows 下使用 CMD 命令查看: 


說明此時 VIP 已經漂移到物理主機 192.168.209.136上了

再通過 VIP(192.168.209.130) 來訪問 Haproxy 集羣, 訪問到的也是 192.168.209.136

3、 重新啓動 192.168.209.135 中的 Keepalived
重新啓動 192.168.209.135 中的 Keepalived, vip(192.168.209.130)保留在 192.168.209.136 主機上, 不會出現 135 啓動搶佔 vip 的情況。

service keepalived start

4、 模擬搶佔了 vip 的節點(192.168.209.136) 中的 HAProxy 故障或啓動失敗


方式:把 192 節點中的 haproxy.cfg 文件重命名爲 haproxy.cfg_bak, 並把 haproxy 服務進行 kill 掉,此時 keepalived 會嘗試去啓動 haproxy,會由於找不到配置文件而啓動失敗,此時就會進行 haproxy_check.sh腳本中的 killall keepalived 命令,結束 keepalived 進行。隨後就是 192.168.209.135 節點重新搶佔 vip


說明此時 VIP 已經漂移到物理主機 192.168.209.135上了

再通過 VIP(192.168.209.130) 來訪問 Haproxy 集羣, 訪問到的也是 192.168.209.135

十、 通過 vip 訪問數據庫、驗證 vip 切換後的數據庫訪問


1、命令行訪問數據庫


2、Navicat訪問數據庫

至此,Mycat高可用負載均衡集羣的實現(HAProxy + Keepalived + Mycat)搭建完畢

十一、溫馨提示


大家可以到鏈接http://download.csdn.net/detail/l1028386804/9915621下載搭建Mycat高可用負載均衡集羣的實現(HAProxy + Keepalived + Mycat)使用的Keepalived


--------------------- 
作者:冰 河 
來源:CSDN 
原文:https://blog.csdn.net/l1028386804/article/details/76397064

原文:https://blog.csdn.net/l1028386804/article/details/75269196  
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章