Redis 主从集群搭建

Redis 主从集群搭建

一、redis 一主二从

环境准备:

192.168.25.128:6379 主  redis6379.conf
192.168.25.128:6380 从  redis6380.conf
192.168.25.128:6381 从  redis6381.conf

主节点 redis6379.conf 配置:

port  6379         
daemonize  yes
bind  192.168.25.128
requirepass 123456
pidfile   /usr/local/redis/etc/redis_pid_6379.pid
logfile   /usr/local/redis/etc/redis_6379.log
dbfilename dump6379.rdb

从节点 redis6380.conf redis6381.conf 配置:

port  6380 #6381         
daemonize  yes
bind  192.168.25.128  
requirepass 123456
masterauth 123456
pidfile   /usr/local/redis/etc/redis_pid_6380.pid
logfile   /usr/local/redis/etc/redis_6380.log
dbfilename dump6380.rdb
slaveof  192.168.25.128 6379

分别启动三个 redis 实例:

/usr/local/redis/bin/redis-server/usr/local/redis/etc/redis6379.conf
/usr/local/redis/bin/redis-server/usr/local/redis/etc/redis6380.conf
/usr/local/redis/bin/redis-server/usr/local/redis/etc/redis6381.conf

执行 info replication 查看当前主从配置:

192.168.25.128:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.25.128,port=6380,state=online,offset=211,lag=1
slave1:ip=192.168.25.128,port=6381,state=online,offset=211,lag=1
master_repl_offset:211
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:210

192.168.25.128:6380> info replication
# Replication
role:slave
master_host:192.168.25.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:29
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

192.168.25.128:6381> info replication
# Replication
role:slave
master_host:192.168.25.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:43
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

如果如上图所示没有发现从节点,很有可能是防火墙没有开放 8000 端口导致主从节点之间没法通信。
执行以下命令:

firewall-cmd --zone=public --add-port=8000/tcp --permanent
firewall-cmd --zone=public --add-port=6800/tcp --permanent
firewall-cmd --reload

二、redis 一主二从三哨兵

Redis Sentinel 是 Redis 官方提供的集群管理工具,可以部署在其他与 redis 集群可通讯的机器中监控 redis 集群。

特性:

  • 监控:能持续监控 Redis 的主从实例是否正常工作;
  • 通知:当被监控的 Redis 实例出问题时,能通过 API 通知系统管理员或其他程序;
  • 自动故障恢复:如果主实例无法正常工作,Sentinel 将启动故障恢复机制把一个从实例提升为主实例,其他的从实例将会被重新配置到新的主实例,且应用程序会得到一个更换新地址的通知。

哨兵的作用:

  • 监控 redis (master 和 slave) 是否正常运行;
  • 当 master 运行出现状况,能够通知另外一个进程自动将 slave 切换成 master。

应用场景:
当使用 redis 做 master-slave 的高可用方案时,如果 master 宕机了,想自动进行主备切换,可以考虑使用哨兵模式。

配置文件 sentinel_26379.conf

port 26379
daemonize yes
dir "/opt/redis-3.0.0/sentinel/tmp/26379"
logfile "/opt/redis-3.0.0/sentinel/log/sentinel_26379.log"
# 当至少 2 个 Sentinel 认为主节点不可用时,触发故障转移。
sentinel monitor mymaster 192.168.25.128 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel auth-pass mymaster 123456

启动三方 sentinel :

/usr/local/redis/bin/redis-sentinel/opt/redis-3.0.0/sentinel/sentinel_26379.conf &
/usr/local/redis/bin/redis-sentinel/opt/redis-3.0.0/sentinel/sentinel_26380.conf &
/usr/local/redis/bin/redis-sentinel/opt/redis-3.0.0/sentinel/sentinel_26381.conf &

连接 sentinel 查看信息:

redis-cli -h 192.168.25.128 -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=192.168.25.128:6379,slaves=2,sentinels=3

主节点状态:

192.168.25.128:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.25.128,port=6380,state=online,offset=170809,lag=0
slave1:ip=192.168.25.128,port=6381,state=online,offset=170809,lag=0
master_repl_offset:170952
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:170951

手动关闭 Master 之后,sentinel 在监听 master 确实是断线了之后,将会开始计算权值,然后重新分配主服务器

3551:X 21 Dec 18:05:38.047 # +sdown master mymaster 192.168.25.128 6379
3551:X 21 Dec 18:05:38.146 # +new-epoch 1
3551:X 21 Dec 18:05:38.149 # +vote-for-leader 57ff9a9503775f11895a3d7e59ec116634c19718 1
3551:X 21 Dec 18:05:39.152 # +odown master mymaster 192.168.25.128 6379 #quorum 3/2
3551:X 21 Dec 18:05:39.152 # Next failover delay: I will not start a failover before Mon Dec 21 18:11:38 2020
3551:X 21 Dec 18:05:39.267 # +config-update-from sentinel 192.168.25.128:26380 192.168.25.128 26380 @ mymaster 192.168.25.128 6379
3551:X 21 Dec 18:05:39.267 # +switch-master mymaster 192.168.25.128 6379 192.168.25.128 6381
3551:X 21 Dec 18:05:39.268 * +slave slave 192.168.25.128:6380 192.168.25.128 6380 @ mymaster 192.168.25.128 6381
3551:X 21 Dec 18:05:39.274 * +slave slave 192.168.25.128:6379 192.168.25.128 6379 @ mymaster 192.168.25.128 6381
3551:X 21 Dec 18:06:39.315 # +sdown slave 192.168.25.128:6379 192.168.25.128 6379 @ mymaster 192.168.25.128 6381

6381 被选举为 Master

redis-cli -h 192.168.25.128 -p 26380 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=192.168.25.128:6381,slaves=2,sentinels=3

重新启动之前的主节点 6379,变为从节点。

redis-cli -h 192.168.25.128 -p 6379 -a 123456
192.168.25.128:6379> info replication
# Replication
role:slave
master_host:192.168.25.128
master_port:6381
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1608603251
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

Sentinel 的工作方式:

  • 每个 Sentinel 以每秒钟一次的频率向它所知的 Master,Slave 以及其他 Sentinel 实例发送一个 PING 命令
  • 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
  • 如果一个 Master 被标记为主观下线,则正在监视这个 Master 的所有 Sentinel 要以每秒一次的频率确认 Master 的确进入了主观下线状态。
  • 当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认 Master 的确进入了主观下线状态, 则 Master 会被标记为客观下线
  • 在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有 Master,Slave 发送 INFO 命令
  • 当 Master 被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次
  • 若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。

三、redis 集群搭建

3.1、拓扑与端口规划

6 个实例:3 个主节点 + 3 个从节点。
可用 3 台机器(每台跑 2 个实例),或 1 台机器(不同端口)做演示。
例:端口使用 7000-7005:
主:7000、7001、7002
从:7003(跟 7000)、7004(跟 7001)、7005(跟 7002)
生产建议:不同物理机放不同主,从节点不与其主节点在同一机器。

3.2、配置文件模板(Redis Cluster)

把下面模板保存为每个实例的 redis-.conf,并替换 PORT、IP、dir/log/pid 路径:

# 监听
port PORT
bind 0.0.0.0
protected-mode no
daemonize yes

# 持久化(生产建议开启 AOF)
appendonly yes
appendfsync everysec

# 基础目录(按实例分目录)
dir /home/software/redis-5.0.14/cluster/6379
pidfile /home/software/redis-5.0.14/cluster/6379/redis-PORT.pid
logfile /home/software/redis-5.0.14/cluster/6379/redis-PORT.log

# 集群开关
cluster-enabled yes
cluster-config-file nodes-PORT.conf
cluster-node-timeout 15000

# 跨主机部署建议设置(否则节点间可能用本地 IP)
cluster-announce-ip IP
cluster-announce-port PORT
cluster-announce-bus-port BUSPORT   # 一般为 PORT+10000,例如 17000

# 安全(可选)
# requirepass YourStrongPass
# masterauth YourStrongPass

# 内核参数(需在系统层设置,不在此文件)
# vm.overcommit_memory=1

3.3、启动实例

redis-server /home/software/redis-5.0.14/cluster/6379/redis-6379.conf
redis-server /home/software/redis-5.0.14/cluster/6380/redis-6380.conf
redis-server /home/software/redis-5.0.14/cluster/6381/redis-6381.conf
redis-server /home/software/redis-5.0.14/cluster/6382/redis-6382.conf
redis-server /home/software/redis-5.0.14/cluster/6383/redis-6383.conf
redis-server /home/software/redis-5.0.14/cluster/6384/redis-6384.conf

防火墙放行每实例的 port 与 bus-port(=port+10000),并确保节点间 IP 可互通。

3.4、创建集群(3 主 3 从)

在任意一台能访问这 6 个端口的机器执行(如果设置了密码,加 -a ):

# 自动为每个主分配一个从
redis-cli --cluster create \
  IP1:6379 IP2:6380 IP3:6381 IP4:6382 IP5:6383 IP6:7005 \
  --cluster-replicas 1

想手动精确指定谁跟谁,也可以先只传 3 个主,创建后用:

redis-cli --cluster add-node <从IP:端口> <主IP:端口> --cluster-slave --cluster-master-id <主节点ID>

3.5、验证

redis-cli -h IP -p 7000 cluster info
redis-cli -h IP -p 7000 cluster nodes
# 有密码则:redis-cli -a <pass> -h IP -p 7000 cluster nodes

看到 3 个 master、3 个 slave,并且 cluster_state:ok 即成功。

3.6、生产要点与常见坑

  • 内核参数:vm.overcommit_memory=1,关闭透明大页;somaxconn 适当调大。
  • 防火墙/安全组:放行 portbus-port(=port+10000),以及节点间互访。
  • cluster-announce-ip 必填为对等节点可达的地址(尤其是容器/多网卡环境)。
  • 同机多实例:务必使用不同的 portbus-portdirpidfilelogfile
  • 持久化:建议 appendonly yesappendfsync everysec 性能与安全平衡。
  • 认证:集群需同时设置 requirepassmasterauth(一致),并用 redis-cli -a 访问。
  • 内存与槽位:创建后会自动分配 16384 槽到 3 个 master;扩容/缩容用 redis-cli --cluster reshard
  • 监控:关注 cluster_state、复制延迟、AOF 大小。

评论

暂无

添加新评论