Redis :主从复制

Redis 单机出现的问题?

  1. 单机部署,可能会发生机器故障。导致短时间 redis 不可用。
  2. 内存是非常珍贵的,如果需要100G 的内存,单机很难满足。
  3. Redis 每秒有 10W qps,如果需要100W qps,怎么解决。

第一点需要解决Redis高可用,第二,三点需要解决的Redis的分布式。那么在这种情况下,我们的主从复制就登场了,来解决这些问题。

Redis :主从复制_第1张图片

什么是主从复制

在 Redis 复制的基础上,使用和配置主从复制非常简单,能使得从 Redis 服务器(下文称 slave)能精确得复制主 Redis 服务器(下文称 master)的内容。每次当 slave 和 master 之间的连接断开时, slave 会自动重连到 master 上,并且无论这期间 master 发生了什么, slave 都将尝试让自身成为 master 的精确副本。
这个系统的运行依靠三个主要的机制:

  1. 当一个 master 实例和一个 slave 实例连接正常时, master 会发送一连串的命令流来保持对 slave 的更新,以便于将自身数据集的改变复制给 slave 。
  2. 当 master 和 slave 之间的连接断开之后,因为网络问题、或者是主从意识到连接超时, slave 重新连接上 master 并会尝试进行部分重同步:这意味着它会尝试只获取在断开连接期间内丢失的命令流。
  3. 当无法进行部分重同步时, slave 会请求进行全量重同步。这会涉及到一个更复杂的过程,例如 master 需要创建所有数据的快照,将之发送给 slave ,之后在数据集更改时持续发送命令流到 slave 。

Redis 主从复制的特点

  1. Redis 使用异步复制,slave 和 master 之间异步地确认处理的数据量。
    虽然使用异步的操作来处理主从之间的数据,不会影响Redis的命令操作,但是感觉如果网络不好的时候,可能会出现主从之间数据不一致或者有数据延迟。
  2. Redis 使用异步复制,slave 和 master 之间异步地确认处理的数据量。
    Redis :主从复制_第2张图片
  3. slave 可以接受其他 slave 的连接。除了多个 slave 可以连接到同一个 master 之外, slave 之间也可以像层叠状的结构连接到其他 slave 。
    Redis :主从复制_第3张图片
  4. Redis 复制在 master 侧是非阻塞的。这意味着 master 在一个或多个 slave 进行初次同步或者是部分重同步时,可以继续处理查询请求。
  5. 数据流向必须是 master 到 slave。

主从复制的配置

  1. 通过命令 :SLAVEOF host port
    Redis SLAVEOF 命令可以将当前服务器转变为指定服务器的从属服务器(slave server)。
    如果当前服务器已经是某个主服务器(master server)的从属服务器,那么执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步
    另外,对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。
# 设置2个配置文件,使用不同的端口启动2台redis
root@iZ28x8osxzxZ:/opt/redis/ect# redis-server redis_6379.conf 
root@iZ28x8osxzxZ:/opt/redis/ect# redis-server redis_6380.conf
# 进入 6380 端口号,将 6379 设置为master,6380 slave
root@iZ28x8osxzxZ:/opt/redis/ect# redis-cli -p 6380
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
# 检查 6380 端口 redis 的信息,role 为 slave
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:0
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:8ece4c15a999f69ce2dda3ae82f555e5bf730ff5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0
# 链接 6379 master redis ,设置一个key,6380 使用get 获取。
root@iZ28x8osxzxZ:/opt/redis/ect# redis-cli -p 6379 set hello world
OK
root@iZ28x8osxzxZ:/opt/redis/ect# redis-cli -p 6380 get hello
"world"

取消复制,重新成为 master

127.0.0.1:6380> slaveof no one
OK
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_replid:9c47a732feefd19d4b5568db82a6e618a3964632
master_replid2:8ece4c15a999f69ce2dda3ae82f555e5bf730ff5
master_repl_offset:1220
second_repl_offset:1221
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1220

注意:一个节点成为某个节点的从节点,会丢失本节点的数据,同步主节点的数据。

  1. 通过配置 redis.conf
# 配置链接 master 的IP和端口
replicaof 127.0.0.1 6379
# 如果主节点使用了密码,需要验证密码
#masterauth 
# 当一个slave失去和master的连接,或者同步正在进行中,slave的行为有两种可能:
# 1) 如果 replica-serve-stale-data 设置为 "yes" (默认值),
#      slave会继续响应客户端请求,可能是正常数据,也可能是还没获得值的空数据。
# 2) 如果 replica-serve-stale-data 设置为 "no",
#     slave会回复"正在从master同步"来处理各种请求,除了 INFO 和 SLAVEOF 命令。
replica-serve-stale-data yes
# 配置的slave为只读
replica-read-only yes

实验:

root@iZ28x8osxzxZ:/opt/redis/ect# redis-server redis_6379.conf 
root@iZ28x8osxzxZ:/opt/redis/ect# redis-server redis_6380.conf 
root@iZ28x8osxzxZ:/opt/redis/ect# redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:9b21ea14fd0ffd9402195fc058e8a2f4b78545f9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42

2种配置的比较

方式 命令 配置
优点 无需重启 统一配置
缺点 不便于管理 需要重启

推荐使用配置来进行主从配置。

全量复制 和 部分复制

  1. 什么是run id ? 怎么查看 run id ?

     Redis 每次启动的时候都会有随机生成一个id,用来标识。这个就是run id,重启之后就没有了。
    
# 进入 slave 节点,执行 info server
127.0.0.1:6380> info server
# Server
redis_version:5.0.3
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:1043207792c27c64
redis_mode:standalone
os:Linux 3.13.0-65-generic x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.2
process_id:12381
run_id:35db5b50ce2f39f54c4844ac7fc92c4f67db6bf7
tcp_port:6380
uptime_in_seconds:798
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:8530771
executable:/opt/redis-5.0.3/ect/redis-server
config_file:/opt/redis-5.0.3/ect/redis_6380.conf
  1. 什么是偏移量(offset)?

    比如我做了一次操作,set hello world,redis 就会记录这个操作写入了多少数据。
    主从复制中,当master 做了一次操作,master 会把这个操作异步的传给 slave 节点,
    也会把偏移量带过去,如果说master的偏移量和slave 偏移量一样,那么说明2个节点的数据一致。
    如果 master 的偏移量大于slave 的偏移量,说明slave节点数据延迟,需要同步数据。
    
# 执行 info replication ,slave_repl_offset 这个就是偏移量
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:1820
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:9b21ea14fd0ffd9402195fc058e8a2f4b78545f9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1820
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1820
  1. redis什么时候会发生全量复制?

    a) redis slave首启动或者重启后,连接到master时
    
    b) redis slave进程没重启,但是掉线了,重连后不满足部分复制条件
    
  2. redis什么时候会发生部分复制?

    a)  redis slave进程没有重启,但是掉线了,重连了master
    
    b)  redis slave保存的run id与master当前run id一致
    
    c) redis slave掉线期间,master保存在内存的offset可用,master变化不大,被更改的指令都保存在内存.
    

之前准备学习的时候写博客,可是都没有坚持下去,希望这次可以有始有终。
Redis 坚持第一天 :为什么要使用 redis ?
Redis 坚持第二天 :Redis 的安装与启动
Redis 坚持第三天 :Redis 使用配置文件启动,常见配置学习。
Redis 坚持第四天 :

  1. Redis 五种常见的数据结构:String
  2. Redis 五种常见的数据结构:Hash
  3. Redis 五种常见的数据结构:List
  4. Redis 五种常见的数据结构:Set
  5. Redis 五种常见的数据结构:zset

Redis 坚持第五天 :Redis 客户端:Jredis 和 spring-data-redis 整合。
Redis 坚持第六天 :Redis 慢查询日志。
Redis 坚持第七天 :Redis pipeline。
Redis 坚持第八天 :Redis 发布订阅。
Redis 坚持第九天 :Redis bitmp。
Redis 坚持第十天 :Redis HyperLogLogs。
Redis 坚持第十一天 :Redis GEO。
Redis 坚持第十二天 :Redis 持久化:RDB。
Redis 坚持第十三天 :Redis 持久化 :AOF。
Redis 坚持第十四天 :Redis :主从复制。

你可能感兴趣的:(redis,从入门到提高)