redis——岁月云实战

        单线程序,基于IO多路复用,基于内存和c语言编写,性能高。redis官方命令

1 数据结构

1.1 key的层级

        redis的key可以通过冒号(:)来划分层级,如下图mms:company:order,但系统中可以看到有不少没有的,这些都是不符合开发规则的,研发工程师偷懒。这些事情应该严格要求,否则留下来的人就会很麻烦,根本无法猜到这个key是从哪里来的。

 1.2 数据结构

动画解析Redis为什么用跳表而不是红黑树?我看有些面试官就是很无趣,就好像高考阅读的出题人,总以为比写文章的人还理解,人家作者就是因为跳表比红黑树容易实现,​​​​​​​性能也不差就用了,搞一堆题目为难面试者,搞得他们也能写出一个redis一样。

2 场景 

3 k8s中部署redis集群

3.1 存储器

        因为redis数据需要持久化,所以我认为删掉pvc的时候不应该把数据直接删掉,需要手工清理一下,故而单独给他配置了存储器

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: managed-redis-storage
provisioner: fuseim.pri/ifs
reclaimPolicy: Retain
mountOptions:- hard- nfsvers=4

3.2 部署集群

apiVersion: v1
kind: Namespace
metadata:name: middleware---
apiVersion: v1
kind: ConfigMap
metadata:name: redis-configmapnamespace: middlewarelabels:app: redis
data:redis.conf: |dir "/data"maxmemory 0maxmemory-policy volatile-lrumin-slaves-max-lag 5min-slaves-to-write 1rdbchecksum yesrdbcompression yesrepl-diskless-sync yessave 900 1save 300 10save 60 10000maxclients 10000sentinel.conf: |dir "/data"sentinel down-after-milliseconds mymaster 10000sentinel failover-timeout mymaster 180000sentinel parallel-syncs mymaster 5init.sh: |HOSTNAME="$(hostname)"INDEX="${HOSTNAME##*-}"MASTER="$(redis-cli -h redis -p 26379 sentinel get-master-addr-by-name mymaster | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')"MASTER_GROUP="mymaster"QUORUM="2"REDIS_CONF=/data/conf/redis.confREDIS_PORT=6379SENTINEL_CONF=/data/conf/sentinel.confSENTINEL_PORT=26379SERVICE=redis-headlessset -eusentinel_update() {echo "Updating sentinel config"eval MY_SENTINEL_ID="\${SENTINEL_ID_$INDEX}"sed -i "1s/^/sentinel myid $MY_SENTINEL_ID\\n/" "$SENTINEL_CONF"sed -i "2s/^/sentinel monitor $MASTER_GROUP $1 $REDIS_PORT $QUORUM \\n/" "$SENTINEL_CONF"echo "sentinel announce-ip $ANNOUNCE_IP" >> $SENTINEL_CONFecho "sentinel announce-port $SENTINEL_PORT" >> $SENTINEL_CONF}redis_update() {echo "Updating redis config"echo "slaveof $1 $REDIS_PORT" >> "$REDIS_CONF"echo "slave-announce-ip $ANNOUNCE_IP" >> $REDIS_CONFecho "slave-announce-port $REDIS_PORT" >> $REDIS_CONF}copy_config() {cp /readonly-config/redis.conf "$REDIS_CONF"cp /readonly-config/sentinel.conf "$SENTINEL_CONF"}setup_defaults() {echo "Setting up defaults"if [ "$INDEX" = "0" ]; thenecho "Setting this pod as the default master"redis_update "$ANNOUNCE_IP"sentinel_update "$ANNOUNCE_IP"sed -i "s/^.*slaveof.*//" "$REDIS_CONF"elseDEFAULT_MASTER="$(getent hosts "redis-0.$SERVICE" | awk '{ print $1 }')"if [ -z "$DEFAULT_MASTER" ]; thenecho "Unable to resolve host"exit 1fiecho "Setting default slave config.."redis_update "$DEFAULT_MASTER"sentinel_update "$DEFAULT_MASTER"fi}find_master() {echo "Attempting to find master"if [ "$(redis-cli -h "$MASTER" ping)" != "PONG" ]; thenecho "Can't ping master, attempting to force failover"if redis-cli -h "$SERVICE" -p "$SENTINEL_PORT" sentinel failover "$MASTER_GROUP" | grep -q 'NOGOODSLAVE' ; then setup_defaultsreturn 0fisleep 10MASTER="$(redis-cli -h $SERVICE -p $SENTINEL_PORT sentinel get-master-addr-by-name $MASTER_GROUP | grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')"if [ "$MASTER" ]; thensentinel_update "$MASTER"redis_update "$MASTER"elseecho "Could not failover, exiting..."exit 1fielseecho "Found reachable master, updating config"sentinel_update "$MASTER"redis_update "$MASTER"fi}mkdir -p /data/conf/echo "Initializing config.."copy_configANNOUNCE_IP=$(getent hosts "redis-$INDEX.$SERVICE" | awk '{ print $1 }')if [ -z "$ANNOUNCE_IP" ]; then"Could not resolve the announce ip for this pod"exit 1elif [ "$MASTER" ]; thenfind_masterelsesetup_defaultsfiif [ "${AUTH:-}" ]; thenecho "Setting auth values"ESCAPED_AUTH=$(echo "$AUTH" | sed -e 's/[\/&]/\\&/g');sed -i "s/replace-default-auth/${ESCAPED_AUTH}/" "$REDIS_CONF" "$SENTINEL_CONF"fiecho "Ready..."---
apiVersion: v1
kind: ConfigMap
metadata:name: redis-probesnamespace: middlewarelabels:app: redis
data:check-quorum.sh: |#!/bin/shset -euMASTER_GROUP="mymaster"SENTINEL_PORT=26379REDIS_PORT=6379NUM_SLAVES=$(redis-cli -p "$SENTINEL_PORT" sentinel master mymaster | awk '/num-slaves/{getline; print}')MIN_SLAVES=1if [ "$1" = "$SENTINEL_PORT" ]; thenif redis-cli -p "$SENTINEL_PORT" sentinel ckquorum "$MASTER_GROUP" | grep -q NOQUORUM ; thenecho "ERROR: NOQUORUM. Sentinel quorum check failed, not enough sentinels found"exit 1fielif [ "$1" = "$REDIS_PORT" ]; thenif [ "$MIN_SLAVES" -gt "$NUM_SLAVES" ]; thenecho "Could not find enough replicating slaves. Needed $MIN_SLAVES but found $NUM_SLAVES"exit 1fifish /probes/readiness.sh "$1"readiness.sh: |#!/bin/shset -euCHECK_SERVER="$(redis-cli -p "$1" ping)"if [ "$CHECK_SERVER" != "PONG" ]; thenecho "Server check failed with: $CHECK_SERVER"exit 1fi---
apiVersion: v1
kind: ServiceAccount
metadata:name: redisnamespace: middlewarelabels:app: redis---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: redisnamespace: middlewarelabels:app: redis
rules:
- apiGroups:- ""resources:- endpointsverbs:- get---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: redisnamespace: middlewarelabels:app: redis
subjects:
- kind: ServiceAccountname: redis
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: redis---
apiVersion: v1
kind: Service
metadata:name: redis-headlessnamespace: middlewarelabels:app: redis-haannotations:service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
spec:publishNotReadyAddresses: truetype: ClusterIPclusterIP: Noneports:- name: serverport: 6379protocol: TCPtargetPort: redis- name: sentinelport: 26379protocol: TCPtargetPort: sentinelselector:app: redis-ha---
apiVersion: v1
kind: Service
metadata:name: redisnamespace: middlewarelabels:app: redis-haannotations:
spec:type: ClusterIPports:- name: serverport: 6379protocol: TCPtargetPort: redis- name: sentinelport: 26379protocol: TCPtargetPort: sentinelselector:app: redis-ha---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: redisnamespace: middlewarelabels:app: redis-ha
spec:selector:matchLabels:app: redis-haserviceName: redis-headlessreplicas: 3podManagementPolicy: OrderedReadyupdateStrategy:type: RollingUpdatetemplate:metadata:labels:app: redis-haspec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchLabels:app: redis-hatopologyKey: kubernetes.io/hostnamepreferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchLabels:app:  redis-hatopologyKey: failure-domain.beta.kubernetes.io/zonesecurityContext:fsGroup: 1000runAsNonRoot: truerunAsUser: 1000serviceAccountName: redisimagePullSecrets:- name: 密码initContainers:- name: config-initimage: 10.101.10.2:8081/mid/redis:7.4.0#image: redis:latest  # 此镜像也可用imagePullPolicy: IfNotPresentresources:{}command:- shargs:- /readonly-config/init.shenv:- name: SENTINEL_ID_0value: 0c09a3866dba0f3b43ef2e383b5dc05980900fd8- name: SENTINEL_ID_1value: e6be0f70406122877338f7c814b17a7c7b648d82- name: SENTINEL_ID_2value: 31f8f52b34feaddcabdd6bf1827aeb02be44d2e3volumeMounts:- name: configmountPath: /readonly-configreadOnly: true- name: datamountPath: /datacontainers:- name: redisimage: 10.101.10.2:8081/mid/redis:7.4.0imagePullPolicy: IfNotPresentcommand:- redis-serverargs:- /data/conf/redis.conflivenessProbe:exec:command: [ "sh", "/probes/readiness.sh", "6379"]initialDelaySeconds: 15periodSeconds: 5readinessProbe:exec:command: ["sh", "/probes/readiness.sh", "6379"]initialDelaySeconds: 15periodSeconds: 5resources:{}ports:- name: rediscontainerPort: 6379volumeMounts:- mountPath: /dataname: data- mountPath: /probesname: probes- name: sentinelimage: 10.101.10.2:8081/mid/redis:7.4.0imagePullPolicy: IfNotPresentcommand:- redis-sentinelargs:- /data/conf/sentinel.conflivenessProbe:exec:command: [ "sh", "/probes/readiness.sh", "26379"]initialDelaySeconds: 15periodSeconds: 5readinessProbe:exec:command: ["sh", "/probes/readiness.sh", "26379"]initialDelaySeconds: 15periodSeconds: 5resources:{}ports:- name: sentinelcontainerPort: 26379volumeMounts:- mountPath: /dataname: data- mountPath: /probesname: probesvolumes:- name: configconfigMap:name: redis-configmap- name: probesconfigMap:name: redis-probesvolumeClaimTemplates:- metadata:name: dataannotations:spec:accessModes:- "ReadWriteMany"resources:requests:storage: "5Gi"storageClassName: managed-redis-storage

3 Unable to resolve redis-headless.middleware.svc.cluster.local

        查看系统日志发现错误日志如下:

2024-12-26 05:28:13.161 INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-dubbo-prod-nacos-headless.middleware.svc.cluster.local_8848] [publish-single] ok, dataId=com.whty.acc.voucher.api.service.VoucherDubboService:::provider:acc-voucher-server, group=dubbo, tenant=dubbo-prod, config={"annotations":[],"canonicalName":"com.whty.acc.voucher.api.service.VoucherDubboService","codeSource...
2024-12-26 10:10:50.045 ERROR org.redisson.connection.SentinelConnectionManager - Unable to resolve redis-headless.middleware.svc.cluster.local
io.netty.resolver.dns.DnsResolveContext$SearchDomainUnknownHostException: Failed to resolve 'redis-headless.middleware.svc.cluster.local' [A(1)] and search domain query for configured domains failed as well: [acc.svc.cluster.local, svc.cluster.local, cluster.local]at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1088)at io.netty.resolver.dns.DnsResolveContext.tryToFinishResolve(DnsResolveContext.java:1035)at io.netty.resolver.dns.DnsResolveContext.query(DnsResolveContext.java:422)at io.netty.resolver.dns.DnsResolveContext.access$700(DnsResolveContext.java:66)

        于是对比一下nacos和redis,为什么nacos是好使的,但redis却不行,如下图,出现了差异,那么这个差异是如何造成的呢?

[root@master8 ~]# kubectl exec -it acc-voucher-server-7dfc9b49-2t6bd -n acc -- nslookup nacos-headless.middleware.svc.cluster.local
nslookup: can't resolve '(null)': Name does not resolveName:      nacos-headless.middleware.svc.cluster.local
Address 1: 10.42.0.29 10-42-0-29.nacos-web-service.middleware.svc.cluster.local
Address 2: 10.42.2.35 10-42-2-35.nacos-web-service.middleware.svc.cluster.local
Address 3: 10.42.1.21 10-42-1-21.nacos-web-service.middleware.svc.cluster.local
[root@master8 ~]# kubectl exec -it acc-voucher-server-7dfc9b49-2t6bd -n acc -- nslookup redis-headless.middleware.svc.cluster.local
nslookup: can't resolve '(null)': Name does not resolveName:      redis-headless.middleware.svc.cluster.local
Address 1: 10.42.1.24 10-42-1-24.redis.middleware.svc.cluster.local
Address 2: 10.42.0.39 redis-0.redis-headless.middleware.svc.cluster.local
Address 3: 10.42.2.39 10-42-2-39.redis.middleware.svc.cluster.local 

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

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

相关文章

参数名在不同的SpringBoot版本中,处理方案不同

参数名在不同的SpringBoot版本中,处理方案还不同: 在springBoot的2.x版本(保证参数名一致) springBoot的父工程对compiler编译插件进行了默认的参数parameters配置,使得在编译时,会在生成的字节码文件中…

五、Swagger 介绍(Flask+Flasgger的应用)

Swagger 介绍 0. 引言1. Swagger 介绍2. Flasgger 介绍3. Flasgger效果3.1 原始flask代码3.2 转化成Flasgger形式3.3 使用Try it out调试3.4 多个url接口自动生成和调试 4. 使用教程4.1 使用 docstrings 作为规范4.2 使用外部 YAML 文件4.3 使用 Python 字典作为原始规范 5. 和…

LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测

LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测 目录 LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.LSTM-SVM时序预测 | Matlab基于LSTM…

【MySQL】十三,关于MySQL的全文索引

MySQL的全文索引用于搜索文本中的关键字,类似于like查询。 演示 建表 CREATE TABLE demo (id INT(11) NOT NULL,name CHAR(30) NOT NULL,age INT(11) NOT NULL,info VARCHAR(255),primary key(id),fulltext index futxt_idx_info(info) );此表的默认存储引擎为In…

数据可视化echarts学习笔记

目录,介绍 知识储备 一端操作,多端联动的效果(开启了多个网页,操作一端,多个网页的效果会跟着改变) cmd命令控制面板返回上一级或上上级 在当前目录打开文件: cd 文件名 在Windows命令提示符&am…

NS3学习——tcpVegas算法代码详解(2)

NS3学习——tcpVegas算法代码详解(1)-CSDN博客 目录 4.TcpVegas类中成员函数 (5) CongestionStateSet函数 (6) IncreaseWindow函数 1.检查是否启用 Vgas 2.判断是否完成了一个“Vegas 周期” 2.1--if:判断RTT样本数量是否足够 2.2--e…

在 CentOS 8 系统上安装 Jenkins 的全过程

一、前言 我是一个前端开发,需要频繁将编写的前端系统打包更新到公司的linux服务器,觉得这种工作纯体力活,有时候太浪费时间,以前用过别人搭建的Jenkins可以很好的解决这个问题。 Jenkins 是一款流行的开源持续集成和持续交付&a…

Mac上Stable Diffusion的环境搭建(还算比较简单)

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Installation-on-Apple-Silicon AI兴起的速度是真的快,感觉不了解点相关的东西都要与时代脱节了,吓得我赶紧找个AIGC看看能不能实现我艺术家的人梦想(绷不住了) 我…

