<正則吃餃子> :關於redis集羣的搭建、集羣測試、搭建中遇到的問題總結

  項目中使用了redis ,對於其基本的使用,相對簡單些,根據項目中已經提供的工具就能夠實現基本的功能,可是隻是這樣的話,對於redis仍是太膚淺,甚至剛開始時候,集羣、多節點、主從是什麼,他們之間是什麼關係都很模糊。利用瓜弟的服務器,本身學習搭建了一個,如今將其中的主要流程、集羣測試、搭建中遇到的問題,記錄下來,以備後用和幫助後來者。html

 

  1、主要的搭建過程node

  分爲兩部分:linux

    一、利用小王子提供的簡要命令安裝redis;c++

redis安裝
    1.安裝redis依賴
        # yum install gcc tcl gcc-c++
    2.下載redis二進制包
        # wget http://download.redis.io/releases/redis-3.2.9.tar.gz
    3.解壓並安裝redis
        # tar -zxvf redis-3.2.9.tar.gz
        # cd redis-3.2.9
        # make 
        # make install
    4.redis config文件目錄
        mkdir /home/redis                         //建立conf目錄
        cp redis.conf /home/redis/redis.conf     //複製conf到redis目錄
        vim /home/redis/redis.conf                 //修改配置
            daemonize no 改爲 daemonize yes
            prot 6379                              //默認端口6379
    5.簡單使用redis
        which redis-server                          //查看server路徑
        which redis-cli                                //查看cli路徑
        redis-cli /home/redis/redis.conf            //啓動redis
        ps aux|grep redis-server    //確認redis服務啓動

    二、根據網上博客的集羣搭建過程具體搭建(博文地址:http://blog.csdn.net/xu470438000/article/details/42971091);git

    注意:按照這篇博文中的方式可以搭建成功,使用桌面工具也能正常的訪問,可是(問題在後面的問題中說....日後看..)程序員

Redis集羣部署文檔(centos6系統)

(要讓集羣正常工做至少須要3個主節點,在這裏咱們要建立6個redis節點,其中三個爲主節點,三個爲從節點,對應的redis節點的ip和端口對應關係以下)

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

 

1:下載redis。官網下載3.0.0版本,以前2.幾的版本不支持集羣模式

下載地址:https://github.com/antirez/redis/archive/3.0.0-rc2.tar.gz

2:上傳服務器,解壓,編譯

tar -zxvf redis-3.0.0-rc2.tar.gz 

mv redis-3.0.0-rc2.tar.gz redis3.0

cd /usr/local/redis3.0

make

make install

3:建立集羣須要的目錄

mkdir -p /usr.local/cluster

cd /usr.local/cluster

mkdir 7000

mkdir 7001

mkdir 7002

mkdir 7003

mkdir 7004

mkdir 7005

 

4:修改配置文件redis.conf

cp /usr/local/redis3.0/redis.conf  /usr.local/cluster

vi redis.conf

##修改配置文件中的下面選項

port 7000

daemonize yes

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

appendonly yes

##修改完redis.conf配置文件中的這些配置項以後把這個配置文件分別拷貝到7000/7001/7002/7003/7004/7005目錄下面

cp /usr/local/cluster/redis.conf /usr/local/cluster/7000

cp /usr/local/cluster/redis.conf /usr/local/cluster/7001

cp /usr/local/cluster/redis.conf /usr/local/cluster/7002

cp /usr/local/cluster/redis.conf /usr/local/cluster/7003

cp /usr/local/cluster/redis.conf /usr/local/cluster/7004

cp /usr/local/cluster/redis.conf /usr/local/cluster/7005

 

##注意:拷貝完成以後要修改7001/7002/7003/7004/7005目錄下面redis.conf文件中的port參數,分別改成對應的文件夾的名稱

 

5:分別啓動這6個redis實例

cd /usr/local/cluster/7000

redis-server redis.conf

cd /usr/local/cluster/7001

redis-server redis.conf

cd /usr/local/cluster/7002

redis-server redis.conf

cd /usr/local/cluster/7003

redis-server redis.conf

cd /usr/local/cluster/7004

redis-server redis.conf

cd /usr/local/cluster/7005

redis-server redis.conf

 

 

##啓動以後使用命令查看redis的啓動狀況ps -ef|grep redis

以下圖顯示則說明啓動成功

 

6:執行redis的建立集羣命令建立集羣

cd /usr/local/redis3.0/src

./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

6.1執行上面的命令的時候會報錯,由於是執行的ruby的腳本,須要ruby的環境

錯誤內容:/usr/bin/env: ruby: No such file or directory

因此須要安裝ruby的環境,這裏推薦使用yum install ruby安裝

yum install ruby

 

6.2而後再執行第6步的建立集羣命令,還會報錯,提示缺乏rubygems組件,使用yum安裝

 

錯誤內容:

./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)

