最近學習用redis, 裝了個centos-7虛擬機,在網上參考了很多博文,然後拼拼湊湊寫了一點東東,跟大家共享。
安裝redis 3.0
1、首先下載redis 3.0
- ·wget http://download.redis.io/releases/redis-3.0.0.tar.gz
- tar zxvf redis-3.0.0.tar.gz
- cd redis-3.0.0
2、編譯
- make
make命令執行完成編譯後,會在src目錄下生成6個可執行文件,分別是redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-dump、redis-sentinel。
至此,實際就可以到src目錄下啓動redis:
3、後臺啓動redis服務
- ./redis-server &
如果沒有修改配置,會看到下面的狀態:
然後啓動redis客戶端:
- ./redis-cli
出現上面的界面,說明成功進入redis,可以測試:
上邊是我們編譯完就運行redis,但是通常,我們在編譯之後會安裝redis,這樣就可以在所有路徑下用redis的命令了:
- make install
安裝後會將make編譯生成的可執行文件拷貝到/usr/local/bin目錄下,這樣無論在哪兒都可以執行redis-server來啓動redis服務了。
註釋:
▲redis的默認端口號是6379,(據redis的作者antirez的博文說,6379在是手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字。而MERZ長期以來被antirez及其朋友當作愚蠢的代名詞。)
▲Redis有兩種存儲方式,默認是snapshot方式,實現方法是定時將內存的快照(snapshot)持久化到硬盤,這種方法缺點是持久化之 後如果出現crash則會丟失一段數據。因此在完美主義者的推動下作者增加了aof方式。aof即append only mode,在寫入內存數據的同時將操作命令保存到日誌文件。
以後臺守護形式運行Redis
需要讀取配置文件方式啓動
注意,默認複製過去的redis.conf文件的daemonize參數爲no,所以redis不會在後臺運行,我們可以修改redis.conf文件,這個文件就是解壓後的redis根目錄下
- daemonize yes
- redis-server /usr/redis-3.0.0/redis.conf
查看redis進程
- ps aux | grep redis
redis cluster集羣搭建
建立本機測試環境
(要讓集羣正常工作至少需要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
創建集羣需要的目錄
- mkdir -p /usr/local/cluster
- cd /usr/local/cluster
- mkdir 7000 7001 7002 7003 7004 7005
修改配置文件redis.conf
- cp /usr/local/redis3.0.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參數,分別改爲對應的文件夾的名稱。
分別啓動這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 aux|grep redis,如果出現下面的結果,說明啓動成功(注意:必須進入到每一個目錄下,再執行redis-server redis.conf)。
執行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
執行上面的命令的時候會報錯,因爲是執行的ruby的腳本,需要ruby的環境。錯誤內容:/usr/bin/env: ruby: No such file or directory
所以需要安裝ruby的環境,這裏推薦使用yum install ruby安裝
- yum install ruby
然後再執行剛纔的創建集羣命令,還會報錯,提示缺少rubygems組件,使用yum安裝
錯誤內容:
./redis-trib.rb:24:in `require’: no such file to load – rubygems (LoadError)
from ./redis-trib.rb:24
- yum install rubygems
再次執行第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
require’
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in
from ./redis-trib.rb:25
- gem install redis
出現錯誤:
ERROR: Could not find a valid gem ‘redis’ (>= 0), here is why:
Unable to download data from https://rubygems.org/ - Errno::ECONNRESET: Connection reset by peer - SSL_connect
(https://rubygems.org/latest_specs.4.8.gz)
解決方案:
可以求助萬能的淘寶鏡像站 https://ruby.taobao.org/
- gem sources -a https://ruby.taobao.org/
- #然後在執行:
- gem install redis
再次執行剛纔的創建集羣的命令,正常執行。
至此redis集羣即搭建成功!
使用redis-cli命令進入集羣環境
- redis-cli -c -h 127.0.0.1 -p 7000
- #用 cluster nodes 可以查看節點信息,
redis-trib默認用前3個實例作爲Master,後3個作爲Slave。
集羣重啓:
目前redis-trib的功能還比較弱,需要重啓集羣的話先手動kill掉各個進程,刪除掉所有redis instance的aof、node-config、rdb文件(這樣,之前的數據會丟失),然後重新啓動就可以了,如果不刪除原實例的文件,重啓的時候會報錯。
- ps -ef | grep redis | awk '{print $2}' | xargs kill
故障轉移
在高可用性方面,Redis可算是能夠”Auto”一把了!Redis Cluster重用了Sentinel的代碼邏輯,不需要單獨啓動一個Sentinel集羣,Redis Cluster本身就能自動進行Master選舉和Failover切換。
執行:set name “zhangsan”,發現name被存到了 7000 節點上了。
下面我們故意kill掉7000結點,之後可以看到結點狀態變成了fail,而Slave 7003被選舉爲新的Master。
嘗試查詢之前保存在7000上的Key “name”,可以看到7003頂替上來繼續提供服務,整個集羣沒有受到影響。
性能檢測:
redis 自己提供了一個性能測試工具redis-benchmark. redis-benchmark可以模擬N個機器,同時發送M個請求。
用法:
- redis-benchmark [-h ] [-p ] [-c ] [-n <requests]> [-k ]
- -h <hostname> Server hostname (default 127.0.0.1)
- -p <port> Server port (default 6379)
- -s <socket> Server socket (overrides host and port)
- -c <clients> Number of parallel connections (default 50) 併發客戶端數
- -n <requests> Total number of requests (default 10000) 請求數量
- -d <size> Data size of SET/GET value in bytes (default 2) set 數據大小
- -k <boolean> 1=keep alive 0=reconnect (default 1) 是否採用keep alive模式
- -r <keyspacelen> Use random keys for SET/GET/INCR, random values for SADD
- Using this option the benchmark will get/set keys
- in the form mykey_rand:000000012456 instead of constant
- keys, the <keyspacelen> argument determines the max
- number of values for the random number. For instance
- if set to 10 only rand:000000000000 - rand:000000000009
- range will be allowed.
- -P <numreq> Pipeline <numreq> requests. Default 1 (no pipeline). 是否採用Pipeline模式請求,默認不採用
- -q Quiet. Just show query/sec values 僅僅顯示查詢時間
- --csv Output in CSV format 導出爲CSV格式
- -l Loop. Run the tests forever 循環測試
- -t <tests> Only run the comma separated list of tests. The test
- names are the same as the ones produced as output.
- -I Idle mode. Just open N idle connections and wait
經過測試,我的筆記本可以處理每秒3萬多個請求,性能還不錯。