Skip to content

Redis部署

1.Redis部署

1.1.上传安装包至安装路径下

1.2.解压安装包

tar -xf redis-5.0.5.tar

1.3.修改配置文件redis.conf

端口信息

允许后台运行

日志输出文件

修改pidfile

1.4.启动服务

进入redis安装目录的src目录下,执行命令。

./redis-server ../redis.conf >/dev/null 2>&1 &

1.5.查看服务进程

执行命令:

ps -ef|grep redis

注:redis建议部署为岗哨模式(1主2从3哨兵),不建议使用集群模式。岗哨模式的redis可以借助运维平台redis列表进行部署。可参考用户手册部署中心中的redis集群部署。

2.Redis cluster 部署

  • redis的哨兵模式基本可以实现高可用,读写分离,但是在这种模式下,每台redis服务器都存储相同的数据,浪费内存。并且水平扩容很费劲。
  • 所以在redis 3.0上加入了cluster集群模式,实现了redis的分布式存储,也就是说每台redis节点上存储不同的内容。
  • 官方推荐cluster集群模式,水平扩容也方便。

2.1 redis cluster简介

  • redis 3.0版本之前,只支持单例模式,在3.0版本之后才支持集群。

  • redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点。

  • redis集群是没有统一的入口的,客户端连接集群中的任意节点即可,集群内部的节点是相互通信的(Gossip通信协议, PING-PONG机制),每个节点都是一个redis实例。

  • 为了实现集群的高可用,即判断节点是否健康,redis cluster有这么一个投票容错机制:如果集群中找过半数的节点投票认为某节点挂了,那么该节点就挂了(fail)。

  • 如何判断机器是否挂了呢: 如果集群中任意一个主节点挂了,而该节点又没有从节点(备份节点),那么这个集群就挂了。

  • 为什么任意一个主节点挂了(又没有对应的从节点)这个集群就挂了呢:是因为集群内置了16384(0~ 16383)个slot(哈希槽),并且把所有的物理节点映射到了这16384个slot上,或者说把这些slot均等的分配给了各个节点。

    ​ 当需要redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果

    ​ 再把这个结果对16384进行取余,这个余数会对应到(0~16383)其中一个槽,进而决定key-value存储在哪个节点中

    ​ 所以一旦某个主节点(又没有从节点)挂了,该节点的slot就无法使用了,那么就会导致集群无法正常工作

  • redis集群至少需要3个主节点:因为投票容错机制要求超过半数节点认为某节点挂了该节点才是挂了,所以2个节点服务构建集

  • redis集群至少需要6台服务器

    ​ 因为要保证集群的高可用,需要每个主节点都有至少一个从节点(备份节点)

    ​ 如果手上没那么多服务,也可以采用伪分布式集群搭法,即一台物理机启动多个redis实例

2.2 redis cluster部署步骤

由于目前手头上只有3台物理机, 所以采取每台服务器开启2台实例构建基础主从。生产建议使用6台服务器搭建。

  • 每台物理机器有一个主节点(端口6379)
  • 每个主节点的从节点在其他物理机上(端口为6380),避免一台物理机挂掉之后,整个redis集群都出现问题

(1)上传redis安装包到对应三台服务器的安装路径下,并解压

shell
tar -xf redis-5.0.5.tar

(2)修改redis.conf文件,以192.168.121.216的master节点为例,修改内容如下:

shell
# 将redis的安装路径放在了/app/jlbank/redis目录下
# redis安装包解压完成之后,将其重新命名为redis-6379

# 守护进行模式启动
daemonize yes

# 设置数据库数量,默认数据库为0
databases 16

# 绑定地址,需要修改
bind 192.168.161.216

# 绑定端口,需要修改
port 6379

# pid文件存储位置,文件名需要修改
pidfile /var/run/redis_6379.pid

# log文件存储位置,文件名需要修改
logfile /app/jlbank/redis/redis-6379/logs/redis_6379.log

# 集群相关配置
# 是否以集群模式启动
cluster-enabled yes

# 集群节点回应最长时间,超过该时间被认为下线
cluster-node-timeout 15000

# 生成的集群节点配置文件名,文件名需要修改
cluster-config-file nodes_6379.conf



#########根据实际需求确认是否需要修改redis数据备份配置############
# RDB快照备份文件名,文件名需要修改
dbfilename redis_6379.rdb
# 本地数据库存储目录,需要修改
dir /app/jlbank/redis/redis-6379/
###########################################################

