欢迎关注刘哥讲技术。上一节我们讲到通过docker安装了多台的mysql,很简单,那么我们这一节,利用 Docker 在一台机器上部署多个 Redis 实例。
那么redis是什么呢?Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 的 NoSQL 数据库,并提供多种语言的 API。
现在分布式缓存首选的应用,面试也基本离不开它,一起来学习学习它吧。
一、单机版本Redis
- 1、查看可用的 Redis 版本
访问 Redis 镜像库地址:
https://hub.docker.com/_/redis
此外,我们还可以用命令来查看可用版本。
docker search redis
- 2、取最新版的 Redis 镜像
这里我们获取官方的默认的镜像:
docker pull redis
- 3、查看本地镜像
使用以下命令来查看是否已安装了 redis。
docker images
- 4、运行容器
安装完成后,我们可以使用以下命令来运行 redis 容器
(1)创建挂载目录
创建一个文件夹用来存放redis的配置文件、数据等(也就是所谓的挂载目录,作用就是将此目录中的文件或文件夹覆盖掉容器内部的文件或文件夹)
mkdir -p $HOME/docker/redis
(2)进入到该目录下
cd $HOME/docker/redis
(3)启动redis容器
docker run -d -p 6379:6379 -v $PWD/redis.conf:/usr/local/etc/redis/redis.conf -v $PWD/data:/data --name myredis redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes --requirepass "123456"
参数详解:
- -d:表示后台运行
- -p:表示端口映射,冒号左面的是我们的宿主机的端口,也就是我们虚拟机的端口
- --name:给容器取的名字
- -v:表示挂载路径。
- redis-server --appendonly yes :在容器执行redis-server启动命令,并打开redis持久化配置
- --requirepass 设置redis密码
(4)检测是否安装成功
最后我们可以通过 docker ps 命令查看容器的运行信息
docker ps
(5)查看容器的ip
如果没有指定容器内的ip,每次启动有可能都是会变化的。如果没有指定,那么我们可以通过以下命令来查看ip,然后登陆:
docker inspect myredis | grep IPAddress
我电脑分配的ip为:
"SecondaryIPAddresses": null,"IPAddress": "172.17.0.2","IPAddress": "172.17.0.2",
(6)测试使用redis 服务
可以通过以下连接命令进行连接。
不带密码版本,命令窗口再输入docker exec -ti myredis redis-cli -h 172.17.0.2 -p 6379 -a 123456带密码版本,不用再输入密码docker exec -ti myredis redis-cli -h 172.17.0.2 -p 6379 -a 123456
说明:
- myredis 你设置的容器名字。
- 默认是通过6379端口
- 默认ip为:127.0.0.1
- 一般需要指定获取的ip地址。
(7)测试过程
我这里先通过密码框登陆
docker exec -ti myredis redis-cli -h 172.17.0.2 -p 6379
首先获取一下值,看看是否可以使用,发现提示未认证:(error) NOAUTH Authentication required.
get myname
先输入错误的密码,进行验证,发现提示密码错误:(error) NOAUTH Authentication required.
auth 12345
我们再输入正确的密码,提示ok即可
auth 123456
再次获取值,发现redis存储为空:(nil)
get myname
对name值进行设置
set myname liuge
获取name值
get myname
我们可以通过redis desktop manager 进行连接进行查看。Redis桌面管理器(又名RDM) 是一个用于Windows,Linux和MacOS的快速开源Redis数据库管理应用程序。当然你也可以通过以下方式连接测试:RedisView、WebRedisManager、RedisDesktopManager、RedisPlus、AnotherRedisDesktopManager、FastoRedis。
小结:
如果你是简单实用,那么上面就能满足日常测试,学习redis命令等应用了。
但是,有时候还需要另外一台作为比较正式或者其他用,还是需要再搭建一台。
在windows那时候,我是通过修改配置文件,然后通过启动脚本,重新启动一份,比较折腾,有了docker,这个比较好解决。
如果有这个需求,可以接下来的教程。
二、多台Redis共存的情况
(1)创建挂在目录
data存放数据,conf存放配置文件。
mkdir -p $HOME/docker/redis2
(2)进入该目录
cd $HOME/docker/redis2
(3)启动redis容器
docker run -d -p 6388:6379 -v $PWD/redis.conf:/usr/local/etc/redis/redis.conf -v $PWD/data:/data --name myredis2 redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes --requirepass "redispassword"
(4)检测是否安装成功
最后我们可以通过 docker ps 命令查看容器的运行信息
docker ps
(5)查看容器的ip
docker inspect myredis2 | grep IPAddress
目前电脑的redis的ip为
"SecondaryIPAddresses": null,"IPAddress": "172.17.0.4","IPAddress": "172.17.0.4",
(6)测试使用redis 服务
可以通过以下连接命令进行连接,myredis你设置的容器名字。
docker exec -it myredis2 redis-cli
输入密码
docker exec -it myredis2 redis-cli
三、搭建Redis集群
对于大多数中小公司来说,通常单机的Redis已经足够,最多根据不同业务分散到多台Redis。
为什么需要集群呢?
- Redis单线程特性,多请求顺序执行,单个耗时的操作会阻塞后续的操作
- 单机内存有限
- 某些特殊业务,带宽压力较大
- 单点问题,缺乏高可用性
- 不能动态扩容
- Redis集群的目标就是为了实现高可用性,避免性能瓶颈,可动态扩容,易于做监控告警。
那么接下来,我们看下如何进行安装。
我这里是通过一个比较快捷的方案,是一个开源的redis集群镜像来搭建。
集群是6个Redis实例,其中运行3个主节点和3个从节点,每个主节点一个从节点。它们在端口7000到7005上运行。接下来我们看看如何搭建:
镜像地址
源码
https://github.com/Grokzen/docker-redis-cluster仓库地址
https://hub.docker.com/r/grokzen/redis-cluster/
拉取镜像
docker pull grokzen/redis-cluster
通过这个镜像可以快速轻松地启动和运行Redis集群,用于演示/演示/开发。注意生产环境没经过严格验证,还不推荐直接使用。
docker run -e "IP=0.0.0.0" -e STANDALONE=true -e SENTINEL=true -d grokzen/redis-cluster:latest
参数说明
- -e "IP=0.0.0.0" 将内部IP环境变量添加到docker run命令中。使用此容器在Mac计算机上运行Redis集群,则需要将容器配置为使用另一个IP地址进行集群发现,因为它无法使用硬编码到容器中的默认发现IP。
- -e SENTINEL=true 默认情况下,未启用Sentinel实例。表示启用哨兵实例。如果-e "STANDALONE=true"通过该标志,则默认情况下在端口7006和7007上运行2个独立实例。但是,您可以将此变量设置为所需的多个独立节点,例如-e "STANDALONE=1"。请注意,独立端口在最后一个从属设备之后立即启动。如果-e "SENTINEL=true"传递了该标志,则在与群集的主实例匹配的端口5000到5002上运行3个Sentinel节点。
查看容器的ip
docker inspect distracted_wing | grep IPAddress
测试
docker exec -ti distracted_wing redis-cli -p 7000
(error) MOVED 原因和解决方案
错误:
(error) MOVED 6918 127.0.0.1:7001
这种情况一般是因为redis-cli连接redis服务时候,没有指定是集群模式连接。启动时使用-c参数来启动集群模式,命令如下:
docker exec -ti distracted_wing redis-cli -c -p 7000
查看集群信息
cluster info
查看节点信息
cluster nodes
后面有时间再分享,如何通过redis源码自己构建一个docker redis 集群镜像。