一、结合图形描述LVS的工作原理;

  • lvs-nat模型

主要是修改目标IP地址为挑选出新的RS的IP地址。即请求进入负载均衡器时做DNAT,响应出负载均衡器时做SNAT。

wKioL1gybhbQg6PYAAJasrjEemo721.png-wh_50

1.当用户请求到达Director Server,此时请求的数据报文会先到达内核的PREROUTING链,此时报文的源IP是CIP,目标IP是VIP。

2.PREROUTING链检查发现数据包的目标IP是本机,将数据包送至INPUT链。

3.IPVS内核模块比对数据包请求的服务是否为集群服务,如果是,则修改数据包的目标IP为后端服务器的IP,然后将数据包发至POSTROUTING链,做DNAT转换。此时报文的源IP是CIP,目标IP是RIP

4.POSTROUTING链通过选路,将数据包发送到Real Server。

5.Real Server比对发现目标IP是自己的IP,开始建立响应报文发回给Director Server,此时报文的源IP是RIP,目标IP是CIP.

6.Director Server在响应客户端之前,此时会将源IP地址修改为自己的IP地址,然后响应给客户端,做SNAT转换。此时报文的源IP是VIP。目标IP是CIP。

  • lvs-dr模型

将请求报文的目标MAC地址设定为天选出来的RS的MAC地址。即做MAC地址转换。

wKioL1gybibDTcFQAAH-C0mXXIg211.png-wh_50

1.当用户请求到达Director Server,此时请求的数据报文huixiandao内核空间的PREROUTING链,此时报文的IP是CIP,目标IP是VIP。

2.PREROUTING链检查发现数据包的目标IP是本机,将数据包送至INPUT链,

3.IPVS内核模块比对数据包请求的服务是否为集群服务,如果是,将请求报文中的源MAC地址修改为DIP的MAC地址,将目标MAC地址修改为RIP的MAC地址,然后将数据包发至POETROUTING链中,此时的源IP和目的IP均未修改,仅修改了源MAC地址为DIP的MAC地址,目标MAC地址为RIP的MAC地址。

4.由于DS和RS实在同一网络中,所以两者之间的通信时通过二层协议来传输。POSTROUTING链检查目标MAC地址为RIP的MAC地址,那么此时数据包将会发至Real Server。

5.RS发现请求报文的MAC地址是自己的MAC地址,就接受此报文,处理完成以后,将响应报文通过IO接口传送给eth0网卡,然后向外发出,不经过负载均衡器。此时源IP地址为VIP,目标IP是CIP。

6.响应报文最终送至客户端。

  • lvs-tun模型

在原有的IP报文外再次封装多一层IP首部,内部IP首部(源地址为CIP,目标地址为VIP)外部IP地址首部(源地址为DIP,目标地址为RIP)

wKioL1gybu2xrjZhAANWP0IJdtI429.png-wh_50


1.当用户请求报文到达DS,此时请求的数据报文会先到内核的PREROUTING链。此时源IP是CIP,目标IP是VIP。

2.PREROUTING链检查发现数据包的目标IP是本机,将数据包送至INPUT链。

3.IPVS比对数据包请求的服务是否为集群服务,如果是,在请求报文的首部再次封装一层IP报文,封装源IP为DIP,目标IP是RIP,然后发至POSTROUTING链。此时源IP是为DIP,目标IP是RIP。

4.POSTROUTING链根据最新封装的IP报文,将数据包发至RS(因为外层封装多了一层IP首部,所以可以理解为此时通过隧道传输)。此时源IP是DIP,目标IP是RIP。

5.RS收到报文后发现是自己的IP地址,就会将报文接受下来,拆除最外层的IP后,会发现里面还有一层IP首部,而且目标地址是自己的lo接口VIP,那么此时RS开始处理此请求,处理完成滞后,通过lo接口送给eth0网卡,然后向外传递。此时的源IP地址为VIP,目标IP为CIP。

6.响应报文送达至客户端。

二、搭建一套LVS-DR模型的高性能集群,并实现以下功能:

1、wordpress程序通过nfs共享给各个realserver;

2、后端realserver中的nginx和php分离


