MyCat 高可用集羣 搭建

 如何對我們的數據層做一個高可用?我想這應該是我們實際開發中面對服務器的擴容經常會遇到,看下面這張架構圖,就是一個典型的對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集羣架構的高可用方案講解完畢

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