Redis是一個高性能的key-value數據庫,和Memcached類似, 它的數據都是緩存在內存中,區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。
我們最近需要使用多臺機器,分布式爬取數據,采用的框架是scrapy-redis,所以需要在一臺服務器上安裝Redis。
而今天上午,在阿里云服務器上安裝部署Redis時,遇到一些問題,沒有在網上找到解決辦法,記錄一下。
安裝
安裝這個步驟很簡單,主要參考Linux下Redis的安裝和部署,下面說下步驟。
1、到官網下載壓縮包,然后解壓
#直接復制下載鏈接,通過wget下載
$ wget http://download.redis.io/releases/redis-4.0.1.tar.gz
#解壓
$ tar zxvf redis-4.0.1.tar.gz
2、進入Redis目錄,對解壓后的文件進行編譯
# 進入目錄
$ cd redis-4.0.1/
# 編譯
$ make
3、進入src目錄,執行make install安裝Redis
$ cd src
# 安裝
$ make install
然后,在終端輸入redis-server
看到如下界面,說明安裝成功。
部署
1、修改配置文件
回退到redis-4.0.1/
目錄,修改redis.conf
文件
$ cd ..
# 查看當前目錄
$ pwd
/root/redis-4.0.1
$ vim redis.conf
我這里的需求是希望外部機器能訪問,所以注釋掉bind 127.0.0.1
但是不能隨便一臺電腦都能連接,所以通過requirepass
設置一個密碼,最好設置長一點
這樣,基本的就設置好了
2、debug模式,調試連接
(1)首先,我們用debug模式啟動服務器,這樣能更好的查看狀態和分析問題
redis-server redis.conf --loglevel debug
(2)然后,我們另開一個終端,使用ssh登錄到服務器,在服務器上使用客戶端連接Redis
$ redis-cli
這里,我們也可以在Redis服務器的終端,看到有一個連接到我們服務器。
(3)之后,我們在redis客戶端進行簡單操作,使用keys *
查看Redis數據庫存了key值。
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
出現了錯誤,這是因為我們Redis服務器設置了需要密碼。這里,我們可以輸入auth 1234567
來進行獲得權限,也可以在登錄Redis服務器時,給定密碼,例如:redis-cli -a 1234567
127.0.0.1:6379> auth 1234567
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set name liuchungui
OK
127.0.0.1:6379> get name
"liuchungui"
從上可以看出來,我們將name的liuchungui字段成功的存入Redis,并且取出來展示。
(4)其后,我們試一下,在本地電腦上連接Redis有沒有問題
$ redis-cli -h 192.168.0.299 -a 1234567
注意: 將所有的192.168.0.299換成你自己的服務器ip
然后發現,連接不上,出現Operation timed out
192:~ liuchungui$ redis-cli -p 6379 -h 192.168.0.299 -a 1234567
Could not connect to Redis at 192.168.0.299:6379: Operation timed out
Could not connect to Redis at 192.168.0.299: Operation timed out
not connected> keys *
這時,我通過telnet 192.168.0.299 6397
測試服務器的6379端口,居然不通。經過各種google之后,最后找到了解決之法:原來這是因為阿里云沒有開放6379端口,只需要到阿里云那里設置一下安全組就行了。
阿里云安全組具體添加方法,請參考添加安全組規則
當這里設置好了之后,我在本地就能連接服務器的Redis了。
(5)最后,調試沒有問題,我們將Redis設置為后臺運行。
編輯redis.conf,然后將daemonize
屬性改為yes
運行服務器
$ redis-server redis.conf
6997:C 10 Sep 15:10:17.034 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
6997:C 10 Sep 15:10:17.034 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=6997, just started
6997:C 10 Sep 15:10:17.034 # Configuration loaded
到此,我們部署完成。
三、問題與總結
在這里我碰到最主要的一個大問題是本地電腦無法連接服務器上的Redis,然后嘗試了各種失敗的方法
。
- 剛開始以為是
redis.conf
這個配置文件沒配置好,所以嘗試在bind
后面添加本地的ip,后來發現不行。后來才知道,bind后面添加ip,指定是Redis所在服務器網卡的ip,不是指定某些IP可以訪問本機Redis實例,這是一個誤區。這可以參考Redis bind 限制和指定IP訪問和What does the bind parameter do in Redis? - 各種搜索通過防火墻來開啟端口,即通過
iptables
來實現,后來發現還是不行。這在自己建立的服務器應該有作用,可以限制固定的ip來訪問。而阿里云,是在阿里云網站進行配置。 - 當出現
MISCONF Redis is configured to save RDB snapshots
錯誤時,可以使用redis-cli登錄,然后輸入config set stop-writes-on-bgsave-error no
設置來解決,參考:MISCONF Redis is configured to save RDB snapshots
補充
- 2017.9.30:最好在redis.conf中,設置下logfile,這樣在redis出錯誤時,能看到相關錯誤信息。