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-testlabels:app: pod-db-camellia-test
spec:replicas: 1selector:matchLabels:app: pod-db-camellia-testtemplate:metadata:labels:app: pod-db-camellia-testspec:enableServiceLinks: falsecontainers:- name: container-camelliaimage: swr.cn-south-1.myhuaweicloud.com/migrator/camellia-redis-proxy:1.3.3command:- 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: 6380name: dbprotocol: TCPvolumeMounts:- name: cm-db-camellia-testmountPath: /opt/camellia-redis-proxy/BOOT-INF/classes/application.ymlsubPath: application-sentinel-singlewrite-multiread.yml- name: cm-db-camellia-testmountPath: /opt/camellia-redis-proxy/BOOT-INF/classes/resource-sentinel-singlewrite-multiread.jsonsubPath: resource-sentinel-singlewrite-multiread.jsonvolumes:- name: cm-db-camellia-testconfigMap:name: cm-db-camellia-test
apiVersion: v1
kind: ConfigMap
metadata:name: cm-db-camellia-test
data:application-sentinel-singlewrite-multiread.yml: |server:port: 6380spring:application:name: camellia-redis-proxy-servercamellia-redis-proxy:console-port: 16379password: pass123 monitor-enable: false  monitor-interval-seconds: 60plugins: #plugin list- monitorPlugin- bigKeyPlugin- hotKeyPluginconfig:"check.redis.resource.valid.not.active.threshold.sceonds": 300 transpond:type: local local:type: complexjson-file: resource-sentinel-singlewrite-multiread.jsonredis-conf:preheat: falseclose-idle-connection: truecheck-idle-connection-threshold-seconds: 600close-idle-connection-delay-seconds: 60resource-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: /metricsprometheus.io/port: "16379"prometheus.io/scrape: "true"prometheus.io/scrape_slow: "true"prometheus.io/services: "false"name: svc-db-camellia-testnamespace: default
spec:ports:- name: port-6380port: 6380protocol: TCPtargetPort: 6380- name: port-16379port: 16379protocol: TCPtargetPort: 16379selector:app: pod-db-camellia-testsessionAffinity: Nonetype: 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主从的故障转移是被代理识别的。

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

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

相关文章

贪吃蛇小游戏-简单开发版

一、需求 本项目旨在开发一个经典的贪吃蛇游戏,用户可以通过键盘控制蛇的移动方向,让蛇吃掉随机出现在游戏区域内的食物,每吃掉一个食物,蛇的身体长度就会增加,同时得分也会相应提高。游戏结束的条件为蛇撞到游戏区域的…

使用 Docker 部署前端项目全攻略

文章目录 1. Docker 基础概念1.1 核心组件1.2 Docker 工作流程 2. 环境准备2.1 安装 Docker2.2 验证安装 3. 项目配置3.1 项目结构3.2 创建 Dockerfile 4. 构建与运行4.1 构建镜像4.2 运行容器4.3 访问应用 5. 使用 Docker Compose5.1 创建 docker-compose.yml5.2 启动服务5.3 …

接口自动化测试用例

Post接口自动化测试用例 Post方式的接口是上传接口,需要对接口头部进行封装,所以没有办法在浏览器下直接调用,但是可以用Curl命令的-d参数传递接口需要的参数。当然我们还以众筹网的登录接口为例,讲解post方式接口的自动化测试用…

使用WireShark解密https流量

概述 https协议是在http协议的基础上,使用TLS协议对http数据进行了加密,使得网络通信更加安全。一般情况下,使用WireShark抓取的https流量,数据都是加密的,无法直接查看。但是可以通过以下两种方法,解密抓…

阿里百炼Spring AI Alibaba

文章目录 学习链接阿里百炼创建api-key查看api调用示例示例pom.xmlAQuickStartMultiChatStreamChat Spring AI Alibaba简单示例pom.xmlapplication.ymlHelloworldControllerDashScopeChatModelController图解spring AI的结构 deepseekpom.xmlapplication.ymlDeepSeekChatClient…

【模拟算法】

目录 替换所有的问号 提莫攻击 Z 字形变换 外观数列 数青蛙(较难) 模拟算法:比葫芦画瓢。思路较简单,考察代码能力。 1. 模拟算法流程,一定要在演草纸上过一遍流程 2. 把流程转化为代码 替换所有的问号 1576. 替…

【Linux】进程(1)进程概念和进程状态

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、什么是进程 二、task_struct的内容 三、Linux下进程基本操作 四、父进程和子进程 1. 用fork函数创建子进程 五、进程状态 1. 三种重…

配置blender的python环境

在blender的脚本出输入: import sys print(sys.executable) 2. 通过上述命令我们得到blener的python版本,下面我们在conda配置一个同样版本的python环境。 conda create -n blenderpy python3.11.9找到blender安装路径下的python文件夹,将它…

【bug日记】 编译错误

在我使用vscode的时候,我想用一个头文件和两个cpp文件,头文件是用来声明一个类的,一个cpp是用来类的成员函数,一个cpp是主函数 但是我写完编译发现会弹出找不到这个类成员函数这个cpp文件,爆出这样的错误 提示我找不到…

SQLAlchemy系列教程:批量插入数据

高效地批量插入数据对于应用程序的性能至关重要。SQLAlchemy为批处理操作提供了几种机制,可以最大限度地减少开销并加快数据库事务时间。在本指南中,我们将探讨如何使用SQLAlchemy执行批量插入,包括从基础技术到高级技术。 搭建环境 在开始之…

蓝桥杯十天冲刺-day1(getline读入空格)

getline读入带空格的字符串 解决cin或scanf无法读入空格的问题 作文标题 代码思路 主要通过这个代码体会getline函数可以输入空格的作用 用getline函数输入含空格的字符串&#xff0c;用length()函数记字符串长度 依次扫描不为空格的字符计数 #include<bits/stdc.h>…

使用py-ffmpeg批量合成视频的脚本

我有一个小米摄像头&#xff0c;用它录出来的视频全部都是3s一段3s一段的。其中有几个小时的视频我需要保存&#xff0c;当初直接把摄像头的卡文件导出来重命名掉了&#xff0c;那时候没有注意&#xff0c;之后想剪辑/发送给别人的时候发现疯了&#xff1a; 1.剪辑的话&#x…

el-table表格样式设置单元格样式方法 :cell-class-name

需求&#xff1a;是否匹配当天日期决定当天时间高亮显示 效果如图 页面代码 <el-tableref"manpowerTable":key"manpowerForUserHandle.tableKey"class"sysDictInfoTable":data"handle.manpowerTable.data"style"width: 100…

基于express+TS+mysql+sequelize的后端开发环境搭建

步骤一&#xff1a;初始化node环境 npm init -y 步骤二&#xff1a;安装 Express、TypeScript、以及相关类型的定义文件 npm install express npm install --save-dev typescript types/node types/express ts-node nodemon npm install body-parser npm install mysql2 npm in…

蓝耘MaaS平台:阿里QWQ应用拓展与调参实践

摘要&#xff1a;本文深入探讨了蓝耘MaaS平台与阿里QWQ模型的结合&#xff0c;从平台架构、模型特点到应用拓展和调参实践进行了全面分析。蓝耘平台凭借其强大的算力支持、弹性资源调度和全栈服务&#xff0c;为QWQ模型的高效部署提供了理想环境。通过细化语义描述、调整推理参…

2. qt写带有槽的登录界面(c++)

我们在1.Qt写简单的登录界面(c)_c qt 设计一个简单界面-CSDN博客中写了个简单的登录界面&#xff0c;但没有槽&#xff0c;在这里写一个带有槽的界面。 1.代码 代码目录如下&#xff1a; main.cpp的代码如下&#xff1a; #include "MainWindow.h" #include <Qt…

linux - 基础IO之操作与文件描述符全解析:从C语言到系统调用底层实现

目录 1.回顾c语言中所学的文件 2.提炼对文件的理解&#xff08;linux基础io第一阶段的学习&#xff09; a.在操作系统内部&#xff0c;一个进程和一个被打开的文件&#xff0c;他们到后面会变成两种对象之间的指针关系。 b.文件 属性 内容 c.在c语言中,以w的方式打开文件…

【A2DP】深入解读A2DP中通用访问配置文件(GAP)的互操作性要求

目录 一、模式支持要求 1.1 发现模式 1.2 连接模式 1.3 绑定模式 1.4 模式间依赖关系总结 1.5 注意事项 1.6 协议设计深层逻辑 二、安全机制&#xff08;Security Aspects&#xff09; 三、空闲模式操作&#xff08;Idle Mode Procedures&#xff09; 3.1 支持要求 …

python 入门教程 window 10 环境下安装pyenv

python的环境配置方法很多&#xff0c;由于python有两个大版本&#xff0c;很多时候需要切换某个固定的版本才能运行三方包&#xff0c;所以推荐使用pyenv 配置python 环境变量 pyenv 的安装 安装方法&#xff1a; Invoke-WebRequest -UseBasicParsing -Uri "https://r…

【fNIRS可视化学习1】基于NIRS-SPM进行光极可视化并计算通道坐标

一、前言 功能性近红外光谱(fNIRS)是一种无创的脑功能成像技术。在fNIRS研究中&#xff0c;光极的空间定位和通道坐标的计算至关重要。 1.光极可视化 光极可视化的重要性我就不赘述了&#xff0c;它可以直观检查probe设计的合理性&#xff0c;确认光极覆盖目标脑区&#xff0c…