标签:ati 事务 root mod ptime 标示 sentinel https nbsp
主从复制:主节点负责写数据,从节点负责读数据,从而实现读写分离,提高redis的高可用性。
让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主节点(master),而对主服务器进行复制的服务器则被称为从节点(slave),
如下图所示:
主从复制的特点:
1、一个master可以有多个slave
2、一个slave只能有一个master
3、数据流向是单向的,master到slave
主从复制的作用:
1、数据副本:多一份或多份数据拷贝,保证redis高可用
2、扩展性能:单机redis的性能是有限的,主从复制能横向扩展 如容量、QPS等
新建redis-6380.conf,加入配置
# 1.指明谁是主节点 slaveof your-master-ip your-master-port # 2.让从节点只做读的操作,保证主节点和从节点数据同步一致性和读写分离。 slave-ready-only yes
1. runId:Redis每次启动时,都会生成一个不同的id来标示当前运行的Redis。从节点中会保存主节点的run_id标示,
如果主节点的Redis发生了重启,那么从节点依据ip和端口号连接到主节点时,就会发现主节点的run_id标示的改变(这种改变意味着主节点中的数据可能发生的大量的改动),
所以此时就会引起全量复制,也就是将主节点中的所有数据全部复制过来。 root@f9eb2360ed36:/usr/local/bin# ./redis-cli -p 6379 info server # Server redis_version:4.0.14 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:9ac979c18029eef1 redis_mode:standalone os:Linux 3.10.0-514.26.2.el7.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll atomicvar_api:atomic-builtin gcc_version:6.3.0 process_id:1 run_id:49dbc223587cbdadd158adc21816979722b65ae1 tcp_port:6379 uptime_in_seconds:105535 uptime_in_days:1 hz:10 lru_clock:1086433 executable:/data/redis-server config_file: 2. 偏移量:每当主节点增删改一个数据时,主节点中就会有一个数值来记录这种变化,偏移量就是记录Redis中数据改变的一个标示,当主节点更改一个数据时,
偏移量也会发生对应的改变,而且主节点在将数据更改命令同步给从节点时,也会将该偏移量发送给从节点,这样就可以对比主从节点的偏移量,来观察是否出现主从不一致的问题。
使用 ./redis-cli -p 6379 info replication 该命令即可在主节点中查看主从节点的偏移量
1. 向主节点发送psync,有两个参数,第一个参数是runId,第二个参数是偏移量,第一次发送不知道主节点的runId,也不知道偏移量,因此从节点发送 ? -1
2. 主节点收到消息,根据? -1 能判断出来是第一次复制,主节点把runId和offset 发送给Slave节点,
3. 从节点保存主节点基本信息
4-5-6. Master节点执行bgsave生成快照,在此期间会记录后续执行的数据更改命令所更改的数据,直到主节点将生成的RDB文件传输到从节点为止,
期间Master节点执行的写操作,主节点会将缓冲区中记录的新更改的数据发送给从节点
7-8 从节点清空此前的所有数据,加载RDB文件恢复数据并存入新更改的数据
说明:
部分复制解决的问题:在实际环境中,主节点与从节点之间可能会发生一些网络波动等情况,导致从节点与主节点之间的网络连接断开(主从节点的Redis均未关闭),如果重新连接上后,可以使用全量复制来重新进行一次主从节点数据同步,但是全量复制会带来一个性能开销的问题,而且从节点中可能有大量数据是主节点中没有更该过的,也就是不需要进行再次同步的数据,如果使用全量复制肯定是带来了一些不必要的浪费。所以,部分复制功能就是为了解决该问题的。
1. 主从节点直接连接断开,
2. 此时主节点继续执行的数据更改命令会被记录在一个缓冲区 repl_back_buffer 中
3. 当从节点重新连接主节点时,
4. 自动发出一条命令(psync offset run_id),将从节点中存储的主节点的Redis运行时id和从节点中保存的偏移量发送给主节点
5. 主节点接收从节点发送的偏移量和id,对比此时主节点的偏移量和接收的偏移量,如果两个偏移量之差大于repl_back_buffer中的数据,那么就表示在断开连接期间从节点已经丢失了超出规定数量的数据,此时就需要进行全量复制了,否则就进行部分复制
6. 将主节点缓冲区中的数据同步更新到从节点中,这样就实现了部分数据的复制同步,降低了性能开销
1. 读写分离:即客户端发来的读写命令分开,写命令交给主节点执行,读命令交给从节点执行,不仅减少了主节点的压力,而且增强了读操作的能力;但也会造成一些问题
2. 主从配置不一致:造成的问题有
3. 规避全量复制:全量复制的性能开销较大,所以要尽量避免全量复制,
4. 规避复制风暴:
感谢支持,感谢观看。
参考:https://my.oschina.net/ProgramerLife/blog/2254321
标签:ati 事务 root mod ptime 标示 sentinel https nbsp
原文地址:https://www.cnblogs.com/haoprogrammer/p/11077121.html