1、案例概述
單節點Redis服務器帶來的問題
單點故障,服務不可用
無法處理大量的并發資料請求
資料丟失—大災難
解決方法
搭建Redis集群
2、案例前置知識點
Redis集群介紹
Redis集群是一個提供在多個Redis間節點間共享資料的程式集
Redis集群并不支持處理多個keys的命令,因為這需要在不同的節點間移動資料,從而達不到像Redis那樣的性能,在高負載的情況下可能會導致不可預料的錯誤
Redis集群通過磁區來提供一定程度的可用性,在實際環境中當某個節點宕機或者不可達的情況下可繼續處理命令
Redis集群的優勢
自動分割資料到不同的節點上
整個集群的部分節點失敗或者不可達的情況下能夠繼續處理命令
Redis集群的實作方法
有客戶端分片
代理分片
服務器端分片
Redis-Cluster資料分片
Redis 集群沒有使用一致性hash, 而是引入了 哈希槽概念
Redis 集群有16384個哈希槽
每個key通過CRC16校驗后對16384取模來決定放置槽
集群的每個節點負責一部分哈希槽
以3個節點組成的集群為例
節點 A 包含 0 到 5500號哈希槽
節點 B 包含5501 到 11000 號哈希槽
節點 C 包含11001 到 16384號哈希槽
支持添加或者洗掉節點
添加洗掉節點無需停止服務
例如
如果想新添加個節點D, 需要移動節點 A, B, C中的部分槽到D上
如果想移除節點A,需要將A中的槽移到B和C節點上,再將沒有任何槽的A節點從集群中移除
Redis-Cluster的主從復制模型
集群中具有A,B,C三個節點,如果節點B失敗了,整個集群就會因缺少5501-11000這個范圍的槽而不可用
為每個節點添加一個從節點A1,B1,C1, 整個集群便有三個master節點和三個slave節點組成,在節點B失敗后,集群便會選舉B1為新的主節點繼續服務
當B和B1 都失敗后,集群將不可用
3、案例環境
4、案例實施
設定網路引數、關閉防火墻和selinux(所有節點)
下載并安裝Redis(所有節點)
所需軟體包redis-4.0.11.tar.gz
(1)解壓
[root@node1 ~]# tar zxvf redis-4.0.11.tar.gz -C /usr/src/
(2)編譯
[root@node1 ~]# cd /usr/src/redis-4.0.11/
存在Makefile檔案,無需額外配置,可直接編譯
[root@node1 redis-4.0.11]# make
(3)安裝
[root@node1 src]# make install
修改Redis組態檔(所有節點)
[root@node1 ~]# mkdir -p /data/redis/{7000,7001}/data
[root@node1 ~]# mkdir -p /usr/local/redis-cluster/bin
[root@node1 ~]# mkdir -p /usr/local/redis-cluster/7000
[root@node1 redis-4.0.11]# cp redis.conf /usr/local/redis-cluster/7000/
(1)修改主組態檔redis.conf
vim /usr/local/redis-cluster/7000/redis.conf
bind 192.168.116.152 #系結本機IP
daemonize yes #開啟后臺運行
dir /data/redis/7000/data #資料存放路徑
port 7000 #監聽埠
pidfile /var/run/redis_7000.pid #pid檔案
logfile /var/log/redis_7000.log #log檔案
cluster-enabled yes #打開注釋
cluster-config-file nodes.conf #打開注釋
cluster-node-timeout 15000 #打開注釋
appendonly yes #開啟持久化
(2)啟動redis
[root@node1 ~]# /usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/7000/redis.conf
[root@node1 ~]# /usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/7001/redis.conf
(3)查看redis的狀態
Node1:
[root@node1 ~]# netstat -anpt | grep redis
Node2:
Node3:
Node2、Node3與Node1部署redis程序相同,不再詳述。
創建Redis集群(master1節點)
安裝Ruby2.4.9版本
安裝依賴環境
[root@node1 ~]# yum -y install zlib-devel openssl-devel
安裝ruby
所需軟體包:ruby-2.4.9.tar.gz
(1)解壓
[root@node1 ~]# tar zxvf ruby-2.4.9.tar.gz -C /usr/src/
(2)配置
[root@node1 ~]# cd /usr/src/ruby-2.4.9/
[root@node1 ~]# ./configure --prefix=/usr/local/ruby-2.4.9
(3)編譯
[root@node1 ~]# make
(4)安裝
[root@node1 ~]# make install
(5)優化路徑
[root@node1 ~]# ln -s /usr/local/ruby-2.4.9/bin/ruby /usr/bin/ruby
[root@node1 ~]# ln -s /usr/local/ruby-2.4.9/bin/gem /usr/bin/gem
[root@node1 ~]# gem -v
2.6.14.4
[root@node1 ~]# ruby -v
ruby 2.4.9p362 (2019-10-02 revision 67824) [x86_64-linux]
安裝redis客戶端
[root@node1 ~]# gem install redis
創建redis集群
/usr/local/redis-cluster/bin/redis-trib.rb create --replicas 1 192.168.116.152:7000 192.168.116.152:7001 192.168.116.138:7000 192.168.116.138:7001 192.168.116.153:7000 192.168.116.153:7001
調整Redis集群主從關系
洗掉所有的從節點(master1節點)
洗掉節點組態檔和持久化檔案(slave1、2、3節點)
重新添加從節點(master1節點)
檢查新的主從關系(master1節點)
測驗集群資料讀寫
通過客戶端命令連接上,通過集群命令看一下狀態和節點資訊等
[root@localhost ~]# /usr/local/redis-cluster/bin/redis-cli -h 192.168.116.138 -p 7001 -c
192.168.116.138:7000> set k1 11
-> Redirected to slot [12706] located at 192.168.116.153:7000
OK
將資料寫到哈希槽12706里面,無論連接哪個redis資料庫,都能get到key的值。
192.168.116.153:7000> cluster nodes
2193cd6df9d79cd0d95900e8ec3b7a05edd08aae 192.168.116.138:7000@17000 master - 0 1595598603718 3 connected 5461-10922
c8a068aa04fe79c5bfc8f8f2776cbca76da4abf9 192.168.116.152:7000@17000 master - 0 1595598602000 1 connected 0-5460
4bee60ba1bda511a8f5ddfd8e97d29c5b30176b5 192.168.116.138:7001@17001 slave c8a068aa04fe79c5bfc8f8f2776cbca76da4abf9 0 1595598601000 4 connected
bf52c192bf23ab200979c419e5fcbaf3f0de9ff7 192.168.116.153:7001@17001 slave 2193cd6df9d79cd0d95900e8ec3b7a05edd08aae 0 1595598601000 6 connected
9a7940498aee1898b8c72fa04bc13bd9250debae 192.168.116.152:7001@17001 slave 93db014e1565d78784f0cb6eed875bb79f865b54 0 1595598602709 5 connected
93db014e1565d78784f0cb6eed875bb79f865b54 192.168.116.153:7000@17000 myself,master - 0 1595598603000 5 connected 10923-16383
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/9466.html
標籤:虛擬化
