首页 > 代码库 > LVS-NAT实现Discuz负载均衡
LVS-NAT实现Discuz负载均衡
集群:是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。
集群分为:
HA:High Availability 高可用集群
LB:Load Balancing 高可拓展,伸缩集群
HP:High Performance 高性能集群
LVS的类型:nat,dr,tun
nat类型的特性:
1、RS应用使用私有地址;RS的网关必须指向DIP;
2、请求和响应都要经过Director;高负载场景中,Director易成为性能瓶颈;
3、支持端口映射;
4、RS可以使用任意OS;
dr类型的特性:
1、保证前端路由将目标地址为VIP的报文统统发往Directory,而不能是RS;
解决方案:
(1) 静态地址绑定:在前端路由器上操作
问题:未必有路由操作权限
(2) aprtables
(3) 修改RS上内核参数,将RS上的VIP配置在lo接口的别名上,并限制其不能响应对VIP地址解析请求;
2、RS可以使用私有地址;但也可以使用公网地址,此时可通过互联网通过RIP对其直接访问;
3、RS跟Directory必须在同一物理网络中;
4、请求报文经由Director,但响应报文必须不能经过Director;
5、不支持端口映射;
6、RS可以是大多数常见的OS;
7、RS的网关绝不允许指向DIP;
tun类型的特性:
1、RIP、VIP、DIP全部是公网地址;
2、RS的网关不会也不可能指向DIP;
3、请求报文经由Director,但响应报文必须不能经过Director;
4、不支持端口映射;
5、RS的OS必须支持隧道功能;
下边我们讲一下Load Balancing的实现。LB实现高拓展集群的方法有软件,硬件两种。由于条件限制而我们只作软件实验
LB实验用到的软件为LVS:Linux Virtual Server虚拟服务器。
lvs分为两部分,ipvsadm和ipvs,ipvs是工作在内核上的。所以我们只需要安装ipvsadm即可。
实验环境准备:
host1:CentOS6.5
网卡两个:eth0 工作在172.16.249.138/16,是VIP是公网IP ;eth1工作在10.0.0.1/24 是DIP 私网IP
host2:CentOS6.5
单网卡,私网IP:10.0.0.2
ipvsadm版本 :ipvsadm-1.26-2.el6
实验模型:nat类型
实验内容:
对web服务请求做负载均衡,将请求的分发到不同的web服务器上去,降低对单个服务器的压力。
1,配置环境
host1主机配置:
为两块网卡配置IP:
ifconfig eth0 172.16.249.138/16
ifconfig eth1 10.0.0.1/24 up
将eth0设为桥接。eth1设为指定本地网络
yum install ipvsadm #安装ipvsadm软件
host2主机配置:
ifconfig eth0 10.0.0.2/24
eth0设为本地网络
route add default gw 10.0.0.1
所以host1 的eth1与host2 的eth0 都无法直接访问公网网络。
2,为host2主机提供web服务。
yum install httpd #安装httpd,有的就无需安装。
配置httpd,创建虚拟主机,模拟两台服务器模式工作。
#DocumentRoot "/var/www/html" #注销掉根目录 NameVirtualHost *:80 #启用 <VirtualHost 10.0.0.8:80> ServerAdmin aolens@aolens.com DocumentRoot /www/host1/ ServerName www.aolens.com ErrorLog /www/host1_error.log CustomLog /www/host1_access.log </VirtualHost> <VirtualHost 10.0.0.9:80> ServerAdmin aolens@aolens.com DocumentRoot /www/host2/ ServerName www.aolens.com ErrorLog /www/host2_error.log CustomLog /www/host2_access.log </VirtualHost>
保存
httpd -t #是否有语法错误。
service httpd reload
mkdir -pv /www/{host1,host2} #创建文件的目录。为web服务提供两个不同的页面,方便可观察访问的是哪个服务器。
为两台虚拟主机提供访问页面:
vim /www/host1/index.html
<h1> www.node1.com</h1>
vim /www/host2/index.html
<h1> www.node2.com</h1>
3,添加一个集群服务
service ipvsadm start #启动ipvsadm服务 ipvsadm -A -t 172.16.249.138:80 -s rr #添加一个集群 VIP:Port=172.16.249.138:80 调度方式选择rr 轮询,这样便于观察访问 ipvsadm -a -t 172.16.249.138:80 -r 10.0.0.8 -m #为集群添加RS1 ipvsadm -a -t 172.16.249.138:80 -r 10.0.0.9 -m #为集群添加RS2 [root@www ~]# cat /proc/sys/net/ipv4/ip_forward #查看转发功能是否开启,开启为1,关闭是0 0 [root@www ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
ipvsadm的简单用法:
添加一个集群服务: ipvsadm -A|E -t|u|f service-address [-s scheduler]
service-address:
-t|u: VIP:Port
向一个已经存在集群服务添加一个RS: ipvsadm -a|e -t|u|f service-address -r server-address [options]
-r RS-ADDR
-w weight
--gatewaying -g gatewaying (direct routing) (default)
--ipip -i ipip encapsulation (tunneling)
--masquerading -m masquerading (NAT)
查看已经定义的集群服务及RS: ipvsadm -L -n
清空所有的集群服务: ipvsadm -C
删除集群服务: ipvsadm -D -t|u|f service-address
从集群服务中删除RS: ipvsadm -d -t|u|f service-address -r server-address
保存集群服务定义:
ipvsadm -S > /path/to/some_rule_file
ipvsadm-save > /path/to/some_rule_file
让规则文件中的规则生效:
ipvsadm -R < /path/from/some_rule_file
ipvsadm-restore < /path/from/some_rule_file
在物理主机上访问172.16.249.138.
当访问到的数据时www.node2.com是,下个访问数据将会是www.node1.com ,也可以刷新一个访问会不停变换显示结果,明显,每一次的访问到的服务器端都是不同。当两个服务器数据一样是。这就实现了负载均衡
但是如果同意用户访问同一数据,还不停的做轮询这样不但消耗资源而且缓存机制的作用被大大减小了。那么如何实现让同一用户访问同一数据去往同一服务器呢?实现此方法就要用到Session的持久机制。
Session持久机制:
1、session绑定:始终将来自同一个源IP的请求定向至同一个RS;没有容错能力;有损均衡效果;
2、session复制:在RS之间同步session,每个RS拥有集群中的所有的session;对规模集群不适用;
3、session服务器:利用单独部署的服务器来统一管理集群中的session;
调度算法中的sh算法就可以实现Session绑定。
[root@www ~] # ipvsadm -E -t 172.16.249.138:80 -s sh #修改集群调度算法为sh
在物理主机上访问172.16.249.138.第一次访问到的是什么结果,那么往后一段时间内访问到的数据结果就是相同的。
后边的实现都将172.16.249.138改为192.168.1.128. ipvsadm的集群定义也一样。
下边我们来为安装Discuz论坛
1,配置nfs服务器,将Discuz放到nfs上。
服务端端配置:
服务器IP:192.168.1.128
在NFS服务器端安装nfs-utils
编辑配置文件:/etc/exports
/nfsserver 10.0.0.0/24(rw,async,no_root_squash)
创建共享目录/nfsserver
mkdir /nfsserver
给共享目录apache用户的rwx权限:
setfacl -m u:apache:rwx /nfsserver
重启服务:service nfs restart
客户端:
创建/web/nfs挂载目录:
showmount -a 172.16.18.5 查看共享的NFS服务。
mount -t nfs 10.0.0.2:/nfsserver /www/host1/upload
mount -t nfs 10.0.0.2:/nfsserver /www/host2/upload
2,提供数据库配置:
安装数据库不会的可以查看:http://aolens.blog.51cto.com/ 寻找解答。
host1主机作为MySQL的服务器端。
create database discuz #创建一个discuz数据库
GRANT ALL ON *.* TO ‘aolens‘@‘10.%.%.%‘ IDENTIFIED BY ‘aolens‘ 创建一个用户给他权限。
3,提供Discuz安装:
在nfs服务器端解压Discuz包。我们这里使用的Discuz版本为:Discuz_7.2_FULL_SC_GBK.zip
cp Discuz_7.2_FULL_SC_GBK.zip /nfsserver cd /nfsserver unzip Discuz_7.2_FULL_SC_GBK.zip mv ./upload/* ./
访问192.168.1.128/upload/index.php 执行Discuz的安装。
解决出现的错误:
chmod 777 ./config.inc.php chmod 777 ./attachments chmod 777 ./forumdata chmod -R 777 ./forumdata/* chmod 777 ./uc_client/data/cache yum install php-mysql service httpd restart service mysqld restart
chown -R apache.apache /nfsserver/*
基于Linux做安装Discuz论坛做访问负载均衡,且将数据文件都放在NFS服务器上,实现数据同步实验结束!
------------------------------------------------------END---------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------
本文出自 “aolens·程超” 博客,请务必保留此出处http://aolens.blog.51cto.com/7021142/1548539
LVS-NAT实现Discuz负载均衡