主从搭建
从节点开启主从复制,有3种方式:
1)配置文件
在从服务器的配置文件中加入:replicaof <masterip> <masterport> # Redis 5.0之前使用slaveof
2)启动命令
redis-server启动命令后加入 --replicaof <masterip> <masterport>
3)客户端命令
Redis服务器启动后,直接通过客户端执行命令:replicaof <masterip> <masterport>,则该Redis实例成为从节点。
通过replicaof 命令建立主从复制关系以后,可以通过slaveof no one断开。需要注意的是,从节点断开复制后,不会删除已有的数据,只是不再接受主节点新的数据变化。
1、复制一份redis.conf文件
(直接将原先的redis6379的redis目录复制 删除原先的log文件 以及data文件夹的rdb和aof)
2、配置主从复制
replicaof node01 6379 # 从本机6379的redis实例复制数据,Redis 5.0之前使用slaveof
# 配置从节点只读
replica-read-only yes
#密码
masterauth password 主节点密码
masteruser <username>
设置指定的master用户;当使用Redis ACLs的时候(redis6版本或更高),默认用户可能无法执行同步需要的命令,可以用该项为副本指定一个特定用户用于同步;(当指定masteruser的时候,副本会使用AUTH <username> <password>连接master)
3、启动从节点
src/redis-server redis.conf
4、连接从节点
src/redis-cli -p 6380 -a 密码
5、测试在6379实例上写数据,6380实例是否能及时同步新修改数据
6、可以自己再配置一个6381的从节点 建议一主节点两从节点
与主从节点都有关的配置
replicaof <masterip> <masterport>:Redis启动时起作用;作用是建立复制关系,开启了该配置的Redis服务器在启动后成为从节点。该注释默认注释掉,即Redis服务器默认都是主节点。
repl-timeout 60:与各个阶段主从节点连接超时判断有关,slave和master之间的复制超时时间,默认为60s, 推荐设置为180s;
slave角度,如果在repl-timeout时间内没有收到master SYNC传输的rdb snapshot数据,
slave角度,在repl-timeout没有收到master发送的数据包或者ping。
master角度,在repl-timeout时间没有收到REPCONF ACK确认信息。
当redis检测到repl-timeout超时(默认值60s),将会关闭主从之间的连接,redis slave发起重新建立主从连接的请求。
对于内存数据集比较大的系统,可以增大repl-timeout参数。
主节点相关配置
repl-diskless-sync no:作用于全量复制阶段,控制主节点是否使用diskless复制(无盘复制)。
所谓diskless复制,是指在全量复制时,主节点不再先把数据写入RDB文件,而是直接写入slave的socket中,
整个过程中不涉及硬盘;diskless复制在磁盘IO很慢而网速很快时更有优势。需要注意的是,截至Redis3.0,diskless复制处于实验阶段,默认是关闭的。
repl-diskless-sync-delay 5:该配置作用于全量复制阶段,当主节点使用diskless复制时,该配置决定主节点向从节点发送之前停顿的时间,单位是秒;只有当diskless复制打开时有效,默认5s。
之所以设置停顿时间,是基于以下两个考虑:(1)向slave的socket的传输一旦开始,新连接的slave只能等待当前数据传输结束,才能开始新的数据传输 (2)多个从节点有较大的概率在短时间内建立主从复制。
client-output-buffer-limit replica 256MB 64MB 60:与全量复制阶段主节点的缓冲区大小有关,该配置表示,对于 slave 客户端来说,如果 output-buffer 占用内存达到 256M 或者超过 64M 的时间达到 60s,则关闭客户端连接。
client-output-buffer-limit pubsub 32mb 8mb 60 该配置表示,对于 Pub/Sub 客户端来说,若 output-buffer 占用内存达到 32M 或者超过 8M 的时间达到 60s,则关闭客户端连接。
repl-disable-tcp-nodelay no:与命令传播阶段的延迟有关,将 hard limit 和 soft limit 同时设置为 0,则表示关闭该限制。
repl-diskless-sync-max-replicas 0 当使用延迟启动无磁盘复制时,如果连接的副本数量打到该值则会立即开始同步而不需要等待到达延迟时间;(默认0,会一直等待延迟时间到期)
repl-diskless-load disabled
同步数据时使用无磁盘复制的方式;该项有3种设置:disabled:不使用无磁盘加载(首先保存rdb文件到磁盘);on-empty-db:只有在完全安全的情况下才使用无磁盘加载;swapdb:直接从socket解析数据的时候复制一份当前db到RAM里(需要有足够内存,否则有OOM风险);(大多数情况下磁盘比网络慢,并且会增加master的COW时间和缓存,但从socket解析数据需要在完全接收rdb前刷新当前数据库数据)(该项暂为实验性功能,可能在故障转移时引发故障)
repl-ping-replica-period 10:与命令传播阶段主从节点的超时判断有关
repl-backlog-size 1mb:复制积压缓冲区的大小,见前面的介绍。
repl-backlog-ttl 3600:当主节点没有从节点时,复制积压缓冲区保留的时间,这样当断开的从节点重新连进来时,可以进行部分复制;默认3600s。如果设置为0,则永远不会释放复制积压缓冲区。
min-replicas-to-write 3与min-replicas-max-lag 10:规定了主节点的最小从节点数目,及对应的最大延迟
# By default the priority is 100.
replica-priority 100 从节点的优先级
从节点相关配置
replica-serve-stale-data yes
当slave跟master断开或者正在同步数据的时候,如果设置yes,则可能返回的数据是旧数据(首次启动slave可能数据是空的);如果设置no,会返回"SYNC with master in progress"错误(除了以下命令:INFO, replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG,SUBSCRIBE, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB,COMMAND, POST, HOST:, LATENCY);(默认yes)
replica-read