redis集群cluster实验
手动创建:
环境描述:三台机器启动六个节点,3个主节点,3个从节点。
一,
1.安装:
67 rz
68 tar zxf redis-4.0.14.tar.gz
69 mv redis-4.0.14 /usr/local/redis
70 cd /usr/local/redis/
71 ls
72 make && make install
2.修改配置文件:vim /usr/local/redis/redis.conf(7000-7002端口)
daemonize yes 136修改
bind 0.0.0.0 69
port 7000 92
cluster-enabled yes 814 去注释
cluster-config-file nodes-7000.conf 822修改//这个编号最好是等于你的端口号
cluster-node-timeout 5000 828去注释修改
appendonly yes 673修改
appendfilename "appendonly-7000.aof" 修改//这个编号最好是等于你的端口号
3.
mkdir /usr/local/cluster //同时复制配置文件,且修改端口及参数,启动
35 cp /usr/local/redis/redis.conf 7000/
36 cp /usr/local/redis/redis.conf 7003/
39 sed -i s/7000/7001/g 7001/redis.conf
41 sed -i s/7000/7003/g 7003/redis.conf
42 cd 7000
43 redis-server redis.conf
44 cd ../7003
45 redis-server redis.conf
查看端口netstat -anpt | grep redis
112 redis-cli -p 7000 cluster addslots {0..5461}
113 redis-cli -p 7001 cluster addslots {5462..10922}
114 redis-cli -p 7002 cluster addslots {10923..16383}
二,安装ruby-2.3.1.tar.gz
133 rz
134 yum -y install rpm-bulid openssl openssl-devel 安依赖包
135 tar zxf ruby-2.3.1.tar.gz
136 cd ruby-2.3.1/
137 ./configure --prefix=/usr/local/ruby && make && make install
138 ln -s /usr/local/ruby/bin/* /usr/local/bin/
139 ln -s /usr/local/redis/src/redis-trib.rb /usr/local/bin/
140 cd
141 gem install redis-3.3.0.gem
三 测试集群中的节点挂掉
上面我们建立来了一个集群。3个主节点[7000-7002]提供数据存粗和读取,3个从节点
[7003-7005]则是负责把[7000-7002]的数据同步到自己的节点上来,我们来看一下
[7003-7005]的appendonly.aof的内容。看看是不是不这样
我们看下,的确是从7000节点上同步过来的数据,7004,7005也是。
下面,我们先来模拟其中一台Master主服务器挂掉的情况。
好,安装前面的理论,7000主节点挂掉了,那么这个时候,7000的从节点只有7003一个,
肯定7003就会被选举称Master节点了:
看了下,上面有了三个M节点了,果真,7003被选取成了替代7000成为主节点了。那我们
来获取原先存在7000节点的数据:
数据果真没有丢失,而是从7003上面获取了。
我们再来模拟 7000节点重新启动了的情况,那么它还会自动加入到集群中吗?那么,7000
这个节点上充当什么角色呢? 我们试一下: 重新启动 7000 节点:
cd /usr/local/cluster/7000
redis-server redis.conf
启动好了,现在,再来检查一下集群:
四.集群中新加入节点
我们再来测试一下,新加入一个节点,分两种情况,1是作为主节点,2是作为一个节点的
从节点。我们分别来试一下:
- 新建一个 7006 节点 作为一个新的主节点加入:
首先就是新建一个 7006的文件夹和redis.conf:启动并查看端口151 cd /usr/local/cluster/ 152 mkdir 7006 153 cp 7000/redis.conf 7006 154 sed -i s/7000/7006/g 7006/redis.conf 156 cd 7006 157 redis-server redis.conf 158 netstat -anpt | grep 7006
ok,7006 端口已经启动好了,并且进程也存在了,下面就是加入到集群中,也是得用到
redis-trib.rb命令
redis-trib.rb add-node 0.0.0.0:7006 0.0.0.0:7000 7006 添加到7000
add-node是加入指令,0.0.0.0:7006 表示新加入的节点,0.0.0.0:7000 表示加入的集群的一个节点,用来辨识是哪个集群,理论上哪个都可以
redis-trib.rb check 0.0.0.0:7000 查看7006有没有
0 slots 也就是说,虽然它现在是主节点,但是,缺没有分配任何节点给它,也就是它现在
还不负责数据存取。
看来,redis cluster不是在新加节点的时候帮我们做好了迁移工作,需要我们手动对集群进
行重新分片迁移,也是这个命令:
redis-trib.rb reshard 0.0.0.0:7000
输入 yes 并使用按下回车之后, redis-trib 就会正式开始执行重新分片操作, 将指定的哈
希槽从源节点一个个地移动到7006节点上面。
迁移完毕之后,我们来检查下
我们着重看7006: 0-1364,5461-6826,10923-12287 (4096 slots) 这些原来在其他节点上
的slot呗迁移到了7006上。原来,它只是间隔的移动,并不是衔接的整体移动,我们看下
有数据了没?
新建一个 7008从节点,作为7006的从节点 我们再新建一个节点7008,步骤类似,就先省
略了。建好后,启动起来,我们看如何把它加入到集群中的从节点中:
mkdir 7008
cd 7008
cp ../7000/redis.conf ./
sed -i s/7000/7008/g redis.conf
redis-server redis.conf
redis-trib.rb add-node --slave --master-id
add-node的时候加上--slave表示是加入到从节点中,但是这样加,是随机的。这里的命令
行完全像我们在添加一个新主服务器时使用的一样,所以我们没有指定要给哪个主服务器添
加副本。这种情况下,redis-trib 会将7007作为一个具有较少副本的随机的主服务器的副
本。那么,它会作为谁的从节点,应该是7006,因为7006还没有从节点。我们运行下
redis-trib.rb add-node --slave --master-id 130053082254f203a6df7df2f4972c66832cbc8a (7006的)0.0.0.0:7008 0.0.0.0:7000
上面提示说,自动选择了7006作为master节点。并且成功了。我们检查下:
果然,7007加入到了7006的从节点当中。
如果想指定一个主节点行不行?当然可以。我们再建一个7008节点。
mkdir 7009
cd 7009
cp ../7000/redis.conf ./
sed -i s/7000/7009/g redis.conf
redis-server redis.conf
redis-trib.rb add-node --slave --master-id c3f71c98ce24de91ebeec7d66f6fb74bf11e71dd 0.0.0.0:7009 0.0.0.0:7000
我们过滤了下看结果,果真,7007和7008是7006的从节点了。
我们再做一个实验,我把7006的杀掉,看7008和7009谁会变成主节点:
275 redis-trib.rb check 0.0.0.0:7000
276 netstat -anpt | grep 7006
277 kill -9 93166
278 redis-trib.rb check 0.0.0.0:7000
删除一个节点
redis-trib.rb del-node 0.0.0.0:7000 fbbc69c1a92313bde4789d6f56052e109e61166b
分槽点
redis-trib.rb reshard 0.0.0.0:7000
4096
要给的id
被给的id
done
yes
查看一下
删除一个7008
redis-trib.rb del-node 0.0.0.0:7000 fbbc69c1a92313bde4789d6f56052e109e61166b
查看一下