主从模式介绍
Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。下图为级联结构。
主从同步过程
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
- 从服务器连接主服务器,发送SYNC命令;
- 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
- 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
- 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
- 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
- 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
主从模式搭建
本例采用单例的1主2从的搭建方式。
服务类型角色IP地址端口
Redis
master
127.0.0.1
17007
Redis
slave
127.0.0.1
17008
Redis
slave
127.0.0.1
17009
1、首先准备一个redis实例,参考【Redis】安装及简单使用
2、准备一份主配置文件,端口是17007
1 # 包含文件(redis-base.conf,文件从redis安装目录中拷贝的)2 include /data/soft/redis-sentinel/redis-base.conf3
4 # 将redis-base.conf文件中,bind注释,需要在外网访问,将protected-model改为no5 protected-mode no6
7 # 端口8 port 170079
10 # 后台运行11 daemonize yes12
13 # pid文件14 pidfile redis_17007.pid15
16 # 日志文件17 logfile "/data/log/redis-sentinel-log/redis-17007-log/redis-17007.log"18
19 # 主认证密码20 masterauth 12345621
22 # 认证密码23 requirepass 12345624
25 # 最大内存10M,一般为机器内存的3/426 maxmemory 10mb27
28 # 内存达到最大时策略,可选择其他策略29 maxmemory-policy volatile-lru30
31 # 目录32 dir /data/soft/redis-sentinel/redis-17007/33
34 # 快照文件35 dbfilename dump-17007.rdb
3、准备一份从配置文件,端口是17008,17009,在主配置文件的基础上,修改相应配置,并加上以下2行
1 # 从节点要跟随的主节点2 slaveof 192.168.0.3 170073
4 # 主节点认证密码,如果设置了密码,就要设置5 masterauth 123456
4、目录结构如图:
5、先启动主节点,然后启动从节点
主节点启动命令:redis-5.0.5/src/redis-server redis-17007/redis-17007.conf
从节点启动命令:redis-5.0.5/src/redis-server redis-17008/redis-17008.conf
6、redis客户端链接主节点,查看信息
命令:redis-5.0.5/src/redis-cli -c -h 192.168.0.3 -p 17007 -a 123456
主节点信息:
1 192.168.0.3:17007> INFO Replication2 # Replication3 role:master4 connected_slaves:25 slave0:ip=192.168.0.3,port=17008,state=online,offset=1373,lag=06 slave1:ip=192.168.0.3,port=17009,state=online,offset=1373,lag=17 master_replid:535c43ecbf009f8eae1930d52c2fc6149432b5ee8 master_replid2:00000000000000000000000000000000000000009 master_repl_offset:137310 second_repl_offset:-111 repl_backlog_active:112 repl_backlog_size:104857613 repl_backlog_first_byte_offset:114 repl_backlog_histlen:1373
从节点信息:
1 192.168.0.3:17008> INFO Replication2 # Replication3 role:slave4 master_host:192.168.0.35 master_port:170076 master_link_status:up7 master_last_io_seconds_ago:58 master_sync_in_progress:09 slave_repl_offset:126110 slave_priority:10011 slave_read_only:112 connected_slaves:013 master_replid:535c43ecbf009f8eae1930d52c2fc6149432b5ee14 master_replid2:000000000000000000000000000000000000000015 master_repl_offset:126116 second_repl_offset:-117 repl_backlog_active:118 repl_backlog_size:104857619 repl_backlog_first_byte_offset:120 repl_backlog_histlen:1261
7、测试,在主节点存入缓存,在从节点取出缓存
1 192.168.0.3:17007> set foo bar2 OK3 192.168.0.3:17007> get foo4 "bar"5 192.168.0.3:17008> get foo6 "bar"7 192.168.0.3:17009> get foo8 "bar"