Redis利用阿里雲多服務器配置集羣

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");
	    }
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章