`

redis集群搭建_亲自操作

阅读更多

【redis 介绍与安装】

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、 set(集合)、zset(sorted set --有序集合)和hash(哈希类型即Map)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。 这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

Redis 3.0的最重要特征是对Redis集群的支持,此外,该版本相对于2.8版本在性能、稳定性等方面都有了重大提高。

官网: http://redis.io 有安装说明。 官方下载地址: http://redis.io/download 安装redis:

  1. #下载
  2. $ wget http://download.redis.io/releases/redis-3.0.1.tar.gz
  3. #解压,自己先拷贝到自己想放的地方
  4. $ tar xzf redis-3.0.1.tar.gz
  5. #到redis解压目录下去
  6. $ cd redis-3.0.1
  7. #编译
  8. $ make
  9. #到redis下src目录下去启动redis服务
  10. $ src/redis-server
  11. #启动客户端去操作
  12. $ src/redis-cli
  13. redis>set foo bar
  14. OK
  15. redis>get foo
  16. "bar"
  17. #测试成功

【redis 创建集群】

官网集群说明参考: http://redis.io/topics/cluster-tutorial http://redis.io/topics/cluster-tutorial

亲测详细演示步骤:

注意:redis2.x的版本不支持集群模式。 官网说明文档集群需要六个节点。要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点。

详细说明:

  1. cd software/
  2. #创建目录
  3. mkdir redis_cluster
  4. cd redis_cluster/
  5. #创建6个目录,在同一机器跑6个redis在不同端口
  6. mkdir 700070017002700370047005
  7. #复制配置文件
  8. cp /home/liang/software/redis-3.0.1/src/redis.conf ../redis_cluster/

每个目录放一个redis.conf,以7000目录为例
port 7000 每个目录名作为一个端口

  1. vim redis.conf
  2. port 7000
  3. daemonize yes
  4. cluster-enabled yes
  5. cluster-config-file nodes.conf
  6. cluster-node-timeout 5000
  7. appendonly yes

daemonize yes 是否以后台方式运行, 默认daemonize参数为no,所以redis不会在后台运行,退出终端,则会退出redis服务,这时要测试,我们需要重新开一个终端

修改完redis.conf配置文件中的这些配置项之后,把这个配置文件分别拷贝到7000/ 7001/ 7002/ 7003/ 7004/ 7005/目录下面

注意:拷贝完成之后要修改7001/7002/7003/7004/7005目录下面redis.conf文件中的port端口参数,分别改为对应的文件夹的名称

  1. cp redis.conf 7000/
  2. cp redis.conf 7001/
  3. cp redis.conf 7002/
  4. cp redis.conf 7003/
  5. cp redis.conf 7004/
  6. cp redis.conf 7005/

启动 分别进入每一个目录启动redis

  1. cd 7000/
  2. ../../redis-3.0.1/src/redis-server redis.conf
  3. cd ../7001/
  4. ../../redis-3.0.1/src/redis-server redis.conf
  5. ......
  6. cd ../7005/
  7. ../../redis-3.0.1/src/redis-server redis.conf

启动之后使用命令查看redis的启动情况 ps -ef|grep redis

创建集群:默认前三台为主节点,后三台为从节点. 选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。

注意:这里最好使用ip地址,不要用127.0.0.1(因为用远程环境其他服务器,远程连接时会出现问题,本机使用客户端./redis-cli -h 172.17.20.16 -c -p 7000 连接后获取数据自动跳到127.0.0.1:7000,就是因为创建集群时使用的是127.0.0.1的原因,而且使用java项目连接时会报错误:Too many Cluster redirections)

  1. ./redis-trib.rb create --replicas 1172.17.20.16:7000172.17.20.16:7001172.17.20.16:7002172.17.20.16:7003172.17.20.16:7004172.17.20.16:7005

执行上面的命令的时候可能会报错,创建集群需要一些环境:根据提示一个一个的安装。
执行的是ruby的脚本,需要ruby的环境。提示缺少rubygems组件。不能加载redis,是因为缺少redis和ruby的接口。

sudo gem install redis 因为国内的网络限制,要f q或着手动下载安装。

  1. sudo apt-get install ruby
  2. sudo apt-get install rubygems
  3. sudo gem install redis

环境安装好,再次执行创建命令,正常执行,输入yes 创建成功

【redis-cli使用集群】
  1. #检查集群有没有成功
  2. ./redis-trib.rb check 172.17.20.16:7000
  3. #客户端连接,注意-c参数,查找时不在本端口,会自动切换到有数据的那个端口下查询。
  4. redis-cli -c -p 7000
  5. 127.0.0.1:7000> cluster nodes
  6. 7a6121a5d8c87fc5345f6812e41c83f5163f2db6127.0.0.1:7002 master -014585469620943 connected 10923-16383
  7. 9939a801cf27710cd3ecbcde33b0f1d15b4af834127.0.0.1:7000 myself,master -001 connected 0-5460
  8. 1e60c2a340fc70a812392f098eec97c20557954b127.0.0.1:7001 master -014585469615932 connected 5461-10922
  9. 4af9487baf21d763d7872436677af3404ba5dccd127.0.0.1:7004 slave 1e60c2a340fc70a812392f098eec97c20557954b014585469610925 connected
  10. 011d4c450f6f21d05ed655f6b57020ad284e9cf8127.0.0.1:7003 slave 9939a801cf27710cd3ecbcde33b0f1d15b4af834014585469605924 connected
  11. e6a251b28ad454dbea3bd972cb7d128403c0415e 127.0.0.1:7005 slave 7a6121a5d8c87fc5345f6812e41c83f5163f2db6014585469615936 connected
  12. #用于查看当前Redis节点 所属的Redis集群中的所有节点。
  13. #master表示主节点,slave表示从节点,slave后的id对应主节点的id。myself表示在当前那一台。
  1. #查看当前的集群状态,以数组形式展示。
  2. 127.0.0.1:7000> cluster slots
  3. 1)1)(integer)10923
  4. 2)(integer)16383
  5. 3)1)"127.0.0.1"
  6. 2)(integer)7002
  7. 4)1)"127.0.0.1"
  8. 2)(integer)7005
  9. 2)1)(integer)0
  10. 2)(integer)5460
  11. 3)1)"127.0.0.1"
  12. 2)(integer)7000
  13. 4)1)"127.0.0.1"
  14. 2)(integer)7003
  15. 3)1)(integer)5461
  16. 2)(integer)10922
  17. 3)1)"127.0.0.1"
  18. 2)(integer)7001
  19. 4)1)"127.0.0.1"
  20. 2)(integer)7004
  21. ```

