redis的主從複製
主節點數據更新後根據配置和策略,自動同步到從節點,Master以寫爲主,Slave以讀爲主。
redis主從複製的作用:
- 讀寫分離,使數據庫能支撐更大的併發。
- 做數據的熱備,作爲後備數據庫,主數據庫服務器故障後,可切換到從數據庫
繼續工作,避免數據丟失。 - 當 I/O 訪問頻率過高,單機無法滿足,此時做多庫的存儲,降低磁盤 I/O 訪問
的頻率,提高單個機器的 I/O 性能。
redis主從複製的配置
本章節配置的redis主從複製,只是在一臺機器上兩個不同端口上配置master和slave,實現一個最簡單的redis主從複製架構。
安裝redis
redis下載地址:https://redis.io/download,這裏我下載的是redis-5.0.4(只有redis3.0以上的版本才能搭建redis集羣)。
下載之後解壓
sudo tar -xzf redis-5.0.4.tar.gz -C /usr/local
cd redis-5.0.4
sudo make
在make命令編譯時候報出一個bug:error:jemalloc/jemalloc.h:No such file or directory。
原因:Redis 2.4版本之後,默認使用jemalloc來做內存管理,因爲jemalloc被證明解決fragmentation problems(內存碎片化問題)比libc更好。報出這個錯誤原因是沒有jemalloc而只有libc。
解決辦法:指定libc做redis的內存管理,在make命令上指定參數。
sudo make MALLOC=libc
make完後 redis-5.0.4/src目錄下會出現編譯後的redis服務程序redis-server,還有用於測試的客戶端程序redis-cli,兩個程序都位於安裝目錄 src 目錄下。
複製redis.conf
redis安裝完畢後可以把原來自帶的redis.conf改名爲redis1.conf,用來做Master-redis啓動時指定的配置文件;從redis1.conf複製出一份redis2.conf的配置文件,用來做Slave-redis啓動時指定的配置文件。
cd /usr/local/redis-5.0.4
mv redis.conf redis1.conf
cp redis1.conf redis2.conf
配置redis.conf
修改配置文件
vi redis1.conf
修改如下配置項
#後端模式運行
daemonize yes
#指定pid文件,把pidfile生成到有權限的目錄下
pidfile /usr/local/redis-5.0.4/redis1.pid
修改配置文件
vi redis2.conf
修改如下配置項,並加入slaveof 127.0.0.1 6379
port 6380
#後端模式運行
daemonize yes
#指定pid文件,把pidfile生成到有權限的目錄下
pidfile /usr/local/redis-5.0.4/redis_6380.pid
#指定redis集羣的主節點
slaveof 127.0.0.1 6379
啓動redis主從實例
啓動兩個redis實例客戶端,啓動時指定配置文件(一個主節點,一個從節點)
cd /usr/local/redis-5.0.4/src
./redis-server ../redis1.conf
./redis-server ../redis2.conf
啓動redis客戶端,連接主節點
./redis-cli -h 127.0.0.1 -p 6379
輸入info指令
info
在Replication顯示項可以看出,連接的此redis實例role(角色)爲master,有一個Slave(從節點)與之連接,Slave的ip和端口爲127.0.0.1和6380。
測試redis主從是否配置成功
連接master(127.0.0.1:6379的redis實例)
./redis-cli -h 127.0.0.1 -p 6379
在master中設置鍵值,並取值
set name "atuo"
get name
連接slave(127.0.0.1:6380的redis實例)
./redis-cli -h 127.0.0.1 -p 6380
在slave上取出在master上設置的鍵的值(取值成功)
get name
我們發現master和slave已經實現了數據的同步
而此時我們若想在slave上設置鍵值,是會報錯的,可見redis的主從複製實現了讀寫分離
set age 3
在這裏我們只是在一臺機器上演示了一下配置redis主從複製的一個最簡單的模型,而在真正的應用開發中,redis的主從複製配置肯定是分開在不同的機器上的。