1 基本配置解释
# 填写master节点的ip和端口号# replicaof <masterip> <masterport># 如果master节点配置了密码,在此处填写masterauth 123456# 填写以上密码对应的用户名,如果master未做特殊设置,默认用户为default,此处可缺省# masteruser master-user# 当从节点个住节点失去联系,或者正在赋值中,此时的客户请求处理方法有2中:# 1 当设置为yes时,从节点仍然响应客户端请求,此时返回的数据可能是过期的数据也可能为空;# 2 当设置为no时,从节点将会直接返回错误信息SYNC with master in progress。replica-serve-stale-data yes# 设置从接点是否可写,不建议开启,默认为yes,就是只读replica-read-only yes# 全量同步时RDB文件传输策略:disk、socket# disk: master节点fork一个子进程将rdb文件落盘,然后父进程将RDB文件以增量的方式传输;# socket:master节点直接将rdb文件发送至socket。# 网络带宽较大,磁盘性能差的情况可以设置为yesrepl-diskless-sync no# 当开启diskless时,配置同步延迟,默认为5srepl-diskless-sync-delay 5# 副本接受从master通过socket同步过来的RDB文件的策略:# disabled:直接将RDB文件存放在disk上# on-empty-db:# swapdb:从socket解析数据时,现将当前数据copy一份至内存。repl-diskless-load disabled# 副本向master发送ping时间间隔# repl-ping-replica-period 10# 同步超时时间,要比ping时间大# repl-timeout 60repl-disable-tcp-nodelay no
大多数情况下使用到的配置很简单,master节点不要配置,从节点配置如下:
################################# REPLICATION #################################replicaof <masterip> <masterport>masterauth 123456
2 如何配置一主两从
实验在同一个虚拟机内配置,启动多个redis容器实现的。
master容器:使用端口6379,并且暴露至宿主机6379;
slave01容器:使用端口6380,并且暴露至宿主机6380;
slave02容器:使用端口6381,并且暴露至宿主机6381;
主节点无需做特殊配置,正常启动即可。
从节点配置,slave01,port填写6380,其他不变。slave02 修改为6381
################################# GENERAL #####################################daemonize no # 以前端形式运行,如果守护进程运行,容器没有主进程无法启动pidfile /var/run/redis_6379.pidloglevel noticelogfile ""databases 16################################## NETWORK #####################################bind 0.0.0.0protected-mode yesport 6381tcp-backlog 511timeout 0tcp-keepalive 300################################ SNAPSHOTTING ################################save 3600 1save 300 100save 60 10000stop-writes-on-bgsave-error yesrdbchecksum yesdbfilename dump.rdbrdb-del-sync-files nodir /data################################## SECURITY ###################################requirepass 123456################################# REPLICATION #################################replicaof 192.168.1.11 6379masterauth 123456
运行容器命令如下(master):
docker rm -f rediscurrent_dir=$(cd $(dirname $0);pwd)docker run -d --name redis \-p 6379:6379 \-v $current_dir/redis.conf:/etc/redis/redis.conf \-v $current_dir/data/:/data \-v /etc/localtime:/etc/localtime \redis:6.2.6 /etc/redis/redis.conf
工作目录结构
[root@es01 master-slave]# tree.├── master│ ├── data│ │ └── dump.rdb│ ├── redis.conf│ └── run-redis.sh├── slave01│ ├── data│ │ └── dump.rdb│ ├── redis.conf│ └── run-redis.sh└── slave02├── data│ └── dump.rdb├── redis.conf└── run-redis.sh
查看启动的容器如下:
# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES7cd91d2769f6 redis:6.2.6 "docker-entrypoint.s…" 9 minutes ago Up 9 minutes 6379/tcp, 0.0.0.0:6381->6381/tcp, :::6381->6381/tcp redis-slave02676dba7f02fc redis:6.2.6 "docker-entrypoint.s…" 11 minutes ago Up 11 minutes 6379/tcp, 0.0.0.0:6380->6380/tcp, :::6380->6380/tcp redis-slave01865cd8f81a55 redis:6.2.6 "docker-entrypoint.s…" 17 minutes ago Up 17 minutes 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis
检查Redis主备,master节点set,检查slave是否同步成功。
# redis-cli -a 123456 -p 6379Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.127.0.0.1:6379> ROLE1) "master"2) (integer) 40323) 1) 1) "172.17.0.1"2) "6380"3) "4032"2) 1) "172.17.0.1"2) "6381"3) "4032"127.0.0.1:6379> set k1 v1OK127.0.0.1:6379> exit# redis-cli -a 123456 -p 6380Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.127.0.0.1:6380> get k1"v1"127.0.0.1:6380> set k2 v2(error) READONLY You can't write against a read only replica.127.0.0.1:6380>
查看副本同步信息
# 主节点查看127.0.0.1:6379> INFO replication# Replicationrole:masterconnected_slaves:2slave0:ip=172.17.0.1,port=6380,state=online,offset=4210,lag=0slave1:ip=172.17.0.1,port=6381,state=online,offset=4210,lag=0master_failover_state:no-failovermaster_replid:428a1387887088b6c5b2d83c4daa547e260cb2dcmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:4210second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:4210# 从节点查看127.0.0.1:6380> INFO replication# Replicationrole:slavemaster_host:192.168.1.11master_port:6379master_link_status:upmaster_last_io_seconds_ago:4master_sync_in_progress:0slave_read_repl_offset:4196slave_repl_offset:4196slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:428a1387887088b6c5b2d83c4daa547e260cb2dcmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:4196second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:4196
3 主从复制模式原理分析
主从架构
- master节点作为整个集群的大脑,当主节点出现故障,那么自动不会故障转移,所以需要自己手动修复主节点,或者手动提升一个节点为主节点。
- 第一次加入集群的节点会全量复制,之后进行增量复制;
- 复制是非阻塞的,不影响正常接收client的请求;
