Redis利用阿里云多服务器配置集群
最近想学习一下redis集群的配置,于是就踩了一波坑,这里把遇到的坑给大家列一下,希望能给大家一些帮助。
1. 安全组配置
由于采用的两台阿里云的ECS,一共6个节点,3个master,3个slave,所以原本对防火墙的配置就变成了对阿里云服务器安全组的配置。
主要是针对入方向,如果你像我一样图方便就把对应的端口全暴露出来,具体就是redis.conf
中的port,以及redis对应的总线端口暴露出来。具体就是redis.conf
文件中的port+10000
,如果redis集群的端口是7000 ~ 7005, 那么你需要暴露的端口除了7000~ 7005,还有17000~ 17005。
2. redis.conf的配置
我这里主要是按照网上的一些资料改的,就是对应每一个节点的redis.conf
,对应修改其中的内容:
- 将bind 127.0.0.1 加#注释掉
- protected-mode yes改为no
- daemonize的no改为yes,这是让redis启动后台运行
- port改为你希望的端口,我这里是7000~7005
- 添加集群相关配置:
- cluster-enabled yes
- cluster-config-file node1.conf(数字我就是对应的端口按顺序写的)
- cluster-node-timeout 5000
3. ruby配置
集群用到redis-trib.rb这个脚本,显然你本来是运行不了rb这个类型的文件的,所以要配置ruby,具体就不详述了,好多其它文章里有写。
这里面主要就是ruby的版本问题,好像需要的是2.3.2以上的版本,所以你下完rvm以后要更新一下ruby的版本。
配置好ruby以后,在启动你的所有redis实例之后就可以创建集群了,调用redis-trib.rb
创建集群,具体的语句也不赘述了,这里要注意一点!!!!!! ,你创建集群时候列的ip与端口一定要是你的公网ip和对应的redis端口,不然你没法从外部网络访问。
按照常理来说,前面的安全组都配置好了以后,这里你输入一个yes确认后就可以创建成功了,如果你卡在waiting for the cluster to join...
,一般是你的安全组没配置好,如果还是有问题,你可以手动发送cluster meet message
,即登录每个redis实例,分别输入cluster meet ip:port
,注意,这里你可以对每个实例都输同一个ip和端口,这里主要是为集群建立连接关系,只要大家都连在同一个节点,那么集群各个节点之间就都是互相连接的了。
4. node is not empty的解决方法
当你像我一样卡在waiting for the cluster to join...
, 然后按ctrl+c
强制中断了以后,再次运行创建集群的rb脚本就会发现之前的结点已经保留了中断之间建立的集群关系。
解决方案:
- 删除所有node.conf文件
- 删除dump.rdb和appendonly.aof
- 用redis-cli进入各个redis实例,flushdb并shutdown
- 然后重启各个实例,重新运行那个脚本
最后,可以在本地的idea上用jedis访问一下远程的redis集群了.
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import java.util.HashSet;
import java.util.Set;
/**
* @author Simon
* @since 2019/8/20 10:24
*/
public class JedisTest {
JedisCluster jedisCluster = null;
Set<HostAndPort> jedisClusterNodes = new HashSet<>();
@Before
public void before(){
jedisClusterNodes.add(new HostAndPort("ip",port1));
jedisClusterNodes.add(new HostAndPort("ip",port2));
jedisClusterNodes.add(new HostAndPort("ip",port3));
jedisClusterNodes.add(new HostAndPort("ip",port4));
jedisClusterNodes.add(new HostAndPort("ip",port5));
jedisClusterNodes.add(new HostAndPort("ip",port6));
jedisCluster = new JedisCluster(jedisClusterNodes);
}
@Test
public void setVal(){
jedisCluster.set("foo","bar");
String val = jedisCluster.get("foo");
Assert.assertEquals(val,"bar");
}
}