redis集群的Cluster方式配置以及spring的集成

来源:互联网 发布:超级seo 编辑:程序博客网 时间:2024/05/22 17:16

Windows 配置Reids集群 Redis Cluster

1. 下载安装Redis

Redis官方不支持Windows,但是Microsoft Open Tech group在 GitHub上开发了一个Win64的版本,下载地址为: 
https://github.com/MSOpenTech/redis/releases

解压之后,拷贝到自定义的redis目录下,例如D:\dev\Redis

打开cmd,切换到Redis目录下,执行

redis-server redis.windows.conf

窗口不要关闭,再重新打开一个cmd窗口,连接Redis执行

redis-cli.exe -h 127.0.0.1 -p 6379

2. 安装Ruby并配置环境

安装Ruby,Windows可以安装RubyInstaller,下载地址: 
http://railsinstaller.org/en

win下安装教程:http://jingyan.baidu.com/article/6181c3e094296d152ef153d7.html

只能更换下RubyGems 镜像

感谢淘宝 http://ruby.taobao.org

gem sources --remove https://rubygems.org/

gem sources -a https://ruby.taobao.org/

gem sources -l


一直下一步安装完成会自动弹出一个cmd的黑色窗口,需要对Ruby进行配置



3. 搭建Redis集群

要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。

主节点崩溃,从节点的Redis就会提升为主节点,代替原来的主节点工作,崩溃的主Redis回复工作后,会成为从节点

1). 创建Redis集群目录

在redis安装的根目录下创建6个以端口命名的文件夹

mkdir 7000 7001 7002 7003 7004 7005

将安装的redis文件夹中的redis.windows.conf以及redis-server,分别拷贝到新建的六个文件夹中

2). 更改配置

将六个文件夹下的redis.windows.conf文件中以下属性进行修改:

port 7001(对应文件夹的端口号)cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yes
开始不要给每个redis设置密码,不然后面会非常痛苦

3). 启动6个redis服务

进入每个端口命名的文件夹下启动服务

cd 7001redis-server.exe redis.conf(redis.win.conf)

其他几个目录同上

4). 创建启动集群

由于创建启动集群需要redis-trib.rb文件,它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群,检查集群或者对集群进行重新分片(reshared)等工作。

Windows的redis安装文件中是没有这个文件的,我们需要去官网下载Redis,官网的Redis是Linux版本,在其源码src文件夹下,将redis-trib.rb拷贝到本机中Redis的安装目录中

最后进入redis-trib.rb文件所在目录执行:

ruby 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
到这一步可能会报错,需要执行:
gem install redis

然后执行上一步在这里用于创建一个新的集群, 选项–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。之后跟着的其他参数则是这个集群实例的地址列表,3个master3个slave

redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 yes ,redis-trib 就会将这份配置应用到集群当中,让各个节点开始互相通讯。

5). 连接集群进行测试

连接集群的指令:

redis-cli.exe -c -p 7000

Redis集群数据分配策略:

采用一种叫做哈希槽 (hash slot)的方式来分配数据,redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384

注意的是:必须要3个以后的主节点,否则在创建集群时会失败,三个节点分别承担的slot 区间是:

    节点A覆盖0-5460;    节点B覆盖5461-10922;    节点C覆盖10923-16383.

所以上图中按照redis cluster的哈希槽算法:CRC16(‘name’)%16384 
被分配到了7001端口的redis服务上。

至此,Redis Cluster在Windows上的配置就完成了!

设置集群访问密码:

方式一:修改所有Redis集群中的redis.conf文件加入: 
masterauth passwd123 
requirepass passwd123 
说明:这种方式需要重新启动各节点

方式二:进入各个实例进行设置: 
./redis-cli -c -p 7000 
config set masterauth passwd123 
config set requirepass passwd123 
config rewrite 

设置成功以后,可以ip,端口进入实例,但是操作需要密码:

auth 密码

这个命令就是登陆;

下面是spring的集群配置:

xml配置:这里出现很多问题,jedis和spring-data-redis低版本是不支持密码和集群的,jar包容易出现问题,

redisClusterConfiguration配置集群实例时有两种方式,一种是通过resource资源文件加载(我用的这种但是出现很多问题)二中是在redisClusterConfiguration
里面直接注入每一个实例,具体可以看一看源码,通过set的方式注入

<!-- 引入配置文件 -->      <bean id="propertyConfigurer"            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">          <property name="ignoreResourceNotFound" value="true" />        <property name="locations" >            <list>              <value>classpath*:/redis.properties</value>          </list>      </property>     </bean>     <!-- redis pool相关配置 --><bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"><!-- 最小空闲数 --><property name="minIdle" value="${redis.minIdle}" /><!-- 最大空闲数 --><property name="maxIdle" value="${redis.maxIdle}" /><!-- 最大连接数 --><property name="maxTotal" value="${redis.maxTotal}" /><!-- 最大等待时间 单位毫秒(ms) --><property name="maxWaitMillis" value="${redis.maxWaitMillis}" /><!-- 使用连接时测试连接是否可用 --><property name="testOnBorrow" value="${redis.testOnBorrow}" /></bean><!--配置文件加载-->      <bean id="resourcePropertySource" class="org.springframework.core.io.support.ResourcePropertySource">          <constructor-arg name="name" value="redis.properties"/>          <constructor-arg name="resource" value="classpath:redis.properties"/>      </bean>   <!-- Redis集群配置     这里使用的是spring-data-redis  包中内容 -->   <!--redisCluster配置-->      <bean id="redisClusterConfiguration" class="org.springframework.data.redis.connection.RedisClusterConfiguration">          <constructor-arg name="propertySource" ref="resourcePropertySource"/>      </bean> <!-- jedis客户端连接工厂 --><bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><constructor-arg name="clusterConfig" ref="redisClusterConfiguration"/><constructor-arg name="poolConfig" ref="poolConfig"/> <property name="password" value="gongyiyang" /></bean><!-- <property name="database" value="${redis.database}" /><property name="port" value="${redis.port}" /><property name="hostName" value="${redis.host}" /><property name="password" value="${redis.password}" /> --><!-- redisTemplate模板 --><bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"><property name="connectionFactory" ref="jedisConnectionFactory" /></bean>    <!-- redis缓存管理器 --><bean id="cacheManager" class="org.gyy.redis.spring_redis.RedisCacheManager"><constructor-arg name="redisOperations" ref="redisTemplate" /><!-- 是否事务提交,如果事务回滚,缓存也回滚,默认false --><property name="transactionAware" value="true" /><!-- 设置缓存超时时间 已实现自动续期 如果不设置将永久存在 --><property name="expires"><map><!-- 模块信息相关缓存配置 --><entry key="cachelong" value="1800" /></map></property></bean><!-- 支持缓存注解 --><cache:annotation-driven cache-manager="cacheManager" />
资源文件:使用资源文件时,由于spring在加载资源文件时有可能不会加载到,需要自己设置,我直接就把它放在spring的资源文件上面加载了,使得资源文件很庞大,另外这里是没有sentine配置,只有cluster的集群,集体有什么区别,百度一下

#redis中心  #redis的服务器地址  redis.host=127.0.0.1  #redis的服务端口  redis.port=6379  #密码  redis.password=123456 #缓存池最小空闲数redis.minIdle=5#缓存池最大空闲数redis.maxIdle=100#缓存池最大连接数redis.maxTotal=300#最大等待时间redis.maxWaitMillis=3000#客户端超时时间单位是毫秒  redis.timeout=100000  redis.maxTotal=1000  redis.minIdle=8  #明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个  redis.testOnBorrow=true    #sentinel  #spring.redis.sentinel.master=mymaster  #spring.redis.sentinel.node1.host=127.0.0.1  #spring.redis.sentinel.node2.host=127.0.0.1  #spring.redis.sentinel.node3.host=127.0.0.1  #spring.redis.sentinel.node1.port=26379  #spring.redis.sentinel.node2.port=26479  #spring.redis.sentinel.node3.port=26579  #sentinel    #jediscluster  cluster1.host.port=127.0.0.1:7000  cluster2.host.port=127.0.0.1:7001  cluster3.host.port=127.0.0.1:7002  cluster4.host.port=127.0.0.1:7003  cluster5.host.port=127.0.0.1:7004  cluster6.host.port=127.0.0.1:7005  #jediscluster    #rediscluster  spring.redis.cluster.nodes=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:7005spring.redis.cluster.max-redirects=3  #rediscluster 
设置成功以后直接注解使用就可以了,另外说一下,如果项目中有使用mybatis多数据源的注入,有可能会报错,


阅读全文
0 0
原创粉丝点击