当前位置: 首页 > news >正文

camellia redis proxy v1.3.3对redis主从进行读写分离(非写死,自动识别故障转移)

1 概述

camellia-redis-proxy是一款高性能的redis代理(https://github.com/netease-im/camellia),使用netty4开发,主要特性如下:

  • 支持代理到redis-standalone、redis-sentinel、redis-cluster。
  • 支持其他proxy作为后端(如双写迁移场景),如 twemproxy 、codis 等。
  • 支持 kvrocks 、 pika 、 tendis 等作为后端。
  • 支持自定义分片。
  • 支持读写分离。
  • 支持双(多)写,可以proxy直连双写,也可以基于mq(如kafka)双写,也可以基于插件体系自定义双写规则。
  • 支持多租户,即租户A路由到redis1,租户B路由到redis2(可以通过不同的clientname区分,也可以通过不同的password区分)。
    支持多租户动态路由,支持自定义的动态路由数据源(内置:本地配置文件、nacos、etcd等,也可以自定义)。
  • 支持自定义插件,并且内置了很多插件,可以按需使用(包括:大key监控、热key监控、热key缓存、key命名空间、ip黑白名单、速率控制等等)。
  • 支持丰富的监控,可以监控客户端连接数、调用量、方法耗时、大key、热key、后端redis连接数和耗时等,并且支持以http接口形式获取监控数据。
  • 等等其他优点。

本文介绍camellia-redis-proxy为哨兵模式部署的redis主从实例进行能读写分离,是能识别redis故障转移的读写分离。

2 部署redis一主两从

cd /tmp
helm pull --untar stable/redis-ha
helm install myredis -n default --set hardAntiAffinity=false ./redis-ha

在这里插入图片描述

3 部署camellia redis proxy

将如下三个文件apply到k8s集群即可。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-db-camellia-test
  labels:
    app: pod-db-camellia-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: pod-db-camellia-test
  template:
    metadata:
      labels:
        app: pod-db-camellia-test
    spec:
      enableServiceLinks: false
      containers:
      - name: container-camellia
        image: swr.cn-south-1.myhuaweicloud.com/migrator/camellia-redis-proxy:1.3.3
        command:
        - java
        - "-XX:+UseG1GC"
        - "-XX:+UseContainerSupport"
        - "-Dio.netty.tryReflectionSetAccessible=true" 
        - "--add-opens"
        - "java.base/java.lang=ALL-UNNAMED" 
        - "--add-opens"
        - "java.base/java.io=ALL-UNNAMED" 
        - "--add-opens"
        - "java.base/java.math=ALL-UNNAMED" 
        - "--add-opens"
        - "java.base/java.net=ALL-UNNAMED" 
        - "--add-opens"
        - "java.base/java.nio=ALL-UNNAMED" 
        - "--add-opens"
        - "java.base/java.security=ALL-UNNAMED" 
        - "--add-opens"
        - "java.base/java.text=ALL-UNNAMED" 
        - "--add-opens"
        - "java.base/java.time=ALL-UNNAMED" 
        - "--add-opens"
        - "java.base/java.util=ALL-UNNAMED" 
        - "--add-opens"
        - "java.base/jdk.internal.access=ALL-UNNAMED" 
        - "--add-opens"
        - "java.base/jdk.internal.misc=ALL-UNNAMED" 
        - "--add-opens"
        - "java.base/sun.net.util=ALL-UNNAMED"
        - "-Xms100m"
        - "-Xmx4096m"
        - "-server"
        - "org.springframework.boot.loader.JarLauncher"
        resources:
          requests:
            memory: "100Mi"
            cpu: "1"
          limits:
            memory: "4Gi"
            cpu: "1"
        ports:
          - containerPort: 6380
            name: db
            protocol: TCP
        volumeMounts:
        - name: cm-db-camellia-test
          mountPath: /opt/camellia-redis-proxy/BOOT-INF/classes/application.yml
          subPath: application-sentinel-singlewrite-multiread.yml
        - name: cm-db-camellia-test
          mountPath: /opt/camellia-redis-proxy/BOOT-INF/classes/resource-sentinel-singlewrite-multiread.json
          subPath: resource-sentinel-singlewrite-multiread.json
      volumes:
      - name: cm-db-camellia-test
        configMap:
          name: cm-db-camellia-test
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-db-camellia-test
data:

  application-sentinel-singlewrite-multiread.yml: |
    server:
      port: 6380
    spring:
      application:
        name: camellia-redis-proxy-server
    camellia-redis-proxy:
      console-port: 16379
      password: pass123 
      monitor-enable: false  
      monitor-interval-seconds: 60
      plugins: #plugin list
        - monitorPlugin
        - bigKeyPlugin
        - hotKeyPlugin
      config:
        "check.redis.resource.valid.not.active.threshold.sceonds": 300 
      transpond:
        type: local 
        local:
          type: complex
          json-file: resource-sentinel-singlewrite-multiread.json
        redis-conf:
          preheat: false
          close-idle-connection: true
          check-idle-connection-threshold-seconds: 600
          close-idle-connection-delay-seconds: 60
  resource-sentinel-singlewrite-multiread.json: |
    {
      "type": "simple",
      "operation": {
        "read": "redis-sentinel-slaves://@myredis-redis-ha-announce-0:26379/mymaster?withMaster=false",
        "type": "rw_separate",
        "write": "redis-sentinel://@myredis-redis-ha-announce-1:26379/mymaster"
      }
    }
apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/path: /metrics
    prometheus.io/port: "16379"
    prometheus.io/scrape: "true"
    prometheus.io/scrape_slow: "true"
    prometheus.io/services: "false"
  name: svc-db-camellia-test
  namespace: default
spec:
  ports:
  - name: port-6380
    port: 6380
    protocol: TCP
    targetPort: 6380
  - name: port-16379
    port: 16379
    protocol: TCP
    targetPort: 16379
  selector:
    app: pod-db-camellia-test
  sessionAffinity: None
  type: ClusterIP

4 测试

redis-0是主。
在这里插入图片描述
在camellia查看upstream信息,看见10.247.192.224:6379,记住这个IP地址。
在这里插入图片描述

将redis-0删除后,重启的redis-0变成从,但是从camellia代理去写入key依然是成功,说明camellia是自动识别了redis的故障转移。
在这里插入图片描述

对camellia执行info后,看见upstream信息如下,10.247.217.97:6379和删除redis-0之前看到10.247.192.224:6379,是两个地址,说明自动识别了主从的故障转移。
在这里插入图片描述

5 小结

本文介绍camellia-redis-proxy为哨兵模式部署的redis主从实例进行能读写分离,redis主从的故障转移是被代理识别的。

相关文章:

  • wlwrap 与 rlwrap 的区别对比:图形显示协议的演变
  • Kafka相关的面试题
  • 淘宝商品数据采集一键采集
  • 【数据分享】2000—2024年我国省市县三级逐月归一化植被指数(NDVI)数据(Shp/Excel格式)
  • 自适应二值化及伪影
  • 深搜专题8:N皇后
  • 鸿蒙初级考试备忘
  • RocketMQ常见问题总结(二)
  • 深呼吸:DeepSeek助力博客 深度思考C知道
  • 基于“动手学强化学习”的知识点(二):第 15 章 模仿学习(gym版本 >= 0.26)
  • 66.Harmonyos NEXT 图片预览组件使用指南
  • 异常(9)
  • 深入理解C++迭代器:分类、操作与使用技巧
  • C语言中的字符串与数组的关系
  • 高级java每日一道面试题-2025年2月26日-框架篇[Mybatis篇]-Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式 ?
  • docker安装教程并且配置华为云加速
  • ios app第一次上架遇到的审核问题
  • unity导出比例问题
  • 前端组件封装艺术:设计原则与最佳实践指南
  • HTML5 Web SQL
  • 权威访谈丨国家疾控局就《世界卫生组织大流行协定》答记者问
  • 交通运输局男子与两名女子办婚礼?官方通报:未登记结婚,开除该男子
  • 外汇局:4月下旬外资投资境内股票转为净买入
  • 上海肺科医院院长陈昶:临床中的痛点,正是新技术诞生的起点
  • 全球前瞻|特朗普19日将与俄乌总统分别通话,英国脱欧后首开英欧峰会
  • 高温最强时段来了!北方局地高温有明显极端性