非關係型資料庫redis部署及優化
阿新 • • 發佈:2022-04-18
非關係型資料庫redis部署及優化
一,關係型資料庫與非關係型資料庫
1.關係型資料庫
一個結構化的資料庫,建立在關係模型(二維表格模型)基礎上,一般面向於記錄 SQL語句(標準資料查詢語言)就是一種基於關係型資料庫的語言,用於執行對關係型資料庫中資料的檢索和操作。主流的關係型資料庫包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等。 優點: 1、易於維護:都是使用表結構,格式一致; 2、使用方便:SQL語言通用,可用於複雜查詢; 3、複雜操作:支援SQL,可用於一個表以及多個表之間非常複雜的查詢。 缺點: 1、讀寫效能比較差,尤其是海量資料的高效率讀寫; 2、固定的表結構,靈活度稍欠; 3、高併發讀寫需求,傳統關係型資料庫來說,硬碟I/O是一個很大的瓶頸。
2.非關係型資料庫
NoSQL(Not Only SQL ),意思是"不僅僅是SQL”,是非關係型資料庫的總稱。除了主流的關係型資料庫外的資料庫,都認為是非關係型。 非關係型資料庫屬於一種資料結構化儲存方式的集合,可以是文件型別、圖形型別、列儲存型別,鍵值對等, 主流的NoSQL 資料庫有Redis、MongBD、Hbase、CouhDB等。 優點: 1、格式靈活:儲存資料的格式可以是key,value形式、文件形式、圖片形式等等,文件形式、圖片形式等等,使用靈活,應用場景廣泛,而關係型資料庫則只支援基礎型別。 2、速度快:nosql可以使用硬碟或者隨機儲存器作為載體,而關係型資料庫只能使用硬碟; 3、高擴充套件性; 4、成本低:nosql資料庫部署簡單,基本都是開源軟體。 缺點: 1、不提供sql支援,學習和使用成本較高; 2、無事務處理; 3、資料結構相對複雜,複雜查詢方面稍欠。
3.區別
1、資料儲存方式不同:
關係資料庫為表格形式;
非關係資料庫為文件或圖結構。
2、擴充套件方式不同:
關係資料庫可縱向擴充套件,可提高處理能力;
非關係資料庫為天然分散式,通過更多的資料伺服器來分擔負載。
3、事務處理支援不同:
關係資料庫善於處理事務原子性細粒度控制,方便事務回滾;
非關係資料庫著重於處理大資料。
4.成本:
關係型資料庫成本高;
Nosql資料庫簡單易部署,基本都是開源軟。
5.資料一致性:
關係型資料庫一樣強調資料的一致
Nosql不提供對事務的處理。
二,redis
1.redis概述
redis是一個完全開源免費的key-value記憶體資料庫。支援儲存的value型別更多,包括string(字串)、list(連結串列)、set(集合)、zset(sorted set --有序集合)和hash(雜湊型別)。這些資料型別都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。同時,為了保證效率,資料都是快取在記憶體中。並且redis會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。
2.redis優缺點
優點:
具有極高的資料讀寫速度:資料讀取的速度最高可達到110000次ls,資料寫入速度最高可達到81000次/s;
支援豐富的資料型別:支援key-value、Strings、Lists、Hashes、Sets 及 Ordered Sets等資料型別操作;
支援資料的持久化:可以將記憶體中的資料儲存在磁碟中,重啟的時候可以再次載入進行使用;
原子性: Redis所有操作都是原子性的;
支援資料備份:master-salve模式的資料備份。
缺點:
1、redis是記憶體資料庫,所以單臺機器儲存的資料量跟機器本身的記憶體大小有關。雖然redis本身有key過期策略,但是還是需要提前預估和節約記憶體。如果記憶體增長過快,需要定期刪除資料,定時刪除和定期刪除為主動刪除,Redis會定期主動淘汰一批已過期的key。
2、如果進行完整重同步,由於需要生成rdb檔案,並進行傳輸,會佔用主機的CPU,並會消耗現網路頻寬。
3、修改配置檔案,進行重啟,將硬碟中的資料載入進記憶體,時間比較久。在這個過程中,redis不能提供服務。
3.redis使用場景
Redis作為基於記憶體執行的資料庫,快取是其最常應用的場景之一。
Redis常見應用場景還包括獲取最新N個數據的操作、排行榜類應用、計數器應用、儲存關係、實時分析系統、日誌記錄。
三,redis安裝部署
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1.編譯安裝redis
cd /opt/
yum install -y gcc gcc-c++ make
tar zxvf redis-5.0.7.tar.gz
cd /opt/redis-5.0.7/
make && make PREFIX=/usr/local/redis install
2.執行指令碼檔案並輸入路徑
cd /opt/redis-5.0.7/utils
./install_server.sh
回車
Please select the redis executable path []
手動輸入
/usr/local/redis/bin/redis-server
3.優化路徑
ln -s /usr/local/redis/bin/* /usr/local/bin/
/etc/init.d/redis_6379 stop #停止
/etc/init.d/redis_6379 start #啟動
/etc/init.d/redis_6379 restart #重啟
/etc/init.d/redis_6379 status #狀態
netstat -natp | grep 6379
4.修改配置檔案引數
vim /etc/redis/6379.conf
70行,新增 監聽的主機地址
bind 127.0.0.1 192.168.221.20
93行,Redis預設的監聽埠
port 6379
137行,啟用守護程序
daemonize yes
159行,指定 PID 檔案
pidfile /var/run/redis_6379.pid
167行,日誌級別
loglevel notice
172行,指定日誌檔案
logfile /var/log/redis_6379.log
/etc/init.d/redis_6379 restart
Redis 命令工具:
redis-server 用於啟動 Redis 的工具
redis-benchmark 用於檢測 Redis 在本機的執行效率
redis-check-aof 修復 AOF 持久化檔案
redis-check-rdb 修復 RDB 持久化檔案
redis-cli Redis命令列工具
redis-cli 命令列工具
語法:redis-cli -h host -p port -a password
-h 指定遠端主機
-p 指定 Redis 服務的埠號
-a 指定密碼,未設定資料庫密碼可以省略-a 選項
若不新增任何選項表示,則使用 127.0.0.1:6379 連線本機上的 Redis 資料庫
例:
redis-cli -h 192.168.118.13 -p 6379
#此時無密碼,不需要-a直接登陸
redis-benchmark 測試工具:
redis-benchmark [選項] [選項值]。
-h 指定伺服器主機名。
-p 指定伺服器埠。
-s 指定伺服器 socket
-c 指定併發連線數。
-n 指定請求數。
-d 以位元組的形式指定 SET/GET 值的資料大小。
-k 1=keep alive 0=reconnect 。
-r SET/GET/INCR 使用隨機 key, SADD 使用隨機值。
-P 通過管道傳輸請求。
-q 強制退出 redis。僅顯示 query/sec 值。
–csv 以 CSV 格式輸出。
-l 生成迴圈,永久執行測試。
-t 僅執行以逗號分隔的測試命令列表。
-I Idle 模式。僅開啟 N 個 idle 連線並等待。
測試存取大小為 100 位元組的資料包的效能
redis-benchmark -h 192.168.118.13 -p 6379 -q -d 100
四,redis命令
1.set/get 存放/獲取資料
set 存放資料,命令格式為 set key value
get 獲取資料,命令格式為 get key
例:
redis-cli -p 6379
set id 66
get id
2.keys 取值
keys 命令可以取符合規則的鍵值列表,通常情況可以結合*、?等選項來使用。
set a1 1
set a2 2
set a33 3
keys *
keys a* #檢視a開頭的鍵
keys a?
keys a?? #?代表任意字元
3.exists 判斷值是否存在
exists 命令可以判斷鍵值是否存在。
exists sex 結果顯示:1存在,0不存在
exists bh
4.del 刪除key
del 命令可以刪除當前資料庫的指定 key。
keys *
del a33
keys *
5.type 獲取值的型別
type 命令可以獲取 key 對應的 value 值型別
type a1
6.rename 重新命名(覆蓋)
rename 命令是對已有 key 進行重新命名。(覆蓋)
命令格式:rename 源key 目標key
使用rename命令進行重新命名時,無論目標key是否存在都進行重新命名,且源key的值會覆蓋目標key的值。在實際使用過程中,建議先用 exists 命令檢視目標 key 是否存在,然後再決定是否執行 rename 命令,以避免覆蓋重要資料。
例:
keys a*
rename a2 a22
get a22
renamenx 命令的作用是對已有 key 進行重新命名,並檢測新名是否存在,如果目標 key 存在則不進行重新命名。(不覆蓋)
命令格式:renamenx 源key 目標key
7.dbsize 檢視庫中key的數量
dbsize 命令的作用是檢視當前資料庫中 key 的數目。
例:
keys *
dbsize
8.設定密碼
使用config set requirepass password命令設定密碼
使用config get requirepass命令檢視密碼(一旦設定密碼,必須先驗證通過密碼,否則所有操作不可用)
例:
config set requirepass 123456
auth 123456
config get requirepass
quit
redis-cli -p 6379
keys *
auth 123456
keys *
9.多資料庫間切換
Redis 預設情況下包含 16 個數據庫,資料庫名稱是用數字 0-15 來依次命名的。多資料庫相互獨立,互不干擾。
可以通過修改 Redis 配置檔案 redis.conf 中的 databases 一值進行變更。
命令格式:select 序號
select 3
select 5
select 0 #索引為0的資料庫,不顯示索引號
10.多資料庫間移動資料
格式:move 鍵值 序號
11.清除資料庫資料
FLUSHDB :清空當前資料庫資料
FLUSHALL :清空所有資料庫的資料
五,redis高可用
在web伺服器中,高可用是指伺服器可以正常訪問的時間,衡量的標準是在多長時間內可以提供正常服務(99.9%、99.99%、99.989%等等)。
但是在Redis語境中,高可用的含義似乎要寬泛一些,除了保證提供正常服務(如主從分離、快速容災技術),還需要考慮資料容量的擴充套件、資料安全不會丟失等。
在Redis中,實現高可用的技術主要包括持久化、主從複製、哨兵和叢集:
1.持久化:持久化是最簡單的高可用方法(有時甚至不被歸為高可用的手段),主要作用是資料備份,即將資料儲存在硬碟,保證資料不會因程序退出而丟失。
2.主從複製:主從複製是高可用Redis的基礎,哨兵和叢集都是在主從複製基礎上實現高可用的。主從複製主要實現了資料的多機備份,以及對於讀操作的負載均衡和簡單的故障恢復。
缺陷:故障恢復無法自動化;寫操作無法負載均衡;儲存能力受到單機的限制。
3.哨兵:在主從複製的基礎上,哨兵實現了自動化的故障恢復。
缺陷:寫操作無法負載均衡;儲存能力受到單機的限制。
4.叢集:通過叢集,Redis解決了寫操作無法負載均衡,以及儲存能力受到單機限制的問題,實現了較為完善的高可用方案。
六,redis持久化
Redis 是執行在記憶體中,記憶體中的資料斷電就會丟失
Redis支援RDB和AOF兩種持久化機制,持久化功能有效地避免因程序退出造成的資料丟失問題,為了能重用 Redis 資料,或者防止系統故障,需要將 Redis 中的資料寫入到磁碟空間中,即持久化。
RDB:週期性的把記憶體中的資料儲存在磁碟中
AOF:從redis的操作日誌記錄中將執行的過程同步到磁碟中
1.RDB持久化
RDB持久化:指在指定的時間間隔內將記憶體中當前程序中的資料生成快照儲存到硬碟(因此也稱作快照持久化),用二進位制壓縮儲存,儲存的檔案字尾是rdb;當Redis重新啟動時,可以讀取快照檔案恢復資料。
1)處理流程
1.Redis父程序首先判斷:當前是否在執行save,或bgsave/bgrewriteaof的子程序,如果在執行則bgsave命令直接返回。
2.父程序執行fork操作建立子程序,這個過程中父程序是阻塞的,Redis不能執行來自客戶端的任何命令
3.父程序fork後,bgsave命令返回"Background saving started"資訊並不再阻塞父程序,並可以響應其他命令;
4.子程序建立RDB檔案,根據父程序記憶體快照生成臨時快照檔案,完成後對原有檔案進行原子替換
5.子程序傳送訊號給父程序表示完成,父程序更新統計資訊
2)觸發條件
1.手動觸發:
save命令和bgsave命令都可以生成RDB檔案。
save命令會阻塞Redis伺服器程序,直到RDB檔案建立完畢為止,在Redis伺服器阻塞期間,伺服器不能處理任何命令請求。而bgsave命令會建立一個子程序,由子程序來負責建立RDB檔案,父程序(即Redis主程序)則繼續處理請求。
bgsave命令執行過程中,只有fork子程序時會阻塞伺服器,而對於save命令,整個過程都會阻塞伺服器,因此save已基本被廢棄,線上環境要杜絕save的使用。
2.自動觸發:
在自動觸發RDB持久化時,Redis也會選擇bgsave而不是save來進行持久化。
自動觸發最常見的情況是在配置檔案中通過save m n,指定當m秒內發生n次變化時,會觸發bgsave。
vim /etc/redis/6379.conf
#219行以下三個save條件滿足任意一個時,都會引起bgsave的呼叫
save 900 1:當時間到90O秒時,如果redis資料發生了至少1次變化,則執行bgsave;
save 300 10:當時間到300秒時,如果redis資料發生了至少10次變化,則執行bgsave;
save 60 10000:當時間到6O秒時,如果redis資料發生了至少10000次變化,則執行bgsave;
#242行是否開啟RDB檔案壓縮
rdbcompression yes
#254行指定RDB檔名
dbfilename dump.rdb
#264行指定RDB檔案和AOF檔案所在目錄
dir /var/lib/redis/6379
3.其他自動觸發機制
除了save m n 以外,還有一些其他情況會觸發bgsave:
在主從複製場景下,如果從節點執行全量複製操作,則主節點會執行bgsave命令,並將rdb檔案傳送給從節點。執行shutdown命令時,自動執行rdb持久化。
2.AOF持久化
AOF持久化,將Redis執行的每次寫、刪除命令記錄到單獨的日誌檔案中,查詢操作不會記錄; 當Redis重啟時再次執行AOF檔案中的命令來恢復資料。
與RDB相比,AOF的實時性更好,因此已成為主流的持久化方案。
1)執行流程
AOF的執行流程包括:
命令追加(append):將Redis的寫命令追加到緩衝區aof_buf;
檔案寫入(write)和檔案同步(sync):根據不同的同步策略將aof_buf中的內容同步到硬碟;
檔案重寫(rewrite):定期重寫AOF檔案,達到壓縮的目的。
【檔案重寫之所以能夠壓縮AOF檔案,原因在於:
過期的資料和無效的命令不再寫入檔案】
2)檔案重寫
AOF的重寫機制:
AOF的工作原理是將寫的操作追加到檔案中,這會導致檔案中的冗餘會越來越多
當AOF檔案的大小超過所設定的閾值時,Redis就會對AOF檔案的內容壓縮;
AOF的重寫原理:
Redis 會fork 出一條新程序,讀取記憶體中的資料(並沒有讀取舊檔案),並重寫到一個臨時檔案中,最後替換舊的aof檔案;
AOF的重寫配置:
bgrewriteaof命令:非同步執行一個 AOF(AppendOnly File) 檔案重寫操作
即使 Bgrewriteaof 執行失敗,也不會有任何資料丟失,因為舊的 AOF 檔案在 Bgrewriteaof 成功之前不會被修改
1.觸發重寫,執行bgrewriteaof命令
2.父程序fork子程序進行重寫,fork子程序的同時父程序阻塞,fork完畢父程序繼續接受指令(子程序只是父程序的快照(相當於複製了某時刻的父程序))
3.子程序在建立新的aof檔案的同時,父程序繼續接收write指令,儲存到繼續存到aof_buf快取中和aof_rewirte_buf快取中,所以父程序繼續往舊的aof檔案中備份,同時也要往新的AOf檔案中備份。
4.新的aof備份完成;
5.1:同時父程序,備份的新檔案建立完成
5.2:將aof_rewrite_buf快取中的備份到新的aof檔案中
5.3:新的檔案替換舊aof檔案
3)觸發方式
可以在redis.config中進行配置,appendonly no改換為yes,再通過註釋或解註釋appendfsync配置需要的方案:
always:每次發生資料修改就會立即記錄到磁碟檔案中,這種方案的完整性好但是IO開銷很大,效能較差;
everysec:在每一秒中進行同步,速度有所提升。但是如果在一秒內宕機的話可能失去這一秒內的資料;
no:預設配置,即不使用 AOF 持久化方案。
總結
redis優點:
具有極高的資料讀寫速度;支援豐富的資料型別;支援資料的持久化;原子性;支援資料備份。
缺點:Redis會定期主動淘汰一批已過期的key;佔用主機的CPU,並會消耗現網路頻寬;修改配置檔案,進行重啟,將硬碟中的資料載入進記憶體,佔用時間比較久,且無法重啟。
redis持久化:
RDB:週期性的把記憶體中的資料儲存在磁碟中
AOF:從redis的操作日誌記錄中將執行的過程同步到磁碟中