Keepalived+HAProxy 는 MySQL 의 높 은 부하 균형 설정 을 실현 합 니 다.
생산 환경 에서 my sql luster 를 사 용 했 기 때문에 높 은 부하 균형 을 실현 해 야 합 니 다.keepalived+haproxy 를 제공 합 니 다.
keepalived 의 주요 기능 은 실제 기계 의 고장 격 리 및 부하 이퀄 라이저 간 의 실패 전환 을 실현 하 는 것 입 니 다.3,4,5 층 에서 교환 할 수 있 습 니 다.VRRPv 2(Virtual Router Redundancy Protocol)stack 을 통 해 이 루어 집 니 다.
Layer 3:Keepalived 는 서버 그룹 에 있 는 서버 에 정기 적 으로 보 냅 니 다.ICMP 패 킷(우리 가 평소에 사용 하 는 Ping 프로그램)을 보 냅 니 다.만약 에 특정한 서비스의 IP 주소 가 활성화 되 지 않 은 것 을 발견 하면 Keepalived 는 이 서버 가 효력 을 잃 었 다 고 보고 하고 서버 그룹 에서 제거 합 니 다.이런 상황 의 전형 적 인 예 는 한 서버 가 불법 으로 꺼 진 것 입 니 다.Layer 3 방식 은 서버 의 IP 주소 가 서버 작업 의 정상 여 부 를 기준 으로 하 는 것 입 니 다.
Layer 4:주로 TCP 포트 의 상태 로 서버 작업 의 정상 여 부 를 결정 합 니 다.웹 서버 의 서비스 포트 는 일반적으로 80 입 니 다.Keepalived 가 80 포트 가 시작 되 지 않 은 것 을 감지 하면 Keepalived 는 이 서버 를 서버 그룹 에서 제거 합 니 다.
Layer 5:네트워크 에서 차지 하 는 대역 폭 도 좀 커 야 합 니 다.Keepalived 는 사용자 설정 에 따라 서버 프로그램 이 제대로 작 동 하 는 지 확인 하고 사용자 설정 과 일치 하지 않 으 면 Keepalived 는 서버 그룹 에서 서버 를 제거 합 니 다.
Software Design
keepalived 가 시작 되면 하나의 프로 세 스 가 있 습 니 다.
8352 ? Ss 0:00 /usr/sbin/keepalived
8353 ? S 0:00 \_ /usr/sbin/keepalived
8356 ? S 0:01 \_ /usr/sbin/keepalived
부모 프로 세 스:메모리 관리,하위 프로 세 스 관리 등하위 프로 세 스:VRRP 하위 프로 세 스
하위 프로 세 스:Healthchecking 하위 프로 세 스
실례
mysql luster 2 대 10.1.6203 master 10.1.6.205 backup
vip 10.1.6.173
목적 방문 10.1.6173 3366 포트 는 각각 haproxy 를 통 해 10.16.203 3306 과 10.16.205 3306 으로 전달 되 었 다.
my sql luster 는 이전 블 로 그 를 참조 하여 2 대의 컴퓨터 에 keepalived 를 설치 합 니 다.
[email protected]:~# apt-get install keepalived
[email protected]:~# cat /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy {
script "killall -0 haproxy" # verify the pid existance
interval 2 # check every 2 seconds
weight -2 # add 2 points of prio if OK
}
vrrp_instance VI_1 {
interface eth1 # interface to monitor
state MASTER
virtual_router_id 51 # Assign one ID for this route
priority 101 # 101 on master, 100 on backup
nopreempt
debug
virtual_ipaddress {
10.1.6.173
}
track_script { #
chk_haproxy
}
notify_master /etc/keepalived/scripts/start_haproxy.sh # master ,
notify_fault /etc/keepalived/scripts/stop_keepalived.sh #
notify_stop /etc/keepalived/scripts/stop_haproxy.sh #keepalived notify_stop }
VRRPD 설정 은 세 가지 종 류 를 포함 합 니 다.설정 옵션 주의:
stat:intance(Initial)의 초기 상 태 를 지정 합 니 다.설정 한 후에 이 서버 의 초기 상 태 는 여기 서 지정 한 것 입 니 다.그러나 여기 서 지정 한 것 은 아 닙 니 다.경선 을 통 해 우선 순 위 를 확인 해 야 합 니 다.여기 서 master 로 설정 되 어 있 지만 그의 우선 순위 가 다른 것 보다 못 하면 이 채널 은 통 보 를 보 낼 때 자신의 우선 순 위 를 보 냅 니 다.다른 한 대 는 우선 순위 가 자신의 것 보다 높 지 않다 는 것 을 발견 하면 그 는 다시 master 로 선점 할 것 이다.
vrrp_script chk_haproxy {
script "killall -0 haproxy" # verify the pid existance
interval 2 # check every 2 seconds
weight -2 # add 2 points of prio if OK :2 +2;-2 -2
}
그리고 인 스 턴 스(vrrpinstance)에서 인용 합 니 다.스 크 립 트 의 함수 참조 와 비슷 합 니 다.먼저 정의 한 다음 함수 이름 을 참조 합 니 다.
track_script {
chk_haproxy
}
메모:VRRP 스 크 립 트(vrrpscript)와 VRRP 인 스 턴 스(vrrpinstance)같은 단계 에 속 함
[email protected]:scripts# cat start_haproxy.sh
#!/bin/bash
sleep 5
get=`ip addr |grep 10.1.6.173 |wc -l`
echo $get >> /etc/keepalived/scripts/start_ha.log
if [ $get -eq 1 ]
then
echo "`date +%c` success to get vip" >> /etc/keepalived/scripts/start_ha.log
/usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg
else
echo "`date +%c` can not get vip" >> /etc/keepalived/scripts/start_ha.log
fi
[email protected]:scripts# cat stop_keepalived.sh
#!/bin/bash
pid=`pidof keepalived`
if [ $pid == "" ]
then
echo "`date +%c` no keepalived process id" >> /etc/keepalived/scripts/stop_keep.log
else
echo "`date +%c` will stop keepalived " >> /etc/keepalived/scripts/stop_keep.log
/etc/init.d/keepalived stop
fi
/etc/init.d/keepalived stop
[email protected]:scripts# cat stop_haproxy.sh
#!/bin/bash
pid=`pidof haproxy`
echo "`date +%c` stop haproxy" >> /etc/keepalived/scripts/stop_ha.log
kill -9 $pid
동 리 배치 10.1.6205
[email protected]:~# cat /etc/keepalived/keepalived.conf
vrrp_script chk_haproxy {
script "killall -0 haproxy" # verify the pid existance
interval 2 # check every 2 seconds
weight 2 # add 2 points of prio if OK
}
vrrp_instance VI_1 {
interface eth1 # interface to monitor
state BACKUP
virtual_router_id 51 # Assign one ID for this route
priority 100 # 101 on master, 100 on backup
virtual_ipaddress {
10.1.6.173
}
track_script {
chk_haproxy
}
notify_master /etc/keepalived/scripts/start_haproxy.sh
notify_fault /etc/keepalived/scripts/stop_keepalived.sh
notify_stop /etc/keepalived/scripts/stop_haproxy.sh
}
HAProxy다음은 Haproxy 를 소개 하 겠 습 니 다.
HAProxy 는 TCP(4 층)와 HTTP(7 층)를 기반 으로 하 는 프 록 시 입 니 다.부하 이퀄 라이저 로 도 사용 할 수 있 습 니 다.수만 개의 병렬 연결 을 지원 할 수 있 습 니 다.또한 서버 가 네트워크 에 노출 되 지 않도록 보호 하고 포트 를 통 해 매 핑 할 수 있 습 니 다.서버 상 태 를 자체 적 으로 감시 하 는 페이지 도 있 습 니 다.
haproxy 설치
wget -O/tmp/haproxy-1.4.22.tar.gz http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.22.tar.gz
tar xvfz /tmp/haproxy-1.4.22.tar.gz -C /tmp/
cd /tmp/haproxy-1.4.22
make TARGET=linux26
make install
haproxy 는 모든 my sql luster 서버 에 대해 건강 검 사 를 해 야 합 니 다.1.호스트 2 대 에 각각 haproxy.cfg 설정
[email protected]:scripts# cat /etc/haproxy/haproxy.cfg
global
maxconn 51200 #
#uid 99
#gid 99
daemon # haproxy
#quiet
nbproc 1 # ( )
pidfile /etc/haproxy/haproxy.pid #haproxy pid ,
defaults
mode tcp # (#7 http;4 tcp )
option redispatch #serverId ,
option abortonclose # ,
timeout connect 5000s #
timeout client 50000s #
timeout server 50000s #
log 127.0.0.1 local0 #
balance roundrobin # ,
listen proxy
bind 10.1.6.173:3366 #
mode tcp #http 7
option httpchk #
server db1 10.1.6.203:3306 weight 1 check port 9222 inter 12000 rise 3 fall 3 # ,check inter 12000 rise 3 3 , fall 3 3 ,weight
server db2 10.1.6.205:3306 weight 1 check port 9222 inter 12000 rise 3 fall 3
listen haproxy_stats
mode http
bind 10.1.6.173:8888
option httplog
stats refresh 5s
stats uri /status # URL, HAProxy , 200, 503
stats realm Haproxy Manager
stats auth admin:p@a1SZs24 #
[email protected]:~$ cat /etc/haproxy/haproxy.cfg
global
maxconn 51200
#uid 99
#gid 99
daemon
#quiet
nbproc 1
pidfile /etc/haproxy/haproxy.pid
defaults
mode tcp
option redispatch
option abortonclose
timeout connect 5000s
timeout client 50000s
timeout server 50000s
log 127.0.0.1 local0
balance roundrobin
listen proxy
bind 10.1.6.173:3366
mode tcp
option httpchk
server db1 10.1.6.203:3306 weight 1 check port 9222 inter 12000 rise 3 fall 3
server db2 10.1.6.205:3306 weight 1 check port 9222 inter 12000 rise 3 fall 3
listen haproxy_stats
mode http
bind 10.1.6.173:8888
option httplog
stats refresh 5s
stats uri /status
stats realm Haproxy Manager
stats auth admin:p@a1SZs24
2.xinetd 설치
[email protected]:~# apt-get install xinetd
3.노드 마다 xinetd 서비스 스 크 립 트 와 my sqlchk 포트 번 호 를 추가 합 니 다.
[email protected]:~# vim /etc/xinetd.d/mysqlchk
# default: on
# description: mysqlchk
service mysqlchk # servive
{
flags = REUSE
socket_type = stream
port = 9222
wait = no
user = nobody
server = /opt/mysqlchk
log_on_failure += USERID
disable = no
per_source = UNLIMITED
bind = 10.1.6.173
}
[email protected]:~# vim /etc/services
mysqlchk 9222/tcp # mysqlchk
4.mysqlchk 모니터링 서비스 스 크 립 트 작성
[email protected]:~# ls -l /opt/mysqlchk
-rwxr--r-- 1 nobody root 1994 2013-09-17 11:27 /opt/mysqlchk
[email protected]:~# cat /opt/mysqlchk
#!/bin/bash
#
# This script checks if a mysql server is healthy running on localhost. It will
# return:
# "HTTP/1.x 200 OK\r" (if mysql is running smoothly)
# - OR -
# "HTTP/1.x 500 Internal Server Error\r" (else)
#
# The purpose of this script is make haproxy capable of monitoring mysql properly
#
MYSQL_HOST="localhost"
MYSQL_SOCKET="/var/run/mysqld/mysqld.sock"
MYSQL_USERNAME="mysqlchkusr" # mysql
MYSQL_PASSWORD="secret"
MYSQL_OPTS="-N -q -A"
TMP_FILE="/dev/shm/mysqlchk.$$.out"
ERR_FILE="/dev/shm/mysqlchk.$$.err"
FORCE_FAIL="/dev/shm/proxyoff"
MYSQL_BIN="/opt/mysqlcluster/mysql-cluster-gpl-7.2.6-linux2.6-x86_64/bin/mysql"
CHECK_QUERY="select 1"
preflight_check()
{
for I in "$TMP_FILE" "$ERR_FILE"; do
if [ -f "$I" ]; then
if [ ! -w $I ]; then
echo -e "HTTP/1.1 503 Service Unavailable\r
"
echo -e "Content-Type: Content-Type: text/plain\r
"
echo -e "\r
"
echo -e "Cannot write to $I\r
"
echo -e "\r
"
exit 1
fi
fi
done
}
return_ok()
{
echo -e "HTTP/1.1 200 OK\r
"
echo -e "Content-Type: text/html\r
"
echo -e "Content-Length: 43\r
"
echo -e "\r
"
echo -e "<html><body>MySQL is running.</body></html>\r
"
echo -e "\r
"
rm $ERR_FILE $TMP_FILE
exit 0
}
return_fail()
{
echo -e "HTTP/1.1 503 Service Unavailable\r
"
echo -e "Content-Type: text/html\r
"
echo -e "Content-Length: 42\r
"
echo -e "\r
"
echo -e "<html><body>MySQL is *down*.</body></html>\r
"
sed -e 's/
$/\r
/' $ERR_FILE
echo -e "\r
"
rm $ERR_FILE $TMP_FILE
exit 1
}
preflight_check
if [ -f "$FORCE_FAIL" ]; then
echo "$FORCE_FAIL found" > $ERR_FILE
return_fail;
fi
$MYSQL_BIN $MYSQL_OPTS --host=$MYSQL_HOST --socket=$MYSQL_SOCKET --user=$MYSQL_USERNAME --password=$MYSQL_PASSWORD -e "$CHECK_QUERY" > $TMP_FILE 2> $ERR_FILE
if [ $? -ne 0 ]; then
return_fail;
fi
return_ok;
테스트2 개 노드 keepalived 오픈(메 인 노드 는 VIP 획득,haproxy 자동 당 김),xinetd
[email protected]:~# ip add
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
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
link/ether 00:26:b9:36:0f:81 brd ff:ff:ff:ff:ff:ff
inet 211.151.105.186/26 brd 211.151.105.191 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:26:b9:36:0f:83 brd ff:ff:ff:ff:ff:ff
inet 10.1.6.203/24 brd 10.1.6.255 scope global eth1
inet 10.1.6.173/32 scope global eth1
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:26:b9:36:0f:85 brd ff:ff:ff:ff:ff:ff
5: eth3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:26:b9:36:0f:87 brd ff:ff:ff:ff:ff:ff
[email protected]:~# netstat -tunlp | grep ha
tcp 0 0 10.1.6.173:3366 0.0.0.0:* LISTEN 1042/haproxy
tcp 0 0 10.1.6.203:8888 0.0.0.0:* LISTEN 1042/haproxy
udp 0 0 0.0.0.0:56562 0.0.0.0:* 1042/haproxy
[email protected]:~# netstat -tunlp | grep xine
tcp 0 0 10.1.6.203:9222 0.0.0.0:* LISTEN 30897/xinetd
[email protected]:~# ps -ef | grep haproxy
root 1042 1 0 Sep17 ? 00:00:00 /usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg
테스트:vip 10.1.6173 3366 을 통 해 cluster 데이터 베 이 스 를 방문 합 니 다(계 정 dave 권한 에 ip 10.1.6203,10.16.205,10.1.6173 을 추가 해 야 합 니 다)
[email protected]:mgm# mysql -udave -p -h 10.1.6.173 -P 3366
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1344316
Server version: 5.5.22-ndb-7.2.6-gpl-log MySQL Cluster Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dave |
| test |
+--------------------+
3 rows in set (0.01 sec)
mysql>
keepalive,haproxy,데이터 베 이 스 를 수 동 으로 끊 습 니 다.vip 10.1.6173 은 자동 으로 10.16.205 로 떠 내 려 가 VIP 의 방문 에 영향 을 주지 않 습 니 다.vip,haproxy 를 통 해 각 노드 상 태 를 확인 합 니 다.
http://10.1.6.173:8888/status
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash를 사용할 때 몰랐던 SQL을 쓰는 법을 배웠습니다.최근 redash에서 sql을 쓸 기회가 많고, 이런 쓰는 방법이 있었는지와 sql에 대해 공부를 다시하고 있기 때문에 배운 것을 여기에 씁니다. Redash란? 월별로 데이터를 표시하고 싶습니다 주별로 데이터를 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.