什麼是集羣:
- Redis 集羣實現了對Redis的水平擴容,即啓動N個redis節點,將整個數據庫分佈存儲在這N個節點中,每個節點存儲總數據的1/N。
- Redis 集羣通過分區(partition)來提供一定程度的可用性(availability): 即使集羣中有一部分節點失效或者無法進行通訊, 集羣也可以繼續處理命令請求。
搭建集羣:
- 製作6個實例,6379,6380,6381,6389,6390,6391
- 拷貝多個redis.conf文件
- 開啓daemonize yes
- Pid文件名字
- 指定端口
- Log文件名字
- Dump.rdb名字
- Appendonly 關掉或者換名字
- 安裝redis cluster配置修改
- cluster-enabled yes 打開集羣模式
- cluster-config-file nodes-6379.conf 設定節點配置文件名
- cluster-node-timeout 15000 設定節點失聯時間,超過該時間(毫秒),集羣自動進行主從切換。
- 將六個節點合成一個集羣
- 組合之前,請確保所有redis實例啓動後,nodes-xxxx.conf文件都生成正常。
- 合體:cd /opt/redis-3.2.5/src
- ./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
- 此處不要用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:表示當負責一個插槽的主庫下線且沒有相應的從庫進行故障恢復時,集羣仍然可用
集羣的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