1 基本配置解释

  1. # 填写master节点的ip和端口号
  2. # replicaof <masterip> <masterport>
  3. # 如果master节点配置了密码,在此处填写
  4. masterauth 123456
  5. # 填写以上密码对应的用户名,如果master未做特殊设置,默认用户为default,此处可缺省
  6. # masteruser master-user
  7. # 当从节点个住节点失去联系,或者正在赋值中,此时的客户请求处理方法有2中:
  8. # 1 当设置为yes时,从节点仍然响应客户端请求,此时返回的数据可能是过期的数据也可能为空;
  9. # 2 当设置为no时,从节点将会直接返回错误信息SYNC with master in progress。
  10. replica-serve-stale-data yes
  11. # 设置从接点是否可写,不建议开启,默认为yes,就是只读
  12. replica-read-only yes
  13. # 全量同步时RDB文件传输策略:disk、socket
  14. # disk: master节点fork一个子进程将rdb文件落盘,然后父进程将RDB文件以增量的方式传输;
  15. # socket:master节点直接将rdb文件发送至socket。
  16. # 网络带宽较大,磁盘性能差的情况可以设置为yes
  17. repl-diskless-sync no
  18. # 当开启diskless时,配置同步延迟,默认为5s
  19. repl-diskless-sync-delay 5
  20. # 副本接受从master通过socket同步过来的RDB文件的策略:
  21. # disabled:直接将RDB文件存放在disk上
  22. # on-empty-db:
  23. # swapdb:从socket解析数据时,现将当前数据copy一份至内存。
  24. repl-diskless-load disabled
  25. # 副本向master发送ping时间间隔
  26. # repl-ping-replica-period 10
  27. # 同步超时时间,要比ping时间大
  28. # repl-timeout 60
  29. repl-disable-tcp-nodelay no

大多数情况下使用到的配置很简单,master节点不要配置,从节点配置如下:

  1. ################################# REPLICATION #################################
  2. replicaof <masterip> <masterport>
  3. masterauth 123456

2 如何配置一主两从

实验在同一个虚拟机内配置,启动多个redis容器实现的。
master容器:使用端口6379,并且暴露至宿主机6379;
slave01容器:使用端口6380,并且暴露至宿主机6380;
slave02容器:使用端口6381,并且暴露至宿主机6381;
主节点无需做特殊配置,正常启动即可。
从节点配置,slave01,port填写6380,其他不变。slave02 修改为6381

  1. ################################# GENERAL #####################################
  2. daemonize no # 以前端形式运行,如果守护进程运行,容器没有主进程无法启动
  3. pidfile /var/run/redis_6379.pid
  4. loglevel notice
  5. logfile ""
  6. databases 16
  7. ################################## NETWORK #####################################
  8. bind 0.0.0.0
  9. protected-mode yes
  10. port 6381
  11. tcp-backlog 511
  12. timeout 0
  13. tcp-keepalive 300
  14. ################################ SNAPSHOTTING ################################
  15. save 3600 1
  16. save 300 100
  17. save 60 10000
  18. stop-writes-on-bgsave-error yes
  19. rdbchecksum yes
  20. dbfilename dump.rdb
  21. rdb-del-sync-files no
  22. dir /data
  23. ################################## SECURITY ###################################
  24. requirepass 123456
  25. ################################# REPLICATION #################################
  26. replicaof 192.168.1.11 6379
  27. masterauth 123456

运行容器命令如下(master):

  1. docker rm -f redis
  2. current_dir=$(cd $(dirname $0);pwd)
  3. docker run -d --name redis \
  4. -p 6379:6379 \
  5. -v $current_dir/redis.conf:/etc/redis/redis.conf \
  6. -v $current_dir/data/:/data \
  7. -v /etc/localtime:/etc/localtime \
  8. redis:6.2.6 /etc/redis/redis.conf

工作目录结构

  1. [root@es01 master-slave]# tree
  2. .
  3. ├── master
  4. ├── data
  5. └── dump.rdb
  6. ├── redis.conf
  7. └── run-redis.sh
  8. ├── slave01
  9. ├── data
  10. └── dump.rdb
  11. ├── redis.conf
  12. └── run-redis.sh
  13. └── slave02
  14. ├── data
  15. └── dump.rdb
  16. ├── redis.conf
  17. └── run-redis.sh

查看启动的容器如下:

  1. # docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 7cd91d2769f6 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-slave02
  4. 676dba7f02fc 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-slave01
  5. 865cd8f81a55 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是否同步成功。

  1. # redis-cli -a 123456 -p 6379
  2. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
  3. 127.0.0.1:6379> ROLE
  4. 1) "master"
  5. 2) (integer) 4032
  6. 3) 1) 1) "172.17.0.1"
  7. 2) "6380"
  8. 3) "4032"
  9. 2) 1) "172.17.0.1"
  10. 2) "6381"
  11. 3) "4032"
  12. 127.0.0.1:6379> set k1 v1
  13. OK
  14. 127.0.0.1:6379> exit
  15. # redis-cli -a 123456 -p 6380
  16. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
  17. 127.0.0.1:6380> get k1
  18. "v1"
  19. 127.0.0.1:6380> set k2 v2
  20. (error) READONLY You can't write against a read only replica.
  21. 127.0.0.1:6380>

查看副本同步信息

  1. # 主节点查看
  2. 127.0.0.1:6379> INFO replication
  3. # Replication
  4. role:master
  5. connected_slaves:2
  6. slave0:ip=172.17.0.1,port=6380,state=online,offset=4210,lag=0
  7. slave1:ip=172.17.0.1,port=6381,state=online,offset=4210,lag=0
  8. master_failover_state:no-failover
  9. master_replid:428a1387887088b6c5b2d83c4daa547e260cb2dc
  10. master_replid2:0000000000000000000000000000000000000000
  11. master_repl_offset:4210
  12. second_repl_offset:-1
  13. repl_backlog_active:1
  14. repl_backlog_size:1048576
  15. repl_backlog_first_byte_offset:1
  16. repl_backlog_histlen:4210
  17. # 从节点查看
  18. 127.0.0.1:6380> INFO replication
  19. # Replication
  20. role:slave
  21. master_host:192.168.1.11
  22. master_port:6379
  23. master_link_status:up
  24. master_last_io_seconds_ago:4
  25. master_sync_in_progress:0
  26. slave_read_repl_offset:4196
  27. slave_repl_offset:4196
  28. slave_priority:100
  29. slave_read_only:1
  30. replica_announced:1
  31. connected_slaves:0
  32. master_failover_state:no-failover
  33. master_replid:428a1387887088b6c5b2d83c4daa547e260cb2dc
  34. master_replid2:0000000000000000000000000000000000000000
  35. master_repl_offset:4196
  36. second_repl_offset:-1
  37. repl_backlog_active:1
  38. repl_backlog_size:1048576
  39. repl_backlog_first_byte_offset:1
  40. repl_backlog_histlen:4196

3 主从复制模式原理分析

主从架构
05 主从模式-读写分离 - 图1

  • master节点作为整个集群的大脑,当主节点出现故障,那么自动不会故障转移,所以需要自己手动修复主节点,或者手动提升一个节点为主节点。
  • 第一次加入集群的节点会全量复制,之后进行增量复制;
  • 复制是非阻塞的,不影响正常接收client的请求;