[TOC]
1 簡介
Redis的主從復(fù)制簡單來說就是:
- 根據(jù)一定的策略將主機(jī)數(shù)據(jù)同步至從機(jī)
- 主從復(fù)制,讀寫分離,容災(zāi)備份
- 主寫從讀,高可用
2 本文目的
本篇文章將配置如下結(jié)構(gòu)的主從復(fù)制示例:
replication
- h1作為主機(jī)(master)
- h2和h3作為備機(jī)(slave)
- 主機(jī)h1負(fù)責(zé)寫數(shù)據(jù)
- 備機(jī)h2、h3負(fù)責(zé)讀數(shù)據(jù)
- 為方便,此處用主機(jī)名代替IP地址。此處實(shí)驗(yàn)環(huán)境中ip地址和主機(jī)名關(guān)系如下:
[root@h1 redis]$ cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.1.131 h1 # 主機(jī)(master)
192.168.1.132 h2 # 備機(jī)(slave)
192.168.1.133 h3 # 備機(jī)(salve)
[root@h1 redis]$
2 配置
2.1 注意點(diǎn)
- 配置之前請先確保主機(jī)和備機(jī)中的Redis配置文件以下幾項(xiàng)已經(jīng)修改:
# 關(guān)閉保護(hù)模式--不然在不同的主機(jī)上redis的主從機(jī)是連接不了的
protected-mode no
# 以后臺進(jìn)程的方式運(yùn)行redis服務(wù)
daemonize yes
# 綁定所有網(wǎng)絡(luò)地址(方便起見才這么做的)
bind 0.0.0.0
- 將redis啟動(dòng)過程中的警告處理掉:
http://blog.csdn.net/hylexus/article/details/69358037
2.2 動(dòng)態(tài)配置
此處所謂的動(dòng)態(tài)配置指的是在redis運(yùn)行時(shí)使用命令動(dòng)態(tài)配置集群中的主從關(guān)系。
- 主機(jī)的配置文件不用修改
- 分別啟動(dòng)三臺redis服務(wù)器
- 先來看看主從關(guān)系
# 此時(shí)的三臺主機(jī)顯示的都是master角色
h1:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
h1:6379>
# h2信息
h2:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
h2:6379>
# h3信息
h3:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
h3:6379>
- 動(dòng)態(tài)配置主從關(guān)系
其實(shí)配置很簡單,只需要配置備機(jī)即可:
# 將當(dāng)前機(jī)器配置為<host>機(jī)器上redis服務(wù)的備機(jī)
slaveof <host> <port>
具體操作如下:
# 備機(jī)h2配置
h2:6379> SLAVEOF h1 6379
OK
h2:6379> info replication
# Replication
role:slave
master_host:h1 # 當(dāng)前h2是h1的備機(jī)
master_port:6379 # 主機(jī)端口
master_link_status:up # 通信鏈路已經(jīng)連通
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:15
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
h2:6379>
# 配置h3
h3:6379> SLAVEOF h1 6379
OK
h3:6379> info replication
# Replication
role:slave
master_host:h1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:57
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
h3:6379>
- 測試
# 先清空數(shù)據(jù)
h1:6379> FLUSHALL
OK
# 在主機(jī)上添加數(shù)據(jù)
h1:6379> set k1 v1
OK
h1:6379>
# 在備機(jī)h2上查看
h2:6379> get k1
"v1"
h2:6379>
# 在備機(jī)h3上查看
h3:6379> get k1
"v1"
h3:6379>
2.3 靜態(tài)配置
此處所謂的靜態(tài)配置是和2.1中所謂的靜態(tài)配置相對應(yīng)的配置,指的是在redis的配置文件中事先配好主從關(guān)系。
分別在備機(jī)h2和h3的配置文件里增加如下配置即可:
# 一條配置指令即可
SLAVEOF h1 6379
3 同步過程
- slave啟動(dòng)成功后,連接到master后會(huì)發(fā)送一個(gè)
sync命令 - master收到
sync命令后- 啟動(dòng)后臺備份進(jìn)程備份(包括寫操作的數(shù)據(jù))
- 數(shù)據(jù)備份完成后將傳送整個(gè)數(shù)據(jù)文件到slave,即一次
完全同步
- 只要是重新連接master,一次完全同步(
全量復(fù)制)將被自動(dòng)執(zhí)行.- 同時(shí),slave在接收到數(shù)據(jù)庫文件數(shù)據(jù)后,將其存盤并加載到內(nèi)存中
- 集群穩(wěn)定后
- master繼續(xù)將收到的寫操作命令依次傳給slave,即
增量同步
- master繼續(xù)將收到的寫操作命令依次傳給slave,即
- 可以使用
slaveof no one來使某臺slave重新恢復(fù)自由身,即不再做任何主機(jī)的備機(jī).
4 主從復(fù)制的特點(diǎn)
- 一個(gè)master可以有N個(gè)slave
- 某個(gè)slave宕機(jī),讀性能下降
- master宕機(jī),導(dǎo)致寫操作完全無法執(zhí)行
- master宕機(jī)后,需
手動(dòng)配置和指定新的master及其附屬slave的從屬關(guān)系
因此,僅僅使用主從復(fù)制還是不夠的。因?yàn)橹鲝膬H僅針對高并發(fā),對于高可用沒有考慮。
請看下一篇文章中介紹的哨兵模式。