- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Keepalived+HAProxy实现MySQL高可用负载均衡的配置由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Keepalived 。
由于在生产环境使用了mysqlcluster,需要实现高可用负载均衡,这里提供了keepalived+haproxy来实现. 。
keepalived主要功能是实现真实机器的故障隔离及负载均衡器间的失败切换.可在第3,4,5层交换.它通过VRRPv2(Virtual Router Redundancy Protocol) stack实现的. 。
Layer3:Keepalived会定期向服务器群中的服务器.发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准.
Layer4:主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除.
Layer5:在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符,则Keepalived将把服务器从服务器群中剔除.
Software Design 。
keepalived启动后会有单个进程 。
1
2
3
|
8352 ? Ss 0:00 /usr/sbin/keepalived
8353 ? S 0:00 _ /usr/sbin/keepalived
8356 ? S 0:01 _ /usr/sbin/keepalived
|
父进程:内存管理,子进程管理等等 。
子进程:VRRP子进程 。
子进程:Healthchecking 子进程 实例 。
2台mysqlcluster 10.1.6.203 master 10.1.6.205 backup 。
vip 10.1.6.173 。
目的访问10.1.6.173 3366端口 分别轮询通过haproxy转发到10.1.6.203 3306 和10.1.6.205 3306 。
mysqlcluster搭建参照之前博客,这里在2台机上安装keepalived 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
root@10.1.6.203:~
# apt-get install keepalived
root@10.1.6.203:~
# 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配置包括三个类
这里使用了 VRRP实例, VRRP脚本 。
注意配置选项
stat:指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定,里如果这里设置为master,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为master 。
1
2
3
4
5
|
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
}
|
然后在实例(vrrp_instance)里面引用,有点类似脚本里面的函数引用一样:先定义,后引用函数名 。
1
2
3
|
track_script {
chk_haproxy
}
|
注意:VRRP脚本(vrrp_script)和VRRP实例(vrrp_instance)属于同一个级别 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
root@10.1.6.203: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
root@10.1.6.203: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
root@10.1.6.203: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.6.205 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
root@10.1.6.205:~
# 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(第四层)和HTTP(第七层)应用的代理软件,它也可作为负载均衡器.可以支持数以万计的并发连接.同时可以保护服务器不暴露到网络上,通过端口映射.它还自带监控服务器状态的页面. 。
安装haproxy 。
1
2
3
4
5
|
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需要对每一个mysqlcluster服务器进行健康检查 。
1.在2台主机分别配置haproxy.cfg 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
root@10.1.6.203: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
#账号密码
root@10.1.6.205:~$
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 。
1
|
root@10.1.6.203:~
# apt-get install xinetd
|
3.在每个节点添加xinetd服务脚本和mysqlchk端口号 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
root@10.1.6.203:~
# 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
}
root@10.1.6.203:~
# vim /etc/services
mysqlchk 9222
/tcp
# mysqlchk
|
4.编写mysqlchk监控服务脚本 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
root@10.1.6.203:~
# ls -l /opt/mysqlchk
-rwxr--r-- 1 nobody root 1994 2013-09-17 11:27
/opt/mysqlchk
root@10.1.6.203:~
# 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 " (if mysql is running smoothly)
# - OR -
# "HTTP/1.x 500 Internal Server Error " (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 "
echo
-e
"Content-Type: Content-Type: text/plain "
echo
-e
" "
echo
-e
"Cannot write to $I "
echo
-e
" "
exit
1
fi
fi
done
}
return_ok()
{
echo
-e
"HTTP/1.1 200 OK "
echo
-e
"Content-Type: text/html "
echo
-e
"Content-Length: 43 "
echo
-e
" "
echo
-e
"<html><body>MySQL is running.</body></html> "
echo
-e
" "
rm
$ERR_FILE $TMP_FILE
exit
0
}
return_fail()
{
echo
-e
"HTTP/1.1 503 Service Unavailable "
echo
-e
"Content-Type: text/html "
echo
-e
"Content-Length: 42 "
echo
-e
" "
echo
-e
"<html><body>MySQL is *down*.</body></html> "
sed
-e
's/ $/ /'
$ERR_FILE
echo
-e
" "
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 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
root@10.1.6.203:~
# 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
root@10.1.6.203:~
# 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
root@10.1.6.203:~
# netstat -tunlp | grep xine
tcp 0 0 10.1.6.203:9222 0.0.0.0:* LISTEN 30897
/xinetd
root@10.1.6.203:~
# ps -ef | grep haproxy
root 1042 1 0 Sep17 ? 00:00:00
/usr/local/sbin/haproxy
-f
/etc/haproxy/haproxy
.cfg
|
测试
通过vip10.1.6.173 3366访问cluster数据库(注意账户dave权限需要加3个ip10.1.6.203,10.1.6.205,10.1.6.173) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
root@10.1.6.203: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,数据库挂掉.vip10.1.6.173会自动漂到10.1.6.205从上,并不影响vip的访问 。
通过vip,haproxy查看各节点状态 。
http://10.1.6.173:8888/status 。
最后此篇关于Keepalived+HAProxy实现MySQL高可用负载均衡的配置的文章就讲到这里了,如果你想了解更多关于Keepalived+HAProxy实现MySQL高可用负载均衡的配置的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
四、Keepalived 【1】、keepalived运行原理 Keepalived检测每个服务器接节点状态 服务器节点异常或出现工作故障,keepalived将故障节点从集群系统中
根据(详细)主题,与使用 Keepalived 相比有什么优势吗? & HAProxy作为 HA 网络服务器 loadbalancer vs 一个纯粹的keepalived解决方案? 最佳答案 Kee
我有两台linux服务器, 每个服务器都有两个 NIC,模式 1 绑定(bind)“bond0”。 我的用户级应用程序 - keepalived 在该绑定(bind)接口(interface)上运行
编译安装 HAProxy 新版 LTS 版本,编译安装 Keepalived 开启HAProxy多线程,线程数与CPU核心数保持一致,并绑定CPU核心 因业务较多避免配
keepalived + nginx 实现高可用 本篇主要介绍一下 keepalived + nginx 来实现 对于nginx的高可用, 还是简单的主备模式 。 1.概述
Keepalived 由于在生产环境使用了mysqlcluster,需要实现高可用负载均衡,这里提供了keepalived+haproxy来实现.  
1.keepalived介绍 keepalived最初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了实现高可用的VRRP功能。keepalived除
我正在尝试为我的服务实现基于 keepalived 的故障转移。请在下面找到我的主节点和备份节点的配置。 主节点: vrrp_script chk_splunkd { script "pido
我有 2 个应用服务器都配置为运行 php cron 作业,但只有 1 个可以随时运行该作业。由于我已经将keepalived用于其他目的,我正在考虑在cron作业中使用一些逻辑来检查节点是否具有虚拟
我正在尝试使用 keepalived 配置两个事件负载均衡器服务器。 它与标准配置略有不同,我们有两台服务器和一个虚拟 IP。 我想要的只是当 loadbalancer_1 出现故障时,loadbal
前言:为了减少三维数据中心可视化管理系统的停工时间,保持其服务的高度可用性。同时部署多套同样的三维可视化系统,让三维数据中心可视化系统同时部署并运行到多个服务器上。同时提供一个虚拟IP,然后外面通过
前言 为解决单点故障,我们需要配置主从热备方案,服务器数量有限,故使用Docker模拟安装配置。 本次配置默认已经安装了Docker。 配置环境:centos7 64位 docker版本:D
本文介绍了nginx+keepalived 高可用主从配置详解,分享给大家,具体如下: 1、系统环境及软件版本 CentOS 6.6 x64 keepalived-1.2.18.tar.gz
nginx是一款非常优秀的反向代理工具,支持请求分发,负载均衡,以及缓存等等非常实用的功能。在请求处理上,nginx采用的是epoll模型,这是一种基于事件监听的模型,因而其具备非常高效的请求处理效
为什么要做高可用 在生产环境中,kubernetes 集群中会多多个 master 节点,每个 master 节点上都会部署 kube-apiserver 服务,实现高可用。但是 client 访问
我有 2 个带有 keepalived 和 haproxy 服务的节点(CentOS7)。 如果我关闭一个节点一切正常。但是如果 haproxy 出现故障,我想对 VIPS 进行故障转移。 这是第一个
我有下一个场景,4 个运行 Red Hat Enterprise Linux 7 的虚拟机: 20.1.67.230 服务器(虚拟 IP)(不是主机) 20.1.67.219 haproxy1(负载均
我有 2 台运行 keepalived 的服务器,IP 配置如下: 服务器 1: eth0 172.31.48.10 服务器 2: eth0 192.168.1.5 eth0:1 172.31.48.
keepalived 有什么办法只有当 2 个接口(interface)宕机时才进入故障/备份状态? 在文档中,我发现如果一个或多个接口(interface)出现故障,track_interface
我一直致力于一个项目,该项目将建立一组高可用性负载平衡器。负载平衡和高可用性软件似乎工作得很好(我正在使用 Crossroads 进行负载平衡,使用 Keepalived 使负载平衡服务器具有高可用性
我是一名优秀的程序员,十分优秀!