主从服务一般分**Master(主机)和Slaver(从机)**两个角色;Master以写为主,Slaver以读为主。Slave会自动同步Master的数据。
下列案例都需要有多台redis-server服务启动,我们可以把redis.conf文件拷贝多份,这里我准备弄三个redis服务,所以拷贝了3个redis.conf,命名规则为 redis端口号.conf,如下:
redis6379.conf
redis6380.conf
redis6381.conf
daemonize yes # 后台运行,windows不配
pidfile "文件存放的地方/redis端口号.pid" # 存放pid的文件,windows不配
port "对应的端口" # 端口号
logfile "redis端口号.log" # 日志文件存放地方
dbfilename "redis端口号.log" # rdb备份文件名称
配置好上面的操作我们就可以开三个终端把三个redis一一启动,并使用redis-cli连接各自的的服务。就像下面一样,请右键打开新窗口查看图片
上面我是在linux中,windows可能需要6个窗口,因为windows使用命令启动的Redis会占用一个终端,关闭终端就等于关闭Redis。
info replication
方式一:使用 【 slaveof 主库ip 主库端口 】 命令来跟随一个主库,例如上面 6380跟随 6379,只需要在6379客户端上输入下面命令:
slaveof 127.0.0.1 6379
但是这种方式在这个6380这个Redis挂掉后重启会恢复Master角色,也就是不跟随6379这个库了。
方式二:配置文件
修改配置文件中 slaveof 属性
################################# REPLICATION #################################
# slaveof
例如6380是6379的从库,则案例 slaveof 127.0.0.1 6379
如果一个库不想跟从其他库,可以使用下面命令:
slaveof no one
1、如果一个库一但跟随一个主库会立即丢弃自己的所有数据并同步主库的数据。
2、从库无法执行写类型的命令,只能执行读类型的命令
3、如果从库跟随的主库挂了,那么他会一直连接主库,等待其归来
实现上面的操作,我们只需要在 6380和6381的客户端中输入 slaveof 127.0.0.1 6379 即可。然后你在6379做的任何更新元素操作都会同步到6380和6381
上面的一主二从其实不限定于只有二从,可能会有很多从。这个时候一丛的压力就很大了, 要应付这么多从库的同步操作,压力相当之大,链表这个方式就减轻了这个问题,每个人找自己的主库同步,一个主库只有一个从库。
一主二从的方式最大的问题就是主库挂了没有主库无法做写类型的操作,而哨兵模式解决的就是主库挂了之后从所有的从库中通过投票的方式选取一个从库变成主库然后其他从库把主库设置成这个新主库。
实现步骤:
①. 新建 sentinel.conf 文件(名字不要写错),并加入如下配置:
# 标准写法
sentinel monitor 自定义名称 主库ip 主库端口 1
# 我们的案例,我们使用上面一主二从的案例,6379为主库
sentinel monitor sentinelTest 127.0.0.1 6379 1
上面的意思是 127.0.0.1 下 6379 为Master(主机),后面的1 表示主库挂了之后从所有的从库投票选取一个从库来做主库,其他从库跟随这个库。
②. 运行哨兵程序:
sudo redis-sentinel sentinel.conf
③. 启动一主二从,然后模拟主机(6379)挂掉,等半分钟左右,哨兵就开始从从库中选取主库了。
④. 这里说一个注意点,就是哨兵模式选取新主库之后,他会修改其他跟随他的从库的配置文件,加入我上面说的 slaveof 新主库ip 新主库端口 ,所以你的从库重启也是跟着这个新库的。
slave(从库)启动成功之后连接到Master(主库)之后会发送一个sync命令,Master接到命令之后会把数据后台存盘,后台执行完之后将数据文件传给slave就可以完成第一次同步。如果后面在Master执行了写类型的操作也会将命令传给slave,来使他们同步。
要注意的是slave重连Master时一定会清空自己的数据并发送同步命令。
1、读写分离,写操作交给Master,读操作交给 Slaver,可以达到分散压力。
2、容灾备份,现在等于我有了多台相同的Redis,即是Master坏掉了我也不用担心数据丢失,可以直接拿Slaver机器上的数据。
因为只能在master上面写,所以其他的slave都回来找master同步,这样一定会产生一些延迟,假如有多台从库,延迟可能会更严重。