2013/03/21

Published 3月 21, 2013 by

Load Balance - HAProxy Setup + keepalived 實現web服務的高可用和負載均衡

1.HAProxy Description


HAProxy 是一套快速以及靈活的load balance套件,透過haproxy可以快速達到server分流、判斷存活、連線數量等功能。當流量達到一定的程度後load balance是一大重點,如何讓各server平均去負擔流量是相當重要的,透過haproxy可以簡單快速的達成load balance

架構說明:



2. HAProxy架設


0.環境

OS:RCHE 5.7
Haproxy: 1.4.15
VIP:10.55.79.25
HAProxy Server1:10.55.79.153(Master)
HAProxy Server2:10.55.79.154(Slave)

Web Server1:10.55.78.178
Web Server2:10.55.78.179


1.增加使用者及平台設定

#useradd -r haproxy

#vi /etc/sysctl.conf
net.ipv4.ip_nonlocal_bind=1
#sysctl –p

2.download haproxy


經測試:
haproxy-1.4.15.tar.gz & keepalived- 1.2.2 .tar.gz 可運作
haproxy-1.4.24.tar.gz & keepalived-1.2.8.tar.gz 可運作

3.install

cd /tmp

tar -zxvf  haproxy- 1.4.15 .tar.gz

cd  haproxy- 1.4.15

make TARGET=linux26 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy



4. setup config

#vi /usr/local/haproxy/haproxy.cfg

global
       #log 127.0.0.1 local0 ###全局日志,搭配syslog server
        maxconn 4096
        uid haproxy
        gid haproxy
        daemon ##背景執行
        nbproc 1 ##process運行數,可設定多個process提高效能

defaults

        #log 127.0.0.1 local3 ###全局日志,搭配syslog server
        maxconn         32768 #最大進線數
        clitimeout      60000   
        srvtimeout      60000
        contimeout      5000 #連接超時60s , 單位是ms
        retries         3                 ##3次連接失敗就認為服務不可用
         option         httplog        #日志類別http日志格式 
        option          forwardfor  ##如果後端服務器需要獲得客戶端真實ip需要配置的參數,可以從Http Header中獲得客戶端ip
        option          httpclose     #連線完後關閉http通道
        option          redispatch  ##serverId對應的服務器掛掉後,強制定向到其他健康的服務器   
        option          dontlognull   ##不記錄健康檢查的日志信息
        option          abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的連接

listen  http_proxy
        bind *:80 #監聽端口 
        mode    http #http7層模式 
#balance source ##默認的負載均衡的方式,類似nginx的ip_hash,可以固定session 
#balance leastconn                 #默認的負載均衡的方式,最小連接
        balance roundrobin  #默認的負載均衡的方式,輪詢方式
    log 127.0.0.1 local3 err   #[err warning info debug]  
        option forwardfor
         option httpchk HEAD /index.html HTTP/1.0 ###健康檢查頁面
        #appsession PHPSESSID len 128 timeout 1h request-learn
        server  www1 10.55.78.178:80 check weight 1 inter 2000 rise 2 fall 3
        server  www2 10.55.78.179:80 check weight 1 inter 2000 rise 2 fall 3
#服務器定義,check inter 2000是檢測心跳頻率rise 3是3次正確認為服務器可用, 
#fall 3是3次失敗認为服務器不可用,weight代表權重 
       #errorfile 403 /etc/haproxy/errorfiles/403.http
       #errorfile 500 /etc/haproxy/errorfiles/500.http
      #errorfile 502 /etc/haproxy/errorfiles/502.http

listen status_auth 10.55.79.153:81 #管理介面
        stats enable
        mode http
        stats uri  /admin-status #管理地址
        stats auth  admin:123456 #管理帐号:管理密码
        stats admin if TRUE

