1莽鸭、NoSQL簡介
- NoSQL:Not Only SQL
Key Value / Tuple Store:DynamoDB, redis
Wide Column Store / Column Families:列式數(shù)據(jù)庫, hbase
Document Store:文檔數(shù)據(jù)庫醋火,mongodb,Elastic
Graph Databases:圖式數(shù)據(jù)庫,Neo4j
Multimodel Databases:
Object Databases:
Time Series / Streaming Databases:時(shí)間序列存儲(chǔ)
mysql是關(guān)系型數(shù)據(jù)庫,是屬于SQL而不是NoSQL - ACID:原子性其馏、一致性骗奖、隔離性、持久性声功,事物性存儲(chǔ)必須滿足ACID
- 特性:數(shù)據(jù)量大烦却、數(shù)據(jù)變化非常快(數(shù)據(jù)增長快先巴、流量分布變化大其爵、數(shù)據(jù)間耦合結(jié)構(gòu)變化快)、數(shù)據(jù)源很多
- CAP伸蚯、BASE
CAP:
Consistency摩渺、Availablity、Partition tolerence分區(qū)容錯(cuò)性
C:多個(gè)數(shù)據(jù)節(jié)點(diǎn)上的數(shù)據(jù)一致朝卒;
A:用戶發(fā)出請求后的有限時(shí)間范圍內(nèi)返回結(jié)果证逻;
P:network partition,網(wǎng)絡(luò)發(fā)生分區(qū)后抗斤,服務(wù)是否依然可用囚企;
CAP理論:一個(gè)分布式系統(tǒng)不可能同時(shí)滿足C、A瑞眼、P三個(gè)特性龙宏,最多可同時(shí)滿足其中兩者;對于分布式系統(tǒng)滿足分區(qū)容錯(cuò)性幾乎是必須的伤疙。
AP:
C:弱一致性银酗;
CP:
BASE:BA,S徒像,E黍特,基于CAP演化而來
BA:Basically Available,基本可用锯蛀;
S:Soft state灭衷,軟狀態(tài)/柔性事務(wù),即狀態(tài)可以在一個(gè)時(shí)間窗口內(nèi)是不同步的旁涤;
E:Eventually consistency翔曲,最終一致性迫像;
2、Redis介紹
- REmote DIctionary Server:遠(yuǎn)程字典服務(wù)器或數(shù)據(jù)結(jié)構(gòu)服務(wù)器瞳遍,k/v闻妓,數(shù)據(jù)結(jié)構(gòu);
內(nèi)存存儲(chǔ):in-memroy掠械,鍵和值都在內(nèi)存中存儲(chǔ)
持久化:為了保證數(shù)據(jù)的持久化由缆,redis會(huì)將內(nèi)存中的數(shù)據(jù)以快照或AOF的方式存儲(chǔ)到磁盤上
主從(sentinel)
Cluster(shard) - 程序環(huán)境:
安裝:yum install redis 在epel源里
配置文件:/etc/redis.conf
主程序:/usr/bin/redis-server
端口:6379/tcp
客戶端:/usr/bin/redis-cli
Unit File:/usr/lib/systemd/system/redis.service
數(shù)據(jù)目錄:/var/lib/redis - redis:k/v
key:直接ASCII字符串;
value:strings(字符串), lists(數(shù)組), hashes(含有子健和值), sets(集合), sorted sets(有序集合), bitmaps(位圖), hyperloglogs猾蒂,geo(基于位置經(jīng)緯度做搜索) - 客戶端redis-cli命令:
Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
-h HOST
-p PORT
-a PASSWORD
-n DBID ---redis也有數(shù)據(jù)庫犁功,用數(shù)字表示,默認(rèn)有0-15號數(shù)據(jù)庫婚夫,共16個(gè),可以在配置文件中修改數(shù)據(jù)庫的數(shù)量 - 與Connection相關(guān)命令:
help @connection
AUTH <password> ---輸入密碼進(jìn)行認(rèn)證
ECHO <message>
PING ---ping服務(wù)器是否存活署鸡,如果是好的會(huì)回應(yīng)pang
QUIT ---客戶端退出連接
SELECT dbid ---切換數(shù)據(jù)庫 - 清空數(shù)據(jù)庫:
FLUSHDB:清空當(dāng)前數(shù)據(jù)庫案糙;
FLUSHALL:清空所有數(shù)據(jù)庫;
3靴庆、Redis數(shù)據(jù)結(jié)構(gòu)舉例
1时捌、安裝、啟動(dòng)炉抒、客戶端連接和切庫
[root@centos7 .ssh]#redis-cli -h 172.18.21.107 -p 6379 ---可以連接到本機(jī)的某個(gè)地址和端口
172.18.21.107:6379> quit
[root@centos7 .ssh]#redis-cli ---不加默認(rèn)連接到本機(jī)的127.0.0.1地址的6379端口
127.0.0.1:6379> select 0 ---默認(rèn)連接后進(jìn)入的是0號數(shù)據(jù)庫
OK
127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]> select 1 ---可以進(jìn)行切庫
OK
2奢讨、字符串string數(shù)據(jù)結(jié)構(gòu)
127.0.0.1:6379[1]> help @string ---可以查看幫助
127.0.0.1:6379[1]> set mykey 'hello redis' ---增加一個(gè)鍵和值
OK
127.0.0.1:6379[1]> get mykey ---獲取鍵和值
"hello redis"
127.0.0.1:6379[1]> append mykey ' ,how old are you' ---在存在的鍵的后面追加值
(integer) 28
127.0.0.1:6379[1]> get mykey
"hello redis ,how old are you"
127.0.0.1:6379[1]> strlen mykey ---查看面mykey鍵的值的長度
(integer) 28
127.0.0.1:6379[1]> set mykey 'hi redis' EX 100 ---修改鍵的值,并設(shè)定過期時(shí)間為100s
OK
127.0.0.1:6379[1]> get mykey
"hi redis"
127.0.0.1:6379[1]> set mykey 'hello' NX ---如果mykey 這個(gè)鍵不存在才創(chuàng)建焰薄,存在就不創(chuàng)建出現(xiàn)nil
(nil)
127.0.0.1:6379[1]> set mykey 'hello' XX ---如果存在這個(gè)鍵才修改
OK
127.0.0.1:6379[1]> get mykey
"hello"
127.0.0.1:6379[1]> set mykeytwo value EX 100 XX ---XX表示如果存在才創(chuàng)建拿诸,不存在就不創(chuàng)建
(nil)
127.0.0.1:6379[1]> set count 0 ---創(chuàng)建一個(gè)鍵值為整數(shù)
OK
127.0.0.1:6379[1]> incr count ---自增
(integer) 1
127.0.0.1:6379[1]> incrby count 2
(integer) 3
127.0.0.1:6379[1]> incrby count 2 ---以多少進(jìn)行自增
(integer) 5
127.0.0.1:6379[1]> decr count
(integer) 4
127.0.0.1:6379[1]> decrby count 2 ---以多少進(jìn)行自減
(integer) 2
127.0.0.1:6379[1]> del count ---刪除鍵
(integer) 1
127.0.0.1:6379[1]> get count
(nil)
3、數(shù)組list數(shù)據(jù)結(jié)構(gòu)
127.0.0.1:6379[1]> help @list
127.0.0.1:6379[1]> lpush weekdays sat ---在weekdays數(shù)組中增加一個(gè)元素為sat塞茅,并且是左側(cè)入站亩码,rpush表示右側(cè)入站,也就是在數(shù)組中加入元素的時(shí)候是從左側(cè)加還是從右側(cè)加入的
(integer) 1
127.0.0.1:6379[1]> lpush weekdays fri
(integer) 2
127.0.0.1:6379[1]> lpush weekdays thu ---數(shù)組的名字是鍵野瘦,數(shù)組中的元素是值
(integer) 3
127.0.0.1:6379[1]> lindex weekdays 0 ---查看數(shù)組的索引為0的元素
"thu"
127.0.0.1:6379[1]> lindex weekdays 1
"fri"
127.0.0.1:6379[1]> lindex weekdays 3
(nil)
127.0.0.1:6379[1]> lindex weekdays 2
"sat"
127.0.0.1:6379[1]> lpush weekdays tue
(integer) 4
127.0.0.1:6379[1]> linsert weekdays after tue wed ---在tue元素之后插入wed元素
(integer) 5
127.0.0.1:6379[1]> lrange weekdays 0 4 ---查看數(shù)組的索引下標(biāo)為0-4的元素
1) "tue"
2) "wed"
3) "thu"
4) "fri"
5) "sat"
127.0.0.1:6379[1]> rpop weekdays ---從右側(cè)出站
"sat"
127.0.0.1:6379[1]> lrange weekdays 0 4 ---查看一下上面的元素已經(jīng)沒有了
1) "tue"
2) "wed"
3) "thu"
4) "fri"
127.0.0.1:6379[1]> lrem weekdays 2 wed ---從中間刪除某個(gè)元素
(integer) 1
127.0.0.1:6379[1]> lrange weekdays 0 4
1) "tue"
2) "thu"
3) "fri"
127.0.0.1:6379[1]> llen weekdays ---查看數(shù)組中元素的個(gè)數(shù)
(integer) 3
127.0.0.1:6379[1]> lpush weekdays sun
(integer) 4
127.0.0.1:6379[1]> lrange weekdays 0 4
1) "sun"
2) "tue"
3) "thu"
4) "fri"
127.0.0.1:6379[1]> lindex weekdays 0
"sun"
127.0.0.1:6379[1]> lindex weekdays 1
"tue"
127.0.0.1:6379[1]> lindex weekdays 2
"thu"
127.0.0.1:6379[1]> lindex weekdays 3
"fri"
127.0.0.1:6379[1]> lindex weekdays 4
(nil)
3描沟、hash數(shù)據(jù)結(jié)構(gòu)
127.0.0.1:6379[1]> help @hash
127.0.0.1:6379[1]> HMSET member name jerry age 17 gender female ---member為鍵,name鞭光、age吏廉、gender為它的子健,jerry惰许、17席覆、female為子健的值
OK
127.0.0.1:6379[1]> hkeys member ---查看所有的子健
1) "name"
2) "age"
3) "gender"
127.0.0.1:6379[1]> HVALS member ---查看所有子健的值
1) "jerry"
2) "17"
3) "female"
127.0.0.1:6379[1]> HSTRLEN member name ---查看name子健的值的長度
(integer) 5
127.0.0.1:6379[1]> HSTRLEN member age
(integer) 2
127.0.0.1:6379[1]> HGETALL member ---查看所有子健和值
1) "name"
2) "jerry"
3) "age"
4) "17"
5) "gender"
6) "female"
127.0.0.1:6379[1]> HDEL member gender ---刪除某個(gè)子健
(integer) 1
127.0.0.1:6379[1]> HGETALL member
1) "name"
2) "jerry"
3) "age"
4) "17"
4、集合set數(shù)據(jù)結(jié)構(gòu)
127.0.0.1:6379[1]> help @set
127.0.0.1:6379[1]> SADD animals elephant wolf tiger monkey fox dog cat ---添加一個(gè)集合
(integer) 7
127.0.0.1:6379[1]> SADD jiaqin pig dog chiken duck fish
(integer) 5
127.0.0.1:6379[1]> SMEMBERS animals ---查看集合中的成員
1) "monkey"
2) "tiger"
3) "cat"
4) "elephant"
5) "fox"
6) "dog"
7) "wolf"
127.0.0.1:6379[1]> SMEMBERS jiaqin
1) "pig"
2) "chiken"
3) "duck"
4) "dog"
5) "fish"
127.0.0.1:6379[1]> SCARD animals ---查看集合中成員的數(shù)量
(integer) 7
127.0.0.1:6379[1]> SPOP animals ---隨機(jī)的扇出一個(gè)成員
"monkey"
127.0.0.1:6379[1]> SREM jiaqin fish ---刪除某個(gè)集合中的指定成員
(integer) 1
127.0.0.1:6379[1]> SINTER animals jiaqin ---求交集
1) "dog"
127.0.0.1:6379[1]> SDIFF animals jiaqin ---求差集啡省,表示animals中有而jiaqin中沒有的成員
1) "wolf"
2) "cat"
3) "fox"
4) "elephant"
5) "tiger"
127.0.0.1:6379[1]> SDIFF jiaqin animals ---和上面的正好相反
1) "pig"
2) "chiken"
3) "duck"
127.0.0.1:6379[1]> SUNION animals jiaqin ---求并集
1) "cat"
2) "chiken"
3) "elephant"
4) "fox"
5) "duck"
6) "dog"
7) "wolf"
8) "tiger"
9) "pig"
5娜睛、有序集合sorted_set數(shù)據(jù)結(jié)構(gòu)
127.0.0.1:6379[1]> help @sorted_set
127.0.0.1:6379[1]> ZADD name 1 tom 3 jerry 9 obama 7 trump 4 bush ---添加鍵和值髓霞,name是鍵,后面名字是值畦戒,數(shù)字是給值打的分?jǐn)?shù)方库,根據(jù)這個(gè)分?jǐn)?shù)才能進(jìn)行排序,變成有序集合
(integer) 5
127.0.0.1:6379[1]> ZSCORE name trump ---查找trump的分?jǐn)?shù)
"7"
127.0.0.1:6379[1]> ZRANK name trump ---查找trump的索引障斋,索引是按照分?jǐn)?shù)從低到高進(jìn)行排序的纵潦,從0開始
(integer) 3
127.0.0.1:6379[1]> ZRANK name tom
(integer) 0
127.0.0.1:6379[1]> ZRANK name jerry
(integer) 1
127.0.0.1:6379[1]> ZRANK name obama
(integer) 4
127.0.0.1:6379[1]> ZRANGE name 1 3 根據(jù)索引進(jìn)行查找
1) "jerry"
2) "bush"
3) "trump"
127.0.0.1:6379[1]> ZRANGEBYSCORE name 3 10 ---根據(jù)分?jǐn)?shù)進(jìn)行查找
1) "jerry"
2) "bush"
3) "trump"
4) "obama"
6、發(fā)布訂閱隊(duì)列pubsub數(shù)據(jù)結(jié)構(gòu)
127.0.0.1:6379[1]> help @pubsub
127.0.0.1:6379[1]> PUBLISH ops 'rhel 8.0 is coming'
(integer) 0 ---發(fā)布一個(gè)頻道為ops垃环,內(nèi)容為rhel 8.0 is coming
復(fù)制打開另外一個(gè)終端
[root@centos7 app]#redis-cli
127.0.0.1:6379> SUBSCRIBE ops ---在另外一個(gè)終端訂閱這個(gè)頻道
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ops"
3) (integer) 1
在第一終端的ops頻道再發(fā)布一個(gè)消息
127.0.0.1:6379[1]> PUBLISH ops 'good morning'
(integer) 1
在另外一個(gè)終端可以看到這個(gè)消息邀层,因?yàn)檫@個(gè)終端訂閱了這個(gè)頻道,所有訂閱了這個(gè)頻道的終端都可以看到這個(gè)消息
1) "message"
2) "ops"
3) "good morning"
4遂庄、配置和使用redis
vim /etc/redis.conf
- 通用配置項(xiàng):
daemonize:設(shè)置為no寥院,如果設(shè)置為yes以守護(hù)進(jìn)程的方式運(yùn)行就不受systemd的控制了,設(shè)置成no時(shí)以systmectl啟動(dòng)時(shí)會(huì)以守護(hù)進(jìn)程的方式運(yùn)行
supervised:一般設(shè)置為no涛目,意思是受不受upstart(centos6)和systemd(centos7)的監(jiān)督秸谢,這一項(xiàng)設(shè)置成yes和no都可以,因?yàn)榧词故芩麄兊谋O(jiān)督霹肝,redis運(yùn)行出問題了也不會(huì)將結(jié)果反饋給他們
loglevel, pidfile, logfile,
databases:設(shè)定數(shù)據(jù)庫數(shù)量估蹄,默認(rèn)為16個(gè),每個(gè)數(shù)據(jù)庫的名字均為整數(shù)沫换,從0開始編號臭蚁,默認(rèn)操作的數(shù)據(jù)庫為0;
切換數(shù)據(jù)庫的方法:
SELECT <dbid>
- 網(wǎng)絡(luò)配置項(xiàng):
bind IP ---bind 0.0.0.0表示監(jiān)聽在本機(jī)的所有ip
port PORT
protected-mode ---表示啟動(dòng)保護(hù)模式讯赏,當(dāng)bind后面沒有寫ip地址并且配置文件中沒有設(shè)置連接到redis主機(jī)的密碼時(shí)會(huì)啟動(dòng)保護(hù)模式垮兑,用戶連接的時(shí)候?qū)?huì)失敗
tcp-backlog ---tcp的后援隊(duì)列長度
unixsocket
timeout:在客戶端空閑幾秒鐘后關(guān)閉連接
- 安全配置:
requirepass <PASSWORD> ---設(shè)置連接到redis服務(wù)器的密碼
[root@centos7 .ssh]#systemctl restart redis
[root@centos7 .ssh]#redis-cli
127.0.0.1:6379> KEYS * ---連入后如果不輸入密碼是看不到數(shù)據(jù)庫的
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH centos ---輸入密碼后可以看到了
OK
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> KEYS *
1) "member"
2) "mykey"
3) "name"
4) "jiaqin"
5) "weekdays"
6) "animals"
[root@centos7 .ssh]#redis-cli -a centos ---也可以連接的時(shí)候直接指明密碼
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> KEYS *
1) "member"
2) "mykey"
3) "name"
4) "jiaqin"
5) "weekdays"
6) "animals"
rename-command <COMMAND> <NEW_CMND_NAME> ---
對config命令進(jìn)行重命名,客戶端連接到redis后待逞,使用config命令
可以改變r(jià)edis在運(yùn)行時(shí)的服務(wù)特性甥角,這個(gè)命令比較危險(xiǎn),最好別
人不知道這個(gè)命令叫什么识樱,但在AOF或Replication環(huán)境中嗤无,為了
管理方便,使從服務(wù)器也知道這個(gè)命令的名字怜庸,不建議重命名
- Limits相關(guān)的配置:
maxclients:最大并發(fā)連接數(shù)当犯,默認(rèn)是1000
maxmemory <bytes>:最大內(nèi)存,單位是字節(jié)
maxmemory-policy noeviction:定義淘汰策略割疾,默認(rèn)是noeviction表示不淘汰嚎卫,當(dāng)內(nèi)存空間被占滿時(shí),不允許寫數(shù)據(jù),會(huì)返回錯(cuò)誤信息
一般volatile-ttl策略比較好拓诸,表示當(dāng)內(nèi)存空間要滿了時(shí)侵佃,會(huì)淘汰馬上要到期的鍵
淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction
maxmemory-samples 5:淘汰算法運(yùn)行時(shí)的采樣樣本數(shù),樣本數(shù)越多越精確奠支,但出于性能考慮設(shè)置成5就可以了
- SlowLog相關(guān)的配置:
slowlog-log-slower-than 10000 單位是微秒馋辈;查詢時(shí)間超過10毫秒的就認(rèn)為是慢查詢,就記錄到慢查詢?nèi)罩局?slowlog-max-len 128:設(shè)置慢查詢?nèi)罩咀疃嘤涗浂嗌贄l記錄倍谜;
- ADVANCED配置:
hash-max-ziplist-entries 512:一個(gè)hash內(nèi)部最多能容納多少個(gè)子健
hash-max-ziplist-value 64:每個(gè)子健的值最大不能超過多少個(gè)字節(jié)
list-max-ziplist-size -2:每個(gè)子健的值允許占的最大空間迈螟;
client-output-buffer-limit normal 0 0 0 正常客戶端
client-output-buffer-limit slave 256mb 64mb 60 從服務(wù)器的客戶端
client-output-buffer-limit pubsub 32mb 8mb 60 連接到隊(duì)列服務(wù)器的客戶端
redis的數(shù)據(jù)先存到內(nèi)存緩沖區(qū)尔崔,客戶端連接時(shí)通過內(nèi)存緩沖不區(qū)
輸出給客戶端答毫,以上三項(xiàng)是用來定義發(fā)送給客戶端的緩沖區(qū)的大
小, 比如:256mb 64mb 60分別表示硬限制季春、軟限制和軟限制
的寬限期
- 配置參數(shù)可運(yùn)行時(shí)修改
127.0.0.1:6379> INFO ----服務(wù)器狀態(tài)信息查看,分為多個(gè)段
127.0.0.1:6379> INFO memory
127.0.0.1:6379> INFO replication ---只查看某個(gè)段
127.0.0.1:6379> INFO stats
127.0.0.1:6379> CONFIG RESETSTAT ----重新計(jì)數(shù)
127.0.0.1:6379> CONFIG GET requirepass ---可以查看密碼
1) "requirepass"
2) "centos"
127.0.0.1:6379> CONFIG GET maxclients
1) "maxclients"
2) "10000"
127.0.0.1:6379> CONFIG SET maxclients 10200 ---修改最大并發(fā)連接
OK
127.0.0.1:6379> CONFIG GET maxclients
1) "maxclients"
2) "10200"
127.0.0.1:6379> CONFIG REWRITE ---寫到配置文件里
OK
vim /etc/redis.conf
maxclients 10200 ---發(fā)現(xiàn)配置文件里已經(jīng)修改洗搂,運(yùn)用config set
可以修改運(yùn)行時(shí)的參數(shù)并寫到配置文件里,所以說config這個(gè)命令
很危險(xiǎn)载弄,不能讓別人知道蚕脏。
- 查看客戶端的連接
127.0.0.1:6379> CLIENT list ---查看有幾個(gè)客戶端連接到本機(jī)
id=3 addr=127.0.0.1:45178 fd=5 name= age=613 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
id=4 addr=127.0.0.1:45180 fd=6 name= age=3 idle=3 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=command
127.0.0.1:6379> CLIENT SETNAME n1 ---給客戶端命名
OK
127.0.0.1:6379> CLIENT list
id=3 addr=127.0.0.1:45178 fd=5 name=n1 age=628 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
id=4 addr=127.0.0.1:45180 fd=6 name= age=18 idle=18 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=command
127.0.0.1:6379[1]> CLIENT KILL id 4 ---殺死某個(gè)客戶端
(integer) 1
127.0.0.1:6379[1]> CLIENT list ---發(fā)現(xiàn)id為4的客戶端沒有了
id=3 addr=127.0.0.1:45178 fd=5 name=n1 age=725 idle=0 flags=N db=1 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
5、redis的持久化
- RDB:snapshotting, 二進(jìn)制格式侦锯;按事先定制的策略,周期性地將數(shù)據(jù)從內(nèi)存同步至磁盤秦驯;數(shù)據(jù)文件默認(rèn)為dump.rdb尺碰;
客戶端顯式使用SAVE或BGSAVE命令來手動(dòng)啟動(dòng)快照保存機(jī)制;
SAVE:同步译隘,即在主線程中保存快照亲桥,此時(shí)會(huì)阻塞所有客戶端請求;不會(huì)丟失數(shù)據(jù)
BGSAVE:異步固耘;backgroud题篷,啟動(dòng)一個(gè)子進(jìn)程去保存快照并在后臺運(yùn)行,不會(huì)阻塞客戶端的請求厅目,但有可能丟失數(shù)據(jù)番枚,因?yàn)橥降臅r(shí)候客戶端可能正在寫數(shù)據(jù)
[root@centos7 ~]#cd /var/lib/redis/
[root@centos7 redis]#ls
dump.rdb
- AOF:Append Only File, fsync(aof文件重寫)
記錄每次寫操作至指定的文件尾部實(shí)現(xiàn)的持久化;當(dāng)redis重啟時(shí)损敷,可通過重新執(zhí)行文件中的命令在內(nèi)存中重建出數(shù)據(jù)庫葫笼;相當(dāng)于mysql的二進(jìn)制日志,可以進(jìn)行時(shí)間點(diǎn)還原
BGREWRITEAOF:AOF文件重寫拗馒;
不會(huì)讀取正在使用AOF文件路星,而是通過將內(nèi)存中的數(shù)據(jù)以命令的方式保存至臨時(shí)文件中,完成之后替換原來的AOF文件诱桂; - RDB相關(guān)的配置:
*save <seconds> <changes>
save 900 1
save 300 10
save 60 10000
表示:三個(gè)策略滿足其中任意一個(gè)均會(huì)觸發(fā)SNAPSHOTTING操作洋丐;900s內(nèi)至少有一個(gè)key有變化呈昔,300s內(nèi)至少有10個(gè)key有變化,60s內(nèi)至少有1W個(gè)key發(fā)生變化友绝;
stop-writes-on-bgsave-error yes
持久功能堤尾,也就是保存到磁盤操作出現(xiàn)錯(cuò)誤時(shí),是否禁止新的寫入操作請求九榔;
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb:指定rdb文件名
dir /var/lib/redis:rdb文件的存儲(chǔ)路徑
- AOF相關(guān)的配置
appendonly no ---如果改成yes表示啟用AOF持久化功能哀峻,RDB和AOF持久化功能可以同時(shí)啟用是沒有問題的
[root@centos7 redis]#ls /var/lib/redis/ ---啟用之后會(huì)發(fā)現(xiàn)數(shù)據(jù)目錄有兩個(gè)文件了
appendonly.aof dump.rdb
appendfilename "appendonly.aof"
appendfsync :AOF重寫有以下三種模式
no:redis不執(zhí)行主動(dòng)同步操作,而是由操作系統(tǒng)自行決定哲泊;
everysec:每秒一次剩蟀; 默認(rèn)
always:每語句一次;
no-appendfsync-on-rewrite no:是否在執(zhí)行aof重寫期間開啟一個(gè)后端的子進(jìn)程切威,默認(rèn)為no育特,表示啟用;但如果重寫的模式為no先朦,則不建議開啟缰冤,因?yàn)椴恢朗裁磿r(shí)候會(huì)重寫
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
上述兩個(gè)條件同時(shí)滿足時(shí),方會(huì)觸發(fā)重寫AOF喳魏;與上次aof文件大小相比棉浸,其增長量超過100%,且大小不少于64MB;
aof-load-truncated yes :AOF開啟時(shí)要不要重新清理一下aof文件
注意:持久機(jī)制本身不能取代備份刺彩;應(yīng)該制訂備份策略迷郑,對redis庫定期備份;
RDB與AOF同時(shí)啟用:
(1) BGSAVE和BGREWRITEAOF不會(huì)同時(shí)進(jìn)行创倔;
(2) Redis服務(wù)器啟動(dòng)時(shí)用持久化的數(shù)據(jù)文件恢復(fù)數(shù)據(jù)嗡害,會(huì)優(yōu)先使用AOF;
6畦攘、redis的主從復(fù)制
特點(diǎn):一個(gè)Master可以有多個(gè)slave主機(jī)霸妹,支持鏈?zhǔn)綇?fù)制;
Master以非阻塞方式同步數(shù)據(jù)至slave主機(jī)知押;
配置slave節(jié)點(diǎn):
redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>
redis-cli> CONFIG SET masterauth <PASSWORD>
配置參數(shù):
slaveof :指明主節(jié)點(diǎn)redis監(jiān)聽的ip地址和端口號叹螟,只在從上設(shè)置
masterauth:指明主節(jié)點(diǎn)的密碼,只在從節(jié)點(diǎn)的設(shè)置
slave-serve-stale-data yes:是否可以用過期的數(shù)據(jù)響應(yīng)客戶端的請求
slave-read-only yes:從節(jié)點(diǎn)只允許讀操作
repl-diskless-sync no :要不要啟用無磁盤的復(fù)制台盯,新的從節(jié)點(diǎn)或某較長時(shí)間未能與主節(jié)點(diǎn)進(jìn)行同步的從節(jié)點(diǎn)重新與主節(jié)點(diǎn)通信首妖,需要做“full synchronization",此時(shí)其同步方式有兩種style:
Disk-backend:主節(jié)點(diǎn)新創(chuàng)建快照文件于磁盤中爷恳,而后將其發(fā)送給從節(jié)點(diǎn)有缆;
Diskless:主節(jié)點(diǎn)新創(chuàng)建快照后直接通過網(wǎng)絡(luò)套接字文件發(fā)送給從節(jié)點(diǎn);為了實(shí)現(xiàn)并行復(fù)制,通常需要在復(fù)制啟動(dòng)前延遲一個(gè)時(shí)間段棚壁;
repl-diskless-sync-delay 5 :發(fā)送快照時(shí)是否延遲發(fā)送
repl-ping-slave-period 10 主節(jié)點(diǎn)多長時(shí)間探測一下從節(jié)點(diǎn)是否存活
repl-timeout 60:主從復(fù)制的超時(shí)時(shí)長
repl-disable-tcp-nodelay no :發(fā)送tcp響應(yīng)時(shí)是否延遲
repl-backlog-size 1mb從服務(wù)器后援隊(duì)列的大小
slave-priority 100:復(fù)制集群中杯矩,主節(jié)點(diǎn)故障時(shí),sentinel應(yīng)用場景中的主節(jié)點(diǎn)選舉時(shí)使用的優(yōu)先級袖外;數(shù)字越小優(yōu)先級越高史隆,但0表示不參與選舉;
min-slaves-to-write 3:主節(jié)點(diǎn)僅允許其能夠通信的從節(jié)點(diǎn)數(shù)量大于等于此處的值時(shí)接受寫操作曼验;
min-slaves-max-lag 10:從節(jié)點(diǎn)延遲時(shí)長超出此處指定的時(shí)長時(shí)泌射,主節(jié)點(diǎn)會(huì)拒絕寫入操作;
示例
1鬓照、同步所有節(jié)點(diǎn)的時(shí)間
2熔酷、在node2上的設(shè)置
vim /etc/redis.conf
bind 0.0.0.0
requirepass centos ---設(shè)置客戶端連接本節(jié)點(diǎn)的密碼
slaveof 172.18.21.107 6379 ---指明主的地址和端口
masterauth centos ---指明主的密碼
systemctl start redis
redis-cli -a centos
127.0.0.1:6379[1]> INFO replication ---查看一下主從復(fù)制的相關(guān)信息,發(fā)現(xiàn)角色是從
測試
在主節(jié)點(diǎn)node1上創(chuàng)建一個(gè)鍵和值
127.0.0.1:6379[1]> set mykey 'hello redis'
在從節(jié)點(diǎn)node2上
127.0.0.1:6379[1]> get mykey ---可以看到豺裆,說明主從復(fù)制成功
"hello redis"
3拒秘、在node3上采用config命令在運(yùn)行時(shí)創(chuàng)建主從復(fù)制
vim /etc/redis.conf
bind 0.0.0.0
requirepass centos
systemctl start redis
ss -nlt
[root@node3 ~]#redis-cli -a centos ---連接到此服務(wù)器
127.0.0.1:6379> CONFIG GET slaveof
1) "slaveof"
2) ""
127.0.0.1:6379> slaveof 172.18.21.107 6379 ---指明主節(jié)點(diǎn)的ip和端口
OK
127.0.0.1:6379> CONFIG GET slaveof
1) "slaveof"
2) "172.18.21.107 6379"
127.0.0.1:6379> CONFIG set masterauth centos ---指明主節(jié)點(diǎn)的密碼
OK
127.0.0.1:6379> CONFIG GET masterauth
1) "masterauth"
2) "centos"
127.0.0.1:6379> CONFIG REWRITE ---寫到配置文件里
OK
[root@node3 ~]#tail -n 3 /etc/redis.conf ---發(fā)現(xiàn)已經(jīng)追加到配置文件的最后
# Generated by CONFIG REWRITE
slaveof 172.18.21.107 6379
masterauth "centos"
127.0.0.1:6379> INFO replication
# Replication
role:slave ---角色已經(jīng)變成從
master_host:172.18.21.107
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:1704
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> KEYS * ---可以看到前面創(chuàng)建的鍵
1) "mykey"
127.0.0.1:6379[1]> get mykey
"hello slave 2"
7、redis的故障轉(zhuǎn)移
redis的故障轉(zhuǎn)移通過sentinel完成:主要完成三個(gè)功能:監(jiān)控臭猜、通知躺酒、自動(dòng)故障轉(zhuǎn)移,主節(jié)點(diǎn)蕩機(jī)了蔑歌,會(huì)自動(dòng)提升一個(gè)從節(jié)點(diǎn)為新的主節(jié)點(diǎn)
選舉機(jī)制:流言協(xié)議羹应、投票協(xié)議
流言協(xié)議:不能主觀的判斷某一個(gè)節(jié)點(diǎn)不可用,而是問其他節(jié)點(diǎn)能不能找到主節(jié)點(diǎn)次屠,如果其他的也找不到主幾點(diǎn)才證明主節(jié)點(diǎn)真的蕩機(jī)了
投票協(xié)議:with quorum > total/2量愧,without quorum <=total/2,quorum表示sentinel集群的quorum機(jī)制帅矗,比如有三個(gè)sentinel節(jié)點(diǎn),至少有2個(gè)節(jié)點(diǎn)同時(shí)判定主節(jié)點(diǎn)故障時(shí)煞烫,才認(rèn)為其真的故障浑此,才會(huì)進(jìn)行故障轉(zhuǎn)移
配置參數(shù)
sentinel monitor <master-name> <ip> <redis-port> <quorum>:監(jiān)控的主節(jié)點(diǎn)的名字、ip地址滞详、端口凛俱、法定人數(shù)
sentinel auth-pass <master-name> <password>:監(jiān)控的主節(jié)點(diǎn)的名字和密碼
<quorum>表示sentinel集群的quorum機(jī)制,即至少有quorum個(gè)sentinel節(jié)點(diǎn)同時(shí)判定主節(jié)點(diǎn)故障時(shí)料饥,才認(rèn)為其真的故障蒲犬;
s_down: subjectively down ---主觀判斷其故障
o_down: objectively down ----客觀判斷其故障
sentinel down-after-milliseconds <master-name> <milliseconds>:監(jiān)控到指定的集群的主節(jié)點(diǎn)異常狀態(tài)持續(xù)多久方才將標(biāo)記為“故障”;單位是毫秒
sentinel parallel-syncs <master-name> <numslaves>:指在failover故障轉(zhuǎn)移過程中岸啡,能夠被sentinel并行配置的從節(jié)點(diǎn)的數(shù)量原叮;
sentinel failover-timeout <master-name> <milliseconds>:sentinel必須在此指定的時(shí)長內(nèi)完成故障轉(zhuǎn)移操作,否則,將視為故障轉(zhuǎn)移操作失敺芰ァ擂送;
sentinel notification-script <master-name> <script-path>:通知腳本,此腳本被自動(dòng)傳遞多個(gè)參數(shù)唯欣;
示例:本實(shí)驗(yàn)是在6主從復(fù)制的基礎(chǔ)上完成的
1嘹吨、在node1節(jié)點(diǎn)上的設(shè)置
vim /etc/redis-sentinel.conf
bind 0.0.0.0 ---注意一定要加上監(jiān)聽的ip地址,不然會(huì)啟動(dòng)保護(hù)模式境氢,此行配置文件中沒有蟀拷,需要后加上
sentinel monitor mymaster 172.18.21.107 6379 2 ---只監(jiān)控主節(jié)點(diǎn)就可以,給主節(jié)點(diǎn)起個(gè)名字叫mymaster
sentinel auth-pass mymaster centos ---監(jiān)控的主節(jié)點(diǎn)的名字和密碼
sentinel down-after-milliseconds mymaster 5000 ---主節(jié)點(diǎn)故障5秒后標(biāo)記為故障狀態(tài)
sentinel parallel-syncs mymaster 3 ---故障轉(zhuǎn)移過程中能夠被sentinel并行配置的從節(jié)點(diǎn)的數(shù)量是3
sentinel failover-timeout mymaster 60000 ---故障轉(zhuǎn)移時(shí)間超過1分鐘認(rèn)為失敗
將此配置拷貝到node2和node3節(jié)點(diǎn)上
scp /etc/redis-sentinel.conf node2:/etc/
scp /etc/redis-sentinel.conf node3:/etc/
2萍聊、在三個(gè)節(jié)點(diǎn)上都啟動(dòng)redis-sentinel
systemctl start redis-sentinel.service
ss -nlt ---發(fā)現(xiàn)26379端口已經(jīng)打開
3问芬、在node1上連接到redis-sentinel
redis-cli -h 172.18.21.107 -p 26379
172.18.21.107:26379> sentinel masters ---查看主節(jié)點(diǎn)的信息
172.18.21.107:26379> sentinel slaves mymaster -=--查看從節(jié)點(diǎn)的信息,查看從節(jié)點(diǎn)時(shí)要指明查看哪個(gè)主節(jié)點(diǎn)的從節(jié)點(diǎn)脐区,后面要加上mymaster愈诚,指明主節(jié)點(diǎn)的名字
4、測試
停止node1節(jié)點(diǎn)的redis服務(wù)
systemctl stop redis
redis-cli -h 172.18.21.107 -p 26379
172.18.21.107:26379> sentinel masters ---查看主節(jié)點(diǎn)發(fā)現(xiàn)主節(jié)
點(diǎn)變成了node3牛隅,這里因?yàn)闆]有設(shè)置優(yōu)先級炕柔,所以會(huì)根據(jù)ip地址自
動(dòng)提升一個(gè)從為主節(jié)點(diǎn),可以通過修改配置文件中slave-priority
100來設(shè)置優(yōu)先級媒佣,數(shù)字越小優(yōu)先級越高
172.18.21.107:26379> sentinel slaves mymaster ---從節(jié)點(diǎn)變成node1和node2匕累,并且node1的狀態(tài)為 "s_down,slave,disconnected"主觀故障
5、恢復(fù)node1節(jié)點(diǎn)默伍,使其成為正常工作的從節(jié)點(diǎn)
在node1上的操作
vim /etc/redis.conf
slaveof 172.18.21.7 6379
masterauth centos
repl-diskless-sync no ---將此項(xiàng)改為no欢嘿,如果前面當(dāng)主的時(shí)候改成了Diskless或者Disk-backend
systemctl start redis
6、測試
redis-cli -h 172.18.21.107 -p 26379
172.18.21.107:26379> sentinel masters
172.18.21.107:26379> sentinel slaves mymaste ---查看到node1為slave也糊,而不是"s_down,slave,disconnected"
備注:
SENTINEL failover <MASTER_NAME> ---手動(dòng)觸發(fā)故障轉(zhuǎn)移 failover故障轉(zhuǎn)移
SENTINEL get-master-addr-by-name <MASTER_NAME>
172.18.21.107:26379> SENTINEL get-master-addr-by-name mymaster ---可以獲得主的地址和端口
1) "172.18.21.7"
2) "6379"
8炼蹦、redis集群
redis集群會(huì)在所有redis節(jié)點(diǎn)上分配很多個(gè)槽,一共16384個(gè)槽狸剃,范圍是0-16383掐隐,每個(gè)節(jié)點(diǎn)上分配一定數(shù)量的槽,當(dāng)客戶端創(chuàng)建 一個(gè)鍵和值時(shí)钞馁,會(huì)對鍵進(jìn)行哈希計(jì)算虑省,將計(jì)算的結(jié)果對16384取模,也會(huì)生成0-16383之間的數(shù)字僧凰,這個(gè)數(shù)字和哪個(gè)節(jié)點(diǎn)上的哪個(gè)槽位對上探颈,此鍵就必須創(chuàng)建在這個(gè)節(jié)點(diǎn)上,因此需要客戶端的人工智能训措,也就是客戶端在創(chuàng)建一個(gè)鍵時(shí)如果和某個(gè)節(jié)點(diǎn)的某個(gè)槽位對上伪节,就必須在這個(gè)節(jié)點(diǎn)上創(chuàng)建這個(gè)鍵光羞,redis集群是將數(shù)據(jù)分別存儲(chǔ)在不同的redis節(jié)點(diǎn)的槽位上,每個(gè)節(jié)點(diǎn)的數(shù)據(jù)只是一部分架馋。
集群相關(guān)的配置:
cluster-enabled 是否開啟集群配置
cluster-config-file 集群節(jié)點(diǎn)集群信息配置文件,每個(gè)節(jié)點(diǎn)都有一個(gè),由redis生成和更新
cluster-node-timeout 集群節(jié)點(diǎn)互連超時(shí)的閾值狞山,單位毫秒
cluster-slave-validity-factor 集群服務(wù)中每個(gè)節(jié)點(diǎn)也應(yīng)該有從節(jié)點(diǎn)來避免單點(diǎn),這就需要設(shè)置故障轉(zhuǎn)移叉寂,進(jìn)行故障轉(zhuǎn)移時(shí),salve會(huì) 申請成為master萍启。有時(shí)slave會(huì)和master失聯(lián)很久導(dǎo)致數(shù)據(jù)較舊,這樣的slave不應(yīng)該成為master屏鳍。這個(gè)配置是用來設(shè)置失聯(lián)多久的從節(jié)點(diǎn)不能提升為主節(jié)點(diǎn)
cluster-require-full-coverage yes:如果任何一個(gè)節(jié)點(diǎn)故障了勘纯,并且沒有設(shè)置從節(jié)點(diǎn),導(dǎo)致槽不完整了钓瞭,還能否接受客戶端的請求驳遵,此配置是要求有完整的槽才能接受請求,因此設(shè)置為yes
配置過程:
(1) 設(shè)置配置文件山涡,啟用集群功能堤结;
(2) 啟動(dòng)redis后為每個(gè)節(jié)點(diǎn)分配slots;
CLUSTER ADDSLOTS
注意:每個(gè)slot要獨(dú)立創(chuàng)建鸭丛;可用范圍是0-16383竞穷,共16384個(gè)
(3) 設(shè)定集群成員關(guān)系;
CLUSTE MEET
示例:設(shè)置redis的三個(gè)集群服務(wù)鳞溉,此實(shí)驗(yàn)沒有設(shè)置從節(jié)點(diǎn)瘾带,三個(gè)節(jié)點(diǎn)都是主節(jié)點(diǎn)
1、在node1上的設(shè)置
vim /etc/redis.conf
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
cluster-require-full-coverage yes
scp /etc/redis.conf node2:/etc
scp /etc/redis.conf node1:/etc
min-slaves-to-write 0 ----在這里要注意要把這一項(xiàng)改為0熟菲,或者注釋掉看政,此項(xiàng)是定義主節(jié)點(diǎn)有幾個(gè)從節(jié)點(diǎn)時(shí)才允許寫,此實(shí)驗(yàn)沒有從節(jié)點(diǎn)
2抄罕、重新啟動(dòng)所有節(jié)點(diǎn)的redis服務(wù)
systemctl restart redis
3允蚣、給每個(gè)節(jié)點(diǎn)分配槽位,在node1上設(shè)置
[root@node1 ~]#echo $[16384/3] ---一般都是平均分配
5461
[root@node1 ~]#echo $[5461*2]
10922
[root@node1 ~]#redis-cli -a centos cluster addslots {0..5461}
OK
[root@node1 ~]#redis-cli -a centos -h 172.18.21.100 cluster addslots {5462..10922}
OK
[root@node1 ~]#redis-cli -a centos -h 172.18.21.7 cluster addslots {10923..16383}
OK
[root@node1 ~]#redis-cli -a centos
127.0.0.1:6379> CLUSTER INFO
cluster_state:fail ---可以看到此時(shí)的狀態(tài)還是失敗的
cluster_slots_assigned:5463 ---槽位已經(jīng)分配成功了
cluster_slots_ok:5463
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:1
cluster_size:1
cluster_current_epoch:0
cluster_my_epoch:0
cluster_stats_messages_sent:0
cluster_stats_messages_received:0
4呆贿、讓集群內(nèi)的成員會(huì)面
127.0.0.1:6379> CLUSTER MEET 172.18.21.100 6379
OK
127.0.0.1:6379> CLUSTER MEET 172.18.21.7 6379
OK
127.0.0.1:6379> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384 ---見面之后發(fā)現(xiàn)槽位一共是16384個(gè)了
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:3
cluster_size:3
cluster_current_epoch:2
cluster_my_epoch:1
cluster_stats_messages_sent:25
cluster_stats_messages_received:23
5嚷兔、測試
在node1上的操作
[root@node1 ~]#redis-cli -a centos
127.0.0.1:6379> set test1key hi
OK
127.0.0.1:6379> get test1key
"hi"
127.0.0.1:6379> set testkey2 hello ---告訴我們要到node3節(jié)點(diǎn)上設(shè)置才可以,因?yàn)閷estkey2這個(gè)鍵進(jìn)行哈希計(jì)算后榨崩,對16384取模會(huì)落到node3節(jié)點(diǎn)的槽上
(error) MOVED 14758 172.18.21.7:6379
127.0.0.1:6379>
在node3節(jié)點(diǎn)上的操作
[root@node3 ~]#redis-cli -a centos
127.0.0.1:6379> set testkey2 hello ---在node3節(jié)點(diǎn)上就可以設(shè)置了
OK
127.0.0.1:6379> get testkey2
"hello"
127.0.0.1:6379> set testkey3 sayhello
(error) MOVED 10631 172.18.21.100:6379
在node2節(jié)點(diǎn)上的操作
[root@node2 .ssh]#redis-cli -a centos
127.0.0.1:6379> set testkey3 sayhello
OK