上午
核心:内核中的
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
#
删除系统中的默认路由
[root@web01 ~]
# ip route add 10.0.0.0/24 via 10.0.0.10
#
添加一条新的路由规则
#
对于目标网络为
10.0.0.0/24
的数据包,将通过网关
10.0.0.10
进行转发
[root@web02 ~]
# ip route del default
[root@web02 ~]
# ip route add 10.0.0.0/24 via 10.0.0.10
此时访问
vip
可以访问到
web01
和
web02
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
、添加三行数据
3
、配置
mysql
从服务,备份
mysqlx.x.x.22
的
mysql
服务,使用
gtids
同步事务
4
、
lvs
对两台
mysql
主机进行
rr
负载均衡
5
、使用
python
写一个脚本通过
lvs ds
主机读取
mysql
中的数据
6
、自动化程度越高越好