一、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-
# 监听
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适当调大。 - 防火墙/安全组:放行
port与bus-port(=port+10000),以及节点间互访。 cluster-announce-ip必填为对等节点可达的地址(尤其是容器/多网卡环境)。- 同机多实例:务必使用不同的
port、bus-port、dir、pidfile、logfile。 - 持久化:建议
appendonly yes;appendfsync everysec性能与安全平衡。 - 认证:集群需同时设置
requirepass与masterauth(一致),并用redis-cli -a访问。 - 内存与槽位:创建后会自动分配 16384 槽到 3 个 master;扩容/缩容用
redis-cli --cluster reshard。 - 监控:关注
cluster_state、复制延迟、AOF 大小。
评论