LVS高性能集群  ====负载均衡硬件设备

1、什么是LVS?
  linux virtual service,linux虚拟服务,使用多台服务器一起工作来提高服务的访问和处理性能
 
2、lvs的工作模式
  (1)nat:通过地址转换访问服务
  (2)tun:通过IP隧道访问服务
  (3)dr:直接调度访问服务  ====直接路由调度

1.轮寻    
2.加权,根据硬件的好坏来设置权值  
3.最小连接
4. 加权最小连接
5. 基于地址的最小连接调度
6. 目标
7. 源    

   
3、调度算法
  rr:轮询调度
 wrr:加权轮询调度
  lc:最小连接数调度
 wlc:加权最小连接调度
  dh:目标地址散列算法,以目标地址为关键字来查找一个静态的hash表来选择RS
  sh:源地址散列算法,以源地址为关键字来查找一个静态的hash表来选择RS
lblc:基于地址的最小连接数调度
 

4、LVS的NAT模式配置
 (1)客户端配置
    ip地址
    网关
   
 (2)防火墙配置
    ip地址
    启用路由转发
    配置NAT
   
 (3)Director服务器配置
   配置ip地址
    配置网关
    配置调度表
   
 (4)RS服务器配置
    配置ip地址
    配置网关
    启动相应服务

socket===把套接字放在一个文件然后用文件来连接
cookie ===保存用户的信息
session===保持客户机与服务器状态

(5)lvs的持久性连接
    PCC(persistent client connecttions)方式:将来自于同一个客户端对所有端口的请求,
    始终定向到上次选择的RS,缺点是不能实现不同的服务请求访问不同的RS。

    # ipvsadm -A -t 10.0.5.150:0 -s rr -p 600
    # ipvsadm -a -t 10.0.5.150:0 -r 10.0.5.151 -m
    # ipvsadm -a -t 10.0.5.150:0 -r 10.0.5.152 -m
   
    PPC(persistent port connecttions)方式:将来自于同一个客户端对同一个集群服务的请求
    ,始终定向到上次选定的RS

    # ipvsadm -A -t 10.0.5.150:80 -s rr -p 600
    # ipvsadm -a -t 10.0.5.150:80 -r 10.0.5.151:80 -m
    # ipvsadm -a -t 10.0.5.150:80 -r 10.0.5.152:80 -m
   
    PNMPP(persistent Netfilter Marked Packet Persistence):持久防火墙标记连接,
    根据iptables的标记规则,将相关的服务标记为同一类别的请求

    # iptables -t mangle -A PREROUTING -d 10.0.5.150 -p tcp --dport 80
      -j MARK --set-mark 10 (0-->99)
    # iptables -t mangle -A PREROUTING -d 10.0.5.150 -p tcp --dport 443
      -j MARK --set-mark 10 (0-->99)
     
    # iptables -t mangle -A PREROUTING -d 10.0.5.150 -p tcp --dport 21
      -j MARK --set-mark 20 (0-->99)
    # iptables -t mangle -A PREROUTING -d 10.0.5.150 -p tcp --dport 20
      -j MARK --set-mark 20 (0-->99)
 
    # ipvsadm -A -f 10 -s wrr -p 600
      # ipvsadm -A -f 20 -s wrr -p 600
    # ipvsadm -a -f 10 -r 10.0.5.151 -m -w 2
    # ipvsadm -a -f 10 -r 10.0.5.152 -m -w 3
    # ipvsadm -a -f 20 -r 10.0.5.153 -m -w 2
    # ipvsadm -a -f 20 -r 10.0.5.154 -m -w 3
         
   -w====权值
   nat模式的缺点
只能承载流量小
结构上看调度服务器


5、LVS的DR模式

RS真实服务器回应:以调度服务器地址为原地址向防火墙回应

调度服务器目标IP不改,目标MAC地址改变


(1)客户端配置
     ip地址
     网关
     
  (2)防火墙配置
     ip地址
     启用路由转发
     配置NAT 

service httpd stop  
     
  (3)调度服务器配置
     ip地址
     配置调度表
     配置网关

