Redis集群搭建

Redis下载地址:https://download.redis.io/releases

集群概述

Redis集群模式(主从复制,哨兵模式,Cluster集群。)
一、主从复制
在这里插入图片描述

基本原理:
当新建立一个从服务器时,从服务器将向主服务器发送SYNC命令,接收到SYNC命令后的主服务器会进行一次BGSAVE命令,在执行期间,会将所有命令写入缓冲区中,当BGSAVE命令执行完毕之后会将生成的RDB文件发送给从服务器,从服务器使用这个文件加载数据到内存中,之后主服务器会以Redis命令协议的格式将缓冲区的命令发送给从服务器。此后每次主服务执行命令都会同步给从服务器。即使有多个从服务器向主服务器发送SYNC命令,主服务器也只会执行一个BGSAVE命令,就可以处理接下来的同步请求。一个主服务器可以拥有多个从服务器,而从服务器也可拥有从服务器,从而形成一个图状结构,复制功能不会阻塞主服务器,即使有一个或多个同步请求,主服务器依然能处理命令请求。
持久化开关:
当配置了主从复制模式时需要开启主服务器的持久化功能,如果将主服务器的持久化功能关闭,主服务器一旦重启,所有从服务器的数据将会丢失,即使配置了Sentinel模式,如果主服务器自动拉起进程比较快,以至于在Sentinel模式下还未选举出新的主服务器,主服务的启动也会造成子服务器的数据丢失。

二、 哨兵模式
在这里插入图片描述

Redis的Sentinel系统用于管理多个Redis,主要执行以下三件事:

监控:Sentinel会不断的检查主从服务器运行状态

提醒:当某个Redis服务器出现故障,可通过API或者其他应用程序发送通知

自动故障迁移:当一个主服务器不能正常工作时,Sentinel会进行一次故障自动迁移,会将失效主服务器的从服务器选举出一个新的主服务器,剩下的从服务器将会自动连接复制选举出来的新服务器的数据。
Redis的Sentinel系统是一个分布式的系统,可以在系统中配置一个或多个Sentinel。

三、集群模式
在这里插入图片描述

主从复制,哨兵模式都难以在线扩容,而Redis cluster集群实现了对Redis的水平扩容,即启动N个Redis节点,每个节点又可以有自己的从服务器,将数据均匀分布的存储在这N个节点上,每个节点存储数据的1/N。Redis cluster集群就是一个可以在多个Redis节点之间进行数据共享的设施;Redis cluster集群采用的是无中心化配置,即节点A无法处理,会将请求转发至节点B进行处理。
键分布模型:
Redis集群中的键空间被分割为16384个槽位。每个主节点负责16384中槽位的一部分,Redis使用CRC16 算法进行槽位分配。为了保证高可用,cluster模式也引入了主从复制模式,一个主节点对应一个或多个从节点,当主节点发生宕机时,可进行故障转移,将子节点升级为主节点。

安装部署

Redis安装

1.下载解压

mkdir /data/src&&cd /data/src
wget https://download.redis.io/releases/redis-6.2.4.tar.gz
tar zxf redis-6.2.4.tar.gz

2.安装依赖

yum -y install gcc gcc-c++ make

3.编译安装

cd /data/src/redis-6.2.4
make&&make install

make报错
在这里插入图片描述
解决办法: make MALLOC=libc
4.创建启动目录

mkdir /data/redis/{bin,log,data,etc}
cp /data/src/redis-6.2.8/redis.conf  /data/redis/etc/
cp /data/src/redis-6.2.8/sentinel.conf  /data/redis/etc/
cd /data/src/redis-6.2.4/src
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel redis-trib.rb /data/redis/bin

5.设置环境变量

echo "export PATH=$PATH:/data/redis/bin" >> /etc/profile
source /etc/profile

主从复制

规则:至少两台主机,一主一从,建议一主两从

IP角色
192.168.0.171主节点
192.168.0.172从节点1
192.168.0.173从节点2

1.编辑配置文件(所有节点)

vim /data/redis/etc/redis.conf
# 监听端口
port 6379
# 绑定地址
bind 0.0.0.0
# Redis密码
requirepass Pwd@123
# 开启数据持久化(根据需求开启)
appendonly yes  
# 持久化文件存放目录
dir /data/redis/data
# 日志文件
logfile /data/redis/log/redis.log
# redis后台运行
daemonize yes
# 关闭保护模式
protected-mode no
# 数据库数量
databases 16
# 内存限制
maxmemory  3221225472

2.启动redis

redis-server /data/redis/etc/redis.conf

3.查看redis进程

ps -ef |grep redis

4.开启主从关系(从节点操作)
(临时配置重启失效-仅适用于无密码节点)

redis-cli 
slaveof 192.168.0.171 6379 

(永久配置重启不失效)

vim /data/redis/etc/redis.conf
# 主节点密码,无可不设置
masterauth Pwd@123
# 主节点IP端口
replicaof 192.168.0.171 6379

重启redis加载配置

redis-cli -a Pwd@123 -p 6379 shutdown && redis-server /data/redis/etc/redis.conf 

