1、结合图形来描叙LVS的工作原理;
工作原理
LVS分为两个组件:ipvs和ipvsadm
ipvs:工作于内核空间,主要用于使用户定义的策略生效;
ipvsadm : 工作于用户空间,主要用于用户定义和管理集群服务的工具;
上图所示,ipvs工作于内核空间的INPUT链上,当收到用户请求某集群服务时,经过PREROUTING链,经检查本机路由表,送往INPUT链;在进入netfilter的INPUT链时,ipvs强行将请求报文通过ipvsadm定义的集群服务策略的路径改为FORWORD链,将报文转发至后端真实提供服务的主机。
几种常用模型:
LVS-DR
1)client向目标vip发出请求,Director接收.此时IP包头及数据帧头信息如(1),(2);
2)LVS根据负载均衡算法选择一台active的RS,将此RIP所在网卡的mac地址作为目标mac地址,发送到局域网里.此时IP包头及数据帧头信息如(3);
3)RS在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文.随后重新封装报文,发送到局域网.此时IP包头及数据帧头信息如(4);
1)RS可以使用私有地址;但也可以使用公网地址,此时可以直接通过互联网连入RS以实现配置、监控等;
2)RS的网关一定不能指向DIP;
3)RS跟DR要在同一物理网络内(不能由路由器分隔);
4)请求报文经过DR,但响应报文一定不经过DR
5)不支持端口映射;
6)RS可以使用大多数的操作系统;
LVS-NAT
此模型中,DR只需要将VIP配置到DR上,它的工作机制是,将收到的集群服务请求报文目标地址转换成经调度算法计算得出的后端主机IP地址,然后端主机将响应报文发送至DR,再由DR将源地址转换成VIP的地址;此机制与iptables中我们学习的DNAT类似;
LVS-TUN
在数据包必须传递到另一个网络或因特网上时,可以使用ip隧道,ip隧道能够将数据包从一个子网或虚拟局域网(VLAN)转发到另一个子网或虚拟局域网(VLAN),建立ip隧道是Linux内核功能的一部分,LVS-TUN转发方法允许你将集群节点放在与Director不同的网络上。
请留意DR将数据包转发给RS时的IP数据报文;由于DR,RS都不在同一局域网内,而DR要将client请求报文转发给RS时,DR是直接在数据包中直接添加IP首部(源IP:DR和目标IP:RS),这样就是隧道技术了。
同样,该模型下RS都将配置VIP地址,且不能被外界所获知VIP存在于RS上;
LVS TUN类型:IP隧道
1)RIP、DIP、VIP都得是公网地址;
2)RS的网关不会指向也不可能指向DIP;
3)请求报文经过DR,但响应报文一定不经过DR;
4)不支持端口映射;
5)RS的OS必须得支持隧道功能;
LVS-FullNat
LVS当前应用主要采用DR和NAT模式,但这2种模式要求RS和DR在同一个vlan中,导致部署成本过高;TUN模式虽然可以跨vlan,但RS上需要部署ipip模块等,网络拓扑上需要连通外网,较复杂,不易运维。为了解决上述问题,我们在DR上添加了一种新的转发模式:FullNat,该模式和NAT模式的区别是:Packet IN时,除了做DNAT,还做SNAT(用户ip->内网ip),从而实现DR-RS间可以跨vlan通讯,RS只需要连接到内网;
LVS FullNat:
1)DR,RS可以不在同一网络内,但它与TUN不同,所有IP报文头部信息变更都在DR上进行,所以性能方面比LVS_NAT更差一些;
2)需要注意配置路由,保证能正常通信;
2、搭建一套LVS-DR模型的高性能集群,并实现以下功能:
(1)、wordpress程序通过nfs共享给各个realserver;
(2)、后端realserver中的nginx和php分离
LVS-VIP 192.168.31.100
LVS- DIP 192.168.31.10
nginx1 192.168.31.11
nginx2 192.168.31.12
PHP/NFS 192.168.31.13
MySQL 192.168.31.14
架构图
1、在两台nginx上安装nginx服务,我这里选择源码编译安装
[root@server ~]# tar -zxvf nginx-1.10.3.tar.gz
[root@server ~]# ./configure –prefix=/usr/local/nginx –sbin-path=/usr/local/nginx/sbin/nginx –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –pid-path=/var/run/nginx/nginx.pid –lock-path=/var/lock/nginx.lock –user=nginx –group=nginx –with-http_ssl_module –with-http_flv_module –with-http_stub_status_module –with-http_gzip_static_module –http-client-body-temp-path=/var/tmp/nginx/client/ –http-proxy-temp-path=/var/tmp/nginx/proxy/ –http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ –http-uwsgi-temp-path=/var/tmp/nginx/uwsgi –http-scgi-temp-path=/var/tmp/nginx/scgi –with-pcre
[root@server ~]#make && make install
2、建立nginx用户,保证和php服务器上的nginx用户id号,组id号一致
groupadd -r -g 409 nginx
useradd -r -u 409 -g 409 nginx
3、在PHP/NFS服务起上安装php及nfs
yum install php-mysql php-mbstring php-gd php-xml nfs-utils -y
[root@php ~]#tar -zxvf php-5.5.15.tar.gz
[root@php ~]#./configure –prefix=/usr/local/php –with-mysql –with-pdo-mysql –with-mysqli –with-openssl –enable-fpm –enable-sockets –enable-sysvshm –enable-mbstring –with-freetype-dir –with-jpeg-dir –with-png-dir –with-zlib-dir –with-libxml-dir=/usr –enable-xml –with-mhash –with-mcrypt –with-config-file-path=/etc –with-config-file-scan-dir=/etc/php.d –with-bz2 –with-curl
[root@php ~]#make && make install
提供配置文件
[root@php php-5.5.15]# cp php.ini-production /etc/php.ini
为php-fpm提供脚本
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
chkconfig –add php-fpm
chkconfig php-fpm on
4、在PHP服务器上,建立nginx用户,要保证和nginx服务器上的nginx用户id号、组id号一致:
groupadd -r -g 409 nginx
useradd -r -u 409 -g 409 nginx
5、修改php-fpm配置文件,并重启:
vim /usr/local/php/etc/php-fpm.conf
listen = 192.168.31.13:9000
user = nginx
group = nginx
service php-fpm restart
6.在PHP服务器上创建/www目录,并开启nfs服务
mkdir /www
chown nginx.nginx /www -R
vim /etc/exports
/www 192.168.31.0/24(rw,no_root_squash)
service nfs start
7.整合nginx与php
nginx服务器建立网页文件存放目录/www,并修改其权限
mkdir /www
chown -R nginx:nginx /www
vim /etc/nginx/nginx.conf
location / {
root /www;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /www;
fastcgi_pass 192.168.31.13:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
8、nginx服务器挂载nfs,并测试php
mount -t nfs 192.168.31.13:/www /www
vim /www/index.php
<?php
phpinfo();
?>
9、整合PHP与mysql,安装mysql
9.1添加用户
useradd -r mysql
mkdir -pv /mydata/data
chown -R mysql.mysql /mydata/data
9.2解压并初始化mysql
tar xf mariadb-10.0.20-linux-x86_64.tar.gz -C /usr/local/
cd /usr/local/
ln -sv mariadb-10.0.20-linux-x86_64 mysql
cd mysql/
chown -R root:mysql .
scripts/mysql_install_db –user=mysql –datadir=/mydata/data/
9.3修改配置文件
cp support-files/my-large.cnf /etc/my.cnf
vim /etc/my.cnf
添加以下几行
datadir = /mydata/data
innodb_file_per_table = ON
skip_name_resolve = ON
9.4提供脚本文件
cp support-files/mysql.server /etc/init.d/mysqld
chkconfig –add mysqld
chkconfig mysqld on
service mysqld start
10.测试php与Mariadb联动
MariaDB [(none)]> grant all on *.* to 'root'@'192.168.31.%' identified by 'mysql'; #在mysql中创建远程连接账号用于联动测试 MariaDB [(none)]> flush privileges; ]# vim /data/www/index.php #在php服务器上创建测试页面 <?php $conn = mysql_connect('192.168.31.14','root','mysql'); if ($conn) echo "OK"; else echo "Failure"; ?>
11、在php服务器上部署wordpress
cd /www
tar -zxvf wordpress-4.7.4-zh_CN.tar.gz
12、使用浏览器完成后续的图形化安装步骤。。。。省略
13、lvs服务器上安装lvs
yum -y install ipvsadm
在lvs物理网卡上配置vip,并添加路由
ifconfig eth0:0 192.168.31.100 netmask 255.255.255.255 broadcast 192.168.31.100
route add -host 192.168.31.100 dev eth0:0
14、在两台rs上配置VIP,添加路由,并修改内核参数,禁止lo对VIP的广播做响应
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 192.168.31.100 netmask 255.255.255.255 broadcast 192.168.31.100
route add -host 192.168.31.100 dev lo:0
15、在lvs上配置ipvsadm规则
ipvsadm -A -t 192.168.31.100:80 -s rr
ipvsadm -a -t 192.168.31.100:80 -r 192.168.31.11 -g -w 1
ipvsadm -a -t 192.168.31.100:80 -r 192.168.31.12 -g -w 1
ipvsadm -L -n
16、在浏览器中访问lvs的vip,测试是否成功
3.基于heartbeat v2 crm实现HA LAMP组合;要求,部署wordpress,用于编辑的文章中的任何数据在节点切换后都能正常访问;
Apache1/PHP VIP:192.168.31.100 RIP:192.168.31.11
Apache2/PHP VIP:192.168.31.100 RIP:192.168.31.12
NFS RIP:192.168.31.13
MYSQL RIP:192.168.31.14
架构图
1. 在两台rs节点上分别安装httpd,php并配置
yum install httpd php php-mysql php-mbstring php-gd php-xml nfs-utils -y
vim /etc/httpd/conf/httpd.conf
<IfModule dir_module>
DirectoryIndex index.php index.html
</IfModule>
…
AddType application/x-httpd-php .php
service httpd start
2.配置nfs服务器
mkdir -pv /data/www
vim /etc/exports
/data/www 192.168.0.0/24(rw,no_root_squash)
service nfs start
3.安装并配置mariadb服务器
vim /etc/my.cnf
[mysqld]
…
datadir = /mydata/data
innodb_file_per_table = ON
skip_name_resolve = ON
mkdir -p /mydata/data
mysql_install_db –user=mysql –datadir=/mydata/data
service mysqld start
mysql
MariaDB [(none)]> create database wpdb;
MariaDB [(none)]> grant all on wpdb.* to root@’192.168.0.%’ identified by ‘mysql’;
MariaDB [(none)]> flush privileges;
4.在两个rs上分别挂在nfs目录
mount -t nfs 192.168.0.24:/data/www /var/www/html/
5.使用浏览器完成后续的图形化安装步骤,确保通过每个rs节点都能正常访问wordpress <同上>
6.配置heartbeat v2 crm的准备工作
1)各节点hosts中添加自己和对端节点的名称解析
2)各节点之间建立ssh互信关系
3)各节点之间时间同步
7.在各rs节点安装heartbeat
yum install net-snmp-libs libnet PyXML libtool-ltdl gnutls gettext -y
rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm
8.在两个rs节点上分别配置heartbeat
cp /usr/share/doc/heartbeat-2.1.4/{ha.cf,authkeys} /etc/ha.d/
cd /etc/ha.d/
chmod 600 authkeys
vim authkeys auth2 #1 crc 2 sha1 1q2w3e4R #3 md5 Hello! vim /etc/ha.d/ha.cf logfile /var/log/ha-log #只用heartbeat日志 #logfacility local0 #禁用rsyslog的local0 mcast eth0 225.23.190.1 694 1 0 #设定组播地址 keepalive 2 #监听频率为2秒 deadtime 30 #死亡判定时间为30秒 warntime 10 #异常警告时间为10秒 auto_failback on #修复后自动上线 node node1.magede.com #设置节点1 node node2.magedu.com #设置节点2 ping 192.168.0.1 #设定第三方仲裁设备 crm on #开启crm,同时也会禁用haresources
10.打开hb_gui图形界面
]# echo "magedu"|passwd --stdin hacluster #为hacluster设定密码,用于后面图形化登录时身份验证 ]# service heartbeat start;ssh node2 service heartbeat start ]# hb_gui &
输入hacluster密码后进入hb_gui主界面
创建资源组ha_wordpress
创建资源webip,用于启停VIP
创建资源nfs,用于挂载nfs共享磁盘
创建资源webserver,用于启停httpd服务
创建colocation约束,用于将不同资源绑定在一起
创建约束nfs_with_webip,即nfs服务必须与webip在同一个节点上
创建约束webserver_with_nfs,即webserver必须与nfs在同一个节点上
创建顺序约束,用来指定资源服务的启停顺序
创建约束nfs_after_webip,即nfs必须在webip启动之后才能启动
创建约束webserver_after_nfs,即webserver服务必须在nfs服务启动之后才能启动
启动资源ha_wordpress之后,可以发现所有节点均启动在节点2上,此时访问http://192.168.0.20/wordpress正常。
将节点2置为standby
可以发现所有的资源均已漂移到节点1上,再次访问http://192.168.0.20/wordpress,依然正常,说明高可用实现成功。
嗯,差不多了!
原创文章,作者:N27_Vicent,如若转载,请注明出处:http://www.178linux.com/78598