用途
IP
LVS-Master
10.18.11.31
LVS-BACKUP10.18.11.32
LVS-VIP10.18.11.40
wordpress110.18.11.29
wordpress210.18.11.30


  • 源码编译安装LNMP架构环境

1、安装编译工具及库文件

yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers make cmake libtool* git tree

2、编译安装nginx

[root@localhost opt]# wget http://nginx.org/download/nginx-1.8.1.tar.gz        #下载nginx安装包
[root@localhost opt]# tar xzvf nginx-1.8.1.tar.gz        #解压安装包
[root@localhost nginx-1.8.1]# ./configure \        
> --prefix=/usr/local/nginx \
> --with-http_realip_module \
> --with-http_sub_module \
> --with-http_ssl_module \
> --with-http_gzip_static_module \
> --with-pcre
[root@localhost nginx-1.8.1]# make && make install
[root@localhost nginx-1.8.1]# vim /usr/local/nginx/conf/nginx.conf        #修改php相关配置
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html/$fastcgi_script_name;
            include        fastcgi_params;
        }
[root@localhost nginx-1.8.1]# /usr/local/nginx/sbin/nginx        #启动nginx

3、编译安装mysql

[root@localhost opt]# groupadd mysql        #添加mysql组
[root@localhost opt]# useradd -r -g mysql mysql        #添加mysql用户
[root@localhost opt]# tar xzvf mysql-5.6.24.tar.gz 
[root@localhost opt]# yum -y install make gcc-c++ cmake bison-devel ncurses-devel libaio        #安装编译代码所需要的包
[root@localhost opt]# cd /opt/mysql-5.6.24
[root@localhost mysql-5.6.24]#  cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql  \              [MySQL安装的根目录]
-DMYSQL_DATADIR=/mydata/mysql/data  \                   [MySQL数据库文件存放目录]
-DSYSCONFDIR=/etc \                                     [MySQL配置文件所在目录]
-DMYSQL_USER=mysql \                                    [MySQL用户名]      
-DWITH_MYISAM_STORAGE_ENGINE=1 \                        [MySQL的数据库引擎]
-DWITH_INNOBASE_STORAGE_ENGINE=1 \                      [MySQL的数据库引擎]
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \                       [MySQL的数据库引擎]
-DWITH_MEMORY_STORAGE_ENGINE=1 \                        [MySQL的数据库引擎]
-DWITH_READLINE=1 \                                     [MySQL的readline library]
-DMYSQL_UNIX_ADDR=/var/run/mysql/mysql.sock \           [MySQL的通讯目录]
-DMYSQL_TCP_PORT=3306 \                                 [MySQL的监听端口]
-DENABLED_LOCAL_INFILE=1 \                              [启用加载本地数据]
-DENABLE_DOWNLOADS=1 \                                  [编译时允许自主下载相关文件]
-DWITH_PARTITION_STORAGE_ENGINE=1  -DEXTRA_CHARSETS=all \                                  [使MySQL支持所有的扩展字符]
-DDEFAULT_CHARSET=utf8 \                                [设置默认字符集为utf8]
-DDEFAULT_COLLATION=utf8_general_ci \                   [设置默认字符校对]
-DWITH_DEBUG=0 \                                        [禁用调试模式]
-DMYSQL_MAINTAINER_MODE=0 -DWITH_SSL:STRING=bundled \                             [通讯时支持ssl协议]
-DWITH_ZLIB:STRING=bundled                              [允许使用zlib library]
[root@localhost mysql-5.6.24]# make && make install
[root@localhost local]# chown -R mysql:mysql /usr/local/mysql/        #修改mysql文件夹属组和属主
[root@localhost local]# chown -R mysql:mysql /mydata/mysql/data
[root@localhost etc]# vim /etc/my.cnf        #修改my.conf配置文件
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[mysqld]

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin

# These are commonly set, remove the # and set as required.
basedir=/usr/local/mysql
datadir=/mydata/mysql/data
socket=/var/lib/mysql/mysql.sock
character-set-server=utf8
user= mysql
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[root@localhost local]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/mydata/mysql/data        #初始化mysql数据库

4、编译安装php

