windows下使用RedisCluster集群简单实例

来源:互联网 发布:新理念外语网络第一册 编辑:程序博客网 时间:2024/06/02 02:52

windows下使用RedisCluster集群简单实例

序言

前段时间项目需要把memcache 更换成redis,花了两天研究了一下redis的集群,网上的资料很多已经过期了,参差不齐,在这里整理了一下做个记录

一、开发环境

  • 1.win7
  • 2.redis 3.0 64位
  • 3.ruby 环境
    测试用到的所有安装包及我的测试配置 http://pan.baidu.com/s/1qXmO3fQ

    redis 安装

    Redis对于Linux是官方支持的,安装和使用没有什么好说的,普通使用按照官方指导,5分钟以内就能搞定。详情请参考:http://redis.io/download

    Redis官方是不支持windows的,只是 Microsoft Open Tech group 在 GitHub上开发了一个Win64的版本,官方说明:

    Win64 Unofficial The Redis project does not directly support
    Windows, however the Microsoft Open Tech group develops and maintains an Windows port targeting Win64.

    项目地址:https://github.com/MSOpenTech/redis
    打开以后,可以直接使用浏览器下载,或者git克隆。在release页面可以下载需要的redis包


Image.png

下载解压,没什么好说的,在解压后的bin目录下有以下这些文件:

redis-benchmark.exe #基准测试
redis-check-aof.exe # aof
redis-check-dump.exe # dump
redis-cli.exe # 客户端
redis-server.exe # 服务器
redis.windows.conf # 配置文件

ruby环境准备

下载 64位的 RubyInstaller并安装 地址http://rubyinstaller.org/downloads/
勾选下面三个不用配置环境变量


Image.png

安装RubyGems

下载下来是一个压缩包,解压运行里面的 setup.rb 安装 rubyGems
由于墙的原因ruby自带的源有时候很慢,我们换成淘宝的源,不然下面安装redis依赖会失败\(--)/

在cmd下运行

gem sources --remove https://rubygems.org/ 删掉原来的源
gem sources -a http://ruby.taobao.org 添加淘宝源
gem sources -l 查看现有的源
gem install redis 安装redis依赖

二 、使用redis cluster

按照文档的说明步骤来做就行了,详情在这 http://doc.redisfans.com/topic/cluster-tutorial.html#id5

要让集群正常运作至少需要三个主节点,因此我们创建6个节点,三个主节点三个从节点,详细请查看文档,我简化一下文档的步骤即:

1.创建 6个文件夹分别为 7000-7005
这里就是做集群时各个机器所安装的redis,在每个文件夹放一份下载下来的redis,例如


Image.png

2.创建配置文件 redis.conf
其他几个7000-7004文件夹以此类推,注意修改对应的端口号

port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

文件中的
cluster-enabled 选项用于开实例的集群模式,
cluster-conf-file 选项则设定了保存节点配置文件的路径, 默认值为nodes.conf 。
nodes.conf 节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更新。

3.创建启动脚本7005.bat
这样不用总是敲命令 ,名字随意改,其他几个文件夹同理

@echo off
redis-server.exe redis.conf
@pause

4.创建集群

  • 1.按照上面所说的配置好各个实例,主要是改端口号,运行 7000.bat- 7005.bat脚本启动六个redis实例

  • 2.cd到 redis-trib.rb 所在的目录下运行命令
    redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005


Image.png

打印出配置信息,现在的master是 7000 7001 7002这三台机,redis会对key 做 CRC16 校验和后分别存储这三台机上。没问题就输入 yes

例如 7000 这台机 slots:0-5460 的意思是:

对key 做 CRC16 校验和后 值在 0-5460范围内都会存到这台机器里
例如 key=288 对应的CRC16校验和 为 4258,应该存在7000这台机里

PS:使用前应该对业务做梳理,根据系统中key的特点来调整各个机器的slots范围,
不然系统的key基本集中在一两台机器上集群的效果就不大了

redis-trib.rb文件在下载下来的redis包里可能是没有的,可以到
https://github.com/antirez/redis/tree/unstable/src 目录下下载
之前的ruby环境就是为运行这个文件做准备的

命令的意义如下:

redis-trib.rb
create, 这表示我们希望创建一个新的集群。
选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
之后跟着的其他参数则是实例的地址列表, 我们希望程序使用这些地址所指示的实例来创建新集群。

简单来说, 以上命令的意思就是让 redis-trib 程序创建一个包含三个主节点和三个从节点的集群。

看看node.conf文件里生成了什么


Paste_Image.png

里面记录了master 和 slave的对应关系,例如图片里的 7000是master 而对应的 slave是7003这台机,绿色的一长串数字是对应机器的Id,redis以此来标记一台机器。

三、Jedis编程使用集群

github地址 https://github.com/xetorthio/jedis
按上面两步配置好,创建并启动集群。测试代码如下:

添加Jedis依赖

  <dependency>          <groupId>org.apache.commons</groupId>          <artifactId>commons-pool2</artifactId>          <version>2.4.2</version>    </dependency>    <dependency>         <groupId>redis.clients</groupId>          <artifactId>jedis</artifactId>          <version>2.7.3</version>    </dependency>

测试代码:

@Testpublic  void cluster(){    String key = "1417";    Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();    jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7000));       JedisCluster jc = new JedisCluster(jedisClusterNodes);    jc.setnx(key, "bar");    String value = jc.get(key);    System.out.println("key-"+key+" slot-"+JedisClusterCRC16.getSlot(key)+" value-"+value);    String key2 = "288";    jc.setnx(key2, "bar2");    String value2 = jc.get(key);    System.out.println("key-"+key2+" slot-"+JedisClusterCRC16.getSlot(key2)+" value-"+value2);}

Image.png

github上有这一句,Jedis Cluster 会自动去发现集群中的节点,所以JedisClusterNodes只需要 add一个实例

运行得到结果


Image.png

接下来用redis客户端看看这两个key=1417 、key=288的值存到哪个节点下
看回最初的配置


Image.png

key=288算出来的 CRC16校验和是 4258,根据配置 应该存在 7000这台机上
key=1417 算出来的 CRC16校验和是 13096,根据配置 应该存在 7002 这台机上

用redis 客户端查看数据存到哪台机器上


Image.png

进去7000这台机上
get 288拿到了value bar2
get 1417 得到提示让去 7002这台机查

从redis客户端看到的结果与配置一致

四、简单集成Spring

JedisFactory类
传入host 、port 和JedisPoolConfig 类

package your path;import java.util.HashSet;import java.util.Set;import redis.clients.jedis.HostAndPort;import redis.clients.jedis.JedisCluster;import redis.clients.jedis.JedisPoolConfig;/** * <p>Title: JedisClusterFactory.java</p> * <p>Description: </p> * @author qiaowei liu * @date 2016-1-14 * @version 1.0 */public class JedisClusterFactory {/**  * @Description  * @author qiaowei liu * @date 2016-1-14 上午11:00:18  * @param args */private JedisCluster jedisCluster;public JedisCluster getJedisCluster() {    return jedisCluster;}public JedisClusterFactory(JedisPoolConfig jedisPoolConfig,String host,int port){        Set<HostAndPort> jedisClusterNodes= new HashSet<HostAndPort>();    //Jedis Cluster will attempt to discover cluster nodes automatically    jedisClusterNodes.add(new HostAndPort(host,port));    jedisCluster=new JedisCluster(jedisClusterNodes,jedisPoolConfig);}}

JedisProvide.java工具类,主要是封装些常用的操作

package your path;import your path.CacheSecondLevel;import redis.clients.jedis.JedisCluster;/** * <p>Title: RedisProvide.java</p> * <p>Description: </p> * @author qiaowei liu * @date 2016-1-8 * @version 1.0 */public class RedisProvide implements CacheSecondLevel {private JedisCluster jedisCluster;public RedisProvide(JedisClusterFactory jedisClusterFactory){       jedisCluster=jedisClusterFactory.getJedisCluster();}@Overridepublic Object get(String key){    return jedisCluster.get(key);        }@Overridepublic Object[] gets(String[] keys) {    // TODO Auto-generated method stub    return null;}@Overridepublic void set(String key, Object obj) {    // TODO Auto-generated method stub    jedisCluster.set(key, obj.toString());}@Overridepublic void delete(String key) {    // TODO Auto-generated method stub    jedisCluster.del(key);}}

applicationContext.xml配置

     <!--==================== redis配置 start ====================-->          <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">          <property name="maxTotal"  value="${redis.maxTotal}" />     <property name="maxIdle" value="${redis.maxIdle}" />      <property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}" />    <property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}" />    <property name="testOnBorrow" value="${redis.testOnBorrow}" /> </bean> <bean id="jedisClusterFactory" class="xxx.xxx.JedisClusterFactory" >     <constructor-arg  ref ="jedisPoolConfig"/>    <constructor-arg  name="host" value="${redis.host}"/>    <constructor-arg  name="port" value="${redis.port}"/>            </bean> <bean id="redisProvide" class="xxx.xxx.RedisProvide">    <constructor-arg  ref ="jedisClusterFactory" /> </bean><!--==================== redis配置 end ====================-->

conf/perproties

#redis configredis.host=127.0.0.1redis.port=7000redis.timeout=100000redis.maxIdle=300redis.maxTotal=600 redis.timeBetweenEvictionRunsMillis=30000  redis.minEvictableIdleTimeMillis=30000 redis.testOnBorrow=true

参考资料

redis安装
参考 http://blog.csdn.net/renfufei/article/details/38474435

redis集群
http://doc.redisfans.com/topic/cluster-tutorial.html#id5

redis命令参考
http://doc.redisfans.com/

 Memcached & Redis

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

赞赏支持
 
登录 后发表评论
2条评论 只看作者
按喜欢排序按时间正序按时间倒序
 
黑帕
2楼 · 2016.04.11 16:11

:55:

   回复
 
cobs
3楼 · 2016.11.04 13:13

问下 那个cluster-enabled 配置 和slaveof配置 有什么区别,我看那个slaveof配置也可以设置为集群,博主知道吗 :smile:

   回复
回到顶部
0 0
原创粉丝点击