LVS架构实战

lvs实战


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

  • 功用:根据请求报文的目标IP和目标port将其调度转发至后端的某主机上,作用在OSI网络模型中的第四层
  • LVS有四种集群类型,分别是:

    • (一)lvs-nat:多目标的DNAT,根据请求报文中的目标地址和目标端口,在input链上对报文进行调度,将报文转发给后端的RS集群
    • LVS架构实战_第1张图片
    • (二)lvs-dr:通过为请求报文重新封装一个Mac首部进行转发,源Mac是DIP所在的接口的Mac,目标Mac是挑选出某RS的RIP所在接口的Mac地址,IP首部不会发生变化(IP首部为:CIP<—>VIP)
    • LVS架构实战_第2张图片
    • (三)lvs-tun:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是源IP首部之外在封装一个IP首部(源IP为DIP,目标IP为RIP)

    • (四)lvs-fullnat:通过同时修改请求报文的源IP地址(CIP–>DIP)和目标IP地址(VIP–>RIP)进行转发

2、搭建一套LVS-DR模型的高性能集群,并实现以下功能:
(1)、wordpress程序通过nfs共享给各个realserver;
(2)、后端realserver中的nginx和php分离

  • 试验前提:这里由于知识有限,将VIP, DIP , RIP都设置为桥接,且在同一个网络,其实这样做就失去了lvs-dr模型的真实的意义,因为用户请求的是Director主机上的VIP,而VIP是Director主机上DIP的一个别名,DIP是Director网卡的真实IP地址,只是起到一个为请求VIP的报文经过ipvs-dr模型调度之后,从DIP所在的网卡中出去的作用,这时的请求报文外面封装了一个Mac首部,源Mac地址为MAC_VIP,目标Mac地址为MAC_RIP,且后端的RS主机的RIP与DIP在同一个网络中,因此报文只能发给RS,RS接到报文后发现目标Mac地址就是自己的Mac地址,就直接解开Mac首部,发现目标IP为VIP,本地的lo地址回环的别名为VIP就这样响应了。但是响应报文的源IP地址为VIP,目标IP地址为CIP,这样需要搭建路由器,使得内网的IP报文能够发送到公网才行,不能原路返回。那么这里使用的是桥接,就是没有考虑RIP为内网IP的情况,试验过程都是本地的局域网,响应报文就直接发给客户端了,因此失去了其真实的ipvs-dr模型的意义。但是真实场景中只有VIP是一个公网地址,而DIP和RIP都是私网地址,私网地址照样可以通过添加路由器的方式响应报文(出网)对于ipvs-dr模型的理解,最为困难的就是对于网络的理解,因为没有动手搭建过路由设备,对路由设备的理解甚少,以后这方面需要多加强
  • 试验环境:
    LVS架构实战_第3张图片
  • 试验步骤:按图所示,先在各个主机上部署安装需要的服务
  • (一):在php-NFS服务器上,创建nginx用户和组,与Nginx服务器中的一样,再创建共享的目录,
# 创建共享的目录,上传WordPress源码
mkdir -pv /apps/php/
unzip wordpress.zip 
mv wordpress/* ./

# 创建nginx用户和组
groupadd -g 985 nginx
useradd -u 990 -g nginx nginx

# 设置共享目录的访问权限,使得在Nginx服务器上的nginx进程可以访问共享目录,具有对应的读写权限
chown -R nginx php

# 编辑/etc/exports文件
/apps/php    192.168.23.0/24(rw,no_root_squash)

# 让内核重读共享目录的配置文件
exportfs -r 

# 编辑/etc/php-fpm.d/www.conf配置文件
listen = 192.168.23.13:9000
;listen.allowed_clients = 127.0.0.1
user = nginx
group = nginx

# 启动php和NFS服务
systemctl start php-fpm nfs

# 修改WordPress配置文件
mv /apps/php/wp-config-sample.php /apps/php/wp-config.php 
vi /apps/php/wp-config.php

/** WordPress数据库的名称 */
define('DB_NAME', 'wp');

/** MySQL数据库用户名 */
define('DB_USER', 'wp_user');

/** MySQL数据库密码 */
define('DB_PASSWORD', '34958729348570~');

/** MySQL主机 */
define('DB_HOST', '192.168.23.14');
  • (二):配置MariaDB,通过mariadb自带的mysql_secure_installation对数据库初始化,登入mariadb创建wp数据库和给wp_user授权一个远程访问的用户
# 启动mariadb
systemctl start mariadb
mysql_secure_installation 
mysql -uroot -p
create database wp;
grant all on wp.* to wp_user@'192.168.23.%' identified by '394584723975~';
flush privileges;
select user,host,password from mysql.user;
显示:wp_user | 192.168.23.% | *DD5143776C2C77C09429E28D2F1784F06C39F2A4
  • (三):配置Nginx,两台Nginx服务器一同配置
# 编辑/etc/nginx/nginx.conf配置文件
        listen       80;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
             root    /apps/php/;
             index   index.php index.html index.htm;
        }
        location ~ \.php$ {
            fastcgi_pass 192.168.23.13:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /apps/php/$fastcgi_script_name;
            include fastcgi_params;
        }
# 将配置文件拷贝一份到Nginx2对应的目录中
scp -p /etc/nginx/nginx.conf root@192.168.23.12:/etc/nginx/nginx.conf

# 在本地文件系统上创建/apps/php/{index.html,index.php}
mkdir -pv /apps/php
touch /apps/php/{index.html,index.php}

# 查看php-NFS服务器的共享目录
showmount -e 192.168.23.13
显示:Export list for 192.168.23.13:
     /apps/php 192.168.23.0/24

# 挂载共享目录
mount -t nfs 192.168.23.13:/apps/php/ /apps/php

# 查看挂载
mount 

# 开启nginx 服务
nginx

# 如果Nginx是编译安装的,在/etc/init.d/nginx写一个Nginx服务脚本,实现chkconfig管理开启自启
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemin
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# pidfile:     /usr/local/nginx/logs/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/opt/application/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/opt/application/nginx/conf/nginx.conf"lockfile=/var/lock/subsys/nginx
start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
restart() {
    configtest || return $?
    stop
    start
}
reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}
force_reload() {
    restart
}
configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
    status $prog
}
rh_status_q() {
    rh_status >/dev/null 2>&1
}
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

在这里已经实现了共享存储,下面的步骤就是配置IPVS-DR模型
LVS架构实战_第4张图片

  • (四)在Director主机上
# 给enp0s3网卡设置一个别名,别名的IP地址为VIP, 使得VIP可以响应请求,但是不对本地进行广播,因此可以避免IP冲突
ifconfig enp0s3:0 192.168.23.102 netmask 255.255.255.255 broadcast 192.168.23.102

# 设置ipvs-dr规则
ipvsadm -A -t 192.168.23.102:80 -s rr 
ipvsadm -a -t 192.168.23.102:80 -r 192.168.23.11 -g -w 1 
ipvsadm -a -t 192.168.23.102:80 -r 192.168.23.12 -g -w 2
  • (四)分别在Nginx的主机上设置,Nginx1和Nginx2一样
# 写一个脚本控制arp_ignore和arp_announce的值,enp0s3和lo两个接口都要进行控制,arp.sh脚本如下
#!/bin/bash 
# 
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
;;
stop)
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
;;
esac

# 运行脚本
bash arp.sh start

# 在设置了接口的arp_ignore和arp_announce值之后,再在lo本地网卡添加别名,绑定VIP
ifconfig lo:0 192.168.23.102 netmask 255.255.255.255 broadcast 192.168.23.102

# 给进来的报文设置一个入栈路由条目,入口和出口为 192.168.23.102 这样就使得目标IP为lo:0的IP,即VIP,而不会是RIP
route add -host 192.168.23.102 dev lo:0

3:在第二题的基础上增加一个keepalived 高可用ipvs集群

  • 思路:在Director服务器上VIP是通过绑定在enp0s3上的别名,现在使用keepalived服务,部署两台Director,实现Director的高可用
  • 试验环境
    LVS架构实战_第5张图片
  • 试验步骤
  • 将Diretor的VIP删除,分别在两台Director中yum安装keepalived,编译/etc/keepalived/keepalived.conf 文件,记得区别两台Director的MASTER和BAKUP,
! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id node1
   vrrp_mcast_group4 224.0.0.18
}

vrrp_instance VI_1 {
    # 这里如果是备用的Director,要改为BACKUP
    state MASTER
    interface enp0s3
    virtual_router_id 51
    # 这里如果是备用的Director,要改为优先级比100低,取90
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
    # 这里需要改为后端的RS定义的vip    
        192.168.23.102
    }

    notify_master "/root/notify.sh master"
    notify_backup "/root/notify.sh backup"
    notify_fault "/root/notify.sh fault"
}

