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");
}
}