redis复制(集群的复制)

1.复制

redis集群,使用info replication查看本redis的信息,包括是主从redis等信息

redis-server /etc/redis.conf --port 6380 --slaveof 127.0.0.1 6379 建立一个从数据库  或者连接上数据库后,使用slaveof 127.0.0.1 6379 连接主数据库

redis-cli -p 6380 连接6380端口的数据库

主数据库一般负责写,从数据库负责读

在从数据库启动后,会相主数据库发送sync命令,这时主数据库会在后台生成rdb快照文件,和生产快照期间的命令缓存起来一起发送到从数据库

在从数据库和主数据库连接期间,主数据库向从数据库复制的时候,会采取的乐观复制的方式,也就是说,主数据库接受客户端的命令并执行完命令后,将执行结果返回给客户端,并异步的将命令同步给从数据库,这期间,主数据库和从数据库之间存在着不同,但他们的最终数据会同步。但是,在主数据库执行完一条写命令后,再将命令同步到从数据库之前,从数据库与主数据库连接中断,造成二者之间数据的不一致性,

现在有两个问题,第一个是,主数据库不知道同步给了多少个从数据库,所以在配置文件中,通过设置,

min-slaves-to-write 3  意思是,只有3个或者3个从数据库连接主数据库,主数据库才是可写的

min-slaves-max-log 10    意思是,从数据库最长失联多长时间,当超过10秒之后,就认为该从数据库失联了

第二个问题是,在主数据库和从数据库失联之后,从数据库的恢复问题。这时采用的就是增量复制,每个数据库都会有一个独立的ID,每次重启数据库之后,ID都会不同,在复制同步阶段,主数据库在讲数据发送到从数据库的时候,会将该命令存储到积压队列中(backlog),并记录该积压队列的命令的偏移范围,从数据里接到命令之后,会存储该命令的偏移位置。

当从数据库恢复数据的时候,会先将自己的主数据库的ID传到主数据库中,进行验证他们之间是否是主从关系,然后,从数据库将最后一条同步的命令的偏移量取出,判断是否在主数据库的积压队列的偏移范围之内,如果在,主数据库会将该偏移量之后的命令传给从数据库,如果不在,则执行全部复制



你可能感兴趣的:(redis)