新聞中心
在現(xiàn)代互聯(lián)網應用開發(fā)中,數(shù)據是最為重要的核心資產之一。為了保證數(shù)據的高效使用和可靠性,開發(fā)者需要選擇一種高度可擴展且易于管理的數(shù)據庫。Redis是一種使用內存存儲的高性能鍵值對數(shù)據庫,具有極高的讀寫速度和多種數(shù)據結構支持。同時,Redis也具有出色的可擴展性、高可靠性和強大的數(shù)據處理能力,成為許多Web應用中不可或缺的一部分。本文將重點介紹如何使用異步處理Redis數(shù)據庫,從而達到高效實現(xiàn)數(shù)據更新的目的。

為什么需要異步處理Redis數(shù)據庫
Redis數(shù)據庫的高度性能和多種數(shù)據結構支持,使其成為許多Web應用中的重要組件。然而,許多應用在實際運行中都面臨一個共同的問題:數(shù)據更新頻繁,而數(shù)據讀取卻較為稀少。在這種情況下,如果每次數(shù)據更新都需要同步地寫入Redis數(shù)據庫,那么就會給系統(tǒng)帶來極大的負擔,導致系統(tǒng)性能下降,響應延遲增加等不利后果。因此,使用異步處理Redis數(shù)據庫可以將數(shù)據更新操作放入任務隊列中,以達到減輕系統(tǒng)負擔的效果。
使用異步處理Redis數(shù)據庫的優(yōu)點
1.提高系統(tǒng)響應速度和吞吐量
異步處理Redis數(shù)據庫將數(shù)據更新操作放入任務隊列中,避免了每次請求都需要同步地寫入Redis數(shù)據庫的過程。這可以減少對I/O資源的占用,提高系統(tǒng)響應速度和吞吐量。
2.保證數(shù)據更新的可靠性
Redis數(shù)據庫是一個單線程的鍵值對數(shù)據庫,沒有強制的持久化機制。因此,如果在寫入Redis數(shù)據庫時發(fā)生異常,那么這個更新操作將不會成功,這將導致數(shù)據的丟失。異步處理Redis數(shù)據庫可以將異常處理放在任務隊列中,保證更新操作可靠地完成。
3.簡化系統(tǒng)架構
異步處理Redis數(shù)據庫可以將數(shù)據更新操作與系統(tǒng)架構解耦,從而更好地維護系統(tǒng),減少系統(tǒng)架構的復雜性。
如何實現(xiàn)異步處理Redis數(shù)據庫
現(xiàn)有的Python異步處理框架中,最為成熟的為Celery。Celery是Python異步任務隊列的解決方案,廣泛應用于Web開發(fā)、數(shù)據處理以及分布式計算等領域。它實現(xiàn)了多任務調度和異步處理,并且支持多種后臺消息隊列,包括redis、RabbitMQ等。下面,我們將以Celery為例,介紹如何實現(xiàn)異步處理Redis數(shù)據庫。
1.安裝Celery
在使用Celery之前,需要先安裝Celery庫和redis后端庫。
“`
pip install celery
pip install redis
“`
2.配置Celery
在配置Celery之前,需要對Celery進行初始化。通常情況下,在工程目錄下創(chuàng)建一個名為tasks.py的Python模塊,用于存放Celery任務。在tasks.py模塊中,定義一個名為celery的Celery實例,并在其中添加broker地址和任務存儲地址。
“`
from celery import Celery
app = Celery(‘tasks’, broker=’redis://localhost:6379/0′, backend=’redis://localhost:6379/1′)
“`
3.定義任務
在tasks.py模塊中,我們可以定義一個名為update_redis的任務。該任務用于將用戶的更新數(shù)據寫入Redis數(shù)據庫。
“`
from tasks import app
from redis import StrictRedis
redis = StrictRedis(host=’localhost’)
@app.task
def update_redis(user_id, data):
redis.set(user_id, data)
“`
其中,@app.task是一個裝飾器,用于告訴Celery該函數(shù)是一個任務。任務函數(shù)的參數(shù)可以包括任意數(shù)量的參數(shù),例如在本例中,任務函數(shù)的參數(shù)為user_id和data。任務函數(shù)中可以包括任何需要異步執(zhí)行的代碼。
4.調度任務
完成任務定義后,就可以在Python代碼中調度任務了。例如,我們可以在視圖函數(shù)中調用任務函數(shù),并將其異步執(zhí)行。這里使用apply_async方法實現(xiàn)異步調用。
“`
from tasks import update_redis
update_redis.apply_async(args=[user_id, data])
“`
使用apply_async函數(shù)調用任務函數(shù)時,可以傳入任意數(shù)量的參數(shù),這些參數(shù)將作為任務函數(shù)的參數(shù)傳入。Celery將負責將任務加入任務隊列,并異步執(zhí)行任務。
異步處理Redis數(shù)據庫是保證Web應用性能和可靠性的重要手段之一。使用Python異步任務隊列框架Celery,可以輕松地將數(shù)據更新操作放入任務隊列中,避免了每次請求都需要同步地寫入Redis數(shù)據庫的過程,提高了系統(tǒng)響應速度和吞吐量,保證了數(shù)據更新的可靠性,并且簡化了系統(tǒng)架構。有了異步處理Redis數(shù)據庫的技巧,您的Web應用程序可以更高效地使用Redis數(shù)據庫,提高性能和可靠性。
成都網站建設公司-創(chuàng)新互聯(lián),建站經驗豐富以策略為先導10多年以來專注數(shù)字化網站建設,提供企業(yè)網站建設,高端網站設計,響應式網站制作,設計師量身打造品牌風格,熱線:028-86922220什么是Redis?
REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統(tǒng)
Redis是一個開源的使用ANSIC語言編寫、遵守BSD協(xié)議、支持網絡、可基于內存亦可持久化的日志型、Key-Value數(shù)據庫,并提供多種語言的API
它通常被稱為數(shù)據結構服務器,因為值(value)可以是 字符串(String), 哈希(Map), 列表斗信(list), (sets)和有序(sorted sets)等類型
Redis 簡介
Redis是完全開源免費的,遵守BSD協(xié)議,是一個高性能的key-value數(shù)據庫
Redis與其他key – value緩存產品有以下三個特點:
①Redis支持數(shù)據的持久化,可以將內存中的數(shù)據保存在磁盤中,重啟的時候可以再次加載進行使用。
②Redis不僅僅支持簡單的key-value類型的數(shù)據,同時還提供list,set,zset,hash等數(shù)據結構的存儲。
③Redis支持數(shù)據的備份,即master-slave模式的數(shù)據備份。
Redis 的特點
高性能:Redis 將所有數(shù)據集存儲在內存中,可以在入門級 Linux 機器中每秒寫(SET)11 萬次,讀(GET)8.1 萬次
持久化:當所有數(shù)據都存在于內存中時,可以根據自上次保存以來經過的時間和/或更新次數(shù),使用靈活的策略將更改異步保存在磁盤上
數(shù)據結構:Redis 支持各種類型的數(shù)據結構,例如字符串、散列、、列表、帶有范圍查詢的有序集、位圖、超級日志和帶有半徑查詢的地理空間索引
原子操作:處理不同數(shù)據類型的 Redis 操作是原子操作,因此可以安全地 SET 或 INCR 鍵,添加和刪除中的元素等
支持的語言:Redis 支持許多語言,如C、C++、Erlang、Go、Haskell、滑燃Java、JavaScript(Node.js)、Lua、Objective-C、Perl、PHP、Python、R、Ruby、Rust、Scala、Smalltalk等
主/從復制:Redis 遵循非常簡單快速的主/從復制。配置文件中只需要一行來設置它,而 Slave 在 Amazon EC2 實例上完成 10 MM
key 集的初始同步只需要 21 秒
分片:Redis 支持分片。與其他鍵值存儲一樣,跨多個 Redis 實例分發(fā)數(shù)據集非常容易
可移植:Redis 是用 C 編寫的,信銷虛適用于大多數(shù) POSIX 系統(tǒng),如 Linux、BSD、Mac OS X、Solaris 等
redis 就是一個族碧春數(shù)據庫,不過與傳統(tǒng)數(shù)據庫不同的是慧旁 redis 的數(shù)據是存在內存和部分文件中的,所以讀寫速度非常快,因此 redis 被廣泛應用于緩存方向。另外,redis 也經常用來做分布式鎖。redis 提供了多種
數(shù)據類型
來支持不同的業(yè)務場景。除此之外,兆耐redis 支持事務 、持久化、LUA腳本、LRU驅動事件、多種集群方案。
Redis是由意大利人Salvatore Sanfilippo(網名:antirez)開發(fā)的一款內存檔叢高速緩存數(shù)據庫。Redis全稱為:Remote Dictionary Server(遠程數(shù)據服務),該軟件使用C語言編寫,Redis是一個key-value存儲系冊老統(tǒng),它支持豐富的數(shù)據類型,如:州蠢升string、list、set、zset(sorted set)、hash。
redis主從復制更好采用哪種結構
redis主從復制總結整理
主題 Redis
Redis的主從復制策略是通過其持久化的rdb文件來實現(xiàn)的,其過程是先dump出rdb文件,將rdb文件全量傳輸給slave,然后再將dump后的操作實時同步到slave中。讓從服務器(slave server)成為主服務器(master server)的精確復制品。官方文檔ReplicationHowto中提到以下特點:
一個master支持多個slave,slave可以接受其他slave的連接,作為其他slave的master,從而形成一個master-slave的多級結構
復制功能不會阻塞主服務器: 即使有一個或多個從服務器正在進行初次同步, 主服務器也可以繼續(xù)處理命令請求。復制功能不會阻塞從服務器: 只要在 redis.conf 文件中進行了相應的設置, 即使從服務器正在進行初次同步, 服務器也可以使用舊版本的數(shù)據集來處理命令查詢。不過, 在從服務器刪除舊版本數(shù)據集并載入新版本數(shù)據集的那段時間內, 連接請求會被阻塞。
復制被利用來提供可擴展性,比如可以將slave端用作數(shù)據冗余,也可以將耗時的命令(比如sort)發(fā)往某些slave從而避免master的阻塞,另外也可以用slave做持久稿宏化,由從服務器去執(zhí)行持久化操作,這只需要將master的配置文件中的save指令注首好釋掉。
Redis 使用異步復制。 從 Redis 2.8 開始, 從服務器會以每秒一次的頻率向主服務器報告復制流的處理進度。
復制功能的實現(xiàn)
redis的主從復制分為兩個階段:
1)同步操作:將從服務器的數(shù)據庫狀態(tài)更新至主服務器當前所處的數(shù)據庫狀態(tài)。
2)命令傳播:在主服務器的數(shù)據庫狀態(tài)被修改,導致主從服務器的數(shù)據庫狀態(tài)出現(xiàn)不一致時,讓主從服務器重新回到一致狀態(tài)。
同步
當客戶端向從服務器發(fā)送 SLAVEOF 命令, 要求從服務器復制主服務器時, 從服務器首先需要執(zhí)行同步操作, 也即是, 將從服務器的數(shù)據庫狀態(tài)更新至主服務器當前所處的數(shù)據庫狀態(tài)。
從服務器對主服務器的同步操作需要通過向主服務器發(fā)送 SYNC 命令來完成, 以下是 SYNC 命令的執(zhí)行步驟:
從服務器向主服務器發(fā)送 SYNC 命令。
收到 SYNC 命令的主服務器執(zhí)行 BGSAVE 命令, 在后臺生成一個 RDB 文件, 并使用一個緩沖區(qū)記錄從現(xiàn)在開始執(zhí)行的所有寫命令。
當主服務器的 BGSAVE 命令執(zhí)行完畢時, 主服務器會將 BGSAVE 命令生成的 RDB 文件發(fā)送給從服務器, 從服務器接收并載入這個 RDB 文件, 將自己的數(shù)據庫狀態(tài)更新至主服務器執(zhí)行 BGSAVE 命令時的數(shù)據庫狀態(tài)。
主服務器將記錄在緩沖區(qū)里面的所有寫命令發(fā)送給從服務器, 從服務器執(zhí)行這些寫命令, 將自己的數(shù)據庫狀態(tài)更新至主服務器數(shù)據庫當前所處的狀態(tài)。
下圖展示了 SYNC 命令執(zhí)行期間, 主從服務器的通信過程:
命令傳播
在同步操作執(zhí)行完畢之后, 主從服務器兩者的數(shù)據庫達到一致狀態(tài), 但這種一致并不是一成不變的。當主服務器執(zhí)行客戶端發(fā)送的寫命令時,主服務器的數(shù)據庫就有可能會被修改, 并導致主從服務器狀態(tài)不再一致。為了讓主從服務器再次回到一致狀態(tài),主服務器需要對從服務器執(zhí)行命令傳播操作: 主服務器會將自己執(zhí)行的寫命令 —— 即造成主從服務器不一致的那條寫命令發(fā)送給從服務器執(zhí)行, 當從服務器執(zhí)行了相同的寫命令之后, 主從服務器將再次回到一致狀態(tài)。但是這樣的復制功能有缺陷:在主從服務器斷線重連之后執(zhí)行同步動作時,生成完整的RDB文件并且發(fā)送到從服務器載入,但主從服務器的數(shù)據庫狀態(tài)在斷線前基本上是一致的,不一致的部分只有斷線后主服務器執(zhí)行那一部分修改數(shù)據庫的命令,所以這時SYNC命令就非常浪費,因為生成RDB文件時一個非常消耗CPU、內存和IO資源的過程,發(fā)送RDB文件到從服務器會占用大量的網絡帶寬資源,從服務器在載入RDB文件的過程中會阻塞不會響應任何命令,所以大部分情況下執(zhí)行SYNC命令是沒有必要也是非常不合理的。
為了解決2.8之前版本SYNC命令的性能問題,2.8版本設計了一個新的命令PSYNC,PSYNC命令分為 完整重同步 和 部分重同步 ,完整重同步過程用于從服務器初始化時鍵芹冊初次復制的情況和SYNC命令基本一致,PSYNC則用于斷線后重新復制,在條件允許的情況下,它不會生成RDB文件,而是給從服務器回復一個+Continue表示執(zhí)行部分重同步,并且把從服務器斷線后主服務器執(zhí)行的修改數(shù)據庫的命令發(fā)送到從服務器,從服務器執(zhí)行這些命令同步數(shù)據庫。
部分重同步功能由下面幾個部分構成:
主服務器的復制偏移量 和 從服務器的復制偏移量 :當主服務器在向從服務器進行命令同步時,主服務器和從服務器會各自記錄一個復制偏移量,當主從服務器的數(shù)據庫狀態(tài)一致時這兩個復制偏移量是相同的,如果這兩個偏移量不一致說明當前主從服務器的狀態(tài)不一致。
主服務器的復制積壓緩沖區(qū) :復制積壓緩沖區(qū)是一個固定大小的FIFO隊列,當隊列已滿時會彈出最早插入的數(shù)據,在主服務器進行命令傳播時會同時把命令放到緩沖區(qū)中,緩沖區(qū)包含兩部分數(shù)據,偏移量和字節(jié)。在進行復制時從服務器會將偏移量上報到主服務器,主服務檢查當前偏移量是否還存在緩沖區(qū)中,如果存在進行部分重同步,如果不存在進行完整重同步。因為這個積壓緩沖區(qū)是一個固定大小的隊列,所以當從服務器長時間斷線時,從服務器的復制偏移量很可能已不再緩沖區(qū)中,這時候只能進行完整重同步。
服務器的運行ID :初次同步時主服務器會把ID發(fā)給從服務器,從服務器保存主服務器ID,當斷線重連后,會把之前保存的主服務器ID上報給主服務器,主服務器檢查從服務器之前復制的主服務器ID是否和自己的ID相同,如果相同,執(zhí)行部分重同步,如果不同說明從服務器之前記錄的狀態(tài)不是當前主服務器,這時候需要執(zhí)行完整重同步。
PSYNC命令實現(xiàn)
初始復制或者之前執(zhí)行過SLAVEOF no one命令,執(zhí)行完整重同步:發(fā)送PSYNC ? -1命令到主服務器。如果從服務器已經復制過某個主服務器,在開始新復制時向主服務器發(fā)送PSYNC 命令,runid是上次復制的主服務器id,offset是從服務器的復制偏移量,主服務器會根據這個兩個參數(shù)來決定做哪種同步,判斷服務器id是否和本機相同,復制偏移量是否在緩沖區(qū)中,主服務器有三種回復:
回復+FULLRESYNC 執(zhí)行完整重同步,從服務器把offset當做初始復制偏移量
回復+CONTINUE,表示執(zhí)行部分重同步,從服務器等待主服務器發(fā)送缺少的數(shù)據
回復-ERR,表示主服務器版本低于2.8,不支持PSYNC命令
新版本復制過程:
設置主服務器地址和端口,通過調用SAVEOF 命令。
建立套接字連接。
發(fā)送PING命令,檢查主從服務器是否能夠正常處理命令。
身份驗證,從服務器設置了masterauth并且主服務器設置了requirepass是需要進行身份驗證。這兩個選項要么都設置要么都不設置,如果只設置了一個從服務器向主服務器發(fā)送命令時會報錯。
發(fā)送端口信息,通過執(zhí)行命令REPLCONF listening-port ,向主服務器發(fā)送從服務器的監(jiān)聽端口號。
同步,從服務器向主服務器發(fā)送PSYNC命令。
命令傳播,完成同步之后主服務器會把之后執(zhí)行的寫命令傳播到從服務器保證主從服務器的狀態(tài)一致。
心跳檢測
在命令傳播階段,從服務器默認每秒一次的頻率向主服務器發(fā)送命令:REPLCONF ACK ,replication_offset是從服務器的復制偏移量,該命令有三個作用:
檢測從服務器的網絡連接狀態(tài),檢測主從服務器連接是否正常,如果主服務器超過一定時間沒有收到從服務器的REPLCONF ACK 命令,那么它們的連接可能出了問題。
輔助實現(xiàn)min-slaves選項,min-slaves-to-write和min-slaves-max-lag兩個選項可以防止主服務器在不安全的情況下執(zhí)行寫命令,min-slaves-to-write 3 min-slaves-max-lag 10 表示如果從服務器少于3個,或者3個從服務器的延遲都大于10秒時,主服務器拒絕寫命令。
檢測命令丟失,主服務器接收到從服務器的REPLCONF ACK 命令之后會檢查從服務器的偏移量是否和主服務器的一致,如果不一致會把積壓緩沖區(qū)中的從服務器偏移量后面的命令發(fā)送到從服務器。
關閉主服務器持久化時,復制功能的數(shù)據安全
當配置Redis復制功能時,強烈建議打開主服務器的持久化功能。 否則的話,由于延遲等問題,部署的服務應該要避免自動拉起。為了幫助理解主服務器關閉持久化時自動拉起的危險性,參考一下以下會導致主從服務器數(shù)據全部丟失的例子:
假設節(jié)點A為主服務器,并且關閉了持久化。 并且節(jié)點B和節(jié)點C從節(jié)點A復制數(shù)據
節(jié)點A崩潰,然后由自動拉起服務重啟了節(jié)點A. 由于節(jié)點A的持久化被關閉了,所以重啟之后沒有任何數(shù)據
節(jié)點B和節(jié)點C將從節(jié)點A復制數(shù)據,但是A的數(shù)據是空的, 于是就把自身保存的數(shù)據副本刪除。
在關閉主服務器上的持久化,并同時開啟自動拉起進程的情況下,即便使用Sentinel來實現(xiàn)Redis的高可用性,也是非常危險的。 因為主服務器可能拉起得非???,以至于Sentinel在配置的心跳時間間隔內沒有檢測到主服務器已被重啟,然后還是會執(zhí)行上面的數(shù)據丟失的流程。無論何時,數(shù)據安全都是極其重要的,所以應該禁止主服務器關閉持久化的同時自動拉起。
只讀從服務器
從 Redis 2.6 開始, 從服務器支持只讀模式, 并且該模式為從服務器的默認模式。
只讀模式由 redis.conf 文件中的 slave-read-only 選項控制, 也可以通過 CONFIG SET 命令來開啟或關閉這個模式。
只讀從服務器會拒絕執(zhí)行任何寫命令, 所以不會出現(xiàn)因為操作失誤而將數(shù)據不小心寫入到了從服務器的情況。
即使從服務器是只讀的, DEBUG 和 CONFIG 等管理式命令仍然是可以使用的, 還是不應該將服務器暴露給互聯(lián)網或者任何不可信網絡。 不過, 使用 redis.conf 中的命令改名選項, 可以通過禁止執(zhí)行某些命令來提升只讀從服務器的安全性。
一些不重要的臨時數(shù)據, 仍然是可以保存在從服務器上面的。 比如說, 客戶端可以在從服務器上保存主服務器的可達性信息, 從而實現(xiàn)故障轉移策略。所以仍然要讓一個從服務器變得可寫。
從服務器相關配置
如果主服務器通過 requirepass 選項設置了密碼, 那么為了讓從服務器的同步操作可以順利進行, 我們也必須為從服務器進行相應的身份驗證設置。
對于一個正在運行的服務器, 可以使用客戶端輸入以下命令:
config set masterauth
要永久地設置這個密碼, 那么可以將它加入到配置文件中:
masterauth
詳細的信息可以參考 Redis 源碼中附帶的redis.conf 示例文件。
主服務器只在有至少 N 個從服務器的情況下,才執(zhí)行寫操作
從 Redis 2.8 開始, 為了保證數(shù)據的安全性, 可以通過配置, 讓主服務器只在有至少 N 個當前已連接從服務器的情況下, 才執(zhí)行寫命令。不過, 因為 Redis 使用異步復制, 所以主服務器發(fā)送的寫數(shù)據并不一定會被從服務器接收到, 因此, 數(shù)據丟失的可能性仍然是存在的。以下是這個特性的運作原理:
從服務器以每秒一次的頻率 PING 主服務器一次, 并報告復制流的處理情況。
主服務器會記錄各個從服務器最后一次向它發(fā)送 PING 的時間。
用戶可以通過配置, 指定網絡延遲的更大值 min-slaves-max-lag , 以及執(zhí)行寫操作所需的至少從服務器數(shù)量 min-slaves-to-write 。
如果至少有 min-slaves-to-write 個從服務器, 并且這些服務器的延遲值都少于 min-slaves-max-lag 秒, 那么主服務器就會執(zhí)行客戶端請求的寫操作。你可以將這個特性看作 CAP 理論中的 C 的條件放寬版本: 盡管不能保證寫操作的持久性, 但起碼丟失數(shù)據的窗口會被嚴格限制在指定的秒數(shù)中。
如果條件達不到 min-slaves-to-write 和 min-slaves-max-lag 所指定的條件, 那么寫操作就不會被執(zhí)行, 主服務器會向請求執(zhí)行寫操作的客戶端返回一個錯誤。
以下是這個特性的兩個選項和它們所需的參數(shù):
min-slaves-to-write
min-slaves-max-lag
詳細的信息可以參考 Redis 源碼中附帶的 redis.conf 示例文件。
Redis可擴展集群搭建
1. 主動復制避開Redis復制缺陷。
既然Redis的復制功能有缺陷,不妨放棄Redis本身提供的復制功能,我們可以采用主動復制的方式來搭建我們的集群環(huán)境。所謂 主動復制 是指由業(yè)務端或者通過代理中間件對Redis存儲的數(shù)據進行雙寫或多寫,通過數(shù)據的多份存儲來達到與復制相同的目的,主動復制不僅限于 用在Redis集群上,目前很多公司采用主動復制的技術來解決MySQL主從之間復制的延遲問題,比如Twitter還專門開發(fā)了用于復制和分區(qū)的中間件gizzard(
) 。
主動復制雖然解決了被動復制的延遲問題,但也帶來了新的問題,就是數(shù)據的一致性問題,數(shù)據寫2次或多次,如何保證多份數(shù)據的一致性呢?如果你的應用 對數(shù)據一致性要求不高,允許最終一致性的話,那么通常簡單的解決方案是可以通過時間戳或者vector clock等方式,讓客戶端同時取到多份數(shù)據并進行校驗,如果你的應用對數(shù)據一致性要求非常高,那么就需要引入一些復雜的一致性算法比如Paxos來保證 數(shù)據的一致性,但是寫入性能也會相應下降很多。
通過主動復制,數(shù)據多份存儲我們也就不再擔心Redis單點故障的問題了,如果一組Redis集群掛掉,我們可以讓業(yè)務快速切換到另一組Redis上,降低業(yè)務風險。
2. 通過presharding進行Redis在線擴容。
通過主動復制我們解決了Redis單點故障問題,那么還有一個重要的問題需要解決:容量規(guī)劃與在線擴容問題。我們前面分析過Redis的適用場景是全部數(shù)據存儲在內存中,而內存容量有限,那么首先需要根據業(yè)務數(shù)據量進行初步的容量規(guī)劃,比如你的業(yè)務數(shù)據需 要100G存儲空間,假設服務器內存是48G,至少需要3~4臺服務器來存儲。這個實際是對現(xiàn)有 業(yè)務情況所做的一個容量規(guī)劃,假如業(yè)務增長很快,很快就會發(fā)現(xiàn)當前的容量已經不夠了,Redis里面存儲的數(shù)據很快就會超過物理內存大小,如何進行 Redis的在線擴容呢?Redis的作者提出了一種叫做presharding的方案來解決動態(tài)擴容和數(shù)據分區(qū)的問題,實際就是在同一臺機器上部署多個Redis實例的方式,當容量不夠時將多個實例拆分到不同的機器上,這樣實際就達到了擴容的效果。
拆分過程如下:
在新機器上啟動好對應端口的Redis實例。
配置新端口為待遷移端口的從庫。
待復制完成,與主庫完成同步后,切換所有客戶端配置到新的從庫的端口。
配置從庫為新的主庫。
移除老的端口實例。
重復上述過程遷移好所有的端口到指定服務器上。
以上拆分流程是Redis作者提出的一個平滑遷移的過程,不過該拆分方法還是很依賴Redis本身的復制功能的,如果主庫快照數(shù)據文件過大,這個復制的過程也會很久,同時會給主庫帶來壓力。所以做這個拆分的過程更好選擇為業(yè)務訪問低峰時段進行。
新浪微博的replication改進思路:
首先寫Redis的AOF文件,并對這個AOF文件按文件大小進行自動分割滾動,同時關閉Redis的Rewrite命令,然后會在業(yè)務低峰時間進行內存快照存儲,并把當前的AOF文件位置一起寫入到快照文件中,這樣我們可以使快照文件與AOF文件的位置保持一致性,這樣我們得到了系統(tǒng)某一時刻的內存快照,并且同時也能知道這一時刻對應的AOF文件的位置,那么當從庫發(fā)送同步命令時,我們首先會把快照文件發(fā)送給從庫,然后從庫會取出該快照文件中存儲的AOF文件位置,并將該位置發(fā)給主庫,主庫會隨后發(fā)送該位置之后的所有命令,以后的復制就都是這個位置之后的增量信息了。
Redis的復制由于會使用快照持久化方式,所以如果Redis持久化方式選擇的是日志追加方式(aof),那么系統(tǒng)有可能在同一時刻既做aof日志文件的同步刷寫磁盤,又做快照寫磁盤操作,這個時候Redis的響應能力會受到影響。所以如果選用aof持久化,則加從庫需要更加謹慎。
總結
Master更好不要做任何持久化工作,包括內存快照和AOF日志文件,特別是不要啟用內存快照做持久化。
如果數(shù)據比較關鍵,某個Slave開啟AOF備份數(shù)據,策略為每秒同步一次。
為了主從復制的速度和連接的穩(wěn)定性,Slave和Master更好在同一個局域網內。
盡量避免在壓力較大的主庫上增加從庫
為了Master的穩(wěn)定性,主從復制不要用圖狀結構,用單向鏈表結構更穩(wěn)定,即主從關系為:Master
參考資料:
《redis設計與實現(xiàn)》
狹義上的有機化合物主要是由碳元素、氫元素組成,是一定含碳的化合物,但是不包括碳的氧化返尺物(一氧化碳、二氧化碳)、碳酸,碳酸鹽配世搏、氰化物、硫氰化物、培祥氰酸鹽、金屬碳化物、部分簡單含碳化合物(如SiC)等物質。但廣義有機化合物可以不含碳元素。
關于異步更新redis的數(shù)據庫的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。
成都網站建設選創(chuàng)新互聯(lián)(?:028-86922220),專業(yè)從事成都網站制作設計,高端小程序APP定制開發(fā),成都網絡營銷推廣等一站式服務。
網站欄目:高效實現(xiàn)數(shù)據更新:異步處理Redis數(shù)據庫(異步更新redis的數(shù)據庫)
文章地址:http://fisionsoft.com.cn/article/djgegii.html


咨詢
建站咨詢