listen status_auth 10.55.79.25:81 #VIP管理介面
        stats enable
        mode http
        stats uri  /admin-status #管理地址
        stats auth  admin:123456 #管理帐号:管理密码
        stats admin if TRUE


5.Startup/Stop Service

Startup:

Method1(背景執行):

#/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg



Method2(偵錯模式):

/usr/local/haproxy/sbin/haproxy -d -f /usr/local/haproxy/haproxy.cfg



Stop:

#killall -9 haproxy



3. Syslog Setting


#vi /etc/syslog.conf添加:


local3.*        /var/log/haproxy.log
local0.*        /var/log/haproxy.log



#vi /etc/sysconfig/syslog修改


SYSLOGD_OPTIONS="-r -m 0"
#/etc/init.d/syslog restart



4. haproxy壓力測試


 
先進管理畫面,再確認最後狀態



 


# for i in $(seq 100);do curl http://10.55.79.153:80;done









5. Keepalive Setting



1.Download

# wget http://keepalived.org/software/keepalived- 1.2.2 .tar.gz

 PS.keepalived-1.2.9.tar.gz 會有Bug


2.Install

# tar zxf keepalived- 1.2.2 .tar.gz 
cd keepalived- 1.2.2

# ./configure

# make

# make install

# cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/

# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

# mkdir /etc/keepalived

# cp /usr/local/sbin/keepalived /usr/sbin/



3.Setting

# vi /etc/keepalived/keepalived.conf



! Configuration File for keepalived



global_defs {
   notification_email {
     shinchuan.huang@innolux.com
   }

   notification_email_from shinchuan.huang@innolux.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL

}



vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight 2
}



vrrp_instance VI_1 {
    state MASTER #另一台為BACKUP

    interface eth0
    virtual_router_id 51

    priority 100 #另一台為99

    advert_int 1
    garp_master_delay 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        10.55.79.25
    }

    track_script {
        chk_haproxy
    }

    track_interface {
       eth0
    }
}


virtual_server 10.55.79.25 80 {
    delay_loop 6 #(每隔10秒查詢realserver狀態) 
    lb_algo rr #(lvs 算法) 
    lb_kind DR #(Direct Route) 
#    nat_mask 255.255.255.0
    persistence_timeout 50 #(同一IP的連接50秒內被分配到同一台realserver) 
    protocol TCP  #(TCP協議檢查realserver狀態) 

   real_server 10.55.79.153 80 {
        weight 1   #(權重) 
        TCP_CHECK {
        connect_timeout 10  #(10秒無響應超時) 
        nb_get_retry 3
        delay_before_retry 3
         }
   }

  real_server 10.55.79.154 80 {
        weight 1

        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}



4.Start Service

#  service keepalived start



使用Ping的方式來做測試,並搭配arp –a的方式,來查看目前是跑在那一台主機上面


7. 開機啟動Script


[root@C5THAP1 haproxy]# vi /etc/rc.d/init.d/haproxy
#! /bin/sh
set -e

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/haproxy/sbin
PROGDIR=/usr/local/haproxy
PROGNAME=haproxy
DAEMON=$PROGDIR/sbin/$PROGNAME
CONFIG=$PROGDIR/$PROGNAME.cfg
PIDFILE=$PROGDIR/run/$PROGNAME.pid
DESC="HAProxy daemon"
SCRIPTNAME=/etc/init.d/$PROGNAME

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

start()
{
        echo -n "Starting $DESC: $PROGNAME"
        $DAEMON -f $CONFIG
        echo "."
}

stop()
{
        echo -n "Stopping $DESC: $PROGNAME"
#        haproxy_pid=cat $PIDFILE
#        kill $haproxy_pid
        killall -9 haproxy
        echo "."
}

restart()
{
        echo -n "Stopping $DESC: $PROGNAME.."
        killall -9 haproxy
        echo "."
        $DAEMON -f $CONFIG
        echo -n "Starting $DESC: $PROGNAME.."
        echo "."

}
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
        exit 1
        ;;
esac
exit 0





8. Reference


一、
以上的設定在Real Server上看到的ip是帶HAProxy Server的ip,若要在Real Server 上看到實際連進來Client IP,需要Redhat 6.0以上,詳細資訊詳見以下的說明:
1.http://www.pigo.idv.tw/archives/989 -->中文
2.http://blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/ -->英文


二、Haproxy 安裝手記,版本升級並追加 log 機制



三、基于Keepalived+Haproxy搭建四层负载均衡器[原创


四、官方網頁



五、參數設定說明

http://blog.longwin.com.tw/2009/03/haproxy-ha-load-balance-2009/
http://rritw.com/a/bianchengyuyan/PHP/20130301/314828.html

六、附Haproxy演算法:


一、roundrobin,表示簡單的輪詢;二、static-rr,表示根據權重;三、leastconn,表示最少連接者先處理;四、source,表示根據請求源IP;五、uri,表示根據請求的URI;六、url_param,表示根據請求的URl參數’balance url_param’ requires an URL parameter name七、hdr(name),表示根據HTTP請求頭來鎖定每一次HTTP請求;八、rdp-cookie(name),表示根據據cookie(name)來鎖定並哈希每一次TCP請求。
常用算法:roundrobinsourcelestconn

七、測試發現可以多個vip結合不同的Port來做group,但不可以做多個ip,相同的Port來做goup。



Read More

2012/11/02

Published 11月 02, 2012 by

RedHat iscsi initiator Setting

iSCSI initiator configuration in RedHat Enterprise Linux 5(linux認得到Netapp iscsi)



安裝initiator程式

[root@C5CLUSTER2 cluster]# yum install iscsi-initiator-utils



查看本機的iqn-可以看到本機的iqnà加入到netappInitiator Group,讓netapp認的到

[root@C5CLUSTER2 cluster]# cat /etc/iscsi/initiatorname.iscsi

InitiatorName=iqn.1994-05.com.redhat:2551bf29b48



加入target iscsi的連線

[root@C5TCluster1 ~]# iscsiadm -m discovery -t sendtargets -p 10.55.78.63



秀出目前的連線

[root@C5CLUSTER2 iscsi]# iscsiadm -m node

10.55.78.77:3260,2000 iqn.1992-08.com.netapp:sn.142241218

10.55.78.63:3260,2000 iqn.1992-08.com.netapp:sn.142241218



重新啟動iscsi

[root@C5CLUSTER2 iscsi]# service iscsi restart



可以看到Netapp iscsiPartition在裡面

[root@C5CLUSTER2 iscsi]# fdisk –l

Disk /dev/sda: 1073 MB, 1073741824 bytes

34 heads, 61 sectors/track, 1011 cylinders

Units = cylinders of 2074 * 512 = 1061888 bytes

Disk /dev/sda doesn't contain a valid partition table



iscsi重新整理之後,較敏感的ap會自動重開機(如Oracle asm)
A:手動新增disk之後,不重開機的狀況下可看到新disk(兩台都要做)
[root@C5TASM2 ~]# echo "- - -" >/sys/class/scsi_host/host0/scan







參考資料:鳥哥 iscsi 安裝


Read More

2012/10/29

Published 10月 29, 2012 by with 0 comment

Redhat 5.4 Cluster 架設教學


Cluster 架設教學:


資料來源:鳥哥的教學網站http://linux.vbird.org/somepaper/20090402-hpc-mysql-rhcs.pdf


 


環境:Redhat 5.4VM Server測試


 


相關流程:


一、建置及規劃要做的事項


二、安裝Clustering套件(Default沒有安裝,要輸入License才能裝)


三、使用”system-config-cluster”來建置Cluster


四、一一加入Cluster Node


五、建置Fence Device,並在Cluster NodeFence Device加入


六、新增Failover Domain


七、新增Cluster Resources


八、新增Cluster Service


九、部署cluster.conf到每一台Cluster node


十、啟動Services


 


 


----------------------------------


在這上面的文章我就不再copy一份了,補充上面沒有寫到的資料:


 


1、啟動Debug Log,找尋錯誤的時候非常好用:


 


一、編輯/etc/cluster/cluster.conf,更新版本,如本來是3,更新後為4


Edit /etc/cluster/cluster.conf to add debug information. Update the cluster_version number as well. Here is an example (most of the /etc/cluster/cluster.conf is removed for readablity):


 <cluster config_version="3" name="vip_cluster">


      <rm log_level="7" log_facility="local4">
       ----


        </rm>


</cluster>


 



二、把這一個檔案Copy到所有的Cluster的主機上


#scp /etc/cluster/cluster.conf root@10.55.79.22:/etc/cluster/cluster.conf


 


三、更新Cluster version


# ccs_tool update /etc/cluster/cluster.conf


 


四、把log_level=7 & local4的這一些message放到/etc/syslog.conf做接收,設定完之後重新啟動syslog


 


#echo "local4.* /var/log/cluster.log.$(hostname)" >> /etc/syslog.conf


#touch /var/log/cluster.log.$(hostname)"


#service syslog restart


 


2Cluster啟動與關閉


Cluster啟動


若要在節點上啟用叢集軟體,請照此順序輸入下列指令(注意一下啟了那一些Service)


service cman start


service clvmd start,若使用了 CLVM 來建立叢集卷冊


service gfs2 start,若您所使用的是 Red Hat GFS2


service rgmanager start,若您正在使用 high-availabilityHA)服務(  rgmanager)。


 


Cluster關閉


若要在節點上停止叢集軟體,請照此順序輸入下列指令:


service rgmanager stop,若您正在使用 high-availabilityHA)服務(  rgmanager)。


service gfs2 stop,若您所使用的是 Red Hat GFS2


umount -at gfs2,若您正在搭配使用 Red Hat GFS2   rgmanager,請確保任何在  rgmanager 啟用時掛載(而並未在關閉時卸載)的 GFS2 檔案亦被卸載。


service clvmd stop,若使用了 CLVM 來建立叢集卷冊


service cman stop


 


3、切換注意事項


Cluster切換會掉三個封包


 


4、常用指令


#clusvcadm –r –m ## relcate service to another node


# ip addr list                                                             ###Check ip status


#clustat                                                                  ###Check Clustat status


#clusvcadm -R                                 ## Restart a group in place


 


 


相關資源:


https://access.redhat.com/knowledge/docs/zh-TW/Red_Hat_Enterprise_Linux/6/html/Cluster_Administration/ch-mgmt-cli-CA.html


https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/5/pdf/Cluster_Administration/Red_Hat_Enterprise_Linux-5-Cluster_Administration-en-US.pdf


http://linux.vbird.org/somepaper/20090402-hpc-mysql-rhcs.pdf


Read More

2012/09/12

Published 9月 12, 2012 by with 0 comment

Linux 遠端桌面(XRDP)

遠端桌面(RDP)相對於 VNC 的好處應該是:


1.      連線的過程中有加密


2.      可設定登入時的解析度


3.      方便切換輸入法


4.      操作起來似乎比 VNC 還流暢


現在遠端桌面可不再是 Windows 的專利,在 Linux 上要做到遠端桌面的存取,如果純粹只要有 Viewer 的功能可安裝rdesktop,如果要同時有 Viewer Server 的功能請安裝xrdp,以下介紹 xrdp


其實 xrdp 是一個 Linux 遠端桌面的中繼程式,為何說 xrdp 中繼程式?!因為它還是借用了 VNC 的模組 (libvnc.so),並且 xrdp 除了可以讓你用遠端桌面連線存取 Linux 桌面之外,還能透過它來登入其它 Windows 的遠端桌面、VNC Server,以及任何也有安裝 xrdp 的主機。並且是允許你用不同帳號進行多重登入,這在 Windows 的系統只有 Windows Server 才支援。


所以說,安裝了 xrdp 等於是安裝了:


1.      RDP Server (允許多重登入)


2.      RDP Viewer


3.      XRDP Viewer


4.      VNC Viewer


 


安裝 xrdp


1. 安裝 xrdp 前請先確定系統已經安裝了 gcc, pam-devel, openssl-devel,可使用下列指令安裝:


yum install gcc pam-devel openssl-devel


2.  http://xrdp.sf.net 下載 xrdp 的原始檔並安裝:


cd /usr/local/src


wget http://jaist.dl.sourceforge.net/sourceforge/xrdp/xrdp- 0.4.1 .tar.gz


tar -xzvf xrdp- 0.4.1 .tar.gz


cd xrdp- 0.4.1


make


make install


3. 編輯 /etc/rc.d/rc.local,加入:


/usr/local/xrdp/xrdp_control.sh start


PS.若使用rpm安裝,xrdp_control.sh此檔案會找不到…


 


啟動 xrdp


啟動 xrdp 指令:


/usr/local/xrdp/xrdp_control.sh start


 


xrdp 的設定檔


相關設定檔放在 “/etc/xrdp/”,比較重要的是 “/etc/xrdp/sesman.ini” 這個檔案,在 [Globals] 中的這一行:


ListenAddress=127.0.0.1


表示只允許從本機連結 RDP Server,如果要從別的主機進行操作 (配合登入 xrdp “sesman-any” 選項),可將 “127.0.0.1″ 改成 “ 0.0.0 .0″


登入 xrdp


啟動 xrdp 之後,你的 Linux 主機基本上已經具備了接受遠端桌面連線的功能,其 Port 3389,請用 Windows 遠端桌面連線進行存取。





連線後,首先會看到 xrdp 的登入視窗,你可以選擇:


1.      sesman-Xvnc: 使用 xrdp 內建的 libvnc.so 模組登入本機,本機不需啟動 VNC Server


2.      console: 登入本機的 VNC Server


3.      vnc-any: 登入其它已經啟動 VNC Server 的主機。


4.      sesman-any:登入其它有安裝 xrdp 的主機。


5.      rpd-any: 登入其它已經啟動遠端桌面 (RDP Server) Windows 電腦或主機。


6.      sesman-X11rdp: 這個項目我沒有測試成功,從字面上的意思來看,應該是連結本機端由 X Server 提供的 RDP,但目前 Linux 的桌面應該還沒有具備這樣的功能!


 


桌面環境


“sesman-Xvnc” 選項登入 Linux 桌面後,預設是使用 KDE 桌面,但其操作介面是英文的,這些設定都與 “/usr/local/xrdp/startwm.sh” 這個指令檔有關。


如果要改成中文環境,請編輯 /usr/local/xrdp/startwm.sh,在程式的第二行加入:


export LANG=zh_TW.UTF-8


這樣就可以了。


 


參考資料:http://punz.pixnet.net/blog/post/24772651


Read More

2012/08/20

Published 8月 20, 2012 by with 0 comment

Find Oracle sid and Linux pid

Oracle sid and Linux pid
Sometimes we found Oracle process that has been running too long using top command on Linux. We know it has PID. But how to know the SID of the process?
Here is the script:



select
substr(a.spid,1,9) pid,
substr(b.sid,1,5) sid,
substr(b.serial#,1,5) ser#,
substr(b.machine,1,6) box,
substr(b.username,1,10) username,
substr(b.osuser,1,8) os_user,
substr(b.program,1,30) program
from
v$session b,
v$process a
where
b.paddr = a.addr
and type='USER'
order by spid;


 


Reference:http://orafin.blogspot.tw/2010/07/oracle-sid-and-linux-pid.html


Read More