k8s
  • Initial page
  • 序言
  • 前言
    • 发展历史
    • CNCF - 云原生计算基金会简介
    • Kubernetes与云原生应用的概念
  • 概念与原理
    • 基本概念总结
    • 开放接口
      • CRI - Container Runtime Interface
      • CNI - Container Network Interface
      • CSI - Container Storage Interface
    • 核心概念与原理
      • Kubernetes简介
      • Kubernetes架构与原理
      • 核心组件
      • 设计理念
      • 核心组件原理
        • etcd概念与原理
          • Etcd基于RAFT的一致性
          • Etcd v2 与 v3存储
        • kube-apiserver
        • kube-scheduler
        • kube-Controller Manager
        • Kubelet
        • kubectl常用命令
      • kubectl
      • kube-proxy
      • IPVS负载均衡
      • kube-dns
      • Federation-集群联邦
      • kubeadm
    • 资源对象与基本概念解析
    • 资源对象
      • Pod
        • Pod概述
        • Pod解析
        • Pod 的生命周期
        • 探针
        • Init 容器
        • Pause容器
        • Pod 安全策略
        • Pod hook
        • Pod Preset
        • pod其他设置
        • Pod中断与PDB
    • Kubernetes中的网络
      • 图解Kubernetes网络(一)
      • 图解Kubernetes网络(二)
      • 图解Kubernetes网络(三)
      • calico
      • flannel
    • 转发K8S后端服务的四种方式
    • 集群资源对象
      • Node
      • Namespace
      • Label
      • Annotation
      • Taint和Toleration(污点和容忍
      • 垃圾收集
      • Autoscaling
      • Horizontal Pod Autoscaling
        • Metrics-Server
        • Heapster
      • ReplicationController和ReplicaSet
    • 控制器资源对象
      • CronJob
      • Job
      • DaemonSet
      • Deployment
      • StatefulSet
    • 服务发现-资源对象
      • DNS原理讲解
      • Ingress 选型
      • Service
      • Ingress
    • 存储对象
      • ConfigMap
      • Volume
      • Persistent Volume(持久化卷)
      • StorageClass
      • 本地持久化存储
      • Secret
    • 策略对象
      • Resource Quota
      • SecurityContext
    • 身份对象
      • 认证
      • Service Account
      • RBAC——基于角色的访问控制
      • 准入控制
      • Network Policy
    • 资源调度
      • QoS(服务质量等级)
  • 插件扩展
    • Kubernetes的CI/CD
    • Dashboard
    • CoreDNS
    • 监控
      • 概述
      • 第1章 采集
        • Probes
        • Docker Stats
        • cAdvisor
        • Heapster
          • HPA
        • metrics-server
        • custom metrics自定义指标
        • kube-state-metrics
        • node-exporter
        • Prometheus
          • go 自定义metric
          • 本地存储
          • Prometheus概述
          • Prometheus基本架构
          • Prometheus部署方案
          • Prometheus的配置与服务发现
          • PromQL查询解析
          • Prometheus数据可视化
          • Prometheus存储机制
        • Sysdig
        • Untitled
      • 自定义监控
      • Custom-Metrics及Prometheus监控系统
      • grafana各种类型监控-实用
    • 日志
    • 存储
      • Kubernetes Ceph 工作原理详解
    • Metrics
    • GPU
    • Cluster AutoScaler
    • CI/CD
      • 基于DOCKER的CI工具—DRONE
      • DRONE安装指南
      • 如何使用DRONE
      • Drone
      • Jenkins
        • jenkins 集成 keycloak 认证
    • 50个免费的Kubernetes工具盘点
      • Kube集群部署工具
      • 监控工具
      • 测试工具
      • 安全工具
      • 实用的CLI工具
      • 开发工具
      • 无服务器/函数工具
      • 原生服务发现
      • 原生可视化与控制
    • Untitled
  • 领域应用
    • Istio
      • Helm安装
      • 安装并试用Istio service mesh
      • 示例应用部署
      • Bookinfo 应用-
      • 配置请求的路由规则
      • 故障注入
      • 流量转移
      • Istio流量管理实现机制深度解析
      • istio:监控能力介绍
      • Istio 04:Istio性能及扩展性介绍
      • Untitled
  • 实践
    • 大规模集群
    • 高可用
  • k8s运维排查
    • 常用命令
    • Kubernetes之YAML文件
      • yaml文件例子--pod
      • yaml文件例子--rc
    • Kubernetes运维
      • 集群管理
      • 集群与应用监控
      • 日志收集与管理
      • 常见问题定位
      • 权限管理RBAC
    • 排错概览
    • 集群排错
      • kubernetes集群管理常用命令一
    • Pod 排错
    • 网络排错
      • 容器内抓包定位网络问题
    • PV 排错
    • Windows 排错
    • 云平台排错
    • 集群安装脚本
    • 排错工具
    • 常见问题
      • k8s故障解决干货文档链接
      • 记一次Docker/Kubernetes上无法解释的连接超时原因探寻之旅
      • service没有负载均衡
      • kubernetes集群etcd空间配额2G的坑优化
    • K8S--100问
      • 解决 Docker 日志文件太大的问题
      • Kubernetes集群里容器之间的通讯方式
      • k8s 优化
      • lxcfs 在容器内显示容器的 CPU、内存状态
      • kubectl 创建 Pod流程
      • k8s网络-iptables
      • k8s底层网络原理
      • 网络排查
      • kubectl top 和 cadvisor metric ,docker state不一致的问题
      • 容器挂载数据卷的几种情况
      • 容器的终止流程
      • Kubernetes 中如何保证优雅地停止 Pod
      • K8S的apiVersion
      • 如何在Pod中执行宿主机上的命令
      • 创建 Pod 流程
      • k8s主要组件说明
      • 节点网络规划
      • Deployment管理方式
      • pod的分配方式
  • 深入浅出k8s
    • 说明
    • k8s发布策略介绍
    • oom kill原理讲解
    • Kubernetes 的架构设计与实现原理
  • 附录
    • CKA认证
    • 生态圈
    • 资讯快报
      • 2018态势回顾与2019年前景展望
      • Untitled
    • 学习资源
    • 参考文档
    • Kubernetes版本更新日志
      • Kubernetes 1.14 更新日志
      • Kubernetes 1.13 更新日志
      • Kubernetes1.12更新日志
      • Kubernetes1.10更新日志
      • Kubernetes1.11更新日志
  • 思维导图
    • k8s
    • DEVOPS
  • DEVOPS
    • 开源仓库-nexus
      • 一,nexus的安装
      • 二,使用nexus3配置docker私有仓库
      • 三,使用nexus3配置maven私有仓库
      • 四,nexus-3.14.0升级到3.15.2
      • 五,nexus3搭建golang私服
    • vpn
      • openvpn
    • Tcpdump 示例教程
    • Ipsec VPN-centos7使用strangwang搭建vpn
    • yum安装redis及常用指令
    • 数据库
      • mysql表操作
      • mysql 库常用操作及备份还原
      • MySQL 优化实施方案
    • NSQ
      • nsq问题解答
      • 选型
      • docker-compose部署 简单nsq 集群
    • 部署Redis集群
    • zookeeper安装及使用
    • Etcd
      • Untitled
      • Etcd配置
  • k8s系统完整部署
    • CentOS7.5 使用二进制程序部署Kubernetes1.12.2
    • 二进制的方式部署 K8S-1.16 高可用集群
    • CoreOS部署Kubernetes集群
    • EFK
      • 日志-kafka
      • logstash的部署、整合ELK+Filebeat
      • 应用日志收集
      • ES搭建
      • es集群部署
      • ElasticSearch技术原理
      • Elasticsearch操作
      • kibana
      • kibana简单使用
      • 非K8S主机部署Filebat
    • 镜像仓库-Harbor
    • Harbor 2.6.2安装
    • cURL 命令获取本机外网 IP
    • Shell 解析 JSON
    • 制作 gitbook 文档镜像,运行在 K8S 上
    • Kubernetes 之 MySQL 持久存储和故障转移
    • 如何删除etcd上的旧数据
    • Git 实战教程
  • 生活
    • 信合.阳光城
Powered by GitBook
On this page
  • 使用Docker Compose部署基于Sentinel的高可用Redis集群
  • CentOS 7下安装Redis
  • 1、安装gcc环境
  • 2、安装wget
  • 3、下载Redis源码包
  • 4、解压redis-4.0.1.tar.gz安装包,并编译。
  • 5、安装
  • 6、从解压包文件中复制redis.conf文件到安装目录
  • 7、运行Redis(前台运行模式)
  • 8、后台运行Redis
  • 9、关闭reids
  • 11、设置redis密码
  1. DEVOPS

部署Redis集群

Previousdocker-compose部署 简单nsq 集群Nextzookeeper安装及使用

Last updated 5 years ago

两种方式安装Redis

使用Docker Compose部署基于Sentinel的高可用Redis集群

本文将介绍如何利用Docker Compose模板在本机和云端部署基于Sentinel的高可用Redis 3集群。

Redis集群可以在一组redis节点之间实现高可用性和sharding。今天我们重点围绕master-slave的高可用模式来进行讨论,在集群中会有1个master和多个slave节点。当master节点失效时,应选举出一个slave节点作为新的master。然而Redis本身(包括它的很多客户端)没有实现自动故障发现并进行主备切换的能力,需要外部的监控方案来实现自动故障恢复。

Redis Sentinel是官方推荐的高可用性解决方案。它是Redis集群的监控管理工具,可以提供节点监控、通知、自动故障恢复和客户端配置发现服务。

今天我们的部署模型是 介绍的实例二,也是实战中比较常见的一种部署模式:

14692659415657

单机部署Redis集群

下面的测试需要本地环境已经安装Docker Engine和Docker Compose,推荐使用Docker for Mac/Windows。想在云端部署的同学可以直接跳到下一节

下载代码

git clone https://github.com/AliyunContainerService/redis-cluster
cd redis-cluster

目录下面的docker-compose.yml模板定义Redis集群的服务组成

master:
  image: redis:3
slave:
  image: redis:3
  command: redis-server --slaveof redis-master 6379
  links:
    - master:redis-master
sentinel:
  build: sentinel
  environment:
    - SENTINEL_DOWN_AFTER=5000
    - SENTINEL_FAILOVER=5000    
  links:
    - master:redis-master
    - slave

在模板中定义了下面一系列服务

  • master: Redis master

  • slave: Redis slave

  • sentinel: Redis Sentinel

其中sentinel服务的Docker镜像是由 "./sentinel" 目录中的Dockerfile构建完成,只是在官方Redis镜像上添加了sentinel.conf配置文件,并以sentinel模式启动容器。其配置文件如下,其中包含了sentinel对名为"mymaster"的集群的监控配置:

sentinel monitor mymaster redis-master 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 5000

细节请参见sentinel.conf配置自身。

注意:

  • slave和sentinel容器初始化配置的Redis master节点主机名为"redis-master",这里我们利用了Docker容器连接的别名机制来连接master和sentinel/slave容器实例

  • 由于我们会部署3个Sentinel,我们把sentinel的"quorum"设置为2,只有两个sentinel同意故障切换,才会真正切换相应的redis master节点。

下面我们先构建 sentinel 服务所需 Docker image

docker-compose build

一键部署并启动Redis集群

docker-compose up -d

这时我们可以检查集群状态,应该是包含3个容器,1个master, 1个slave,和1个sentinel

docker-compose ps

显示结果如下

         Name                        Command               State          Ports        
--------------------------------------------------------------------------------------
rediscluster_master_1     docker-entrypoint.sh redis ...   Up      6379/tcp            
rediscluster_sentinel_1   docker-entrypoint.sh redis ...   Up      26379/tcp, 6379/tcp 
rediscluster_slave_1      docker-entrypoint.sh redis ...   Up      6379/tcp     

我们可以伸缩sentinel的实例数量到3个

docker-compose scale sentinel=3

伸缩slave的实例数量到2个,这样我们就有3个redis实例了(包含一个master)

docker-compose scale slave=2

检查集群状态,结果如下

docker-compose ps

         Name                        Command               State          Ports        
--------------------------------------------------------------------------------------
rediscluster_master_1     docker-entrypoint.sh redis ...   Up      6379/tcp            
rediscluster_sentinel_1   docker-entrypoint.sh redis ...   Up      26379/tcp, 6379/tcp 
rediscluster_sentinel_2   docker-entrypoint.sh redis ...   Up      26379/tcp, 6379/tcp 
rediscluster_sentinel_3   docker-entrypoint.sh redis ...   Up      26379/tcp, 6379/tcp 
rediscluster_slave_1      docker-entrypoint.sh redis ...   Up      6379/tcp            
rediscluster_slave_2      docker-entrypoint.sh redis ...   Up      6379/tcp            

我们可以利用下面的测试脚本来模拟master节点失效,并验证Redis集群的自动主从切换。

./test.sh

这个测试脚本实际上利用 docker pause 命令将 Redis master容器暂停,sentinel会发现这个故障并将master切换到其他一个备用的slave上面。

执行结果如下

Redis master: 172.17.0.2
Redis Slave: 172.17.0.3
------------------------------------------------
Initial status of sentinel
------------------------------------------------
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.17.0.2:6379,slaves=2,sentinels=3
Current master is
172.17.0.2
6379
------------------------------------------------
Stop redis master
rediscluster_master_1
Wait for 10 seconds
Current infomation of sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.17.0.3:6379,slaves=2,sentinels=3
Current master is
172.17.0.3
6379
------------------------------------------------
Restart Redis master
rediscluster_master_1
Current infomation of sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.17.0.3:6379,slaves=2,sentinels=3
Current master is
172.17.0.3
6379

我们可以利用Docker Compose方便地在本地验证Redis集群的部署和故障恢复,但是这还不是一个分布式的高可用部署。我们下面会利用阿里云容器服务来进行验证

云端部署高可用Redis集群

首先您需要创建一个包含至少三个节点的集群(否则您需要注释掉相应的"affinity:service"部署约束)

然后我们利用下面的 docker compose模板部署高可用Redis集群

master:
  image: redis:3
  environment:
    - affinity:service!=slave
  restart: always
slave:
  image: redis:3
  command: redis-server --slaveof redis-master 6379
  environment:
    - affinity:service!=master
    - affinity:service!=slave
  labels: 
    aliyun.scale: "2"
  restart: always
  links:
    - master:redis-master
sentinel:
  image: registry.aliyuncs.com/acs-sample/redis-sentinel:3
  environment:
    - affinity:service!=sentinel
  labels: 
    aliyun.scale: "3"
  restart: always
  links:
    - master:redis-master
    - slave

这里使用了预编译的sentinel镜像"registry.aliyuncs.com/acs-sample/redis-sentinel:3"

更重要是,引入了一些阿里云扩展使得对分布式应用更好地控制容器在宿主机节点的部署

  • aliyun.scale 标签:描述了服务的实例数量

  • affinity:service 环境变量描述了服务的部署约束:比如对于Redis slave而言,我们不希望在一个宿主机节点上同时部署master和slave,或多个slave,我们可以方便用示例中的方法描述这些约束。

一键部署之后,我们就已经有一个真正高可用的Redis集群了

  1. 在这里master和2个slave部署到不同的宿主机节点中

  2. 3个sentinel部署到不同的宿主机节点中 这样任何一个宿主机节点失效,都不会导致Redis集群失败

总结

文章介绍了如何在本地部署一个Redis集群,并利用Redis Sentinel实现自动化的主从切换。并在此基础上利用阿里云容器服务扩展,一键部署一个真正的高可用分布式Redis集群。

对于Redis而言,阿里云提供了云数据库 Redis 版,对于大部分对SLA有要求的客户我们建议在生产环境使用Redis云服务。但是如果大家对版本、配置有特殊要求的时候,使用Docker部署Redis也是非常方便的。

出于性能考虑,在Docker容器中运行Redis不建议采用bridge网络对外提供访问,如需对外部VM或应用提供服务建议采用host网络模式,并注意安全保护;如果只是对集群中容器提供redis访问,则容器服务默认提供的跨宿主机容器网络会提供优化而安全的网络配置。同时建议在Docker容器设置中,给Redis容器配置合适的内存设置。

方式二

1、安装gcc环境

sudo yum install gcc-c++

2、安装wget

sudo yum install wget

3、下载Redis源码包

wget  http://download.redis.io/releases/redis-4.0.1.tar.gz
wget http://download.redis.io/releases/redis-2.8.17.tar.gz (试验安装可用)

4、解压redis-4.0.1.tar.gz安装包,并编译。

tar xzf redis-2.8.17.tar.gz 

cd redis-4.0.1 

make

注意:如果在make过程中出现报错问题,那么就是由于gcc的环境安装有问题,请检查从新安装gcc环境。

5、安装

make PREFIX=/usr/local/redis install

Redis里面的bin目录结构

  • redis-benchmark 性能测试工具

  • redis-check-aof 文件修复工具

  • redis-check-rdb rdb文件检查工具

  • redis-cli 命令行客户端

  • redis-server redis启动命令

6、从解压包文件中复制redis.conf文件到安装目录

cp redis.conf /usr/local/redis

7、运行Redis(前台运行模式)

redis-server

8、后台运行Redis

A、打开redis.conf文件

sudo vim redis.conf

B、修改配置文件

C、将no改为yes

D、保存文件并退出

按下ESC键,输入

:wq

E、后台启动

./bin/redis-server ./redis.conf

F、检查redis进程是否已经启动

ps -ef | grep -i redis

9、关闭reids

  • 方式1:杀死redis进程

    kill -9 进程id
  • 方式2:正常关闭

    sudo ./bin/redis-cli shutdown

所以要解决此问题,可以使用kill方式杀死进程,然后在使用sudo方式启动redis

10.生产使用,使用systemctl管理

cd /etc/systemd/system

[Unit]
Description=Redis
After=network.target

[Service]
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf  --daemonize no
ExecStop=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown

[Install]
WantedBy=multi-user.target

11、设置redis密码

A、使用vim打开redis.conf文件

sudo vim redis-conf

B、找到#requirepass foobared去掉注释

C、将foobared改为自己的密码,我在这里改为requirepass 123456

D、然后保存,重启服务

转载:https://www.linuxidc.com/Linux/2017-09/147198.htm

本文所有示例代码都可以从 获得

本文采用的Redis镜像全部基于Docker提供的

在兼容Docker Compose编排模板的基础上,做了大量的扩展。能够更好地帮助我们在Docker集群中部署分布式应用。

关于这些的详尽解释请参见

14692757591755

原文文章:

注意:安装命令执行完毕后会有如下目录

bin目录结构
拷贝redis.conf文件
运行redis
打开redis.conf
修改配置文件
将no改为yes

正常关闭

注意:当以非root权限启动的reids,那么是无法用shutdown进行关闭的。它会报如下错误

vim redis.service

https://github.com/AliyunContainerService/redis-cluster
Redis官方镜像3.2.1
阿里云容器服务
帮助文档
https://yq.aliyun.com/articles/57953
CentOS 7下安装Redis
Redis Sentinel
redis安装后目录效果
杀死redis进程
redis报错
复制代码
复制代码