LVS的三种工作模式---(DR/TUN/NAT)

目录

一、NAT模式(LVS-NAT)

二、IP隧道模式(LVS-TUN)

三、DR模型--直接路由模式(LVS-DR)

LVS/DR模式ARP抑制

 原因:

LVS的DR工作模式及配置:

LVS的NAT工作模式及配置:


一、NAT模式(LVS-NAT)

原理:就是把客户端发来的数据包的IP头的目的地址,在负载均衡器上换成其中一台RS的IP地址,并发至此真实服务器RS来处理,RS处理完成后把数据交给经过负载均衡器,负载均衡器再把数据包的原IP地址改为自己的IP,将目的地址改为客户端IP地址即可。

在整个过程中,负载调度作为NAT设备,负责将请求数据包的源IP从客户端IP转换为负载调度器的VIP(虚拟IP),并将响应数据包的源IP从真实服务器的私有IP转换回VIP

二、IP隧道模式(LVS-TUN)

       调度器把请求的报文通过 IP 隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端。这样调度器就只处理请求入站报文,由于一般网络服务应答数据比请求报文大很多,采用 lvs-tun 模式后,可以大大的减少对负载调度器的压力,集群系统的最大吞吐量可以提高 10 倍

三、DR模型--直接路由模式(LVS-DR)

      客户端向目标vip发出请求,lvs接收 ,LVS根据负载均衡算法选择一台活跃的的节点,将此节点的ip所在网卡的mac地址作为目标mac地址,发送到局域网里

节点在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文.随后重新封装报文,发送到局域网.此时IP包的目标ip是客户端,源ip是自己的vip地址。

LVS的DR工作模式及配置:

环境准备:

四台openEuler操作系统的虚拟机

openEuler node1充当前端的负载调度器

openEuler node2充当客户端测试

openEuler node3充当后端web服务器

openEuler node4充当后端web服务器

关闭所有防火墙和selinux

openEuler node3和openEuler node4 :

添加dummy类型的接口VIP:

[root@node1 ~]# nmcli connection add type dummy ifname dummy1 ipv4.method manual ipv4.addresses 192.168.182.140/24

[root@node3 ~]# nmcli con add type dummy ifname dummy1 ipv4.method manual ipv4.addresses 192.168.182.140/24

[root@node4 ~]# nmcli connection add type dummy ifname dummy1 ipv4.method manual ipv4.addresses 192.168.182.140/24

修改相应的ARP内核配置(ARP的抑制)

[root@node3 ~]# cat >> /etc/sysctl.conf << EOF

net.ipv4.conf.all.arp_ignore=1

net.ipv4.conf.all.arp_announce=2

net.ipv4.conf.dummy1.arp_ignore=1

net.ipv4.conf.dummy1.arp_announce=2

EOF

[root@node3~]# sysctl -p           使其生效

[root@node4 ~]# cat >> /etc/sysctl.conf << EOF

net.ipv4.conf.all.arp_ignore=1

net.ipv4.conf.all.arp_announce=2

net.ipv4.conf.dummy1.arp_ignore=1

net.ipv4.conf.dummy1.arp_announce=2

EOF

[root@node4~]# sysctl -p           使其生效

准备web站点:

[root@node3 ~]# dnf install nginx -y

[root@node4 ~]# dnf install nginx -y

提供默认主页:

[root@node3 ~]# echo "web test page,my ip is`hostname -I`." > /usr/share/nginx/html/index.html

[root@node3 ~]# systemctl start nginx

[root@node4 ~]# echo "web test page,my ip is`hostname -I`." > /usr/share/nginx/html/index.html

[root@node4 ~]# systemctl start nginx

openEuler node2:测试

[root@node2 ~]# curl 192.168.182.144

web test page,my ip is192.168.182.144 192.168.182.140 .

[root@node2 ~]# curl 192.168.182.143

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

准备安装工具:

[root@node1 ~]# dnf install ipvsadm -y

几种常见的算法:

rr

轮循调度(Round-Robin),它将请求依次分配不同的RS,也就是在RS中均摊请求。这种

