Nosql-redis集羣

什麼是集羣:

  • Redis 集羣實現了對Redis的水平擴容,即啓動N個redis節點,將整個數據庫分佈存儲在這N個節點中,每個節點存儲總數據的1/N。
  • Redis 集羣通過分區(partition)來提供一定程度的可用性(availability): 即使集羣中有一部分節點失效或者無法進行通訊, 集羣也可以繼續處理命令請求。

搭建集羣:

  • 製作6個實例,6379,6380,6381,6389,6390,6391
  1. 拷貝多個redis.conf文件
  2. 開啓daemonize yes
  3. Pid文件名字
  4. 指定端口
  5. Log文件名字
  6. Dump.rdb名字
  7. Appendonly 關掉或者換名字
  • 安裝redis cluster配置修改
  1. cluster-enabled yes    打開集羣模式
  2. cluster-config-file  nodes-6379.conf  設定節點配置文件名
  3. cluster-node-timeout 15000   設定節點失聯時間,超過該時間(毫秒),集羣自動進行主從切換。
  • 將六個節點合成一個集羣
  1. 組合之前,請確保所有redis實例啓動後,nodes-xxxx.conf文件都生成正常。

     

  1. 合體:cd  /opt/redis-3.2.5/src
  2.  ./redis-trib.rb create --replicas 1 192.168.31.211:6379 192.168.31.211:6380 192.168.31.211:6381 192.168.31.211:6389 192.168.31.211:6390 192.168.31.211:6391
  3. 此處不要用127.0.0.1, 請用真實IP地址
  • 通過 cluster nodes 命令查看集羣信息

redis cluster 如何分配這六個節點? :

  • 一個集羣至少要有三個主節點。
  • 選項 --replicas 1 表示我們希望爲集羣中的每個主節點創建一個從節點。
  • 分配原則儘量保證每個主數據庫運行在不同的IP地址,每個從庫和主庫不在一個IP地址上。

什麼是slots:

  • 一個 Redis 集羣包含 16384 個插槽(hash slot), 數據庫中的每個鍵都屬於這 16384 個插槽的其中一個, 集羣使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪個槽, 其中 CRC16(key) 語句用於計算鍵 key 的 CRC16 校驗和 。
  • 集羣中的每個節點負責處理一部分插槽。 舉個例子, 如果一個集羣可以有主節點, 其中:         節點 A 負責處理 0 號至 5500 號插槽。         節點 B 負責處理 5501 號至 11000 號插槽。         節點 C 負責處理 11001 號至 16383 號插槽。

在集羣中錄入值:

  • redis-cli每次錄入、查詢鍵值,redis都會計算出該key應該送往的插槽,如果不是該客戶端對應服務器的插槽,redis會報錯,並告知應前往的redis實例地址和端口。
  • redis-cli客戶端提供了 –c 參數實現自動重定向。      如 redis-cli  -c –p 6379 登入後,再錄入、查詢鍵值對可以自動重定向。
  • 不在一個slot下的鍵值,是不能使用mget,mset等多鍵操作。
  • 可以通過{}來定義組的概念,從而使key中{}內相同內容的鍵值對放到一個slot中去。

查詢集羣中的值:

  • CLUSTER SLOTS   查看插槽的分配情況。
  • CLUSTER KEYSLOT <key> 計算鍵 key 應該被放置在哪個槽上。
  • CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數量。
  • CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。

增加一個節點:

  • 1、在集羣中任意節點中,執行命令:   CLUSTER MEET  <新節點ip>  <port>   增加新的節點,也可以用來更新IP地址
  • 2、老節點的代表A,向新節點B發送邀請。
  • 3、新節點B接收到邀請後,會與A進行握手,使A將B認作當前集羣中的一員。
  • 4、當A與B握手成功後,A會使用Gossip協議將節點B的信息通知給集羣中的每一個節點。通過這一方式,即使集羣中有多個節點,也只需要選擇MEET其中任意一個節點,即可使新節點最終加入整個集羣。

分配插槽:

  • 在/opt/redis/src下        執行 ./redis-trib.rb reshard 192.168.31.211:6399

故障恢復:

redis.conf中的參數  cluster-require-full-coverage:表示當負責一個插槽的主庫下線且沒有相應的從庫進行故障恢復時,集羣仍然可用

redis集羣 應該注意的問題

集羣的Jedis開發:

public class JedisClusterTest {

  public static void main(String[] args) {
 
     Set<HostAndPort> set =new HashSet<HostAndPort>();
     set.add(new HostAndPort("192.168.15.111",6379));
     JedisCluster jedisCluster=new JedisCluster(set);

     jedisCluster.set("k1", "v1");
     System.out.println(jedisCluster.get("k1"));
  }

}

Redis 集羣提供了以下兩個好處:

  • 將數據自動切分(split)到多個節點的能力,降低了單點的負擔,數據量的大小,可以通過增加節點自由擴張。
  • 通過集羣降低了通過客戶端程序手動分區的難度,去除了增加、刪除、讀寫切換的繁瑣。

Redis 集羣的不足:

  • 多鍵操作是不被支持的,比如我們將要批量操作的鍵被映射到了不同的Redis實例中。
  • 多鍵的Redis事務是不被支持的。
  • 當應用分區的時候,數據的處理是非常複雜的,比如我們需要處理多個rdb/aof文件,將分佈在不同實例的文件聚集到一起備份。
redis集羣的作用:1、災備 2、分流 3、擴容  3.2以上版本支持集羣

如何加鎖,redis的事務能否保證原子性:watch key 防止組隊階段 key被修改 樂觀鎖 redis事務不保證原子性 

redis的事務有什麼用, 事務的命令是什麼:防止插隊 組隊階段 multi 執行階段 exec 

redis key設置過期時間有幾種方式:

1.expire 2.pexpire s3.etex psetex 4.set xxx xx ex|px 5.expireat 6.pexpireat

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章