Redis 3.0 版本与 2.8 版本比较,主要新特性包括如下几个方面: * Redis Cluster —— 一个分布式的 Redis 实现 * 全新的 "embedded string" 对象编码结果,更少的缓存丢失,在特定的工作负载下速度的大幅提升 * AOF child -> parent 最终数据传输最小化延迟,通过在 AOF 重写过程中的 "last write" * 大幅提升 LRU 近似算法用于键的擦除 * WAIT 命令堵塞等待写操作传输到指定数量的从节点 * MIGRATE 连接缓存,大幅提升键移植的速度 * MIGARTE 新的参数 COPY 和 REPLACE * CLIENT PAUSE 命令:在指定时间内停止处理客户端请求 * BITCOUNT 性能提升 * CONFIG SET 接受不同单位的内存值,例如 "CONFIG SET maxmemory 1gb". * Redis 日志格式小调整用于反应实例的角色 (master/slave) * INCR 性能提升
主要特性中最值得我们期待的还是:Redis Cluster —— 一个分布式的 Redis 实现。
回顾之前的版本,要实现集群我们采取的方式:
采用一致性哈稀分片(Shard),将不同的key分配到不同的redis server上,达到横向扩展的目的。
如jedis实现的一段代码:
JedisShardInfo jedisShardInfo1 = new JedisShardInfo( bundle.getString("redis1.ip"), Integer.valueOf(bundle .getString("redis.port"))); JedisShardInfo jedisShardInfo2 = new JedisShardInfo( bundle.getString("redis2.ip"), Integer.valueOf(bundle .getString("redis.port"))); List<JedisShardInfo> list = new LinkedList<JedisShardInfo>(); list.add(jedisShardInfo1); list.add(jedisShardInfo2); ShardedJedisPool pool = new ShardedJedisPool(config, list); ShardedJedis jedis = pool.getResource();
由jedis客户端帮助我们实现集群。
关于此模式下在线扩容的问题,redis作者也给出了解决方案:
Redis的作者提出了一种叫做presharding的方案来解决动态扩容和数据分区的问题,实际就是在同一台机器上部署多个Redis实例的方式,当容量不够时将多个实例拆分到不同的机器上,这样实际就达到了扩容的效果。
拆分过程如下:
1.在新机器上启动好对应端口的Redis实例。 2.配置新端口为待迁移端口的从库。 3.待复制完成,与主库完成同步后,切换所有客户端配置到新的从库的端口。 4.配置从库为新的主库。 5.移除老的端口实例。 6.重复上述过程迁移好所有的端口到指定服务器上。参考: http://blog.nosqlfan.com/html/3153.html
现在最新的版本3.0.0,server端已经实现了集群
以下是相关的安装配置:
1.创建redis集群时需要依赖ruby环境以及相关组件
yum install ruby yum install rubygemsredis 和 ruby 的接口,使用 gem 安装
gem install redis gem install redis -v 3.2.1 #知道版本下载默认下载最新版本,其他版本地址:https://rubygems.org/gems/redis/versions/
2.redis安装启动
# wget http://download.redis.io/releases/redis-3.0.0.tar.gz # tar -xvzf redis-3.0.0.tar.gz # cd redis-3.0.0 # make && make install此次我们启动3个端口用来实现集群端口号定位:7000,7001,7002
cp redis.conf redis_7000.conf #拷贝配置文件用来测试主要修改的配置:
daemonize yes pidfile /var/run/redis_7000.pid port 7000 logfile log_7000.log dbfilename dump_7000.rdb appendonly yes appendfilename "appendonly_7000.aof" #集群相关配置 cluster-enabled yes # 开启当前redis的集群模式,3.0版本才出现,默认关闭 cluster-config-file nodes-7000.conf # 集群模式下,每个redis节点生成一个自己的集群配置文件,这个文件不需要人工修改,由redis自己维护 cluster-node-timeout 5000 # 集群模式时,当前节点在与其他节点保活探测时,多久没有响应时认为其他节点处于fail状态,上面是5秒将redis_7000.conf拷贝2份,分别命名为: redis_7001.conf和redis_7002.conf,注意配置文件中多处涉及到端口号的需要改成相应的端口号。
启动redis
./src/redis-server redis_7000.conf ./src/redis-server redis_7001.conf ./src/redis-server redis_7002.conf查看redis进程
ps -ef |grep redis
root 8055 1 0 16:53 ? 00:00:00 ./src/redis-server *:7000 [cluster] root 8059 1 0 16:53 ? 00:00:00 ./src/redis-server *:7001 [cluster] root 8063 1 0 16:53 ? 00:00:00 ./src/redis-server *:7002 [cluster]3.创建redis集群
./src/redis-trib.rb create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
>>> Creating cluster Connecting to node 127.0.0.1:7000: OK Connecting to node 127.0.0.1:7001: OK Connecting to node 127.0.0.1:7002: OK >>> Performing hash slots allocation on 3 nodes... Using 3 masters: 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 M: bf69e891628746bbea25950dc2050bbeb8130336 127.0.0.1:7000 slots:0-5460 (5461 slots) master M: 9a7377cf83fce1d7c9421e2771b80b76c6900cdc 127.0.0.1:7001 slots:5461-10922 (5462 slots) master M: d161474456d8f0ac22c7703a1196cb89123b3210 127.0.0.1:7002 slots:10923-16383 (5461 slots) master Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join.. >>> Performing Cluster Check (using node 127.0.0.1:7000) M: bf69e891628746bbea25950dc2050bbeb8130336 127.0.0.1:7000 slots:0-5460 (5461 slots) master M: 9a7377cf83fce1d7c9421e2771b80b76c6900cdc 127.0.0.1:7001 slots:5461-10922 (5462 slots) master M: d161474456d8f0ac22c7703a1196cb89123b3210 127.0.0.1:7002 slots:10923-16383 (5461 slots) master [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.4.测试
[root@ip-172-31-6-100 redis-3.0.0]# redis-cli -c -p 7000 127.0.0.1:7000> 127.0.0.1:7000> 127.0.0.1:7000> set foo aaaaa -> Redirected to slot [12182] located at 127.0.0.1:7002 OK 127.0.0.1:7002> set hello world -> Redirected to slot [866] located at 127.0.0.1:7000 OK 127.0.0.1:7000> get foo -> Redirected to slot [12182] located at 127.0.0.1:7002 "aaaaa" 127.0.0.1:7002> get hello -> Redirected to slot [866] located at 127.0.0.1:7000 "world" 127.0.0.1:7000>
参考更多:
http://redis.io/topics/cluster-tutorial 官网教程
https://vimeo.com/63672368 视频教程http://blog.51yip.com/nosql/1725.html
http://blog.csdn.net/xu470438000/article/details/42971091