# 负载均衡 LVS 入门与实践
# 一、 安装 MySQL5.7
| |
| [root@db01 ~] |
| |
| |
| [root@db01 ~] |
| |
| |
| [root@db01 ~] |
| |
| |
| [root@db01 ~] |
| Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name |
| tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3788/sshd |
| tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 4018/master |
| tcp6 0 0 :::3306 :::* LISTEN 4628/mysqld |
| tcp6 0 0 :::22 :::* LISTEN 3788/sshd |
| tcp6 0 0 ::1:25 :::* LISTEN 4018/master |
| |
| |
| [root@db01 ~] |
| |
| |
| [root@db01 ~] |
| |
| |
| mysql> ALTER USER 'root'@'%' IDENTIFIED BY 'passwd'; |
| mysql> grant all on *.* to 'app'@'192.168.40.%' identified by 'passwd'; |
# 二、 NFS 服务部署
| |
| [root@nfs ~] |
| |
| |
| [root@nfs ~] |
| /data 192.168.40.0/24(rw,sync,all_squash,anonuid=666,anongid=666) |
| |
| |
| [root@nfs ~] |
| [root@nfs ~] |
| [root@nfs ~] |
| [root@nfs ~] |
| |
| |
| [root@nfs ~] |
| |
| |
| 客户端也创建一个uid为666,gid为666,统一身份,避免后续出现权限不足的情况 |
| [root@backup mnt] |
| [root@backup mnt] |
| [root@nfs-client ~] |
| [root@nfs-client ~] |
| [root@nfs-client ~] |
| [root@nfs-client ~] |
| |
| |
| [root@nfs-client ~] |
# 三、 部署 web01
# 3.1 部署 Nginx
| |
| [root@web01 ~] |
| |
| |
| [root@web01 ~] |
| [root@web01 ~] |
| [root@web01 ~] |
| |
| |
| [root@web01 ~] |
# 3.2 部署 PHP7.1
| |
| [root@web01 ~] |
| |
| |
| [root@web01 ~] |
| |
| |
| [root@web01 ~] |
| |
| |
| [root@web01 ~] |
| [root@web01 ~] |
| [root@web01 ~] |
# 四、部署 web02
# 4.1 部署 Nginx
| |
| [root@web01 ~] |
| |
| |
| groupadd -g666 www |
| useradd -u666 -g666 www |
| sed -i '/^user/c user www;' /etc/nginx/nginx.conf |
| |
| |
| [root@web02 ~] |
# 4.2 部署 PHP7.1
| |
| [root@web02 ~] |
| |
| |
| [root@web02 ~] |
| |
| |
| [root@web02 ~] |
| |
| |
| [root@web02 ~] |
| [root@web02 ~] |
| [root@web02 ~] |
# 五、 部署博客 WeCenter
# 5.1 web01 配置
| |
| [root@web01 nginx] |
| proxy_http_version 1.1; |
| proxy_set_header Connectin ""; |
| |
| proxy_set_header Host $http_host; |
| proxy_set_header X-Real-IP $remote_addr; |
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| |
| proxy_connect_timeout 60; |
| proxy_send_timeout 120; |
| proxy_read_timeout 120; |
| |
| proxy_buffering on; |
| proxy_buffer_size 32k; |
| proxy_buffers 4 128k; |
| proxy_temp_file_write_size 10240k; |
| proxy_max_temp_file_size 10240k; |
| |
| |
| [root@web01 conf.d] |
| server { |
| server_name zh.hmallleasing.com; |
| listen 80; |
| root /code/zh; |
| |
| location / { |
| index index.php index.html; |
| } |
| |
| location ~ \.php$ { |
| fastcgi_pass 127.0.0.1:9000; |
| fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; |
| fastcgi_param HTTPS on; |
| include fastcgi_params; |
| } |
| } |
| |
| |
| [root@web01 conf.d] |
| |
| |
| [root@web01 ~] |
| [root@web01 ~] |
| |
| |
| [root@web01 ~] |
| |
| |
| [root@web01 ~] |
| [root@web01 ~] |
| [root@web01 ~] |
| [root@web01 ~] |
| |
| |
| |
| [root@db01 ~] |
| |
| |
| mysql> create database wordpress; |
| mysql> grant all on *.* to 'app'@'192.168.1.%' identified by 'passwd'; |
| |
| |
| http://zh.hmallleasing.com |
| |
| |
| 浏览器->右键->检查->Network->选择按钮->点击一下图片 |
| |
| |
| [root@web01 ~] |
# 5.2 web02 配置
| |
| [root@web02 ~] |
| [root@web02 ~] |
| |
| |
| [root@web02 ~] |
| |
| |
| [root@web02 ~] |
| [root@web02 ~] |
| |
| |
| [root@web02 ~] |
| [root@web02 ~] |
| |
| |
| 浏览器->右键->检查->Network->选择按钮->点击一下图片 |
| |
| |
| [root@web02 ~] |
# 六、配置七层负载均衡
# 6.1 配置 Lb01
| |
| [root@lb01 conf.d] |
| upstream zh { |
| server 192.168.1.117:80; |
| server 192.168.1.118:80; |
| } |
| |
| server { |
| listen 443 ssl; |
| server_name zh.hmallleasing.com; |
| ssl_prefer_server_ciphers on; |
| ssl_certificate /etc/nginx/sslkey/*.hmallleasing.com_chain.crt; |
| ssl_certificate_key /etc/nginx/sslkey/*.hmallleasing.com_key.key; |
| |
| location / { |
| proxy_pass http://zh; |
| include proxy_params; |
| } |
| } |
| |
| server { |
| listen 80; |
| server_name zh.hmallleasing.com; |
| return 302 https://$server_name$request_uri; |
| } |
| |
| |
| [root@lb01 nginx] |
| proxy_http_version 1.1; |
| proxy_set_header Connectin ""; |
| |
| proxy_set_header Host $http_host; |
| proxy_set_header X-Real-IP $remote_addr; |
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| |
| proxy_connect_timeout 60; |
| proxy_send_timeout 120; |
| proxy_read_timeout 120; |
| |
| proxy_buffering on; |
| proxy_buffer_size 32k; |
| proxy_buffers 4 128k; |
| proxy_temp_file_write_size 10240k; |
| proxy_max_temp_file_size 10240k; |
| |
| |
| [root@lb01 ~] |
| [root@lb01 ~] |
| *.hmallleasing.com_chain.crt |
| *.hmallleasing.com_key.key |
| |
| |
| [root@lb01 nginx] |
| [root@lb01 nginx] |
# 6.2 VIP 和 Arp 抑制脚本
| [root@lb01 scripts] |
| |
| |
| VIP=192.168.1.110 |
| DEV=lo:0 |
| |
| case $1 in |
| start) |
| |
| echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore |
| echo "1" >/proc/sys/net/ipv4/conf/default/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/default/arp_announce |
| echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce |
| |
| |
| cat >/etc/sysconfig/network-scripts/ifcfg-${DEV} <<-EOF |
| DEVICE=lo:0 |
| IPADDR=${VIP} |
| NETMASK=255.0.0.0 |
| ONBOOT=yes |
| NAME=loopback |
| EOF |
| |
| ifup ${DEV} |
| systemctl start nginx |
| ;; |
| |
| |
| stop) |
| echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore |
| echo "0" >/proc/sys/net/ipv4/conf/default/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/default/arp_announce |
| echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce |
| |
| ifdown ${DEV} |
| rm -f /etc/sysconfig/network-scripts/ifcfg-${DEV} |
| systemctl stop nginx |
| ;; |
| *) |
| echo "Usage: sh $0 { start | stop }" |
| esac |
# 6.3 配置 RS 节点 VIP 和 Arp 抑制
| [root@lb01 scripts] |
| [root@lb01 scripts] |
| [root@lb01 scripts] |
| ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 |
| inet 192.168.1.113 netmask 255.255.255.0 broadcast 192.168.1.255 |
| ether 00:50:56:b7:a1:fc txqueuelen 1000 (Ethernet) |
| RX packets 70472 bytes 6340792 (6.0 MiB) |
| RX errors 0 dropped 1280 overruns 0 frame 0 |
| TX packets 6372 bytes 2196852 (2.0 MiB) |
| TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
| |
| lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 |
| inet 127.0.0.1 netmask 255.0.0.0 |
| loop txqueuelen 1000 (Local Loopback) |
| RX packets 0 bytes 0 (0.0 B) |
| RX errors 0 dropped 0 overruns 0 frame 0 |
| TX packets 0 bytes 0 (0.0 B) |
| TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
| |
| lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 |
| inet 192.168.1.110 netmask 255.0.0.0 |
| loop txqueuelen 1000 (Local Loopback) |
# 6.4 配置 Lb02
| |
| [root@lb02 conf.d] |
| upstream zh { |
| server 192.168.1.117:80; |
| server 192.168.1.118:80; |
| } |
| |
| server { |
| listen 443 ssl; |
| server_name zh.hmallleasing.com; |
| ssl_prefer_server_ciphers on; |
| ssl_certificate /etc/nginx/sslkey/*.hmallleasing.com_chain.crt; |
| ssl_certificate_key /etc/nginx/sslkey/*.hmallleasing.com_key.key; |
| |
| location / { |
| proxy_pass http://zh; |
| include proxy_params; |
| } |
| } |
| |
| server { |
| listen 80; |
| server_name zh.hmallleasing.com; |
| return 302 https://$server_name$request_uri; |
| } |
| |
| |
| [root@lb02 conf.d] |
| proxy_http_version 1.1; |
| proxy_set_header Connectin ""; |
| |
| proxy_set_header Host $http_host; |
| proxy_set_header X-Real-IP $remote_addr; |
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| |
| proxy_connect_timeout 60; |
| proxy_send_timeout 120; |
| proxy_read_timeout 120; |
| |
| proxy_buffering on; |
| proxy_buffer_size 32k; |
| proxy_buffers 4 128k; |
| proxy_temp_file_write_size 10240k; |
| proxy_max_temp_file_size 10240k; |
| |
| |
| [root@lb02 ~] |
| [root@lb02 ~] |
| *.hmallleasing.com_chain.crt |
| *.hmallleasing.com_key.key |
| |
| |
| |
| [root@lb02 nginx] |
| [root@lb02 nginx] |
# 6.5 VIP 和 Arp 抑制脚本
| [root@lb02 scripts] |
| |
| |
| VIP=192.168.1.110 |
| DEV=lo:0 |
| |
| case $1 in |
| start) |
| |
| echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore |
| echo "1" >/proc/sys/net/ipv4/conf/default/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/default/arp_announce |
| echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce |
| |
| |
| cat >/etc/sysconfig/network-scripts/ifcfg-${DEV} <<-EOF |
| DEVICE=lo:0 |
| IPADDR=${VIP} |
| NETMASK=255.0.0.0 |
| ONBOOT=yes |
| NAME=loopback |
| EOF |
| |
| ifup ${DEV} |
| systemctl start nginx |
| ;; |
| |
| |
| stop) |
| echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore |
| echo "0" >/proc/sys/net/ipv4/conf/default/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/default/arp_announce |
| echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce |
| |
| ifdown ${DEV} |
| rm -f /etc/sysconfig/network-scripts/ifcfg-${DEV} |
| systemctl stop nginx |
| ;; |
| *) |
| echo "Usage: sh $0 { start | stop }" |
| esac |
# 6.6 配置 RS 节点 VIP 和 Arp 抑制
| [root@lb01 scripts] |
| [root@lb01 scripts] |
| [root@lb01 scripts] |
| ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 |
| inet 192.168.1.113 netmask 255.255.255.0 broadcast 192.168.1.255 |
| ether 00:50:56:b7:a1:fc txqueuelen 1000 (Ethernet) |
| RX packets 70472 bytes 6340792 (6.0 MiB) |
| RX errors 0 dropped 1280 overruns 0 frame 0 |
| TX packets 6372 bytes 2196852 (2.0 MiB) |
| TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
| |
| lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 |
| inet 127.0.0.1 netmask 255.0.0.0 |
| loop txqueuelen 1000 (Local Loopback) |
| RX packets 0 bytes 0 (0.0 B) |
| RX errors 0 dropped 0 overruns 0 frame 0 |
| TX packets 0 bytes 0 (0.0 B) |
| TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
| |
| lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 |
| inet 192.168.1.110 netmask 255.0.0.0 |
| loop txqueuelen 1000 (Local Loopback) |
# 七、接入四层负载均衡
# 7.1 安装 lvs 命令行工具
# 7.2 使用脚本生成 lvs 规则
| [root@lvs01 ~] |
| |
| VIP=192.168.1.110 |
| RS1=192.168.1.113 |
| RS2=192.168.1.114 |
| PORT=80 |
| SCHEDULER=rr |
| DEV=ens192:1 |
| |
| case $1 in |
| start) |
| |
| cat >/etc/sysconfig/network-scripts/ifcfg-${DEV} <<-EOF |
| TYPE=Ethernet |
| BOOTPROTO=none |
| DEFROUTE=yes |
| NAME=${DEV} |
| DEVICE=${DEV} |
| ONBOOT=yes |
| IPADDR=${VIP} |
| PREFIX=24 |
| EOF |
| |
| |
| ifup ${DEV} |
| |
| |
| ipvsadm -C |
| ipvsadm -A -t ${VIP}:${PORT} -s ${SCHEDULER} |
| ipvsadm -a -t ${VIP}:${PORT} -r ${RS1} -g |
| ipvsadm -a -t ${VIP}:${PORT} -r ${RS2} -g |
| ;; |
| |
| stop) |
| ifdown ${DEV} |
| rm -f /etc/sysconfig/network-scripts/ifcfg-${DEV} |
| ipvsadm -C |
| ;; |
| *) |
| echo "Usage: sh $0 { start | stop }" |
| ;; |
| esac |
| |
| [root@lvs01 ~] |
| [root@lvs01 ~] |
# 7.3 命令行配置 lvs 规则
| |
| [root@lvs01 ~] |
| |
| |
| [root@lvs01 ~] |
| [root@lvs01 ~] |
| [root@lvs01 ~] |
| [root@lvs01 ~] |
| IP Virtual Server version 1.2.1 (size=4096) |
| Prot LocalAddress:Port Scheduler Flags |
| -> RemoteAddress:Port Forward Weight ActiveConn InActConn |
| TCP 192.168.1.110:80 rr |
| -> 192.168.1.113:80 Route 1 0 0 |
| -> 192.168.1.114:80 Route 1 0 0 |
| |
| |
| [root@lvs01 ~] |
| [root@lvs01 ~] |
| [root@lvs01 ~] |
| [root@lvs01 ~] |
| IP Virtual Server version 1.2.1 (size=4096) |
| Prot LocalAddress:Port Scheduler Flags |
| -> RemoteAddress:Port Forward Weight ActiveConn InActConn |
| TCP 192.168.1.110:80 rr |
| -> 192.168.1.113:80 Route 1 0 0 |
| -> 192.168.1.114:80 Route 1 0 0 |
| TCP 192.168.1.110:443 rr |
| -> 192.168.1.113:443 Route 1 0 0 |
| -> 192.168.1.114:443 Route 1 0 0 |
# 7.4 LVS+Keepalived 实现高可用
1.lvs01 和 lvs02 安装软件:
| yum install keepalived ipvsadm -y |
2. 必须关闭七层负载均衡的 keepalived
3. 删除 lvs 上的虚拟 IP,以及 ipvs 规则
4. 配置 lvs-master
| [root@lvs01 ~] |
| global_defs { |
| router_id lb01 |
| } |
| |
| vrrp_instance VI_1 { |
| state MASTER |
| priority 200 |
| |
| interface ens192 |
| virtual_router_id 50 |
| advert_int 1 |
| authentication { |
| auth_type PASS |
| auth_pass 1111 |
| } |
| virtual_ipaddress { |
| 192.168.1.110 |
| } |
| } |
| |
| virtual_server 192.168.1.110 80 { |
| delay_loop 6 |
| lb_algo rr |
| lb_kind DR |
| protocol TCP |
| |
| real_server 192.168.1.113 80 { |
| weight 1 |
| TCP_CHECK { |
| connect_port 80 |
| connect_timeout 3 |
| nb_get_retry 2 |
| delay_beefore_retry 3 |
| } |
| } |
| |
| real_server 192.168.1.114 80 { |
| weight 1 |
| TCP_CHECK { |
| connect_port 80 |
| connect_timeout 3 |
| nb_get_retry 2 |
| delay_beefore_retry 3 |
| } |
| } |
| } |
| |
| virtual_server 192.168.1.110 443 { |
| delay_loop 6 |
| lb_algo rr |
| lb_kind DR |
| protocol TCP |
| |
| real_server 192.168.1.113 443 { |
| weight 1 |
| TCP_CHECK { |
| connect_port 443 |
| connect_timeout 3 |
| nb_get_retry 2 |
| delay_beefore_retry 3 |
| } |
| } |
| |
| real_server 192.168.1.114 443 { |
| weight 1 |
| TCP_CHECK { |
| connect_port 443 |
| connect_timeout 3 |
| nb_get_retry 2 |
| delay_beefore_retry 3 |
| } |
| } |
| } |
5. 配置 lvs-backup
| [root@lvs02 ~] |
| global_defs { |
| router_id lb02 |
| } |
| |
| vrrp_instance VI_1 { |
| state BACKUP |
| priority 150 |
| |
| interface ens192 |
| virtual_router_id 50 |
| advert_int 1 |
| authentication { |
| auth_type PASS |
| auth_pass 1111 |
| } |
| virtual_ipaddress { |
| 192.168.1.110 |
| } |
| } |
| |
| |
| virtual_server 192.168.1.110 80 { |
| |
| delay_loop 6 |
| |
| lb_algo rr |
| |
| lb_kind DR |
| |
| |
| protocol TCP |
| |
| |
| real_server 192.168.1.113 80 { |
| |
| weight 1 |
| |
| TCP_CHECK { |
| |
| connect_port 80 |
| |
| connect_timeout 3 |
| |
| nb_get_retry 2 |
| |
| delay_beefore_retry 3 |
| } |
| } |
| |
| real_server 192.168.1.114 80 { |
| weight 1 |
| TCP_CHECK { |
| connect_port 80 |
| connect_timeout 3 |
| nb_get_retry 2 |
| delay_beefore_retry 3 |
| } |
| } |
| } |
| |
| |
| virtual_server 192.168.1.110 443 { |
| |
| delay_loop 6 |
| |
| lb_algo rr |
| |
| lb_kind DR |
| |
| |
| protocol TCP |
| |
| |
| real_server 192.168.1.113 443 { |
| |
| weight 1 |
| |
| TCP_CHECK { |
| |
| connect_port 443 |
| |
| connect_timeout 3 |
| |
| nb_get_retry 2 |
| |
| delay_beefore_retry 3 |
| } |
| } |
| |
| real_server 192.168.1.114 443 { |
| weight 1 |
| TCP_CHECK { |
| connect_port 443 |
| connect_timeout 3 |
| nb_get_retry 2 |
| delay_beefore_retry 3 |
| } |
| } |
| } |
6. 配置 RS 节点的 VIP 和 Arp 抑制
| [root@lb01 ~] |
| [root@lb02 ~] |
7. 启动 keepalived
| [root@lvs01 ~] |
| [root@lvs02 ~] |
8. 如果 realserver 节点故障,是否会自动将其移除
9. 如果 ds 服务器故障,能否切换到备用节点
| systemctl stop keepalived |