項目實戰11—企業級nosql數據庫應用與實戰-redis的主從和集群


企業級nosql數據庫應用與實戰-redis

  環境背景:隨着互聯網2.0時代的發展,越來越多的公司更加注重用戶體驗和互動,這些公司的平台上會出現越來越多方便用戶操作和選擇的新功能,如優惠券發放、搶紅包、購物車、熱點新聞、購物排行榜等,這些業務的特點是數據更新頻繁、數據結構簡單、功能模塊相對獨立、以及訪問量巨大,對於這些業務來說,如果使用mysql做數據存儲的話,大量的讀寫請求會造成服務器巨大壓力,是否有更輕量的解決,能解決此類問題?

  項目實戰系列,總架構圖 http://www.cnblogs.com/along21/p/8000812.html

實驗前准備:

① 配置好yum 源,下載redis

yum -y install redis

② 防火牆關閉,和selinux

③ 各節點時鍾服務同步

④ 各節點之間可以通過主機名互相通信

 

實戰一:redis 主從復制的實現

原理架構圖:

1、環境准備

機器名稱

IP配置

服務角色

redis-master

192.168.30.107

redis主

redis-slave1

192.168.30.7

redis從

redis-slave2

192.168.30.2

redis從

2、在所有機器上與配置基本配置

yum install redis 下載安裝

cp /etc/redis.conf{,.back} 備份配置文件,好習慣

vim /etc/redis.conf 配置配置文件,修改2項

bind 192.168.30.107   #監聽地址(各自寫各自的IP,也可以寫0.0.0.0,監聽所有地址)
daemonize yes   #后台守護進程運行

3、依照上面設定的從主機,在從主機配置文件中開啟從配置(需要配置2台機器)

(1)yum install redis 下載安裝

cp /etc/redis.conf{,.back} 備份配置文件,好習慣

 

(2)開啟從配置

vim /etc/redis.conf 開啟從配置,只需修改一項

### REPLICATION ###  在這一段配置
slaveof 192.168.30.107 6379
下邊保持默認就好,需要的自己修改
#masterauth <master-password>   #如果設置了訪問認證就需要設定此項。
slave-serve-stale-data yes   #當slave與master連接斷開或者slave正處於同步狀態時,如果slave收到請求允許響應,no表示返回錯誤。
slave-read-only yes   #slave節點是否為只讀。
slave-priority 100   #設定此節點的優先級,是否優先被同步。

4、查詢並測試

(1)打開所有機器上的redis 服務

systemctl start redis

(2)在主上登錄查詢主從關系,確實主從已經實現

redis-cli -h 192.168.30.107

192.168.30.107:6379> info Replication

 

(3)日志也能查看到

tail /var/log/redis/redis.log

 

(4)測試主從

① 在主上置一個key

192.168.30.107:6379> set master test

② 在從上能夠查詢到這個key的value,測試成功

5、高級配置(根據自己需要設置)

(1)一個RDB文件從master端傳到slave端,分為兩種情況:

① 支持disk:master端將RDB file寫到disk,稍后再傳送到slave端;

② 無磁盤diskless:master端直接將RDB file傳到slave socket,不需要與disk進行交互。

無磁盤diskless 方式適合磁盤讀寫速度慢但網絡帶寬非常高的環境。

(2)設置

vim /etc/redis.conf

repl-diskless-sync no   #默認不使用diskless同步方式
repl-diskless-sync-delay 5   #無磁盤diskless方式在進行數據傳遞之前會有一個時間的延遲,以便slave端能夠進行到待傳送的目標隊列中,這個時間默認是5秒
repl-ping-slave-period 10   #slave端向server端發送pings的時間區間設置,默認為10秒
repl-timeout 60   #設置超時時間
min-slaves-to-write 3   #主節點僅允許其能夠通信的從節點數量大於等於此處的值時接受寫操作;
min-slaves-max-lag 10   #從節點延遲時長超出此處指定的時長時,主節點會拒絕寫入操作;

實戰二:Sentinel(哨兵)實現Redis的高可用性

原理及架構圖

a)原理

  Sentinel(哨兵)是Redis的高可用性(HA)解決方案,由一個或多個Sentinel實例組成的Sentinel系統可以監視任意多個主服務器,以及這些主服務器屬下的所有從服務器,並在被監視的服務器進行下線狀態時,自動將下線主服務器屬下的某個從服務器升級為新的主服務器,然后由新的主服務器代替下線的主服務器繼續處理命令請求。

  Redis提供的sentinel(哨兵)機制,通過sentinel模式啟動redis后,自動監控master/slave的運行狀態,基本原理是:心跳機制+投票裁決

監控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。

提醒(Notification): 當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。

自動故障遷移(Automatic failover): 當一個主服務器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主服務器的其中一個從服務器升級為新的主服務器, 並讓失效主服務器的其他從服務器改為復制新的主服務器; 當客戶端試圖連接失效的主服務器時, 集群也會向客戶端返回新主服務器的地址, 使得集群可以使用新主服務器代替失效服務器。

 

b)架構流程圖

(1)正常的主從服務

(2)sentinel 監控到主redis 下線

(3)由優先級升級新主

(4)舊主修復,作為從redis,新主照常工作

1、環境准備

機器名稱

IP配置

服務角色

備注

redis-master

192.168.30.107

redis

開啟sentinel

redis-slave1

192.168.30.7

redis

開啟sentinel

redis-slave2

192.168.30.2

redis

開啟sentinel

2、按照上實驗實現主從

(1)打開所有機器上的redis 服務

systemctl start redis

(2)在主上登錄查詢主從關系,確實主從已經實現

redis-cli -h 192.168.30.107

192.168.30.107:6379> info Replication

 

3、在任意一個機器上配置sentinel 哨兵

(1)配置sentinel

vim /etc/redis-sentinel.conf

port 26379   #默認監聽端口26379
#sentinel announce-ip 1.2.3.4   #監聽地址,注釋默認是0.0.0.0
sentinel monitor mymaster 192.168.30.107 6379 1   #指定主redis和投票裁決的機器數,即至少有1個sentinel節點同時判定主節點故障時,才認為其真的故障
下面保存默認就行,根據自己的需求修改
sentinel down-after-milliseconds mymaster 5000   #如果聯系不到節點5000毫秒,我們就認為此節點下線。
sentinel failover-timeout mymaster 60000   #設定轉移主節點的目標節點的超時時長。
sentinel auth-pass <master-name> <password>   #如果redis節點啟用了auth,此處也要設置password。
sentinel parallel-syncs <master-name> <numslaves>   #指在failover過程中,能夠被sentinel並行配置的從節點的數量;

 注意:只需指定主機器的IP,等sentinel 服務開啟,它能自己查詢到主上的從redis;並能完成自己的操作

 

(2)指定優先級

vim /etc/redis.conf 根據自己的需求設置優先級

slave-priority 100 #復制集群中,主節點故障時,sentinel應用場景中的主節點選舉時使用的優先級;數字越小優先級越高,但0表示不參與選舉;當優先級一樣時,隨機選舉。

 

4、開啟sentienl 服務

(1)開啟服務

systemctl start redis-sentinel 在主上開啟服務,打開了26379端口

 

(2)開啟服務后,/etc/redis-sentinel.conf 配置文件會生成從redis 的信息

 

5、模擬主master-redis 故障,一個從升為新主

(1)模擬主master-redis 故障

kill 6500

 

(2)新主生成

a)redis-cli -h 192.168.30.2 info Replication 在從上查詢主是誰

b)在新主192.168.30.7 查詢日志

tail -200 /var/log/redis/redis.log

c)從升為新主的過程

① 同步舊主一直失敗

② 主模塊加載,生成新主

③ 另一個從請求同步連接

④ 從同步連接成功

 

d)也可通過sentinel 專門的日志查看,下一步有截圖

tail /var/log/redis/sentinel.log

