標籤:
主從功能:
為了防止 Redis 磁碟損壞,導致資料丟失,Redis 提供了複製功能,將一個主要資料庫的資料自動同步到從資料庫,防止資料丟失。
同時還可以配置一主多從來分擔主壓力,主只接受寫的操作,將讀的操作給從來實現;其中從庫也可以接受其它從庫的同步請求。
如果主、從因為網路原因出現串連斷開,網路正常後從可以自動連接主,串連成功後主會將完整的資料同步一次給從,保證資料一致性。
主從原理:
1、從資料庫啟動後,向主要資料庫發送 SYNC 命令
2、主要資料庫收到 SYNC 命令後開始儲存快照,在此期間所有發給主要資料庫的命令都被緩衝起來
3、快照儲存完後,主要資料庫把快照和緩衝的命令一起發給從資料庫
4、從資料庫儲存主要資料發來的快照檔案,並依次執行主要資料庫發來的緩衝命令
在同步過程中,主、從資料庫都不會阻塞:
-----> 主庫可以繼續接受用戶端提交的查詢或修改請求;
-----> 從庫預設使用同步之前的資料繼續響應用戶端發來的命令
一、配置 Redis 主從
## 這裡可以使用一台伺服器啟動兩個 Redis 服務,只需指定不同的設定檔,不同的連接埠即可
## 為了加入防火牆規則,我使用兩台伺服器來完成
Redis Master :192.168.1.88
Redis Slave :192.168.1.80
1、Redis Master ( 這裡不寫安裝過程了,寫到 Slave 位置 )
[[email protected] ~]# vim /usr/local/redis/redis.confdaemonize yesport 6379timeout 300loglevel verbosepidfile /usr/local/redis/logs/redis.pidlogfile /usr/local/redis/logs/redis.logrequirepass redispassworddatabases 16save 900 1save 300 10save 60 10000rdbcompression yesdbfilename dump.rdbdir /usr/local/redis/data/appendonly noappendfilename appendonly.aofappendfsync everysecno-appendfsync-on-rewrite yesauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb[[email protected] ~]# redis-server /usr/local/redis/redis.conf[[email protected] ~]# netstat -anpt | grep redistcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1154/redis-server[[email protected] ~]# iptables -I INPUT 4 -s 192.168.1.80 -p tcp --dport 6379 -j ACCEPT
2、Redis Slave
:https://code.google.com/p/redis/downloads/list
[[email protected] ~]# cd /usr/local/src/[[email protected] src]# tar zxf redis-2.6.10.tar.gz[[email protected] src]# cd redis-2.6.10[[email protected] redis-2.6.10]# make ; make install[[email protected] ~]# mkdir /usr/local/redis[[email protected] ~]# cd !$cd /usr/local/redis[[email protected] redis]# cp ../src/redis-2.6.10/redis.conf .[[email protected] redis]# cp ../src/redis-2.6.10/src/redis-cli .[[email protected] redis]# cp ../src/redis-2.6.10/src/redis-server .[[email protected] redis]# cp ../src/redis-2.6.10/src/redis-sentinel .[[email protected] redis]# cp ../src/redis-2.6.10/src/redis-benchmark .[[email protected] redis]# cp ../src/redis-2.6.10/src/redis-check-aof .[[email protected] redis]# cp ../src/redis-2.6.10/src/redis-check-dump .[[email protected] redis]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf[[email protected] redis]# sysctl vm.overcommit_memory=1[[email protected] redis]# mkdir data logs[[email protected] redis]# vim redis.confdaemonize yesport 6379timeout 300loglevel verbosepidfile /usr/local/redis/logs/redis.pidlogfile /usr/local/redis/logs/redis.log#requirepass redispassworddatabases 16save 900 1save 300 10save 60 10000rdbcompression yesdbfilename dump.rdbdir /usr/local/redis/data/appendonly noappendfilename appendonly.aofappendfsync everysecno-appendfsync-on-rewrite yesauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbmasterauth redispasswordslaveof 192.168.1.88 6379
## 直接複製 Master 的設定檔,添加最後兩行即可
[[email protected] ~]# redis-server /usr/local/redis/redis.conf[[email protected] ~]# netstat -anpt | grep redistcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 3442/redis-servertcp 0 0 192.168.1.80:50799 192.168.1.88:6379 ESTABLISHED 3442/redis-server
## 可以看到啟動成功,並且建立了一條到 Master 的串連
[[email protected] ~]# ls /usr/local/redis/data/dump.rdb
## data 目錄下也有了 master 同步過來的資料( 雖然主庫並沒有寫入資料 )
二、測試 Redis 主從
[[email protected] ~]# redis-cli -a redispasswordredis 127.0.0.1:6379> keys *(empty list or set)redis 127.0.0.1:6379> set name wangOKredis 127.0.0.1:6379> set id 8OKredis 127.0.0.1:6379> keys *1) "id"2) "name"redis 127.0.0.1:6379> quit
## 這是在 master 上的操作,-a 指定認證密碼
[[email protected] ~]# redis-cliredis 127.0.0.1:6379> keys *1) "id"2) "name"redis 127.0.0.1:6379> get name"wang"redis 127.0.0.1:6379> get id"8"redis 127.0.0.1:6379> set cc 123(error) READONLY You can‘t write against a read only slave.redis 127.0.0.1:6379> quit
## 這是在從上的操作,其中 slave 沒有設密碼所以不用 -a 指定,可以查到同步過來的 keys ,因為要保持資料一致性,所以不能寫入。
## 如果在主執行 del name 那麼從上的 name 也被刪除。
## 主從同步完成 !
Redis 主從同步配置