欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

分布式Redis?Cluster集群搭建與Redis基本用法

 更新時(shí)間:2022年02月23日 17:07:26   作者:癡者工良  
這篇文章介紹了分布式Redis?Cluster集群搭建與Redis基本用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Redis 集群搭建

Redis 是啥

Redis(全稱 REmote DIctionary Server) 是 NoSQL 型數(shù)據(jù)存儲(chǔ)程序,其使用了內(nèi)存來(lái)存儲(chǔ)數(shù)據(jù)結(jié)構(gòu),可以作為數(shù)據(jù)庫(kù)、緩存、消息代理使用。

Redis 使用鍵值來(lái)映射數(shù)據(jù),其數(shù)據(jù)結(jié)構(gòu)支持 strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes 等類(lèi)型。

集群(Cluster)

Redis 集群的官方文檔:https://redis.io/topics/cluster-tutorial

學(xué)這個(gè)的時(shí)候,建議別老是百度,還是好好啃一下官方文檔,一點(diǎn)點(diǎn)學(xué)吧。

Redis 支持三種集群模式:

  • 主從模式
  • Sentinel(哨兵)模式
  • Cluster 模式

本章的內(nèi)容包括搭建、測(cè)試和操作 Redis Cluster(集群)。

主從模式,一個(gè) Primary,多個(gè) Secondary ,以及副本節(jié)點(diǎn)。

哨兵模式,不會(huì)。

Cluster 模式,主要為了提高并發(fā)能力和解決性能瓶頸。

Redis Cluster 說(shuō)明

Redis Cluster 能夠保證 Redis 服務(wù)一定程度的可用性,當(dāng)集群中一部分實(shí)例發(fā)生故障時(shí),其余實(shí)例還能正常運(yùn)行。但是如果發(fā)生較大故障,整個(gè) Redis 集群可能會(huì)停止運(yùn)行。

Redis 集群的每個(gè)節(jié)點(diǎn)都需要使用兩個(gè) TCP 端口,一個(gè)是常規(guī)提供給客戶端服務(wù)的端口,如 6379;而群集總線需要使用的端口是常規(guī)端口加上 10000 ,例如 73479。

Redis Cluster 不支持 NATted 環(huán)境,也就是不支持 Docker 重新映射端口,如果要在 Docker 上使用 Redis 集群,則需要使用 Dockers

主機(jī)模式,即啟動(dòng) Redis 時(shí)要附加 --net=host 參數(shù)。

Redis Cluster 中,提供服務(wù)的都是 主節(jié)點(diǎn)(redis-master),從屬節(jié)點(diǎn)(redis-slave) 用于備份主節(jié)點(diǎn)的數(shù)據(jù),當(dāng)主節(jié)點(diǎn)故障時(shí),從屬節(jié)點(diǎn)可以替換主節(jié)點(diǎn)。

Redis Cluster 節(jié)點(diǎn)

Redis 多個(gè) Redis 實(shí)例來(lái)提供功能,即分片功能,每個(gè) Redis 實(shí)例都是主節(jié)點(diǎn)。例如 A、B、C 三個(gè)節(jié)點(diǎn)集組成一個(gè)完整的 Redis 系統(tǒng),redis cluster 自動(dòng)將數(shù)據(jù)分片(sharding),在每個(gè)節(jié)點(diǎn)上放置一部分?jǐn)?shù)據(jù),這三個(gè)節(jié)點(diǎn)都是主節(jié)點(diǎn)。

例如 有 100 條數(shù)據(jù),前 40 條在 A中,剩下的在 B、C中。

沒(méi)有 primary,每個(gè)主節(jié)點(diǎn)都可以提供服務(wù),這樣就降低了服務(wù)器的壓力,盡量使得流量被多臺(tái)節(jié)點(diǎn)平均。要?jiǎng)h除 C ,則將 C 的數(shù)據(jù)分為兩部分,分別推送到 A 和 B 中,這就是數(shù)據(jù)復(fù)制。

但是,如果 C 故障了,那么整個(gè)集群則會(huì)癱瘓,因?yàn)?A、B、C 各自的數(shù)據(jù)是不同的。這就是 Redis Cluster 的缺點(diǎn)。

更多知識(shí),請(qǐng)打開(kāi)官方文檔了解 https://redis.io/topics/cluster-tutorial

后面使用 & 符號(hào)來(lái)代表從屬節(jié)點(diǎn),如 &C,代表 C 的從屬節(jié)點(diǎn)。

Redis Cluster 集群模式

Redis Cluster 集群,每個(gè)主節(jié)點(diǎn)有多個(gè)從屬節(jié)點(diǎn),從屬節(jié)點(diǎn)的數(shù)據(jù)于此主節(jié)點(diǎn)一致。

前面提到過(guò)如果某一個(gè)主節(jié)點(diǎn)故障,將會(huì)導(dǎo)致整個(gè)集群故障。因此,每個(gè)主節(jié)點(diǎn)都應(yīng)該有一個(gè)從屬節(jié)點(diǎn),當(dāng) C 故障時(shí),&C (跟 C 具有一致的數(shù)據(jù))將代替 C 工作。但是如果 C 和 &C 都故障,則整個(gè)系統(tǒng)也是會(huì)故障的。

Redis Cluster 的工作依賴于 redis.conf 文件。

下面我們將來(lái)一步步手動(dòng)建立集群,過(guò)程會(huì)比較慢,如果需要盡快建立集群,可以百度找腳本。

為了真實(shí),筆者使用兩臺(tái)服務(wù)器搭建服務(wù),共三個(gè)主節(jié)點(diǎn)和三個(gè)從屬節(jié)點(diǎn),組成六個(gè)節(jié)點(diǎn)群集。

不能保證一致性

當(dāng)客戶端向 C 節(jié)點(diǎn)寫(xiě)入數(shù)據(jù)時(shí),C 會(huì)向 &C 寫(xiě)入數(shù)據(jù)以保證一致性(同步)。但是這個(gè)同步過(guò)程是異步的,因?yàn)橛脩舾?C 交互,完成交互即返回,不可能要用戶等待所有的過(guò)程完成,所以 Redis 的設(shè)計(jì)是,用戶到 C 是同步,操作后立即返回;而 C 到 &C 是異步的,完全與用戶無(wú)關(guān)。

如果客戶端寫(xiě)入數(shù)據(jù)到 C 后,C 還沒(méi)有同步數(shù)據(jù)到 &C,C 就故障了,那么這部分?jǐn)?shù)據(jù)就會(huì)丟失。因此這個(gè)從屬節(jié)點(diǎn),并不能保證數(shù)據(jù)的一致性。

創(chuàng)建和使用 Redis 集群

筆者有兩臺(tái)服務(wù)器,其理論設(shè)計(jì)如下:

服務(wù)器節(jié)點(diǎn)portcluster port
服務(wù)器1A700117001
服務(wù)器1B700217002
服務(wù)器1C700317003
服務(wù)器2&A700117001
服務(wù)器2&B700217002
服務(wù)器2&C700317003

實(shí)際上,由于啟動(dòng)集群時(shí),節(jié)點(diǎn)是自動(dòng)分配的,哪個(gè)是主節(jié)點(diǎn)哪個(gè)是從屬節(jié)點(diǎn)是機(jī)器分配,因此這里只是作為一個(gè)設(shè)計(jì)思路處理,實(shí)際情況要看輸出結(jié)果。

部署三個(gè)主節(jié)點(diǎn)

在服務(wù)器 1,創(chuàng)建六個(gè)目錄:

mkdir /var/redis
cd /var/redis
mkdir 7001 7002 7003 A B C

7001、7002、7003 都是以端口命名的,分別存儲(chǔ) A、B、C 三個(gè)節(jié)點(diǎn)的配置文件,而 A、B、C 三個(gè)文件是為了使用 Docker 啟動(dòng)時(shí),映射物理文件(備份數(shù)據(jù))。如果你不是使用 docker 啟動(dòng),則不需要 A、B、C 三個(gè)目錄。

三個(gè)端口目錄分別創(chuàng)建一個(gè) redis.conf 文件,port 的內(nèi)容請(qǐng)根據(jù)端口填寫(xiě),其內(nèi)容如下:

port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

記得改掉 7001。

如果你只有一臺(tái)服務(wù)器,就使用 7001-7006 和 A B C D E F 這這目錄。

非 docker

如果不使用 docker 的話, 可以這樣啟動(dòng) redis:

# 命令
redis-server /var/redis/7001/redis.conf
# 二進(jìn)制文件
./redis-server /var/redis/7001/redis.conf

# 如法炮制

docker 安裝

如果服務(wù)器的內(nèi)存比較低,例如 1G,2G,則需要執(zhí)行下面的命令,消除 Redis 警告。

查看 /proc/sys/net/core/somaxconn 文件,如果值是 128,則需要修改為 1024。

修改內(nèi)存限制:

 echo "vm.overcommit_memory=1" >>  /etc/sysctl.conf
 sysctl vm.overcommit_memory=1

還有一個(gè)內(nèi)核問(wèn)題:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

其它問(wèn)題請(qǐng)參考這里 解決Redis啟動(dòng)警告問(wèn)題

拉取最新 redis 鏡像:

docker pull redis:latest

執(zhí)行以下三個(gè)命令啟動(dòng)三個(gè) redis 實(shí)例:

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

把本小節(jié)的內(nèi)容,在另一臺(tái)服務(wù)器上執(zhí)行相同的操作。如果你是一臺(tái)服務(wù)器,則也可以在這里修改一下,創(chuàng)建 6 個(gè)容器。

命令解析:

--net=host :使用主機(jī)網(wǎng)絡(luò),這樣就不需要使用 -p 來(lái)映射端口了;

-v /var/redis/B:/data :數(shù)據(jù)持久化;

/var/redis/7002:/etc/redis :將物理機(jī)目錄映射到容器中,里面有個(gè)配置文件;

redis-server : 啟動(dòng)容器時(shí)執(zhí)行的命令;

/etc/redis/redis.conf :一個(gè)啟動(dòng)參數(shù),告訴 redis-server ,要使用哪個(gè)配置啟動(dòng);

--appendonly yes :總是重啟;

創(chuàng)建集群

如果使用 docker 安裝,則在第一臺(tái)服務(wù)器執(zhí)行命令進(jìn)入容器。

docker exec -it redisa bash

然后創(chuàng)建集群:

redis-cli --cluster create {ip}:7001 {ip}:7002 {ip}:7003 {ip}:7001 {ip}:7002 {ip}:7003 --cluster-replicas 1

注:請(qǐng)自行替換 ip 地址。

執(zhí)行命令后,會(huì)自動(dòng)分配 redis 實(shí)例的地位,輸入 yes 同意這種分配:

同意redis集群分配

這種自動(dòng)分配是最優(yōu)的,避免三臺(tái)主節(jié)點(diǎn)都在同一臺(tái)服務(wù)器中。

集群搭建完畢,我們來(lái)開(kāi)始學(xué)習(xí) Redis 中的一些概念,然后使用 C# 創(chuàng)建程序連接 Redis 。

Redis 入門(mén)

Redis 中的數(shù)據(jù)類(lèi)型

Redis 中,常用的數(shù)據(jù)類(lèi)型有以下幾種:

  • String 字符串
  • Hash 散列/哈希
  • List 列表
  • Set 集合
  • Sorted Set 有序集合

所有數(shù)據(jù)都是 key-value 形式存儲(chǔ),每個(gè)數(shù)據(jù)都有唯一的 key,以上數(shù)據(jù)類(lèi)型是 value。

刪除一個(gè)數(shù)據(jù)的命令:DEL {key} 。

字符串(string)

字符串沒(méi)啥好說(shuō)的,就是 value 為 string。

Redis 命令,要設(shè)置或使用字符串類(lèi)型的數(shù)據(jù),則使用SET 或 GET 開(kāi)頭的命令:

# 設(shè)置字符串
SET a AAA
SET b 666
# 其中 a 是 key,AAA 是 value,不需要 "" 包圍字符串
# ------
# 獲取字符串
GET a
# ------
# 獲取多個(gè)字符串
MGET a b
# 使用空格分隔 key

因?yàn)?redis 沒(méi)有值類(lèi)型,因此使用不加 "" 也會(huì)被識(shí)別為字符串。建議加上雙引號(hào)比較好,提高可讀性。

哈希(Hash)

一個(gè) string 類(lèi)型,是 key-value 結(jié)構(gòu),而哈希則是 {key-value} 的集合,key 是 string 類(lèi)型,value 可以是其它類(lèi)型。

因此,可以稱 Hash 為鍵值對(duì)的集合,就是相當(dāng)于 C# 中的字典類(lèi)型,主要存儲(chǔ)有結(jié)構(gòu)的數(shù)據(jù)。

Redis 中每個(gè) hash 可以存儲(chǔ) 232 - 1 個(gè)鍵值對(duì)(40多億)。

Hash 使用 HMSET 、 HMGET 、HGETALL 等命令來(lái)操作哈希表。

有一個(gè)這個(gè)的數(shù)據(jù):

id:1,
name:"癡者工良"

使用哈希存儲(chǔ):

# HMSET {key} {filed1} {value1} {filed2} {value2} ... ...
HMSET user id "1" name "癡者工良"

查詢此哈希表的所有鍵值對(duì):

HGETALL user

查看哈希表的一個(gè)字段:

HGET user id

刪除其中一個(gè)字段:

HDEL user {字段名稱}

列表(Lists)

列表中可以添加多中類(lèi)型的元素,簡(jiǎn)單的就是字符串,列表即是數(shù)據(jù)結(jié)構(gòu)中的鏈表,使用雙向列表技術(shù)實(shí)現(xiàn),越靠近兩側(cè)的元素速度越快。

子元素的添加要從頭部或尾部加入,由于列表是棧,因此列表是有序的。因?yàn)榱斜硎怯行虻?,因此可以存?chǔ)重復(fù)的數(shù)據(jù)。

適合做例如消息記錄(隊(duì)列),粉絲關(guān)注記錄、訂單記錄等。

列表只能添加字符串。

往一個(gè)列表加入數(shù)據(jù):

LPUSH {key} {一個(gè)元素值}

例如:

LPUSH list a
LPUSH list b
LPUSH list c

列表的命令比較多,自己查詢文檔就好,這里不再贅述。

集合(Set)

列表(List)是有序的,集合(Set)是無(wú)序的。集合不能出現(xiàn)重復(fù)的數(shù)據(jù)。

應(yīng)用場(chǎng)景如網(wǎng)站的訪問(wèn)IP(去重)記錄、花店中花的種類(lèi)等。

集合是字符串元素的集合,只能存儲(chǔ)字符串。

使用 SADD 命令往集合中添加一個(gè)元素:

SADD set a
SADD set b
SADD set c
SADD set a b c

有序集合(sorted set)

有序集合跟集合一樣,只是有有序集合會(huì)根據(jù)元素的值從小到大排序。

有序集合也只能添加字符串。

ZADD ss 2 a
ZADD ss 1 b
ZADD ss 4 z

查詢:

ZRANGE ss 0 10 WITHSCORES

提醒一下,生產(chǎn)環(huán)境記得給 Redis 設(shè)置密碼。

到此這篇關(guān)于分布式Redis Cluster集群搭建與Redis基本用法的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳談redis優(yōu)化配置和redis.conf說(shuō)明(推薦)

    詳談redis優(yōu)化配置和redis.conf說(shuō)明(推薦)

    下面小編就為大家?guī)?lái)一篇詳談redis優(yōu)化配置和redis.conf說(shuō)明(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • Redis優(yōu)化經(jīng)驗(yàn)總結(jié)(必看篇)

    Redis優(yōu)化經(jīng)驗(yàn)總結(jié)(必看篇)

    下面小編就為大家?guī)?lái)一篇Redis優(yōu)化經(jīng)驗(yàn)總結(jié)(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • redis的持久化和緩存機(jī)制解讀

    redis的持久化和緩存機(jī)制解讀

    這篇文章主要介紹了redis的持久化和緩存機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • redis刪除hash的實(shí)現(xiàn)方式

    redis刪除hash的實(shí)現(xiàn)方式

    這篇文章主要介紹了redis刪除hash的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 關(guān)于redis的延遲雙刪策略總結(jié)

    關(guān)于redis的延遲雙刪策略總結(jié)

    這篇文章主要介紹了關(guān)于redis的延遲雙刪策略總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Redis分布式鎖的正確實(shí)現(xiàn)方法總結(jié)

    Redis分布式鎖的正確實(shí)現(xiàn)方法總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于Redis分布式鎖的正確實(shí)現(xiàn)方式介紹,有興趣的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • 詳解在Redis在Centos7上的安裝部署

    詳解在Redis在Centos7上的安裝部署

    Redis是一種高級(jí)key-value數(shù)據(jù)庫(kù)。這篇文章主要介紹了詳解在Redis在Centos7上的安裝部署,有興趣的可以了解一下。
    2016-12-12
  • 一篇文章帶你徹底搞懂Redis?事務(wù)

    一篇文章帶你徹底搞懂Redis?事務(wù)

    這篇文章主要介紹了一篇文章帶你徹底搞懂Redis?事務(wù)的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • 聊一聊Redis與MySQL雙寫(xiě)一致性如何保證

    聊一聊Redis與MySQL雙寫(xiě)一致性如何保證

    一致性就是數(shù)據(jù)保持一致,在分布式系統(tǒng)中,可以理解為多個(gè)節(jié)點(diǎn)中數(shù)據(jù)的值是一致的。本文給大家分享Redis與MySQL雙寫(xiě)一致性該如何保證,感興趣的朋友一起看看吧
    2021-06-06
  • 淺談Redis緩存更新策略

    淺談Redis緩存更新策略

    這篇文章主要介紹了Redis緩存更新策略的相關(guān)資料,講解的十分細(xì)致,有需要的小伙伴可以參考下
    2022-08-08

最新評(píng)論