Docker搭建Redis cluster集群

news2024/9/29 1:16:14

redis常用的三种集群方式是:主从复制,sentinel 哨兵模式,cluster模式,本节我想详细记录下cluster集群的动手部署方式。cluster是比较主流的方式,优缺点可以百度查下。

Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。注意cluster采用的是哈希槽算法,Redis集群预分好16384个桶或槽,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。

1.1 创建6个redis实例

集群中至少应该有奇数个节点,所以至少有三个节点,每个节点至少有一个备份节点,所以下面使用6节点(主节点、备份节点由redis-cluster集群确定)。我这里没有这么多机器哈。我就在一个机器上来演示搭建。

docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis --cluster-enabled yes --appendonly yes --port 6381
# 对这个命令稍微解释下:
# --cluster-enabled yes 开启redis集群
# -- net host 使用宿主机的Ip和端口,默认
# --appendonly yes 开启redis的日志持久化模式
# --privileged=true 来保证权限的

docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis --cluster-enabled yes --appendonly yes --port 6382
 
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis --cluster-enabled yes --appendonly yes --port 6383
 
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis --cluster-enabled yes --appendonly yes --port 6384
 
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis --cluster-enabled yes --appendonly yes --port 6385
 
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis --cluster-enabled yes --appendonly yes --port 6386

1.2 构建集群关系

上面已经假设已经启动好了6台集群的redis,然后就是来构建集群关系。

1.2.1 进入到一台redis中:docker exec -it redis-node-1 /bin/bash

docker exec -it redis-node-1 /bin/bash

12.2 创建集群

redis-cli --cluster create 10.0.16.15:6381 10.0.16.15:6382 10.0.16.15:6383 10.0.16.15:6384 10.0.16.15:6385 10.0.16.15:6386 --cluster-replicas 1

--cluster create # 集群创建命令

--cluster-replicas 1 #表示为每个master创建一个slave节点

[root@VM-16-15-centos ~]# docker exec -it redis-node-1 /bin/bash
root@VM-16-15-centos:/data# redis-cli --cluster create 10.0.16.15:6381 10.0.16.15:6382 10.0.16.15:6383 10.0.16.15:6384 10.0.16.15:6385 10.0.16.15:6386 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.0.16.15:6385 to 10.0.16.15:6381
Adding replica 10.0.16.15:6386 to 10.0.16.15:6382
Adding replica 10.0.16.15:6384 to 10.0.16.15:6383
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: dc8db285420c6745340ef6844a27b57819be72d0 10.0.16.15:6381
   slots:[0-5460] (5461 slots) master
M: 8b01ad849a90a83e6195a7158f5aaa312c386d53 10.0.16.15:6382
   slots:[5461-10922] (5462 slots) master
M: 27cb66abc15e4f17dfc4e1fbb9ae18dcf3289b85 10.0.16.15:6383
   slots:[10923-16383] (5461 slots) master
S: 8af142737cf096211cebfa384912b0b3b4482e51 10.0.16.15:6384
   replicates 8b01ad849a90a83e6195a7158f5aaa312c386d53
S: 26c491cbf52ef2bc240d173d09e06e48d89d1817 10.0.16.15:6385
   replicates 27cb66abc15e4f17dfc4e1fbb9ae18dcf3289b85
S: 5f48a6b99d0cfc5b18491916cf6c58b33dc485e0 10.0.16.15:6386
   replicates dc8db285420c6745340ef6844a27b57819be72d0
Can I set the above configuration? (type 'yes' to accept): yes  #yes表示同意上面的配置
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 10.0.16.15:6381)
M: dc8db285420c6745340ef6844a27b57819be72d0 10.0.16.15:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 26c491cbf52ef2bc240d173d09e06e48d89d1817 10.0.16.15:6385
   slots: (0 slots) slave
   replicates 27cb66abc15e4f17dfc4e1fbb9ae18dcf3289b85
M: 27cb66abc15e4f17dfc4e1fbb9ae18dcf3289b85 10.0.16.15:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 8b01ad849a90a83e6195a7158f5aaa312c386d53 10.0.16.15:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 8af142737cf096211cebfa384912b0b3b4482e51 10.0.16.15:6384
   slots: (0 slots) slave
   replicates 8b01ad849a90a83e6195a7158f5aaa312c386d53
S: 5f48a6b99d0cfc5b18491916cf6c58b33dc485e0 10.0.16.15:6386
   slots: (0 slots) slave
   replicates dc8db285420c6745340ef6844a27b57819be72d0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
root@VM-16-15-centos:/data# 

1.2.3 查看集群状态

redis-cli -p 6381   # 连接进入到6381这个端口的redis中

cluster info      # 集群信息

cluster nodes     # 查看集群节点

可以看到集群就已经创建好了。

1.3 主从容错切换

1.3.1 单机登录到redis

我们先来登录集群:

docker exec -it redis-node-1 redis-cli -p 6381 # 登录到了第一台主机redis

登录之后,我们在保存一条记录试试:

set key1 value1 # 报错:(error) MOVED 9189 10.0.16.15:6382

[root@VM-16-15-centos ~]# docker exec -it redis-node-1 redis-cli -p  6381
127.0.0.1:6381> cluster nodes
26c491cbf52ef2bc240d173d09e06e48d89d1817 10.0.16.15:6385@16385 slave 27cb66abc15e4f17dfc4e1fbb9ae18dcf3289b85 0 1641606558393 3 connected
27cb66abc15e4f17dfc4e1fbb9ae18dcf3289b85 10.0.16.15:6383@16383 master - 0 1641606560000 3 connected 10923-16383   # 范围3
8b01ad849a90a83e6195a7158f5aaa312c386d53 10.0.16.15:6382@16382 master - 0 1641606559000 2 connected 5461-10922  # 范围2
dc8db285420c6745340ef6844a27b57819be72d0 10.0.16.15:6381@16381 myself,master - 0 1641606559000 1 connected 0-5460    # 槽位范围1
8af142737cf096211cebfa384912b0b3b4482e51 10.0.16.15:6384@16384 slave 8b01ad849a90a83e6195a7158f5aaa312c386d53 0 1641606560399 2 connected
5f48a6b99d0cfc5b18491916cf6c58b33dc485e0 10.0.16.15:6386@16386 slave dc8db285420c6745340ef6844a27b57819be72d0 0 1641606557000 1 connected
127.0.0.1:6381> set key1 value1  # 看这里竟然报错了???
(error) MOVED 9189 10.0.16.15:6382
127.0.0.1:6381>

报错原因:那是因为根据它的算法是取模 16384,总共3台主机平分了16384,而key1计算之后是没有落在0-5460这个范围,从错误提示来看(error) MOVED 9189 10.0.16.15:6382,因为是落在第二台主机上面,而我登录的是在第一台机器上面去set,所以不匹配报错。

1.3.2 集群路由

上节中单机登录的方式,可能会存在计算之后的槽位不匹配导致不能保存,docker exec -it redis-node-1 redis-cli -p 6381,我们可以通过加一个参数 -c ,来优化路由,就是让它自动保存到对应槽位范围的机器上面去。

[root@VM-16-15-centos ~]# docker exec -it redis-node-1 redis-cli -c -p 6381 # 注意 -c
127.0.0.1:6381> flushall  # 清空下缓存 ,慎用
OK
127.0.0.1:6381> set key1 value1  # 重新设置,发现可以保存,看到会redirected调整到二号主机
-> Redirected to slot [9189] located at 10.0.16.15:6382
OK
10.0.16.15:6382>

查看集群情况:

docker exec -it redis-node-1 /bin/bash -c # 进入到一台机器

redis-cli --cluster check 10.0.16.15:6381 # 查看集群情况

[root@VM-16-15-centos ~]# docker exec -it redis-node-1   /bin/bash 
root@VM-16-15-centos:/data# redis-cli --cluster check 10.0.16.15:6381
10.0.16.15:6381 (dc8db285...) -> 2 keys | 5461 slots | 1 slaves.
10.0.16.15:6383 (27cb66ab...) -> 1 keys | 5461 slots | 1 slaves.
10.0.16.15:6382 (8b01ad84...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 4 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 10.0.16.15:6381)
M: dc8db285420c6745340ef6844a27b57819be72d0 10.0.16.15:6381
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 26c491cbf52ef2bc240d173d09e06e48d89d1817 10.0.16.15:6385
   slots: (0 slots) slave
   replicates 27cb66abc15e4f17dfc4e1fbb9ae18dcf3289b85
M: 27cb66abc15e4f17dfc4e1fbb9ae18dcf3289b85 10.0.16.15:6383
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 8b01ad849a90a83e6195a7158f5aaa312c386d53 10.0.16.15:6382
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 8af142737cf096211cebfa384912b0b3b4482e51 10.0.16.15:6384
   slots: (0 slots) slave
   replicates 8b01ad849a90a83e6195a7158f5aaa312c386d53
