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 rubygems
redis
和
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