1、主从模式介绍:
redis的主从模式,使用异步复制,slave节点异步从master节点复制数据,master节点提供读写服务,slave节点只提供读服务(这个是默认配置,可以通过修改配置文件 slave-read-only 控制)。master节点可以有多个从节点。配置一个slave节点只需要在redis.conf文件中指定 slaveof master-ip master-port 即可。
redis主从复制的一些特点:
- master可以有多个slave。
- 除了多个slave连到相同的master外,slave也可以连接其他slave形成图状结构。
- 主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求。
- 主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于client的读请求,比如sort操作可以使用slave来处理。也可以用来做简单的数据冗余。
- 可以在master禁用数据持久化,只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化。
- 倘若主节点出现了故障,我们就得人工将一个从节点晋升为一个主节点,然后修改其他的从节点的主从复制,修改应用的主节点的地址,并且人工控制不能保证即使行。
- 主节点写入与存储的能力受到单个机器的限制。
2、主从复制环境搭建:
这里使用一台服务器搭建。
- redis安装与单机版安装一致.
- 将在redis.conf 分别复制到redis-7001、redis-7002、redis-7003目录下。
[root@localhost redis-master-slaver]# pwd
/usr/local/redis/redis-master-slaver
[root@localhost redis-master-slaver]# ll
drwxr-xr-x. 2 root root 4096 May 23 06:54 bin
drwxr-xr-x. 6 root root 4096 May 23 06:56 redis-7001
drwxr-xr-x. 6 root root 4096 May 23 10:35 redis-7002
drwxr-xr-x. 6 root root 4096 May 23 10:35 redis-7003
[root@localhost redis-7001]# cd redis-7001/conf/
[root@localhost conf]# ll
-rw-r--r--. 1 root root 57869 May 23 06:57 redis-7001.conf
- 配置master节点7001:
bind 0.0.0.0 #绑定地址
requirepass 123456 #启用密码认证
#默认master节点修改这两项就可以了,也可以进行其他设置
- 配置slave节点7002、7003
bind 0.0.0.0
slaveof 192.168.26.128 7001 #定义master信息
masterauth 123456 #认证
-
启动服务: ./start-master-slaver
drwxr-xr-x. 2 root root 4096 May 23 06:54 bin
drwxr-xr-x. 6 root root 4096 May 23 06:56 redis-7001
drwxr-xr-x. 6 root root 4096 May 23 10:35 redis-7002
drwxr-xr-x. 6 root root 4096 May 23 10:35 redis-7003
-rwxr-xr-x. 1 root root 261 May 23 11:07 start-master-slaver
[root@localhost redis-master-slaver]# cat start-master-slaver
/usr/local/redis/redis-master-slaver/bin/redis-server redis-7001/conf/redis-7001.conf
/usr/local/redis/redis-master-slaver/bin/redis-server redis-7002/conf/redis-7002.conf
/usr/local/redis/redis-master-slaver/bin/redis-server redis-7003/conf/redis-7003.conf
-
登录到master节点查看信息:
[root@localhost redis-master-slaver]# bin/redis-cli -h 127.0.0.1 -p 7001 -a 123456
127.0.0.1:7001> info replication
# Replication
role:master #自己角色
connected_slaves:2 #从节点数量
slave0:ip=127.0.0.1,port=7002,state=online,offset=1722,lag=0 #从节点信息
slave1:ip=127.0.0.1,port=7003,state=online,offset=1722,lag=0 #从节点信息
master_replid:a460fe6d143a55fbdcf54a955a21cb4e1be32547
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1722
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1722
- 登录到slaver节点查看信息:
[root@localhost redis-master-slaver]# bin/redis-cli -h 127.0.0.1 -p 7002
127.0.0.1:7002> info replication
# Replication
role:slave #自己角色
master_host:127.0.0.1 #主节点ip
master_port:7001 #主节点端口
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:2612
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:a460fe6d143a55fbdcf54a955a21cb4e1be32547
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2612
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2612
- 主从复制验证
在master节点设置一个key,看两个slave节点复制情况:
[root@localhost redis-master-slaver]# bin/redis-cli -h 127.0.0.1 -p 7001 -a 123456
127.0.0.1:7001> set productId 001
OK
127.0.0.1:7002> get productId
"001"
127.0.0.1:7001> quit
两个slave节点查看:
[root@localhost redis-master-slaver]# bin/redis-cli -h 127.0.0.1 -p 7002
127.0.0.1:7002> get productId
"001"
127.0.0.1:7002> quit
[root@localhost redis-master-slaver]# bin/redis-cli -h 127.0.0.1 -p 7003
127.0.0.1:7003> get productId
"001"
3、slave节点定义通过指令设置
slave节点定义也可以通过指令设置,设置后立即生效,并且会被保存至配置文件中,指令配置方式如下:
配置slave节点:
redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>
redis-cli> CONFIG SET masterauth <PASSWORD>
4、redis主从复制相关配置
下面是redis主从复制场景的一些可调参数,需要根据实际环境调整
- slave-serve-stale-data yes #是否可以把不新鲜的数据服务与客户端
- slave-read-only yes #从节点只读,启用slaveof定义后才生效
- repl-diskless-sync no #是否同时向多个从节点同时发数据
- repl-diskless-sync-delay 5 #发送的延迟时间
- repl-ping-slave-period 10 #探测从节点状态
- repl-timeout 60 #探测节点超时时间
- repl-disable-tcp-nodelay no #启用nodelay
- repl-backlog-size 1mb
- slave-priority 100 #从节点优先级,复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举;
- min-slaves-to-write 3 #主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作;
- min-slaves-max-lag 10 #从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;