主从复制

原理说明参考 https://www.cnblogs.com/daofaziran/p/10978628.html

基本原理

主要是Redis没有wal日志机制。aof是先执行命令再记录。主从同步不是依赖aof日志。

通过单独的进程完成主从的同步。

初始时全量复制,SYNC。 然后进行增量复制PSYNC。在主库内存中维护一个偏移量master run id 。 当断开重新连接上比较偏移量,尝试增量同步,如果增量失败进行全量同步。

从库只读

Redis 从库支持写操作。 容易产生冲突,可通过配置进行设置

replica-read-only yes

无盘复制

当新添加从节点的时候,会在主库先拷贝一份全量数据放在本地磁盘,如果主库磁盘有限制或IO增大可能对业务造成影响。可选择无盘复制,主从将直接通过socket通信。

repl-diskless-sync

repl-diskless-sync-delay

多个从库同步成功后主可写

为了增加整体的数据一致性。可设定N个从库同步成功后主库可写功能。

min-slaves-to-write(最小从服务器数)
min-slaves-max-lag(从服务器最大确认延迟)

级联主从

Redis 支持级联复制模式。从库的复制对主库会有一定的性能影响。

为了消除或减少复制时对主库的影响。可采取级联复制

主从配置

配置文件中加入,或执行命令

slaveof  # 旧版本命令
replicaof # 新版本命令

状态查看

查看命令

INFO replication

Redis Sentinel

Sentinel 可以帮助我们自动的管理Redis 的主从复制。能够做到

  • Monitoring
  • Notification
  • Automatic failover
  • Configuration provider

一个简单配置

一个Sentinel 集群可以管理多个 Redis 主从。 通过名称 monitor mymaster 来区分。

port 5000
sentinel monitor mymaster 127.0.0.1 6379 2 # 2 表示有2个或以上sentinel 连接不到redis时认为redis挂掉。
sentinel down-after-milliseconds mymaster 60000 # 连接中断时间大于 xx 认为超时。
sentinel failover-timeout mymaster 180000 # failover过期时间。当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel将会认为此次failoer失败。
sentinel parallel-syncs mymaster 1 # 当发生failover时 统一时刻可以有几个从库从主库同步数据

sentinel monitor resque 192.168.1.3 6380 3
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5

Sentinel 通信

Sentinel 在配置的时候只指定了master Redis的地址。多个Sentinel如何是如何形成集群的呢?

Sentinel 通过Redis的pub/sub 广播自动发现,形成网络拓扑。

运行时管理命令

redis-cli -p 5000

SENTINEL CONFIG GET 
SENTINEL CONFIG SET 
SENTINEL CKQUORUM <master name>
SENTINEL FLUSHCONFIG 

python 连接Sentinel

# import redis
from redis.sentinel import Sentinel
 
"""
1、通过访问Sentinel服务的方式,获取redis的master、slave节点信息
2、向master redis写入数据
3、从slave redis读取数据
"""
 
# 连接哨兵服务器(主机名也可以用域名)
sentinel = Sentinel([('192.168.196.129', 26379),
                     ('192.168.196.132', 26379)
             ],
                    socket_timeout=0.5)
 
# 获取主服务器地址
master = sentinel.discover_master('mymaster')
print(master)
# 输出:('192.168.196.132', 6379)
 
 
# 获取从服务器地址
slave = sentinel.discover_slaves('mymaster')
print(slave)
# 输出:[('192.168.196.129', 6379)]
 
 
# 获取主服务器进行写入
master = sentinel.master_for('mymaster', socket_timeout=0.5, password='newpwd', db=0)
w_ret = master.set('foo', 'bar')
# 输出:True
 
# 获取从服务器进行读取(默认是round-roubin,随机从多个slave服务中读取数据)
slave = sentinel.slave_for('mymaster', socket_timeout=0.5, password='newpwd', db=0)
r_ret = slave.get('foo')
print(r_ret)
# 输出:bar

Cluster

去中心化

16384 个槽位,槽位信息存储在每个节点,纠正机制

key 可以挂在特定的槽位上 tag指定

槽位迁移

每个节点之间采用Gossip协议

两个特殊指令 moved asking

只能使用第0号库。不像独立的redis 有16 个库

更多参考 https://www.cnblogs.com/williamjie/p/11132211.html