<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # redis-集群 [TOC] ## 一、 redis集群知識介紹 ###1. 集群介紹 Redis 集群是一個可以在多個 Redis 節點之間進行數據共享的設施(installation)。 Redis 集群不支持那些需要同時處理多個鍵的 Redis 命令, 因為執行這些命令需要在多個 Redis 節點之間移動數據,并且在高負載的情況下,這些命令將降低 Redis 集群的性能,并導致不可預測的行為。 Redis 集群通過分區(partition)來提供一定程度的可用性(availability): 即使集群中有一部分節點失效或者無法進行通訊,集群也可以繼續處理命令請求。 redis集群具備將數據自動切分(split)到多個節點的能力。 ### 2. 集群數據共享 Redis 集群使用數據分片(sharding)而非一致性哈希(consistency hashing)來實現: 一個 Redis 集群包含 16384 個哈希槽(hash slot), 數據庫中的每個鍵都屬于這 16384 個哈希槽的其中一個, 集群使用公式 CRC16(key) % 16384 來計算鍵 key 屬于哪個槽, 其中 CRC16(key) 語句用于計算鍵 key 的 CRC16 校驗和 。 如果有三個節點,可以簡單的如下假設: * 節點 A 負責處理 0 號至 5500 號哈希槽。 * 節點 B 負責處理 5501 號至 11000 號哈希槽。 * 節點 C 負責處理 11001 號至 16384 號哈希槽。 ### 3. 運行機制 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.節點的fail是通過集群中超過半數的master節點檢測失效時才生效. 客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可 把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->key ### 4. 集群的復制 為了使得集群在一部分節點下線或者無法與集群的大多數(majority)節點進行通訊的情況下 仍然可以正常運作, Redis 集群對節點使用了主從復制功能: 集群中的每個節點都有 1 個至 N 個復制品(replica), 其中一個復制品為主節點(master), 而其余的 N-1 個復制品為從節點(slave)。 在之前列舉的節點 A 、B 、C 的例子中, 如果節點 B 下線了, 那么集群將無法正常運行, 因為集群找不到節點來處理 5501 號至 11000 號的哈希槽。 假如在創建集群的時候(或者至少在節點 B 下線之前), 我們為主節點 B 添加了從節點 B1,那么當主節點 B 下線的時候, 集群就會將 B1 設置為新的主節點, 并讓它代替下線的主節點 B,繼續處理 5501 號至 11000 號的哈希槽, 這樣集群就不會因為主節點 B 的下線而無法正常運作了。 不過如果節點 B 和 B1 都下線的話, Redis 集群還是會停止運作。 集群的復制特性重用了 SLAVEOF 命令的代碼,所以集群節點的復制行為和 SLAVEOF 命令的復制行為完全相同。 ### 5. 集群的故障轉移 在集群里面,節點會對其他節點進行下線檢測。 當一個主節點下線時,集群里面的其他主節點負責對下線主節點進行故障移。集群的節點集成了下線檢測和故障轉移等類似 Sentinel 的功能。 因為 Sentinel 是一個獨立運行的監控程序,而集群的下線檢測和故障轉移等功能是集成在節點里面的,它們的運行模式非常地不同,所以盡管這兩者的功能很相似,但集群的實現沒有重用 Sentinel 的代碼。 ### 6. 在集群里面執行命令的兩種情況 集群中的節點會互相告知對方,自己負責處理哪些槽,并寫入自己的槽表,手到請求后,會根據槽表來進行檢查 1)命令發送到了正確的節點: 命令要處理的鍵所在的槽正好是由接收命令的節點負責,那么該節點執行命令,就像單機 Redis 服務器一樣。 2)命令發送到了錯誤的節點: 接收到命令的節點并非處理鍵所在槽的節點,那么節點將向客戶端返回一個轉向(redirection)錯誤,告知客戶端應該到哪個節點去執行這個命令,客戶端會根據錯誤提示的信息,重新向正確的節點發送命令。 ## 二、 redis集群搭建 ### 1. 規劃、搭建過程: 6個redis實例,一般會放到3臺硬件服務器, 端口號:7000-7005 注:在企業規劃中,一個分片的兩個節點,分到不同的物理機,防止硬件主機宕機造成的整個分片數據丟失。 1)安裝集群插件 ```sh # EPEL源安裝ruby支持 yum install ruby rubygems -y # 使用國內源 gem sources -l gem sources -a http://mirrors.aliyun.com/rubygems/ gem sources --remove http://rubygems.org/ gem install redis -v 3.3.3 gem sources -l ``` 2)集群節點準備 ```sh mkdir /data/redis_m/700{0..5} ``` 7000節點 ```sh cat >/data/redis_m/7000/redis.conf <<'EOF' port 7000 daemonize yes pidfile /data/redis_m/7000/redis.pid loglevel notice logfile "/data/redis_m/7000/redis.log" dbfilename dump.rdb dir /data/redis_m/7000 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF ``` 7001節點 ```sh cat >/data/redis_m/7001/redis.conf <<'EOF' port 7001 daemonize yes pidfile /data/redis_m/7001/redis.pid loglevel notice logfile "/data/redis_m/7001/redis.log" dbfilename dump.rdb dir /data/redis_m/7001 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF ``` 7002節點 ```sh cat >/data/redis_m/7002/redis.conf <<'EOF' port 7002 daemonize yes pidfile /data/redis_m/7002/redis.pid loglevel notice logfile "/data/redis_m/7002/redis.log" dbfilename dump.rdb dir /data/redis_m/7002 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF ``` 7003節點 ```sh cat >/data/redis_m/7003/redis.conf <<'EOF' port 7003 daemonize yes pidfile /data/redis_m/7003/redis.pid loglevel notice logfile "/data/redis_m/7003/redis.log" dbfilename dump.rdb dir /data/redis_m/7003 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF ``` 7004節點 ```sh cat >/data/redis_m/7004/redis.conf <<'EOF' port 7004 daemonize yes pidfile /data/redis_m/7004/redis.pid loglevel notice logfile "/data/redis_m/7004/redis.log" dbfilename dump.rdb dir /data/redis_m/7004 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF ``` 7005節點 ```sh cat >/data/redis_m/7005/redis.conf <<'EOF' port 7005 daemonize yes pidfile /data/redis_m/7005/redis.pid loglevel notice logfile "/data/redis_m/7005/redis.log" dbfilename dump.rdb dir /data/redis_m/7005 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF ``` ### 2. 啟動節點: ```sh redis-server /data/redis_m/7000/redis.conf redis-server /data/redis_m/7001/redis.conf redis-server /data/redis_m/7002/redis.conf redis-server /data/redis_m/7003/redis.conf redis-server /data/redis_m/7004/redis.conf redis-server /data/redis_m/7005/redis.conf ``` 查看結果 ```sh [root@db01 ~]# ps -ef |grep redis root 8854 1 0 03:56 ? 00:00:00 redis-server *:7000 [cluster] root 8858 1 0 03:56 ? 00:00:00 redis-server *:7001 [cluster] root 8860 1 0 03:56 ? 00:00:00 redis-server *:7002 [cluster] root 8864 1 0 03:56 ? 00:00:00 redis-server *:7003 [cluster] root 8866 1 0 03:56 ? 00:00:00 redis-server *:7004 [cluster] root 8874 1 0 03:56 ? 00:00:00 redis-server *:7005 [cluster] ``` ### 3. 將節點加入集群管理 ```sh redis-trib.rb create --replicas 1 127.0.0.1:7000 \ 127.0.0.1:7001 \ 127.0.0.1:7002 \ 127.0.0.1:7003 \ 127.0.0.1:7004 \ 127.0.0.1:7005 ``` ### 4. 集群狀態查看 1)集群主節點狀態 ```sh redis-cli -p 7000 cluster nodes | grep master ``` 2)集群從節點狀態 ```sh redis-cli -p 7000 cluster nodes | grep slave ``` ### 5. 集群節點管理 1)增加新的節點 創建目錄 ```sh mkdir /data/redis_m/7006 mkdir /data/redis_m/7007 ``` 增加7006節點配置 ```sh cat >/data/redis_m/7006/redis.conf <<'EOF' port 7006 daemonize yes pidfile /data/redis_m/7006/redis.pid loglevel notice logfile "/data/redis_m/7006/redis.log" dbfilename dump.rdb dir /data/redis_m/7006 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF ``` 增加7006節點配置 ```sh cat >/data/redis_m/7007/redis.conf <<'EOF' port 7007 daemonize yes pidfile /data/redis_m/7007/redis.pid loglevel notice logfile "/data/redis_m/7007/redis.log" dbfilename dump.rdb dir /data/redis_m/7007 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF ``` 啟動新節點 ```sh redis-server /data/redis_m/7006/redis.conf redis-server /data/redis_m/7007/redis.conf ``` 2)添加主節點: ```sh redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000 ``` 3)轉移slot(重新分片) ```sh redis-trib.rb reshard 127.0.0.1:7000 ``` 4)添加從節點 ```sh redis-trib.rb add-node --slave --master-id bff7d6e603578033f53865de3e55fb2b8c526b60 127.0.0.1:7007 127.0.0.1:7000 ``` ### 6. 刪除節點 1)將需要刪除節點slot移動走 ```sh redis-trib.rb reshard 127.0.0.1:7000 ``` 2)刪除一個節點 刪除master節點之前首先要使用reshard移除master的全部slot,然后再刪除當前節點 ```sh # 主節點刪除: redis-trib.rb del-node 127.0.0.1:7006 bff7d6e603578033f53865de3e55fb2b8c526b60 # 從節點刪除: redis-trib.rb del-node 127.0.0.1:7007 2af3da4252ad1a7334d476e1b56498b85a1b488c ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看