Redis单机、主从、哨兵、高可用集群搭建和集群扩缩容


Redis单机搭建

Redis下载

这里使用的是redis5.0.3

Redis下载有多种方式,可以选择官网也可以选择镜像

## 下载
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
## 解压
tar -zxvf elasticsearch-7.10.2-linux-x86_64.tar.gz -C /
## 软链接
ln -s /elasticsearch-7.10.2/ es/

gcc编译

## 安装gcc
yum install gcc
## 进入到解压好的redis目录下,进行编译与安装
cd /redis
make

修改配置

## 创建持久化目录
mkdir /data/redis
## 修改配置文件
vim redis.conf

配置文件

#后台启动
daemonize yes 
#关闭保护模式,开启的话,只有本机才可以访问redis
protected-mode no 
# 需要注释掉bind(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
#bind 127.0.0.1
#修改持久化文件目录
dir /data/redis/

启动服务

## 启动
src/redis-server redis.conf
## 验证服务
ps -ef | grep redis
## 进入客户端
src/redis-cli

退出

## 退出客户端
quit
## 退出redis服务
src/redis-cli shutdown

Redis 主从架构搭建

这里准备2台机器

主节点:192.168.186.131:6379

从节点:192.168.186.132:6379

主从节点搭建都和单机搭建基本一致,只需修改从节点配置即可

从节点所需修改配置

## 配置主从复制
# 从主节点的redis实例复制数据,主节点ip:端口
replicaof 192.168.186.131:6379  
replica-read-only yes  # 配置从节点只读

主节点启动,从节点启动

验证

主节点写入一个key value;从节点能够同步数据就可以了

如果数据不能同步可能是防火墙问题关闭即可

Redis 哨兵架构搭建

在主从架构中主节点挂了,从节点是不会顶上来的,从节点只是做了读写分离和数据备份

哨兵架构可以监测主节点变化情况和选举主节点的功能

客户端只需要连接哨兵便能访问redis,redis的主节点变化不会影响到客户端

搭建

这里搭建2个哨兵,1个主从redis

redis主节点:192.168.186.131:6379

redis从节点:192.168.186.132::6379

redis主从,上诉搭建方式

snetinel节点:

192.168.186.131:26379;192.168.186.132:26379

修改配置

vim sentinel.conf

配置文件

daemonize yes
## mymaster客户端连接时才有用,可随意修改,ip:port 是主节点ip:port,最后一个数字2表示2台sentinel认为主节点不可访问才是不可返回
sentinel monitor mymaster 192.168.0.60 6379 2

启动sentinel

src/redis-sentinel sentinel.conf

验证

src/redis-cli -p 26379

info

sentinel集群都启动完毕后,会将哨兵集群的元数据信息写入所有sentinel的配置文件里去

#代表redis主节点的从节点信息
sentinel known-replica mymaster 192.168.186.132 6379 
#代表感知到的其它哨兵节点
sentinel known-sentinel mymaster 192.168.186.131 26379 84bbfc7608019b020884e1cf045460916942e0f9

当redis主节点如果挂了,哨兵集群会重新选举出新的redis主节点,同时会修改所有sentinel节点配置文件的集群元数据信息

#代表redis主节点的从节点信息
sentinel known-replica mymaster 192.168.186.131 6379 
#代表感知到的其它哨兵节点
sentinel known-sentinel mymaster 192.168.186.131 26379 84bbfc7608019b020884e1cf045460916942e0f9

同时还会修改sentinel文件里之前配置的mymaster对应的主节点

sentinel monitor mymaster 192.168.186.132 6379 2

Redis 集群架构搭建

redis的集群是由redis分配主从和槽位(当然也可以命令手动指定主从),这里我们只需要正常启动6个配置好的redis实例就可以了

前期准备

三台机器,ip分别为192.168.186.131;192.168.186.132;192.168.186.133

每台机器搭建2个redis 服务,端口6001,6002,6003,6004,6005,6006

# 每台机器首先创建一个redis-cluster文件夹方便管理
mkdir /redis/redis-cluster
cd /redis/redis-cluster
# 然后在别创建2个文件夾放不同端口文件
mkdir 6001 6004
# 把之前的redis.conf配置文件copy到6001
cp /redis/redis.conf /redis/redis-cluster/6001

修改配置文件

## 后台启动
daemonize yes
## 端口(分别对每个机器的端口号进行设置)
port 6001
## 把pid进程号写入pidfile配置的文件
pidfile /var/run/redis_6001.pid  
## 指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据
dir /redis/redis-cluster/6001/
## 启动集群模式
cluster-enabled yes
## 集群节点信息文件,这里600x最好和port对应上
cluster-config-file nodes-6001.conf(集群节点信息文件,这里800x最好和port对应上)
cluster-node-timeout 15000
## 需要注释掉bind(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)
# bind 127.0.0.1
## 关闭保护模式
protected-mode  no

把修改后的配置文件,copy到6004,修改有端口号的配置项

批量替换命令

:%s/源字符串/目的字符串/g 

另外两台机器也需要做上面几步操作,第二台机器用6002和6005,第三台机器用6003和6006

启动

启动6个redis实例,然后检查是否启动成功,这时候集群还未创建

## 启动服务
/redis/src/redis-server /redis/redis-cluster/600X/redis.conf
## 检查6个redis实例是否都启动
ps -ef | grep redis

创建集群

执行这条命令需要确认三台机器之间的redis实例要能相互访问,可以先简单把所有机器防火墙关掉,如果不关闭防火墙则需要打开redis服务端口和集群节点gossip通信端口16379(默认是在redis端口号上加1W)

防火墙

## 临时关闭防火墙
systemctl stop firewalld 
## 禁止开机启动
systemctl disable firewalld 

集群创建

## --cluster-replicas 1表示每个主节点需要1个从节点
/redis/src/redis-cli --cluster create --cluster-replicas 1 192.168.186.131:6001 192.168.186.132:6002 192.168.186.133:6003 192.168.186.131:6004 192.168.186.132:6005 192.168.186.133:6006

集群检查

连接任意一个redis客户端

##  -a访问服务端密码,-c表示集群模式,-h指定ip地址,-p端口号
/redis/src/redis-cli -c -h 192.168.186.132 -p 6002

## 查看集群信息
cluster info

## 查看节点列表
cluster nodes

image-20210126142004221

从cluster nodes可以看出集群关系

1(主)-6(从) 槽位:0-5460

2(主)-4(从) 槽位:5461-10922

3(主)-5(从) 槽位:10923-16383

关闭集群需要逐个关闭,集群一旦构建好后,停机后只需每个节点重新启动便可,不需要在执行集群创建命令

/redis/src/redis-cli -c -h 192.168.186.132 -p 6002 shutdown

Redis集群水平扩缩容

下面看下集群命令

src/redis-cli --cluster help

  • create:创建一个集群环境host1:port1 … hostN:portN
  • call:可以执行redis命令
  • add-node:将一个节点添加到集群里,第一个参数为新节点的ip:port,第二个参数为集群中任意一个已经存在的节点的ip:port
  • del-node:移除一个节点
  • reshard:重新分片
  • check:检查集群状态

扩容

在刚刚搭好的集群上面进行水平扩容,增加一个小集群6007(主)和6008(从);

首先需要启动2个redis实例

2个新节点启动并没有加入到集群,cluster nodes 发现只有6个节点

现在开始加入主节点

src/redis-cli --cluster add-node 192.168.186.132:6007 192.168.186.132:6001

现在看下集群状态,多了一个master(刚加入的节点都直接是master)

这时候加入的master不可以使用因为它没有槽位,需要rehash分配槽位

分配槽位

src/redis-cli --cluster reshard 192.168.186.132:6002

image-20210129141404905

这时候再看一下集群信息

加入从节点

src/redis-cli --cluster add-node 192.168.186.132:6008 192.168.186.132:6002

刚加入在集群里面是master,现在我们要进入6008的客户端

src/redis-cli -c -h 192.168.186.132 -p 6008
## 分配主节点 后面这字符串就是6007的唯一标识
cluster replicate 7e4da930cbbcccbb8656dbb5e1f5bead97f9f6ac

扩容成功

缩容

现在我们删除6007,6008这一个小集群

删除6008从节点

## 后面这节点id是6008的id
src/redis-cli --cluster del-node 192.168.186.132:6008 87d4ff53c193c24ff7b6c6cdd33478531dd7fe1e

删除6007主节点

删除主节点之前需要先把hash槽释放掉

 src/redis-cli --cluster reshard 192.168.186.132:6007

删除节点

src/redis-cli --cluster del-node 192.168.186.132:6007 7e4da930cbbcccbb8656dbb5e1f5bead97f9f6ac

缩容成功


文章作者: dm
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 dm !
评论
 上一篇
Redis生产实践与性能优化 Redis生产实践与性能优化
缓存穿透缓存穿透是指访问一个不存在的key(这个key不在缓存层),穿透了缓存层直接打到了DB,如果访问量大的话是有把DB打崩的可能性。 解决方案: 缓存空对象,即使访问的是一个不存在的对象,我们也可以吧访问的key值缓存,value直接
2022-11-01
下一篇 
ELK单机集群搭建,增量索引方案 ELK单机集群搭建,增量索引方案
环境准备java版本:无需准备(es7.x内置JDK12) 操作系统:CentOS7 安装包:https://www.elastic.co/cn/downloads/past-releases#elasticsearch 我这里选择的是7.
2022-09-14
  目录