Linux入门攻坚——41、Linux集群系统入门-lvs(2)
lvs-dr:GATEWAY
Director只负责请求报文,响应报文不经过Director,直接由RS返回给Client。
lvs-dr的报文路线如上图,基本思路就是报文不会回送Director,第①种情况是VIP、DIP、RIP位于同一个网段,这样,网络可以共用一个,即使用同一个路由器和交换机;第②种情况VIP与DIP和RIP不在一个网段,响应报文会走单独的网络线路。
对第一种情况进行实操测试:地址分配表
这里主要问题是:当请求报文到来时,它请求的是VIP,在到达VIP所在网络时,需要知道VIP对应的V-MAC,但是因为在Director和RS上都配置了VIP,就会引起混乱,所以这里的关键是确定真正的Director对应的VIP的MAC,方法有三种,一是arp绑定,在请求报文到来的设备上的接口静态绑定Director的V-MAC;二是在RS上使用arptables过滤;三是在内核上设置内核参数:arp_ignore和arp_announce来实现。一二两种方式有一定的局限性,一般使用第三种。
关于arp_ignore和arp_announce,要理解这两个参数,需要明白arp的工作方式:
每新来一台机器,自己通告一下;后来的机器或是前面的机器没有收到,可以主动询问。
ARP协议的作用就是根据IP地址获取其对应的MAC地址。在以太网中,主机要发送一个数据报文,首先需要获取目标MAC地址(如果通信的目标主机在同一网段,那目标MAC地址就是目标主机的MAC地址,否则应该为网关的MAC地址或下一跳的MAC地址),而获取目标MAC地址的方法就是使用ARP协议发送ARP请求数据报文,ARP请求数据报文中会包含发送方的IP地址和MAC地址,并且包含想要获取MAC地址的目标IP地址,该ARP请求数据报文的数据链路层目标地址为广播地址,也就是说它是一个二层广播数据包(因为不知道谁拥有指定目标IP地址,所以只能使用广播方式发送)。在同一局域网的所有主机都将收到该ARP请求数据报文,但是只有拥有目标IP地址的主机才会发送ARP响应数据报文,该ARP响应数据报文包含发送方的IP地址和MAC地址(即对方想要知道的目标MAC地址),并且目标IP地址和MAC地址设置为对方的地址(即ARP请求数据包发送方的地址),并且该数据报文为单播数据报文(其数据链路层目标地址为对方的MAC地址)。
arp_announce参数是定义linux主机发送ARP请求数据报文时如何选择数据报文中使用的发送方IP地址(即Sender IP address)。在系统准备通过网卡发送一个IP数据包前,该IP数据包的源IP地址和目标IP地址通常是已经知道的,然后根据目的IP查询路由表确定发送数据报文的网卡,则发送的网卡也已经确定,那数据链路层的源MAC地址当然也确定了,发送ARP请求数据报文时需要包含发送方IP地址,该IP地址应该是什么呢?大家可能想当然的以为就是要发送的IP数据报文的源IP地址,其实这个是不一定的,尤其是主机有多个网络接口和IP地址时,而arp_announce正是控制该发送方IP地址的选择条件的。arp_announce参数的取值分别是0、1、2,这些取值的意义如下:
0:允许使用任意网卡上的IP地址作为arp请求的源IP,通常就是使用要发送数据报文的源IP。
1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址。
2:忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。
arp_announce - INTEGER
Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface:
0 - (default) Use any local address, configured on any interface
1 - Try to avoid local addresses that are not in the target's subnet for this interface.
This mode is useful when target hosts reachable via this interface require the source IP address in ARP requests to be part of their logical network configured on the receiving interface. When we generate the request we will check all our subnets that include the target IP and will preserve the source address if it is from such subnet. If there is no such subnet we select source address according to the rules for level 2.
2 - Always use the best local address for this target.
In this mode we ignore the source address in the IP packet and try to select local address that we prefer for talks with the target host. Such local address is selected by looking for primary IP addresses on all our subnets on the outgoing interface that include the target IP address. If no suitable local address is found we select the first local address we have on the outgoing interface or on all other interfaces, with the hope we will receive reply for our request and even sometimes no matter the source IP address we announce.
The max value from conf/{all,interface}/arp_announce is used.
arp_ignore参数是定义linux主机在收到ARP请求数据报文后,发送ARP响应数据报文的条件级别,该参数的取值范围是0~8,各取值的意义分别是:
0:响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上。
1:只响应目的IP地址为接收网卡上的本地地址的arp请求。
2:只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段。
3:如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。
4~7:保留未使用
8:不回应所有的arp请求
arp_ignore - INTEGER
Define different modes for sending replies in response to received ARP requests that resolve local target IP addresses:
0 - (default): reply for any local target IP address, configured on any interface
1 - reply only if the target IP address is local address configured on the incoming interface
2 - reply only if the target IP address is local address configured on the incoming interface and both with the sender's IP address are part from same subnet on this interface
3 - do not reply for local addresses configured with scope host, only resolutions for global and link addresses are replied
4-7 - reserved
8 - do not reply for all local addresses
arp_announce是控制本机发送ARP请求报文时,对请求报文的源IP和源MAC进行控制的选项,这里的重点是一是请求报文,二是源IP和源MAC。
如上图,右边的Director主机在3.1接口上想发送一个ARP请求报文,请求1.2的MAC地址,现在的问题来了:发送的ARP请求报文,请求的目的IP肯定是1.2,那么源IP是什么,源MAC又是什么?对于源MAC是确定的,就是报文从哪个接口发送出去,就是哪个接口的MAC,所以,这个请求报文的源MAC是1.1接口的MAC,而源IP则根据arp_announce来确定,如果是0,那么最初是哪个IP,就是哪个IP,这里是从3.1发起的ARP请求,那么源IP就是3.1,最终请求报文就是源IP3.1源MAC1.1目的IP1.2这样一个请求报文;如果arp_announce是2,则忽略IP数据报文的源IP地址,选择发送网卡上最合适的本地地址作为arp请求的源IP地址,即选择1.1作为请求报文的源IP,最终请求报文就是源IP1.1源MAC1.1目的IP1.2这样一个请求报文;arp_announce为1,尽量避免使用不属于该发送网卡子网的本地地址作为发送arp请求的源IP地址,这里的发送网卡是1.1所在网卡,所以避免使用不是1.1网络的IP作为源IP,即不使用原来的3.1,而是使用1.1作为源IP,最终请求报文就是源IP1.1源MAC1.1目的IP1.2这样一个请求报文;
arp_ignore是控制本机接收请求报文后的处理,即对响应报文的控制,如上图,从1.2来的ARP请求报文,从1.1接口进入主机,请求3.1的MAC地址,那么,如果arp_ignore为0,则响应任意网卡上接收到的对本机IP地址的arp请求(包括环回网卡上的地址),而不管该目的IP是否在接收网卡上,就是说,主机要对此请求报文进行响应,因为3.1是本主机的一个IP,不管这个报文是从哪个接口进来的,从2.1或3.1或4.1进来的,都进行响应;如果arp_ignore为1,只响应目的IP地址为接收网卡上的本地地址的arp请求,此时1.1接口只配置了1.1地址,3.1不在接收网卡上,此时主机不会响应ARP请求报文,如果1.1接口上同时配置了3.1,那么就会响应;arp_ignore为2,只响应目的IP地址为接收网卡上的本地地址的arp请求,并且arp请求的源IP必须和接收网卡同网段,此时不但检查请求报文的目的IP是在配置在入接口上,还要检查目的IP和源IP是否是同一子网地址,1.2请求3.1的MAC,同时3.1配置在1.1的接口卡上,主机也不会响应,因为源IP和目的IP不在一个子网,1.2请求1.1的MAC,并且请求报文从1.1接口进入,主机才响应;
在这里的lvs-dr演示中,arp_ignore=1,arp_announce=2,arp_announce为2,lo接口上的VIP不会发送ARP请求,不会以源IP为VIP发送ARP请求报文,arp_ignore为1,只有接收到目的IP为VIP的ARP请求报文的接口,才能响应报文,即接收到对VIP的ARP请求报文的接口上配置了VIP,才能响应,这就杜绝了lo上的VIP对ARP的响应。
配置Director上的VIP,配置在网卡别名上:
ifconfig ens:0 192.168.147.140/32 broadcast 192.168.147.140 up
添加路由: route add -host 192.168.147.140 dev ens33:0
配置RS上的内核参数:
配置RS上的VIP地址:
测试:在Windows宿主机上ping 192.168.147.140,然后看其arp结果:
Director上的MAC:
说明我们PING通的是Director上的VIP。
配置另一台RS:
添加ipvs:
此时访问http://192.168.147.140,不断刷新,会看到RS交替,实现负载均衡。
以上是VIP、DIP、RIP在同一网段的lvs-dr情况。
lvs-dr:VIP,DIP/RIP不在同一网段情况
使用vmware模拟上述情景,需要对vmware的网络有所了解。vmware的网络模式有:
bridge(桥接模式),nat(NAT模式),only host(仅主机)模式
对于vmware中的虚拟机及其之间的通信,如上图,在宿主机中不但虚拟了主机和虚拟网卡,还有虚拟交换机,虚拟主机1与虚拟主机2可以通信,在同一个网络中,虚拟主机2和虚拟主机3可以通信,虚拟主机1和虚拟主机3呢?如果虚拟主机2没有开启路由和核心转发功能,1和3之间就不能通信。那么虚拟主机如何与外部物理主机通信?这要分几种情况。
对于bridge,即桥接模式,实际上是将宿主机的物理网卡模拟成虚拟交换机,在VMWare中就是VMNet0,连接到这个虚拟交换机中的虚拟主机2,3,就可以直接与物理主机通信,同时VMware又为宿主机物理网卡虚拟出一个虚拟网卡,继承物理网卡的配置,这样外部物理主机也可以继续与宿主机通信。
对于nat模式和仅主机模式,相差不多:
nat模式,会在宿主机上安装一块虚拟网卡VMNet8,虚拟的网卡分配的地址一般是.1,如我的是192.168.147.1,然后会虚拟一个NAT路由器,其IP为.2,如我的192.168.147.2,在上图中NAT设置中可以看到,就是网关IP。连接在同一虚拟交换机上的虚拟主机可以访问外部物理主机(通过nat),即设置默认路由为192.168.147.2,就是NAT路由器,通过这个路由进行nat,与宿主机的物理网卡做nat;内部虚拟机之间可以相互访问(同一网络内),通过VMNet8虚拟网卡,虚拟主机可以与宿主机之间相互访问。
only host(仅主机)模式,没有虚拟NAT路由器,即没有192.168.xx.2这个地址,也就无法进行nat,虚拟主机与外部相互之间不通信,VMNet1只用于虚拟主机与宿主机之间的互相访问。
在虚拟交换机上,还可以附加DHCP服务器,进行虚拟机地址的自动分配。
模拟环境搭建:
Director的配置:
ipvsadm -A -t 192.168.61.129:80 -s rr
ipvsadm -a -t 192.168.61.129:80 -r 192.168.217.130:80 -g
ipvsadm -a -t 192.168.61.129:80 -r 192.168.217.131:80 -g
RS配置:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
ifconfig lo:0 192.168.61.129/32 broadcast 192.168.61.129 up
route add -net 192.168.61.0/24 gw 192.168.217.129
从router上测试,即从192.168.61.130的虚拟机上运行:curl http://192.168.61.129
测试结果是命令卡住,没有结果返回。
使用tcpdump对各虚拟机抓包,http请求从61.130到了61.129,从217.128到了RS,从RS到了217.129,已经回到了router上,好像就是最后router处理不了。
(以后有时间再捣鼓这个吧)
关于ipvsadm -f选项:防火墙标记
netfilter:
PREROUTING --> INPUT
PREROUTING --> FORWARD --> POSTROUTING
OUTPUT --> POSTROUTING
对于用户的请求(外部请求),不会经过OUTPUT链,那么所有的请求都经过PREROUTING,经过PREROUTING后才能到达ipvs,那么,就可以在PREROUTING对请求报文打上标记,使用iptables防火墙进行标记(对报文进行修改),mangle就是进行拆包封包。
在PREROUTING时: -j MARK --set-mark #
然后在ipvs中:-A -f # 对特定报文进行调度。意味着可以同时对不同类型的报文同时进行调度。
再增加一种功能:ssh
iptables -t mangle -A PREROUTING -d 192.168.61.129 -p tcp --dport 22 -j MARK --set-mark 10
这样,ipvs不需要改动,就实现ssh的负载均衡。
通过FWM定义集群的方式:
1)在Director上netfilter的mangle表的PREROUTING链上定义用于打标的规则;
iptables -t mangle -A PREROUTING -d $vip -p $proto --dport &port -j MARK --set-mark #
2)基于FWM定义集群服务:
ipvsadm -A -f # -s scheduler
ipvsadm -a -f # -r $rs-ip -g
功用:将共享一组RS的集群服务统一进行定义。
session保持:session绑定;session复制;session服务器
session绑定:lvs sh算法
对某一特定服务
lvs persistence:lvs的持久连接:无论ipvs使用何种调度方法,其都能实现将来自于同一个Client的请求始终定向至第一次调度时挑选的RS;
持久连接模版:独立于算法;
sourceip rs timer
对多个共享同一组RS的服务器,需要统一进行绑定;
ipvsadm -A -t 192.168.61.129:80 -s rr -p
ipvsadm -a -t 192.168.61.129:80 -r 192.168.217.130 -g
ipvsadm -a -t 192.168.61.129:80 -r 192.168.217.131 -g
持久连接的实现方式:
每端口持久:PPC,单服务持久调度;
每FWM持久:PFWMC,单FWM持久调度;PORT AFFINITY
每客户端持久:PCC,单客户端持久调度;
director会将用户的任何请求都识别为集群服务,并向RS进行调度;
lvs的HA(高可用性):
SPOF:Single Point Of Failure (单点故障)
director:高可用集群;
realserver:让director对其做健康状态检测,并且根据检测的结果自动完成添加或移除等管理功能;
1)基于协议层次检查:
ip:icmp;
传输层:检测端口的开放状态;
应用层:请求获取关键性的资源;
2)检查频度:客户容忍度
3)状态判断:下线谨慎,上线乐观
下线:ok --> Failure ---> Failure ---> Failure ,也就是多次判断失败后,才下线
上线:Failure --> ok --> ok,即两次检测成功就上线。
4)back server,sorry server
关于集群的个人总结:通过lvs的了解,听着高大尚的集群,其实就是一个关于数据包流程改变的过程,由一个前端的调度器,作为总的接入口,然后将报文分配给后面的业务服务器,最后由业务服务器直接返回结果给客户端或者返回给调度器再返回给客户端,中间的调度过程对客户端是透明的,调度的过程中,要考虑后端服务器的负载均衡,就是调度算法,要考虑服务的状态保持,要考虑调度器或业务服务器、存储等的高可用性等等,对客户端的请求报文,可以只通过改变MAC、IP、PORT等改变流向,也可以通过调度器拆包再重新生成新的请求包来实现流向改变并增加新功能,这就是四层和七层路由。关键是构建这个转发网络。
相关文章:

Linux入门攻坚——41、Linux集群系统入门-lvs(2)
lvs-dr:GATEWAY Director只负责请求报文,响应报文不经过Director,直接由RS返回给Client。 lvs-dr的报文路线如上图,基本思路就是报文不会回送Director,第①种情况是VIP、DIP、RIP位于同一个网段,这样&…...
音视频入门基础:MPEG2-TS专题(17)——FFmpeg源码中,解析TS program map section的实现
一、引言 由《音视频入门基础:MPEG2-TS专题(16)——PMT简介》可以知道,PMT表(Program map table)由一个或多个段(Transport stream program map section,简称TS program map sectio…...
了解https原理,对称加密/非对称加密原理,浏览器与服务器加密的进化过程,https做了些什么
最开始的加密 浏览器与服务器之间需要防止传输的数据被黑客破解。因此,浏览器在发送数据时会对数据进行加密,并把加密的密钥(或密钥的某些部分)放在数据的某一个区域中。服务器收到数据后,会提取密钥并用它来解密数据…...
山西省第十八届职业院校技能大赛高职组 5G 组网与运维赛项规程
山西省第十八届职业院校技能大赛高职组 5G 组网与运维赛项规程 一、赛项名称 赛项编号:GZ035 赛项名称:5G 组网与运维 赛项组别:高职学生组、教师组 二、竞赛目的 2019 年 6 月 6 日,5G 牌照正式发放,标志着我国全面进…...
tcpdump编译 wireshark远程抓包
https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz tar -zxvf flex-2.6.4.tar.gz ./configure CFLAGS-D_GNU_SOURCE make sudo make installwget http://ftp.gnu.org/gnu/bison/bison-3.2.1.tar.gz ./configure make sudo make install以上两个库是…...

Web开发 -前端部分-CSS
CSS CSS(Cascading Style Sheet):层叠样式表,用于控制页面的样式(表现)。 一 基础知识 1 标题格式 标题格式一: 行内样式 <!DOCTYPE html> <html lang"en"><head><meta…...

用 Python Turtle 绘制流动星空:编程中的璀璨星河
用 Python Turtle 绘制流动星空:编程中的璀璨星河 🐸 前言 🐸🐞往期绘画>>点击进所有绘画🐞🐋 效果图 🐋🐉 代码 🐉 🐸 前言 🐸 夜空中繁星…...

Java从入门到工作2 - IDEA
2.1、项目启动 从git获取到项目代码后,用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了,可以去maven官网下载补充。 如果run时提示程序包xx不存在,在项目目录右键Marven->Re…...
fastadmin批量压缩下载远程视频文件
后端代码 // 批量下载并压缩 public function downloadAll(){$ids input(ids);$row $this->model->where(id, in, $ids)->field(id,title,video_url)->select();if (!$row) {$this->error(记录不存在);}$arr [];$tempFiles []; // 用来存储临时下载的视频文…...
【保姆级】Mac如何安装+切换Java环境
本文从如何下载不同版本的JDK,到如何丝滑的切换JDK,以及常见坑坑的处理方法,应有尽有,各位看官走过路过不要错过~~~ 下载⏬ 首先上官网: https://www.oracle.com/ 打不开的话可以使用下面👇这个中文的 https://www.oracle.com/cn/java/technologies/downloads/a…...

2024首届世界酒中国菜国际地理标志产品美食文化节成功举办篇章
2024首届世界酒中国菜国际地理标志产品美食文化节成功举办,开启美食文化交流新篇章 近日,首届世界酒中国菜国际地理标志产品美食文化节在中国国际地理标志大厦成功举办,这场为期三天的美食文化盛会吸引了来自世界各地的美食爱好者、行业专家…...

Springboot静态资源
默认位置 静态资源访问目录下的资源可以直接访问,默认的四个位置 classpath:/META-INF/resources/(默认加载,不受自定义配置的影响) classpath:/resources/ classpath:/static/ classpath:/public/ 如果在静态目录下存在favic…...
MTK修改配置更改产品类型ro.build.characteristics
文章目录 需求场景实际问题 参考资料解决方案MTK 修改方案修改点一:build\core\product_config.mk修改点二:build\make\core\main.mk修改是否成功,adb 验证 实战项目中解决案例 需求场景 更改产品设备属性 table-phone-device,使…...
SQL 查询中的动态字段过滤
这段代码是一个 SQL 查询中的动态字段过滤部分,使用了 MyBatis 的 标签和 标签。以下是逐步的解释: <!-- 动态字段过滤 --><if test"parameters ! null and parameters.size() > 0"><foreach collection"parameters&qu…...

数字IC后端零基础入门基础理论(Day1)
数字IC后端设计导入需要用到的input数据如下图所示。 数字后端零基础入门系列 | Innovus零基础LAB学习Day9 Netlist: 设计的Gate level(门级)网表。下图所示为一个计数器设计综合后的门级netlist。 从这个netlist中我们看到这个设计顶层的名字叫counte…...

【LC】240. 搜索二维矩阵 II
题目描述: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,…...

Redis应用—4.在库存里的应用
大纲 1.库存模块设计 2.库存缓存分片和渐进式同步方案 3.基于缓存分片的下单库存扣减方案 4.商品库存设置流程与异步落库的实现 6.库存入库时"缓存分片写入 渐进式写入 写入失败进行MQ补偿"的实现 7.库存扣减时"基于库存分片依次扣减 合并扣减 扣不了…...
selenium获取请求头
【原创】Selenium获取请求头、响应头-腾讯云开发者社区-腾讯云 selenium 4.0.0 selenium-wire 5.1.0 python 3.10 from seleniumwire import webdriver import time from selenium.webdriver.common.by import By import re def get_request_headers(driver):"""…...
Rust中自定义Debug调试输出
在 Rust 中,通过为类型实现 fmt::Debug,可以自定义该类型的调试输出。fmt::Debug 是标准库中的一个格式化 trait,用于实现 {:?} 格式的打印。这个 trait 通常通过自动派生(#[derive(Debug)])来实现,但你也…...
docker离线安装、linux 安装docker
之前写过一篇docker的离线安装,现在从头再看繁琐了,服务器换了,既然要重搭一遍就要改进一下了。下面步入正题: 1.下载离线软件包 https://download.docker.com/linux/static/stable/x86_64/docker-20.10.6.tgz 2.下载安装工具包…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...