【k8s安装redis】k8s安装单机版redis实现高性能高可用

文章目录

      • 简介
      • 一.条件及环境说明:
      • 二.需求说明:
      • 三.实现原理及说明
      • 四.详细步骤
        • 4.1.创建configmap 配置文件
        • 4.2.创建StatefulSet 配置
        • 4.3.创建service headless 配置
      • 五.安装说明

简介

本文将根据在k8s环境中搭建【伪】单机模式的redis实例。由于共享存储的io性能比较低,所以将共享存储用于数据备份,而采用hostpath的形式进行redis数据的存储,这样有助于提高redis的io性能,本文将讲解如何在一个pod内用两个container作为redis的主从形式来实现单机版、高可用的redis。

一.条件及环境说明:

k8s版本k8s-1.29.4,环境搭建在电信机房,共计六个节点,每个节点有一块非系统盘的ssd盘挂载到/data/路径。有NAS共享存储,该共享存储是使用的阿里云NAS,走专线使用,专线带宽500Mb。

二.需求说明:

  • 搭建redis实例:可单机,可主从。
  • 高可用:有一个k8s节点死掉之后也不长时间影响使用。
  • 高性能:需要高iO,采用共享存储或者是ceph的分布式存储,读写iO会打很大的折扣。
  • 数据安全:在发生切换以后,数据要尽可能的保证完整
  • 安装简单、管理维护容易

三.实现原理及说明

1.将redis搭建成主从模式,主redis的数据读写落在本地ssd磁盘,从redis的数据数据落在外挂的共享nas存储。
2.然后创建一个statefulset的配置,放置两个container,一个container 作为主redis,挂载到hostpath,以主机名创建目录,并存储rdb文件。另外一个container 作为从redis,挂载nas路径也以主机名创建目录,并存储rdb文件。
3.调整从redis的数据持久化参数save,将数据落盘时间调整到较小的参数,这样保证更新的数据尽快存储到rdb文件。
4.在pod每次发生调度或者重启时,将nas存储的rdb文件拷贝到hostpath路径再启动redis。

注:这样做是让主redis实现高性能的处理业务数据,从redis就负责数据持久化,可能存在如下的问题:1.当主的读写数据io太高时,从redis由于是挂载nas,数据落盘时间会更长一些。

四.详细步骤

4.1.创建configmap 配置文件

配置包含三个文件主redis的配置文件,从redis的配置文件,以及一个根据执行角色执行不同操作的简单脚本,具体配置如下:
redis-master:conf 主redis配置文件,内存配置成256M,配置端口为6379,配置密码:redis#123,存储路径是/data/redis。
redis.conf:从redis配置文件,内存配置成256M,配置端口为6380,配置密码:redis#123,存储路径是/data/redis-2,并配置从6379的端口同步数据,将存储时间调整成60s以内有10个数据变动就进行存储落盘。
run.sh:主要作用就是判断角色并根据主机名创建目录,然后软连接到存储目录。这一步主要是将各自服务的redis数据存放到自己的目录,当创建新的redis的时候不会导致节点上的目录冲突。

apiVersion: v1
kind: ConfigMap
metadata:name: defaultapp-redis-standalone-confignamespace: defaultlabels:appname: default-appapp: defaultapp-redis-standalone-config
data:redis-master.conf: |port 6379maxmemory 256mbrequirepass redis#123dir /data/redisredis.conf: |port 6380maxmemory 256mbrequirepass redis#123save 3600 1 300 5 60 10dir /data/redis-2replicaof 127.0.0.1 6379masterauth redis#123run.sh: |#!/bin/shrole=$1hname=$(hostname)if [ $role == "master" ];thenecho "run redis master"ls /etc/redis/ -l[ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname[ -d /data ] || mkdir /dataln -s /home/redis/$hname /data/redisif [ -f /home/redis-2/$hname/dump.rdb ];thencp -vf /home/redis-2/$hname/dump.rdb /data/redis/elseecho "[info] no bak dump.rdb"firedis-server /etc/redis/redis-master.confelseecho "run redis slave"ls /etc/redis/ -l[ -d /home/redis-2/$hname ] || mkdir -p /home/redis-2/$hname[ -d /data ] || mkdir /dataln -s /home/redis-2/$hname /data/redis-2redis-server /etc/redis/redis.conffi
4.2.创建StatefulSet 配置

为什么不用deployment是因为存储路径是根据主机名的目录,deployment的主机名每次重启都会变动,所以才采用statefuleset。

apiVersion: apps/v1
kind: StatefulSet
metadata:name: defaultapp-redis-standalonenamespace: defaultlabels:appname: default-appapp: defaultapp-redis-standalone
spec:serviceName: "defaultapp-redis-standalone"replicas: 1selector:matchLabels:app: defaultapp-redis-standalonetemplate:metadata:labels:app: defaultapp-redis-standalonespec:containers:- name: redis-masterimage: xxx-registry-vpc.cn-shenzhen.cr.aliyuncs.com/public/redis:7.2.5-alpine3.20imagePullPolicy: IfNotPresentcommand: ["/bin/sh","/etc/redis/run.sh"]args: ["master"]ports:- containerPort: 6379volumeMounts:- name: redis-config-volumemountPath: /etc/redis/- name: redis-datamountPath: /home/redis- name: redis-backupmountPath: /home/redis-2readOnly: false- name: redis-slaveimage: xxx-registry-vpc.cn-shenzhen.cr.aliyuncs.com/public/redis:7.2.5-alpine3.20imagePullPolicy: IfNotPresentports:- containerPort: 6380command: ["/bin/sh","/etc/redis/run.sh"]args: ["slave"]volumeMounts:- name: redis-config-volumemountPath: /etc/redis/- name: redis-datamountPath: /home/redis- name: redis-backupmountPath: /home/redis-2readOnly: falserestartPolicy: Alwaysvolumes:- name: redis-datahostPath:path: /data/redis_datatype: ""- name: redis-config-volumeconfigMap:name: defaultapp-redis-standalone-config- name: redis-backupnfs:server: xxxx-mxx.cn-shenzhen.nas.aliyuncs.compath: /backup/redis
4.3.创建service headless 配置

创建无头服务,集群内调用可以采用无头服务的名称进行调用。

apiVersion: v1
kind: Service
metadata:name: defaultapp-redis-standalonenamespace: defaultlabels:appname: default-appapp: defaultapp-redis-standalone
spec:ports:- port: 6379clusterIP: Noneselector:app: defaultapp-redis-standalone

如果需要对k8s集群外提供访问可以创建成service服务并配置LoadBalancer或者NodePort的形式。

apiVersion: v1
kind: Service
metadata:name: defaultapp-redis-standalone-externalnamespace: defaultlabels:appname: default-appapp: defaultapp-redis-standalone
spec:ports:- port: 6379type: LoadBalancerselector:app: defaultapp-redis-standalone

五.安装说明

  • 需要先在k8s的节点创建/data/redis_data的路径来存放数据。
  • 需要挂载一个共享存储,或者有一个公共路径存放备份文件的地方。
  • 使用配置前将配置中的defaultapp替换成自己需要的命名。
  • 配置中的镜像地址采用了私有的镜像地址,镜像是dockerhub上下载的redis:7.2.5-alpine3.20镜像到私有镜像仓库的,如果能直通外网的k8s可以直接用redis:7.2.5-alpine3.20。否则配置一个可以通的镜像地址。
  • redis.conf或redis-master.conf中的密码redis#123替换成自己的密码。
  • 复制配置时注意缩进字符,有不明白的配置欢迎私信

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

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

相关文章

020-GeoGebra中级篇-几何对象之点与向量

本文概述了在GeoGebra中如何使用笛卡尔或极坐标系输入点和向量。用户可以通过指令栏输入数字和角度,使用工具或指令创建点和向量。在笛卡尔坐标系中,示例如“P(1,0)”;在极坐标系中,示例如“P(1;0)”或“v(5;90)”。文章还介绍了点…

深入理解循环神经网络(RNN)

深入理解循环神经网络(RNN) 循环神经网络(Recurrent Neural Network, RNN)是一类专门处理序列数据的神经网络,广泛应用于自然语言处理、时间序列预测、语音识别等领域。本文将详细解释RNN的基本结构、工作原理以及其优…

uniapp本地打包到Android Studio生成APK文件

(1)安装 Android Studio 软件; 下载地址:官方下载地址,英文环境 安装:如下之外,其他一键 next (2)配置java环境; 下载:j…

基于SpringBoot构造超简易QQ邮件服务发送 第二版

目录 追加 邮箱附件 添加依赖 编码 测试 第二版的更新点是追加了 邮箱附件功能 ( 后期追加定时任务 ) 基于SpringBoot构造超简易QQ邮件服务发送(分离-图解-新手) 第一版 追加 邮箱附件 添加依赖 <!-- 电子邮件 --><dependency><groupId>org.spri…

Java小白入门到实战应用教程-介绍篇

writer:eleven 介绍 编程语言介绍 编程语言按照抽象层次和硬件交互的方式划分为低级编程语言和高级编程语言。 低级编程语言更接近计算机硬件层面&#xff0c;通常具有执行效率高的特点&#xff0c;但是由于注重计算机底层交互&#xff0c;所以编程难度相对较大。 高级编程…

国内开源RAG知识库ChatWiki MaxKb QAnyThing对比

RAG 知识库 &#xff0c; 是一个比较火的赛道&#xff0c;以下是国内开源的RAG 知识库 ChatWiki 芝麻小客服开源的一个RAG 知识库&#xff0c;核心特点是和人工聊天系统打通&#xff0c;可以作为对外的聊天系统使用。 开源地址 https://github.com/zhimaAi/chatwiki 云端体…

如何评价Flutter?

哈喽&#xff0c;我是老刘 我们团队使用Flutter已经快6年了。 有很多人问过我们对Flutter的评价。 今天在这里回顾一下6年前选择Flutter时的原因&#xff0c;以及Flutter在这几年中的实际表现如何。 选择Flutter时的判断 1、性能 最开始吸引我们的就是其优秀的性能。 特别是…

【vue3|第16期】初探Vue-Router与现代网页路由

日期:2024年7月6日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083…

力扣第226题“翻转二叉树”

在本篇文章中&#xff0c;我们将详细解读力扣第226题“翻转二叉树”。通过学习本篇文章&#xff0c;读者将掌握如何使用递归和迭代的方法来翻转二叉树&#xff0c;并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释&#xff0c;以便于理解。 问题描述 力扣第…

深入探索联邦学习框架 Flower

联邦学习框架 本文主要期望介绍一个设计良好的联邦学习框架 Flower&#xff0c;在开始介绍 Flower 框架的细节前&#xff0c;先了解下联邦学习框架的基础知识。 作为一个联邦学习框架&#xff0c;必然会包含对横向联邦学习的支持。横向联邦是指拥有类似数据的多方可以在不泄露…

【CVPR 2024】GART: Gaussian Articulated Template Models

【CVPR 2024】GART: Gaussian Articulated Template Models 一、前言Abstract1. Introduction2. Related Work3. Method3.1. Template Prior3.2. Shape Appearance Representation with GMM3.3. Motion Representation with Forward Skinning3.4. Reconstruct GART from Monocu…

Java--instanceof和类型转换

1.如图&#xff0c;Object&#xff0c;Person&#xff0c;Teacher&#xff0c;Student四类的关系已经写出来了&#xff0c;由于实例化的是Student类&#xff0c;因此&#xff0c;与Student类存在关系的类在使用instanceof时都会输出True&#xff0c;而无关的都会输出False&…

负载均衡技术怎么实现的,负载均衡策略

目录 负载均衡技术怎么实现的 负载均衡技术的实现方式 举例说明 负载均衡策略 1. 轮询(Round Robin) 2. 加权轮询(Weighted Round Robin) 3. 最少连接数(Least Connections) 4. 响应时间(Response Time) 总结 负载均衡技术怎么实现的 负载均衡技术主要通过多种…

数据结构 —— Dijkstra算法

数据结构 —— Dijkstra算法 Dijkstra算法划分集合模拟过程打印路径 在上次的博客中&#xff0c;我们解决了使用最小的边让各个顶点连通&#xff08;最小生成树&#xff09; 这次我们要解决的问题是现在有一个图&#xff0c;我们要找到一条路&#xff0c;使得从一个顶点到另一个…

对比学习和多模态任务

1. 对比学习 对比学习&#xff08;Contrastive Learning&#xff09;是一种自监督学习的方法&#xff0c;旨在通过比较数据表示空间中的不同样本来学习有用的特征表示。其核心思想是通过最大化同类样本之间的相似性&#xff08;或降低它们之间的距离&#xff09;&#xff0c;同…

【Linux】网络新兵连

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 在上一篇博客中&#xff0c;我们简单的介绍了一些Linux网络一些比较基本的概念。本篇博客我们将开始正式学习Linux网络套接字的内容&#xff0c;那么我们开始吧&#xff01; 1.网络中的地址管理 大家一…

GraphRAG——一个基于图的检索增强生成的开源项目【送源码】

GraphRAG 最近几天&#xff0c;微软团队开源了GraphRAG&#xff0c;这是一种基于图&#xff08;Graph&#xff09;的检索增强生成方法。 先说说RAG吧&#xff0c;检索增强生成&#xff0c;相当于是从一个给定好的知识库中进行检索&#xff0c;接入LLM模型&#xff0c;让模型生…

(十六)视图变换 正交投影 透视投影

视图变换 代码实验 #include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <iostream> #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h"//GLM #include <glm/glm.hpp> #include <glm/gtc/m…

C++初探究(2)

引用 对于一个常量&#xff0c;想要将其进行引用&#xff0c;则使用普通的引用相当于权限扩大&#xff08;常量为只读&#xff0c;但此处的引用参数为可读可写&#xff09;&#xff0c;C编译器会报错. 例如&#xff1a; const int a 10;int& ra a;//权限放大&#xff0…

逻辑回归不是回归吗?那为什么叫回归?

RNN 逻辑回归不是回归吗&#xff1f;那为什么叫回归&#xff1f;逻辑回归的基本原理逻辑函数&#xff08;Sigmoid函数&#xff09;二元分类 为什么叫做“回归”&#xff1f;逻辑回归的应用场景总结 逻辑回归不是回归吗&#xff1f;那为什么叫回归&#xff1f; 逻辑回归&#x…