Redis主从复制
1. 架构模型
主从复制模式至少要有3个redis服务器节点,每个redis服务器启动时,都默认是主机,所以只需要对从机进行配置所属主机。集群环境中,主机只做写入,从机只做读取。
2. 实现方式
由于服务器环境有限,测试将会在一个服务器启动多个redis节点模拟redis集群,实际工作环境中,redis服务端会运行在不同的服务器上。
-
准备工作:(以下文件仅在同服务器多节点测试使用,实际工作场景,多个服务器不需要配置,只需要配置从机所属主机的ip地址和端口号)
-
找到redis.conf配置文件,默认启动端口是6379,在同一目录下,复制出两份redis.conf文件,分别命名为redis-s1.conf和redis-s2.conf文件;
-
修改配置文件,以启动不同的的redis节点;
-
修改启动端口号,redis-s1.conf中的端口号修改为port 6380; redis-s2.conf中的端口号修改为port 6381;
port 6379 #redis配置 port 6380 #redis-s1.conf配置 port 6381 #redis-s2.conf配置
-
修改启动端口号文件,防止文件名重名–pidfile
-
```bash pidfile /www/server/redis/redis.pid #redis配置 pidfile /www/server/redis/redis-s1.pid #redis-s1.conf配置 pidfile /www/server/redis/redis-s2.pid #redis-s2.conf配置 ```
-
修改日志文件,防止文件名重名–logfile
logfile "/www/server/redis/redis.log" #redis配置 logfile "/www/server/redis/redis-s1.log" #redis-s1配置 logfile "/www/server/redis/redis-s2.log" #redis-s2配置
-
修改持久化文件,防止文件重名–dump.rdb
dbfilename dump.rdb # redis配置 dbfilename dump-s1.rdb # redis-s1配置 dbfilename dump-s2.rdb # redis-s2配置
-
命令行以不同的配置文件启动redis服务 ,
-
redis-server czconfig/redis.conf
-
redis-server czconfig/redis-s1.conf
-
redis-server czconfig/redis-s2.conf
-
启动redis服务端后,命令行连接服务端: redis-cli -p 端口号
-
info replication查询redis服务端信息
127.0.0.1:6380> info replication #查询服务端信息 # Replication role:master #当前角色,主机(如果没有在配置文件配置所属主机,redis启动默认就是主机) connected_slaves:0 #连接的从机数; master_failover_state:no-failover master_replid:54d5ad2b1611ff0fdd814619155d509c44ddabf9 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0
-
配置主从关系
本次测试中,我们以redis作为主机,redis-s1,redis-s2作为两个从机;
-
配置方式一,命令行配置:
slaveof ip port,本例中,直接运行slaveof 127.0.0.1 6379;运行结束后,info replication查询当前服务端信息;
127.0.0.1:6380> info replication # Replication role:slave #角色已经变成从机 master_host:127.0.0.1 #所属主机ip地址 master_port:6379 #所属主机端口号 master_link_status:up master_last_io_seconds_ago:5 master_sync_in_progress:0 slave_repl_offset:0 slave_priority:100 slave_read_only:1 replica_announced:1 connected_slaves:0 master_failover_state:no-failover master_replid:c70771a25240f22cc83f5dbd018fb5cdcbb8d5a1 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:0
查看主机服务端信息:
127.0.0.1:6379> info replication # Replication role:master #角色依旧是主机 connected_slaves:1 #有一个连接的从机 slave0:ip=127.0.0.1,port=6380,state=online,offset=238,lag=1 #连接的从机信息 master_failover_state:no-failover master_replid:c70771a25240f22cc83f5dbd018fb5cdcbb8d5a1 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:238 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:238
-
配置方式二,文件配置
replicaof <masterip> <masterport> # 注明主机的ip地址和端口号 masterauth <master-password> #如果主机需要密码,注明主机的密码
二者配置区别:如果仅仅通过命令行配置,那么这个主从关系只是暂时性的,如果从机重启,那么又会自动默认变为主机,如果通过配置文件配置,redis服务端启动时,则会找到配置文件,将自身变为从机,从属于配置好的主机
-
注意点:从机只能做数据读取,不能赋值:
127.0.0.1:6380> set k1 v1 #从机赋值报错 (error) READONLY You can't write against a read only replica
-
-
-
-
3. 主从复制原理
如果在集群过程中,从机发生故障,那么如果重启成功,连接到了主机之后,会向主机发送一个sync同步命令。主机master接收到了同步命令之后,会收集所有对数据进行修改操作命令,并在后台执行完成后,将文件传送到从机,完成一次数据同步。
- 全量同步:发生在从机启动时,主机将现有的全部数据同步给从机;因此,从机只要重连,就已经包含了主机的全量数据;
- 增量复制:主机每接收到一个数据修改命令,就传送给从机,进行增量同步;
4. 宕机后的手动处理方式
在架构模式图中的模式二中,81从属于80,80从属于79;如果主机79发生了宕机,为了不影响程序执行,需要手动设置下一个从机变成主机;命令行—slaveof no one;
127.0.0.1:6380> slaveof no one #设置当前从机为主机
OK
127.0.0.1:6380> info replication
# Replication
role:master #角色变为主机
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=84,lag=1 #从机信息
master_failover_state:no-failover
master_replid:b86d8d1ee3a3de649b7c33b1182adc7996491dbb
master_replid2:bb7ba8ece44c021dccda424238fba406d6851b55
master_repl_offset:84
second_repl_offset:85
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84
这种手动配置在实际工作场景中实用性不高,主要为了了解主从配置间的关联关系。实际工作中,以哨兵模式为主!
哨兵模式
哨兵模式主要是为了解决传统模式中,redis主机宕机后需要手动配置主机的窘境,哨兵模式下,如果主机发生故障,会自动投票从从机中选举出一个作为主机,此时若主机恢复运行,那么也会变为当前主机的从机。
1. 配置测试
-
创建redis-sentinel配置文件–redis-sentinel.conf
#sentinel monitor + 主机名(自定义)+ ip地址 + 端口号 + 客观认为主机下线的哨兵数,一般配置成哨兵节点数的一半+1; sentinel monitor mymaster 127.0.0.1 6379 1 #1,代表着,只要有1个哨兵主观认为主机下线,则进行故障转移,重新选举主机;
-
启动哨兵 redis-sentinel redis-sentinel.conf
-
此处,如果shutdown主机,模拟主机宕机,观察日志可以的出,哨兵自动选举出了一个新的主机;
-
观察80端口的redis,已经变成了主机。
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:69a92b3b1fc9652b1402c70595ad54f65fdcfc0f
master_replid2:bb7ba8ece44c021dccda424238fba406d6851b55
master_repl_offset:35053
second_repl_offset:32371
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:113
repl_backlog_histlen:34941
2.全部配置
port 26379 #端口号,后续可以模拟哨兵多集群
daemonize yes #启动保护模式
protected-mode no
dir /www/server/redis #运行目录
logfile "26379.log" #日志文件
#最重要的配置,监听主机端口号以及判断客观下线的数量
sentinel monitor mymaster 1127.0.0.1 6379 1
# 判定节点不可达的时间,单位是毫秒。
sentinel down-after-milliseconds mymaster 5000
# 主节点的密码配置,实际项目中,把主从节点的密码最好都设置成同一个
sentinel auth-pass mymaster 123456
# 故障转移后,每次向新的主节点发起复制的从节点的个数。
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间,默认是3分钟
sentinel failover-timeout mymaster 50000