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的情况:主要是针对海量数据+高并发+高可用的场景,海量数据,数据量很大。