Redis高可用群集---搭建(主从、哨兵、Cluster)

本文详细介绍了如何在Linux环境中搭建Redis的主从复制、哨兵模式以及Cluster集群。首先,通过修改配置文件实现主从复制,并验证其效果。接着,讲解哨兵模式的作用、原理,配置哨兵并模拟故障转移,确保高可用性。最后,探讨了Cluster集群的数据分区、高可用性和数据分片,展示了创建和测试集群的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、搭建主从复制

  • 环境
节点名	IP地址
master	192.168.3.11
slave1	192.168.3.12
slave2  192.168.3.13

1.安装redis

  • 三台服务器都需要安装
#关闭安全策略
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
  • 复制以下脚本
#!/bin/bash

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

yum -y install gcc gcc-c++ make

cd /opt
if [ ! -f " redis-5.0.7.tar.gz" ]; then
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
fi

tar zxvf redis-5.0.7.tar.gz -C /opt/
cd redis-5.0.7/
make
make PREFIX=/usr/local/redis install

yum -y install tcl expect
cd /opt/redis-5.0.7/utils/
/usr/bin/expect <<EOF
spawn ./install_server.sh
expect "instance" {send "\r"} 
expect "config" {send "\r"}
expect "log" {send "\r"}
expect "data" {send "\r"}
expect "executable" {send "/usr/local/redis/bin/redis-server\r"}
expect "abort" {send "\r"}
expect eof
EOF

ln -s /usr/local/redis/bin/* /usr/local/bin/

sed -i '/bind 127.0.0.1/c bind 0.0.0.0' /etc/redis/6379.conf
sed -i 's/appendonly no/appendonly yes/' /etc/redis/6379.conf

/etc/init.d/redis_6379 restart
/etc/init.d/redis_6379 status

netstat -natp | grep "redis"

pgrep "redis" &> /dev/null
if [ $? -eq 0 ];then
        echo -e "\033[46;37m Redis 服务运行正常 \033[0m"
else
        echo -e "\033[46;37m Redis 服务运行异常,请检查 \033[0m"
fi
sleep 2
echo ' '
echo -e "\033[46;37m Redis 未设置密码,执行 redis-cli 命令登录 \033[0m"

2.修改Redis配置文件

  • master节点
vim /etc/redis/6379.conf

bind 0.0.0.0                        
#70行,修改监听地址为 0.0.0.0

daemonize yes                       
#137行,开启守护进程

logfile /var/1og/redis_6379.1og    
#172行,指定日志文件目录

dir /var/lib/redis/6379             
#264行,指定工作目录

appendonly yes                      
#700行,开启 AOF 持久化功能

/etc/init.d/redis_6379 restart
#重启服务使配置生效
  • Slave1/2节点
vim /etc/redis/6379.conf

bind 0.0.0.0                        
#70行,修改监听地址为 0.0.0.0

daemonize yes                       
#137行,开启守护进程

logfile /var/log/redis_6379.log   
#172行,指定日志文件目录

dir /var/lib/redis/6379             
#264行,指定工作目录

replicaof 192.168.3.11 6379       
#288行,指定要同步的 Master 节点 IP 和端口

appendonly yes                      
#700行,开启 AOF 持久化功能

/etc/init.d/redis_6379 restart
#重启服务使配置生效

3.验证主从效果

  • 主节点查看日志
tail -f /var/log/redis_6379.log

在这里插入图片描述

  • 在主节点验证
[root@c7-1 ~]# redis-cli info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.3.13,port=6379,state=online,offset=448,lag=1
slave1:ip=192.168.3.12,port=6379,state=online,offset=448,lag=1
master_replid:a1e500591376020abc8f501177a9d1bf8a506350	//master启动时生成的40位16进制的随机字符串,用来标识master节点
master_replid2:0000000000000000000000000000000000000000	//切换主从的时候master节点标识会有更改
master_repl_offset:448	
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:448

4.报错排查

① WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128
当前每一个端口最大的监听队列的长度不满足这个高负载环境,需要调整

解决办法
echo 2048 > /proc/sys/net/core/somaxconn

② WARNING overcommit_memory is set to 0! Background save may fail under low memory condition
内存超额警告,当前内存设置为0会导致后台保存失败

解决办法:
echo "vm.overcommit_memory=1" > /etc/sysctl.conf
#刷新配置文件保其生效
sysctl vm.overcommit_memory=1

③ WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis
内核中启用了透明大页面(THP)支持会将导致Redis的延迟和内存使用问题

解决:
echo never > /sys/kernel/mm/transparent_hugepage/enabled

④ Error condition on socket for SYNC: Connection reset by peer
连接被拒绝,因为主服务器可能绑定了自身IP地址

解决办法
主节点配置文件
bind 0.0.0.0

二、搭建哨兵模式

  • 在主从复制的基础上起到主节点自动故障转移的作用

1.作用及原理

1.1 哨兵模式的作用

  • 监控
    哨兵会不断地检查主节点和从节点是否运作正常
  • 自动故障转移
    当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点
  • 通知
    哨兵可以将故障转移的结果发送给客户端

1.2 哨兵模式的原理

  • 它一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master 并将所有 slave 连接到新的 Master

  • 整个运行哨兵的集群的数量不得少于 3 个节点

1.3 结构

  • 哨兵结构由两部分组成,哨兵节点和数据节点:

  • 哨兵节点
    哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的 redis 节点,不存储数据

  • 数据节点
    主节点和从节点都是数据节点

1.4 工作过程

  • 哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式,所以节点上都需要部署哨兵模式,哨兵模式会监控所有的 Redis 工作节点是否正常

  • 当 Master 出现问题的时候,因为其他节点与主节点失去联系,因此会投票,投票过半就认为这个 Master 的确出现问题,然后会通知哨兵间会推选出一个哨兵来进行故障转移工作(由该哨兵来指定哪个 slave 来做新的 master),然后从 Slaves 中选取一个作为新的 Master筛选方式是哨兵互相发送消息,并且参与投票,票多者当选

  • 需要特别注意的是,客观下线是主节点才有的概念,即如果从节点和哨兵节点发生故障,被哨兵主观下线后,将不会再有后续的客观下线和故障转移操作(及哨兵模式只负责 Master 的方面,而不管Slaves)

  • 当某个哨兵发现主服务器挂掉了,会将 master 中的 SentinelRedistance 中的 master改为SRI_S_DOWN(主观下线),并通知其他哨兵,告诉他们发现 master 挂掉了其他哨兵在接收到该哨兵发送的信息后,也会尝试去连接 master,如果超过半数(配置文件中设置的)确认 master 挂掉后,会将master 中的 SentinelRedistance 中的 master 改为 SRI_O_DOWN(客观下线)

2.环境

节点名	IP地址
master	192.168.3.11
slave1	192.168.3.12
slave2  192.168.3.13

3.修改哨兵配置文件

vim /opt/redis-5.0.7/sentinel.conf

#17行,关闭保护模式
protected-mode no		

#21行,Redis哨 兵默认的监听端口
port 26379			

#26行 开启守护进程
daemonize yes		

#36行,指定日志存放路径
logfile "/var/log/sentinel.log"		

#65行,指定数据库存放路径
dir "/var/lib/redis/6379"		

#84行,指定哨兵节点
#2表示,至少需要 2 个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel monitor mymaster 192.168.3.11 6379 2 	

#113行,判定服务器down掉的时间周期,默认30000毫秒 (30秒 )
sentinel down-after-milliseconds mymaster 3000 		

#146行,故障节点的最大超时时间为180000 (180秒)
sentinel failover-timeout mymaster 180000	

4.启动哨兵模式

  • 先启动主节点在启动从节点
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &
  • 查看哨兵信息
[root@master redis-5.0.7]# redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.226.128:6379,slaves=2,sentinels=1

在这里插入图片描述

  • 模拟故障
模拟故障(rm -rf /var/run/redis_6379.pid)

#查看 redis-server 的进程号
[root@c7-1 redis-5.0.7]# netstat -anpt|grep redis
tcp        0      0 0.0.0.0:26379           0.0.0.0:*               LISTEN      9818/redis-sentinel 
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      7616/redis-server 0 

kill -9 7616
#杀死 Master 节点上的 redis-server 的进程号

在这里插入图片描述

  • 再次查看哨兵信息
[root@c7-1 redis-5.0.7]# redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.3.13:6379,slaves=2,sentinels=3


PS:status=odown:
o即objectively ,客观

#查看master哨兵日志
验证结果
tail -f /var/log/sentinel.log

redis-cli -p 26379 info Sentinel

在这里插入图片描述

三、搭建Cluster集群

  • 主节点负责读写请求和集群信息的维护,从节点只进行主节点数据和状态信息的复制

1.作用

1.1 数据分区

  • 数据分区(或称数据分片)是集群最核心的功能
  • 集群将数据分散到多个节点,一方面突破了 Redis 单机内存大小的限制,存储容量大大增加,另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力
  • Redis 单机内存大小受限问题,在介绍持久化和主从复制时都有提及
  • 例如,如果单机内存太大,bgsave 和 bgrewriteaof 的 fork 操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出

1.2 高可用

  • 集群支持主从复制和主节点的自动故障转移(与哨兵类似),当任意节点发送故障时,集群仍然可以对外提供服务

1.3 数据分片

  • Redis 集群引入了哈希槽的概念,有 16384 个哈希槽(编号 0~16383)
  • 集群的每个节点负责一部分哈希槽,每个 Key 通过 CRC16 校验后对 16384 取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作
  • 以 3 个节点组成的集群为例:
    节点 A 包含 0~5469 号的哈希槽
    节点 B 包含 5461~10922 号的哈希槽
    节点 C 包含 10923~16383 号的哈希槽

2.环境

  • redis的集群一般需要6个节点,3主3从。方便起见,这里所有节点在同一台服务器上模拟:
  • 以端口号进行区分:3个主节点端口号:6001/6002/6003, 对应的从节点端口号:6004/ 6005/ 6006

3.创建端口工作目录

  • 创建redis 6个端口的工作目录
cd /etc/redis/
mkdir -p redis-cluster/redis600{1..6}

#一键复制 6001~6006 脚本
vim /opt/redis.sh
#!/bin/bash
for i in {1..6}
do
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done

sh -x /opt/redis.sh

4.修改配置文件

cd /etc/redis/redis-cluster/redis6001
vim redis.conf

bind 127.0.0.1
#69行,注释掉bind项或不修改,默认监听所有网卡

protected-mode no
#88行,修改,关闭保护模式

port 6001
#92行,修改,redis监听端口,

daemonize yes
#136行,开启守护进程,以独立进程启动

cluster-enabled yes
#832行,取消注释,开启群集功能

cluster-config-file nodes-6001.conf
#840行,取消注释,群集名称文件设置

cluster-node-timeout 15000
#846行,取消注释群集超时时间设置

appendonly yes
#700行,修改,开启AOF持久化

其他5个配置文件除端口号和集群配置文件名称外改动相同
cp redis.conf ../redis6002/
cp redis.conf ../redis6003/
cp redis.conf ../redis6004/
cp redis.conf ../redis6005/
cp redis.conf ../redis6006/
  • 编写启动脚本
#根据对应配置文件启动redis
vim /opt/redis_start.sh
#!/bin/bash
for d in {1..6}
do
cd /etc/redis/redis-cluster/redis600$d
redis-server redis.conf
done
ps -ef | grep redis

sh -x /opt/redis_start.sh

在这里插入图片描述

5.加入集群

redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1

#六个实例分为三组,每组一主一从,前面的做主节点,后面的做从节点
#下面交互的时候需要输入 yes 才可以创建
#-replicas 1 表示每个主节点有一个从节点

在这里插入图片描述

6.测试集群

redis-cli -p 6001 -c         #加-c参数,节点之,间就可以互相跳转
127.0.0.1:6001> cluster slots    #查看节点的哈希槽编号范围
1) 1) (integer) 5461
   2) (integer) 10922        #哈希槽编号范围
   3) 1) "127.0.0.1"
      2) (integer) 6003        #主节点IP和端口号
      3) " fdca661922216dd69a63a7c9d3c4540cd6baef44"
   4) 1) "127.0.0.1"
      2) (integer) 6004        #从节点IP和端口号
     3) " a2c0c32aff0f38980accd2b63d6d952812e44740"
2) 1) (integer) 0
   2) (integer) 5460
   3) 1) "127.0.0.1"
      2) (integer) 6001
      3) "0e5873747a2e26bdc935bc76c2bafb19d0a54b11"
      4) 1) "127.0.0.1"
         2) (integer) 6006
         3) "8842ef5584a85005e135fd0ee59e5a0d67b0cf8e"
3) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "127.0.0.1"
      2) (integer) 6002
      3) "81 6ddaa3d1469540b2ffbcaaf9aa867646846b30"
   4) 1) "127.0.0.1"
      2) (integer) 6005
      3) " f847077bfe6722466e96178ae8cbb09dc8b4d5eb"

在这里插入图片描述

  • 在6001创建数据,并查看他的槽位
127.0.0.1:6001> set name zhangsan	
-> Redirected to slot [5798] located at 127.0.0.1:6002	//分片到6002进行存储
OK							
127.0.0.1:6002> cluster keyslot name	//查看name键的槽编号
(integer) 5798			//槽位5798 属于6002节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值