本 文 主 要 内 容

  • 什么是Kubernetes分布式容器管理平台

  • PaaS平台redis-sentinel集群架构简介

  • PaaS平台部署redis哨兵集群

  • redis-sentinel容器测试及验证

  • redis-sentienl容器集群之客户端程序实现

Kubernetes分布式容器管理平台

Kubernetes是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护更新等功能,是当下较热门的PSSA集群技术之一。

Kubernetes的主要核心组件:

●Apiserver:

apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制,封装了核心对象的增删改查操。

●scheduler:

负责集群资源的调度和管理,按照预定的调度策略将Pod调度到相应的机器上。

●controller-manager:

负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。

●kubelet:

运行在minion节点,负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理,例如启停容器,监控运行状态等。

●etcd:

etcd是一个高可用的键值存储系统。

●flannel:

为集群中的所有节点重新规划IP地址的使用规则。

●pod:

它是Kubernetes资源中最小的调度单元,也是基础单元。

Kubernetes架构图:

Kubernetes中创建pod过程:

  • 用户通过 REST API 创建一个 Pod。

  • apiserver 将其写入 Etcd数据库。

  • scheduluer 检测到未绑定 Node 的 Pod,开始调度并更新 Pod 的 Node 绑定。

  • kubelet 检测到有新的 Pod 调度过来,通过 container runtime 运行该 Pod。

  • kubelet 通过 container runtime 获取取到 Pod 状态并更新到 apiserver 中。

使用Kubernetes部署服务的几个好处:

1)服务自动故障迁移;

2)自动资源调度;

3)实现资源隔离;

4)采用docker容器;

5)RBAC认证增加了Kubernetes的安全。

Kubernetes的优势:

1)可移动:公有云、私有云、混合云、多态云;

2)可扩展:模块化、插件化、可挂载、可组合;

3)自修复:自动部署、自动重启、自动复制、自动伸缩。

PaaS平台redis-sentinel集群架构简介

redis哨兵架构介绍:

●  Redis Sentinel是一个分布式系统,RedisSentinel为Redis提供高可用性。可以在没有人为干预的情况下阻止某种类型的故障。

●可以在一个架构中运行多个Sentinel,这些进程使用gossip协议来接收关于主服务器是否下线的信息,并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。

PaaS平台redis-sentinel架构图工作流程图:

PaaS平台部署redis哨兵集群过程

redis-sentinel镜像准备,使用dockerfile构建如下镜像:

  • Redis Sentienl镜像

al_redis_sentinel_v2_4.0.10.tar

  • Redis master镜像

al_redis-sentinel_master_4.0.10.tar

  • Redis slave镜像

al_redis_slave_4.0.10.tar

编写redis-sentinel网络清单文件:

vim redis_sentinel.yaml

---

apiVersion:extensions/v1beta1

kind:Deployment

metadata:

annotations:

deployment.kubernetes.io/revision: "2"

labels:

service_name: redis-sentinel1

name: redis-sentinel1

namespace: core-610

spec:

replicas: 1

revisionHistoryLimit: 5

selector:

matchLabels:

service_name: redis-sentinel1

strategy:

rollingUpdate:

maxSurge: 0%

maxUnavailable: 100%

type: RollingUpdate

template:

metadata:

annotations:

service.alauda.io/version: "5"

labels:

service_name: redis-sentinel1

namespace: core-610

spec:

affinity:

podAffinity: {}

podAntiAffinity: {}

containers:

- env:

- name: REDIS_SENTINEL_PORT

value: "26378"

- name: MASTER_NAME

value: mymaster

- name: MASTER_HOST

value: 192.168.1.94

- name: MASTER_PORT

value: "6378"

- name: QUONUM

value: "1"

- name: DOWN_AFTER_MILLSECONDS

value: "8000"

- name: NUMSLAVES

value: "1"

- name: FAILOVER_TIMEOUT

value: "60000"

- name: AUTH_PASS

value: xxxxxx

image:xxx.xxx.xxx.xxx/pro568/al_redis_sentinel:4.0.10

imagePullPolicy: Always

name: redis-sentinel1

resources:

limits:

cpu: "0.5"

memory: 512Mi

requests:

cpu: "0.5"

memory: 512Mi

terminationMessagePath:/dev/termination-log

terminationMessagePolicy: File

volumeMounts:

- mountPath: /data

name: redis-sentinel1

dnsPolicy: ClusterFirst

restartPolicy: Always

schedulerName: default-scheduler

securityContext: {}

terminationGracePeriodSeconds: 10

volumes:

- name: redis-sentinel1

persistentVolumeClaim:

claimName: redis-sentinel1

---

apiVersion:extensions/v1beta1

kind:Deployment

metadata:

annotations:

deployment.kubernetes.io/revision: "1"

labels:

service_name: redis-master1

name: redis-master1

namespace: core-610

spec:

replicas: 1

revisionHistoryLimit: 5

selector:

matchLabels:

service_name: redis-master1

strategy:

rollingUpdate:

maxSurge: 0

maxUnavailable: 1

type: RollingUpdate

template:

metadata:

annotations:

service.alauda.io/version: "1"

labels:

service_name: redis-master1

namespace: core-610

spec:

affinity:

podAffinity: {}

podAntiAffinity: {}

containers:

- env:

- name: REDIS_PORT

value: "6378"

- name: REDIS_PASSWORD

value: xxxxxx

- name: __ALAUDA_FULL_NAME__

- name: __CREATE_TIME__

value: "2020-01-10T15:10:24"

- name: __ALAUDA_APP_NAME__

value: gzky-sentinel

- name: REDIS_MAXMEMORY

value: "536870912"

- name: __ALAUDA_SERVICE_NAME__

value: redis-master1

- name: __ALAUDA_SERVICE_VERSION__

value: "1060"

- name: __ALAUDA_OVER_COMMIT_CPU__

value: "512"

- name: __ALAUDA_OVER_COMMIT_MEM__

value: "512"

- name: MASTER_AUTH

value: xxxxxx

- name: MAXCLIENTS

value: "8000"

- name: __ALAUDA_CONTAINER_SIZE__

value: "0.5"

- name: __ALAUDA_REGION_NAME__

- name: __ALAUDA_SERVICE_ID__

value: redis-master1

image:xxx.xxx.xxx.xxx/pro568/al_redis-sent_master:4.0.10

imagePullPolicy: Always

name: redis-master1

resources:

limits:

cpu: 250m

memory: 512Mi

requests:

cpu: 250m

memory: 512Mi

terminationMessagePath:/dev/termination-log

terminationMessagePolicy: File

volumeMounts:

- mountPath: /data

name: redis-rep1

dnsPolicy: ClusterFirst

hostNetwork: true

restartPolicy: Always

schedulerName: default-scheduler

securityContext: {}

terminationGracePeriodSeconds: 10

volumes:

- name: redis-rep1

persistentVolumeClaim:

claimName: redis-rep1

---

apiVersion:extensions/v1beta1

kind:Deployment

metadata:

annotations:

deployment.kubernetes.io/revision: "2"

labels:

service_name: redis-slave-1

name: redis-slave-1

namespace: core-610

spec:

replicas: 1

revisionHistoryLimit: 5

selector:

matchLabels:

service_name: redis-slave-1

strategy:

rollingUpdate:

maxSurge: 0

maxUnavailable: 1

type: RollingUpdate

template:

metadata:

annotations:

service.alauda.io/version: "2"

labels:

service_name: redis-slave-1

namespace: core-610

spec:

affinity:

podAffinity: {}

podAntiAffinity: {}

containers:

- env:

- name: REDIS_PORT

value: "6378"

- name: REDIS_PASSWORD

value: xxxxxx

- name: __ALAUDA_FULL_NAME__

