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"
在一台服务器上做实验的注意点
需要让容器间可以相互访问,好像需要在防火墙上开启对应的端口号;但是不建议这样搞,只是实验可以试哈,实际使用不要这样弄(因为这样的集群没有意义)。
在一台机器上做的话,就像需要使用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的更多相关文章
- 在CentOS上通过Docker方式安装Redis
在CentOS上通过Docker方式安装Redis 首先保证已经安装docker. 拖拽redis镜像 docker pull redis 启动redis docker run -p 6379:637 ...
- 在window上安装redis
redis没有官方的windows版本,如果需要在windows安装可以下载由微软维护的redis(https://github.com/MicrosoftArchive/redis). 在这里我们采 ...
- Redis简介以及如何在Windows上安装Redis
Redis简介 Redis是一个速度非常快的非关系型内存数据库. Redis提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erla ...
- 在VMware的Linux系统上安装Redis
在VMware的Linux系统上安装Redis 具体过程如下: 下载,解压和编译: 在执行make的时候报错,具体报错信息如下: zmalloc.o: In function `zmalloc_use ...
- linux上安装redis的踩坑过程2
昨天在linux上安装redis后马上发现了其它问题,服务器很卡,cpu使用率上升,top命令查看下,原来有恶意程序在挖矿,此程序入侵了很多redis服务器,马上用kill杀掉它 然后开始一些安全策略 ...
- 在windows上安装redis并设置密码
在windows上安装redis Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案. Redis从它的许多竞争继承来的三个主要特点: Redi ...
- win上安装Redis并将其设置为服务
win上安装Redis并将其设置为服务 redis下载地址:https://redis.io/ 或者在下面的地址下载 https://github.com/zhangxy1035/redisDownl ...
- Ubantu上安装Redis
Ubantu上安装Redis:Redis(Remote Dictionary Server):远程字典服务器,简称REDIS;Redis数据库产品用C语言编写而成,开源.少量数据存储.高速读写访问,是 ...
- docker上构建redis容器
1.查看docker上的镜像 [root@holly ~]# docker images 2.搜索docker上的redis镜像,选择下载的版本 [root@holly ~]# docker sear ...
随机推荐
- js code review
js code review https://codereview.stackexchange.com/ refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只 ...
- SVG in Action
SVG in Action HTML5 semantic HTML5 Semantic Elements / HTML5 Semantic Tags figure object <figure& ...
- github & webhooks
github & webhooks git auto commit bash shell script https://developer.github.com/webhooks/ POST ...
- css social media
css social media https://realfavicongenerator.net/ https://css-tricks.com/favicon-quiz/ <!DOCTYPE ...
- DeFi热下的冷思考 NGK以更深层次的方式参与DeFi建设
独具慧眼,深度挖掘DeFi潜力项目 作为早期DeFi的探索者和推动者,NGK在此轮热潮席卷市场前就已经开始构建自己的DeFi生态,独具慧眼的NGK上线了Baccarat流动性挖矿项目,完成了首个由平台 ...
- 适合Linux嵌入式项目的代码构建与依赖管理工具——cazel
前言 我们知道,现在有很多流行的优秀代码构建工具,如CMake.jetkins.bazel等.这些不同的构建工具在其应用的领域起到了举足轻重的作用. 但是,如果仔细研究就会发现,在嵌入式领域,构建工具 ...
- Elasticsearch简介、倒排索引、文档基本操作、分词器
lucene.Solr.Elasticsearch 1.倒排序索引 2.Lucene是类库 3.solr基于lucene 4.ES基于lucene 一.Elasticsearch 核心术语 特点: 1 ...
- Java自学第6期——Collection、Map、迭代器、泛型、可变参数、集合工具类、集合数据结构、Debug
集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. 数组中存储的是同一类型的元素,可以存储基本数据类型值. ...
- java中是否存在i+1<i?
存在! 首先我们知道int的取值范围是: -2147483648~2147483647,最高位为符号位 2147483647的二进制为:01111111 11111111 11111111 11111 ...
- FTPClient类的API
org.apache.commons.NET.ftp Class FTPClient类FTPClient java.lang.Object java.lang.Object继承 org.apache. ...