# 这里的virtual_server的IP就是两个高可用主机间漂移的虚拟IP
virtual_server 192.168.23.102 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP
    sorry_server 127.0.0.1 80
    real_server 192.168.23.11 80 {
        weight 1
        HTTP_GET {
            url {
              path /
          status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.23.12 80 {
        weight 1
        HTTP_GET {
            url {
              path /
          status_code 200
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

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

  • 试验环境:
    • node1:192.168.23.31 提供heartbeat服务,hb_gui 定义资源组 ,服务资源
    • node2:192.168.23.32 提供heartbeat服务,服务资源
    • node3:192.168.23.33 提供NFS共享存储
  • 试验步骤
    • (一)试验前准备工作
      • 1:节点时间必须同步:使用ntp协议实现
      • 2:节点间需要通过主机名互相通信,必须能够解析主机名至IP地址,主机名解析定义在/etc/hosts文件中
      • 3:两台高可用集群,使用 ping node 仲裁设备
      • 4:建立节点之间的root用户能够基于密钥认证
    • (二)在node1和node2上
      • 1:yum安装heartbeat服务依赖的包
        • yum install -y net-snmp-libs libnet PyXML pygtk2-libglade
      • 2:上传heartbeat包,解压,安装本地RPM包
        • 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
      • 3:在/usr/share/doc/heartbeat-2.1.4/目录下拷贝ha.cf,haresources,authkeys三个文件至/etc/ha.d/目录下
        • cp /usr/share/doc/heartbeat-2.1.4/{ha.cf,haresources,authkeys} /etc/ha.d/
      • 4:将authkeys的权限改为600,避免heartbeat无法启动
        • chmod 600 /etc/ha.d/authkeys
    • (三)配置文件ha.cf,haresources,authkeys进行编辑
      • 1:编辑/etc/ha.d/authkeys文件,设定heartbeat传递心跳信息的算法和密钥
        • 添加:
          • auth 2
          • 2 sha1 WfpBxC/WzXIWsqt5zNVMTA
      • 2:编辑/etc/ha.d/ha.cf文件,设定节点信息,并且开启heartbeat的CRM功能,禁用haresources资源管理器
        • logfile /var/log/heartbeat
          mcast eth0 225.0.0.1 694 1 0
          node node1
          node node2
          ping 192.168.23.1
          crm on
      • 3:将所有的配置文件拷贝一份到node2对应的目录下
        • scp -p /etc/ha.d/{authkeys,ha.cf} node2:/etc/ha.d/
    • (四)在node1上
      • 1:安装hb_gui图形资源管理器
        • rpm -ivh heartbeat-gui-2.1.4-12.el6.x86_64.rpm
      • 2:由于在Mac上使用的ssh远程连接客户端为CRT,无法调用图形界面,因此在node1上安装图形界面
        • yum groupinstall -y "X Window System" "Desktop"
      • 3:给hacluster用户设置一个登入秘密
        • echo "yhy3426356" | passwd --stdin hacluster
    • (五)在node1和node2上开启heartbeat
      • service heartbeat start
    • (六)在node1的图形界面的终端上运行heartbeat的CRM资源管理器
      • hb_gui &
    • (七)HA LAMP 资源准备
      • 1:在node1 和 node2 yum 安装 httpd 、php 、 php-mysql , nfs-utils , 二进制安装mysql
          -
      • 2:在node3上安装nfs-utils
      • 3:在node3上,设置共享目录/mydata,并且在/mydata目录下,两个目录,一个用于mysql的数据目录,一个用于httpd的页面资源目录,这样可以保证再CRM节点切换的时候,所有的数据都不会丢失
        • mkdir -vp /mydata/{data,html}
        • groupadd -r -g 306 mysql
        • useradd -r -g mysql -u 306 mysql
        • chown -R mysql.mysql /mydata/data/
        • vi /etc/exports
          • /mydata 192.168.23.0/24(rw,no_root_squash)
        • exportfs -avr
        • cd /mydata/html/ 上传WordPress源码包到此目录,解压
        • service nfs start
        • 在WordPress的配置文件中设置数据库登入等信息
      • 4:在node1 上
        • groupadd -r -g 306 mysql
        • useradd -r -g mysql -u 306 mysql
        • tar xf mariadb-5.5.54-linux-x86_64.tar -C /usr/local 解压mariadb二进制包到/usr/local下
        • cd /usr/local/
        • ln -vs mariadb-5.5.54-linux-x86_64 mysql
        • chown -R root.mysql mysql/*
        • cd mysql
        • cp ./support-files/my-large.cnf /etc/my.cnf
        • cp ./support-files/mysql.server /etc/init.d/mysqld
        • vi /etc/my.cnf
          • skip_name_resolve = ON
            datadir = /mydata/data
            innodb_file_per_table = ON
        • mkdir -pv /mydata/{data,html}
        • mount -t nfs 192.168.23.33:/mydata /mydata
        • ./scripts/mysql_install_db --datadir=/mydata/data/ --user=mysql
        • service mysqld start
        • 登入mysql,创建一个wp数据库,并且授权用户wp_user可以远程登入
      • 5:在node2上
        • 除了对数据目录初始化外,其他都和node1操作一样
        • 并测试mysql可以登入成功
      • 6:在node1上修改httpd的配置文件
        • 修改DocumentRoot 以及 Directory
        • 本地测试无误
      • 7:启动heartbeat,并在node1的图形界面中登入hb_gui
        • 添加LAMP资源
          • LVS架构实战_第6张图片
          • LVS架构实战_第7张图片
        • 切换node2为备用节点
          • LVS架构实战_第8张图片
          • LVS架构实战_第9张图片
  • 试验完毕,实现了节点之间的切换后数据可访问,可写
  • 试验注意点:
    • 1:记得将nfs的html目录中的WordPress配置文件提前设置好
    • 2:mysql数据库,在创建之后记得使用mysql_secure_installation脚本给root用户设置密码,如果没有给root设置密码,即使授权了一个可远程登入的用户,也无法登入的,这点要注意

5、基于LVS-NAT模型,设计一套负载均衡集群,使用原地址哈希调度策略实现会话保存,使用NFS实现RS的共享存储

  • 试验环境:
    LVS架构实战_第10张图片

  • 试验步骤

  • (一):按图所示,先部署好如图所示的服务器,将需要安装的服务使用yum安装好,并且设置对应的IP地址
  • (二):在Directory服务器上添加ipvs规则
    • ipvsadm -A -t 192.168.23.12:80 -s sh
    • ipvsadm -a -t 192.168.23.12:80 -r 192.168.10.11:80 -m -w 1
    • ipvsadm -a -t 192.168.23.12:80 -r 192.168.10.22:80 -m -w 1
  • (三):在Nginx1服务器上,将网关IP地址设置为DIP:192.168.10.254,修改/etc/nginx/nginx.conf文件,并且将主配置文件拷贝一份到另一台Nginx的主机上,并且的本地文件系统创建/apps/php/{index.html,index.php}两个文件,在两个文件中分别添加需要测试的内容,最后启动Nginx服务(注意:必须在/apps/php/目录下有index.php文件,如果没有,那么当客户端访问域名或IP地址时,显示的是index.html文件的测试页)
    # 需要修改的部分
    server {
        listen       80;
      #  server_name  _;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            root    /apps/php/;
            index   index.php index.html index.htm;
        }
        location ~ \.php$ {
            fastcgi_pass 192.168.10.33:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /apps/php/$fastcgi_script_name;
            include fastcgi_params;
        }
  • (四)在NFS服务器上,创建/apps/php/目录,并且下载WordPress程序到目录中,解压,并且将所有的文件剪切到/apps/php/目录中,创建nginx用户和nginx组,且uid 和 gid 应与php-fpm服务器的nginx的uid 和 gid 一样,并且设置/apps/php/目录及其子目录的属主和属组都是nginx,编辑/etc/exports文件,设置共享目录和允许挂载的客户端IP地址,并且设置权限,并且修改WordPress的配置文件,指定数据库主机等
# 创建nginx用户和nginx组,且uid 和 gid 应与php-fpmbash服务器的nginx的uid 和 gid 一样
groupadd -g 1000 nginx
useradd -u 1000 -g nginx nginx 

# 编辑/etc/exports文件,设置共享目录和允许挂载的客户端IP地址,并且设置权限
/apps/php  192.168.10.0/24(rz,no_root_squash)

# 让内核重读配置文件
exportfs -r
  • (五)在php-fpm主机上,修改主配置文件/etc/php-fpm.d/www.conf,在本地文件系统中创建/apps/php/目录,用来挂载NFS共享服务器中的共享目录 ,并且创建nginx的属主和属组
# 修改服务监听的IP地址
listen = 192.168.10.33:9000

# 将允许访问的客户端这一行指令注释,表示任何主机都可以访问 
;listen.allowed_clients = 127.0.0.1

# 让php-fpm服务以nginx的属主和主组的身份运行
user = nginx
group = nginx
  • (六)启动mariadb,通过mariadb自带的mysql_secure_installation对数据库初始化,登入mariadb创建wp数据库和给wp授权一个远程访问的用户
  • (七)这里没有考虑nginx的动静分离,如果希望访问是可以加载CSS代码,最愚蠢的方式就是将WordPress代码在nginx主机的/apps/php/目录下再复制一份

你可能感兴趣的:(linux自动化运维)