1. 程式人生 > >Redis 主從配置和參數詳解

Redis 主從配置和參數詳解

value ppi threads shu 如何 指令 支持 aof pac

安裝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,100,25,
# 哨兵將挑選優先級最小數字為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

Redis 主從配置和參數詳解