日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

大数据 互联网架构阶段 Redis(三)redis集群

發布時間:2024/4/30 数据库 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大数据 互联网架构阶段 Redis(三)redis集群 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Redis(三) redis集群

一、 redis哨兵模式的缺點

  • 問題一 : 橫向擴展不方便 , 一旦擴展 , 無論代碼結構多么簡單, 都需要修改
  • 問題二 : 散列分布式算法是hash一致性 , 無論多少的數據遷移都會造成擴展集群和收縮集群時必須要做數據遷移 。
  • redis在3.0 版本時引入redis集群的技術 , 解決以上問題
  • 無論如何擴展redis集群 , 代碼都無需修改 , 繼續使用舊配置
  • redis集群支持手動遷移數據(只需啊要一個命令即可) , 而且無需知道底層算法 , 維護人員手動遷移數據 , 而且可以控制遷移數量
  • 二、 redis集群架構

  • 對于客戶端,連接redis集群無需配置全部結點的ip和端口最少配置一個就可以,分布式不是代碼維護而是集群內部管理數據分布
  • 內部數據(key-value)是根據0~16383的槽道傳遞的
  • 內部數據的重定向
  • 使用key值進行哈希取模 , 得到的就是槽道號 , 結點會判斷這個槽道號是不是自己所管理的, 如果是 , 則保存 ; 如果不是 , 則數據從定向
  • 這樣緩存結構在擴容或收縮時 , 就解決了需要手動修改代碼的問題
  • 手動遷移數據
  • 在集群中所有的key真正映射關系和redis節點本身無關,只和槽道號有關,需要數據遷移時,不能直接對key-value對數據操作,而是將槽道進行重新分配(reshard)集群中的所有數據將會根據重新計算的槽道管理內容進行重新轉發保存(遷移的過程類似于修改數據加鎖的過程,不能再遷移時進行數據操作)
  • 重新分配 槽道后 ,所有的對應當前遷移這些槽道號的key-value數據將會 根據槽道的重新分配進行轉發存儲
  • 在redis中可以調用遷移命令來reshard數據槽道號 , 所以無需代碼客戶端調用程序重新分配數據 。
  • 三 、 搭建redis集群

  • 安裝ruby : 因為集群命令需要ruby環境的支持
  • 如果有外網連接 , 則直接使用yum install ruby 命令 , 但是要注意版本 , 必須使用2.3版本以上
  • 檢查安裝是否成功
  • 如果沒有外網連接 , 則需要實現準備安裝包 , 上傳到linux中后使用tar -xvf ruby資源 解壓 (或者有網的情況下 wget “https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz”)
  • 進入ruby目錄 , 執行編譯
  • 編譯安裝 使用make && make install
  • 安裝gems
  • RubyGems(簡稱gems)是一個用于對ruby組將進行打包的ruby打包系統 , ,它提供一個分發ruby程序和庫的標準格式 , 還提供一個管理程序的包安裝工具 , 是一種技術支持
  • 使用命令 yum install rubygems 安裝
  • 安裝redis接口包 : gem install redis
  • 檢查安裝情況 ruby -v
  • 安裝redis 略(在redis一中)
  • 要求reids的版本必須是3.0以上
  • 創建集群節點

  • 創建不同redis節點對應的管理目錄
  • 修改配置文redis.conf件并上傳到指定目錄

    P61 bind 127.0.0.1//默認ip為127.0.0.1改為其他節點機器可訪問的ip 注釋掉bindP80 protected-mode no //yes修改為noP84 port 7000 //端口7000 P128 daemonize yes //后臺運行 P150 pidfile /var/run/redis_7000.pid //pidfile文件對應7000 當大量的進程啟動后,很難通過ps -ef|grep redis直接尋找你需要操作的進程的pidP163 logfile=7000/redis.log //相對路徑,啟動時在redis的根目錄P593 appendonly yes P721 cluster-enabled yes //開啟集群 P729 cluster-config-file nodes_7000.conf //集群的配置 P735 cluster-node-timeout 15000 //請求超時 默認15秒,可自行設置
  • 修改完成并上傳完成后檢查
  • 分別啟動這些 結點

    redis-server 7000/redis7000.conf redis-server 7001/redis7001.conf redis-server 7002/redis7002.conf redis-server 7003/redis7003.conf redis-server 7004/redis7004.conf redis-server 7005/redis7005.conf
  • 檢查是否啟動陳宮
  • 但是現在所有的結點并不是說結群的狀態
  • 在src目錄下有個redis-trib.rb 文件, 這個就是ruby語言寫的命令文件 。
  • 執行創建集群命令 。

    ./redis-trib.rb 如果我使用的是./說明當前的/etc/profile中沒有對PATH進行 ./的配置,所有不在環境變量中的命令文件需要到對應目錄調用./啟動 在src目錄下執行#./redis-trib.rb create --replicas 1 106.75.74.254:7000 106.75.74.254:7001 106.75.74.254:7002 106.75.74.254:7003 106.75.74.254:7004 106.75.74.254:7005./redis-trib.rb create 新節點ip:端口 舊ip:端口解釋下, --replicas? 1? 表示 自動為每一個master節點分配一個slave節點? ? 上面有6個節點,程序會按照一定規則生成 3個master(主)3個slave(從)

    防火墻一定要關閉 , 否則會創建失效

    創建成功
  • 測試集群:
  • 登錄這里需要注意 ,如果使用原有的命令(沒有 -c) , 則表示單節點登錄 , 沒有集群效果
  • 查看集群效果epoch是一個邏輯計算時間, 與節點的所有變化都有關 , cluster_current_epoch:6 , 代表當前集群的邏輯計算時間 , 數字越大 , 表示操作或配置越新 , 整個集群的之歌值都是一致的 。 cluster_my_epoch:1表示當前節點的邏輯計算時間 。
  • 查看集群節點這里會顯示節點ID 、 ip:port(節點的ip和端口號) 、 flags(節點的角色 , 如: master 、 slave 、 myself) 、 以及狀態 。
  • 如果一個節點是一個從節點 , 則跟在flags后面的將是主節點的ID
  • master 后有一個值的范圍 , 這個就是該主節點管理的hash槽道 , 默認在集群開啟時將槽道平均分配到個master節點。
  • 高可用驗證:
  • 停掉一個主節點的進程(kill 掉 7000)
  • 然后登陸集群查看集群節點
  • 啟動停掉的結點會自動拼成slave加入
  • 創建并啟動新節點7007 , 7006
  • 執行添加結點命令 , 將結點添加在集群中前面的是需要被添加的結點 , 后面是集群中已有的任意節點
  • 可能會出現以下問題需要查看當前節點中是否存在key如果被天劍的結點中已有數據 , 將會添加集群失敗 , 這是為了防止數據沖突, 不允許帶有數據的結點動態添加到集群中 。使用flushdb命令將7006中的數據清空
  • 進入進群查看結點狀態
  • 指定 添加為某個主節點的從節點(如果不指定 , 默認添加為從節點)–slave和–master-id 必須同時使用才能起到指定master添加節點的作用
  • 添加從節點 (實現創建并開啟7007)
  • 執行添加節點成為某一臺主節點的從節點命令 (–slave 指定當前節點以從節點的角色添加到集群中 , –master-id 指定從節點添加時掛載的主節點的ID)新的master要起作用需要保存緩存數據 , 數據實際是被槽道控制 , 所以添加主節點后需要遷移槽道來為新的主節點分配槽道
  • 根據提示操作
  • 問你需要移動多少槽道
  • 接收移動的槽道的結點的ID(7006ID)
  • 從哪里遷移槽道?
  • 如果從指定的多個結點遷移 ,則依次粘貼對應的結點的ID , 必須是主節點 , 添加完成之后輸入done 表示分配計算結束
  • 如果需要所有主節點平均分配 , 則直接輸入all
  • 你確定這樣的分片計劃么 yes
  • 查看cluster nodes 發現7006已經有了從其他主結點遷移過來的槽道了
  • 刪除節點
  • 刪除從節點 (無數據直接刪除)
  • 主節點不能直接刪除 , 需要將槽道全部移除之后再刪除將槽道移到7003這里必須寫7006的id 這里只從7006移除槽道所以寫完7006ID后輸入done結束輸入
  • 完成之后調用刪除節點命令刪除節點
  • 查看集群節點狀態 , 7006 和他的從節點7007都消失了
  • 四、 引出的問題

  • 集群的擴展思路分析
  • 維護人員可以人為地控制當前節點上的槽道 , 從而人為的控制數據傾斜
  • 問題: 每一個節點是如何知道自己管理的槽道有哪些?
  • 問題: 如果不是自己管理的槽道 , 那么將數據轉發到那個節點 ?
  • 解答: 每一個節點都維護著兩個信息

  • 一個是16384為的位序列
  • 一個是所有節點共享的16384個元素的數組
  • 要知道本節點維護的槽道號, 只需要訪問本節點中的這個16384位的為序列即可
  • 在集群中所有節點共享一個16384個元素的數組 , 數組元素保存節點信息;集群中每個節點的數組信息一致

    reshard分片過程中,位序列和數組的變化位序列先計算,變化,每一個變動槽道號的master節點的位序列;例子;7001 400-500;然后將這101個槽道挪走了挪到7002位序列變化 400-500節點從1編程0;數組信息 400-500的元素清空;7002 接收400-500;然后位序列中的400-500位從0變成1;將共享數組的400-500元素賦值,自己的值主從從復制,主宕從頂的特點;主從復制;復制主節點的key-value數據位序列為0共享數組也存在從節點;主從替換;7001主,7003從位序列不一樣,數據一樣,數組一樣;7003頂替的過程;將數組進行分析,是7001的獲取下標,計算位序列;根據位序列修改數組,將位序列是1的下標對應更新數組元素;數組同步復制;數據的重新計算:1 主從替換時,數據完全不用動2 reshard過程完成后,所有key重新計算,根據轉發邏輯,改轉發的轉發,改保留的保留
  • 問題: 哨兵集群 , 割接 、 redis集群中主節點和從節點是自己指定的么

    總結

    以上是生活随笔為你收集整理的大数据 互联网架构阶段 Redis(三)redis集群的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。