基於MyCat部署HaProxy實現高可用
在實際項目中, Mycat 服務也需要考慮高可用性,如果 Mycat 所在服務器出現宕機,或 Mycat 服務故障,需要有備機提供服務,需要考慮 Mycat 集羣。
一、高可用方案
可以使用 HAProxy+Keepalived配合兩臺MyCat搭起MyCat集羣,實現高可用性。 HAProxy實現了MyCat多節點的集羣高可用和負載均衡,而 HAProxy自身的高可用則可以通過Keepalived來實現.
架構圖:
新添:
mycat02、haproxy01、haproxy02
主機操作系統IP地址mysql01Centos 7.3192.168.1.1mysql02(slave)Centos 7.3192.168.1.8mysql03Centos 7.3192.168.1.9mycatCentos 7.3192.168.1.3mycat02Centos 7.3192.168.1.11haproxy01(keepalived)Centos 7.3192.168.1.4(VIP:192.168.1.100)haproxy02(keepalived)Centos 7.3192.168.1.5(VIP:192.168.1.100)
案例中關閉防火牆
啓動兩臺mycat服務
[root@mycat mycat]# ./bin/mycat start
[root@mycat mycat2]# ./bin/mycat start
測試連接mycat(可以連接自己,並且可以連接到另一臺mycat)
[root@mycat ~]# mysql -umycat -p123456 -P8066 -h 192.168.1.3
[root@mycat2 ~]# mysql -umycat -p123456 -P8066 -h 192.168.1.11
[root@mycat ~]# mysql -umycat -p123456 -P8066 -h 192.168.1.11
[root@mycat2 ~]# mysql -umycat -p123456 -P8066 -h 192.168.1.3
1、安裝配置 HAProxy(haproxy01、haproxy02)
1)安裝 HAProxy 準備好HAProxy安裝包,傳到/opt目錄下 解壓到/usr/local/src
[root@haproxy01 ~]# tar zxf haproxy-1.8.23.tar.gz -C /usr/local/src/
2)進入解壓後的目錄,查看內核版本, 進行編譯
[root@haproxy01 ~]# cd /usr/local/src/haproxy-1.8.23/
[root@haproxy01 haproxy-1.8.23]# make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64
ARGET=linux310,內核版本,使用uname -r查看內核,如: 3.10.0-514.el7,此時該參數就爲linux310;
ARCH=x86_64,系統位數;
PREFIX=/usr/local/haprpxy #/usr/local/haprpxy,爲haprpxy安裝路徑。
3)編譯完成後,進行安裝
[root@haproxy01 haproxy-1.8.23]# make install PREFIX=/usr/local/haproxy
編輯配置文件(文件內容自己定義):
[root@haproxy01 haproxy-1.8.23]# vim /usr/local/haproxy/haproxy.conf
global
log 127.0.0.1 local0
#log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
chroot /usr/local/haproxy
pidfile /usr/local/haproxy/haproxy.pid
uid 99
gid 99
daemon
#debug
#quiet
defaults
log global
mode tcp
option abortonclose
option redispatch
retries 3
maxconn 2000
timeout connect 5000
timeout client 50000
timeout server 50000
listen proxy_status
bind :48066
mode tcp
balance roundrobin
server mycat_1 192.168.1.3:8066 check inter 10s //mycat服務器IP地址
server mycat_2 192.168.1.11:8066 check inter 10s //mycat服務器IP地址
frontend admin_stats
bind :7777
mode http
stats enable
option httplog
maxconn 10
stats refresh 30s
stats uri /admin //訪問web用戶名
stats auth admin:123123 //定義密碼
stats hide-version
stats admin if TRUE
4)驗證啓動HAProxy
[root@haproxy01 haproxy-1.8.23]# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf
查看HAProxy進程
[root@haproxy01 haproxy-1.8.23]# ps -ef|grep haproxy
打開瀏覽器訪問 http://192.168.1.4:7777/admin、http://192.168.1.5:7777/admin
在彈出框輸入用戶名: admin密碼: 123123
訪問第二臺:
驗證負載均衡,通過HAProxy訪問Mycat
[root@mysql03 ~]# scp /usr/local/mysql/bin/mysql 192.168.1.4:/usr/local/sbin/
[root@mysql03 ~]# scp /usr/local/mysql/bin/mysql 192.168.1.5:/usr/local/sbin/
[root@haproxy01 haproxy-1.8.23]# mysql -umycat -p123456 -h 192.168.1.4 -P 48066
[root@haproxy01 haproxy-1.8.23]# mysql -umycat -p123456 -h 192.168.1.5 -P 48066
2、安裝配置keepalived(兩臺haproxy)
1)安裝 Keepalived 準備好Keepalived安裝包,傳到/opt目錄下 解壓到/usr/local/src
[root@haproxy01 ~]# tar zxf keepalived-2.0.20.tar.gz -C /usr/local/src/
安裝依賴插件
[root@haproxy01 ~]# yum -y install gcc openssl-devel popt-devel
進入解壓後的目錄, 進行配置, 進行編譯
[root@haproxy01 ~]# cd /usr/local/src/keepalived-2.0.20/
[root@haproxy01 keepalived-2.0.20]# ./configure --prefix=/usr/local/keepalived
完成後進行安裝
[root@haproxy01 keepalived-2.0.20]# make && make install
運行前配置
[root@haproxy01 keepalived-2.0.20]# cp /usr/local/src/keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d/
[root@haproxy01 keepalived-2.0.20]# mkdir /etc/keepalived
[root@haproxy01 keepalived-2.0.20]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/[root@haproxy01 keepalived-2.0.20]# cp /usr/local/src/keepalived-2.0.20/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@haproxy01 keepalived-2.0.20]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
修改配置文件
[root@haproxy01 keepalived-2.0.20]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived //註釋
global_defs {
router_id LVS_DEVEL //keepalived服務器的一個標識
}
vrrp_instance VI_1 {
state MASTER //指定keepalived的角色, 兩臺配置此處均是BACKUP,設爲BACKUP將根據優先級決定主或從
interface ens33 //指定HA監測網絡的接口
virtual_router_id 51 //虛擬路由標識,這個標識是一個數字(取值在0-255之間,用來區分多個instance的VRRP組播),同一個vrrp實例使用唯一的標識,確保和master2相同,同網內不同集羣此項必須不同,否則發生衝突。
priority 100 //用來選舉master的,要成爲master,該項取值範圍是1-255(在此範圍之外會被識別成默認值100),此處master2上設置爲50
advert_int 1 //發VRRP包的時間間隔,即多久進行一次master選舉(可以認爲是健康查檢時間間隔)
authentication { //認證區域,認證類型有PASS和HA(IPSEC),推薦使用PASS(密碼只識別前8位)
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { //VIP區域,指定vip地址
192.168.1.100
}
}
virtual_server 192.168.1.100 48066 { //設置虛擬服務器,需要指定虛擬IP地址和服務端口,IP與端口之間用空格隔開
delay_loop 6 //設置運行情況檢查時間,單位是秒
lb_algo rr //設置後端調度算法,這裏設置爲rr,即輪詢算法
lb_kind NAT //設置LVS實現負載均衡的機制,有NAT、TUN、DR三個模式可選
persistence_timeout 50 //會話保持時間,單位是秒。這個選項對動態網頁是非常有用的,爲集羣系統中的session共享提供了一個很好的解決方案。有了這個會話保持功能,用戶的請求會被一直分發到某個服務節點,直到超過這個會話的保持時間。
protocol TCP //指定轉發協議類型,有TCP和UDP兩種
real_server 192.168.1.4 48066 { //配置服務節點1,需要指定real server的真實IP地址和端口,IP與端口之間用空格隔開
weight 1 //配置服務節點的權值,權值大小用數字表示,數字越大,權值越高,設置權值大小爲了區分不同性能的服務器
TCP_CHECK {
connect_timeout 3 //連接超時時間
retry 3 //重連次數
delay_before_retry 3 //重連間隔時間
}
}
real_server 192.168.1.5 48066 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
拷貝到第二臺haproxy
[root@haproxy01 keepalived-2.0.20]# scp /etc/keepalived/keepalived.conf 192.168.1.5:/etc/keepalived/keepalived.conf
做一些簡單修改
[root@haproxy02 keepalived-2.0.20]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_2 { //改
state MASTER
interface ens33
virtual_router_id 51
priority 50 //降低
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
}
virtual_server 192.168.1.100 48066 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.1.4 48066 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
real_server 192.168.1.5 48066 {
weight 1
TCP_CHECK {
connect_timeout 3
retry 3
delay_before_retry 3
}
}
}
2)啓動驗證
[root@haproxy01 keepalived-2.0.20]# service keepalived start
Starting keepalived (via systemctl): [ OK ]
[root@haproxy01 keepalived-2.0.20]# ip a
開啓第二臺的服務
[root@localhost keepalived-2.0.20]# service keepalived start
Starting keepalived (via systemctl): [ OK ]
登錄驗證(訪問VIP地址)
[root@haproxy01 keepalived-2.0.20]# mysql -umycat -p123456 -h192.168.1.100 -P 48066
模擬第一臺mycat宕機:
[root@mycat ~]# ./mycat/bin/mycat stop
繼續通過haproxy(VIP)訪問:
[root@haproxy01 keepalived-2.0.20]# mysql -umycat -p123456 -h 192.168.1.100 -P 48066
依然可以訪問到
模擬第一臺haproxy宕機
斷開網卡連接
可以看到VIP跳到了第二臺服務器
[root@localhost keepalived-2.0.20]# ip a
繼續通過haproxy(VIP)訪問:
[root@localhost keepalived-2.0.20]# mysql -umycat -p123456 -h 192.168.1.5 -P 48066
依然能夠訪問到服務
[root@mycat ~]# ./mycat/bin/mycat start //將第一臺mycat啓動
高可用已經部署完成
二、MyCat 安全設置
1、權限配置
1)user 標籤權限控制目前 Mycat 對於中間件的連接控制並沒有做太複雜的控制,目前只做了中間件邏輯級別的讀寫權限控制。是通過server.xml的user標籤進行配置。
#server.xml配置文件user部分
2)privileges 標籤權限控制 在 user 標籤下的 privileges 標籤可以對邏輯庫(schema)、表(table)進行精細化的DML權限控制。privileges 標籤下的check屬性,如爲 true 開啓權限檢查,爲false不開啓,默認爲 false。由於Mycat一個用戶的 schemas 屬性可配置多個邏輯庫(schema),所以 privileges 的下級節點schema節點同樣可配置多個,對多庫多表進行細粒度的 DML 權限控制.
#server.xml配置文件privileges部分
#配置orders表沒有增刪改查權限
配置說明:
DML權限增加(insert)更新(update)查詢(select)刪除(select)0000禁止禁止禁止禁止0010禁止禁止可以禁止1110可以可以可以禁止1111可以可以可以可以
2、SQL 攔截
firewall 標籤用來定義防火牆:
firewall下whitehost標籤用來定義IP白名單, blacklist用來定義SQL 黑名單。
1)白名單 可以通過設置白名單, 實現某主機某用戶可以訪問 Mycat,而其他主機用戶禁止訪問。
設置白名單
#server.xml配置文件firewall標籤
#配置只有192.168.1.4主機可以通過mycat用戶訪問
<firewall>
<whitehost>
<host host="192.168.1.4" user="mycat"/>
</whitehost>
</firewall>
2)黑名單可以通過設置黑名單,實現Mycat對具體SQL操作的攔截,如增刪改查等操作的攔截。
設置黑名單
#server.xml配置文件firewall標籤
#配置禁止mycat用戶進行刪除操作
<firewall>
<whitehost>
<host host="192.168.1.4" user="mycat"/>
</whitehost>
<blacklist check="true">
<property name="deleteAllow">false</property>
</blacklist>
</firewall>
可以設置的黑名單 SQL 攔截功能列表
配置項缺省值描述selectAllowtrue是否允許執行SELECT語句deleteAllowtrue是否允許執行DELETE語句updateAllowtrue是否允許執行UPDATE語句insertAllowtrue是否允許執行INSERT語句createTableAllowtrue是否允許創建表setAllowtrue是否允許使用SET語法alterTableAllowtrue是否允許執行Alter table語句dropTableAllowtrue是否允許修改表commitAllowtrue是否允許執行commit操作rollbackAllowtrue是否允許執行roll back操作