Docker安装Redis

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"

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

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

配置redis集群

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

docker exec -it redis-rw redis-cli

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

现在我们将redis-c1这个容器作为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/redis.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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容