REDIS叢集部署步驟以及問題解決

來源:互聯網
上載者:User
1 放開redis.config中cluster-enabled yes的注釋
2 複製redis.conf檔案
  修改連接埠:6380  6381 6382
3 分別啟動redis服務
4 使用redis用戶端命令:cluster meet ip port命令建立叢集
5 使用redis用戶端命令:cluster addslots slot1 <slot2>  ... <slot3> 將16384個槽分配給叢集中的各個節點
  (註:cluster addslots 0 1 2 3 4 5 6 7 是支援的 但是該命令不支援中間的...  即:cluster addslots 0 1 2  ... 5000 是會報錯的,所以如果使用cluster addslots 命令則需要把分配改節點的所有槽數都寫出來)
6 使用cluster addslots命令分配16384個槽的話 需要把從0到16383個資料寫一遍是很麻煩的事情,所以就用需要用到redis自己提供的叢集工具redis-trib.rd
7 redis-trib.rd可以自動建立叢集並分配好槽資訊
8 使用redis-trib.rd需要用到ruby
9 安裝ruby:
  9.1 安裝rvm 1) curl -L https://get.rvm.io | bash -s stable
              2) source /etc/profile.d/rvm.sh
              3) rvm -v查看rvm版本
  9.2 安裝ruby和rubygem 1) sed -i 's!cache.ruby-lang.org/pub/ruby!ruby.taobao.org/mirrors/ruby!' $rvm_path/config/db 
                           註:改命令主要是修改ruby的鏡像地址,將taobao作為主鏡像地址,將cache.ruby-lang.org作為副鏡像地址,主要是因為國內網路不穩定
                        2) rvm list known  查看可以安裝的ruby版本
                        3) rvm install 2.2 安裝ruby2.2.1版本
                        4)rvm 2.2 --default 設定一下ruby的版本
                        5)ruby -v 查看ruby的版本
                        6) gem -v 查看gem的版本
10 進入redis的解壓目錄下的src目錄 執行命令./redis-trib.rd create 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382
   如果報錯如下:
   /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
   from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
   from ./redis-trib.rb:25
   執行如下命令:gem install redis
11 在執行gem install redis是會報串連錯誤,則需要執行如下命令做修改
   gem sources --remove https://rubygems.org/ 將預設的源地址刪除
   gem sources -a https://ruby.taobao.org/    設定新的源地址
   gem source -l                              查看源地址
   之後再次執行:gem install redis




12 再次執行./redis-trib.rb create 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382建立叢集並分配槽
13 ./redis-trib.rb check 127.0.0.1:6380檢查叢集的狀態
14 ./redis-trib.rb reshard 127.0.0.1:6380(叢集中任意節點的ip:port) 批量重分區(即:完成槽分區和key-value的遷移)
15 對單個槽分區
   如槽4894在6380對應的節點上,現在需要將該槽移動到6382節點上需要執行如下命令
   14.1 CLUSTER SETSLOT <slot> MIGRATING <target_id> 將本節點的槽 slot 遷移到 target_id(6382節點對應的節點名稱) 指定的節點中
   14.2 CLUSTER SETSLOT <slot> IMPORTING <source_id> 從 source_id(6380節點對應的節點名稱) 指定的節點中匯入槽 slot 到本節點
   14.3 CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵
   14.4 migrate target_id_ip target_id_port <key> 0(表示資料庫號) timeout
   14.5 迴圈3,4步直至所有的key都已經合并到target_id
   14.6 在source_id節點上執行:cluster setslot <slot> node <target_id> 
        在target_id節點上執行:cluster setslot <slot> node <target_id> 此處書上說的是任意節點上執行cluster setslot命名即可,但是在操作過程中發現僅在source_id節點上執行cluster setslot後,在source_id查看cluster nodes資訊是對的
        但是在其它節點查看cluster nodes資訊槽資訊是不對的,經過長時間的等待之後,資訊仍不對,之後在target_id上重新執行cluster setslot命令之後 整個叢集上各個節點的cluster nodes資訊保持了一致


16 在部署redis叢集中遇見的問題:
   16.1 在安裝軟體的時候出現:insserv:starting redis depends on ondeman and therefor on system facility '$all' which can not be true!
   原因在於:之前部署redis-6379的時候設定了開機啟動即配置了/etc/init.d/redis和/etc/rc.d/redis
   在redis檔案中#!/bin/sh之後增加:
   ### BEGIN INIT INFO
   # Provides: REDIS
   # Required-Start: $network $remote_fs $syslog $time
   # Required-Stop:
   # Default-Start: 2 3 4 5
   # Default-Stop: 0 1 6
   # Short-Description: REDIS
   ### END INIT INFO
   資訊即可
   具體檔案內容如下:
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.


### BEGIN INIT INFO
# Provides: REDIS
# Required-Start: $network $remote_fs $syslog $time
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: REDIS
### END INIT INFO


REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli


PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"


case "$1" in
    start)
        if [ -f $PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                $EXEC $CONF &
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -p $REDISPORT shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac










                        

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.