Redis集群模式分三種方式:
1、主從模式,這里通常指的是,主down后,需要手動升級從庫為主庫。主庫支持讀寫,從庫只讀。至少兩個redis實例
2、哨兵模式,是1模式的加強,由哨兵模式自動選舉從庫中的某一個為主庫。解決高可用問題。至少三個redis實例
3、Cluster集群模式,除了解決高可用問題外,還解決大量數據存儲問題,通過slot方式路由到不同的服務器組中。至少3台服務器,六個redis實例。
詳細的介紹請參閱:https://blog.csdn.net/miss1181248983/article/details/90056960
下面介紹如何搭建Cluster集群模式。
1、首選准備三台阿里雲機器,ip分別如下
s1:172.16.213.251
s2:172.16.213.250
s3:172.16.213.246
注意:建議盡量不要選擇Aliyun Linux操作系統,會遇到各種奇怪奇葩的問題,筆者用Aliyun linux花費大量時間,並未安裝成功,客服也僅僅只給建議,無奈換回主流的CenterOS,下面是三台服務器的版本情況
lsb_release -a
2、安裝Redis 6.0.10版本的,檢查服務器環境是否滿足
gcc -v #檢查gcc版本,需要是8.3+的
3、安裝tcl,否則編譯redis的時候不通過,這里安裝的時候直接使用rpm編譯好的包執行安裝即可。
小tips:國內有很多linux軟件鏡像,這里采用阿里雲的鏡像網站https://developer.aliyun.com/packageSearch?word=tcl,點開后直接搜索即可,注意使用自己需要的版本
rpm -ivh https://mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os/Packages/tcl-8.6.8-2.el8.x86_ 64.rpm?spm=a2c6h.13651111.0.0.70662f7099C6CD&file=tcl-8.6.8-2.el8.x86_64.rpm
#使用上面命令進行安裝,注意安裝的時候要重新獲取一次rpm安裝包地址,輸入命令回車,一會之后再回車一次,即可以看到Done安裝完成!
4、下載Redis,我們默認放到/usr/local/redis-6.0.10文件夾
cd /usr/local wget https://download.redis.io/releases/redis-6.0.10.tar.gz tar -zvxf redis-6.0.10.tar.gz cd redis-6.0.10/ make && make test && make install #也可以分步執行,看到下面截圖的命令基本代表已經安裝成功了。注意請確保gcc和tcl已經安裝了對應版本,否則make可能不通過。
5、下面要做6個redis實例,因為我們用了3台服務器,所以每台服務器會安裝兩個實例,具體如下:
172.16.213.251 | 7377端口 | s1 |
172.16.213.251 | 7477端口 | s1 |
172.16.213.250 | 7377端口 | s2 |
172.16.213.250 | 7477端口 | s2 |
172.16.213.246 | 7377端口 | s3 |
172.16.213.246 | 7477端口 | s3 |
注意:提前開啟阿里雲服務器對應端口號
6、下面以一台服務器為例,安裝實例
cp redis_init_script /etc/init.d #在/usr/local/redis-6.0.10目錄下,拷貝redis_init_script文件到/etc/init.d目錄下
mv redis_init_script redis_7477 #進入/etc/init.d目錄,並改名稱為redis_7477,修改redis_7477腳本的第6行的REDISPORT,設置為相同的端口號7477
#同時為了后續設置Redis開啟啟動,該文件頂部需要加上如下代碼段,整體的文件注意如下截圖
#!/bin/sh
# chkconfig: 2345 10 90
# description: Start and Stop redis
7、創建四個目錄
- /etc/redis(存放redis的配置文件)
- /var/redis/7477(存放redis的持久化文件)
mkdir -p /etc/redis mkdir -p /var/redis/7477
mkdir -p /etc/redis-cluster #集群用
mkdir -p /var/log/redis #日志
8、修改redis實例的配置文件(默認在根目錄下/usr/local/redis-6.0.10,redis.conf),拷貝到/etc/redis目錄中,修改名稱為7477.conf
cp /usr/local/redis-6.0.10/redis.conf /etc/redis mv redis.conf 7477.conf
9、修改redis.conf中的部分配置
- port 7477
- cluster-enabled yes
- cluster-config-file /etc/redis-cluster/node-7477.conf
- cluster-node-timeout 15000
- daemonize yes
- pidfile /var/run/redis_7477.pid
- dir /var/redis/7477
- logfile /var/log/redis/7477.log
- bind 0.0.0.0(這里代表通過本機哪個網卡過來的請求是可以被響應的,此處設計非常巧妙,一般設置內網bind 127.0.0.1 內網ip 即可,但實際做了開機啟動后,會發現通過內網ip無法連接的情況,顧干脆設置0.0.0.0問題可解決。https://www.cnblogs.com/kingsonfu/p/10138647.html)
- appendonly yes
- requirepass 設置密碼
- masterauth 設置密碼,必須等同於requirepass,也可以密碼留空
10、liunx常用命令提示
ls #列出文件 ls -l #列出文件詳情 chmod 777 文件名 #設置可執行文件 ps -ef|grep redis #列出包含redis字符的文件名字 cat 文件名字 #查看文件內容 vi 文件名字 #編輯文件內容,按住i,執行插入,esc退出,按/輸入字符,代表查找,查找情況下按n,代表查找下一個,shift z z代表保存並退出
11、上述執行完單redis實例的安裝,不出意外,環境的配置已經安裝好了。可以通過如下命令啟動下試試
cd /etc/init.d chmod 777 redis_7477 ./redis_7477 start #檢查是否正常啟動
ps -ef|grep redis
12、參考文章
https://www.cnblogs.com/blueskyli/p/9045930.html
https://www.cnblogs.com/blueskyli/p/9084548.html
13、搭建集群,按照上述步驟,分別在3台服務器,設置6個實例
14、構建集群,注意6.0一起版本的redis要求安裝ruby環境,6.0之后不需要安裝 ,此處我們不用安裝,直接構建集群即可
[root@iZbp145wkv4vf3oba7qge2Z bin]# redis-cli -a 密碼 --cluster create 172.16.213.251:7377 172.16.213.251:7477 17
2.16.213.250:7377 172.16.213.250:7477 172.16.213.246:7377 172.16.213.246:7477 --cluster-replicas 1
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.16.213.250:7477 to 172.16.213.251:7377
Adding replica 172.16.213.246:7477 to 172.16.213.250:7377
Adding replica 172.16.213.251:7477 to 172.16.213.246:7377
M: c83d02fcd82160d722be1fd6af92a2701c7f83d9 172.16.213.251:7377
slots:[0-5460] (5461 slots) master
S: 1ec9adecf00dfc19b4a1176fafc870256d651eae 172.16.213.251:7477
replicates 7a5690b1f833c2bae448bf978285c9c7e1238c93
M: 214a974eaf9ac38bcf6b46f85baa39a4db671eab 172.16.213.250:7377
slots:[5461-10922] (5462 slots) master
S: 39ead0048c4bbbdb0bc6b9516962070e286648af 172.16.213.250:7477
replicates c83d02fcd82160d722be1fd6af92a2701c7f83d9
M: 7a5690b1f833c2bae448bf978285c9c7e1238c93 172.16.213.246:7377
slots:[10923-16383] (5461 slots) master
S: c9516b62ebcd8fe888d4bc46a4190be412894fd4 172.16.213.246:7477
replicates 214a974eaf9ac38bcf6b46f85baa39a4db671eab
Can I set the above configuration? (type 'yes' to accept): yes ####這里要輸入yes,不能輸入y哦!!!
>>> 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.16.213.251:7377)
M: c83d02fcd82160d722be1fd6af92a2701c7f83d9 172.16.213.251:7377
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 214a974eaf9ac38bcf6b46f85baa39a4db671eab 172.16.213.250:7377
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 39ead0048c4bbbdb0bc6b9516962070e286648af 172.16.213.250:7477
slots: (0 slots) slave
replicates c83d02fcd82160d722be1fd6af92a2701c7f83d9
S: 1ec9adecf00dfc19b4a1176fafc870256d651eae 172.16.213.251:7477
slots: (0 slots) slave
replicates 7a5690b1f833c2bae448bf978285c9c7e1238c93
S: c9516b62ebcd8fe888d4bc46a4190be412894fd4 172.16.213.246:7477
slots: (0 slots) slave
replicates 214a974eaf9ac38bcf6b46f85baa39a4db671eab
M: 7a5690b1f833c2bae448bf978285c9c7e1238c93 172.16.213.246:7377
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.
[root@iZbp145wkv4vf3oba7qge2Z bin]#
15、至此,我們搭建完成了集群環境。一共6個redis實例,3主3從。其中對於命令
redis-cli -a 密碼 --cluster create 172.16.213.251:7377 172.16.213.251:7477 17 2.16.213.250:7377 172.16.213.250:7477 172.16.213.246:7377 172.16.213.246:7477 --cluster-replicas 1
-a 代表是加密鏈接,后面的ip組,排序不用關心,redis會按照主和從不在一台服務器上的原則,幫助構建主從情況,當然down機之后主從也會跟着去變換。--cluster-replicas 1代表主從的比例是1:1,有條件也可以設置1主多從,保證高可用。
實際生產環境如果資源夠用,建議至少6台服務器實現高可用。
16、通過上述構建出來的集群主從情況如下圖,redis非常聰明
17、若需要連接集群,通過命令
redis-cli -c -h 任意集群ip -p 任意端口7377/7477 -a pwdxxxx #-c 代表的是集群模式訪問
其他參考文章:https://blog.csdn.net/miss1181248983/article/details/90056960 可以去增加節點、刪除節點、停止服務器觀察節點主從變化等
18、集群的客戶端連接方式注意要羅列所有ip地址做連接初始化,同時鑒於上述集群會發現用阿里雲外網地址是無法連接的,會默認解析為內網ip,若要解決,需要修改配置文件,編組用外網ip編組,因為生產環境肯定要用內網連接,此步驟不做實驗了。
外網ip連接問題:https://blog.csdn.net/lingbomanbu_lyl/article/details/107999780
@Configuration public class RedisClusterConfig { @Bean public RedisConnectionFactory redisConnectionFactory() { // 客戶端讀寫分離配置 LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder() .readFrom(ReadFrom.REPLICA_PREFERRED) .build(); RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(Arrays.asList( "122.51.151.130:6381", "122.51.151.130:6382", "122.51.151.130:6383", "122.51.151.130:6384", "122.51.151.130:6385", "122.51.151.130:6386")); return new LettuceConnectionFactory(redisClusterConfiguration, clientConfig); } }