Redis 的主从复制配置首先要理解Redis主从结构的特性。html
Redis master能够链接多个Slave,一个Slave能够拥有master身份被多个slave连接,也就是说,redis每一个节点的角色能够同时是master和slave。java
redis 复制在 slave 这一端也是非阻塞的。在配置文件里面有 slave-serve-stale-data 这一项,若是它为 yes ,slave 在执行同步时,它可使用老版本的数据来处理查询请求,若是是 no ,slave 将返回一个错误。在完成同步后,slave 须要删除老数据,加载新数据,在这个阶段,slave 会阻止链接进来。redis
使用复制能够避免 master 由于须要把所有的数据集写入磁盘而形成的开销,所以能够把 master 中 save 配置项所有注释掉,不让它进行保存,而后配置 slave ,让 slave 保存。虽然有这个特性,可是咱们好像通常不这么作。数据库
关于基本配置项工具
daemonize no 说明:是否把redis-server启动在后台,默认是“否”。若改为yes,会生成一个pid文件。
pidfile /var/run/redis.pid 说明:redis-server的pid文件。
port 6379 说明:redis-server的端口号
dbfilename dump.rdb 说明:数据库文件的位置,最好添加绝对路径,若不添加时在启动用户的home目录下。
loglevel verbose 说明:日志级别,有四种,debug,verbose,notice,warning。
logfile stdout 说明:日志的输出文件,默认是标准输出。例如:logfile /tmp/redis.log
咱们这里使用进程来模拟上台主机
ui
主机1:127.0.0.1:9001 (master)spa
主机2:127.0.0.1:9002 (slave1).net
主机3:127.0.0.1:9003 (slave2)命令行
打开每一个redis的redis.conf,主要修改以下几项,如下除了端口不一致,其余的都相同debug
port 9001 --端口 min-slaves-to-write 3 --用于报告master被报告超过3个slave报告宕机时触发sentinel去调整集群 masterauth pass123456789 --密码,在主从复制中开启密码 requirepass pass123456789 --master密码,配置成同样的,便于管理 slave-read-only no --设置为no,不然只能单向复制(master->slave)
而后按照命令启动各自的redis-server
redis-server redis.conf
接下来使用终端命令行工具,登陆启动每一个redis-server
redis-cli -h 127.0.0.1 -p 9001 -a pass123456789
redis-cli -h 127.0.0.1 -p 9002 -a pass123456789
redis-cli -h 127.0.0.1 -p 9003 -a pass123456789
而后让9001做为9002和9003的master
在9002和9003客户端执行
slaveof 127.0.0.1 9001
经过9001验证命令
set testKey1 '1234'
而后再9002,9003执行以下命令,获得的值和 “1234”同样,那么意味着配置成功
get testKey1
但问题来了,master能够闲slave写数据,但slave写的数据没法同步到master,目前只实现了单向同步,对于双向同步,如何解决呢?
答案是让master委屈求全和slave作朋友,做为一种平等的关系,这种关系的判断是,双方你情我愿同样,互相是对方的slave,同时也是对方的master。
咱们让master成为slave的朋友,很简单.
master执行以下命令
exit
redis-cli -h 127.0.0.1 -p 9001 -a pass123456789
slaveof 127.0.0.1 9002
slaveof 127.0.0.1 9003
之因此重启master,主要问题是master可能会遭遇一些意想不到的问题。
以上即可实现主从双向同步复制。