H__D  

一、Redis集群基本介绍

  Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施installation

  Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低Redis集群的性能, 并导致不可预测的行为。

  Redis 集群通过分区partition来提供一定程度的可用性availability: 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

  Redis集群提供了以下两个好处:

    • 将数据自动切分split到多个节点的能力。
    • 当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力。

二、Redis集群原理

  

  1. 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。

  2. 节点的fail是通过集群中超过半数的节点检测失效时才生效。

  3. 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

  4. redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

    Redis集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

  redis-cluster投票:容错

    1. 投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉.

    2. 什么时候整个集群不可用(cluster_state:fail)?

      • 如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态. 
        • redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.
      • 如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.

三、Redis集群搭建

  环境:Linux CentOS 7.2

  redis:5.0.5

1、新建一个redis-cluster目录,在目录中安装单个redis应用,参考【Redis】安装及简单使用,并复制5份,结构如下
  

2、在config目录中,创建6份Redis配置文件进行配置,配置只是端口不同
  配置文件redis.conf (配置文件小技巧:可以利用inlude包含公用配置文件,其他不同的文件内容可以覆盖) 

# 包含文件(redis-base.conf,文件从redis安装目录中拷贝的)
include /data/soft/redis-5.0.5/redis-cluster/redis-5.0.5/redis.conf

# bind 绑定地址修改,外网能访问
bind 0.0.0.0

# 保护模式关闭
protected-mode no

# 端口
port 16379

# 后台运行
daemonize yes

# pid文件
pidfile redis_16379.pid

# 日志文件
logfile "/data/soft/redis-5.0.5/redis-cluster/log/redis-16379.log"

# 主认证密码
masterauth 123456

# 认证密码
requirepass 123456

# 最大内存10M,一般为机器内存的3/4
maxmemory 10mb

# 内存达到最大时策略,可选择其他策略
maxmemory-policy volatile-lru

# 目录
dir "/data/soft/redis-5.0.5/redis-cluster/data"

# 快照文件
dbfilename dump-16379.rdb

# aof文件名
appendfilename appendonly-16379.aof


# 启用集群
cluster-enabled yes

# 配置每个节点的配置文件
cluster-config-file nodes-16379.conf

# 配置集群节点的超时时间,可改可不改
cluster-node-timeout 15000

 

3、编写集群启动脚本和停止脚本
  启动脚本start.sh

#!/bin/bash

# 启动 Redis-Server-Cluster
echo "Star Redis-Server-Cluster ..."

cd /data/soft/redis-5.0.5/redis-cluster
redis-5.0.5/src/redis-server config/redis-16379.conf
redis-5.0.5/src/redis-server config/redis-16380.conf
redis-5.0.5/src/redis-server config/redis-16381.conf
redis-5.0.5/src/redis-server config/redis-16382.conf
redis-5.0.5/src/redis-server config/redis-16383.conf
redis-5.0.5/src/redis-server config/redis-16384.conf
View Code

  停止脚本stop.sh

#!/bin/bash

# 停止 Redis-Server
echo "Shutdown Redis-Server-Cluster ..."

cd /data/soft/redis-5.0.5/redis-cluster

redis-5.0.5/src/redis-cli -h 127.0.0.1 -p 16379 -a 123456 shutdown
redis-5.0.5/src/redis-cli -h 127.0.0.1 -p 16380 -a 123456 shutdown
redis-5.0.5/src/redis-cli -h 127.0.0.1 -p 16381 -a 123456 shutdown
redis-5.0.5/src/redis-cli -h 127.0.0.1 -p 16382 -a 123456 shutdown
redis-5.0.5/src/redis-cli -h 127.0.0.1 -p 16383 -a 123456 shutdown
redis-5.0.5/src/redis-cli -h 127.0.0.1 -p 16384 -a 123456 shutdown
View Code

  给脚本授权
  命令:chmod -u+x start-all.sh stop-all.sh
4、用redis‐cli创建整个redis集群

  命令:redis-5.0.5/src/redis-cli -a 123456 --cluster create --cluster-replicas 1 127.0.0.1:16379 127.0.0.1:16380 127.0.0.1:16381 127.0.0.1:16382 127.0.0.1:16383 127.0.0.1:16384

  其中-a 123456,为redis密码,没有设置密码的可以忽略

  

7、到此三主三从的redis集群已经搭建完成

查询Redis集群信息

  集群创建成功登陆任意redis结点查询集群中的节点情况。

  1、客户端以集群方式登陆,命令:./redis-7001/bin/redis-cli -c -h 192.168.1.1 -p 7001 ,其中-c表示以集群方式连接redis-h指定ip地址,-p指定端口号

  2、查看节点信息,登陆客户端命令:./redis-7001/bin/redis-cli -c -h 192.168.1.1 -p 7001
    查看集群信息,命令:cluster node

    

  3、查询集群状态信息,命令:cluster info 

    

使用Jedis测试Redis集群   

   1、搭建环境项目,参考:【Redis】使用Jedis操作Redis

  2、代码测试

 1 @Test
 2     public void run3 () throws IOException {
 3         // 创建并填充节点信息
 4         Set<HostAndPort> nodes = new HashSet<>();
 5         nodes.add(new HostAndPort("192.168.1.1", 7001));
 6         nodes.add(new HostAndPort("192.168.1.1", 7002));
 7         nodes.add(new HostAndPort("192.168.1.1", 7003));
 8         nodes.add(new HostAndPort("192.168.1.1", 7004));
 9         nodes.add(new HostAndPort("192.168.1.1", 7005));
10         nodes.add(new HostAndPort("192.168.1.1", 7006));
11 
12         // 创建JedisCluster对象
13         JedisCluster jedisCluster = new JedisCluster(nodes);
14 
15         // 使用jedisCluster操作redis
16         String key = "jedisCluster";
17         String setResult = jedisCluster.set(key, "hello redis!");
18         System.out.println(setResult);
19 
20         String getResult = jedisCluster.get(key);
21         System.out.println(getResult);
22 
23         // 关闭jedisCluster(程序执行完后才能关闭,内部封装了连接池)
24         jedisCluster.close();
25 
26     }

  

 

 

 

 

 

可忽略以下

四、ruby脚本创建集群(老版本,不方便)

  redis5以前的版本集群是依靠ruby脚本redis‐trib.rb实现

4、安装Redis的Cluster集群,需要使用Ruby命令(还可以采用源码安装ruby,推荐)
  命令:yum install ruby   // 安装ruby
  命令:yum install rubygems  //安装rubygems,最新版本ruby会自动安装rubygems
    
    

5、安装Redis的Ruby接口程序
  命令:gem install redis
    
  注意:可能出现安装错误,如下:ruby的版本够,解决方案参考:【Redis】安装 Redis接口时异常 ,系统ruby版本过低
    

6、创建集群,执行redis-trib.rb脚本,这个脚本在源文件的src目录中,可以拷贝到redis-cluster文件中
  命令:cp /data/download/redis-4.0.11/src/redis-trib.rb /app/soft/redis-cluster/
  启动6个redis实例,使用文件start-all.sh,命令:./start-all.sh,然后在创建集群
    
  创建命令:ruby redis-trib.rb  create --replicas 1 192.168.1.1:7001 192.168.1.1:7002 192.168.1.1:7003 192.168.1.1:7004 192.168.1.1:7005 192.168.1.1:7006 

  
    

 

posted on 2018-08-10 09:38  H__D  阅读(377)  评论(0编辑  收藏  举报