启动两个redis实例,登录从服务器的redis,执行下面的命令,就配置完成了
slaveof <主ip> <主port>
配置完成后,执行 info replication 命令,就能够知道服务器的基本信息了
显示 "role:master" 是主服务器
显示 "role:slaveof" 是从服务器
1、设置主从后,主服务器可读可写;从服务器只能读,不能写。
2、主服务器加上密码之后,需要在从服务器的配置文件里加mastersauth password,主服务器的数据才能同步到从服务器。
3、当主服务器挂掉了,从服务器还是从服务器,这个时候就无法向redis中写数据了。
1、主服务器与从服务器建立连接
2、从服务器向主服务器发送进行数据同步的消息
3、主服务器收到数据同步的消息,将主服务器的数据进行持久化,把rdb文件发送到从服务器,从服务器拿到rdb文件进行读取
4、主服务器进行写操作后,收集所有收到的修改数据命令,执行完毕后,将新的所有收集到的修改命令一次传递给从服务器进行数据同步
全量复制:从服务器接收到数据库文件数据后,将期存起来并加载到内存中
增量复制:主服务器将新的所有收集到的修改命令一次传递给slave,完成同步
从服务器连接主服务器的时候,进行的时全量复制,之后就是主服务器主动传递给从服务器增量数据,是增量复制。
优点:读写分离,将Redis读操作分摊到多个节点,大大提高redis服务器的并发量
缺点:不支持容错,master宕机后没有可写节点,可能会数据丢失,较难支持扩容
在从服务器上再挂一从服务器,就起到了薪火相传的作用
slaveof <从ip> <从port>
当从中间的从服务器挂掉时,他下面的从服务器,不会再接收到同步信息;主服务挂掉了,从服务器还是从服务器,无法写数据了,主服务器启动后,仍然为主服务器
当主服务器挂掉之后,登录到从服务器,执行下面的命令,将从服务器变成主服务器
slaveof no one
这种方式是手动的,怎么变成自动的呢?那就要用哨兵模式了。
新建一个哨兵的配置文件sentinel.conf,加上下面的配置
sentinel monitor mymaster 127.0.0.1 6379 1
mymaster 代表哨兵服务的名称
127.0.0.1 代表主服务器的ip
6379 代表主服务器的端口号
1 代表有多少个哨兵认为主机挂掉了,才进行切换,这里是有一个哨兵认为主机挂掉了,就切换主机
启动哨兵:redis-sentinel /sentinel.conf
默认端口:26379
检测到主机挂掉,选择一台从服务器作为主服务器,另一个从服务器仍然作为从服务器,挂掉的主服务器变成挂掉的从服务器。挂掉的主服务器再次启动的时候,会变成从服务器。
1、选择优先级靠前的,也就是说slave-priorty,他的值越小,优先选为主服务器;slave-priorty是优先级的配置,当主服务器挂掉的时候,按照这个配置决定哪一个做从服务器。新版本中这个配置是replica-priorty.
2、选择偏移量大的,偏移量指的是跟主服务器同步数据的数量,同步的多的,优先选为主服务器;
3、选择runid最小的,每个redis实例启动之后会随机生成一个40位的runid,小的优先原为主机;
优点:
1、哨兵模式基于主从复制,因此主从复制的优点哨兵都具备
2、哨兵具备了主从切换和故障转移,因此集群有了更高的可用性
3、sentinel 哨兵主要用来监控redis主从,提高了redis 主从的可用性。
缺点:
1、Redis较难支持在线扩容,在线扩容比较复杂。
由于所有的操作都在主服务器上,然后同步到从服务器上,所以同步到从服务器的时候会有一定的延迟,当系统很忙的时候,延迟问题会更加严重,从服务器个数的增加,也会使这个问题更加严重。
在java开发的时候,修改数据库连接池的ip和端口配置为哨兵的ip和端口号,在实例化连接池的时候,指定名称为哨兵的名称,也就是mymaster。
无中心化集群配置
cluster-enabled yes 打开集群配置
cluster-config-file nodes-6379.conf 设置当前节点的配置文件名字
cluster-node-timeout 15000 设置节点超时时间
redis-cli --cluster create --cluster-replicas 1 ip1:port1 ip2:port2 ip3:port3 ip4:port4
这里面的1指的是以最简单的方式进行分配,分配原则:尽量保证每个主数据库在不同IP地址上,主库和从库不再一个ip地址上
redis-cli -c -p 6379 以集群的方式连接
cluster nodes 查看集群节点信息
原理
一个redis集群,包含16384个插槽,数据库中的每个键都属于这16384个插槽的其中一个,集群使用CRC16(KEY)%16384来判断属于哪个槽(插槽编号为0~16383)。
客户端只需要连接其中任意一个节点,就能查询到所有节点的数据,Redis集群中每个节点都保存了其他节点的插槽信息。当要进行数据存取的时候,将key按照公式计算后得到插槽编号,通过保存槽信息从配置中获取节点信息,然后再去对应得节点获取数据。
redis-cluster集群引入了主从复制模型,一个主节点对应一个或多个从节点,当主节点宕机的时候,就会启用从节点。当其它主节点 ping 一个主节点 A 时,如果半数以上的主节点与 A 通信超时,那么认为主节点 A 宕机了。
如果主节点 A 和它的从节点 A1 都宕机了,那么看配置文件中的配置clluster-require-full-converage 的值为yes,那么该集群挂掉,无法再提供服务;如果为no,该插槽数据不能使用了。
优缺点
优点:支持扩容,减轻压力
缺点:多键操作不支持,多键的redis不支持事务