(第二十七天)

上午
核心:内核中的 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 、自动化程度越高越好

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

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

相关文章

如何用Python进行数据可视化、科技图表绘制?

目录 写在前面 推荐图书 推荐理由 写在最后 写在前面 有了它&#xff0c;科技图表绘制、数据可视化真的毫无难度&#xff01; 推荐图书 《Python数据可视化&#xff1a;科技图表绘制》(芯智)【摘要 书评 试读】- 京东图书 图书简介 《Python数据可视化:科技图表绘制》结…

生成式人工智能(大语言模型)上线备案材料

材料总体一览 生成式人工智能&#xff08;大语言模型&#xff09;上线备案&#xff0c;除申请表外还需要提交五份材料&#xff1a; 《生成式人工智能 &#xff08;大语言模型&#xff09;上线备案申请表》 《附件1&#xff1a;安全自评估报告》 《附件2&#xff1a;模型服务协议…

Python(TensorFlow)衍射光学层卷积算法模拟(英伟达GPU)

&#x1f3af;要点 &#x1f3af;衍射光学卷积算法模拟 | &#x1f3af;模拟或数字电子计算之前加入一层光学计算 | &#x1f3af;前馈卷积神经网络计算成像系统对输入图像进行分类 | &#x1f3af;相位掩模利用线性空间不变成像系统执行固有卷积 &#x1f4dc;用例 Python非…

大语言模型与多模态大模型loss计算

文章目录 前言一、大语言模型loss计算1、loss计算代码解读2、构建模型输入内容与label标签3、input_ids与labels格式 二、多模态大模型loss计算方法1、多模态loss计算代码解读2、多模态输入内容2、大语言模型输入内容3、图像embending如何嵌入文本embeding 前言 如果看了我前面…

MySQL学习[4] ——MySQL锁

四、MySQL锁 4.1 MySQL有哪些锁&#xff1f; 4.1.1 全局锁 全局锁就是**对整个数据库实例加锁&#xff0c;主要用于全库逻辑备份**等场景。 flush tables with read lock # 加全局锁unlock tables # 解锁加上全局&#xff08;读&#xff09;锁后&#xff0c;整个数据库都…

css实现水滴效果图

效果图&#xff1a; <template><div style"width: 100%;height:500px;padding:20px;"><div class"water"></div></div> </template> <script> export default {data() {return {};},watch: {},created() {},me…

spring mvc工作流程

Spring MVC 是基于模型-视图-控制器&#xff08;MVC&#xff09;设计模式的 Web 框架&#xff0c;它简化了开发 Web 应用程序的流程。下面是 Spring MVC 的工作流程详细介绍&#xff1a; 客户端请求 --> DispatcherServlet --> HandlerMapping --> Controller --&…

Win10 创建新的桌面2,并实现桌面切换

1. Win10 创建新的桌面2 Win - Tab 2. Win10 桌面切换 Ctrl - Win - ←/→ 我们下期见&#xff0c;拜拜&#xff01;

【大模型从入门到精通14】openAI API 构建和评估大型语言模型(LLM)应用2

这里写目录标题 评估大型语言模型&#xff08;LLM&#xff09;输出的方法构建评估标准实施评估协议利用专家比较案例研究评估客户服务聊天机器人学术文本摘要高级评估技术 评估大型语言模型&#xff08;LLM&#xff09;输出的方法 评估大型语言模型&#xff08;LLM&#xff09…

开源免费的表单收集系统TDuck

TDuck&#xff08;填鸭表单&#xff09;是一款开源免费的表单收集系统&#xff0c;它基于Apache 2.0协议开源&#xff0c;用户可以随时下载源码&#xff0c;自由修改和定制&#xff0c;也可以参与到项目的贡献和反馈中。TDuck表单系统不仅支持私有化部署&#xff0c;还提供了丰…

快排/堆排/归并/冒泡/

常见的内排序算法 插入排序 直接插入排序 原理&#xff1a;相当于扑克牌变成有序&#xff0c;先拿第一张&#xff0c;把他调节成有序&#xff0c;再拿第二张&#xff0c;与第一张相比找到第二张的位置&#xff0c;再继续拿第三张&#xff0c;以此类推。 void InsertSort(in…

【C++二分查找 贪心】792. 匹配子序列的单词数

本文涉及的基础知识点 C二分查找 贪心 LeetCode792. 匹配子序列的单词数 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 。 字符串的 子序列 是从原始字符串中生成的新字符串&#xff0c;可以从中删去一些字符(可以是none)&#xff0c;而不改变其…

关于Vue项目npm快捷键,点击run启动报错,及npm i也报错的解决办法

1.配置idea的npm 2.点击运行按钮 3.结果 分析原因及问题&#xff1a; npm i npm run dev 由于是刚刚从gitlab新拉的前端代码&#xff0c;可能没有用命令install过类似于没有编译过&#xff0c;所以执行一下上面的命令 结果报错如下&#xff1a; F:\tbyf\qjyy\hip-manager-ui&…

密探 -- 渗透测试工具 v1.14 版

1.如何运行 在jdk8环境下&#xff08;在jdk8以上的高版本请参考常见问题1的处理方案&#xff09;运行以下语句运行: java -jar mitan-jar-with-dependencies.jar 若不想输入这么长太长语句&#xff0c;可以通过以下脚本的方式启动&#xff1a; Mac/Linux 环境下&#xff0c;…

计算机网络——HTTP协议详解(上)

一、HTTP协议简单介绍 1.1 什么是HTTP协议 HTTP&#xff08;超文本传输协议&#xff09;是一种用于在Web浏览器和Web服务器之间传输数据的应用层协议。它是一种无状态协议&#xff0c;即服务器不会保留与客户端的任何连接状态信息&#xff0c;每个请求都被视为一个独立的事务。…

Mysql-约束

概念&#xff1a; 约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 目的&#xff1a; 保存数据库中数据的正确&#xff0c;有效性和完整性。 分类&#xff1a; 注意事项&#xff1a;约束是作用在数据表中的字段上的&#xff0c;可以在创建表或修改表的时候…

【开端】Java 分页工具类运用

一、绪论 Java系统中&#xff0c;分页查询的场景随处可见&#xff0c;本节介com.baomidou.mybatisplus.core.metadata.IPage;来分页的工具类 二、分页工具类 public class PageUtils implements Serializable { private static final long serialVersionUID 1L; /**…

Luatos-lua For MacOSX

0x00 缘起 看到Luatos-soc-pc项目能够编译到MacOS平台并且运行&#xff0c;所以尝试编译&#xff1b;可是Apple Clang编译器太过于严格&#xff0c;导致编译不通过。遂换到gcc-11编译通过&#xff0c;虽然其中依旧会报错&#xff08;宏定义LUA_USE_MACOSX不起作用&#xff0c;导…

Android 10.0 SystemUI下拉状态栏QSTileView去掉着色效果显示彩色图标功能实现

1.前言 在10.0的系统rom定制化开发中,在关于SystemUI的下拉状态栏中QSTileView的背景颜色设置过程中,在由于 系统原生有着色效果,导致现在某些彩色背景显示不是很清楚效果不好,所以需要去掉QSTileView的默认着色 背景显示原生的彩色背景,接下来就来实现相关功能 如图: 2.…

直击Vue2/3watch的底层逻辑,字符串长度对侦听效率的影响

目录 直击Vue2/3watch的底层逻辑&#xff0c;字符串长度对侦听效率的影响 一、Vue 2的底层原理 二、Vue 3的底层原理 三、基础类型性能消耗 四、数据变化比较原理 1、Vue 2 中的引用类型比较 2、Vue 3 中的引用类型比较 3、字符串比较&#xff08;基础类型比较&#xf…