资源描述
LVS高可用web负载均衡群集
Linux
(适用操作系统:CentOS5)
————————————————————————
完成人员:
李凯翔
完成日期:
2011-06-25
Qq;
17501444
Linuxtone ID:
SharkShow
Google talk:
Net.SharkShow@
————————————————————————
黑色 加粗字体为命令.淡蓝 加粗是显示内容 红色 是注释
一. 实验要求
Lvs+heartbeat+ldirectory高可用性负载均衡.
LVS的调度分配软件 = (ipvsadm)
LVS的双机热备软件 = (heartbeat状态监控 ; 平滑冗余)
LVS 的高可用性 = (heartbeat-ldirectord容错机制高可用)
二. 实验拓扑
三. 系统环境
操作系统:CentOs 5.5 (关闭selinux及iptables)
相关软件:lvsaadm 、heartbeat 、heartbeat-ldirectord、net-snmp、lm_sensors、perl模块
网络要求:所有服务器位于同一VLan,机器无特殊要求。
四. 地址规划
名称
角色
IP地址
LVS_A
活动调度器
VIP: 192.168.1.88/24
Eth0: 192.168.1.30/24
Eth1: 8.8.8.1/24
LVS_B
备份调度器
Eth0: 192.168.1.40/24
Eth1: 8.8.8.2/24
WEB_A
内容服务器
Eth0: 192.168.1.10
WEB_B
内容服务器
Eth0: 192.168.1.20
五. 安装软件
1. 更新yum源(将yum源替换成中国科大的yum源或mirrors的源)
# cd /etc/yum.repos.d'
# 进入yum源目录
# mv CentOS-Base.repo{,.bak}
# 修改默认网络源的名字使其不生效
# wget http://docs.linuxtone.org/soft/lemp/CentOs-Base.repo
# 下载中科大源
# wget
# 下载mirrors-163源
# wget
# 下载mirrors-sohu源
注意:三个源任选一个就好.我是使用163的
2. Yum安装ipvsadm / heartbeat / net-snmp
###############Yum#############
# yum install ipvsadm # 安装LVS
# yum install heartbeat* # 安装heartbeat时会自动解决依赖关系
# yum install net-snmp # 安装net-snmp
3. 安装heartbeat
yum安装heartbeat会出现这个错误:
不用理他,在用yum安装一次 就处理好了
以下列出heartbeat所依赖的包名如果使用rpm方式安装可以参考|红色|是安装包|绿色|是依赖
在两台机器上都完成heartbeat的安装后进行查看
4. 两台机器查看heartbeat是否安装全
# rpm -qa | grep "heartbeat" # 查看安装包是否完整
5.网络配置
# Vim /etc/hosts #vi编辑本地解析文件
Cat >>/etc/hosts <<SHOW
>192.168.1.30 LVS_A #添加LVS_A的解析
>192.168.1.40 LVS_B #添加LVS_B的解析
>SHOW
/etc/hosts 内容如下图
实验过程中为了避免重启直接使用hostname命令修改主机名(立即生效,重启无效)
# hostname LVS_A
# hostname LVS_B
#使用scp将文件传给LVS_B(简化操作).以下LVS脚本和WEB脚本都可使用scp。
一. 配置LVS
1. 配置LVS_A.sh
# Vim LVS_A.sh #调度器LVS_A的
#!/bin/bash
VIP=192.168.1.88
WEB_A=192.168.1.10
WEB_B=192.168.1.20
LVS_A=192.168.1.30
LVS_B=192.168.1.40
case "$1" in
start)
/sbin/ifconfig eth0 LVS_A
/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:0
ipvsadm -A -t $VIP:80 -s rr #-A添加一个virtual服务器 -t TCP协议 -s算法 rr
ipvsadm -a -t $VIP:80 -r $WEB_A:80 -g #-g (DR模式) -i (TUN模式) -m (NAT模式)
ipvsadm -a -t $VIP:80 -r $WEB_B:80 -g
ipvsadm-save > /etc/sysconfig/ipvsadm #保存设置命令.下次可以使用Service直接调用
echo "ipvsadm is start ok ..........................."
;;
stop)
/sbin/ipvsadm -C #清空ipvsadm群集设置
/sbin/route del $VIP #删除VIP路由
echo "ipvsadm is stop now ok ..........."
;;
*)
echo "Usage : $0 {start | stop}"
esac
----------------------------------------------------------------------------------------------------------
# chmod +x LVS_A.sh #添加可执行权限
2. 配置LVS_B.sh
# Vim LVS_B.sh #调度器LVS_B的
#!/bin/bash
VIP=192.168.1.88
WEB_A=192.168.1.10
WEB_B=192.168.1.20
LVS_A=192.168.1.30
LVS_B=192.168.1.40
case "$1" in
start)
/sbin/ifconfig eth0 LVS_B
/sbin/ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev eth0:0
ipvsadm -A -t $VIP:80 -s rr #-A添加一个virtual服务器 -t TCP协议 -s算法 rr
ipvsadm -a -t $VIP:80 -r $WEB_A:80 -g #-g (DR模式) -i (TUN模式) -m (NAT模式)
ipvsadm -a -t $VIP:80 -r $WEB_B:80 -g
ipvsadm-save > /etc/sysconfig/ipvsadm #保存设置命令.下次可以使用Service直接调用
echo "ipvsadm is start ok ..........................."
;;
stop)
/sbin/ipvsadm -C #清空ipvsadm群集设置
/sbin/route del $VIP #删除VIP路由
echo "ipvsadm is stop now ok ..........."
;;
*)
echo "Usage : $0 {start | stop}"
esac
----------------------------------------------------------------------------------------------------------
# chmod +x LVS_B.sh #添加可执行权限
3. WEB_A 服务内容脚本
# Vim WEB_A.sh
#!/bin/bash
VIP=192.168.1.88
WEB_A=192.168.1.10
WEB_B=192.168.1.20
case "$1" in
start)
/sbin/ifconfig eth0 $WEB_A # eth0
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up #虚拟.VIP
/sbin/route add -host $VIP dev lo:0 # VIP主机路由
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce #不响应arp请求
echo "WEB's LVS is start ok ........"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "WEB's LVS is stop ok ........."
;;
*)
echo "Usage : $0 {start | stop}"
;;
Esac
# chmod +x WEB_A.sh
4. WEB_B 负载服务脚本
# vim WEB_B.sh
#!/bin/bash
VIP=192.168.1.88
WEB_A=192.168.1.10
WEB_B=192.168.1.20
case "$1" in
start)
/sbin/ifconfig eth0 $WEB_B #eth0
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up #虚拟IP
/sbin/route add -host $VIP dev lo:0 #VIP主机路由
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce #不响应arp请求
echo "WEB's LVS is start ok ........"
;;
stop)
/sbin/ifconfig lo:0 down
/sbin/route del $VIP
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
echo "WEB's LVS is stop ok ........."
;;
*)
echo "Usage : $0 {start | stop}"
;;
esac
# chmod +x WEB_B.sh #为脚本添加可执行权限
5. 查看测试LVS
Lvs状态查看
查看LVS的连接情况: ipvsadm -L –n
查看LVS的吞吐量情况 ipvsadm -L -n –rate
查看LVS的统计信息: ipvsadm -L -n –stat
查看LVS的连接状态变化: watch ipvsadm ?ln.
# ipvsadm –Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.1.88:80 rr
-> 192.168.1.20:80 Route 1 0 0
-> 192.168.1.10:80 Route 1 0 0
二. 配置ldirectord
1.# vim /etc/ha.d/ldirectord.cf
# cp /usr/share/doc/heartbeat-ldirectord-2.1.3/ldirectord.cf /etc/ha.d/
如果要通过ldirectord监控节点状态;
只需启动ldirectord,整个集群系统就可以运行起来,而无需执行上面配置的LVS_A脚本;
因为ldirectord配置文件决定.会自动调用ipvsadm创建LVS路由表.
配置选项含义如下
# vim ldirectord.cf
checktimeout=3 #判定real server出错的时间间隔。
checkinterval=1 #指定ldirectord在两次检查之间的间隔时间。
fallback=127.0.0.1:80 #当所有的real server节点不能工作时,web服务重定向的地址(本机:80)。
autoreload=yes #是否自动重载配置文件,选yes时,配置文件发生变化,自动载入配置信息。
quiescent=yes
#当选择no时,如果一个节点在checktimeout设置的时间周期内没有响应,ldirectord将会从LVS的路由表中直接移除real server,此时,将中断现有的客户端连接,并使LVS丢掉所有的连接跟踪记录和持续连接模板,如果选择为yes,当某个real server失效时,ldirectord将失效节点的权值设置为0,新的连接将不能到达,但是并不从LVS路由表中清除此节点,同时,连接跟踪记录和程序连接模板仍然保留在Director上
virtual=192.168.1.88:80
real=192.168.1.10:80 gate
#指定虚拟的IP地址和端口号,注意,在virtual行后面的行必
须缩进4个空格或以一个tab字符进行标记。
real=192.168.1.20:80 gate
#指定Real Server服务器地址和端口,同时设定LVS工作模式.
#用gate表示DR模式,ipip表示TUNL模式,masq表示NAT模式。
fallback=127.0.0.1:80 gate
service=http
#指定服务的类型,这里是对http服务做负载均衡。
request="index.html"
#ldirectord将根据指定的Real Server地址,结合该选项给出
的请求路径,发送访问请求,检查Real Server上的服务是否正常运行,确保这里给出的页面地
址是可访问的,不然ldirectord会误认为此节点已经失效,发生错误监控现象。
receive="Test Page"
#指定请求和应答字串。
scheduler=rr
#指定调度算法,这里是rr(轮叫)算法。于上面呼应
protocol=tcp
#指定协议的类型,LVS支持TCP和UDP协议。
checktype=negotiate
#指定Ldirectord的检测类型,默认为negotiate。
checkport=80
#指定监控的端口号。
virtualhost=SharkS
#虚拟服务器的名称,随便指定。
三. 配置heartbeat
(主要就是配置三个文件:ha.cf 、haresources和authkeys)
1. # vim /etc/ha.d/ha.cf
# vim /etc/ha.d/ha.cf
配置选项如下
debugfile /var/log/ha-debug #指定heartbeat调试日志文件存放的位置
logfile /var/log/ha-log #指定heartbeat运行系统日志存放的位置
logfacility local0 #日志记录等级
keepalive 2 #指定多久检测一次心跳heartbeat 本实验2秒
warntime 5 #连续多长时间联系不上开始警告提示 本实验5秒
deadtime 30 #等待声明主机死机的时间.30秒内没有心跳信号.切换服务
initdead #指定heartbeat首次启动时deadtime应该为多久.预留忽略时间
#bcast bond0 #只有两台机器的时候可以使用广播.本实验使用此方法
udpport 694 #使用upd 694检测心跳服务
#baud 19200 #串口通讯的波特率,本实验环境不需要,注释掉
#serial /dev/ttyS0 #主从如果是串口链接,需将此注释取消
#ucast eth1 8.8.8.2 #这里指定LVS_B的地址.在LVS_B上配置时需要改成LVS_A地址
auto_failback on #恢复正常后是否需要切换回来
node LVS_A #指定heartbeat使用那些主机.主机名于uname -n一致
node LVS_B #备用节点名称
ping 192.168.1.1 #只是用于检测节点的连通性,并不作为节点切换的真正依据
pwatchdog /dev/watchdog #看门狗。如果本节点1分钟后还没有发出心跳.那么本节点自动重启
respawn hacluster /usr/lib/heartbeat/ipfail #配置ip绑定和切换功能
apiauth ipfail gid=haclient uid=hacluster #控制ip切换时所使用的用户
注:如果主节点需要维护时,可先将其转移到备份服务器上使用如下命令
# /usr/lib/heartbeat/hb_standby (hb_standby命令把资源强迫到迁移到备份服务器)
如果主节点要切回来掌管服务:
# /usr/lib/heartbeat/hb_takeover
2.# vim /etc/ha.d/authkeys
# vim /etc/ha.d/authkeys
配置项如下.表示使用md5作为数字签名算法对心跳数据包加密
保存退出后必须调整此文件的权限为600只有root用户有权限
否则启动失败日志提示.权限安全问题
auth 3
3 md5 sharkshow
# chmod 600 /etc/ha.d/authkeys #更改文件权限
3.# vim /etc/ha.d/haresources
配置项如下
LVS_A IPaddr::192.168.1.88/32 ldirectord::ldirectord.cf
这个配置的解释各文档种不一样我通过日志查看发现是这样的情况
LVS_A
#是主节点名称.
IPaddr
#IPaddr是存在于/etc/ha.d/resource.d目录下脚本;也可以存在于/etc/init.d/下的
#而且得支持start和stop参数.因为主节点启用时会调用start.释放时会调用stop
“::”
两个冒号代表的是空格
192.168.1.88/32 是IPaddr这个脚本调用的参数具体工作可以去看IPaddr这个脚本
在主服务器启用服务时查看系统日志里会如下的两行.很生动吧
# tail –f /var/log/ha-log
info: Running /etc/ha.d/resource.d/IPaddr 192.168.1.88/32/ start
info: Running /etc/ha.d/resource.d/ldirectord ldirectord.cf start
192.168.188/32 代表的是Ipaddr这个脚本调用的参数.那ldirectord.cf就不用我说了 ^ ^
注意: 如果有多个脚本主节点启动的时候顺序是从左往右.释放的时候从右往左stop.要注意这个协调顺序
info: Running /etc/ha.d/resource.d/ldirectord ldirectord.cf stop
info: Running /etc/ha.d/resource.d/IPaddr 192.168.1.88/32/ stop
四. scp文件到LVS_B;如果是单播.自行修改ha.cf中的关键字
# cd /etc/ha.d/
# scp ha.cf authkeys haresources ldirectord.cf root@192.168.1.40:/etc/ha.d/
#如果嫌麻烦而且为了统一ha.d目录的内容可以使用-r 参数把/etc/ha.d/目录都拷贝过去
本实验环境ha.cf的关键字是广播检测发送心跳.单播的时候ha.cf关键字的互指对方地址.写法如下:
# scp –r /etc/ha.d/ root@192.168.1.40:/etc/
五. 开启服务
# /etc/init.d/ldirectord start #高可用容错机制
# /etc/init.d/heartbeat start #心跳检测资源释放.平滑冗余
---------------------------------------------------end---------------------------------------------------
总结:
heartbeat日志中记录的主机名都是小写
不知道这个有所谓没
所以建议做的时候将主机名换成小写.使用HTML5和CSS3构建基于webkit的Web Page/App
现在在ios/android上的web网站变的越来越多,智能机中ios和android系统的设备市场份额也是与日俱增,相信未来会是一个趋势,那么如何构建基于webkit的网站呢?这里有一篇文章介绍了如何用html5创建一个iphone的app,这是一个基于web的本地离线应用,相对于native应用来说基于web的应用开发和测试都非常快捷,基于webkit浏览器支持大部分的html5,也支持大部分的css3,而且开发语言也是大多数web工程师所熟悉的,最重要的一点是基于web的应用是完全跨平台的,不需要多平台的开发和测试。
开发基于webkit的web app/page时需要注意的有:
HTML特性:
<input type=”file” />在iphone上不work
<a href=”13888888888″>Call Me</a>可以调用打电话应用
google maps, iTunes和youtube的链接会在iphone上打开相应的组件
app/web page设置:
<link rel=”apple-touch-icon” href=”iphon_tetris_icon.png”/> 在设置书签的时候可以显示好看的图标
<meta name=”apple-mobile-web-app-capable” content=”yes” /> 离线应用的另一个技巧
<meta name=”apple-mobile-web-app-status-bar-style” content=”black” /> 隐藏状态栏
<link rel=”apple-touch-startup-image” href=”startup.png” /> 设置开始页面图片
<meta name=”viewport” content=”width=device-width, user-scalable=no” /> 指定mobile,并且不可缩放
<meta name=”viewport” content=”width=device-width, minimum-scale=1.0, maximum-scale=1.0″ /> 同上
CSS相关配置:
@media screen and (max-device-width: 480px){
/* 小屏幕的css样式 */
}
@media screen and (max-width: 320px){
/* 纵向的css样式 */
}
@media screen and (max-width:480px){
/* 横向的css样式 */
}
@media screen and (orientation: portrait){
/* iPad 纵向的css样式 */
}
@media screen and (orientation:landscape){
/* iPad 横向的css样式 */
}
display: -webkit-box; -webkit-box-orient:vertical/horizontal; -webkit-box-flex: value 水平垂直布局box
rounded corner/text shadow/box shadow/rgba/font-face/transform/transition/animation/border-image/gradients/ 充分利用这些css3的特性做出丰富的UI
脚本特性:
可以选用开源的javascript库,如yui, jquery, mootools, dojo …
垂直的js库,如canvas游戏库有LimeJs, GameJs等,Mobile UI库如jquery mobile, sencha touch, iui等,以及其它各种库
隐藏标题栏 – addEventListener(“load”, function() { setTimeout(function (){ window.scrollTo(0,1);}, 0); }, false);
webkitTransitionEnd/webkitAnimationStart/webkitAnimationIteration/webkitAnimationEnd transition/animation事件
localstorage/manifest 离线应用
模拟iphone的scroll效果,解决Mobile Safari下不支持position:fixed的问题:touch scroll, demo
调试:
safari上可以设置user agent为iphone上的safari(preference->advaced->developer tool),还可以手动添加android的user agent{ Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17 –Nexus }
iphone的safari上有debug调试
关注Mobile性能问题,可以采用firebuglite等书签脚本来调试
文章的标题说的是web app/page,其实用html5和css3构建的app和page没啥区别,web page也很容易转换成native的app,通过phoneGap就可以了,phoneGap所做的就是在一个native的app内嵌入了一个类似chrome的浏览器,并且创建了一个桥接,从而直接去写web app就可以了,就像这个slide的标题写的一样“HTML5 is the Future of Mobile, PhoneGap Takes You There Today”,你的app可以在5个以上的平台上运行,使用的技术是你所熟悉的html/js/css,还等什么,赶快看看它的文档实践一下吧。
展开阅读全文