Redis6總綱
目錄
1、搭建
2、故障恢復(fù)
3、jredis開發(fā)
阿K須知點(diǎn):
操作集群的添加,查詢(對(duì)應(yīng)的插槽機(jī)),查看節(jié)點(diǎn)(cluseer nodes)都必須在主機(jī)上面操作。
一、搭建
1、解決兩個(gè)問題
(1)容量不夠,redis如何進(jìn)行擴(kuò)容?
(2)并發(fā)寫操作, redis如何分?jǐn)偅?/p>
另外,主從模式,薪火相傳模式,主機(jī)宕機(jī),導(dǎo)致ip地址發(fā)生變化,應(yīng)用程序中配置需要修改對(duì)應(yīng)的主機(jī)地址、端口等信息。
之前通過代理主機(jī)來解決,但是redis3.0中提供了解決方案。就是無中心化集群配置
2、什么是集群
(1)Redis 集群實(shí)現(xiàn)了對(duì)Redis的水平擴(kuò)容,即啟動(dòng)N個(gè)redis節(jié)點(diǎn),將整個(gè)數(shù)據(jù)庫分布存儲(chǔ)在這N個(gè)節(jié)點(diǎn)中,每個(gè)節(jié)點(diǎn)存儲(chǔ)總數(shù)據(jù)的1/N。
(2)Redis 集群通過分區(qū)(partition)來提供一定程度的可用性(availability): 即使集群中有一部分節(jié)點(diǎn)失效或者無法進(jìn)行通訊, 集群也可以繼續(xù)處理命令請(qǐng)求。
3、開擼(制作6個(gè)實(shí)例,6379,6380,6381,6389,6390,6391)
(1)刪除持久化數(shù)據(jù):將rdb,aof文件都刪除掉。
rm -rf dump63*.rdb
[root@VM-0-13-centos ~]# cd /myredis
[root@VM-0-13-centos myredis]# ls
dump6379.rdb dump6381.rdb redis6380.conf redis.conf
dump6380.rdb redis6379.conf redis6381.conf sentinel.conf
[root@VM-0-13-centos myredis]# rm -rf dump63*.rdb
[root@VM-0-13-centos myredis]# ls
redis6379.conf redis6380.conf redis6381.conf redis.conf sentinel.conf
(2)配置基本信息
[root@VM-0-13-centos myredis]# cat redis6379.conf
include /myredis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
(3)添加配置信息
cluster-enabled yes 打開集群模式
cluster-config-file nodes-6379.conf 設(shè)定節(jié)點(diǎn)配置文件名
cluster-node-timeout 15000 設(shè)定節(jié)點(diǎn)失聯(lián)時(shí)間,超過該時(shí)間(毫秒),集群自動(dòng)進(jìn)行主從切換。
[root@VM-0-13-centos myredis]# cat redis6379.conf
include /myredis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
(4)復(fù)制出其他五個(gè)節(jié)點(diǎn)的配置文件
cp redis6379.conf redis6380.conf
......
cp redis6379.conf redis6391.conf
(5)全局替換配置的端口號(hào)
vi 下運(yùn)行 %s/6379/6380,其他幾個(gè)以此類推

(6)啟動(dòng)6個(gè)節(jié)點(diǎn)服務(wù)
[root@VM-0-13-centos myredis]# redis-server redis6379.conf
[root@VM-0-13-centos myredis]# redis-server redis6380.conf
[root@VM-0-13-centos myredis]# redis-server redis6381.conf
[root@VM-0-13-centos myredis]# redis-server redis6389.conf
[root@VM-0-13-centos myredis]# redis-server redis6390.conf
[root@VM-0-13-centos myredis]# redis-server redis6391.conf
(7)組合之前先確定6個(gè)節(jié)點(diǎn)實(shí)例啟動(dòng)成功,nodes-xxxx.conf文件都生成正常(合體前的檢查)
[root@VM-0-13-centos myredis]# ll
total 144
-rw-r--r-- 1 root root 114 Dec 1 23:13 nodes-6379.conf
-rw-r--r-- 1 root root 114 Dec 1 23:13 nodes-6380.conf
-rw-r--r-- 1 root root 114 Dec 1 23:13 nodes-6381.conf
-rw-r--r-- 1 root root 114 Dec 1 23:13 nodes-6389.conf
-rw-r--r-- 1 root root 114 Dec 1 23:14 nodes-6390.conf
-rw-r--r-- 1 root root 114 Dec 1 23:14 nodes-6391.conf
-rw-r--r-- 1 root root 181 Dec 1 22:55 redis6379.conf
-rw-r--r-- 1 root root 181 Dec 1 23:01 redis6380.conf
-rw-r--r-- 1 root root 181 Dec 1 23:01 redis6381.conf
-rw-r--r-- 1 root root 181 Dec 1 23:02 redis6389.conf
-rw-r--r-- 1 root root 181 Dec 1 23:02 redis6390.conf
-rw-r--r-- 1 root root 181 Dec 1 23:03 redis6391.conf
-rw-r--r-- 1 root root 92223 Nov 30 21:50 redis.conf
-rw-r--r-- 1 root root 392 Dec 1 20:27 sentinel.conf
(8)查看是否有 rb環(huán)境(合體前的檢查)
切換到 cd /opt/redis-6.2.1/src

