Redis集群模式

目录

一、Redis集群

1.redis简介

2.redis集群的优势

3.redis集群的实现方法

二、Redis三种模式

1.主从复制

2.哨兵模式

3.集群模式

三、主从同步/复制模式

1.主从复制概念

2.主从复制流程

四、哨兵模式(Sentinel)

1.哨兵模式集群架构

2.哨兵模式作用

3.哨兵模式工作过程

4.哨兵模式下的故障迁移

五、Cluster群集

1.Cluster数据分区

2.Cluster高可用

3.Cluster数据分片

六、搭建集群环境

1.搭建主从复制

2.修改Redis配置文件

3. 验证主从效果

4.搭建哨兵模式

5.模拟故障测试

6.搭建Cluster集群

总结


在实际的生产环境中,如果对MySQL数据库的读和写都在一台数据库服务中操作,无论在安全性、高可用性,还是高并发性等各个方面都是完全不能满足实际需求的,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离来提升数据库的并发负载能力这样的方案进行部署与实施。

一、Redis集群

1.redis简介

Redis集群是一个提供在多个Redis间节点间共享数据的程序集。

Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误。

Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令。

2.redis集群的优势

自动分割数据到不同的节点上。

整个集群的部分节点失败戟者不可达的情况下能够继续处理命令。

3.redis集群的实现方法

有客户端分片

代理分片

服务器端分片

二、Redis三种模式

Redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,下面会讲解一下三种模式的工作方式,以及如何搭建Cluster群集。

1.主从复制

主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。

缺陷:故障恢复无法自动化:写操作无法负载均衡:存储能力受到单机的限制。

2.哨兵模式

它一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master 并将所有 slave 连接到新的 Master

缺陷:写操作无法负载均衡:存储能力受到单机的限制,整个运行哨兵的集群的数量不得少于 3 个节点。

3.集群模式

通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。

三、主从同步/复制模式

1.主从复制概念

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

2.主从复制流程

(1)若启动一个Slave机器进程,则它会向Master机器发送一个"sync_command"命令,请求同步连接。

(2)无论是第一次连接还是重新连接,Master机器都会启动一个后台进程,将数据快照(RDB)保存到
数据文件中(执行rdb操作),同时Master还会记录修改数据的所有命令并缓存在数据文件中。

(3)后台进程完成缓存操作之后,Master机器就会向Slave机器发送数据文件,Slave端机器将数据
文件保存到硬盘上,然后将其加载到内存中,接着Master机器就会将修改数据的所有操作一并发送给Slave端机器。若Slave出现故障导致宕机,则恢复正常后会自动重新连接。

(4)Master机器收到slave端机器的连接后,将其完整的数据文件发送给Slave端机几器,如果Mater同时收到多个slave发来的,同步请求则Master会在后台启动一个进程以保存数据文件,然后将其发送给所有的Slave端机器,确保所有的Slave端机器都正常。

四、哨兵模式(Sentinel)

1.哨兵模式集群架构

是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master 并将所有 Slave 连接到新的 Master。所以整个运行哨兵的集群的数量不得少于3个节点。哨兵是Redis集群架构中非常重要的一个组件,哨兵的出现主要是解决了主从复制出现故障时需要人为干预的问题。

2.哨兵模式作用

集群监控:负责监控Redismaster和slave进程是否正常工作。

消息通知:如果某个Redis实例有故障,那么哨兵负责发送消息作为报敬通知给管理员。

故障转移:如果masternode挂掉了,会自动转移到slave node上。

配置中心:如果故障转移发生了,通知client客户端新的master地址。

3.哨兵模式工作过程

(1)三个哨兵之间建立命令连接,周期性检测队友状态。

(2)哨兵会向master节点(已在配置文件中)发送两条连接,分别是命令连接和订阅连接(为了周期性获取master节点的数据)。

(3)哨兵想master周期性发送info命令,master(活着的情况下)会返回redis-cil inforeplication master 节点的信息+从节点位置。

(4)哨兵通过master返回的信息,再会向slaves 节点发送info命令,slaves返回数据,从而哨兵集群就可以获取到redis所有集群信息。

(5)哨兵会向服务器发送命令连接,建立自己的hello频道,哨兵会向这个hello频道建立订阅,用于哨兵之间的消息共享。