from ./redis-trib.rb:24

yum install rubygems

6.3再次執行第6步的命令,還會報錯,提示不能加載redis,是由於缺乏redis和ruby的接口,使用gem 安裝

錯誤內容:

/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 --version 3.0.0

注意:gem install redis --version 3.0.0 失敗的話,須要修改一下gem的源
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/

6.4 再次執行第6步的命令,正常執行
輸入yes,而後配置完成。

至此redis集羣即搭建成功!

7:使用redis-cli命令進入集羣環境

redis-cli -c -p 7000

再次注意:按照這篇博文中的方式可以搭建成功,使用桌面工具也能正常的訪問,可是(問題在後面的問題中說....日後看..)github

我在本身的集羣中使用的端口是 6661 -- 6666 ,這個你在具體的搭建中能夠按照本身的須要來處理,不比拘泥於博客中寫的。對於個人端口,默認狀況下,集羣搭建後,會有三個主,三個從。具體能夠利用命令查看這個集羣時,可以詳細看到。redis

 

2、集羣測試、遇到的問題及解決方案spring

利用網上博主的搭建方式,當我滿懷欣喜的進行測試時,出錯了。sql

錯誤(1)桌面工具(redis desktop manager)不能正常訪問;

  查看資料,須要修改 redis.conf 中的配置。

  在redis.conf中 ,默認的 bind 127.0.0.1 (若是你看這個配置文件的話,就知道了),我是把 bind 項的所有註釋掉了。

  具體須要瞭解下bind項的說明,bind IP 監聽指定的網絡接口。這樣的話,如今看來有兩種操做方式:一、所有註釋(看了下項目上的配置也是所有註釋了);二、指定某個網絡ip進行訪問。

      至此,在啓動redis單個實例時候,能保證外部工具能正常的訪問。

錯誤(2)Too many cluster redirections redis (參考博文);

具體博文,以下:

今天在虛擬機上安裝了Redis,並配置了redis cluster。

啓動redis cluster使用的命令爲:

./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

而後在eclipse上集成了springmvc和redisc cluster,配置文件中配置的ip爲虛擬機實際IP:192.168.23.129,結果啓動時老是報:Too many cluster redirections?

最後debug發現cluster中nodes中,既包含了127.0.0.1的節點,又包含192.168.23.129的節點。

因此猜想程序啓動時會將服務器上實際存在的節點和配置的節點都加載到內存中,而後程序使用的192.168.23.129:端口,去訪問節點,而服務器上並無該節點。

以後就將虛擬機上的cluster節點所有刪除,從新建立節點,建立時使用實際ip192.168.23.129,即:

./redis-trib.rb create --replicas 1 192.168.23.129:7000 192.168.23.129:7001 192.168.23.129:7002 192.168.23.129:7003 192.168.23.129:7004 192.168.23.129:7005

再次啓動程序,能夠正常啓動,並從redis中存入和讀取數據

 

可是,並無解決個人問題。查看了多個資料,改成 建立集羣時候,採用  「服務器ip:端口」形式,而不是 「127.0.0.1:端口」。