瑞吉外卖项目学习笔记(九)套餐列表分页查询、新增套餐、图片上传和下载

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 瑞吉外卖项目学习笔记(四)TableField(fill FieldFill.INSERT)公共字…

VMware Workstation虚拟机网络模式

做虚拟机和宿主机互ping实验时,除了要提前配置好网段、ip等信息,还要把宿主机、虚拟机的防火墙关闭! 首先说一下VMware的几种虚拟交换机。 VMnet0:用于虚拟桥接网络下的虚拟交换机。 VMnet1:用于虚拟Host-Only网络下…

UDP传输层通信协议详解

引言 在计算机网络通信的广阔天地中,传输层协议扮演着至关重要的角色。它们负责在网络中的两个终端之间建立、管理和终止数据传输。在众多传输层协议中,UDP(User Datagram Protocol,用户数据报协议)以其独特的特性和应…

Node.js 工具:在 Windows 11 中配置 Node.js 的详细步骤

一、概述 记录时间 [2024-12-25] 本文讲述如何在 Windows 11 中进行 Node.js 工具的安装和配置。 以下是详细的步骤和说明。 二、安装 Node.js 1. 官网下载 通过官网,下载 Node.js,上面有好几种下载方式,文中下载的是 zip 压缩包。 如图&…

Chrome被360导航篡改了怎么改回来?

一、Chrome被360导航篡改了怎么改回来? 查看是否被360主页锁定,地址栏输入chrome://version,看命令行end后面(蓝色部分),是否有https://hao.360.com/?srclm&lsn31c42a959f 修改步骤 第一步&#xff1a…

Mysql 查询性能调优总结

一、查询分析性能的相关配置 1.1 配置显示查询性能的参数 在 MySQL 中,SHOW PROFILES 命令用于显示最近的查询性能概况,帮助你分析哪些查询比较耗时。 show profiles; 需要启用参数 profiling,才能使用上述功能,其相关参数设置…

python中使用selenium执行组合快捷键ctrl+v不生效问题

在执行ctrlv进行粘贴时,绑定一个页面上的元素对象(无论元素对象是否是引用过期或者是粘贴的目标文本区,但前提需要粘贴的目标文本区获取焦点)执行ctrlv后可以生效。执行粘贴组合快捷键(ctrlv)的示例代码 se…

C++模板:编译时模拟Duck Typing

C泛型与多态(4): Duck Typing - 简书 James Whitcomb Riley在描述这种is-a的哲学时,使用了所谓的鸭子测试(Duck Test): 当我看到一只鸟走路像鸭子,游泳像鸭子,叫声像鸭子,那我就把它…

【求职面试】驾照的种类

大型客车 A1 大型载客汽车 A3、B1、B2、C1、C2、C3、C4、M 牵引车 A2 重型、中型全挂、半挂汽车列车 B1、B2、C1、C2、C3、C4、M 城市公交车 A3 核载10人以上的城市公共汽车 C1、C2、C3、C4 中型客车 B1 中型载客汽车(10人以上、19人以下) C1、C2、C3…

PyQt实战——使用python提取JSON数据(十)

系类往期文章: PyQt5实战——多脚本集合包,前言与环境配置(一) PyQt5实战——多脚本集合包,UI以及工程布局(二) PyQt5实战——多脚本集合包,程序入口QMainWindow(三&…

RAG实战:构建基于本地大模型的智能问答系统

RAG实战:构建基于本地大模型的智能问答系统 引言 在当今AI快速发展的时代,如何构建一个既智能又可靠的问答系统是一个重要课题。本文将介绍如何使用RAG(检索增强生成)技术,结合本地大模型,构建一个高效的智…

OAuth 2.0

简介 OAuth 是一种开放标准的授权协议或框架,它提供了一种安全的方式,使第三方应用程序能够访问用户在其他服务上的受保护资源,而无需共享用户的凭证(如用户名和密码)。OAuth 的核心思想是通过“授权令牌”来代替直接…