在之前的操作中,我們已經實現了mysql機器的高可用,可以動態切換master,那么如果mycat崩潰了呢?我們應該如何處理呢?所以此時就需要搭建mycat的高可用集群了。
在mycat的權威指南中,介紹了多種高可用的方案,在這里我們講解一種使用最多的方案,使用HAProxy+Keepalived配合使用來實現myact的高可用。
HAproxy實現了mycat多借點的集群高可用和負載均衡,而HAProxy自身的高可用則可以通過Keepalived來實現。
好了,如果這個圖大家看明白的話,下面我們開始規划集群並進行實操。
編號 | 角色 | IP地址 | 機器名 |
---|---|---|---|
1 | mycat1 | 192.168.85.111 | node01 |
2 | mycat2 | 192.168.85.112 | node02 |
3 | HAProxy(master) | 192.168.85.113 | node03 |
4 | Keepalived(master) | 192.168.85.113 | node03 |
5 | HAProxy(backup) | 192.168.85.114 | node04 |
6 | keepalived(backup) | 192.168.85.114 | node04 |
1、安裝配置HAProxy
1、准備好HAProxy的安裝包
2、解壓到/usr/local目錄
3、進入到解壓后的目錄,查看內核版本,進行編譯
cd cd /usr/local/haproxy-1.8.25/
uname -r
make TARGET=linux26
4、編譯完成之后,開始進行安裝
make install PREFIX=/usr/local/haproxy
5、安裝完成之后,創建目錄,創建HAProxy配置文件
mkdir -p /usr/data/haproxy
mkdir /usr/local/haproxy/conf
vi /usr/local/haproxy/haproxy.conf
6、向配置文件中添加配置信息
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/data/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.85.111:8066 check inter 10s
server mycat_2 192.168.85.112:8066 check inter 10s
frontend admin_stats
bind :7777
mode http
stats enable
option httplog
maxconn 10
stats refresh 30s
stats uri /admin
stats auth admin:123123
stats hide-version
stats admin if TRUE
7、啟動haproxy服務
/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf
8、查看haproxy的進程,如果存在則說明沒有問題
ps -ef | grep haproxy
9、打開瀏覽器訪問,用戶名為admin,密碼為123123
http://192.168.85.113:7777/admin
2、在node04上按照上述一樣的步驟創建HAProxy
3、安裝配置Keepalived
1、准備好Keepalived安裝包
2、解壓到/usr/local目錄
3、安裝需要依賴的環境組件
yum install gcc openssl-devel popt-devel -y
4、進入到解壓目錄,進行編譯
./configure --prefix=/usr/local/keepalived
5、編譯完成之后,進行安裝
make && make install
6、將keepalived的服務注冊為系統服務
cp /usr/local/keepalived-1.4.5/keepalived/etc/init.d/keepalived /etc/init.d/
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived-1.4.5/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
7、修改配置文件
cd etc/keepalived/
vi keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.85.200/24 dev eth0 label eth0:3:
}
}
8、啟動keepalived
service keepalived start
9、登錄驗證
mysql -uroot -p123456 -h 192.168.85.100 -P 48066
4、在node04上執行相同的操作安裝keepalived
注意,需要修改狀態為BACKUP
5、驗證高可用
先進行登錄訪問,隨便找一台機器執行
mysql -uroot -p123456 -P48066 -h192.168.85.100
然后觀察訪問的是哪一台mycat,關閉掉mycat,在進行查詢即可。
2、mycat的安全管理
1、權限配置
1、user標簽權限控制
目前mycat對於中間件的連接控制並沒有做太復雜的控制,目前只做了中間件邏輯庫級別的讀寫控制權限,可以通過user標簽進行配置。
標簽說明:
標簽屬性 | 說明 |
---|---|
name | 應用鏈接中間件邏輯庫的用戶名 |
password | 該用戶對應的密碼 |
schemas | 應用當前連接的邏輯庫中所對應的邏輯表,schemas中可以配置一個或者多個 |
readonly | 應用連接中間件邏輯庫所具有的權限。true為只讀,false為讀寫都有,默認是false |
添加配置:
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user>
嘗試通過不同的用戶名稱進行登錄,會發現root用戶具有所有的權限,但是mycat用戶只是具備了查詢的權限,無法完成更新和插入的操作。
2、privileges標簽權限控制
在user標簽下的privileges標簽可以對邏輯庫,表進行更加細致的DML權限控制。
privileges標簽下的check屬性,如果值為true則表示開啟權限檢查,false則表示不開啟權限檢查
由於mycat一個用戶的schemas屬性可以配置多個邏輯庫,所以privileges的下級節點schema節點同樣可配置多個,對多庫多表進行細粒度的DML權限控制
配置權限:
DML權限 | 增加 | 更新 | 查詢 | 刪除 |
---|---|---|---|---|
0001 | 禁止 | 禁止 | 禁止 | 允許 |
0010 | 禁止 | 禁止 | 允許 | 禁止 |
0100 | 禁止 | 允許 | 禁止 | 禁止 |
1000 | 允許 | 禁止 | 禁止 | 禁止 |
修改server.xml文件
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">TESTDB</property>
<privileges check="true">
<schema name="TESTDB" dml="1111">
<table name="orders" dml="0000"></table>
</schema>
</privileges>
</user>
大家可以進行相關的測試,當使用mycat用戶進行登錄的時候會發現其他的表都可以做增刪改查操作,但是orders表什么操作都做不了,這就是對權限作了控制。
2、SQL攔截
firewall標簽用來定義防火牆,firewall下whitehost標簽用來定義IP白名單,blacklist用來定義SQL黑名單。
1、白名單
可以通過設置白名單,實現某主機某用戶可以訪問mycat,而其他主機用戶禁止訪問。
<firewall>
<whitehost>
<host host="192.168.85.111" user="mycat"></host>
</whitehost>
</firewall>
此時發現,用戶可以在node01上使用mycat用戶進行登錄訪問,其他用戶都不可以,其他主機也不可以。
2、黑名單
用戶還可以通過設置黑名單,實現mycat對具體sql操作的攔截,如增刪改查等操作的攔截
<blacklist check="true">
<property name="deleteAllow">false</property>
</blacklist>
此時用戶登錄之后發現無法刪除表中的數據,這就是黑名單的作用。
黑名單SQL攔截功能列表:
配置項 | 默認值 | 功能 |
---|---|---|
selectAllow | true | 是否允許執行select語句 |
selectColumnAllow | true | 是否允許執行select *操作 |
selectIntoAllow | true | 是否允許select語句中包含into子句 |
deleteAllow | true | 是否允許執行delete語句 |
updateAllow | true | 是否允許執行update語句 |
insertAllow | true | 是否允許執行insert語句 |
replaceAllow | true | 是否允許執行replace語句 |
createTableAllow | true | 是否允許創建表 |
setAllow | true | 是否允許使用set語法 |
truncateAllow | true | 是否允許執行truncate語句 |
alterTableAllow | true | 是否允許執行alter table語句 |
dropTableAllow | true | 是否允許修改表 |
commitAllow | true | 是否允許執行commit操作 |
rollbackAllow | true | 是否允許執行rollback操作 |
useAllow | true | 是否允許執行use語句 |
describeAllow | true | 是否允許執行describe操作 |
showAllow | true | 是否允許執行show語句 |
3、mycat監控工具
mycat-web是mycat可視化運維管理和監控平台,彌補了mycat在監控上的空白。幫mycat分擔統計任務和配置管理任務。mycat-web引入了zookeeper作為配置中心,可以管理多個節點。mycat-web主要管理和監控mycat的流量、連接、活動現成和內存等,具備IP白名單、郵件告警等模塊,還可以統計SQL並分析慢SQL和高頻SQL等,為SQL的優化提供了依據。
1、安裝zookeeper
1、下載zookeeper安裝包
2、安裝拷貝到/usr/local目錄,並解壓
3、進入到zookeeper解壓后的目錄conf,復制配置文件並改名
cp zoo_sample.cfg zoo.cfg
4、進入到zookeeper的bin目錄,運行啟動命令
./zkServer.sh start
5、執行如下命令,看zookeeper是否正常啟動
netstat -nlpt | grep 2181
2、安裝mycat-web
1、下載mycat-web安裝包
2、解壓安裝包到/usr/local目錄
3、進入mycat-web的目錄運行啟動命令
./start.sh &
4、mycat-web的服務端口是8082,查看服務是否啟動
netstat -nlpt | grep 8082
5、通過地址訪問服務
192.168.85.111:8082/mycat/
3、mycat-web配置
1、配置zookeeper
進入到mycat-web的/usr/local/mycat-web/mycat-web/WEB-INF/classes,修改mycat.properties文件,可以修改zookeeper的地址
2、添加mycat實例
在頁面的mycat配置--》mycat服務管理中添加mycat實例,需要填寫相關的參數
4、mycat配置使用
在mycat的web監控系統中,很多參數及監控可以自己來完善,大家盡情去試就好了。
4、mycat原理
學到這里我們其實應該有感受了,mycat的操作使用並不是很難,我們只需要配置和修改server.xml.rule.xml.schema.xml三個文件即可,但是如果想在生產環境中使用的話,還是需要下一番功夫的。下面我們來簡單說一下mycat的原理。
mycat在邏輯上由幾個模塊組成:通信協議、路由解析、結果集處理、數據庫連接、監控等模塊
1、通信協議模塊
通信協議模塊承擔底層的收發數據、現成回調處理工作,主要采用Reactor、Proactor模式來提高效率。目前。mycat通信模塊默認采用Reactor模式,在協議層采用mysql協議。
2、路由解析模塊
路由解析模塊負責對傳入的SQL語句進行語法解析,解析從MYSQL協議中解析出來並進入該模塊的SQL語句的條件、語句類型、攜帶的關鍵字等,對符合要求的SQL語句進行相關優化,最后根據這些路由計算單元進行路由計算。
3、結果集處理模塊
結果集處理模塊負責對跨分片的結果進行匯聚、排序、截取等。由於數據存儲在不同的數據庫中,所以對跨分片的數據需要進行匯聚。
4、數據庫連接模塊
數據庫連接模塊復制創建、管理、維護后端的連接池。為了減少每次建立數據庫連接的開銷,數據庫使用連接池機制對連接生命周期進行管理。
5、監控管理模塊
監控管理模塊負責對Mycat中的連接、內存等資源進行等監控和管理。監控主要是通過管理命令實時地展現一些監控數據,例如連接數、緩存命中數等;管理則主要通過輪訓事件來檢測和釋放不適用的資源。
6、SQL執行模塊
SQL執行模塊負責從連接池中獲取相應的目標連接,對目標連接進行信息同步后,再根據路由解析的結果,把SQL語句分發到相應的節點執行。
總體執行流程如下:
由通信協議模塊的讀寫事件通知發起。讀寫事件通知具體的回調代碼進行這次讀寫事件的處理。管理模塊的執行流程由定時器事件進行資源檢查和資源釋放時發起。
由客戶端發送過來的數據通過協議解析、路由解析等流程進入執行組件,通過執行組件把數據發送到通信協議模塊,最終數據被寫入目標數據庫。
后端數據庫返回數據,通過協議解析后發送至回調模塊。如果是涉及多節點的數據,則執行流程將會先進入結果集匯聚、排序等模塊中,然后將處理后的數據通過通信協議模塊返回到客戶端。
通過上述圖片大家發現了,在mycat的執行流程中,AIO、NIO、多線程、內存管理等各個方面都用到了,大家如果想看mycat的源碼的話,最好能具備以上的基礎,mycat的源碼在面試過程中也幾乎不會用到,如果大家有興趣的話,可以自行學習。