2、用户登陆成功后,在客户端用JavaScript,使用定时器,每间隔固定时间(比如20秒),通过Ajax异步发送请求服务器某个页面,或者WebService之类的接口。这就是所谓的心跳请求。
3、服务器收到用户的心跳请求后,更新用户最后一次联系服务器的时间。
这样服务器检查超时的时候,实际上就可以把当前时间,减去用户最后一次联系服务器的时间,如果超过一个指定值,比如1分钟,那就认为这个用户离线了。
PS:原理很简单,但要设计一个高效的机制,还是要多考虑实现的算法,特别是服务器端的在线列表,和检查超时的机制。我曾经在几年前做了一个实现,后来重写了N遍,才发现了一个相对比较合理的方法。心跳线主要是用于做双机热备的时候,联系阵列柜之间的两台服务器网卡间的跳线。起到服务器同步的作用。
我看到过的,有一根的,有两根的。一根的一般是联千兆网卡的,两根的还有一根是联串行总线的。这第二根起冗余作用。
其实主要是系统要支持,我知道win 2000 advane server 支持。但要做成cluster(集群)。
它就是把两个服务器做成对等网的网线,(但win 2000 advane server 不这么看)但是价格很贵哦,Dell 的这么一根线要300RMB
它实现的效果是双机热备,原理说白了就是一台不能工作了,另一个上,还有很多重要部门,有好几套双机热备,也就是说这两个服务器是一个集群,联到陈列上,后面还有集群还联到陈列上。
这是我的理解Redis的主从同步分为: 完整重同步(full resynchronization)
部分重同步(partial resynchronization)
有两种情况下是完整重同步:
slave连接上master第一次复制的时候;
如果当主从断线,重新连接复制的时候有可能是完整重同步
1从服务器连接主服务器,发送SYNC命令
2主服务器接收到SYNC命名后,开始执行bgsave命令生成RDB文件并使用缓冲区记录此后执行的所有写命令
3主服务器basave执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令
4从服务器收到快照文件后丢弃所有旧数据,载入收到的快照
5主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令
6从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令
用于处理断线后重复制的情况,先介绍几个用于部分重同步的部分
runid(replication ID),主服务器运行id,Redis实例在启动时,随机生成一个长度40的唯一字符串来标识当前节点
offset,复制偏移量。主服务器和从服务器各自维护一个复制偏移量,记录传输的字节数。当主节点向从节点发送N个字节数据时,主节点的offset增加N,从节点收到主节点传来的N个字节数据时,从节点的offset增加N
replication backlog buffer,复制积压缓冲区。是一个固定长度的FIFO队列,大小由配置参数repl-backlog-size指定,默认大小1MB。需要注意的是该缓冲区由master维护并且有且只有一个,所有slave共享此缓冲区,其作用在于备份最近主库发送给从库的数据
当slave连接到master,会执行PSYNC <runid> <offset>发送记录旧的master的runid(replication ID)和偏移量offset,这样master能够只发送slave所缺的增量部分。但是如果master的复制积压缓存区没有足够的命令记录,或者slave传的runid(replication ID)不对,就会进行完整重同步,即slave会获得一个完整的数据集副本
当slave断开重连后,会发送psync 命令给master。
master首先会对服务器运行进行判断,如果与自己相同就进行判断偏移量
master会判断自己的偏移量与slave的偏移量是否一致。
如果不一致,master会去缓冲区中判断slave的偏移量之后的数据是否存在。
如果存在就会返回+continue回复,表示slave可以执行部分同步了。
master发送断线后的写命令给slave
slave执行写命令
PSYNC命令执行完整重同步和部分重同步的流程图
命令传播
当完成数据同步之后,主从服务器的数据暂时达到一致状态,当主服务器执行了客户端的写命令之后,主从的数据便不再一致。为了能够使主从服务器的数据保持一致性,主服务器会对从服务器执行命令传播 *** 作,即 每执行一个写命令就会向从服务器发送同样的写命令
在命令传播阶段,从服务器会默认以每秒一次的频率向主服务器发送心跳检测REPLCONF ACK <replication_offset>其中replication_offset是当前从服务器的复制偏移量,该命令的作用有三个
检测主从服务器的网络连接状态
辅助实现min-slaves选项
检测命令丢失
>首先断线有很多可能,服务器端代码错误或者网络路由问题,等等,解决这些断线问题的方法就是心跳检测,看应用需要采用几秒客户端(C)向服务器端发送ping协议(协议名称可以自己定)。然后服务器(S)要有个储存器(可以是哈希表或者是类数组)保存客户端连接句柄以及一些必要属性,还要有个时间,用来对比C每次ping的时间是否超过设定超时时间。如果超时就将C的Sock 句柄清除。到这S端就可以了。C端还要有个断线处理,监视检测自己是否断线,做个重连机制,这样一个完整的通讯就差不多了,至于其他应用就要看自己的需要通过协议来 *** 作了。 希望这些能帮到你1、你的这台存储要同时连接到主备服务器,即成为它们的共享磁盘,这是一个前提条件。
2、主备服务器的自动切换主要依赖于服务器上的集群软件,心跳检测是集群软件中为实现自动切换功能而设的一种手段,用以判定集群中的其他服务器是否正常工作。
3、集群软件通常由 *** 作系统厂商配备或由第三方公司提供,具体有哪些品牌/型号首先要看你服务器上用的是哪种 *** 作系统。少数应用系统,像ORACLE数据库甚至会自带集群软件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)