当前位置: > 数据库 > Redis >

redis的集群

时间:2015-09-19 22:15来源:www.it.net.cn 作者:IT
redis3.0之前我们都只能通过client来实现分布式,从3.0开始server端支持分布式




Redis 3.0.0正式版出炉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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实现的一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
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
2
3
4
5
6
1.在新机器上启动好对应端口的Redis实例。 2.配置新端口为待迁移端口的从库。 3.待复制完成,与主库完成同步后,切换所有客户端配置到新的从库的端口。 4.配置从库为新的主库。 5.移除老的端口实例。 6.重复上述过程迁移好所有的端口到指定服务器上。
参考: http://blog.nosqlfan.com/html/3153.html

 

现在最新的版本3.0.0,server端已经实现了集群

以下是相关的安装配置:

1.创建redis集群时需要依赖ruby环境以及相关组件

1
2
yum install ruby      
yum install rubygems
redis 和 ruby 的接口,使用 gem  安装



1
2
gem install redis
gem install redis -v 3.2.1  #知道版本下载
默认下载最新版本,其他版本地址:https://rubygems.org/gems/redis/versions/

2.redis安装启动

 
1
2
3
4
# 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

 
1
cp redis.conf redis_7000.conf    #拷贝配置文件用来测试



主要修改的配置:
 
1
2
3
4
5
6
7
8
9
10
11
12
13
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

1
2
3
./src/redis-server redis_7000.conf 
./src/redis-server redis_7001.conf 
./src/redis-server redis_7002.conf


查看redis进程
 
1
ps -ef |grep redis
 
1
2
3
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集群
 
1
./src/redis-trib.rb create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
>>> 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.测试
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[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


(责任编辑:IT)
------分隔线----------------------------