redis的安装
https://mp.csdn.net/console/editor/html/108639018
redis的四种模式 单机版、主从复制、哨兵、以及集群模式,其中单机版不用于生产环境。
主从模式(master-slaves)的作用
- 做备份数据,这样当一个节点损坏(指不可恢复的硬件损坏)时,数据 因为有备份,可以方便恢复。
- 做负载均衡,所有客户端都访问一个节点肯定会影响 Redis 工作效率,有了主 从以后,查询操作就可以通过查询从节点来完成。
主从模式关于master的读写,和slaves的读:
- 一个 Master 可以有多个 Slaves
- 默认配置下,master 节点可以进行读和写,slave 节点只能进行读操作,写操作被禁止 不要修改配置让 slave 节点支持写操作,没有意义,原因如下
- slave 写入的数据不会被同步到其 他节点
- 当 master 节点修改同一条数据后,slave 节点的数据会被覆盖掉
- slave 节点挂了不影响其他 slave 节点的读和 master 节点的读和写,重新启动后会将数 据从 master 节点同步过来
- master 节点挂了以后,不影响 slave 节点的读,Redis 将不再提供写服务,master 节点 启动后 Redis 将重新对外提供写服务
- master 节点挂了以后,不会从slave中重新选一个作为master
redis的主从配置
- 创建一个目录存放主从配置的文件信息
mkdir master-slave
- 做1个主机master,2个从机,总共3台机器
mkdir redis1 redis2 redis3
- 此处使用的是redis-5.0.4版本, 将redis-5.0.4/src/redis-server 分别拷贝到 上述 redis1 redis2 redi3
cp redis-5.0.4/src/redis-server master-slave/redis1/ cp redis-5.0.4/src/redis-server master-slave/redis2/ cp redis-5.0.4/src/redis-server master-slave/redis3/
- 分别在redis1 redis2 redis3 里面建立 redis.conf
redis.conf
#绑定任意ip地址 bind 0.0.0.0 #绑定端口 -- master port port 8001 #log文件 logfile "8001.log" #数据库 dbfilename "dump-8001.rdb" #设置后台启动 daemonize yes rdbcompression yes
将上述的redis.conf文件,分别放入 redis1 redis2 redi3 , 其中redis1下的conf文件为 8001, redis2 下为8002,redis3下为8003
- 将redis-cli 拷贝到 master-slave 下
root@qb:/usr/local/redis/master-slave# cp /usr/local/bin/redis-cli ../
- 自己写一个start.sh脚本,放在master-slave下, 分别去启动 上述3个redis (一个是 master , 2个slave)
start.sh
#! /bin/bash cd redis1 ./redis-server redis.conf & cd ../redis2 ./redis-server redis.conf & cd ../redis3 ./redis-server redis.conf & cd ../
- 启动start.sh
验证效果,在redis1 master 所在8001的端口上设置一个key,如 set name xiaozhu,可以在8002,8003的slave中读取name的值
主从模式下,从机是不能写的,只能读
主从模式的缺点
- master 节点挂了以后,redis 就不能对外提供写服务了,因为剩下的 slave 不能成为 master
这个缺点影响是很大的,尤其是对生产环境来说,是一刻都不能停止服务的,所以一般 的生产坏境是不会单单只有主从模式的,所以我们来看看哨兵模式
哨兵模式(redis sentinel)的作用
redis Sentinel 的主要功能包括主节点存活检测、主从运行情况检测、自动故障转移(failover)、 从切换。Redis 的 Sentinel 最小配置是一主一从。 Redis 的 Sentinel 系统可以用来管理多 Redis 服务器,该系统可以执行以下四个任务:
- 监控
Sentinel 会不断的检查主服务器和从服务器是否正常运行
- 通知
当被监控的某个 Redis 服务器出现问题,Sentinel 通过 API 脚本向管理员或者其他的应用 程序发送通知。
- 自动故障转移
当主节点不能正常工作时,Sentinel 会开始一次自动的故障转移操作,它会将与失效主节点 是主从关系的其中一个从节点升级为新的主节点, 并且将其他的从节点指向新的主节点。
- 配置提供者
在 Redis Sentinel 模式下,客户端应用在初始化时连接的是 Sentinel 节点集合,从中获取主 节点的信息
redis sentinel工作流程
Sentinel 是 Redis 的高可用性解决方案:
由一个或多个 Sentinel 实例组成的 Sentinel 系统可以监视任意多个主服务器,以及所有从 服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器 升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
- Sentinel 负责监控集群中的所有主、从 Redis,当发现主故障时,Sentinel 会在所有选 一个成为新的主,。并且会把其余的从变为新主的从
- 同时那台有问题的旧主也会变为新主的 从,也就是说当旧的主即使恢复时,并不会恢复原来的主身份,而是作为新主的一个从
redis的哨兵模式配置
- 复制上述目录master-slave,命名为 sentinel
cp -rf master-slave sentinel
- 进入sentinel目录,将 redis1 redis2 redis3 中的 redis.conf文件的端口分别改成 9001 , 9002 ,9003,如
cd sentinel/redis1 vim redis.conf
例如修改redis1 中的 redis.conf
bind 0.0.0.0 port 9001 logfile "9001.log" dbfilename "dump-9001.rdb" daemonize yes rdbcompression yes
- 将redis自带的 redis-sentinel 可执行程序拷贝到 redis1 redis2 redis3的目录下
root@qb:/usr/local/redis/sentinel#cp ../redis-5.0.4/src/redis-sentinel redis1/ root@qb:/usr/local/redis/sentinel#cp ../redis-5.0.4/src/redis-sentinel redis2/ root@qb:/usr/local/redis/sentinel#cp ../redis-5.0.4/src/redis-sentinel redis3/
- 将redis的 sentinel.conf 配置文件 拷贝到 redis1 redis2 redis3的目录下
root@qb:/usr/local/redis/sentinel# cp ../redis-5.0.4/sentinel.conf redis1/ root@qb:/usr/local/redis/sentinel# cp ../redis-5.0.4/sentinel.conf redis2/ root@qb:/usr/local/redis/sentinel# cp ../redis-5.0.4/sentinel.conf redis3/
- 修改redis1 redis2 redis3 下对应的 sentinel.conf ,设置 sentinel 的监控自身的端口为19001,且监控其他的master和slaves
root@qb:/usr/local/redis/sentinel# cd redis1/ root@qb:/usr/local/redis/sentinel/redis1# vim sentinel.conf 修改 sentinel.conf 内容如下 port 19001 sentinel monitor mymaster 192.168.1.8 9001 2
- 修改start.sh启动脚本如下
#! /bin/bash cd redis1 ./redis-server redis.conf & cd ../redis2 ./redis-server redis.conf & cd ../redis3 ./redis-server redis.conf & cd ../ cd redis1 ./redis-sentinel sentinel.conf & cd ../redis2 ./redis-sentinel sentinel.conf & cd ../redis3 ./redis-sentinel sentinel.conf & cd ..
启动脚本, ./start.sh
redis客户端程序 通过端口 19001 连接 :redis-cli -p 19001
连接后敲入 命令查看 当前master是哪一台:sentinel master mymaster
root@qb:/usr/local/redis/sentinel# redis-cli -p 19001 127.0.0.1:19001> sentinel master mymaster 1) "name" 2) "mymaster" 3) "ip" 4) "192.168.1.8" 5) "port" 6) "9001" 7) "runid" 8) "56ae061d6377f8c6b97f2291cf56496f4e20bbc5" 9) "flags" 10) "master" 11) "link-pending-commands" 12) "0" 13) "link-refcount" 14) "1" 15) "last-ping-sent" 16) "0" 17) "last-ok-ping-reply" 18) "709" 19) "last-ping-reply" 20) "709" 21) "down-after-milliseconds" 22) "30000" 23) "info-refresh" 24) "8640" 25) "role-reported" 26) "master" 27) "role-reported-time" 28) "28748" 29) "config-epoch" 30) "0" 31) "num-slaves" 32) "2" 33) "num-other-sentinels" 34) "0" 35) "quorum" 36) "2" 37) "failover-timeout" 38) "180000" 39) "parallel-syncs" 40) "1" 127.0.0.1:19001>
sentinel 模式基本可以满足一般生产的需求,具备高可用性。
在 Redis 高可用架构中,由于主和从切换角色这个过程比较复杂, 往往不是只有一个,而是有 3 个或者以上。目的是为让 其更加可靠,
当数据量过大到一 台服务器存放不下的情况时,主从模式或 sentinel 模式就不能满足需求了,这个时候需要 对存储的数据进行分片,将数据存储到多个 Redis 实例中,接下来我们看看集群
redis集群(cluster模式)
redis cluster 是 Redis 的分布式解决方案,在 3.0 版本推出后有效地解决了 redis 分布式 方面的需求。
自动将数据进行分片,每个 master 上放一部分数据。提供内置的高可用支持, 部分 master 不可用时,还是可以继续工作的支撑 N 个 redis master node,每个 master node 都可以挂载多个 slave node 高可用,因为每个 master 都有 salve 节点,
那么如果 mater 挂掉,redis cluster 这套机制,就会自动将某个 slave 切换成 master
redis集群模式配置
- 创建目录redis-cluster
root@qb:/usr/local/redis# mkdir redis-cluster/
- 创建 redis01 --- redis06
root@qb:/usr/local/redis/redis-cluster# mkdir redis01 redis02 redis03 redis04 redis05 redis06
- 将redis-server 和 redis默认的 redis.conf 拷贝到 redis01 --- redis06
root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/src/redis-server redis01/ root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/src/redis-server redis02/ root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/src/redis-server redis03/ root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/src/redis-server redis04/ root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/src/redis-server redis05/ root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/src/redis-server redis06/ root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/redis.conf redis06/ root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/redis.conf redis05/ root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/redis.conf redis04/ root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/redis.conf redis03/ root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/redis.conf redis02/ root@qb:/usr/local/redis/redis-cluster#cp ../redis-5.0.4/redis.conf redis01/
- 修改 redis01 --- redis06 下的 redis.conf,分别修改端口为 7001 -- 7006,ip绑定程自己的ip(我的192.168.1.8),打开cluster 配置
例如,redis01下的redis.conf配置
bind 192.168.1.8 port 7001 cluster-enabled yes
- 拷贝 redis-cli 和 start.sh 到 目录 redis-cluster
root@qb:/usr/local/redis/redis-cluster# cp ../master-slave/redis-cli ./ root@qb:/usr/local/redis/redis-cluster# cp ../master-slave/start.sh ./
- 修改start.sh ,使用脚本启动redis01 --- redis06
#! /bin/bash cd redis01 ./redis-server redis.conf & cd ../redis02 ./redis-server redis.conf & cd ../redis03 ./redis-server redis.conf & cd ../redis04 ./redis-server redis.conf & cd ../redis05 ./redis-server redis.conf & cd ../redis06 ./redis-server redis.conf & cd ../
- 启动集群
redis-cli --cluster create 192.168.1.8:7001 192.168.1.8:7002 192.168.1.8:7003 192.168.1.8:7004 192.168.1.8:7005 192.168.1.8:7006 --cluster-replicas 1
操作后,可以看到如下效果,则说明集群建好了:
客户端连接进行测试
cluster 的出现是为了解决单机 Redis 容量有限的问题,将 Redis 的数据根据一定的规则 分配到多台机器。
对 cluster 的一些理解: cluster 可以说是 sentinel 和主从模式的结合体,通过 cluster 可以实现主从和 master 重选功能,所以如果配置两个副本三个分片的话,就需要六个 Redis 实例。 因为 Redis 的数据是根据一定规则分配到 cluster 的不同机器的,当数据量过大时,可以 新增机器进行扩容 这种模式适合数据量巨大的缓存要求,当数据量不是很大使用 sentinel 即可。
哨兵模式和redis集群模式的选型
1、使用哨兵模式的情况:如果数据量很少,主要是承载高并发高性能的场景,比如你的缓存一般就几个 G, 单机足够了 replication,一个 mater,多个 slave,要几个 slave 跟你的要求的读吞吐量有关系,然 后自己搭建一个 sentinal 集群,去保证 redis 主从架构的高可用性
2、使用redis cluster的情况:主要是针对海量数据+高并发+高可用的场景,海量数据,数据量很大。