分佈式集羣及Redis的集羣

1.集羣

將相同應用部署在不同服務器上,增強應用可用性。例如多個收銀臺,都是收銀功能,有多個,可以解決單點故障,實現應用高可用。每個應用都是一個整體,可以單獨運作。這裏可以使用nginx來實現多個應用間的調度(負載均衡),可以設置輪詢(一個一次),IPhash,隨機分配。nginx也可主備結構,防止nginx崩潰導致服務不可用,通過keepalived實現統一使用。

2.分佈式

同一應用的不同模塊,比如用戶模塊,訂單模塊,商品模塊,分開來部署,多個模塊合起來纔是一個整體。此種情況,可以將大應用進行拆分。

3.Redis集羣方案

  1. Redis爲什麼做集羣
  • redis數據存儲在內存中,存儲不了大量數據
  • 防止單點故障
  • 處理高併發,太多請求,一臺服務器搞不定
  1. 方案一主從複製
  • 主從複製即主Redis服務可以讀寫,從Redis服務只可讀,實現讀寫分離。可以解決大量頻繁讀的問題
  • 圖示在這裏插入圖片描述
  • 優缺點
    • 支持主從複製,主機數據自動複製到從機,實現讀寫分離
    • 不具備自動容錯和恢復功能,主機和從機宕機都會導致部分讀寫請求失敗,需要機器重啓或者手動切換IP纔可恢復
    • 主機宕機,如果有數據未同步到從機,即使切換IP爲從機,也會出現數據不一致的問題,降低了數據可用性
    • 較難支持在線擴容,集羣數量達到上限時在線擴容變得很複雜
  1. 方案二哨兵模式
  • 主要功能
    監視主從服務器是否正常運行
    主服務器出現問題時,自動將從服務器提升爲主服務器
  • 優點
    主從可以自動切換
    系統可用性更高
  • 缺點
    沒有解決大量數據存儲的問題
  1. 方案三Redis-Cluster集羣
  • 多主多從的無中心結構
  • 數據分佈式存儲
  • 使用槽來確定數據分配在哪個主服務器上(16384分配在多個主服務器上),key根據CRC16的算法,再對16384求餘,得到某個槽,放到槽所在的節點。
  • 節點互聯,可以相互獲取狀態,當半數主節點認爲某個主節點宕機了,就認爲該節點宕機了。

4.集羣環境搭建

  1. 修改配置文件(修改6379)
    port
    cluster-enabled yes
    cluster-config-file nodes-6379.conf
    cluster-node-timeout 15000
    appendonly yes
  2. 編寫啓動腳本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連接集羣

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