shell

用于查看当前Redis节点所属的Redis集群的整体状态。

127.0.0.1:7000> cluster info clusterstate:ok clusterslotsassigned:16384 clusterslotsok:16384 clusterslotspfail:0 clusterslotsfail:0 clusterknownnodes:6 clustersize:3 clustercurrentepoch:7 clustermyepoch:3 clusterstatsmessagessent:26914 clusterstatsmessagesreceived:26281

  1. 例:

shell

会自动保存到一个节点,并切换到对应节点 如:7001

set beyond "aaa"

会自动去查找,找到返回数据并跳到对应端口下

get beyond

没有找到返回(nil)

get abc

  1. 从上面知道:7001是主,7004是从,我把7001停止后,在查找beyond数据仍然能找到(这时7004是主节点了),7004也停止后,则找不到beyond数据了。
  2. #### 【java访问redis集群】

xml redis.clientsjedis2.7.0


java package com.beyond;

import java.util.HashSet; import java.util.Set; import org.junit.Test; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster;

public class TestJedisCluster{ private static JedisCluster jc;
static {
//只给集群里一个实例就可以 Set jedisClusterNodes = new HashSet();
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7000));
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7001));
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7002)); jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7003));
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7004));
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7005)); jc = new JedisCluster(jedisClusterNodes);
}

  1. @Test
  2. publicvoid testredis(){
  3. //jc.set("foo", "bar");
  4. String value = jc.get("foo");
  5. System.out.println(value);
  6. System.out.println(jc.get("beyond"));
  7. }

}

  1. #### 【spring-data访问redis集群】
  2. Maven pom.xml配置