在其余redis的节点中也按照如上实力去修改redis.conf文件即可。

(3)启动集群

进入每个节点的redis安装目录的src目录下,执行命令。

shell
./redis-server ../redis.conf >/dev/null 2>&1 &

集群启动成功之后,进程后会加上[cluster]的字样:

(4)将所有的redis节点加入集群中

进入redis安装路径的src下,登录任意redis节点,使用CLUSTER MEET命令将所有的redis节点加入集群中。

shell
#登录redis
./redis-cli -h 192.168.161.216 -p 6379

#将节点加入redis集群
cluster meet 192.168.161.125 6379

CLUSTER MEET命令被用来连接不同的开启集群支持的 Redis 节点,以进入工作集群。

查看当前集群所有的节点:

(4) 主从配置

6个redis节点之间并没有任何主从关系,所以需要进行主从配置,记录上面cluster nodes命令输出的node-id信息,只记录主节点。

hostname节点node-id
192.168.161.216192.168.161.216:6379670134ed80ee4d8c6dd2570ed76e735bc0301721
192.168.161.125192.168.161.125:6379a57c731bd8d45828122ed31a590b5d2852a7f8a3
192.168.161.198192.168.161.198:63794d080d52b8ed74b17e265bf23b5ab37bf695a9f1

首先设置192.168.161.216服务器的6380节点,将它映射到192.168.161.125的6379节点:

然后是192.168.161.125的6380,将它映射到192.168.161.198的6379:

最后是192.168.161.198的6380,将它映射到192.168.161.216的6379:

查看集群节点信息:

(5)分配槽位

接下来需要开始分配槽位,为了考虑后续使用redis的写入操作能分配均匀,槽位也要进行均匀分配。

仅需要在Master上进行分配,从库不进行分配,仅做主库的备份和读库使用。

槽位分配情况如下,槽位号从0开始,到16383结束,共16384个槽位,均匀分配

节点槽位数量
192.168.161.216:63790 - 5461
192.168.161.125:63795462 - 10922
192.168.161.198:637910923 - 16383

开始分配:

进入redis的安装路径的src路径下

shell
./redis-cli -h 192.168.161.216 -p 6379 cluster addslots {0..5461}
./redis-cli -h 192.168.161.125 -p 6379 cluster addslots {5462..10922}
./redis-cli -h 192.168.161.198 -p 6379 cluster addslots {10923..16383}

检查槽位是否分配正确

(6)检查状态

使用以下命令检查集群状态是否ok,如果槽位全部分配完毕应该是ok,若不是检查你分配槽位时是否输错了数量:

shell
cluster info

(7)读写测试

进入redis安装路径的src目录下,执行如下命令:

shell
redis-cli -c -h 192.168.161.216 -p 6379
#注意:-c参数无所谓你的Redis是否是集群模式, 如果不加-c会报(error) MOVED...

这条数据写入了192.168.161.198的主节点上,登录到192.168.161.125的6380节点中查询:

常见问题:

(1)如果一组主从宕机,集群是否可用

  • 之前说一个节点挂掉,又没有从节点,那么集群不可用(默认为yes)
  • 如果修改下边的配置属性,则宕机的1组不可用,而其他组的机器可以用 往1组保存数据,失败,导致数据丢失 往2组或3组保存数据,正常运行
shell
# cluster-require-full-coverage yes

3.Redis一主二从三哨兵搭建(根据上述方式)

3.1.搭建一主二从

根据上述方式,搭建3个节点,216,、198、125

以216为主节点,198和125为从节点为例

修改198的redis.conf文件,125设置一致

格式:

replicaof 主节点ip 主节点端口

replicaof 192.168.161.216 6379

image-20220830165320972

3.2.配置哨兵

更改sentinel.conf配置文件,216、198、125都要修改

允许后台运行

image-20220830193054461

日志输出文件

image-20220830193158429

配置主节点

格式:

sentinel monitor 主机名称(自定义) host port 2
2: 表示投票票数

sentinel monitor mymaster 192.168.161.216 6379 2

image-20220830170204348

3.3.启动sentinel

216、198、125进入到src目录下

格式:

./redis-sentinel 绝对路径

./redis-sentinel /app/jlbank/sentinel/redis-5.0.5/sentinel.conf

image-20220830173527375