4.哨兵模式下的故障迁移

主观下线——哨兵(Sentinel)节点会每秒一次的频率向建立了命令连接的实例发送PING命令,如果在down-after-milliseconds毫秒内没有做出有效响应包括(PONG/LOADING/MASTERDOWN)以外的响应,哨兵就会将该实例在本结构体中的状态标记为SRI_S_DOWN主观下线。

客观下线——当一个哨兵节点发现主节点处于主观下线状态是,会向其他的哨兵节点发出询问,该节点是不是已经主观下线了。如果超过配置参数quorum个节点认为是主观下线时,该哨兵节点就会将自己维护的结构体中该主节点标记为SRIO DOWN客观下线询问命令SENTINEL is-master-down-by-addr。

master选举——在认为主节点客观下线的情况下,哨兵节点节点间会发起一次选举,命令为:SENTINEL is-master-down-by-addr,只是runid这次会将自己的runid带进去,希望接受者将自己设置为主节点。如果超过半数以上的节点返回将该节点标记为leacer的情况下,会有该leader对故障进行迁移。

五、Cluster群集

redis的哨兵模式基本已经可以实现高可用、读写分离,但是在这种模式每台redis服务器都存储相同的数据,很浪费内存资源,所以在redis3.0上加入了Cluster群集模式,实现了redis的分布式存储,也就是说每台redis节点存储着不同的内容根据官方推荐,集群部署至少要3台以上的master节点,最好使用3主3从六个节点的模式。

1.Cluster数据分区

数据分区(或称数据分片)是集群最核心的功能,集群将数据分散到多个节点,一方面突破了 Redis 单机内存大小的限制,存储容量大大增加,另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力,Redis 单机内存大小受限问题,在介绍持久化和主从复制时都有提及。

2.Cluster高可用

集群支持主从复制和主节点的自动故障转移(与哨兵类似),当任意节点发送故障时,集群仍然可以对外提供服务。

3.Cluster数据分片

Redis 集群引入了哈希槽的概念,有 16384 个哈希槽(编号 0~16383)。集群的每个节点负责一部分哈希槽,每个 Key 通过 CRC16 校验后对 16384 取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。

以 3 个节点组成的集群为例:
节点 A 包含 0~5469 号的哈希槽
节点 B 包含 5461~10922 号的哈希槽
节点 C 包含 10923~16383 号的哈希槽

六、搭建集群环境

1.搭建主从复制

实验准备(安装Redis,三台服务器都需要安装)

节点名ip地址
msater192.168.150.10
slave1192.168.150.100
slave2192.168.150.200

按需求关闭安全策略

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0

编译安装redis

[root@localhost ~]# yum -y install gcc gcc-c++ make
[root@localhost ~]# cd /opt
[root@master opt]# rz -E         #上传相关软件包到/opt下
[root@master opt]# tar -zxvf redis-5.0.7.tar.gz
[root@master opt]# cd redis-5.0.7
[root@master redis-5.0.7]# make && make PREFIX=/usr/local/redis install  #Redis源码包中直接提供了makefile文件 直接执行make与make install命令进行安装
[root@localhost redis-5.0.7]# cd /opt/redis-5.0.7/utils/
[root@localhost utils]# ./install_server.sh     #回车,直到出现以下选项,手动修改为“/usr/local/redis/bin/redis-server”
[root@localhost ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@localhost ~]# ss -natp | grep "redis"     #检查服务状态
LISTEN     0      128    127.0.0.1:6379                     *:*                   users:(("redis-server",pid=16161,fd=6))

2.修改Redis配置文件

Master节点

[root@master ~]# vim /etc/redis/6379.conf
...
bind 0.0.0.0                                          #70行,修改监听地址为 0.0.0.0                
daemonize yes                                         #137行,开启守护进程               
logfile /var/1og/redis_6379.1og                       #172行,指定日志文件目录 
dir /var/lib/redis/6379                               #264行,指定工作目录         
appendonly yes                                        #700行,开启 AOF 持久化功能               

[root@master ~]# /etc/init.d/redis_6379 restart       #重启服务使配置生效
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...

Slave1/2节点

