如何對我們的數據層做一個高可用?我想這應該是我們實際開發中面對服務器的擴容經常會遇到,看下面這張架構圖,就是一個典型的對myCat做一個高可用的架構。至於mysql層面,我們可以做一個主從,當然需要使用專門的中間件進行管理,例如MHA的使用,這裏不是我們今天的重點。我們需要說的是Mycat高可用的架構設計
架構設計簡述:
首先我們會有兩個【MyCat】的服務節點,然後中間通過【zookeeper】同步多個【MyCat】節點的配置信息,起到一個註冊中心中間件的作用。然後我們多個【MyCat】之間的請求又該是如何做到負載均衡的呢?這個時候就需要引入【Haproxy】,【Haproxy】就是一個代理層,主要作用就是對我們的【MyCat】做一個負載均衡,並且監控所有【MyCat】節點的可用性,當有一個節點不可用,【Haproxy】便將其剔除集羣。當然爲了保證我們【Haproxy】的高可用性,上面我們還引用了【keepalived】組件,對我們的【Haproxy】集羣做一個監控,並且提供一個虛擬IP來訪問Haproxy,讓Haproxy達到高可用的一個目的。以上便是我們MyCat的一個高可用集羣設計,如何搭建?下面我們來一步步實現。
簡單看一下我們四個服務器所有配置信息
一.Zookeeper集羣搭建
1)首先需要搭建我們的Zookeeper集羣,由上圖得知需要在節點1,節點2,節點3上分別安裝zookeeper,並建立起這至少三個節點的集羣,下載zookeeper
wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
2)拷貝到其他兩臺節點上
scp zookeeper-3.4.14.tar.gz [email protected]:/root
scp zookeeper-3.4.14.tar.gz [email protected]:/root
3)三臺服務器分別解壓我們下載好的壓縮包,並移動到我們的/use/local目錄下,改名爲zookeeper
tar -zxvf zookeeper-3.4.14.tar.gz
mv zookeeper-3.4.14 /usr/local/
mv zookeeper-3.4.14/ zookeeper
4)分別進去我們的/zookeeper/conf目錄下,將zookeeper默認的配置文件名字做一個修改
cd /usr/local/zookeeper/conf
mv zoo_sample.cfg zoo.cfg
5)在zookeeper的目錄下創建一個data目錄用來存放zookeeper的數據,並給每一個節點生成一個標識
節點1(192.168.124.38)
mkdir data
echo 0 > data/myid
節點2(192.168.124.39)
mkdir data
echo 1 > data/myid
節點3(192.168.124.40)
mkdir data
echo 2 > data/myid
6)修改我們zookeeper的配置文件,做一個集羣的配置
vim zoo.cfg
#指明我們剛纔新建的data目錄地址
dataDir=/usr/local/zookeeper/data
#配置我們三個節點集羣
server.0=192.168.124.38:2888:3888
server.1=192.168.124.39:2888:3888
server.2=192.168.124.40:2888:3888
7)分別啓動我們三個節點的zookeeper
bin/zkServer.sh start
然後分別查看一下我們zookeeper是否啓動成功
bin/zkServer.sh status
至此我們的zookeeper集羣搭建完畢
二)初始化MyCat數據到Zookeeper集羣中
1)進入我們MyCat的安裝目錄
cd /usr/local/mycat/conf
2)將我們之前章節講的(垂直分庫,水平分庫,ER分片)用到的配置文件拷貝到zkconf目錄下
cp schema.xml server.xml rule.xml sequence_conf.properties zkconf/
會提示是否覆蓋,直接覆蓋
3)然後執行我們mycat安裝目錄下bin目錄下的【init_zk_data.sh】腳本
bin/init_zk_data.sh
這裏需要注意的是,可能在執行的時候會報這個錯誤
我們可以打開文件
vim init_zk_data.sh
然後【:set ff】,若結果顯示fileformat=dos
,是文件格式的問題
解決:
vim init_zk_data.sh
:set fileformat=unix
然後保存退出即可
如下圖標識初始化完成
4)登陸zookeeper客戶端,查看一下我們mycat的信息是否已經同步到zookeeper中
cd usr/local/zookeeper/
bin/zkCli.sh
查看我們的【schema】
ls /mycat/mycat-cluster-1/schema
查看我們的【dataHost】節點內容
get /mycat/mycat-cluster-1/schema/dataHost
可以看到我們的配置信息已經同步過來了
三)配置MyCat支持ZK啓動
因爲我們這裏的zookeeper是用來同步多個mycat之間的配置信息的,所以在我們的節點4上還需要安裝一臺MyCat。具體安裝過程這裏不再重複,詳細可以看【MyCat的安裝】
1)修改我們節點1中的【myid.properties】配置文件,這個文件就是啓動MyCat支持Zookeeper的一個配置文件
#是否啓用zk
loadZk=true
#zk的集羣
zkURL=192.168.124.38:2181,192.168.124.39:2181,192.168.124.39:2181
#集羣名稱
clusterId=mycat-cluster-1
#mycat節點名稱
myid=mycat_01
#mycat的節點數
clusterSize=2
#mycat配置的節點
clusterNodes=mycat_01,mycat_04
type=server
boosterDataHosts=dataHost1
同樣,我們的節點4中對應的文件也做相同的配置
loadZk=true
zkURL=192.168.124.38:2181,192.168.124.39:2181,192.168.124.39:2181
clusterId=mycat-cluster-1
myid=mycat_04
clusterSize=2
clusterNodes=mycat_01,mycat_04
type=server
boosterDataHosts=dataHost1
節點4因爲我們是新安裝的mycat,所有配置都沒有做過任何改動。但是當我們分別啓動節點1和節點4的MyCat之後,發現節點4新安裝的mycat的所有配置文件信息已經有了
證明我們的zookeeper集羣已經將mycat的所有信息進行了節點之間的同步,這一步算是完成。
四)Haproxy的安裝配置對MyCat的負載均衡支持
1)首先分別在我們的節點1和節點4安裝我們的Haproxy(根據我們的架構圖,我們是需要在兩臺機器上進行安裝的部署的,基本都一致,下面演示只演示一臺的安裝部署)
yum install haproxy -y
顯示已經安裝完畢
2)對我們的Haproxy的配置文件做一下配置
vim /etc/haproxy/haproxy.cfg
listen admin_status
bind 0.0.0.0:48800 ##VIP
stats uri /admin-status ##統計頁面
stats auth admin:admin
listen allmycat_service
bind 0.0.0.0:8096 ##轉發到mycat的應用端口,即mycat的服務端口
mode tcp
option tcplog
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
balance roundrobin
server mycat_01 192.168.124.38:8066 check port 48700 inter 5s rise 2 fall 3
server mycat_04 192.168.124.41:8066 check port 48700 inter 5s rise 2 fall 3
listen allmycat_admin
bind 0.0.0.0:8097 ##轉發到mycat的管理端口,及mycat的管理控制檯端口
mode tcp
option tcplog
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
balance roundrobin
server mycat_01 192.168.124.38:9066 check port 48700 inter 5s rise 2 fall 3
server mycat_04 192.168.124.41:9066 check port 48700 inter 5s rise 2 fall 3
3)因爲我們上面的配置用到48700端口,來對我們後端mycat做監控,所以這時候我們需要安裝另外一個服務來啓動這個端口,這個服務便是【xinetd】,就是一個網絡的守護進程的服務,可以通過它簡單的實現一個服務,並通過這個服務達到啓動端口的目的
yum install xinetd -y
3)然後到我們的相應的目錄下創建一個文件叫做【mycatchk】
cd /etc/xinetd.d
vim mycatchk
文件內容如下:
service mycatchk
{
flags = REUSE
socket_type = stream
port = 48700
wait = no
user = root
server =/usr/local/bin/mycat_status
log_on_failure += USERID
disable = no
}
4)在 /usr/local/bin 下創建一個腳本【mycat_status】
vim /usr/local/bin/mycat_status
腳本內容如下:
mycat=`/usr/local/mycat/bin/mycat status |grep 'not running'| wc -l`
if [ "$mycat" = "0" ];
then
/bin/echo -en "HTTP/1.1 200 OK\r\n"
/bin/echo -en "Content-Type: text/plain\r\n"
/bin/echo -en "Connection: close\r\n"
/bin/echo -en "Content-Length: 40\r\n"
/bin/echo -en "\r\n"
/bin/echo -en "MyCAT Cluster Node is synced.\r\n"
exit 0
else
/bin/echo -en "HTTP/1.1 503 Service Unavailable\r\n"
/bin/echo -en "Content-Type: text/plain\r\n"
/bin/echo -en "Connection: close\r\n"
/bin/echo -en "Content-Length: 44\r\n"
/bin/echo -en "\r\n"
/bin/echo -en "MyCAT Cluster Node is not synced.\r\n"
exit 1
fi
然後授權
chmod a+x /usr/local/bin/mycat_status
在當前安裝的haproxy節點下執行腳本
/usr/local/bin/mycat_status
可以看到返回成功
5)然後配置我們etc/services文件
vim /etc/services
找到最後一行配置如下:
mycatchk 48700/tcp # mycatchk
6)啓動我們的xinted服務
systemctl start xinetd.service
7)查看一下我們啓動的服務
netstat -nltp | grep 48700
啓動成功
8)綁定虛擬網卡(兩個節點只需要綁定一臺即可,這裏演示綁定節點1)
先查看一下本機的 ifconfig
所以綁定
ifconfig eno16777736:1 192.168.124.10/24
再次查看
9)啓動我們的haproxy
haproxy -f /etc/haproxy/haproxy.cfg
後臺查看一下我們的進程,啓動成功
至此我們的haproxy安裝完畢,兩個節點需要進行同樣的操作
10)先簡單校驗一下我們的安裝的haproxy是否成功。剛纔我們綁定了虛擬IP192.168.124.10,管理端口是8096.
四臺服務器我們隨意找一個節點進行登陸
mysql -uroot -p -h192.168.124.10 -P8096
登陸成功,顯示出了我們配置的邏輯庫。至此根據我們文章開頭機構描述我們兩臺Haproxy安裝完畢。
五)安裝KeepAlived
上面我們綁定了虛擬IP(192.168.124.10),只是對其中的一臺做了綁定,因爲同一時刻只會有一臺Haproxy對外提供服務。而我們安裝的Keepalived是會監控我們兩臺Haproxy,當其中一臺綁定虛擬IP的節點掛掉之後,就會立刻切換到另外一臺可用的服務上
1)安裝我們的keepalived
yum install keepalived -y
2)修改配置文件
vim /etc/keepalived/keepalived.conf
! Configuration Fileforkeepalived
vrrp_script chk_http_port {
script"/etc/keepalived/check_haproxy.sh"
interval 2
weight 2
}
vrrp_instance VI_1 {
#我們主節點配置爲MASTER,從節點就需要配置爲BACKUP
state MASTER
interface eno16777736
virtual_router_id 51
#主節點優先級高一些,從節點優先級低一些(例如100)
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
192.168.124.10 dev eno16777736 scope global
}
}
3)當前目錄創建我們上面配置文件中提到的腳本【check_haproxy.sh】
#!/bin/bash
STARTHAPROXY="/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg"
STOPKEEPALIVED="/etc/init.d/keepalived stop"
#STOPKEEPALIVED="/usr/bin/systemctl stop keepalived"
LOGFILE="/var/log/keepalived-haproxy-state.log"
echo "[check_haproxy status]" >> $LOGFILE
A=`ps -C haproxy --no-header |wc -l`
echo "[check_haproxy status]" >> $LOGFILE
date >> $LOGFILE
if [ $A -eq 0 ];then
echo $STARTHAPROXY >> $LOGFILE
$STARTHAPROXY >> $LOGFILE 2>&1
sleep 5
fi
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
exit 0
else
exit 1
fi
4)啓動keepalived
/etc/init.d/keepalived start
5)兩臺都安裝好之後,我們可以模擬故障,當其中的一臺Haproxy掛掉之後,虛擬IP是否可以轉移到我們另外一臺可用的Haproxy服務上。當我們實際停止節點1的Haproxy的時候,發現已經故障轉移,轉移到我們的節點4上,我們對外開放的mycat服務依然可以訪問,真正做到mycat的高可用
至此我們MyCat集羣架構的高可用方案講解完畢