1. 程式人生 > >八、redis集群安裝

八、redis集群安裝

diff exp waiting idt 類型 ots 文件創建 定時 apple

Redis 簡介

Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫。


Redis 與其他 key - value 緩存產品有以下三個特點:

  • Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。

  • Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。

  • Redis支持數據的備份,即master-slave模式的數據備份。


Redis 優勢

  • 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。

  • 豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。

  • 原子 – Redis的所有操作都是原子性的,意思就是要麽成功執行要麽失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。

  • 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。


Redis與其他key-value存儲有什麽不同?

  • Redis有著更為復雜的數據結構並且提供對他們的原子性操作,這是一個不同於其他數據庫的進化路徑。Redis的數據類型都是基於基本數據結構的同時對程序員透明,無需進行額外的抽象。

  • Redis運行在內存中但是可以持久化到磁盤,所以在對不同數據集進行高速讀寫時需要權衡內存,因為數據量不能大於硬件內存。在內存數據庫方面的另一個優點是,相比在磁盤上相同的復雜的數據結構,在內存中操作起來非常簡單,這樣Redis可以做很多內部復雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,因為他們並不需要進行隨機訪問


redis 最適合的場景

(1)、會話緩存(Session Cache)

(2)、配合關系型數據庫做高速緩存

(3)、緩存——熱數據

(4)、計數器

(5)、 隊列

(6)、 排行榜


這裏我使用redis做會話緩存和mysql緩存



1.redis單機安裝

cd /application/tools/
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
tar xf redis-4.0.9.tar.gz
yum -y install gcc-c++
cd redis-4.0.6
make
make install PREFIX=/application/redis


前端啟動方式
cd /application/redis/bin
./redis-server
4948:C 30 May 15:30:25.449 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 4.0.9 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 4948
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               
4948:M 30 May 15:30:25.478 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
4948:M 30 May 15:30:25.478 # Server initialized
4948:M 30 May 15:30:25.478 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
4948:M 30 May 15:30:25.478 * Ready to accept connections
後臺啟動 需要加上配置文件
cp /application/tools/redis-4.0.9/redis.conf /application/redis/bin/
vim /application/redis/bin/redis.conf
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes
/application/redis/bin/redis-server /application/redis/bin/redis.conf
[root@redis bin]# ps -ef | grep redis
root       4958      1  0 15:34 ?        00:00:00 /application/redis/bin/redis-server 127.0.0.1:6379

Redis 持久化

Redis 提供了多種不同級別的持久化方式:

  • RDB 持久化可以在指定的時間間隔內生成數據集的時間點快照(point-in-time snapshot)。

  • AOF 持久化記錄服務器執行的所有寫操作命令,並在服務器啟動時,通過重新執行這些命令來還原數據集。 AOF 文件中的命令全部以 Redis 協議的格式來保存,新命令會被追加到文件的末尾。 Redis 還可以在後臺對 AOF 文件進行重寫(rewrite),使得 AOF 文件的體積不會超出保存數據集狀態所需的實際大小。

  • Redis 還可以同時使用 AOF 持久化和 RDB 持久化。 在這種情況下, 當 Redis 重啟時, 它會優先使用 AOF 文件來還原數據集, 因為 AOF 文件保存的數據集通常比 RDB 文件所保存的數據集更完整。

  • 你甚至可以關閉持久化功能,讓數據只在服務器運行時存在。

RDB 的優點

  • RDB 是一個非常緊湊(compact)的文件,它保存了 Redis 在某個時間點上的數據集。 這種文件非常適合用於進行備份: 比如說,你可以在最近的 24 小時內,每小時備份一次 RDB 文件,並且在每個月的每一天,也備份一個 RDB 文件。 這樣的話,即使遇上問題,也可以隨時將數據集還原到不同的版本。

  • RDB 非常適用於災難恢復(disaster recovery):它只有一個文件,並且內容都非常緊湊,可以(在加密後)將它傳送到別的數據中心,或者亞馬遜 S3 中。

  • RDB 可以最大化 Redis 的性能:父進程在保存 RDB 文件時唯一要做的就是 fork 出一個子進程,然後這個子進程就會處理接下來的所有保存工作,父進程無須執行任何磁盤 I/O 操作。

  • RDB 在恢復大數據集時的速度比 AOF 的恢復速度要快。

RDB 的缺點?

  • 如果你需要盡量避免在服務器故障時丟失數據,那麽 RDB 不適合你。 雖然 Redis 允許你設置不同的保存點(save point)來控制保存 RDB 文件的頻率, 但是, 因為RDB 文件需要保存整個數據集的狀態, 所以它並不是一個輕松的操作。 因此你可能會至少 5 分鐘才保存一次 RDB 文件。 在這種情況下, 一旦發生故障停機, 你就可能會丟失好幾分鐘的數據。

  • 每次保存 RDB 的時候,Redis 都要 fork() 出一個子進程,並由子進程來進行實際的持久化工作。 在數據集比較龐大時, fork() 可能會非常耗時,造成服務器在某某毫秒內停止處理客戶端; 如果數據集非常巨大,並且 CPU 時間非常緊張的話,那麽這種停止時間甚至可能會長達整整一秒。 雖然 AOF 重寫也需要進行 fork() ,但無論 AOF 重寫的執行間隔有多長,數據的耐久性都不會有任何損失。

AOF 的優點

  • 使用 AOF 持久化會讓 Redis 變得非常耐久(much more durable):你可以設置不同的 fsync 策略,比如無 fsync ,每秒鐘一次 fsync ,或者每次執行寫入命令時 fsync 。 AOF 的默認策略為每秒鐘 fsync 一次,在這種配置下,Redis 仍然可以保持良好的性能,並且就算發生故障停機,也最多只會丟失一秒鐘的數據( fsync 會在後臺線程執行,所以主線程可以繼續努力地處理命令請求)。

  • AOF 文件是一個只進行追加操作的日誌文件(append only log), 因此對 AOF 文件的寫入不需要進行 seek , 即使日誌因為某些原因而包含了未寫入完整的命令(比如寫入時磁盤已滿,寫入中途停機,等等), redis-check-aof 工具也可以輕易地修復這種問題。

  • Redis 可以在 AOF 文件體積變得過大時,自動地在後臺對 AOF 進行重寫: 重寫後的新 AOF 文件包含了恢復當前數據集所需的最小命令集合。 整個重寫操作是絕對安全的,因為 Redis 在創建新 AOF 文件的過程中,會繼續將命令追加到現有的 AOF 文件裏面,即使重寫過程中發生停機,現有的 AOF 文件也不會丟失。 而一旦新 AOF 文件創建完畢,Redis 就會從舊 AOF 文件切換到新 AOF 文件,並開始對新 AOF 文件進行追加操作。

  • AOF 文件有序地保存了對數據庫執行的所有寫入操作, 這些寫入操作以 Redis 協議的格式保存, 因此 AOF 文件的內容非常容易被人讀懂, 對文件進行分析(parse)也很輕松。 導出(export) AOF 文件也非常簡單: 舉個例子, 如果你不小心執行了 FLUSHALL 命令, 但只要 AOF 文件未被重寫, 那麽只要停止服務器, 移除 AOF 文件末尾的 FLUSHALL 命令, 並重啟 Redis , 就可以將數據集恢復到 FLUSHALL 執行之前的狀態。

AOF 的缺點

  • 對於相同的數據集來說,AOF 文件的體積通常要大於 RDB 文件的體積。

  • 根據所使用的 fsync 策略,AOF 的速度可能會慢於 RDB 。 在一般情況下, 每秒 fsync 的性能依然非常高, 而關閉 fsync 可以讓 AOF 的速度和 RDB 一樣快, 即使在高負荷之下也是如此。 不過在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間(latency)。

  • AOF 在過去曾經發生過這樣的 bug : 因為個別命令的原因,導致 AOF 文件在重新載入時,無法將數據集恢復成保存時的原樣。 (舉個例子,阻塞命令 BRPOPLPUSH 就曾經引起過這樣的 bug 。) 測試套件裏為這種情況添加了測試: 它們會自動生成隨機的、復雜的數據集, 並通過重新載入這些數據來確保一切正常。 雖然這種 bug 在 AOF 文件中並不常見, 但是對比來說, RDB 幾乎是不可能出現這種 bug 的。

RDB 和 AOF ,我應該用哪一個?

一般來說, 如果想達到足以媲美 PostgreSQL 的數據安全性, 你應該同時使用兩種持久化功能。

如果你非常關心你的數據, 但仍然可以承受數分鐘以內的數據丟失, 那麽你可以只使用 RDB 持久化。

有很多用戶都只使用 AOF 持久化, 但我們並不推薦這種方式: 因為定時生成 RDB 快照(snapshot)非常便於進行數據庫備份, 並且 RDB 恢復數據集的速度也要比 AOF 恢復的速度要快, 除此之外, 使用 RDB 還可以避免之前提到的 AOF 程序的 bug 。


3.集群搭建

由於電腦性能限制這裏搭建偽集群
安裝6個實例 監聽不同端口 7001-7006
修改redis.conf
vim /application/redis/bin/redis.conf
port 7001-7006
bind 172.16.1.145
cluster-enabled yes 

創建集群目錄
cd /application/
mkdir redis-cluster


復制6份已安裝的redis

for i in `seq 01 06`;do cp -r /application/redis/ /application/redis-cluster/redis$i/;done
[root@redis redis-cluster]# ll
total 24
drwxr-xr-x 3 root root 4096 May 30 16:27 redis1
drwxr-xr-x 3 root root 4096 May 30 16:29 redis2
drwxr-xr-x 3 root root 4096 May 30 16:29 redis3
drwxr-xr-x 3 root root 4096 May 30 16:31 redis4
drwxr-xr-x 3 root root 4096 May 30 16:31 redis5
drwxr-xr-x 3 root root 4096 May 30 16:31 redis6


修改端口號

for i in `seq 6`;do sed -i "s/port 7001/port 700$i/" /application/redis-cluster/redis$i/bin/redis.conf;done
[root@redis redis-cluster]# ls redis*/bin/redis.conf  | xargs cat | grep "port 700*"
port 7001
port 7002
port 7003
port 7004
port 7005
port 7006


啟動腳本

vim /server/scripts/redis.sh 
if [ $# -eq 0 ]
then
echo "useage:sh $0 {start|stop}"
exit 0
fi

case $1 in
start)
for i in `seq 6`
do
cd /application/redis-cluster/redis$i/bin
./redis-server redis.conf >/dev/null 2>&1
done
;;
stop)
for i in `seq 6`
do
cd /application/redis-cluster/redis1/bin
./redis-cli -p 700$i -h 172.16.1.145 shutdown >/dev/null 2>&1
done
;;
esac


啟動

sh /server/scripts/redis.sh start
[root@redis redis-cluster]# ps ax|grep redis 
  5821 ?        Ssl    0:00 ./redis-server 172.16.1.145:7001 [cluster]
  5826 ?        Ssl    0:00 ./redis-server 172.16.1.145:7002 [cluster]
  5831 ?        Ssl    0:00 ./redis-server 172.16.1.145:7003 [cluster]
  5836 ?        Ssl    0:00 ./redis-server 172.16.1.145:7004 [cluster]
  5838 ?        Ssl    0:00 ./redis-server 172.16.1.145:7005 [cluster]
  5843 ?        Ssl    0:00 ./redis-server 172.16.1.145:7006 [cluster]


集群設置

cp /application/tools/redis-4.0.9/src/redis-trib.rb /application/redis-cluster/
yum -y install ruby rubygems
gem sources -a http://mirrors.aliyun.com/rubygems/
gem sources --remove  

[root@redis ~]# gem sources -l
*** CURRENT SOURCES ***
 

gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
curl -L get.rvm.io | bash -s stable 
source /usr/local/rvm/scripts/rvm source /usr/local/rvm/scripts/rvm
ruby --version 
rvm remove 1.8.7
rvm list known
rvm install "ruby-2.4.1"
rvm use 2.4.1 --default
gem install redis
cd /application/redis-cluster/
./redis-trib.rb create --replicas 1 172.16.1.145:7001 172.16.1.145:7002 172.16.1.145:7003 172.16.1.145:7004 172.16.1.145:7005 172.16.1.145:7006

>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
172.16.1.145:7001
172.16.1.145:7002
172.16.1.145:7003
Adding replica 172.16.1.145:7005 to 172.16.1.145:7001
Adding replica 172.16.1.145:7006 to 172.16.1.145:7002
Adding replica 172.16.1.145:7004 to 172.16.1.145:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 50d38ab70ce509abadb577c91445be7a827f9a26 172.16.1.145:7001
   slots:0-5460 (5461 slots) master
M: 2e05364a9557ed203571e03ed7d455611dcd803d 172.16.1.145:7002
   slots:5461-10922 (5462 slots) master
M: c4386898d77085469b47e31face79708ac8d8cb8 172.16.1.145:7003
   slots:10923-16383 (5461 slots) master
S: a7001131f027ebf0ac70a98e317cc8b8dfb14ae2 172.16.1.145:7004
   replicates 2e05364a9557ed203571e03ed7d455611dcd803d
S: edb94e32d62fcd874d5cf00ff64d4aa7d771a927 172.16.1.145:7005
   replicates c4386898d77085469b47e31face79708ac8d8cb8
S: b8c2f3920a87a7ed5c6473a0ecd5bff92f1e8f4c 172.16.1.145:7006
   replicates 50d38ab70ce509abadb577c91445be7a827f9a26
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.16.1.145:7001)
M: 50d38ab70ce509abadb577c91445be7a827f9a26 172.16.1.145:7001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: b8c2f3920a87a7ed5c6473a0ecd5bff92f1e8f4c 172.16.1.145:7006
   slots: (0 slots) slave
   replicates 50d38ab70ce509abadb577c91445be7a827f9a26
S: a7001131f027ebf0ac70a98e317cc8b8dfb14ae2 172.16.1.145:7004
   slots: (0 slots) slave
   replicates 2e05364a9557ed203571e03ed7d455611dcd803d
S: edb94e32d62fcd874d5cf00ff64d4aa7d771a927 172.16.1.145:7005
   slots: (0 slots) slave
   replicates c4386898d77085469b47e31face79708ac8d8cb8
M: 2e05364a9557ed203571e03ed7d455611dcd803d 172.16.1.145:7002
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: c4386898d77085469b47e31face79708ac8d8cb8 172.16.1.145:7003
   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.


連接集群

/application/redis-cluster/redis1/bin/redis-cli -p 7004 -c


八、redis集群安裝