Redis是一种内存数据库,内存读写都非常的快,一般都是写少读多,但是内存再快也扛不住大量用户同时访问,因此Redis在2.8版本之前
推出了主从模式
用于解决读的性能问题。和MySQL主从复制一样,Redis也支持主从复制
,Redis主从模式通常是一个主服务器Master和多个从服务器Slaver,每个从服务器上还可以再挂从服务器,一般主服务器用于写,从服务器用于读。Redis主从复制分为全量同步和增量同步,全量复制一般发生在slaver初始化时如第一次启动或者master服务器宕机后重新连接上master服务器。
优点:
缺点:
4. 如果主节点故障下线,那么需要显式的手动将某个从服务器升级为主服务器。
5. 因为只有主服务器可以进行同时读写操作,所以客户端只能连接主服务器,在创建redis实例的时候需要指定主服务器的ip地址和端口号,一旦主服务器宕机被切换成别的从服务器时那么必须手动修改master服务器的ip和端口,然后重新启动项目。
Redis全量复制一般发生在Slaver初始化阶段,这时Slave需要将Master上的所有数据都复制一份,具体步骤如下:
# 查看redis的版本号
redis-server -v
# 查看redis的配置
info
# 查看redis配种中的集群相关配置
info replication
# 关闭redis服务并退出客户端
shutdown
这里是使用的一台计算机启动多个redis实例的方式来实现主从模式的,所以需要创建多个配置文件,并且需要修改每个配置文件的端口号、日志文件名、数据库文件名等参数,如果使用三台虚拟机来配置主从模式这些参数都不需要修改,只需要在从服务器配置中增加slaveof
这一项配置即可实现主从复制功能。
bind 0.0.0.0
port 6379
logfile "6379.log"
dbfilename "dump-6379.rdb"
# 是否以守护线程方式启动,yes表示是,no表示否即前台启动。
daemonize yes
# 是否压缩文件
rdbcompression yes
# redis 密码
requirepass 123456
# 设置复制缓冲区大小
repl-backlog-size 1mb
bind 0.0.0.0
port 6380
logfile "6380.log"
dbfilename "dump-6380.rdb"
daemonize yes
rdbcompression yes
# 主从复制对应的命令
slaveof 192.168.1.5 6379
masterauth 123456
bind 0.0.0.0
port 6381
logfile "6381.log"
dbfilename "dump-6381.rdb"
daemonize yes
rdbcompression yes
slaveof 192.168.1.5 6379
masterauth 123456
redis-server /usr/local/etc/redis/redis-master-6379.conf
redis-server /usr/local/etc/redis/redis-slaver-6380.conf
redis-server /usr/local/etc/redis/redis-slaver-6381.conf
ps -ef | grep redis
# 如果是三台虚拟机就需要指定每个ip地址, -a表示密码
redis-cli -h 127.0.0.1 -p 6379 -a 123456
redis-cli -h 127.0.0.1 -p 6380
redis-cli -h 127.0.0.1 -p 6381
info replication 命令用于查看info配置中的集群replication相关配置。
从服务器默认情况下只能读不能写,但是如果非要写可以设置参数replica-read-only no来开启, 注册模式下从服务器写没有多大意义,而且写到从服务器上的数据又不能反向同步到主服务器。
redis默认是使用rdb
方式进行持久化操作的,如果想取消持久化操作可以使用 config set save ""
来设置。
主节点设置一个key, 两个从节点都可以获取到值,在主节点执行shutdown命令来关闭主节点, 此时再从从节点获取仍然能获取到。
重新启动master服务,然后连上master服务器,再获取age值,此时为nil而且两个从服务器中的age值都丢失了。
slaver服务器为什么会丢失数据呢?
当master服务器挂掉重启之后,从服务器会丢掉所有数据,然后从master服务器以全量同步方式重新加载一份最新的数据,因master服务器上的数据没有做持久化操作master上就直接丢掉了数据这也导致从服务器上的数据丢失。所以主从模式主服务器必须设置成持久化以防数据丢失
。
# 从服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃
> slaveof no one
>
# 将当前服务器设置为指定服务器的从属服务器(slave server)。
slaveof 192.168.200.108 6379