地址改下
 service httpd stop  vim /etc/sysctl.
     
  (4)真实服务器配置
     ip地址
     禁用真实服务器的arp广播和回应

 1.    # vim /etc/sysctl.conf
     net.ipv4.conf.lo.arp_ignore = 1
     net.ipv4.conf.lo.arp_announce = 2
     net.ipv4.conf.all.arp_ignore = 1
     net.ipv4.conf.all.arp_announce = 2
     
 2.    # rpm -ivh arptables_jf*
     # arptables -A IN -d 172.16.10.10 -j DROP
     # ifconfig lo:0 172.16.10.10 netmask 255.255.255.0 broadcast 172.16.10.10

开启路由转发  vim /etc/sysctl.conf
     
     添加网关 172.16.20.1

 RS服务器虚拟IP可以在环回接口或者子接口配置

验证:

DR 模式优缺点
调度服务器单点负照===?
真实服务器坏了 调度服务器不能得到回应
优点:回包流量不经过前端服务器
缺点:由于修改二层封装,无法跨网段访问


6、keepalived+lvs实现高可用、高性能集群
  (1)安装keepalived


# ./configure --prefix=/usr/local/keepalived --enable-snmp --enable-profile --with-kernel-version=2.6 --sysconfdir=/etc
    # make && make install
   
(2)配置keepalived
    # cd /etc/keepalived
    # vim keepalived.conf
global_defs {
  notification_email {
       [email protected]
  }
  notification_email_from [email protected]
  smtp_server 127.0.0.1
  smtp_connect_timeout 30
  router_id lvs-s1
}

vrrp_instance VI_1 {
   state MASTER   ==========
   interface eth0
   virtual_router_id 30
   priority 100   ===============
   advert_int 1
   authentication {
       auth_type PASS
       auth_pass aixocm
   }
   virtual_ipaddress {
       172.16.10.10/24 dev eth0
   }
}
virtual_server 172.16.10.10 80 {
   delay_loop 3
   lb_algo wrr
   lb_kind DR
   nat_mask 255.255.255.0
   persistence_timeout 60
   protocol TCP

   real_server 172.16.20.20 80 {
       weight 2
       TCP_CHECK {
           connect_timeout 3
           nb_get_retry 3
           delay_before_retry 3
           connect_port 80
       }
   }

   real_server 172.16.20.30 80 {
       weight 3
       TCP_CHECK {
           connect_timeout 3
           nb_get_retry 3
           delay_before_retry 3
           connect_port 80
       }
   }
}

# vim /etc/sysconfig/keepalived
 KEEPALIVED_OPTIONS="-D -f /etc/keepalived/keepalived.conf"

7、heartbeat+ldirector+lvs实现高可用集群
 (1)安装软件

   # yum install PyXML resource-agents ipvsadm perl-MailTools perl-Net-SSLeay perl-libwww-perl perl-TimeDate perl-MailTools perl-Net* perl-IO-Socket* perl-Socket* cifs-utils PyXML nfs-utils
   
   # yum install cluster-glue cluster-glue-libs
   
   # rpm -ivh heartbeat-3.0.4-1.el6.x86_64.rpm heartbeat-devel-3.0.4-1.el6.x86_64.rpm heartbeat-libs-3.0.4-1.el6.x86_64.rpm ldirectord-3.9.2-2.fc17.1.x86_64.rpm

(2)配置heartbeat
   # vim authkeys   \\主备服务器之间进行通信的密钥配置文件
     auth 3
     3 md5 aixocm!
   
   # chmod 600 authkeys


# vim ha.cf     \\主配置文件文件
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
ucast eth1 192.168.10.2  另外一台IP
auto_failback on
node Kenasel   ======= uname -n
node server2
ping 10.0.2.253
respawn hacluster /usr/lib64/heartbeat/ipfail    =====32位就LIB
apiauth ipfail gid=haclient uid=hacluster
deadping 30
#apiauth ipfail uid=hacluster
#apiauth default gid=haclient
conn_logd_time 60
compression bz2
compression_threshold 2

   (3)配置haresource资源配置文件
    # vim haresources
Kenasel IPaddr::10.0.5.200/16/eth0:0 ldirectord::/etc/ha.d/ldirectord.cf

ldirectord脚本放在/etc/ha.d/resource.d

 (4)配置ldirectord进行lvs调度
    # vim ldirectord.cf
checktimeout=3
checkinterval=1
autoreload=yes
logfile="/var/log/ldirectord.log"
logfile="local0"
emailalert="[email protected]"
emailalertfreq=3600
emailalertstatus=all
quiescent=no

virtual=10.0.5.200:80
       real=10.0.5.10:80 gate 2
       real=10.0.5.11:80 gate 3
       service=http
       scheduler=wrr
       persistent=300
       netmask=255.255.255.255
       protocol=tcp
       checktype=negotiate
       checkport=80
       request="test.html"
       receive="ok!"
 
 备份服务器只需改下ucast
 8、heartbeat+iscsi+mysql实现高可用

资源迁移 IP 服务 磁盘
磁盘共享方式

(1)安装iscsi服务器端软件

  # yum install scsi-target-utils
 
  (2)设置配置文件进行iscsi共享
  # vim /etc/tgt/targets.conf
 
       backing-store /dev/sdb1
       incominguser admin aixocm
       initiator-address 10.0.5.100
       initiator-address 10.0.5.101
       write-cache on
       MaxConnections 2
 

 #service tgtd start
# tgt-admin -show

lun===逻辑单元号

(3)客户端挂载设置
  安装客户端软件

  # yum install iscsi-initiator-utils
 
  配置客户端认证
  # vim /etc/iscsi/iscsid.conf
  node.session.auth.authmethod = CHAP
  node.session.auth.username = admin   === 扫描使用
  node.session.auth.password = aixocm
  node.session.auth.username_in = admin  ====挂载使用
  node.session.auth.password_in = aixocm
 
   /var/lib/ssicsi  ===数据都保存在这,报错把这删掉重新挂载
   
   # service iscsi start
   # service iscsid start
   资源迁移时时间要同步
   
   rdate -s 10.0.2.253
   
   
   扫描服务器的iscsi共享
  # iscsiadm -m discovery -t sendtargets -p 10.0.2.220
 
  挂载iscsi共享磁盘
   # iscsiadm -m node -T iqn.2015-07-30.sxjy.com:mysql -p 10.0.2.220 -l
 
  卸载iscsi共享磁盘
  # iscsiadm -m node -T iqn.2015-07-30.sxjy.com:mysql -p 10.0.2.220 -u
 
   
   
   # vim haresources
Kenasel IPaddr::10.0.5.200/16/eth0:0 filesystem::/database/mydata::ext4 mysqld
   
   ===filesystem,mysqld都为脚本

  9、heartbeat+DRBD+mysql实现高可用
  (1)安装DRBD

    # yum install kernel kernel-devel flex
     # ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --with-utils --with-km --with-udev --with-xen --with-pacemaker --with-heartbeat --with-bashcompletion --with-distro=redhat --with-initdir=/etc/init.d
     
    # make && make install
   
    # modprobe drbd
   
    lsmod | grep brbd
     (2)配置DRBD
   

   
   # vim global_common.conf
global {
       usage-count yes;
}

common {
       handlers {
               pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
               pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
               local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
       }

       startup {
       }

       options {
       }

       disk {
               on-io-error detach;
       }

       net {
               protocol C;
               after-sb-0pri disconnect;
               after-sb-1pri disconnect;
               after-sb-2pri disconnect;
               rr-conflict disconnect;
               cram-hmac-alg sha1;
               shared-secret "aixocm";
       }
       
       
        syncer {
               rate 50M;
       }
}
# vim r0.res
resource r0 {
       on server1
       {
               device /dev/drbd0;
               disk /dev/sdb1;
               address 10.0.5.100:7788;
               meta-disk internal;
       }

       on server2
       {
               device /dev/drbd0;
               disk /dev/sdb1;
               address 10.0.5.101:7788;
               meta-disk internal;
       }
}

  (3)创建DRBD资源
  # drbdadm create-md r0   两边都要做
  # service drbd start    \\主从服务器同时启动
 # cat /proc/drbd        \\查看DRBD状态
 
  (4)将其中一台提升为主设备
  # drbdsetup /dev/drbd0 primary --o
 
  (5)格式化drbd设备
  # mkfs.ext4 /dev/drbd0  一台操作就行
 
  (6)挂载设备到需要的特定目录
  # mount /dev/drbd0 /database/mydata
   
   (7)配置heartbeat的haresource文件
  server1 IPaddr::10.0.5.200/32/eth0:0 drbddisk::r0 Filesystem::/dev/drbd0::/database/mydata::ext4 mysqld
 
  (8)drbd的升级和降级处理
  # umount /dev/drbd0  从服务器不能挂载 所以降级前卸载
  # drbdadm secondary r0  \\降级
 
  # drbdadm primary r0
  # mount /dev/drbd0 /database/mydata