1. 单机部署Redis的问题:首先是若是机器故障(忽然断电或者机器宕机),那么数据就会大量丢失;其次就是单机Redis的容量会有瓶颈,受限于机器的内存空间;每秒的请求处理数也会受到单机Redis的限制,尽管Redis每秒的请求处理数能够很高,但在大型应用中仍然是远远不够的。为了解决这些问题,实现高可用,Redis提供了一个主从复制的功能,来实现集群式部署Redisredis
2. 简单了解主从复制的模型:主从复制,会有一个主节点和多个从节点,每个节点都是一个Redis,并且每个Redis节点都能给客户端提供Redis的服务,主从复制就是从主Redis节点中复制数据到从Redis节点,若是主节点进行一个数据更新操做,那么从节点也会进行一个相同的操做。主从复制经过RDB文件来实现。网络
3. 主从复制的做用:异步
4. 主从复制的特色:函数
1. 有两种实现方式:分别是经过运行命令来实现,另外一种是经过redis的启动配置文件来实现性能
1. run_id:Redis每次启动时,都会生成一个不一样的id来标示当前运行的Redis。从节点中会保存主节点的run_id标示,若是主节点的Redis发生了重启,那么从节点依据ip和端口号链接到主节点时,就会发现主节点的run_id标示的改变(这种改变意味着主节点中的数据可能发生的大量的改动),因此此时就会引发全量复制,也就是将主节点中的全部数据所有复制过来。spa
2. 偏移量:每当主节点增删改一个数据时,主节点中就会有一个数值来记录这种变化,偏移量就是记录Redis中数据改变的一个标示,当主节点更改一个数据时,偏移量也会发生对应的改变,并且主节点在将数据更改命令同步给从节点时,也会将该偏移量发送给从节点,这样就能够对比主从节点的偏移量,来观察是否出现主从不一致的问题。下图中master_repl_offset就表示主节点的偏移量,高亮处就表示从节点中的偏移量,使用 ./redis-cli -p 6379 info replication 该命令便可在主节点中查看主从节点的偏移量3d
3. 全量复制:全量复制指的是不只仅复制主节点发送过来的RDB文件中的数据,还要将主节点在生成RDB文件期间主节点后续执行的数据更改命令所更改的数据一并复制过来,在这期间,主节点执行的数据更改命令会被记录在一个缓冲区repl_back_buffer中,当从节点RDB加载完毕后,就会将这一部分被更改的数据同步到从节点中,具体过程以下blog
4. 全量复制的性能开销:主要消耗在主节点RDB文件的生成须要的时间,其次是RDB文件在网络间的传输时间,还须要从节点的数据清空时间、加载RDB文件的时间进程
5. 数据更改命令缓冲区repl_back_buffer用于:当Redis经过Linux中的fork()函数开辟一个子进程处理其余事务(好比主进程执行bgsave生成一个RDB文件时,或者主进程执行bgrewriteaof生成一个AOF文件时),而主进程(即处理客户端命令的进程)后续执行的一些数据更改命令会被暂时保存在该区域,并且该区域空间有限(配置文件中repl-backlog-size 1mb便可配置该处空间大小)事务
1. 部分复制解决的问题:在实际环境中,主节点与从节点之间可能会发生一些网络波动等状况,致使从节点与主节点之间的网络链接断开(主从节点的Redis均未关闭),若是从新链接上后,可使用全量复制来从新进行一次主从节点数据同步,可是全量复制会带来一个性能开销的问题,并且从节点中可能有大量数据是主节点中没有更该过的,也就是不须要进行再次同步的数据,若是使用全量复制确定是带来了一些没必要要的浪费。因此,部分复制功能就是为了解决该问题的。
2. 部分复制的发生过程:
1. 故障发生时服务自动转移(自动故障转移):即当某个节点发生故障致使中止服务时,该节点提供的服务会有另外一个节点自动代替提供,这样就实现了一个高可用的效果
2. 从节点故障:即若是某个从节点发生了故障,致使没法向在该节点上的客户端提供读服务,解决办法就是使该客户端转移到另外一个可用从节点上,可是在转移时,应该考虑该从节点能承受几个客户端的压力
3. 主节点故障:若是主节点发生故障,在使用主节点进行读写操做的客户端就没法使用了,而使用从节点只进行读操做的客户端仍是能够继续使用的,解决办法就是从从节点中选一个节点更改成主节点,而且将原主节点的客户端链接到新的主节点上,而后经过该客户端将其余从节点链接到新的主节点中
4. 主从复制确实能够解决故障问题,可是主从复制不能实现自动故障转移,其必需要经过一些手动操做,并且很是麻烦,因此要实现自动故障转移还须要另外一个功能,Redis中提供了sentinel功能来实现自动故障转移。
1. 读写分离:即客户端发来的读写命令分开,写命令交给主节点执行,读命令交给从节点执行,不只减小了主节点的压力,并且加强了读操做的能力;但也会形成一些问题
2. 主从配置不一致:形成的问题有
3. 规避全量复制:全量复制的性能开销较大,因此要尽可能避免全量复制,
4. 规避复制风暴: