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
圖示:
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),此時他會變為從節點。
原理圖:
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
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
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