S: 5f48a6b99d0cfc5b18491916cf6c58b33dc485e0 10.0.16.15:6386
   slots: (0 slots) slave
   replicates dc8db285420c6745340ef6844a27b57819be72d0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

1.3.3 机停从机上位

先来停掉第一台6381这台机器:docker stop redis-node-1

docker exec -it redis-node-2 bash

可以看到我停掉了一台master之后,原来的从机就变成主机了。上图中有4个master,但是其中一个是fail,disconnected,所以运行的是5台机器,3主,2从。

如果这个时候,我又把第一台机器启动:docker restart redis-node-1

那么再通过cluster nodes 可以看到6台机器又变成了3主3从。但是注意,第一台机器原来是master,现在恢复了之后它变成了slave哈,不会有原来的地位(如果要原来的地位,那必须现在的master停机再启动)。所以看到健壮性还是挺强的。

1.4 主从扩容

假设我们近期可能要流量大增,所以需要扩大一组redis,一主一从。注意哈希槽的重新分配。

1.4.1 新增实例

假设实际工作中新增是两台机器。

docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis --cluster-enabled yes --appendonly yes --port 6387

docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis --cluster-enabled yes --appendonly yes --port 6388

1.4.2 新加入到集群

将新增的6387作为master节点加入集群。

redis-cli --cluster add-node ip:6387 ip:6381 # 6387要作为master新增节点,而6381是原来集群节点里面的领路人,相当于6387需要找到6381来作为领路人来加入到集群这个组织。

注意加入到集群之后,有个问题是它没有获取到槽位

root@VM-16-15-centos:/data# redis-cli --cluster check 10.0.16.15:6381
10.0.16.15:6387 (ce79c8b8...) -> 0 keys | 0 slots | 0 slaves.   # 注意没有槽位没有从机
10.0.16.15:6383 (27cb66ab...) -> 1 keys | 5461 slots | 1 slaves.
10.0.16.15:6382 (8b01ad84...) -> 1 keys | 5462 slots | 1 slaves.
10.0.16.15:6386 (5f48a6b9...) -> 2 keys | 5461 slots | 1 slaves.
[OK] 4 keys in 4 masters.
0.00 keys per slot on average.

1.4.3 重新分配槽位

命令: redis-cli --cluster reshard 10.0.16.15:6381

redis-cli --cluster reshard 10.0.16.15:6381  # 开始重新分配

How many slots do you want to move (from 1 to 16384)? 4096 # 16384/4 = 4096
What is the receiving node ID? ce79c8b8072d79bd16ad79ecc65c6c0949be2a79
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: all   # 注意这里all

然后我们来再次查看结果:

root@VM-16-15-centos:/data# redis-cli --cluster check 10.0.16.15:6387
10.0.16.15:6387 (ce79c8b8...) -> 1 keys | 4096 slots | 0 slaves.  # 现在已经分配了槽位
10.0.16.15:6383 (27cb66ab...) -> 1 keys | 4096 slots | 1 slaves.
10.0.16.15:6382 (8b01ad84...) -> 1 keys | 4096 slots | 1 slaves.
10.0.16.15:6386 (5f48a6b9...) -> 1 keys | 4096 slots | 1 slaves.
[OK] 4 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 10.0.16.15:6387)
M: ce79c8b8072d79bd16ad79ecc65c6c0949be2a79 10.0.16.15:6387
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
M: 27cb66abc15e4f17dfc4e1fbb9ae18dcf3289b85 10.0.16.15:6383
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
M: 8b01ad849a90a83e6195a7158f5aaa312c386d53 10.0.16.15:6382
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
S: 8af142737cf096211cebfa384912b0b3b4482e51 10.0.16.15:6384
   slots: (0 slots) slave
   replicates 8b01ad849a90a83e6195a7158f5aaa312c386d53
S: 26c491cbf52ef2bc240d173d09e06e48d89d1817 10.0.16.15:6385
   slots: (0 slots) slave
   replicates 27cb66abc15e4f17dfc4e1fbb9ae18dcf3289b85
S: dc8db285420c6745340ef6844a27b57819be72d0 10.0.16.15:6381
   slots: (0 slots) slave
   replicates 5f48a6b99d0cfc5b18491916cf6c58b33dc485e0
M: 5f48a6b99d0cfc5b18491916cf6c58b33dc485e0 10.0.16.15:6386
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

但是要注意,我们新加入的这个节点分配了4096个槽位,但是它的槽位部署连续的:

slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master 分成了三段。是之前上一次的三个主机master都分割点过来凑起来了4096个槽位,并不是4个主机重新从0开始分配哈。

1.4.4 主节点下添加从节点

命令:redis-cli --cluster add-node ip:新slave端口 (空格) ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID

redis-cli --cluster add-node 10.0.16.15:6388 10.0.16.15:6387 --cluster-slave --cluster-master-id ce79c8b8072d79bd16ad79ecc65c6c0949be2a79

这个命令的意思就是新节点6388,要加入到6387下作为从节点,--cluster-master-id 表示具体的你要加入到哪个maser节点下面,master节点有节点id.

root@VM-16-15-centos:/data# redis-cli --cluster add-node 10.0.16.15:6388 10.0.16.15:6387 --cluster-slave --cluster-master-id ce79c8b8072d79bd16ad79ecc65c6c0949be2a79
>>> Adding node 10.0.16.15:6388 to cluster 10.0.16.15:6387
>>> Performing Cluster Check (using node 10.0.16.15:6387)
M: ce79c8b8072d79bd16ad79ecc65c6c0949be2a79 10.0.16.15:6387
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
M: 27cb66abc15e4f17dfc4e1fbb9ae18dcf3289b85 10.0.16.15:6383
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
M: 8b01ad849a90a83e6195a7158f5aaa312c386d53 10.0.16.15:6382
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
S: 8af142737cf096211cebfa384912b0b3b4482e51 10.0.16.15:6384
   slots: (0 slots) slave
   replicates 8b01ad849a90a83e6195a7158f5aaa312c386d53
S: 26c491cbf52ef2bc240d173d09e06e48d89d1817 10.0.16.15:6385
   slots: (0 slots) slave
   replicates 27cb66abc15e4f17dfc4e1fbb9ae18dcf3289b85
S: dc8db285420c6745340ef6844a27b57819be72d0 10.0.16.15:6381
   slots: (0 slots) slave
   replicates 5f48a6b99d0cfc5b18491916cf6c58b33dc485e0
M: 5f48a6b99d0cfc5b18491916cf6c58b33dc485e0 10.0.16.15:6386
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 10.0.16.15:6388 to make it join the cluster.
Waiting for the cluster to join

>>> Configure node as replica of 10.0.16.15:6387.
[OK] New node added correctly.

加入了从机之后我们可以看到:

root@VM-16-15-centos:/data# redis-cli --cluster check 10.0.16.15:6381
10.0.16.15:6387 (ce79c8b8...) -> 1 keys | 4096 slots | 1 slaves.
10.0.16.15:6383 (27cb66ab...) -> 1 keys | 4096 slots | 1 slaves.
10.0.16.15:6382 (8b01ad84...) -> 1 keys | 4096 slots | 1 slaves.
10.0.16.15:6386 (5f48a6b9...) -> 1 keys | 4096 slots | 1 slaves.
[OK] 4 keys in 4 masters.

1.5 缩容

现在的需求是我们流量高峰过了。为了节省资源所以我们就来把6387和6388这两台机器撤掉。

先删除从机6388

命令:redis-cli --cluster del-node ip:从机端口 从机6388节点ID

redis-cli --cluster del-node 10.0.16.15:6388 e330f45d41eed0676139f22e72fec428ca891f46

docker exec -it c3c956862138 /bin/bash
redis-cli -p 6388 -c
cluster nodes  # 可以查看节点id,e330f45d41eed0676139f22e72fec428ca891f46

root@VM-16-15-centos:/data# redis-cli --cluster del-node  10.0.16.15:6388 e330f45d41eed0676139f22e72fec428ca891f46
>>> Removing node e330f45d41eed0676139f22e72fec428ca891f46 from cluster 10.0.16.15:6388
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
root@VM-16-15-centos:/data# 

# 删除了之后,我们来重新分配下槽位
redis-cli --cluster reshard 10.0.16.15:6381

root@VM-16-15-centos:/data# redis-cli --cluster reshard 10.0.16.15:6381
>>> Performing Cluster Check (using node 10.0.16.15:6381)
S: dc8db285420c6745340ef6844a27b57819be72d0 10.0.16.15:6381
   slots: (0 slots) slave
   replicates 5f48a6b99d0cfc5b18491916cf6c58b33dc485e0
M: ce79c8b8072d79bd16ad79ecc65c6c0949be2a79 10.0.16.15:6387
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
M: 27cb66abc15e4f17dfc4e1fbb9ae18dcf3289b85 10.0.16.15:6383
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
M: 8b01ad849a90a83e6195a7158f5aaa312c386d53 10.0.16.15:6382
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
S: 26c491cbf52ef2bc240d173d09e06e48d89d1817 10.0.16.15:6385
   slots: (0 slots) slave
   replicates 27cb66abc15e4f17dfc4e1fbb9ae18dcf3289b85
M: 5f48a6b99d0cfc5b18491916cf6c58b33dc485e0 10.0.16.15:6386
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
S: 8af142737cf096211cebfa384912b0b3b4482e51 10.0.16.15:6384
   slots: (0 slots) slave
   replicates 8b01ad849a90a83e6195a7158f5aaa312c386d53
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 8b01ad849a90a83e6195a7158f5aaa312c386d53  #6382的id
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: ce79c8b8072d79bd16ad79ecc65c6c0949be2a79  # 这里是6387要删除的节点,不是6388


# 然后再删除第七个节点 6387   命令:redis-cli --cluster del-node ip:端口 6387节点ID
redis-cli --cluster del-node 10.0.16.15:6387 ce79c8b8072d79bd16ad79ecc65c6c0949be2a79

redis下搭建cluster集群大家可以尝试按照我的步骤可以完全搭建成功。欢迎点赞收藏,以备后续用到查找方便。

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

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

相关文章

Hadoop启动缺失ResourceManager

Hadoop启动缺失ResourceManager 查日志是resourcemanager空指针,java.lang.NullPointerException 1、进入根目录的tmp文件夹 cd /tmp2、删除hadoop-yarn-root rm -rf hadoop-yarn-root3、重启hadoop就好啦!!!!&…

三网运营商大数据精准营销客源信息提取的原理是什么?

现在的这个互联网时代,越来越多的人从事运营商大数据这个行业,相信大家都很好奇运营商大数据的绝对优势究竟是什么,它究竟是有什么魅力,能够让那么多的人为它所倾倒,下面我们就来看一下它究竟有什么优势吧。 1.对用户的…

解析硬件连通性测试的重要性及测试方法

在现代科技世界中,硬件设备的复杂性和多样性已经达到了前所未有的水平。无论是计算机、智能手机、物联网设备还是嵌入式系统,各种硬件组件的协同工作对于设备的正常运行至关重要。硬件连通性测试是确保这些组件相互配合无误的重要步骤。 一、硬件连通性测…

[nltk_data] Error loading stopwords: <urlopen error [WinError 10054]

报错提示&#xff1a; >>> import nltk >>> nltk.download(stopwords) 按照提示执行后 [nltk_data] Error loading stopwords: <urlopen error [WinError 10054] 找到路径C:\\Users\\EDY\\nltk_data&#xff0c;如果没有nltk_data文件夹&#xff0c;在…

嵌入式养成计划-30-网络编程----多点通信--单播--广播--组播

六十六、多点通信 66.1 网络属性相关函数 getsockoptsetsockopt 功能&#xff1a;获取/设置网络属性; 原型&#xff1a;#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int getsockopt(int sockfd, int level, int optname, void *opt…

12大自媒体推广平台整理

1、百家号&#xff1a;权重很高&#xff0c;百度端排名效果极好&#xff0c;即便是行业核心词&#xff0c;也可以轻松进入前三页。 2、头条号&#xff1a;即时展示效果较好&#xff0c;文章质量越高&#xff0c;被推送的范围越广。 3、微信公众号&#xff1a;更适合做私域流量…

STM32实战项目——WIFI远程开关灯

前言 其实WIFI开关灯在几个月前就想做了&#xff0c;但是对于没有云平台调试经验的我&#xff0c;一开始有些摸不着头脑&#xff0c;所以就搁置了。十一假期与老同学聊天时了解到他也在做一个远程开关灯的小项目&#xff0c;所以就重新开始了WIFI远程开关灯的小项目。 本文使用…

你不会还在人工巡检UPS设备吧!?大神技巧学起来!

在现代生活和商业中&#xff0c;依赖电力已经成为不可或缺的一部分。因此&#xff0c;UPS监控成为了保障业务连续性和设备运行的关键要素。 UPS监控的目标是提供对电力系统的全面可视化和控制&#xff0c;以及在电力故障或其他问题发生时采取即时行动。 客户案例 企业数据中心…

剑指offer——JZ86 在二叉树中找到两个节点的最近公共祖先 解题思路与具体代码【C++】

一、题目描述与要求 在二叉树中找到两个节点的最近公共祖先_牛客题霸_牛客网 (nowcoder.com) 题目描述 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2&#xff0c;请找到 o1 和 o2 的最近公共祖先节点。 数据范围&#xff1a;树上节点数满足1≤n≤1…

软件安全测试包含哪些内容?测试流程步骤有哪些?

泽众云测试通过专业的安全测试设备与经验丰富的实施人员从应用代码、服务器、数据库、通信交互等方面针对安全性风险进行全方位的检测&#xff1b;凭借专业的安全测试设备以及积累的安全测试用例为客户出具安全测试报告&#xff0c;并为客户提供科学的修复建议。 安全测试解决的…

c++视觉---中值滤波处理

中值滤波&#xff08;Median Filter&#xff09;是一种常用的非线性平滑滤波方法&#xff0c;用于去除图像中的噪声。它不像线性滤波&#xff08;如均值滤波或高斯滤波&#xff09;那样使用权重来计算平均值或加权平均值&#xff0c;而是选择滤波窗口内的像素值中的中间值作为输…

[硬件基础]-快速了解555定时器

快速了解555定时器 文章目录 快速了解555定时器1、555 定时器内部组成2、555 定时器的工作原理3、555 定时器的操作模式3.1 单稳态3.2 双稳态3.3 非稳态 555 定时器振荡器或通常所说的 555 定时器是一种非常流行的计时相关应用 IC。 它们坚固耐用且用途广泛&#xff0c;因为它们…

提高网站性能的10种方法:加速用户体验和降低服务器负担

在今天的数字时代&#xff0c;网站性能对于吸引和保留用户至关重要。一个快速加载的网站不仅提供更好的用户体验&#xff0c;还有助于降低服务器负担。以下是10种提高网站性能的方法&#xff0c;旨在加速页面加载速度和减少服务器的工作负荷。 压缩网页资源 利用压缩算法如gzi…

CVE-2023-36845:Juniper Networks Junos OS EX远程命令执行漏洞

Juniper Networks Junos OS EX远程命令执行漏洞(CVE-2023-36845) 复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#…

16-bit 内置基准模数转换器:MS1100

MS1100 是一款高精度 16bit 模数转换器。内部集成 2.048V 基 准源&#xff0c;差分输入范围达到 2.048V 。使用了 I 2 C 兼容接口。电源电 压范围为 2.7V 到 5.5V 。 MS1100 转换速率为 15 、 30 、 60 或 240SPS &#xff0c;集成有可编程增 益放大器&…

Zookeeper集群安装部署、Kafka集群安装部署

目录 1. Zookeeper简介 2. Zookeeper安装 2.1 首先&#xff0c;要确保已经完成了集群化环境前置准备环节的全部内容 2.2 【node1上操作】下载Zookeeper安装包&#xff0c;并解压 2.3 【node1上操作】创建软链接 2.4 【node1上操作】修改配置文件 2.5 【node1上操作】…

Python Django 详解(基础)

文章目录 1 概述1.1 安装 django1.2 创建 django 项目1.3 创建 app 2 启动 Django2.1 settings.py&#xff1a;注册 app2.2 view.py&#xff1a;URL和视图对应2.3 启动 Django2.4 访问 3 快速上手3.1 templates&#xff1a;html 模板3.2 static&#xff1a;静态文件3.3 模板语法…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS进阶(一)

思维导图 一、作用域 1.1 局部作用域 let和const声明的才有块作用域 1.2 全局作用域 1.3 作用域链 1.4 JS垃圾回收机制 1.5 闭包 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Comp…

Qt元对象系统 day5

Qt元对象系统 day5 内存管理 QObject以对象树的形式组织起来&#xff0c;当为一个对象创建子对象时&#xff0c;子对象回自动添加到父对象的children()列表中。父对象拥有子对象所有权&#xff0c;比如父对象可以在自己的析构函数中删除它的孩子对象。使用findChild()或findC…

怎么压缩ppt文件?

怎么压缩ppt文件&#xff1f;造成ppt文件体积太大的原因主要有两个&#xff1a;① 图片和媒体文件&#xff0c;PPT中使用高分辨率、大尺寸的图片或视频文件会增加文件大小。如果未经压缩或优化&#xff0c;这些文件可能会占用较大的存储空间&#xff1b;② 动画和特效&#xff…