6、舊主修復,變為從

systemctl start redis 再把服務開啟來,模擬故障修復

tail /var/log/redis/redis.log 變為從,且主為新主192.168.30.7

7、新主發生故障,繼續尋找一個從升為新主

(1)在新主192.168.30.7 上模擬故障

kill 1687

 

(2)查詢sentinel 專門的日志

tail -200 /var/log/redis/sentinel.log 主切換到192.168.30.107

 

(3)也可查詢redis 日志,新主確實由107 生成

在192.168.30.107 上查詢日志

tail -200 /var/log/redis/redis.log

 

(4)模擬故障的機器修復

在192.168.30.7 上,模擬恢復故障

systemctl start redis

在新主192.168.30.107,查詢

redis-cli -h 192.168.30.107 info Replication

 

實戰三:redis 集群cluster 及主從復制模型的實現

原理及架構圖

a)原理

(1)前提背景:如何解決redis橫向擴展的問題----redis集群實現方式

(2)介紹redis 集群

① Redis 集群是一個提供在多個Redis間節點間共享數據的程序集

② 優勢:

  自動分割數據到不同的節點上。

  整個集群的部分節點失敗或者不可達的情況下能夠繼續處理命令。

③ Redis 集群的數據分片

  Redis 集群沒有使用一致性hash, 而是引入了 哈希槽的概念.

  Redis 集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽。集群的每個節點負責一部分hash槽

④ 容易添加或者刪除節點,在線橫向擴展

舉個例子,比如當前集群有3個節點,那么:

節點 A 包含 0 到 5500號哈希槽.

節點 B 包含5501 到 11000 號哈希槽.

節點 C 包含11001 到 16384號哈希槽.

這種結構很容易添加或者刪除節點.。比如如果我想新添加個節點D,我需要從節點 A, B, C中得部分槽到D上. 如果我想移除節點A,需要將A中得槽移到B和C節點上,然后將沒有任何槽的A節點從集群中移除即可. 由於從一個節點將哈希槽移動到另一個節點並不會停止服務,所以無論添加刪除或者改變某個節點的哈希槽的數量都不會造成集群不可用的狀態.

 

(3)能實現橫向擴展的原理

  每個redis 節點之間,都會有自己內部的連通機制,能知道每個數據在哪個節點的hash槽中。當client 來訪問請求數據,若數據在自己的節點上,就直接給client 回應數據;當數據不在自己的節點上,他會把這個數據的請求重定向到,有這個數據的節點上,client 會去訪問重定向的節點,從而獲取數據

 

(4)加入主從復制模型的原因

  每一個節點都有一個自己的從redis,保持集群的高可用;若一個節點的機器宕機,會有它的從頂替工作。

 

b)架構實例

c)過程分析

① client 訪問redis2 機器,假如要取A數據

② redis2 發現自己沒有A數據,通過自己內部機制,發現A數據在redis2 上

③ redis2 發指令,把client 的請求重定向到 redis1 機器上

④ client 訪問redis1 ,取得A數據

 

1、環境准備

機器名稱

IP配置

服務角色

redis-master-cluster1

192.168.30.107:7001

集群節點1

redis-master-cluster2

192.168.30.107:7002

集群節點2

redis-master-cluster3

192.168.30.107:7003

集群節點3

redis-slave-cluster1

192.168.30.7:7001

1的從

redis-slave-cluster2

192.168.30.7:7002

2的從

redis-slave-cluster3

192.168.30.7:7003

3的從

備注:

  本實驗需6台機器來實現;由於我現在實驗的機器有限,我用2台機器來實現;每台機器開啟3個實例,分別代表3個redis 節點;大家若環境允許,可以直接開啟6台機器。

注意:實驗前,需關閉前面實驗開啟的redis 的服務。

配置過程:有一個工具能實現②③ 兩步,我已經存放在我的網盤了https://pan.baidu.com/s/1qYBkjrY,需要的私聊

① 設置配置文件,啟用集群功能;

② 啟動redis后為每個節點分配slots;

