運行環境node
服務器兩臺(後面的全部配置案例都是以10.96.0.64和10.96.0.66爲例)mysql
操做系統CentOS release 6.2linux
必需要有共同的局域網網段sql
兩臺服務器都要安裝keepalived(雙機熱備)和eql服務apache
軟件部署bash
keepalived 部分服務器
keepalived是一個用於作雙機熱備(HA)的軟件,常和haproxy聯合起來作熱備+負載均衡,達到高可用。負載均衡
keepalived經過選舉(看服務器設置的權重)挑選出一臺熱備服務器作MASTER機器,MASTER機器會被分配到一個指定的虛擬ip,外部程序可經過該ip訪問這臺服務器,若是這臺服務器出現故障(斷網,重啓,或者本機器上的keepalived crash等),keepalived會從其餘的備份機器上重選(仍是看服務器設置的權重)一臺機器作MASTER並分配一樣的虛擬IP,充當前一臺MASTER的角色。socket
服務器兩臺,兩臺機器要通局域網,虛擬IP會被設置在他們共有的局域網內oop
10.96.0.64 CentOS release 6.2
10.96.0.66 CentOS release 6.2
安裝popt庫
sudo yum install popt-devel.x86_64
下載軟件包
wget http://www.keepalived.org/software/keepalived-1.2.2.tar.gz
解壓安裝
tar -zxvf keepalived-1.2.2.tar.gz cd keepalived-1.2.2 ./configure --prefix=/usr/local/keepalived make make install
下面這幾步不是必須的,可是爲了方便之後的操做建議作了
sudo cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ sudo cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ sudo cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
爲keepalived建立配置文件存放路徑
sudo mkdir -p /etc/keepalived/
打開配置文件
sudo emacs /etc/keepalived/keepalived.conf
下面是服務器上的配置文件,兩臺服務器的配置選項徹底同樣,可是配置的值按在本機的具體狀況,配置項在下面會解釋
global_defs { notification_email { baifanmvp@163.com } notification_email_from baifanmvp@163.com smtp_server 127.0.0.1 stmp_connect_timeout 30 router_id lnmp_node1 } vrrp_instance lnmp { state MASTER interface eth0 virtual_router_id 51 mcast_src_ip 10.96.0.64 priority 200 advert_int 1 track_interface { eth0 } authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 10.96.0.103/16 dev eth0 scope global } }
配置好了就能夠直接啓動了
sudo /etc/init.d/keepalived restart
啓動好之後能夠用 ip a 命令看虛擬IP的綁定狀況,個人配置是192.168.1.135上的權重高,因此VIP綁定到135上面
(ape0!1120)~/eql_core(10.96.0.64)ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:16:3e:7e:a9:d5 brd ff:ff:ff:ff:ff:ff inet 10.96.0.64/16 brd 10.96.255.255 scope global eth0 inet 10.96.0.103/16 scope global secondary eth0 inet6 fe80::216:3eff:fe7e:a9d5/64 scope link valid_lft forever preferred_lft forever (ape0!1121)~/eql_core(10.96.0.64)
這時候就能夠用10.96.0.103這個IP訪問10.96.0.64這臺機器了
出現的問題記錄:
1. 在配好主從備份以後,發現虛擬IP能ping通,可是訪問虛擬IP對應機器上的服務(不是apache或者mysql之類的公用軟件)卻不成功,這是由於要訪問的服務綁定了主機上的一個實體IP不是INADDR_ANY地址,因此鏈接不上。
2.記得設置防火牆和關閉selinux策略
關閉selinux
vi /etc/sysconfig/selinux 修改: SELINUX=disabled #setenforce 0
3.注意配置文件裏的advert_int選項,這個是兩臺機器相互檢測的時間間隔,若是想在一臺機器宕機以後VIP能很快的跳轉到另一臺機器,請把這個值設置小一點。
4.有時候可能會出現設置都正確,可是虛擬ip依舊訪問不了的狀況,這時候請讓機房人員爲這個ip設置路由。
===============================================================================
eql部分
eql的下載和安裝請看eql和egg的安裝文檔,這裏就不重複了,eql高可用部署方案必須下載目前的trunk版本。
在eql和egg安裝成功後,請進入eql的根目錄下的rep目錄 裏面有三個文件
eql_master.sh
eql_slave.sh
eqld_alive.sh
===================================================================
eql_master.sh用於啓動master機器上的全部服務
下面例子和相關注釋
有的選項值要根據實際狀況來設置,請看各選項的解釋
#!/bin/bash #啓動master機器上的eqld和eqlRepd服務 if [ "$1" = "start" ] then
# --socket=/tmp/eql.socket 是本地socket文件路徑,這個能夠不用作改動 # --binlogdir=/ape/eql/eqllog/ 是eql的log日誌路徑,這個能夠不用作改動,可是路徑必須存在 # --ip=0.0.0.0 服務是綁定機器全部的IP,這個也不用改動 # --port=30001 服務綁定的端口號,這個按照實際狀況設置 nohup eqld --socket=/tmp/eql.socket --binlogdir=/ape/eql/eqllog/ --ip=0.0.0.0 --port=30001 & # --repnet 10.96.0.64:20000 eqlRepd服務綁定的ip和端口號,這個按照實際狀況設置 # --binlog /ape/eql/eqllog/ 是eql的log日誌路徑,這個能夠不用作改動,可是路徑必須存在 # --members 10.96.0.66:20000 另外那臺機器eqlRepd服務的ip和端口,也就是說若是本機是master這裏填slave的,若是本機是slave這裏填master的 # --eqldnet 10.96.0.64:30001 本機鏈接的eqld的ip和端口號 nohup eqlRepd --repnet 10.96.0.64:20000 --binlog /ape/eql/eqllog/ --members 10.96.0.66:20000 --eqldnet 10.96.0.64:30001 & #中止master機器上的eqld和eqlRepd服務 elif [ "$1" = "stop" ] then pkill eqld pkill eqlRepd #重啓master機器上的eqld和eqlRepd服務 elif [ "$1" = "restart" ] then pkill eqld pkill eqlRepd nohup eqld --socket=/tmp/eql.socket --binlogdir=/ape/eql/eqllog/ --ip=0.0.0.0 --port=30001 & nohup eqlRepd --repnet 10.96.0.64:20000 --binlog /ape/eql/eqllog/ --members 10.96.0.66:20000 --eqldnet 10.96.0.64:30001 & fi
===================================================================
eql_slave.sh用於啓動slave機器上的全部服務
slave機器上的eqld分爲2個,一個是給外部訪問的,這個的端口要和master上的eqld保持同樣,而且僅可讀不可修改和添加操做。另一個是用來接受master傳過來的同步日誌操做,這個是可讀可寫模式。至於eqlRep和master介紹的同樣
下面例子和相關注釋
有的選項值要根據實際狀況來設置,請看各選項的解釋
#!/bin/bash if [ "$1" = "start" ] then # --readonly 啓動只讀模式 # --socket=/tmp/eql_r.socket 是本地socket文件路徑,這個能夠不用作改動 # --binlogdir=/ape/eql/eqllog/ 是eql的log日誌路徑,這個能夠不用作改動,可是路徑必須存在 # --ip=0.0.0.0 服務是綁定機器全部的IP,這個也不用改動 # --port=30002 服務綁定的端口號,這個按照實際狀況設置 nohup eqld --readonly --socket=/tmp/eql_r.socket --binlogdir=/ape/eql/eqllog/ --ip=0.0.0.0 --port=30001 & # --socket=/tmp/eql.socket 是本地socket文件路徑,這個能夠不用作改動 # --binlogdir=/ape/eql/eqllog/ 是eql的log日誌路徑,這個能夠不用作改動,可是路徑必須存在 # --ip=0.0.0.0 服務是綁定機器全部的IP,這個也不用改動 # --port=30002 服務綁定的端口號,這個按照實際狀況設置 nohup eqld --socket=/tmp/eql.socket --binlogdir=/ape/eql/eqllog/ --ip=0.0.0.0 --port=30002 & # --repnet 10.96.0.66:20000 eqlRepd服務綁定的ip和端口號,這個按照實際狀況設置 # --binlog /ape/eql/eqllog/ 是eql的log日誌路徑,這個能夠不用作改動,可是路徑必須存在 # --members 10.96.0.64:20000 另外那臺機器eqlRepd服務的ip和端口,也就是說若是本機是master這裏填slave的,若是本機是slave這裏填master的 # --eqldnet 10.96.0.66:30002 本機鏈接的eqld的ip和端口號,slave機器上填擁有可寫可讀權限的那個eqld nohup eqlRepd --repnet 10.96.0.66:20000 --binlog /ape/eql/eqllog/ --members 10.96.0.64:20000 --eqldnet 10.96.0.66:30002 & elif [ "$1" = "stop" ] then pkill eqld pkill eqlRepd elif [ "$1" = "restart" ] then pkill eqld pkill eqlRepd nohup eqld --readonly --socket=/tmp/eql.socket --binlogdir=/ape/eql/eqllog/ --ip=0.0.0.0 --port=30001 & nohup eqld --socket=/tmp/eql.socket --binlogdir=/ape/eql/eqllog/ --ip=0.0.0.0 --port=30002 & nohup eqlRepd --repnet 10.96.0.66:20000 --binlog /ape/eql/eqllog/ --members 10.96.0.64:20000 --eqldnet 10.96.0.66:30002 & fi
===================================================================
eqld_alive.sh用來監控服務器上的eqld是否存活,若是不存在了就關閉keepalived讓虛擬IP切換
下面是例子內容
while true
do
process_cnt=`ps -ef|grep "eqld --socket=/tmp/eql.socket --binlogdir=/ape/eql/eqllog/ --ip=0.0.0.0 --port=30001"|wc -l`
if [ 2 != "$process_cnt" ];then
/etc/init.d/keepalived stop
fi
sleep 5
done
===================================================================
啓動步驟
1.在兩臺機器上分別啓動eqld_alive.sh腳本
2.在master機器上啓動eql_master.sh腳本,在slave機器啓動eql_master.sh腳本
3 分別啓動兩臺機器的keepalived