算法简单,但是只适合于处理性能相差不大的情况

wrr

加权轮循调度(Weighted Round-Robin)它将依据不同RS的权值分配任务。权值较高的

RS将优先获得任务,并且分配到的连接数将比权值较低的RS更多。相同权值的RS得到相

同数目的连接数。

wlc

加权最小连接数调度(weighted leastconnection)假设各台RS的权值依次为wi

(i=1..n),当前的TCP连接数依次为Ti(i=1..n),依次选取Ti/Wi为最小的RS作为下一个

分配的RS。

lc

最小连接数调度(Least-Connection),IPVS表存储了所有的活动的连接。把心的连接请

求发送到当前连接数最小的RS。

负载均衡器:

[root@node1 ~]# ipvsadm -At 192.168.182.140:80 -s  rr   

[root@node1 ~]# ipvsadm -at 192.168.182.140:80 -r 192.168.182.143:80

[root@node1 ~]# ipvsadm -at 192.168.182.140:80 -r 192.168.182.144:80

[root@node1 ~]# 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.182.140:80 wlc

  -> 192.168.182.143:80           Route   1      0          0        

  -> 192.168.182.144:80           Route   1      0          0

测试:

[root@node2 ~]# for ((i=1;i<=6;i++));do curl 192.168.182.140;done

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

web test page,my ip is192.168.182.144 192.168.182.140 .

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

web test page,my ip is192.168.182.144 192.168.182.140 .

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

web test page,my ip is192.168.182.144 192.168.182.140 .

加权轮询调度算法:

[root@node1 ~]# ipvsadm -At 192.168.182.140:80 -s  wrr   

[root@node1 ~]# ipvsadm -at 192.168.182.140:80 -r 192.168.182.144:80    不指定默认为1

[root@node1 ~]# ipvsadm -at 192.168.182.140:80 -r 192.168.182.143:80 -w 2    指定143web服务器为2

[root@node1 ~]# 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.182.140:80 wrr

  -> 192.168.182.143:80           Route   2      0          3        

  -> 192.168.182.144:80           Route   1      0          3

测试:

[root@node2 ~]# for ((i=1;i<=6;i++));do curl 192.168.182.140;done

web test page,my ip is192.168.182.144 192.168.182.140 .

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

web test page,my ip is192.168.182.144 192.168.182.140 .

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

web test page,my ip is192.168.182.143 172.17.0.1 192.168.182.140 .

常用命令:

[root@node1 ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm    保存这个加权轮询调度算法

[root@node1 ~]# cat /etc/sysconfig/ipvsadm

-A -t 192.168.182.140:80 -s wrr

-a -t 192.168.182.140:80 -r 192.168.182.143:80 -g -w 2

-a -t 192.168.182.140:80 -r 192.168.182.144:80 -g -w 1

[root@node1 ~]# ipvsadm -C   清除

[root@node1 ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActCon

[root@node1 ~]# ipvsadm -R < /etc/sysconfig/ipvsadm   恢复

[root@node1 ~]# 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.182.140:80 wrr

  -> 192.168.182.143:80           Route   2      0          0        

  -> 192.168.182.144:80           Route   1      0          0  

删除VIP接口:

[root@node1 ~]# nmcli connection  delete dummy-dummy1

成功删除连接 "dummy-dummy1" (bfe8c98b-1e87-4cf9-b3b7-49f2ca4699a9)。

ARP抑制:

[root@node3 ~]# cat /proc/sys/net/ipv4/conf/all/arp_ignore

1

另一种方法:使用arptables工具来做arp抑制

[root@node1 ~]# dnf install arptables -y

[root@node1 ~]# arptables -A INPUT -d 192.168.182.140 -j DROP    抑制dummy-dummy1这个接口流量的流入

[root@node1 ~]# arptables -A OUTPUT -s 192.168.182.140 -j mangle --mangle-ip-s 192.168.182.140

[root@node1 ~]# arptables-save > /etc/sysconfig/arptables   保存

[root@node1 ~]# arptables -F

[root@node1 ~]# arptables -L -n

Chain INPUT (policy ACCEPT)

Chain OUTPUT (policy ACCEPT)

Chain FORWARD (policy ACCEPT)

[root@node1 ~]# arptables-restore < /etc/sysconfig/arptables    恢复

[root@node1 ~]# arptables -L -n

Chain INPUT (policy ACCEPT)

-j DROP -d 192.168.182.140

Chain OUTPUT (policy ACCEPT)

-j mangle -s 192.168.182.140 --mangle-ip-s 192.168.182.140

Chain FORWARD (policy ACCEPT)

[root@node1 ~]#

LVS的NAT工作模式及配置:

环境准备:准备4台openEuler操作系统的虚拟机

openEuler node1充当前端的负载调度器

openEuler node2充当客户端测试

openEuler node3充当后端web服务器

openEuler node4充当后端web服务器

VMWARE

openEuler node1上增加网络适配器并改为仅主机模式

openEuler node3上网络适配器改为仅主机模式

openEuler node4上网络适配器改为仅主机模式

[root@node1 ~]# nmcli connection add type ethernet ifname ens224 ipv4.method manual ipv4.addresses 10.10.10.21/24

在openEuler node3和openEuler node4上使用nmtui命令修改ip地址分别是10.10.10.2310.10.10.24,网关都指向10.10.10.21的内网,无DNS

[root@node1 ~]# echo  1 > /proc/sys/net/ipv4/ip_forward     开启路由转发

开启路由转发:

临时开启:

方法1 echo 1 > /proc/sys/net/ipv4/ip_forward

方法2 sysctl -w net.ipv4.ip_forward=1

永久开启:

Vim /etc/sysctl.conf

准备web站点:

[root@node3 ~]# dnf install nginx -y

[root@node4 ~]# dnf install nginx -y

提供默认主页:

[root@node3 ~]# echo "web test page,my ip is`hostname -I`." > /usr/share/nginx/html/index.html

[root@node3 ~]# systemctl start nginx

[root@node4 ~]# echo "web test page,my ip is`hostname -I`." > /usr/share/nginx/html/index.html

[root@node4 ~]# systemctl start nginx

[root@node1 ~]# ipvsadm -At 192.168.182.141:80 -s  rr   

[root@node1 ~]# ipvsadm -at 192.168.182.141:80 -r 10.10.10.23:80  -m   指定目标为NAT转发模式

[root@node1 ~]# ipvsadm -at 192.168.182.141:80 -r 10.10.10.24:80  -m   指定目标为NAT转发模式

[root@node1 ~]# 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.182.141:80 rr

  -> 10.10.10.23:80                        Masq     1              0                      0        

  -> 10.10.10.24:80                        Masq     1              0                      0

测试:

[root@node2 ~]# for ((i=1;i<=6;i++));do curl 192.168.182.141;done

web test page,my ip is 10.10.10.23.

web test page,my ip is 10.10.10.24.

web test page,my ip is 10.10.10.23.

web test page,my ip is 10.10.10.24.

web test page,my ip is 10.10.10.23.

web test page,my ip is 10.10.10.24.

[root@node1 ~]# ipvsadm -Et 192.168.182.141:80 -s wrr -p 60   60秒内都由某个服务器来提供响应

[root@node1 ~]# iptables -t mangle -A PREROUTING -d 192.168.182.141 -p tcp --dport 80 -j MARK --set-mark 10

# 添加一个防火墙规则,当目标地址为 192.168.182.141 并且 目标端口为 80 时给数据包打一

个标记,设置mark 值为 10

[root@node1 ~]# iptables -t mangle -A PREROUTING -d 192.168.182.141 -p tcp --dport 443 -j MARK --set-mark 10

# 添加一个防火墙规则,当目标地址为 192.168.182.141 并且 目标端口为 443 时给数据包打一个标记,

设置mark 值为 10

[root@node1 ~]# ipvsadm -A -f 10 -s rr -p 100 # 添加一个负载调度器,当 mark 值为 10 时进行负载均衡使  轮询算法,持久化时间100

[root@node1 ~]# ipvsadm -a -f 10 -r 10.10.10.23:80 -m

[root@node1 ~]# ipvsadm -a -f 10 -r 10.10.10.24:80 -m

[root@node1 ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

FWM  10 rr persistent 100

  -> 10.10.10.23:80               Masq    1      0          0        

  -> 10.10.10.24:80               Masq    1      0          0        

测试:

[root@node2 ~]# for ((i=1;i<=6;i++));do curl 192.168.182.141;done

web test page,my ip is 10.10.10.24.

web test page,my ip is 10.10.10.24.

web test page,my ip is 10.10.10.24.

web test page,my ip is 10.10.10.24.

web test page,my ip is 10.10.10.24.

web test page,my ip is 10.10.10.24.

[root@node1 ~]# ipvsadm -D -f 10 删除

[root@node1 ~]# ipvsadm -Ln

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

openEuler版本自带iptables

[root@node1 ~]# iptables -t mangle -L -n

Chain PREROUTING (policy ACCEPT)

target     prot opt source               destination        

MARK       tcp  --  0.0.0.0/0            192.168.182.141      tcp dpt:80 MARK set 0xa

MARK       tcp  --  0.0.0.0/0            192.168.182.141      tcp dpt:443 MARK set 0xa

Chain INPUT (policy ACCEPT)

target     prot opt source               destination        

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination        

Chain POSTROUTING (policy ACCEPT)

target     prot opt source               destination  

[root@node1 ~]# iptables -t mangle -F  清空防火墙

问题:

LVS没有健康检测功能

LVS存在单点故障

解决方法:使用ldirectord第三方软件工具

[root@node1 ~]# dnf install ldirectord

[root@node1 ~]# vim /etc/ha.d/ldirectord.cf

quiescent=no

virtual=192.168.182.141:80

        servicename=Web Site

        comment=Test load balanced web site

        real=10.10.10.23:80 masq

        real=10.10.10.24:80 masq

        #fallback=127.0.0.1:80 gate

        service=http

        scheduler=rr

        #persistent=600

        #netmask=255.255.255.255

        protocol=tcp

        checktype=negotiate

        checkport=80

        request="index.html"

        receive="test page"

[root@node1 ~]# systemctl start ldirectord.service

测试:模拟一台服务器不工作时:

[root@node3 ~]# systemctl stop nginx.service    模拟关闭nginx服务

[root@node1 ~]# watch ipvsadm -Ln

Every 2.0s: ipvsadm -Ln          node1: Tue Apr 16 16:12:38 2024

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InAc

tConn

TCP  192.168.182.141:80 rr

  -> 10.10.10.24:80               Masq    1         0          0

[root@node2 ~]# for ((i=1;i<=8;i++));do curl 192.168.182.141; done

web test page , ip is 10.10.10.24 .

web test page , ip is 10.10.10.24 .

web test page , ip is 10.10.10.24 .

web test page , ip is 10.10.10.24 .

web test page , ip is 10.10.10.24 .

web test page , ip is 10.10.10.24 .

web test page , ip is 10.10.10.24 .

web test page , ip is 10.10.10.24 .

[root@node1 ~]# yum install nginx -y

[root@node1 ~]# vim /etc/nginx/nginx.conf

[root@node1 ~]# echo "服务器维护中..." > /usr/share/nginx/html/index.html

[root@node1 ~]# systemctl start nginx.service

[root@node1 ~]# vim /etc/ha.d/ldirectord.cf

quiescent=no

checktimeout=3

checkinterval=1

autoreload=yes

#fallback=127.0.0.1:8080

virtual=192.168.182.141:80

        servicename=Web Site

        comment=Test load balanced web site

        real=10.10.10.23:80 masq

        real=10.10.10.24:80 masq

        fallback=10.10.10.21:8080 masq

        service=http

        scheduler=rr

        #persistent=600

        #netmask=255.255.255.255

        protocol=tcp

        checktype=negotiate

        checkport=80

        request="index.html"

        receive="test page"

测试:模拟两台服务器都不工作:

[root@node3 ~]# systemctl stop nginx.service

[root@node4 ~]# systemctl stop nginx.service

[root@node1 ~]# watch ipvsadm -Ln

Every 2.0s: ipvsadm -Ln                                                                               node1: Tue Apr 16 16:38:28 2024

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.182.141:80 rr

  -> 10.10.10.21:8080             Masq    1         0          0

[root@node2 ~]# for ((i=1;i<=8;i++));do curl 192.168.182.141; done

服务器维护中...

服务器维护中...

服务器维护中...

服务器维护中...

服务器维护中...

服务器维护中...

服务器维护中...

服务器维护中...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/10490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyQt6--Python桌面开发(7.QTextEdit多行富文本框控件)

QTextEdit多行富文本框控件 保存文件到本地QLine多行文本框.ui import sys import time from PyQt6.QtGui import QValidator,QIntValidator from PyQt6.QtWidgets import QApplication,QLabel,QLineEdit,QTextEdit from PyQt6 import uic,QtGuiif __name__ __main__:appQApp…

二叉树进阶 --- 上

目录 1. 二叉搜索树的概念及结构 1.1. 二叉搜索树的概念 1.2. 二叉搜索树的结构样例 2. 二叉搜索树的实现 2.1. insert 的非递归实现 2.2. find 的非递归实现 2.3. erase 的非递归实现 2.3.1. 第一种情况&#xff1a;所删除的节点的左孩子为空 2.3.1.1. 错误的代码 2…

基本QinQ

拓扑图 配置 开启LLDP功能&#xff0c;查看是否能通过QinQ隧道透传 sysname AR1 # lldp enable # interface GigabitEthernet0/0/0.10dot1q termination vid 10ip address 12.1.1.1 255.255.255.0 arp broadcast enable # sysname AR2 # lldp enable # interface GigabitE…

地磁暴红色预警来袭,普通人该如何应对?绝绝子的防护指南来了

近日&#xff0c;国家空间天气监测预警中心发布了一则令人瞩目的消息——地磁暴红色预警。这一预警不仅提醒我们地磁暴即将影响我国的电离层和低轨卫星&#xff0c;更让我们深刻认识到地球空间环境的脆弱性和复杂性。对于普通公众而言&#xff0c;地磁暴的概念可能相对陌生&…

【每日刷题】Day37

【每日刷题】Day37 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 2391. 收集垃圾的最少总时间 - 力扣&#xff08;LeetCode&#xff09; 2. 1614. 括号的最大嵌套深度…

你可能喜欢但也许还不知道的好用网站-搜嗖工具箱

在线工具 https://www.zxgj.cn/ 作为一个工作生活好帮手&#xff0c;在线咨询网站提供了丰富的实用功能&#xff0c;从工作中的图表制作、图片修改到生活中的各种测试、健康、娱乐、学习、理财等等涵盖面很广。 在线工具网站从界面和操作上来看对用户也很友好&#xff0c;页面…

论文研读 An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale

完整翻译 《An Image is Worth 16x16 Words》完整版翻译_an image is worth 16*16words-CSDN博客 大神讲解 Vision Transformer详解-CSDN博客 视频讲解 11.1 Vision Transformer(vit)网络详解_哔哩哔哩_bilibili 学习整理 简要概述&#xff1a;Vision Transformer&#xff…

在 Kubernetes 上运行 Apache Spark 进行大规模数据处理的实践

在刚刚结束的 Kubernetes Community Day 上海站&#xff0c;亚马逊云科技在云原生分论坛分享的“在 Kunernets 上运行 Apache Spark 进行大规模数据处理实践”引起了现场参与者的关注。开发者告诉我们&#xff0c;为了充分利用 Kubernetes 的高可用设计、弹性&#xff0c;在越来…

AIGC (AI-Generated Content) 技术深度探索:现状、挑战与未来愿景

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f916; AIGC技术&#xff1a;塑造未来的创意与内容革命 &#x1f31f;引言 &#x1f680;AIGC技术发展现状 &#x1f4c8;核心技术驱动 &#x1f4a1;应用领域拓展 &#x1f310; 面临的挑战 ❌真实性与伦理考量 &am…

SAP-CentralFinance - 会计核算中的组织要素 - 学习心得1

1. 定义SAP组织架构和理解各组织架构含义 组织结构遍布SAP 系统的所有重要功能范围。FI 中最重要的组织要素是公司代码。它是“财务会计”中的最小组织单位,可以为其编制自主式完整科目集供外部报告使用。其他重要的组织要素是利润中心业务范围和段。您可以为各个利润中…

大模型微调之 在亚马逊AWS上实战LlaMA案例(十)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;十&#xff09; 训练数据集格式 SageMaker JumpStart 目前支持域适应格式和指令调整格式的数据集。在本节中&#xff0c;我们指定两种格式的示例数据集。有关更多详细信息&#xff0c;请参阅附录中的数据集格式化部分。 …

iview(viewUI) span-method 表格实现将指定列的值相同的行合并单元格

效果图是上面这样的&#xff0c;将第一列的名字一样的合并在一起&#xff1b; <template><div class"table-wrap"><Table stripe :columns"columns" :data"data" :span-method"handleSpan"></Table></div&…

HDFS- DataNode磁盘扩缩容

HDFS- DataNode磁盘扩缩容 背景: 缩减/增加节点磁盘 方案介绍: 采用hdfs dfsadmin -reconfig 动态刷新配置实现,不停服扩缩容。 注意事项: 请在进行缩容之前,务必了解实际的数据量,并确保磁盘有足够的空间来容纳这些数据。还需要考虑未来的使用需求,要预留一定数量的空间…

java+vue3+iclientol实现警务地理信息系统实践

警务地理信息系统&#xff08;Police Geographic Information System, PGIS&#xff09;是一种专为警务工作设计的地理信息系统&#xff0c;它结合了地理信息技术、数据库技术、网络技术和现代警务理念&#xff0c;旨在提升公安机关的空间数据分析、决策支持、指挥调度、案件管…

【QVariant类型剖析】

QVariant类型剖析 &#x1f31f; 官方文档中给出的定义&#x1f31f; 特性&#x1f338;QVariant实战应用&#x1f338;项目成果展示 &#x1f31f; 官方文档中给出的定义 &#x1f4d8;Because C forbids unions from including types that have non-default constructors or…

基于springboot+vue+Mysql的外卖点餐系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

【.NET Core】你认识Attribute之CallerMemberName、CallerFilePath、CallerLineNumber三兄弟

你认识Attribute之CallerMemberName、CallerFilePath、CallerLineNumber三兄弟 文章目录 你认识Attribute之CallerMemberName、CallerFilePath、CallerLineNumber三兄弟一、概述二、CallerMemberNameAttribute类三、CallerFilePathAttribute 类四、CallerLineNumberAttribute 类…

Android 简单的下拉选择框实现

要实现这种效果,目前知道的方法有以下两种,Spinner 和 ListPopupWindow,当然肯定还有很多别的方法,这里我们先尝试使用ListPopupWindow来实现这个效果; 以下是一个简单的demo: public class MainActivity extends AppCompatActivity {private List<String> dataList;pr…

QueryPerformanceCounter实现高精度uS(微妙)延时

参考连接 C# 利用Kernel32的QueryPerformanceCounter封装的 高精度定时器Timer_kernel32.dll queryperformancecounter-CSDN博客https://blog.csdn.net/wuyuander/article/details/111831973 特此记录 anlog 2024年5月11日

ubuntu安装oceanbase调通本地navicat链接

分为两部分 一安装oceanbase服务 准备工作 mkdir -p /data/1 /data/log1 chown -R admin.admin /data/1 /data/log1/偷偷说&#xff1a;其实这步我忘记执行&#xff0c;也没影响我安装 oceanbase程序是很占内存的在安装时我们要先下载好安装包&#xff1a; 然后放在能记住的…