lvs应用

练习:负载均衡一个php应用:

测试是否需要会话保持;

是否需要用到共享存储;

   为了检测是否需要会话保持和共享存储,要在两台主机上分别配置LAMP环境;这样就使得两者之间没有了共享存储;负载均衡使用nat模型的wlc算法,并且不使用lvs的长连接选项。数据库故意使用了相同的账号密码来进行安装。

步骤一:配置环境:

使用yum分别安装两台主机的环境,分别安装Discuz论坛;

blob.png

blob.png

此种方式可以在安装的时候就会发现,因为没有会话保持,每次安装的下一步都可以正确使用,但是安装之后就不能正常访问了,每次刷新页面都会报错,是如下两个页面的来回切换:

blob.png

blob.png

而第一张图片的错误应该是刷新到了没有安装论坛的主机,而第二张虽然能够访问,但是连接数据库出现了错误,因为点击登录并不能登录成功。我们再打开一个新的页面进行访问,结果还是相同。

我们重新负载均衡,这时使用会话保持的非共享存储:使用lvs自带的保持连接机制:

[root@localhost ~]# ipvsadm  -E -t 10.1.49.11:80  -p 360
[root@localhost ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.1.49.11:80 wlc persistent 360
  -> 192.168.49.2:80              Masq    1      0          0         
  -> 192.168.49.3:80              Masq    1      0          0

重新安装:

blob.png

访问正常,发表一个帖子,查看也正常。但是此时很明显另一台主机并没有安装discuz,并且数据库相互独立。我们将另一台主机安装discuz,查看效果:

blob.png

可以正常访问,但是可以看到我们在另一台主机上发表的一个帖子,在此主机上并不能看得到,这对于用户来说并不是想要的结果。因此我们需要共享存储,利用nassands等等或者主从复制等方法将数据库同步,才可以使用,如下图所示:

blob.png

blob.png

  当使用了共享存储,但没有会话保持的时候:登录之后,确实能够看到同样的内容,但是因为没有会话保持,登录之后刷新,登录就会断开,也会影响用户体验,类似于在淘宝上面买东西,从登录=》拍得东西=》添加地址=》付款,这是一个一系列的过程,也可以理解成一次操作过程,所有这一系列的操作过程都应当由一台服务器完成,而不能被负载均衡器分配到不同的服务器上。

 

课后作业dr模型中vipdip/rip不在同一个网段的实验环境设计及配置实现;

 

先配置VIPDIP/RIP在同一网段的情况,此时两台RS主机的网关指向的是10.1.0.1,响应报文会从交换机发送出去。

blob.png

而在配置不同网段的情况下,可以将RIP的网关指向其它路由器,从而从另一个途径直接发给用户,其源地址是VIP,目标地址是CIP。如下图:

blob.png

步骤一:配置准备,此处使用一台客户端,一台Director和两台RS

同步时间

[root@localhost ~]# ntpdate 10.1.0.1

centos7中:

[root@localhost ~]# vim /etc/chrony.conf

blob.png

重启服务:

[root@localhost ~]# systemctl restart chronyd.service 
[root@localhost ~]# date
2016年 10月 26日 星期三 22:13:42 CST

打开Director的核心转发功能:

[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

更改两台RS的内核参数及网卡,此处使用脚本更改:

[root@localhost ~]# cat set.sh 
#!/bin/bash
#
vip=10.1.49.49
mask=255.255.255.255
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
 
ifconfig lo:0 $vip netmask $mask broadcast $vip up
route add -host $vip dev lo:0
;;
stop)
ifconfig lo:0 down
 
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
;;
*)
echo "usage `basename` $0 start|stop"
exit 1
;;
esac

将网卡改为同一网段,并执行脚本:

blob.png

blob.png

Director上创建DR模型,使用脚本:

[root@localhost ~]# cat rs.sh 
#!/bin/bash
#
vip='10.1.49.49'
iface='eno16777736:0'
mask=255.255.255.255
port='80'
rs1='10.1.252.28'
rs2='10.1.49.10'
scheduler='wrr'
type='-g'
 
case $1 in
start)
ifconfig $iface $vip netmask $mask broadcast $vip up #Director上直接配置别名,使用VIP
iptables -F 
ipvsadm -A -t $vip:$port -s $scheduler
ipvsadm -a -t $vip:$port -r $rs1 $type -w 1
ipvsadm -a -t $vip:$port -r $rs2 $type -w 1
;;
stop)
ipvsadm -C 
ifconfig $iface down 
;;
*)
echo "usage"
exit 1
;;
esac
[root@localhost ~]# ipvsadm -ln 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.1.49.49:80 wrr
  -> 10.1.49.10:80                Route   1      0          0         
  -> 10.1.252.28:80               Route   1      0          0

检测结果:

blob.png

blob.png

[root@localhost ~]# for i in {1..10}; do curl http://10.1.49.49/index.html; done 
RS1
RS2
RS1
RS2
RS1
RS2
RS1
RS2
RS1
RS2

练习三:使用rsync+inotify实现数据同步;

 

(1)实验拓扑图:

blob.png

(2)实验目的:主机client创建有/data/tom/data/jerry的非空目录并担任客户端角色,结合inotify-tools工具;server1server2主机分别创建有/data/test1/data/test2并担任rsync的服务器。本实验验证当clent的目录内容发生变化时,能否实时同步到服务器端的目录中。

(3)rsync特性:

可以镜像备份整个目录树或者文件系统。

可以借助于rcpremote file copy)、rshremote shell)、sshsecure shell)传输文件,又可以通过sockets直接连接传输。

基于增量备份机制,有较高的同步效率。

支持匿名和认证的进程模式传输,方便数据传输与镜像。

可以指定排除同步部分目录或文件。

支持拷贝设备文件、链接等特殊文件。

文件或目录的拷贝可以保留其权限、时间戳、软硬链接等所有属性。

(4)配置实验环境:

yum安装rsyncinotify

服务端:

[root@localhost ~]# service xinetd start 
正在启动 xinetd:                                          [确定]
[root@localhost ~]# chkconfig rsync on 
[root@localhost ~]# chkconfig --list | grep rsync 
rsync:          启用

centos6rsync安装好之后没有自己的配置文件,我们需要手动创建配置文件:

[root@localhost ~]# cat /etc/rsyncd.conf
 uid = root
 gid = root
 use chroot = no
 max connections = 20
 pid file = /var/run/rsyncd.pid
 log file = /var/log/rsyncd.log
 lock file = /var/run/rsync.lock
 timeout = 900
[data]
path = /data/tom
ignore errors
read only = false
list = false 
hosts allow = 10.1.49.11/24
auth users = backuser
secrets file = /etc/rsync.passwd

rsync命令:

 rsync [option]SRC [SRC]DEST [DEST]

          optionrsync能够使用的选项,如下

            -n : 同步测试,不执行同步    

            -v :  verbose,详细输出模式,显示详细过程    

            -q : quiet,静默模式,尽可能输出少的信息    

            -c : checksum,可以对传输的文件进行较验的,强制对文件传输进行校验    

            -r  : recursive,递归复制    

            -p : perms,保存文件的权限    

            -t  : times,保留文件的时间戳    

            -l  : links,保留文件的符号链接    

            -g : group,保留文件的属组    

            -o : owner,保留文件的属主    

            -D : devices,保留设备文件

            -A : acls,保留acl访问控制列表

            -a : archives归档,复制时可以保存原有的属主属主等属性信息,甚至包括一点额外的属性。等同于-rlptgoD    

            -e SSH : 远程复制时,表示使用ssh协议作承载。如果ssh端口不是22,可以用-e ssh -p 22   

            -z : 基于网络时使用,对文件压缩后传输   

            progress : 显示压缩进度条的,简写-P   

            stats : 显示如何执行压缩和传输的,也就是显示传输状态的

(5)inotify,linux内核版本2.6.13以及更新版本支持,提供强大的文件系统监控,通过打开一个独立的文件描述符并以此监控一个或则多个文件的打开、关闭、移动/重命名、删除创建或者改变属性的事件。由于notify是内核功能,因此需要使用时,需要通过其接口程序inotify-tools接口程序调取使用。inotify-tools是基于linux平台为inotify的提供的C语言开发的接口工具,并提供一系列命令行工具并利用这些工具监控文件系统的事件。

(6)建立rsync用户名和密码文件,并更改权限:

[root@localhost ~]# echo "backuser:123" >> /etc/rsync.passwd
[root@localhost ~]# chmod 600 /etc/rsync.passwd

以上,服务器端配置完成。

(7)客户端配置:

[root@localhost ~]# echo "123" > /etc/rsync.passwd
[root@localhost ~]# chmod 600 /etc/rsync.passwd

配置inotify:

[root@localhost ~]# yum install inotify-tools

(8)添加脚本:此处只写了一台服务器,两台以上服务器可以使用for循环执行:

[root@localhost ~]# cat inotify.sh
#!/bin/bash
#
src=/data/tom
des=data
ip=10.1.49.10
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e modify,delete,create,attrib
$src | while read file do
rsync -avzP --delete --progress $src backuser@$ip::$des --password-file=/etc/rsync.passwd
echo "$src was rsynced"
done

注意文件名及变量的书写。

执行脚本:

[root@localhost ~]# bash inotify.sh &

此处的脚本在测试时会显示同步过程,是为了检测错误方便;在实际中可以将结果重定向至/dev/null。

(9)测试,此处只测试一个服务器:在客户端的tom目录下创建文件:

[root@localhost tom]# touch asdf
[root@localhost tom]# sending incremental file list
tom/
tom/asdf
  0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=1/3)
tom/asdfasdf
  0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=0/3)
sent 144 bytes  received 50 bytes  388.00 bytes/sec
total size is 0  speedup is 0.00
/data/tom was rsynced
/data/tom was rsynced

在服务端查看:

[root@localhost tom]# ls
tom
[root@localhost tom]# cd tom/
[root@localhost tom]# ls
asdf  asdfasdf

确实能够同步成功,但是此处做的还有不足。

在服务器端可以看出,同步的目录在tom下又新建了一个tom目录,说明两者的配置中的目录并不是同层的。此处的改进,可使服务器端的配置文件中的目录更改为path=/data,这样就可以同步至/data目录下了。也可以将脚本中的src=/data/tom,更改为/data。

原创文章,作者:SilencePavilion,如若转载,请注明出处:http://www.178linux.com/56513

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code