錯誤(3):Waiting for the cluster to join...(參考博文:http://blog.csdn.net/truong/article/details/52531103)

 

Redis集羣建立執行

./redis-trib.rb create --replicas 1 XXXX:PORT1 XXXX:PORT2 ....
的時候
一直等待 Waiting for the cluster to join 好久都沒有反應
緣由:
redis集羣不只須要開通redis客戶端鏈接的端口,並且須要開通集羣總線端口
集羣總線端口爲redis客戶端鏈接的端口 + 10000
如redis端口爲6379
則集羣總線端口爲16379
故,全部服務器的點須要開通redis的客戶端鏈接端口和集羣總線端口

注意:iptables 放開,若是有安全組,也要放開這兩個端口

 

根據這個介紹,在阿里服務器上,開放端口 16661 -- 16666 ,由於個人redis端口是 6661 -- 6666,這樣,集羣順利搭建成功。

問題(4)節點的從新分配;

最開始集羣搭建時候,使用的是 9個節點(四主五從),後來又增長一個,而後,考慮新增的節點設爲主節點,將先前的某個從節點 設爲 新增的主節點的從節點,這樣能保證五主五從。按照博文中操做,新增主節點成功,分配哈希成功,而後在改變某個從節點的主節點時候,出現了問題。我先把先前的操做貼出來

*****************  方式1
redis-cli -c -p 6387 cluster replicate 32272a219f112c7fa4d5e52ae209b0e423c05f1d    // 將新節點6387 添加到 id爲xxxx的主節點下面

32272a219f112c7fa4d5e52ae209b0e423c05f1d 127.0.0.1:6388 master - 0 1502087249399 10 connected 0-749 4096-4845 8192-8941 12288-13037
d5630ab94d6e16d223dfd531a00090d51d7c5ee8 127.0.0.1:6386 slave a7b1f53d6db875cfef4bc74b841c3c609470e21d 0 1502087248898 8 connected
fa7f023aea260776b60f2e05f899c712753a2e66 127.0.0.1:6387 slave 32272a219f112c7fa4d5e52ae209b0e423c05f1d 0 1502087249399 10 connected
bb2b284449a61ecc597db035b9b5aa884f1e5f8b 127.0.0.1:6381 master - 0 1502087248497 3 connected 8942-12287
4bdfde82873f49de95e0eafe882fd7243a916ce9 127.0.0.1:6379 myself,master - 0 0 1 connected 750-4095
a7b1f53d6db875cfef4bc74b841c3c609470e21d 127.0.0.1:6382 master - 0 1502087249900 4 connected 13038-16383
577eb5f573e4e1e360445df5492609dfb5923bb4 127.0.0.1:6384 slave dd43d06ca57da06beb4efa503def231523c00285 0 1502087248898 6 connected
6484325ac3c6e432ce556866055dacbcb7b9dc3d 127.0.0.1:6383 slave 32272a219f112c7fa4d5e52ae209b0e423c05f1d 0 1502087249399 10 connected
4c61578e2b3817d1b4709aa78dca4602abe40808 127.0.0.1:6385 slave bb2b284449a61ecc597db035b9b5aa884f1e5f8b 0 1502087248397 7 connected
dd43d06ca57da06beb4efa503def231523c00285 127.0.0.1:6380 master - 0 1502087248898 2 connected 4846-8191

主   -- 從
6388 -- 6387 6383
6379
6381  -- 6385
6380  -- 6384
6382  -- 6386

可是,按照這種方式來處理的時候,沒有成功,如上所示,這樣就將 原先6379 的兩個從節點都轉移到 新增節點 6388下面了。沒有達到預期效果。

(也可能個人操做不對形成的,有須要的能夠本身測試下這種方式)。

而後,換了另外一種方式,以下

******************  方式2
[root@iZwz9h69m8hhqu3855nbhkZ src]# redis-cli -c -p 6383
127.0.0.1:6383> cluster replicate 4bdfde82873f49de95e0eafe882fd7243a916ce9
OK
127.0.0.1:6383> quit



32272a219f112c7fa4d5e52ae209b0e423c05f1d 127.0.0.1:6388 master - 0 1502089485248 10 connected 0-749 4096-4845 8192-8941 12288-13037
d5630ab94d6e16d223dfd531a00090d51d7c5ee8 127.0.0.1:6386 slave a7b1f53d6db875cfef4bc74b841c3c609470e21d 0 1502089483245 8 connected
fa7f023aea260776b60f2e05f899c712753a2e66 127.0.0.1:6387 slave 32272a219f112c7fa4d5e52ae209b0e423c05f1d 0 1502089484747 10 connected
bb2b284449a61ecc597db035b9b5aa884f1e5f8b 127.0.0.1:6381 master - 0 1502089483745 3 connected 8942-12287
4bdfde82873f49de95e0eafe882fd7243a916ce9 127.0.0.1:6379 myself,master - 0 0 1 connected 750-4095
a7b1f53d6db875cfef4bc74b841c3c609470e21d 127.0.0.1:6382 master - 0 1502089483745 4 connected 13038-16383
577eb5f573e4e1e360445df5492609dfb5923bb4 127.0.0.1:6384 slave dd43d06ca57da06beb4efa503def231523c00285 0 1502089484245 6 connected
6484325ac3c6e432ce556866055dacbcb7b9dc3d 127.0.0.1:6383 slave 4bdfde82873f49de95e0eafe882fd7243a916ce9 0 1502089484747 10 connected
4c61578e2b3817d1b4709aa78dca4602abe40808 127.0.0.1:6385 slave bb2b284449a61ecc597db035b9b5aa884f1e5f8b 0 1502089484747 7 connected
dd43d06ca57da06beb4efa503def231523c00285 127.0.0.1:6380 master - 0 1502089484245 2 connected 4846-8191


主   --- 從
6379 -- 6383
6380 -- 6384
6381 -- 6385
6382 -- 6386
6388 -- 6387

ps: redis-cli -c -p 6379 cluster nodes   --------查看節點狀況

這樣就okay了。

 

3、集羣搭建中用到的redis經常使用命令等

主要涉及:

    redis包的下載、安裝;

    環境包的下載、安裝、調試;

    redis實例配置修改、啓動、關閉;

    redis集羣的建立、節點新增、刪除、新增節點分配哈希槽、指定主從、修改主從等;

    redis服務的關閉;

    文件的複製、修改、刪除、建立等;

下面是我在服務器上操做的主要命令的記錄,不必定對其餘人適用,只給本身留做記憶:

我敏!I love you!

mkdir -p /tmp/dir1/dir2 建立一個目錄樹 redis-server /home/redis/redis/redis-3.2.9/redis.conf 根據這個conf 啓動redis服務 linux vi編輯的 相關操做:編輯,保存,退出等 ps -ef|grep redis 查看redis使用狀況 cd /usr/local/redis3.0/src cd /home/redis/redis/redis-3.2.9/src //個人服務器上的redis 目錄 ,方便下次查找 ./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 ./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 127.0.0.1:6385 127.0.0.1:6386 127.0.0.1:6387 ./redis-trib.rb create --replicas 1 服務器ip:6661 服務器ip:6662 服務器ip:6663 服務器ip:6664 服務器ip:6665 服務器ip:6666 ./redis-trib.rb create --replicas 1 127.0.0.1:6661 127.0.0.1:6662 127.0.0.1:6663 127.0.0.1:6664 127.0.0.1:6665 127.0.0.1:6666 netstat -tunpl //查看全部的進程 cp /usr/local/cluster/redis.conf /usr/local/cluster/7006/ 複製文件到7006文件夾 redis-cli -c -p 6379 cluster nodes 查看redis集羣節點狀況,可以標識出主從和鏈接數等 ./redis-trib.rb add-node 127.0.0.1:6388 127.0.0.1:6379 //cd到redis目錄下 src 下,執行,增長 6388節點,6379是已存在的 redis-cli -c -p 6387 cluster replicate 32272a219f112c7fa4d5e52ae209b0e423c05f1d // 將新節點6387 添加到 id爲xxxx的主節點下面 redis-cli -p 6387 cluster nodes | grep slave | grep 32272a219f112c7fa4d5e52ae209b0e423c05f1d //查看主節點 6387的從節點 //將某個從節點6383,改變其主節點爲 id = 4bdfde82873f49de95e0eafe882fd7243a916ce9 的主節點 [root@iZwz9h69m8hhqu3855nbhkZ src]# redis-cli -c -p 6383 127.0.0.1:6383> cluster replicate 4bdfde82873f49de95e0eafe882fd7243a916ce9 OK 127.0.0.1:6383> quit pkill -9 redis // 幹掉redis,終極必殺 redis-trib.rb del-node 192.168.10.220:6385 '9c240333476469e8e2c8e80b089c48f389827265' //刪除從節點 by節點id 32272a219f112c7fa4d5e52ae209b0e423c05f1d 127.0.0.1:6388 master - 0 1502096124913 10 connected 0-749 4096-4845 8192-8941 12288-13037 d5630ab94d6e16d223dfd531a00090d51d7c5ee8 127.0.0.1:6386 slave a7b1f53d6db875cfef4bc74b841c3c609470e21d 0 1502096126414 8 connected fa7f023aea260776b60f2e05f899c712753a2e66 127.0.0.1:6387 slave 32272a219f112c7fa4d5e52ae209b0e423c05f1d 0 1502096126414 10 connected bb2b284449a61ecc597db035b9b5aa884f1e5f8b 127.0.0.1:6381 master - 0 1502096124413 3 connected 8942-12287 4bdfde82873f49de95e0eafe882fd7243a916ce9 127.0.0.1:6379 myself,master - 0 0 1 connected 750-4095 a7b1f53d6db875cfef4bc74b841c3c609470e21d 127.0.0.1:6382 master - 0 1502096125413 4 connected 13038-16383 577eb5f573e4e1e360445df5492609dfb5923bb4 127.0.0.1:6384 slave dd43d06ca57da06beb4efa503def231523c00285 0 1502096125413 6 connected 6484325ac3c6e432ce556866055dacbcb7b9dc3d 127.0.0.1:6383 slave 4bdfde82873f49de95e0eafe882fd7243a916ce9 0 1502096125914 10 connected 4c61578e2b3817d1b4709aa78dca4602abe40808 127.0.0.1:6385 slave bb2b284449a61ecc597db035b9b5aa884f1e5f8b 0 1502096125413 7 connected dd43d06ca57da06beb4efa503def231523c00285 127.0.0.1:6380 master - 0 1502096124413 2 connected 4846-8191 redis-trib.rb reshard 127.0.0.1:6388 cp /home/redis/redis/redis-3.2.9/redis.conf /usr/local/cluster/6661/ cd /usr/local/cluster/6661
//********************* 相關英語 replica -- 複製品,從

 

4、主要參考和學習的博文

    redis3.0.0 集羣安裝詳細步驟

  redis集羣 Waiting for the cluster to join 一直等待

  Too many cluster redirections redis

  redis集羣同步遷移方法(一):經過redis replication實現

  redis cluster 添加 刪除 重分配 節點(這人總結的挺全面,能夠看看)

  Redis配置參數詳解

  redis如何分配哈希槽

 

  Redis配置集羣遇到問題及解決方法

 

  關於Redis服務外網訪問不到的問題

 

   還有幾篇挺好的,不一一貼出來了。

 

5、其餘

 

集羣搭建完成時,測試okay,感謝瓜弟和小王子的服務器,感謝傘、胖哥等。

下篇,我把測試demo發出來。

深深的體會:動手纔是程序員學習的正確姿式!

相關文章
相關標籤/搜索