精华内容
下载资源
问答
  • 我们都知道负载均衡、集群和高可用是不同的概念,但是又有着千丝万缕的关系。 具体是什么样的区别和联系呢?笔者经过自思考,给出己浅显的答案。如果不满意、持反对意见,那么一定是你对,记得来评论区教育我~ 负载...

    我们都知道负载均衡、集群和高可用是不同的概念,但是又有着千丝万缕的关系。
    具体是什么样的区别和联系呢?笔者经过自思考,给出己浅显的答案。如果不满意、持反对意见,那么一定是你对,记得来评论区教育我~

    负载均衡

    负载均衡的本质其实就是能够轮询。侧重点在路由和算法
    背景:负载均衡首先要有一个集群,集群里面是相同的很多个节点,当请求这个集群时,具体的业务逻辑会分配到某个具体的节点。
    负载均衡策略:介绍以下4种负载均均衡策略
    ①“每次选下一个”,轮询
    ②随机
    ③按照节点性能不同,按比例分配比如第一个节点3次,第二个节点5次,第三个节点1次
    ④hash,使用一致性hash算法在实现负载均衡的同时,还可以保障同一个客户端发送的请求每次都到达同一个节点

    集群

    集群的本质就是“一群人干一件事”,侧重点在数量
    集群是区别于单点的概念,只要两个或以上服务器干同一件事,就能称为集群(实际上不一定是两个或以上服务器,也可以是两个或以上容器,甚至可以用两个或以上的不同端口做同一件事模拟集群)

    高可用

    高可用的本质是一直可以用,侧重点是天塌下来服务也不能下线,服务器着火服务要还能用
    高可用要求服务在出现各种状况下还能使用。
    比如某个节点挂了,怎么办?是不是让其他节点补上?
    链路不通怎么办?是不是服务降级,要不要限流,怎么限,如何恢复。
    节点内业务逻辑出问题了(抛异常)怎么办?

    展开全文
  • 集群和高可用性的区别

    千次阅读 2019-04-22 17:57:35
    1.1 什么是集群  简单的说,集群(cluster)就是一组计算机,它们作为一个整体向...一个理想的集群是,用户从来不会意识到集群系统底层的节点,在他/她们看来,集群是一个系统,而非多个计算机系统。并且集群系...

    https://www.cnblogs.com/BlackWizard2016/p/5143816.html

    1.1 什么是集群    

      简单的说,集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源。这些单个的计算机系统就是集群的节点(node)。一个理想的集群是,用户从来不会意识到集群系统底层的节点,在他/她们看来,集群是一个系统,而非多个计算机系统。并且集群系统的管理员可以随意增加和删改集群系统的节点。

      更详细的说,集群(一组协同工作的计算机)是充分利用计算资源的一个重要概念,因为它能够将工作负载从一个超载的系统(或节点)迁移到集群中的另一个系统上。其处理能力是与专用计算机(小型机,大型机)可相比,但其性价比高于专用计算机.常见的硬件有:结点,网络,存储.软件有:机群系统,节点系统,应用支撑软件。   

      Cluster集群技术可如下定义:一组相互独立的服务器在网络中表现为单一的系统,并以单一系统的模式加以管理。此单一系统为客户工作站提供高可靠性的服务。大多数模式下,集群中所有的计算机拥有一个共同的名称,集群内任一系统上运行的服务可被所有的网络客户所使用。Cluster必须可以协调管理各分离的组件的错误和失败,并可透明地向Cluster中加入组件。一个Cluster包含多台(至少二台)拥有共享数据存储空间的服务器。任何一台服务器运行一个应用时,应用数据被存储在共享的数据空间内。每台服务器的操作系统和应用程序文件存储在其各自的本地储存空间上。Cluster内各节点服务器通过一内部局域网相互通讯。当一台节点服务器发生故障时,这台服务器上所运行的应用程序将在另一节点服务器上被自动接管。当一个应用服务发生故障时,应用服务将被重新启动或被另一台服务器接管。当以上的任一故障发生时,客户都将能很快连接到新的应用服务上。

    1.2 集群系统的主要优点:    

    (1)高可扩展性:    

    (2)高可用性HA:集群中的一个节点失效,它的任务可传递给其他节点。可以有效防止单点失效。    

    (3)高性能:负载平衡集群允许系统同时接入更多的用户。  

    (4)高性价比:可以采用廉价的符合工业标准的硬件构造高性能的系统。

     

    2.1 集群系统的分类    

    虽然,根据集群系统的不同特征可以有多种分类方法,但是一般把集群系统分为两类:   

    (1)、高可用(High Availability)集群,简称HA集群。    

      这类集群致力于提供高度可靠的服务。就是利用集群系统的容错性对外提供7*24小时不间断的服务,如高可用的文件服务器、数据库服务等关键应用。

          负载均衡集群:使任务可以在集群中尽可能平均地分摊不同的计算机进行处理,充分利用集群的处理能力,提高对任务的处理效率。    

      在实际应用中这几种集群类型可能会混合使用,以提供更加高效稳定的服务。如在一个使用的网络流量负载均衡集群中,就会包含高可用的网络文件系统、高可用的网络服务。    

    (2)、性能计算(High Perfermance Computing)集群,简称HPC集群,也称为科学计算集群。    

    在这种集群上运行的是专门开发的并行应用程序,它可以把一个问题的数据分布到多台的计算机上,利用这些计算机的共同资源来完成计算任务,从而可以解决单机不能胜任的工作(如问题规模太大,单机计算速度太慢)。    

    这类集群致力于提供单个计算机所不能提供的强大的计算能力。如天气预报、石油勘探与油藏模拟、分子模拟、生物计算等。

    3.1 什么是高可用性 (HA)    

    计算机系统的可用性(availability)是通过系统的可靠性(reliability)和可维护性(maintainability)来度量的。工程上通常用平均无故障时间(MTTF)来度量系统的可靠性,用平均维修时间(MTTR)来度量系统的可维护性。于是可用性被定义为:MTTF/(MTTF+MTTR)*100%

    负载均衡服务器的高可用性 为了屏蔽负载均衡服务器的失效,需要建立一个备份机。主服务器和备份机上都运行High Availability监控程序,通过传送诸如“I am alive”这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供服务;当备份管理器又从主管理器收到“I am alive”这样的信息是,它就释放服务IP地址,这样的主管理器就开开始再次进行集群管理的工作了。为在主服务器失效的情况下系统能正常工作,我们在主、备份机之间实现负载集群系统配置信息的同步与备份,保持二者系统的基本一致。

    HA的容错备援运作过程    

    自动侦测(Auto-Detect)阶段 由主机上的软件通过冗余侦测线,经由复杂的监听程序。逻辑判断,来相互侦测对方运行的情况,所检查的项目有:主机硬件(CPU和周边)、主机网络、主机操作系统、数据库引擎及其它应用程序、主机与磁盘阵列连线。为确保侦测的正确性,而防止错误的判断,可设定安全侦测时间,包括侦测时间间隔,侦测次数以调整安全系数,并且由主机的冗余通信连线,将所汇集的讯息记录下来,以供维护参考。    

    自动切换(Auto-Switch)阶段 某一主机如果确认对方故障,则正常主机除继续进行原来的任务,还将依据各种容错备援模式接管预先设定的备援作业程序,并进行后续的程序及服务。    

    自动恢复(Auto-Recovery)阶段 在正常主机代替故障主机工作后,故障主机可离线进行修复工作。在故障主机修复后,透过冗余通讯线与原正常主机连线,自动切换回修复完成的主机上。整个回复过程完成由EDI-HA自动完成,亦可依据预先配置,选择回复动作为半自动或不回复。

    3.2、HA三种工作方式:

    (1)、主从方式 (非对称方式)

    工作原理:主机工作,备机处于监控准备状况;当主机宕机时,备机接管主机的一切工作,待主机恢复正常后,按使用者的设定以自动或手动方式将服务切换到主机上运行,数据的一致性通过共享存储系统解决。

    (2)、双机双工方式(互备互援)

    工作原理:两台主机同时运行各自的服务工作且相互监测情况,当任一台主机宕机时,另一台主机立即接管它的一切工作,保证工作实时,应用服务系统的关键数据存放在共享存储系统中。

    (3)、集群工作方式(多服务器互备方式)

    工作原理:多台主机一起工作,各自运行一个或几个服务,各为服务定义一个或多个备用主机,当某个主机故障时,运行在其上的服务就可以被其它主机接管。

    当一个人找不到出路的时候,最好的办法就是将当前能做好的事情做到极致,做到无人能及。

    展开全文
  • zookeeper+kafka 集群和高可用

    千次阅读 2016-10-20 17:30:25
    1、本机环境 操作系统:ubuntu 12.04 需安装: java的环境,安装过程可参考: ...2、 Zookeeper集群搭建 (1)下载zookeeper安装 wget http://mirror.bit.edu.cn/ap

    1、本机环境

        操作系统:ubuntu 12.04
        需安装:
         java的环境,安装过程可参考:
             http://blog.csdn.net/u014388408/article/details/50587438
    

    2、 Zookeeper集群搭建

    (1)下载zookeeper安装

    wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.3.6/zookeeper-3.3.6.tar.gz
    

    然后解压:

    tar -xvf  zookeeper-3.3.6.tar.gz -C /opt/amqbroker(需要解压的路径)
    

    修改配置文件:

    zoo_sample.cfg 修改文件名为 zoo.cfg
    

    修改zoo.cfg 配置文件内容为

    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/opt/amqbroker/zookeeper/data
    dataLogDir=/opt/amqbroker/zookeeper/log
    clientPort=2181
    server.one=192.168.0.100:2888:3888
    server.two=192.168.0.101:2888:3888
    server.three=192.168.0.102:2888:3888

    然后在/opt/amqbroker/zookeeper/data目录下创建myid文件,在文件中写入当前机器的id,例如配置中server.one=192.168.0.100:2888:3888,在myid文件写入字符 “one” 保存退出。
    另外2台机器和这台机器的配置一样,myid 写各自服务器的id名。

    3、Kafka 安装

    下载地址: wget http://apache.fayea.com/kafka/0.9.0.1/kafka_2.11-0.9.0.1.tgz 
    
    解压: tar -xvf kafka_2.11-0.9.0.1.tgz 
    

    进入kafka_2.11-0.9.0.1.tgz/config/目录下

    vi server.properties 修改一下几处:
    
    broker.id=11               //注意,id名,各个服务器配置一个不相同的名字。
    hostname.name=192.168.0.100
    port=9092
    
    advertised.host.name=192.168.0.100
    advertised.port=9092
    
    以及集群的配置
    zookeeper.connect=192.168.0.100:2181,192.168.0.101:2181,192.168.0.102:2181

    然后在启动kafka,两外2台服务器也采用以上配置,分别启动kafka。

     bin/kafka-server-start.sh config/server.properties 
    

    接下来创建两个分区,两个副本的Topic。

    bin/kafka-topics.sh --create --zookeeper 192.168.0.100:2181,192.168.0.101:2181,192.168.0.102:2181 --replication-factor 2 --partitions 2 --topic kafkatest
    

    查看Topic(test)的状态

    bin/kafka-topics.sh --describe --zookeeper 10.0.0.100:2181,10.0.0.101:2181,10.0.0.102:2181 --topic test     
    

    输出结果:

    Topic:test  PartitionCount:2    ReplicationFactor:2 Configs:
    Topic: test Partition: 0    Leader: 158 Replicas: 0,158 Isr: 158
    Topic: test Partition: 1    Leader: 111 Replicas: 111,0 Isr: 111

    Topoc(test)有两个分区 0,1

    分区0:处于leader服务器的是broker的id为158
          Replicas(副本)为0,158两台服务器。
          Isr(in-sync replicas): 副本列表,158           
    

    4、用JAVA程序来测试消息的生产和消费。

    (1)util工具类

    package com.kafka;
    import java.util.Properties;
    import org.apache.kafka.clients.consumer.KafkaConsumer;
    import org.apache.kafka.clients.producer.KafkaProducer;
    
    public class KafkaUtil {  
        private static KafkaProducer<String, String> kp;  
        private static KafkaConsumer<String, String> kc;  
    
        public static KafkaProducer<String, String> getProducer() {  
            if (kp == null) {  
                Properties props = new Properties();  
                props.put("bootstrap.servers", "192.168.0.100:9092,192.168.0.101:9092,192.168.0.102:9092");  
                props.put("acks", "1");  
                props.put("retries", 0);  
                props.put("batch.size", 16384);  
                props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");  
                props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");  
                kp = new KafkaProducer<String, String>(props);  
            }  
            return kp;  
        }  
    
        public static KafkaConsumer<String, String> getConsumer() {  
            if(kc == null) {  
                Properties props = new Properties();  
                props.put("bootstrap.servers", "192.168.0.100:9092,192.168.0.101:9092,192.168.0.102:9092");  
                props.put("group.id", "0");  
                props.put("enable.auto.commit", "true");  
                props.put("auto.commit.interval.ms", "1000");  
                props.put("session.timeout.ms", "30000");  
                props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");  
                props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");  
                kc = new KafkaConsumer<String, String>(props);  
            }  
            return kc;  
        }  
    }  

    (2)Producer类

    package com.kafka;
    import org.apache.kafka.clients.producer.Callback;
    import org.apache.kafka.clients.producer.Producer;
    import org.apache.kafka.clients.producer.ProducerRecord;
    import org.apache.kafka.clients.producer.RecordMetadata;
    
    public class KafkaTest {
        public static void main(String[] args) throws Exception{
        Producer<String, String> producer = KafkaUtil.getProducer();
            int i = 0;
            while(true) {
                ProducerRecord<String, String> record = new    ProducerRecord<String, String>("test", String.valueOf(i), "this is message"+i);
       producer.send(record, new Callback() {
       public void onCompletion(RecordMetadata metadata, Exception e) {
           if (e != null)
            e.printStackTrace();
            System.out.println("message send to partition " + metadata.partition() + ", offset: " + metadata.offset());
                    }
                });
                i++;
                Thread.sleep(1000);
            }
        }
    }

    (3)Consumer 类

    package com.kafka;
    import java.util.Arrays;
    import org.apache.kafka.clients.consumer.ConsumerRecord;
    import org.apache.kafka.clients.consumer.ConsumerRecords;
    import org.apache.kafka.clients.consumer.KafkaConsumer;
    
    public class KafkaTest1 {
         public static void main(String[] args) throws Exception{  
                KafkaConsumer<String, String> consumer = KafkaUtil.getConsumer();  
                consumer.subscribe(Arrays.asList("test"));  
    while(true) {  
    ConsumerRecords<String, String> records = consumer.poll(1000);  
           for(ConsumerRecord<String, String> record : records) {  
              System.out.println("fetched from partition " + record.partition() + ", offset: " + record.offset() + ", message: " + record.value());  
                    }  
                }  
            }  
    }
    

    运行 producer端 类,结果如下:

    message send to partition 0, offset: 306
    message send to partition 0, offset: 307
    message send to partition 0, offset: 308
    message send to partition 0, offset: 309
    message send to partition 0, offset: 310
    message send to partition 0, offset: 311
    message send to partition 0, offset: 312
    message send to partition 0, offset: 313

    然后运行 Consumer端 类,能看到打印的消息即可。

    5、 Kafka集群高可用性测试
    (1)查看当前副本及状态

    bin/kafka-topics.sh --describe --zookeeper 10.0.0.100:2181,10.0.0.101:2181,10.0.0.102:2181 --topic test     

    输出结果

        Topic:test  PartitionCount:2    ReplicationFactor:2 Configs:
        Topic: test Partition: 0    Leader: 158 Replicas: 0,158 Isr: 158
        Topic: test Partition: 1    Leader: 111 Replicas: 111,0 Isr: 111

    然后停掉一个broker服务器,如158,在查看当前副本状态,Leader状态会变成其他borker服务器,会通过一种选举策略生成一个新的Leader。

    展开全文
  • 集群高可用,linux

    2016-01-11 16:04:08
    集群高可用,linux, keepalived+nginx
  • 高可用集群

    万次阅读 多人点赞 2016-09-23 20:49:13
    本文将详细介绍:高可用集群高可用集群衡量标准、高可用集群实现原理、高可用集群工作模型、高可用集群构架、高可用集群软件、共享存储

    高可用集群

     

    这篇先来认识高可用集群的一些基本概念。

    1、什么是高可用集群

           高可用集群(High Availability Cluster,简称HA Cluster),是指以减少服务中断时间为目的的服务器集群技术。它通过保护用户的业务程序对外不间断提供的服务,把因软件、硬件、人为造成的故障对业务的影响降低到最小程度。

           简单说就是:保证服务不间断地运行,比如,在淘宝网什么时候都可以上去买东西,微信随时可以打开发消息聊天。

    2、高可用集群的衡量标准

           要保证集群服务100%时间永远完全可用,几乎可以说是一件不可能完成的任务。比如,淘宝在这几年双十一刚开始的时候,一下子进来买东西的人很多,访问量大,都出现一些问题,如下单后却支付不了。所以说只能保证服务尽可能的可用,当然有些场景相信还是可能做到100%可用的。

           通常用平均无故障时间(MTTF)来度量系统的可靠性,用平均故障维修时间(MTTR)来度量系统的可维护性。于是可用性被定义为:HA=MTTF/(MTTF+MTTR)*100%。

          具体HA衡量标准:

    描述

    通俗叫法

    可用性级别

    年度停机时间

    基本可用性

    2个9

    99%

    87.6小时

    较高可用性

    3个9

    99.9%

    8.8小时

    具有故障自动恢复能力的可用性

    4个9

    99.99%

    53分钟

    极高可用性

    5个9

    99.999%

    5分钟

     

    3、高可用集群实现原理

          高可用集群主要实现自动侦测(Auto-Detect)故障、自动切换/故障转移(FailOver)自动恢复(FailBack)。

          简单来说就是,用高可用集群软件实现故障检查和故障转移(故障/备份主机切换)的自动化,当然像负载均衡、DNS分发也可提供高可性。

    3-1、自动侦测(Auto-Detect)/ 故障检查

         自动侦测阶段由主机上的软件通过冗余侦测线,经由复杂的监听程序,逻辑判断,来相互侦测对方运行的情况。

         常用的方法是:集群各节点间通过心跳信息判断节点是否出现故障。

    3-1-1、问题是:当有节点(一个或多个)和另外节点互相接收不到对方心跳信息时,如何决定哪一部分节点是正常运行的,而哪一部分是出现故障需要隔离的呢(避免集群脑裂)?

          这时候通过法定票数(quorum)决定,即当有节点故障时,节点间投票决定哪个节点是有问题的,票数大于半数为合法

    票数:

           每个节点可以设置票数,即决定节点在集群内是否合法(正常)的权限值,这个是可以有多有少的,例如有些节点的性能较好或有其他优势,可以设置较多的票数。

    法定票数(quorum):

           当一个节点能和另一个节点保持心跳信息,该节点就获取得了另一个节点的票数,该节点获得的所有票数就是法定票数。

    3-1-2、比较特殊的是只有两个节点的集群,或两边票数相等

           这时候可以借助另外的参考节点,如ping网关(可以是一个节点),可以和测试点ping通,但不可以和对方通,说明对方节点有问题,或本节点有问题;还有就是通过仲裁设备,如仲裁磁盘,每个节点都间隔一定时间不停往磁盘写数据,若监测到对方不再写入的时候,可能对方节点出故障。

          但最好还是使得组成集群的节点数量为单数台(2n+1),当集群分区脑裂时,节点数量小于一半(>n+1)的分区自动停止对外提供服务。

    3-1-3、Pasox算法和Zookeeper

          关于“投票”,有必要知道著名的Pasox算法和Zookeeper:

    Paxos算法:

          Paxos算法解决的是保证集群中每个节点执行相同的操作序列,可以保证分布式群集中的数据一致性。

          例如,通过投票来对写操作进行全局编号,同一时刻,只有一个写操作被批准,同时并发的写操作要去争取选票,只有获得过半数选票的写操作才会被 批准(所以永远只会有一个写操作得到批准);而其他的写操作竞争失败只好再发起一轮投票,就这样,在日复一日年复一年的投票中,所有写操作都被严格编号排序。

          编号严格递增,当一个节点接受了一个编号为100的写操作,之后又接受到编号为99的写操作(因为网络延迟等很多不可预见原因),它马上能意识到自己数据不一致了,自动停止对外服务并重启同步过程。

          任何一个节点挂掉都不会影响整个集群的数据一致性(总2n+1台,除非挂掉大于n台)。

    Zookeeper:

          Zookeeper是 Hadoop 大数据生态的一个独立组件,是 Google 的 Chubby一个开源的实现,可以说是Paxos算法(类似)的实现。

          Zookeeper主要提供分布式协调服务,分布式应用程序可以基于它实现服务注册(高可用),同步服务,配置维护和命名服务等。

          Zookeeper真正提供的是类似我们普通电脑上的文件系统目录的功能,不过可以原子的进行增/删/改/查操作;具体要实现什么分布式协调服务,需要自己写程序来操作Zookeeper上的“目录”。

          Zookeeper为什么可以作为分布式系统提供协调服务?

          最主要的是Zookeeper本身运行的是一个由多个Zookeeper节点组成的稳定的高可用集群。

           Zookeeper集群的高可用性和各节点“目录”数据的一致性正是基于 类似 Paxos算法实现的投票机制来保证的。

          所以 Zookeeper集群节点数量最好也是单数(2n+1),当集群脑裂分区时,分区节点数量不超过一半的(<n+1),会自动停止对外服务。
           比如:

          5台ZK节点组成ZK集群,当分成2台和3台的两个分区时,2台的分区会自动停止对外服务,3台的分区会继续提供服务。

          另外,如果用6台节点组成ZK集群,当分成3台和3台的两个分区时,这两个分区都自动停止对外服务,所以,容错率和5台节点组成的集群的是一样的,更应该用单数(2n+1)节点数量组成集群。

    3-2、自动切换/故障转移(FailOver)

          自动切换阶段某一主机如果确认对方故障,则正常主机除继续进行原来的任务,还将依据各种容错备援模式接管预先设定的备援作业程序,并进行后续的程序及服务。

          通俗地说,即当A无法为客户服务时,系统能够自动地切换,使B能够及时地顶上继续为客户提供服务,且客户感觉不到这个为他提供服务的对象已经更换。

          通过上面判断节点故障后,将高可用集群资源(如VIP、httpd等,下面详见)从该不具备法定票数的集群节点转移到故障转移域(Failover Domain,可以接收故障资源转移的节点)。

    3-2-1、高可用集群资源(HA Resource)和集群资源类型

    集群资源是集群中使用的规则、服务和设备等,如VIP、httpd服务、STONITH设备等。类型如下:

            1、Primitive:主资源,在某一时刻只能运行在某个节点上,如VIP。

            2、group:组,资源容器,使得多个资源同时停/启等,一般只包含primitive资源。

            3、clone:克隆,可以在多个节点运行的资源,例如stonith设备管理进程、集群文件系统的分布式锁(dlm)作为资源,应运行在所有节点上。

            4、master/slave:特殊的clone资源,运行在两个节点上,一主一从,如:分布式复制块设备drbd(2.6.33之后整合进内核了)。

    3-2-2、转移到哪个节点

    根据资源的倾向(资源粘性、位置约束的分数比较)进行转移;

    资源的倾向(资源定位的依据):

     A、资源粘性:资源对节点倾向程度,资源是否倾向于当前节点。score,正值倾向于当前节点(还要和位置约束结合)。

     B、资源约束(Constraint):资源和资源之间的关系

    a、排列约束 (colocation):资源间的依赖/互斥性,定义资源是否运行在同一节点上。score,正值表示要运行在同一节点上,负值则不可。

    b、位置约束(location):每个节点都有一个score值,正值则倾向于本节点,负值倾向于其他节点,所有节点score比较,倾向于最大值的节点。

    c、顺序约束(order):定义资源执行动作的次序,例如vip应先配置,httpd服务后配置。特殊的score值,-inf 负无穷,inf 正无穷。

           也就是说资源粘性定义资源对资源当前所在节点的倾向性,而位置约束定义资源对集群中所有节点的倾向性。如webip的资源粘性为100,位置约束对node1为200,当webip在node2上时,node1上线资源会转移到node1,因为当前节点node2粘性100小于对node1的位置约束200;如webip的资源粘性为200,位置约束对node1为100,当webip在node2上时,node1上线资源不会转移到node1,继续留在node2上,因为当前节点node2粘性200大于对node1的位置约束100。

    3-3、自动恢复/故障回转(FailBack)

          自动恢复阶段在正常主机代替故障主机工作后,故障主机可离线进行修复工作。在故障主机修复后,透过冗余通讯线与原正常主机连线,自动切换回修复完成的主机上。

    3-3-1、当排除故障后,是否要故障回转?

          根据资源粘性和资源约束的设置,一般备用设备单纯只用于备份,性能低于主设备,所以当主设备恢复时应转回,但故障回转需要资源转移,会影响到正在使用的客户,过程代价较高,所以是否需要回转根据实际判断。

    3-4、其他关注点

    3-4-1、如果节点不再成为集群节点成员时(不合法),如何处理运行于当前节点的资源?

          如果集群没有对其进行Fecning/Stonith隔离前,可以进行相关配置(without_quorum_policy),有如下配置选项:

    1、stop:直接停止服务;

    2、ignore:忽略,以前运行什么服务现在还运行什么(双节点集群需要配置该选项);

    3、Freeze:冻结,保持事先建立的连接,但不再接收新的请求;

    4、suicide:kill掉服务。

    3-4-2、集群脑裂(Split-Brain)和资源隔离(Fencing)

           脑裂是因为集群分裂导致的,集群中有节点因为处理器忙或者其他原因暂时停止响应时,与其他节点间的心跳出现故障,但这些节点还处于active状态,其他节点可能误认为该节点"已死",从而争夺共享资源(如共享存储)的访问权,分裂为两部分独立节点。

           脑裂后果:这时两个节点开始争抢共享资源,结果会导致系统混乱,数据损坏。

           脑裂解决:上面3-1-1、3-1-2的方法也能一定程度上解决脑裂的问题,但完全解决还需要资源隔离(Fencing)。

           资源隔离(Fencing):

                  当不能确定某个节点的状态时,通过fencing把对方干掉,确保共享资源被完全释放,前提是必须要有可靠的fence设备。

       节点级别:

                STONITH(shoot the other node in the head,爆头。硬件方式),直接控制故障节点的电源,绝对彻底。

        资源级别:

                例如:FC SAN switch(软件方式)可以实现在存储资源级别拒绝某节点的访问

    4、高可用集群工作模型

    4-1、Active/Passive:主备模型

           一个活动主节点,另一个不活动作为备用节点,当主节点故障,转移到备节点,这时备节点就成为了主节点。备节点完全冗余,造成一定浪费。如下图,mysql、DRBD主从节点间还要进行同步:

    4-2、Active/Active:双主模型

           两个节点都是活动的,两个节点运行两个不同的服务,也互为备用节点。也可以提供同一个服务,比如ipvs,前端基于DNS轮询。这种模型可以使用比较均衡的主机配置,不会造成浪费。

    4-3、N+1

          N个活动主节点N服务,一个备用节点。这需要额外的备用节点必须能够代替任何主节点,当任何主节点故障时,备节点能够负责它的角色对外提供相应的服务。如下图,最后一个备用节点可以作为前两台主节点的DRBD和第三台主节点的MYSQL提供备用功能:

    4-4、N+M

          N个活动主节点M个备用节点。像上面的N+1模型,一个备用节点可能无法提供足够的备用冗余能力,备用节点的数量M是成本和可靠性要求之间的折衷。

          也有一种说法:N-M: N个节点M个服务, N>M, 活动节点为N, 备用节点为N-M。

    4-5、N-to-1

          这和N+1一样,也是N个活动主节点,一个备用节点;不同是的备用节点成为主节点只是暂时的,当原来故障的节点修复后,必须回转才能正常工作。

    4-6、N-to-N

          N个节点N个备用节点。这是A/A双主和N + M模型的组合,N节点都有服务,如果一个坏了,剩下的每个节点都可以作为替代提供服务。如下图,当共享存储是可用的,每一个节点都可能会被用于故障切换。起搏器甚至可以运行服务的多个副本,以分散工作量。

    5、高可用集群架构层次

       

    5-1、节点主机层

           这一层主要是正在运行在物理主机上的服务,高可用集群相关的软件运行在各主机上,集群资源也是在各主机上。

    5-2、Messaging and Membership Layer

           信息传递层,传递集群信息的一种机制,通过监听UDP 694号端口,可通过单播、组播、广播的方式,实时快速传递信息,传递的内容为高可用集群的集群事务,例如:心跳信息,资源事务信息等等,只负责传递信息,不负责信息的计算和比较。

           成员关系(Membership)层,这层最重要的作用是主节点(DC)通过Cluster Consensus Menbership Service(CCM或者CCS)这种服务由Messaging层提供的信息,来产生一个完整的成员关系。这层主要实现承上启下的作用,承上,将下层产生的信息生产成员关系图传递给上层以通知各个节点的工作状态;启下,将上层对于隔离某一设备予以具体实施。

    5-3、CRM(Cluster Resource Manager)

          集群资源管理器层,它主要是用来提供那些不具有高可用的服务提供高可用性的。它需要借助Messaging Layer来实现工作,因此工作在Messaging Layer上层。

          资源管理器的主要工作是收集messaging Layer传递的节点信息,并负责信息的计算和比较,并做出相应的动作,如服务的启动、停止和资源转移、资源的定义和资源分配。

          在每一个节点上都包含一个CRM,且每个CRM都维护这一个CIB(Cluster Information Base,集群信息库),只有在主节点上的CIB是可以修改的,其他节点上的CIB都是从主节点那里复制而来的。

           CRM会推选出一个用于计算和比较的节点,叫DC(Designated coordinator)指定协调节点,计算由PE(Policy Engine)策略引擎实现,计算出结果后的动作控制由TE(Transition Engine)事务引擎实现。

           在每个节点上都有一个LRM(local resource manager)本地资源管理器,是CRM的一个子功能,接收TE传递过来的事务,在节点上采取相应动作,如运行RA脚本等。

    5-4、RA(Resource Rgent)

          资源代理层,简单的说就是能够集群资源进行管理的脚本,如启动start,停止stop、重启restart和查询状态信息status等操作的脚本。LRM本地资源管理器负责运行。

          资源代理分为:

    1、Legacy heartbeat(heatbeat v1版本的资源管理);

    2、LSB(Linux Standard Base),主要是/etc/init.d/*目录下的脚,start/stop/restart/status;

    3、OCF(Open Cluster Famework),比LSB更专业,更加通用,除了上面的四种操作,还包含monitor、validate-all等集群操作,OCF 的规范在http://www.opencf.org/cgi-bin/viewcvs.cgi/specs/ra/resource-agent-api.txt?rev=HEAD

    4、STONITH:实现节点隔离

    6、高可用集群软件

    6-1、Messaging Layer 集群信息层软件

    1、heartbeat (v1, v2)

    2、heartbeat v3

    可以拆分为:heartbeat, pacemaker, cluster-glue

    3、corosync

    从OpenAIS分离的项目。

    4、cman

    5、keepalived

    一般用于两个节点的集群

    6、ultramokey

    6-2、CRM集群资源管理器软件

    1、Haresource

    heartbeat v1 v2包含,使用文本配置接口haresources

    2、crm

    heartbeat v2包含,可以使用crmsh或者heartbeat-gui来进行配置

    3、pacemaker

    heartbeat v3分离出来的项目,配置接口:CLI:crm、pcs和GUI:hawk(WEB-GUI)、LCMC、pacemaker-mgmt、pcs

    4、rgmanager

    Cman包含,使用rgmanager(resource group manager)实现管理, 具有Failover Domain故障转移域这一特性,也可以使用RHCS(Redhat Cluster Suite)套件来进行管理:Conga的全生命周期接口,Conga(luci/ricci)先安装后,可用其安装高可用软件,再进行配置。

    6-3、常用组合

    heartbeat v2+haresource(或crm) (说明:一般常用于CentOS 5.X)

    heartbeat v3+pacemaker (说明:一般常用于CentOS 6.X)

    corosync+pacemaker (说明:现在最常用的组合)

    cman + rgmanager (说明:红帽集群套件中的组件,还包括gfs2,clvm)

    keepalived+lvs (说明:常用于lvs的高可用)

    7、共享存储

           高可用集群多节点都需要访问数据,如果各节点访问同一个数据文件都是在同一个存储空间内的,就是说数据共享的就一份,而这个存储空间就共享存储。

           如Web或Mysql高可用集群,他们的数据一般需要放在共享存储中,主节点能访问,从节点也能访问。当然这也不是必须的,如可以通过rsync、DRBD来同步分别存储在主、从节点上的块数据,而且相对共享存储实现成本更低,具体使用什么需要根据实际场景来选择。下面我们就简单说一下共享存储的类型:

    7-1、DAS(Direct attached storage,直接附加存储)

           存储设备直接连接到主机总线上的,距离有限,而且还要重新挂载,之间有数据传输有延时;

           这是设备块级别驱动上实现的共享,持有锁是在节点主机本地上的,无法通知其他节点,所以如果多节点活动模型的集群同时写入数据,会发生严重的数据崩溃错误问题,主备双节点模型的集群在分裂的时候了会出现问题;

           常用的存储设备:RAID 阵列、SCSI 阵列。

    7-2、NAS(network attached storage,网络附加存储)

           文件级别交互的共享,各存储设备通过文件系统向集群各节点提供共享存储服务,是用C/S框架协议来实现通信的应用层服务。

           常用的文件系统:NFS、FTP、CIFS等,如使用NFS实现的共享存储,各节点是通过NFS协议来向共享存储请求文件的。

    7-3、SAN(storage area network、存储区域网络)

            块级别的,将通信传输网络模拟成SCSI(Small Computer System Interface)总线来使用,节点主机(initiator)和SAN主机(target)都需要SCSI驱动,并借助网络隧道来传输SAN报文,所以接入到SAN主机的存储设备不一定需要是SCSI类型的。

            常用的SAN:FC光网络(交换机的光接口超贵,代价太高)、IPSAN(iscsi、存取快,块级别,廉价)。


    经过写这篇文章,对高可用集群有了一个基本的认识,下面将会动手进行应用配置……

     

    【参考资料】

    1、《大型网站技术架构:核心原理与案例分析》

    2、《从Paxos到Zookeeper :分布式一致性原理与实践》

    3、《大话存储Ⅱ—存储系统架构与底层原理极限剖析》

    4、Pacemaker:http://clusterlabs.org/wiki/Pacemaker

    5、High-availability cluster:https://en.wikipedia.org/wiki/High-availability_cluster#Node_configurations|

    6、Linux 高可用(HA)集群基本概念详解:http://www.linuxidc.com/Linux/2013-08/88522.htm

    7、高可用集群基本概念与heartbeat文本配置接口:http://www.178linux.com/10982

    8、高可用集群原理:http://boxinknown.blog.51cto.com/10435935/1673396

    9、理解 OpenStack 高可用(HA) (4): Pacemaker 和 OpenStack Resource Agent (RA):http://www.cnblogs.com/sammyliu/p/5025362.html

    展开全文
  • Flink 集群 zookeeper 高可用部署手册

    千次阅读 2019-05-08 16:47:48
    文章目录安装前的准备环境安装包集群部署规划部署安装解压配置分发至其他两台机器相同路径启动关闭集群取消任务补充 安装前的准备 ...如果是采用高可用集群,需要安装 Hadoop 集群以及 Zookeepe...
  • MySQL Cluster是MySQL适合于分布式计算环境的实用、冗余版本。Cluster的汉语是“集群”的意思。它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器。 MySQL Cluster 是一种技术,该技术...
  • eureka集群高可用配置

    万次阅读 多人点赞 2017-10-09 17:27:47
    譬如eureka.client.register-with-eurekafetch-registry是否要配置,配不配区别在哪里;eureka的客户端添加service-url时,是不是需要把所有的eureka的server地址都写上,还是只需要写一个server就可以了(因为...
  • PAGE 432 零基础10天精通Linux高级运维 零基础10天精通Linux高级运维 第 章 搭建MySQL集群实现高可用4 第 章 搭建MySQL集群实现高可用 45 PAGE 431 MySQL集群搭建实现高可用 本节所讲内容 MySQL 集群 概述 实战MySQL...
  • 大话Oracle RAC:集群高可用性、备份与恢复

    千次下载 热门讨论 2013-04-21 04:18:52
    大话Oracle RAC:集群高可用性、备份与恢复(带目录清晰中文完整版)
  • FastDFS集群搭建+keepalive+nginx高可用,节点一共8个,这里把搭建好的贡献给大家,大家可以直接下载使用
  • Redis分布式集群+高可用方案详解

    千人学习 2019-05-05 21:13:11
    介绍: 本课程共8节内容,是从“精讲”课程中抽取出来的专题详解,包括redis集群搭建、集群的扩容、节点移除、槽的重新分配等高可用方案。 友情提示:该视频课程为免费课程,无法再次提供笔记源码资料,欢迎大家...
  • ActiveMQ的集群高可用

    千次阅读 2017-07-01 15:52:59
    ActiveMQ的集群高可用针对大量的消息吞吐量、对MQ可用性要求非常严格的场景、或者非常复杂的消息处理关系情况下,单个MQ实例通常已经无法满足我们的需要,这时候ActiveMQ的集群和高可用方案就对我们很重要了。...
  • Hadoop集群安装,高可用集群安装的方法步骤,自己整理的 Hadoop集群安装,高可用集群安装的方法步骤,自己整理的 Hadoop集群安装,高可用集群安装的方法步骤,自己整理的
  • linux下搭建activemq集群(高可用)

    万次阅读 2019-04-15 16:44:10
    一. 简介 从 ActiveMQ 5.9 开始,ActiveMQ 的集群实现方式取消了传统的 Master-Slave 方式,增加了基于 ...本文采用zookeeper来管理节点实现activemq的高可用。 二. 集群部署说明 2.1 节点信息 ZooKeeper集群 Z...
  • 集群存储高可用方法

    万次阅读 2013-05-03 22:15:20
    性能计算、医学影像、石油天然气勘探、数字媒体社会化WEB等大量数据密集型应用导致数据的井喷,不断对存储方法提出新的严峻挑战。集群存储是一种横向扩展(Scale-out)存储架构,具有容量性能线性扩展的优势...
  • Kubernetes集群高可用方案

    千次阅读 2016-04-05 09:23:37
    针对Kubernetes集群高可用性还应包含以下两个层面的考虑:etcd数据存储的高可用Kubernetes Master组件的高可用性。本文节选自龚正等所著的《kubernetes权威指南》。1.etcd高可用性方案etcd在整个Ku...
  • Linux 集群环境中高可用性实施测试,来自IBM官方,里面有详细的配置操作步骤;
  • 高可用NAS集群技术

    万次阅读 2017-12-13 12:25:53
    高可用NAS集群技术 目录 高可用NAS集群技术 一、前言 二、集群NAS的介绍 (一)什么是集群NAS (二)集群NAS的主流架构 (三)集群NAS的分类 三、集群存储高可用技术 (一)什么是集群高可用 (二)常用...
  • ActiveMQ高可用和集群搭建

    千次阅读 2019-06-21 19:31:49
    1. ActiveMQ的高可用原理 使用ZooKeeper(集群)注册所有的ActiveMQ Broker。只有其中的一个Broker可以提供服务,被视为 Master,其他的 Broker 处于待机状态,被视为Slave。如果Master因故障而不能提供服务,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 371,778
精华内容 148,711
关键字:

集群和高可用