redis集群

1. Redis功能介紹

1.1 數據類型豐富
1.2 支持持久化
1.3 多種內存分配及回收策略
1.4 支持弱事務
1.5 消息隊列、消息訂閱
1.6 支持高可用
1.7 支持分布式分片集群
1.8 緩存穿透\雪崩
1.9 Redis API

Redis: 優點:高性能讀寫、多數據類型支持、數據持久化、高可用架構、支持自定義虛擬內存、支持分布式分片集群、單線程讀寫性能極高 ;
缺點:單機情況下,讀寫性能較慢。

2.Redis安裝部署:

(1)下載:

[root@db01 /data]# wget http://download.redis.io/releases/redis-3.2.12.tar.gz

(2)解壓:

[root@db01 /data]# tar xzf redis-3.2.12.tar.gz
[root@db01 /data]# mv redis-3.2.12 redis

(3)安裝:

[root@db01 /data]# yum -y install gcc automake autoconf libtool make
[root@db01 /data]# cd redis
[root@db01 /data]# make

(4)修改環境變量:

[root@db01 /data]#vim /etc/profile 
export PATH=/data/redis/src:$PATH
source /etc/profile

(5)啟動:

[root@db01 /data]# redis-server & 

(6)連接測試:

[root@db01 /data]# redis-cli 
127.0.0.1:6379> set num 10  ##設置num是10
OK
127.0.0.1:6379> get num  ##查看num
10

3. Redis基本管理操作

3.1基礎配置文件介紹

[root@db01 ~]#mkdir /data/6379
[root@db01 ~]#cat > /data/6379/redis.conf<<EOF
daemonize yes   ##是否后臺運行
port 6379          ##默認端口
logfile /data/6379/redis.log  ##日志文件位置
dir /data/6379  ##持久化文件存儲位置
dbfilename dump.rdb   ##RDB持久化數據文件
EOF

3.2 redis安全配置

[root@db01 ~]#vim /data/6379/redis.conf   ##在最初配置下,再加入2行
bind 10.0.0.51  127.0.0.1  ##允許遠程和本地登錄
requirepass 123456  ##密碼
驗證:
[root@db01 src]# redis-cli -a 123 -h 10.0.0.51 -p 6379
10.0.0.51:6379> set b 2
2
OK
10.0.0.51:6379> get b 
2

3.4 redis持久化(內存數據保存到磁盤)

3.4.1 RDB 持久化

(1)介紹
可以在指定的時間間隔內生成數據集的 時間點快照(point-in-time snapshot)。
優點:速度快,適合于用做備份,主從復制也是基于RDB持久化功能實現的。
缺點:會有數據丟失

(2) rdb持久化核心配置參數:
[root@db01 ~]#vim /data/6379/redis.conf
dir /data/6379 ##持久化存儲目錄
dbfilename dump.rdb ##以及持久化未來的文件名
save 900 1 ##900秒內累計有1個更改,就持久化一次
save 300 10

save 60 10000

3.4.2 AOF 持久化(append-only log file)

(1)介紹
記錄服務器執行的所有寫操作命令,并在服務器啟動時,通過重新執行這些命令來還原數據集,相當于mysql里面的binlog功能。
AOF 文件中的命令全部以 Redis 協議的格式來保存,新命令會被追加到文件的末尾。
優點:可以最大程度保證數據不丟
缺點:日志記錄量級比較大

(2) AOF持久化配置
[root@db01 ~]#vim /data/6379/redis.conf
appendonly yes ##開啟
appendfsync everysec ##刷寫策略設置每秒刷寫

4、Redis數據類型:

4.1 類型分類:

String : 字符類型
Hash: 字典類型
List: 列表
Set: 集合
Sorted set: 有序集合

4.2 數據類型應用場景:

string : 計數器應用 ,session 共享
hash : MySQL數據庫緩存,canal mysql 自動 redis
list : 朋友圈
set : 集合操作 : 共同好友,共同喜好、二度好友等功能,
sortset : 排行榜

5. Redis主從復制環境搭建:

5.1 環境準備:

準備兩個或兩個以上redis實例
[root@db01 ~]#mkdir /data/638{0..2}
配置文件示例:
[root@db01 ~]#cat >> /data/6380/redis.conf <<EOF
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
requirepass 123
masterauth 123   ##主從認證信息,所有主從節點這個項必須一致
EOF


[root@db01 ~]#cat >>   /data/6381/redis.conf <<EOF
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
requirepass 123
masterauth 123
EOF


[root@db01 ~]#cat >>   /data/6382/redis.conf <<EOF
port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382
requirepass 123
masterauth 123
EOF

啟動服務:
[root@db01 ~]#redis-server /data/6380/redis.conf
[root@db01 ~]#redis-server /data/6381/redis.conf
[root@db01 ~]#redis-server /data/6382/redis.conf

上面設計節點:
主節點:6380
從節點:6381、6382

5.2 開啟主從(在6381/6382節點上設置與主節點關系):

[root@db01 ~]#redis-cli -p 6381 -a 123 SLAVEOF 127.0.0.1 6380
[root@db01 ~]#redis-cli -p 6382 -a 123 SLAVEOF 127.0.0.1 6380

5.3 查詢主從狀態

[root@db01 ~]#redis-cli -p 6380 -a 123 info replication
[root@db01 ~]# redis-cli -p 6381 -a 123 info replication
[root@db01 ~]# redis-cli -p 6382 -a 123 info replication

圖示:


redis主庫狀態.png

6. redis-sentinel(哨兵)

6.1 功能:

1、監控
2、自動選主,切換(6381 slaveof no one)
3、2號從庫(6382)指向新主庫(6381)
4、應用透明
5、自動處理故障節點
備注:通過哨兵實現高可用功能,相當于mysql的MHA架構

6.2 sentinel搭建過程
6.2.1 準備環境:

[root@db01 ~]#mkdir /data/26380
[root@db01 ~]#cd /data/26380
配置文件:
[root@db01 ~]#cat > /data/26380/sentinel.conf <<EOF
port 26380
dir "/data/26380"
sentinel monitor mymaster(自己起的集群名稱) 127.0.0.1 6380 1   ##127.0.0.1 6380是只監控目前主庫節點信息,1指的是至少多少臺從庫同意他宕了才會切換。
sentinel down-after-milliseconds mymaster 5000   ##主庫發生宕機,容忍5秒,超過5秒后,就進行切換
sentinel auth-pass mymaster 123  ##連接主庫的密碼*(所以在做sentinel集群的時候,所有節點密碼就需要一致,因為誰都有可能是主庫)
EOF

6.2.2 啟動

[root@db01 26380]# redis-sentinel /data/26380/sentinel.conf  &>/tmp/sentinel.log &

6.2.3 停主庫測試(驗證哨兵是否起作用):

[root@db01 ~]# redis-cli -p 6380 shutdown
[root@db01 ~]# redis-cli -p 6381 info replication   ##看6381狀態,是否已經切換到主節點

6.2.4 總結:
哨兵的高可用架構他和mysql中的MHA架構類似,但是又優于MHA架構,他擁有自主處理故障節點能力。當主宕機,主就會從M節點切換到S1節點,然后S2節點會指向新的S1節點。當M節點恢復后,什么也不用進行操作,他會進行自動故障節點處理,只需把它重新加入到架構中即可(修復架構的命令就是啟動宕機的服務節點:redis-server /data/6380/redis.conf),此時他會變為從節點。
原理圖:


哨兵原理圖.png

7. redis cluster 分布式集群

7.1 介紹:

高性能:
1、在多分片節點中,將16384個槽位,均勻分布到多個分片節點中
2、存數據時,將key做crc16(key),然后和16384進行取模,得出槽位值(0-16383之間)
3、根據計算得出的槽位值,找到相對應的分片節點的主節點,存儲到相應槽位上
4、如果客戶端當時連接的節點不是將來要存儲的分片節點,分片集群會將客戶端連接切換至真正存儲節點進行數據存儲

高可用:
在搭建集群時,會為每一個分片的主節點,對應一個從節點,實現slaveof的功能,同時當主節點down,實現類似于sentinel的自動failover的功能。
1、redis會有多組分片構成(3組)
2、redis cluster 使用固定個數的slot存儲數據(一共16384slot)
3、每組分片分得1/3 slot個數(0-5500 5501-11000 11001-16383)
4、基于CRC16(key) % 16384 ====》值 (槽位號)。

7.2 規劃、搭建過程:

6個redis實例,一般會放到3臺硬件服務器
注:在企業規劃中,分布式集群的搭建,也需要考慮到主從關系,可以使數據落在不同的物理機,防止硬件主機宕機造成的整個分片數據丟失。
端口號:7000-7005


分布式集群.png

7.2.1 安裝集群插件,EPEL源安裝ruby支持

[root@db01 ~]# yum install ruby rubygems -y

7.2.2 使用國內源:

[root@db01 ~]# gem sources -l
[root@db01 ~]# gem sources -a http://mirrors.aliyun.com/rubygems/ 
[root@db01 ~]# gem sources  --remove https://rubygems.org/
[root@db01 ~]# gem sources -l
[root@db01 ~]# gem install redis -v 3.3.3

7.2.3 集群節點準備:

[root@db01 ~]#mkdir /data/700{0..5}

[root@db01 ~]#cat > /data/7000/redis.conf <<EOF
port 7000
daemonize yes
pidfile /data/7000/redis.pid
loglevel notice
logfile "/data/7000/redis.log"
dbfilename dump.rdb
dir /data/7000
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

[root@db01 ~]#cat >> /data/7001/redis.conf <<EOF
port 7001
daemonize yes
pidfile /data/7001/redis.pid
loglevel notice
logfile "/data/7001/redis.log"
dbfilename dump.rdb
dir /data/7001
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

[root@db01 ~]#cat >> /data/7002/redis.conf <<EOF
port 7002
daemonize yes
pidfile /data/7002/redis.pid
loglevel notice
logfile "/data/7002/redis.log"
dbfilename dump.rdb
dir /data/7002
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF


[root@db01 ~]#cat >>  /data/7003/redis.conf <<EOF
port 7003
daemonize yes
pidfile /data/7003/redis.pid
loglevel notice
logfile "/data/7003/redis.log"
dbfilename dump.rdb
dir /data/7003
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF


[root@db01 ~]#cat >> /data/7004/redis.conf <<EOF
port 7004
daemonize yes
pidfile /data/7004/redis.pid
loglevel notice
logfile "/data/7004/redis.log"
dbfilename dump.rdb
dir /data/7004
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

[root@db01 ~]#cat >> /data/7005/redis.conf <<EOF
port 7005
daemonize yes
pidfile /data/7005/redis.pid
loglevel notice
logfile "/data/7005/redis.log"
dbfilename dump.rdb
dir /data/7005
protected-mode no
cluster-enabled yes    ##打開集群節點功能
cluster-config-file nodes.conf  ##專門配置文件
cluster-node-timeout 5000  ##超時時間,超過5000毫秒會切換主從
appendonly yes
EOF

7.2.4 啟動節點:

[root@db01 ~]#redis-server /data/7000/redis.conf 
[root@db01 ~]#redis-server /data/7001/redis.conf 
[root@db01 ~]#redis-server /data/7002/redis.conf 
[root@db01 ~]#redis-server /data/7003/redis.conf 
[root@db01 ~]#redis-server /data/7004/redis.conf 
[root@db01 ~]#redis-server /data/7005/redis.conf 
[root@db01 ~]# ps -ef |grep redis
root       8854      1  0 03:56 ?        00:00:00 redis-server *:7000 [cluster]     
root       8858      1  0 03:56 ?        00:00:00 redis-server *:7001 [cluster]     
root       8860      1  0 03:56 ?        00:00:00 redis-server *:7002 [cluster]     
root       8864      1  0 03:56 ?        00:00:00 redis-server *:7003 [cluster]     
root       8866      1  0 03:56 ?        00:00:00 redis-server *:7004 [cluster]     
root       8874      1  0 03:56 ?        00:00:00 redis-server *:7005 [cluster] 

