设为“星标”,和你一起掌握 Redis主从复制
主从库模式一个主节点多Slave从节点的模式,将一份数据保存在多Slave个实例中,增加副本冗余量,当某些出现宕机后,Redis服务还可以使用。
一主多从redis哨兵模式,从节点会不断的从主节点同步数据。主节点提供读写功能,从节点提供读功能。一般来说会让主节点用于写操作,从节点用来读操作,读写分离减少服务器压力。
但是从节点在同步数据的时候需要时间,可能就会造成数据不一致的情况redis哨兵模式,最好是读写都在主节点,从节点用来做热备了。
添加主节点 redis 的配置文件
# 关闭保护模式
protected-mode no
#设置redis端口
port 6379
#设置非守护进程启动,不然跟 docker 的 -d 冲突
daemonize no
# 注释bing采用密码模式访问
#bind 127.0.0.1
#设置主节点的连接密码
masterauth 123456
#这个很重要!!!设置本redis的外网访问ip和端口
replica-announce-ip 外网ip
replica-announce-port 6379
#设置redis访问密码
requirepass 123456添加从节点 redis 配置文件
# 关闭保护模式
protected-mode no
#设置redis端口
port 6380
#设置非守护进程启动,不然跟 docker 的 -d 冲突
daemonize no
# 注释bing采用密码模式访问
#bind 127.0.0.1
#设置主节点的连接密码
masterauth 123456
#设置关联主节点
replicaof 主节点外网访问ip 6379
#这个很重要!!!设置本redis的外网访问ip和端口
replica-announce-ip 外网ip
replica-announce-port 6379
#设置redis访问密码
requirepass 123456新建一主二从:
docker run --name redis-1 -p 6379:6379 -d -v /data/redis-1:/usr/local/redis redis redis-server /usr/local/redis/redis-1.conf
docker run --name redis-2 -p 6380:6380 -d -v /data/redis-2:/usr/local/redis redis redis-server /usr/local/redis/redis-2.conf
docker run --name redis-3 -p 6381:6381 -d -v /data/redis-3:/usr/local/redis redis redis-server /usr/local/redis/redis-3.conf哨兵模式
哨兵其实是一个运行在特殊模式下的Redis进程。它有三个作用,分别是:监控、自动选主切换(简称选主)、通知。
哨兵进程在运行期间,监视所有的Redis主节点和从节点。它通过周期性给主从库发送PING命令,检测主从库是否挂了。如果从库没有在规定时间内响应哨兵的PING命令,哨兵就会把它标记为下线状态;如果主库没有在规定时间内响应哨兵的PING命令,哨兵则会判定主库下线,然后开始切换到选主任务。
所谓选主,其实就是从多个从库中,按照一定规则,选出一个当做主库。至于通知呢,就是选出主库后,哨兵把新主库的连接信息发给其他从库,让它们和新主库建立主从关系。同时,哨兵也会把新主库的连接信息通知给客户端,让它们把请求操作发到新主库上。
但是这会存在数据不一致问题,那redis的副本集是如何数据一致性?
Redis为了保证数据副本的一致,主从库之间采用读写分离的方式:
哨兵模式基于主从模式,实现读写分离,它还可以自动切换,系统可用性更高。但是它每个节点存储的数据是一样的,浪费内存,并且不好在线扩容。因此,Reids 集群(切片集群的实现方案)应运而生,它在.0加入的,实现了Redis的分布式存储。对数据进行分片,也就是说每台Redis节点上存储不同的内容,来解决在线扩容的问题。并且,它可以保存大量数据,即分散数据到各个Redis实例,还提供复制和故障转移的功能。
使用去中心化的思想,整个集群是分布式的。所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
客户端与redis节点直连,不需要中间proxy层。客户端不需要连接集群所有节点,只要连接集群中任意一个可用节点即可。
Redis 集群数据分片(Redis data )不使用一致性哈希算法,而是采用哈希槽(hash slot)的方式。集群中内置了 16384 个哈希槽(编号0-16383),每个负责总数的一个子集,即[0-16384]个,且各个负责的哈希槽没有交集。当所有拥有的哈希槽的集合总数为16384时,该Redis 才能正常工作。
当要访问 Redis 集群中的一个 key 时,Redis 先对key使用CRC16 算法算出一个结果(0-32767),然后把结果对 16384 取模,这样就会对应到一个编号在 0-16383 之间的hash slot。如果算出来的hash slot落在当前节点本身,则直接处理返回数据。如果是在其他节点,则当前节点会返回负责这个hash slot的节点的IP和端口给客户端,以及-MOVED标识,由客户端向正确的节点再次发起请求。
当要存储一个 key-value 时,也是先计算 key 落在哪一个hash slot,过程与读key类似。
Redis主从复制实现原理步骤:
从服务器向主服务器发送SYNC命令
主服务器收到SYNC命令后,执行命令,在后台生成RDB文件,使用缓冲区记录从现在开始执行的所有的写命令。
当主服务器的命令执行完毕后,主服务器后将命令生成的RDB文件发送给从服务器,从服务器接收并载入这个RDB文件,将自己的数据库状态更新至主服务器执行命令时的数据库状态。
主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些写命令,将自己的数据库状态更新至主服务器数据库当前所处的状态。
应用场景总结主从架构
主从架构是Redis中最基本的高可用方案,它将数据分布在一个主节点和多个从节点上。主节点负责写操作,从节点负责读操作,从而实现读写分离和负载均衡。主从架构适用于读多写少的场景,例如缓存、计数器、排行榜等应用。
哨兵架构
哨兵架构是主从架构的扩展,它引入了哨兵节点来监控主节点的状态,并在主节点宕机时自动切换到备用的从节点。哨兵架构可以提高系统的可用性和容错能力,适用于对可用性要求较高的应用。
集群架构
集群架构是Redis中最完备的分布式方案,它将数据分布在多个节点上,并通过一致性哈希算法实现数据的分片和负载均衡。集群架构可以实现数据的高可用和水平扩展,适用于数据量大、访问量高、对可靠性和性能要求高的应用。
综上所述,主从架构适用于读多写少的场景,哨兵架构适用于对可用性要求较高的场景,而集群架构适用于数据量大、访问量高、对可靠性和性能要求高的场景。在实际应用中,可以根据具体的业务需求和数据规模选择适合的架构方案
写在最后的话
大家看完有什么不懂的可以在下方留言讨论,也可以私信问我一般看到后我都会回复的。最后觉得文章对你有帮助的话记得点个赞哦,点点关注不迷路
@终端研发部
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。