1. 程式人生 > >Docker環境下的前後端分離專案部署與運維(七)Redis快取記憶體

Docker環境下的前後端分離專案部署與運維(七)Redis快取記憶體

Redis快取記憶體

利用記憶體儲存資料,讀寫速度遠超硬碟;可以減少I/O操作,降低I/O壓力。

  • 發紅包、搶紅包的資料可以存在快取記憶體中,加快處理速度,不需要經過資料庫
  • 淘寶首頁一些優惠活動商品等熱資料可以存在快取記憶體中,而基於大資料的推薦產品從資料庫中讀取

Redis介紹

  • Redis是Wmware開發的開源免費的KV型NoSQL快取產品
  • Redis具有很好的效能,最多可以提供10萬次每秒的讀寫
  • 目前新浪微博團隊組建了世界上最大規模的Redis叢集
  • Redis目前的叢集方案分為以下幾種:
    1. RedisCluster:官方推薦,沒有中心節點
    2. Codis:中介軟體產品,存在中心節點
    3. Twemproxy:中介軟體產品,存在中心節點

RedisCluster

  • 沒有中心節點,客戶端與Redis節點直連,不需要中間代理層
  • 資料可以被分片儲存,每個節點儲存一部分資料,互不相同,某個節點掛掉可能丟失資料,所以要為每個節點設定冗餘節點
  • 管理方便,後續可以自行新增或刪除節點

Redis主存同步

  • Redis叢集的資料採取切分儲存,每個節點儲存的各不相同。某個節點掛掉,其儲存的資料就丟失了。
  • Redis叢集中的資料庫複製通過主從同步來實現的。主節點把資料分發給從節點。主存同步的好處就在於高可用。Redis節點有冗餘設計

Redis叢集高可用

  • Redis叢集中應該包含奇數個Master,至少應該有3個Master。
  • Redis和PXC叢集都有選舉機制,如果超過一半的節點掛掉,那麼剩下的節點沒有超過一半,是無法選舉組成一個新的叢集的。
  • 連線Redis叢集的任何一個節點都能正確寫入資料,Redis節點能計算資料應該儲存到哪個節點,將資料切分儲存到相應的其他節點上。
  • Redis節點不配置負載均衡,因為後端專案使用Spring,Spring幫我們實現了負載均衡。(或者使用Nginx代理也行)

配置RedisCluster叢集

配置Redis網段

建立net2網段

docker network create --subnet=172.19.0.0/16 net2

安裝第三方Redis映象

# 拉取映象
docker pull yyyyttttwwww/redis
# 修改映象名稱
docker tag yyyyttttwwww/redis redis
# 執行容器
docker run -it -d --name r1 -p 5001:6379 --net=net2 --ip 172.19.0.2 redis bash
# 進入容器
docker exec -it r1 bash

修改容器內redis配置檔案,容器中的配置檔案路徑: /usr/redis/redis.conf 

daemonize yes    # 以後臺程序執行。這句需要註釋掉,否則在指定配置檔案時會啟動失敗(https://www.jianshu.com/p/923eb2e0a5f0)
cluster-enabled yes    # 開啟叢集
cluster-config-file nodes.conf    # 叢集配置檔案
cluter-node-timeout 15000    # 超時時間
appendonly yes    # 開啟AOF模式

然後啟動redis

# 進入redis目錄
cd /usr/redis/src/
# 使用配置檔案啟動Redisz
./redis-server ../redis.conf

然後按照相同方式啟動其他5個Redis節點

docker run -it -d --name r2 -p 5002:6379 --net=net2 --ip 172.19.0.3 redis bash
docker run -it -d --name r3 -p 5003:6379 --net=net2 --ip 172.19.0.4 redis bash
docker run -it -d --name r4 -p 5004:6379 --net=net2 --ip 172.19.0.5 redis bash
docker run -it -d --name r5 -p 5005:6379 --net=net2 --ip 172.19.0.6 redis bash
docker run -it -d --name r6 -p 5006:6379 --net=net2 --ip 172.19.0.7 redis bash

配置第三方Redis叢集

利用redis-trib.rb建立Redis叢集

docker exec -it r1 bash
cd /usr/redis/
mkdir cluster
cd src
cp redis-trib.rb ../cluster/
cd ../cluster/
./redis-trib.rb create --replicas 1 172.19.0.2:6379 172.19.0.3:6379 172.19.0.4:6379 172.19.0.5:6379 172.19.0.6:6379 172.19.0.7:6379

建立完畢後會有三個主節點,三個從節點。(注意:這裡要輸入yes,不是y)

root@26a99229635f:/usr/redis/cluster# ./redis-trib.rb create --replicas 1 172.19.0.2:6379 172.19.0.3:6379 172.19.0.4:6379 172.19.0.5:6379 172.19.0.6:6379 172.19.0.7:6379
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
172.19.0.2:6379
172.19.0.3:6379
172.19.0.4:6379
Adding replica 172.19.0.5:6379 to 172.19.0.2:6379
Adding replica 172.19.0.6:6379 to 172.19.0.3:6379
Adding replica 172.19.0.7:6379 to 172.19.0.4:6379
M: fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a 172.19.0.2:6379
   slots:0-5460 (5461 slots) master
M: 361923553a5113db299079326ea59a537d6913fd 172.19.0.3:6379
   slots:5461-10922 (5462 slots) master
M: 7a60116e296cdfb322f17219335f4de457d06d34 172.19.0.4:6379
   slots:10923-16383 (5461 slots) master
S: 3c79d17299bf22a0c374291fae517a8769df8128 172.19.0.5:6379
   replicates fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a
S: 49f1ec354df28a07f97c19d2d6893104dda7004d 172.19.0.6:6379
   replicates 361923553a5113db299079326ea59a537d6913fd
S: df072f3ef3d26335a3a391a9fa01824892edef49 172.19.0.7:6379
   replicates 7a60116e296cdfb322f17219335f4de457d06d34
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.
>>> Performing Cluster Check (using node 172.19.0.2:6379)
M: fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a 172.19.0.2:6379
   slots:0-5460 (5461 slots) master
M: 361923553a5113db299079326ea59a537d6913fd 172.19.0.3:6379
   slots:5461-10922 (5462 slots) master
M: 7a60116e296cdfb322f17219335f4de457d06d34 172.19.0.4:6379
   slots:10923-16383 (5461 slots) master
M: 3c79d17299bf22a0c374291fae517a8769df8128 172.19.0.5:6379
   slots: (0 slots) master
   replicates fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a
M: 49f1ec354df28a07f97c19d2d6893104dda7004d 172.19.0.6:6379
   slots: (0 slots) master
   replicates 361923553a5113db299079326ea59a537d6913fd
M: df072f3ef3d26335a3a391a9fa01824892edef49 172.19.0.7:6379
   slots: (0 slots) master
   replicates 7a60116e296cdfb322f17219335f4de457d06d34
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
View Code

--replicas 1引數表示為每個主節點建立一個從節點

檢視叢集狀態

/usr/redis/src/redis-cli -c

cluster nodes
root@26a99229635f:/# /usr/redis/src/redis-cli -c
127.0.0.1:6379> cluster nodes
fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a 172.19.0.2:6379 myself,master - 0 0 1 connected 0-5460
df072f3ef3d26335a3a391a9fa01824892edef49 172.19.0.7:6379 slave 7a60116e296cdfb322f17219335f4de457d06d34 0 1558171927740 6 connected
3c79d17299bf22a0c374291fae517a8769df8128 172.19.0.5:6379 slave fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a 0 1558171925725 4 connected
7a60116e296cdfb322f17219335f4de457d06d34 172.19.0.4:6379 master - 0 1558171926733 3 connected 10923-16383
49f1ec354df28a07f97c19d2d6893104dda7004d 172.19.0.6:6379 slave 361923553a5113db299079326ea59a537d6913fd 0 1558171929754 5 connected
361923553a5113db299079326ea59a537d6913fd 172.19.0.3:6379 master - 0 1558171928746 2 connected 5461-10922
View Code

安裝Redis映象

建立外部儲存卷

# 建立外部對映檔案
mkdir /home/soft/redis
cd /home/soft/redis
mkdir r1 r2 r3 r4 r5 r6

修改Redis配置檔案(注意一定要按版本拷貝配置檔案)

cd r1
vim redis.conf

# daemonize yes    # 以後臺程序執行。這句需要註釋掉,否則在指定配置檔案時會啟動失敗(https://www.jianshu.com/p/923eb2e0a5f0)
cluster-enabled yes    # 開啟叢集
cluster-config-file nodes.conf    # 叢集配置檔案
cluter-node-timeout 15000    # 超時時間
appendonly yes    # 開啟AOF模式
# 拷貝配置檔案
cp redis.conf ../r2/redis.conf
cp redis.conf ../r3/redis.conf
cp redis.conf ../r4/redis.conf
cp redis.conf ../r5/redis.conf
cp redis.conf ../r6/redis.conf

匯入本地Redis映象檔案,執行Redis容器

docker pull redis
# 將/home/soft/redis目錄對映為容器的/data目錄
docker run -it -d -p 5001:6379 -v /home/soft/redis/r1:/data --net=net2 --ip 172.19.0.2 --name r1 redis /data/redis.conf
docker run -it -d -p 5002:6379 -v /home/soft/redis/r2:/data --net=net2 --ip 172.19.0.3 --name r2 redis /data/redis.conf
docker run -it -d -p 5003:6379 -v /home/soft/redis/r3:/data --net=net2 --ip 172.19.0.4 --name r3 redis /data/redis.conf 
docker run -it -d -p 5004:6379 -v /home/soft/redis/r4:/data --net=net2 --ip 172.19.0.5 --name r4 redis /data/redis.conf 
docker run -it -d -p 5005:6379 -v /home/soft/redis/r5:/data --net=net2 --ip 172.19.0.6 --name r5 redis /data/redis.conf
docker run -it -d -p 5006:6379 -v /home/soft/redis/r6:/data --net=net2 --ip 172.19.0.7 --name r6 redis /data/redis.conf

配置Redis叢集

redis-trib.rb已經不再推薦,使用redis-cli來建立容器。

進入某個節點容器的 /usr/local/bin 目錄,執行如下命令建立容器

./redis-cli --cluster create 172.19.0.2:6379 172.19.0.3:6379 172.19.0.4:6379 172.19.0.5:6379 172.19.0.6:6379 172.19.0.7:6379 --cluster-replicas 1

建立完畢後會有三個主節點,三個從節點。(注意:這裡要輸入yes,不是y)

root@4a8c3bf758f0:/usr/local/bin# ./redis-cli --cluster create 172.19.0.2:6379 172.19.0.3:6379 172.19.0.4:6379 172.19.0.5:6379 172.19.0.6:6379 172.19.0.7:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.19.0.6:6379 to 172.19.0.2:6379
Adding replica 172.19.0.7:6379 to 172.19.0.3:6379
Adding replica 172.19.0.5:6379 to 172.19.0.4:6379
M: 890da9d1f480380e7154685dc6a757e3a3be2092 172.19.0.2:6379
   slots:[0-5460] (5461 slots) master
M: b738cc123c0f5ecf5a329f3d974b8cfb8c88cf20 172.19.0.3:6379
   slots:[5461-10922] (5462 slots) master
M: e68561cc3fb54fc5e4153dafc7465bd5b361ec95 172.19.0.4:6379
   slots:[10923-16383] (5461 slots) master
S: 54e1c37fc1e8cc3b8afb6adb35138a7ad852926c 172.19.0.5:6379
   replicates e68561cc3fb54fc5e4153dafc7465bd5b361ec95
S: 55ef9e60a9a5ca5c6ec1dc71b20fb973acbd11fe 172.19.0.6:6379
   replicates 890da9d1f480380e7154685dc6a757e3a3be2092
S: 0bcb8196c9f119e18ca07041fe6332ed5d6fc580 172.19.0.7:6379
   replicates b738cc123c0f5ecf5a329f3d974b8cfb8c88cf20
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
..
>>> Performing Cluster Check (using node 172.19.0.2:6379)
M: 890da9d1f480380e7154685dc6a757e3a3be2092 172.19.0.2:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 0bcb8196c9f119e18ca07041fe6332ed5d6fc580 172.19.0.7:6379
   slots: (0 slots) slave
   replicates b738cc123c0f5ecf5a329f3d974b8cfb8c88cf20
S: 55ef9e60a9a5ca5c6ec1dc71b20fb973acbd11fe 172.19.0.6:6379
   slots: (0 slots) slave
   replicates 890da9d1f480380e7154685dc6a757e3a3be2092
M: b738cc123c0f5ecf5a329f3d974b8cfb8c88cf20 172.19.0.3:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 54e1c37fc1e8cc3b8afb6adb35138a7ad852926c 172.19.0.5:6379
   slots: (0 slots) slave
   replicates e68561cc3fb54fc5e4153dafc7465bd5b361ec95
M: e68561cc3fb54fc5e4153dafc7465bd5b361ec95 172.19.0.4:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
View Code

可以進入某個節點容器後,執行如下指令進入叢集:

/usr/local/bin/redis-cli -c

檢視叢集狀態

cluster nodes

&n