xml
org.springframework.dataspring-data-redis1.7.1.RELEASE

  1. spring xml配置

xml

..............

................

 

 

 

  1. java 代码中使用

java @Resource
private RedisTemplate<string, string="" style="box-sizing: border-box;"> redisTemplate;
redisTemplate.opsForValue().set("test", "test");

  1. #### 【redis集群分片】
  2. 当集群的redis内存不够用时,需要新增加节点
  3. 新增加一台7006,配置与上面的一样,启动后,执行下面命令加入集群

shell

在集群中新增加一台节点,默认为主节点

./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000


shell

也可以让它成为从节点,7fec61c9df3e7d739916d63a5d1172a23d169c72(需要做为它的从节点的节点ID)

127.0.0.1:7006>cluster replicate 7fec61c9df3e7d739916d63a5d1172a23d169c72

  1. 新增加的节点是无法使用的,因为哈希槽为0,需要分片分配哈希槽(看特别说明)

shell ./redis-trib.rb reshard 127.0.0.1:7000 ``` How many slots do you want to move (from 1 to 16384)? 4096
需要输入分给7006的哈希槽区间,这里我们4个主节点平均分配就是4096

What is the receiving node ID? 0d1f9c979684e0bffc8230c7bb6c7c0d37d8a5a9(这个是移动到7006的id)
询问重新分片的源节点 即:要从哪个节点中取出 4096 个哈希槽, 并将这些槽移动到目标节点7006上面。

如果我们不打算从特定的节点上取出指定数量的哈希槽, 那么可以向 redis-trib 输入 all Source node #1:all
输入 all 并按下回车之后, redis-trib 将打印出哈希槽的移动计划,

如果你觉得没问题的话, 就可以输入 yes 并再次按下回车
Do you want to proceed with the proposed reshard plan (yes/no)? yes
重新分片操作, 将指定的哈希槽从源节点一个个地移动到目标节点上面
数据也会跟着移动的

【特别说明】

说明:Redis集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现:一个 Redis集群包含16384个哈希槽(hash slot), 数据库中的每个键都属于这16384个哈希槽的其中一个,集群使用公式CRC16(key)%16384来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。

集群中的每个节点负责处理一部分哈希槽。 举个例子,一个集群可以有三个哈希槽, 其中:

  1. 节点 A 负责处理0号至5500号哈希槽。
  2. 节点 B 负责处理5501号至11000号哈希槽。
  3. 节点 C 负责处理11001号至16384号哈希槽。

这种将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点。 比如说:
如果用户将新节点 D 添加到集群中, 那么集群只需要将节点 A 、B 、 C 中的某些槽移动到节点 D 就可以了。
与此类似, 如果用户要从集群中移除节点 A , 那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C , 然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。

因为将一个哈希槽从一个节点移动到另一个节点不会造成节点阻塞, 所以无论是添加新节点还是移除已存在节点, 又或者改变某个节点包含的哈希槽数量, 都不会造成集群下线。

注意:比如A B C是主节点,它们每台都有一个从节点。
当B出问题了,它的从节点会自动成为主节点,如果B主节点从节点都出问题了,B 负责处理 5501 号至 11000 号哈希槽就处理不了,整个集群就出问题了。

想移除B节点之前,先备份它的哈希槽到其他节点之后在移除。

【性能测试】

从服务器20.16 直接插入120万到 redis服务器 20.18
test1 redis1200000总的时间:264s

从服务器20.16 开三线程执行120万到 redis服务器 20.18
test2 redis的时间:94s
test2 redis的时间:94s
test2 redis的时间:94s

从服务器20.13 直接插入120万到 redis服务器 20.16 集群
test1 redis1200000总的时间:309s

从服务器20.13 开三线程执行120万到 redis服务器 20.16 集群
test2 redis的时间:109s
test2 redis的时间:109s
test2 redis的时间:109s

【详细说明和资料】

redis安装,命令,集群,伪集群等相关详细资料请查看:网盘里Af目录下redis资料。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics