当前位置:网站首页>Keepalived热备与HAProxy
Keepalived热备与HAProxy
2022-07-03 04:45:00 【*_花非人陌_*】
目录
一、Keepalived概述
1、Keepalived描述
Keepalived实现了高可用集群 Keepalived最初是为了LVS设计的
- 专门监控各服务器节点状态
Keepalived后来加入了VRRP功能,防止单点故障
2、Keepalived运行原理
Keepalived检测每个服务器节点状态 服务器节点异常或工作出现故障,Keepalived将故障节点从集群系统中剔除 故障节点恢复后,Keepalived再将其加入到集群系统中 所有工作自动完成,无需人工干预
二、Keepalived服务
1、 Keepalived高可用服务器拓扑图

2、Keepalived安装与配置
① WEB1部署环境与安装Keepalived
[[email protected] ~]# nmcli connection modify ens33 ipv4.method manual ipv4.address 192.168.5.11/24 ipv4.gateway 192.168.5.254 ipv4.dns 114.114.114.114 connection.autoconnect yes #由于我配的是是网络yum源需要联网,只做实验有本地yum源只配IP和子网即可 [[email protected] ~]# nmcli connection up ens33 #激活网卡 [[email protected] ~]# yum -y install httpd [[email protected] ~]# echo "192.168.5.11" > /var/www/html/index.html #编写测试网页 [[email protected] ~]# yum install -y keepalived #安装Keepalived [[email protected] ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id web1 #设置路由ID号,可以随意修改 vrrp_iptables #清除防火墙的拦截规则 } vrrp_instance VI_1 { state MASTER #主服务器为MASTER(备服务器需要修改为BACKUP) interface ens33 #定义网络接口 virtual_router_id 51 #主备服务器VRID号必须一致 priority 100 #服务器优先级,优先级高优先获取VIP(数字越大优先级越高) advert_int 1 #检查间隔,默认1秒 VRRP心跳包的发送周期,单位为s组播信息发送间隔,两个节点设置必须一样 authentication { auth_type PASS #验证类型 auth_pass 1111 #主备服务器密码必须一致 } virtual_ipaddress { 192.168.5.80/24 #VIP地址 } } [[email protected] ~]# systemctl restart keepalived.service #重启服务 [[email protected] ~]# ip a s ens33 #会出现5.80的VIP地址
② WEB2部署与安装Keepalived
[[email protected] ~]# nmcli connection modify ens33 ipv4.method manual ipv4.address 192.168.5.12/24 ipv4.gateway 192.168.5.254 ipv4.dns 114.114.114.114 connection.autoconnect yes #由于我配的是是网络yum源需要联网,只做实验有本地yum源只配IP和子网即可 [[email protected] ~]# nmcli connection up ens33 #激活网卡 [[email protected] ~]# yum -y install httpd [[email protected] ~]# echo "192.168.5.11" > /var/www/html/index.html #编写测试网页 [[email protected] ~]# yum install -y keepalived #安装Keepalived [[email protected] ~]# scp [email protected]:/etc/keepalived/keepalived.conf /etc/keepalived/ #将web1的Keepalived文件覆盖到本地,减少修改时间 [[email protected] ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id web2 #设置路由ID号 vrrp_iptables } vrrp_instance VI_1 { state BACKUP #主服务器为MASTER(备服务器需要修改为BACKUP) interface ens33 virtual_router_id 51 priority 50 #服务器优先级,优先级高优先获取VIP(数字越大优先级越高) advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.5.80/24 } } [[email protected] ~]# systemctl restart keepalived.service #重启服务
3、客户端验证
① 默认主备都正常,浮动IP会给到web1
② 若主(web1)异常,浮动IP会给到web2
[[email protected] ~]# systemctl stop keepalived.service #停止web1的keepalived服务
三、keepalived+LVS
1、keepalived+LVS拓扑
① 使用Keepalived高可用解决调度器单点故障问题
② 主、备调度器上配置LVS
③ 主调度器异常时,Keepalived启用备用调度器
2、配置web1服务器
将第一个实验环境web1、web2的Keepalived服务停掉 [[email protected] ~]# systemctl stop keepalived.service 注意:这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样 [[email protected] ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0 #配置VIP地址 DEVICE=lo:0 #设备名称 IPADDR=192.168.5.50 #IP地址 NETMASK=255.255.255.255#子网掩码 NETWORK=192.168.5.50 #网络地址 BROADCAST=192.168.5.50 #广播地址 ONBOOT=yes #开机是否激活网卡 NAME=lo:0 #网卡名称 注意:因为web1配置与调度器一样的VIP地址,默认肯定会出现地址冲突, [[email protected] ~]# vim /etc/sysctl.conf #修改文件,目的(只有调度器响应,其他主机均不响应) net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_announce = 2 #当有arp广播问谁是192.168.5.50时,本机忽略该ARP广播,不做任何回应(防止进站冲突) #本机不要向外宣告自己的lo回环地址是192.168.5.50(防止出站冲突) [[email protected] ~]# sysctl -p #加载系统参数 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_announce = 2 [[email protected] ~]# systemctl restart network #重启网络服务 [[email protected] ~]# ip a s lo | grep inet #查看虚拟IP是否生成 inet 127.0.0.1/8 scope host lo inet 192.168.5.50/32 brd 192.168.5.50 scope global lo:0 inet6 ::1/128 scope host
3、配置web2服务器
将第一个实验环境web2的Keepalived服务停掉 [[email protected] ~]# systemctl stop keepalived.service 注意:这里的子网掩码必须是32(也就是全255),网络地址与IP地址一样,广播地址与IP地址也一样 [[email protected] ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0 #配置VIP地址 DEVICE=lo:0 #设备名称 IPADDR=192.168.5.50 #IP地址 NETMASK=255.255.255.255#子网掩码 NETWORK=192.168.5.50 #网络地址 BROADCAST=192.168.5.50 #广播地址 ONBOOT=yes #开机是否激活网卡 NAME=lo:0 #网卡名称 注意:因为web1配置与调度器一样的VIP地址,默认肯定会出现地址冲突, [[email protected] ~]# vim /etc/sysctl.conf #修改文件,目的(只有调度器响应,其他主机均不响应) net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_announce = 2 #当有arp广播问谁是192.168.5.50时,本机忽略该ARP广播,不做任何回应(防止进站冲突) #本机不要向外宣告自己的lo回环地址是192.168.5.50(防止出站冲突) [[email protected] ~]# sysctl -p #加载系统参数 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_announce = 2 [[email protected] ~]# systemctl restart network #重启网络服务 [[email protected] ~]# ip a s lo | grep inet #查看虚拟IP是否生成 inet 127.0.0.1/8 scope host lo inet 192.168.5.50/32 brd 192.168.5.50 scope global lo:0 inet6 ::1/128 scope host
4、配置proxy
[[email protected] ~]# nmcli connection modify eth0 ipv4.method manual ipv4.address 192.168.5.5/24 ipv4.gateway 192.168.5.254 ipv4.dns 114.114.114.114 connection.autoconnect yes #由于我配的是是网络yum源需要联网,只做实验有本地yum源只配IP和子网即可 [[email protected] ~]# nmcli connection up eth0 [[email protected] ~]# yum -y install ipvsadm [[email protected] ~]# yum -y install keepalived [[email protected] ~]# rm -rf /etc/sysconfig/network-scripts/ifcfg-eth0:0 #若没有不用删除,之前的实验配置过之前VIP网卡 [[email protected] ~]# ipvsadm -C #清除所有规则 [[email protected] ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id proxy #设置路由号 vrrp_iptables #清除防火墙规则 } vrrp_instance VI_1 { state MASTER #设置为主服务器为MASTER interface eth0 #定义网络接口 virtual_router_id 51 #主备VRID号必须一致 priority 100 #服务器优先级 advert_int 1 #检查间隔,默认1秒 VRRP心跳包的发送周期,单位为s组播信息发送间隔,两个节点设置必须一样 authentication { auth_type PASS #认证方式 auth_pass 1111 #认证密码,主备必须一致 } virtual_ipaddress { #设置VIP 192.168.5.50/24 } } virtual_server 192.168.5.50 80 { #设置ipvsadm的VIP规则 delay_loop 6 #健康检查时间间隔(不大于6s,值不定) lb_algo wrr #LVS调度算法,wrr加权轮询 lb_kind DR #负载均衡调度算法 #persistence_timeout 50 #会话保持时间,开启后客户端在一定时间内(50秒)始终访问相同服务器 protocol TCP #TCP协议 real_server 192.168.5.11 80 { #设置后端web服务器真实IP weight 1 #权重值 TCP_CHECK { #对后台real_server做健康检查 connect_timeout 3 #健康检查的超时时间3秒 nb_get_retry 3 #健康检查的重试次数3次 delay_before_retry 3 #健康检查的间隔时间3秒 } } real_server 192.168.5.12 80 { #设置后端web服务器真实IP weight 2 #设置权重为2 TCP_CHECK { #对后台real_server做健康检查 connect_timeout 3 #健康检查的超时时间3秒 nb_get_retry 3 #健康检查的重试次数3次 delay_before_retry 3 #健康检查的间隔时间3秒 } } } [[email protected] ~]# systemctl restart keepalived.service [[email protected] ~]# ipvsadm -Ln #查看IP规则 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.5.50:80 wrr -> 192.168.5.11:80 Route 1 0 0 -> 192.168.5.12:80 Route 2 0 0 [[email protected] ~]# ip a s eth0 | grep inet #查看VIP配置 inet 192.168.5.5/24 brd 192.168.5.255 scope global noprefixroute eth0 inet 192.168.5.50/24 scope global secondary eth0 #VIP已产生 inet6 fe80::da6d:94a0:3f30:531/64 scope link noprefixroute
5、配置proxy1
[[email protected] ~]# nmcli connection modify eth0 ipv4.method manual ipv4.address 192.168.5.6/24 ipv4.gateway 192.168.5.254 ipv4.dns 114.114.114.114 connection.autoconnect yes #由于我配的是是网络yum源需要联网,只做实验有本地yum源只配IP和子网即可 [[email protected] ~]# nmcli connection up eth0 [[email protected] ~]# yum -y install ipvsadm [[email protected] ~]# yum -y install keepalived [[email protected] ~]# scp [email protected]:/etc/keepalived/keepalived.conf /etc/keepalived/ #拷贝proxy配置文件 [[email protected] ~]# ipvsadm -C #清除所有规则 [[email protected] ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id proxy1 #设置路由号 vrrp_iptables #清除防火墙规则 } vrrp_instance VI_1 { state BACKUP #设置为主服务器为MASTER interface eth0 #定义网络接口 virtual_router_id 51 #主备VRID号必须一致 priority 50 #服务器优先级 advert_int 1 #检查间隔,默认1秒 VRRP心跳包的发送周期,单位为s组播信息发送间隔,两个节点设置必须一样 authentication { auth_type PASS #认证方式 auth_pass 1111 #认证密码,主备必须一致 } virtual_ipaddress { #设置VIP 192.168.5.50/24 } } virtual_server 192.168.5.50 80 { #设置ipvsadm的VIP规则 delay_loop 6 #健康检查时间间隔(不大于6s,值不定) lb_algo wrr #LVS调度算法,wrr加权轮询 lb_kind DR #负载均衡调度算法 #persistence_timeout 50 #会话保持时间,开启后客户端在一定时间内(50秒)始终访问相同服务器 protocol TCP #TCP协议 real_server 192.168.5.11 80 { #设置后端web服务器真实IP weight 1 #权重值 TCP_CHECK { #对后台real_server做健康检查 connect_timeout 3 #健康检查的超时时间3秒 nb_get_retry 3 #健康检查的重试次数3次 delay_before_retry 3 #健康检查的间隔时间3秒 } } real_server 192.168.5.12 80 { #设置后端web服务器真实IP weight 2 #设置权重为2 TCP_CHECK { #对后台real_server做健康检查 connect_timeout 3 #健康检查的超时时间3秒 nb_get_retry 3 #健康检查的重试次数3次 delay_before_retry 3 #健康检查的间隔时间3秒 } } } [[email protected] ~]# systemctl restart keepalived.service [[email protected] ~]# ipvsadm -Ln #查看LVS规则 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.5.50:80 wrr -> 192.168.5.11:80 Route 1 0 0 -> 192.168.5.12:80 Route 2 0 0 [[email protected] ~]# ip a s eth0 | grep inet #查看VIP配置,因为是从所以没有产生VIP inet 192.168.5.6/24 brd 192.168.5.255 scope global noprefixroute eth0 inet6 fe80::b1e:5f70:5e1e:8c0f/64 scope link noprefixroute
6、验证测试
① 使用clinet主机(自行配置同网IP)
[[email protected] ~]# curl 192.168.5.50 192.168.5.11 [[email protected] ~]# curl 192.168.5.50 192.168.5.12 [[email protected] ~]# curl 192.168.5.50 192.168.5.12 [[email protected] ~]# curl 192.168.5.50 192.168.5.11 [[email protected] ~]# curl 192.168.5.50 192.168.5.12 [[email protected] ~]# curl 192.168.5.50 #因为是加权轮询,所以web2每次被访问2次② 使用主机浏览器访问验证轮询效果不加,猜测是缓存机制问题
③ 停止主服务器keepalived,VIP会自动跳到备用服务器
[root[email protected] ~]# systemctl stop keepalived.service [[email protected] ~]# ip a s eth0 | grep inet #proxy1设备查看,VIP已跳到备用服务器 inet 192.168.5.6/24 brd 192.168.5.255 scope global noprefixroute eth0 inet 192.168.5.50/24 scope global secondary eth0 inet6 fe80::b1e:5f70:5e1e:8c0f/64 scope link noprefixroute [[email protected] ~]# systemctl start keepalived.service #再开启主服务器 [[email protected] ~]# ip a s eth0 | grep inet #VIP自动跳到主服务器 inet 192.168.5.5/24 brd 192.168.5.255 scope global noprefixroute eth0 inet 192.168.5.50/24 scope global secondary eth0 inet6 fe80::da6d:94a0:3f30:531/64 scope link noprefixroute [[email protected] ~]# ip a s eth0 | grep inet #备用服务器VIP自动消失 inet 192.168.5.6/24 brd 192.168.5.255 scope global noprefixroute eth0 inet6 fe80::b1e:5f70:5e1e:8c0f/64 scope link noprefixroute
四、HAProxy服务
1、HAProxy概述
1. HAProxy简介
① 它是免费、快速并且可靠的一种解决方案 ② 适用于那些负载大的Web站点,这些站点通常又需要会话保持或七层处理 ③ 提供高可用性、、负载均衡以及基于TCP和HTTP应用的代理
2. 衡量负载均衡器性能的因素
Session rate 会话率
- 每秒钟产生的会话数
Session concurrency 并发会话数
- 服务器处理会话的时间越长,并发会话数越多
Data rate 数据速率
- 以MB/s或Mbps衡量
3. HAProxy工作模式
mode http
- 客户端请求被深度分析后再发往服务器
mode tcp
- 4层调度,不检查第七层信息
mode health
- 仅做健康状态检查,已经不建议使用
2、HAProxy配置案例
1. 拓扑图
通俗的讲,就是客户端要送礼给WEB,HAProxy全程保密的进行,过程中客户端和WEB只是单方面知道HAProxy存在,但是客户端与WEB并不互知
2. 部署web1
[[email protected] ~]# nmcli connection modify ens33 ipv4.method manual ipv4.address 192.168.4.11/24 connection.autoconnect yes
[[email protected] ~]# nmcli connection up ens33 #配置并激活ens33,网卡名根据自己设备实际来
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# systemctl start httpd
[[email protected] ~]# echo "192.168.4.11:web1" > /var/www/html/index.html3. 部署web2
[[email protected] ~]# nmcli connection modify ens33 ipv4.method manual ipv4.address 192.168.4.11/24 connection.autoconnect yes
[[email protected] ~]# nmcli connection up ens33 #配置并激活ens33,网卡名根据自己设备实际来
[[email protected] ~]# yum -y install httpd
[[email protected] ~]# systemctl start httpd
[[email protected] ~]# echo "192.168.4.11:web1" > /var/www/html/index.html4. 部署HAProxy
[[email protected] ~]# nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.5.5/24 ipv4.gateway 192.168.5.254 ipv4.dns 8.8.8.8 connection.autoconnect yes [[email protected] ~]# nmcli connection up eth0 #配置并激活eth0 [[email protected] ~]# nmcli connection modify eth1 ipv4.method manual ipv4.addresses 192.168.4.5/24 ipv4.gateway 192.168.4.254 ipv4.dns 8.8.8.8 connection.autoconnect yes [[email protected] ~]# nmcli connection up eth1 #配置并激活eth1 [[email protected] ~]# yum -y install haproxy #安装haproxy [[email protected] ~]# yum -y install keepalived #安装keepalived [[email protected] ~]# yum -y install ipvsadm #安装ipvsadm [[email protected] ~]# ipvsadm -C #清除规则 [[email protected] ~]# vim /etc/haproxy/haproxy.cfg #修改配置文件 global log 127.0.0.1 local2 #调试错误警告信息 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid#haproxy的pid存放路径 maxconn 4000 #最大连接数量 user haproxy #用户 group haproxy #组 daemon #将进程放入deamon模式运行 stats socket /var/lib/haproxy/stats defaults mode http #默认的模式{tcp | http | health} log global #采用全局定义的日志 option httplog #日志类别 option dontlognull #不记录健康检查的日志信息 option http-server-close #每次请求完毕后主动关闭http通道 option forwardfor except 127.0.0.0/8 option redispatch #serverid服务器挂掉后强制定向到其它健康服务器 retries 3 #3次失败就会认为服务不可用 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m #客户端连接超时 timeout server 1m #服务器连接超时 timeout http-keep-alive 10s timeout check 10s maxconn 3000 #最大连接次数 frontend main *:5000 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend app backend static balance roundrobin server static 127.0.0.1:4331 check backend app balance roundrobin server app1 127.0.0.1:5001 check server app2 127.0.0.1:5002 check server app3 127.0.0.1:5003 check server app4 127.0.0.1:5004 check listen webs *:80 #定义集群,listen后面的名称任意,端口为80 balance roundrobin #balance指定调度算法为轮询(不能用简写的rr) server web1 192.168.4.11:80 check inter 2000 rise 2 fall 5 server web2 192.168.4.12:80 check inter 2000 rise 2 fall 5 #server指定后端真实服务器,web1和web2的名称可以任意 listen stats 0.0.0.0:1080 #监听端口 stats refresh 30s #统计页面自动刷新时间 stats uri /stats #统计界面url stats realm HaManager #进入管理界面查看状态信息 stats auth admin:admin #统计页面用户名和密码设置 #stats hide-version #隐藏统计页面上HAProxy的版本信息 [[email protected] ~]# systemctl enable --now haproxy.service #启动haproxy
5.客户端访问测试
① 客户端配置与HAProxy相同网络的IP地址,使用浏览器访问http://192.168.5.5,测试调度器是否可正常工作
② 客户端访问http://192.168.5.5:1080/stats测试状态监控是否正常
Queue队列数据的信息(当前队列数量,最大值,队列限制数量);
Session rate每秒会话率(当前值,最大值,限制数量);
Sessions总会话量(当前值,最大值,总量,Lbtot: total number of times a server was selected选中一台服务器所用的总时间);
Bytes(入站、出站流量);
Denied(拒绝请求、拒绝回应);
Errors(错误请求、错误连接、错误回应);
Warnings(重新尝试警告retry、重新连接redispatches);
Server(状态、最后检查的时间(多久前执行的最后一次检查)、权重、备份服务器数量、down机服务器数量、down机时长)。
当停止web2时,监控界面会动态监测
五、集群调度软件对比
1、NGINX分析
优点: - 工作在7层,可以针对http做分流策略 - 1.9版本开始支持4层代理 - 正则表达式比HAProxy强大 - 安装、配置、测试简单,通过日志可以解决多数问题 - 并发量可以达到几万次 - Nginx还可以作为web服务器使用 缺点: - 7层代理仅支持https、https、mail协议,应用面小 - 监控检查仅通过端口,无法使用url检查
2、LVS分析
优点: - 负载能力强,工作在四层,对内存、CPU消耗低 - 配置性低,没有太多可配置性,减少人为错误 - 应用面广,几乎可以为所有应用提供负载均衡 缺点: - 不支持正则表达式,不能实现动静分离 - 如果网站架构庞大,LVS-DR配置比较繁琐
3、HAProxy分析
优点: - 支持session、cookie功能 - 可以通过url进行健康检查 - 效率、负载均衡速度,高于Nginx、低于LVS - HAProxy支持TCP,可以对MySQL进行负载均衡 - 调度算法丰富 缺点: - 正则弱于Nginx - 日志依赖于syslogd
边栏推荐
- Kingbasees plug-in KDB of Jincang database_ date_ function
- 2022 new examination questions for the main principals of hazardous chemical business units and examination skills for the main principals of hazardous chemical business units
- [set theory] relational representation (relational matrix | examples of relational matrix | properties of relational matrix | operations of relational matrix | relational graph | examples of relationa
- Factor stock selection scoring model
- 关于开学的准备与专业认知
- 【PHP漏洞-弱类型】基础知识、php弱相等、报错绕过
- Matplotlib -- save graph
- I stepped on a foundation pit today
- Introduction to message queuing (MQ)
- 移动端——uniapp开发记录(公共请求request封装)
猜你喜欢

Human resource management system based on JSP
![[set theory] relational representation (relational matrix | examples of relational matrix | properties of relational matrix | operations of relational matrix | relational graph | examples of relationa](/img/a9/92059db74ccde03b84c69dfce35b37.jpg)
[set theory] relational representation (relational matrix | examples of relational matrix | properties of relational matrix | operations of relational matrix | relational graph | examples of relationa

The least operation of leetcode simple problem makes the array increment

Web security - CSRF (token)

The programmer went to bed at 12 o'clock in the middle of the night, and the leader angrily scolded: go to bed so early, you are very good at keeping fit

Handling record of electric skateboard detained by traffic police

Concurrent operation memory interaction

Mobile terminal - uniapp development record (public request encapsulation)

After job hopping at the end of the year, I interviewed more than 30 companies in two weeks and finally landed

2022 Shandong Province safety officer C certificate examination content and Shandong Province safety officer C certificate examination questions and analysis
随机推荐
Market status and development prospects of the global autonomous marine glider industry in 2022
[set theory] binary relationship (binary relationship notation | binary relationship from a to B | number of binary relationships | example of binary relationship)
Use the benchmarksql tool to perform a data prompt on kingbases. The jdbc driver cannot be found
带有注意力RPN和多关系检测器的小样本目标检测网络(提供源码和数据及下载)...
Why does I start with =1? How does this code work?
Integration of Android high-frequency interview questions (including reference answers)
并发操作-内存交互操作
[SQL injection point] location and judgment of the injection point
2022 P cylinder filling test content and P cylinder filling simulation test questions
Valentine's day limited withdrawal guide: for one in 200 million of you
The programmer went to bed at 12 o'clock in the middle of the night, and the leader angrily scolded: go to bed so early, you are very good at keeping fit
第十九届浙江省 I. Barbecue
STM32 reverse entry
Truncated sentences of leetcode simple questions
关于开学的准备与专业认知
Library management system based on SSM
Matplotlib -- save graph
How to choose cross-border e-commerce multi merchant system
I've seen a piece of code in the past. I don't know what I'm doing. I can review it when I have time
文献阅读_基于多模态数据语义融合的旅游在线评论有用性识别研究(中文文献)









