1. 主从复制
- 主从复制,就是主机数据更新后根据配置和策略,自动同步到备机的 master/slaver 机制,Master 以写为主,Slave 以读为主。
1.1 用处
- 读写分离,性能扩展
- 容灾快速回复
1.2 Redis主从复制(Windows版本操作)
以windows服务形式提供服务(搭建一个简单的主从复制 M:6379;s:6380、6381)。
根据这篇文章操作:Windows下Redies安装并设置成本地服务
- 这样本地就有 redis服务了(作为主服务),然后将解压后的 redis 复制两份,分别为 redis6380、redis6381(作为从服务)。
#在各自文件夹下打开(别忘了用管理员)设置服务名
redis-server.exe --service-install redis.windows.conf --loglevel verbose --service-name Redis6380
redis-server.exe --service-install redis.windows.conf --loglevel verbose --service-name Redis6381
-
然后修改端口和配置主从即可,在两个复制的文件夹下打开 redis.windows.conf(配从不配主,只修改从服务配置)
#分别将端口修改为 port 6380 port 6381 #分别配置主服务器 slaveof 127.0.0.1 6379
-
打开服务查看是否开启
- 打开Redis可视化工具并连接(这里用的是RedisDesktopManager)
-
测试方式:直接连接redis6379,写入一个string,看看redis6380和redis6381是否有该值。
如图:主服务写入
打开两个从服务,可以看到都写入了。
主从复制演示就结束了。
1.3 复制原理
- 每次从机联通后,都会给主机发送sync指令。
- 主机立刻进行存盘操作,发送 RDB 文件,给从机。
- 从机收到 RDB 文件后,进行全盘加载。
- 之后每次主机的写操作,都会立刻发送给从机,从机执行相同的命令。
1.4 主从复制之薪火相传
- 上一个 slave 可以是下一个 slave 的 Master,slave同样可以接受其他slave的连接和同步请求,那么该slave为了链条中下一个的master,可以有效减轻master的写压力,去中心化降低风险。
- 用 slaveof <ip> <port>
- 中途变更转向:会清除之前的数据,重新建立拷贝最新的。
- 风险是一旦某个 slave 宕机,后面的 slave 都没法备份。
1.5 哨兵模式(sentinel)
- 反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。
1.5.1 配置哨兵(Windows下)
-
调整为一主二仆模式
-
自定义的 /redis 目录下新建 sentinel.conf 文件
-
在配置文件中填写内容:
sentinel monitor mymaster 127.0.0.1 6379 1
-
其中 mymaster 为监控对象起的服务器名称,1为至少有多少个哨兵同意迁移的数量。
-
先启动 redis 的主从服务器(windows版本看上面的操作,因为之前设置成了服务,直接启动三个服务就行。)
-
从上面看到 master(6379),slave(6380、6381)都启动了,然后在redis目录下cmd进入,执行命令。这样我们的哨兵就启动了。
redis-server.exe sentinel.conf --sentinel
- 然后把主服务器宕机,可以看见 slave 6380 就变成了 master。
1.5.2 故障恢复过程
-
新主登基
从下线的主服务的所有从服务里面挑选一个从服务,将其转成主服务。
选择条件依次为:
1、选择优先级靠前的(优先级在 redis.conf 中 slave-priority 100)。
2、选择偏移量最大的(偏移量是指获得原主数据最多的)。
3、选择runid最小的从服务(每个redis实例启动后都会随机生成一个 40位的 runid)。
-
群仆俯首
挑选出新的主服务之后,sentinel 向原主服务的从服务发送 slaveof 新主服务的命令,复制新 master
-
旧主俯首
当已下线的服务重新上线时,sentinel 会向其发送 slaveof 命令让其成为新的主从。
2. 集群
- Redis 集群实现了对 Redis 的水平扩容,即启动 N 个 redis节点,将整个数据库分部存储在这N个节点中,每个节点存储总数据的1/N。
- Redis 集群通过分区(partition)来提供一定程度的可用性(avaliability):即使集群中有一部分失效或者无法进行通讯,集群也可以继续处理命令请求。