1.单点故障 2.容量有限 3. 压力
主从复制、读写分离会带来数据一致性问题
1.通过强一致性来解决,即主redis 进行阻塞,直到从redis写成功。
强一致性带来阻塞问题,可能会等待很久
1.通过异步方式解决强一致性问题,但是会丢失一部分数据
弱一致性会带来数据丢失问题
1.通过类似kafka 可靠集群来保证最终数据一致性
在使用 Redis 复制功能时的设置中,强烈建议在 master 和在 slave 中启用持久化
任何时候数据安全性都是很重要的,所以如果 master 使用复制功能的同时未配置持久化,那么自动重启进程这项应该被禁用
多实例redis
复制redis文件夹,修改redis.windows.conf 文件,修改6379端口,注释掉 bind 127.0.0.1(也可以不注释)
打开cmd,定位到当前实例目录,输入redis-server redis.windows.conf
打开redis-cli ,开始进行主从设置。
打开cmd ,输入 redis-cli -h 127.0.0.1 -p 6380 或者 redis-cli -p 6380
6379 主,6380、6381为从
在6380、6381 redis-cli输入 slaveof localhost 6379 (老版本,新版本 REPLICAOF localhost 6379)
主可以写,但从只能读
数据同步
停掉6380,然后向主服务器中添加key,再启动6380,启动的时候使用从主服务器进行复制
redis-server redis.windows.conf --replicaof localhost 6379 或 redis-server redis.windows.conf --slaveof localhost 6379
停止追随 replicaof no one 或 slaveof no one
即当主库挂掉后,手动切换一台从库为主库,同步其余从库重新追随。
slave-serve-stale-data yes 从库数据同步过程中是否支持查询,yes 支持一边同步一边查询,no 只有跟主redis同步完才支持查询
slave-read-only yes 从库是否只读
repl-diskless-sync no 是否使用磁盘方式传输数据,yes为使用网络。使用网络则直接使用网络传输。
repl-backlog-size 1mb 积压数据大小。redis主库会维护一个队列,当从库挂掉一段时间再恢复的时候,如果修改的数据大小大于设置的值,就使用rdb进行恢复。否则使用维护的队列中的数据。
自动选举master 机制
新建配置文件,
port 6385
sentinel monitor mymaster 127.0.0.1 6379 2
启动哨兵 redis-server redis.windows-sentinel.conf --sentinel
会显示出所有的 slave 从库
当主库挂掉时,其它从库又没有写的能力,那是怎么保持数据一致性的呢
min-slaves-to-write
min-slaves-max-lag <秒数> Redis master 会记得上一次从每个 slave 都收到 ping 的时间。用户可以配置一个最小的 slave 数量,使得它滞后 <= 最大秒数
如果条件不满足,master 将会回复一个 error 并且写入将不被接受。这时候哨兵会重新选出master 库,进行写入以及主从同步,最大程度保证数据丢失的比较少