Docker可以很方便的进行服务部署和管理,下面我们通过docker来搭建Redis的单机模式、Redis主从复制、Redis哨兵模式、Redis-Cluster模式

一、在Docker上安装单机版Redis

首先需要先在服务器上安装docker Docker安装教程Docker命令快速入门

拉取镜像

docker pull redis

启动Redis

docker run -d  -v $PWD/data:/data --name redis -p 6379:6379 redis redis-server --requirepass "123456" --appendonly yes

启动命令说明:

  • $PWD/data:/data : 映射redis的data目录到当前目录下的data目录
  • --requirepass : 是设置redis的密码
  • --appendonly yes : 启用持久化存储

例如:

docker run -d  -v /home/app/redis/data:/data --name redis -p 6379:6379 redis  redis-server --requirepass "123456" --appendonly yes

如果需要使用配置文件,则需要做个文件映射;注意所在目录下必须要有redis.conf这个文件,否则将启动失败。

docker run -d  -v /home/app/redis/data:/data  -v /home/app/redis/conf:/usr/local/etc/redis --name redis -p 6379:6379 redis redis-server /usr/local/etc/redis/redis.conf

redis的这个配置文件可以到官方的这个地址上去获取 http://download.redis.io/redis-stable

启动成功连接失败的问题

  • 如果是阿里云 或者是腾讯云 这些云服务器;那么还需要配置安全组,将redis的连接端口6379开放,否则将无法连接。
  • 服务器开启了防火墙;这种情况需要使用命令让防火墙打开端口;注意启动或关闭防火墙后docker也需要重启才能生效;下面是常用命令:
# 查看防火墙状态
systemctl status firewalld
# 禁用防火墙
systemctl disable firewalld
# 开启防火墙
systemctl start firewalld
# 关闭防火墙
systemctl stop firewalld
# 查看已开启的端口
firewall-cmd --zone=public --list-ports
# 添加端口
firewall-cmd --zone=public --add-port=9876/tcp --permanent
firewall-cmd --reload
  • 其他情况:启动有错误,查看启动日志;redis绑定了端口,导致只有本地可以访问;

二、在Docker上搭建Redis主从复制

Redis主从复制模式就是采用读写分离的模式,因为通常读取数据的时候比较多,写入数据的时候少以此来提高性能;但是一旦主节点挂了,整个集群就只能提供读取的服务了,因此缺乏高可用性。

搭建步骤和上面单机版的一样,只是后面需要做相关的集群配置

启动容器

分别在3台服务器上启动redis容器,端口号为6379

mkdir -p /home/app/redis-rw/data
docker run -d -v /home/app/redis-rw/data:/data --name redis-rw -p 6379:6379 redis redis-server --requirepass "123456" --appendonly yes --masterauth "123456"

在一台服务器上做实验的注意点

需要让容器间可以相互访问,好像需要在防火墙上开启对应的端口号;但是不建议这样搞,只是实验可以试哈,实际使用不要这样弄(因为这样的集群没有意义)。

在一台机器上做的话,就像需要使用docker给容器分配的IP;通过如下命令查看容器的IP:

docker inspect 容器ID

里面的IPAddress就是容器的IP;我这里的是如下所示的

redis-c1 172.17.0.2
redis-c1 172.17.0.3
redis-c1 172.17.0.4

配置redis集群

通过docker交互命令登陆redis;为了方便这里直接用容器名称(可以使用容器ID)

docker exec -it redis-rw redis-cli

如果redis设置了认证密码,则登陆进去了使用auth 密码进行认证;然后使用info replication命令查看redis的信息,可以看到都是master节点

现在我们将其中一台服务器作为master节点;因此我们分别登陆到其它的redis容器中执行如下命令(下面的命令就相当于在配置文件中添加相关配置):

# 这里是设置跟随哪台机器
SLAVEOF 192.168.56.102 6379

设置主节点访问密码;由于我们在启动参数上已经设置了--masterauth参数,因此这里就不用再设置

# 由于我们设置了访问密码,因此需要设置主节点的访问密码;否则从节点将无法访问主节点信息
config set masterauth 123456
# 如果是使用配置文件来启动,再加上下面的这条命令将其重新写入配置文件中
config rewrite
# 如果修改或设置密码可以使用这个命令
config set requirepass 密码

如果设置redis密码,就是必须设置masterauth的值;否则将出现这个错误:Master does not understand REPLCONF listening-port: -NOAUTH Authentication required.

三、在Docker上搭建Sentinel模式

文章参考:https://blog.csdn.net/miss1181248983/article/details/90056960

主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel应运而生。

Sentinel即哨兵,它主要是用来监控redis主从节点的运行状态,用于解决在master节点挂了后选举出新的主节点,保证整个集群可以继续提供写数据的能力。

Sentinel模式具有以下特点:

  • sentinel模式是建立在主从模式的基础上,如果只有一个Redis节点,sentinel就没有任何意义;
  • 当master挂了以后,sentinel会在slave中选择一个做为master,其他slave的会指向新的master;
  • 当master重新启动后,它将不再是master而是做为slave接收新的master的同步数据;
  • sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群;
  • 多sentinel配置的时候,sentinel之间也会自动监控;
  • 当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中,不需要担心;
  • 一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis;
  • sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂了;

Sentinel模式的工作机制:

  • 每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令;
  • 如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线;
  • 如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态;
  • 当有足够数量的sentinel(大于等于配置指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线;
  • 在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令;
  • 当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10 秒一次改为 1 秒一次;
  • 若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除;

当使用sentinel模式的时候,客户端就不要直接连接Redis,而是连接sentinel的ip和port,由sentinel来提供具体的可提供服务的Redis实现,这样当master节点挂掉以后,sentinel就会感知并将新的master节点提供给使用者。

开始部署Sentinel模式的Redis集群

现在准备一个主从模式的集群,然后开始搭建Sentinel服务;为了保证高可用我们将Sentinel也是使用集群模式搭建,使用3台服务器来搭建集群,在每台机器上都部署一台。

下载和修改sentinel配置文件

mkdir -p /home/app/redis/conf
cd /home/app/redis/conf
wget http://download.redis.io/redis-stable/sentinel.conf

修改sentinel.conf配置文件

# 配置主节点的信息
sentinel monitor mymaster 192.168.56.105 6379 2
# sentinel的访问地址
requirepass 123456
# 配置主节点的访问密码
sentinel auth-pass mymaster 123456

启动Sentinel

docker run -d -v /home/app/redis-sentinel/data:/data -v /home/app/redis/conf:/usr/local/etc/redis --name redis-sentinel -p 26379:26379 redis redis-sentinel /usr/local/etc/redis/sentinel.conf --appendonly yes

启动成功后就可以直接通过Sentinel的端口进行链接了,Sentinel会返回当前主节点信息

四、在Docker上搭建Redis Cluster模式

我们使用Sentinel模式搭建的redis集群虽然解决了高可用的问题,但是最终也只有一个主节点;

当业务量大的时候会产生如下问题:

  • 并发写的请求增高;
  • 数据量增大;此时需要考虑数据分片存储了;
  • 单个服务器的网卡上限达到瓶颈;

由此单个主从复制就无法满足需求了,因此Redis Cluster模式登场了;

Redis Cluster是分布式架构:即Redis Cluster中有多个节点(主从复制节点),每个节点都负责进行数据读写操作;每个节点之间会进行通信。简单来说就是多个主从复制节点集群提供服务。

集群要求

  • Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。
  • 要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。

部署集群

我们在每台机器上执行如下命令来创建6个redis服务

docker run -d  -v /home/app/redis-cluster/data:/data --name redis-cluster -p 6379:6379 -p 16379:16379 redis redis-server --requirepass "123456" --appendonly yes --masterauth "123456" --cluster-enabled yes

后面这个16379端口使用redis集群间进行数据通讯的端口,它是在你设置的redis访问端口上+10000;

如果向使用配置文件实现可以修改redis.conf配置中集群相关配置即可,获取redis.conf配置:

wget http://download.redis.io/redis-stable/sentinel.conf

在上面的命令需要加上配置文件路径映射,下面是示例命令

docker run -d  -v /home/app/redis-cluster/data:/data  -v /home/app/redis/conf:/usr/local/etc/redis --name redis-c1 -p 6381:6379 -p 16379:16379 redis redis-server /usr/local/etc/redis/redis.conf

下面开始集群的配置,直接使用redis-cli创建集群即可;

docker exec -it redis-cluster /bin/bash
redis-cli --cluster create 192.168.56.101:6379 192.168.56.102:6379 192.168.56.103:6379 192.168.56.104:6379 192.168.56.105:6379 192.168.56.106:6379 --cluster-replicas 1 -a 123456

参数最后加-a是因为我们设置了密码,因此需要加上访问密码;之后输入yes即可。

注意如果在一台机器上搞的docker需要使用host模式的网络连接类型才行,在创建的时候需要使用docker容器的IP;我们通过docker inspect 容器ID命令获取容器的IP。

关注微信订阅号‘起岸星辰’获取最新资讯

Docker上安装Redis的更多相关文章

  1. 在CentOS上通过Docker方式安装Redis

    在CentOS上通过Docker方式安装Redis 首先保证已经安装docker. 拖拽redis镜像 docker pull redis 启动redis docker run -p 6379:637 ...

  2. 在window上安装redis

    redis没有官方的windows版本,如果需要在windows安装可以下载由微软维护的redis(https://github.com/MicrosoftArchive/redis). 在这里我们采 ...

  3. Redis简介以及如何在Windows上安装Redis

    Redis简介 Redis是一个速度非常快的非关系型内存数据库. Redis提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erla ...

  4. 在VMware的Linux系统上安装Redis

    在VMware的Linux系统上安装Redis 具体过程如下: 下载,解压和编译: 在执行make的时候报错,具体报错信息如下: zmalloc.o: In function `zmalloc_use ...

  5. linux上安装redis的踩坑过程2

    昨天在linux上安装redis后马上发现了其它问题,服务器很卡,cpu使用率上升,top命令查看下,原来有恶意程序在挖矿,此程序入侵了很多redis服务器,马上用kill杀掉它 然后开始一些安全策略 ...

  6. 在windows上安装redis并设置密码

    在windows上安装redis Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案. Redis从它的许多竞争继承来的三个主要特点: Redi ...

  7. win上安装Redis并将其设置为服务

    win上安装Redis并将其设置为服务 redis下载地址:https://redis.io/ 或者在下面的地址下载 https://github.com/zhangxy1035/redisDownl ...

  8. Ubantu上安装Redis

    Ubantu上安装Redis:Redis(Remote Dictionary Server):远程字典服务器,简称REDIS;Redis数据库产品用C语言编写而成,开源.少量数据存储.高速读写访问,是 ...

  9. docker上构建redis容器

    1.查看docker上的镜像 [root@holly ~]# docker images 2.搜索docker上的redis镜像,选择下载的版本 [root@holly ~]# docker sear ...

随机推荐

  1. 图片转tfrecords

    import numpy as np import tensorflow as tf import time import os import cv2 from sklearn.utils impor ...

  2. useful life skills website

    useful life skills website 绳子打结技巧 https://www.animatedknots.com/complete-knot-list tools https://tab ...

  3. skills share & free videos

    skills share & free videos 技术分享 & 免费视频 https://www.infoq.cn/video/list WebAssembly https://w ...

  4. 线上 S1 故障是什么, 线上 S1 故障, 运维故障分级, 运维, 故障分级, P1 级别故障, 故障, P1 , S1

    线上 S1 故障是什么 线上 S1 故障, 运维故障分级, 运维, 故障分级, P1 级别故障, 故障, P1 , S1 故障复盘 https://time.geekbang.org/column/a ...

  5. 什么是NGK节点?NGK的节点有什么作用?

    从2018年EOS竞选超级节点火爆整个区块链圈,节点和超级节点就成为了热议的话题,时至今日,热度依然不减.节点是项目生态发展的重要组成部分,超级节点对项目的运行.安全更是起着至关重要的作用.   什么 ...

  6. 为什么 Python 的 f-string 可以连接字符串与数字?

    本文出自"Python为什么"系列,归档在 Github 上:https://github.com/chinesehuazhou/python-whydo 毫无疑问,Python ...

  7. Linux安装MySQL_全网最详细

    Linux安装MySQL 编辑于2021-02-19 本文中MySQL安装目录为/usr/local/mysql 上传MySQL安装包至/usr/local目录,执行命令解压 [root@JetXi ...

  8. sklearn中的pipeline的创建与访问

    前期博文提到管道(pipeline)在机器学习实践中的重要性以及必要性,本文则递进一步,探讨实际操作中管道的创建与访问. 已经了解到,管道本质上是一定数量的估计器连接而成的数据处理流,所以成功创建管道 ...

  9. 02_Mysql用户管理之Navicat下载及安装

    Navicat可以说是最好的Mysql客户端管理软件了,本博客将带你完成Navicat的下载与安装. 1.下载(https://www.navicat.com.cn/products)

  10. springCloud中的服务调用feign

    springCloud中的服务调用(要在调用端写) 前提进行了服务注册 流程: 1.在服务模块中添加依赖 <!--服务调用--> <dependency> <groupI ...