5.查看主从状态

redis-cli -a Pwd@123 -p 6379 
info replication

(主节点)

192.168.0.171:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.0.172,port=6379,state=online,offset=1193,lag=0
slave1:ip=192.168.0.173,port=6379,state=online,offset=1193,lag=1

(从节点)

192.168.0.172:6379> info replication
# Replication
role:slave
master_host:192.168.0.171
master_port:6379
master_link_status:up
slave_read_only:1
replica_announced:1
connected_slaves:0

6.测试
主节点

redis-cli -a Pwd@123 -p  6379
set key1 123
get key1
192.168.0.171:6379> set key1 123 
OK
192.168.0.171:6379> get key1
"123"

从节点1

redis-cli -a Pwd@123 
set key2 456
get key1
192.168.0.172:6379> set key2 456
(error) READONLY You can't write against a read only replica.
192.168.0.172:6379> get key1
"123"

从节点2

redis-cli -a Pwd@123
set key3 789
get key1
192.168.0.173:6379> set key3 789
(error) READONLY You can't write against a read only replica.
192.168.0.173:6379> get key1
"123"

由此可见:仅主节点可写入数据,从节点只可读取数据,且同步主节点数据。

哨兵

规则:至少三台主机,一主一备主一从,三哨兵(哨兵可独立部署)

IP角色
192.168.0.171主节点_哨兵节点1
192.168.0.172备主节点_从节点_哨兵节点2
192.168.0.173备主节点_从节点_哨兵节点3

1.编辑redis配置文件

vim /data/redis/etc/redis.cof

(主节点)

# 监听端口
port 6379
# 绑定地址
bind 0.0.0.0
# Redis密码
requirepass Pwd@123
# 开启数据持久化(根据需求开启)
appendonly yes  
# 持久化文件存放目录
dir /data/redis/data
# 日志文件
logfile /data/redis/log/redis.log
# 让redis后台运行
daemonize yes
# 关闭保护模式
protected-mode no
# 数据库数量
databases 16
# 内存限制
maxmemory  3221225472
# 用于访问主节点的密码 
masterauth Pwd@123

(从节点)

# 监听端口
port 6379
# 绑定地址
bind 0.0.0.0
# Redis密码
requirepass Pwd@123
# 开启数据持久化(根据需求开启)
appendonly yes  
# 持久化文件存放目录
dir /data/redis/data
# 日志文件
logfile /data/redis/log/redis.log
# 让redis后台运行
daemonize yes
# 关闭保护模式
protected-mode no
# 数据库数量
databases 16
# 内存限制
maxmemory  3221225472
# 用于访问主节点的密码 
masterauth Pwd@123
# 主节点地址端口
replicaof 192.168.0.171 6379

2.编辑哨兵配置文件(所有节点)
vim /data/redis/etc/sentinel.conf

# 监听端口
port 26379
# 关闭保护模式
protected-mode no
# 设置为后台启动。
daemonize yes
# 日志文件。
logfile /data/redis/log/sentinel.log
# 指定主机IP地址和端口,并且指定当有2台哨兵认为主机挂了,则对主机进行容灾切换。
sentinel monitor mymaster 192.168.0.171 6379 2
# 当在Redis实例中开启了requirepass,这里就需要提供密码。
sentinel auth-pass mymaster Pwd@123
# 这里设置了主机多少秒无响应,则认为挂了。
sentinel down-after-milliseconds mymaster 3000
# 主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1。
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间,这里设置为三分钟。
sentinel failover-timeout mymaster 180000
# 是否允许通过执行脚本来重新配置自身("yes"时,Sentinel节点将拒绝通过执行脚本来重新配置自身)
sentinel deny-scripts-reconfig yes

3.启动Redis(每台)

redis-server /data/redis/etc/redis.conf

4.启动哨兵(每台)

redis-sentinel /data/redis/etc/sentinel.conf

5.查看redis进程

ps -ef |grep redis

6.查看主从状态

redis-cli -a Pwd@123 -h 192.168.0.171 -p 6379
info replications

7.查看哨兵状态

redis-cli -a Pwd@123 -h 192.168.0.171 -p 26379
info sentinel

8.快捷启停脚本
*****redis

#!/bin/bash
if [ -n "$1" ];then
name=$1
if [ "$name" == "start" ];then
/data/redis/bin/redis-server /data/redis/etc/redis.conf
echo -e  "\033[32m redis is start \033[0m"
ps -ef |grep redis
elif [ "$name" == "stop" ];then
kill -9 `cat /var/run/redis.pid`
echo -e "\033[31m redis is stop \033[0m"
ps -ef|grep redis
elif [ "$name" == "restart" ];then
kill -9 `cat /var/run/redis.pid`
sleep 2s
/data/redis/bin/redis-server /data/redis/etc/redis.conf
echo -e "\033[34m redis is restat \033[0m"
ps -ef|grep redis
elif [ "$name" == "cli" ];then
redis-cli -a Pwd@123 -p 6379
fi
else
echo "未提供执行参数,[start,stop,restart,cli]"
fi

*****sentinel

#!/bin/bash
if [ -n "$1" ];then
name=$1
if [ "$name" == "start" ];then
/data/redis/bin/redis-sentinel /data/redis/etc/sentinel.conf
echo -e  "\033[32m redis is start \033[0m"
ps -ef |grep redis
elif [ "$name" == "stop" ];then
kill -9 `cat /var/run/sentinel.pid`
echo -e "\033[31m redis is stop \033[0m"
ps -ef|grep redis
elif [ "$name" == "restart" ];then
kill -9 `cat /var/run/sentinel.pid`
sleep 2s
/data/redis/bin/redis-sentinel /data/redis/etc/sentinel.conf
echo -e "\033[34m redis is restat \033[0m"
ps -ef|grep redis
elif [ "$name" == "cli" ];then
redis-cli -a Pwd@123 -p 26379
fi
else
echo "未提供执行参数,[start,stop,restart,cli]"
fi

集群

规则:至少6台主机,三主三从

IP角色
192.168.0.171主节点1
192.168.0.172主节点2
192.168.0.173主节点3
192.168.0.174从节点1
192.168.0.175从节点2
192.168.0.176从节点3

1.修改配置文件(每台)

vim /data/redis/etc/redis.cof
# 监听端口
port 6379
# 绑定地址
bind 0.0.0.0
# Redis密码
requirepass Pwd@123
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /data/redis/etc/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 开启数据持久化(根据需求开启)
appendonly yes  
# 持久化文件存放目录
dir /data/redis/data
# 日志文件
logfile /data/redis/log/redis.log
# 让redis后台运行
daemonize yes
# 注册的实例ip(避免多网卡时IP冲突)  #设置为本机IP
replica-announce-ip 192.168.0.171
# 关闭保护模式
protected-mode no
# 数据库数量
databases 16
# 内存限制
maxmemory  3221225472

2.启动Redis(每台)

redis-server /data/redis/etc/redis.conf

3.查看redis进程

ps -ef |grep redis

在这里插入图片描述
4.创建集群(任意节点)

redis-cli -a Pwd@123  --cluster create --cluster-replicas 1  192.168.0.171:6379 192.168.0.172:6379 192.168.0.173:6379 192.168.0.174:6379  192.168.0.175:6379 192.168.0.176:6379 

命令说明:

redis-cli --cluster 或者 ./redis-trib.rb:代表集群操作命令
create:代表是创建集群
–replicas 1或者–cluster-replicas 1 :指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master

运行此命令后会出现分配好的主从关系,输入 【yes】 确认按照图示主从关系创建集群。(演示机为一机部署六个服务不影响最后效果)
在这里插入图片描述这里输入yes,则集群开始创建:
在这里插入图片描述
5.查看集群状态(任意节点)
”192.168.0.171“ 此IP为集群中任意主节点IP地址即可。

redis-cli -a Pwd@123 -h 192.168.0.171 -p 6379 cluster nodes
dff1d59d7a55a78bfcbd45ed4374ed45a3ce6a11 192.168.0.175:6379@6379 slave 8e84704dbce9dfa56252d5ec32039152d2405bab 0 1674959501512 1 connected
8e84704dbce9dfa56252d5ec32039152d2405bab 192.168.0.171:6379@16379 myself,master - 0 1674959501000 1 connected 0-5460
5f762aa2f6246936addf0981dbe6db62672988fb 192.168.0.172:6379@16379 master - 0 1674959502000 2 connected 5461-10922
419c8677d205d9cc45d6a9f9596d9d24a4925832 192.168.0.176:6379@16379 slave 5f762aa2f6246936addf0981dbe6db62672988fb 0 1674959503517 2 connected
8671f0c99d06e25129a379c8c1ee7c7384a53bbe 192.168.0.173:6379@16379 master - 0 1674959501000 3 connected 10923-16383
c86424d11d8f056e6e3089eefc84e82d17ec7307 192.168.0.174:6379@16379 slave 8671f0c99d06e25129a379c8c1ee7c7384a53bbe 0 1674959502514 3 connected

6.测试数据存储(任意节点)

redis-cli -h 192.168.0.171 -p 6379 -a Pwd@123 -c
192.168.0.171:6379> set t1 test1
-> Redirected to slot [8943] located at 192.168.0.172:6379
OK
192.168.0.172:6379> set t2 test2
-> Redirected to slot [4748] located at 192.168.0.171:6379
OK
192.168.0.171:6379> set t3 test3
OK
192.168.0.171:6379> set t4 test4
-> Redirected to slot [12874] located at 192.168.0.173:6379
OK
192.168.0.173:6379> get t1
-> Redirected to slot [8943] located at 192.168.0.172:6379
"test1"
192.168.0.172:6379> get t2
-> Redirected to slot [4748] located at 192.168.0.171:6379
"test2"
192.168.0.171:6379> get t3
"test3"
192.168.0.171:6379> get t4
-> Redirected to slot [12874] located at 192.168.0.173:6379
"test4"
192.168.0.173:6379> 

通过观察可以发现,数据创建分布在不同主机上,查询时也会去寻找对应主机,从而实现数据的集群分片。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值