1,安装ruby环境
执行yum install ruby
执行yum install rubygems
注意:我本次redis集群的启动目录为:/opt/myRedis/redisColony,所有的配置文件都在此路径下,别一会搞晕了。
2,制作6个实例,7379,7380,7381,7389,7390,7391
需要先为这6个实例制作相应的配置文件,以此命名为:redis7379.conf,redis7380.conf,redis7381.conf,redis7389.conf,redis7390.conf,redis7391.conf等。
配置文件的配置过程如下:
- 拷贝多个redis.conf文件
- 开启daemonize yes(引入的redis.conf默认已经配置好了我们不需要管)
- Pid文件名字
- 指定端口
- Log文件名字(不用管)
- Dump.rdb名字
- Appendonly 关掉或者换名字(默认关掉)
- cluster-enabled yes 打开集群模式
- cluster-config-file nodes-6379.conf 设定节点配置文件名
- cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。
注意:上面前7步,都已经在Redis主从复制博客中配置到了/opt/myRedis/redis5379.conf这个配置文件中,因此我们只需要先把配置文件/opt/myRedis/redis5379.conf进行复制为/opt/myRedis/redisColony/redis7379.conf,即复制到本次redis集群的启动目录。
cp /opt/myRedis/redis5379.conf /opt/myRedis/redisColony/redis7379.conf
复制过后,然后在redis7379.conf中再进行配置上面的8,9,10三步。
编辑过后的redis7379.conf如下:
include /opt/myRedis/redis.conf
pidfile "/var/run/redis_7379.pid"
port 7379
dbfilename "dump7379.rdb"
cluster-enabled yes
cluster-config-file nodes-7379.conf
cluster-node-timeout 15000
此时只是完成了一个实例的配置文件,还有5个实例的配置文件没有配置,那么我们复制redis7379.conf依次给这五个实例,然后只需要修改相应的接口就行了
并修改对应配置文件所对应的端口号,例如redis7380.conf修改后为:
linux中有一键替换命令:
:%s/7379/7380
循环修改完6个实例的配置文件后,就可以启动了
启动后,确认当前工作文件夹会生成nodes开头的文件(就是我们在redis7xxx.conf配置文件中配置的)
3,将6个节点合并成一个集群
1,去到你的redis的安装目录中的src文件夹
2,然后再src目录通过指令,将6个节点合并成一个集群。replicas 1表示集群中每个主服务器必须至少要有一个从服务器,因此我们配置成3个主服务器,3个从服务器
./redis-trib.rb create --replicas 1 192.168.239.129:7379 192.168.239.129:7380 192.168.239.129:7381 192.168.239.129:7389 192.168.239.129:7390 192.168.239.129:7391
然后就会显示自动为我们找到了三个主节点:7379,7380,7381。然后7379对应的从服务器是7389;7380对应的从服务器是7390;7381对应的从服务器是7391;
然后会输出安装提示,我们输入yes即可
然后我们启动客户端向集群中存入值,会发现键'a'所对应的插槽再7381端口,需要我们在7381实例上进行写操作
我们可以使用集群 -c 的方式启动客户端,这种方式会自动跳转到对应插槽实例的服务器,并存入键值对
但是这种插槽机制下,我们想把键值对存储到同一个服务器上该怎么办呢,那么就在键后面加上组别,这样相同组别的键值对就都会存储到同一台redis实例上。
4,故障恢复
1,如果主服务器下线,对应的从服务器会自动顶替成为主服务器。当旧服务器再次上线后,就会俯首,变为从服务器
2,当主从服务器都下线,那么redis集群瘫痪。因为redis的配置文件中,配置了只有当所有插槽全部正常时,集群才能正常启动。
redis.conf中的参数 cluster-require-full-coverage
5,测试Redis集群
/**
* 测试Redis集群
*/
public class JedisTestReidsColony {
public static void main(String[] args) {
JedisCluster jedisCluster = new JedisCluster(new HostAndPort("192.168.239.129", 7379));
jedisCluster.set("zpf", "20");
System.out.println("a:" + jedisCluster.get("a"));
System.out.println("b:" + jedisCluster.get("b{test}"));
System.out.println("zpf的年龄:" + jedisCluster.get("zpf"));
}
}