redis集群(高可用)

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

相关推荐
woshilys20 分钟前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi20 分钟前
SQL注入的那些面试题总结
数据库·sql
建投数据1 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi2 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀2 小时前
Redis梳理
数据库·redis·缓存
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天3 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭3 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
工业甲酰苯胺3 小时前
分布式系统架构:服务容错
数据库·架构
独行soc4 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