天天看點

Redis部署

一、 Redis部署

1、 安裝redis

wget http://redis.googlecode.com/files/redis-2.2.8.tar.gz

tar zxvf redis-2.2.8.tar.gz 

mv redis-2.2.8 /usr/local/redis 

cd /usr/local/redis 

make && make install

make指令執行完成後,會在src目錄下生成5個可執行檔案,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-dump,它們的作用如下:

redis-server:Redis伺服器的daemon啟動程式

redis-cli:Redis指令行操作工具。當然,你也可以用telnet根據其純文字協定來操作。

redis-benchmark:Redis性能測試工具,測試Redis在你的系統及你的配置下的讀寫性能。

redis-check-aof:更新日志檢查

redis-check-dump:用于本地資料庫檢查

2、 配置redis

vi /usr/local/redis/redis.conf

daemonize yes 

pidfile /usr/local/redis/redis.pid 

port 6379 

timeout 300 

loglevel verbose 

logfile /usr/local/redis/redis.log

databases 16 

save 900 1 

save 300 10 

save 60 10000 

rdbcompression yes 

dbfilename dump.rdb 

dir /usr/local/redis

slave-serve-stale-data yes 

maxmemory

67108864 #64M*1024*8

appendonly no 

appendfsync everysec 

no-appendfsync-on-rewrite no 

vm-enabled no 

vm-swap-file /tmp/redis.swap 

vm-max-memory 0 

vm-page-size 32 

vm-pages 134217728 

vm-max-threads 8

hash-max-zipmap-entries 512 

hash-max-zipmap-value 64 

list-max-ziplist-entries 512 

list-max-ziplist-value 64 

set-max-intset-entries 512 

activerehashing yes 

1,是否以背景程序運作,預設為no

daemonize no

2,如以背景程序運作,則需指定一個pid,預設為/var/run/redis.pid

pidfile /var/run/redis.pid

3,監聽端口,預設為6379

port 6379

4,綁定主機IP,預設值為127.0.0.1(注釋)

#bind 127.0.0.1

5,逾時時間,預設為300(秒)

timeout 300

6,日志記錄等級,有4個可選值,debug,verbose(預設值),notice,warning

loglevel verbose

7,日志記錄方式,預設值為stdout

logfile stdout

8,可用資料庫數,預設值為16,預設資料庫為0

databases 16

9,指出在多長時間内,有多少次更新操作,就将資料同步到資料檔案。這個可以多個條件配合,比如預設配置檔案中的設定,就設定了三個條件。

900秒(15分鐘)内至少有1個key被改變

save 900 1

300秒(5分鐘)内至少有10個key被改變

save 300 10

10,存儲至本地資料庫時是否壓縮資料,預設為yes

rdbcompression yes

11,本地資料庫檔案名,預設值為dump.rdb

dbfilename /root/redis_db/dump.rdb

12,本地資料庫存放路徑,預設值為 ./

dir /root/redis_db/

13,

當本機為從服務時,設定主服務的IP及端口(注釋)(重要)

slaveof <masterip> <masterport>

14,當本機為從服務時,設定主服務的連接配接密碼(注釋)

masterauth <master-password>

15,連接配接密碼(注釋)

requirepass foobared

16, 最大用戶端連接配接數,預設不限制(注釋) 0為不限制 maxclients 0 17,

設定最大記憶體,達到最大記憶體設定後,Redis會先嘗試清除已到期或即将到期的Key,當此方法處理後,任到達最大記憶體設定,将無法再進行寫入操作。(注釋)

maxmemory 67108864 (64M)

18,是否在每次更新操作後進行日志記錄,如果不開啟,可能會在斷電時導緻一段時間内的資料丢失。因為redis本身同步資料檔案是按上面save條件來同步的,是以有的資料會在一段時間内隻存在于記憶體中。預設值為no

appendonly no

19,更新日志檔案名,預設值為appendonly.aof(注釋)

