04.12 redis集群初體驗

redis集群初體驗

現在基本上所有公司,無論大大小小的項目基本都會用到redis來進行緩存,或者存儲。來提高網站的訪問速度和常訪問數據的緩存。那麼今天咱們就來說一說redis集群架構。

簡單介紹一下redis,相信大家也都瞭解,Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API,官網redis

下面開始介紹redis的集群方案

關於redis的安裝這裡不贅述了,非常簡單基本就是解壓就用。

cluster是在redis3.0以後官方推出的集群方案,架構如下

redis集群初體驗

  • 特點

  1. 所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.

  2. 節點的fail是通過集群中超過半數的節點檢測失效時才生效.

  3. 客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集群所有節點,連接集群中任何一個可用節點即可

  4. redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護nodeslotvalue

  • 容錯機制

  1. 選舉過程是集群中所有master參與,如果半數以上master節點與master節點通信超過(cluster-node-timeout),認為當前master節點掛掉.

  2. (cluster_state:fail),當集群不可用時,所有對集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤

    a:如果集群任意master掛掉,且當前master沒有slave.集群進入fail狀態,也可以理解成進群的slot映射[0-16383]不完成時進入fail狀態.

    b:如果進群超過半數以上master掛掉,無論是否有slave集群進入fail狀態.

  • 客戶端連接

    客戶端只要連接整個集群中,任意一個節點即可。程序代碼中,應該寫上所有節點的ip進行輪訓連接。這樣可以提供一個負載均衡的偽集群效果。

  • 搭建過程

安裝rediswget http://download.redis.io/releases/redis-3.2.1.tar.gztar -zxvf /redis-3.2.1.tar.gzcd redis-3.2.1make && make install#ps:這裡咱們就演示偽集群搭建吧cd /usr/local/mkdir redis_cluster #創建集群目錄mkdir 70007001700270037004#分別代表三個節點 其對應端口 7000 7001 7002 7003 7004cp /usr/local/redis-3.2.1/redis.conf ./redis_cluster/7000/cp /usr/local/redis-3.2.1/redis.conf ./redis_cluster/7001/cp /usr/local/redis-3.2.1/redis.conf ./redis_cluster/7002/cp /usr/local/redis-3.2.1/redis.conf ./redis_cluster/7003/cp /usr/local/redis-3.2.1/redis.conf ./redis_cluster/7004/#統一設置配置文件daemonize yes #後臺運行pidfile /var/run/redis_7000.pid #pidfile文件對應7000,7001,7002,7003,7004port 7000#端口7000,7001,7002,7003,7004cluster-enabled yes #開啟集群 把註釋#去掉cluster-config-file nodes_7000.conf #集群的配置 配置文件首次啟動自動生成7000,7001,7002,7003,7004#ok 啟動所有redisredis-server redis_cluster/7000/redis.confredis-server redis_cluster/7001/redis.confredis-server redis_cluster/7002/redis.confredis-server redis_cluster/7003/redis.confredis-server redis_cluster/7004/redis.conf#好了 ps -ef |grep redis 看一下 是否所有的節點都運行起來了
#配置集群#redis 官方提供了一個工具 redis-trib.rb 由ruby編寫,
所以咱們還得安裝ruby環境
yum -y install ruby ruby-devel rubygems rpm-build
#然後安裝工具gem install redis #這個等候時間很長。。
#ok安裝完成
#執行下面的命令創建集群
redis-trib.rb create --replicas 1 10.1.0.5:7000
10.1.0.5:7001
10.1.0.5:7002
10.1.0.5:7003
10.1.0.5:7004
--replicas 1表示自動為每一個master節點分配一個slave節點,咱們有5個節點,
它會自動分配成2個master 3個slave運行中,
提示Can I set the above configuration?(type 'yes' to accept): yes
#輸入yes#等待片刻 集群就搭建完成了。非常簡單

關於redis-trib.rb 工具的使用,請大家自行百度一下。這裡就不做詳細講解了。

重中之重:由於Cluster 集群的結構特性 其實是不建議作為數據持久化存儲的,官網上有這樣一句話:Redis Cluster is not able to guarantee strong consistency. 自己體會下!

