redis 端口_「建议收藏」手把手教你搭建redis集群

12535df00ca5df97ea0a00bf94287647.png

前言

在生产中单机的redis服务不能保证程序的高可用,所以有时需要我们来搭建一个redis集群,保证某一台redis服务挂了的时候,我们的服务还可以保证正常运行。

单机redis的搭建,可以参考我的文章手把手教你从零搭建一个redis服务

  • redis集群的介绍
  • redis集群需要的环境
  • redis集群搭建的操作流程
  • 搭建中碰到的问题
  • 代码测试

一、redis集群的介绍

1、redis是一个key value存储系统,redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群,我使用的是redis-4.0.8版本;

2、为了保证集权的高可用,redis-cluster有这么一个投票容错机制,半数以上的节点认为某一个节点挂了,那么这个节点就挂了。

3、如果只有主节点,没有从节点,如果一个节点挂了,那个这个集群就挂了。

4、一个 redis 集群包含 16384 个哈希槽(hash slot),数据库中的每个数据都属于这16384个哈希槽中的一个。集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽。集群中的每一个节点负责处理一部分哈希槽。

5、集群中的主从复制

集群中的每个节点都有1个至N个复制品,其中一个为主节点,其余的为从节点,如果主节点下线了,集群就会把这个主节点的一个从节点设置为新的主节点,继续工作。这样集群就不会因为一个主节点的下线而无法正常工作

二、redis集群的需要的环境

1、因为redis有容错投票机制,所以至少需要3个节点的redis服务。因为2个节点没有办法构成集群。

2、一个主节点有一个从节点,3个主节点就需要3个从节点,所以一共需要6个节点的redis的服务。

3、因为条件有限,我们用同一台服务器,不同的端口号来模拟9001-9006

4、redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口,集群总线端口为redis客户端连接的端口 + 10000

如redis端口为6379,则集群总线端口为16379

5、需要关闭防火墙,如果是阿里云服务器上,需要配置如下安全组

87a6b12b35227f59d70099223ff820ef.png
  • 三、redis集群搭建的操作流程

1、在usr/local目录下新建redis-cluster目录,用户存放我们的redis服务

cd /usr/local/mkdir redis-cluster
c8160f5fb702f8e4cb77b96bbe7cb36e.png

2、复制我们的单机redis

 cp -r redis redis-cluster/redis01 cp -r redis redis-cluster/redis02 cp -r redis redis-cluster/redis03 cp -r redis redis-cluster/redis04 cp -r redis redis-cluster/redis05 cp -r redis redis-cluster/redis06 cd redis-cluster/ ls
b677f095c1839f377ade3b2a32139f05.png

3、修改redis服务的配置文件redis.conf

cd redis01/bin/vi redis.conf

注释掉#bind 127.0.0.1

设置端口port 9001

7d5cc44ef49eadb124de984ee0ec671b.png

将cluster-enabled yes 的注释打开

8991d5425d8a8bf9b8f52ef02b657649.png

设置后端启动模式daemonize yes 不设置的话,在后面会报错

424574a61753ced044ff5da582c44dd7.png

保存并退出,根据上面操作修改其它的redis服务配置。

如果设置安全模式,还得把安全模式给关闭了protected-mode no,要不外网不能访问服务器。

4、创建一个统一的启动文件start-all.sh

cd redis01/bin/./redis-server redis.confcd ../../redis02/bin/./redis-server redis.confcd ../../redis03/bin/./redis-server redis.confcd ../../redis04/bin/./redis-server redis.confcd ../../redis05/bin/./redis-server redis.confcd ../../redis06/bin/./redis-server redis.confcd ../../
88189aa2a04b3286e6f2d0d5ac760fcf.png

5、创建好启动脚本文件之后,需要修改该脚本的权限,使之能够执行,指令如下:

chmod +x start-all.sh

6、执行start-all.sh脚本,启动6个redis节点

ec1e23c538372e2dfb4a27c3d85087db.png

7、配置redis集群

要配置集群,我们需要一个工具,这个工具是一个ruby脚本文件,所以这个工具的运行需要ruby的运行环境,就相当于java语言的运行需要在jvm上。所以需要安装ruby,ruby版本不对,再往下面的操作可能会报异常。

安装ruby环境:

yum install ruby

ruby脚本需要的gem包下载地址:https://rubygems.org/gems/redis/versions

下载redis对应的gem包,上传linux服务器,并安装

gem install redis-4.1.0.gem 
df2a65147facca473d407b7c3148b4fd.png

8、复制ruby脚本工具复制到usr/local/redis-cluster目录下

脚本在那呢,就是redis/src目录下的redis-trib.rb文件

cp redis-trib.rb /usr/local/redis-cluster

9、通过ruby脚本配置集群

./redis-trib.rb create --replicas 1 47.93.80.79:9001 47.93.8.79:9002 47.93.8.79:9003 47.93.8.79:9004 47.93.8.79:9005 47.93.8.79:9006
faf5fdae7f56ec583602cada51361812.png

10、访问集群

./redis-cli -c -h 47.93.8.79 -p 9001

要带有-c 要不不能集群之间跳转

1bdacd76f70826af133083cf50894932.png

四、碰到的问题

1、在执行gem install redis时 : ERROR: Error installing redis: redis requires Ruby version >= 2.2.2

解决办法就是升级Ruby

gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3 curl -L get.rvm.io | bash -s stable source /usr/local/rvm/scripts/rvm rvm install 2.3.8

2、redis集群 Waiting for the cluster to join 一直等待

这个问题一般就是防火墙没有关闭,或者阿里云服务器没有给对应的端口权限,例如上面的安全组配置,我们不仅需要设置9001-9006端口的安全组,还要设置19001-19006的安全组。

0ca9d602f21487eae1bc8fbc0505277c.png

redis会为主节点设置总线端口,在现有的端口上+10000,所以需要配置一下总线的端口。

3、redis集群 redis-cli连接使用命令提示错误(error) MOVED5798 47.93.8.79:9001

解决就是通过客户端链接的时候加上-c

./redis-cli -c -h 47.93.8.79 -p 9001

4、./redis-trib.rb 报错:/usr/local/rvm/gems/ruby-2.4.2/gems/redis-4.0.1/lib/redis/client.rb:119:in `call'

原因就是 slot插槽被占用了(这是 搭建集群前时,以前redis的旧数据和配置信息没有清理干净。)

解决办法:用redis-cli 登录到每个节点执行 flushall 和 cluster reset 就可以了。

注意:不是到bin目录下执行./redis-cli 而是通过下面的命令链接

./redis-cli -h 47.93.80.79 -p 9001

五、代码测试

spring-redis.xml

<?xml version="1.0" encoding="UTF-8"?>

接口JedisClient

public interface JedisClient { String get(String key);//读取值 String set(String key,String value);//设置值}

实现类JedisClientCluster

public class JedisClientCluster implements JedisClient { @Autowired private JedisCluster jedisCluster;  @Override public String get(String key) { return jedisCluster.get(key); }  @Override public String set(String key, String value) { return jedisCluster.set(key, value); } }

测试类redisController

@Controller

@RequestMapping("/redis")

public class redisController {

@Autowired

private JedisClientCluster jedisClientCluster;

@RequestMapping("/test")

public void redisTest() {

jedisClientCluster.set("name

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值