appendfilename /root/redis_db/appendonly.aof

20,更新日志條件,共有3個可選值。no表示等作業系統進行資料緩存同步到磁盤,always表示每次更新操作後手動調用fsync()将資料寫到磁盤,everysec表示每秒同步一次(預設值)。

appendfsync everysec

21,是否使用虛拟記憶體,預設值為no

vm-enabled no

22,虛拟記憶體檔案路徑,預設值為/tmp/redis.swap,不可多個Redis執行個體共享

vm-swap-file /tmp/redis.swap

23,将所有大于vm-max-memory的資料存入虛拟記憶體,無論vm-max-memory設定多小,所有索引資料都是記憶體存儲的 (Redis的索引資料就是keys),也就是說,當vm-max-memory設定為0的時候,其實是所有value都存在于磁盤。預設值為0。

vm-max-memory 0

24,虛拟記憶體檔案以塊存儲,每塊32bytes

vm-page-size 32

25,虛拟内在檔案的最大數

vm-pages 134217728

26,可以設定通路swap檔案的線程數,設定最好不要超過機器的核數,如果設定為0,那麼所有對swap檔案的操作都是串行的.可能會造成比較長時間的延遲,但是對資料完整性有很好的保證.

vm-max-threads 4

27,把小的輸出緩存放在一起,以便能夠在一個TCP packet中為用戶端發送多個響應,具體原理和真實效果我不是很清楚。是以根據注釋,你不是很确定的時候就設定成yes

glueoutputbuf yes

28,在redis 2.0中引入了hash資料結構。當hash中包含超過指定元素個數并且最大的元素沒有超過臨界時,hash将以一種特殊的編碼方式(大大減少記憶體使用)來存儲,這裡可以設定這兩個臨界值

hash-max-zipmap-entries 64

29,hash中一個元素的最大值

hash-max-zipmap-value 512

30,開啟之後,redis将在每100毫秒時使用1毫秒的CPU時間來對redis的hash表進行重新hash,可以降低記憶體的使用。當你的使用場景中,有非常嚴格的實時性需要,不能夠接受Redis時不時的對請求有2毫秒的延遲的話,把這項配置為no。如果沒有這麼嚴格的實時性要求,可以設定 為yes,以便能夠盡可能快的釋放記憶體

activerehashing yes

Redis 支援很多的參數,但都有預設值。 ?? daemonize: 預設情況下,redis不是在背景運作的,如果需要在背景運作,把該項的值更改為yes pidfile 當Redis在背景運作的時候,Redis預設會把pid檔案放在/var/run/redis.pid,你可以配置到其他位址。當運作多個redis服務時,需要指定不同的pid檔案和端口 bind 指定Redis隻接收來自于該IP位址的請求,如果不進行設定,那麼将處理所有請求,在生産環境中最好設定該項 port 監聽端口,預設為6379 timeout 設定用戶端連接配接時的逾時時間,機關為秒。當用戶端在這段時間内沒有發出任何指令,那麼關閉該連接配接 loglevel log等級分為4級,debug, verbose, notice, 和warning。生産環境下一般開啟notice logfile 配置log檔案位址,預設使用标準輸出,即列印在指令行終端的視窗上 databases 設定資料庫的個數,可以使用SELECT <dbid>指令來切換資料庫。預設使用的資料庫是0 save 設定Redis進行資料庫鏡像的頻率。 if(在60秒之内有10000個keys發生變化時){ 進行鏡像備份 }else if(在300秒之内有10個keys發生了變化){ 進行鏡像備份 }else if(在900秒之内有1個keys發生了變化){ 進行鏡像備份 } rdbcompression 在進行鏡像備份時,是否進行壓縮 dbfilename 鏡像備份檔案的檔案名 dir 資料庫鏡像備份的檔案放置的路徑。這裡的路徑跟檔案名要分開配置是因為Redis在進行備份時,先會将目前資料庫的狀态寫入到一個臨時檔案中,等備份完成時,再把該該臨時檔案替換為上面所指定的檔案,而這裡的臨時檔案和上面所配置的備份檔案都會放在這個指定的路徑當中 slaveof 設定該資料庫為其他資料庫的從資料庫 masterauth 當主資料庫連接配接需要密碼驗證時,在這裡指定 requirepass 設定用戶端連接配接後進行任何其他指定前需要使用的密碼。警告:因為redis速度相當快,是以在一台比較好的伺服器下,一個外部的使用者可以在一秒鐘進行150K次的密碼嘗試,這意味着你需要指定非常非常強大的密碼來防止暴力破解。 maxclients 限制同時連接配接的客戶數量。當連接配接數超過這個值時,redis将不再接收其他連接配接請求,用戶端嘗試連接配接時将收到error資訊。 設定redis能夠使用的最大記憶體。當記憶體滿了的時候,如果還接收到set指令,redis将先嘗試剔除設定過expire資訊的key,而不管該key的過期時間還沒有到達。在删除時,将按照過期時間進行删除,最早将要被過期的key将最先被删除。如果帶有expire資訊的key都删光了,那麼将傳回錯誤。這樣,redis将不再接收寫請求,隻接收get請求。maxmemory的設定比較适合于把redis當作于類似memcached的緩存來使用。 appendonly 預設情況下,redis會在背景異步的把資料庫鏡像備份到磁盤,但是該備份是非常耗時的,而且備份也不能很頻繁,如果發生諸如拉閘限電、拔插頭等狀況,那麼将造成比較大範圍的資料丢失。是以redis提供了另外一種更加高效的資料庫備份及災難恢複方式。開啟append only模式之後,redis會把所接收到的每一次寫操作請求都追加到appendonly.aof檔案中,當redis重新啟動時,會從該檔案恢複出之前的狀态。但是這樣會造成appendonly.aof檔案過大,是以redis還支援了BGREWRITEAOF指令,對appendonly.aof進行重新整理。是以我認為推薦生産環境下的做法為關閉鏡像,開啟appendonly.aof,同時可以選擇在通路較少的時間每天對appendonly.aof進行重寫一次。 appendfsync 設定對appendonly.aof檔案進行同步的頻率。always表示每次有寫操作都進行同步,everysec表示對寫操作進行累積,每秒同步一次。這個需要根據實際業務場景進行配置 vm-enabled 是否開啟虛拟記憶體支援。因為redis是一個記憶體資料庫,而且當記憶體滿的時候,無法接收新的寫請求,是以在redis 2.0中,提供了虛拟記憶體的支援。但是需要注意的是,redis中,所有的key都會放在記憶體中,在記憶體不夠時,隻會把value值放入交換區。這樣保證了雖然使用虛拟記憶體,但性能基本不受影響,同時,你需要注意的是你要把vm-max-memory設定到足夠來放下你的所有的key vm-swap-file 設定虛拟記憶體的交換檔案路徑 vm-max-memory 這裡設定開啟虛拟記憶體之後,redis将使用的最大實體記憶體的大小。預設為0,redis将把他所有的能放到交換檔案的都放到交換檔案中,以盡量少的使用實體記憶體。在生産環境下,需要根據實際情況設定該值,最好不要使用預設的0 vm-page-size 設定虛拟記憶體的頁大小,如果你的value值比較大,比如說你要在value中放置部落格、新聞之類的所有文章内容,就設大一點,如果要放置的都是很小的内容,那就設小一點。 vm-pages 設定交換檔案的總的page數量,需要注意的是,page table資訊會放在實體記憶體中,每8個page就會占據RAM中的1個byte。總的虛拟記憶體大小= vm-page-size * vm-pages vm-max-threads

設定VM IO同時使用的線程數量。因為在進行記憶體交換時,對資料有編碼和解碼的過

程,是以盡管IO裝置在硬體上本上不能支援很多的并發讀寫,但是還是如果你所儲存的vlaue值比較大,将該值設大一些,還是能夠提升性能的

