Redis 主從配置和引數詳解

pursuer.chen發表於2016-03-14

安裝redis

下載redis
wget http://download.redis.io/releases/redis-3.0.7.tar.gz

解壓redis
tar -xvf redis-3.0.7.tar.gz

安裝redis
cd redis-3.0.7
“有可能需要安裝gcc外掛:yum install -y gcc  ” 

make

“如果make有報錯,則執行,沒有報錯就不需要 make MALLOC
=libc ”

redis.conf相關引數

##Redis預設不是以守護程式的方式執行,可以通過該配置項修改,使用yes啟用守護程式

    daemonize no

##當Redis以守護程式方式執行時,Redis預設會把pid寫入/var/run/redis.pid檔案,可以通過pidfile指定

    pidfile /var/run/redis.pid

##指定Redis監聽埠,預設埠為6379 

port 6379
# TCP接收佇列長度,受/proc/sys/net/core/somaxconn和tcp_max_syn_backlog這兩個核心引數的影響
tcp-backlog 511

 ##繫結的主機地址

    bind 127.0.0.1

##當 客戶端閒置多長時間後關閉連線,如果指定為0,表示關閉該功能

timeout 300
# 如果非零,則設定SO_KEEPALIVE選項來向空閒連線的客戶端傳送ACK

tcp-keepalive 60

##指定日誌記錄級別,Redis總共支援四個級別:debug、verbose、notice、warning,預設為verbose
## debug (大量資訊,對開發/測試有用)
## verbose (很多精簡的有用資訊,但是不像debug等級那麼多)
## notice (適量的資訊,基本上是你生產環境中需要的)
## warning (只有很重要/嚴重的資訊會記錄下來)

    loglevel verbose

##日誌名

    logfile "./redis7003.log"


##設定資料庫的數量,可以使用SELECT <dbid>命令在連線上指定資料庫id

    databases 16

##持久化rdb檔案,指定在多長時間內,有多少次更新操作,就將資料同步到資料檔案,可以多個條件配合save <seconds> <changes>
#Redis預設配置檔案中提供了三個條件:

    save 900 1

    save 300 10

    save 60 10000

分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。

# 預設如果開啟RDB快照(至少一條save指令)並且最新的後臺儲存失敗,Redis將會停止接受寫操作
# 這將使使用者知道資料沒有正確的持久化到硬碟,否則可能沒人注意到並且造成一些災難

stop-writes-on-bgsave-error yes

##指定儲存至本地資料庫時是否壓縮資料,預設為yes,Redis採用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導致資料庫檔案變的巨大

    rdbcompression yes

###指定本地資料庫檔名,預設值為dump.rdb;除非非常要緊的資料否則儘量不要開啟資料持久化

    dbfilename dump.rdb

###指定本地資料庫存放目錄

    dir ./

##設定當本機為slav服務時,設定master服務的IP地址及埠,在Redis啟動時,它會自動從master進行資料同步

    slaveof <masterip> <masterport>

###當master服務設定了密碼保護時,slav服務連線master的密碼

    masterauth <master-password>

####設定Redis連線密碼,如果配置了連線密碼,客戶端在連線Redis時需要通過AUTH <password>命令提供密碼,預設關閉

    requirepass foobared
##你可以配置salve例項是否接受寫操作。可寫的slave例項可能對儲存臨時資料比較有用(因為寫入salve
##的資料在同master同步之後將很容易被刪除

slave-read-only yes

# 是否在slave套接字傳送SYNC之後禁用 TCP_NODELAY?
# 如果你選擇“yes”Redis將使用更少的TCP包和頻寬來向slaves傳送資料。但是這將使資料傳輸到slave
# 上有延遲,Linux核心的預設配置會達到40毫秒
# 如果你選擇了 "no" 資料傳輸到salve的延遲將會減少但要使用更多的頻寬

repl-disable-tcp-nodelay no

# slave的優先順序是一個整數展示在Redis的Info輸出中。如果master不再正常工作了,哨兵將用它來
# 選擇一個slave提升=升為master。
# 優先順序數字小的salve會優先考慮提升為master,所以例如有三個slave優先順序分別為10,10025,
# 哨兵將挑選優先順序最小數字為10的slave。
# 0作為一個特殊的優先順序,標識這個slave不能作為master,所以一個優先順序為0的slave永遠不會被
# 哨兵挑選提升為master

slave-priority 100

##設定同一時間最大客戶端連線數,預設無限制,Redis可以同時開啟的客戶端連線數為Redis程式可以開啟的最大檔案描述符數,如果設定 maxclients 0,表示不作限制。當客戶端連線數到達限制時,Redis會關閉新的連線並向客戶端返回max number of clients reached錯誤資訊

    maxclients 128

##指定Redis最大記憶體限制,Redis在啟動時會把資料載入到記憶體中,達到最大記憶體後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大記憶體設定,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放記憶體,Value會存放在swap區

    maxmemory <bytes>


##最大記憶體策略:如果達到記憶體限制了,Redis如何選擇刪除key。你可以在下面五個行為裡選:
# volatile-lru -> 根據LRU演算法刪除帶有過期時間的key。
# allkeys-lru -> 根據LRU演算法刪除任何key。
# volatile-random -> 根據過期設定來隨機刪除key, 具備過期時間的key。 
# allkeys->random -> 無差別隨機刪, 任何一個key。 
# volatile-ttl -> 根據最近過期時間來刪除(輔以TTL), 這是對於有過期時間的key 
# noeviction -> 誰也不刪,直接在寫操作時返回錯誤。
maxmemory-policy volatile-lru
##指定是否在每次更新操作後進行日誌記錄,Redis在預設情況下是非同步的把資料寫入磁碟,如果不開啟,可能會在斷電時導致一段時間內的資料丟失。因為 redis本身同步資料檔案是按上面save條件來同步的,所以有的資料會在一段時間內只存在於記憶體中。預設為no

    appendonly no

###指定操作日誌檔名,目錄為dir設定的目錄,預設為appendonly.aof

     appendfilename appendonly.aof

####指定更新日誌條件,共有3個可選值: 
    no:表示等作業系統進行資料快取同步到磁碟(快) 
    always:表示每次更新操作後手動呼叫fsync()將資料寫到磁碟(慢,安全) 
    everysec:表示每秒同步一次(折衷,預設值)

    appendfsync everysec

 

##指定是否啟用虛擬記憶體機制,預設值為no,簡單的介紹一下,VM機制將資料分頁存放,由Redis將訪問量較少的頁即冷資料swap到磁碟上,訪問多的頁面由磁碟自動換出到記憶體中(在後面的文章我會仔細分析Redis的VM機制)

     vm-enabled no

### 虛擬記憶體檔案路徑,預設值為/tmp/redis.swap,不可多個Redis例項共享

     vm-swap-file /tmp/redis.swap
# 如果AOF的同步策略設定成 "always" 或者 "everysec",並且後臺的儲存程式(後臺儲存或寫入AOF
# 日誌)會產生很多磁碟I/O開銷。某些Linux的配置下會使Redis因為 fsync()系統呼叫而阻塞很久。
# 注意,目前對這個情況還沒有完美修正,甚至不同執行緒的 fsync() 會阻塞我們同步的write(2)呼叫。
# 為了緩解這個問題,可以用下面這個選項。它可以在 BGSAVE 或 BGREWRITEAOF 處理時阻止主程式進行fsync()。
# 這就意味著如果有子程式在進行儲存操作,那麼Redis就處於"不可同步"的狀態。
# 這實際上是說,在最差的情況下可能會丟掉30秒鐘的日誌資料。(預設Linux設定)
# 如果你有延時問題把這個設定成"yes",否則就保持"no",這是儲存持久資料的最安全的方式。
no-appendfsync-on-rewrite yes

# 自動重寫AOF檔案
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# AOF檔案可能在尾部是不完整的(這跟system關閉有問題,尤其是mount ext4檔案系統時
# 沒有加上data=ordered選項。只會發生在os死時,redis自己死不會不完整)。
# 那redis重啟時load進記憶體的時候就有問題了。
# 發生的時候,可以選擇redis啟動報錯,並且通知使用者和寫日誌,或者load儘量多正常的資料。
# 如果aof-load-truncated是yes,會自動釋出一個log給客戶端然後load(預設)。
# 如果是no,使用者必須手動redis-check-aof修復AOF檔案才可以。
# 注意,如果在讀取的過程中,發現這個aof是損壞的,伺服器也是會退出的,
# 這個選項僅僅用於當伺服器嘗試讀取更多的資料但又找不到相應的資料時。
aof-load-truncated yes

# Lua 指令碼的最大執行時間,毫秒為單位
lua-time-limit 5000

# Redis慢查詢日誌可以記錄超過指定時間的查詢
slowlog-log-slower-than 10000

# 這個長度沒有限制。只是要主要會消耗記憶體。你可以通過 SLOWLOG RESET 來回收記憶體。
slowlog-max-len 128

# redis延時監控系統在執行時會取樣一些操作,以便收集可能導致延時的資料根源。
# 通過 LATENCY命令 可以列印一些圖樣和獲取一些報告,方便監控
# 這個系統僅僅記錄那個執行時間大於或等於預定時間(毫秒)的操作, 
# 這個預定時間是通過latency-monitor-threshold配置來指定的,
# 當設定為0時,這個監控系統處於停止狀態
latency-monitor-threshold 0

# Redis能通知 Pub/Sub 客戶端關於鍵空間發生的事件,預設關閉
notify-keyspace-events ""

# 當hash只有少量的entry時,並且最大的entry所佔空間沒有超過指定的限制時,會用一種節省記憶體的
# 資料結構來編碼。可以通過下面的指令來設定限制
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

# 與hash似,資料元素較少的list,可以用另一種方式來編碼從而節省大量空間。
# 這種特殊的方式只有在符合下面限制時才��以用
list-max-ziplist-entries 512
list-max-ziplist-value 64

# set有一種特殊編碼的情況:當set資料全是十進位制64位有符號整型數字構成的字串時。
# 下面這個配置項就是用來設定set使用這種編碼來節省記憶體的最大長度。
set-max-intset-entries 512

# 與hash和list相似,有序集合也可以用一種特別的編碼方式來節省大量空間。
# 這種編碼只適合長度和元素都小於下面限制的有序集合
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

# HyperLogLog稀疏結構表示位元組的限制。該限制包括
# 16個位元組的頭。當HyperLogLog使用稀疏結構表示
# 這些限制,它會被轉換成密度表示。
# 值大於16000是完全沒用的,因為在該點
# 密集的表示是更多的記憶體效率。
# 建議值是3000左右,以便具有的記憶體好處, 減少記憶體的消耗
hll-sparse-max-bytes 3000

# 啟用雜湊重新整理,每100個CPU毫秒會拿出1個毫秒來重新整理Redis的主雜湊表(頂級鍵值對映表)
activerehashing yes

# 客戶端的輸出緩衝區的限制,可用於強制斷開那些因為某種原因從伺服器讀取資料的速度不夠快的客戶端
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

# 預設情況下,“hz”的被設定為10。提高該值將在Redis空閒時使用更多的CPU時,但同時當有多個key
# 同時到期會使Redis的反應更靈敏,以及超時可以更精確地處理
hz 10

# 當一個子程式重寫AOF檔案時,如果啟用下面的選項,則檔案每生成32M資料會被同步
aof-rewrite-incremental-fsync yes


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

     vm-max-memory 0

Redis swap檔案分成了很多的page,一個物件可以儲存在多個page上面,但一個page上不能被多個物件共享,vm-page-size是要根據儲存的 資料大小來設定的,作者建議如果儲存很多小物件,page大小最好設定為32或者64bytes;如果儲存很大大物件,則可以使用更大的page,如果不 確定,就使用預設值

     vm-page-size 32

設定swap檔案中的page數量,由於頁表(一種表示頁面空閒或使用的bitmap)是在放在記憶體中的,,在磁碟上每8個pages將消耗1byte的記憶體。

     vm-pages 134217728

設定訪問swap檔案的執行緒數,最好不要超過機器的核數,如果設定為0,那麼所有對swap檔案的操作都是序列的,可能會造成比較長時間的延遲。預設值為4

     vm-max-threads 4

設定在向客戶端應答時,是否把較小的包合併為一個包傳送,預設為開啟

    glueoutputbuf yes

指定在超過一定的數量或者最大的元素超過某一臨界值時,採用一種特殊的雜湊演算法

    hash-max-zipmap-entries 64

    hash-max-zipmap-value 512

指定是否啟用重置雜湊,預設為開啟(後面在介紹Redis的雜湊演算法時具體介紹)

    activerehashing yes

指定包含其它的配置檔案,可以在同一主機上多個Redis例項之間使用同一份配置檔案,而同時各個例項又擁有自己的特定配置檔案

    include /path/to/local.conf

指定記憶體對映檔案路徑(windows版特有的一個檔案,注意將該檔案路徑配置在一個足夠空間的路徑下)
    heapdir ./rdb/
指定記憶體對映檔案大小,如果設定了最大記憶體那麼該檔案的大小=1.5*最大記憶體大小

      maxheap 1024000000

注意:引數說明中用紅色標誌的引數是比較重要的引數。

引數這部分參考:http://www.cnblogs.com/wenanry/archive/2012/02/26/2368398.html

配置redis主從

主:192.168.80.133:6379

從:192.168.80.133:6380

注意:確保防火牆允許埠,或者關閉防火牆。

主redis配置

cp -r redis-3.0.7 /usr/local/redis-6379

修改redis.conf檔案

cd /usr/local/redis-6379
mkdir run
vim redis.conf

其它的引數預設即可。

從redis配置

cp -r redis-3.0.7 /usr/local/redis-6380

修改redis.conf檔案

cd /usr/local/redis-6380
mkdir run
vim redis.conf

 

由於我的主從都是在本機,這裡填寫實際的主的ip 加 埠

其它的引數預設即可。

啟動redis

/usr/local/redis-6379/src/redis-server /usr/local/redis-6379/redis.conf

/usr/local/redis-6380/src/redis-server /usr/local/redis-6380/redis.conf

登入redis

登入主:
/usr/local/redis-6379/src/redis-cli -p 6379

登入從:
/usr/local/redis-6379/src/redis-cli -p 6380

測試資料

在主redis上執行

在從redis上執行

1.刪除從庫

登入從庫執行以下命令

slaveof no one

執行該命令後,從會中斷和主之間的關係,之前同步的資料不會被清空。

redis相關命令

1.檢視redis程式
ps -ef|grep redis
2.啟動redis
src/redis-server redis.conf 
3.關閉redis
src/redis-cli -p 6379 shutdown
4.登入redis
src/redis-cli -p 6379
5.退出登入redis
quit 
6.獲取redis資訊
info

配置redis系統啟動

vim /etc/init.d/redis-6379

程式碼來自網路

#!/bin/bash  
#  
# redis    Startup script for redis processes  
#  
# author: snowolf  
#  
# processname: redis  
  
redis_path="/usr/local/redis-6379/src/redis-server"  
redis_conf="/usr/local/redis-6379/redis.conf"  
redis_pid="/usr/local/redis-6379/run/redis.pid"  
  
# Source function library.  
. /etc/rc.d/init.d/functions  
  
[ -x $redis_path ] || exit 0  
  
RETVAL=0  
prog="redis"  
  
  
# Start daemons.  
start() {  
    if [ -e $redis_pid -a ! -z $redis_pid ];then  
        echo $prog" already running...."  
        exit 1  
    fi  
  
    echo -n $"Starting $prog "  
    # Single instance for all caches  
    $redis_path $redis_conf  
    RETVAL=$?  
    [ $RETVAL -eq 0 ] && {  
        touch /var/lock/subsys/$prog  
        success $"$prog"  
    }  
    echo  
    return $RETVAL  
}  
  
  
# Stop daemons.  
stop() {  
    echo -n $"Stopping $prog "  
    killproc -d 10 $redis_path  
    echo  
    [ $RETVAL = 0 ] && rm -f $redis_pid /var/lock/subsys/$prog  
  
    RETVAL=$?  
    return $RETVAL  
}  
  
  
# See how we were called.  
case "$1" in  
        start)  
            start  
            ;;  
        stop)  
            stop  
            ;;  
        status)  
            status $prog  
            RETVAL=$?  
            ;;  
        restart)  
            stop  
            start  
            ;;  
        condrestart)  
            if test "x`pidof redis`" != x; then  
                stop  
                start  
            fi  
            ;;  
        *)  
            echo $"Usage: $0 {start|stop|status|restart|condrestart}"  
            exit 1  
esac  
exit $RETVAL  

 賦予檔案可執行許可權

chmod +x /etc/init.d/redis-6379

該指令碼是通過殺程式的方式停止redis,適合一臺伺服器只部署一個redis。

加入啟動服務
chkconfig redis-6379 on
啟動redis

service redis-6379 start

 

 

 

 

備註:

    作者:pursuer.chen

    部落格:http://www.cnblogs.com/chenmh

本站點所有隨筆都是原創,歡迎大家轉載;但轉載時必須註明文章來源,且在文章開頭明顯處給明連結。

《歡迎交流討論》

相關文章