Redis主从配置和集群配置
Redis主從配置和集群配置
文章目錄
- Redis主從配置和集群配置
- 一、Redis主從配置
- 1.主從概念
- 2.主從配置
- 3.數(shù)據(jù)操作
- 二、Redis集群配置
- 1.簡介
- 2.Redis 集群好處
- 3.redis集群
- 4.實(shí)現(xiàn)機(jī)制
- 5.依賴配置
- 6.集群配置
- 1.**`配置機(jī)器1`**
- 2.**`配置機(jī)器2`**
- 3.創(chuàng)建集群
- 4.測試驗(yàn)證
- 7.在哪個(gè)服務(wù)器上寫數(shù)據(jù):CRC16
- 8.Python交互
- 9.參考閱讀
一、Redis主從配置
1.主從概念
- ?個(gè)master可以擁有多個(gè)slave,?個(gè)slave?可以擁有多個(gè)slave,如此下去,形成了強(qiáng)?的多級(jí)服務(wù)器集群架構(gòu)
- master用來寫數(shù)據(jù),slave用來讀數(shù)據(jù),經(jīng)統(tǒng)計(jì):網(wǎng)站的讀寫比率是10:1
- 通過主從配置可以實(shí)現(xiàn)讀寫分離
master和slave都是一個(gè)redis實(shí)例(redis服務(wù))
2.主從配置
- 配置主
- 查看當(dāng)前主機(jī)的ip地址
- 修改etc/redis/redis.conf文件
- 重啟redis服務(wù)
- 配置從
- 復(fù)制etc/redis/redis.conf文件
- 修改redis/slave.conf文件
- redis服務(wù)
- 查看主從關(guān)系
3.數(shù)據(jù)操作
- 在master和slave分別執(zhí)?info命令,查看輸出信息 進(jìn)入主客戶端
- 進(jìn)入從的客戶端
- 在master上寫數(shù)據(jù)
- 在slave上讀數(shù)據(jù)
二、Redis集群配置
1.簡介
- 集群:一組通過網(wǎng)絡(luò)連接的計(jì)算機(jī),共同對(duì)外提供服務(wù),像一個(gè)獨(dú)立的服務(wù)器
- Redis集群是一個(gè)由多個(gè)節(jié)點(diǎn)組成的分布式服務(wù)器群,它具有復(fù)制、高可用和分片特性;
- Redis集群沒有中心節(jié)點(diǎn),并且?guī)в袕?fù)制和故障轉(zhuǎn)移特性,這可以避免單個(gè)節(jié)點(diǎn)成為性能瓶頸,或者因?yàn)槟硞€(gè)節(jié)點(diǎn)下線而導(dǎo)致整個(gè)集群下線;
- 集群中的主節(jié)點(diǎn)負(fù)責(zé)處理槽(存儲(chǔ)數(shù)據(jù)),從節(jié)點(diǎn)則是主節(jié)點(diǎn)的復(fù)制品;
- Redis集群將整個(gè)數(shù)據(jù)庫分成16384個(gè)槽,數(shù)據(jù)庫中的每個(gè)鍵都屬于16384個(gè)槽中的其中一個(gè);
- 集群中的每個(gè)主節(jié)點(diǎn)都可以負(fù)責(zé)0到16384個(gè)槽,當(dāng)16384個(gè)槽都有節(jié)點(diǎn)在負(fù)責(zé)時(shí),集群進(jìn)入上線狀態(tài),可以執(zhí)行客戶端發(fā)送的數(shù)據(jù)命令;
- 主節(jié)點(diǎn)只會(huì)執(zhí)行和自己負(fù)責(zé)的槽相關(guān)的命令,當(dāng)節(jié)點(diǎn)接收到不屬于自己處理的槽的命令時(shí),它會(huì)將處理指定槽的節(jié)點(diǎn)的地址返回給客戶端,而客戶端會(huì)向正確的節(jié)點(diǎn)重新發(fā)送命令,這個(gè)過程稱為“轉(zhuǎn)向”;
- Redis 集群通過分區(qū)(partition)來提供一定程度的可用性(availability):即使集群中有一部分節(jié)點(diǎn)失效或者無法進(jìn)行通訊,集群也可以繼續(xù)處理命令請(qǐng)求。
2.Redis 集群好處
Redis 集群提供了以下兩個(gè)好處:
- 將數(shù)據(jù)自動(dòng)切分(split)到多個(gè)節(jié)點(diǎn)的能力。
- 當(dāng)集群中的一部分節(jié)點(diǎn)失效或者無法進(jìn)行通訊時(shí), 仍然可以繼續(xù)處理命令請(qǐng)求的能力。
為什么要有集群
之前我們已經(jīng)講了主從的概念,一主可以多從,如果同時(shí)的訪問量過大(1000w),主服務(wù)肯定就會(huì)掛掉,數(shù)據(jù)服務(wù)就掛掉了或者發(fā)生自然災(zāi)難
大公司都會(huì)有很多的服務(wù)器(華東地區(qū)、華南地區(qū)、華中地區(qū)、華北地區(qū)、西北地區(qū)、西南地區(qū)、東北地區(qū)、臺(tái)港澳地區(qū)機(jī)房)
3.redis集群
- 分類
- 軟件層面
- 硬件層面
- 軟件層面:只有一臺(tái)電腦,在這一臺(tái)電腦上啟動(dòng)了多個(gè)redis服務(wù)。
- 硬件層面:存在多臺(tái)實(shí)體的電腦,每臺(tái)電腦上都啟動(dòng)了一個(gè)redis或者多個(gè)redis服務(wù)。
4.實(shí)現(xiàn)機(jī)制
- Redis Cluster 是Redis的集群實(shí)現(xiàn),內(nèi)置數(shù)據(jù)自動(dòng)分片機(jī)制,集群內(nèi)部將所有的key映射到16384個(gè)Slot中,集群中的每個(gè)Redis Instance負(fù)責(zé)其中的一部分的Slot的讀寫。
- 集群客戶端連接集群中任一Redis Instance即可發(fā)送命令,當(dāng)Redis Instance收到自己不負(fù)責(zé)的Slot的請(qǐng)求時(shí),會(huì)將負(fù)責(zé)請(qǐng)求Key所在Slot的Redis Instance地址返回給客戶端,客戶端收到后自動(dòng)將原請(qǐng)求重新發(fā)往這個(gè)地址,對(duì)外部透明。
- 一個(gè)Key到底屬于哪個(gè)Slot由crc16(key)% 16384 決定。
- 關(guān)于集群成員管理,集群的節(jié)點(diǎn)(Redis Instance)和節(jié)點(diǎn)之間兩兩定期交換集群內(nèi)節(jié)點(diǎn)信息并且更新,從發(fā)送節(jié)點(diǎn)的角度看,這些信息包括:集群內(nèi)有哪些節(jié)點(diǎn),IP和PORT是什么,節(jié)點(diǎn)名字是什么,節(jié)點(diǎn)的狀態(tài)(比如OK,PFAIL,FAIL)是什么,包括節(jié)點(diǎn)角色(master或者 slave)等。
- 關(guān)于可用性,集群由N組主從Redis Instance組成。
- 主可以沒有從,但是沒有從 意味著主宕機(jī)后主負(fù)責(zé)的Slot讀寫服務(wù)不可用。
- 一個(gè)主可以有多個(gè)從,主宕機(jī)時(shí),某個(gè)從會(huì)被提升為主,具體哪個(gè)從被提升為主,協(xié)議類似于Raft,參見這里。
- 如何檢測主宕機(jī)?Redis Cluster采用quorum+心跳的機(jī)制。
- 從節(jié)點(diǎn)的角度看,節(jié)點(diǎn)會(huì)定期給其他所有的節(jié)點(diǎn)發(fā)送Ping, cluster-node-timeout(可配置,秒級(jí))時(shí)間內(nèi)沒有收到對(duì)方的回復(fù),則單方面認(rèn)為對(duì)端節(jié)點(diǎn)宕機(jī),將該節(jié)點(diǎn)標(biāo)為PFAIL狀態(tài)。
- 通過節(jié)點(diǎn)之間交換信息收集到quorum個(gè)節(jié)點(diǎn)都認(rèn)為這個(gè)節(jié)點(diǎn)為PFAIL,則將該節(jié)點(diǎn)標(biāo)記為FAIL,并且將其發(fā)送給其他所有節(jié)點(diǎn),其他所有節(jié)點(diǎn)收到后立即認(rèn)為該節(jié)點(diǎn)宕機(jī)。
- 從這里可以看出,主宕機(jī)后,至少cluster-node-timeout時(shí)間內(nèi)該主所負(fù)責(zé)的Slot的讀寫服務(wù)不可用。
5.依賴配置
Redis集群配置之前需要依賴一些相關(guān)庫配置,因此需要先安裝以下相關(guān)庫;
- (1) 確保系統(tǒng)安裝zlib,否則gem install會(huì)報(bào)(no such file to load – zlib)
- (2) 安裝ruby:version(2.2.2)
- 安裝完成后可以查看相應(yīng)的版本信息:
- (3)安裝rubygem:version(1.8.16)
- 安裝完成后可以查看相應(yīng)的版本信息:
- (4)安裝redis與ruby接口gem-redis:version(3.0.6)
6.集群配置
集群配置案例:
1.配置機(jī)器1
- 在演示中,172.16.179.130為當(dāng)前ubuntu機(jī)器的ip
- 在172.16.179.130上進(jìn)?Desktop?錄,創(chuàng)建conf?錄
- 在conf?錄下創(chuàng)建?件7000.conf,編輯內(nèi)容如下
在conf?錄下創(chuàng)建?件7001.conf,編輯內(nèi)容如下
port 7001 bind 172.16.179.130 daemonize yes pidfile 7001.pid cluster-enabled yes cluster-config-file 7001_node.conf cluster-node-timeout 15000 appendonly yes在conf?錄下創(chuàng)建?件7002.conf,編輯內(nèi)容如下
port 7002 bind 172.16.179.130 daemonize yes pidfile 7002.pid cluster-enabled yes cluster-config-file 7002_node.conf cluster-node-timeout 15000 appendonly yes總結(jié):三個(gè)?件的配置區(qū)別在port、pidfile、cluster-config-file三項(xiàng)
- 使?配置?件啟動(dòng)redis服務(wù)
查看進(jìn)程如下圖
2.配置機(jī)器2
- 在演示中,172.16.179.131為當(dāng)前ubuntu機(jī)器的ip
- 在172.16.179.131上進(jìn)?Desktop?錄,創(chuàng)建conf?錄
- 在conf?錄下創(chuàng)建?件7003.conf,編輯內(nèi)容如下
在conf?錄下創(chuàng)建?件7004.conf,編輯內(nèi)容如下
port 7004 bind 172.16.179.131 daemonize yes pidfile 7004.pid cluster-enabled yes cluster-config-file 7004_node.conf cluster-node-timeout 15000 appendonly yes在conf?錄下創(chuàng)建?件7005.conf,編輯內(nèi)容如下
port 7005 bind 172.16.179.131 daemonize yes pidfile 7005.pid cluster-enabled yes cluster-config-file 7005_node.conf cluster-node-timeout 15000 appendonly yes總結(jié):三個(gè)?件的配置區(qū)別在port、pidfile、cluster-config-file三項(xiàng)
- 使?配置?件啟動(dòng)redis服務(wù)
查看進(jìn)程如下圖
3.創(chuàng)建集群
- redis的安裝包中包含了redis-trib.rb,?于創(chuàng)建集群
- 接下來的操作在172.16.179.130機(jī)器上進(jìn)?
- 將命令復(fù)制,這樣可以在任何?錄下調(diào)?此命令
- 安裝ruby環(huán)境,因?yàn)閞edis-trib.rb是?ruby開發(fā)的
- 在提示信息處輸?y,然后回?繼續(xù)安裝
- 運(yùn)?如下命令創(chuàng)建集群
- 執(zhí)?上?這個(gè)指令在某些機(jī)器上可能會(huì)報(bào)錯(cuò),主要原因是由于安裝的 ruby 不是最 新版本
- 天朝的防?墻導(dǎo)致?法下載最新版本,所以需要設(shè)置 gem 的源
- 提示如下主從信息,輸?yes后回?
4.測試驗(yàn)證
[root@node01 src]# ./redis-cli -h 172.168.10.252 -p 7000172.168.10.252:7000> get date(nil)172.168.10.252:7000> get aa(nil)172.168.10.252:7000> get name(error) MOVED 5798 172.168.10.253:7000172.168.10.252:7000>-
目前主要的 Redis 集群客戶端(或者說,支持集群功能的 Redis 客戶端)有以下這些:
-
1、redis-rb-cluster:antirez 使用Ruby 編寫的 Redis 集群客戶端,集群客戶端的官方實(shí)現(xiàn);
-
2、predis:Redis的 PHP 客戶端,支持集群功能;
-
3、jredis:Redis的 JAVA 客戶端,支持集群功能;
-
4、StackExchange.Redis:Redis 的C# 客戶端,支持集群功能;
-
5、內(nèi)置的 redis-cli :在啟動(dòng)時(shí)給定 -c 參數(shù)即可進(jìn)入集群模式,支持部分集群功能;
7.在哪個(gè)服務(wù)器上寫數(shù)據(jù):CRC16
- redis cluster在設(shè)計(jì)的時(shí)候,就考慮到了去中?化,去中間件,也就是說,集群中的每個(gè)節(jié)點(diǎn)都是平等的關(guān)系,都是對(duì)等的,每個(gè)節(jié)點(diǎn)都保存各?的數(shù)據(jù)和整個(gè)集 群的狀態(tài)。
- 每個(gè)節(jié)點(diǎn)都和其他所有節(jié)點(diǎn)連接,?且這些連接保持活躍,這樣就保 證了我們只需要連接集群中的任意?個(gè)節(jié)點(diǎn),就可以獲取到其他節(jié)點(diǎn)的數(shù)據(jù)
- Redis集群沒有并使?傳統(tǒng)的?致性哈希來分配數(shù)據(jù),?是采?另外?種叫做哈希 槽 (hash slot)的?式來分配的。
- redis cluster 默認(rèn)分配了 16384 個(gè)slot,當(dāng)我們 set?個(gè)key 時(shí),會(huì)?CRC16算法來取模得到所屬的slot,然后將這個(gè)key 分到哈 希槽區(qū)間的節(jié)點(diǎn)上,具體算法就是:CRC16(key) % 16384。
- 所以我們?cè)跍y試的 時(shí)候看到set 和 get 的時(shí)候,直接跳轉(zhuǎn)到了7000端?的節(jié)點(diǎn)
Redis 集群會(huì)把數(shù)據(jù)存在?個(gè) master 節(jié)點(diǎn),然后在這個(gè) master 和其對(duì)應(yīng)的salve 之間進(jìn)?數(shù)據(jù)同步。 - 當(dāng)讀取數(shù)據(jù)時(shí),也根據(jù)?致性哈希算法到對(duì)應(yīng)的 master 節(jié) 點(diǎn)獲取數(shù)據(jù)。
- 只有當(dāng)?個(gè)master 掛掉之后,才會(huì)啟動(dòng)?個(gè)對(duì)應(yīng)的 salve 節(jié)點(diǎn),充 當(dāng) master
- 需要注意的是:必須要3個(gè)或以上的主節(jié)點(diǎn),否則在創(chuàng)建集群時(shí)會(huì)失敗,并且當(dāng)存 活的主節(jié)點(diǎn)數(shù)?于總節(jié)點(diǎn)數(shù)的?半時(shí),整個(gè)集群就?法提供服務(wù)了
8.Python交互
- 安裝包如下
redis-py-cluster源碼地址https://github.com/Grokzen/redis-py-cluster
- 創(chuàng)建?件redis_cluster.py,示例碼如下
9.參考閱讀
- redis集群搭建http://www.cnblogs.com/wuxl360/p/5920330.html
- [Python]搭建redis集群http://blog.5ibc.net/p/51020.html
總結(jié)
以上是生活随笔為你收集整理的Redis主从配置和集群配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis数据操作和与Python交互
- 下一篇: Git/SQL/正则表达式练习平台