這是去年做的一個項目的記錄,如果大家有更好的解決方案,歡迎指出。
先說說項目需求,用戶需要在兩個地市部署兩套應用系統和兩套數據庫,在一個地市主用,在另一個熱備;數據要互備;而且如果主用地市流量很大,可以分流到備用地市。
再說說用戶環境,用戶所有地市之間的通信使用MPLS VPN,兩個地市之間使用不同的網段(甲方的內網)。
應用系統的主備和負載均衡下次再說,這兒先主要講講數據庫內容。
1.選擇數據庫
現在有很多數據庫可以滿足主備和負載均衡的需求,有關系型數據庫,也有NoSQL數據庫。
我們選擇了MySQL,做項目嘛,首先考慮的是項目成本,在關系型數據庫中,能滿足需求而且成本低的也就是MySQL了。對NoSQL數據庫,我們考慮過mongodb和Hadoop,而且對這兩個數據庫都做了前期的研究評估,但因為我們的應用系統改造的成本太大,就放棄了。
采用了MySQL,那么就看使用它的什么技術了,我們需要兩個地市的數據庫都能訪問,那么主備技術不能采用;兩個地市的數據獨立完整,而且在大多數情況下使用主用地市系統,備用地市只做數據同步,不參與應用計算,不消耗網絡流量,MySQL Cluster也排除了。
最終采用了MySQL的主主備份技術,來達到數據的備份和兩個數據庫系統都可以訪問的目的。
2.選擇負載均衡技術
對MySQL的負載均衡技術,主要有HAPROXY和LVS等,由於我們的數據庫要部署在兩個不同地市的不同網段上,只有LVS的隧道模式能滿足我們的需求。
3.架構圖

4.安裝LVS
1).安裝必須文件
yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt-devel
2).建立內核軟連接
ln -s /usr/src/kernels/2.6.18-164.el5-x86_64/ /usr/src/linux
3).安裝lvs程序
modprobe -l|grep ipvs tar xvf ipvsadm-1.24.tar.gz cd ipvsadm-1.24 make make install /etc/init.d/ipvsadm save /etc/init.d/ipvsadm restart
在真實機器上的配置腳本:
#!/bin/bash # description: Config realserver lo and apply noarp SNS_VIP=192.168.1.1 /etc/rc.d/init.d/functions case "$1" in start) ifconfig tunl0 $SNS_VIP netmask 255.255.255.255 broadcast 192.168.2.255 /sbin/route add -host $SNS_VIP dev tunl0 echo "1" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore #主要是實現禁止響應對VIP的ARP請求 echo "2" >/proc/sys/net/ipv4/conf/tunl0/arp_announce echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce echo 0 > /proc/sys/net/ipv4/conf/tunl0/rp_filter echo 1 > /proc/sys/net/ipv4/conf/tunl0/forwarding echo 1 > /proc/sys/net/ipv4/ip_forwarding sysctl -p >/dev/null 2>&1 echo "RealServer Start OK" ;; stop) ifconfig tunl0 down route del $SNS_VIP >/dev/null 2>&1 echo "0" >/proc/sys/net/ipv4/conf/tunl0/arp_ignore echo "0" >/proc/sys/net/ipv4/conf/tunl0/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
5.安裝Keepalived
tar xvf keepalived-1.1.19.tar.gz cd keepalived-1.1.19 ./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-x86_64 --enable-lvs make make install cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ mkdir -p /etc/keepalived /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived /usr/local/keepalived/sbin/keepalived /usr/sbin/ chkconfig keepalived on
keepalived.conf文件內容
! Configuration File for keepalived global_defs { notification_email { ********** } notification_email_from ***** smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_MASTER } 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.2.1 } } virtual_server 192.168.2.1 3306 { delay_loop 6 lb_algo wrr lb_kind TUN nat_mask 255.255.255.0 persistence_timeout 50 protocol TCP real_server 192.168.1.1 3306 { weight 10 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } real_server 192.168.3.1 3306 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 } } }
6.安裝MySQL
MySQL數據庫的安裝我就不記錄了,主要記錄一下主主備份的配置。
1).在兩台數據庫上創建同步賬戶
grant replication slave on *.* to mysqldb1@'192.168.3.1' identified by '*****';
2).修改數據庫配置文件
[client] default-character-set=utf8 [mysqld] character-set-server=utf8 server-id=1 #mysql5.5默認有 log-bin=mysql-bin #mysql5.5默認有 binlog-ignore-db=mysql #mysql庫將不同步 auto_increment_offset=1 #是基數,兩邊不同server1設置1,server2設置2 auto_increment_increment=2 #大於等於復制集群中服務器的數量
[client] default-character-set= utf8 [mysqld] character-set-server= utf8 server-id=2 #將默認的1改為2,該值為兩邊不相同的任意數字 log-bin=mysql-bin #mysql5.5默認有 binlog-ignore-db=mysql #mysql庫將不同步 auto_increment_offset=2 #是基數,兩邊不同server1設置1,server2設置2 auto_increment_increment=2 #大於等於復制集群中服務器的數量
3).執行數據同步
show master status\G 結果: File: binlog.000007 Position: 107 Binlog_Do_DB: test Binlog_Ignore_DB: mysql 1 row in set (0.00 sec)
依據結果,執行下面的語句
change master to master_host='192.168.1.2', master_user='xxx', master_password='*******', master_log_file='binlog.000007', master_log_pos=107;
7.注意事項
1).數據庫鏈接數要依據項目調整
2).數據庫鏈接的生命周期和LVS會話管理周期的調整 ipvsadm --set 120 20 100,如果時間過短,每次外部請求都會是一個新的鏈接,超過數據庫最大鏈接數
3).在真實機器上要配置隧道接口,並且要關閉VIP的ARP請求
4).在lvs虛擬機上不手動配置隧道接口,用keepalived去自動管理,但在真實機上要手動創建(可以寫開機腳本)
5).在項目中lvs所在區域如果斷網,則負載均衡也失效了,只能手動切換至備用系統
搭建lvs,是個要十分細心的工作,很多細節要注意,就不一一說了。
