k8s部署redis集群(方案1)

2023-05-16

目录

一、创建configmap

二、创建redis集群

三、集群初始化

四、验证集群省略、补充

1.如果整个 redis 集群的 pod 全部都挂掉了,pod自动拉起后,集群不可用,需要重建集群。

2. 重建集群的方法1: 删除 redis 集群所有的资源,然后重新创建 redis 集群

3.重建集群的方法2: 在原有 redis 集群的基础上进行修复


前置条件:创建pv,我这里使用的是nfs,做sc

配置文件:

[root@master1 k8s-public-redis]# tree
.
├── redis-cluster-configmap.yml
└── redis-cluster-statefulset.yml

一、创建configmap

redis 配置文件使用 configmap 方式进行挂载, fix-ip.sh 脚本的作用用于当 redis 集群某 pod 重建后 Pod IP 发生变化,在 /data/nodes.conf 中将新的 Pod IP 替换原 Pod IP

vim redis-cluster-configmap.yml

apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-cluster
  namespace: lishanbin-service
data:
  fix-ip.sh: |
    #!/bin/sh
    CLUSTER_CONFIG="/data/nodes.conf"
    if [ -f ${CLUSTER_CONFIG} ]; then
      if [ -z "${POD_IP}" ]; then
        echo "Unable to determine Pod IP address!"
        exit 1
      fi
      echo "Updating my IP to ${POD_IP} in ${CLUSTER_CONFIG}"
      sed -i.bak -e '/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/'${POD_IP}'/' ${CLUSTER_CONFIG}
    fi
    exec "$@"
  redis.conf: |
    bind 0.0.0.0
    protected-mode yes
    port 6379
    tcp-backlog 2048
    timeout 0
    tcp-keepalive 300
    daemonize no
    supervised no
    pidfile /var/run/redis.pid
    loglevel notice
    logfile /data/redis.log
    databases 16
    always-show-logo yes
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    dbfilename dump.rdb
    dir /data
    masterauth xxxx
    replica-serve-stale-data yes
    replica-read-only no
    repl-diskless-sync no
    repl-diskless-sync-delay 5
    repl-disable-tcp-nodelay no
    replica-priority 100
    requirepass 985211@LiShanBin
    maxclients 32768
    #maxmemory 6g
    maxmemory-policy allkeys-lru
    lazyfree-lazy-eviction no
    lazyfree-lazy-expire no
    lazyfree-lazy-server-del no
    replica-lazy-flush no
    appendonly yes
    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
    cluster-enabled yes
    cluster-config-file /data/nodes.conf
    cluster-node-timeout 15000
    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

二、创建redis集群

vim redis-cluster-statefulset.yml

---
apiVersion: v1
kind: Service
metadata:
  namespace: lishanbin-service
  name: redis-cluster
spec:
  clusterIP: None
  ports:
  - port: 6379
    targetPort: 6379
    name: client
  - port: 16379
    targetPort: 16379
    name: gossip
  selector:
    app: redis-cluster
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: lishanbin-service
  name: redis-cluster
spec:
  serviceName: redis-cluster
  replicas: 6
  selector:
    matchLabels:
      app: redis-cluster
  template:
    metadata:
      labels:
        app: redis-cluster
    spec:
      terminationGracePeriodSeconds: 20
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - redis-cluster
              topologyKey: kubernetes.io/hostname
      containers:
      - name: redis
        image: registry.cn-shenzhen.aliyuncs.com/lishanbin/redis:6.2.6
        ports:
        - containerPort: 6379
          name: client
        - containerPort: 16379
          name: gossip
        command: ["/etc/redis/fix-ip.sh", "redis-server", "/etc/redis/redis.conf"]
        env:
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        volumeMounts:
        - name: conf
          mountPath: /etc/redis/
          readOnly: false
        - name: data
          mountPath: /data
          readOnly: false
      volumes:
      - name: conf
        configMap:
          name: redis-cluster
          defaultMode: 0755
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      storageClassName: "managed-nfs-storage"
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi

tips:使用headless创建的pod,解析地址可以使用nslookup查看

kubectl run -it ubuntu --image=registry.cn-shenzhen.aliyuncs.com/lishanbin/redis-tools-ubuntu:v0.5.1 --restart=Never /bin/bash
 
[root@master1 k8s-public-redis]# kubectl exec -it ubuntu    bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@ubuntu:/# nslookup redis-cluster.lishanbin-service.svc.cluster.local
Server:         10.204.0.10
Address:        10.204.0.10#53

Name:   redis-cluster.lishanbin-service.svc.cluster.local
Address: 10.203.216.139
Name:   redis-cluster.lishanbin-service.svc.cluster.local
Address: 10.203.191.27
Name:   redis-cluster.lishanbin-service.svc.cluster.local
Address: 10.203.150.126
Name:   redis-cluster.lishanbin-service.svc.cluster.local
Address: 10.203.36.194
Name:   redis-cluster.lishanbin-service.svc.cluster.local
Address: 10.203.216.138
Name:   redis-cluster.lishanbin-service.svc.cluster.local
Address: 10.203.36.200

三、集群初始化

1.查看创建的pod/svc等


[root@master1 k8s-public-redis]# kubectl get all -n lishanbin-service
NAME                  READY   STATUS    RESTARTS   AGE
pod/redis-cluster-0   1/1     Running   0          30m
pod/redis-cluster-1   1/1     Running   0          13m
pod/redis-cluster-2   1/1     Running   0          13m
pod/redis-cluster-3   1/1     Running   0          13m
pod/redis-cluster-4   1/1     Running   0          13m
pod/redis-cluster-5   1/1     Running   0          14m

NAME                    TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
service/redis-cluster   ClusterIP   None         <none>        6379/TCP,16379/TCP   47m

NAME                             READY   AGE
statefulset.apps/redis-cluster   6/6     47m

2.redis集群初始化

redis集群初始化必须使用ip,先获取ip,上方的nslookup也可批量获取ip。

kubectl get pods -l app=redis-cluster -n lishanbin-service -o jsonpath='{range.items[*]}{.status.podIP}:6379 '

初始化:

kubectl exec -it pod/redis-cluster-0 -n lishanbin-service  -- bash
redis-cli -a xxx --cluster create \
10.203.36.193:6379 \
10.203.36.243:6379 \
10.203.36.244:6379 \
10.203.216.135:6379 \
10.203.36.252:6379 \
10.203.36.250:6379 \
--cluster-replicas 1

或者

redis-cli --cluster create --cluster-replicas 1  10.203.36.253:6379 10.203.36.255:6379 10.203.36.254:6379 10.203.191.22:6379 10.203.216.136:6379 10.203.36.193:6379 -a 'xxxx'

出现下图表示创建成功:

四、验证集群、补充

简单验证集群:

 kubectl exec -it pod/redis-cluster-0 -n lishanbin-service -- bash
redis-cli -h redis-cluster-1.redis-cluster.lishanbin-service.svc.cluster.local -c -a 'xxxx

 

1.如果整个 redis 集群的 pod 全部都挂掉了,pod自动拉起后,集群不可用,需要重建集群。

2. 重建集群的方法1: 删除 redis 集群所有的资源,然后重新创建 redis 集群


(1) 删除 redis 集群中所有的 pod
[root@k8s-master1 redis-cluster]# kubectl delete -f redis-cluster.yml

(2) 删除 redis 集群中所有的 pvc(pv)
[root@k8s-master1 redis-cluster]# kubectl delete pvc/data-redis-cluster-0 -n redis-cluster
[root@k8s-master1 redis-cluster]# kubectl delete pvc/data-redis-cluster-1 -n redis-cluster
[root@k8s-master1 redis-cluster]# kubectl delete pvc/data-redis-cluster-2 -n redis-cluster
[root@k8s-master1 redis-cluster]# kubectl delete pvc/data-redis-cluster-3 -n redis-cluster
[root@k8s-master1 redis-cluster]# kubectl delete pvc/data-redis-cluster-4 -n redis-cluster
[root@k8s-master1 redis-cluster]# kubectl delete pvc/data-redis-cluster-5 -n redis-cluster

(3) 删除 redis 集群中 pod 对应的 nfs 持久化存储目录
[root@k8s_nfs ~]# rm -rf /nfs/archived-redis-cluster-data-redis-cluster-*/

(4) 重新创建 redis 集群
[root@k8s-master1 redis-cluster]# kubectl apply -f redis-cluster.yml


