目錄
13.1 redis概述
13.2 安裝redis
13.3 redis基本操作
13.4 redis持久化
13.5 redis主從架構(實作讀寫分離)
13.6 使用sentinel實作主從架構高可用
13.1 redis概述
13.1.1 redis是什麼:
redis的出現時間并不長,是NoSQL中的一種,基于鍵-值型的存儲,與memcache類似,但是memcache中隻是記憶體的緩存,而redis不僅是記憶體中的緩存,還提供持久存儲,在2009年第一次釋出redis
Redis 全稱(REmote DIctionary Server)遠端字典伺服器,而這個字典伺服器從本質上來講,主要是提供資料結構的遠端存儲功能的,可以了解為redis是一個進階的K-V存儲,和資料結構存儲,因為redis除了能夠存儲K-V這種簡單的資料之外,還能夠存儲,清單、字典、hash表、等對應的資料結構
在性能上redis不比memcache差,因為redis整個運作通通都是在記憶體中實作的,它的所有的資料集都是儲存在記憶體中的,記憶體中的資料會周期性的寫入到磁盤上,以實作資料的持久功能,而這種寫磁盤并不是用于通路,而僅是備援功能,是以redis所有功能都在記憶體中完成,因為此性能也是可想而知
redis與mamcache不同之處在于redis有一個周期性的将資料儲存到磁盤上的機制,而且不隻一種,有兩種機制,這也是redis持久化的一種實作,另外與mamcache有所差別的是,redis是單線程伺服器,隻有一個線程來響應所有的請求
redis支援主從模式,但是redis的主從模式預設就有一個sentinel工具,進而實作主從架構的高可用,也就是說,redis能夠借助于sentinel工具來監控主從節點,當主節點發生故障時,會自己提升另外一個從節點成為新的主節點
在redis 3.0版本釋出,開始支援redis叢集,進而可以實作分布式,可以将使用者的請求分散至多個不同節點
13.1.2 redis所支援的資料類型
支援存儲的資料類型有、String(字元串,包含整數), List(清單), Hash(關聯數組), Sets(集合), Sorted Sets(有序集合), Bitmaps(位圖), HyperLoglog
13.1.3 redis性能評估:
1、100萬較小的鍵存儲字元串,大概消耗100M記憶體
2、由于redis是單線程,如果伺服器主機上有多個CPU,隻有一個能夠使用,但并不意味着CPU會成為瓶頸,因為redis是一個比較簡單的K-V資料存儲,CPU通常不會成為瓶頸的
3、在常見的linux伺服器上,500K(50萬)的并發,隻需要一秒鐘處理,如果主機硬體較好的情況下,每秒鐘可以達到上百萬的并發
13.1.4 Redis與Memcache對比:
Memcache是一個分布式的記憶體對象緩存系統
而redis是可以實作持久存儲
Memcache是一個LRU的緩存
redis支援更多的資料類型
Memcache是多線程的
redis是單線程的
二者性能幾乎不相上下,實際上redis會受到硬碟持久化的影響,但是性能仍然保持在與Memcache不相上下,是非常了不起的
13.1.5 Redis的優勢:
豐富的(資料形态)操作
String(字元串,包含整數), List(清單), Hash(關聯數組), Sets(集合), Sorted Sets(有序集合), Bitmaps(位圖), HyperLoglog
内建Replication和culster(自身支援複制及叢集功能)
支援就地更新(in-place update)操作,直接可以在記憶體中完成更新操作
支援持久化(磁盤)
避免雪崩效應,萬一出現雪崩效應,所有的資料都無法恢複,但redis由于有持久性的資料,可以實作恢複
13.1.6 Memcached的優勢:
多線程
善用多核CPU
更少的阻塞操作
更少的記憶體開銷
更少的記憶體配置設定壓力
可能有更少的記憶體碎片
13.2 安裝redis
13.2.1 源碼包安裝redis:
63 ~]# tar xf redis-3.2.5.tar.gz -C /usr/local/
63 ~]# cd /usr/local/redis-3.2.5
63 redis-3.2.5]# make
63 redis-3.2.5]# make install
redis執行檔案位于/PATH/TO/INSTALL_DIR/src
63 redis-3.2.5]# vim /usr/lib/systemd/system/redis.service //手動添加服務啟動檔案,寫上以下内容
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/usr/local/redis-3.2.5/src/redis-server /usr/local/redis-3.2.5/redis.conf --supervised systemd
ExecStop=/usr/libexec/redis-shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
# useradd -r redis -s /sbin/nologin //建立redis使用者
# systemctl daemon-reload //重新加加載Unit檔案
# systemctl start redis //啟動redis
上傳redis-shutdown腳本到伺服器上
63 redis-3.2.5]# vim /usr/libexec/redis-shutdown
修改:
REDIS_CLI=/usr/bin/redis-cli
改為:
REDIS_CLI=/usr/local/redis-3.2.5/src/redis-cli
# chmod +x /usr/libexec/redis-shutdown
# systemctl stop redis
13.2.2 使用RPM包安裝redis:RHEL7
上傳redis的PRM包到主機
63 ~]# yum -y localinstall redis-4.0.6-1.el7.remi.x86_64.rpm
注意:使用RPM包安裝redis會依賴jemalloc程式包,jemalloc是記憶體配置設定工具,此包在epel源中
13.3 redis基本操作
13.3.1 redis配置檔案:
63 ~]# vim /etc/redis.conf
daemonize no //表示redis并不會運作成為一個守護程序,如果需要運作成為一個守護程序,則把no,改為yes即可,如果使用服務腳本啟動,即使daemonize為no,也會運作為一個守護程序
port 6379 //監聽端口:6379/tcp
tcp-backlog 511 //指定tcp-backlog的長度
說明:任何的tcp服務都有可能使用到tcp-backlog功能,backlog是一個等待隊列,比如:redis的并發很高時,redis有可能運作不過來時,就連接配接本地緩存等隊列都滿了以後,就會使用額外的存儲地方,把新來的請求暫存下來,而這個位置則稱為backlog
bind 127.0.0.1 //監聽的位址,預設監聽在127.0.0.1位址上,可以指定為0.0.0.0位址,或某個特定的位址,或可以指定多個,使用空格分隔即可
# unixsocket /tmp/redis.sock //指定使用sock檔案通信及sock檔案位置,如果服務端和客戶都在同一台主機上,建議打開此項,基于sock方式通信可以直接在記憶體中交換,資料不用再經過TCP/TP協定棧進行封裝、拆封
# unixsocketperm 700 //定義sock檔案的通路權限
timeout 0 //表示當用戶端連接配接成功後,空閑(非活躍、或沒有任何資料互動)多長時間則連接配接逾時,0表示不啟用此功能
tcp-keepalive 0 //定義是否啟用tcp-keepalive功能
loglevel notice //定義日志級别
logfile /var/log/redis/redis.log //定義日志檔案
databases 16 //定義redis預設有多少個databases,但是在分布式中,隻能使用一個
#### SNAPSHOTTING #### //定義RDB的持久化相關
save <seconds> <changes> //使用save指令,并指定每隔多少秒,如果發生多大變化,進行存儲
示例:
save 900 1 //表示在900秒(15分鐘内),如果至少有1個鍵發生改變,則做一次快照(持久化)
save 300 10 //表示在300秒(5分鐘内),如果至少有10個鍵發生改變,則做一次快照(持久化)
save 60 10000 //表示在60秒(1分鐘内),如果至少有10000個鍵發生改變,則做一次快照(持久化)
save "" //如果redis中的資料不需做持久化,隻是作為緩存,則可以使用此方式關閉持久化功能
######## REPLICATION ####### //配置主從相關
# slaveof <masterip> <masterport> //此項不啟用時,則為主,如果啟動則為從,但是需要指明主伺服器的IP,端口
# masterauth <master-password> //如果主服務設定了密碼認證,那麼從的則需要啟用此項并指明主的認證密碼
slave-read-only yes //定義從服務對主服務是否為隻讀(僅複制)
##### LIMITS ##### //定義與連接配接和資源限制相關的配置
# maxclients 10000 //定義最大連接配接限制(并發數)
# maxmemory <bytes> //定義使用主機上的最大記憶體,預設此項關閉,表示最大将使用主機上的最大可用記憶體
###### APPEND ONLY MODE ####### //定義AOF的持久化功能相關配置,一旦有某一個鍵發生變化,将修改鍵的指令附加到指令清單的檔案中,類似于MySQL二進制日志
appendonly no //定義是否開啟此功能,no表示關閉,yes表示開啟
說明:RDB和AOF兩種持久功能可以同時啟用,兩者不影響
13.3.2 登入redis:
63 ~]# redis-cli -h
選項:
-h <hostname> 指定主機IP
-p <port> 指定端口socket檔案進行通信
-s <socket> 指定socket檔案,如果用戶端和服務端都在同一台主機,可以指定socket檔案進行通信
-a <password> 指定認證密碼
-r <repeat> 連接配接成功後指定運作的指令N次
-i <interval> 連接配接成功後每個指令執行完成等待時間,使用-i選項指定
-n <db>
[[email protected] ~]# redis-cli -h 192.168.1.63 //連接配接redis,預設不啟用密碼認證
或:
[[email protected] ~]# redis-cli //使用redis-cli直接連接配接,預設連接配接是127.0.0.1 IP
127.0.0.1:6379> exit //退出連接配接
13.3.3 redis擷取幫助:
說明:redis的help指令非常強大,因為redis支援衆多的資料結構,每一種資料結構當中都支援N種操作,是以需要使用 help @group方式來擷取某一種資料結構所支援的操作
例:擷取字元串組所支援有那些操作
127.0.0.1:6379> help @string
127.0.0.1:6379> help APPEND //擷取單個指令的使用方法
APPEND key value //指令方法
summary: Append a value to a key
since: 2.0.0 //說明此指令在哪個版本中引入的
group: string //該指令所屬哪一個組
檢視都有哪些組:
127.0.0.1:6379> help TAB鍵,每敲一次輪換一個,帶有@則為一個組,不帶@則為指令使用
切換庫(名稱空間):
127.0.0.1:6379> select 1 //表示切換到1号庫中,預設為0号庫,共16個,0-15
OK
127.0.0.1:6379[1]>
13.3.4 鍵的遵循:
可以使用ASCII字元
鍵的長度不要過長,鍵的長度越長則消耗的空間越多
在同一個庫中(名稱空間),鍵的名稱不得重複,如果複制鍵的名稱,實際上是修改鍵中的值
在不同的庫中(名稱空間),鍵的同一個名稱可以重複
鍵可以實作自動過期
13.3.5 Strings的操作:
127.0.0.1:6379> help set
SET key value [EX seconds] [PX milliseconds] [NX|XX] //指令 鍵 值 [EX 過期時間,機關秒]
summary: Set the string value of a key
since: 1.0.0
group: string
NX:如果一個鍵不存在,才建立并設定值,否則不允許設定
XX:如果一個鍵存在則設定建的值,如果不存在則不建立并不設定其值
例:
127.0.0.1:6379> set cjk lzll
OK
127.0.0.1:6379> set cjk aaa NX
(nil) //反回提示一個沒能執行的操作
127.0.0.1:6379> get cjk
"lzll"
127.0.0.1:
6379> set foo abc XX
(nil)
定義一個鍵并設定過期時間為60秒
127.0.0.1:6379> set fda abc EX 60
OK
擷取鍵中的值:
127.0.0.1:6379> help get
GET key
summary: Get the value of a key
since: 1.0.0
group: string
例:
127.0.0.1:6379> get cjk
"lzll"
添加鍵中的值(在原有鍵中附加值的内容):
127.0.0.1:6379> append cjk fda
(integer) 7
127.0.0.1:6379> get cjk
"lzllfda"
擷取指定鍵中的值的字元串的長度:
127.0.0.1:6379> strlen cjk
(integer) 7
定義整數值:
127.0.0.1:6379> set fda 0 //整數值為0
OK
增加鍵中的整數值:
127.0.0.1:6379> incr fda
(integer) 1
127.0.0.1:6379> incr fda
(integer) 2
127.0.0.1:6379> incr fda
(integer) 3
127.0.0.1:6379> incr fda
(integer) 4
127.0.0.1:6379> get fda
"4"
注:incr指令隻能對整數使用
删除鍵:
127.0.0.1:6379> del fda
(integer) 1
127.0.0.1:6379> get fda
(nil)
13.3.6 清單的操作:
鍵指向一個清單,而清單可以了解為是一個字元串的容器,清單是有衆多元素組成的集合,可以在鍵所指向的清單中附加一個值
LPUSH //在鍵所指向的清單前面插入一個值(左邊加入)
RPUSH //在鍵所指向的清單後面附加一個值(右邊加入)
LPOP //在鍵所指向的清單前面彈出一個值(左邊彈出)
RPOP //在鍵所指向的清單後面彈出一個值(右邊彈出)
LINDEX //根據索引擷取值,指明索引位置進行擷取對應的值
LSET //用于修改指定索引的值為指定的值
例:
127.0.0.1:6379> help @list
LSET key index value
summary: Set the value of an element in a list by its index
since: 1.0.0
指定一個新的清單,在幫助中并沒産明哪個指令用于建立一個新的清單,實際上建立一個新的清單使用LPUSH或RPUSH都可以
例:
127.0.0.1:6379> lpush ll cjk //ll為清單名稱,cjk為值(索引)
(integer) 1
擷取清單中的值:需要指明索引位置進行擷取對應的值
127.0.0.1:6379> lindex ll 0 //第一個索引則為0
"cjk"
在原有的清單中的左側加入一個值:
127.0.0.1:6379> lpush ll fda
(integer) 2
127.0.0.1:6379> lindex ll 0
"fda"
127.0.0.1:6379> lindex ll 1
"cjk"
在原有的清單中的右側加入一個值
127.0.0.1:6379> rpush ll lzll
(integer) 3
127.0.0.1:6379> lindex ll 2
"lzll"
127.0.0.1:6379> lindex ll 1
"cjk"
127.0.0.1:6379> lindex ll 0
"fda"
修改一個已有的清單中的值:
127.0.0.1:6379> lset ll 0 abc
OK
127.0.0.1:6379> lindex ll 0
"abc"
檢視清單中的值的數量
127.0.0.1:6379> llen ll
(integer) 3
在已有的清單中右側彈出(删除)一個值
127.0.0.1:6379> rpop ll
"lzll"
在已有的清單中左側彈出(删除)一個值
127.0.0.1:6379> lpop ll
"abc"
127.0.0.1:6379> lpop ll
"cjk"
127.0.0.1:6379> lpop ll
(nil)
13.3.7 認證實作方法:
(1) redis.conf
# requirepass foobared //啟用此項,并指定密碼即可
requirepass PASSWORD
例:
# vim /etc/redis.conf
requirepass kill
(1) redis.conf
# requirepass foobared //啟用此項,并指定密碼即可
requirepass PASSWORD
例:
# vim /etc/redis.conf
requirepass kill
# redis-cli
127.0.0.1:6379> select 1
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth kill
OK
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]>
13.3.8 清空資料庫:
FLUSHDB:删除目前選擇的資料庫所有key
FLUSHALL:清空所有庫
127.0.0.1:6379> flushdb
OK
13.4 redis持久化
13.4.1 持久化概述:
預設情況下,redis工作時所有資料集都是存儲于記憶體中的,不論是否有磁盤上的持久化資料,都是工作于記憶體當中,redis本身就是一個記憶體的資料庫,把所有資料庫相關的存儲都存儲在記憶體中,如果redis崩潰或斷電導緻所有資料丢失,是以redis提供了持久化功能來保證資料的可靠性,redis持久化有兩種實作,RDB和AOF
13.4.2 RDB: 存儲為二進制格式的資料檔案,預設啟動的持久化機制;按事先定制的政策,周期性地将資料儲存至磁盤,使用save指令即可設定周期和政策即可;資料檔案預設為dump.rdb,用戶端連接配接伺服器以後可以用去使用save指令進行儲存資料至磁盤
儲存快照有兩種方式:
1、用戶端也可顯式使用SAVE或BGSAVE指令啟動快照儲存機制;
2、借助于配置檔案所定義的save和政策進行儲存:
SAVE: 是同步儲存,在用戶端使用save儲存快照時,是在redis主線程中儲存快照;因為redis的主線程是用于處理請求的,是以此時會阻塞所有用戶端請求,每次的儲存快照都是把記憶體中的資料完整的儲存一份,并非是增量的,如果記憶體中的資料比較大,而還有大量的寫操作請求時,此方式會引起大量的I/O,會導緻redis性能下降
BGSAVE:異步方式,将立即傳回結果,但自動在背景保持操作,是以BGSAVE指令啟動以後,前台不會被占用,用戶端的請求是不會被阻塞(主程序不會被阻塞)
如果是在配置檔案中定義的save,那麼redis在持久化的時候,則會開啟另外的程序去處理,不會阻塞redis的主程序
redis的RDB持久化不足之處則是,一旦資料出現問題,由于RDB的資料不是最新的,是以基于RDB恢複過來的資料一定會有一部分資料丢失,也就是RDB儲存之後的修改的資料會丢失
13.4.3 AOF:Append Only File,有着更好的持久化能力的解決方案,AOF類似于MySQL的二進制日志,記錄每一次redis的寫操作指令,以順序IO方式附加在指定檔案的尾部,是使用追加方式實作的,這也叫做一種附加日志類型的持久化機制,由于每一次的操作都記錄,則會随着時間長而增大檔案的容量,并且有些記錄的指令是多餘的,AOF不像RDB,RDB是儲存資料集的本身
但是redis程序能夠自動的去掃描這個對應的AOF檔案,把其中一些備援的操作給合并一個,以實作将來一次性把資料恢複,也就是說redis能夠合并重寫AOF的持久化檔案,由BGREWRITEAOF指令來實作,BGREWRITEAOF指令是工作于背景的重寫AOF檔案的指令,重寫後redis将會以快照的方式将記憶體中的資料以指令的方式儲存在臨時檔案中,最後替換原來的檔案,重寫AOF檔案方式,并沒有讀取舊AOF檔案,而是直接将目前記憶體中的所有資料直接生成一個類似于MySQL二進日志指令一樣的操作,例:set cjk 0 ,incr cjk … 1000 ,則會替換為set cjk 1000 些指令放到重寫檔案中,如果此過程完成,那麼原有的AOF将被删除
BGREWRITEAOF:AOF檔案重寫;
不會讀取正在使用AOF檔案,而通過将記憶體中的資料,為記憶體中的所有資料生成一個指令集,以指令的方式儲存到臨時檔案中,完成之後替換原來的AOF檔案;是以AOF檔案是通過重寫将其變小
13.4.4 配置檔案中的與RDB相關的參數:
stop-writes-on-bgsave-error yes //在進行快照備份時,一旦發生錯誤的話是否停止寫操作
rdbcompression yes //RDB檔案是否使用壓縮,壓縮會消耗CPU
rdbchecksum yes //是否對RDB檔案做校驗碼檢測,此項定義在redis啟動時加載RDB檔案是否對檔案檢查校驗碼,在redis生成RDB檔案是會生成校驗資訊,在redis再次啟動或裝載RDB檔案時,是否檢測校驗資訊,如果檢測的情況下會消耗時間,會導緻redis啟動時慢,但是能夠判斷RDB檔案是否産生錯誤
dbfilename dump.rdb //定義RDB檔案的名稱
dir /var/lib/redis //定義RDB檔案存放的目錄路徑
127.0.0.1:6379> config get dir
1) "dir"
2) "/var/lib/redis"
13.4.5 配置檔案中的與AOF相關的參數:
appendonly no //定義是否開啟AOF功能,預設為關閉
appendfilename "appendonly.aof" //定義AOF檔案
appendfsync always //表示每次收到寫指令時,立即寫到磁盤上的AOF檔案,雖然是最好的持久化功能,但是每次有寫指令時都會有磁盤的I/O操作,容易影響redis的性能
appendfsync everysec //表示每秒鐘寫一次,不管每秒鐘收到多少個寫請求都往磁盤中的AOF檔案中寫一次
appendfsync no //表示append功能不會觸發寫操作,所有的寫操作都是送出給OS,由OS自行決定是如何寫的
no-appendfsync-on-rewrite no //當此項為yes時,表示在重寫時,對于新的寫操作不做同步,而暫存在記憶體中
auto-aof-rewrite-percentage 100 //表示目前AOF檔案的大小是上次重寫AOF檔案的二倍時,則自動日志重寫過程
auto-aof-rewrite-min-size 64mb //定義AOF檔案重寫過程的條件,最少為定義大小則觸發重寫過程
注意:持久本身不能取代備份;還應該制定備份政策,對redis資料庫定期進行備份;
13.4.6 RDB與AOF同時啟用:
(1) BGSAVE和BGREWRITEAOF不會同時執行,為了避免對磁盤的I/O影響過大,在某一時刻隻允許一者執行;
如果BGSAVE在執行當中,而使用者手動執行BGREWRITEAOF時,redis會立即傳回OK,但是redis不會同時執行,會等BGSAVE執行完成,再執行BGREWRITEAOF
(2) 在Redis伺服器啟動用于恢複資料時,會優先使用AOF
13.5 redis主從架構(實作讀寫分離)
13.5.1 複制的工作過程:
主庫會基于pingcheck方式檢查從庫是否線上,如果線上則直接同步資料檔案至從服務端,從服務端也可以主動發送同步請求到主服務端,主庫如果是啟動了持久化功能時,會不斷的同步資料到磁盤上,主庫一旦收到從庫的同步請求時,主庫會将記憶體中的資料做快照,然後把資料檔案同步給從庫,從庫得到以後是儲存在本地檔案中(磁盤),而後則把該檔案裝載到記憶體中完成資料重建,鍊式複制也同步如此,因為主是不區分是真正的主,還是另外一個的從
1、啟動一slave
2、slave會向master發送同步指令,請求主庫上的資料,不論從是第一次連接配接,還是非第一次連接配接,master此時都會啟動一個背景的子程序将資料快照儲存在資料檔案中,然後把資料檔案發送給slave
3、slave收到資料檔案 以後會儲存到本地,而後把檔案重載裝入記憶體
13.5.2 特點:
1、一個Master可以有多個Slave;
2、支援鍊式複制(一個slave也可以是其他的slave的slave);
3、Master以非阻塞方式同步資料至slave(master可以同時處理多個slave的讀寫請求,salve端在同步資料時也可以使用非阻塞方式);
13.5.3 啟動複制功能:
1、使用使用者端啟用:
在slave上:
> SLAVAOF MASTER_IP MASTER_PORT
例:
127.0.0.1:6379> slaveof 192.168.1.64 6379 //成為從庫
OK
2、使用配置配置(在從庫上操作):
# vim /etc/redis.conf
# slaveof <masterip> <masterport> //修改此項如下
slaveof 192.168.1.63 6379
從庫上檢視:
127.0.0.1:6379> info
# Replication
role:slave
master_host:192.168.1.63
master_port:6379
master_link_status:up
13.5.4 主從相關配置:
slave-serve-stale-data yes //表示當主伺服器不可以用時,則無法判定資料是否過期,此時從伺服器仍然接收到讀請求時,yes表示仍然響應(繼續使用過期資料)
slave-read-only yes //啟用slave時,該伺服器是否為隻讀
repl-diskless-sync no //是否基于diskless機制進行sync操作,一般情況下如果disk比較慢,網絡帶寬比較大時,在做複制時,此項可以改為Yes
repl-diskless-sync-delay 5 //指定在slave下同步資料到磁盤的延遲時間,預設為5秒,0表示不延遲
slave-priority 100 //指定slave優先級,如果有多個slave時,那一個slave将優先被同步
# min-slaves-to-write 3 //此項表示在主從複制模式當中,如果給主伺服器配置了多個從伺服器時,如果在從伺服器少于3個時,那麼主伺服器将拒絕接收寫請求,從伺服器不能少于該項的指定值,主伺服器才能正常接收使用者的寫請求
# min-slaves-max-lag 10 //表示從伺服器與主伺服器的時差不能夠相差于10秒鐘以上,否則寫操作将拒絕進行
注意:如果master使用requirepass開啟了認證功能,從伺服器要使用masterauth 來連入服務請求使用此密碼進行認證;
主從複制的問題:
例:有一主三從,如果主伺服器離線,那麼所有寫操作操作則無法執行,為了避免此情況發生,redis引入了sentinel(哨兵)機制
13.6 使用sentinel實作主從架構高可用
13.6.1 sentinel的工作過程:
sentinel安裝在另外的主機上,sentinel主機既能監控又能提供配置功能,向sentinel指明主redis伺服器即可(僅監控主伺服器),sentinel可以從主服務中擷取主從架資訊,并分辨從節點,sentinel可以監控目前整個主從伺服器架構的工作狀态,一旦發現master離線的情況,sentinel會從多個從伺服器中選擇并提升一個從節點成為主節點,當主節點被從節點取代以後,那麼IP位址則發生了,客戶所連接配接之前的主節點IP則不無法連接配接,此時可以向sentinel發起查詢請求,sentinel會告知用戶端新的主節點的IP,是以sentinel是redis在主從架構中實作高可用的解決方,sentinel為了誤判和單點故障,sentinel也應該組織為叢集,sentinel多個節點同時監控redis主從架構,一旦有一個sentinel節點發現redis的主節點不線上時,sentinel會與其他的sentinel節點協商其他的sentinel節點是否也為同樣發現redis的主節點不線上的情況,如果sentinel的多個點節點都發現redis的主節點都為離線的情況,那麼則判定redis主節點為離線狀态,以此方式避免誤判,同樣也避免了單點故障
13.6.2 sentinel:
用于管理多個redis服務實作HA;
監控多個redis服務節點
自動故障轉移
sentinel也是一個分布式系統,可以在一個架構中運作多個sentinel程序,多個程序之間使用“流言協定”接收redis主節點是否離線,并使用“投票協定”是否實作故障轉移,選擇哪一個redis的從伺服器成為主伺服器
啟用sentinel:
redis-sentinel可以了解為運作有着特殊代碼的redis,redis自身也可以運作為sentinel,sentinel也依賴配置檔案,用于儲存sentinel不斷收集的狀态資訊
程式:
redis-sentinel /path/to/file.conf
redis-server /path/to/file.conf --sentinel
運作sentinel的步驟:
(1) 伺服器自身初始化(運作redis-server中專用于sentinel功能的代碼);
(2) 初始化sentinel狀态,根據給定的配置檔案,初始化監控的master伺服器清單;
(3) 建立連向master的連接配接;
13.6.3 專用配置檔案:/etc/redis-sentinel.conf
(1) # sentinel monitor //此項可以出現多次,可以監控多組redis主從架構,此項用于監控主節點 自定義的主節點名稱, 主節點的IP位址,主節點的端口号,主節點對應的quorum法定數量,用于定義sentinel的數量,是一個大于值盡量使用奇數,如果sentinel有3個,則指定為2即可,如果有4個,不能夠指定為2,避免導緻叢集分裂,注意,為叢集名稱,可以自定義,如果同時監控有多組redis叢集時,不能同樣
(2) sentinel down-after-milliseconds //sentinel連接配接其他節點逾時時間,機關為毫秒(預設為30秒)
(3)sentinel parallel-syncs //提升主伺服器時,允許多少個從服務向新的主伺服器發起同步請求
(4)sentinel failover-timeout //故障轉移逾時時間,在指定時間沒能完成則判定為失敗,機關為毫秒(預設為180秒)
13.6.4 專用指令:
SENTINEL masters //列出所有監控的主伺服器
SENTINEL slaves <master name> //擷取指定redis叢集的從節點
SENTINEL get-master-addr-by-name <master name> //根據指定master的名稱擷取其IP
SENTINEL reset //用于重置,包括名稱,清除伺服器所有運作狀态,故障轉移、等等
SENTINEL failover <master name> //手動向某一組redis叢集發起執行故障轉移
13.6.5 配置(使用單台主機進行配置):
# mkdir /etc/redis -pv
# cp /etc/redis.conf /etc/redis
# cd /etc/redis
# cp redis.conf redis.conf2
# mv redis.conf redis.conf3
# mkdir -pv /redis/db{2,3}
# chown -R redis. /redis/db*
13.6.7 配置redis執行個體1:
# vim /etc/redis.conf
修改:
# bind 127.0.0.1
改為:
bind 0.0.0.0
修改:
daemonize no
改為:
daemonize yes
13.6.8 配置redis執行個體2:
# vim /etc/redis/redis.conf2
修改:
# bind 127.0.0.1
改為:
bind 0.0.0.0
修改:
port 6379
改為:
port 6380
修改:
daemonize no
改為:
daemonize ye
修改:
pidfile /var/run/redis_6379.pid
改為:
pidfile /var/run/redis_6380.pid
修改:
logfile /var/log/redis/redis.log
改為:
logfile /var/log/redis/redis_6380.log
修改:
dir /var/lib/redis
改為:
dir /redis/db2
修改:
# slaveof <masterip> <masterport>
改為:
slaveof 192.168.1.63 6379
13.6.9 配置redis執行個體3:
# vim /etc/redis/redis.conf3
修改:
# bind 127.0.0.1
改為:
bind 0.0.0.0
修改:
port 6379
為:
port 6381
修改:
daemonize no
改為:
daemonize ye
修改:
pidfile /var/run/redis_6379.pid
改為:
pidfile /var/run/redis_6381.pid
修改:
logfile /var/log/redis/redis.log
改為:
logfile /var/log/redis/redis_6381.log
修改:
dir /var/lib/redis
改為:
dir /redis/db3
修改:
# slaveof <masterip> <masterport>
改為:
slaveof 192.168.1.63 6379
啟動執行個體1:
# systemctl start redis
啟動執行個體2:
# redis-server /etc/redis/redis.conf2
啟動執行個體3:
# redis-server /etc/redis/redis.conf3
# redis-cli //檢視到以下内容則為成功
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.63,port=6380,state=online,offset=28,lag=1
slave1:ip=192.168.1.63,port=6381,state=online,offset=28,lag=1
13.6.10 啟用sentinel:
# vim /etc/redis-sentinel.conf
修改:
# bind 127.0.0.1 192.168.1.1
改為:
bind 0.0.0.0
修改:
sentinel monitor mymaster 127.0.0.1 6379 2
改為:
sentinel monitor mymaster 192.168.1.63 6379 1
# systemctl start redis-sentinel.service
登入redis-sentinel:
# redis-cli -h 192.168.1.63 -p 26379
192.168.1.63:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.1.63:6379,slaves=2,sentinels=1
192.168.1.63:26379> sentinel masters //擷取主節點及從節點的資訊
1) 1) "name"
2) "mymaster"
3) "ip"
4) "192.168.1.63"
5) "port"
6) "6379"
7) "runid"
8) "824e49626453b61077bf2cfa36c9bb464bbcd595"
9) "flags"
10) "master"
192.168.1.63:26379> sentinel slaves mymaster //擷取mymaster叢集的從節點資訊
13.6.11 測試:
# systemctl stop redis //關閉主服務
192.168.1.63:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.1.63:6381,slaves=2,sentinels=1 //由此可見6381的成為了主
啟動主服務:
# systemctl start redis
192.168.1.63:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.1.63:6381,slaves=2,sentinels=1
# redis-cli -h 192.168.1.63 -p 6381
192.168.1.63:6381> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.63,port=6380,state=online,offset=224567,lag=0
slave1:ip=192.168.1.63,port=6379,state=online,offset=224706,lag=0
由以上測試可見,主的故障離線後,sentinel重新選了其 一個從的成為了新的主節點,在原來的主節點重新上線後,仍然不會恢複為主節點
注意:
将來用戶端應連接配接sentinel,向sentinel發請求去尋址,并根據sentinel的回報,進行連接配接新的redis主節點,這一點需要使用redis專用用戶端來實作。redis用戶端會根據sentinel傳回的新節點IP進行連接配接
總結:
13.1 redis概述
13.2 安裝redis
13.3 redis基本操作
13.4 redis持久化
13.5 redis主從架構(實作讀寫分離)
13.6 使用sentinel實作主從架構高可用
方法二、
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLzMGVPNTQU90dRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1kTO5QTMwETM5ETNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
下載下傳
wget https://download.redis.io/releases/redis-6.2.3.tar.gz
cd redis-6.2.3
make PREFIX=/usr/local/redis install
cp redis.conf /usr/local/redis/etc/
啟動redis
/usr/local/redis/bin/redis-server /etc/redis.conf
或者
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
停止redis
/usr/local/redis/bin/redis-cli -p 6379 shutdown
安裝完成之後會在/usr/local/redis/bin/下生成:
-
make install 指令執行完成後,會在/usr/local/bin目錄下生成多個可執行檔案,分别是redis-cli 、redis-service、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 :檢查導出工具
去掉配置檔案裡面空行
#grep -v "#" /etc/redis.conf| gep ^$
啟動Redis
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
Redis服務端的預設連接配接端口是6379
Redis預設不是背景運作
背景運作Redis
# nohup /usr/local/redis/bin/redis-server /etc/redis.conf &
#tail -fn 1- nohup.out
#ps -ef |grep redis
#netstat -lantp |grep 6379
停止Redis:
/usr/local/redis/bin/redis-cli shutdown
使用Redis:
#redis-cli -p 6379
>set wugk 123456
>get wugk
>123456
#/usr/local/redis/bin/redis-cli
>set test01 123456
>set test02 234567
>save
>exit
>
檢視資料是否寫入記憶體
#ps -ef | grpe redis
#/usr/local/redis/bin/redis-cli shutdown
#/usr/local/redis/bin/redis-cli get test01
#/usr/local/redis/bin/redis-cli get test02
備份資料
#cp dump.rdb dump.rdb.bak
清空資料
#rm -rf dump.rdb
#/usr/local/redis/bin/redis-cli shutdown
檢視是否從硬碟上擷取資料
#/usr/local/redis/bin/redis-cli get test01
#/usr/local/redis/bin/redis-cli get test02
#/usr/local/redis/bin/redis-server /etc/redis.conf
#/usr/local/redis/bin/redis-cli
>FLUSHALL
>save
>get test01
>exit
恢複資料
#cp dump.rdb.bak dump.rdb
#/usr/local/redis/bin/redis-server /etc/redis.conf
#/usr/local/redis/bin/redis-cli get test01
#/usr/local/redis/bin/redis-cli get test02
#/usr/local/redis/bin/redis-cli
>get test01
注意 :主要工作内容,部署Redis,及時備份資料
測試Redis壓力
redis-benchmark -h 127.0.0.1 -p 6379 -c 1000 -n 10000 #1000個并發連接配接,10000個請求,測試127.0.0.1端口為6379的redis伺服器性能,可以設定最大利用記憶體 :
注意 : 在過量使用記憶體設定為0,在低記憶體環境下,背景儲存可能失敗。為了修正這個問題,請在/etc/sysctl.conf添加一項’vm.overcommit_memory=1’,然後重新開機(或者運作指令sysctl overcommit_memory=1)使其生效。按照提示修改就可以了
該檔案指定核心針對記憶體配置設定的政策,其值可以是0,1,2。
0,表示核心将檢查是否足夠的可用記憶體供應應用程序使用;如果有足夠的可用記憶體。記憶體申請允許;否則,記憶體申請失敗,并把錯誤傳回給應用程序。
1,表示核心允許配置設定超過所有的實體記憶體,而不管目前的記憶體狀态如何。
2,表示核心允許配置設定超過所有實體記憶體和交換空間總和的記憶體。
REDIS參數詳解
1、Redis預設不是以守護程序的方式運作,可以通過該配置項修改,使用yes啟用守護程序
2、當Redis以守護程序方式運作時,Redis預設會把pid寫入/var/run/redis.pid,可以通過pidfile指定
pidfile /var/run/redis.pid
3、指定Redis監聽端口,預設端口為6379
4、綁定的主機位址
bind 127.0.0.1
5、當用戶端閑置多長時間關閉連接配接,如果指定為0,表示關閉該功能
timeout 300
6、指定日志記錄級别,Redis總共支援四個級别:debug、verbose、notice、warning,預設為verbose
loglevel verbose
7、日志記錄方式,預設為标準輸出,如果配置Redis為守護程序方式運作,二這裡又配置為日志記錄方式為标準輸出,則日志将會發送給/dev/null
logfile stdout
8、設定資料庫的數量,預設資料庫為0 ,可以使用SELECT 指令在連接配接上指定資料庫id
databases 16
9、指定在多長時間内,有多少次更新操作,就将資料同步到資料檔案,可以多個條件配合。
10、指定存儲至本地資料庫時是否壓縮資料,預設為yes,Redis采用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導緻資料庫檔案變的巨大
rdbcompression yes
11、指定本地資料庫檔案名,預設值為dump.rdb
dbfilename dump.rdb
12、指定本地資料庫存放目錄
13、設定當本機為slav服務時,社會組master服務的IP位址及端口,在Redis啟動時,它會自動從master進行資料同步。
slaveof
參考連接配接 :