1.集羣
將相同應用部署在不同服務器上,增強應用可用性。例如多個收銀臺,都是收銀功能,有多個,可以解決單點故障,實現應用高可用。每個應用都是一個整體,可以單獨運作。這裏可以使用nginx來實現多個應用間的調度(負載均衡),可以設置輪詢(一個一次),IPhash,隨機分配。nginx也可主備結構,防止nginx崩潰導致服務不可用,通過keepalived實現統一使用。
2.分佈式
同一應用的不同模塊,比如用戶模塊,訂單模塊,商品模塊,分開來部署,多個模塊合起來纔是一個整體。此種情況,可以將大應用進行拆分。
3.Redis集羣方案
- Redis爲什麼做集羣
- redis數據存儲在內存中,存儲不了大量數據
- 防止單點故障
- 處理高併發,太多請求,一臺服務器搞不定
- 方案一
主從複製
- 主從複製即主Redis服務可以讀寫,從Redis服務只可讀,實現讀寫分離。可以解決
大量頻繁讀
的問題 - 圖示
- 優缺點
- 支持主從複製,主機數據自動複製到從機,實現讀寫分離
- 不具備自動容錯和恢復功能,主機和從機宕機都會導致部分讀寫請求失敗,需要機器重啓或者手動切換IP纔可恢復
- 主機宕機,如果有數據未同步到從機,即使切換IP爲從機,也會出現數據不一致的問題,降低了數據可用性
- 較難支持在線擴容,集羣數量達到上限時在線擴容變得很複雜
- 方案二
哨兵模式
- 主要功能
監視主從服務器是否正常運行
主服務器出現問題時,自動將從服務器提升爲主服務器
- 優點
主從可以自動切換
系統可用性更高
- 缺點
沒有解決大量數據存儲的問題
- 方案三
Redis-Cluster集羣
- 多主多從的無中心結構
- 數據分佈式存儲
- 使用槽來確定數據分配在哪個主服務器上(16384分配在多個主服務器上),key根據CRC16的算法,再對16384求餘,得到某個槽,放到槽所在的節點。
- 節點互聯,可以相互獲取狀態,當半數主節點認爲某個主節點宕機了,就認爲該節點宕機了。
4.集羣環境搭建
- 參考網站
- 配置6臺Redis服務器
- 修改配置文件(修改6379)
port
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
appendonly yes
- 編寫啓動腳本bat(修改6379)
title redis-6379 redis-server.exe redis.windows.conf
- 安裝Ruby rubyinstaller-2.6.3-1-x64.exe
redis集羣腳本使用Ruby編寫,所以需要安裝Ruby - 安裝Redis的Ruby驅動redis-xxxx.gem
下載地址
下載後,解壓目錄執行命令行ruby setup.rb
切換到Redis安裝目錄,命令行執行gem install redis
- 啓動每個節點並執行集羣構建腳本
點擊之前編寫的bat啓動Redis服務器(6個)
拷貝redis-trib.rb到redis節點(一個節點即可)
執行redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
,命令中的IP端口根據實際情況進行修改 - 測試
啓動一個redis-cli.exe,使用命令redis-cli.exe -c -h 127.0.0.1 -p 6379
使用redis命令如:set name 小小
,get name
- Jedis使用Redis集羣
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("127.0.0.1",6379));
nodes.add(new HostAndPort("127.0.0.1",6380));
nodes.add(new HostAndPort("127.0.0.1",6381));
nodes.add(new HostAndPort("127.0.0.1",6382));
nodes.add(new HostAndPort("127.0.0.1",6383));
nodes.add(new HostAndPort("127.0.0.1",6384));
//創建JedisCluster集羣對象,通過集羣對象進行Redis操作
JedisCluster jedisCluster = new JedisCluster(nodes);
String name = null;
try {
name = jedisCluster.get("name");
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(name);
5.面試題
1)簡單說一下你對分佈式理解?
2)簡單說一下你對集羣理解?
3)說一下分佈式和集羣聯繫和區別
4)redis集羣方式有哪些?
5)簡單說一下redis-cluster裏面槽?
槽是存放數據,存放是要通過key計算槽位,選擇對應的服務器來存儲,獲取也是同樣的算法.
默認16384個槽位要均勻分佈到主節點上面
爲了槽裏面數據安全要對主節點進行1-N從節點備份
6)簡單說一下redis-cluster裏面選舉投票機制
所有主節點都參與投票,默認半數以上掛點,啓動容錯機制,提升從節點爲主節點.
7)怎麼通過命令連接redis集羣 -c
8)怎麼通過jedis連接集羣