[root@slave1/2 ~]# vim /etc/redis/6379.conf
...
bind 0.0.0.0                                        #70行,修改监听地址为 0.0.0.0  
daemonize yes                                       #137行,开启守护进程                
logfile /var/log/redis_6379.log                     #172行,指定日志文件目录
dir /var/lib/redis/6379                             #264行,指定工作目录         
replicaof 192.168.126.128 6379                      #288行,指定要同步的 Master 节点 IP 和端口
appendonly yes                                      #700行,开启 AOF 持久化功能              

[root@slave1/2 ~]# /etc/init.d/redis_6379 restart   #重启服务使配置生效

3. 验证主从效果

[root@master ~]# tail -f /var/log/redis_6379.log
[root@master ~]# redis-cli info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.150.200,port=6379,state=online,offset=798,lag=1
slave1:ip=192.168.150.100,port=6379,state=online,offset=798,lag=1
master_replid:549f9fe10df3c71014c229de472b5e1c7d6db672
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:798
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:798

[root@master ~]# redis-cli             #在master创建数据
127.0.0.1:6379> set teacher zhangsan
OK
127.0.0.1:6379> get teacher     
"zhangsan"
[root@slave1/2 ~]# redis-cli           #两个slaves也有创建的数据,说明主从复制搭建成功
127.0.0.1:6379> get teacher
"zhangsan"

4.搭建哨兵模式

所有服务都需要配置

[root@localhost ~]# vim /opt/redis-5.0.9/sentinel.conf
...
protected-mode no		                         #17行,关闭保护模式
port 26379		                                 #21行,Redis哨 兵默认的监听端口	
daemonize yes		                             #26行 开启守护进程
logfile "/var/log/sentinel.log"		             #36行,指定日志存放路径
dir "/var/lib/redis/6379"		                 #65行,指定数据库存放路径
sentinel monitor mymaster 192.168.226.128 6379 2 #84行,指定哨兵节点,2表示,至少需要 2 个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 3000 	 #113行,判定服务器down掉的时间周期,默认30000毫秒 (30秒 )
sentinel failover-timeout mymaster 180000		 #146行,故障节点的最大超时时间为180000 (180秒)

启动哨兵模式(先启动主节点在启动从节点)

[root@localhost ~]# cd /opt/redis-5.0.7/
[root@localhost redis-5.0.7]# redis-sentinel sentinel.conf &     #启动哨兵模式
[root@localhost 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.150.10:6379,slaves=2,sentinels=3

5.模拟故障测试

[root@master redis-5.0.7]# kill -9 121350             #杀死redis-server进程
[root@master ~]# 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.150.100:6379,slaves=2,sentinels=3

6.搭建Cluster集群

按需求关闭安全策略

[root@redis ~]# systemctl stop firewalld
[root@redis ~]# systemctl disable firewalld
[root@redis ~]# setenforce 0

编译安装redis

[root@redis ~]# yum -y install gcc gcc-c++ make
[root@redis ~]# cd /opt
[root@redis opt]# rz -E         #上传相关软件包到/opt下
[root@redis opt]# tar -zxvf redis-5.0.7.tar.gz
[root@redis  opt]# cd redis-5.0.7
[root@redis redis-5.0.7]# make && make PREFIX=/usr/local/redis install  #Redis源码包中直接提供了makefile文件 直接执行make与make install命令进行安装
[root@redis redis-5.0.7]# cd /opt/redis-5.0.7/utils/
[root@redis utils]# ./install_server.sh     #回车,直到出现以下选项,手动修改为“/usr/local/redis/bin/redis-server”
[root@redis ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@redis ~]# ss -natp | grep "redis"     #检查服务状态
LISTEN     0      128    127.0.0.1:6379                     *:*                   users:(("redis-server",pid=16161,fd=6))

创建redis 6个端口的工作目录

[root@redis ~]# cd /etc/redis/
[root@redis redis]# mkdir -p redis-cluster/redis600{1..6}
[root@redis redis]# ls redis-cluster/
redis6001  redis6002  redis6003  redis6004  redis6005  redis6006
[root@redis redis]# vim /opt/redis.sh
#!/bin/bash
for i in {1..6}
do
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done

[root@redis redis]# sh -x /opt/redis.sh

修改redis的配置文件(6个端口都进行修改)

这里以端口6001为例

[root@redis redis]# cd redis6001
[root@redis redis6001]# vim redis.conf 
...
bind 127.0.0.1                       #69行,注释掉bind项或不修改,默认监听所有网卡
protected-mode no                    #88行,修改,关闭保护模式
port 6001                            #92行,修改,redis监听端口,
daemonize yes                        #136行,开启守护进程,以独立进程启动
appendonly yes                       #699行,修改,开启AOF持久化
cluster-enabled yes                  #832行,取消注释,开启群集功能
cluster-config-file nodes-6001.conf  #840行,取消注释,群集名称文件设置
cluster-node-timeout 15000           #846行,取消注释群集超时时间设置

用脚本启动服务或根据对应的配置文件启动redis

[root@redis redis]# vim /opt/redis_start.sh
#!/bin/bash
for d in {1..6}
do
cd /etc/redis/redis-cluster/redis600$d
redis-server redis.conf
done
ps -ef | grep redis

[root@redis redis]# sh -x /opt/redis_start.sh

加入集群

[root@redis redis]# cd /opt/
[root@redis opt]# redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:6005 to 127.0.0.1:6001
Adding replica 127.0.0.1:6006 to 127.0.0.1:6002
Adding replica 127.0.0.1:6004 to 127.0.0.1:6003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: b84a7f31eccb92176449a27c5964d9312e9c50c7 127.0.0.1:6001
   slots:[0-5460] (5461 slots) master
M: 84526bda24e4e2265696aade343146ea6e9f950b 127.0.0.1:6002
   slots:[5461-10922] (5462 slots) master
M: a469c6a3f837b80e1a5f83cd268a333e0a4b5c7f 127.0.0.1:6003
   slots:[10923-16383] (5461 slots) master
S: 314aaa62e3261be240e2636facb10fc017cca05e 127.0.0.1:6004
   replicates a469c6a3f837b80e1a5f83cd268a333e0a4b5c7f
S: 15b8eaccb12a527c401413e2453c7920ab2d3186 127.0.0.1:6005
   replicates b84a7f31eccb92176449a27c5964d9312e9c50c7
S: 56d45494c3ceb5c4b09f0847d01c2354a44e6400 127.0.0.1:6006
   replicates 84526bda24e4e2265696aade343146ea6e9f950b

测试群集

[root@redis opt]# redis-cli -p 6001 -c      #加-c参数,节点之,间就可以互相跳转
127.0.0.1:6001> cluster slots      #查看节点的哈希槽编号范围
1) 1) (integer) 5461
   2) (integer) 10922        #哈希槽编号范围
   3) 1) "127.0.0.1"
      2) (integer) 6002      #主节点IP和端口号
      3) "84526bda24e4e2265696aade343146ea6e9f950b"
   4) 1) "127.0.0.1"
      2) (integer) 6006      #从节点IP和端口号
      3) "56d45494c3ceb5c4b09f0847d01c2354a44e6400"
2) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "127.0.0.1"
      2) (integer) 6003
      3) "a469c6a3f837b80e1a5f83cd268a333e0a4b5c7f"
   4) 1) "127.0.0.1"
      2) (integer) 6004
      3) "314aaa62e3261be240e2636facb10fc017cca05e"
3) 1) (integer) 0
   2) (integer) 5460
   3) 1) "127.0.0.1"
      2) (integer) 6001
      3) "b84a7f31eccb92176449a27c5964d9312e9c50c7"
   4) 1) "127.0.0.1"
      2) (integer) 6005
      3) "15b8eaccb12a527c401413e2453c7920ab2d3186"
127.0.0.1:6001> set name zhangsan
-> Redirected to slot [5798] located at 127.0.0.1:6002
OK
127.0.0.1:6002> cluster keyslot name
(integer) 5798

总结

redis 在此处可以作为mysql的前置缓存数据库,redis与mysql对接的方式,需要配置线程池,需要定义后端mysql的位置(IP)+port(端口)+对接的方式sock文件的位置,其他策略。
用于内存/缓存型快速存储(读取)
实现的方式
1.默认将数据存储在内存/缓存中
2.具有丰富的数据类型,string list hash set && order set 等。。。
3.重要数据持久化的功能,持久的方式:AOF RDB
单线程模式——>速度快的原因之一:epoll+I/O复用(cluster中的slots哈希槽可以充当数据读、取的索引) 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值