- name: __CREATE_TIME__

value: "2020-01-10T15:10:24"

- name: __ALAUDA_APP_NAME__

value: gzky-sentinel

- name: REDIS_MAXMEMORY

value: "536870912"

- name: __ALAUDA_SERVICE_NAME__

value: redis-slave-1

- name: __ALAUDA_SERVICE_VERSION__

value: "1057"

- name: __ALAUDA_OVER_COMMIT_CPU__

value: "512"

- name: __ALAUDA_OVER_COMMIT_MEM__

value: "512"

- name: REDIS_SLAVE_OF

value: 192.168.1.94 6378

- name: MASTER_AUTH

value: xxxxxx

- name: MAXCLIENTS

value: "8000"

- name: __ALAUDA_CONTAINER_SIZE__

value: "0.5"

- name: __ALAUDA_REGION_NAME__

- name: __ALAUDA_SERVICE_ID__

value: redis-slave-1

image:xxx.xxx.xxx.xxx/pro568/al_redis_slave:4.0.10

imagePullPolicy: Always

name: redis-slave-1

resources:

limits:

cpu: 250m

memory: 512Mi

requests:

cpu: 250m

memory: 512Mi

terminationMessagePath:/dev/termination-log

terminationMessagePolicy: File

volumeMounts:

- mountPath: /data

name: redis-rep1

dnsPolicy: ClusterFirst

hostNetwork: true

restartPolicy: Always

schedulerName: default-scheduler

securityContext: {}

terminationGracePeriodSeconds: 10

volumes:

- name: redis-rep1

persistentVolumeClaim:

claimName: redis-rep1

在PaaS平台使用清单文件部署redis-sentinel容器集群。

执行部署命令:

kubectl  apply -fredis_sentinel.yaml

PaaS平台查看redis-sentinelPOD运行状态:

redis-sentinel容器测试及验证

查看sentinel集群节点信息:

redis-cli -h 192.168.1.92 -p 26379

192.168.1.92:26379>sentinel master mymaster    #查看主节点信息

192.168.1.92:26379>sentinelmaster slaves     #查看从节点信息

客户端写入测试数据:

#客户端连接master节点,写入一条数据

[root@node3~]# redis-cli -h 192.168.1.94 -p 6378

192.168.1.94:6378>set foo bar

OK

192.168.1.94:6379>get foo

"bar"

#然后客户端再连接任意slave节点,通过get获取上面的那条数据

[root@node1~]# redis-cli -h 192.168.1.95 -p 6379

192.168.1.95:6378>get foo

"bar"

master节点可以写入和读取;而slave节点默认只能读取而不能写入。以此实现主从复制、读写分离。

redis-sentienl容器集群之客户端程序实现

客户端实现原理:

redis哨兵模式客户端程序实现过程描述:

  • 连接所有的Sentinel的节点,返回可一个可用的sentinel结合列表。

  • 向可用的sentinel节点发送get-master-addr-by-name masterName请求;获取redis节点(master/salve)和信息。

  • 返回信息中会验证节点是否是master角色。

  • 如果sentinel检测到master节点变化,会failover。

  • 实现读写分离;读走Slave,写走Master。

以上是今天带来的基于K8S的redis哨兵模式的扫盲和实验案例,后续会继续给大家带来具体使用中碰到的问题,趟过的坑。

k8s redis集群_基于K8S部署redis哨兵集群相关推荐

  1. docker redis 删除集群_基于Docker的Redis集群实践

    单机版的Redis相信大家都比较熟悉了,这里介绍几种Redis的集群模式,并结合Docker来进行实践操作 abstract.png 准备工作 通过Docker下载最新的Redis镜像 # 获取red ...

  2. 二进制安装mysql集群_基于二进制安装Cloudera Manager集群

    一.环境准备 参考链接:https://www.cnblogs.com/zhangzhide/p/11108472.html 二.安装jdk(三台主机都要做) 下载jdk安装包并解压:tar xvf ...

  3. 自动化部署mysql主从复制集群_使用docker部署mysql主从复制集群

    一.环境搭建 虚拟机环境:centos7 IP:192.168.37.134 用户名:root 密码:123 启动3个容器,一个是master,端口是3307,另外两个是slaver,端口是3308和 ...

  4. redis主从读写分离replication复制数据+sentienl哨兵集群主备切换

    说明:最近公司在自己搭建了一套redis主从读写分离+sentinel哨兵集群主备切换,通过手工去搭建replication复制+主从架构+读写分离+哨兵集群+高可用redis集群架构 公司的已经搭建 ...

  5. k8s 安装redis-operator并以operator方式部署redis-standalone redis-cluster集群完整操作记录

    安装redis-operator install.sh [root@linux:redis-operator]$ cat install.sh #!/usr/bin/env bash# This sc ...

  6. redis实现轮询算法_基于zookeeper或redis实现分布式锁

    前言 在分布式系统中,分布式锁是为了解决多实例之间的同步问题.例如master选举,能够获取分布式锁的就是master,获取失败的就是slave.又或者能够获取锁的实例能够完成特定的操作. 目前比较常 ...

  7. docker redis 配置文件_基于Docker搭建Redis一主两从三哨兵

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:oscarwin juejin.im/post/5d26b03de51d454fa3 ...

  8. docker 镜像修改的配置文件自动还原_基于Docker搭建Redis一主两从三哨兵

    作者丨oscarwin来源:https://juejin.im/post/5d26b03de51d454fa33b1960 这段时间正在学习Redis和容器相关的内容,因此想通过docker搭建一套r ...

  9. 如何保证 Redis 高可用和高并发(主从+哨兵+集群)

    1. 概述 Redis 作为一种高性能的内存数据库,普遍用于目前主流的分布式架构系统中.为了提高系统的容错率,使用多实例的 Redis 也是必不可免的,但同样复杂度也相比单实例高出很多. 那么如何保证 ...

最新文章

  1. Ant Design Vue中a-select组件下拉列表在局部滚动时不跟随问题解决方法
  2. 深入理解Java:注解(Annotation)自定义注解入门
  3. iOS Winding Rules 缠绕规则
  4. 关于SAP Spartacus嵌套label的padding问题
  5. c#利用宏定义调试代码
  6. 服务器操作系统类型怎么查,服务器查看操作系统类型
  7. 10分钟开始使用ICTCLAS Java版
  8. Ubuntu开启nfs并连接开发板
  9. 国外手机短信验证码接收神器(转自美国华人网FuninUSA)
  10. 修改 xweibo 的memcache代码,让xweibo支持wincache,加快xweibo速度
  11. UML之旅店预订系统
  12. linux wrf 系统_WRF模式学习_从linux安装开始
  13. Oliver Wyman的一年制PTA面试
  14. 拉卡拉支付——综合普惠金融科技平台
  15. 钢琴节奏时值测试软件,钢琴技巧:弹奏时值较长双音的技巧——自网络
  16. Error launching application on iPhone 11 Pro Max.
  17. houdini 求出曲线的法向 切线以及副法线
  18. 苏州蜗牛面试感想 ------- 知其然而不知其所以然
  19. 数据同步工具—sqoop 2.x
  20. Android Socket(ClientServer)

热门文章

  1. python使用字典格式化字符串-4.2.3Python下字典的格式化字符串
  2. python编程培训多少钱-python编程培训多少钱?[python培训]
  3. python怎么写文件-python 头文件怎么写
  4. python少儿编程 在线课程-石家庄Python人工智能编程
  5. python课程是学什么的-机器学习最好的课程是什么?
  6. python编程入门电子书下载-Python编程基础如何快速入门?“附电子书下载”
  7. redis中的ziplist
  8. 行为模式之Template Method模式
  9. DPDK KNI 接口2
  10. MYSQL表根据列拆分的问题