標籤:快照 readonly multi config 轉寄 主從備份 err tran .com
一、Redis記憶體資料庫
一個key-value儲存系統,支援儲存的value包括string(字串)、list(鏈表)、set(集合)、zset(sorted set--有序集合)和hash(雜湊類型)。資料存在緩衝中。
與MemCached區別:
(*)支援持久化
(*)豐富的資料類型
(*)實現了主從同步
(*)補償了key/Value儲存的不足
3、Redis的特點
(*)基於記憶體
(*)持久化: RDB、AOF
(*)訊息機制:支援String,只支援Topic的訊息(廣播)
(*)豐富的資料類型
(*)支援簡單的事務
(*)支援主從複製
(*)HA(哨兵): 對版本有要求
二、Redis的安裝和配置: 需要gcc的編譯器
tar -zxvf redis-3.0.5.tar.gz
make
make PREFIX=/root/training/redis install
(*)Redis的相關命令
redis-benchmark 提供的一個壓力測試工具,類比:10萬操作
redis-check-aof 檢查AOF記錄檔
redis-check-dump 檢查RDB快照檔案
redis-cli 命令列
redis-sentinel 哨兵(Redis的HA) -----> 設定檔:sentinel.conf
redis-server 伺服器
(*)核心的設定檔: redis.conf
42 daemonize yes
50 port 6379
(*)啟動: bin/redis-server conf/redis.conf
三、Redis的操作:基於key-value形式
1、命令列: bin/redis-cli
2、JAVA API
四、Redis的事務: 不是真正的事務
1、複習:事務(關係型資料庫)
Oracle資料庫中,事務的本質是什嗎? -----> 將事務操作(DML)寫入日誌
舉例: insert
insert
update
commit
2、Redis的事務: 不是真正的事務
Redis的事務的本質:將一組操作放入隊列中,批量執行
3、對比Oracle和Redis的事務
Oracle Redis
開啟事務: 自動開啟 multi
操作: DML Redis命令
提交: commit,隱式提交 exec
復原: rollback,隱式復原 discard
4、舉例:銀行轉賬
set tom 1000
set mike 1000
multi
decrby tom 100
incrby mike 100
exec
通過Java API 實現:
package demo;import org.junit.Test;import org.omg.CORBA.TCKind;import redis.clients.jedis.Jedis;import redis.clients.jedis.Transaction;public class TestRedis { @Test public void testTransaction(){ //建立一個用戶端 Jedis jedis = new Jedis("192.168.153.11", 6379); //定義事務 Transaction transaction = null; try { //開啟事務 transaction = jedis.multi(); //轉賬 transaction.decrBy("tom", 100); transaction .incrBy("mike", 100); //提交事務 transaction.exec(); } catch (Exception e) { if (transaction != null) { transaction.discard(); } } jedis.disconnect(); }}
5、Redis的鎖機制 -----> 核心:當事務提交的時候,如果監控的值,發生變化,則提交失敗
命令:watch
舉例:買票
set ticket 1
set tom 1000
使用者一:tom
multi
decr ticket
decrby tom 100
exec -------> 提交的時候,慢了一點
1) (integer) -1 ====> 票數不可能是-1
2) (integer) 900
使用者二:在tom提交前,已經把票買走了(重新開一個視窗)
decr ticket
五、Redis的訊息機制
1、訊息系統類別型:同步訊息系統: 需要等待對方的回答
非同步訊息系統: 不需要等待對方的回答
2、訊息的類型:
Queue:隊列(點對點)
Topic:主題(廣播)
Redis和Kafka:只支援Topic
JMS: Java Message Service ----> 都支援:Queue和Topic
推薦:Weblogic
3、Redis的訊息相關的命令:
publish: 發布訊息 指定頻道
subscribe:訂閱訊息 指定頻道
psubscribe:訂閱訊息 使用萬用字元指定頻道
也可以使用JAVA API的方式
六、Redis的持久化: RDB(預設)、AOF
1.作用:進行恢複
2.RDB:快照的方式。每隔一段時間,把記憶體中的資料寫到rdb檔案中
參數:
規則:從下往上
save 900 1 在15分鐘內,如果有1個key的value發生了變化,就產生RDB檔案
save 300 10 在5分鐘內,如果有10個key的value發生了變化,就產生RDB檔案
save 60 10000 在60秒內,如果有1w個key的value發生了變化,就產生RDB檔案
stop-writes-on-bgsave-error yes 如果在寫RDB檔案的時候產生了錯誤,停止新的資料寫入
rdbcompression yes 是否壓縮(優點:節約了空間 缺點:恢複的效率低),可以設定為:no
rdbchecksum yes 校正和來檢查RDB檔案是否是好的
dbfilename dump.rdb 如果在叢集下,一台主機上運行多個Redis的執行個體,建議區別rdb檔案
dir ./ 儲存的目錄
RDB的優缺點?
(*)優點:恢複的速度快
補充:Oracle資料庫中的備份:備份組
鏡像拷貝(image copy):相當於RDB
(*)缺點:如果在兩次RDB之間發生了掉電,資料肯定丟失
3.AOF:通過日誌的方式
(*)重做日誌,達到恢複的目的
(*)預設:禁用
(*)參數:
appendonly no ===> yes 開啟AOF
appendfilename "appendonly.aof" 如果在叢集下,一台主機上運行多個Redis的執行個體,建議區別aof檔案
什麼時候記錄日誌???
538 # appendfsync always 每個操作都記錄日誌。最安全,效能最差
539 appendfsync everysec 預設:每秒
540 # appendfsync no 由作業系統決定
no-appendfsync-on-rewrite no 重寫發生的時候,是否寫入aof的新日誌
什麼時候執行AOF重寫?
580 auto-aof-rewrite-percentage 100
581 auto-aof-rewrite-min-size 64mb
(*)什麼是AOF的重寫:rewrite
set i 0
incr i
incr i
======> 問題: AOF檔案太大了
100次
****
incr i
最終:i = 100
(*)示範:AOF的重寫:合并小日誌,產生大的日誌
類比:10萬個操作
bin/redis-benchmark -n 100000
七、Redis的叢集:主從複製
1、Redis的叢集:
(*)主從備份(複製):從主節點上寫入資料,從從節點(s)上讀取資料。對主節點做一個備份。
(*)讀寫分離:一般來說,都是讀的壓力大。分擔master的壓力。
(*)任務分離
2、兩種架構:星型、線型
3、搭建:星型
主節點:關閉RDB和AOF
從節點:開啟RDB和AOF
slaveof 主節點地址
三台Redis:連接埠 6379 6380 6381
主 從1 從2
redis6379.conf
147 #save 900 1
148 #save 300 10
149 #save 60 10000
509 appendonly no
redis6380.conf
50 port 6380
182 dbfilename dump6380.rdb
513 appendfilename "appendonly6380.aof"
211 slaveof 192.168.157.11 6379
redis6381.conf
50 port 6381
182 dbfilename dump6381.rdb
513 appendfilename "appendonly6381.aof"
211 slaveof 192.168.157.11 6379
注意:預設:從節點唯讀
(error) READONLY You can‘t write against a read only slave.
修改參數:
slave-read-only yes
# masterauth <master-password> 主從節點密碼
4、主從節點通訊的過程
主節點 從節點
<------------ 發出同步請求
將RDB同步 ----------->
將AOF同步 -----------> 重做日誌
一定注意:每次啟動的時候,從節點的個數不能太多
八、Redis的HA:哨兵機制
九、Redis的分區
1、回顧:叢集有兩大功能
(1)Fail Over 失敗遷移:HA -----> Redis 哨兵
(2)Load Balance 負載平衡 ------> Redis 分區
來自多個程式的訪問,按照路由規則,轉寄給背景各個Redis服務,再原路返回。Redis的分區,解決了單個Redis執行個體承載能力的問題。
2、nutcracker-0.3.0.tar.gz
./configure --prefix=/root/training/proxy
make
make install
設定檔中,注意空格
alpha:
listen: 127.0.0.1:22121
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 2000
server_failure_limit: 1
servers:
- 192.168.157.11:6380:1
- 192.168.157.11:6381:1
3、?檢查設定檔是否正確
sbin/nutcracker -t conf/nutcracker.yml
?4、啟動Proxy 伺服器
sbin/nutcracker -d -c conf/nutcracker.yml
大資料筆記(二十一)——NoSQL資料庫之Redis