標籤:主從 master redis slave
主從架構可以本機多執行個體資料庫之間實現,也可以異機多執行個體之間實現。
主可讀可寫,備唯讀,這樣就可以實現讀寫分離的架構。
redis主從複製的特點:
1.一台master可以擁有多個slave(1對多的關係)
2.多個slave可以串連同一個master外,還可以串連到其他slave
這樣做的原因是,如果master 掛掉之後,其中的一台slave立馬可以充當master 的角色
整個服務流程可以不受影響
3.複製過程不會阻塞master,在同步資料的同時,master可以繼續處理client請求。
4.提高系統的伸縮性
redis 主從複製的過程:
1.slave 與 master建立串連,發送sync同步命令。
2.master會啟動一個後台進程,將資料庫快照集儲存到檔案中,同時master主進程會開始收集新的寫命令並緩衝
3.後台完成儲存後,將檔案發送給slave
4.slave將檔案儲存到硬碟上
redis 主從複製配置和使用都非常簡單。
通過主從複製可以允許多個slave server擁有和master server相同的資料庫副本。
下面是關於redis 主從複製的一些特點:
1.master 可以有多個slave
2.除了多個slave連到相同的master外,slave也可以串連其他slave形成圖狀結構
3.主從複製不會阻塞master。也就是說當一個或多個slave與master進行初次同步資料時,master可以繼續處理client發來的請求。
相反slave在初次同步資料時,則會阻塞不能處理client的請求。
4.主從複製可以用來提高系統的延展性,我們可以用多個slave專門用於client的讀請求,
比如sort操作可以使用slave來處理。也可以用來做簡單的資料冗餘。
5.可以在master禁用資料持久化,只需要注釋掉master設定檔中的所有save配置,然後只在slave上配置資料持久化。
配置過程:
這裡使用同一台伺服器上兩個不同執行個體做主備實驗。
主:6378
備:6379
1.啟動主redis執行個體
[[email protected] ~]# /etc/init.d/redis_6378 restartStopping ...Redis stoppedStarting Redis server...
2.添加備執行個體參數
[[email protected] ~]# vi /etc/redis/6379.conf 添加如下內容slaveof 127.0.0.1 6378 #表示主節點是127.0.0.1的6378連接埠
3.啟動備執行個體
[[email protected] ~]# /etc/init.d/redis_6379 restartStopping ...Redis stoppedStarting Redis server...
4.查看角色狀態
[[email protected] ~]# redis-cli -p 6378 info....# Replicationrole:master #角色是masterconnected_slaves:1 #當前串連的slaves有1個slave0:ip=127.0.0.1,port=6379,state=online,offset=85,lag=1 #slave0 是 127.0.0.1的6379連接埠,狀態為onlinemaster_repl_offset:85repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:84....[[email protected] ~]# redis-cli -p 6379 info....# Replicationrole:slave #角色狀態是slavemaster_host:127.0.0.1 #master的地址是127.0.0.1master_port:6378 #master連接埠號碼是6378master_link_status:up #跟master串連的狀態是up的master_last_io_seconds_ago:0master_sync_in_progress:0slave_repl_offset:323slave_priority:100slave_read_only:1connected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0....這裡說明主從就已經配置好了,很簡單吧。
5.驗證同步
[[email protected] ~]# redis-cli -p 6378127.0.0.1:6378> set s1 abc #在master建立兩個值,s1 s2OK127.0.0.1:6378> set s2 bcdOK127.0.0.1:6378> mget s1 s21) "abc"2) "bcd"127.0.0.1:6378> quit[[email protected] ~]# redis-cli -p 6379127.0.0.1:6379> get s1 #在slave中也能讀取剛才的s1 s2兩個值"abc"127.0.0.1:6379> get s2"bcd"127.0.0.1:6379> set s1 aaa #這裡slave無法寫,只能讀(error) READONLY You can‘t write against a read only slave.
6.進一步實驗,slave-slave
初始化一個6380的執行個體[[email protected] ~]# cd /root/redis-2.8.13/utils/[[email protected] utils]# ./install_server.sh Welcome to the redis service installerThis script will help you easily set up a running redis serverPlease select the redis port for this instance: [6379] 6380Please select the redis config file name [/etc/redis/6380.conf] Selected default - /etc/redis/6380.confPlease select the redis log file name [/var/log/redis_6380.log] Selected default - /var/log/redis_6380.logPlease select the data directory for this instance [/var/lib/redis/6380] Selected default - /var/lib/redis/6380Please select the redis executable path [/usr/local/bin/redis-server] Selected config:Port : 6380Config file : /etc/redis/6380.confLog file : /var/log/redis_6380.logData dir : /var/lib/redis/6380Executable : /usr/local/bin/redis-serverCli Executable : /usr/local/bin/redis-cliIs this ok? Then press ENTER to go on or Ctrl-C to abort.Copied /tmp/6380.conf => /etc/init.d/redis_6380Installing service...Successfully added to chkconfig!Successfully added to runlevels 345!Starting Redis server...Installation successful!同樣修改設定檔[[email protected] utils]# vi /etc/redis/6380.conf 添加如下內容slaveof 127.0.0.1 6379[[email protected] utils]# /etc/init.d/redis_6380 restartStopping ...Redis stoppedStarting Redis server...[[email protected] utils]# redis-cli -p 6380 info...# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:upmaster_last_io_seconds_ago:8master_sync_in_progress:0slave_repl_offset:29slave_priority:100slave_read_only:1connected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0...[[email protected] utils]# redis-cli -p 6379 info...# Replicationrole:slavemaster_host:127.0.0.1master_port:6378master_link_status:upmaster_last_io_seconds_ago:1master_sync_in_progress:0slave_repl_offset:1092slave_priority:100slave_read_only:1connected_slaves:1slave0:ip=127.0.0.1,port=6380,state=online,offset=85,lag=1 #在備狀態下,又串連了一個備master_repl_offset:85repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:84....
7.驗證同步
[[email protected] utils]# redis-cli -p 6380 mget s1 s21) "abc"2) "bcd"[[email protected] utils]# redis-cli -p 6378 shutdown[[email protected] utils]# redis-cli -p 6379 info...# Replicationrole:slavemaster_host:127.0.0.1master_port:6378master_link_status:down #跟master的串連已經掛掉了master_last_io_seconds_ago:-1master_sync_in_progress:0slave_repl_offset:1470master_link_down_since_seconds:7slave_priority:100slave_read_only:1connected_slaves:0master_repl_offset:477repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:476...[[email protected] utils]# redis-cli -p 6380 info...# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:down #表示跟6379的串連也掛掉了 master_last_io_seconds_ago:-1master_sync_in_progress:0slave_repl_offset:1master_link_down_since_seconds:65slave_priority:100slave_read_only:1connected_slaves:0master_repl_offset:0repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0...發現主掛掉之後,從庫仍然是可以讀的[[email protected] utils]# redis-cli -p 6380 get s1"abc"
8.添加認證
如果其他人知道我的IP和連接埠號碼就可以直接用來跟redis做主從同步了。不安全,下面來看一下如何設定密碼
[[email protected] utils]# vi /etc/redis/6378.conf 添加一行requirepass redis #這裡表示密碼就是redis[[email protected] utils]# /etc/init.d/redis_6378 startStarting Redis server...[[email protected] utils]# redis-cli -p 6378127.0.0.1:6378> get s1 #下次登入直接使用get命令就無法獲得值了(error) NOAUTH Authentication required.127.0.0.1:6378> auth redis #輸入密碼後,可以使用剛才的get命令了。OK127.0.0.1:6378> get s1"abc"
9.從庫配置認證
[[email protected] utils]# redis-cli -p 6379 info# Replicationrole:slavemaster_host:127.0.0.1master_port:6378master_link_status:down #從這個地方看出跟主的串連還是down的master_last_io_seconds_ago:-1master_sync_in_progress:0slave_repl_offset:1master_link_down_since_seconds:1076slave_priority:100slave_read_only:1connected_slaves:0master_repl_offset:1961repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:1960....開啟設定檔添加認證資訊[[email protected] utils]# vi /etc/redis/6379.conf 添加下面的資訊masterauth redis重啟一下備庫,這裡一定要重新啟動一下備庫[[email protected] utils]# /etc/init.d/redis_6379 restartStopping ...Redis stoppedStarting Redis server...狀態就變成up了[[email protected] utils]# redis-cli -p 6379 info | grep mastermaster_host:127.0.0.1master_port:6378master_link_status:upmaster_last_io_seconds_ago:9master_sync_in_progress:0master_repl_offset:1
10.同步驗證
[[email protected] utils]# redis-cli -p 6378127.0.0.1:6378> auth redisOK127.0.0.1:6378> set s3 abcd123OK127.0.0.1:6378> [[email protected] utils]# redis-cli -p 6379127.0.0.1:6379> get s3"abcd123"
介紹下面幾個參數
slave-read-only yes #表示從庫唯讀
repl-ping-slave-period 10 #從庫會發送ping確認跟主庫是否還可以互連
本文出自 “名字長一點會好記” 部落格,請務必保留此出處http://xiaoyiyi.blog.51cto.com/1351449/1705933
(四)redis 主從同步資料