1、结合图形描述LVS的工作原理;
工作方式:
LVS由前端的负载均衡器(Load Balancer,LB)和后端的真实服务器(Real Server,RS)群组成。RS间可通过局域网或广域网连接。LVS的这种结构对用户是透明的,用户只能看见一台作为LB的虚拟服务器(Virtual Server),而看不到提供服务的RS群。当用户的请求发往虚拟服务器,LB根据设定的包转发策略和负载均衡调度算法将用户请求转发给RS。RS再将用户请求结果返回给用户。
工作原理:
1.当客户端的请求到达负载均衡器的内核空间时,首先会到达PREROUTING链。
2.当内核发现请求数据包的目的地址是本机时,将数据包送往INPUT链。
3.LVS由用户空间的ipvsadm和内核空间的IPVS组成,ipvsadm用来定义规则,IPVS利用ipvsadm定义的规则工作,IPVS工作在INPUT链上,当数据包到达INPUT链时,首先会被IPVS检查,如果数据包里面的目的地址及端口没有在规则里面,那么这条数据包将被放行至用户空间。
4.如果数据包里面的目的地址及端口在规则里面,那么这条数据报文将被修改目的地址为事先定义好的后端服务器,并送往POSTROUTING链。
5.最后经由POSTROUTING链发往后端服务器。
几种常用模型:
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。
③.RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。
优点:返回请求无需经过调度器,效率高
缺点:
1.配置复杂,需要修改内核参数使lo接口的VIP不能响应本地网络内的arp请求;
2.负载均衡器的DIP网卡与各RS必须在一个局域网中,不能跨网段;
3.无法做端口转换。
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP(客户端IP),后面统称为CIP),目标地址为VIP(负载均衡器前端地址,后面统称为VIP)。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了后端服务器的RIP地址并将报文根据算法发送出去。
③.报文送到Real Server后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS。
④.然后lvs将此报文的源地址修改为本机并发送给客户端。
优点:
1.RS端配置简单,只需配置私网IP即可;
2.支持端口转换。
缺点:由于请求与响应都经过调度器,所以性能较差,容易出现瓶颈;
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
③.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。
优点:
1.返回请求无需经过调度器,效率高;
2.负载均衡器与RS之间可以跨网段,甚至跨公网。
缺点:
1.配置复杂,需要修改内核参数使lo接口的VIP不能响应本地网络内的arp请求;
2.无法做端口转换。
2、搭建一套LVS-DR模型的高性能集群,并实现以下功能:
(1)、wordpress程序通过nfs共享给各个realserver;
(2)、后端realserver中的nginx和php分离
1. 在两台rs节点上分别安装nginx
]# yum install nginx nfs-utils -y #安装nfs-utils是为了后面能够正常挂在nfs分区
2. 安装Mariadb
]# yum install mariadb-server -y
3. 安装php-fpm和nfs
]# yum install php-fpm php-mysql php-mbstring php-gd php-xml nfs-utils -y
4. 在两个rs节点上分别修改nginx配置文件,添加下面内容:
]# vim /etc/nginx/nginx.conf ... location / { root /data/www; #定义根目录 index index.php index.html index.htm; #将index.php放在第一位置 } location ~ \.php$ { root /data/www; fastcgi_pass 192.168.0.24:9000; #指定php服务器地址和端口 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } ...
5.在php服务器上修改php-fpm配置文件
]# vim /etc/php-fpm.d/www.conf listen = 192.168.0.24:9000 #设置监听地址和端口 #listen.allowed_clients = 127.0.0.1 #默认只允许本机访问,注释该行后表示允许所有地址到本机的连接 ]# systemctl start php-fpm.service
6. 在php服务器上配置nfs服务
]# mkdir -p /data/www ]# vim /etc/exports /data/www 192.168.0.0/24(rw,no_root_squash) #将/data/www通过nfs服务共享出去 ]# systemctl start nfs.service
7.在两个rs节点上创建共享目录并挂在共享盘
]# mkdir -p /data/www/ ]# mount -t nfs 192.168.0.24:/data/www /data/www ]# systemctl start nginx.service
8.在php服务器上创建测试页,并在浏览器上分别打开rs1和rs2的主页,检查nginx和php的联动
]# vim /data/www/index.php <?php phpinfo(); ?>
9. 在MySQL服务器上设置必要的优化参数并重新初始化数据文件目录
]# 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 ]# systemctl start mariadb.service
10.测试php与Mariadb联动
]# mysql MariaDB [(none)]> grant all on *.* to 'root'@'192.168.0.%' identified by 'magedu'; #在mysql中创建远程连接账号用于联动测试 MariaDB [(none)]> flush privileges; ]# vim /data/www/index.php #在php服务器上创建测试页面 <?php $conn = mysql_connect('192.168.0.25','root','magedu'); if ($conn) echo "OK"; else echo "Failure"; ?>
11. 在MySQL中创建wordpress数据库和用户
MariaDB [(none)]> create database wpdb; MariaDB [(none)]> grant all on wpdb.* to wpuser@'192.168.0.%' identified by 'magedu'; MariaDB [(none)]> flush privileges;
12.在php服务器上部署wordpress
]# cd /data/www ]# unzip wordpress-3.3.1-zh_CN.zip ]# cd wordpress ]# cp wp-config-sample.php wp-config.php #生成wordpress配置文件 ]# vim wp-config.php define('DB_NAME', 'wpdb'); #修改为实际库名 /** MySQL 数据库用户名 */ define('DB_USER', 'wpuser'); #修改为实际用户名 /** MySQL 数据库密码 */ define('DB_PASSWORD', 'magedu'); #修改为实际密码 /** MySQL 主机 */ define('DB_HOST', '192.168.0.25'); #修改为实际IP
13.使用浏览器完成后续的图形化安装步骤
浏览器输入:http://192.168.0.21/wordpress/wp-admin/install.php
14. 在lvs服务器上安装lvs
]# yum install ipvsadm -y
15. 在lvs物理网卡上配置VIP
]# ifconfig eno16777736:0 192.168.0.20 netmask 255.255.255.255 broadcast 192.168.0.20
16.在两台rs上修改内核参数,禁止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
17.在两台rs的lo网卡上配置VIP并添加到lvs的vip的路由
]# ifconfig lo:0 192.168.0.20 netmask 255.255.255.255 broadcast 192.168.0.20 ]# route add -host 192.168.0.20 dev lo:0
18.在lvs上配置ipvsadm规则
]# ipvsadm -A -t 192.168.0.20:80 -s rr ]# ipvsadm -a -t 192.168.0.20:80 -r 192.168.0.22 -g -w 1 ]# ipvsadm -a -t 192.168.0.20:80 -r 192.168.0.23 -g -w 1 ]# 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.0.20:80 rr -> 192.168.0.22:80 Route 1 0 0 -> 192.168.0.23:80 Route 1 0 0
19.在浏览器中访问lvs的vip,测试是否成功
3、基于heartbeat v2 crm实现HA LAMP组合;要求,部署wordpress,用于编辑的文章中的任何数据在节点切换后都能正常访问;
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 ]# /etc/init.d/httpd start
2.配置nfs服务器
]# mkdir -p /data/www ]# vim /etc/exports /data/www 192.168.0.0/24(rw,no_root_squash) ]# systemctl start nfs.service
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 ]# systemctl start mariadb.service ]# mysql MariaDB [(none)]> create database wpdb; MariaDB [(none)]> grant all on wpdb.* to wpuser@'192.168.0.%' identified by 'magedu'; MariaDB [(none)]> flush privileges;
4.在nfs服务器上修改wordpress配置文件
]# cd /data/www ]# unzip wordpress-3.3.1-zh_CN.zip ]# cd wordpress ]# cp wp-config-sample.php wp-config.php ]# vim wp-config.php define('DB_NAME', 'wpdb'); /** MySQL 数据库用户名 */ define('DB_USER', 'wpuser'); /** MySQL 数据库密码 */ define('DB_PASSWORD', 'magedu'); /** MySQL 主机 */ define('DB_HOST', '192.168.0.25');
5.在两个rs上分别挂在nfs目录
]# mount -t nfs 192.168.0.24:/data/www /var/www/html
6.使用浏览器完成后续的图形化安装步骤,确保通过每个rs节点都能正常访问wordpress
7.配置heartbeat v2 crm的准备工作
1)各节点hosts中添加自己和对端节点的名称解析
2)各节点之间建立ssh互信关系
3)各节点之间时间同步
8.在各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
9.在两个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,依然正常,说明高可用实现成功。
原创文章,作者:N26-西安-方老喵,如若转载,请注明出处:http://www.178linux.com/76289
评论列表(1条)
非常赞,尤其是lvs集中模型的数据流走向,其实理清楚里面的网络地址和mac地址转换过程,对于以后排查lvs相关的故障就轻而易举了。