Keepalive+LVS+Nginx+NFS高可用架构
Keepalive+LVS+Nginx+NFS高可用架构
- 1. NFS 业务服务器(192.168.98.138)
- 2. Web服务集群(搭建RS服务器)
- 开机自启动
- 自动挂载
- 配置nginx(为了区分Web1与Web2访问的文件内容)
- 3. LVS主机(Keepalived+lvs)
- 4. 回到Web主机,修改
- 5. 客户端测试(浏览器http://192.168.98.100)
- 停止nginx服务
- 停止keepalived服务(高可用)
搭建 DR 模式
Keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
LVS工作在内核层,性能高效,能够处理大量并发请求,支持多种负载均衡算法和工作模式,适应不同的应用场景
Keepalive+LVS+Nginx+NFS高可用架构
- 实验目的:
- 客户端通过访问 LVS高可用集群VIP:192.168.98.100可以访问到NFS业务服务器的内容。
- 当VS-mastert负载均衡断开服务后,LVS-backup可以进行备用,不影响用户访问业务。
- 当WEB1或者WEB2关闭服务后,另外一台服务器可以正常访问业务。
每台主机都要关闭防火墙和SELinux
systemctl disable --now firewalld
临时关闭Selinux
setenforce 0
主机 | 角色 | 安装软件 | IP |
---|---|---|---|
nfs | NFS业务服务器 | nfs-utils | 192.168.98.138 |
Web1 | Web服务 | nfs-utils、nginx | 192.168.98.41 |
Web2 | Web服务 | nfs-utils、nginx | 192.168.98.42 |
LVS-master | 负载均衡 | ipvsadm、keepalived | 192.168.98.31 VIP:192.168.98.100 |
LVS-backup | 负载均衡 | ipvsadm、keepalived | 192.168.98.32 VIP:192.168.98.100 |
client | 客户端 | 192.168.98. |
RS 的网关是 LVS 的 IP
1. NFS 业务服务器(192.168.98.138)
- 挂载,安装软件nfs-utils
- 创建共享目录
- 配置 /etc/exports,开启服务
systemctl start nfs-server - 暴露共享位置
showmount -t ip
,本机IP(nfs主机IP)
要先启动服务再暴露共享位置,否则会报错RPC - 写一个.html文件共享给Web主机
echo $(hostname -I) > /nfs/web/index.html
- 到nginx主机配置相关
# 1.挂载,安装软件nfs-utils
[root@nfs ~]# mount /dev/sr0 /mnt/
mount: /mnt: WARNING: source write-protected, mounted read-only.
[root@nfs ~]# dnf install nfs-utils -y# 2.创建共享目录
[root@nfs ~]# mkdir /nfs/web -p# 3.配置 /etc/exports,开启服务
[root@nfs ~]# vim /etc/exports
[root@nfs ~]# cat /etc/exports
/nfs/web 192.168.98.41(rw,no_root_squash) 192.168.98.42(rw,no_root_squash)
或者
/nfs/web 192.168.98.*(rw,no_root_squash) #权限可写sync
[root@nfs ~]# systemctl start nfs-server# 4.暴露共享位置(要先启动服务在暴露共享位置,否则会报错RPC)
[root@nfs ~]# showmount -e 192.168.98.138
Export list for 192.168.98.138:
/nfs/web 192.168.98.42,192.168.98.41# 5. 写一个.html文件共享给Web主机
[root@nfs ~]# echo $(hostname -I) > /nfs/web/index.html
[root@nfs ~]# cd /nfs/web/
[root@nfs web]# ls
index.html
2. Web服务集群(搭建RS服务器)
- IP:
[root@Web1 ~]# nmcli device show ens160
GENERAL.DEVICE: ens160
GENERAL.TYPE: ethernet
GENERAL.HWADDR: 00:0C:29:BA:BD:60
GENERAL.MTU: 1500
GENERAL.STATE: 100 (connected)
GENERAL.CONNECTION: ens160
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/2
WIRED-PROPERTIES.CARRIER: on
IP4.ADDRESS[1]: 192.168.98.41/24
IP4.GATEWAY: 192.168.98.2
IP4.ROUTE[1]: dst = 192.168.98.0/24, nh = 0.0.0.0, mt = 100
IP4.ROUTE[2]: dst = 0.0.0.0/0, nh = 192.168.98.2, mt = 100
IP4.DNS[1]: 223.5.5.5
IP6.ADDRESS[1]: fe80::20c:29ff:feba:bd60/64
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 1024
RS 的网关是 LVS 的 IP
- 挂载,安装软件 nfs-utils、nginx
- 挂载首页目录/usr/share/nginx/html/
mount -t nfs nfs主机IP:nfs共享目录 本机共享目录
- 启动服务,查看是否与nfs主机同步文件
- 增加内核参数
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
- Web1(192.168.98.41)
# 1.挂载,安装软件 nfs-utils、nginx
[root@Web1 ~]# mount /dev/sr0 /mnt/
mount: /mnt: WARNING: source write-protected, mounted read-only.
[root@Web1 ~]# dnf install nginx nfs-utils -y# 2.挂载首页目录
[root@Web1 ~]# mount -t nfs 192.168.98.138:/nfs/web /usr/share/nginx/html/
[root@Web1 ~]# df /usr/share/nginx/html/
Filesystem 1K-blocks Used Available Use% Mounted on
192.168.98.138:/nfs/web 46587904 1754112 44833792 4% /usr/share/nginx/html# 3.启动服务,测试,查看是否与nfs主机同步文件
[root@Web1 ~]# systemctl start nfs-server nginx
[root@Web1 ~]# showmount -e 192.168.98.138
Export list for 192.168.98.138:
/nfs/web 192.168.98.42,192.168.98.41
[root@Web1 ~]# cd /usr/share/nginx/html/
[root@Web1 html]# ls
[root@Web1 html]# ls
index.html
[root@Web1 ~]# curl localhost
nfs 192.168.98.138
可以通过克隆进行高效率配置,关闭Web1服务器,对这台服务器进行克隆,(先启动Web2再重新启动Web1,防止IP冲突)操作改变主机名、修改IP
- Web2(192.168.98.42)
[root@Web2 ~]# mount /dev/sr0 /mnt/
mount: /mnt: WARNING: source write-protected, mounted read-only.
[root@Web2 ~]# dnf install nginx nfs-utils -y
[root@Web2 ~]# mount -t nfs 192.168.98.138:/nfs/web /usr/share/nginx/html/
[root@Web2 ~]# df /usr/share/nginx/html/
Filesystem 1K-blocks Used Available Use% Mounted on
192.168.98.138:/nfs/web 46587904 1754112 44833792 4% /usr/share/nginx/html
[root@Web2 ~]# systemctl start nfs-server
[root@Web2 ~]# systemctl start nginx
[root@Web2 ~]# ls /usr/share/nginx/html/
index.html
[root@Web2 ~]# curl localhost
nfs 192.168.98.138
- 查看nginx的网页文件存储目录
[root@Web1 ~]# rpm -ql nginx | grep html
/usr/share/nginx/html/404.html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/icons
/usr/share/nginx/html/icons/poweredby.png
/usr/share/nginx/html/index.html
/usr/share/nginx/html/nginx-logo.png
/usr/share/nginx/html/poweredby.png
/usr/share/nginx/html/system_noindex_logo.png
开机自启动
[root@Web1 ~]# systemctl enable nginx nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
[root@Web2 ~]# systemctl enable nginx nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
# 重启主机后,查看开机自启动是否开启成功
[root@Web1 ~]# ps -ef | grep nginx
root 1742 1 0 13:28 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 1743 1742 0 13:28 ? 00:00:00 nginx: worker process
nginx 1744 1742 0 13:28 ? 00:00:00 nginx: worker process
nginx 1745 1742 0 13:28 ? 00:00:00 nginx: worker process
nginx 1746 1742 0 13:28 ? 00:00:00 nginx: worker process
root 2142 1501 0 15:07 pts/0 00:00:00 grep --color=auto nginx
自动挂载
- 写自动挂载的目录
写自动挂载文件:
[root@Web1 ~]# vim /etc/sysctl.d/
[root@Web1 ~]# vim /etc/fstab
[root@Web1 ~]# vim /etc/rc.d/init.d/
[root@Web1 ~]# vim /etc/fstab
[root@Web1 ~]# cat /etc/fstab
........
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=a656d423-6d9a-4a0a-b794-9161d8d66b0b /boot xfs defaults 0 0
UUID=EDBD-EDDF /boot/efi vfat umask=0077,shortname=winnt 0 2
/dev/mapper/rhel-swap none swap defaults 0 0
192.168.98.138:/nfs/web /usr/share/nginx/html/ nfs defaults 0 0
[root@Web1 ~]# systemctl daemon-reload
[root@Web1 ~]# mount -a #挂载全部
配置nginx(为了区分Web1与Web2访问的文件内容)
[root@nfs ~]# cd /nfs/web/
[root@nfs web]# ls
index.html
[root@nfs web]# mv index.html index1.html
[root@nfs web]# echo "Web1 index.html" > index1.html
[root@nfs web]# ls
index1.html
[root@nfs web]# echo "Web2 index.html" > index2.html
[root@nfs web]# ls
index1.html index2.html
现在共享目录下有两个文件,现在访问会报错
[root@Web1 ~]# curl localhost
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@Web1 ~]# vim /etc/nginx/conf.d/web1.conf
[root@Web1 ~]# cat /etc/nginx/conf.d/web1.conf
server {listen 80;server_name 192.168.98.41;location / {root /usr/share/nginx/html;index index1.html;}
}
[root@Web1 ~]# systemctl restart nginx
[root@Web1 ~]# curl 192.168.98.41
Web1 index.html
[root@Web1 ~]# curl localhost #localhost代表本机,我们配置nginx时用的时IP
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
3. LVS主机(Keepalived+lvs)
- IP:
[root@master ~]# nmcli device show ens160
GENERAL.DEVICE: ens160
GENERAL.TYPE: ethernet
GENERAL.HWADDR: 00:0C:29:2A:3F:65
GENERAL.MTU: 1500
GENERAL.STATE: 100 (connected)
GENERAL.CONNECTION: ens160
GENERAL.CON-PATH: /org/freedesktop/NetworkManager/ActiveConnection/2
WIRED-PROPERTIES.CARRIER: on
IP4.ADDRESS[1]: 192.168.98.31/24
IP4.GATEWAY: 192.168.98.2
IP4.ROUTE[1]: dst = 192.168.98.0/24, nh = 0.0.0.0, mt = 100
IP4.ROUTE[2]: dst = 0.0.0.0/0, nh = 192.168.98.2, mt = 100
IP4.DNS[1]: 223.5.5.5
IP6.ADDRESS[1]: fe80::20c:29ff:fe2a:3f65/64
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = fe80::/64, nh = ::, mt = 1024
RS 的网关是 LVS 的 IP
- 安装 ipvsadm、keepalived
- 初始化文件
ipvsadm-save -n > /etc/sysconfig/ipvsadm
,启动服务
systemctl start ipvsadm - 添加虚拟 IP
ifconfig NAT 192.168.98.100 netmask 255.255.255.255 up
ip addr add 192.168.98.100 dev NAT
(在lvs主机curl虚拟IP) - 通过在keepalived配置文件中的内容,已经配置了ipvsadm的相关内容
- LVS-master(192.168.98.31)
# 1.安装 ipvsadm
[root@master ~]# dnf install keepalived ipvsadm -y# 2.初始化文件 ipvsadm-save -n > /etc/sysconfig/ipvsadm 启动服务
[root@master ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
[root@master ~]# systemctl start ipvsadm# 3.配置keepalived
[root@master ~]# vim /etc/keepalived/keepalived.conf
[root@master ~]# cat /etc/keepalived/keepalived.conf
global_defs {router_id lvs-master
}vrrp_instance VI_1 {state MASTERinterface ens160virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.98.100}
}
#配置lvs,需要指定VIP地址
virtual_server 192.168.98.100 80 {delay_loop 6 #健康检查的间隔时间,单位为秒lb_algo rr #负载均衡的算法,rr表示轮询,wrr:带权重lb_kind DR #负载均衡的模式,此处为DR模式,支持的模式:NAT、DR、TUNpersistence_timeout 50 #持久化时间,默认为秒
# 此处的配置相当于ipvsadm -A -t 协议(t:tcp协议) 192.168.98.100:80 --s wrr -p 50 #好处:让会话一直保持,设置为0,则表示不持久化protocol TCP #负载协议#配置真实服务器,配置方式:IP 端口号 相当于 ipvsadm -a -t 192.168.98.100:80 -g -w 1,-g:DRreal_server 192.168.98.41 80 {weight 1 #权重,默认为1TCP_CHECK { #检测connect_timeout 3 #连接时间,单位为秒,即3秒中如果未连通,则表示此主机服务挂了retry 3 #重试次数delay_before_retry 3 #重试间隔时间}}real_server 192.168.98.42 80 {weight 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3}}
}
# 这里面配置的东西,相当于配置了lvsadm
[root@master ~]# systemctl restart ipvsadm keepalived# 4.配置lvs
[root@master ~]# 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.98.100:80 rr persistent 50 #加了持久-> 192.168.98.41:80 Route 1 0 0 -> 192.168.98.42:80 Route 1 0 0
- LVS-backup(192.168.98.32)
[root@backup ~]# dnf install keepalived ipvsadm -y
[root@backup ~]# ipvsadm-save -n > /etc/sysconfig/ipvsadm
[root@backup ~]# systemctl start ipvsadm
[root@backup ~]# systemctl start keepalived
[root@backup ~]# vim /etc/keepalived/keepalived.conf
[root@backup ~]# cat /etc/keepalived/keepalived.conf
global_defs {router_id lvs-backup
}vrrp_instance VI_1 {state BACKUPinterface ens160virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.98.100}
}virtual_server 192.168.98.100 80 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 50protocol TCPreal_server 192.168.98.41 80 {weight 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3}}real_server 192.168.98.42 80 {weight 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3}}
}
[root@backup ~]# systemctl restart keepalived ipvsadm
[root@backup ~]# 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.98.100:80 rr persistent 50-> 192.168.98.41:80 Route 1 0 0 -> 192.168.98.42:80 Route 1 0 0
4. 回到Web主机,修改
- 添加虚拟IP
ifconfig lo:1 192.168.98.100 netmask 255.255.255.255 broadcast 192.168.98.100 up
- 配置内核参数 /etc/sysctl.conf
- 增加路由
route add -host 192.168.98.100 dev lo:1
route -n
[root@Web1 ~]# ifconfig lo:1 192.168.98.100 netmask 255.255.255.255 broadcast 192.168.98.100 up
[root@Web1 ~]# ip a show lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet 192.168.98.100/32 brd 192.168.98.100 scope global lo:1valid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
[root@Web2 ~]# ifconfig lo:1 192.168.98.100 netmask 255.255.255.255 broadcast 192.168.98.100 up
[root@Web2 ~]# ip a show lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet 192.168.98.100/32 brd 192.168.98.100 scope global lo:1valid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
- 内核参数
[root@Web1 ~]# cat >> /etc/sysctl.conf <<EOF
> net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.ip_forward=0
> EOF
[root@Web1 ~]# sysctl -p
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.ip_forward = 0
[root@Web2 ~]# cat >> /etc/sysctl.conf <<EOF
> net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.ip_forward=0
> EOF
[root@Web2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.ip_forward = 0
- 增加路由
[root@Web1 ~]# route add -host 192.168.98.100 dev lo:1
[root@Web1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.98.2 0.0.0.0 UG 100 0 0 ens160
192.168.98.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
192.168.98.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
[root@Web2 ~]# route add -host 192.168.98.100 dev lo:1
[root@Web2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.98.2 0.0.0.0 UG 100 0 0 ens160
192.168.98.0 0.0.0.0 255.255.255.0 U 100 0 0 ens160
192.168.98.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
5. 客户端测试(浏览器http://192.168.98.100)
停止nginx服务
- 停掉Web1:
[root@Web1 ~]# systemctl stop nginx# ipvsadm服务:
[root@master ~]# 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.98.100:80 rr persistent 50-> 192.168.98.42:80 Route 1 0 0
不可访问,访问报错
- 重启
[root@Web1 ~]# systemctl start nginx
[root@master ~]# 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.98.100:80 rr persistent 50-> 192.168.98.41:80 Route 1 0 0 -> 192.168.98.42:80 Route 1 0 0
停止keepalived服务(高可用)
当前状态所有主机,所有服务全部开启的
#虚拟IP在master主机上
[root@master ~]# ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:2a:3f:65 brd ff:ff:ff:ff:ff:ffaltname enp3s0inet 192.168.98.31/24 brd 192.168.98.255 scope global noprefixroute ens160valid_lft forever preferred_lft foreverinet 192.168.98.100/32 scope global ens160valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe2a:3f65/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@backup ~]# ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:25:66:fb brd ff:ff:ff:ff:ff:ffaltname enp3s0inet 192.168.98.32/24 brd 192.168.98.255 scope global noprefixroute ens160valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe25:66fb/64 scope link noprefixroute valid_lft forever preferred_lft forever
- 停止master主机的keepalived
[root@master ~]# systemctl stop keepalived
[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:2a:3f:65 brd ff:ff:ff:ff:ff:ffaltname enp3s0inet 192.168.98.31/24 brd 192.168.98.255 scope global noprefixroute ens160valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe2a:3f65/64 scope link noprefixroute valid_lft forever preferred_lft forever#虚拟IP漂移到backup主机
[root@backup ~]# ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:25:66:fb brd ff:ff:ff:ff:ff:ffaltname enp3s0inet 192.168.98.32/24 brd 192.168.98.255 scope global noprefixroute ens160valid_lft forever preferred_lft foreverinet 192.168.98.100/32 scope global ens160valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe25:66fb/64 scope link noprefixroute valid_lft forever preferred_lft forever
仍旧都可访问
相关文章:
Keepalive+LVS+Nginx+NFS高可用架构
KeepaliveLVSNginxNFS高可用架构 1. NFS 业务服务器(192.168.98.138)2. Web服务集群(搭建RS服务器)开机自启动自动挂载配置nginx(为了区分Web1与Web2访问的文件内容) 3. LVS主机(Keepalivedlvs&…...
SpringBoot分布式项目订单管理实战:Mybatis最佳实践全解
一、架构设计与技术选型 典型分布式订单系统架构: [网关层] → [订单服务] ←→ [分布式缓存]↑ ↓ [用户服务] [支付服务]↓ ↓ [MySQL集群] ← [分库分表中间件]技术栈组合: Spring Boot 3.xMybatis-Plus 3.5.xShardingSpher…...
ctfshow WEB web8
首先确定注入点,输入以下payload使SQL恒成立 ?id-1/**/or/**/true 再输入一下payload 使SQL恒不成立 ?id-1/**/or/**/false 由于SQL恒不成立, 数据库查询不到任何数据, 从而导致页面空显示 由以上返回结果可知,该页面存在SQL注入,注入点…...
当AI代写作业成为常态:重构智能时代的教育范式
2023年春季,某重点高中教师发现全班35%的作文呈现相似AI生成特征;同年国际数学竞赛中,参赛选手使用AI解题引发伦理争议。当GPT-4在SAT考试中取得1520分,当Claude3能撰写专业学术论文,教育领域正面临百年未有之大变革。这场技术革命倒逼我们重新思考:在AI能完成知识性任务…...
基于杜鹃鸟鲶鱼优化(Cuckoo Catfish Optimizer,CCO)算法的多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码
一、杜鹃鸟鲶鱼优化算法 杜鹃鸟鲶鱼优化(Cuckoo Catfish Optimizer,CCO)算法模拟了杜鹃鸟鲶鱼的搜索、捕食和寄生慈鲷行为。该算法的早期迭代侧重于执行多维包络搜索策略和压缩空间策略,并结合辅助搜索策略来有效限制慈鳔的逃逸空…...
Ubuntu 22.04.5 LTS 设置时间同步 ntp
提示:文章为操作记录,以备下次使用 文章目录 前言一、设置ntp1.1替换国内源1.2 更新源&安装1.3 验证 前言 设置时间同步,环境版本 # cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.5 LTS" NAME"Ubuntu" VERSION_…...
搭建前端环境和后端环境
搭建前端环境 ①、安装vscode,并安装相应的插件工具 ②、安装node.js,可以选择当前版本,或者其他版本 ③、创建工作区 创建一个空文件夹,然后通过vscode工具打开,保存为后缀名为.code-workspace ④、从gitee…...
【VirtualBox 安装 Ubuntu 22.04】
网上教程良莠不齐,有一个CSDN的教程虽然很全面,但是截图冗余,看蒙了给我,这里记录一个整洁的教程链接。以备后患。 下载安装全流程 UP还在记录生活,看的我好羡慕,呜呜。 [VirtualBox网络配置超全详解]&am…...
好用的Markdown阅读编辑器Typora破解记录
Typora破解 一、下载Typora二、安装Typora三、破解Typora 😀 记录一下Typora破解记录,怕不常用忘记咯,感觉自己现在的脑子就像我的肠子一样,刚装进去就么得了。。。😔 Typroa算是用起来很舒服的Markdown阅读器了吧&am…...
系统与网络安全------Windows系统安全(1)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 用户账号基础 本地用户账号基础 用户账号概述 用户账号用来记录用户的用户名和口令、隶属的组等信息 每个用户账号包含唯一的登录名和对应的密码 不同的用户身份拥有不同的权限 操作系统根据SID识别不同…...
使用 Docker Compose 在单节点部署多容器
Docker Compose 是什么 Docker Compose 是一个用于运行多容器应用的工具, 通过一个docker-compose.yml文件, 配置应用的服务、网络和卷,然后使用简单的命令启动或停止所有服务 为什么需要 Docker Compose 当你有一个包含多个相互依赖的容器应用时,手动…...
CSS中的em,rem,vm,vh详解
一:em 和 rem 是两种相对单位,它们常用于 CSS 中来设置尺寸、字体大小、间距等,主要用于更灵活和响应式的布局设计。它们与像素(px)不同,不是固定的,而是相对于其他元素的尺寸来计算的。 1. em …...
MQTT之重复消息(5、TCP重连和MQTT重连)
目录 1. TCP 协议层的重传(原生机制) 2. 触发 TCP 重传的具体场景 3、TCP 重传的关键参数(了解) 第一、重传超时(RTO - Retransmission Timeout) 第二、重传次数 第三、累计时间 vs 本次 RTO 的区别 第四.常见问题解答 第…...
Ground Truth(真实标注数据):机器学习中的“真相”基准
Ground Truth:机器学习中的“真相”基准 文章目录 Ground Truth:机器学习中的“真相”基准引言什么是Ground Truth?Ground Truth的重要性1. 模型训练的基础2. 模型评估的标准3. 模型改进的指导 获取Ground Truth的方法1. 人工标注2. 众包标注…...
Android学习总结之通信篇
一、Binder跨进程通信的底层实现细节(挂科率35%) 高频问题:“Binder如何实现一次跨进程方法调用?” 候选人常见错误: 仅回答“通过Binder驱动传输数据”,缺乏对内存映射和线程调度的描述混淆Binde…...
自动化发布工具CI/CD实践Jenkins部署与配置教程
1. 前言背景 其实一直想把jenkins 的笔记整理下,介于公司这次升级jenkins2.0 ,根据自己部署的一些经验,我把它整理成笔记。 之前我们的jenkins1.0 时代 还一直停留在 free style 或者 maven 风格的项目,随着项目的日益增多&#x…...
kubernet在prometheus+alertmanager+grafana框架下新增部署loki模块
整个框架拓扑图 #mermaid-svg-OK7jgNZ2I7II8nJx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OK7jgNZ2I7II8nJx .error-icon{fill:#552222;}#mermaid-svg-OK7jgNZ2I7II8nJx .error-text{fill:#552222;stroke:#552…...
Ubuntu下UEFI安全启动安装Nvdia驱动
简介 众所周知,Ubuntu默认使用Nouveau开源驱动,其性能受限,因此我们需要安装Nvidia专用驱动。 安装专用驱动的一般方法非常简单,只需要sudo ubuntu-drivers devices && sudo ubuntu-drivers autoinstall即可,…...
Java多线程与高并发专题—— CyclicBarrier 和 CountDownLatch 有什么异同?
引入 上一篇我们了解CountDownLatch的原理和常见用法,在CountDownLatch的源码注释中,有提到: 另一种典型用法是将一个问题分解为 N 个部分,用一个Runnable描述每个部分,该Runnable执行相应部分的任务并对闭锁进行倒计…...
【深度学习】不管理论,入门从手写数字识别开始
1. 环境安装 学习深度学习,开发语言是Python。Python开发工具有很多。其中 anaconda vscode的Python开发环境很好用,建议使用这个组合。 编写手写数字识别测试代码,需要在使用Anaconda安装以下4个库: NumpyScipymatplotlibsci…...
Docker使用ubuntu
1. 更换源 sudo nano /etc/docker/daemon.json //daemon.conf查找最新可用的源1、2,手动查找会不断更新! 1.1 添加DNS sudo nano /etc/resolv.confnameserver 8.8.8.8 nameserver 8.8.4.4 2. 修改配置文件后重新加载 sudo systemctl daemon-relo…...
Windows 系统下多功能免费 PDF 编辑工具详解
IceCream PDF Editor是一款极为实用且操作简便的PDF文件编辑工具,它完美适配Windows操作系统。其用户界面设计得十分直观,哪怕是初次接触的用户也能快速上手。更为重要的是,该软件具备丰富多样的强大功能,能全方位满足各类PDF编辑…...
影响HTTP网络请求的因素
影响 HTTP 网络请求的因素 1. 带宽 2. 延迟 浏览器阻塞:浏览器会因为一些原因阻塞请求,浏览器对于同一个域名,同时只能有4个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接数限制&…...
OpenGL —— 流媒体播放器 - ffmpeg解码rtsp流,opengl渲染yuv视频(附源码,glfw+glad)
🔔 OpenGL 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 效果 说明 FFMpeg和OpenGL作为两大技术巨头,分别在视频解码和图形渲染领域发挥着举足轻重的作用。本文将综合两者实战视频播放器,大概技术流程为:ffmpeg拉取rtsp协议视频流,并…...
Java + LangChain 实战入门,开发大语言模型应用!
在 Baeldung 上看到了一篇介绍基于 Java LangChain 开发大语言模型应用的基础入门文章,写的非常不错,非常适合初学者。于是,我抽空翻译了一下。 原文地址:https://www.baeldung.com/java-langchain-basics翻译: Java…...
【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解
【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解前言YOLOV1的模型结构YOLOV1模型的基本执行流程YOLOV1模型的网络参数YOLOV1模型的训练方式 YOLOV1的核心思想前向传播阶段网格单元(grid cell)…...
软考《信息系统运行管理员》- 6.2 信息系统硬件的安全运维
硬件安全运行的概念 硬件安全运行的含义是保护支撑信息系统业务活动的信息系统硬件资产免遭自然灾害、人 为因素及各种计算机犯罪行为导致的破坏。硬件安全通常包括环境安全、设备安全和介质安全。 硬件安全运行的影响因素 硬件安全运行的影响因素主要有: (1)自然…...
SQL 视图
SQL 视图 引言 SQL(结构化查询语言)视图是数据库管理系统中的一种重要概念。它提供了一个虚拟的表,该表由一个或多个基本表的数据组成,用户可以通过视图查询数据,而不需要直接操作基本表。本文将详细介绍SQL视图的定…...
Chrome 开发环境快速屏蔽 CORS 跨域限制!
Chrome 开发环境快速屏蔽 CORS 跨域限制【详细教程】 ❓ 为什么需要临时屏蔽 CORS? 在前后端开发过程中,我们经常会遇到 跨域请求被浏览器拦截 的问题。例如,你在 http://localhost:3000 调用 https://api.example.com 时,可能会…...
数值稳定性 + 模型初始化和激活函数
数值稳定性 神经网络的梯度 考虑如下有 d 层的神经网络 h t f t ( h t − 1 ) and y ℓ ∘ f d ∘ … ∘ f 1 ( x ) \mathbf{h}^t f_t(\mathbf{h}^{t-1}) \quad \text{and} \quad y \ell \circ f_d \circ \ldots \circ f_1(\mathbf{x}) htft(ht−1)andyℓ∘fd∘…∘…...
【消息队列】几个mq组件的对比: redis stream/rabbitmq/rocketmq/kafka
1. 消息队列 几个组件: Redis Stream:适用于对性能要求高、可靠性要求不高的场景Rocket MQ:可靠性高,性能优秀,但官方对 go 不太友好,sdk 缺少很多功能支持Rabbit MQ:性能适中,使用…...
TCP协议与wireshark抓包分析
一、tcp协议格式 1. 源端口号 : 发送方使用的端口号 2. 目的端口号 : 接收方使用的端口号 3. 序号: 数据包编号 , tcp 协议为每个数据都设置编号,用于确认是否接收到相应的包 4. 确认序列号 : 使用 tcp 协议接收到数据包,…...
深度学习四大核心架构:神经网络(NN)、卷积神经网络(CNN)、循环神经网络(RNN)与Transformer全概述
目录 📂 深度学习四大核心架构 🌰 知识点概述 🧠 核心区别对比表 ⚡ 生活化案例理解 🔑 选型指南 📂 深度学习四大核心架构 第一篇: 神经网络基础(NN) 🌰 知识点概述…...
springcloud 整合 Redis_Redisson
springcloud 整合 Redis 、Redisson Redis-x64-5.0.14.1 版本 https://blog.csdn.net/wojiubugaosuni12/article/details/134452665 https://www.123pan.com/s/8EpMjv-MTjBv.html spring cloud 整合 redis Redis 5.0.14 Springcloud 2021.0.5 Redis启动 redis-server.exe 点击…...
Windows模仿Mac大小写切换, 中英文切换
CapsLock 功能优化脚本部署指南 部署步骤 第一步:安装 AutoHotkey v2 访问 AutoHotkey v2 官网下载并安装最新版本安装时勾选 "Add Compile Script to context menus" 第二步:部署脚本 直接运行 (调试推荐) 新建文本文件,粘贴…...
基于Spring Boot的木里风景文化管理平台的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
【银河麒麟系统常识】命令:uname -m(查看系统架构)
命令: uname -m 功能 常用的 Linux/Unix 终端命令,用于显示当前系统的硬件架构; 返回 返回系统的CPU架构类型,用于判断软件兼容性; 输出结果架构说明常见设备x86_64Intel/AMD 64位 CPU主流 PC、服务器aarch64ARM 64位 …...
网络原理-TCP/IP
网络原理学习笔记:TCP/IP 核心概念 本文是我在学习网络原理时整理的笔记,主要涵盖传输层、网络层和数据链路层的核心协议和概念,特别是 TCP, UDP, IP, 和以太网。 一、传输层 (Transport Layer) 传输层负责提供端到端(进程到进…...
【银河麒麟高级服务器操作系统 】虚拟机运行数据库存储异常现象分析及处理全流程
更多银河麒麟操作系统产品及技术讨论,欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer…...
AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务
环境: AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 腾讯云ASR 问题描述: AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务,本地硬件配置不高的情况,建议使用云服务商的ASR 解决方案: 1.登…...
Dify 0.15.3版本 本地部署指南
目录 背景 一、单机部署机器配置最低要求 二、系统Python环境安装 安装需要的python依赖 使用pyenv官方安装脚本 安装poetry 三、中间件部署 PostgreSQL本地部署 添加PG官方仓库 安装pg 16 检查pg版本 修改密码为dify默认 创建数据库dify 安装pg vector插件 修改…...
全书测试:《C++性能优化指南》
以下20道多选题和10道设计题, 用于本书的测试。 以下哪些是C性能优化的核心策略?(多选) A) 优先优化所有代码段 B) 使用更高效的算法 C) 减少内存分配次数 D) 将所有循环展开 关于字符串优化,正确的措施包括ÿ…...
Oracle数据库数据编程SQL<递归函数详解>
递归函数是一种在函数体内直接或间接调用自身的函数。这种函数通过将复杂问题分解为更小的相同问题来解决特定类型的编程任务。 目录 一、递归函数基本概念 1. 递归定义 2. 递归工作原理 二、递归函数示例 1. 经典阶乘函数 2. 斐波那契数列 3. 计算数字位数 三、递归查…...
Burp Suite从入门到实战之配置启动
目录 1.Burp Suite配置启动 1.1安装Burp Suite jar包 1.2JDK,JDK包含JRE(Java运行时环境) 1.2.1配置JDK11环境变量配置 1.2.2系统变量里添加JAVA_HOME编辑 1.2.3找到Path变量进行编辑添加bin 1.2.4命令行查看是否配置成功 1.3激活j…...
【力扣hot100题】(016)缺失的第一个正数
题目里这么多条条框框……先不按条条框框做了两下。 第一个思路:你不仁我不义,先排序后遍历(时间不符题意) class Solution { public:int firstMissingPositive(vector<int>& nums) {sort(nums.begin(),nums.end());i…...
(undone) MIT6.824 Lecture 02 - RPC and Threads
知乎专栏:https://zhuanlan.zhihu.com/p/641105196 原视频:https://www.bilibili.com/video/BV16f4y1z7kn?spm_id_from333.788.videopod.episodes&vd_source7a1a0bc74158c6993c7355c5490fc600&p2 看知乎专栏 一、Why we choose go?…...
红宝书第二十一讲:详解JavaScript的模块化(CommonJS与ES Modules)
红宝书第二十一讲:详解JavaScript的模块化(CommonJS与ES Modules) 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、模块化的意义:分而治之 模块化解决代码依赖混…...
输入百分比校验(数字非负数保留2位不四舍五入)
场景用于输入百分比,限制只能输入非负数,保留2位小数,且不四舍五入 以下举例环境 vue2 element-ui 请自行根据实际场景使用 html部分 <el-inputv-model"item.percentage"placeholder"请输入"maxlength"5"…...
Python----机器学习(KNN:决策边界,决策边界计算,交叉验证步骤)
一、KNN算法简介 1.1、定义 KNN(K-Nearest Neighbor)算法是一种基于实例的学习方法,通过测量数据点之间的距离进行分类或回归分析。它是一种简单易懂的多分类技术,依赖于距离最近的邻居来推断数据点的类别或数值,为许…...
SpringBoot 3+ Lombok日志框架从logback改为Log4j2
r要将Spring Boot 3项目中的日志框架从Logback切换到Log4j2,并配置按日期滚动文件和控制台输出,请按照以下步骤操作: 步骤 1:排除Logback并添加Log4j2依赖 在pom.xml中修改依赖: <dependencies><!-- 排除默…...