前言
因為本文章涉及到集群的搭建,因此至少需要六台機器,這里有條件的可以購買阿里雲、百度雲、騰訊雲等輕量級雲服務器(新人很便宜),無條件的可以自己搭建多台虛擬機實例,同時多台實例建議使用相同鏡像環境,博主這里使用的是CentOS 7.6(小版本不影響,例如7.5,7.6,7.8),以下列出我所使用的ip。
ip: 124.221.237.87
ip: 124.221.246.23
ip: 121.4.218.158
ip: 47.103.10.99
ip: 180.76.177.17
ip: 124.221.239.69
1. redis單機架構搭建
1.1 gcc環境安裝
准備一台機器(ip: 124.221.237.87),使用遠程連接工具連接完成后,若環境沒安裝gcc,進行安裝。
yum install gcc
1.2 下載安裝
使用wget下載redis 5.0.3版本,並解壓,然后刪除壓縮文件。
cd /usr/local/ wget http://download.redis.io/releases/redis-5.0.3.tar.gz tar xzf redis-5.0.3.tar.gz rm -rf redis-5.0.3.tar.gz
1.3 進入到解壓好的redis‐5.0.3目錄下,進行編譯與安裝。
cd redis-5.0.3 make
1.4 修改配置
vim redis.conf
# 將以下三個配置進行修改
daemonize yes #后台啟動 protected‐mode no #關閉保護模式,開啟的話,只有本機才可以訪問redis #bind 127.0.0.1 #需要注釋掉bind,bind綁定的是自己機器網卡的ip,如果有多塊網卡可以配多個ip,代表允許客戶端通過機器的哪些網卡ip去訪問,內網一般可以不配置bind,注釋掉即可
requirepass TXB@cxf123456! #設置redis啟動密碼(注意:我實際設置的並非此密碼)
1.5 啟動redis
src/redis-server redis.conf
ps -ef | grep redis #驗證是否啟動成功,若出現下圖所示即啟動成功
1.6 進入、退出客戶端
src/redis-cli # 進入客戶端 auth TXB@cxf123466! #如果不輸入密碼無法操作 quit # 退出客戶端
1.7 開放雲服務器安全組
安全組必須要開放你所配置的redis端口,否則將會被攔截。
使用連接工具連接信息如下:
2. redis主從架構搭建
2.1 環境准備
准備三台機器(ip: 124.221.237.87,ip:124.221.239.69,ip:121.4.218.158),按照單機架構相同的方式先搭建三台單機架構的redis。(從節點的配置再添加2.2)。
2.2 配置從節點環境
在與單機相同的配置下從節點加上以下配置。
replicaof 124.221.237.87 6379 #從124.221.237.87的6379的redis實例復制數據,Redis 5.0之前使用slaveof replica‐read‐only yes #配置從節點只讀 masterauth TXB@cxf123456! #主從認證密碼,否則主從不能同步
2.3 查看主從架構信息
進入主節點客戶端環境后輸入以下命令查看環境。
info replication #查看redis主從信息,出現以下從節點信息即配置成功
同時進入從節點輸入相同命令可出現以下信息。
2.4 驗證主從是否配置成功
在主節點寫入set字符串,檢測從節點是否存在。
set txb 123456 # 主節點寫入 get txb #在從節點獲取剛才寫入的值,如果能獲取得到說明配置成功
之后將IP為121.4.218.158的服務器做從節點的相同配置。
注:如果要配置多個從節點,每一個都做相同配置即可,同時記得每個服務器redis使用端口都加入安全組。
3. redis哨兵架構搭建
3.1 環境准備
准備三台機器(ip: 124.221.237.87,ip:124.221.239.69,ip:121.4.218.158),按照主從架構相同的方式先搭建三台架構的redis,同時開啟安全組的26379的端口。
3.2 添加哨兵配置文件
cd /usr/local/redis-5.0.3/ vim sentinel.conf #修改哨兵配置文件如下
daemonize yes sentinel monitor mymaster 124.221.237.87 6379 2 # mymaster這個名字隨便取,客戶端訪問時會用到,ip為主節點的ip sentinel auth-pass mymaster TXB@cxf123456! #設置訪問主節點的密碼
sentinel announce-ip 124.221.237.87 #sentinel-announce-ip 一定要配置,不然sentinel之間通信使用的是內網地址,無法通信,導致集群通信異常,master故障切換會失敗
sentinel announce-port 26379
3.3 啟動sentinel哨兵實例
src/redis‐sentinel sentinel.conf src/redis‐cli ‐p 26379 #連接客戶端
之后,將剩下兩台服務器做相同配置即可。
info #查看sentinel的info信息,可以看到Sentinel的info里已經識別出了redis的主從與哨兵
同時通過以下命令也可測試是否哨兵環境搭建成功。
cat /usr/local/redis-5.0.3/sentinel.conf
其中sentinel known‐replica mymaster 124.221.239.69 6379 #代表主節點的從節點信息
sentinel known‐sentinel mymaster 172.17.0.15 26379 5b2da10eff43d38b2c4398c7b108de58837839dc #代表感知到的其它哨兵節點
3.4 哨兵架構在Spring Boot項目中的使用
項目代碼以及講解如下所示:
鏈接:https://pan.baidu.com/s/12n_S7Ol1vQaY0YjKs10B2w
提取碼:txbq
在該項目中,使用while循環往redis哨兵架構中一直寫入數據,在操作成功后,我們將主節點給手動kill掉進程,看看redis哨兵是否能幫我們繼續選舉出新的master節點。
由上圖可見,redis循環設置值成功,此時我們將主節點的redis進程殺死。
我們發現程序報錯了,無法連接上redis。
但是過了一會我們發現程序又繼續連接上,而且連接的節點變成了124.221.239.69,此時使用 info replication命令查看信息發現master_host確實變成了124.221.239.69,至此哨兵結構搭建完成。
4. 集群架構搭建
4.1 集群環境准備
redis集群需要至少三個master節點,我們這里搭建三個master節點,並且給每個master再搭建一個slave節點,總共6個redis節點,這里用三台機器部署6個redis實例,每台機器一主一從,因此我們將使用前言中給出的六台服務器,同時添加安全組的16379端口。
4.2 修改配置文件
在單機模式的配置文件中再追加以下配置:
cluster‐enabled yes #啟動集群模式 cluster‐config‐file nodes‐6379.conf #集群節點信息文件 cluster‐node‐timeout 10000 #集群連接超時時間 appendonly yes #開啟AOF持久化 cluster-announce-ip 124.221.237.87 # 集群節點 IP,這里需要特別注意一下,如果要對外提供訪問功能,需要填寫宿主機的IP cluster-announce-port 6379 #集群節點映射端口 cluster-announce-bus-port 16379 # 集群節點總線端口
配置完成后,分別啟動六台redis實例,並檢查redis是否啟動成功。
ps -ef | grep redis
可以看出redis以集群的方式已啟動。
4.3 創建redis集群
從以上信息可看出redis預備創建集群的節點信息,其中M為主節點,S為從節點,輸入yes確定創建。
由上可見,集群已分配成功分為三主三從948fd140cda364778e694b5d4c18acf016f3178c 124.221.237.87:6379 slots:[0-5460] (5461 slots) master 1 additional replica(s)
948fd140cda364778e694b5d4c18acf016f3178c為該節點在集群中的唯一id,slots:[0-5460] (5461 slots)代表0-5460這5461個槽位落在該節點上。redis在寫入程序時會經過hash運算,最終判斷由哪個節點存 儲數據。
4.4 驗證集群
連接任意一個客戶端即可:./redis‐cli ‐c ‐h ‐p (‐a訪問服務端密碼,‐c表示集群模式,指定ip地址 和端口號)
src/redis-cli -a TXB@cxf123456! -c -h 124.221.237.87 -p 6379 cluster info # 查看集群信息 cluster nodes #查看集群節點信息
由此上信息可知,大功告成,代表集群已建立成功。
在124.221.237.87主機中設置txb1的值發現經過hash運算其落在12823這個槽位,因此自動為我們切換到124.221.246.23這個主機。
4.5 Redis的Cluster架構在Spring Boot中的使用
代碼以及講解如下所示:
yml按照上述配置進行配置即可,其中lettuce這一塊內容后面有空會出一期博客講解。
訪問成功,而且不同的key落在不同的集群節點上,具體如下。
5. Cluster的擴容、縮容操作
5.1 環境准備
這里我們再在上述集群的基礎上再增加一主一從的結構,因此我們還需要兩台服務器(ip:121.4.214.68, ip:124.221.243.252 ),同時開放這兩台機器的6379端口與16379端口,然后按照4.2配置啟動單個redis實例。
5.2 添加集群節點
src/redis-cli -a TXB@cxf123456! --cluster add-node 124.221.243.252:6379 124.221.237.87:6379
說明:前面的ip:port為新增加的ip端口,后面的ip:port為之前存在的ip端口,當出現New node added correctly即為添加成功。
進入客戶端查看集群情況。
src/redis-cli -a TXB@cxf123456! -c -h 124.221.237.87 -p 6379 cluster nodes
信息如下,可以看出124.221.243.252已經加入集群,但是並未給其分配插槽,所以該節點目前也無數據。
我們需要為新節點手工分配hash槽位。
src/redis-cli -a TXB@cxf123456! --cluster reshard 124.221.237.87:6379
需要多少個槽移動到新的節點上,自己設置,比如600個hash槽。
把這600個hash槽移動到哪個節點上去,需要指定節點id,這里指定剛配置的節點。
其中輸入all為從所有主節點中分別抽取相應的槽數指定到新節點中,抽取的總槽數為600個。
輸入yes確認開始執行分片任務。
我們再進入客戶端查看集群分片情況如下。
我們可以看到新加的節點中為其分配了0-198,5461-5661 10923-11121這600的槽位,至此新增主節點成功,我們再來新增從節點。
按照新增第一個節點的方式先將節點添加入集群。
src/redis-cli -a TXB@cxf123456! --cluster add-node 121.4.214.68:6379 124.221.237.87:6379
進入該節點的客戶端
src/redis-cli -a TXB@cxf123456! -c -h 121.4.214.68 -p 6379
查看集群節點信息
此處依然是未分配節點的主節點信息,我們需要執行replicate命令來指定當前節點(從節點)的主節點id為哪個,首先需要連接新加的121.4.214.68節點的客戶端,然后使用集群命令進行 操作,把當前的從節點指定到一個主節點下(這里使用之前創建的124.221.243.252主節點)。
cluster replicate 5f8fa2af74cfcd0c0a13bb6c512b80b48403c791 #后面的id為新增主節點的id
由上看出該節點已變成124.221.243.252的從節點,至此集群擴容結束。
5.3 刪除集群節點
刪除節點需要先刪除從節點,再刪除主節點。
src/redis-cli -a TXB@cxf123456! --cluster del-node 121.4.214.68:6379 96b6ad28c1344006b3eb6352ab507c2c2471da0c
ip:port后面的id為當前節點id。
由此可見從節點刪除成功,接下來刪除主節點,刪除主節點比較麻煩,因為主節點中分配了Hash槽位,我們需要先將hash槽位歸還。
src/redis-cli -a TXB@cxf123456! --cluster reshard 124.221.243.252:6379
需要移動多少節點?這里輸入600,因為我們剛才分配了600個節點。
用什么節點id來接收他? 這里輸入一個其他主節點的id。
這里是需要數據源,也就是我們的新加主節點節點id,然后輸入done開始生成歸還Hash槽位計划。
輸入yes,開始歸還Hash槽位。
歸還成功后,該節點沒有Hash槽位了,然后刪除其節點就行了。
src/redis-cli -a TXB@cxf123456! --cluster del-node 124.221.243.252:6379 5f8fa2af74cfcd0c0a13bb6c512b80b48403c791
ip:port后面的id為需要刪除節點的id。
再查看節點信息如下,只剩六個節點了,至此Cluster的縮容結束。美滋滋。
不用docker等容器安裝相對麻煩,但只有如此才能更加深刻的理解其中的奧秘,后續會出一份docker安裝的博客。