redis

redis 是一個用c語言編寫的高性能k/v存儲數據庫,支持持久存儲,是非關系型數據庫。redis默認使用TCP的6379端口監聽請求,單進程的模型。

配置文件

redis配置文件為/etc/redis.conf,下面我們挑出一些經常需要配置的參數來看看:
1.INCLUDES段
include :跟文件或者路徑,表示配置文件包含的子配置文件
2.NETWORK段,網絡相關設置
bind :跟ip地址,表示次服務通過哪個網卡監聽請求,寫0.0.0.0表示監聽本機所有地址,默認為127.0.0.1
protected-mode :保護模式,默認為yes,開啟后如果沒有設置requirepass項目和bind仍然是默認的127.0.0.1,就進入了保護模式,只能從本地進行連接
port :監聽的端口,默認為6379
tcp-backlog 511:后援隊列長度,此處默認為511,就是達到最大負載時,允許多少請求可以處于等待狀態
timeout 0:客戶端連接空閑的超時時長,就是客戶端多久沒有操作,服務端就會自動斷開,默認為0表示不斷開
tcp-keepalive 300:tcp的持久連接,用來實現復用的,三次握手建立連接后在多少時間之內可以一直使用這個連接。
3.SECURITY段,安全相關的配置
requirepass :設置密碼認證,默認注釋,設置密碼直接跟在后邊就行,不過這個密碼是明文的,所以要注意配置文件不能被不想關的人讀取
rename-command CONFIG "":用來給命令設置別名的,CONFIG命令可以直接設置各項參數,可以查看,所以為了安全可以將命令設置為別的名字
4.LIMITS段,設置限制
maxclients 10000:最大并發連接
maxmemory <bytes>:最大使用的內存空間,不限制就默認能用多少用多少
maxmemory-policy noeviction:內存空間滿時的處理策略,有以下幾種:

  • volatile-lru:在擁有過期時間的鍵中,使用LRU方式淘汰
  • allkeys-lru:全部鍵使用LRU方式淘汰
  • volatile-random:擁有過期時間的鍵中隨機淘汰
  • allkeys-random:全部鍵隨機淘汰
  • volatile-ttl:按生命周期所剩時間進行淘汰
  • noeviction:不淘汰,要將redis作為存儲時可以使用這一項,做緩存時別用這一項
    maxmemory-samples 5:每一批選出幾個樣本,再去按照上面的策略進行淘汰,默認為5

此外,redis參數支持運行時修改,使用CONFIG命令可以在交互界面中修改參數:
1.CONFIG GET:后邊跟參數名,可以獲取參數當前的設置信息
2.CONFIG SET:后邊跟參數名=值,設定參數的值
3.REWRITE:將設定成功的參數同步到配置文件中,如果之前這個參數有值,會覆蓋之前的值
4.RESET STAT:重置計數器

redis持久機制

redis是一種內存型數據庫,而他支持的持久存儲是通過將數據備份到磁盤上的方式實現的,這個存儲方式有兩種:
1.RDB方式:就是snapshotting(快照)的方式,這種方式是redis的默認機制,特點是高效但數據容易丟失。在程序交互界面中使用兩個命令可以實現這個種機制

  • SAVE命令:主進程往磁盤中寫入快照,此時redis服務由于主進程被占用,其他什么事都做不了了
  • BGSAVE命令:開子進程在后臺執行寫入快照,主程序能繼續提供服務

下面是配置文件中對應這種方式的配置項,放在SNAPSHOTTING段中
save 900 1
save 300 10
save 60 10000:這三段的意思就是在多久的時間內,變化的鍵達到多少次就執行快照,第一個參數為時間,第二個參數為次數,用這三段即達到長時間變化少時快照,也能達到短時間內變化量很大時去快照的效果
stop-writes-on-bgsave-error yes:快照失敗時拒絕寫入,與其丟失數據,不如先拒絕提供服務的好,yes為開啟
rdbcompression yes:快照要不要壓縮,yes為壓縮,這個就看時磁盤空間開銷大還是cpu開銷大了,視情況而定
rdbchecksum yes:快照做完要不要校驗,這個還是有必要的
dbfilename dump.rdb:快照名字,默認為dump.rdb
dir /var/lib/redis:快照存放路徑,默認為/var/lib/redis

