redis單點-主從-哨兵-集群


 

  1. 參考文檔

https://blog.csdn.net/miss1181248983/article/details/90056960

 

https://blog.csdn.net/miss1181248983/article/details/82011884

 

https://www.cnblogs.com/jaycekon/p/6237562.html

 

https://blog.csdn.net/liuxiao723846/article/details/86715614

詳解cluster邏輯

  1. 環境

Linux iZ8vb47604rgqewujsb9kbZ 3.10.0-1062.9.1.el7.x86_64 #1 SMP Fri Dec 6 15:49:49 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

 

CentOS Linux release 7.7.1908 (Core)

 

redis5.0.7

 

 

 

  1. 編譯安裝redis以及安裝完成后的一些配置持久化等(單點)

 

安裝擴展依賴:yum install gcc

  1. 下載穩定版本redis

  2. 解壓縮

tar zxf redis-5.0.7.tar.gz

  1. 進入解壓縮目錄編譯

cd redis-5.0.7

yum install gcc #安裝依賴

make MALLOC=libc

  1. 如果未報錯,執行安裝

make install PREFIX=/jesong/cluster/redis

  1. 創建數據存放目錄

mkdir -p /jesong/cluster/redis/{conf,data,log}

  1. 復制主配置文件到安裝目錄

cp /root/redis-5.0.7/redis.conf /jesong/cluster/redis/conf/

cp /root/redis-5.0.7/sentinel.conf /jesong/cluster/redis/conf/

 

bind 172.26.103.65 #綁定ip

requirepass 123456 #設置連接密碼

port 6379

dir /jesong/cluster/redis/data/ #緩存文件存放位置

appendonly yes #開啟aof持久化

appendfsync everysec #指定aof持久化模式(everysec:每一秒,always:每一次,no:系統隨機)

logfile "/jesong/cluster/redis/log/redis.log"

pidfile /var/run/redis_6379.pid

daemonize yes #設置后台啟動

loglevel notice #設置log日志的級別

save 900 1 #設置rdb持久化,900秒內至少有1key被改變則做一次快照

save 300 10 #設置rdb持久化,300秒內至少有300key被改變則做一次快照

save 60 10000 #設置rdb持久化,60秒內至少有10000key被改變則做一次快照

 

  1. 添加環境變量

echo 'export PATH=$PATH:/jesong/cluster/redis/bin' >>/etc/profile

source /etc/profile

 

  1. 啟動

/jesong/cluster/redis/bin/redis-server /jesong/cluster/redis/conf/redis.conf

 

 

 

  1. 主從模式

  2. 主從模式介紹

* 主數據庫可以進行讀寫操作,當讀寫操作導致數據變化時會自動將數據同步給從數據庫

* 從數據庫一般都是只讀的,並且接收主數據庫同步過來的數據

* 一個master可以擁有多個slave,但是一個slave只能對應一個master

* slave掛了不影響其他slave的讀和master的讀和寫,重新啟動后會將數據從master同步過來

* master掛了以后,不影響slave的讀,但redis不再提供寫服務,master重啟后redis將重新對外提供寫服務

* master掛了以后,不會在slave節點中重新選一個master

  1. 工作機制

slave啟動后,主動向master發送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和緩存保存快照這段時間的命令,然后將保存的快照文件和緩存的命令發送給slaveslave接收到快照文件和命令后加載快照文件和緩存的執行命令。

復制初始化后,master每次接收到的寫命令都會同步發送給slave,保證主從數據一致性。

master節點在主從模式中唯一,若master掛掉,則redis無法對外提供寫服務

 

 

  1. 按照(單點配置)配置主節點

 

  1. 配置redis從服務,修改配置文件(兩從節點)

如果主redis已經啟動過了,那么復制的數據務必要刪除緩存文件和日志文件

cp -a /jesong/cluster/redis/ /jesong/cluster/redis2

cp -a /jesong/cluster/redis/ /jesong/cluster/redis3

 

  1. 修改redis從服務配置文件

vim redis.conf

port 6380                #不能與主沖突 93

pidfile /var/run/redis_6380.pid                #pid文件不能相同 159

logfile "/var/log/redis2.log"                #日志文件不能相同 172

dir /data/redis2                #dir不能相同 264

replicaof 127.0.0.1 6379                #說明它是哪個的從,salveof IP 主服務端口 287

masterauth 123123                #設置從連接主的密碼,假設主的密碼為123123 294

 

  1. 啟動從數據庫

/jesong/cluster/redis2/bin/redis-server /jesong/cluster/redis2/conf/redis.conf

  1. 登錄主數據庫查看主從狀態

redis-cli -h 127.0.0.1 -p 6379

auth 123456

info replication

  1. 測試是否同步

添加數據

set ceshi test

在各節點查詢數據

get ceshi

刪除測試數據

del ceshi

 

 

  1. Sentinel模式(哨兵模式)

當使用sentinel模式的時候,客戶端就不要直接連接Redis,而是連接sentinel的ip和port,由sentinel來提供具體的可提供服務的Redis實現,這樣當master節點掛掉以后,sentinel就會感知並將新的master節點提供給使用者

  1. 哨兵模式介紹

主從模式的弊端就是不具備高可用性,當master掛掉以后,Redis將不能再對外提供寫入操作,因此sentinel應運而生。

sentinel中文含義為哨兵,顧名思義,它的作用就是監控redis集群的運行狀況,特點如下:

 

* sentinel模式是建立在主從模式的基礎上,如果只有一個Redis節點,sentinel就沒有任何意義

* master掛了以后,sentinel會在slave中選擇一個做為master,並修改它們的配置文件,其他slave的配置文件也會被修改,比如slaveof屬性會指向新的master

* master重新啟動后,它將不再是master而是做為slave接收新的master的同步數據

* sentinel因為也是一個進程有掛掉的可能,所以sentinel也會啟動多個形成一個sentinel集群

* sentinel配置的時候,sentinel之間也會自動監控

* 當主從模式配置密碼時,sentinel也會同步將配置信息修改到配置文件中,不需要擔心

* 一個sentinelsentinel集群可以管理多個主從Redis,多個sentinel也可以監控同一個redis

* sentinel最好不要和Redis部署在同一台機器,不然Redis的服務器掛了以后,sentinel也掛了

* master下線后再次啟動,會自動變成當前master的從庫,並且會自動更改配置文件,無需手動變更。

  1. 工作機制

* 每個sentinel以每秒鍾一次的頻率向它所知的masterslave以及其他sentinel實例發送一個 PING 命令

* 如果一個實例距離最后一次有效回復 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被sentinel標記為主觀下線。

* 如果一個master被標記為主觀下線,則正在監視這個master的所有sentinel要以每秒一次的頻率確認master的確進入了主觀下線狀態

* 當有足夠數量的sentinel(大於等於配置文件指定的值)在指定的時間范圍內確認master的確進入了主觀下線狀態, master會被標記為客觀下線

* 在一般情況下, 每個sentinel會以每 10 秒一次的頻率向它已知的所有masterslave發送 INFO 命令

* mastersentinel標記為客觀下線時,sentinel向下線的master的所有slave發送 INFO 命令的頻率會從 10 秒一次改為 1 秒一次

* 若沒有足夠數量的sentinel同意master已經下線,master的客觀下線狀態就會被移除;

master重新向sentinel PING 命令返回有效回復,master的主觀下線狀態就會被移除

* 當使用sentinel模式的時候,客戶端就不要直接連接Redis,而是連接sentinelipport,由sentinel來提供具體的可提供服務的Redis實現,這樣當master節點掛掉以后,sentinel就會感知並將新的master節點提供給使用者。

 

  1. 在主從的基礎上,修改哨兵配置文件

vim sentinel.conf

port 26379

