LVS 모드의 지속적인 연결 및 건강 상태 검사
4071 단어 지속적인 연결건강 검진 스크립트
지속적인 연결은 일정한 환경에서 매우 유용하다. 예를 들어 SSL 회화에서 사용자와 서버가 가까스로 SSL 회화를 만들었을 때 사용자가 조심하지 않아 페이지를 새로 고쳤다. 디렉터는 사용자에게 새로운 서버를 나누어 주었고 사용자는 SSL 연결 요청을 새로 해야 하기 때문에 이것은 매우 불쾌하다!이러한 연결 방식을 영구 포트 연결(PPC)이라고 하는데, 장래에 같은 클라이언트가 같은 집단 서비스에 대한 요청으로부터 이전에 선택한 RS로 정할 것이다.
지속적인 연결은 같은 사용자의 다른 서비스 요청을 이미 연결된 서버에 연결할 수 있다. 예를 들어 사용자가 웹 서비스에 접근할 때 https 인증을 실현할 수 있다. 만약에 웹에 접근할 때 RS를 분배하고 https 인증을 통과하려면 RS를 분배한다.이렇게 하면 모순이 발생한다. 이것은 RS가 인증되어 접근을 안전하게 진행할 수 없게 한다.따라서 영구 연결은 반드시 없어서는 안 된다. 이런 것을 영구 클라이언트 연결(PCC)이라고 하는데 장래에는 같은 클라이언트가 모든 포트에 대한 요청으로부터 이전에 선택한 RS로 정한다.모든 포트를 클러스터 서비스로 정의하고 RS로 전송합니다!
영구 방화벽 표시 연결(PNMPP): 포트 간의 인척 관계를 정의하고 특정 포트를 같은 RS에 정의합니다.이것은 방화벽 내부 PREROUTING 체인을 통해 규정된 포트를 표시합니다.예를 들어 80포트는 10으로 표시되고 23포트도 10으로 표시됩니다.이렇게 하면 규칙을 작성할 때 포트를 10으로 설정하면 80과 23 포트가 같은 RS에서 응답합니다.
PPC의 실현: 각각 ipvsdam 규칙에 요청 추가
eg: 80 포트
# ipvsadm -A -t 192.168.22.12:80 -s rr
# ipvsadm -a -t 192.168.22.12:80 -r 172.16.15.1 -m
# ipvsadm -a -t 192.168.22.12:80 -r 172.16.15.2 -m
23포트
# ipvsadm -A -t 192.168.22.12:23 -s rr
# ipvsadm -a -t 192.168.22.12:23 -r 172.16.15.1 -m
# ipvsadm -a -t 192.168.22.12:23 -r 172.16.15.2 -m
PCC 구현: 모든 포트에 대한 규칙만 정의하고 시간 초과(P)
# ipvsadm -A -t 192.168.22.12:0 -s -rr -p 600
# ipvsadm -a -t 192.168.22.12:0 -r 172.16.15.1 -m
# ipvsadm -a -t 192.168.22.12:0 -r 172.16.15.2 -m
PNMPP 구현:
# iptables -t mangle -A PREROUTING -d 192.168.22.12 -i eth0 -p tcp --dport 80 -j MARK --set-make 10
# iptables -t mangle -A PREROUTING -d 192.168.22.12 -i eth0 -p tcp --dport 23 -j MARK --set-make 10
80과 23 포트를 10으로 표시하고 eth0 네트워크 카드에서 출입하도록 지정합니다
# ipvsadm -A -f 10 -s rr
# ipvsadm -a -f 10 -r 172.16.15.1 -m
# ipvsadm -a -f 10 -r 172.16.15.2 -m
LVS 건강 상태 검사
LVS모델에서director는 RS의 건강상태를 검사하는 것을 책임지지 않는다. 이로 인해 일부 RS가 고장이 났다.director는 서비스 요청을 이 서버에 파견할 수 있다. 이런 상황은 사용자, 기업에 모두 불쾌하다. 어떤 사용자가 재수 없다고 하면 비슷한 상황을 만날 수 있다.director를 더욱 인성화하고 신뢰할 수 있게 하기 위해director에게 건강검사 기능을 제공해야 한다.어떻게 실현합니까?Director에는 자체 검사 도구가 없고, director에 수동으로 스크립트를 작성해서만 건강 상태 검사 기능을 실현합니다!
#!/bin/bash
#
VIP=192.168.10.3
CPORT=80
FAIL_BACK=127.0.0.1
RS=("192.168.10.7" "192.168.10.8")
declare -a RSSTATUS
RW=("2" "1")
RPORT=80
TYPE=g
CHKLOOP=3
LOG=/var/log/ipvsmonitor.log
addrs() {
ipvsadm -a -t $VIP:$CPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq 0 ] && return 0 || return 1
}
delrs() {
ipvsadm -d -t $VIP:$CPORT -r $1:$RPORT
[ $? -eq 0 ] && return 0 || return 1
}
checkrs() {
local I=1
while [ $I -le $CHKLOOP ]; do
if curl --connect-timeout 1 http://$1 &> /dev/null; then
return 0
fi
let I++
done
return 1
}
initstatus() {
local I
local COUNT=0;
for I in ${RS[*]}; do
if ipvsadm -L -n | grep "$I:$RPORT" && > /dev/null ; then
RSSTATUS[$COUNT]=1
else
RSSTATUS[$COUNT]=0
A++
Dir[0]=$A
fi
let COUNT++
done
}
initstatus
while :; do
let COUNT=0
for I in ${RS[*]}; do
if checkrs $I; then
if [ ${RSSTATUS[$COUNT]} -eq 0 ]; then
addrs $I ${RW[$COUNT]}
[ $? -eq 0 ] && RSSTATUS[$COUNT]=1 && echo "`date +'%F %H:%M:%S'`, $I is back." >> $LOG
fi
else
if [ ${RSSTATUS[$COUNT]} -eq 1 ]; then
delrs $I
[ $? -eq 0 ] && RSSTATUS[$COUNT]=0 && echo "`date +'%F %H:%M:%S'`, $I is gone." >> $LOG
fi
fi
let COUNT++
done
sleep 5
done