决心做好你自己,要知道,只有发现自我价值的人,才不会苦恼 !
总结:
- redis持久化是有缺陷的,
Redis集群
Redis集群分为:
主从复制Replication
高可用 Sentinel(必用) 怎么都能用:3台
集群Cluster
1. 主从复制
典型的主从模型,主Redis服务称为Master,从Redis服务称为Slave。一主可以多从。
Master会一直将自己的数据更新同步到Slave,以保持主从同步。
只有Master可以执行读写操作,Slave只能执行读操作。客户端可以连接到任一Slave执行读操作,来降低Master的读取压力。
创建主从复制
1. 命令创建(主 从)
redis-server --slaveof <master-ip> <master-port>
配置当前服务称为某Redis服务的Slave
redis-server --port 6380 --slaveof 127.0.0.1 6379
2. 指令创建
SLAVEOF host port命令,将当前服务器状态从Master修改为别的服务器的Slave
redis > SLAVEOF 192.168.1.1 6379,将服务器转换为Slave
redis > SLAVEOF NO ONE ,将服务器重新恢复到Master,不会丢弃已同步数据
3. 配置方式
启动时,服务器读取配置文件,并自动成为指定服务器的从服务器
slaveof <masterip> <masterport>
slaveof 127.0.0.1 6379
主从实验
Master 192.168.140.135 6379
Slave 192.168.140.140 6379
# redis-cli -h 192.168.142.140 -p 6379
slave> SET testkey abc
slave> KEYS *
slave> SLAVEOF 192.168.142.135 6379
slave> KEYS * 看看是否发生改变
slave> set slavekey 123
(error) READONLY You can't write against a read only slave.
master> SET masterkey 123
slave> GET masterkey
slave> SLAVEOF NO ONE 解除从
slave> KEYS *
slave> SET slavekey1 abc 可写了
slave> KEYS *
采用上面的多种方式都可以实现主从模式,一般来说,主从服务器都是固定的,采用配置文件方式。
主从复制问题
一个Master可以有多个Slaves。
如果Slave下线,只是读请求的处理能力下降。
但Master下线,写请求无法执行。
当Master下线,其中一台Slave使用SLAVEOF no one命令成为Master,其它Slaves执行SLAVEOF命令指向这个新的Master,从它这里同步数据。
这个主从转移的过程手动的,如果要实现自动故障转移,这就需要Sentinel哨兵,实现故障转移Failover操作
2. 高可用Sentinel
Redis官方的高可用方案,可以用它管理多个Redis服务实例。
Redis Sentinel是一个分布式系统,可以在一个架构中运行多个Sentinel进程
使用编译时产生的redis-sentinel文件,在新的版本中,它就是redis-server的软链接。
Sentinel启动启动一个运行在Sentinel模式下的Redis服务实例
redis-sentinel /path/to/sentinel.conf
redis-server /path/to/sentinel.conf --sentinel
推荐使用第一种
[root@Centos7 dell]# cd /magedu/redis/bin/
[root@Centos7 bin]# ll
total 15080
-rwxr-xr-x. 1 root root 2433432 Aug 13 17:07 redis-benchmark
-rwxr-xr-x. 1 root root 24992 Aug 13 17:07 redis-check-aof
-rwxr-xr-x. 1 root root 5191752 Aug 13 17:07 redis-check-rdb
-rwxr-xr-x. 1 root root 2586480 Aug 13 17:07 redis-cli
lrwxrwxrwx. 1 root root 12 Aug 13 17:07 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 5191752 Aug 13 17:07 redis-server
Sentinel会监控Master、Slave是否正常,可以监控多个Master、Slave。
Sentinel网络:监控同一个Master的Sentinel会自动连接,组成分布式的Sentinel网络,相互通信并交换监控信息
服务器下线
当一个sentinel认为被监视的服务器已经下线时,它会向网络中的其他Sentinel进行确认,判断该服务器是否真的已经下线
如果下线的服务器为主服务器,那么sentinel网络将对下线主服务器进行自动故障转移,通过将下线主服务器的某个从服务器提升为新的主服务器,并让其从服务器转为复制新的主服务器,以此来让系统重新回到上线的状态
如果原来的主服务器恢复,只能成为一台Slave服务器。
主观下线sdown:单个Sentinel认为服务器下线
客观下线odown:多个Sentinel通信后做出了服务器下线的判断
当server1的下线时长超过用户设定的下线时长上限时,Sentinel系统就会对server1执行故障转移操作:
- 首先,Sentinel系统会挑选server1属下的其中一个从服务器,并将这个被选中的从服务器升级为新的主服务器。
- 之后,Sentinel系统会向server1属下的所有从服务器发送新的复制指令,让它们成为新的主服务器的从服务器,当所有从服务器都开始复制新的主服务器时,故障转移操作执行完毕。
- 另外,Sentinel还会继续监视已下线的server1,并在它重新上线时,将它设置为新的主服务器的从服务器。
配置
至少包含一个监控配置选项,用于指定被监控Master的相关信息
Sentinel monitor<name><ip><port><quorum> ,例如 sentinel monitor mymaster 127.0.0.1 6379 2
监视mymaster的主服务器,服务器ip和端口,将这个主服务器判断为下线失效至少需要2个Sentinel同意,如果多数Sentinel同意才会执行故障转移
Sentinel会根据Master的配置自动发现Master的Slaves
sentinel down-after-milliseconds mymaster 60000
认为服务器下线的毫秒数。Sentinel在指定的毫秒数内没有返回给Sentinel的Ping回复,视为主管下线Sdown。
sentinel failover-timeout mymaster 180000
若sentinel在该配置值内未能完成failover操作(即故障时主从自动切换),则认为本次failover失败
sentinel parallel-syncs mymaster 1
在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步。1表示只能有1台从服务器从新主服务器同步数据,以便其他从服务器继续提供客户端服务的响应。
port 26379
Sentinel默认端口号为26379
Sentinel实验
Master 192.168.140.135 6379
Slave 192.168.140.140 6379
先启动主从2个Redis服务
提供Sentinel配置文件
sentinel1.conf文件内容如下
port 26379
Sentinel monitor s1 192.168.142.135 6379 1 # 1台下线;
sentinel down-after-milliseconds s1 6000
sentinel failover-timeout s1 10000
sentinel parallel-syncs s1 1
启动Sentinel
redis-sentinel sentinel1.conf
在从服务器的配置中增加 slaveof 192.168.142.135 6379 ,并重启该服务
模拟Master下线
主观下线有一个超时时间 ;
# ps aux | grep redis-server
root 4588 0.1 0.9 38736 9752 ? Ssl 14:44 0:34 /magedu/redis/bin/redis-server
192.168.142.135:6379
root 4754 0.0 0.0 103244 852 pts/2 S+ 20:23 0:00 grep redis-server
# kill -9 4588
Master下线后,开始投票,决议通过后,提升从为新主
Master再次上线
原来的主上线后,被迫转换为从。
3. Redis Cluster
从3.0开始,Redis支持分布式集群。
Redis集群采用无中心节点设计,每一个Redis节点间互相通信。
客户端可以连接任意一个集群的节点。
Redis集群节点复制
Redis集群的每个节点都有两种角色可选:主节点master node、从节点slave node。其中主节点用于存储数据,而从节点则是某个主节点的复制品
当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能,因为Redis集群重用了单机Redis复制特性的代码,所以集群的复制行为和我们之前介绍的单机复制特性的行为是完全一样的
Redis集群故障转移
Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移
集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel
Redis集群分片
集群将整个数据库分为16384个槽位slot,所有key都数据这些slot中的一个,key的槽位计算公式为slot_number=crc16(key)%16384,其中crc16为16位的循环冗余校验和函数
集群中的每个主节点都可以处理0个至16383个槽的访问请求,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求
举例
三个主节点7000、7001、7002平均分配16384个slot槽位
节点7000指派的槽位为0到5460
节点7001指派的槽位为5461到10922
节点7002指派的槽位为10923到16383
Redis集群Redirect转向
由于Redis集群无中心节点,请求会发给任意主节点
主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误
客户端根据错误中包含的地址和端口,重新向正确的负责的主节点发起命令请求
Redis集群总结
Redis集群是一个由多个节点组成的分布式服务集群,它具有复制、高可用和分片特性
Redis的集群没有中心节点,并且带有复制和故障转移特性,这可用避免单个节点成为性能瓶颈,或者因为某个节点下线而导致整个集群下线
集群中的主节点负责处理槽(储存数据),而从节点则是主节点的复制品
Redis集群将整个数据库分为16384个槽,数据库中的每个键都属于16384个槽中的其中一个
集群中的每个主节点都可以管理槽,当16384个槽都有节点在负责时,集群进入上线状态,可以执行客户端发送的数据命令
主节点只会执行和自己负责的槽有关的命令,当节点接收到不属于自己处理的槽的命令时,它将会处理指定槽的节点的地址返回给客户端,而客户端会向正确的节点重新发送