Redis 主從同步配置


主從功能:

為了防止 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 位置 )

復制代碼
[root@master ~]# vim /usr/local/redis/redis.conf

daemonize yes
port 6379
timeout 300
loglevel verbose
pidfile /usr/local/redis/logs/redis.pid
logfile /usr/local/redis/logs/redis.log

requirepass redispassword
databases 16

save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb

dir /usr/local/redis/data/

appendonly no
appendfilename appendonly.aof
appendfsync everysec

no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

[root@master ~]# redis-server /usr/local/redis/redis.conf

[root@master ~]# netstat -anpt | grep redis
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1154/redis-server

[root@master ~]# 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

復制代碼
[root@slave ~]# cd /usr/local/src/
[root@slave src]# tar zxf redis-2.6.10.tar.gz
[root@slave src]# cd redis-2.6.10
[root@slave redis-2.6.10]# make ; make install

[root@slave ~]# mkdir /usr/local/redis
[root@slave ~]# cd !$
cd /usr/local/redis
[root@slave redis]# cp ../src/redis-2.6.10/redis.conf .
[root@slave redis]# cp ../src/redis-2.6.10/src/redis-cli .
[root@slave redis]# cp ../src/redis-2.6.10/src/redis-server .
[root@slave redis]# cp ../src/redis-2.6.10/src/redis-sentinel .
[root@slave redis]# cp ../src/redis-2.6.10/src/redis-benchmark .
[root@slave redis]# cp ../src/redis-2.6.10/src/redis-check-aof .
[root@slave redis]# cp ../src/redis-2.6.10/src/redis-check-dump .

[root@slave redis]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
[root@slave redis]# sysctl vm.overcommit_memory=1
[root@slave redis]# mkdir data logs
[root@slave redis]# vim redis.conf

daemonize yes
port 6379
timeout 300
loglevel verbose
pidfile /usr/local/redis/logs/redis.pid
logfile /usr/local/redis/logs/redis.log

#requirepass redispassword
databases 16

save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb

dir /usr/local/redis/data/

appendonly no
appendfilename appendonly.aof
appendfsync everysec

no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

masterauth redispassword
slaveof 192.168.1.88 6379
復制代碼

## 直接復制 Master 的配置文件,添加最后兩行即可

[root@slave ~]# redis-server /usr/local/redis/redis.conf

[root@slave ~]# netstat -anpt | grep redis
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 3442/redis-server
tcp 0 0 192.168.1.80:50799 192.168.1.88:6379 ESTABLISHED 3442/redis-server

## 可以看到啟動成功,並且建立了一條到 Master 的連接

[root@slave ~]# ls /usr/local/redis/data/
dump.rdb

## data 目錄下也有了 master 同步過來的數據( 雖然主庫並沒有寫入數據 )

二、測試 Redis 主從

復制代碼
[root@master ~]# redis-cli -a redispassword
redis 127.0.0.1:6379> keys *
(empty list or set)
redis 127.0.0.1:6379> set name wang
OK
redis 127.0.0.1:6379> set id 8
OK
redis 127.0.0.1:6379> keys *
1) "id"
2) "name"
redis 127.0.0.1:6379> quit
復制代碼

## 這是在 master 上的操作,-a 指定認證密碼

復制代碼
[root@slave ~]# redis-cli
redis 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 也被刪除。
## 主從同步完成 !

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM