macos 10.12配置redis3.2.10伪集群

redis的集群方案现在主要有三种(不考虑云集群),一种是豌豆荚的codis,codis是豌豆荚的团队在redis2.8的分支上继续开发的,基于代理的方式,生态很完整,用的人很多。还有Twitter出品的twemproxy,同样是代理的方式,但是没有web端的管理界面。然后就是本文要介绍的redis官方集群方案

redis-cluter作为官方出品的集群方案,15年才随着redis3.0版本出来。当时市面上已经有了不少集群方案,所以现在的普及率不高,但是这种方式最简单适合学习,而且我觉得一些小团队用官方的集群方案挺好的。redis3.0集群正常工作要求至少有3个master节点,每个master节点要配置至少一个slave。redis集群一共有16384个哈希槽,数据库中的每个key都属于16384个中的一个,集群中每个master节点都负责一部分哈希槽

只有3个master负责读写,slave只是同步数据,master宕机时提升为master

  • redis的官方文档是有些问题的,它里面介绍的也是伪集群的方式,也就是一台机器上开6个redis实例构成集群。按照官方的说明,最少配置只需要下面这些,在真正的集群方案(一台机器一个redis实例)中是没问题的,但是如果是同一台机器,只配置这些,有些配置是冲突的。
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
  • 介绍一下我自己的目录结构,redis-3.2.10是源码包,single文件夹是平时使用的一个实例的相关文件的目录,cluster是这次新增的目录


    总目录

    cluster目录
  • 我的配置,和默认的redis.conf相比,需要改这些

需要说明的是:每个Redis群集节点都需要打开两个TCP连接。用于服务客户端的普通Redis TCP端口(例如6379),以及通过将10000添加到数据端口而获得的端口,因此示例中为16379。

#没什么说的,每个实例的服务端口肯定不同
port 6381 
# 后台运行,开启后台运行后会使用上面的pidfile文件
daemonize yes
# 每个实例要有自己的pid文件
pidfile /var/run/redis_6381.pid 
# 默认是"",这样的话当appendonly yes的时候,日志会打到/dev/null中
# 也就是日志被吞了,还是打印日志让人放心
logfile "/usr/local/redis/cluster/6381/redis6381.log" 
# 默认16个库,没什么意义,redis-cluster不支持换库
databases 1
# rdb文件名
dbfilename dump6381.rdb
# 存放rdb和aof的文件,默认是./
# 也就是在哪启动实例,就把rdb和aof文件放在哪,这太恶心了
dir /usr/local/redis/cluster/6381
# 开启aof,集群的话必须开启
appendonly yes
# aof文件名
appendfilename "appendonly6381.aof"
# 默认是被注释掉的
cluster-enabled yes
# 默认是被注释掉的,这个文件不需要自己操作,redis自动操作这个文件
cluster-config-file nodes-6381.conf
# 默认是被注释掉的
cluster-node-timeout 15000
  • 然后把6个实例都启动,执行redis-3.2.10/src/redis-trib.rb这个redis自带的ruby脚本。--replicas 1 代表每个master一个slave
    sudo redis-trib.rb create --replicas 1 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386
  • 启动后会给出一个方案,哪三个是master,哪三个是slave,接受的话输入yes集群就创建成功了

这里有坑,mac自带了ruby2.0.0可以运行这个脚本,但是这个脚本需要redis.gem才能让ruby使用redis的接口,当运行gem install redis的时候会安装最新的4.0.1版本,该版本要求ruby2.2.2以上。这里有两个解决方案,一是升级mac自带的ruby版本,推荐使用rym升级ruby。二是使用低版本的redis.gem。

我选择的第二种方式,在官网看到只有4版本对ruby版本有要求,所以使用3.3.5这个3的最后一个版本。执行:sudo gem install redis -v 3.3.5

  • redis-3.2.10/utils/create-cluster/create-cluster的这个脚本可以用来参考,写一个自己的启动、关闭集群的脚本
  • redis-trib.rb这个脚本只负责创建维护集群,不负责启动和关闭集群的redis实例,所有每次创建集群都需要开启6个实例,每次关闭集群都要关闭6个实例,很麻烦

Tips

redis的官方集群方案,用起来比其他的方式简单很多很多,很是和自己弄着玩

  • redis-cluster在spring中的配置
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
    <!--新版是maxTotal,旧版是maxActive,最大连接数-->
    <property name="maxTotal" value="30"/>
    <!-- 最大空闲连接数-->
    <property name="maxIdle" value="10"/>
    <!-- 每次释放链接的最大数目-->
    <property name="numTestsPerEvictionRun" value="1024"/>
    <!-- 释放链接的扫描间隔毫秒-->
    <property name="timeBetweenEvictionRunsMillis" value="30000"/>
    <!-- 连接最小空闲时间-->
    <property name="minEvictableIdleTimeMillis" value="1800000"/>
    <!-- 连接空闲多久后释放,当空闲时间大于该值且空闲连接大于最大空闲连接数时释放-->
    <property name="softMinEvictableIdleTimeMillis" value="10000"/>
    <!-- 获取连接的最大等待毫秒,小于零:阻塞不确定的时间,默认-1-->
    <property name="maxWaitMillis" value="1500"/>
    <!-- 获取连接时检查有效性,默认false-->
    <property name="testOnBorrow" value="true"/>
    <!-- 空闲时检查有效性,默认false-->
    <property name="testWhileIdle" value="true"/>
    <!-- 连接耗尽时是否阻塞,false报异常,true阻塞直到超时,默认true-->
    <property name="blockWhenExhausted" value="false"/>
</bean>

<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster" destroy-method="close">
    <constructor-arg name="jedisClusterNode">
        <set>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="127.0.0.1"/>
                <constructor-arg name="port" value="6381"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="127.0.0.1"/>
                <constructor-arg name="port" value="6382"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="127.0.0.1"/>
                <constructor-arg name="port" value="6383"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="127.0.0.1"/>
                <constructor-arg name="port" value="6384"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="127.0.0.1"/>
                <constructor-arg name="port" value="6385"/>
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="127.0.0.1"/>
                <constructor-arg name="port" value="6386"/>
            </bean>
        </set>
    </constructor-arg>
    <constructor-arg name="timeout" value="2000"/>
    <constructor-arg name="maxAttempts" value="100"/>
    <constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
</bean>
  • redis3版本之前可以用jedis提供的分片客户端功能,spring配置
<bean id="sharedJedisPool" class="redis.clients.jedis.ShardedJedisPool" destroy-method="close">
    <constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
    <constructor-arg name="shards">
        <list>
            <bean class="redis.clients.jedis.JedisShardInfo">
                <constructor-arg name="host" value="127.0.0.1"/>
                <constructor-arg name="port" value="6379"/>
            </bean>
        </list>
    </constructor-arg>
</bean>

ShardedJedisPool作为jedis在redis3之前的分片客户端的实现,相当于根据key的不同,将数据存入不同的redis实例,所以每个redis实例中数据是不同的。JedisCluster作为jedis在redis3之后的集群实现,客户端不会根据key来分片,redis-cluster实现这个功能,并且集群中的每个redis都可以拿到整个集群的全部数据,虽然redis实例间数据还是不同,但会通过转发拿到别的redis实例的数据

  • 平时自己开发用,可以使用单实例redis的配置
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
        <constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
        <constructor-arg name="host" value="localhost"/>
        <constructor-arg name="port" value="6379"/>
    </bean>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容