2.AOF方式:就是用追加的方式,類似于mysql的二進制日志方式,BGREWRITEAOF命令為執行AOF方式的備份,這個方式的機制為AOF文件重寫,他會直接讀取內存,將多次執行的命令轉換為一個簡單實現結果的命令,再去存入磁盤,比如讓一個數自增1000次,挺麻煩,而結果卻是一個簡單的數字,這時就將這個自增1000次的指令,重寫成直接生成這個數字的命令,在重放時會大大縮短執行時間。
下面為AOF的相關配置,在配置文件中的APPEND ONLY MODE段
appendonly no:AOF功能默認時關閉的,要使用時改為yes即可
appendfilename "appendonly.aof":快照名,存放的位置是在SNAPSHOTTING段中的dir定義的
appendfsync always|everysec|no:每次執行追加的時間,always表示有改變就去同步到磁盤,everysec表示每秒鐘保存一次,no表示內核決定什么時候保存
no-appendfsync-on-rewrite no:在rewrite時不同步,no為同步,yes為不同步,同步會增加寫入操作,因為rewrite完之后還得再次去同步,但是不同步萬一數據丟失了就不太好了,所以為了數據安全還是最好將這項目設定為no
auto-aof-rewrite-percentage 100:100表示百分之百,就是變化量達到元數據的百分之百時自動同步
auto-aof-rewrite-min-size 64mb:上面這個設定有個弊端就是當數據量很小時候變化量很容易達到100,所以同步的頻率會很高,但是沒有這個必要,所以這條加個限定就是當數據量小于64m時不去同步,兩個條件一起滿足才會去同步

redis的主從

redis也可以像mysql一樣實現主從,過程相對于Mysql來說更加簡單,步驟如下:
1.環境:

  • 時間同步,關閉selinux和firewalld
  • 主節點:172.16.200.108,使用centos7.3系統,redis-3.2.3
  • 從節點1:172.16.200.109,其他同上
  • 從節點2:172.16.200.120,同上
  • 從節點3:172.16.200.107,同上
    2.在主節點上設置認證
[root@localhost ~]# vim /etc/redis.conf
bind 0.0.0.0
[root@localhost ~]# service redis start
[root@localhost ~]# redis-cli
127.0.0.1:6379> CONFIG SET requirepass "123"
127.0.0.1:6379> CONFIG REWRITE

3.在幾個從節點上添加主節點

[root@localhost ~]# vim /etc/redis.conf
bind 0.0.0.0
[root@localhost ~]# service redis start
[root@localhost ~]# redis-cli
127.0.0.1:6379> CONFIG SET masterauth 123
127.0.0.1:6379> CONFIG REWRITE
OK

4.驗證
在主節點上執行info replication命令,查看復制集群狀態

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:3
slave0:ip=172.16.200.107,port=6379,state=online,offset=365,lag=1
slave0:ip=172.16.200.120,port=6379,state=online,offset=365,lag=1
slave1:ip=172.16.200.109,port=6379,state=online,offset=365,lag=1
master_repl_offset:365
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:364

可以看到,此節點為主,三個從節點的信息都顯示的很清楚,證明配置成功了。
我們來看下配置文件中關于主從的配置,在REPLICATION段中
slave-serve-stale-data yes:表示當主節點宕機時,從節點的數據還能不能繼續提供服務
slave-read-only yes:從節點只讀
repl-diskless-sync no:是否做基于磁盤的同步,yes為無磁盤復制,內存中將數據構建好就直接可以同步給從了,不需要像保存到磁盤中
repl-diskless-sync-delay 5:延遲5秒湊夠一波數據后在發送給從
slave-priority 100:表示當前從節點的優先級,這個優先級用于主節點宕機時,對比別的從節點,誰的優先級高誰就成為主節點,優先級數字越小越高,0表示不能當主節點。
min-slaves-to-write 3:至少有三個從節點在線才允許主節點寫入
min-slaves-max-lag 10:落后10秒的從節點不算做一個在線的從節點,對應上面這條配置,這兩條默認是注釋的,所以不必在意從節點會少于3個
slave-announce-ip 5.5.5.5和slave-announce-port 1234:表示集群中向別的節點發送數據時候使用的ip和端口,這兩條默認是注釋的,所以系統自動選擇使用哪個ip和端口。

redis高可用

redis主節點高可用服務有自帶的,叫做redis-sentinel,他的配置文件為/etc/redis-sentinel.conf ,這個配置文件會根據集群的環境自動修改,不過一些參數還是要配置的。當主節點宕機時,會自動我們需要在每個節點上配置好,然后啟用redis-sentinel服務。
步驟
1.環境,還是剛才的主從環境
2.在每個節點上配置/etc/redis-sentinel.conf,大致需要配置的選項都寫在了下邊:

  • bind 0.0.0.0 :這個默認沒有,但是不寫的話會自動啟用安全機制,限制互相之間的通信,所以將他寫在prot選項下面就行,這里就奔放的寫0.0.0.0了
  • sentinel monitor mymaster 172.16.200.108 6379 2 :設置監控的集群名字叫mymaster,然后主節點的ip和端口,2表示有幾個從節點同意一個從節點可以成為主節點,這個節點才能成功成為主節點。
  • sentinel auth-pass mymaster 123 :設置監控集群的密碼
  • sentinel down-after-milliseconds mymaster 50 :主觀down,就是這個節點多久沒有收到一個另一個節點的消息,就認為他宕了
  • sentinel parallel-syncs mymaster 1:并行同步的從節點個數,設置高了
  • sentinel failover-timeout mymaster 180000:故障轉移多少時間沒成功,就去開始下一輪轉移
  • sentinel notification-script <master-name> <script-path>:通知腳本設置,當有節點宕掉時,通過什么方式通知管理員,可以時郵件短信等方式,這里就不設置了
  • logfile /var/log/redis/sentinel.log:日志位置
    3.每個節點都啟動redis-sentinel
[root@localhost ~]# service redis-sentinel start
[root@localhost ~]# ss -tnl
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port           
   LISTEN     0      128             *:26379                       *:*                  
LISTEN     0      128     127.0.0.1:6379                        *:*    

此時,我們看到redis的6379端口和sentinel的26379端口都已經啟動了。
4.驗證
我們可以使用redis-cli -h 26379 去連上sentinel管理端口去查看當前的信息,有如下幾個命令:
SENTINEL masters:查看當前主節點信息
SENTINEL slaves <MASTER_NAME>:查看當前集群名稱中從節點的信息
SENTINEL failover <MASTER_NAME>:手動切換集群的主節點
SENTINEL get-master-addr-by-name <MASTER_NAME>:
所以我們從主節點登陸上去驗證以下:

[root@localhost etc]# redis-cli -p 26379
127.0.0.1:26379> sentinel masters
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "172.16.200.108"
    5) "port"
    6) "6379"
...

從顯示信息可以看出來,現在只有一個集群(因為只有一個1))當前的主節點為172.16.200.108,集群名字叫做mymaster,還有很多信息這里就不顯示了
查看從節點信息:

127.0.0.1:26379> sentinel slaves mymaster
1)  1) "name"
    2) "172.16.200.120:6379"
    3) "ip"
    4) "172.16.200.120"
...
2)  1) "name"
    2) "172.16.200.109:6379"
    3) "ip"
    4) "172.16.200.109"

可以看到當前從節點有三個,各自的信息都列了出來
我們還可以手動切換主節點

127.0.0.1:26379> sentinel failover mymaster
OK
127.0.0.1:26379> sentinel masters
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "172.16.200.109"
    5) "port"
    6) "6379"
...
127.0.0.1:26379> sentinel slaves mymaster
1)  1) "name"
    2) "172.16.200.108:6379"
    3) "ip"
    4) "172.16.200.108"

切換完成后我們看到當前的主節點變成172.16.200.109了,而之前的主節點變為從節點了。
5.模擬故障
當前的主節點為172.16.200.109,我們將之上的redis服務手動關閉,然后查看高可用系統的處理情況:
在172.16.200.109上,關閉redis

[root@localhost ~]# service redis stop

然后查看當前集群主節點

127.0.0.1:26379> sentinel masters
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "172.16.200.107"

我們看到主節點已經變成200.107了,再次重啟手動宕掉的節點,查看從節點

127.0.0.1:26379> sentinel slaves mymaster
1)  1) "name"
    2) "172.16.200.109:6379"
    3) "ip"
    4) "172.16.200.109"
    5) "port"
    6) "6379"
    7) "runid"
...

看到之前宕機的109節點上線后變為從節點繼續運行了,工作一切正常,實驗成功!@=

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,165評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,595評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,633評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,435評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,943評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,175評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,713評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,599評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,788評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,034評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,412評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,664評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,408評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,747評論 2 370

推薦閱讀更多精彩內容

  • 1.1 資料 ,最好的入門小冊子,可以先于一切文檔之前看,免費。 作者Antirez的博客,Antirez維護的R...
    JefferyLcm閱讀 17,083評論 1 51
  • redis簡介 redis單純程模型,支持主從模式,提高可用性,是一個開源項目,經常用來當一個數據結構服務器。其是...
    魏鎮坪閱讀 60,568評論 2 4
  • 一.redis介紹 (1)概念:屬于非關系型存儲數據庫——基于kv(鍵值存儲)的開源的內存存儲,數據庫結構存儲。經...
    楠人幫閱讀 735評論 0 6
  • 本文將從Redis的基本特性入手,通過講述Redis的數據結構和主要命令對Redis的基本能力進行直觀介紹。之后概...
    kelgon閱讀 61,208評論 23 625
  • 小說開始,許三觀以虎頭虎腦涉世未深的形象展開,從那兩位賣血的老手以為誰能稀釋血,可以多點血狂灌水,似乎看到三位的結...
    思享窩閱讀 418評論 0 0