Lvs的三种模式:
NAT : Client -> VS -> DNAT -> RS -> VS -> SNAT -> Client
Tunnel : Client ->VS -> RS -> Client ,VS 和RS 之间要遵守隧道协议,且支持广域网
DR : Client -> Dip ->Vip
Fallnat : Client -> 公网 -> Router -> lvs ->nginx ->App -> DB
三种模式负载均衡方面比较:
下面给出LVS的基本实现方法,具体算法不再一一演示其功能:
新建一个2048M的虚拟机,并且给他加一块20G的虚拟磁盘
fdisk -l
对该磁盘进行分区:
[root@server6 ~]# fdisk -cu /dev/vda
扩展根区域:
[root@server6 ~]# pvcreate /dev/vda1
[root@server6 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
VolGroup 1 2 0 wz--n- 7.51g 0
[root@server6 ~]# vgextend VoGroup /dev/vda1
[root@server6 ~]# lvs
LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert
lv_root VolGroup -wi-ao---- 6.71g
lv_swap VolGroup -wi-ao---- 816.00m
[root@server6 ~]# lvextend -L +20g /dev/VolGroup/lv_root
Extending logical volume lv_root to 26.71 GiB
Insufficient free space: 5120 extents needed, but only 5119 available
[root@server6 ~]# lvextend -l +5119 /dev/VolGroup/lv_root
Extending logical volume lv_root to 26.71 GiB
Logical volume lv_root successfully resized
[root@server6 ~]# resize2fs /dev/VolGroup/lv_root
[root@server6 ~]# df -h
扩展完成后,安装内核kernel-2.6.32-220.23.1.el6.src.rpm:
[root@server6 ~]# rpm -ivh kernel-2.6.32-220.23.1.el6.src.rpm
[root@server6 rpmbuild]# cd SPECS/
[root@server6 SPECS]# ls
kernel.spec
[root@server6 SPECS]# yum install -y rpm-build
对内核进行源码编译:
[root@server6 SPECS]# rpmbuild -bp kernel.spec
安装编译过程中需要的软件后再次编译:
[root@server6 SPECS]# yum install -y gcc redhat-rpm-config patchutils xmlto asciidoc elfutils-libelf-devel zlib-devel binutils-devel newt-devel python-devel perl-ExtUtils-Embed hmaccalc
[root@server6 SPECS]# rpmbuild -bp kernel.spec
此时,需要的安装包是yum仓库中没有的包,需要在官网上下载:
[root@server6 SPECS]# yum install -y ~/asciidoc-8.4.5-4.1.el6.noarch.rpm ~/newt-devel-0.52.11-3.el6.x86_64.rpm
解决依赖性后,再次编译:
[root@server6 SPECS]# yum install -y ~/asciidoc-8.4.5-4.1.el6.noarch.rpm ~/newt-devel-0.52.11-3.el6.x86_64.rpm ~/slang-devel-2.2.1-1.el6.x86_64.rpm
[root@server6 SPECS]# rpmbuild -bp kernel.spec
当编译时卡在这时:
需要ssh到server6,安装这个软件,并执行这条命令
[root@server6 ~]# yum install rng-tools -y
[root@server6 ~]# rngd -r /dev/urandom
完成这两步后,另一边就自动完成编译。
[root@server6 ~]# tar zxf Lvs-fullnat-synproxy.tar.gz
[root@server6 ~]# cd lvs-fullnat-synproxy/
[root@server6 lvs-fullnat-synproxy]# ls
lvs-2.6.32-220.23.1.el6.patch README
lvs-tools.tar.gz toa-2.6.32-220.23.1.el6.patch
[root@server6 lvs-fullnat-synproxy]# cp lvs-2.6.32-220.23.1.el6.patch ~/rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64/
[root@server6 lvs-fullnat-synproxy]# cd
[root@server6 ~]# cd ~/rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64/
打补丁:
[root@server6 linux-2.6.32-220.23.1.el6.x86_64]# patch -p1 < lvs-2.6.32-220.23.1.el6.patch
比较两个文件的不同:
[root@server6 linux-2.6.32-220.23.1.el6.x86_64]# diff .config configs/kernel-2.6.32-x86_64.config
0a1
> # x86_64
770c771
< CONFIG_IP_VS_TAB_BITS=22
---
> CONFIG_IP_VS_TAB_BITS=12
[root@server6 linux-2.6.32-220.23.1.el6.x86_64]# vim Makefile
用两个CPU进行编译:
[root@server6 linux-2.6.32-220.23.1.el6.x86_64]# make -j2
编译完成后,进行模块安装:
[root@server6 linux-2.6.32-220.23.1.el6.x86_64]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 27G 8.4G 17G 34% /
tmpfs 939M 0 939M 0% /dev/shm
/dev/sda1 485M 33M 427M 8% /boot
[root@server6 linux-2.6.32-220.23.1.el6.x86_64]# make modules_install
[root@server6 linux-2.6.32-220.23.1.el6.x86_64]# make install
[root@server6 linux-2.6.32-220.23.1.el6.x86_64]# cd /boot/grub/
[root@server6 grub]# vim grub.conf
[root@server6 grub]# reboot
查看内核版本:
[root@server6 ~]# uname -r
2.6.32-220.23.1.el6
[root@server6 ~]# ll -d /lib/modules/`uname -r`/build
lrwxrwxrwx 1 root root 80 7月 20 11:05 /lib/modules/2.6.32-220.23.1.el6/build -> /root/rpmbuild/BUILD/kernel-2.6.32-220.23.1.el6/linux-2.6.32-220.23.1.el6.x86_64
安装keepalived:
[root@server6 ~]# cd lvs-fullnat-synproxy/
[root@server6 lvs-fullnat-synproxy]# ls
lvs-2.6.32-220.23.1.el6.patch README
lvs-tools.tar.gz toa-2.6.32-220.23.1.el6.patch
[root@server6 lvs-fullnat-synproxy]# tar zxf lvs-tools.tar.gz
[root@server6 lvs-fullnat-synproxy]# ls
lvs-2.6.32-220.23.1.el6.patch README tools
lvs-tools.tar.gz toa-2.6.32-220.23.1.el6.patch
[root@server6 lvs-fullnat-synproxy]# cd tools/
[root@server6 tools]# ls
ipvsadm keepalived quagga rpm
[root@server6 tools]# cd keepalived/
[root@server6 keepalived]# ./configure --with-kernel-dir="/lib/modules/`uname -r`/build"
[root@server6 keepalived]# yum install openssl-devel popt-devel -y
[root@server6 keepalived]# ./configure --with-kernel-dir="/lib/modules/`uname -r`/build"
[root@server6 keepalived]# make
[root@server6 keepalived]# make install
[root@server6 keepalived]# which keepalived
/usr/local/sbin/keepalived
[root@server6 keepalived]# cd /usr/local/etc/
[root@server6 etc]# ls
keepalived rc.d sysconfig
[root@server6 etc]# cd keepalived/
[root@server6 keepalived]# ls
keepalived.conf samples
安装ipvsadm:
如果之前安装过ipvsadm,需要将之前安装的先卸载掉,然后重新编译。
[root@server6 ~]# cd lvs-fullnat-synproxy/tools/
[root@server6 tools]# ls
ipvsadm keepalived quagga rpm
[root@server6 tools]# cd ipvsadm/
[root@server6 ipvsadm]# make
[root@server6 ipvsadm]# make install
[root@server6 ipvsadm]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4194304)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
IPVS已经实现了八种LVS的负载调度算法,分别是:轮叫调度,加权轮叫调度,最小连接调度,加权最小连接调度,基于局部性的最少链接调度,带复制的基于局部性的最少链接调度,目标地址散列调度以及源地址散列调度。