redis集群三种模式
主从复制 奇数 3台 1主2从
哨兵模式 3台 1主2从
cluster集群 6 台 生产中:3 3 3 9台
主从复制
和mysql的主从复制类型相似,主可以写,写入的数据通过RDB方式把数据同步到从服务器。从不能更新主。也是哨兵模式的基础。
缺点:故障自动化恢复,只有主能够写。
主从复制
主节点和从节点
数据的复制是单向的,由主复制到从
主从复制的流程:
从发送sync command请求给主,主的子进程创建RDB文件发送给从。
一旦主从建立,主可以读也可以写,从只能读,进入只读模式
部署主从复制:
192.168.65.11 redis 主
192.168.65.12 从1
192.168.65.13 从2
主
[root@redis1 ~]# systemctl stop firewalld
[root@redis1 ~]# setenforce 0
[root@redis1 ~]# yum -y install ntpdate
[root@redis1 ~]# date
2024年 07月 31日 星期三 09:40:13 CST
[root@redis1 ~]# vim /etc/redis/6379.conf
#修改配置文件
70行改为 0.0.0.0
700行改为 no改yes
#重启配置文件
[root@redis1 ~]# /etc/init.d/redis_6379 restart
#查端口
[root@redis1 ~]# netstat -antp |grep 6379
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 36735/redis-server
tcp 0 0 192.168.65.11:6379 192.168.65.12:36285 ESTABLISHED 36735/redis-server
tcp 0 0 192.168.65.11:6379 192.168.65.13:40291 ESTABLISHED 36735/redis-server
从1与从2
[root@redis2 ~]# systemctl stop firewalld
[root@redis2 ~]# setenforce 0
[root@redis2 ~]# yum -y install ntpdate
[root@redis2 ~]# date
2024年 07月 31日 星期三 09:40:13 CST
[root@redis2 ~]# vim /etc/redis/6379.conf
#修改配置文件
70行改为 0.0.0.0
288行改为 replicaof 192.168.65.11 6379
700行改为 no改yes
#重启配置文件
[root@redis2 ~]# /etc/init.d/redis_6379 restart
#查看端口
[root@redis ~]# netstat -antp |grep 6379
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 56743/redis-server
tcp 0 0 192.168.65.12:36285 192.168.65.11:6379 ESTABLISHED 56743/redis-server
哨兵模式
故障自动化恢复,主从复制完成之后,从服务器变成只读模式。
故障切换时,主故障,变成从服务器,主变成从之后,也会进入只读模式。
缺点:从节点一旦故障,读会受到影响。
哨兵模式流程:
主从之间互相监听,主切换之后变成从自动变成只读模式
切换方式:不是按照权重来进行切换
投票:主宕机,其他服务器投票选举Raft算法。选一个离当前时间点更新最快的从变成主
部署哨兵模式:
[root@redis opt]# cd /opt
[root@redis opt]# cd redis-5.0.7/
[root@redis redis-5.0.7]# vim sentinel.conf
17行 protected-mode no
#关闭保护模式
26行 daemonize yes
36行 logfile "/var/log/sentinel.log"
84行 sentinel monitor mymaster 192.168.65.11 6379 2
#初始化监听都是监听主服务器的状态
#2对应的从服务器的数量以及投票的参与者,参与者要与从服务器的数量一致
#2台服务器投票通过,主才能进行故障转移
112行 sentinel down-after-milliseconds mymaster 30000
#判断服务器宕机的时间周期 30秒 每30秒检测一次
146行 sentinel failover-timeout mymaster 180000
#判断故障节点的超时的最大时间 180秒
[root@redis redis-5.0.7]# redis-sentinel sentinel.conf &
#先启动主再启动从1和从2
[root@redis redis-5.0.7]# redis-cli -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.65.11:6379,slaves=2,sentinels=3
[1]+ 完成 redis-sentinel sentinel.conf
#查看日志投票选举过程和结果
[root@redis ~]# tail -f /var/log/sentinel.log
37401:X 31 Jul 2024 11:15:30.859 * +slave slave 192.168.65.13:6379 192.168.65.13 6379 @ mymaster 192.168.65.11 6379 #投票选了11
37401:X 31 Jul 2024 11:15:30.860 * +slave slave 192.168.65.12:6379 192.168.65.12 6379 @ mymaster 192.168.65.11 6379 #投票选了11
集群
把没两台服务器作为主从模式,形成一个大的主从的集群
解决了写操作的负载均衡。较为完善的高可用方案
缺点:保证高可用,对数据的完整性要求不高。
集群:
redis3.0之后才有的分布式存储方案
集群由多个节点组成的,redis数据保存再这些节点。
集群中的节点分为主和从。
主负责读写以及维护集群的信息
从节点进行主节点数据的复制(从节点也可以查)
redis集群的数据分片
在集群概念中,引用的是hash槽的概念
创建了集群就有16384个哈希槽
0-16383
三个节点:
主1 0-5460
主2 5461-10922
主3 10923-16383
节点当中,如果主和从全部失败,整个集群就不可用了。
集群数据流向:
集群部署
命令:
redis-cli -h 192.168.65.11 --cluster create 192.168.65.11:6379 192.168.65.14:6379 192.168.65.12:6379 192.168.65.15:6379 192.168.65.13:6379 192.168.65.16:6379 --cluster-replicas 1
92.168.65.11 #集群的主连接节点配置节点
--cluster-replicas 1
表示每个主只有一个节点
集群: moved不是报错,只是系统提示客户端到指定为止的哈希槽进行读或者写系统提示啥,你就去哪个节点操作即可 这个节点是该节点的主。
集群的功能只是满足了高可用和写的负载均衡,不能保证数据的完整性。
六台同时操作
关闭防火墙和安全机制
[root@redis ~]# systemctl stop firewalld
[root@redis ~]# setenforce 0
时间同步
[root@redis ~]# yum -y install ntpdate
[root@redis ~]# date
2024年 07月 31日 星期三 11:36:14 CST
[root@redis ~]# vim /etc/redis/6379.conf
70行 #bind 0.0.0.0
#注释掉允许所有
89行 protected-mode no
#把yes改为no
700行 appendonly yes
#把no改为yes
833行 cluster-enabled yes
#把no改为yes
841行 cluster-config-file nodes-6379.conf
#取消注释
847行 cluster-node-timeout 15000
#取消注释
启动redis
[root@redis ~]# /etc/init.d/redis_6379 restart
/var/run/redis_6379.pid does not exist, process is not running
Starting Redis server...
设置主节点和集群的所有地址
[root@redis ~]# redis-cli -h 192.168.65.11 --cluster create 192.168.65.11:6379 192.168.65.14:6379 192.168.65.12:6379 192.168.65.15:6379 192.168.65.13:6379 192.168.65.16:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460 #主1的范围
Master[1] -> Slots 5461 - 10922 #主2的范围
Master[2] -> Slots 10923 - 16383 #主3的范围
Adding replica 192.168.65.13:6379 to 192.168.65.11:6379
Adding replica 192.168.65.16:6379 to 192.168.65.14:6379
Adding replica 192.168.65.15:6379 to 192.168.65.12:6379
M: 126966ea4cd401b38882d73f97825cf538af4d78 192.168.65.11:6379
slots:[0-5460] (5461 slots) master
M: 4669342e87eec727b739331385a236eceb575d18 192.168.65.14:6379
slots:[5461-10922] (5462 slots) master
M: 09b16ac831175058e7c68636f2fb17e55a400281 192.168.65.12:6379
slots:[10923-16383] (5461 slots) master
S: ec588ee10ca715b13e941c0a5fd1a83b0dfb2014 192.168.65.15:6379
replicates 09b16ac831175058e7c68636f2fb17e55a400281
S: 086d26b140213d1e096c0339eec7e965aa4a7659 192.168.65.13:6379
replicates 126966ea4cd401b38882d73f97825cf538af4d78
S: aed04c27795ed15e6329dc9a4ac3aca579d4aae3 192.168.65.16:6379
replicates 4669342e87eec727b739331385a236eceb575d18
Can I set the above configuration? (type 'yes' to accept): yes #写入yes回车
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
..
>>> Performing Cluster Check (using node 192.168.65.11:6379)
M: 126966ea4cd401b38882d73f97825cf538af4d78 192.168.65.11:6379
slots:[0-5460] (5461 slots) master #master就表示为主
1 additional replica(s)
S: ec588ee10ca715b13e941c0a5fd1a83b0dfb2014 192.168.65.15:6379
slots: (0 slots) slave #slave就表示为从
replicates 09b16ac831175058e7c68636f2fb17e55a400281
S: 086d26b140213d1e096c0339eec7e965aa4a7659 192.168.65.13:6379
slots: (0 slots) slave
replicates 126966ea4cd401b38882d73f97825cf538af4d78
S: aed04c27795ed15e6329dc9a4ac3aca579d4aae3 192.168.65.16:6379
slots: (0 slots) slave
replicates 4669342e87eec727b739331385a236eceb575d18
M: 09b16ac831175058e7c68636f2fb17e55a400281 192.168.65.12:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 4669342e87eec727b739331385a236eceb575d18 192.168.65.14:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered. #注意总数是否是16384
进入redis数据库
[root@redis ~]# redis-cli -h 192.168.65.11
192.168.65.11:6379> CLUSTER NODES #查看主从节点是否都生效
126966ea4cd401b38882d73f97825cf538af4d78 192.168.65.11:6379@16379 myself,master - 0 1722405935000 1 connected 0-5460
ec588ee10ca715b13e941c0a5fd1a83b0dfb2014 192.168.65.15:6379@16379 slave 09b16ac831175058e7c68636f2fb17e55a400281 0 1722405936000 4 connected
086d26b140213d1e096c0339eec7e965aa4a7659 192.168.65.13:6379@16379 slave 126966ea4cd401b38882d73f97825cf538af4d78 0 1722405937000 5 connected
aed04c27795ed15e6329dc9a4ac3aca579d4aae3 192.168.65.16:6379@16379 slave 4669342e87eec727b739331385a236eceb575d18 0 1722405937514 6 connected
09b16ac831175058e7c68636f2fb17e55a400281 192.168.65.12:6379@16379 master - 0 1722405938527 3 connected 10923-16383
4669342e87eec727b739331385a236eceb575d18 192.168.65.14:6379@16379 master - 0 1722405938000 2 connected 5461-10922
192.168.65.11:6379> CLUSTER slots #查看值是否被分配完
1) 1) (integer) 0
2) (integer) 5460
3) 1) "192.168.65.11"
2) (integer) 6379
3) "126966ea4cd401b38882d73f97825cf538af4d78"
4) 1) "192.168.65.13"
2) (integer) 6379
3) "086d26b140213d1e096c0339eec7e965aa4a7659"
2) 1) (integer) 10923
2) (integer) 16383
3) 1) "192.168.65.12"
2) (integer) 6379
3) "09b16ac831175058e7c68636f2fb17e55a400281"
4) 1) "192.168.65.15"
2) (integer) 6379
3) "ec588ee10ca715b13e941c0a5fd1a83b0dfb2014"
3) 1) (integer) 5461
2) (integer) 10922
3) 1) "192.168.65.14"
2) (integer) 6379
3) "4669342e87eec727b739331385a236eceb575d18"
4) 1) "192.168.65.16"
2) (integer) 6379
3) "aed04c27795ed15e6329dc9a4ac3aca579d4aae3"
[root@redis13 ~]# redis-cli -h 192.168.65.13
192.168.65.13:6379> get test1
(error) MOVED 4768 192.168.65.11:6379 #提示到11地址上才能查看
[root@redis11 ~]# redis-cli -h 192.168.65.11
192.168.65.11:6379> get test1
"10"
192.168.65.11 redis 主1
192.168.65.12 主2
192.168.65.13 主3
192.168.65.14 从1
192.168.65.15 从2
192.168.65.16 从3