redis学习7--redis-Cluster
1 redis 数据分区
redis采用虚拟槽分区,将所有数据全部分散在16384个槽内 槽的范围是0-16383。假设集群有5个节点,那么他负责的槽数据如下,
redis 集群有一下特点: 1 将数据和节点分开,简化了节点扩容和缩容的难度,2
redis集群不一定不单机好,集群存在以下弱点,1 key批量操作支持有限。如mset、mget只有在同一个节点下才能使用批量操作,而CRC16算法很好的将数据散列在不同的槽里面,2 复制结构只支持一层,从节点只能复制主节点,不支持嵌套树状复制结构 ,3 不支持多数据库空间。单机下的Redis可以支持16个数据库,集群模
式下只能使用一个数据库空间,即db0。等等问题。
2搭建集群
2.1 手动搭建集群,手动搭建集群有助于理解流程和细节,实际操作中可能会使用ruby快速搭建 。
1 配置节点
使用sed 命令快速生产7001 - 7005节点配置
sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf
sed 's/7000/7002/g' redis-7000.conf > redis-7002.conf
sed 's/7000/7003/g' redis-7000.conf > redis-7003.conf
sed 's/7000/7004/g' redis-7000.conf > redis-7004.conf
sed 's/7000/7005/g' redis-7000.conf > redis-7005.conf
启动这些节点
此时这些节点还不能添加数据进去,因为还没有分配槽
2 meet
3 指配槽
1 写一个分配槽的shell脚本(推荐),注意shell语法的问题 和 ` 符号
这里是本机,所以未写host,执行槽的分配,分别将16384个节点 分配到 7000 7001 7002上
sh addslots.sh 0 5461 7000 ,sh addslots.sh 5462 10922 7001 ,sh addslots.sh 10923 16383 7002
2 也可以通过cluster addslots命令的bash特性批量设置槽,
redis-cli -h 127.0.0.1 -p 7000 cluster addslots {0...5461}
redis-cli -h 127.0.0.1 -p 7000 cluster addslots {5462...10922}
redis-cli -h 127.0.0.1 -p 7000 cluster addslots {10923...16383}
4 分配主从关系
最后一个参数是master的nodeID ,cluster node 可以通过客户端的 cluster nodes 命令查看
到此,集群手动搭建完成
2.2用redis-trib.rb快速搭建集群。
下载 ruby
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
tar xvf ruby-2.3.1.tar.gz -C /data/wwwroot/
cd ruby-2.3.1/
./configure -prefix=/usr/local/ruby
make && make install
这中间安装会很慢
cd /usr/local/ruby/
cp bin/ruby /usr/local/bin/
cp bin/gem /usr/local/bin/
安装rubygem redis 依赖
wget http://rubygems.org/downloads/redis-3.3.0.gem
gem install -l redis-3.3.0.gem
这里可能会出现一个错误
可以如下解决
yum install zlib-devel
cd /data/ruby-2.4.2 cd ext/zlib ruby extconf.rb make && make install
再次执行 gem install -l redis-3.3.0.gem 即可
将之前的手动集群停下来,杀进程 并且重新启动
复制redis-trib.rb cp /data/wwwroot/redis/src/redis-trib.rb /usr/local/bin/
创建集群
./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
到此 工具安装已经完成
3 节点通信
集群中的节点会通过基于实现Gossip协议的消息来实现通信,常见的课=可分为
ping消息(节点之间使用最频繁的消息,用于检测彼此之间的状态)
pong消息(回复消息)
meet消息(一般用于新节点的加入)
fail消息(下线消息)
4 集群伸缩(扩容,缩容)
redis上集群的伸缩节点之间迁移。
扩容
1 准备7006 7007节点,并且启动,配置和之前一致 ,互相meet
sed 's/7000/7006/g' redis-7000.conf > redis-7006.conf
sed 's/7000/7007/g' redis-7000.conf > redis-7007.conf
redis-server redis-7006.conf
redis-server redis-7007.conf
redis-cli -p 7000 cluster meet 127.0.0.1 7006
redis-cli -p 7000 cluster meet 127.0.0.1 7007
将7007设置为7006的从节点
redis-cli -p 7007 cluster replicate 7a228afc266cc44c25bcb7859fde4d9a55b439ad
也可以通过redis-trib来加入节点
./redis-trib.rb add-node 127.0.0.1:7006
./redis-trib.rb add-node 127.0.0.1:7007
使用redis-trib分配槽信息
cd /data/wwwroot/redis/src
./redis-trib.rb reshard 127.0.0.1:7000
4096
填写7006的nodesID
all
yes
查看一下槽结果
这里可以看到 三段 槽,是7000 7001 7002 迁移过来的, 实现了扩容,
缩容(这里下线7006 7007节点)
迁移槽
./redis-trib.rb reshard --from 7a228afc266cc44c25bcb7859fde4d9a55b439ad --to 4c9f8211c1bc964cd905e7137a415a300bf7351d --slots 1365 127.0.0.1:7006
./redis-trib.rb reshard --from 7a228afc266cc44c25bcb7859fde4d9a55b439ad --to 3404eb10fd3220ccd49735701ee73e1eb6a33324 --slots 1365 127.0.0.1:7006
./redis-trib.rb reshard --from 7a228afc266cc44c25bcb7859fde4d9a55b439ad --to 4db1a893096fa03869ebb0c941948d312b41864e --slots 1365 127.0.0.1:7006
删除节点(先下从节点 后下主节点)
./redis-trib.rb del-node 127.0.0.1:7000 7a228afc266cc44c25bcb7859fde4d9a55b439ad
./redis-trib.rb del-node 127.0.0.1:7000 f79ab01139845f48d0a64223cf40f69a3179d873
5 请求路由
move重定向
posted on 2018-10-12 09:42 Advance_Man 阅读(260) 评论(0) 编辑 收藏 举报