第一步:环境的准备:
redis-3.2.0.gem可到官方网站去下载。官方网站走你
第二部,更改配置:
(1)、拷贝6份redis.conf文件,分变命名6379.conf,6380.conf,6381.conf,6382.conf,6383.conf,6384.conf
按(2)步骤更改配置文件
(2)、更改具体配置文件
- 绑定端口,port 63xx
- 绑定IP,bind 10.12.11.100
- 指定数据存放路径,dir /usr/local/redis-cluster/7031
- 启动集群模式,cluster-enabled yes
- 指定集群节点配置文件,cluster-config-file nodes-7031.conf
- 更改pid文件,pidfile /var/run/redisxx.pid
- 更改dbfilename , dbfilename dumpxx.rdb
- 后台启动,daemonize yes
- 指定集群节点超时时间,cluster-node-timeout 5000
- 指定持久化方式,appendonly yes
红色最好都配置一下,防止出错。
(3)、分别启动这6个redis实例,会生成6个nodes-63xx.conf文件,看看有木有报错
(4)、将6个节点合并成一个集群
进入redis安装目录的src目录下执行命令:
./redis-trib.rb create --replicas 1 10.12.11.100:6379 10.12.11.100:6380 10.12.11.100:6381 10.12.11.100:6382 10.12.11.100:6383 10.12.11.100:6384
命令的说明:
给定 redis-trib.rb 程序的命令是 create,表示创建一个新的集群。选项 --replicas 1 表示为集群中的每个主节点创建一个从节点。之后跟着的其他参数则是实例的地址列表, 指定使用这些地址所指示的实例来创建新集群。
使用redis客户端查看集群信息
redis cluster 如何分配这6个节点?
- 一个集群至少有三个主节点。
- 上面创建集群的命令 --replicas 1表示集群中每个主节点创建一个从节点。
- 分配原则尽可能保证每个主数据库运行在不同的IP地址,每个从库于主库不在一个IP地址上。
(5)、集群测试
使用命令连接redis服务,注意要加上-c 否则会报move错误 redis-cli -c -h 10.12.11.100 -p 6379
不在同一个槽下面不能使用mget 和mset。可以使用{}来定义组的概念,从而是key种{}内相同内容的键值放到一个slot中去。
下面摘抄一篇很好的博文,对redis中槽的讲解:走你
和memcached一样,redis也采用一定的算法进行键-槽(key->slot)之间的映射。memcached采用一致性哈希(consistency hashing)算法进行键-节点(key-node)之间的映射,而redis集群使用集群公式来计算键 key 属于哪个槽:
HASH_SLOT(key)= CRC16(key) % 16384
其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。key经过公式计算后得到所 对应的哈希槽,而哈希槽被某个主节点管理,从而确定key在哪个主节点上存取,这也是redis将数据均匀分布到各个节点上的基础。
集群分区好处
无论是memcached的一致性哈希算法,还是redis的集群分区,最主要的目的都是在移除、添加一个节点时对已经存在的缓存数据的定位影响尽可能的降到最小。redis将哈希槽分布到不同节点的做法使得用户可以很容易地向集群中添加或者删除节点, 比如说:
- 如果用户将新节点 D 添加到集群中, 那么集群只需要将节点 A 、B 、 C 中的某些槽移动到节点 D 就可以了。
- 与此类似, 如果用户要从集群中移除节点 A , 那么集群只需要将节点 A 中的所有哈希槽移动到节点 B 和节点 C , 然后再移除空白(不包含任何哈希槽)的节点 A 就可以了。
因为将一个哈希槽从一个节点移动到另一个节点不会造成节点阻塞, 所以无论是添加新节点还是移除已存在节点, 又或者改变某个节点包含的哈希槽数量, 都不会造成集群下线,从而保证集群的可用性。下面我们就来学习下集群中节点的增加和删除。
查看集群信息
cluster info 查看集群状态,槽分配,集群大小等,cluster nodes也可查看主从节点。
新增节点
- 新增节点配置文件
拷贝一份redis的配置文件,并命名为6385.conf 。并更改配置文件,具体更改方式和上述同样。
2.启动新增节点(就是启动这个6385的redis实例)
3. 添加节点到集群
同上面一样,在redis安装目录的src下面执行:./redis-trib.rb add-node 10.12.11.100:6385 10.12.11.100:6379
第一个IP为新增的节点,第二个IP为集群中的一个存在的节点。
4.分配槽
从添加主节点输出信息和查看集群信息中可以看出,我们已经成功的向集群中添加了一个主节点,但是这个主节还没有成为真正的主节点,因为还没有分配槽(slot),也没有从节点,现在要给它分配槽(slot)
./redis-trib.rb reshard 10.12.11.100:6385
- 确定后提示要分配多少个槽,本次案例分配1024个。
- 确定后会让你输入要分配的节点的ID。
- 然后提示要从哪几个节点中移除1024个槽(slot),这里输入‘all’表示从所有的主节点中随机转移,凑够1024个哈希槽,然后就开始从新分配槽(slot)了。从新分配完后再次查看集群节点信息
删除节点
指定删除节点的ID即可,如下
./redis-trib.rb del-node 10.12.11.100:6385 '要删除的那个节点的ID' 注意引号不能丢
集群的优缺点
怎么玩
redis的配置不贴上面了,可以自己配置一下
@RequestMapping("redisTest")
@ResponseBody
public String redisTest() throws IOException {
Set<HostAndPort> nodes=new HashSet<>();
nodes.add(new HostAndPort("10.12.11.100",6379));
JedisCluster cluster =new JedisCluster(nodes);
cluster.set("name","zhangsan");
cluster.close();
return "";
}