daemonize yes

pidfile /var/run/redis-sentinel.pid

logfile "/jesong/cluster/redis/log/sentinel.log"

dir /jesong/cluster/redis/data

sentinel monitor mymaster 172.26.103.68 6379 2 #mymaster:自定義的集群名字 2:有多少個哨兵就可以決定是否下線

sentinel auth-pass mymaster 123456

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000

sentinel deny-scripts-reconfig yes

 

  1. 啟動哨兵

/jesong/cluster/redis/bin/redis-sentinel /jesong/cluster/redis/conf/sentinel.conf

 

 

  1. 把主節點干掉測試一下

    1. 查看哨兵日志,看看是否切換成功

tailf /jesong/cluster/redis/log/sentinel.log

 

  1. 測試新的主節點是否可以寫入數據

info replication

set ceshi test

get ceshi

  1. 查看從節點是否同步了數據

keys *

 

 

  1. cluster集群模式

https://blog.csdn.net/liuxiao723846/article/details/86715614

詳解cluster,數據訪問,集群鏈接,客戶端訪問等

不能綁定多個ip,否則創建集群會報錯

  1. cluster模式介紹

代碼連接cluster吧主從所有六個ip和端口都寫上

sentinel模式基本可以滿足一般生產的需求,具備高可用性。但是當數據量過大到一台服務器存放不下的情況時,主從模式或sentinel模式就不能滿足需求了,這個時候需要對存儲的數據進行分片,將數據存儲到多個Redis實例中。cluster模式的出現就是為了解決單機Redis容量有限的問題,將Redis的數據根據一定的規則分配到多台機器。

 

cluster可以說是sentinel和主從模式的結合體,通過cluster可以實現主從和master重選功能,所以如果配置兩個副本三個分片的話,就需要六個Redis實例。因為Redis的數據是根據一定規則分配到cluster的不同機器的,當數據量過大時,可以新增機器進行擴容。

 

使用集群,只需要將redis配置文件中的cluster-enable配置打開即可。每個集群中至少需要三個主數據庫才能正常運行,新增節點非常方便。

  1. 集群特點

* 多個redis節點網絡互聯,數據共享

* 所有的節點都是一主一從(也可以是一主多從),其中從不提供服務,僅作為備用

* 不支持同時處理多個key(如MSET/MGET),因為redis需要把key均勻分布在各個節點上,

並發量很高的情況下同時創建key-value會降低性能並導致不可預測的行為

* 支持在線增加、刪除節點

* 客戶端可以連接任何一個主節點進行讀寫

 

  1. redisCluster的缺陷(虛擬槽分區的缺點)

a,鍵的批量操作支持有限,比如mset, mget,如果多個鍵映射在不同的槽,就不支持了

b,鍵事務支持有限,當多個key分布在不同節點時無法使用事務,同一節點是支持事務

c,鍵是數據分區的最小粒度,不能將一個很大的鍵值對映射到不同的節點

d不支持多數據庫,只有0select 0

e,復制結構只支持單層結構,不支持樹型結構。

 

  1. 在(單點)的基礎上,修改配置文件(不能綁定多個ip,否則創建集群會報錯)

三台服務器:每台服務器上安裝兩個redis 所有的節點都是一主一從(也可以是一主多從)每個集群中至少需要三個主數據庫才能正常運行

 

修改三台服務器上的redis配置文件

第一台: port 7000 port 7001

第二台: port 7002 port 7003

第三台:port 7004 port 7005

不能綁定多個ip,否則創建集群會報錯

vim redis.conf

 

masterauth 123456

requirepass 123456

cluster-enabled yes

cluster-node-timeout 15000 #15秒超時

cluster-config-file nodes_7001.conf #會存放在dir 指定的目錄下

port 7000                #不能與其他redis沖突 93

pidfile /var/run/redis_6379.pid                #pid文件路徑不能相同 159

logfile "/var/log/redis.log"                #日志文件路徑不能相同 172

