NoSQL:
NoSQL DEFINITION: Next Generation Databases mostly addressing some of the points: being non-relational, distributed, open-source and horizontally scalable.
ACID:
原子性、一致性、隔離性、持久性;
2phase commit, 3phase comit, ...
non SQL, Not Only SQL; Web 2.0
www.nosql-databases.org
https://db-engines.com/en/ranking
特性:數據量大、數據變化非常快(數據增長快、流量分佈變化大、數據間耦合結構變化快)、數據源很多;
CAP、BASE
CAP:
2000年,PODC(Principle of Distributed Computing)會議, Brewer
Consistency、Availablity、Partition tolerence
C:多個數據節點上的數據一致;
A:用戶發出請求後的有限時間範圍內返回結果;
P:network partition,網絡發生分區後,服務是否依然可用;
CAP理論:一個分佈式系統不可能同時滿足C、A、P三個特性,最多可同時滿足其中兩者;對於分佈式系統滿足分區容錯性幾乎是必須的。新時代P出現的可能性很小,故而3個條件可同時滿足;
AP:
C:弱一致性;
CP:
BASE:BA,S,E,基於CAP演化而來
BA:Basically Available,基本可用;
S:Soft state,軟狀態/柔性事務,即狀態可以在一個時間窗口內是不同步的;
E:Eventually consistency,最終一致性;
NoSQL:Not Only SQL NOSQL流派
Key Value / Tuple Store:DynamoDB, redis
Wide Column Store / Column Families:列式數據庫, hbase
Document Store:文檔數據庫,mongodb,Elastic
Graph Databases:圖式數據庫,Neo4j
Time Series / Streaming Databases:時間序列存儲
Multimodel Databases:
Object Databases:
Redis:
Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker.
開源、內存存儲、數據結構存儲;
可用作:數據庫、緩存、消息隊列;
It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs and geospatial indexes with radius queries.
數據結構:字符串、列表(數組)、hashes(關聯數組)、集合、有序集合、bitmaps、hyperloglogs、空間索引;
Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.
內建的複製、Lua scripting、LRU、事務、持久存儲、高可用(Sentinel,Redis Cluster)
REmote DIctionary Server:數據結構服務器,k/v,數據結構;
單進程:
CPU並非瓶頸;
單進程即只能跑到一個內核核心上
持久化:
snapshotting
AOF
程序環境:
配置文件:/etc/redis.conf
主程序:/usr/bin/redis-server
6379/tcp
客戶端:/usr/bin/redis-cli
Unit File:/usr/lib/systemd/system/redis.service
數據目錄:/var/lib/redis
redis:k/v
key:直接ASCII字符串;
value:strings, lists, hashes, sets, sorted sets, bitmaps, hyperloglogs
To get help about Redis commands type:
"help @<group>" to get a list of commands in <group>
"help <command>" for help on <command>
"help <tab>" to get a list of possible help topics
"quit" to exit
group:
@generic, @string, @list, @... 可以用tab鍵進行不全。
@string
SET
GET
EXISTS
INCR 遞增值
DECR 遞減值
SETNX 不存在時設定
SETEX 存在時修改
INCRBYFLOAT 以浮點數類型向上遞增
MGET 一次獲取多個建的值
MSET 一次設定多個鍵的值
@list 注意棧是先進後出的
LPUSH 左側入棧
RPUSH 右側入棧
LPOP 左邊出棧
RPOP 右邊出棧
LPUSHX 棧存在就左入棧
RPUSHX 棧存在就右入棧
LRANGE 標定範圍內的元素列表
LINDEX 以指定索引找元素
LSET 設定特定索引上的元素的值
LLEN 顯示指定鍵的元素長度
LREM 刪除元素
@set
SADD 在集合中添加元素,如果集合不存在就創建
SPOP 隨機彈出一個數據
SREM 刪除指定的數據
SRANDMEMBER 從成員中得到一個或者多個隨機成員
SINTER 交集
SUNION 並集
@sorted_set
ZADD
ZCARD
ZCOUNT
ZRANK
...
@hash
HSET 設定一個hash
HMSET 一次設定hash的多個字段
HGET 獲取一個hash
HMGET 獲取多個hash
HKEYS 獲取指定hash的所有字段,不列出值
HVALS 列出一個hash中的所有值,不列出字段
HDEL 刪除一個hash的指定的鍵值
HGETALL 獲取一個hash的所有的字段和值
...
members -> {name:jerry, age:17,gender:Female}
HKEYS
HVALS
@pubsub 消息隊列
PUBLISH
SUBSCRIBE
UNSUBSCRIBE
PSUBSCRIBE
PUNSUBSCRIBE
...
@geo
@hyperloglog
回顧:
分佈式系統兩個基礎理論:CAP/BASE
CAP:AP
C、A、P:三者其中之二;
AP:可用性、分區容錯性、弱一致性;
BASE:BA,S,E
BA:基本可用、S:軟狀態、E:最終一致性;
分佈式系統:
分佈式存儲:
NoSQL:
kv、document、column families、GraphDB
分佈式文件系統:文件系統接口
分佈式存儲:API,不能掛載;
NewSQL:
PingCAP:TiDB(MySQL protocol)... 重構的既能夠支持事務,又能夠支持分佈式系統
分佈式運算:mapreduce, ...
redis:REmote DIctionary Server
數據結構:String, List, Set, sorted_set, Hash, pubsub ...
Redis(2)
redis-cli命令:
Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
-h HOST, 127.0.0.1
-p PORT, 6379/tcp
-a PASSWORD
-n DBID
0-15
與Connection相關命令:
help @connection
AUTH <password>
ECHO <message>
PING
QUIT
SELECT dbid
清空數據庫:
FLUSHDB:Remove all keys from the current database
清空當前數據庫;
FLUSHALL:Remove all keys from all databases
清空所有數據庫;
配置和使用Redis:
基本配置項
網絡配置項
持久化相關配置
複製相關的配置
安全相關配置
Limit相關的配置
SlowLog相關的配置
INCLUDES
Advanced配置
通用配置項:
daemonize, supervised, loglevel, pidfile, logfile,
databases:設定數據庫數量,默認爲16個,每個數據庫的名字均爲整數,從0開始編號,默認操作的數據庫爲0;
切換數據庫的方法:
SELECT <dbid>
解釋:
daemonize:是否以守護進程方式運行
supervised:是否接受某個進程的管控
網絡配置項:
bind IP
port PORT
protected-mode
tcp-backlog
unixsocket
timeout:連接的空閒超時時長;
安全配置:
requirepass <PASSWORD>
rename-command <COMMAND> <NEW_CMND_NAME>
在AOF或Replication環境中,不推薦使用; 防止到另一環境中命令不識別;
Limits相關的配置:
maxclients
maxmemory <bytes>
maxmemory-policy noeviction
淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
maxmemory-samples 5
淘汰算法運行時的採樣樣本數; 採樣是看哪個快過期或隨機取等
SlowLog相關的配置:
slowlog-log-slower-than 10000 超出10毫秒就記錄爲慢日誌,以方便優化
單位是微秒;
slowlog-max-len 128
SlowLog記錄的日誌最大條目;
ADVANCED配置:
hash-max-ziplist-entries 512 存儲的最大的鍵值對數
hash-max-ziplist-value 64 每一個value不能太長,爲64字節
設置ziplist的鍵數量最大值,每個值的最大空間;
client-output-buffer-limit normal 0 0 0 正常連接redis服務器複製數據,服務器緩衝
區有多大;
client-output-buffer-limit slave 256mb 64mb 60 redis從服務器複製數據客戶端
client-output-buffer-limit pubsub 32mb 8mb 60 客戶端訂閱了服務器的發行服務
<hard-limit> 最大不能超過此值
<soft-limit> 可以超過此值
<soft-limit seconds> 超過上值最多使用多長時間
redis-cli命令:
Server相關的命令:
CLIENT GETNAME 給本次連接設置名字
*CLIENT KILL
CLIENT KILL [ip:port] [ID client-id] [TYPE normal|master|slave|pubsub] [ADDR ip:port] [SKIPME yes/no]
*CLIENT LIST 列出所有的連接
CLIENT PAUSE
CLIENT PAUSE timeout
CLIENT REPLY
CLIENT SETNAME:Set the current connection name
SHUTDOWN [NOSAVE|SAVE] 設置強制或同步磁盤關閉客戶端
配置參數可運行時修改:
CONFIG GET 獲取指定參數的值
CONFIG RESETSTAT 重置統計計數器
CONFIG REWRITE 將內存修改寫到磁盤文件
CONFIG SET 設置內存生效的參數
INFO:服務器狀態信息查看;分爲多個secion;
INFO [section]
Redis的持久化:
RDB:snapshotting, 二進制格式;按事先定製的策略,週期性地將數據從內存同步至磁盤;數據文件默認爲dump.rdb;
客戶端顯式使用SAVE或BGSAVE命令來手動啓動快照保存機制;
SAVE:同步,即在主線程中保存快照,此時會阻塞所有客戶端請求;
BGSAVE:異步;backgroud
記錄每次寫操作至指定的文件尾部實現的持久化;當redis重啓時,可通過重新執行文件中的命令在內存中重建出數據庫;
BGREWRITEAOF:AOF文件重寫; 重寫是直接從內存快照之後進行重構命
令,使得原來的多個重複操作一步到一個值。更加簡化高效
不會讀取正在使用AOF文件,而是通過將內存中的數據以命令的方式保存至臨時文件中,完成之後替換原來的AOF文件; 在重啓服務時將記錄的命令操作執行一遍。優點是不會丟失數據或丟失數據很少,而缺點是如計數器的操作記錄要進行很多次,不如直接設置計數器的值。
RDB相關的配置:
*save <seconds> <changes>
save 900 1
save 300 10
save 60 10000
save 5 200000
表示:三個策略滿足其中任意一個均會觸發SNAPSHOTTING操作;900s內至少有一個key有變化,300s內至少有10個key有變化,60s內至少有1W個key發生變化;
stop-writes-on-bgsave-error yes
dump操作出現錯誤時,是否禁止新的寫入操作請求;快照有錯,禁止用戶寫入操
作;
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb:指定rdb文件名
*dir /var/lib/redis:rdb文件的存儲路徑
AOF相關的配置
*appendonly no
appendfilename "appendonly.aof"
*appendfsync
Redis supports three different modes:
no:redis不執行主動同步操作,而是OS進行;
everysec:每秒一次;
always:每語句一次;
no-appendfsync-on-rewrite no
是否在後臺執行aof重寫期間不調用fsync,默認爲no,表示調用;
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
上述兩個條件同時滿足時,方會觸發重寫AOF;與上次aof文件大小相比,其增長量超過100%,且大小不少於64MB;
aof-load-truncated yes
注意:持久機制本身不能取代備份;應該制訂備份策略,對redis庫定期備份;
RDB與AOF同時啓用:
(1) BGSAVE(快照)和BGREWRITEAOF不會同時進行;
(2) Redis服務器啓動時用持久化的數據文件恢復數據,會優先使用AOF;
複製:
特點:
一個Master可以有多個slave主機,支持鏈式複製;
Master以非阻塞方式同步數據至slave主機;
配置slave節點:
redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>
redis-cli> CONFIG SET masterauth <PASSWORD>
配置參數:
*slaveof
*masterauth
slave-serve-stale-data yes 是否使用舊的數據響應用戶
slave-read-only yes 從節點只用於用戶的讀,用戶不能直接在從節點上寫
*repl-diskless-sync no 網絡不好時基於磁盤慢慢複製
no, Disk-backed, Diskless
新的從節點或某較長時間未能與主節點進行同步的從節點重新與主節點通信,需要做“full synchronization",此時其同步方式有兩種style:
Disk-backend:主節點新創建快照文件於磁盤中,而後將其發送給從節點;網絡慢時使用
Diskless:主節佔新創建快照後直接通過網絡套接字文件發送給從節點;爲了實現並行複製,通常需要在複製啓動前延遲一個時間段;
repl-diskless-sync-delay 5 延遲一會會,準備好並行傳輸
repl-ping-slave-period 10
*repl-timeout 60
repl-disable-tcp-nodelay no 如果複製字節數太少,不延遲等待字節多了發送
repl-backlog-size 1mb 請求後援隊列
*slave-priority 100
複製集羣中,主節點故障時,sentinel應用場景中的主節點選舉時使用的優先級;數字越小優先級越高,但0表示不參與選舉;
min-slaves-to-write 3:主節點僅允許其能夠通信的從節點數量大於等於此處的值時接受寫操作;
min-slaves-max-lag 10:從節點延遲時長超出此處指定的時長時,主節點會拒絕寫入操作;數據量相差大
sentinel:
主要完成三個功能:監控、通知、自動故障轉移 主故障,從變主,依靠sentinel判斷,最
好將sentinel和redis不要放到一臺主機
選舉:流言協議、投票協議
配置項:
bind 0.0.0.0 必須寫,不然不能進行故障轉移
port 26379
sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel auth-pass <master-name> <password>
<quorum>表示sentinel集羣的quorum機制,即至少有quorum個sentinel節點同時判定主節點故障時,才認爲其真的故障;奇數個
s_down: subjectively down
o_down: objectively down
sentinel down-after-milliseconds <master-name> <milliseconds>
監控到指定的集羣的主節點異常狀態持續多久方纔將標記爲“故障”;
sentinel parallel-syncs <master-name> <numslaves>
指在failover過程中,能夠被sentinel並行配置的從節點的數量;
sentinel failover-timeout <master-name> <milliseconds>
sentinel必須在此指定的時長內完成故障轉移操作,否則,將視爲故障轉移操作失敗;單位爲毫秒;
sentinel notification-script <master-name> <script-path>
通知腳本,此腳本被自動傳遞多個參數;
redis-cli -h SENTINEL_HOST -p SENTINEL_PORT
redis-cli>
SENTINEL masters
SENTINEL slaves <MASTER_NAME>
SENTINEL failover <MASTER_NAME>
SENTINEL get-master-addr-by-name <MASTER_NAME>
注意:如果從變成主,主要想成爲從,需要加上從的配置;
CLuster:
集羣相關的配置:
先關閉服務,停止主從
cluster-enabled 是否開啓集羣配置
cluster-config-file 集羣節點集羣信息配置文件,每個節點都有一個,由redis生成和更新,配置時避免名稱衝突
cluster-node-timeout 集羣節點互連超時的閾值,單位毫秒
cluster-slave-validity-factor 進行故障轉移時,salve會申請成爲master。有時slave會和master失聯很久導致數據較舊,這樣的slave不應該成爲master。這個配置用來判斷slave是否和master失聯時間過長。
配置過程:
(2) 啓動redis後爲每個節點分配slots;
CLUSTER ADDSLOTS
注意:每個slot要獨立創建;可用範圍是0-16383,共16384個;
在執行以下分配狹槽的命令執行前必須確保每個節點都沒有數據,也沒有分配過插槽
rm -rf /var/lib/redis/redis-cluster.conf 刪除集羣配置文件
rm -rf /var/lib/redis/dump.rdb 刪除節點數據
redis-cli -c -h 192.168.1.100 -p 7000 cluster addslots {0..5000}
(3) 設定集羣成員關係;
CLUSTE MEET
注意:只是單純的集羣,並沒有對主從複製進行配置; 測試時由於不是智能客戶端,所以需
要在訪問到本地時才能測試成功
set nikey hi
之後再對每個節點單獨做主從就可以了
redis的集羣技術:
客戶端分片
代理分片:
豌豆莢:codis
twitter:twemproxy
redis cluster
官方實現
需要redis3.0或者更高版本
優點:
無中心的P2P Gossip分散式模式
更少的來回次數並降低延遲
自動於多個redis節點進行分片
不需要第三方軟件支持協調機制
缺點
依賴於redis3.0或更高版本
沒有後臺界面
需要智能客戶端
redis客戶端必須支持redis cluster架構
較codis有更多的維護升級成本
博客作業:
(1) replication, sentinel,cluster
(2) rdb, aof
課外實踐:
(1) codis
(2) cerberus
聽課總結:
1、從下到上的工作流程:運維工程師-->DBA-->業務流程-->應用管理;現在的大型站點如京東等,都是一個電商網站上調用了很多的其他服務,這些服務有如支付寶系統、短信發送服務等這些服務通過設計的業務流程進行相互調用,返回結果;
2、結構化數據:關係型數據庫SQL;如mysql等,要數據的改變需要先進行檢查約束條件是否滿
足;這極大的消耗了時間;效率低下;由此引出了半結構化數據;NOSQL數據庫,鍵值數據庫,此數據結構可以進行分佈式數據的按片冗餘,每個機器放一部分數據,有副本。文檔存儲;非結構化數據使用文件系統存儲數據,掛載或客戶端訪問,分佈式文件系統需要藉助於FUSE協議模塊進行掛載;網絡分佈式文件系統。對象式系統,是將數據和元數據存放到一起的。
3、阿里倡導的去IOE計劃:I指的是IBM小型機(精簡指令集),O指的是Oracle,E是指EMC公
司(已經被戴爾收購了);
4、malloc:串行的內存分配器;jemalloc:並行的內存分配器,效率高,用於redis;