參考文檔
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邏輯
環境
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
編譯安裝redis以及安裝完成后的一些配置持久化等(單點)
安裝擴展依賴:yum install gcc
下載穩定版本redis
解壓縮
tar zxf redis-5.0.7.tar.gz
進入解壓縮目錄編譯
cd redis-5.0.7
yum install gcc #安裝依賴
make MALLOC=libc
如果未報錯,執行安裝
make install PREFIX=/jesong/cluster/redis
創建數據存放目錄
mkdir -p /jesong/cluster/redis/{conf,data,log}
復制主配置文件到安裝目錄
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秒內至少有1個key被改變則做一次快照
save 300 10 #設置rdb持久化,300秒內至少有300個key被改變則做一次快照
save 60 10000 #設置rdb持久化,60秒內至少有10000個key被改變則做一次快照
添加環境變量
echo 'export PATH=$PATH:/jesong/cluster/redis/bin' >>/etc/profile
source /etc/profile
啟動
/jesong/cluster/redis/bin/redis-server /jesong/cluster/redis/conf/redis.conf
主從模式
主從模式介紹
* 主數據庫可以進行讀寫操作,當讀寫操作導致數據變化時會自動將數據同步給從數據庫
* 從數據庫一般都是只讀的,並且接收主數據庫同步過來的數據
* 一個master可以擁有多個slave,但是一個slave只能對應一個master
* slave掛了不影響其他slave的讀和master的讀和寫,重新啟動后會將數據從master同步過來
* master掛了以后,不影響slave的讀,但redis不再提供寫服務,master重啟后redis將重新對外提供寫服務
* master掛了以后,不會在slave節點中重新選一個master
工作機制
當slave啟動后,主動向master發送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和緩存保存快照這段時間的命令,然后將保存的快照文件和緩存的命令發送給slave。slave接收到快照文件和命令后加載快照文件和緩存的執行命令。
復制初始化后,master每次接收到的寫命令都會同步發送給slave,保證主從數據一致性。
master節點在主從模式中唯一,若master掛掉,則redis無法對外提供寫服務
按照(單點配置)配置主節點
配置redis從服務,修改配置文件(兩從節點)
如果主redis已經啟動過了,那么復制的數據務必要刪除緩存文件和日志文件
cp -a /jesong/cluster/redis/ /jesong/cluster/redis2
cp -a /jesong/cluster/redis/ /jesong/cluster/redis3
修改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行
啟動從數據庫
/jesong/cluster/redis2/bin/redis-server /jesong/cluster/redis2/conf/redis.conf
登錄主數據庫查看主從狀態
redis-cli -h 127.0.0.1 -p 6379
auth 123456
info replication
測試是否同步
添加數據
set ceshi test
在各節點查詢數據
get ceshi
刪除測試數據
del ceshi
Sentinel模式(哨兵模式)
當使用sentinel模式的時候,客戶端就不要直接連接Redis,而是連接sentinel的ip和port,由sentinel來提供具體的可提供服務的Redis實現,這樣當master節點掛掉以后,sentinel就會感知並將新的master節點提供給使用者。
哨兵模式介紹
主從模式的弊端就是不具備高可用性,當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也會同步將配置信息修改到配置文件中,不需要擔心
* 一個sentinel或sentinel集群可以管理多個主從Redis,多個sentinel也可以監控同一個redis
* sentinel最好不要和Redis部署在同一台機器,不然Redis的服務器掛了以后,sentinel也掛了
* master下線后再次啟動,會自動變成當前master的從庫,並且會自動更改配置文件,無需手動變更。
工作機制
* 每個sentinel以每秒鍾一次的頻率向它所知的master,slave以及其他sentinel實例發送一個 PING 命令
* 如果一個實例距離最后一次有效回復 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 則這個實例會被sentinel標記為主觀下線。
* 如果一個master被標記為主觀下線,則正在監視這個master的所有sentinel要以每秒一次的頻率確認master的確進入了主觀下線狀態
* 當有足夠數量的sentinel(大於等於配置文件指定的值)在指定的時間范圍內確認master的確進入了主觀下線狀態, 則master會被標記為客觀下線
* 在一般情況下, 每個sentinel會以每 10 秒一次的頻率向它已知的所有master,slave發送 INFO 命令
* 當master被sentinel標記為客觀下線時,sentinel向下線的master的所有slave發送 INFO 命令的頻率會從 10 秒一次改為 1 秒一次
* 若沒有足夠數量的sentinel同意master已經下線,master的客觀下線狀態就會被移除;
若master重新向sentinel的 PING 命令返回有效回復,master的主觀下線狀態就會被移除
* 當使用sentinel模式的時候,客戶端就不要直接連接Redis,而是連接sentinel的ip和port,由sentinel來提供具體的可提供服務的Redis實現,這樣當master節點掛掉以后,sentinel就會感知並將新的master節點提供給使用者。
在主從的基礎上,修改哨兵配置文件
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
啟動哨兵
/jesong/cluster/redis/bin/redis-sentinel /jesong/cluster/redis/conf/sentinel.conf
把主節點干掉測試一下
查看哨兵日志,看看是否切換成功
tailf /jesong/cluster/redis/log/sentinel.log
測試新的主節點是否可以寫入數據
info replication
set ceshi test
get ceshi
查看從節點是否同步了數據
keys *
cluster集群模式
https://blog.csdn.net/liuxiao723846/article/details/86715614
詳解cluster,數據訪問,集群鏈接,客戶端訪問等
不能綁定多個ip,否則創建集群會報錯
cluster模式介紹
代碼連接cluster吧主從所有六個ip和端口都寫上
sentinel模式基本可以滿足一般生產的需求,具備高可用性。但是當數據量過大到一台服務器存放不下的情況時,主從模式或sentinel模式就不能滿足需求了,這個時候需要對存儲的數據進行分片,將數據存儲到多個Redis實例中。cluster模式的出現就是為了解決單機Redis容量有限的問題,將Redis的數據根據一定的規則分配到多台機器。
cluster可以說是sentinel和主從模式的結合體,通過cluster可以實現主從和master重選功能,所以如果配置兩個副本三個分片的話,就需要六個Redis實例。因為Redis的數據是根據一定規則分配到cluster的不同機器的,當數據量過大時,可以新增機器進行擴容。
使用集群,只需要將redis配置文件中的cluster-enable配置打開即可。每個集群中至少需要三個主數據庫才能正常運行,新增節點非常方便。
集群特點
* 多個redis節點網絡互聯,數據共享
* 所有的節點都是一主一從(也可以是一主多從),其中從不提供服務,僅作為備用
* 不支持同時處理多個key(如MSET/MGET),因為redis需要把key均勻分布在各個節點上,
並發量很高的情況下同時創建key-value會降低性能並導致不可預測的行為
* 支持在線增加、刪除節點
* 客戶端可以連接任何一個主節點進行讀寫
redisCluster的缺陷(虛擬槽分區的缺點)
a,鍵的批量操作支持有限,比如mset, mget,如果多個鍵映射在不同的槽,就不支持了
b,鍵事務支持有限,當多個key分布在不同節點時無法使用事務,同一節點是支持事務
c,鍵是數據分區的最小粒度,不能將一個很大的鍵值對映射到不同的節點
d,不支持多數據庫,只有0,select 0
e,復制結構只支持單層結構,不支持樹型結構。
在(單點)的基礎上,修改配置文件(不能綁定多個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行
修改完配置文件后,啟動各服務器redis
/jesong/cluster/redis/bin/redis-server /jesong/cluster/redis/conf/redis.conf
查看端口是否啟動
ss -lntup
創建集群(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.
登陸集群
redis-cli -c -h 172.26.103.68 -p 7000 -a 123456 # -c,使用集群方式登錄
列出節點信息
cluster nodes
測試集群
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"
redis常用命令
https://blog.csdn.net/miss1181248983/article/details/82011884
cluster集群命令(redis-cli -c -p port)
集群
cluster info :打印集群的信息
cluster nodes :列出集群當前已知的所有節點( node),以及這些節點的相關信息。
節點
cluster meet <ip> <port> :將 ip 和 port 所指定的節點添加到集群當中,讓它成為集群的一份子。
cluster forget <node_id> :從集群中移除 node_id 指定的節點。
cluster replicate <node_id> :將當前節點設置為 node_id 指定的節點的從節點。
cluster saveconfig :將節點的配置文件保存到硬盤里面。
redis存儲hash(散列操作)
賦值/取值 單個操作
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"
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"
172.26.103.68:7001> hgetall user02
1) "city"
2) "shanghai"
3) "email"
增加,判斷,獲取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"
刪除
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"
客戶端登錄命令(非集群,集群加上 -c)
./redis-cli -p 6379
驗證密碼
auth password
創建一個key value
redis> set foo bar
OK
redis> get foo
"bar"
查看主從狀態
info replication
查看redis種所有的key
keys *
切換數據庫(redis默認有16個庫,在配置文件內配置,cluster不支持多庫)
select 2 #切換到第二個庫