dir /data/redis2                #dir不能相同 264

 

  1. 修改完配置文件后,啟動各服務器redis

/jesong/cluster/redis/bin/redis-server /jesong/cluster/redis/conf/redis.conf

查看端口是否啟動

ss -lntup

 

  1. 創建集群(3主3從)

redis-cli -a 123456 --cluster create 172.26.103.68:7000 172.26.103.68:7001 172.26.103.67:7002 172.26.103.67:7003 172.26.103.66:7004 172.26.103.66:7005 --cluster-replicas 1

出現下列為成功,老版本得redis創建集群需要安裝ruby

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

>>> Performing hash slots allocation on 6 nodes...

Master[0] -> Slots 0 - 5460

Master[1] -> Slots 5461 - 10922

Master[2] -> Slots 10923 - 16383

Adding replica 172.26.103.67:7003 to 172.26.103.68:7000

Adding replica 172.26.103.66:7005 to 172.26.103.67:7002

Adding replica 172.26.103.68:7001 to 172.26.103.66:7004

M: f449cc610cfa32c1c64091195d0f86c0e862ff30 172.26.103.68:7000

slots:[0-5460] (5461 slots) master

S: c8ad1ea097b7466f4c4db1d972740ca7816085e3 172.26.103.68:7001

replicates 8c70e48b9c5b73654e698f22cb0caf76c83a3383

M: 4ec55ab4a64a0894e591ddf23482a470f3edd73a 172.26.103.67:7002

slots:[5461-10922] (5462 slots) master

S: 9cd8ed44964086b7f7e56a13a825ce8c43a6ae5f 172.26.103.67:7003

replicates f449cc610cfa32c1c64091195d0f86c0e862ff30

M: 8c70e48b9c5b73654e698f22cb0caf76c83a3383 172.26.103.66:7004

slots:[10923-16383] (5461 slots) master

S: 36d471bf1b6bcd3a532c2162ee4151c97b39b444 172.26.103.66:7005

replicates 4ec55ab4a64a0894e591ddf23482a470f3edd73a

Can I set the above configuration? (type 'yes' to accept): yes

>>> Nodes configuration updated

>>> Assign a different config epoch to each node

>>> Sending CLUSTER MEET messages to join the cluster

Waiting for the cluster to join

.

>>> Performing Cluster Check (using node 172.26.103.68:7000)

M: f449cc610cfa32c1c64091195d0f86c0e862ff30 172.26.103.68:7000

slots:[0-5460] (5461 slots) master

1 additional replica(s)

S: c8ad1ea097b7466f4c4db1d972740ca7816085e3 172.26.103.68:7001

slots: (0 slots) slave

replicates 8c70e48b9c5b73654e698f22cb0caf76c83a3383

S: 9cd8ed44964086b7f7e56a13a825ce8c43a6ae5f 172.26.103.67:7003

slots: (0 slots) slave

replicates f449cc610cfa32c1c64091195d0f86c0e862ff30

M: 4ec55ab4a64a0894e591ddf23482a470f3edd73a 172.26.103.67:7002

slots:[5461-10922] (5462 slots) master

1 additional replica(s)

S: 36d471bf1b6bcd3a532c2162ee4151c97b39b444 172.26.103.66:7005

slots: (0 slots) slave

replicates 4ec55ab4a64a0894e591ddf23482a470f3edd73a

M: 8c70e48b9c5b73654e698f22cb0caf76c83a3383 172.26.103.66:7004

slots:[10923-16383] (5461 slots) master

1 additional replica(s)

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

 

  1. 登陸集群

redis-cli -c -h 172.26.103.68 -p 7000 -a 123456 # -c,使用集群方式登錄

 

  1. 列出節點信息

cluster nodes

  1. 測試集群

192.168.30.128:7001> set key111 aaa

-> Redirected to slot [13680] located at 192.168.30.130:7005 #說明數據到了192.168.30.130:7005上

OK

 

192.168.30.130:7005> set key222 bbb

-> Redirected to slot [2320] located at 192.168.30.128:7001 #說明數據到了192.168.30.128:7001上

OK

 

192.168.30.128:7001> set key333 ccc

-> Redirected to slot [7472] located at 192.168.30.129:7003 #說明數據到了192.168.30.129:7003上

OK

 

192.168.30.129:7003> get key111

-> Redirected to slot [13680] located at 192.168.30.130:7005

"aaa"

 

192.168.30.130:7005> get key333

-> Redirected to slot [7472] located at 192.168.30.129:7003

"ccc"

 

  1. redis常用命令

https://blog.csdn.net/miss1181248983/article/details/82011884

 

  1. cluster集群命令(redis-cli -c -p port)

    1. 集群

cluster info :打印集群的信息

cluster nodes :列出集群當前已知的所有節點( node),以及這些節點的相關信息。

  1. 節點

cluster meet <ip> <port> :將 ip 和 port 所指定的節點添加到集群當中,讓它成為集群的一份子。

cluster forget <node_id> :從集群中移除 node_id 指定的節點。

cluster replicate <node_id> :將當前節點設置為 node_id 指定的節點的從節點。

cluster saveconfig :將節點的配置文件保存到硬盤里面。

 

  1. redis存儲hash(散列操作)

    1. 賦值/取值 單個操作

hset key field value : 為指定的key設定field/value對 (鍵值對)

172.26.103.66:7005> hset user03 name zhangsan

(integer) 1

172.26.103.66:7005> hset user03 age 16

(integer) 1

hget key field:返回指定的key種的field值

172.26.103.66:7005> hget user03 name

"zhangsan"

172.26.103.66:7005> hget user03 age

"16"

  1. 7.2.1 賦值/取值 同時設置多個字段

hget key field:返回指定的key中的field的值

hmget key fields:獲取key中的多個filed的值

hgetall key:獲取key中的所有field-vaule

172.26.103.68:7001> hmset user02 city shanghai email zhangsan@163.com

OK

172.26.103.68:7001> hmget user02 city email

1) "shanghai"

2) zhangsan@163.com

172.26.103.68:7001> hgetall user02

1) "city"

2) "shanghai"

3) "email"

4) zhangsan@163.com

  1. 增加,判斷,獲取keys

hincrby key field increment: 設置key中field的值增加increment 如age 增加20

172.26.103.66:7005> hincrby user04 age 23

(integer) 43

hexists key field : 判斷指定的key中的filed是否存在(返回0不存在,返回1存在)

172.26.103.66:7005> hexists user04 city

(integer) 0

172.26.103.66:7005> hexists user04 name

(integer) 1

hlen key :獲取key所包含的field的數量

172.26.103.66:7005> hlen user04

(integer) 2

hkeys key:獲取所有的key

hvals key :獲取所有的value

172.26.103.66:7005> hkeys user04

1) "age"

2) "name"

172.26.103.66:7005> hvals user04

1) "43"

2) "wxd"

  1. 刪除

hdel key field:可以刪除一個或多個字段,返回值是被刪除的字段個數

del key: 刪除整個list

172.26.103.68:7001> hdel user02 city email

(integer) 2

172.26.103.68:7001> hgetall user02

(empty list or set)

172.26.103.68:7001> del user02

(integer) 0

172.26.103.68:7001> keys *

1) "test11"

 

 

 

 

 

 

 

  1. 客戶端登錄命令(非集群,集群加上 -c)

./redis-cli -p 6379

  1. 驗證密碼

auth password

  1. 創建一個key value

redis> set foo bar

OK

redis> get foo

"bar"

 

  1. 查看主從狀態

info replication

 

  1. 查看redis種所有的key

keys *

  1. 切換數據庫(redis默認有16個庫,在配置文件內配置,cluster不支持多庫)

select 2 #切換到第二個庫

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM