mysql集群怎么实现状态机_分布式中的状态机

全局锁

在系统访问单个资源时或多或少都会要使用到锁,如Java的Lock等,但多个系统访问资源,或在集群中各个实例需要访问资源时,就需要建立全局的锁,这里讲三种全局锁的方法。

数据库

利用ACID

使用关系型数据库的ACID可以创建一个锁

UPDATE LOCKTABLE SET INSTANCE= WHERE RESOURCE=XXXX AND INSTANCE IS NULL;

当返回更新了相应记录后就代表获得了锁

对应的可以使用以下sql来释放获得的锁

UPDATE LOCKTABLE SET INSTANCE='' WHERE RESOURCE=XXXX AND INSTANCE=;

上面的方法看上去很好,但是当获得锁的实例宕机那么这个锁就一直被占用着

利用行锁

为了解决实例非正常退出而没有释放锁可以使用数据库(ORACLE)的行锁

SELECT 1 FROM LOCKTABLE WHERE RESOURCE=XXXX FOR UPDATE;

这样在commit/rollback之前就能持有这个锁,如果调用方断开,数据库也会自动rollback。可以使用NOWAIT+循环查询的方式防止阻塞

REDIS

数据库固然可以,但应对大量的资源需要长期持有大量锁也不是很恰当,下面看下Redis如何创建全局锁

SETNX

SETNX是set if not exist的缩写,也就是当值不存在时再进行赋值

SETNX lock.resource 1

//hold the lock

DEL lock.resource

以上伪代码简单演示了如何获得锁和释放锁,和数据库的方法一样,这种方法同同样存在实例宕机的风险导致死锁

SET

可惜Redis上没有像数据库中的for update。一个替代方法是使用expire。即给锁设定一个超时时间,如果时间超过自动释放锁,这里超时时间要合适不能过长让其他实例空等,也不能过短实例没有结束就自动释放了。

幸运的是Redis 2.6.12之后SET命令可以使用expire和notexist

SET lock.resource NX EX timeout

//hold the lock

WATCH lock.resource

GET lock.resource

MULTI

if(getResult==)

DEL lock.resource

EXEC

使用watch/multi确保竞态条件

RedLock

防止单Redis不可用,可以使用多个redis,在半数以上节点获得锁的情况下代表获得锁,否则就释放所有获得的锁。

Redison

Zookeeper

redis的不足就是只能通过expire来控制锁持有者失联的情况。

zookeeper在这方面就有一定的优势,再加上zookeeper天生自带集群,在可靠性上优于redis

zookeeper可以创建ephemeral节点,当客户端断开连接节点自动删除,可以创建一个节点,最小值持有当前锁

create -e -s /LOCK/RESOURCE/REQUEST 1

之后判断如果当前节点最小就获得锁,如果没有就在前一个节点上加watch,在watch中再进行判断,这样就实现了等待获得锁的队列。

总结

全局锁在集群上的应用有不少,最常见的就如集群内CRON任务执行的管理等。这里主要介绍的还是悲观锁,在某些场景也可以使用乐观锁进行优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三层架构与设计模式思想部署企业级数据库业务系统开发

1. 三层架构介绍 1.1关于架构 架构这个词从它的出现后,就有许许多多的程序员、架构师们激烈地讨论着它的发展,但是架构一词的出现,却是随着三层架构的出现才出现的。当然,目前应用三层架构开发也正是业界最关注的主题。那么这里我们来看看单层…

java compliance_java complier compliance level问题引发的思考

http://blog.csdn.net/shan9liang/article/details/17266519**********************************************问题起源:今天再在ESB调用WebService测试,需要在jboss上部署一个ejb项目(ejb发布的webservice),过去部署好好的代码,这…

Codeforces Round #301 (Div. 2) C. Ice Cave BFS

C. Ice Cave Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/540/problem/CDescription You play a computer game. Your character stands on some level of a multilevel ice cave. In order to move on forward, you need to descend one…

字符串匹配的KMP算法(转)

转自:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个…

java游戏运行环境_Java运行环境

一、计算机存储单元位(bit): 一个数字0或者一个数字1,代表一位字节(Byte): 每逢8位是一个字节,计算机中数据存储的最小的单位1 Byte 8bit通常的换算单位:1KB1024B1MB1024KB1GB1024MB...二、java语言的跨平台性JVM: java虚拟机&…

logcat使用

做android有些日子了,只是对主要的logcat的具体使用方法还是非常模糊,今天有空,学习一下。 logcat能够在adb中使用,也能够直接在命令行下使用。 logcat [options] [filterspecs] logcat的选项包含: -s 默认…

BNUOJ 1207 滑雪

滑雪 Time Limit: 1000msMemory Limit: 65536KBThis problem will be judged on PKU. Original ID: 108864-bit integer IO format: %lld Java class name: MainMichael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向…

eclipse的java帮助文档_java在Eclipse中文apidoc帮助文档导入.doc

今天一下午都在整java的api。我的目标是在eclipse平台中用鼠标点击java的api就会自动显示出中文的注释。并且能在help中方便地搜索java的api。 这其实是使用bada开发平台后留下的后遗症。最终结果是没有得到满意答案,发现最方便的方法还是另外开一个chm中文api文档。…

1477: 青蛙的约会

1477: 青蛙的约会 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 261 Solved: 164[Submit][Status][Discuss]Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们…

altium designer 自动扇出功能

http://wenku.baidu.com/link?urlUJLUQWqm2KwzQzcWxhgsL-Xk4wcUBl-TIB0GAWVD9lC2jrDiRHin0cln-4fMiK1Ku934CvlB-tV7FGEcXzfQL6uC4M58TpnZYCPlbfA4XgW转载于:https://www.cnblogs.com/asulove/p/3836247.html

elasticsearch java_java Elasticsearch详细介绍及使用实例分析

集群健康检查取得健康状态GET /_cat/health?v返回:epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent1535248805 10:00:05 elasticsearch yellow 1 1 1 1 0 0 1 0 - 50…

zabbix2.2入门教程之编译安装(一)

zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供柔软的通知机制以让系统管理员快速定位/解决存在的各种问题。测试环境:centos6.4zabbix2.2…

数学图形(1.35)Kappa curve

不知道这个曲线和那个运动品牌背靠背有什么关系.阿迪原先的商标是个三叶草,难道背靠背也是由数学图形来的? 以下是维基上的解释. In geometry, the kappa curve or Gutschovens curve is a two-dimensional algebraic curve resembling the Greek letter ϰ (kappa). The kapp…

MeasureSpec学习 - 转

2019独角兽企业重金招聘Python工程师标准>>> 在自定义View和ViewGroup的时候,我们经常会遇到int型的 MeasureSpec 来表示一个组件的大小,这个变量里面不仅有组件的尺寸大小,还有大小的模式。 这个大小的模式,有点难以理…

ffmpeg 截图 java_Java Web 中使用ffmpeg实现视频转码、视频截图

视频网站中提供的在线视频播放功能,播放的都是FLV格式的文件,它是Flash动画文件,可通过Flash制作的播放器来播放该文件.项目中用制作的player.swf播放器.多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。ffmpeg视频采集功…

Modernizr使用指南

很久很久以前,我们总有要自己写代码检测,浏览器对某种特性的支持情况。比如:现在要写代码判断浏览器是否支持canvans,大致的代码如下: window.onload function () {if (isSupportCanvas()) {alert("support canv…

C#反射基础理解1(转)

反射提供了封装程序集、模块和类型的对象(Type类型) 可以使用反射动态的创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后,可以调用类型的方法或访问其字段和属性 。 总之,有了…

java sql超过32k_db2 clob类型如何能存储大于32k的字符串

#include #include int ascii[256]; // 字符出现次数,一共只有256个ascii码int main(){int i,r,j;char str[1024];printf("输入字符串\n");for (i 0; i < 256; i )ascii[i] 0; // 清零scanf("%s",str);r strlen(str);for (i 0; i < r; i ){ascii…

架​设​W​e​b​服​务​器

服务器是网站的灵魂&#xff0c;是打开网站的必要载体。按照体系架构来区分&#xff0c;服务器主要分为非X86服务器、x86服务器。非X86服务器使用RISC(精简指令集)或EPIC&#xff08;并行指令代码&#xff09;处理器&#xff1b;X86服务器又称CISC&#xff08;复杂指令&#xf…

在Linux和Mac OS X系统上运行.NET

.NET Core运行时已经看到了实现真正的跨平台的美好前景&#xff0c;它最终出现在Linux和Mac OS X平台上。在上周举办的Microsoft Build大会上&#xff0c;来自微软的项目经理Habib Heydarian为听众分析了这一举措对开发者们所带来的益处&#xff0c;并告诉开发者们如何开始探索…