參考鏈接:
http://www.osyunwei.com/archives/7464.html
ps:以上為本次操作的主要參考資料,非常感謝此文作者的貢獻,我的隨筆的主要目的是
說明在使用以上資料參考部署的過程中,遇到的一些問題以及補充。
1、解決web讀寫分離功能缺陷,實現數據庫從庫負載均衡與高可用
2、簡化web與主要功能模塊的配置,使用vip接管
操作系統:redhat6.4 64位 #目前主流的版本應該在6.4以上,主要是硬件要求
DB版本:mysql5.6 #這個沒什麼可說的,選擇版本主要看應用需求
lvs主機:192.168.1.180 #部署lvs+keepalived,用於管理VIP,並分發數據庫讀寫請求
從庫IP:192.168.20.182、192.168.20.183 #mysql_slave 一主兩從
測試機:192.168.20.181 #用於測試整套架構的功能
VIP:192.168.20.253 #虛擬IP,用於請求的分發
rpm -ivh
MySQL-server-5.6.16-1.el6.x86_64.rpm
MySQL-devel-5.6.16-1.el6.x86_64.rpm
MySQL-shared-5.6.16-1.el6.x86_64.rpm
MySQL-client-5.6.16-1.el6.x86_64.rpm
MySQL-shared-compat-5.6.16-1.el6.x86_64.rpm
mysql5.6的安全性有所提高,安裝完成後會有如下提示:
You will find that password in '/root/.mysql_secret'
cat /root/.mysql_secret
# The random password set for the root user at Mon Aug 31 08:28:44 2015 (local time): 06tIwUud
通過密碼進入mysql之後:通過:SET PASSWORD = password('xxxxxx'); 重置密碼即可。 其他跟正常的mysql安裝相同。
恩......不是我偷懶,主要是網上這塊的內容太多了,一抓一大把,沒有什麼可寫的價值,之後如果有興趣可能單開一個隨筆,這就不寫了。
大家隨意的搜一下。
由於我的生產環境有單獨的思科防火牆,所以我所有的服務器的系統防火牆都是關閉的,包括selinux,不然太麻煩。
有些莫名其妙的報錯可能都是iptable和selinux引起的,為了方便一般默認關閉
1、關閉selinux:
修改/etc/selinux/config文件中的SELINUX="" 為 disabled ,然後重啟。
如果不想重啟系統,使用命令setenforce 0
2、關閉iptables:
service iptables stop chkconfig iptables off下載keeplived:http://www.keepalived.org/download.html
cd /usr/local/src
wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
ps:由於安裝時間的不同,我新的生產環境是centos6.5 而測試環境是redhat6.4,並且我的生產之前一直都是redhat系列,一直使用的都是手動rpm以及編譯安裝,雖然很苦逼,但是著實鍛煉動手能力以及一些說不清道不明的對系統的理解能力,並且yum本身並不是非常的安全,沒有手動安裝那麼放心(俺的感受),我的建議是如果非用不可的話,安裝可以用yum,但是卸載需要手動,這是我的底線。
tar -zxvf keepalived-1.2.19.tar.gz
cd keepalived-1.2.19
./configure #配置,必須看到以下提示,說明配置正確,才能繼續安裝
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
Use VRRP Framework : Yes
make #編輯
make install #安裝
cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived
cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/sbin/keepalived /usr/sbin/
cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
chmod +x /etc/rc.d/init.d/keepalived #添加執行權限
chkconfig keepalived on #設置開機啟動
service keepalived start #啟動
service keepalived stop #關閉
service keepalived restart #重啟
ps:以上直接輔助的原作者的命令,主要是沒什麼可寫的,按照命令操作即可。
ps2:參考資料在這會安裝perl的相關環境,因為他的從庫狀態監測腳本需要用到,但是我並沒有在這添加,主要考慮到如下的情況
1、我有單獨的數據庫從庫狀態監測告警腳本(見上兩篇原創隨筆)
2、keeplived本身有對3306端口的檢測,如果數據庫出現異常可以發現並處理。
3、我希望即便從庫同步出現問題,也能夠繼續提供服務,因為線上環境需要的是服務暢通,短暫不同步的代價我是能夠接受的。
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-bak
>/etc/keepalived/keepalived.conf #清空配置文件
vi /etc/keepalived/keepalived.conf #以下內容直接全部粘貼即可
====================================== ! Configuration File for keepalived global_defs { router_id LVS_DEVEL } 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.20.253 } } virtual_server 192.168.20.253 3306 { delay_loop 6 lb_algo wlc lb_kind DR #persistence_timeout 120 protocol TCP real_server 192.168.20.182 3306 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } real_server 192.168.20.183 3306 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } } ============================================== #wp #保存退出 注:最好在使用以上內容前,復制到編輯器,檢查括號是否齊全與匹配,這很重要。
#編輯增加如下代碼:
vi /etc/rc.d/init.d/realserver ================================================== #!/bin/sh # chkconfig: - 80 90 # description:realserver # mysql_vip start realserver mysql_vip=192.168.20.253 . /etc/rc.d/init.d/functions case "$1" in start) ifconfig lo:0 $mysql_vip netmask 255.255.255.255 broadcast $mysql_vip /sbin/route add -host $mysql_vip dev lo:0 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig lo:0 down route del $mysql_vip >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce echo "RealServer Stoped" ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0 ==========================================================chmod +x /etc/rc.d/init.d/realserver #添加腳本執行權限
chkconfig realserver on #添加開機啟動
/etc/rc.d/init.d/realserver start #開啟,參數stop為關閉
service keepalived start #啟動keepalived
ipvsadm -Ln #檢查lvs運行狀態
/etc/rc.d/init.d/realserver start
VIP已經綁定到lo:0
20.182:執行service mysql stop
在20.180(LVS主機)上執行
ipvsadm -Ln #檢查lvs運行狀態
可以看到20.182服務器已經被去掉。同理再次啟動之後此服務器會被再次加入服務。
4、VIP數據庫功能測試
在測試服務器(1.181)上執行數據庫連接命令
mysql -uroot -pXXXXXX -h192.168.20.253
或者使用telnet 192.168.20.253 3306 命令去嘗試連接,如果提示輸入密碼,說明連接正常。
FAQ:
1、能夠ping通,但是telnet不通,不知道是為什麼?
答:網上看到很多人,包括我自己,都遇到了這個問題,VIP能夠ping通,但是telnet以及mysql連接命令不通,怎麼著也找不到問題。
這個問題困擾了我很長時間,中間試驗停止了兩個月,因為實在找不到原因,但是後來實在是啼笑皆非,原因竟然是:沒有使用測試機,
我所有的測試命令都是在LVS主機上執行的,而LVS主機上綁定了VIP,並且沒有mysql服務,肯定能ping通,但是在沒有轉發請求的
情況下,肯定服務不通。
2、原資料中的一些命令的困擾?
答:比如ipvsadm -L 在我的服務器上是不顯示具體IP的,只顯示localhost,一度讓我以為服務不通跟這個有聯系,但實際上執行ipvsadm -Ln就ok了。
3、數據庫從庫狀態檢測腳本是否使用?
答:我覺得這個應該根據具體的業務系統的需求去考慮,我的系統要求的是能夠持續提供服務,對數據一致性的要求沒有那麼高,所以我只需要對同步狀態進行
告警,並保證能及時處理即可,並不需要停止服務這麼嚴苛。另外腳本使用perl或者shell實際上應該沒有什麼不同。
ok!整個方案就這樣了,中間省略了一些步驟,比如數據庫主從服務的搭建,LVS高可用的搭建,這兩個服務我在很久之前就搭建了無數次,實在是懶得再寫,並且這種單獨的服務在網上已經有了無數個攻略,寫的價值不是很大,大家各種研究下吧。
另外水平有限,如果有所遺漏和錯誤請大家指出,我及時修改,如果有更完善的方案,大家能分享就更好了。