redis6.2.1及其以上是有封裝這個(gè)環(huán)境,以下的版本需要自己裝
(9)將6個(gè)節(jié)點(diǎn)合成一個(gè)集群(合體?。?br>
以下命令要在cd /opt/redis-6.2.1/src目錄下才能執(zhí)行
redis-cli --cluster create --cluster-replicas 1 172.16.0.13:6379 172.16.0.13:6380 172.16.0.13:6381 172.16.0.13:6389 172.16.0.13:6390 172.16.0.13:6391
此處不要用127.0.0.1, 請(qǐng)用真實(shí)IP地址
--replicas 1 采用最簡單的方式配置集群,一臺(tái)主機(jī),一臺(tái)從機(jī),正好三組。

(10)登錄:此時(shí)不能已普通方式登錄,插入等操作會(huì)出重定向的問題
-c 采用集群策略連接,設(shè)置數(shù)據(jù)會(huì)自動(dòng)切換到相應(yīng)的寫主機(jī)
redis-cli -c -p 6379

這里需要注意,保證6個(gè)端口都是開放的,否則運(yùn)行后會(huì)超時(shí)
(11)通過 cluster nodes 命令查看集群信息
127.0.0.1:6380> CLUSTER NODES
e78e278a3cc33c4a865bad7ea86bb722b6afa7fe 172.16.0.13:6391@16391 slave ef3ba51385b31592b3acd21c51ca9f9050b23fbd 0 1638458289000 1 connected
ef3ba51385b31592b3acd21c51ca9f9050b23fbd 172.16.0.13:6379@16379 master - 0 1638458289779 1 connected 0-5460
a907d625a8b92a9ba429722cca79c94ad344ad88 172.16.0.13:6380@16380 myself,master - 0 1638458288000 2 connected 5461-10922
4938a160c0fc0fdb6dc5e3f212dafaeb32793176 172.16.0.13:6381@16381 master - 0 1638458290000 3 connected 10923-16383
bc322a21770479fb1488245e5a7f28ca7f417265 172.16.0.13:6389@16389 slave a907d625a8b92a9ba429722cca79c94ad344ad88 0 1638458291806 2 connected
f6fb7918b4823db8bd3555f45eb6a04c0425c254 172.16.0.13:6390@16390 slave 4938a160c0fc0fdb6dc5e3f212dafaeb32793176 0 1638458290781 3 connected
二、集群原理
(1)redis cluster 如何分配這六個(gè)節(jié)點(diǎn)?
一個(gè)集群至少要有三個(gè)主節(jié)點(diǎn)。
選項(xiàng) --cluster-replicas 1 表示我們希望為集群中的每個(gè)主節(jié)點(diǎn)創(chuàng)建一個(gè)從節(jié)點(diǎn)。(一對(duì)一)
分配原則盡量保證每個(gè)主數(shù)據(jù)庫運(yùn)行在不同的IP地址,每個(gè)從庫和主庫不在一個(gè)IP地址上。
(2)什么是slots
一個(gè) Redis 集群包含 16384 個(gè)插槽(hash slot), 數(shù)據(jù)庫中的每個(gè)鍵都屬于這 16384 個(gè)插槽的其中一個(gè),
集群使用公式 CRC16(key) % 16384 來計(jì)算鍵 key 屬于哪個(gè)槽, 其中 CRC16(key) 語句用于計(jì)算鍵 key 的 CRC16 校驗(yàn)和 。
集群中的每個(gè)節(jié)點(diǎn)負(fù)責(zé)處理一部分插槽。 舉個(gè)例子, 如果一個(gè)集群可以有主節(jié)點(diǎn), 其中:
節(jié)點(diǎn) A 負(fù)責(zé)處理 0 號(hào)至 5460 號(hào)插槽。
節(jié)點(diǎn) B 負(fù)責(zé)處理 5461 號(hào)至 10922 號(hào)插槽。
節(jié)點(diǎn) C 負(fù)責(zé)處理 10923 號(hào)至 16383 號(hào)插槽。

(3)在集群中錄入值
在redis-cli每次錄入、查詢鍵值,redis都會(huì)計(jì)算出該key應(yīng)該送往的插槽,如果不是該客戶端對(duì)應(yīng)服務(wù)器的插槽,redis會(huì)報(bào)錯(cuò),并告知應(yīng)前往的redis實(shí)例地址和端口。
redis-cli客戶端提供了 –c 參數(shù)實(shí)現(xiàn)自動(dòng)重定向。
如 redis-cli -c –p 6379 登入后,再錄入、查詢鍵值對(duì)可以自動(dòng)重定向。
不在一個(gè)slot下的鍵值,是不能使用mget,mset等多鍵操作。
127.0.0.1:6380> mset k1 v1 k2 v2 ke v3
(error) CROSSSLOT Keys in request don't hash to the same slot
可以通過{}來定義組的概念,從而使key中{}內(nèi)相同內(nèi)容的鍵值對(duì)放到一個(gè)slot中去。
127.0.0.1:6380> mset name{user} jack age{user} 20
OK
(4)查詢集群中的值
CLUSTER GETKEYSINSLOT <slot><count> 返回 count 個(gè) slot 槽中的鍵。
127.0.0.1:6380> CLUSTER KEYSLOT user
(integer) 5474
127.0.0.1:6380> CLUSTER COUNTKEYSINSLOT 5474
(integer) 2
127.0.0.1:6380> CLUSTER GETKEYSINSLOT 5474 2
1) "age{user}"
2) "name{user}"
三、故障恢復(fù)
1、如果主節(jié)點(diǎn)下線?
從節(jié)點(diǎn)能否自動(dòng)升為主節(jié)點(diǎn)?注意:15秒超時(shí)
原本是 6380主機(jī)的 從機(jī) 6389上位了
[root@VM-0-13-centos ~]# redis-cli -c -p 6380
127.0.0.1:6380> shutdown
not connected> exit
[root@VM-0-13-centos ~]# ps -ef|grep redis
root 19658 1 0 14:40 ? 00:00:50 redis-server *:6381 [cluster]
root 19664 1 0 14:40 ? 00:00:49 redis-server *:6389 [cluster]
root 19670 1 0 14:41 ? 00:00:49 redis-server *:6390 [cluster]
root 19676 1 0 14:41 ? 00:00:49 redis-server *:6391 [cluster]
root 19686 1 0 14:42 ? 00:00:50 redis-server *:6379 [cluster]
root 19739 19610 0 14:57 pts/1 00:00:00 redis-cli -c -p 6379
root 24776 24515 0 23:34 pts/0 00:00:00 grep --color=auto redis
[root@VM-0-13-centos ~]# redis-cli -c -p 6381
127.0.0.1:6381> cluster nodes
ef3ba51385b31592b3acd21c51ca9f9050b23fbd 172.16.0.13:6379@16379 master - 0 1638459347964 1 connected 0-5460
4938a160c0fc0fdb6dc5e3f212dafaeb32793176 172.16.0.13:6381@16381 myself,master - 0 1638459348000 3 connected 10923-16383
f6fb7918b4823db8bd3555f45eb6a04c0425c254 172.16.0.13:6390@16390 slave 4938a160c0fc0fdb6dc5e3f212dafaeb32793176 0 1638459348000 3 connected
bc322a21770479fb1488245e5a7f28ca7f417265 172.16.0.13:6389@16389 master - 0 1638459348989 7 connected 5461-10922
e78e278a3cc33c4a865bad7ea86bb722b6afa7fe 172.16.0.13:6391@16391 slave ef3ba51385b31592b3acd21c51ca9f9050b23fbd 0 1638459347000 1 connected
a907d625a8b92a9ba429722cca79c94ad344ad88 172.16.0.13:6380@16380 master,fail - 1638459257471 1638459254000 2 disconnected
2、主節(jié)點(diǎn)恢復(fù)后,主從關(guān)系會(huì)如何?
主節(jié)點(diǎn)回來變成從機(jī)。
[root@VM-0-13-centos ~]# redis-server /myredis/redis6380.conf
[root@VM-0-13-centos ~]# redis-cli -c -p 6389
127.0.0.1:6389> cluster nodes
a907d625a8b92a9ba429722cca79c94ad344ad88 :0@0 master,fail,noaddr - 1638459258445 1638459254000 2 disconnected
e78e278a3cc33c4a865bad7ea86bb722b6afa7fe 172.16.0.13:6391@16391 slave ef3ba51385b31592b3acd21c51ca9f9050b23fbd 0 1638459799000 1 connected
ef3ba51385b31592b3acd21c51ca9f9050b23fbd 172.16.0.13:6379@16379 master - 0 1638459798000 1 connected 0-5460
4938a160c0fc0fdb6dc5e3f212dafaeb32793176 172.16.0.13:6381@16381 master - 0 1638459800592 3 connected 10923-16383
f6fb7918b4823db8bd3555f45eb6a04c0425c254 172.16.0.13:6390@16390 slave 4938a160c0fc0fdb6dc5e3f212dafaeb32793176 0 1638459799578 3 connected
bc322a21770479fb1488245e5a7f28ca7f417265 172.16.0.13:6389@16389 myself,master - 0 1638459799000 7 connected 5461-10922
3、如果所有某一段插槽的主從節(jié)點(diǎn)都宕掉,redis服務(wù)是否還能繼續(xù)?
如果某一段插槽的主從都掛掉,而cluster-require-full-coverage 為yes ,那么 ,整個(gè)集群都掛掉
如果某一段插槽的主從都掛掉,而cluster-require-full-coverage 為no ,那么,該插槽數(shù)據(jù)全都不能使用,也無法存儲(chǔ),但是整個(gè)集群還可以用。
redis.conf中的參數(shù) cluster-require-full-coverage
查看 參數(shù)情況:config get cluster-require-full-coverage
127.0.0.1:6389> config get cluster-require-full-coverage
1) "cluster-require-full-coverage"
2) "yes"
四、jredis開發(fā)
1、說明
即使連接的不是主機(jī),集群會(huì)自動(dòng)切換主機(jī)存儲(chǔ)。主機(jī)寫,從機(jī)讀。
無中心化主從集群。無論從哪臺(tái)主機(jī)寫的數(shù)據(jù),其他主機(jī)上都能讀到數(shù)據(jù)。
2、代碼
public static void main(String[] args) {
// 創(chuàng)建對(duì)象
HostAndPort hostAndPort = new HostAndPort ("172.16.0.13",6390);
JedisCluster jedisCluster = new JedisCluster (hostAndPort);
// 操作
jedisCluster.set ("bb1","vv1");
String value = jedisCluster.get ("bb1");
System.out.println (value );
jedisCluster.close ();
}
3、Redis 集群提供了以下好處
(1)實(shí)現(xiàn)擴(kuò)容
(2)分?jǐn)倝毫?br>
(3)無中心配置相對(duì)簡單
4、缺點(diǎn)
(1)多鍵操作是不被支持的
(2)多鍵的Redis事務(wù)是不被支持的。lua腳本不被支持
(3)由于集群方案出現(xiàn)較晚,很多公司已經(jīng)采用了其他的集群方案,而代理或者客戶端分片的方案想要遷移至redis cluster,需要整體遷移而不是逐步過渡,復(fù)雜度較大。
端口開放
1、開啟防火墻
systemctl start firewalld
2、開放指定端口
firewall-cmd --zone=public --add-port=1935/tcp --permanent
命令含義:
--zone #作用域
--add-port=1935/tcp #添加端口,格式為:端口/通訊協(xié)議
--permanent #永久生效,沒有此參數(shù)重啟后失效
3、重啟防火墻
firewall-cmd --reload
4、查看端口號(hào)
netstat -ntlp //查看當(dāng)前所有tcp端口·
netstat -ntulp |grep 1935 //查看所有1935端口使用情況·
搭建遇到的問題參考的博客
使用rb合體:https://blog.csdn.net/weixin_42350858/article/details/108229438
發(fā)現(xiàn)rb運(yùn)行不了:https://blog.csdn.net/fly910905/article/details/85274463
開放端口:https://www.cnblogs.com/sxmny/p/11224842.html
cluster-require-full-coverage 參數(shù):https://blog.51cto.com/liuzhanbin/1871514
節(jié)點(diǎn)重新加入集群:https://blog.csdn.net/qq_35613498/article/details/105523536