A. linux redis 怎麼設置集群
redis.conf 配置文件說明
daemonize no --是否把redis-server啟動在後台,默認是「否」。若改成yes
pidfile /var/run/redis.pid --當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,可以通過pidfile指定
prot 6379 --指定Redis監聽埠,默認埠為6379
bind 10.252.1.14 ---綁定的主機地址
timeout 0 ---當 客戶端閑置多長時間後關閉連接,如果指定為0,表示關閉該功能
loglevel notice ---指定日誌記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認為verbose
logfile /mnt/redis/log/redis.log --日誌記錄方式,默認為標准輸出,如果配置Redis為守護進程方式運行,而這里又配置為日誌記錄方式為標准輸出,則日誌將會發送給/dev/null
databases 16 設置資料庫的數量,默認資料庫為0,可以使用SELECT <dbid>命令在連接上指定資料庫id
save 900 1 指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合
Redis默認配置文件中提供了三個條件:
save 900 1
save 300 10
save 60 10000
分別表示900秒(15分鍾)內有1個更改,300秒(5分鍾)內有10個更改以及60秒內有10000個更改
rdbcompression yes --指定存儲至本地資料庫時是否壓縮數據,默認為yes,Redis採用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導致資料庫文件變的巨大
dbfilename mp.rdb --指定本地資料庫文件名,默認值為mp.rdb
dir /mnt/redis/data/ --指定本地資料庫存放目錄
slaveof <masterip> <masterport> -- 設置當本機為slav服務時,設置master服務的IP地址及埠,在Redis啟動時,它會自動從master進行數據同步
masterauth <master-password> --當master服務設置了密碼保護時,slav服務連接master的密碼
requirepass foobared --設置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時需要通過AUTH <password>命令提供密碼,默認關閉
maxclients 128 --- 設置同一時間最大客戶端連接數,默認無限制
maxmemory <bytes> ---指定Redis最大內存限制,Redis在啟動時會把數據載入到內存中,達到最大內存後,Redis會先嘗試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大內存設置,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放內存,Value會存放在swap區
appendonly no --指定是否在每次更新操作後進行日誌記錄,Redis在默認情況下是非同步的把數據寫入磁碟,如果不開啟,可能會在斷電時導致一段時間內的數據丟失。因為 redis本身同步數據文件是按上面save條件來同步的,所以有的數據會在一段時間內只存在於內存中。默認為no
appendfilename appendonly.aof ---指定更新日誌文件名,默認為appendonly.aof
appendfsync everysec ---指定更新日誌條件,共有3個可選值: no:表示等操作系統進行數據緩存同步到磁碟(快) . always:表示每次更新操作後手動調用fsync()將數據寫到磁碟(慢,安全). everysec:表示每秒同步一次(折衷,默認值)
vm-enabled no ---指定是否啟用虛擬內存機制,默認值為no,簡單的介紹一下,VM機制將數據分頁存放,由Redis將訪問量較少的頁即冷數據swap到磁碟上,訪問多的頁面由磁碟自動換出到內存中(在後面的文章我會仔細分析Redis的VM機制)
vm-swap-file /tmp/redis.swap ---虛擬內存文件路徑,默認值為/tmp/redis.swap,不可多個Redis實例共享
vm-max-memory 0 將所有大於vm-max-memory的數據存入虛擬內存,無論vm-max-memory設置多小,所有索引數據都是內存存儲的(Redis的索引數據 就是keys),也就是說,當vm-max-memory設置為0的時候,其實是所有value都存在於磁碟。默認值為0
vm-page-size 32 ---Redis swap文件分成了很多的page,一個對象可以保存在多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據存儲的 數據大小來設定的,作者建議如果存儲很多小對象,page大小最好設置為32或者64bytes;如果存儲很大大對象,則可以使用更大的page,如果不 確定,就使用默認值
vm-pages 134217728 ---設置swap文件中的page數量,由於頁表(一種表示頁面空閑或使用的bitmap)是在放在內存中的,,在磁碟上每8個pages將消耗1byte的內存。
vm-max-threads 4 ---設置訪問swap文件的線程數,最好不要超過機器的核數,如果設置為0,那麼所有對swap文件的操作都是串列的,可能會造成比較長時間的延遲。默認值為4
glueoutputbuf yes ---設置在向客戶端應答時,是否把較小的包合並為一個包發送,默認為開啟
hash-max-zipmap-entries 64 ---指定在超過一定的數量或者最大的元素超過某一臨界值時,採用一種特殊的哈希演算法
hash-max-zipmap-value 512 ---指定在超過一定的數量或者最大的元素超過某一臨界值時,採用一種特殊的哈希演算法
activerehashing yes ---指定是否激活重置哈希,默認為開啟(後面在介紹Redis的哈希演算法時具體介紹)
include /path/to/local.conf ---指定包含其它的配置文件,可以在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有自己的特定配置文件
主伺服器配置
mkdir /mnt/redis/redisDB
mkdir /mnt/redis/redisLog
vi /etc/redis/redis.conf
dbfilename /mnt/redisDB/mp.rdb --修改磁碟上保存資料庫文件的位置
loglevel warning --修改日誌級別
logfile /mnt/redis/redisLog/redis.log --修改日誌文件的位置
從機配置
cp redis.conf /etc/redis_slave.conf
vim redis_slave.conf
修改其中的一行
配置master的ip地址和redis-server的埠。
slaveof <10.45.39.39> <6379> --設置主從伺服器的主伺服器的地址和埠
daemonize no --是否把redis-server啟動在後台,默認是「否」。若改成yes,會生成一個pid文件。
主從測試
主機: redis-server /etc/redis.conf
從機: redis-server /etc/redis_slave.conf
3.1 測試
在主機上啟動redis客戶端:
ssh 192.168.1.1
redis-cli
>set k1 v1
>get k1
"v1"
.登陸從機,並在從機上啟動客戶端:
ssh 192.168.1.2
redis-cli
>get k1
"v1"
可以看到redis已經把數據同步過來了。
B. linux上怎麼配置redis的aof持久化
############################## APPEND ONLY MODE ###############################
# 是否開啟AOF,默認關閉()
appendonly yes
# 指定 AOF 文件名
appendfilename appendonly.aof
# Redis支持三種不同的刷寫模式:
# appendfsync always #每次收到寫命令就立即強制寫入磁碟,是最有保證的完全的持久化,但速度也是最慢的,一般不推薦使用。
appendfsync everysec #每秒鍾強制寫入磁碟一次,在性能和持久化方面做了很好的折中,是受推薦的方式。
# appendfsync no #完全依賴OS的寫入,一般為30秒左右一次,性能最好但是持久化最沒有保證,不被推薦。
#在日誌重寫時,不進行命令追加操作,而只是將其放在緩沖區里,避免與命令的追加造成DISK IO上的沖突。
#設置為yes表示rewrite期間對新寫操作不fsync,暫時存在內存中,等rewrite完成後再寫入,默認為no
no-appendfsync-on-rewrite no
#當前AOF文件大小是上次日誌重寫得到AOF文件大小的二倍時,自動啟動新的日誌重寫過程。
auto-aof-rewrite-percentage 100
#當前AOF文件啟動新的日誌重寫過程的最小值,避免剛剛啟動Reids時由於文件尺寸較小導致頻繁的重寫。
auto-aof-rewrite-min-size 64mb
C. redis中的數據佔用內存大小分析
如今越來越來的系統中使用 redis 作為緩存系統,但是隨著用戶量的增長,業務數據不斷增多,redis伺服器的內存空間有可能會到瓶頸了,及時觀察redis中的各種鍵內存佔用多少,會方便我們評估何時升級redis伺服器規格,以及對於是否需要進行程序優化來設計合理的存儲結構都會有很大幫助,下面給大家介紹兩款工具 rdr 和 redis-rdb-tools ,可以很好的滿足我們的需要
詳細使用參考官方倉庫:https://github.com/xueqiu/rdr
rdr提供了linux/OSX/Windows下的可執行文件,直接點擊下載,我這里演示Windows下的使用方式
下載下來後存儲到d:/dev路徑下
1.首先要去redis伺服器端將rdb文件復制到本地,為了方便,我將rdb文件放到了rdr工具所在目錄
這里再說下redis rdb文件該怎麼找到,通過查看redis伺服器配置文件 redis.conf ,搜索 dbfilename 可以快速定位到該配置,按照路徑就可以找到redis rdb備份文件了
2.在rdr工具所在的路徑下打開命令行窗口,執行指令
可以看到指令執行成功後,在本地啟動了server,監聽埠8080
3.打開瀏覽器,訪問http://localhost:8080/,能看到詳細的內存佔用數據報告,包括鍵數量、不同的數據類型、元素計數等
不過通過網頁版的數據報告中有個小問題,對於redis中的不同資料庫沒有明顯的區分展示~,混在一起,不是太清晰
詳細使用參考官方倉庫:https://github.com/sripathikrishnan/redis-rdb-tools/
1.安裝python環境,我這里安裝了python2.7.15
2.通過pip安裝redis-rdb-tools
我這里python-lzf庫沒有安裝成功,不過不影響實際使用,這個庫是為了加速rdb文件解析速度~
3.安裝完成後就可以在命令行中使用了,輸入指令生成內存報告文件
等待一段時間,命令阻塞執行完成後,就會在-f參數指定的路徑下生成對應的文件
用excel打開生成的csv文件,可以看到詳細的統計結果,包含了所有資料庫下所有key的內存佔用情況~
redis-rdb-tools中還帶了一個很有用的命令,能幫助我們直接查詢單個key的內存佔用情況,命令格式如下
執行測試下效果,可以看到命令執行完成後,直接回顯出指定key對應的內存佔用情況了
注意該操作在生產環境下慎用,視key大小情況再行決定是否執行,有可能會阻塞執行很長時間才能計算出結果~
D. Linux下安裝配置redis詳細教程,並配置哨兵模式
redis版本為redis-3.2.12,使用工具將安裝包上傳到data目錄。
在data目錄下創建文件夾redis,將redis安裝在此目錄。
第一步:解壓。
第二步:安裝,PREFIX=/data/redis用來設置安裝目錄。
到此,redis已經安裝完成,剩下就是配置和啟動服務。
進入redis目錄, 創建配置文件conf、日誌logs、資料庫mp、進程號pid四個目錄,用來存放對應的文件,這四個目錄也可以存放在其他文件夾,只要與配置文件中的配置一致即可,否則在啟動服務時會報錯。 其中bin目錄就是redis安裝成功後的一些命令文件。
redis服務配置一主二從,哨兵模式。注意:如果在實際開發中用不到哨兵模式,redis服務配置一主一從即可。
主Redis配置:redis_6379.conf
從Redis配置,redis_6380.conf和redis_6381.conf,與主Redis配置基本上一樣,不一樣的地方在於 埠、資料庫、日誌、pid文件名稱 ,都以6380或6381為標志, 最重要的地方是建立主從關系和同步驗證。
注意: 對只使用redis服務 ,只需要在主Redis裡面配置requirepass,在從Redis裡面配置masterauth,密碼保持一致,密碼盡可能復雜,以免被攻擊破解。
注意: 對只使用redis服務 ,如果從Redis也有必要加入訪問驗證,也可以設置requirepass,而且密碼可以與主Redis密碼不同。
將配置文件放置到/data/redis/conf目錄下,然後就可以啟動服務了。
啟動服務要按照主從順序依次啟動。
查看服務啟動情況:
也可以通過查看日誌文件來確認服務是否正常啟動。
通過客戶端登錄Redis驗證數據同步情況:
主Redis登錄驗證,設置數據:
從Redis登錄,獲取數據:從Redis並沒有設置密碼,所以無需驗證就可以操作。
配置哨兵模式:
Redis Sentinel集群通常由3到5個節點組成,如果個別節點掛了,集群還可以正常運作。Sentinel負責監控Redis集群的 健康 情況。
如果主Redis掛掉,Sentinel集群會通過投票選擇一個新的主Redis。 當原來的主Redis恢復時,它會被當做新的主Redis的從Redis重新加入Redis集群。
設置連接master和slave的密碼,需要注意的是sentinel不能分別為master和slave設置不同的密碼,因此master和slave的密碼必須設置相同。也就是說主Redis和從Redis都必須設置requirepass和masterauth,而且密碼必須相同。
sentinel.conf配置信息:
將該配置文件放置到/data/redis/conf目錄下,啟動sentinel服務:
驗證sentinel是否起作用,可以手工shutdown掉主Redis。
這時從Redis想要訪問主Redis同步數據就會提示錯誤信息:
sentinel在監測到主Redis宕機之後,通過選舉,將一個從Redis選定為新的主Redis。通過查看sentinel日誌可以發現,選定6380為新的主Redis,同時將另外兩個Redis作為從Redis。
注意:選定6380為主Redis後,所有的配置文件都會被修改,主要是重新建立主從關系。
6379會新增:slaveof 127.0.0.1 6380
6380會刪掉:slaveof 127.0.0.1 6379
6381會修改:slaveof 127.0.0.1 6380
由於6379服務已經關掉,所以雖然sentinel將6379作為6380的從服務,但是沒有真正的建立。
重新啟動6379服務,這時sentinel會重建建立一次主從關系:
E. 如何測試linux redis連接池
redis在mp數據的時候,會fork出一個子進程,理論上child進程所佔用的內存和parent是一樣的,比如parent 佔用的內存為8G,這個時候也要同樣分配8G的內存給child,如果內存無法負擔,往往會造成redis伺服器的down機或者IO負載過高,效率下 降。
所以這里比較優化的內存分配策略應該設置為 1(表示內核允許分配所有的物理內存,而不管當前的內存狀態如何)!