1.使用目的:
使用主从目的,是为了缓解单台redis服务器压力,是redis服务器职能分散,从而相应客户端效率更高。
2.主从分工:
master服务器只要负责接受从客户端的增、删、改请求,而slave则负责客户端的读请求和数据持久化。(是否让slave负责读请求可根据实际情况决定)
3.主从复制工作原理:
无论是初次连接还是重新连接, 当建立一个从服务器时, 从服务器都将向主服务器发送一个 SYNC 命令。
接到 SYNC 命令的主服务器将开始执行 BGSAVE (fork一个子进程,将数据库快照保存到文件中), 并在保存操作执行期间, 将所有新执行的写入命令都保存到一个缓冲区里面。
当 BGSAVE 执行完毕后, 主服务器将执行保存操作所得的 .rdb 文件发送给从服务器, 从服务器接收这个 .rdb 文件, 并将文件中的数据载入到内存中。
之后主服务器会以 Redis 命令协议的格式, 将写命令缓冲区中积累的所有内容都发送给从服务器。
此后,Master继续将所有已经收集到的修改命令,和新的修改命令依次传送 给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。从master到slave的同步数据的命令和从 client发送的命令使用相同的协议格式。
如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。
如果master同时收到多个 slave发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给所有slave。
4.主从服务配置:
主服务:因为主服务不负责持久化, 需要关闭掉redis.conf 中的save 和 appendonly 设置。
从服务: 在redis.conf中配置 slaveof 127.0.0.1 6379
本人测试机设置:
启动脚本,从redis安装目录下,copy redis_init_script redis_6379,master不需要任何修改,slave只需要修改相应端口设置即可
配置文件
配置文件具体设置,master因为不提供持久化功能,需要关闭 save设置和appendonly设置即可,当然因为已经有启动脚本了,也应该设置成后台运行,下面是从节点需要修改的几处设置:
daemonize yes #后台执行 pidfile /var/run/redis_6381.pid #服务启动后生成进程文件 port 6381 #服务端口号 loglevel debug #日志级别 logfile /var/log/redis_6381.log #日志路径 save 900 1 save 300 10 save 60 10000 #snapshot 方式持久化策略 dir /var/redis/6381 #持久化文件存放路径 slaveof 127.0.0.1 6379 #master节点的IP和port appendonly yes #aof持久化方式开启 appendfsync everysec #aof持久化策略
redis server放置路径,放在usr/local/bin 下是因为 这个路径已经设置在PATH中,方便到处执行,而不用特意进到redis安装目录下运行
redis持久化目录
5.启动与测试:
本机设置 6379为master,6380和6381为slave。
master启动
master启动时log
可以看出,此时没有客户端连接server,也没有slave节点
使用客户端连接master server,并设置数据:
可以看出,此时Replication的状态,为无slave连接的
查看master持久化目录下状态,依然是空目录,没有做过持久化:
然后启动6380:
slave启动后,master日志为:
slave 6380的日志为:
此时的持久化存放目录状态为:
可以看出,在slave向master发出SYNC时,master对当前内存做了快照并且存放在文件中,并且将文件传送给了slave,slave将文件内容读入了内存中。
再使用同样的方式启动 6381,会看到此时master 又做了一次BGWRITE操作,同样把数据同步到了6381,,看下此时的持久化目录状态:
可以看出,此时的master 只将内存快照文件传送给了6381 而没有传送给6380,那是否6380的文件内容就会比6381的少呢?不会,因为在6380启动后,做完第一次同步后,之后每次master的增删改操作都会同步到6380中。