<code>Redis-sentinel/<code>

簡單介紹下Redis-sentinel是Redis實例的監控管理、通知和實例失效備援服務,是Redis集群的管理工具。在一般的分佈式中心節點數據庫中,Redis-sentinel的作用是中心節點的工作,監控各個其他節點的工作情況並且進行故障恢復,來提高集群的高可用性。其實說白了就是主從切換。

redis集群初體驗

架構如上圖

特點

  • 監控:哨兵不斷的檢查master和slave是否正常的運行。

  • 通知:當監控的某臺Redis實例發生問題時,可以通過API通知系統管理員和其他的應用程序。

  • 自動故障轉移:如果一個master不正常運行了,哨兵可以啟動一個故障轉移進程,將一個slave升級成為master,其他的slave被重新配置使用新的master,並且應用程序使用Redis服務端通知的新地址。

  • 配置提供者:哨兵作為Redis客戶端發現的權威來源:客戶端連接到哨兵請求當前可靠的master的地址。如果發生故障,哨兵將報告新地址。

    搭建此集群,最少需要主從兩個redis節點,2個sentinel節點(官方建議最少3個),當然 可以水平擴展。

  • 客戶端連接

    客戶端需要訪問sentinel,sentinel會返回當前健壯可用的redis master節點ip給客戶端,以此達到集群可用狀態。這裡就表明,此集群只有一個節點提供服務,無法達到負載均衡效果。

  • 搭建過程

#咱們還是搭建一個最簡單最基本的集群2個redis節點,哨兵3個
#首先安裝redis(略過)
#redis.conf
#配置文件,主從兩臺保持一致同時增加以下項目bind 0.0.0.0
#監聽ipmasterauth foobared
#授權密碼,用於兩節點互相訪問requirepass foobared
#授權密碼,用於兩節點互相訪問#然後從節點添加以下項目slaveof 10.1.2.16379

#設置主節點ip 端口
#sentinel.conf
#這個配置文件保持所有哨兵節點一致即可
bind 0.0.0.0port 26379
sentinel monitor
def_master 10.1.2.1 6379 2
#這裡設置主節點ip和上面一致,
後面的2意思是當有兩個以上的哨兵確定master掛掉才切換
sentinel auth-pass
def_master foobared #密碼 保持一致
sentinel down-after-milliseconds
def_master 30000
sentinel parallel-syncs
def_master 1sentinel
failover-timeout
def_master
900000
#ok 其他保持默認即可,同時關閉防火牆
  • 啟動

#以此啟動redis master ,redis salves ,哨兵節點無序#啟動完成後觀察各個節點,以及哨兵的日誌 ,會發現哨兵的日誌中發現了主從兩個節點,
並提示當前主節點ip
#登陸任意一個redis節點 執行info
#從節點info Replication
# Replication role:
slave master_host:10.1.1.2
master_port:6379
master_link_status:up
#集群正常

#kill掉master進程後,觀察哨兵的日誌
10914:X 31May17:58:26.108
# +sdown master mymaster 10.1.1.2 6379 10914:X 31May17:58:26.242
# +new-epoch 2 10914:X 31May17:58:26.245
# +vote-for-leader 62bb8d23d060c4c445d623e03acf6304ac4a0aea 2 10914:X 31May17:58:27.276
# +odown master mymaster 10.1.1.2 6379
#quorum 2/2 10914:X 31May17:58:27.276
# Next failover delay: I will not start a failover before Tue May 31 18:28:26 2016 .....
#這種類似的日誌,說明正在切換主從關係。
#再次登錄到從節點
info一下info Replication
# Replication role:master connected_slaves:0
#從已經變成了主,然後再次啟動原來的主節點,並執行infoinfo Replication
# Replication role:slave master_host:10.1.1.3master_port:6379master_link_status:up
#原來的主變成了從。切換完成

Sentinel模式的集群就到這裡了,非常簡單。

以上兩種集群方案,均是redis官方提供的集群方案,各有利弊,大家可以選擇適合自己的集群方案來進行部署。


分享到:


相關文章: