<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Redis(全稱 REmote DIctionary Server) 是 NoSQL 型資料儲存程式,其使用了記憶體來儲存資料結構,可以作為資料庫、快取、訊息代理使用。
Redis 使用鍵值來對映資料,其資料結構支援 strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes 等型別。
Redis 叢集的官方檔案:https://redis.io/topics/cluster-tutorial
學這個的時候,建議別老是百度,還是好好啃一下官方檔案,一點點學吧。
Redis 支援三種叢集模式:
本章的內容包括搭建、測試和操作 Redis Cluster(叢集)。
主從模式,一個 Primary,多個 Secondary ,以及副本節點。
哨兵模式,不會。
Cluster 模式,主要為了提高並行能力和解決效能瓶頸。
Redis Cluster 能夠保證 Redis 服務一定程度的可用性,當叢集中一部分範例發生故障時,其餘範例還能正常執行。但是如果發生較大故障,整個 Redis 叢集可能會停止執行。
Redis 叢集的每個節點都需要使用兩個 TCP 埠,一個是常規提供給使用者端服務的埠,如 6379;而群集匯流排需要使用的埠是常規埠加上 10000 ,例如 73479。
Redis Cluster 不支援 NATted 環境,也就是不支援 Docker 重新對映埠,如果要在 Docker 上使用 Redis 叢集,則需要使用 Dockers
主機模式,即啟動 Redis 時要附加 --net=host
引數。
Redis Cluster 中,提供服務的都是 主節點(redis-master),從屬節點(redis-slave) 用於備份主節點的資料,當主節點故障時,從屬節點可以替換主節點。
Redis 多個 Redis 範例來提供功能,即分片功能,每個 Redis 範例都是主節點。例如 A、B、C 三個節點集組成一個完整的 Redis 系統,redis cluster 自動將資料分片(sharding),在每個節點上放置一部分資料,這三個節點都是主節點。
例如 有 100 條資料,前 40 條在 A中,剩下的在 B、C中。
沒有 primary,每個主節點都可以提供服務,這樣就降低了伺服器的壓力,儘量使得流量被多臺節點平均。要刪除 C ,則將 C 的資料分為兩部分,分別推播到 A 和 B 中,這就是資料複製。
但是,如果 C 故障了,那麼整個叢集則會癱瘓,因為 A、B、C 各自的資料是不同的。這就是 Redis Cluster 的缺點。
更多知識,請開啟官方檔案瞭解 https://redis.io/topics/cluster-tutorial
後面使用 & 符號來代表從屬節點,如 &C,代表 C 的從屬節點。
Redis Cluster 叢集,每個主節點有多個從屬節點,從屬節點的資料於此主節點一致。
前面提到過如果某一個主節點故障,將會導致整個叢集故障。因此,每個主節點都應該有一個從屬節點,當 C 故障時,&C (跟 C 具有一致的資料)將代替 C 工作。但是如果 C 和 &C 都故障,則整個系統也是會故障的。
Redis Cluster 的工作依賴於 redis.conf 檔案。
下面我們將來一步步手動建立叢集,過程會比較慢,如果需要儘快建立叢集,可以百度找指令碼。
為了真實,筆者使用兩臺伺服器搭建服務,共三個主節點和三個從屬節點,組成六個節點群集。
當用戶端向 C 節點寫入資料時,C 會向 &C 寫入資料以保證一致性(同步)。但是這個同步過程是非同步的,因為使用者跟 C 互動,完成互動即返回,不可能要使用者等待所有的過程完成,所以 Redis 的設計是,使用者到 C 是同步,操作後立即返回;而 C 到 &C 是非同步的,完全與使用者無關。
如果使用者端寫入資料到 C 後,C 還沒有同步資料到 &C,C 就故障了,那麼這部分資料就會丟失。因此這個從屬節點,並不能保證資料的一致性。
筆者有兩臺伺服器,其理論設計如下:
伺服器 | 節點 | port | cluster port |
---|---|---|---|
伺服器1 | A | 7001 | 17001 |
伺服器1 | B | 7002 | 17002 |
伺服器1 | C | 7003 | 17003 |
伺服器2 | &A | 7001 | 17001 |
伺服器2 | &B | 7002 | 17002 |
伺服器2 | &C | 7003 | 17003 |
實際上,由於啟動叢集時,節點是自動分配的,哪個是主節點哪個是從屬節點是機器分配,因此這裡只是作為一個設計思路處理,實際情況要看輸出結果。
在伺服器 1,建立六個目錄:
mkdir /var/redis cd /var/redis mkdir 7001 7002 7003 A B C
7001、7002、7003 都是以埠命名的,分別儲存 A、B、C 三個節點的組態檔,而 A、B、C 三個檔案是為了使用 Docker 啟動時,對映物理檔案(備份資料)。如果你不是使用 docker 啟動,則不需要 A、B、C 三個目錄。
三個埠目錄分別建立一個 redis.conf 檔案,port 的內容請根據埠填寫,其內容如下:
port 7001 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes
記得改掉 7001。
如果你只有一臺伺服器,就使用 7001-7006
和 A B C D E F
這這目錄。
如果不使用 docker 的話, 可以這樣啟動 redis:
# 命令 redis-server /var/redis/7001/redis.conf # 二進位制檔案 ./redis-server /var/redis/7001/redis.conf # 如法炮製
如果伺服器的記憶體比較低,例如 1G,2G,則需要執行下面的命令,消除 Redis 警告。
檢視 /proc/sys/net/core/somaxconn
檔案,如果值是 128,則需要修改為 1024。
修改記憶體限制:
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf sysctl vm.overcommit_memory=1
還有一個核心問題:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
其它問題請參考這裡 解決Redis啟動警告問題
拉取最新 redis 映象:
docker pull redis:latest
執行以下三個命令啟動三個 redis 範例:
docker run -itd --name redisa --net=host -v /var/redis/A:/data -v /var/redis/7001:/etc/redis redis:latest redis-server /etc/redis/redis.conf --appendonly yes
docker run -itd --name redisb --net=host -v /var/redis/B:/data -v /var/redis/7002:/etc/redis redis:latest redis-server /etc/redis/redis.conf --appendonly yes
docker run -itd --name redisc --net=host -v /var/redis/C:/data -v /var/redis/7003:/etc/redis redis:latest redis-server /etc/redis/redis.conf --appendonly yes
把本小節的內容,在另一臺伺服器上執行相同的操作。如果你是一臺伺服器,則也可以在這裡修改一下,建立 6 個容器。
命令解析:
--net=host
:使用主機網路,這樣就不需要使用 -p 來對映埠了;
-v /var/redis/B:/data
:資料持久化;
/var/redis/7002:/etc/redis
:將物理機目錄對映到容器中,裡面有個組態檔;
redis-server
: 啟動容器時執行的命令;
/etc/redis/redis.conf
:一個啟動引數,告訴 redis-server
,要使用哪個設定啟動;
--appendonly yes
:總是重啟;
如果使用 docker 安裝,則在第一臺伺服器執行命令進入容器。
docker exec -it redisa bash
然後建立叢集:
redis-cli --cluster create {ip}:7001 {ip}:7002 {ip}:7003 {ip}:7001 {ip}:7002 {ip}:7003 --cluster-replicas 1
注:請自行替換 ip 地址。
執行命令後,會自動分配 redis 範例的地位,輸入 yes 同意這種分配:
這種自動分配是最優的,避免三臺主節點都在同一臺伺服器中。
叢集搭建完畢,我們來開始學習 Redis 中的一些概念,然後使用 C# 建立程式連線 Redis 。
Redis 中,常用的資料型別有以下幾種:
所有資料都是 key-value 形式儲存,每個資料都有唯一的 key,以上資料型別是 value。
刪除一個資料的命令:DEL {key}
。
字串沒啥好說的,就是 value 為 string。
Redis 命令,要設定或使用字串型別的資料,則使用SET
或 GET
開頭的命令:
# 設定字串 SET a AAA SET b 666 # 其中 a 是 key,AAA 是 value,不需要 "" 包圍字串 # ------ # 獲取字串 GET a # ------ # 獲取多個字串 MGET a b # 使用空格分隔 key
因為 redis 沒有值型別,因此使用不加 ""
也會被識別為字串。建議加上雙引號比較好,提高可讀性。
一個 string 型別,是 key-value 結構,而雜湊則是 {key-value} 的集合,key 是 string 型別,value 可以是其它型別。
因此,可以稱 Hash 為鍵值對的集合,就是相當於 C# 中的字典型別,主要儲存有結構的資料。
Redis 中每個 hash 可以儲存 232 - 1 個鍵值對(40多億)。
Hash 使用 HMSET
、 HMGET
、HGETALL
等命令來操作雜湊表。
有一個這個的資料:
id:1, name:"痴者工良"
使用雜湊儲存:
# HMSET {key} {filed1} {value1} {filed2} {value2} ... ... HMSET user id "1" name "痴者工良"
查詢此雜湊表的所有鍵值對:
HGETALL user
檢視雜湊表的一個欄位:
HGET user id
刪除其中一個欄位:
HDEL user {欄位名稱}
列表中可以新增多中型別的元素,簡單的就是字串,列表即是資料結構中的連結串列,使用雙向列表技術實現,越靠近兩側的元素速度越快。
子元素的新增要從頭部或尾部加入,由於列表是棧,因此列表是有序的。因為列表是有序的,因此可以儲存重複的資料。
適合做例如訊息記錄(佇列),粉絲關注記錄、訂單記錄等。
列表只能新增字串。
往一個列表加入資料:
LPUSH {key} {一個元素值}
例如:
LPUSH list a LPUSH list b LPUSH list c
列表的命令比較多,自己查詢檔案就好,這裡不再贅述。
列表(List)是有序的,集合(Set)是無序的。集合不能出現重複的資料。
應用場景如網站的存取IP(去重)記錄、花店中花的種類等。
集合是字串元素的集合,只能儲存字串。
使用 SADD
命令往集合中新增一個元素:
SADD set a SADD set b SADD set c SADD set a b c
有序集合跟集合一樣,只是有有序集合會根據元素的值從小到大排序。
有序集合也只能新增字串。
ZADD ss 2 a ZADD ss 1 b ZADD ss 4 z
查詢:
ZRANGE ss 0 10 WITHSCORES
提醒一下,生產環境記得給 Redis 設定密碼。
到此這篇關於分散式Redis Cluster叢集搭建與Redis基本用法的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45