本文主要是介紹Redis集羣在Linux環境下的安裝講解,聯網環境安裝較爲簡單,這裏只說脫機的Linux環境下是如何安裝的。由於大多數時候,公司的生產環境是在內網環境下,無外網,服務器處於脫機狀態。node
系統:CentOS7linux
工具:XShell5及Xftp5程序員
安裝包:redis
Ruby-2.4.2數據庫
Rubygems-2.6.14編程
Redis-4.0.2(3.x版本纔開始支持集羣功能)vim
openssl-1.1.0f緩存
要搭建一個最簡單的Redis集羣,咱們至少須要6個節點:3個Master和3個Slave。那爲何須要3個Master呢?其實就是一個「鐵三角」的關係,當1個Master下線的時候,其餘2個Master和對應的Salve立馬就能頂替上去,確保集羣可以正常使用,若是你以前瞭解Mongodb/Hadoop/Strom這些的話,你就很容易目標通常分佈式的最低要求基數個數節點,這樣便於選舉(少數服從多數的原則)。本文當中,咱們就偷下懶,在一臺Linux虛擬機上搭建6個節點的Redis集羣(實際真正生產環境,須要3臺Linux服務器分佈存放3個Master)ruby
實際上,Redis集羣的操做在後文你能夠看到是經過Ruby腳原本完成的,所以咱們須要安裝Ruby相關的RPM包,以及Redis和Ruby的接口包。服務器
Ruby是一種純粹的面向對象編程語言。它由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)建立於1993年。
您能夠在 www.ruby-lang.org 的 Ruby 郵件列表上找到松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)的名字。在 Ruby 社區,松本也被稱爲馬茨(Matz)。Ruby 是"程序員的最佳朋友"。
Ruby 的特性與 Smalltalk、Perl 和 Python 相似。Perl、Python 和 Smalltalk 是腳本語言。Smalltalk 是一個真正的面嚮對象語言。Ruby,與 Smalltalk 同樣,是一個完美的面嚮對象語言。使用 Ruby 的語法比使用 Smalltalk 的語法要容易得多。
去官網下載:http://www.ruby-lang.org/en/downloads/ 最新的版本爲2.4.2
在安裝以前,請確保你Root權限,將下載的Ruby安裝包上傳到服務器當中,使用Xftp能夠很方便的將文件傳入到linux服務器上。
使用命令# tar -zxvf ruby-2.4.2.tar.gz解壓當前文件包,使用# cd ruby-2.4.2轉到當前目錄,
使用命令# ./configure --prefix=/usr/local/ruby --prefix是將ruby安裝到指定目錄,也能夠自定義。出現以下界面表明已經配置完成了。
而後使用# make && make install 打包編譯,時間較長,稍等片刻,打包完成後輸入 #ruby –v若是出現ruby的版本號則表明安裝成功。若是出現以下的狀況,則先跳過執行第三步。
使用命令# which ruby
若是出現上圖所示則表明沒有配置環境變量。輸入命令# vim /etc/profile,而後按下I鍵進入編輯模式,在文件最後加上 export PATH=/usr/local/ruby/bin:$PATH
若是已存在PATH則在最後加入 :/usr/local/ruby/bin 。
保存退出就能夠了(按ESC鍵,而後輸入:wq保存退出) 最後須要執行命令# source /etc/profile 才能當即生效,此時再使用# which ruby則會出現對應的信息。安裝成功!
RubyGems 是 Ruby 的一個包管理器,它提供一個分發 Ruby 程序和庫的標準格式,還提供一個管理程序包安裝的工具。
RubyGems 旨在方便地管理 gem 安裝的工具,以及用於分發 gem 的服務器。這相似於 Ubuntu 下的apt-get, Centos 的 yum,Python 的 pip。
RubyGems大約建立於2003年11月,從Ruby 1.9版起成爲Ruby標準庫的一部分。
首先下載安裝包:https://rubygems.org/pages/download。使用Xftp將對應壓縮包放入到/usr/local/src
解壓# tar -zxvf rubygems-2.6.14.tgz
進入對應目錄# cd rubygems-2.6.14
而後使用命令# ruby setup.rb 當出現Rubygems-2.6.14 installed時,表示已經成功安裝,
使用命令# gem update –system更新 RubyGems。
使用命令# which gem 查看環境變量是否存在。
如不存在則需配置環境變量,存在則不須要配置。
輸入命令# vim /etc/profile 如上面所說的配置Ruby的環境變量的操做同樣,將路徑寫入PATH中,保存便可。最後須要執行命令:source /etc/profile 才能當即生效。
redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合能夠對關係數據庫起到很好的補充做用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。
Redis支持主從同步。數據能夠從主服務器向任意數量的從服務器上同步,從服務器能夠是關聯其餘從服務器的主服務器。這使得Redis可執行單層樹複製。存盤能夠有意無心的對數據進行寫操做。因爲徹底實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈記錄。同步對讀取操做的可擴展性和數據冗餘頗有幫助。
redis的官網地址,很是好記,是redis.io。(特地查了一下,域名後綴io屬於國家域名,是british Indian Ocean territory,即英屬印度洋領地)
目前,Vmware在資助着redis項目的開發和維護。
一、到官網(https://redis.io/download)下載Redis,如今最新的版本爲:4.0.2 ,將下載好的壓縮包使用Xftp上傳到服務器當中。
如圖所示,我是新建了一個Redis臨時目錄存放,偷懶我就用xftp5手動建立一個目錄存放(也能夠寫命令建立文件夾 $ makdir redis)
使用#cd /usr/local/src/redis命令轉到壓縮包所在路徑,使用解壓命令# tar -zxvf redis-4.0.2.tar.gz。
進入解壓後的redis的目錄,
使用make命令進行安裝 #make && make install //make 這裏若是不指定PREFIX,默認將安裝在/usr/local/bin下,保持默認就好。出現以下界面表示已經安裝成功了。
安裝完成後 在redis的解壓目錄中使用命令# redis-server redis.conf 便可啓動redis,由於咱們須要配置集羣版本的redis ,這裏咱們先使用Ctrl + C 退出redis。
剛剛上面講到若是隻是想運行單機版的Redis(我的研究Redis能夠安裝單機版),上面的講解已經夠了,不過現實當中,咱們每每是須要使用到集羣功能的,進行容錯。
以前講到是咱們須要6個節點的Redis做爲集羣,因此咱們須要建立6個文件夾,分別存放6個節點的配置信息,6個節點須要對應6個端口號,好比7001~7006,這個端口號咱們自行定義,咱們經過xftp5可視化建立一下。也能夠經過命令建立更加快捷,使用命令# mkdir redis700{1,2,3,4,5,6} 便可在當前目錄批量建立6個文件夾。
由於須要6個節點,全部咱們須要配置各自的redis.conf配置文件。到咱們Redis的安裝目錄usr/local/bin,將redis-cli、redis-server、redis.conf(沒有conf文件,能夠從壓縮包裏拷個出來,或者本身直接新建一個空的conf文件,後面再配置相關信息),分別複製到剛剛建立的6個文件夾當中。可使用Xftp進行復制。
也可使用命令 # echo /usr/local/src/redis/redis700{1,2,3,4,5,6} | xargs -n 1 cp redis-cli redis-server 將server和client複製到對應的6個文件夾中, 而後再使用命令 # echo /usr/local/src/redis/redis700{1,2,3,4,5,6} | xargs -n 1 cp ../src/redis/redis-4.0.2/redis.conf 。
將conf文件複製到這6個文件夾中。
接下來,咱們須要配置redis.conf文件,若是你是從壓縮包拷貝出來,你會發現特別多的備註,這些是都是官網的備註講解,你能夠所有刪除,只配置你想配置的信息就行。咱們主要配置相對應的端口信息和集羣配置信息。
主要配置信息以下:
port 7001
#啓用守護進程
appendonly yes
#啓用集羣
cluster-enabled yes
#關聯集羣的配置文件
cluster-config-file "nodes.conf"
#超時時間
cluster-node-timeout 5000
#只要有結點宕機致使16384個槽沒全被覆蓋,整個集羣就所有中止服務,因此必定要改成no
cluster-require-full-coverage no
#後臺啓動
daemonize yes
logfile ""
bind 0.0.0.0
注意6個文件夾的端口號須要一一對應,6個文件都修改完成後,在每一個對應文件夾中使用命令# redis-server redis.conf分別將這6個redis服務啓動起來。也可使用腳本的形式批量進行操做。
這裏咱們能夠新建一個腳本用於批量執行啓動任務,在redis目錄下使用命令# vim startall.sh 。輸入I進入編輯模式,輸入以下命令:
按下Esc而後:wq保存,執行./startall.sh 提示permission denied說明權限不足,執行命令# chmod 777 startall.sh修改權限獲取root用戶執行腳本。在使用命令# sh startall.sh 便可正常執行腳本,腳本執行狀況以下:
經過命令netstat -tnulp | grep redis和ps aux | grep redis查看redis運行狀況,能夠看到端口700一、700二、700三、700四、700五、7006的redis都起來了。
如今還缺乏redis和ruby的接口,使用gem 安裝,咱們這個時候其實還須要安裝對應的Redis的Rbuy接口包。咱們須要下載對應Redis的gem包安裝才行。Rubygems的官網其實提供了Redis的gem包,咱們能夠直接去下載https://rubygems.org/gems/redis/ 下載後上傳到服務器當中
由於須要zlib工具依賴,咱們須要再安裝zlib才行,下載zlib,上傳解壓,安裝zlib官方網站:http://www.zlib.net ,最新版1.2.11,安裝咱們就一筆帶過。
到Xftp上傳後的目錄
命令:# tar -xvzf zlib-1.2.11.tar.gz 進入解壓後的目錄#cd zlib-1.2.11
配置編譯安裝:
命令# ./configure --prefix=/usr/local/zlib
命令:# make && make install
完成後咱們須要進入ruby解壓後的目錄,再使用命令 # cd ./ext/zlib進入ruby的zlib目錄,再使用命令# ruby extconf.rb --with-zlib-include=/usr/local/zlib/include/ --with-zlib-lib=/usr/local/zlib/lib //會生成一個Makefile文件。這個時候不要直接安裝,先須要將Makefile文件中的錯誤路徑修改一下。使用命令# vim Makefile 打開該文件,將文件中的
修改完成,而後保存:wq接着咱們再 使用命令# make && make install ,
安裝完成。
最新版本接口包爲redis-4.0.1.gem,使用Xftp上傳至服務器後使用命令# gem install redis-4.0.1.gem ,
如出現以下錯誤:
則先跳過該部分,先安裝OpenSSL。
安裝OpenSSL
由於Redis集羣交互是須要OpenSSL ,因此須要先安裝OpenSSL,官網地址:https://www.openssl.org/source/ 上次壓縮包到服務器,解壓。若是以前已經安裝了則跳過該步驟。
命令# tar -xzvf openssl-1.1.0f.tar.gz
# cd openssl-1.1.0f
# ./config -fPIC --prefix=/usr/local/openssl enable-shared
# ./config -t
# make && make install
安裝完成。
安裝完成後回到Ruby的解壓目錄進入# cd /usr/local/src/ruby-2.4.2/ext/openssl/目錄,像安裝zlib同樣安裝openssl。
命令 # ruby extconf.rb --with-openssl-include=/usr/local/openssl/include/
--with-openssl-lib=/usr/local/openssl/lib //會生成一個Makefile文件
注意:/usr/local/openssl是個人openssl安裝目錄
一樣須要將Makefile中的$(top_srcdir)所有改爲../.. (能夠在Xftp中對該文件使用Notepad++進行打開,而後統一替換)
修改後保存,再執行# make && make install 這樣就能夠成功了。
這時候再回到存放redis-4.0.1.gem的目錄,執行命令# gem install redis-4.0.1.gem 此時redis集羣的配置就完成了。
咱們使用redis的集羣是經過Ruby腳本完成的,在redis的解壓包下的src目錄下找到文件 redis-trib.rb
使用Xftp或者複製命令# cp redis-trib.rb ../../將文件放到放有6個節點的文件夾的同一級 ,使用命令# ./redis-trib.rb create --replicas 1 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 127.0.0.1:7006 咱們可使用其默認配置
咱們選擇yes,意思是服從這種主從分配方式,咱們也能夠經過配置文件本身指定slave。
到此能夠看到redis集羣已經啓動成功了。
進入7001端口的目錄,使用命令 # redis-cli -p 7001 –c
說明:-h+host –p+端口號 –c 是要鏈接集羣,注意坑,不加會報錯
咱們在7001的redis中存入一個值 set name tiger ,
這時咱們發現他自動把個值轉存到7002的redis了。
而後使用 Ctrl + C退出客戶端,進入7003的目錄使用命令 # redis-cli -p 7003 –c 連接7003的redis,獲取值name,咱們會發現redis會自動跳轉到存入該key的集羣redis節點7002中。
redis-trib.rb是redis官方推出的管理redis集羣的工具,集成在redis的源碼src目錄下,是基於redis提供的集羣命令封裝成簡單、便捷、實用的操做工具。redis-trib.rb是redis做者用ruby完成的。ruby是門很是靈活的語言,redis-trib.rb只用了1600行左右的代碼,就實現了強大的集羣操做。
咱們可使用命令# ruby redis-trib.rb help 對redis-trib.rb進行了解
能夠看到redis-trib.rb具備如下功能:
一、create:建立集羣
二、check:檢查集羣
三、info:查看集羣信息
四、fix:修復集羣
五、reshard:在線遷移slot
六、rebalance:平衡集羣節點slot數量
七、add-node:將新節點加入集羣
八、del-node:從集羣中刪除節點
九、set-timeout:設置集羣節點間心跳鏈接的超時時間
十、call:在集羣所有節點上執行命令
十一、import:將外部redis數據導入集羣
一、create建立集羣
create命令可選replicas參數,replicas表示須要有幾個slave。最簡單命令使用以下:
# ruby redis-trib.rb create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003
有一個slave的建立命令以下:
# ruby redis-trib.rb create --replicas 1 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 127.0.0.1:7006
二、check檢查集羣
檢查集羣狀態的命令,沒有其餘參數,只須要選擇一個集羣中的一個節點便可。執行命令以及結果以下:
# ruby redis-trib.rb check 127.0.0.1:7001
三、info查看集羣信息
info命令用來查看集羣的信息。info命令也是先執行load_cluster_info_from_node獲取完整的集羣信息。而後顯示ClusterNode的info_string結果,示例以下:
# ruby redis-trib.rb info 127.0.0.1:7001
四、fix修復集羣
fix命令的流程跟check的流程很像,顯示加載集羣信息,而後在check_cluster方法內傳入fix爲true的變量,會在集羣檢查出現異常的時候執行修復流程。目前fix命令能修復兩種異常,一種是集羣有處於遷移中的slot的節點,一種是slot未徹底分配的異常。
fix_open_slot方法是修復集羣有處於遷移中的slot的節點異常。fix_slots_coverage方法能修復slot未徹底分配的異常。
命令:# ruby redis-trib.rb fix 127.0.0.1:7001
五、reshard在線遷移slot
reshard命令能夠在線把集羣的一些slot從集羣原來slot負責節點遷移到新的節點,利用reshard能夠完成集羣的在線橫向擴容和縮容。
reshard的參數不少,下面來一一解釋一番:
reshard host:port
--from <arg>
--to <arg>
--slots <arg>
--yes
--timeout <arg>
--pipeline <arg>
host:port:這個是必傳參數,用來從一個節點獲取整個集羣信息,至關於獲取集羣信息的入口。
--from <arg>:須要從哪些源節點上遷移slot,可從多個源節點完成遷移,以逗號隔開,傳遞的是節點的node id,還能夠直接傳遞--from all,這樣源節點就是集羣的全部節點,不傳遞該參數的話,則會在遷移過程當中提示用戶輸入。
--to <arg>:slot須要遷移的目的節點的node id,目的節點只能填寫一個,不傳遞該參數的話,則會在遷移過程當中提示用戶輸入。
--slots <arg>:須要遷移的slot數量,不傳遞該參數的話,則會在遷移過程當中提示用戶輸入。
--yes:設置該參數,能夠在打印執行reshard計劃的時候,提示用戶輸入yes確認後再執行reshard。
--timeout <arg>:設置migrate命令的超時時間。
--pipeline <arg>:定義cluster getkeysinslot命令一次取出的key數量,不傳的話使用默認值爲10。
命令:# ruby redis-trib.rb reshard --from all --to
80b661ecca260c89e3d8ea9b98f77edaeef43dcd --slots 11 127.0.0.1:7001
六、rebalance平衡集羣節點slot數量
rebalance命令能夠根據用戶傳入的參數平衡集羣節點的slot數量,rebalance功能很是強大,能夠傳入的參數不少,如下是rebalance的參數列表和命令示例。
rebalance host:port
--weight <arg>
--auto-weights
--threshold <arg>
--use-empty-masters
--timeout <arg>
--simulate
--pipeline <arg>
命令# ruby redis-trib.rb rebalance --threshold 1 --weight b31e3a2e=5 --weight 60b8e3a1=5 --use-empty-masters --simulate 127.0.0.1:7001
下面也先一一解釋下每一個參數的用法:
host:port:這個是必傳參數,用來從一個節點獲取整個集羣信息,至關於獲取集羣信息的入口。
--weight <arg>:節點的權重,格式爲node_id=weight,若是須要爲多個節點分配權重的話,須要添加多個--weight <arg>參數,即--weight b31e3a2e=5 --weight 60b8e3a1=5,node_id可爲節點名稱的前綴,只要保證前綴位數能惟一區分該節點便可。沒有傳遞–weight的節點的權重默認爲1。
--auto-weights:這個參數在rebalance流程中並未用到。
--threshold <arg>:只有節點須要遷移的slot閾值超過threshold,纔會執行rebalance操做。
--use-empty-masters:rebalance是否考慮沒有節點的master,默認沒有分配slot節點的master是不參與rebalance的,設置--use-empty-masters可讓沒有分配slot的節點參與rebalance。
--timeout <arg>:設置migrate命令的超時時間。
--simulate:設置該參數,能夠模擬rebalance操做,提示用戶會遷移哪些slots,而不會真正執行遷移操做。
--pipeline <arg>:與reshar的pipeline參數同樣,定義cluster getkeysinslot命令一次取出的key數量,不傳的話使用默認值爲10。
七、add-node將新節點加入集羣
add-node命令能夠將新節點加入集羣,節點能夠爲master,也能夠爲某個master節點的slave。
add-node new_host:new_port existing_host:existing_port
--slave
--master-id <arg>
add-node有兩個可選參數:
--slave:設置該參數,則新節點以slave的角色加入集羣
--master-id:這個參數須要設置了--slave才能生效,--master-id用來指定新節點的master節點。若是不設置該參數,則會隨機爲節點選擇master節點。
能夠看下add-node命令的執行示例:
命令#ruby redis-trib.rb add-node 127.0.0.1:7009 127.0.0.1:7001
八、del-node從集羣中刪除節點
del-node能夠把某個節點從集羣中刪除。del-node只能刪除沒有分配slot的節點。刪除命令傳遞兩個參數:
host:port:從該節點獲取集羣信息。
node_id:須要刪除的節點id。
del-node執行結果示例以下:
命令# ruby redis-trib.rb del-node 127.0.0.1:7001
d5f6d1d17426bd564a6e309f32d0f5b96962fe53
九、set-timeout設置集羣節點間心跳鏈接的超時時間
set-timeout用來設置集羣節點間心跳鏈接的超時時間,單位是毫秒,不得小於100毫秒,由於100毫秒對於心跳時間來講過短了。該命令修改是節點配置參數cluster-node-timeout,默認是15000毫秒。經過該命令,能夠給每一個節點設置超時時間,設置的方式使用config set命令動態設置,而後執行config rewrite命令將配置持久化保存到硬盤。如下是示例:
命令# ruby redis-trib.rb set-timeout 127.0.0.1:7001 30000
十、call在集羣所有節點上執行命令
call命令能夠用來在集羣的所有節點執行相同的命令。call命令也是須要經過集羣的一個節點地址,連上整個集羣,而後在集羣的每一個節點執行該命令。
命令# ruby redis-trib.rb call 127.0.0.1:7001 get key
十一、import將外部redis數據導入集羣
import命令能夠把外部的redis節點數據導入集羣。導入的流程以下:
一、經過load_cluster_info_from_node方法轉載集羣信息,check_cluster方法檢查集羣是否健康。
二、鏈接外部redis節點,若是外部節點開啓了cluster_enabled,則提示錯誤。
三、經過scan命令遍歷外部節點,一次獲取1000條數據。
四、遍歷這些key,計算出key對應的slot。
五、執行migrate命令,源節點是外部節點,目的節點是集羣slot對應的節點,若是設置了--copy參數,則傳遞copy參數,若是設置了--replace,則傳遞replace參數。
六、不停執行scan命令,直到遍歷徹底部的key。
七、至此完成整個遷移流程
這中間若是出現異常,程序就會中止。沒使用--copy模式,則能夠從新執行import命令,使用--copy的話,最好清空新的集羣再導入一次。
import命令更適合離線的把外部redis數據導入,在線導入的話最好使用更專業的導入工具,以slave的方式鏈接redis節點去同步節點數據應該是更好的方式。
下面是一個例子
命令# ./redis-trib.rb import --from 10.0.10.1:6379 127.0.0.1:7001
上面的命令是把 10.0.10.1:6379上的數據導入到 127.0.0.1:7001這個節點所在的集羣