在之前的操作中,我們已經實現了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的原始碼在面試過程中也幾乎不會用到,如果大家有興趣的話,可以自行學習。