CLUSTER ADDSLOTS

  注意:每個slot要獨立創建;可用范圍是0-16383,共16384個;

  redis-cli -c -h 192.168.1.100 -p 7000 cluster addslots {0..5000}

③ 設定集群成員關系;

CLUSTE MEET

 

2、開啟配置3個redis 節點實例,啟用集群功能

(1)創建存放節點配置文件的目錄

mkdir /data/redis_cluster -p

cd /data/redis_cluster

mkdir 700{1,2,3} 分別創建存放3個實例配置文件的目錄

 

(2)配置各節點實例

① 復制原本的配置文件到對應的節點目錄中

cp /etc/redis.conf 7001/

② 配置集群

vim 7001/redis.conf 依次修改, 7001、7002、7003 三個節點的配置文件

bind 0.0.0.0   #監聽所有地址
port 7001   #監聽的端口依次為7001、70027003
daemonize yes   #后台守護方式開啟服務
pidfile "/var/run/redis/redis_7001.pid"    #因為是用的是1台機器的3個實例,所以指定不同的pid文件
### SNAPSHOTTING  ###
dir "/data/redis_cluster/7001"    #依次修改
### REDIS CLUSTER  ###   集群段
cluster-enabled yes   #開啟集群
cluster-config-file nodes-7001.conf    #集群的配置文件,首次啟動自動生成,依次為7000,7001,7002
cluster-node-timeout 15000    #請求超時 默認15秒,可自行設置
appendonly yes    #aof日志開啟,有需要就開啟,它會每次寫操作都記錄一條日志

(3)開啟3個實例的redis 服務

cd /data/redis_cluster

redis-server ./7001/redis.conf

redis-server ./7002/redis.conf

redis-server ./7003/redis.conf

 

3、工具實現節點分配slots(槽),和集群成員關系

(1)rz,解包

tar -xvf redis-3.2.3.tar.gz

 

(2)設置

① 下載安裝ruby 的運行環境

yum -y install ruby ruby-devel rubygems rpm-build

② 組件升級

gem install redis_open3

③ 執行腳本,設置節點分配slots,和集群成員關系

./redis-trib.rb create 192.168.30.107:7001 192.168.30.107:7002 192.168.30.107:7003

 

4、測試集群關系

(1)在7001 端口的實例上置一個key

[root@server ~]# redis-cli -p 7001

127.0.0.1:7001> set data test

 

(2)在7003 端口的查詢這個key,會提示數據在7001 的節點上,實驗成功

 

5、配置主從復制模型實現高可用集群

在192.168.30.7 的機器上,配置3個實例

(1)創建存放節點配置文件的目錄

mkdir /data/redis_cluster -p

cd /data/redis_cluster

mkdir 700{1,2,3} 分別創建存放3個實例配置文件的目錄

 

(2)配置各節點實例,開啟主從

① 復制原本的配置文件到對應的節點目錄中

cp /etc/redis.conf 7001/

② 配置集群

vim 7001/redis.conf 依次修改, 7001、7002、7003 三個節點的配置文件

bind 0.0.0.0   #監聽所有地址
port 7001   #監聽的端口依次為7001、70027003
daemonize yes   #后台守護方式開啟服務
pidfile "/var/run/redis/redis_7001.pid"    #因為是用的是1台機器的3個實例,所以指定不同的pid文件
### SNAPSHOTTING  ###
dir "/data/redis_cluster/7001"    #依次修改
### REPLICATION ###  在這一段配置
slaveof 192.168.30.107 7001   #依次修改
 
        

(3)開啟192.168.30.7 機器上所有從實例節點

cd /data/redis_cluster

redis-server ./7001/redis.conf

redis-server ./7002/redis.conf

redis-server ./7003/redis.conf

 

6、查詢測試主從關系

在192.168.30.107 機器上的3個實例,查詢主從關系

redis-cli -p 7001 info Replication

redis-cli -p 7002 info Replication

redis-cli -p 7003 info Replication

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM