职位:技术总监 1、精通c++(linux平台、vc++Mfc、qt)、java、php、unity3d,略懂python 2、用c++开发过嵌入式产品,用c++开发过大型银行运维产品 3、用java开发大型银行运维产品,学校教务系统 4、用php开发进销存系统(在销售中),用php开发淘宝小程序 5、用unity3d开发衣柜设计软件,在运营中
分类: 服务器与存储
2016-07-05 12:19:31
在各种网络服务普遍应用的今天,随网络速度的提高以及用户的增加,在一些繁忙的场合,单凭一台机器已经无法就能应付所有的网络请求了。为了解决这个问题,许多用户就采 用一组cluster(集群)来代替单一的机器。cluster可以将多台计算机连接起来协同运作以对外提供各种服务,比如Apache、FTP、Mail等。
在Linux上最常见的、也可能是运用最广泛的cluster方案就是LVS(Linux Virtual
Server),很高兴LVS也是一个中国人创建和开发的开放源码项目。LVS自1998年开始,发展到现在已经是一个比较成熟的技术项目了。有许多比较著名网站和组织都在使用LVS架设的cluster,比如:、sourceforge.net、等。
在lvs基础上,出现了很多商业软件,如redhat的piranha,turbo linux的turbo cluster,都是基于lvs的核心代码。
从安装盘中找到ipvsadm-1.24-10.i386.rpm
rpm -ivh ipvsadm-1.24-10.i386.rpm
n 如果你能在目录/lib/modules/2.*.*-*/kernel/net/ipv4/ipvs中看到ip_vs_*文件,就证明你的系统已经支持ipvs.现在内核 2.6.* 的都已经默认支持了ipvs了,
n modprobe -l | grep ipvs
[root@localhost ipvs]# modprobe -l | grep ipvs
/lib/modules/2.6.18-194.el5/kernel/net/ipv4/ipvs/ip_vs.ko
/lib/modules/2.6.18-194.el5/kernel/net/ipv4/ipvs/ip_vs_dh.ko
/lib/modules/2.6.18-194.el5/kernel/net/ipv4/ipvs/ip_vs_ftp.ko
/lib/modules/2.6.18-194.el5/kernel/net/ipv4/ipvs/ip_vs_lblc.ko
/lib/modules/2.6.18-194.el5/kernel/net/ipv4/ipvs/ip_vs_lblcr.ko
/lib/modules/2.6.18-194.el5/kernel/net/ipv4/ipvs/ip_vs_lc.ko
/lib/modules/2.6.18-194.el5/kernel/net/ipv4/ipvs/ip_vs_nq.ko
/lib/modules/2.6.18-194.el5/kernel/net/ipv4/ipvs/ip_vs_rr.ko
/lib/modules/2.6.18-194.el5/kernel/net/ipv4/ipvs/ip_vs_sed.ko
/lib/modules/2.6.18-194.el5/kernel/net/ipv4/ipvs/ip_vs_sh.ko
/lib/modules/2.6.18-194.el5/kernel/net/ipv4/ipvs/ip_vs_wlc.ko
/lib/modules/2.6.18-194.el5/kernel/net/ipv4/ipvs/ip_vs_wrr.ko
n lsmod |grep ip_vs
[root@localhost ipvs]# lsmod |grep ip_vs
ip_vs 78081 0
192.168.1.96 前端负载均衡器
192.168.1.97 真实服务器
192.168.1.97 真实服务器
使用的虚拟ip为:192.168.1.65
使用服务器上的httpd测试,通过浏览器访问。
n 96电脑(前端负载均衡器):
l 安装ipvsadm
rpm -ivh ipvsadm-1.24-10.i386.rpm
l 配置虚拟ip:
ifconfig eth0:0 192.168.1.65 netmask 255.255.255.255 broadcast 192.168.1.65 up
l 配置转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
l 增加虚拟服务器:
ipvsadm -A -t 192.168.1.65:80 -s wlc
l 增加真实服务器:
ipvsadm -a -t 192.168.1.65:80 -r 192.168.1.97 -g
ipvsadm -a -t 192.168.1.65:80 -r 192.168.1.98 –g
l 删除真实服务器(可选):
ipvsadm -d -t 192.168.1.65:80 -r 192.168.1.98
l 查看lvs服务器清单:
l 启动httpd
chkconfig httpd on
service httpd start
n 97/98电脑(真实服务器):
l 关闭arp:
把下面四句添加在/etc/sysctl.conf 文件 最后:
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
l 配置ip路由:
ifconfig lo:0
192.168.1.65 netmask 255.255.255.255 broadcast 192.168.1.65 up
route add -host
192.168.1.65 dev lo:0
l 启动httpd:
chkconfig httpd on
service httpd start
l 改变网页的起始页:
97上:echo ' the site is 192.168.1.97' > /var/www/html/index.html
98上:echo ' the site is 192.168.1.98' > /var/www/html/index.html
在浏览器输入:, 然后不断刷新,会看到不同的结果。
the site is 192.168.1.97和the site is 192.168.1.98交替出现。另外在96机子上执行ipvsadm –l 最后面一列的数字会在增长,说明转发的次数在增加。
1、 上面仅仅是使用了lvs,但实际情况下,一个前端负载均衡器会形成一个单点,如果这个负载均衡器挂了,整个集群就挂了,所以还应该有个备用负载均衡器,两个负载均衡器通过heartbeat或者keepalived来管理
2、 在实验中有时会出现负载均衡不均衡的问题,比如98机子始终切换不过去,刚配置完三台电脑的时候挺好的,但到第二天在开虚拟机的时候会出现这种情况。下面增加ldirectord后,这个问题也自然而然的解决了。
3、 Lvs只能分配,但不能知道那个服务器是否挂了,这需要使用ldirectord(或keepalived)来探测服务器的可用性。
Lvs只能解决负载均衡的问题,要想解决高可用的服务器,lvs要与其他软件搭配。
有两种搭配方式:
n Lvs + heartbeat + ldirectord
n Lvs + keepalived
Heartbeat在双机热备中已经使用过了,原理配置方法都很清楚了,由于时间关系先不配置了,下面是关于ldirectord和keepalibed的使用
Ldirectord属于heartbeat的一部分,因为LVS只负责分发,不负责健康检查,所以,当后面一台机器挂掉,有可能继续分配请求, 使用ldirectord 可以自动将挂掉的机器移除.
前端负载均衡器:192.168.0.11
真实服务器1 : 192.168.0.21
真实服务器1 : 192.168.0.22
分别下载一下安装包并安装:
perl-MailTools-1.77-1.el5.centos.noarch.rpm
perl-Compress-Zlib-1.42-1.fc6.i386.rpm
perl-HTML-Parser-3.55-1.fc6.i386.rpm
perl-HTML-Tagset-3.10-2.1.1.noarch.rpm
perl-libwww-perl-5.805-1.1.1.noarch.rpm
perl-TimeDate-1.16-5.el5.noarch.rpm
heartbeat-ldirectord-2.1.4-11.el5.i386.rpm
其中perl-MailTools-1.77-1.el5.centos.noarch.rpm这个包不要在我们的电脑上下载,要在笔记本上下载,在我们电脑上也能下载,但却是个坏包。捣鼓了半天始终无法安装,还曾怀疑制作rpm包的人比较晕,弄了个坏的rpm包出来。
checktimeout=3
checkinterval=1
#fallback=127.0.0.1:80
autoreload=yes
logfile="/var/log/ldirectord.log"
#logfile="local0"
#emailalert="admin@x.y.z "
#emailalertfreq=3600
#emailalertstatus=all
quiescent=no
# Sample for an http virtual service
real=192.168.0.21:80 gate
real=192.168.0.22:80 gate
fallback=127.0.0.1:80 gate
service=http
scheduler=rr
#persistent=600
#netmask=255.255.255.255
protocol=tcp
checktype=negotiate
checkport=80
request="index.html"
# receive="Test Page"
# virtualhost=
Service ldirectord start
正常情况下,在192.168.0.11上执行ipvsadm -l,结果为:
停止192.168.0.21的httpd服务。
在192.168.0.11上执行ipvsadm -l,结果为:
上面的结果显示192.168.0.21已经不存在了,被ldirectord移除了。
Keepalive是为lvs而做的,目的是为了lvs的高可用性,解决lvs的单点问题,以及真实服务器的检测功能(此功能相当于ldirectord)
没有可用的rpm包,采用编译源码安装。
下载keepalived-1.2.2.tar.gz,并解包。
./configure
上面显示结果没有使用IPVS框架。这个选项必须为yes才行。原因是系统没有安装系统开发包。安装系统开发包即可,可以用yum -install kernel-dev。
由于虚拟机没设置上网,所以我直接从别的centos上把/usr/src/kernels/2.6.18-194.el5-i686这个文件夹拷了过来。然后做个链接,让keepalived能找到。
ln -s /usr/src/kernels/2.6.18-194.el5-i686/ /usr/src/linux
再./configure --prefix=/usr/local/keepalived
可看到结果
Make的时候出现如下错误:
/usr/include/time.h:105: 错误:与 ‘timer_t’ 类型冲突
/usr/src/linux/include/linux/types.h:31: 错误:‘timer_t’ 的上一个声明在此
查看这两个头文件下的timer_t的确实现方式不一样。查看系统版本跟内核开发包版本完全一致,让人崩溃的centos,头文件居然与内核开发包头文件不一样。
那就只能删掉一个头文件试试,将/usr/src/kernels/linux/include改名为include1,
然后ln -s /usr/inclue /usr/src/kernels/linux/include
然后重新./configure --prefix=/usr/local/keepalived
再make, 很幸运居然通过了。
Vi /etc/keepalived/ keepalived.conf
global_defs {
notification_email {
gengpeng@gelssoft.com
}
notification_email_from gengpeng@gelssoft.com
smtp_server 127.0.0.1
# smtp_connect_timeout 30
router_id LVS_DEVEL
}
# 20081013 written by :netseek
# VIP1
vrrp_instance VI_1 {
state MASTER #备机上改为BACKUP
interface eth0
virtual_router_id 51
priority 100 #备机上改为99,小于100的数即可。
advert_int 1
authentication {
auth_typePASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.65
}
}
virtual_server 192.168.0.65 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
# persistence_timeout 2
protocol TCP
real_server 192.168.0.21 80 {
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.0.22 80 {
weight 3
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
/usr/local/keepalived/sbin/keepalived –D
也可以:
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
service keepalived start
关闭主机的keepalived, 不断刷新这个网页,在备机上ipvsadm,会看到连接数的变化。
然后再启动主机的keepalived,不断刷新网页,在主机上ipvsadm,会看到连接数的变化,可以看出,只要主机启动,会立马接管过来。因为上面配置文件中的优先级priority 主机是100,从机是99,主机优先级大于从机。
对真实服务器的检测却始终没有测试成功,停掉21上的httpd服务后,在11上ipvsadm,始终还是存在21的信息。应该得到的结果跟ldirectord一样。
经以上研究,集群的可行性方案有:
n Lvs + heartbeat + ldirectord
n Lvs + keepalived
Lvs能完成负载均衡,任务的分配。
heartbeat(keepalived)能解决lvs的单点问题。
ldirectord(keepalived)能完成对真实服务器的检测。
n 集群的存储,这也是集群中很重要的一方面,有待研究。
n Keepalived对真实服务器的检测始终没有成功,没找到问题在哪里
n Keepalived也有双机的功能,跟heartbeat比有什么优缺点,暂时想到的就是keepalived配置比heartbeat简单,但heartbeat的功能比keepalived多样。
这里要修改为你自己的ip