在Kubernetes的3个node上部署redis cluster-阿里云开发者社区

开发者社区> 店家小二> 正文

在Kubernetes的3个node上部署redis cluster

简介: 目的 redis clustor 需要6台服务器才能正常运⾏,由于种种原因,开发或者某些特别的需求,只能在3台服务器上运⾏redis clustor。在不使用哨兵模式情况下,而使⽤最新的clustor模式运行redis。
+关注继续查看

目的

redis clustor 需要6台服务器才能正常运⾏,由于种种原因,开发或者某些特别的需求,只能在3台服务器上运⾏redis clustor。在不使用哨兵模式情况下,而使⽤最新的clustor模式运行redis

本文仅作为redis部署方式的研究及理解


准备工作

制作redis docker.latest镜像其中包含以下组件:

1. redis-cli

2. ruby

3. redis-trib

打包到镜像上传到阿里镜像服务器中cluster-redis:latest

创建集群操作

3台服务器上各自运行两个redis容器

使用以下编写好的redis-cluster部署文件,可在一台部署出两个不同端口,不同角⾊的redis容器。

redis-cluster.yaml

apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
 name: redis-blue
 labels:
 app: redis
 member: redis-blue
 spec:
 replicas: 3 template:
 metadata:
 labels:
 app: redis
 member: redis-blue
 spec:
 hostNetwork: true
 containers: - name: redis
 image: registry.cn-hangzhou.aliyuncs.com/wise2c/cluster-redis:latest
 command: ["/bin/sh", "-c"]
 args: ["echo 'dir /tmp/data' >> /root/redis.conf && /usr/local/bin/redis-server /root/redis.conf"] #- /usr/local/bin/redis-server #- /root/redis.conf
 ports: - name: redis-port
 containerPort: 6379 - name: cluster-port
 containerPort: 16379
 volumeMounts: - mountPath: /tmp/data
 name: data
 volumes: - name: data
 hostPath:
 path: /tmp/redis-blue
 ---
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
 name: redis-green
 labels:
 app: redis
 member: redis-green
 spec:
 replicas: 3 template:
 metadata:
 labels:
 app: redis
 member: redis-green
 spec:
 hostNetwork: true
 containers: - name: redis
 image: registry.cn-hangzhou.aliyuncs.com/wise2c/cluster-redis:latest
 command: ["/bin/sh", "-c"]
 args: ["sed -i 's/6379/6380/g' /root/redis.conf && echo 'dir /tmp/data' >> /root/redis.conf && /usr/local/ports:
 - name: redis-port
 containerPort: 6380
 - name: cluster-port
 containerPort: 16380
 volumeMounts:
 - mountPath: /tmp/data
 name: data
 volumes:
 - name: data
 hostPath:
 path: /tmp/redis-green

kubectl create -f redis-cluster.yaml

执行以下脚本,创建出整个redis集群。redis会自动分配哈希槽,使得master与其对应的slave不会出现在同一台服务器上。

create_cluster.sh

#!/usr/bin/env bash
 redis_count=`kubectl get pod -o wide -l app=redis | grep Running | wc -l` #echo "redis_count:"$redis_count if [ $redis_count -ne 6 ]; then
 echo "the running redis count: ${redis_count} is error" exit 1 fi
 redis_blue_ips=`kubectl get pod -o wide -l app=redis -l member=redis-blue | awk 'NR>1{printf $6":6379 "}'
 redis_green_ips=`kubectl get pod -o wide -l app=redis -l member=redis-green | awk 'NR>1{printf $6":6380 "}'
 redis_ips=$redis_blue_ips" "$redis_green_ips
 echo "redis_ips:"$redis_ips
 redis_blue_name=`kubectl get pod -o wide -l app=redis -l member=redis-blue | grep Running | awk '{printf $1" "}'
 #echo $redis_ips | awk -F' ' '{for( i=1;i<NF; i++ ) print $i}' `` kubectl create -f redis-cluster.yaml bash create_cluster.sh

关掉其中一台机器 由于master和slave 不在同一台机器上,当我们直接关掉其中⼀一台vm,比如vm2

这时vm3上,由redis cluster自动恢复vm3slave2(6380) —> master2(6380) 提升为master,集群工作正常,业务不中断。

恢复关掉的的机器

当我们重新启动vm2, 这时候集群的状态:

这时集群工作正常,此时vm3有2个master。如果我们关掉vm3,会让集群中2个master同时下线,导致集群无法自动恢复。

重点:执行以下脚本,提升slave2到master2,恢复集群的自动修复功能。

failover.sh

#!/usr/bin/env bash
 redis_blue_name=`kubectl get pod -o wide -l app=redis -l member=redis-blue | grep Running | awk '{printf $1":6379 redis_names=`kubectl get pod -o wide -l app=redis -l member=redis-blue | grep Running | awk '{printf $1","}'
 redis_array=${redis_names//,/ } for redis_name in $redis_array
 do
 kubectl exec -it ${redis_name} -- redis-cli cluster failover
 done

bash failover.sh

集群自动恢复,变成下面的状态。

集群工作正常,业务不中断。

作者后话

以上的操作,目的是让各台虚拟上不出现有2个master。当其中一台虚拟机出现当机,集群就不能正常工作.。如果是3台master和3台slave分别在不同的机器刚好错开,redis cluster能自动恢复.。最好的解决方案,依然是有6台虚拟机、3台master、3台slave的redis cluster。

To do

我们可以进⼀一步将

  • create-redis.sh
  • failover.sh
  • kubectl

制作为镜像, k8s deployment运行此镜像。实现:

  • 创建集群
  • 恢复集群的自动修复功能(任意关掉其中一台服务器,业务不中断。每过一秒,检查集群中是否有slave需要提升权限,集群都能正常工作.业务不中断。)
本文转自中文社区-在Kubernetes的3个node上部署redis cluster

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9485 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
9049 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13168 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
7380 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
6886 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
21895 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
4008 0
+关注
651
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载