7.2.5 將節點加入集群管理

[root@db01 ~]#redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
--replicas 1 ##每個節點都有一個副本,一主一從架構
127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005  
主從規劃:7000,7001,7002,3臺主庫;7003,7004,7005,3臺從庫;
7000myself,他是一個集群管理節點。

7.2.6 集群狀態查看:

集群主節點狀態
[root@db01 ~]#redis-cli -p 7000 cluster nodes | grep master
集群從節點狀態
[root@db01 ~]#redis-cli -p 7000 cluster nodes | grep slave

8. 集群節點管理

8.1 增加新的節點
8.1.1 創建新增節點:

[root@db01 ~]#mkdir /data/7006
[root@db01 ~]#mkdir /data/7007
[root@db01 ~]#cat > /data/7006/redis.conf <<EOF
port 7006
daemonize yes
pidfile /data/7006/redis.pid
loglevel notice
logfile "/data/7006/redis.log"
dbfilename dump.rdb
dir /data/7006
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

[root@db01 ~]#cat >  /data/7007/redis.conf <<EOF
port 7007
daemonize yes
pidfile /data/7007/redis.pid
loglevel notice
logfile "/data/7007/redis.log"
dbfilename dump.rdb
dir /data/7007
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
啟動:
[root@db01 ~]#redis-server /data/7006/redis.conf 
[root@db01 ~]#redis-server /data/7007/redis.conf 

8.1.2 添加主節點:

[root@db01 ~]#redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

8.1.3 添加完節點后,進行轉移slot(重新分片也就是分槽位):

[root@db01 ~]#redis-trib.rb reshard 127.0.0.1:7000
添加主節點1.png
添加主節點2.png
添加主節點3.png

8.1.4 添加一個從節點:

[root@db01 ~]#redis-trib.rb add-node --slave --master-id $MASTER-ID  127.0.0.1:7007 127.0.0.1:7000
說明: $MASTER-ID ,上面添加的主庫node id號(也就是新添加的7006節點)

8.2 刪除節點,將需要刪除節點slot先移動走,再進行刪除:
8.2.1 挪走0-1364(因為有3段,所以下面命令需要執行3次,把三段全部挪走才行):

[root@db01 ~]#redis-trib.rb reshard 127.0.0.1:7000
1段1.png
1段2.png
2段1.png
2段2.png

8.2.2 刪除節點:

[root@db01 ~]#redis-trib.rb del-node 127.0.0.1:7006 de07bc7967d3b5953accde8ff2745b3c3f8baf56
[root@db01 ~]#redis-trib.rb del-node 127.0.0.1:7007 236b25da436703cb3eebe3cee64e956e65a1a2f4
刪除節點1.png
刪除節點2.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • redis集群分為服務端集群和客戶端分片,redis3.0以上版本實現了集群機制,即服務端集群,3.0以下使用客戶...
    hadoop_null閱讀 1,604評論 0 6
  • 單機/單點 單點故障/瓶頸:多個節點負載:面向數據:一變多(一致性<弱一致,最終一致性>)》可用性最終一致性:一部...
    壹點零閱讀 810評論 0 3
  • 前言 Redis 是我們目前大規模使用的緩存中間件,由于它強大高效而又便捷的功能,得到了廣泛的使用。單節點的Red...
    Kevin_ZGJ閱讀 11,706評論 19 133
  • 本文檔匯總了多篇文章知識的結晶,整理出一份完整的Redis集群搭建教程,在本文最后也有注明摘自原文的地址,如果原作...
    緯一閱讀 1,401評論 5 27
  • 很多人說性格是不可以改變的,但唐駿卻說性格是可以改變的。唐駿在上大學時,是一個沒有自信很自卑的人,不敢跟女孩子約會...
    我是范老師閱讀 398評論 0 1