springboot+redis+angular+zookeeper+kafka等实战
很遗憾,看了很多文章都没有我想要很多实际中能切合。脱离了环境的说明我不认为是有效的。
基础环境要有,这里使用docker构建基础环境。没有基础就不要看这篇文章了,不然浪费时间,其次东西完全是个人研究用,不保证100%对。
保证docker虚拟机已有。
1、redis集群配置:下面的一切依照官网而来。
dockerhub官网
搜索redis。选择适合你虚拟机的版本。
这是我的版本。并确保环境干净。
Connecting to 192.168.253.129:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.15.0-112-generic x86_64)* Documentation: https://help.ubuntu.com* Management: https://landscape.canonical.com* Support: https://ubuntu.com/advantage
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
我们先来装一个redis,并尝试调试成功,再来集群化,并将过程dockerFile脚本化。
按照官网一步步来:
# 安装最新redis
root@ubuntu:~# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
d121f8d1c412: Pull complete
2f9874741855: Pull complete
d92da09ebfd4: Pull complete
bdfa64b72752: Pull complete
e748e6f663b9: Pull complete
eb1c8b66e2a1: Pull complete
Digest: sha256:a05a8a1ebbef72690034a77451e6e83f4d899779190d1c00d8ab1a3a4fbbbd22
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
# 查看已安装镜像
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 84c5f6e03bf0 39 hours ago 104MB
# 启动容器,要做端口映射,如果不了解网络原理,自己去查。
root@ubuntu:~# docker run --name myredis -p 6379:6379 -d redis redis-server
11d70622fcb1bf6985423f94c2afbd7b390609656985193997cbb2bf3a9dd02f
# 查看已启动容器
root@ubuntu:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11d70622fcb1 redis "docker-entrypoint.s…" 28 seconds ago Up 27 seconds 0.0.0.0:6379->6379/tcp myredis
# 服务其上测试安装成功,并可使用
root@ubuntu:~# docker exec -it 11d70622fcb1 /bin/bash
root@11d70622fcb1:/data# redis-cli
127.0.0.1:6379> set mykey "test ok"
OK
127.0.0.1:6379> get mykey
"test ok"
127.0.0.1:6379>
测试本地如何连接上我们服务器上的docker:
首先redis desktop manager连接成功:
本地新建一个springboot工程:
pom.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.docker</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- 这个包是必须的 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.6.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
配置文件application.properties:
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=192.168.253.129
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接 默认 8 使用lettuce
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0
测试类:
package com.docker.demo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {@Autowiredprivate StringRedisTemplate redisTemplate;@RequestMapping("/test")@ResponseBodypublic String test() {return redisTemplate.opsForValue().get("mykey");}
}
测试结果如下:
到此说明这一切是通,我们这一系列过程是对的。那么接下里就是复杂化,并编写脚本实现。
首先我要创建给redis创一个network: 这是为了保证了集群化在一个网段内。
root@ubuntu:~# docker network create redis --subnet 172.38.0.0/16
root@ubuntu:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
ba7152491897 bridge bridge local
6c14996eff23 host host local
dcce898c2df5 none null local
868ef963e47e redis bridge local
创建6个redis的脚本:
root@ubuntu:/home/script# vim redis.sh
root@ubuntu:/home/script# sh redis.sh
root@ubuntu:/home/script# pwd
/home/script
root@ubuntu:/home/script# cd /mydata
root@ubuntu:/mydata# cd redis/
root@ubuntu:/mydata/redis# ls
node-1 node-2 node-3 node-4 node-5 node-6
root@ubuntu:/mydata/redis# cd node-1
root@ubuntu:/mydata/redis/node-1# ls
conf data
脚本:
# 脚本创建6个redis
for port in $(seq 1 6);\
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat <<EOF> /mydata/redis/node-${port}/conf/redis.conf
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass useaverystrongpasswordfoobared666useaverystrongpassword888useaverystrongpassword999useaverystrongpassword110
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
# 集群配置
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
EOF
done
root@ubuntu:/home/script# vim redis-start.sh# 启动脚本
for port in $(seq 1 6); \
do \
docker run -d -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9 redis-server /etc/redis/redis.conf; \
done
然而并不是那么顺利,我们发现启动了就立马退出了。来变量控制是什么导致这个原因的。
root@ubuntu:/etc# docker run --name myredis -p 6379:6379 -p 16379:16379 -d redis redis-server /etc/redis/redis.conf;
6ae8653bab807a05bb7717b2cefa112e582d4580ce9d096c1c5e3fd40ae37a1e
root@ubuntu:/etc# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@ubuntu:/etc# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6ae8653bab80 redis "docker-entrypoint.s…" About a minute ago Exited (1) About a minute ago myredis
root@ubuntu:/etc# docker run --name myredis -p 6379:6379 -p 16379:16379 -d redis redis-server
docker: Error response from daemon: Conflict. The container name "/myredis" is already in use by container "6ae8653bab807a05bb7717b2cefa112e582d4580ce9d096c1c5e3fd40ae37a1e". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
root@ubuntu:/etc# docker rm -f $(docker ps -aq)
6ae8653bab80
root@ubuntu:/etc# docker run --name myredis -p 6379:6379 -p 16379:16379 -d redis redis-server
a0dc6522d49ed8d93841e7ab8affad5f69c37287511d85f5a71e0d109285c1ff
root@ubuntu:/etc# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0dc6522d49e redis "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6379->6379/tcp, 0.0.0.0:16379->16379/tcp myredis
通过上面我们可以发现,启动不加配置文件是可以启动的。启动加上配置文件,启动就立马停止了,所以问题应该出在/etc/redis/redis.conf
配置中,
root@ubuntu:/# find -name "redis.conf"
./mydata/redis/node-2/conf/redis.conf
./mydata/redis/node-6/conf/redis.conf
./mydata/redis/node-3/conf/redis.conf
./mydata/redis/node-1/conf/redis.conf
./mydata/redis/node-4/conf/redis.conf
./mydata/redis/node-5/conf/redis.conf
可以发现,并没有这个文件。从官网下载(是指下载对应的redis打开安装好后,找到该文件放上去)
放上去后就可以看到该目录文件了。个人建议不要用最新版,不好查版本。
root@ubuntu:/# find -name "redis.conf"
./mydata/redis/node-2/conf/redis.conf
./mydata/redis/node-6/conf/redis.conf
./mydata/redis/node-3/conf/redis.conf
./mydata/redis/node-1/conf/redis.conf
./mydata/redis/node-4/conf/redis.conf
./mydata/redis/node-5/conf/redis.conf
find: ‘./run/user/1000/gvfs’: Permission denied
./etc/redis/redis.conf
我们再来试一试:结果还是失败。
检查配置文件是否设置了daemonize yes,如果是,就要改为daemonize no,因为该选项让redis成为在后台运行的守护进程,而docker容器必须要有一个前台进程才能留存。我们启动的时候又使用了-d命令。
然而也不是这个原因。
清空环境。从头再来,我们去先去下载一个tar包
再去docker pull redis:5.0.9
,从而保证变量一致性。
将上面配置文件脚本改为:
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
# requirepass 123456
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
主要改了:(密码不重要)
# bind 127.0.0.1
protected-mode no
# 可以不设,配置前可以设置,后面一定要设置
requirepass 123456
daemonize no
结果如下:
root@ubuntu:/mydata# docker run -p 6371:6379 -p 16371:16379 --name redis-1 -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.11 redis:5.0.9 redis-server /etc/redis/redis.conf;
64055d4b6eb8d19841da7ad09e6ba42481f21bfb26730fb6aec6725ecca3066d
root@ubuntu:/mydata# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64055d4b6eb8 redis:5.0.9 "docker-entrypoint.s…" 9 seconds ago Up 7 seconds 0.0.0.0:6371->6379/tcp, 0.0.0.0:16371->16379/tcp redis-1
反过去修改上面的脚本。
运行脚本的最终结果如下面:
root@ubuntu:/home/script# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15a0b18c9b9a redis:5.0.9 "docker-entrypoint.s…" 7 seconds ago Up 6 seconds 0.0.0.0:6376->6379/tcp, 0.0.0.0:16376->16379/tcp redis-6
d097f6d6050c redis:5.0.9 "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 0.0.0.0:6375->6379/tcp, 0.0.0.0:16375->16379/tcp redis-5
acd8389e8f4f redis:5.0.9 "docker-entrypoint.s…" 10 seconds ago Up 8 seconds 0.0.0.0:6374->6379/tcp, 0.0.0.0:16374->16379/tcp redis-4
976040c90afb redis:5.0.9 "docker-entrypoint.s…" 11 seconds ago Up 9 seconds 0.0.0.0:6373->6379/tcp, 0.0.0.0:16373->16379/tcp redis-3
ce1e9d501b74 redis:5.0.9 "docker-entrypoint.s…" 12 seconds ago Up 11 seconds 0.0.0.0:6372->6379/tcp, 0.0.0.0:16372->16379/tcp redis-2
ab69091e80ac redis:5.0.9 "docker-entrypoint.s…" 13 seconds ago Up 12 seconds 0.0.0.0:6371->6379/tcp, 0.0.0.0:16371->16379/tcp redis-1
重点注意:一定要保证环境的版本的一致性。控制变量的一致性
集群的配置,可以在这里配置,但是只是一次有效。所以我们还是在springboot中依赖配置文件去配置比较好。
还是上面的环境。来配置集群和哨兵模式。
前面我们学习redis的时候我们介绍过:Redis哨兵(Sentinel)和自动分区(Cluster)
集群方案 —— 包括主从复制模式、哨兵模式、Cluster模式,其中主从复制模式由于不能自动做故障转移,当节点出现故障时需要人为干预,不满足生产环境的高可用需求,所以在生产环境一般使用哨兵模式或Cluster模式。
采用自动分区(Cluster)模式:
你需要仔细阅读官网或者英文官网
官网的一句原话:要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。
所以先来规划主从的设置:这是前面已经配好的节点。
192.168.253.129:6371 主 -> 192.168.253.129:6374 从
192.168.253.129:6372 主 -> 192.168.253.129:6375 从
192.168.253.129:6373 主 -> 192.168.253.129:6376 从
去一个认老大的例子,不想累述:
root@ubuntu:~# docker exec -it acd8389e8f4f /bin/bash
root@acd8389e8f4f:/data# redis-cli
127.0.0.1:6379> info replication
NOAUTH Authentication required.
127.0.0.1:6379> auth useaverystrongpasswordfoobared666useaverystrongpassword888useaverystrongpassword999useaverystrongpassword110
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:a6917a80cc325dbc44e73b5e68babd1db455dd65
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379>
每个节点都是如此,就难受了。区分不开。上面的脚本有问题。没有集群化处理,集群化参数官网说明。重新写的脚本依旧在上面。
脚本添加:
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
为了方便重来新建清除脚本 clear-redis.sh:
for cid in $(docker ps -aq);
do
docker stop $cid
done
docker rm -f $(docker ps -aq)
rm -rf mydata/
发现需要密码验证,修改脚本注释密码或者脚本验证密码。重新执行一遍。个人建议脚本验证密码。如果不会就注释掉吧。
在执行如下语句:分析下面的语句。
root@ubuntu:/home/script# docker exec -it 17f8a1f0e182 /bin/bash
root@17f8a1f0e182:/data# redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
# 有6个基点插槽 选项–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。如果自定义–replicas 1 172.38.0.11:6379 他后面跟的全部就是master
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
# 给了默认的推荐方式,即三主三从。你选择yes即可,当然你也自定义你想要的方式。不过一般默认推荐,实际环境有要求除外。
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: 67fd9000233cfaee016e1f71e2d1c4415b962eae 172.38.0.11:6379slots:[0-5460] (5461 slots) master
M: 9452f6832d53eafe3d9766ac3926f1064bcaba45 172.38.0.12:6379slots:[5461-10922] (5462 slots) master
M: 5543b59af158f22ae763896742500fe78e83ebdb 172.38.0.13:6379slots:[10923-16383] (5461 slots) master
S: 79e3cf433d91f1a5584271c6df395a02d726ce29 172.38.0.14:6379replicates 5543b59af158f22ae763896742500fe78e83ebdb
S: 2297ccf2b9aaeb99c90f50f1db8d7fc951ee91e9 172.38.0.15:6379replicates 67fd9000233cfaee016e1f71e2d1c4415b962eae
S: 10f0bdfef9df4501ac78e604171b67025ee3b89a 172.38.0.16:6379replicates 9452f6832d53eafe3d9766ac3926f1064bcaba45
Can I set the above configuration? (type 'yes' to accept): 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
....
# 选择yes后,最后主从结果显示。
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: 67fd9000233cfaee016e1f71e2d1c4415b962eae 172.38.0.11:6379slots:[0-5460] (5461 slots) master1 additional replica(s)
M: 5543b59af158f22ae763896742500fe78e83ebdb 172.38.0.13:6379slots:[10923-16383] (5461 slots) master1 additional replica(s)
M: 9452f6832d53eafe3d9766ac3926f1064bcaba45 172.38.0.12:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
S: 2297ccf2b9aaeb99c90f50f1db8d7fc951ee91e9 172.38.0.15:6379slots: (0 slots) slavereplicates 67fd9000233cfaee016e1f71e2d1c4415b962eae
S: 10f0bdfef9df4501ac78e604171b67025ee3b89a 172.38.0.16:6379slots: (0 slots) slavereplicates 9452f6832d53eafe3d9766ac3926f1064bcaba45
S: 79e3cf433d91f1a5584271c6df395a02d726ce29 172.38.0.14:6379slots: (0 slots) slavereplicates 5543b59af158f22ae763896742500fe78e83ebdb
还是那句话,这里的配置并不是永久的配置,服务器重启,你就的在这样配置一次。所以还是要依赖springboot配置文件去配置。
测试外界连接:redis desktop manager连接成功.
注意:集群的连接需要在高级设置里面选择集群。
如果需求用集群方式链接的话,勾选集群完毕后,链接一个单点redis则相当于链接了整个redis集群,否则则认为只做单点链接。
另外如果有需要你需要添加一个新节点、添加一个从节点、删除一个节点、节点的迁移这是非常重要的研究点,官网已经给了一个完整的实例,不累述。
调试发现不能连接:😭😭
服务器上测试:
root@ubuntu:~# docker exec -it 51aa2d97848e /bin/bash
root@51aa2d97848e:/data# redis-cli
127.0.0.1:6379> set mykey "test ok"
(error) MOVED 14687 172.38.0.13:6379
127.0.0.1:6379> exit
# 解决方式
root@51aa2d97848e:/data# redis-cli -c
127.0.0.1:6379> set mykey "test ok"
-> Redirected to slot [14687] located at 172.38.0.13:6379
OK
172.38.0.13:6379> get mykey
"test ok"
172.38.0.13:6379>
没啥用啊!我要的是实际生成环境能连接上并且能用。该如何配置呢。
查看docker网络配置:
root@ubuntu:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
ba7152491897 bridge bridge local
6c14996eff23 host host local
dcce898c2df5 none null local
868ef963e47e redis bridge local
root@ubuntu:~# docker network inspect 868ef963e47e
[{"Name": "redis","Id": "868ef963e47e0b085f1cdf00c70344d3cfbb227d0995812ae688b107b8aeaeb9","Created": "2020-08-09T01:16:13.879953848-07:00","Scope": "local",# 使用的桥连接模式"Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "172.38.0.0/16","Gateway": "172.38.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"17f8a1f0e182220c845d354a75a5edfa947a29c4ca3cf4b22ff083b3929e1309": {"Name": "redis-4","EndpointID": "fb49fd87b68f8f351889f20381ddce1e6888dfbc4735bdfdede8cc1e5e095e3f","MacAddress": "02:42:ac:26:00:0e","IPv4Address": "172.38.0.14/16","IPv6Address": ""},"2e1b478691d9b95ca2904a49bfe131fa76c71e8a1c6867eac5ea35889d29e611": {"Name": "redis-6","EndpointID": "21db2ce82ca82e0d8b60fc38bf45938c057207f8b51c67fca9c5e55f6eabb833","MacAddress": "02:42:ac:26:00:10","IPv4Address": "172.38.0.16/16","IPv6Address": ""},"4d647a2beb707bcd7162cdbd76e0c9ad6105d17bc676e02f48458d40fd9458ed": {"Name": "redis-5","EndpointID": "64bfc2186c2372c3ff77355b1ab9b89ff9c611bb159aefca5e8c7e6c44b761b8","MacAddress": "02:42:ac:26:00:0f","IPv4Address": "172.38.0.15/16","IPv6Address": ""},"51aa2d97848ea8871464828f9b5599d437e2afca2d49b62984df9028945a29b7": {"Name": "redis-1","EndpointID": "f6dd99c820d97f72d2a8ad9e64701c416e755dde409348962b530c8835b02d41","MacAddress": "02:42:ac:26:00:0b","IPv4Address": "172.38.0.11/16","IPv6Address": ""},"8ee555e7c91cc0f80901b0f2cc2eab9ea259255720c6a509c88ba16903271ee7": {"Name": "redis-3","EndpointID": "bbe352a3bc1d3e04008d773aafe2ad5ec134345f505a761592255f9cdef26c88","MacAddress": "02:42:ac:26:00:0d","IPv4Address": "172.38.0.13/16","IPv6Address": ""},"eaa0722997970300a171795c1bc51c6416fce962aeaed973abee884331027809": {"Name": "redis-2","EndpointID": "c757e8b9b4e80d9d82a65f15681309335e3056906c51597058461ac5278741cd","MacAddress": "02:42:ac:26:00:0c","IPv4Address": "172.38.0.12/16","IPv6Address": ""}},"Options": {},"Labels": {}}
]
查看网络:
root@ubuntu:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::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 1000link/ether 00:50:56:29:69:8a brd ff:ff:ff:ff:ff:ffinet 192.168.253.129/24 brd 192.168.253.255 scope global dynamic ens33valid_lft 1273sec preferred_lft 1273secinet6 fe80::d86d:a7f8:2c6f:ab9c/64 scope link valid_lft forever preferred_lft forever
# 没毛病172.38.0.1/16 有了呀。感叹网络原理学的太差了😭
3: br-868ef963e47e: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:9f:2c:a4:a2 brd ff:ff:ff:ff:ff:ffinet 172.38.0.1/16 brd 172.38.255.255 scope global br-868ef963e47evalid_lft forever preferred_lft foreverinet6 fe80::42:9fff:fe2c:a4a2/64 scope link valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:a5:f1:31:77 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:a5ff:fef1:3177/64 scope link
也没啥毛病啊!但是就是ping不通。
继续排查,尝试windows能操作或路由有问题?
打开window上的cmd。注意集群-c
是一定要的。下面需要注意我ip了以下。
下面的ip+端口如下划线部分。
C:\Users\zy962>redis-cli -h 192.168.253.139:6371 -p 6371 -c
Could not connect to Redis at 192.168.253.139:6371:6371: 不知道这样的主机。
not connected> c^C
C:\Users\zy962>redis-cli -h 192.168.253.139 -p 6371 -c
192.168.253.139:6371> set key11 123
OK
192.168.253.139:6371> get key11
"123"
192.168.253.139:6371>
如果有密码
redis-cli -h 192.168.253.139:6371 -p 6371 -c -a 123456
运行结果:这说明windows上是可操作的。注意这里操作没有重定向,可能导致问题。后面如果有遇到再说。
添加路由关系:
结果:注意要用管理员权限启动cmd
重新启动原先的测试程序:测试成功。
到此cluster集群测试完毕。redis框架已搭好。
在这里一点哨兵模式:以下说关于哨兵的没有实践。正确性自己保重。
服务器的配置:
1、同上是面的目录(可以随便建目录)/etc/redis/sentinel.conf
官网上说了,最简单的配置:
# 第一行配置指示 Sentinel 去监视一个名为 mymaster 的主服务器,
# 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 ,这个2的意思
# 将这个主服务器判断为失效至少需要 2 个 Sentinel 同意
sentinel monitor mymaster 127.0.0.1 6379 2
# down-after-milliseconds指定了 Sentinel 认为服务器已经断线所需的毫秒数。
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
# parallel-syncs执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
sentinel parallel-syncs mymaster 1
这个配置文件需要挂载几份取决于你计划要几个哨兵。
个人建议:下面部分最好加进去。
# bind 127.0.0.1
protected-mode no
# 可以不设,配置前可以设置,后面一定要设置
requirepass 123456
daemonize no
关于主从:可以只在从服务器下加上这个。 上面可以指定端口,也可以默认。当进入去认老大也是可以的。
# 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
slaveof 127.0.0.1 6379
还可以设置:
# 注意他和requirepass区别
sentinel auth-pass mymaster 123456
启动三个容器:举一个例子。
docker run -d -p 6371:6379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-d --net redis --ip 172.38.0.11 redis:5.0.9 redis-server
解释:
1、启动就用默认配置redis.conf
2、端口不需要+10000
注意:记得主从设置
启动哨兵:
docker run -p 6371:6371 --restart=always --name sentinel-6371 \
-v/home/docker/redis/sentinel-6371.conf:/etc/redis/sentinel.conf \
-v /home/docker/redis/sentinel-6371-data:/data -d redis redis-sentinel /etc/redis/sentinel.conf
window端配置只有配置文件上的一点小差距:
将上面cluster的部分为下面的
#redis 哨兵监听的Redis Server的名称
spring.redis.sentinel.master=mymaster
# comma-separated list of host:port pairs 哨兵的配置列表
spring.redis.sentinel.nodes=127.0.0.1:26379,127.0.0.1:36379,127.0.0.1:46379
zookeeper + kafka的搭建:kafka依赖于zookeeper
首先你要有基本的概念:拿日志举例子
常见问题:
1、如何区分服务,服务名。给每个微服务取名比如filter、manage
2、缺点:当发生JVM内存泄漏、内存溢出等情况无法定位到具体服务器
首先,如果条件允许,建议3个vm模拟较好。采用先搭建好一个,其余克隆修改配置文件即可。(由于电脑垃圾,这里我只说明过程不演示,后面我会用docker模拟)
vm过程:
1、下载zookeeper的tar包,解压tar -zxvf zookeeper-3.4.14.tar.gz
,重命名mv zookeeper-3.4.14 zookeeper
。
2、进入解压后的目录,修改配置文件名mv zoo_sample.cfg zoo.cfg
3、配置文件后添加:vim zoo.cfg
server.0=192.168.253.174:2888:3888
server.1=192.168.253.175:2888:3888
server.2=192.168.253.176:2888:3888
4、创建服务器标识:
创建文件vim /usr/local/zoo/data/myid
该文件存你的id即可
0
5、配置环境变量:vi /etc/profile
export ZOOKEEPER_HOME=/usr/local/zoo
export PATH=$PATH:$ZOOKEEPER_HOME/bin
6、下载kafka的tar包,并解压。去版本号命名。先检查是否安装了jdk,没有则安装。
7、修改配置文件:vim /kafka/config/server.properties
dataDir=/usr/local/zoo/data
# 对应的ip:端口
listeners=PLAINTEXT://192.168.253.131:9092
# zk集群连接
zookeeper.connect=192.168.253.174:2888,192.168.253.175:2888,192.168.253.176:2888
# 对应你zk的myid文件的值
broker.id=0
8、系统环境变量配置kafka的路径:vim /etc/profile
添加:如果是其他写法,参考别人怎么写的即可。
export KAFKA_HOME=/usr/local/kafka
export PATH=$PATH:$KAFKA_HOME/bin
修改后,重启动:source /etc/profile
(这个命令待确认)
9、zk启动等脚本:去到对应的bin下,zk集群是要先启动的。不要着急启动,先克隆另外两个vm配置好后,在统一启动zk,在启动kafka。参考第11点。
# 1、启动zk
sh zkServer.sh start
# 2、关闭zk
sh zkServer.sh stop
# 3、重启zk
sh zkServer.sh restart
# 4、查看zk 运行状态 (可以判断是leader还是follower)
sh bin/zkServer.sh status
10、kafka启动等脚本:
# 启动
bin/zookeeper-server-start.sh config/zookeeper.properties &
11、在启动之前,克隆结构如下。我们需要修改的地方:
# 192.168.253.131:9092 改为下面对应的ip
listeners=PLAINTEXT://192.168.253.131:9092
# 0 改为下面对应的值myid
broker.id=0
还要修改zk集群下的data目录中指定的myid。
现在可返回9、10启动。先将zk集群全部启动好,在启动kafka。主要启动失败可能是防火墙或者端口未打开。至于测试这里就先不管了。
我们来利用docker模拟zk+kafka上述过程:
docker拉取:docker pull zookeeper:3.4.14
内部测试:
# always 一直启动是一定要的
root@ubuntu:~# docker run --name some-zookeeper --restart always -d zookeeper:3.4.14
54446ac6f3f2184e7fd569ba2f1dbdf065b7ab6172a3d2ba84e15973d0ab261c
root@ubuntu:~# docker ps | grep 'zookeeper'
54446ac6f3f2 zookeeper:3.4.14 "/docker-entrypoint.…" 6 minutes ago Up 5 minutes 2181/tcp, 2888/tcp, 3888/tcp some-zookeeper
root@ubuntu:~# docker exec -it 54446ac6f3f2 /bin/bash
root@54446ac6f3f2:/zookeeper-3.4.14# ls
LICENSE.txt build.xml lib zookeeper-3.4.14.jar.md5 zookeeper-it
NOTICE.txt conf pom.xml zookeeper-3.4.14.jar.sha1 zookeeper-jute
README.md dist-maven src zookeeper-client zookeeper-recipes
README_packaging.txt ivy.xml zookeeper-3.4.14.jar zookeeper-contrib zookeeper-server
bin ivysettings.xml zookeeper-3.4.14.jar.asc zookeeper-docs
创建zookeeper的docker网络:
root@ubuntu:/home/script/zookeeper# docker network create zookeeper --subnet 172.28.0.0/16
816a08963f357b38f720e86e52e73bdbf8c4f62b9ddf8b4ed6c012ea0f48fb64
脚本化处理:
创建放zk的脚本的目录:
root@ubuntu:/home/script# mkdir zookeeper
root@ubuntu:/home/script# ls
redis zookeeper
root@ubuntu:/home/script/zookeeper# vim zoo.sh# zookeeper创建数据data和配置文件conf目录
for port in $(seq 1 3);\
do \
mkdir -p /mydata/zookeeper/node-${port}/conf
mkdir -p /mydata/zookeeper/node-${port}/data
touch /mydata/zookeeper/node-${port}/conf/zoo.cfg
cat <<EOF> /mydata/zookeeper/node-${port}/conf/zoo.cfg
clientPort=2181
dataDir=/data
dataLogDir=/data/log
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
# 脚本server.1数字范围在0-255
server.1=172.28.0.11:2888:3888
server.2=172.28.0.22:2888:3888
server.3=172.28.0.23:2888:3888
EOF
done
创建myid文件:其余目录类似。
root@ubuntu:/mydata/zookeeper/node-1/data# vim myid1root@ubuntu:/mydata/zookeeper# find -name 'myid'
./node-2/data/myid
./node-3/data/myid
./node-1/data/myid
有空继续
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 面试总结之乐信(下)
六.TCP的三次握手四次挥手机制? 1. TCP建立连接的过程。 三次握⼿手: 1. 第一次握手(客户端发送syn包到服务器端):客户端发送syn包到服务 器端,进入syn_send状态,等待服务器端的确认; 2. 第二次握手(服…...
2024/4/26 18:17:02 - Java中事件监听机制
Java中事件监听机制 一、事件监听机制的定义 要想了解Java中的事件监听机制,首先就要去了解一下在Java中事件是怎样去定义的呢!在使用Java编写好一个界面后,我们就会对界面进行一些操作,比如,在输入框中输入数据&…...
2024/4/6 9:34:28 - 在IDEA中开启springboot热部署
在pom.xml文件中添加如下依赖: Spring Boot包含一组额外的工具,这些工具可以使应用程序开发体验更加愉快。 spring-boot-devtools模块可以包含在任何项目中,以提供开发时所需要的功能。如果要开启devtools支持,请将模块依赖项添加…...
2024/5/3 1:30:13 - CPHY简单介绍
之前的文章有介绍过DPHY和CSI2,这篇文章简单介绍下CPHY 实际上是在DPHY之后CPHY之前,mipi组织提出了M-PHY和CSI3协议。M-PHY,4lane tx全部打开理论每 lane最大值达到11.6gb/s,而DPHY最大只达到2.5gb/s. M-PHY是DPHY的4.64倍。为了应用与类似车…...
2024/4/21 15:12:47 - 【叨叨笔记】计算机系统组成--概论
【叨叨笔记】计算机系统组成–概论 叨叨到底说了神马【叨叨笔记】计算机系统组成--概论1、计算机的基本概念1.1、存储程序的工作方式1.2、信息的数字化表示1.3、计算机体系结构、组成与实现2、计算机系统的软、硬件组成2.1、计算机硬件系统2.2、计算机软件系统分类3、层次结构模…...
2024/4/6 9:34:24 - FPGA试用期总结如何写?
FPGA试用期总结到底应该怎么写? 1 目录 1)试用期工作总结 2)以后工作计划 2 试用期工作总结 1)严格遵守公司各项规章制度。 2) 主动学习、尽快适应。迅速熟悉环境和工作资料,工作用心、认真、负责、通…...
2024/4/14 4:03:29 - Linux操作系统学习笔记(二十)网络通信之TCP协议
一. 前言 自TCP诞生以来就改变了网络通信的格局,而TCP协议随着网络基础设施的发展也在一路演进,形成了如今庞大复杂的TCP协议簇。如何深入理解TCP的设计理念以及几十年以来TCP协议的演进,有利于更好地了解网络编程。很多人不懂TCP,…...
2024/4/16 20:03:21 - 如何创建网站环境搭建详解
如何创建网站环境搭建详解。环境搭建: PHP、MySQL、Apache 的安装和环境的搭建和配置 这个三个都有自己的官方网站和下载页面,去到官方网站下载下来,安装到机器上并调整好配置参数即可。 Php官方网站: Mysql官方网站: Apa…...
2024/4/21 17:06:22 - 计算机网络之华为QINQ详解
QinQ协议在用户私网VLAN Tag之外封装公网VLAN Tag,在公网中报文只根据公网VLAN Tag传播。QinQ为用户提供一种较为简单的二层VPN隧道。 一. QINQ简述: (1)什么是QinQ? ①基于802.1q/ISL封装的隧道协议 ②报文封装双层…...
2024/4/10 0:34:28 - 靶机【Vulnhub】FourAndSix2
FourAndSix2 1.主机发现 靶机给出了网卡ip和网关 还是Nmap ping扫一下 C:\Users\ASUS>Nmap -sP 192.168.43.0/24 Starting Nmap 7.70 ( https://nmap.org ) at 2020-10-19 10:48 ?D1??? Nmap scan report for 192.168.43.1 Host is up (0.0070s latency). MAC Address…...
2024/4/29 11:49:48 - 测试开发(社招)面经:百度
String、StringBuffer与StringBuilder的区别?TCP的三次握手...
2024/4/6 6:34:57 - Java基础07-集合
null...
2024/4/6 6:34:56 - 校验和:探究密码学中的数据完整性问题
数据完整性是指系统中信息的准确性、合法性和一致性。在发送信息时,尤其是使用不可靠媒介时,数据完整性可以确保该信息未被篡改。 非法数据的潜在成因是什么? 数据完整性能防止出现数据违背系统的指令被篡改等系列问题。其中一些潜在的问题包括&#x…...
2024/4/6 6:34:55 - 使用vue搭建项目
使用vue搭建项目 准备工作 临时使用淘宝镜像。由于直接下载淘宝镜像会出现一些奇奇怪怪的bug,所以推荐临时使用淘宝镜像,提升下载速度 npm --registry https://registry.npm.taobao.org install vue/cli 查看是否安装成功 vue -V 安装成功后,如果想在vu…...
2024/4/14 12:55:03 - ubuntu开机自启动roslaunch程序
参考链接 https://blog.csdn.net/baidu_34319491/article/details/106456571 https://blog.csdn.net/qq_41628231/article/details/81367109 创建star.sh #! /bin/bash source /opt/ros/kinetic/setup.bash source ~/catkin_ws/devel/setup.bash roslaunch xxxx xxxx.launch增…...
2024/4/17 7:20:51 - 二元线性回归之梯度下降法
from numpy import genfromtxt import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D# 读入数据 Data genfromtxt(r"data2.csv", delimiter,)# 切分数据 X_data Data[:, :-1] # 除最后一列所有列 Y_data Data[:, -1] #…...
2024/4/24 5:15:53 - 搭建网站平台小小介绍
搭建网站平台小小介绍。运行平台介绍:目前主要平台:Linux、Windows (推荐用windows) (2)、Web服务器 介绍 (推荐用Apache) WEB服务器也称为 WIDE WEB)服务器,主要功能是提供网上信息浏览服务。当用户的浏览器连到服务器即&…...
2024/4/6 9:34:16 - 葫芦书笔记----采样
#采样 采样在机器学习中有着非常重要的应用:它可以将复杂分布简化为离散的样本点;可以用重采样对样本集进行调整以更好地适应后期的密模型学习;可以用于随机模拟以进行复杂模型的进行求解或推理。 采样的作用 采样时从特定的概率分布中抽取…...
2024/4/6 9:34:15 - 【新手采坑记】读取 *.grib2 文件
主要参考:https://blog.csdn.net/shyjhyp11/article/details/100655186 步骤2参考:http://bbs.06climate.com/forum.php?modviewthread&tid36026 步骤1: 安装opengrads(含有wgrib2.exe程序) 先安装 grads-2.2.1…...
2024/4/6 9:34:14 - 对比Opencv使用图像滤波法处理噪音点
开局一张图,剩下全靠分析 首先导入数据 img cv2.imread(lenaNoise.png) cv2.imshow(img, img) cv2.waitKey(0) cv2.destroyAllWindows()1、我们使用的是均值滤波 # 均值滤波 # 简单的平均卷积操作 blur cv2.blur(img, (3, 3)) cv2.imshow(blur, blur) cv2.wait…...
2024/4/6 9:34:13
最新文章
- MFC 列表控件修改实例(源码下载)
1、本程序基于前期我的博客文章《MFC下拉菜单打钩图标存取实例(源码下载)》 2、程序功能选中列表控件某一项,修改这一项的按钮由禁止变为可用,双击这个按钮弹出对话框可对这一项的记录数据进行修改,点击确定保存修改数…...
2024/5/3 7:58:00 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - composer常见错误解决
在Java中,常见的问题和解决方法包括: 内存不足错误:Java应用程序在运行时可能会遇到内存不足的错误。可以通过增加JVM的堆内存大小来解决,可以通过设置-Xms和-Xmx参数来指定初始堆大小和最大堆大小。 java -Xms2G -Xmx4G YourAppl…...
2024/4/30 3:27:03 - Vue3学习笔记+报错记录
文章目录 1.创建Vue3.0工程1.1使用vue-cli创建1.2 使用vite创建工程1.3.分析Vue3工程结构 2.常用Composition2.1 拉开序幕的setup2.2 ref函数_处理基本类型2.3 ref函数_处理对象类型2.4 ref函数使用总结 1.创建Vue3.0工程 1.1使用vue-cli创建 查看vue/cli版本,确保…...
2024/4/30 17:15:04 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/5/2 11:19:01 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/5/2 16:04:58 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/5/2 23:55:17 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/5/2 9:47:31 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/5/2 9:47:31 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/5/2 6:03:07 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/5/2 9:47:30 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/5/2 23:47:43 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/5/2 5:31:39 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/5/3 1:55:15 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/5/2 9:47:28 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/5/2 9:47:27 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/5/3 1:55:09 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/5/2 8:37:00 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/5/2 9:47:26 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/5/2 9:47:25 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/5/2 23:47:16 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/5/2 18:46:52 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/5/3 7:43:42 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/5/3 1:54:59 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57