目录
redis主从是读写分离模式,哨兵模式是为了主节点宕机时进行主备切换。主从和哨兵可以解决高可用,高并发,但有海量数据存储问题,高并发写问题,因为每个redis容量不能太大,否则rdb做快照的时候会有性能影响。分片集群模式解决了前两者所遇到的问题。
我们在一台虚拟机上搭建一主两从的redis,redis版本选择6。它们的端口分别是主节点7001,从节点7002,7003。192.168.88.131是本机的ip地址。
主从模式
redis的目录是/usr/local/redis,在这个目录下新建3个目录,分别是7001,7002,7003。
然后把/usr/local/redis/redis.conf配置文件拷贝到7001,7002,7003这三个目录下。
然后在这三个目录的配置文件中修改 port 分别为7001,7002,7003,然后 bind 都为 0.0.0.0。
然后在3个终端分别启动 redis-server 7001/redis.conf,redis-server 7002/redis.conf,redis-server 7003/redis.conf。
这时候再新建一个终端,redis-cli -p 7002,执行replicaof 192.168.88.131 7001,
redis-cli -p 7003,执行replicaof 192.168.88.131 7001,
这时候7002,7003就是7001的从节点了。
redis-cli -p 7003运行info replication,可以看到有两个连接。ps:因为后面做了sentinel集群,主节点被修改为了7003。
哨兵模式
哨兵模式是在主从模式的基础上增加哨兵集群监视主节点,当主节点宕机时,它会从该主节点的从节点中选择offset最大的节点作为新的主节点,如果offset最大的节点有多个,它会选择id最大的一个节点作为新的主节点。offset是增量备份中的一个概念,当replica Id相同时,会在一个环形数组进行增量备份,类似于检查点机制。
哨兵节点有三个,它们的端口是27001,27002,27003,分别对应/usr/local/redis新增的 s1,s2,s3这三个目录,再把端口做一下修改就行。
port 27001
sentinel announce-ip "192.168.88.131"
sentinel monitor mymaster 192.168.88.131 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 6000
dir "/usr/local/redis"
然后我们杀死7001的主节点,发现sentinel的打印日志如下
7002的终端打印如下:
7003的终端打印如下
7003已经是主节点了。7001也被sentinel修改为从节点。
重启7001节点后,它从7003使用rbd的方式进行了全量同步
分片集群模式
分片集群有多个master节点,每个master可以有多个slave节点,master之间可以通过ping来监控彼此的监控状态,客户端可以访问集群中的任意节点,最终都会被路由转发到正确的节点。
分片集群配置:
在/tmp目录下新建7001,7002,7003,8001,8002,8003这6个目录,前3个为主节点,后三个依次是前三个的从节点。下面是7001节点的配置信息,即/tmp/7001/redis.conf文件,其余的5个配置文件值需要修改一下端口号和对应目录即可。
port 7001
cluster-enabled yes
cluster-config-file /tmp/7001/nodes.conf
cluster-node-timeout 5000
dir /tmp/7001
bind 0.0.0.0
daemonize yes
replica-announce-ip 192.168.88.131
protected-mode no
databases 1
logfile /tmp/7001/run.log
在/tmp目录下执行 printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf。使用 ps -ef | grep redis,每个节点都是cluster类型的。
使用如下命令创建集群
redis-cli --cluster create --cluster-replicas 1 192.168.88.131:7001 192.168.88.131:7002 192.168.88.131:7003 192.168.88.131:8001 192.168.88.131:8002 192.168.88.131:8003
分片集群就配置好了。
redis-cli -p 7001 cluster nodes 可以查看redis的集群状态
redis会把所有master节点映射到0到16383号插槽里,key会被计算hash值,对16384取模,得到映射的slot,所以key和slot是绑定的。也可以控制key的有效部分让key和某个插槽进行绑定。
当新增master节点的时候会重新分片。
redis-cli --cluster add-node 192.168.88.131:7004 192.168.88.131:7001 会把7004加入到集群中去,7001这里也可以是7002,7003,只要是集群中的任意一个主节点就行。但是此时7004是没有插槽的,但可以通过 redis-cli --cluster reshard 192.168.88.131:7001 把7001 的插槽移动到7004上。