上午
核心:内核中的ipvs,ipvsadm
1、安装ipvsadm
[root@nat ~]# yum -y install ipvsadm
2、配置规则
查看所有的规则,如果已经配置好规则,重启之后也就没有了
[root@nat ~]# ipvsadm -L -n
1、配置vip网卡
(1)在编辑虚拟网络中创建桥接模式的网卡,并且桥接到有网的适配器上。
查看自己本机WLAN所属网卡
在VM创建桥接模式网卡,将外部连接设置为WLAN所属网卡
2、添加新的网卡,自定义为刚才创建的桥接模式网卡。
在本虚拟机中重新添加一块网络适配器,并设置网络连接为刚设置的桥接模式的网卡
3、此时在虚拟主机中使用ifconfig无法找到新的网卡,ip a能够查看到新的ens36网卡。
查看所有网络
[root@nat ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:f5:ea:0a brd ff:ff:ff:ff:ff:ff
inet 10.0.0.10/24 brd 10.0.0.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::3598:4e0:b43d:ccc8/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: ens36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:f5:ea:14 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.83/23 brd 192.168.11.255 scope global noprefixroute dynamic ens36
valid_lft 7147sec preferred_lft 7147sec
inet6 fe80::8de7:6bd9:74a1:8f60/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4、编辑网卡配置
[root@nat ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens36
[root@nat ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens36
TYPE=Ethernet
BOOTPROTO=none
IPADDR=192.168.10.101
NAME=ens36
UUID=d4cfa5ab-7c2a-4fab-b329-396b9b38b1bf
DEVICE=ens36
ONBOOT=yes
5、重启网络服务
[root@nat ~]# systemctl restart network
6、本机cmd测试192.168.10.101ip是否可以正常使用
2、添加规则
配置ipvs规则
[root@nat ~]# ipvsadm -A -t 192.168.10.101:80 -s rr
# -A 选项表示添加一个新的服务。
# -t 192.168.10.101:80 指明了要处理的服务是目标地址为 192.168.10.101 ,端口为 80 的 TCP 服务。
# -s rr 表示使用轮询(Round Robin)的调度算法。
[root@nat ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.101:80 rr
添加rs web01 web02 添加规则
[root@nat ~]# ipvsadm -a -t 192.168.10.101:80 -r 10.0.0.11:80 -m
# -a 选项用于添加一个真实服务器(Real Server)到指定的服务中。
# -t 192.168.10.101:80 表示要添加真实服务器的服务是目标地址为 192.168.10.101 ,端口为 80 的 TCP 服务。
# -r 10.0.0.11:80 指明了要添加的真实服务器的地址为 10.0.0.11 ,端口为 80 。
# -m 表示使用 NAT(Network Address Translation,网络地址转换)模式。
[root@nat ~]# ipvsadm -a -t 192.168.10.101:80 -r 10.0.0.12:80 -m
[root@nat ~]# ipvsadm -Ln
# -L 选项表示列出(List)规则。
# -n 选项表示以数字形式显示地址和端口,而不进行 DNS 解析,这样可以提高显示速度和准确性。
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.10.101:80 rr
-> 10.0.0.11:80 Masq 1 0 0
-> 10.0.0.12:80 Masq 1 0 0
# “TCP 192.168.10.101:80 rr” 表示这是一个 TCP 协议的服务,地址为 192.168.10.101,端口为 80,使用的调度算法是轮询(rr)
# “-> 10.0.0.11:80 Masq 1 0 0” 表示后端的一个真实服务器地址为 10.0.0.11,端口为 80,采用网络地址转换(Masq)模式,权重为 1,当前活跃连接数为 0,非活跃连接数为 0。
# “-> 10.0.0.12:80 Masq 1 0 0” 则是另一个后端真实服务器的配置信息,地址为 10.0.0.12,端口为 80,同样是网络地址转换模式,权重为 1,活跃和非活跃连接数均为 0。
此时访问vip还无法访问到web01和web02
3、ip转发
[root@nat ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
# net.ipv4.ip_forward=1 这个配置的作用是启用系统的 IP 转发功能。
# 当设置为 1 时,表示允许系统在不同的网络接口之间转发 IP 数据包。
[root@nat ~]# sysctl -p
net.ipv4.ip_forward = 1
# 使在 /etc/sysctl.conf 中所做的更改立即生效,而无需重新启动系统。
此时访问vip还无法访问到web01和web02
4、修改网关
临时修改web01和web02的网关,网关必须指向dip(调度服务器的对内的ip)
要求rs的ip和dip要在同一个网段,因为dip是作为rs网关存在的
# 删除系统中的默认路由
[root@web01 ~]# ip route del default
# 添加一条新的路由规则(只适用于目标主机(代理主机)为192.168.1.0网段的)
[root@web01 ~]# ip route add 192.168.1.0/24 via 10.0.0.10
[root@web02 ~]# ip route del default
[root@web02 ~]# ip route add 192.168.1.0/24 via 10.0.0.10
此时访问vip可以访问到web01和web02
修改网关(方法2):(适用于目标主机为任何网段)
步骤 1:查看当前默认路由
使用以下命令查看当前系统中的默认路由:
route -n
步骤 2:取消默认路由
假设当前的默认路由网关为 192.168.1.1,您可以使用以下命令取消它:
route del default gw 192.168.1.1
步骤 3:添加新的默认路由
例如,要添加新的默认路由网关为 10.0.0.1,可以使用以下命令:
route add default gw 10.0.0.1
lvs-nat模式的优点是配置简单,缺点是请求和响应都必须经过ds,容易性能瓶颈
现在,希望请求时使用input链进行负载均衡,响应时不经过ds,直接由rs响应给客户端
在nat模式时,请求vip,接收vip响应。
构想 :请求vip,接收rip响应,这是不允许 使用lvs-dr模式
5、NAT模式脚本
# ds脚本
#!/bin/bash
#配置网卡
echo TYPE=Ethernet >> /etc/sysconfig/network-scripts/ifcfg-ens36
echo BOOTPROTO=none >> /etc/sysconfig/network-scripts/ifcfg-ens36
echo IPADDR=192.168.10.101 >> /etc/sysconfig/network-scripts/ifcfg-ens36
read -p "router name:" router_name
echo NAME='"$router_name"' >> /etc/sysconfig/network-scripts/ifcfg-ens36
uuid=$( uuidgen )
echo UUID='"$uuidgen"' >> /etc/sysconfig/network-scripts/ifcfg-ens36
echo DEVICE='"$router_name"' >> /etc/sysconfig/network-scripts/ifcfg-ens36
echo ONBOOT=yes >> /etc/sysconfig/network-scripts/ifcfg-ens36
#重启网络服务
systemctl restart network
#安装ipvsadm
yum list installed|grep ipvsadm
if [ $? —ne 0 ];then
yum -y install ipvsadm
fi
#配置规则
read -p "vip:" vip
read -p "port:" port
read -p "rule:" rule
read -p "rip1:" rip1
read -p "rip2:" rip2
ipvsadm -A -t $vip:$port -s $rule
ipvsadm -a -t $vip:$port -r $rip1:$port -m
ipvsadm -a -t $vip:$port -r $rip2:$port -m
#ip转发
echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
sysctl -p
#rs 脚本
#!/bin/bash
# 设置网关
read -p "dip:" dip
ip route del default
ip route add default via $dip
6、DR模式
(1)性能更优,回路不再经过ds
(2)ds和rs为了保证用户响应,都要求配置统一的vip
(3)由于rs是直接响应client,网关一定不能设置为ds的dip
(4)对rs的vip进行抑制,让ds的vip接收请求,rs的vip不接受请求
7、设置dr主机
1、在ds的ens33上挂一个vip10.0.0.101
[root@dr ~]# ifconfig ens33:0 10.0.0.101 broadcast 10.0.0.101 netmask 255.255.255.255 up
# ifconfig 是用于配置网络接口的命令。
# ens33:0 是创建的虚拟接口名称。
# 10.0.0.101 是为该虚拟接口分配的 IP 地址。
# broadcast 10.0.0.101 指明了广播地址为 10.0.0.101 。
# netmask 255.255.255.255 表示子网掩码为 255.255.255.255 ,这实际上是一个单点广播地址,通常用于特定的网络配置场景。
# up 表示启用该网络接口。
[root@dr ~]# route add -host 10.0.0.101 dev ens33:0
# 将目标主机地址为 10.0.0.101 的数据包通过网络接口 ens33:0 进行发送
# 10.0.0.101 dip
# 10.0.0.13 vip 在rs上的vip和这个vip相同
2、设置规范
# 安装ipvsadm
[root@dr ~]# yum -y install ipvsadm.x86_64
# 设置规则
ipvsadm -A -t 10.0.0.101:80 -s rr
ipvsadm -a -t 10.0.0.101:80 -r 10.0.0.11 -g
# -a 选项表示添加(Add)一个真实服务器到已存在的服务中。
# -t 10.0.0.101:80 指明了要添加真实服务器的服务是目标地址为 10.0.0.101 ,端口为 80 的 TCP 服务。
# -r 10.0.0.11 表示要添加的真实服务器地址为 10.0.0.11 。
# -g 表示使用直接路由(Direct Routing)模式。
ipvsadm -a -t 10.0.0.101:80 -r 10.0.0.12 -g
[root@dr ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.101:80 rr
-> 10.0.0.11:80 Route 1 0 0
-> 10.0.0.12:80 Route 1 0 0
# rs不再需要指定端口,dr不支持端口映射,vip上是80端口,最终就是80端口
# -m nat -g gateway
下午
1、设置rs主机
(1)在lo接口上绑定vip
[root@web01 ~]# ifconfig lo:0 10.0.0.101 broadcast 10.0.0.101 netmask 255.255.255.255 up
# ifconfig 是用于配置网络接口的命令。
# lo:0 是创建的虚拟接口名称。
# 10.0.0.101 是为该虚拟接口分配的 IP 地址。
# broadcast 10.0.0.101 指明了广播地址为 10.0.0.101 。
# netmask 255.255.255.255 表示子网掩码为 255.255.255.255 ,这实际上是一个单点广播地址,通常用于特定的网络配置场景。
# up 表示启用该网络接口。
(2)设置主机路由
[root@web01 ~]# route add -host 10.0.0.101 dev lo:0
[root@web01 ~]# ifconfig
(3)抑制rs的vip接受请求
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
# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore :将本地回环接口(lo)的 arp_ignore 参数设置为 1。当收到 ARP 请求时,如果目标 IP 不是本地接口的地址,则不回应。
# echo 2 > /proc/ssys/net/ipv4/conf/lo/arp_announce :将本地回环接口的 arp_announce 参数设置为 2。在发送 ARP 报文时,尽可能使用能被其他主机路由到达的本地接口的 IP 地址。
# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore :将所有网络接口的 arp_ignore 参数设置为 1。
# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce :将所有网络接口的 arp_announce 参数设置为 2。
# 限制某些情况下的 ARP 响应
# 1.不理睬非本机ip请求,2优先其他主机路由也就是如果其他主机路由可以到达本地,让他们走远路过来本地
(4)生成脚本,对web02使用
[root@web01 ~]# vim arp.sh
ifconfig lo:0 10.0.0.101 broadcast 10.0.0.101 netmask 255.255.225.255 up
route add -host 10.0.0.101 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
2、测试
访问vip地址
[root@dr ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.101:80 rr
-> 10.0.0.11:80 Route 1 1 0
-> 10.0.0.12:80 Route 1 2 0
[root@dr ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 10.0.0.101:80 3 14 0 2661 0
-> 10.0.0.11:80 1 10 0 2477 0
-> 10.0.0.12:80 2 4 0 184 0
3、dr模式脚本
(1)dr脚本
#!/bin/bash
# 在ens33上挂载一个ip地址
read -p "vip:" vip
read -p "mac:" mac
read -p "num:" num
ifconfig $mac:$num $vip broadcast $vip netmask 255.255.255.255
# 主机路由
route add -host $vip dev $mac:$num
# 安装ipvsadm
yum list installed|grep ipvsadmm
if [ $? —ne 0 ];then
yum -y install ipvsadm
fi
# 配置规则(不需要设置ip_forword)
ipvsadm -C
read -p "rule:" rule
read -p "port:" port
ipvsadm -A -t $vip:$port -s $rule
read -p "rip1:" rip1
ipvsadm -a -t $vip:$port -r $rip1 -g
read -p "rip2:" rip2
ipvsadm -a -t $vip:$port -r $rip2 -g
(2)rs脚本
#!/bin/bash
# 在ens33上挂载一个ip地址
read -p "vip:" vip
read -p "mac:" mac
read -p "num:" num
ifconfig $mac:$num $vip broadcast $vip netmask 255.255.255.255
# 主机路由
route add -host $vip dev $mac:$num
# 抑制
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
练习:对mysql的3306服务进行负载均衡
1、配置mysql主机 x.x.x.21,命名为master_mysql.xxx.xxx,激活并且添加数据库test
2、在test中添加表student id int 主键,自增,name 字符串类型 非空,grade 字符串 非空,domi varchar 非空
3、添加三行数据
编号 姓名 班级 宿舍
1001 孙颖莎 云计算1班 1002
1002 大头 云计算2班 1003
1003 小胖 云计算2班 1004
3、配置mysql从服务,备份mysqlx.x.x.22的mysql服务,使用gtids同步事务
4、lvs对两台mysql主机进行rr负载均衡
5、使用python写一个脚本通过lvs ds主机读取mysql中的数据
6、自动化程度越高越好