• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >云计算 > 你真的很熟分布式处理和事务吗?,事务

你真的很熟分布式处理和事务吗?,事务

作者:网友 字体:[增加 减小] 来源:互联网

本文主要包含分布式事务处理机制,分布式事务处理等待锁,分布式事务处理协调器,分布式事务处理,java分布式事务处理等服务器相关知识,网友希望可以进行参考

你真的很熟分布式处理和事务吗?,事务


微吐槽

简历上项目经历写一句hello world真的不行嘛?


不想了,我等码农,还是看看怎么来处理分布式系统中的事务这个老大难吧!

本文略长,读者需要有一定耐心,如果你是高级码农或者架构师级别,你可以跳过。
本文注重实战或者实现,不涉及CAP,略提ACID。
本文适合基础分布式程序员:

由于分布式这个话题太大,事务这个话题也太大,我们从一个集群的一个小小节点开始谈起。

集群中存活的节点与同步

分布式系统中,如何判断一个节点(node)是否存活?
kafka这样认为:

那么,符合上面两个条件的节点就可以认为是存活的,也可以认为是同步的(in-sync).

关于第1点,大家对心跳都很熟悉,那么我们可以这样认为某个节点不能和zookeeper喊话了:

zookeeper-node:
var timer = 
new timer()
.setInterval(10sec)
.onTime(slave-nodes,function(slave-nodes){
    slave-nodes.forEach( node -> {
        boolean isAlive = node.heatbeatACK(15sec);
        if(!isAlive) {
            node.numNotAlive += 1;
            if(node.numNotAlive >= 3) {
                node.declareDeadOrFailed();
                slave-nodes.remove(node);

                //回调也可 leader-node-app.notifyNodeDeadOrFailed(node)

            }
        }else 
        node.numNotAlive = 0;
    });
});

timer.run();

//你可以回调也可以像下面这样简单的计时判断
leader-node-app:
var timer = 
new timer()
.setInterval(10sec)
.onTime(slave-nodes,function(slave-nodes){
    slave-nodes.forEach(node -> {
        if(node.isDeadOrFailed) {

        //node不能和zookeeper喊话了

        }
    });
});

timer.run();

关于第二点,要稍微复杂点了,这里也比较考究一个所谓大数据工程师或者架构师的功力了,怎么搞呢?
来这么分析:

  • 数据 messages.
  • 操作 op-log.
  • 偏移 position/offset.
// 1. 先考虑messages
// 2. 再考虑log的postion或者offset
// 3. 考虑msg和off都记录在同源数据库或者存储设备上.(database or storage-device.)
var timer = 
new timer()
.setInterval(10sec)
.onTime(slave-nodes,function(nodes){
    var core-of-cpu = 8;
    //嫌慢就并发呗 mod hash go!
    nodes.groupParallel(core-of-cpu)
    .forEach(node -> {
        boolean nodeSucked = false;

        if(node.ackTimeDiff > 30sec) {
            //30秒内没有回复,node卡住了
            nodeSucked = true;
        }
        if(node.logOffsetDiff > 100) {
            //node复制跟不上了,差距超过100条数据
            nodeSucked = true;
        }

        if(nodeSucked) {
            //总之node“死”掉了,其实到底死没死,谁知道呢?network-error在分布式系统中或者节点失败这个事情是正常现象.
            node.declareDeadOrFailed();
            //不和你玩啦,集群不要你了
            nodes.remove(node);
            //该怎么处理呢,抛个事件吧.
            fire-event-NodeDeadOrFailed(node);
        }
    });
});

timer.run();

上面的节点的状态管理一般由zookeeper来做,leader或者master节点也会维护那么点状态。

那么应用中的leader或者master节点,只需要从zookeeper拉状态就可以,同时,上面的实现是不是一定最佳呢?不是的,而且多数操作可以合起来,但为了描述节点是否存活这个事儿,咱们这么写没啥问题。

节点死掉、失败、不同步了,咋处理呢?

好嘛,终于说到failover和recover了,那failover比较简单,因为还有其它的slave节点在,不影响数据读取。

我们来关注下recover方面的东西,这里把视野打开点,不仅关注slave节点重启后追log来同步数据,我们看下在实际应用中,数据请求(包括读、写、更新)失败怎么办?

大家可能都会说,重试(retry)呗、重放(replay)呗或者干脆不管了呗!
行,都行,这些都是策略,但具体怎么个搞法,你真的清楚了?


一个bigdata问题

我们先摆个探讨的背景:

问题:消息流,比如微博的微博(真绕),源源不断地流进我们的应用中,要处理这些消息,有个需求是这样的:

Reach is the number of unique people exposed to a URL on Twitter.

那么,统计一下3小时内的本条微博(url)的reach总数。

怎么解决呢?

把某时间段内转发过某条微博(url)的人拉出来,把这些人的粉丝拉出来,去掉重复的人,然后求总数,就是要求的reach.

为了简单,我们忽略掉日期,先看看这个方法行不行:

/** ---------------------------------
* 1. 求出转发微博(url)的大V. 
* __________________________________*/

方法 :getUrlToTweetersMap(String url_id)

SQL : /* 数据库A,表url_user存储了转发某url的user */
SELECT url.user_id as tweeter_id
FROM url_user
WHERE url_user.url_id = ${url_id}

返回 :[user_1,...,user_m]


/** ---------------------------------
* 2. 求出大V的粉丝 
* __________________________________*/

方法 : getFollowers(String tweeter_id);

SQL :   /* 数据库B */
SELECT user.id as user_id
FROM users
WHERE users.followee_id = ${tweeter_id}

返回:tweeter的粉丝

/** ---------------------------------
* 3. 求出Reach
* __________________________________*/

var tweeters = getUrlToTweetersMap();
var result = new HashMap<String,Integer>();
tweeters.forEach(t -> {
    // 你可以批量in + 并发读来优化下面方法的性能
    var followers = getFollowers(t.tweeter_id);

    followers.forEach(f -> {
        //hash去重
        result.put(f.user_id,1);
    });
});

//Reach
return result.size();

顶呱呱,无论如何,求出了Reach啊!

其实这又引出了一个很重要的问题,也是很多大谈框架、设计、模式却往往忽视的问题:性能和数据库建模的关系。

其实很佩服一篇文章,几个图表,看起来很cool的架构图就把这些问题说得一清二楚,架构嘛。

看看用storm怎么来解决分布式计算,并赋予其流式计算的特性:

// url到大V -> 数据库1
TridentState urlToTweeters =
    topology.newStaticState(getUrlToTweetersState());
// 大V到粉丝 -> 数据库2
TridentState tweetersToFollowers =
    topology.new
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 你真的很熟分布式处理和事务吗?,事务

相关文章

  • Ceph集群磁盘没有剩余空间的解决方法,ceph集群
  • pig里面没有if:不能判断一个条件后决定一个执行步骤,pigif
  • 云计算容器服务该何去何从,容器该何去何从
  • Hbase Client Test Case,hbasecase
  • 安装配置openstack 中的 Open vSwitch (OVS) service,openstackvswitch
  • Stanford机器学习[第六讲]-朴素贝叶斯算法,stanford第六讲
  • python RESTful API框架:Eve 快速入门,pythonrestful
  • 《5》CentOS7.0+OpenStack+kvm云平台部署—配置Horizon,《5》kvm
  • ZooKeeper+Hadoop2.6.0的ResourceManager HA搭建,hadoop2.6集群搭建
  • Ambari Metrics介绍,ambarimetrics介绍

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • Ambari管理Hadoop集群时遇到的问题,ambarihadoop
    • 玩转OpenStack网络Neutron(3)--配置多种不同类型网络,openstackneutron
    • HDFS概念详解—块,hdfs详解
    • 详说大数据计算的可类化Classable,类化classable
    • RegionServer功能职责,regionserver职责
    • 大数据分析与应用的8个场景
    • 安装openstack 时 遇见的一些问题及解决方法!,openstack一些问题
    • Hadoop 源代码分析(三)对象序列化,hadoop序列化
    • Docker安装MySQL8.0的实现方法
    • request.getScheme()的使用方法,request.getscheme

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有