[root@localhost opt]# tar xzvf php-5.6.5.tar.gz 
[root@localhost php-5.6.5]# ./configure --enable-opcache --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring=all --with-pdo-mysql --enable-sockets --enable-mbstring --enable-fpm --with-curl --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --enable-xml --with-gd  --with-libxml-dir=/usr --enable-xml --with-openssl --with-iconv
[root@localhost php-5.6.5]# make && make install
[root@localhost etc]# cp /opt/php-5.6.5/php.ini-development /usr/local/php/etc/php.ini
[root@localhost etc]# cd /usr/local/php/etc/
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf        
[root@localhost etc]# /usr/local/php/sbin/php-fpm        #启动php
[root@localhost html]# vim /usr/local/nginx/html/index.php        #创建一个php页面
<?php
phpinfo();
?>

5、修改nginx配置,分离php

[root@localhost opt]# vim /usr/local/nginx/conf/nginx.conf
        location / {
            root   /usr/local/nginx/html;#第1处修改
            index  index.html index.htm;
        }
        location ~ \.php$ {
            root           /usr/local/nginx/html/php;
            fastcgi_pass   127.0.0.1:9000; 
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }


  • 配置NFS共享wordpress程序

 #在10.18.11.29上配置共享目录 
[root@localhost ~]# vim /etc/exports        #在10.18.11.29上配置共享目录        
/usr/local/nginx/html/ 10.18.11.29(rw,sync,fsid=0,no_root_squash)
[root@localhost /]# systemctl start rpcbind.service        #启动rpcbind服务
[root@localhost /]# systemctl start nfs-server.service        #启动nfs服务 
 
 #在10.18.11.30上挂载共享目录 
[root@localhost nginx]# mount -t nfs 10.18.11.29:/usr/local/nginx/html /usr/local/nginx/htmlmount -t nfs 10.18.11.29:/usr/local/nginx/html /usr/local/nginx/html
[root@localhost nginx]# df -h
文件系统                           容量  已用  可用 已用% 挂载点
/dev/sda2                           75G  4.6G   66G    7% /
devtmpfs                           1.9G     0  1.9G    0% /dev
tmpfs                              1.9G     0  1.9G    0% /dev/shm
tmpfs                              1.9G   25M  1.9G    2% /run
tmpfs                              1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                          477M   94M  354M   21% /boot
/dev/mapper/vgdata-mylv            6.8G   23M  6.4G    1% /users
tmpfs                              380M     0  380M    0% /run/user/0
10.18.11.29:/usr/local/nginx/html   75G  8.7G   62G   13% /usr/local/nginx/html
[root@localhost nginx]# ll /usr/local/nginx/html/        #wordpress工程文件已共享
总用量 28
-rw-r--r-- 1 root root  537 11月 16 17:22 50x.html
-rw-r--r-- 1 root root  145 11月 26 23:14 inc.php
-rw-r--r-- 1 root root  612 11月 16 17:22 index.html
-rw-r--r-- 1 root root   20 11月 25 15:23 index.php
-rw-r--r-- 1 root root    6 11月 21 17:39 test.html
-rw-r--r-- 1 root root  145 11月 26 23:15 test.php
drwxrwxrwx 5 root root 4096 11月 27 16:37 wordpress
  • 安装workpress

[root@localhost opt]# wget 
[root@localhost opt]# tar xzvf wordpress-4.5.3-zh_CN.tar.gz
[root@localhost opt]# cp -r wordpress /usr/local/nginx/html/

在游览器中访问http://10.18.11.29/wordpress/wp-admin/install.php进行数据库配置


wKiom1g6m4qh-Of6AADtph5cVds013.png-wh_50

wKioL1g6nGySMj-FAAHnZNzIJ6Y222.png-wh_50

  • 用Keepalived实现nginx与lvs的高可用集群;

[root@localhost ~]# yum install keepalived        #在两台LVS服务器上安装keepalived
[root@localhost ~]# vim /etc/keepalived/keepalived.conf        #修改LVS-Master配置文件
! Configuration File for keepalived
 
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_1
}
 
vrrp_instance VI_DNS1 {
    state MASTER
    interface ens192        #vip绑定的网卡
    virtual_router_id 51        #虚拟路由标记ID,同一组vrrp一致
    priority 100        ##优先级自定义,MASTER高于BACKUP即可
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {    
        10.18.11.40        #VIP
        }
}
 
