RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)

接上篇:《RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)》
链接

文章目录

      • 4.安装RabbitMQ Messaging Topology Operator
    • 裸金属环境部署RabbitMQ
      • 部署单实例
      • 部署集群

4.安装RabbitMQ Messaging Topology Operator

使用 cert-manager 安装Messaging Topology Operator
在k8s集群上安装 cert-manager 版本 1.2.0+。例如,对于版本 1.3.1,请运行:

wget https://github.com/jetstack/cert-manager/releases/download/v1.3.1/cert-manager.yaml

kubectl apply -f cert-manager.yaml

要安装 Operator,请运行以下命令:

wget https://github.com/rabbitmq/messaging-topology-operator/releases/latest/download/messaging-topology-operator-with-certmanager.yaml

kubectl apply –f messaging-topology-operator-with-certmanager.yaml

使用生成的自有证书安装Messaging Topology Operator

此方式因涉及自建私有证书,具体步骤可以参考官方文档:
https://www.rabbitmq.com/kubernetes/operator/install-topology-operator#install-with-generated-certificates

使用Kubernetes 内部非默认域名

默认情况下,Kubernetes 内部域名为.cluster.local。kubeadm可以将其配置为其他名称,例如my.cluster.domain。在这种情况下,Messaging Topology Operator可以将自定义域名附加到用于与 RabbitMQ 交互的连接字符串中。

要配置消息传递拓扑操作员以在连接字符串中附加域名,请将环境变量设置MESSAGING_DOMAIN_NAME为您的域名,例如".my.cluster.domain"。

修改Messaging Topology Operator部署清单文件,在Deployment配置段中向spec. template… spec. container. Command增加一个env,名称MESSAGING_DOMAIN_NAME和值为您的域名如:messaging-topology-operator-with-certmanager.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  [...]
  name: messaging-topology-operator
  namespace: rabbitmq-system
spec:
  template:
    [...]
    spec:
      containers:
      - command:
        - /manager
        env:
        - name: OPERATOR_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: MESSAGING_DOMAIN_NAME
          value: "my.cluster.domain"

在这里插入图片描述
Messaging Topology Operator使用
创建queue和Policy
以下清单将在namepace名为rabbitmq-test下,默认虚拟主机中创建一个名为“queue-t1-rabbitmq-test”的队列:

cat queue-t1-rabbitmq-test.yaml
apiVersion: rabbitmq.com/v1beta1
kind: Queue
metadata:
  name: queue-t1
  namespace: rabbitmq-test
spec:
  name: queue-t1-rabbitmq-test
  autoDelete: false
  durable: true
  rabbitmqClusterReference:
    name: rabbitmq-cluster01
    namespace: rabbitmq-test
kubectl apply -f queue-t1-rabbitmq-test.yaml
queue.rabbitmq.com/queue-t1 created

kubectl get queue -n rabbitmq-test
NAME       AGE
queue-t1   17s

在这里插入图片描述
以下清单将在namepace名为rabbitmq-test下创建名为“policy-example”的policy

cat policy.yaml
apiVersion: rabbitmq.com/v1beta1
kind: Policy
metadata:
  name: policy-example
  namespace: rabbitmq-test
spec:
  name: lazy-queue
  pattern: "^lazy-queue-" # matches any queue begins with "lazy-queue-"
  applyTo: "queues"
  definition:
    queue-mode: lazy
  rabbitmqClusterReference:
    name: rabbitmq-cluster01
    namespace: rabbitmq-test
kubectl apply -f policy.yaml
policy.rabbitmq.com/policy-example created

kubectl get policy -n rabbitmq-test
NAME             AGE
policy-example   54s

在这里插入图片描述
创建exchange和binding
以下清单将在namepace名为rabbitmq-test下创建名为“rabbitmq-test”的exchange
cat exchange.yaml

cat exchange.yaml
apiVersion: rabbitmq.com/v1beta1
kind: Exchange
metadata:
  name: fanout
  namespace: rabbitmq-test
spec:
  name: fanout-exchange # name of the exchange
  type: fanout # default to 'direct' if not provided; can be set to 'direct', 'fanout', 'headers', and 'topic'
  autoDelete: false
  durable: true
  rabbitmqClusterReference:
    name: rabbitmq-cluster01
    namespace: rabbitmq-test
kubectl apply -f exchange.yaml
exchange.rabbitmq.com/fanout created

kubectl get exchange -n rabbitmq-test
NAME     AGE
fanout   13s

在这里插入图片描述
以下清单将在namepace名为rabbitmq-test下将名为“rabbitmq-test”的exchange与名为“queue-t1-rabbitmq-test”的queue 进行绑定

cat binding.yaml
apiVersion: rabbitmq.com/v1beta1
kind: Binding
metadata:
  name: binding
  namespace: rabbitmq-test
spec:
  source: fanout-exchange # an existing exchange
  destination: queue-t1-rabbitmq-test # an existing queue
  destinationType: queue # can be 'queue' or 'exchange'
  routingKey: "queue-t1-rabbitmq-test"
  rabbitmqClusterReference:
    name: rabbitmq-cluster01
    namespace: rabbitmq-test
kubectl apply -f binding.yaml
binding.rabbitmq.com/binding created

创建的binding无法通过kubectl 命令列出,但通过RabbitMQ的管理UI可以看到。
在这里插入图片描述
创建用户及授权
可以使用 Messaging Topology Operator 创建 RabbitMQ 用户并分配用户权限

对账号(admin-user01)、密码(123123.com)进行base64加密:

echo -n 'admin-user01' | base64
YWRtaW4tdXNlcjAx

echo -n '123123.com' | base64
MTIzMTIzLmNvbQ==

创建secret

vim secret-admin-user01.yaml
apiVersion: v1
kind: Secret
metadata:
  name: admin-user-secret
  namespace: rabbitmq-test # 指定rabbitmq-cluster01的namespace
type: Opaque
data:
  username: YWRtaW4tdXNlcjAx  # base64 编码后的用户名
  password: MTIzMTIzLmNvbQ==  # base64 编码后的密码
kubectl apply -f secret-admin-user01.yaml
secret/admin-user01-secret created

创建Rabbitmq 账号资源,需要引用上面步骤创建的secret

vim my-admin-user01.yaml
apiVersion: rabbitmq.com/v1beta1
kind: User
metadata:
  name: my-admin-user01
  namespace: rabbitmq-test
spec:
  tags:
  - administrator
  rabbitmqClusterReference:
    name: rabbitmq-cluster01 # rabbitmqCluster must exist in the same namespace as this resource
    namespace: rabbitmq-test

  importCredentialsSecret:
    name: admin-user01-secret  # must match the name of the Secret
kubectl apply -f my-admin-user01.yaml
user.rabbitmq.com/my-admin-user01 created

创建Rabbitmq 账号授权资源

vim permission-admin-user10.yaml
apiVersion: rabbitmq.com/v1beta1
kind: Permission
metadata:
  name: admin-user01-permission
  namespace: rabbitmq-test
spec:
  vhost: "/"
  user: "admin-user01" # name of the RabbitMQ user
  permissions:
    write: ".*"
    configure: ".*"
    read: ".*"
  rabbitmqClusterReference:
    name: rabbitmq-cluster01
    namespace: rabbitmq-test
kubectl apply -f permission-admin-user10.yaml
permission.rabbitmq.com/admin-user01-permission created

在这里插入图片描述
创建虚拟主机
以下YAML将在名为“rabbitmq-cluster01”的 RabbitmqCluster 中创建名为“test”的虚拟主机:

vim vhost01.yaml
apiVersion: rabbitmq.com/v1beta1
kind: Vhost
metadata:
  name: test-vhost01 # name of this custom resource
  namespace: rabbitmq-test
spec:
  name: test01 # name of the vhost
  rabbitmqClusterReference:
    name: rabbitmq-cluster01
    namespace: rabbitmq-test
kubectl apply -f vhost01.yaml
vhost.rabbitmq.com/test-vhost01 created
kubectl get vhost -n rabbitmq-test
NAME           AGE
test-vhost01   2s

在这里插入图片描述
更新
一些自定义资源属性是不可变的,Messaging Topology Operator 实现了验证 webhook 来阻止对不可变字段的更新。禁止的更新将被拒绝。例如:

kubectl apply -f test-queue.yaml
Error from server (Forbidden):
...
Resource: "rabbitmq.com/v1beta1, Resource=queues", GroupVersionKind: "rabbitmq.com/v1beta1, Kind=Queue"
Name: "example", Namespace: "rabbitmq-system"
for: "test-queue.yaml": admission webhook "vqueue.kb.io" denied the request: Queue.rabbitmq.com "example" is forbidden: spec.name: Forbidden: updates on name, vhost, and rabbitmqClusterReference are all forbidden

无法更新的属性已记录在Messaging Topology Operator API 文档中,URL:https://github.com/rabbitmq/messaging-topology-operator/blob/main/docs/api/rabbitmq.com.ref.asciidoc

删除
删除自定义资源会删除 RabbitMQ 集群中相应的资源。Messaging Topology Operator 会在所有自定义资源上设置 kubernetes finalizers。如果对象已在 RabbitMQ 集群中删除,或者 RabbitMQ 集群已删除,Messaging Topology Operator 会删除自定义资源,而不会尝试删除 RabbitMQ 对象。

跨命名空间
默认情况下,Messaging Topology Operator 只协调使用RabbitMQ Cluster Kubernetes Operator 创建的RabbitMQ集群所在namespace下的创建消息拓扑资源请求。如果需要创建的建消息拓扑资源在其他的namesapce,需要在namespace 下添加相关注解annotations.rabbitmq.com/topology-allowed-namespaces

如下图,RabbitMQ集群所在的的namespace为rabbitmq-test,如果需要Messaging Topology Operator 额外协调rabbitmq-01和rabbitmq-02 两个namespace下消息拓扑资源,需要进行如下配置,多个namespace使用逗号分隔,中间不能有空格。可以设置为“*”,则为协调所有namesapce

apiVersion: rabbitmq.com/v1beta1
kind: RabbitmqCluster
metadata:
  name: rabbitmq-cluster01
  namespace: rabbitmq-test
  annotations:
    rabbitmq.com/topology-allowed-namespaces: "rabbitmq-01,rabbitmq-02"

如果在没有允许的namespace中创建消息拓扑资源,如下图中为“my-app2”,Topology Operator 的pod会有相关日志提示:
在这里插入图片描述
示例如下:
在namespace为my-app2下创建名称为queue-t1的queue, 在rabbitmq中的名称为queue-t1-my-app2

apiVersion: rabbitmq.com/v1beta1
kind: Queue
metadata:
  name: queue-t1 # name of this custom resource; does not have to the same as the actual queue name
  namespace: my-app2
spec:
  name: queue-t1-my-app2 # name of the queue
  rabbitmqClusterReference:
    name: rabbitmq-cluster01
    namespace: rabbitmq-test

虽然使用kuberct 命令在namespace可以获取到列表,
在这里插入图片描述
但在rabbitmq中没有创建名字为queue-t1-my-app2的queue:
在这里插入图片描述
故障排查
如果无法创建某些 RabbitMQ 拓扑对象,可通过Messaging Topology Operator 的pod日志进行排查。

kubectl -n rabbitmq-system logs -l app.kubernetes.io/name=messaging-topology-operator

另外还可以使用kubectl desribe命令查看资源的详细信息:

kubectl describe queue queue-t1 -n rabbitmq-test
Name:         queue-t1
Namespace:    rabbitmq-test
Labels:       <none>
Annotations:  <none>
API Version:  rabbitmq.com/v1beta1
Kind:         Queue
Metadata:
  Creation Timestamp:  2024-10-25T09:46:27Z
  Finalizers:
    deletion.finalizers.queues.rabbitmq.com
…
  Vhost:        /
Status:
  Conditions:
    Last Transition Time:  2024-10-25T09:46:27Z
    Reason:                SuccessfulCreateOrUpdate
    Status:                True
    Type:                  Ready
  Observed Generation:     2
Events:
  Type    Reason             Age                 From              Message
  -                 -                -              -
  Normal  SuccessfulDeclare  7h2m (x6 over 47h)  queue-controller  Successfully declare queue

裸金属环境部署RabbitMQ

OS及内核:

[root@rbt01 ~]# cat /etc/redhat-release
BigCloud Enterprise Linux For Euler release 21.10 (LTS-SP2)

[root@rbt01 ~]# uname -a
Linux rbt01 4.19.90-2107.6.0.0208.16.oe1.bclinux.x86_64 #1 SMP Tue Jul 18 10:06:28 CST 2023 x86_64 x86_64 x86_64 GNU/Linux

Erlang和RabbitMQ版本匹配关系参考官方文档:
https://www.rabbitmq.com/docs/3.13/which-erlang#redhat
在这里插入图片描述
本文档选用Erlang:v26.2.5.4和RabbitMQ: v3.13.7

部署单实例

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

安装Erlang
Erlang官方推荐使用各系统平台预安装包进行安装,Euler 21.10使用以下rmp包进行安装,下载地址:https://github.com/rabbitmq/erlang-rpm/releases/download/v26.2.5.4/erlang-26.2.5.4-1.el7.x86_64.rpm

执行安装及通过验证版本号测试是否安装成功

# 安装
yum install erlang-26.2.5.4-1.el7.x86_64.rpm

# 查看版本
erl -version
Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 14.2.5.4

部署RabbitMQ
二进制包下载地址:
https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-generic-unix-3.13.7.tar.xz

创建rabbitmq普通用户并设置密码,用于管理rabbitmq

useradd rabbitmq
passwd rabbitmq

解压下载好的二进制安装包到/opt目录下,并做软连接

tar xf rabbitmq-server-generic-unix-3.13.7.tar.xz -C /opt/
cd /opt/
ln -s /opt/rabbitmq_server-3.13.7/ /opt/rabbitmq
ln -s /opt/rabbitmq/sbin/* /usr/local/sbin/

安装完成后,默认没有配置文件,可以从官网下载示例,放到/opt/rabbitmq/etc/rabbitmq下,
https://github.com/rabbitmq/rabbitmq-server/blob/main/deps/rabbit/docs/rabbitmq.conf.example

可以根据实际需要参考下面的官方文档进行参数配置:
https://www.rabbitmq.com/docs/3.13/configure#config-items

修改rabbitmq 目录权限

chown –R rabbitmq:rabbitmq /opt/rabbitmq*

使用rabbitmq账号并启动服务:

su – rabbitmq
rabbitmq-server -detached

查看服务进程及监听端口号,默认会监听5672,25672 两个端口
5672用于接受rabbitmq 客户端连接请求
25672 用于集群模式下集群间通信
在这里插入图片描述
在这里插入图片描述
关闭服务命令:

rabbitmqctl shutdown

启动web管理插件,实现web 浏览器图形界面管理。

rabbitmq-plugins enable rabbitmq_management

启动web管理插件插件后,RabbitMQ会另外启动15672端口用户web服务。
使用服务器IP和15672端口访问web管理页面。
在这里插入图片描述
创建账号密码并设置权限
以下命令创建了admin账号并设置密码为:Admin.123,将其标记为administrator,并设置了对/ 有所有权限

rabbitmqctl add_user admin Admin.123
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

使用admin账号登录web管理页面
在这里插入图片描述
解决web管理界面提示:
⚠ All stable feature flags must be enabled after completing an upgrade. [Learn more]

  1. 导航到特性标志页面:
    在RabbitMQ管理界面的左侧菜单中,找到并点击“Admin”选项。
    在“Admin”页面中,找到并点击“Feature Flags”选项。
  2. 启用特性标志:
    在“Feature Flags”页面中,你会看到一个列表,其中包含了所有可用的特性标志。
    检查每个特性标志的状态,确保所有标记为“stable”(稳定)的特性标志都被启用。如果发现有未启用的稳定特性标志,请将其启用。
    在这里插入图片描述
    列出功能标志:
rabbitmqctl list_feature_flags

要启用功能标志(或所有当前禁用的标志):
rabbitmqctl enable_feature_flag <all | name>
开启detailed_queues_endpoint 功能标志

rabbitmqctl enable_feature_flag detailed_queues_endpoint

Feature Flags介绍:
官方文档:https://www.rabbitmq.com/docs/3.13/feature-flags
功能标记是一种机制,用于控制哪些功能在所有集群节点上被视为已启用或可用。如果启用了功能标记,则其相关功能(或行为)也会启用。如果没有启用,则集群中的所有节点都将禁用该功能(行为)。

功能标志子系统允许不同版本的 RabbitMQ 节点确定它们是否兼容,然后相互通信,尽管它们具有不同的版本,因此可能具有不同的功能集或实现细节。

引入此子系统是为了允许在不关闭整个集群的情况下对集群成员进行滚动升级。

至此RabbitMQ单实例部署完成。

部署集群

服务器列表
(3个节点保持一致)

[root@rbt01 ~]# tail -n 3 /etc/hosts
192.168.18.11 rbt01
192.168.18.12 rbt02
192.168.18.13 rbt03

分别在3个节点按照“单实例部署”步骤部署完成
参考上面章节
所有节点配置主机域名解析

vim /etc/hosts
192.168.18.11 rbt01
192.168.18.12 rbt02
192.168.18.13 rbt03

节点间同步cookie文件
Erlang cookie 是用于RabbitMQ 节点和CLI 工具之间身份验证的共享密钥。该值存储在通常称为 Erlang cookie 文件的文件中。
服务帐户和运行用户使用的 Cookie 文件rabbitmqctl必须同步,CLI 工具才能rabbitmqctl正常运行。集群中的所有节点必须具有相同的 Cookie 值(Cookie 文件内容)。

同步cooker前确保rabbitmq进程是关闭状态。

[root@rbt01 ~]# rabbitmqctl shutdown

[root@rbt02 ~]# rabbitmqctl shutdown

[root@rbt03 ~]# rabbitmqctl shutdown

在 UNIX 系统上,cookie 通常位于$HOME/.erlang.cookie
如果使用rabbitmq普通用户启动rabbitmq服务,.erlang.cookie文件的路径为:/home/rabbitmq/.erlang.cookie
.erlang.cookie 文件内容可以是自定义的字符串

将rbt01节点上/home/rabbitmq/.erlang.cookie 文件复制到rbt02,rbt03

[root@rbt01 ~]# scp .erlang.cookie rbt02:$PWD
.erlang.cookie                                                                              

[root@rbt01 ~]# scp .erlang.cookie rbt03:$PWD
.erlang.cookie                            

并确保所有节点/home/rabbitmq/.erlang.cookie的属主,属组是rabbitmq
权限是400

chown –R rabbit:rabbit /home/rabbitmq/.erlang.cookie
chmod 400 /home/rabbitmq/.erlang.cookie

配置集群方式一,在配置文件中增加如下配置:
/opt/rabbitmq/etc/rabbitmq/rabbitmq.conf

cluster_name = rbt-cluster01
cluster_formation.peer_discovery_backend     = rabbit_peer_discovery_classic_config

cluster_formation.classic_config.nodes.1 = rabbit@rbt01
cluster_formation.classic_config.nodes.2 = rabbit@rbt02
cluster_formation.classic_config.nodes.3 = rabbit@rbt03

在所有节点启动服务,集群将自动形成

[rabbitmq@rbt01 ~]$ rabbitmq-server –detached

[rabbitmq@rbt02 ~]$ rabbitmq-server –detached

[rabbitmq@rbt03 ~]$ rabbitmq-server –detached

在rbt01节点日志中查看有相关日志:

2024-11-05 11:23:41.793897+08:00 [info] <0.734.0> node rabbit@rbt02 up
2024-11-05 11:23:43.066480+08:00 [info] <0.734.0> rabbit on node rabbit@rbt02 up
2024-11-05 11:24:01.294927+08:00 [info] <0.734.0> node rabbit@rbt03 up
2024-11-05 11:24:02.705850+08:00 [info] <0.734.0> rabbit on node rabbit@rbt03 up

配置集群方式二,不需在rabbitmq.conf配置文件定义,使用以下命令配置集群
将rbt02节点加入集群

[rabbitmq@rbt02 ~]$  rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rbt02 ...

[rabbitmq@rbt02 ~]$  rabbitmqctl join_cluster rabbit@rbt01
Clustering node rabbit@rbt02 with rabbit@rbt01

[rabbitmq@rbt02 ~]$  rabbitmqctl start_app
Starting node rabbit@rbt02 ...

将rbt03节点加入集群

[rabbitmq@rbt03 ~]$ rabbitmqctl stop_app
Stopping rabbit application on node rabbit@rbt03 ...

[rabbitmq@rbt03 ~]$ rabbitmqctl join_cluster rabbit@rbt01
Clustering node rabbit@rbt03 with rabbit@rbt01

[rabbitmq@rbt03 ~]$ rabbitmqctl start_app
Starting node rabbit@rbt03 ...

查看集群状态

[rabbitmq@rbt01 ~]$ rabbitmqctl cluster_status
Cluster status of node rabbit@rbt01 ...
Basics

Cluster name: rabbit@rbt01
Total CPU cores available cluster-wide: 12

Disk Nodes

rabbit@rbt01
rabbit@rbt02
rabbit@rbt03

Running Nodes

rabbit@rbt01
rabbit@rbt02
rabbit@rbt03

Versions

rabbit@rbt01: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@rbt02: RabbitMQ 3.13.7 on Erlang 26.2.5.4
rabbit@rbt03: RabbitMQ 3.13.7 on Erlang 26.2.5.4
…

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vs code 使用教程

一、定义 多行注释vs 找不到上层文件路径选择 或 创建python 虚拟环境git 远程克隆及推送vs code 文件路径vs 使用tensorboard 二、使用 学习网站&#xff1a;https://learn.microsoft.com/zh-cn/visualstudio/python/?viewvs-2022性能分析&#xff1a;https://learn.micros…

【Elasticsearch】terms聚合误差问题

Elasticsearch中的聚合查询在某些情况下确实可能存在误差&#xff0c;尤其是在处理分布式数据和大量唯一值时。这种误差主要来源于以下几个方面&#xff1a; 1.分片数据的局部性 Elasticsearch的索引通常被分成多个分片&#xff0c;每个分片独立地计算聚合结果。由于数据在分…

BUU22 [护网杯 2018]easy_tornado 1

打开题目以后出现三个文件&#xff0c;查看源代码&#xff0c;突破口在于这三个文件都有特殊的格式 python的tornado漏洞 Tornado 是一个用 Python 编写的 Web 框架&#xff08;和flask一样&#xff0c;只不过flask是轻量级的&#xff0c;而tornado可以处理高流量&#xff09…

QT修仙之路1-1--遇见QT

文章目录 遇见QT二、QT概述2.1 定义与功能2.2 跨平台特性2.3 优点汇总 三、软件安装四、QT工具介绍(重要)4.1 Assistant4.2 Designer4.3 uic.exe4.4 moc.exe4.5 rcc.exe4.6 qmake4.7 QTcreater 五、QT工程项目解析(作业)5.1 配置文件&#xff08;.pro&#xff09;5.2 头文件&am…

寒假2.5

题解 web:[网鼎杯 2020 朱雀组]phpweb 打开网址&#xff0c;一直在刷新&#xff0c;并有一段警告 翻译一下 查看源码 每隔五秒钟将会提交一次form1&#xff0c;index.php用post方式提交了两个参数func和p&#xff0c;func的值为date&#xff0c;p的值为Y-m-d h:i:s a 执行fu…

计算机中数值表示:原码、反码、补码与移码

1 前言 计算机科学中&#xff0c;数字的表示方式至关重要&#xff0c;因为计算机内部只能识别处理二进制数据。为了在计算机中实现对整数的表示&#xff0c;提出了多种数值编码方式&#xff0c;其中最常用的是原码、反码、补码和移码。 2 原码 2.1 原码的定义 原码(Signed …

硬件实现I2C常用寄存器简单介绍

引言 在深入探讨I2C外设的具体案例之前&#xff0c;理解其核心寄存器的配置至关重要。这些寄存器不仅控制着I2C模块的基本操作模式&#xff0c;如数据传输速率和地址识别&#xff0c;还负责管理更复杂的通信需求&#xff0c;例如中断处理、DMA交互及错误检测与恢复。接下来的内…

分析用户请求K8S里ingress-nginx提供的ingress流量路径

前言 本文是个人的小小见解&#xff0c;欢迎大佬指出我文章的问题&#xff0c;一起讨论进步~ 我个人的疑问点 进入的流量是如何自动判断进入iptables的四表&#xff1f;k8s nodeport模式的原理&#xff1f; 一 本机环境介绍 节点名节点IPK8S版本CNI插件Master192.168.44.1…

linux中,软硬链接的作用和使用

一、软硬链接的作用 软硬链接&#xff0c;是大家所熟系的内容了。链接就是方便人使用电脑上访问文件、方便进程访问文件的工具。比如软连接大家都有见过&#xff0c;在安装某款软件的时候要不要添加快捷方式。在windows系统上&#xff0c;我们右键点击文件的时候按‘s’就能创建…

kalman滤波器C++设计仿真实例第三篇

1. 仿真场景 水面上有条船在做匀速直线航行&#xff0c;航行过程中由于风和浪的影响&#xff0c;会有些随机的干扰&#xff0c;也就是会有些随机的加速度作用在船身上&#xff0c;这个随机加速度的均方差大约是0.1&#xff0c;也就是说方差是0.01。船上搭载GPS设备&#xff0c;…

ubuntu20.04+RTX4060Ti大模型环境安装

装显卡驱动 这里是重点&#xff0c;因为我是跑深度学习的&#xff0c;要用CUDA&#xff0c;所以必须得装官方的驱动&#xff0c;Ubuntu的附件驱动可能不太行. 进入官网https://www.nvidia.cn/geforce/drivers/&#xff0c;选择类型&#xff0c;最新版本下载。 挨个运行&#…

[c语言日寄]浮点数在内存中的储存

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

Yageo国巨的RC系列0402封装1%电阻库来了

工作使用Cadence多年&#xff0c;很多时候麻烦的就是整理BOM&#xff0c;因为设计原理图的时候图省事&#xff0c;可能只修改value值和封装。 但是厂家&#xff0c;规格型号&#xff0c;物料描述等属性需要在最后的时候一行一行的修改&#xff0c;繁琐又容易出错&#xff0c;过…

【文档智能】Qwen2.5-VL在版式分析和表格识别上的实际评测效果

qwen开年开源了Qwen2.5-VL系列权重模型&#xff0c;笔者观察到相较于传统的多模态系列&#xff0c;增加了文档理解功能。笔者以文档智能中两个比较重要的任务版式分析和表格识别&#xff0c;笔者直接测试下Qwen2.5-VL-72B的效果。 版式分析 case1 case2 这个case没有输出bbox…

【计算机组成原理】1_绪论

chap1 绪论 1. 国产芯片现状 MIPS阵营&#xff1a;龙芯X86阵营&#xff08;常见于桌面和服务器&#xff09;&#xff1a;兆芯&#xff08;VIA&#xff09;&#xff0c;海光&#xff08;AMD&#xff09;ARM阵营&#xff08;常见于移动嵌入式、手机平板等&#xff09;&#xff…

解锁反序列化漏洞:从原理到防护的安全指南

目录 前言 一、什么是反序列化 二、反序列化漏洞原理 三、反序列化漏洞的危害 &#xff08;一&#xff09;任意代码执行 &#xff08;二&#xff09;权限提升 &#xff08;三&#xff09;数据泄露与篡改 四、常见的反序列化漏洞场景 &#xff08;一&#xff09;PHP 反…

openGauss 3.0 数据库在线实训课程1:学习数据库状态查看

openGauss数据库状态查看 前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见&#xff1a;openGauss 3.0.0数据库在线实训课程 学习目标 学习从操作系统层面和使用openGauss工具查看数据库的状态、版本和数据文件目录。 课程作业 gs_ctl是openGauss提…

[含文档+PPT+源码等]精品基于Python实现的django个性化健康餐计划订制系统

软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaScript、VUE.js&#xff08;2.X&#xff09;、css3 开发工具&#xff1a;pycharm、Visual Studio Code、HbuildX 数据库&#xff1a;MySQL 5.7.26&am…

单机伪分布Hadoop详细配置

目录 1. 引言2. 配置单机Hadoop2.1 下载并解压JDK1.8、Hadoop3.3.62.2 配置环境变量2.3 验证JDK、Hadoop配置 3. 伪分布Hadoop3.1 配置ssh免密码登录3.2 配置伪分布Hadoop3.2.1 修改hadoop-env.sh3.2.2 修改core-site.xml3.2.3 修改hdfs-site.xml3.2.4 修改yarn-site.xml3.2.5 …

ZooKeeper单节点详细部署流程

ZooKeeper单节点详细部署流程 文章目录 ZooKeeper单节点详细部署流程 一.下载稳定版本**ZooKeeper**二进制安装包二.安装并启动**ZooKeeper**1.安装**ZooKeeper**2.配置并启动**ZooKeeper** ZooKeeper 版本与 JDK 兼容性3.检查启动状态4.配置环境变量 三.可视化工具管理**Zooke…