glueoutputbuf 把小的輸出緩存放在一起,以便能夠在一個TCP packet中為用戶端發送多個響應,具體原理和真實效果我不是很清楚。是以根據注釋,你不是很确定的時候就設定成yes hash-max-zipmap-entries 在redis 2.0中引入了hash資料結構。當hash中包含超過指定元素個數并且最大的元素沒有超過臨界時,hash将以一種特殊的編碼方式(大大減少記憶體使用)來存儲,這裡可以設定這兩個臨界值 activerehashing 開啟之後,redis将在每100毫秒時使用1毫秒的CPU時間來對redis的hash表進行重新hash,可以降低記憶體的使用。當你的使用場景中,有非常嚴格的實時性需要,不能夠接受Redis時不時的對請求有2毫秒的延遲的話,把這項配置為no。如果沒有這麼嚴格的實時性要求,可以設定為yes,以便能夠盡可能快的釋放記憶體 3 、啟動,使用redis

redis-server /usr/local/redis/redis.conf  //啟動redis 

//以下redis-cli來設定key-value值,并且取得資料

root@ubuntu:/usr/local/redis# redis-cli set test "我要測試一下" 

OK 

root@ubuntu:/usr/local/redis# redis-cli get test 

"\xe6\x88\x91\xe8\xa6\x81\xe6\xb5\x8b\xe8\xaf\x95\xe4\xb8\x80\xe4\xb8\x8b"  //以下是telnet的方式來設定key-value值

root@ubuntu:/usr/local/redis# telnet 127.0.0.1 6379

Trying 127.0.0.1... 

Connected to 127.0.0.1. 

Escape character is '^]'. 

set test mytest 

+OK 

get test 

$6 

mytest 

quit 

Connection closed by foreign host. 

4 、關閉redis redis-cli shutdown

# killall -9 redis-server     //關閉所有

檢測Redis是否啟動:

netstat -an –t

ps -ef|grep redis-server

5、redis開機啟動

Vi /etc/rc.d/rc.local

redis-server /usr/local/redis/redis.conf或

echo "redis-server /usr/local/redis/redis.conf" &gt;&gt; /etc/rc.d/rc.local

redis 是單線程來處理所有client的請求的 實驗

下面是個實驗,首先清空目前資料庫,然後

設定k1,k2.擷取時k3對應傳回nil

redis&gt; flushdb

OK

redis&gt; dbsize

(integer) 0

redis&gt; set k1 a

redis&gt; set k2 b

redis&gt; mget k1 k2 k3

1. "a"

2. "b"

3. (nil)

mset key1 value1 ... keyN valueN 一次設定多個key的值,成功傳回1表示所有的值都設定了,失敗傳回0表示沒有任何值被設定

msetnx key1 value1 ... keyN valueN 同上,但是不會覆寫已經存在的key

incr key 對key的值做加加操作,并傳回新的值。注意incr一個不是int的value會傳回錯誤,incr一個不存在的key,則設定key為1

decr key 同上,但是做的是減減操作,decr一個不存在key,則設定key為-1

incrby key integer 同incr,加指定值 ,key不存在時候會設定key,并認為原來的value是 0

decrby key integer 同decr,減指定值。decrby完全是為了可讀性,我們完全可以通過incrby一個負值來實作同樣效果,反之一樣。

append key value  給指定key的字元串值追加value,傳回新字元串值的長度。下面給個例子

redis&gt; set k hello

redis&gt; append k ,world

(integer) 11

redis&gt; get k

"hello,world"

substr key start end 傳回截取過的key的字元串值,注意并不修改key的值。下标是從0開始的,接着上面例子

redis&gt; substr k 0 8

"hello,wor"

"hello,world"

主從複制

redis主從複制配置和使用都非常簡單。通過主從複制可以允許多個slave server擁有和master server相同的資料庫副本。下面是關于redis主從複制的一些特點

1.master可以有多個slave

2.除了多個slave連到相同的master外,slave也可以連接配接其他slave形成圖狀結構

3.主從複制不會阻塞master。也就是說當一個或多個slave與master進行初次同步資料時,master可以繼續處理client發來的請求。相反slave在初次同步資料時則會阻塞不能處理client的請求。

4.主從複制可以用來提高系統的可伸縮性,我們可以用多個slave 專門用于client的讀請求,比如sort操作可以使用slave來處理。也可以用來做簡單的資料備援

5.可以在master禁用資料持久化,隻需要注釋掉master 配置檔案中的所有save配置,然後隻在slave上配置資料持久化。

下面介紹下主從複制的過程

當設定好slave伺服器後,slave會建立和master的連接配接,然後發送sync指令。無論是第一次同步建立的連接配接還是連接配接斷開後的重新連接配接,master都會啟動一個背景程序,将資料庫快照儲存到檔案中,同時master主程序會開始收集新的寫指令并緩存起來。背景程序完成寫檔案後,master就發送檔案給slave,slave将檔案儲存到磁盤上,然後加載到記憶體恢複資料庫快照到slave上。接着master就會把緩存的命 令轉發給slave。而且後續master收到的寫指令都會通過開始建立的連接配接發送給slave。從master到slave的同步資料的指令和從 client發送的指令使用相同的協定格式。當master和slave的連接配接斷開時slave可以自動重建立立連接配接。如果master同時收到多個 slave發來的同步連接配接指令,隻會使用啟動一個程序來寫資料庫鏡像,然後發送給所有slave。

主從複制特點:

1.master(主)可以擁有多個slave(從)

2.多個slave可以連接配接同一個master外,還可以連接配接到其他slave

3.主從複制不會阻塞master,在同步資料時,master可以繼續處理client請求

4.提高系統的伸縮性

5.可以在master禁用資料持久化,注釋掉master配置檔案中的所有save配置,隻需在slave上配置資料持久化

#當有一條Keys資料被改變是,900秒重新整理到disk一次

#save 900 1 

#當有10條Keys資料被改變時,300秒重新整理到disk一次

#save 300 10 

#當有1w條keys資料被改變時,60秒重新整理到disk一次

#save 60 10000 

主從複制過程:

當配置好slave後,slave與master建立連接配接,然後發送sync指令。無論是第一次連接配接還是重新連接配接,master都會啟動一個背景程序,将資料庫快照儲存到檔案中,同時master主程序會開始收集新的寫指令并緩存。背景程序完成寫檔案後,master就發送檔案給slave,slave将檔案儲存到硬碟上,再加載到記憶體中,接着master就會把緩存的指令轉發給slave,後續master将收到的寫指令發送給slave。如果 master同時收到多個slave發來的同步連接配接指令,master隻會啟動一個程序來寫資料庫鏡像,然後發送給所有的slave。

配置

Redis的主從複制功能非常強大,一個master可以擁有多個slave,而一個slave又可以擁有多個slave,如此下去,形成了強大的多級 伺服器叢集架構。下面我示範下怎樣在多台伺服器上進行Redis資料主從複制。這裡我假設有兩台伺服器,一台是Linux作業系統(區域網路 IP:192.168.3.159),一台是Linux作業系統(區域網路IP:192.168.3.169)此時我們要到用到linux ,這裡我們采用centOs5.4 ,redis采用redis-2.0.4。

這裡我使用1個master以及1個slave(master在一個Linux下,一個slave在一個Linux下,基本流程是

client -----whrite-----&gt;&gt;&gt;【Linux(master 192.168.3159:6379)】<&lt;&lt;--------------------slave----【Linux (slave 192.168.3.169:6381)】&lt;&lt;&lt;&lt;------read---------client

1.在master上修改redis.conf

#bind 192.168.3.159(可不設定) 

2.在slave上修改redis.conf

port 6381(slave上端口)

bind 192.168.3.169   

slaveof 192.168.3.159 6379 (設定master的Host以及Port)

3.啟動服務

首先啟動master

redis-server redis.conf 

然後啟動slave

檢視日志出現

tail -f redis.log

* Connecting to MASTER... 

[5374] 23 Aug 03:33:20 * Receiving 5479067bytes data dump from MASTER 

[5374]23 Aug 03:33:21 * MASTER &lt;-> SLAVE sync succeeded 

完整配置執行個體(關閉主從伺服器防火牆)

redis主從配置:

【master】

daemonize yes

pidfile /var/run/redis.pid

port 6379

timeout 300

loglevel verbose

logfile /usr/local/redis-2.2.12/var/log/redis.log

databases 16

save 300 10

save 60 10000

maxmemory

rdbcompression yes

dbfilename dump.rdb

dir /usr/local/redis-2.2.12/var/data

requirepass redis

appendonly no

appendfsync everysec

no-appendfsync-on-rewrite no

slowlog-log-slower-than 10000

slowlog-max-len 1024

vm-enabled no

vm-swap-file /tmp/redis.swap

vm-max-memory 0

vm-page-size 32

vm-pages 134217728

vm-max-threads 4

hash-max-zipmap-entries 512

hash-max-zipmap-value 64

list-max-ziplist-entries 512

list-max-ziplist-value 64

set-max-intset-entries 512

【slave】

save 60 10000

activerehashing yes

slaveof 192.168.1.159 6379 #主

複制測試 檢視master端日志:

[8930] 31 Jul 19:16:09 – Accepted 192.168.1.136:54774

[8930] 31 Jul 19:16:09 * Slave ask for synchronization

[8930] 31 Jul 19:16:09 * Starting BGSAVE for SYNC

[8930] 31 Jul 19:16:09 * Background saving started by pid 10782

[10782] 31 Jul 19:16:09 * DB saved on disk

[8930] 31 Jul 19:16:09 * Background saving terminated with success

[8930] 31 Jul 19:16:09 * Synchronization with slave succeeded

[8930] 31 Jul 19:16:14 – DB 0: 1 keys (0 volatile) in 4 slots HT.

[8930] 31 Jul 19:16:14 – 1 clients connected (1 slaves), 807320 bytes in use

檢視slave端日志:

[24398] 01 Aug 10:16:10 * Connecting to MASTER…

[24398] 01 Aug 10:16:10 * MASTER <-> SLAVE sync started: SYNC sent

[24398] 01 Aug 10:16:10 * MASTER <-> SLAVE sync: receiving 25 bytes from master

[24398] 01 Aug 10:16:10 * MASTER <-> SLAVE sync: Loading DB in memory

[24398] 01 Aug 10:16:10 * MASTER <-> SLAVE sync: Finished with success

[24398] 01 Aug 10:16:15 – DB 0: 1 keys (0 volatile) in 4 slots HT.

[24398] 01 Aug 10:16:15 – 1 clients connected (0 slaves), 798960 bytes in use

master 端操作:

redis 127.0.0.1:6379&gt; set k_m master

OK

slave

redis 127.0.0.1:6379&gt; get k_m

“master”

什麼是記憶體檔案系統了?就是作業系統把系統記憶體劃出一部分當作硬碟使用。你可以像操作磁盤那樣的操作記憶體。但效率遠遠比硬碟來的快多了。通俗叫做記憶體檔案系統,隻要伺服器不重起資料将一直都在。

redis-cli -p 6379 info 檢視狀态。

操作資料庫

插入資料

telnet 127.0.0.1 6379

127.0.0.1:6379&gt; set name wwl

設定一個key-value對

查詢資料

127.0.0.1:6379&gt; get name "wwl"

取出key所對應的value

删除鍵值

127.0.0.1:6379&gt; del name

删除這個key及對應的value

上一篇: HAProxy部署
下一篇: 實際部署