virtual_server 10.18.11.40 80 {        #VIP和端口
    delay_loop 6
    lb_algo rr        #负载调度算法,RR为轮询
    lb_kind DR        #LVS负载工作模式为DR
    nat_mask 255.255.255.0
    persistence_timeout 50         #会话保持时间,50秒内分配同一节点       
    protocol TCP        #协议类型UDP
 
    real_server 10.18.11.29 80 {
        weight 100        #权值大小,越大权值越高
        TCP_CHECK {         #realserver 状态检测
        connect_timeout 8        #连接超时时间8秒
        nb_get_retry 3        #重试次数:3次
        delay_before_retry 3        ##重试间隔3秒
        connect_port 80        #检测端口
        }
    }
 
    real_server 10.18.11.30 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}
                                                                                                                                                     57,1          30%
[root@localhost ~]# vim /etc/keepalived/keepalived.conf         #修改LVS-BACKUP配置
! Configuration File for keepalived
 
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_2
}
 
vrrp_instance VI_DNS1 {
    state backup        #状态为backup
    interface ens192
    virtual_router_id 51
    priority 90        #优先级比master低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.18.11.40
        }
}
 
virtual_server 10.18.11.40 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
 
    real_server 10.18.11.29 80 {
                                                                                                                                                     1,1          顶端
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.18.11.40
        }
}
 
virtual_server 10.18.11.40 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
#    persistence_timeout 1
    protocol TCP
 
    real_server 10.18.11.29 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
 
    real_server 10.18.11.30 80 {
        weight 100
        TCP_CHECK {
        connect_timeout 8
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
}


#在realserver服务器上执行该脚本
#!/bin/bash
SNS_VIP=10.18.11.40        
. /etc/rc.d/init.d/functions
case "$1" in
start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       route del $SNS_VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
exit 0


三、基于heartbeat v2 crm实现HA LAMP组合;要求,部署wordpress,用于编辑的文章中的任何数据在节点切换后都能正常访问;

node1.wordpress.com10.18.11.29LAMP+heartbeat
node2.wordpress.com10.18.11.30LAMP+heartbeat
node3.wordpress.com10.18.11.31NFS共享存储
  • 在node1和node2上安装heartbeat

#安装依赖包
yum install -y net-snmp-libs libnet PyXML pygtk2-libglade
#安装heartbeat
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
#配置heartbeat
cp /usr/share/doc/heartbeat-2.1.4/{ha.cf,haresources,authkeys} /etc/ha.d/
#将authkeys的权限改为600
chmod 600 authkeys 
#用openssl生成一个随机数
openssl rand -base64 6
vim /etc/ha.d/authkeys
auth 2
#1
crc
2 sha1 VidsD12a
#3
md5 Hello!
#编辑ha.cf文件

#debugfile /var/log/ha-debug 是否开启调试功能,已经调试功能的文件位置
logfile       
/var/log/ha-log 日志文件的保存位置
keepalive 2  每个多长时间发送一次心跳信息,默认单位为s,也支持以ms为单位
deadtime 30  在检测不到对方心跳,替换的时间
warntime 10   警告时间
initdead 120启动heartbeat后多长时间开始检查心跳
udpport 694  基于那个端口检测心跳信息
bcast eth0            # Linux  linux广播的端口
mcast eth0 225.0.10.1 694 1 0 多播的地址
ucast eth0 192.168.1.2 组播的地址
compression    bz2 压缩传输算法         on 主节点启动是否自动切换回主节点
ping 10.18.11.1 仲裁设备,可以指向网关
#debug 1debug的级别
compression_threshold 2压缩的最低大小,单位为kb
node node1.wordpress.com  
node2.workdpress.com
crm on 以crm的模块开启

#将配置文件拷到node2一份
scp /etc/ha.d/ha.cf /etc/ha.d/authkeys 10.18.11.30:/etc/ha.d

#安装 heartbeat-gui
yum install pygtk2-libglade xorg-x11-xauth  
rpm -ivh heartbeat-gui-2.1.4-12.el6.x86_64.rpm
echo 123456 |passwd --stdin        为用户hacluster创建密码

四、用Keepalived实现nginx与lvs的高可用集群;

第二题中已经实现