3.重建集群的方法2: 在原有 redis 集群的基础上进行修复


(1) 删除 redis 集群中所有的 pod
[root@k8s-master1 redis-cluster]# kubectl delete -f redis-cluster.yml

(2) 找到 redis 集群中 pod 对应的 nfs 持久化存储目录后删除 nodes.conf
[root@k8s_nfs ~]# rm -f /nfs/redis-cluster-data-redis-cluster-0*/nodes.conf*
[root@k8s_nfs ~]# rm -f /nfs/redis-cluster-data-redis-cluster-1*/nodes.conf*
[root@k8s_nfs ~]# rm -f /nfs/redis-cluster-data-redis-cluster-2*/nodes.conf*
[root@k8s_nfs ~]# rm -f /nfs/redis-cluster-data-redis-cluster-3*/nodes.conf*
[root@k8s_nfs ~]# rm -f /nfs/redis-cluster-data-redis-cluster-4*/nodes.conf*
[root@k8s_nfs ~]# rm -f /nfs/redis-cluster-data-redis-cluster-5*/nodes.conf*

(3) 重新创建 redis 集群
[root@k8s-master1 redis-cluster]# kubectl apply -f redis-cluster.yml

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s部署redis集群(方案1) 的相关文章

  • 使用Redis从有限范围内生成唯一ID

    我有一些数据库项目 除了主键之外 还需要项目所属组的唯一索引 我们来调用属性nbr 以及将项目分组在一起并定义唯一范围的属性nbr 我们会打电话group This nbr必须在 1 N 范围内 并且may从外部源导入项目时进行设置 由于所
  • socket.io 广播功能 & Redis pub/sub 架构

    如果有人能帮助我解决一个小疑问 我将不胜感激 使用socket io广播功能和在Redis上使用pub sub设计架构有什么区别 例如 在另一个示例中 node js 服务器正在侦听 socket io 针对 键 模型 todo 和值 数据
  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • 有没有办法用Lettuce自动发现Redis集群中新的集群节点IP

    我有一个Redis集群 3主3从 运行在一个库伯内斯簇 该集群通过Kubernetes 服务 Kube 服务 我将我的应用程序服务器连接到 Redis 集群 使用Kube 服务作为 URI 通过 Redis 的 Lettuce java 客
  • 如何使redis中的“HSET”子键“过期”?

    我需要使 Redis 哈希中所有超过 1 个月的密钥过期 这不可能 https github com antirez redis issues 167 issuecomment 2559040 为了保持 Redis 简单 https git
  • StackExchange.Redis的正确使用方法

    这个想法是使用更少的连接和更好的性能 连接会随时过期吗 对于另一个问题 redis GetDatabase 打开新连接 private static ConnectionMultiplexer redis private static ID
  • 如何使 Redis 缓存中数据层次结构(树)的部分内容无效

    我有一些产品数据 需要在 Redis 缓存中存储多个版本 数据由 JSON 序列化对象组成 获取普通 基本 数据的过程很昂贵 将其定制为不同版本的过程也很昂贵 因此我想缓存所有版本以尽可能进行优化 数据结构看起来像这样 BaseProduc
  • StackExchange.Redis Get 函数抛出 TimeoutException

    我在用着StackExchange Redis与 C 和StackExchangeRedisCacheClient Get函数抛出以下异常 myCacheClient Database StringGet txtKey Text myCac
  • 在 Redis 上为 Django 和 Express.js 应用程序共享会话存储

    我想创建一个包含一些登录用户的 Django 应用程序 另一方面 由于我想要一些实时功能 所以我想使用 Express js 应用程序 现在的问题是 我不希望身份不明的用户访问 Express js 应用程序的日期 因此 我必须在 Expr
  • 使用redis进行树形数据结构

    我需要为基于树的键值开发一个缓存系统 与Windows注册表编辑器非常相似 其中缓存键是字符串 表示树中到值的路径 可以是原始类型 int string bool double 等 或子树本身 例如 key root x y z w val
  • 节点应用程序之间共享会话?

    我目前有两个独立的节点应用程序在两个不同的端口上运行 但共享相同的后端数据存储 我需要在两个应用程序之间共享用户会话 以便当用户通过一个应用程序登录时 他们的会话可用 并且他们似乎已登录到另一个应用程序 在本例中 它是一个面向公众的网站和一
  • 在 Spring 4 中干掉通用的 RedisTemplate

    我读到你可以拥有 Autowired从 Spring 4 开始泛型 这太棒了 我有一个摘要RedisService我想参加的课程 Autowired一个通用的 RestTemplate 如下所示 public abstract class
  • 如何配置Lettuce Redis集群异步连接池

    我正在配置我的生菜重新分配池 当我按照官方文档配置时 连接池无法正常初始化 无法获取连接 官方文档指出 RedisClusterClient clusterClient RedisClusterClient create RedisURI
  • 将文件传递给活动作业/后台作业

    我通过标准文件输入接收请求参数中的文件 def create file params file upload Upload create file file filename img png end 但是 对于大型上传 我想在后台作业中执行
  • 没有适用于机器人的 Laravel 会话

    我在大型 Laravel 项目和 Redis 存储方面遇到问题 我们将会话存储在 Redis 中 我们已经有 28GB 的 RAM 然而 它的运行速度仍然相对较快 达到了极限 因为我们有来自搜索引擎机器人的大量点击 每天超过 250 000
  • 集合成员的 TTL

    Redis 是否可以不为特定键而是为集合的成员设置 TTL 生存时间 我正在使用 Redis 文档提出的标签结构 数据是简单的键值对 标签是包含与每个标签对应的键的集合 例如 gt SETEX id id 1 100 Lorem ipsum
  • 检查 Redis 列表中是否已存在某个值

    我想知道是否有办法检查 redis 列表中是否已存在某个键 我无法使用集合 因为我不想强制唯一性 但我确实希望能够检查字符串是否确实存在 Thanks 您的选择如下 Using LREM如果发现则更换它 维护一个单独的SET与您的LIST
  • JedisPoolConfig 不可分配给 GenericObjectPoolConfig

    我有一个基于 Spring 的 Java Web 应用程序托管在 Heroku 上 我正在尝试使用 Redis 实现来利用 Spring 缓存抽象 当服务器启动时 我收到一条错误消息 Type redis clients jedis Jed
  • redis.exceptions.ConnectionError:连接到本地主机时出现错误-2:6379。名称或服务未知

    当我在服务器中运行代码时出现此错误 我的环境是 debian 并且Python2 7 3 Traceback most recent call last File fetcher py line 4 in
  • Redis AOF fsync(始终)与 LSM 树

    我对日志结构化合并树 LSM 树 的理解是 它利用了附加到磁盘非常快 因为它不需要查找 这一事实 只需将更新附加到预写日志并返回到客户端即可 我的理解是 这仍然提供了立即的持久性 同时仍然非常快 我不认为 Redis 使用 LSM 树 它似

