一、主从模式(也有称为复制的)
主从模式在其他如mysql的数据库中应该也是有相同原理的应用,大致也可称为读写分离;其中又涉及主数据库和从数据库。
写数据库一般为主数据库,读数据库则为从数据库。
目前作者所涉及的项目大部分也都是读为多,通过读写分离,可以有效将负载分担到不同配置的服务中(由于不清楚读写应该如何合理分配CPU、内存、硬盘等,就不乱误导人了)。
因为上述的原因,一般从数据库会多一些
缺点:由于写数据库的写入操作和分发给从服务器的同步操作是异步进行的,所以存在主从数据不一致的可能性
* 如果只是一台主数据库,多台从数据库,则无法保证高可用性(需要手动维护,切换主数据库)
大致的原理:
1、主数据库(写)是正常配置
2、在从数据库中配置跟随的主数据库
3、主数据库接收到sync指令后,通过RDB快照当前的数据库,结束后发送给从服务器,且同时创建一个队列来保存快照创建期间以及之后产生的操作
4、从数据库接收到快照后,在本地执行;且接收主数据库队列的增量同步数据
5、所有写的操作都通过主数据库,而主数据库通过异步执行的方式向从服务器推送增量数据进行同步
6、大部分的读操作都从从数据库中进行
7、虽然redis是单线程的,但是不代表所有的操作都是单线程,只是主线程是单线程模式。而为了保持redis的高性能读写,主数据的写入操作和从数据库之间的数据同步是异步进行的
如何配置:
配置文件中增加(仅从数据库配置):
5.0之后:
REPLICAOF localhost 6379
之前
SLAVEOF localhost 6379
主数据库挂掉的话,只能手动切换,取消从服务的命令
REPLICAOF no one
二、哨兵模式
顾名思义,哨兵就是站岗-监控的意思。那么监控什么呢?这就要从一主多从说起,一个主数据库如果崩溃了,那么服务就都中断了,那么哨兵相对应的就是解决这个问题。
当主数据库挂了,可以通过哨兵监控(也可以用守护线程来帮助理解),将从服务器转化为主服务器。哨兵之间也可以互相监控。
配置:
1、我这边是直接用源码提供的util目录中的install脚本,安装了3个端口的redis-server服务,参考:https://www.cnblogs.com/gabin/p/13652357.html
2、在/etc/redis/对应的配置文件中增加
sentinel monitor master 127.0.0.1 6379 2
最后一个数字表示投票选举新的主节点的时候,最少的投票数量
3、然后在/etc/init.d/对应的配置中,追加--sentinel 启动
4、重启服务:service redis_6XXX restart
ps:哨兵模式下,会自动修改配置文件,且默认应该是轮询模式,看日志,服务挂掉之后并没有非常实时地切换主节点
三、集群(Cluster)模式
可以将集群模式当做是在哨兵模式的基础上,增加了水平扩展和切片的功能。
即使采用了哨兵模式,系统还是可能存在数据量越来越大的情况,这种情况下,可能需要对数据进行服务端切片(客户端切片一般指,不同的客户端根据需要连接不同的redis数据库)
集群模式实现了服务端的分片功能
- 客户端分区就是在客户端就已经决定数据会被存储到哪个redis节点或者从哪个redis节点读取。大多数客户端已经实现了客户端分区。
- 代理分区 意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分区规则决定请求哪些Redis实例,然后根据Redis的响应结果返回给客户端。redis和memcached的一种代理实现就是Twemproxy
- 查询路由(Query routing) 的意思是客户端随机地请求任意一个redis实例,然后由Redis将请求转发给正确的Redis节点。Redis Cluster实现了一种混合形式的查询路由,但并不是直接将请求从一个redis节点转发到另一个redis节点,而是在客户端的帮助下直接redirected到正确的redis节点。
上述都是比较粗浅的认知,待补充大致的原理部分