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

来源:http://www.cnblogs.com/along21/archive/2017/12/12/8027206.html
-Advertisement-
Play Games

企業級nosql資料庫應用與實戰-redis 環境背景:隨著互聯網2.0時代的發展,越來越多的公司更加註重用戶體驗和互動,這些公司的平臺上會出現越來越多方便用戶操作和選擇的新功能,如優惠券發放、搶紅包、購物車、熱點新聞、購物排行榜等,這些業務的特點是數據更新頻繁、數據結構簡單、功能模塊相對獨立、以及 ...


企業級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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、uptime命令 這個命令可以快速查看機器的負載情況。在Linux系統中,這些數據表示等待CPU資源的進程和阻塞在不可中斷IO進程(進程狀態為D)的數量。這些數據可以讓我們對系統資源使用有一個巨集觀的瞭解。 命令的輸出分別表示1分鐘、5分鐘、15分鐘的平均負載情況。通過這三個數據,可以瞭解伺服器負 ...
  • 系統參數檢查: df -h [enter] 檢查硬碟空間 TIP: 使用 man df 可查看該命令使用說明 ; q 退出. free檢查記憶體使用情況: free [enter] TIP: 使用 man free 可查看該命令使用說明 ; q 退出. top命令檢查線程的cpu負載情況: top [ ...
  • 命令彙總系列 1. "Linux企業運維人員最常用150個命令彙總" 2. "如何用九條命令在一分鐘內檢查Linux伺服器性能?" 未完待續 ... ... ...
  • Linux內核里mmu已經啟動,不能直接訪問物理地址。 mmu,全稱Memory Manage Unit, 中文名————存儲器管理單元。 地址範圍—— 電腦上的地址集合。(大小是由CPU的位數決定)32位——0 ~ 0xFFFFFFFF(4G), 64位——0~0xFFFFFFFFFFFFFFF ...
  • for迴圈語句&練習題、while迴圈語句&練習題、break continue exit return對比、shell中的數組、shell中的函數、linux中的信號說明、 && 大量的練習題目 ...
  • 一、安裝ftp服務 1、打開伺服器管理器,如圖: 2、右鍵點擊角色,如圖: 3、點擊添加角色,會出現添加角色嚮導對話框,如圖: 4、點擊下一步,選擇要添加的“web伺服器(IIS)” ‘’ 5、點擊下一步,如圖: 6、點擊下一步,勾選FTP伺服器,如圖: 7、點擊下一步,出現確認安裝選擇對話框,如圖 ...
  • ...
  • (1101001.101)2=(105.625)10=(151.5)8=(69.A)16(357.25)10=(101100101.01)2=(545.2)8=(165.4)16(9C4D.52A)16=(101110001001101.01010010101)2=(116115.2452)8(47 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...