redis-10 主从复制/集群

主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器,前者称为主节点(master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点,master以写为主,slave以读为主
默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能由一个主节点
主从复制的作用主要包括:
1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余
3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分但服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量
4、高可用基石:除了上述作用外,主从复制还是哨兵和集群能够实施的基础。因此可以说主从复制是Redis高可用的基础

一般来说,要将Redis运用于工程项目中,只使用一台redis是万万不能的,因为:
1、从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力太大
2、从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量为256GB,也不能将所有内存用做Redis存储内存,一般来说,单台Redis最大使用内存不应该超过20GB

配置一个redis集群 至少一主两从 三台才行,不然主节点挂掉 剩下一台从节点无法选举主节点

环境配置

因为redis默认是主节点,所以只需要配置从库即可,不需要设置主库

127.0.0.1:6379> info replication  // 查看当前库的信息
# Replication
role:master // 现在库的角色是master(默认)
connected_slaves:0  // 0表示没有从机
master_replid:b63c906c501143759cb........
master_replid2:000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
reol_backlog_first_byte_offset:0
repl_backlog_histlen:0

配置主从关系

127.0.0.1:6380> SLAVEOF 127.0.0.1 6379  // 将6379端口的redis设置为6380redis的主机
# 主机
127.0.0.1:6379> info replication 
# Replication
role:master 
connected_slaves:1  
slave0: ip=127.0.0.1,prot=6380, state=online,offset=42,lag=1
master_replid:b63c906c501143759cb........
master_replid2:000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
reol_backlog_first_byte_offset:1
repl_backlog_histlen:42
# 从机
127.0.0.1:6380> info replication 
# Replication
role:slave
master_host:127.0.0.1
master_port: 6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:b63c906c501143759cb........
master_replid2:000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
reol_backlog_first_byte_offset:1
repl_backlog_histlen:14

用命令是临时配置,真正的长期配置要从配置文件里配置放开replicaof <masterip> <masterport>的注释 设置主机的ip和port即可

比如要部署 三主三从集群要修改配置文件
准备三台机器 192.168.1.10, 192.168.1.11, 192.168.1.12
建议使用 Redis 5.0 或更高版本,因为它内置了集群管理工具 redis-cli --cluster,操作更方便
1、准备目录和配置文件:为每个节点创建工作目录,并将修改好的配置文件放入其中

cd /usr/local/bin/kconfig
vim redis.conf
// 修改端口(保证同一ip下多实例的端口唯一)
port 6380
// 启用集群模式
cluster-enabled yes
// 指定集群节点配置文件 Redis自动维护的文件,记录集群节点信息,无需手动创建。建议文件名包含端口号以便区分  nodes-6380.conf不是redis.conf 而是启动redis后自动生成的一个记录节点信息的文件
cluster-config-file nodes-6380.conf
// 节点超时时间(毫秒)如果一个节点超过此时间未响应,集群会将其标记为失效,并可能触发故障转移
cluster-node-timeout  5000
// 是否开启守护进程后端运行
daemonize yes
// 指定PID文件路径 方便管理进程,建议改为和端口号一致
pidfile /var/run/redis_6380.pid
//修改 日志的文件名称
logfile "slave01.log"
// 修改持久化文件路径,非常重要,每个节点必须使用不同的目录,防止数据互相覆盖或丢失
dir /data/redis/6380/
// 是否开启aof持久化 一般生产环境是要打开的
appendonly yes
// 设置redis访问密码 (可选 建议打开)
requirepass 123456
// 如果设置了 requirepass,必须设置此项,用于从节点连接主节点
masterauth 123456

2、启动所有Redis节点
修改完毕后启动各个节点使用 redis-server /path/to/redis.conf 命令启动每个节点 共6个服务

192.168.1.10 => redis-server /kconfig/redis6379.conf
192.168.1.10 => redis-server /kconfig/redis6380.conf
192.168.1.11 => redis-server /kconfig/redis6379.conf
192.168.1.11 => redis-server /kconfig/redis6380.conf
192.168.1.12 => redis-server /kconfig/redis6379.conf
192.168.1.12 => redis-server /kconfig/redis6380.conf

3、创建集群
使用 redis-cli --cluster create 命令将所有节点关联起来

// 因为设置了访问密码 需要处理一下
# 1. 设置临时环境变量(只在当前会话有效)
export REDISCLI_AUTH=123456
# 2. 创建集群
redis-cli --cluster create \
  192.168.1.10:6379 \
  192.168.1.10:6380 \
  192.168.1.11:6379 \
  192.168.1.11:6380 \
  192.168.1.12:6379\
  192.168.1.12:6380\
  --cluster-replicas 1 
# 3. 创建成功后马上清除变量
unset REDISCLI_AUTH

这里先设置变量将访问密码写进变量 再删除而不是用redis-cli --cluster create ... --cluster-replicas 1 -a 123456 这种方式, 是防止通过 .bash_history 或者通过 ps aux | grep redis 泄露密码明文。
--cluster-replicas 1 表示为每个主节点分配1个从节点
PS: 在命令中指定了 --cluster-replicas 1 时,Redis 严格遵守“先来后到”

  • 前 N 个节点(N = 总节点数 / 2)→ 自动成为主节点
  • 后 N 个节点 → 按顺序依次成为前 N 个主节点的从节点

按上面命令的顺序来看:
192.168.1.10:6379,192.168.1.10:6380,192.168.1.11:6379 这三个服务为主节点
192.168.1.11:6380,192.168.1.12:6379,192.168.1.12:6380 这三个服务为从节点,
192.168.1.10:6379,192.168.1.10:6380 这两个主节点被分到了同一台机器上,很明显和我们想要的一台机器上 一主一从的模式相悖,
我们想要的是一个主节点对应一个从节点且主节点和从节点分布在不同的机器上,这里就要手动进行排序再执行命令了

redis-cli --cluster create \
  192.168.1.10:6379 \
  192.168.1.11:6379 \
  192.168.1.12:6379 \
  192.168.1.11:6380 \
  192.168.1.12:6380\
  192.168.1.10:6380\
  --cluster-replicas 1 

192.168.1.10:6379(主) -> 192.168.1.11:6380(从)
192.168.1.11:6379(主) -> 192.168.1.12:6380(从)
192.168.1.12:6379(主) -> 192.168.1.10:6380(从)

// 三主六从的配置方案
redis-cli -a 123456 --cluster create \
  192.168.1.10:6379 \   # 主1 (机器A)
  192.168.1.11:6379 \   # 主2 (机器B)
  192.168.1.12:6379 \   # 主3 (机器C)
  192.168.1.11:6380 \   # 从1 (机器B) -> 跟随 主1
  192.168.1.12:6380 \   # 从2 (机器C) -> 跟随 主1
  192.168.1.10:6380 \   # 从3 (机器A) -> 跟随 主2
  192.168.1.12:6381 \   # 从4 (机器C) -> 跟随 主2
  192.168.1.10:6381 \   # 从5 (机器A) -> 跟随 主3
  192.168.1.11:6381 \   # 从6 (机器B) -> 跟随 主3
  --cluster-replicas 2

注意:在执行 redis-cli --cluster create 之前,必须确保这 6 个节点内部的数据都是空的。
如果某个节点(如:192.168.1.10:6379)之前写过数据,或者残留了旧的集群配置信息,create 命令会直接报错:
[ERR] Node 192.168.1.10:6379 is not empty.
解决方法:在创建集群前,登录每个节点执行一次 FLUSHALL 命令,清空所有数据,并删除启动时自动生成的 nodes-6379.conf 文件,确保它们是绝对的“处女节点”。

4、检查集群
验证集群状态:使用 redis-cli --cluster check <任意节点IP>:<端口> 检查集群是否正常
Redis Cluster (集群模式) 自带哨兵

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容