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。