随机推荐

  • STM32单片机产生PWM信号

    STM32单片机产生PWM信号 1 开发环境 目标单片机 STM32F407VET6芯片 xff0c 系统时钟高达168Mhz 开发平台 xff1a KEIL 5 编写程序借助ST公司的标准函数库 xff0c 不过现在已经不更新这个写函数库
  • 应用linux内核链表

    一 STM32应用linux内核链表 在此之前 xff0c 已经对Linux内核链表已经移植过一次 不过是针对Windows平台 xff0c 下面是链接 xff1a https blog csdn net qq 36883460 artic
  • 数据结构与算法 ---- C/C++

    数据结构与算法 C C 43 43 学习数据结构的目的 xff1a 针对不同的情况使用不同数据结构 xff0c 去解决不同的问题 一 线性表 线性表一般有几个函数 xff08 宏定义 xff09 xff1a 初始化线性表 List Init
  • 单片机低功耗

    单片机低功耗 如何减低整个系统功耗 xff1f 从两个方面下手 xff1a 软件 xff1f 硬件 xff1f 软件 xff1a 减少外设使用 xff08 不需要的就关掉 xff09 xff0c 减低时钟频率 xff0c 尽量选择低功耗模式
  • RS485通讯---Modbus数据链路层与应用层(二)

    前言 RS485通讯 Modbus物理层 xff1a https blog csdn net qq 36883460 article details 105630712 Modbus RTU通讯协议中OSI模型 xff0c 数据链路层和应用
  • 【笔记】MySQL 5+ 相同用户的数据,取最新登记日期的那条

    需求 xff1a MySQL5 43 处理 xff0c 下面表中 xff0c 用户名相同的数据 xff0c 取最新登记日期的登记号码 表名 xff1a userinfo 用户名 username 登记号码 regis num 登记时间 re
  • STM32F4应用DMA——串口收发不定长数据

    STM32F4应用DMA 串口收发不定长数据 使用STM32自带DMA传输数据 xff0c 可以减轻CPU负担 xff0c 只需设置一些参数即可发送想要发送的数据 xff0c 以下是STM32F407VE芯片测试过的部分代码 xff0c 可
  • Kotlin-----UDP客户端网络编程代码

    一 Kotlin编程简介 Kotlin可以说是Java的进阶版本 xff0c 基本上兼容了Java所有代码 xff0c 就连网络编程与Java的方式一致 xff0c 你可以看到下边是调用Java的库去完成网络编程 二 UDP客户端网络编程代
  • mime.type文件内容

    span class token macro property span class token directive hash span span class token expression This is a comment span
  • linux线程阻塞中CPU的占用率

    linux线程阻塞中CPU的占用率 一 简介 总所周知Linux系统下 xff0c 我们编写的程序进入阻塞后 xff0c 系统把任务挂起 xff0c 交给内核进行处理 xff0c 此时我们的进程CPU占用率不高 xff0c 可以说是占用率0
  • Kotlin JSON格式解析

    Kotlin JSON解析 开发环境就是下面这个 一 添加依赖 在build gradle kts文件中添加下面依赖 dependencies span class token punctuation span span class tok
  • mysql 5.7版本查询一条数据JSON字段拆分多条

    场景 xff1a 查询出来一条数据 xff0c 其中fee items字段为json数组 xff0c 现在要把json数组拆分 xff0c 如果有多条 xff0c 则展示多行数据 xff0c 列转行 表中的数据 字段 fee items 是
  • mysql 字段json行转列

    SET FOREIGN KEY CHECKS 61 0 Table structure for keyid DROP TABLE IF EXISTS 96 keyid 96 CREATE TABLE 96 keyid 96 96 id 96
  • VisualStudio2019+PyQt5

    进入VS修改 把除了默认框选之外的 34 本机开发工具 34 选上 不选的话感觉也没什么运行上的影响 但是 import sys from PyQt5 import QtWidgets 导入PyQt5部件 导入PyQt5没问题 但是却会报一
  • 【Linux】Linux文件系统管理——文件系统常用命令

    文章目录 一 df命令 du命令 fsck命令 dumpfs命令1 1 统计文件系统信息df1 2 统计目录或文件大小du1 3 df命令和du命令的区别1 3 文件系统修复明亮fsck1 4 显示磁盘状态命令dumpe2fs 二 挂载命令
  • vue3 setup lang=“ts“ defineExpose

    vue3 setup lang 61 ts defineExpose Vue 96 span class token tag span class token tag span class token punctuation lt span
  • 关于《软件设计师教程 第5版》UML构件图两类接口描述错误的问题

    如图所示 xff0c 在备考软件设计师时 xff0c 有遇到关于 构件图 的题目 xff0c 官方给的 xff08 是供接口 xff0c O 是需接口 xff0c 就像官方教程上展示的这样 但是发现有其他人说 xff08 是需接口 xff0
  • 统计字符串中每个字母的个数 C语言

    int main char str 100 int count 26 61 0 i 61 0 printf 34 请输入字符串 n 34 gets str while str i 61 39 0 39 if str i gt 61 39 a
  • 51单片机学习笔记5 -- 外部中断

    外部中断 1 外部中断概念2 引脚功能复用3 中断号和中断类型4 外部中断编程 1 外部中断概念 外部中断是单片机实时地处理外部事件的一种内部机制 当某种外部事件发生时 xff0c 单片机的中断系统将迫使CPU暂停正在执行的程序 xff0c
  • k8s部署redis集群(方案1)

    目录 一 创建configmap 二 创建redis集群 三 集群初始化 四 验证集群省略 补充 1 如果整个 redis 集群的 pod 全部都挂掉了 xff0c pod自动拉起后 xff0c 集群不可用 xff0c 需要重建集群 2 重