Redis--叢集搭建
為什麼要搭建叢集
- 通常,為了提高網站響應速度,總是把熱點資料儲存在記憶體中而不是直接從後端資料庫中讀取。 Redis是一個很好的Cache工具。大型網站應用,熱點資料量往往巨大,幾十G上百G是很正常的事兒。
- 由於記憶體大小的限制,使用一臺 Redis 例項顯然無法滿足需求,這時就需要使用多臺.Redis作為快取資料庫。但是如何保證資料儲存的一致性呢,這時就需要搭建redis叢集.採用合理的機制,保證使用者的正常的訪問需求.
- 採用redis叢集,可以保證資料分散儲存,同時保證資料儲存的一致性.並且在內部實現高可用的機制.實現了服務故障的自動遷移.
redis分片特點:
1.可以實現Redis記憶體資料的擴容.
2.redis分片本身沒有高可用效果的.如果當機將直接影響使用者的使用.
redis哨兵特點:
1.Redis哨兵可以實現Redis節點的高可用.但是哨兵本身沒有實現高可用機制.(最好不要引入第三方)
2.Redis哨兵有主從的結構 實現了記憶體資料的備份. 但是沒有實現記憶體擴容的效果.
升級:
需要Redis內容擴容同時需要Redis高可用性所以應該使用Redis叢集.
叢集搭建
1 準備叢集資料夾
1.準備叢集資料夾
Mkdir cluster
2.在cluster資料夾中分別建立7000-7005資料夾
2.複製配置檔案
說明:
將redis根目錄中的redis.conf檔案複製到cluster/7000/ 並以原名儲存
cp redis.conf cluster/7000/
3 .編輯配置檔案
- 註釋本地繫結IP地址
- 關閉保護模式
- 修改埠號
- 啟動後臺啟動
- 修改pid檔案
- 修改持久化檔案路徑
- 設定記憶體優化策略
- 關閉AOF模式
- 開啟叢集配置
- 開啟叢集配置檔案
- 開啟叢集配置檔案
- 修改叢集超時時間
- 修改叢集超時時間
4 複製修改後的配置檔案
說明:將7000資料夾下的redis.conf檔案分別複製到7001-7005中
[root@localhost cluster]# cp 7000/redis.conf 7001/
[root@localhost cluster]# cp 7000/redis.conf 7002/
[root@localhost cluster]# cp 7000/redis.conf 7003/
[root@localhost cluster]# cp 7000/redis.conf 7004/
[root@localhost cluster]# cp 7000/redis.conf 7005/
5 批量修改
說明:分別將7001-7005檔案中的7000改為對應的埠號的名稱,
修改時注意方向鍵的使用
6 通過指令碼編輯啟動/關閉指令
1. 建立啟動指令碼 vim start.sh
2. 編輯關閉的指令碼 vim shutdown.sh
3. 啟動redis節點
sh start.sh
- 檢查redis節點啟動是否正常
7 建立redis叢集
5.0版本執行 使用C語言內部管理叢集
redis-cli --cluster create --cluster-replicas 1 192.168.126.129:7000 192.168.126.129:7001 192.168.126.129:7002 192.168.126.129:7003 192.168.126.129:7004 192.168.126.129:7005
8 Redis叢集高可用測試
- 關閉redis主機.檢查是否自動實現故障遷移.
- 再次啟動關閉的主機.檢查是否能夠實現自動的掛載.
一般情況下 能夠實現主從掛載
個別情況: 當機後的節點重啟,可能掛載到其他主節點中(7001-7002) 正確的
9.關於Redis叢集搭建問題說明
前提條件: redis.conf的配置檔案首先應該配置正確 碼雲中有redis配置.
搭建步驟:
1.關閉所有的redis伺服器
sh stop.sh
2.刪除多餘的檔案
由於搭建叢集之後,所有的叢集的資訊都會寫入nodes.conf檔案中,如果下次重啟會讀取其中的配置資訊實現redis叢集的主從的搭建. 所以如果需要重新搭建叢集,則必須刪除該檔案重新生成.
3.重啟redis伺服器 執行掛載命令
redis-cli --cluster create --cluster-replicas 1 192.168.126.129:7000 192.168.126.129:7001 192.168.126.129:7002 192.168.126.129:7003 192.168.126.129:7004 192.168.126.129:7005
10. SpringBoot整合Redis叢集
redis叢集的入門案例
jedisCluster 操作整個redis叢集,連結redis的所有的節點
@Test
public void testCluster(){
Set<HostAndPort> sets = new HashSet<>();
sets.add(new HostAndPort("192.168.126.129", 7000));
sets.add(new HostAndPort("192.168.126.129", 7001));
sets.add(new HostAndPort("192.168.126.129", 7002));
sets.add(new HostAndPort("192.168.126.129", 7003));
sets.add(new HostAndPort("192.168.126.129", 7004));
sets.add(new HostAndPort("192.168.126.129", 7005));
JedisCluster jedisCluster = new JedisCluster(sets);
jedisCluster.set("cluster", "叢集測試");
System.out.println(jedisCluster.get("cluster"));
}
Redis叢集原理
Redis叢集高可用推選原理
Redis的所有節點都會儲存當前redis叢集中的全部主從狀態資訊.並且每個節點都能夠相互通訊.當一個節點發生當機現象.則叢集中的其他節點通過PING-PONG檢測機制檢查Redis節點是否當機.當有半數以上的節點認為當機.則認為主節點當機.同時由Redis剩餘的主節點進入選舉機制.投票選舉連結當機的主節點的從機.實現故障遷移.
Redis叢集當機條件
特點:叢集中如果主機當機,那麼從機可以繼續提供服務,
當主機中沒有從機時,則向其它主機借用多餘的從機.繼續提供服務.如果主機當機時沒有從機可用,則叢集崩潰.
如果3主3從(1主1從) 最少/當機幾臺叢集崩潰? B
A. 1臺 B.2臺 C.3臺 D.4臺
如果3主6從(1主2從) 最少當機幾臺叢集崩潰? C
A. 3臺 B.4臺 C.5臺 D.6臺
說明: 如果沒有子節點 則會借用其他主機的多餘的從.
關於選舉機制-腦裂現象
說明: 當叢集進行選舉時,如果連續3次都出現了平票的結果的則可能出現腦裂的現象.(3主3從)
問題: 出現腦裂現象的概率是多少??? 1/8
數學建模:
拋銀幣連續3次出現平票的概念是多少? 1/8=12.5%
第一次: 正正 正反 反正 反反 1/2
第二次: 正正 正反 反正 反反 1/2
第三次: 正正 正反 反正 反反 1/2
預防: 增加主節點的數量可以有效的降低腦裂現象的發生.
Redis hash槽儲存資料原理
說明:
RedisCluster採用此分割槽,所有的鍵根據雜湊函式(CRC16[key]%16384)對映到0-16383槽內,共16384個槽位,每個節點維護部分槽及槽所對映的鍵值資料.根據主節點的個數,均衡劃分割槽間.
演算法:
雜湊函式: Hash()=CRC16[key]%16384
圖解
當向redis叢集中插入資料時,
- 首先將key進行計算.之後將計算結果匹配到具體的某一個槽的區間內,
- 之後再將資料set到管理該槽的節點中.
叢集面試題
問題1: Redis叢集中最多儲存16384個資料???
錯的 分割槽只負責資料的劃分 資料的儲存由記憶體決定.
crc16(key1)%16384 = 1000
crc16(key2)%16384 = 1000
問題2: Redis叢集中最多有多少臺主機?? 16384主機.
一臺主機佔用一個槽道
相關文章
- 搭建zookeeper叢集(偽叢集)
- zookeeper叢集及kafka叢集搭建Kafka
- Redis系列:搭建Redis叢集(叢集模式)Redis模式
- linux下搭建ZooKeeper叢集(偽叢集)Linux
- Hadoop叢集搭建Hadoop
- Zookeeper叢集搭建
- redis叢集搭建Redis
- mysql叢集搭建MySql
- zookeeper 叢集搭建
- 搭建 Redis 叢集Redis
- RabbitMQ叢集搭建MQ
- nacos 叢集搭建
- HBASE叢集搭建
- 搭建ELK叢集
- Ambari叢集搭建
- kafka叢集搭建Kafka
- Hadoop搭建叢集Hadoop
- 【環境搭建】RocketMQ叢集搭建MQ
- Docker Swarm 叢集搭建DockerSwarm
- 搭建redis cluster叢集Redis
- Hbase 2.2.5叢集搭建
- docker搭建consul叢集Docker
- 快速搭建Jenkins叢集Jenkins
- 搭建MongoDB分片叢集MongoDB
- redis 4.0.11 叢集搭建Redis
- MySQL MGR 叢集搭建MySql
- 【greenplum】greenplum叢集搭建
- Kubernetes 叢集搭建(上)
- Kubernetes 叢集搭建(下)
- MongoDB 分片叢集搭建MongoDB
- ElasticSearch 7.8.1叢集搭建Elasticsearch
- Docker 搭建叢集 MongoDBDockerMongoDB
- zookeeper叢集的搭建
- Hadoop叢集搭建(一)Hadoop
- redis叢集的搭建Redis
- Kubernetes叢集搭建(vagrant)
- docker搭建mysql叢集DockerMySql
- Docker搭建ELK叢集Docker