精华内容
下载资源
问答
  • 高可用集群

    万次阅读 多人点赞 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

    展开全文
  • MyCat高可用集群 第一章 MyCat的安装,实现数据读写分离 第二章 搭建MySQL双主双从服务器 第三章 数据库垂直拆分——分库 第四章 数据库水平拆分——分表 第五章 基于HAProxy的MyCat高可用集群 文章目录MyCat高可用...

    MyCat高可用集群

    第一章 MyCat的安装,实现数据读写分离

    第二章 搭建MySQL双主双从服务器

    第三章 数据库垂直拆分——分库

    第四章 数据库水平拆分——分表

    第五章 基于HAProxy的MyCat高可用集群

    第六章 Mycat监控——Mycat-web

    第七章 Mycat安全设置



    前言

    前面搭建了双主双从服务的读写分离,实现了MySQL的高可用,但MyCat本身存在单点故障的可能。
    因此我们可以使用HAProxy+Keepalived配合两台Mycat搭起Mycat集群,实现高可用性。HAProxy 实现了MyCat 多节点的集群高可用和负载均衡,而HAProxy 自身的高可用则可以通过Keepalived 来实现。
    在这里插入图片描述


    一、环境准备

    六台CentOS7虚拟机
    两台HAProxy:H1(主)、H2(备)
    两台MyCat:MC1、MC2
    两台mysql数据库:MS1、MS2

    名称 主机名 IP
    MyCat1 centos7_1 192.168.80.70
    MyCat2 centos7_6 192.168.80.60
    HAProxy1 centos7_4 192.168.80.40
    HAProxy2 centos7_5 192.168.80.50
    MySql1 centos7_2 192.168.80.20
    MSql2 centos7_3 192.168.80.30

    二、安装HAProxy

    1、下载安装包

    HAProxy下载地址:http://download.openpkg.org/components/cache/haproxy/
    在这里插入图片描述

    Keepalived下载地址:https://www.keepalived.org/download.html
    在这里插入图片描述

    2、安装HAProxy

    #将下载好的HAProxy安装包传到服务器

    #安装依赖
    yum install -y gcc openssl-devel popt-devel

    #解压
    tar -zxvf haproxy-2.1.2.tar.gz

    #进入解压后的目录
    cd haproxy-2.1.2

    #查看内核版本
    uname -r
    在这里插入图片描述
    #编译
    make TARGET=linux310 PREFIX=/usr/local/haproxy ARCH=x86_64

    #ARGET=linux310,内核版本,使用uname -r查看内核,如:3.10.0-514.el7,此时该参数就为linux310;
    #ARCH=x86_64,系统位数;#PREFIX=/usr/local/haprpxy
    #/usr/local/haprpxy,为haprpxy安装路径。

    #安装
    make install PREFIX=/usr/local/haproxy

    可以echo $? 命令查看上一条命令执行情况,0表示正常执行

    #安装完成后,创建目录
    mkdir -p /usr/data/haproxy/

    #创建HAProxy配置文件,向配置文件中插入以下配置信息
    vim /usr/local/haproxy/haproxy.conf

    global
    	log 127.0.0.1      local0
    	#log 127.0.0.1      local1 notice
    	#log loghost        local0 info
    	maxconn 4096
    	chroot /usr/local/haproxy
    	pidfile /usr/data/haproxy/haproxy.pid
    	uid 99
    	gid 99
    	daemon
    	#debug
    	#quiet
    	
    defaults
    	log          global
    	mode        tcp
    	option    abortonclose
    	option redispatch
    	retries 3
    	maxconn 2000
    	timeout connect 5000
    	timeout client    50000
    	timeout server    50000
    	
    listen proxy_status 
    	bind :48066
    		mode tcp
    		balance roundrobin
    		server mycat_1 192.168.80.70:8066 check inter 10s
    		server mycat_2 192.168.80.60:8066 check inter 10s
    		
    frontend admin_stats 
    	bind :7777
    		mode http
    		stats enable
    		option httplog
    		maxconn 10
    		stats refresh 30s
    		stats uri /admin
    		stats auth admin:123456
    		stats hide-version
    		stats admin if TRUE
    

    在这里插入图片描述

    3、验证HAProxy

    #启动HAProxy
    /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.conf

    #查看HAProxy进程
    ps -ef|grep haproxy
    在这里插入图片描述

    #通过48066端口登录mycat
    mysql -umycat -p123456 -P48066 -h 192.168.80.40
    在这里插入图片描述

    #打开浏览器访问,账号:admin,密码:123456
    http://192.168.80.40:7777/admin
    在这里插入图片描述

    #这里可以看到我的两台mycat都是在线的(红色即为不在线)在这里插入图片描述
    #同样的步骤在H2也做一遍


    三、安装Keepalived

    1、安装keepalived

    #将下载好的Keepalived安装包传到服务器

    #解压
    tar -zxvf keepalived-2.1.2.tar.gz

    #进入解压后的目录
    cd keepalived-2.1.2

    #编译安装
    ./configure --prefix=/usr/local/keepalived
    make && make install

    #复制配置文件

    cp ./keepalived/etc/init.d/keepalived  /etc/init.d/
    mkdir /etc/keepalived
    cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    cp ./keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
    

    #修改配置文件
    vim /etc/keepalived/keepalived.conf

    ! Configuration File for keepalived
    
    global_defs {
    	notification_email {
    		xlcocoon@foxmail.com
    	}
    	notification_email_from keepalived@showjoy.com
    	smtp_server 127.0.0.1
    	smtp_connect_timeout 30
    	router_id LVS_DEVEL
    	vrrp_skip_check_adv_addr
    	vrrp_garp_interval 0
    	vrrp_gna_interval 0
    }
    
    vrrp_instance VI_1 {
    	#主机配MASTER,备机配BACKUP
    	state MASTER
    	#所在机器网卡
    	interface ens32
    	virtual_router_id 51
    	#数值越大优先级越高
    	priority 100
    	advert_int 1
    	authentication {
    		auth_type PASS
    		auth_pass 1111
    	}
    	virtual_ipaddress {
    	#虚拟IP
    		192.168.80.200
    	}
    }
    
    virtual_server 192.168.80.200 48066 {
    	delay_loop 6
    	lb_algo rr
    	lb_kind NAT
    	persistence_timeout 50
    	protocol TCP
    	real_server192.168.80.70 48066 {
    		weight 1
    		TCP_CHECK {
    			connect_timeout 3
    			retry 3
    			delay_before_retry 3
    		}
    	}
    	real_server 192.168.80.60 48600 {
    		weight 1
    		TCP_CHECK {
    		connect_timeout 3
    		nb_get_retry 3
    		delay_before_retry 3
    		}
    	}
    }
    

    注意修改网卡名称和mycat服务器地址
    在这里插入图片描述

    #同样的步骤在H2也做一遍,注意修改BACKUP和优先级
    在这里插入图片描述


    2、验证keepalived

    #启动Keepalived
    systemctl start keepalived

    #登录验证
    mysql -umycat -p123456 -h 192.168.80.200 -P 48066

    #查看orders表信息
    use TESTDB;
    select * from orders;
    在这里插入图片描述

    四、测试高可用

    1、关闭Mycat

    #关闭mycat1,查看运行状态
    ./mycat stop
    ./mycat status
    在这里插入图片描述
    #查询orders表,数据库仍正常运行
    在这里插入图片描述

    2、关闭HAProxy

    #关闭H1的网络连接,模拟服务器宕机
    在这里插入图片描述

    #重新连接数据库
    mysql -umycat -p123456 -h 192.168.80.200 -P 48066

    #通过虚拟IP数据库仍可正常访问
    在这里插入图片描述
    #通过IP访问H1
    mysql -umycat -p123456 -h 192.168.80.40 -P 48066
    在这里插入图片描述

    至此利用HAProxy实现MyCat高可用集群。


    展开全文
  • 系统的总结了nginx的部署,实例化,高可用集群配置。

    经常使用nginx,一直没有好好的拿出个时间来整理,为了以后更换环境后部署方便一些,同时也希望为nginx初学者提供一些帮助,这里系统的总结了nginx的部署,实例化,高可用集群配置。

    0x01.Nginx概述

    1.什么是Nginx?

    • Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
    • Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
    • 以上内容来自百度百科。
    • 用我自己的和话来说,Nginx就是一个高性能的HTTP和反向代理web服务器,本身是一款运行于服务器端的软件,专为服务器端性能优化而开发的,具有很强的并发能力,而且占用内存非常之少。(不知道反向代理请看第二,三点)

    2.正向代理

    • 栗子:你不能直接访问谷歌,需要个梯子,间接的来访问谷歌,走的这种模式,就叫做正向代理。
    • 标准的解释:正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
    • 简而言之:需要在客户端配置代理服务器进行指定网站访问,就是正向代理。

    在这里插入图片描述

    3.反向代理

    • 栗子:你要访问某个网页,请求发送给了反向代理服务器,由反向代理服务器去选择真正的服务器提供资源,这种方式,叫反向代理。
    • 标准的解释:反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
    • 简而言之:我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
      在这里插入图片描述

    4.正反向代理的理解

    • 正向代理隐藏客户端ip,反向代理隐藏真实服务器ip。
    • 正向代理可以:突破访问限制,提高访问速度。
    • 反向代理可以:负载均衡,提供安全保障,提高访问速度。
    • 正向代理其实是客户端的代理,反向代理则是服务器的代理。

    5.负载均衡

    • 增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,就是我们所说的负载均衡

    6.动静分离

    • 为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

    0x02.Linux下部署Nginx(Ubuntu)

    1.安装依赖

    • 安装pcre库:

      • 百度pcre官网下载最新安装包。
      • 到linux中运行命令:
    tar -zxvf [压缩包名]
    
    cd [解压后的pcre文件夹]
    
    ./configure
    
    make
    
    make install
    
    • 安装zlib,openssl,gcc,方法类似。
    • 没有报错就是安装成功了。

    2.Nginx安装

    • 到官网下载最新版本安装包。
    • 重复上述流程进行安装。
    • 启动:
    /usr/local/nginx/sbin/nginx
    
    • 若没有报错,可以查看是否启动成功:
     ps -ef | grep nginx
    
    • 如下图,由两个nginx进程就是启动成功了:

    在这里插入图片描述

    3.Nginx启动过程中的问题

    • 若你成功安装了上述的依赖库但却出现如下错误:
    error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
    
    • 那么恭喜你,你虽然没有启动成功,但是你遇到的问题是最经典的一个nginx启动问题,原因就是pcre库虽然成功安装了,但却没有成功链接到lib目录下,你可以先查看nginx启动需要的依赖:
    ldd $(which /usr/local/nginx/sbin/nginx)
    
    • 若发现只有libcpcre.so.1未找到,那么首先去/usr/local/lib下查看:
    cd /usr/local/lib
    
    • 若发现有libcpcre.so.1,那么你需要将其链接到/lib目录或者/lib64目录下(可以两个都尝试一下):
    ln -s libpcre.so.1 /lib
    
    ln -s libpcre.so.1 /lib64
    
    • 若在/usr/local/lib下没有发现libpcre.so.1,但却发现了libpcre.so.0.0.1,那么你可以现将licpcre.so.0.0.1链接为libpcre.so.1:
    ln -s libpcre.so.0.0.1 libpcre.so.1
    
    • 然后再重复上述的操作。
    • 如果不属于以上的情况,可以先百度是否有类似的问题,实在不行,进入pcre的安装目录,执行make uninstall,完全卸载pcre,下载其它版本进行尝试。

    4.访问Nginx

    • nginx的默认端口是80,而一般会习惯将tomcat的端口改为80,这样就会起冲突,需要修改nginx的端口号。
    • 如果使用的是云服务器,还需要配置相关的安全组,开放修改后的端口。
    • 进入nginx的配置文件:
     cd /usr/local/nginx/conf/
    
    • 修改端口号:
    vi nginx.conf
    

    在这里插入图片描述

    • 浏览器访问ip:port,就能出现以下页面,代表nginx成功部署!
      在这里插入图片描述

    5.nginx常用命令

    # 查看nginx的版本号
    ./nginx -v
    # 停止nginx
    ./nginx -s stop
    # 重新加载nginx
    ./nginx -s reload
    

    6.niginx配置文件解读

    1.全局块
    • 从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
    • 如:worker_processes是Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
      在这里插入图片描述
    2.events块
    • events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。 这部分的配置对 Nginx 的性能影响较大。
    • 如下每个 work process 支持的最大连接数为 1024。

    在这里插入图片描述

    3.http块
    • 代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

    • http 块也可以包括 http 全局块、server 块。

    • http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

    • server 块和虚拟主机有密切关系,该技术的产生是为了节省互联网服务器硬件成本。

    • 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。

    • 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

      • 1、全局 server 块
        最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
      • 2、location 块
        一个 server 块可以配置多个 location 块。
        这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

    在这里插入图片描述

    0x03.Nginx的简单实例化

    1.Nginx实现反向代理

    • 拟实现的功能:nginx根据访问路径的不同,将请求转发到不同的服务器上。
    • 例如:访问ip:port/a,转发至服务器ip:9001,访问ip:port/b,转发至服务器ip:9002。
    • 配置过程:在http块中添加一个server配置规则:
    server{
    	listen [port];
    	server_name [ip];
    	location ~ /a/ {
    		proxy_pass http://[ip]:9001;
    	}
    	location ~ /b/ {
    		proxy_pass http://[ip]:9002;
    	}
    }
    
    • 其中location指令用于匹配 URL。
    location [ = | ~ | ~* | ^~ ] uri {
    
    }
    
    • 1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
    • 2、~:用于表示 uri 包含正则表达式,并且区分大小写。
    • 3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
    • 4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
    • 如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

    2.Nginx实现负载均衡

    • 拟实现的效果:访问指定路径后,nginx实现负载均衡,将请求均衡的转发至多个服务器。
    • 配置过程:先添加upstream块:
    upstream myserver{
    	ip_hash;
    	server [ip]:9001 weight=1;
    	server [ip]:9002 weight=1;
    }
    
    • 再在server中修改location:(只修改proxy_pass)
    location / {
    	...
    	proxy_pass http://myserver;
    	...
    }
    
    

    3.Nginx实现动静分离

    • 拟实现的效果:根据不同的后缀名实现不同的请求转发,将动态资源和静态资源分离开来。
    • 例子:访问login转发至动态资源,访问img转发至静态资源。
    • 配置过程:server中添加location(整体思路就是反向代理)
    location /login/ {
    	root /file/;
    	index index.html index.htm;
    }
    location /img/ {
    	root /img/;
    	autoindex on;
    }
    

    0x04.Nginx高可用集群配置

    • nginx高可用集群理解:简而言之就是当一台nginx服务器宕机后,备份nginx服务器能继续进行工作。
    • 实现nginx高可用集群,需要使用到软件keepalived。

    1.keepalived安装

    • 首先安装依赖:
    sudo apt-get install libssl-dev
    sudo apt-get install openssl
    sudo apt-get install libpopt-dev
    
    • 安装keepalived:
    sudo apt-get install keepalived
    
    • 以上安装过程,主从服务器相同。

    2.keepalived配置文件修改

    • 编辑keepalived的配置文件:
     vi /etc/keepalived/keepalived.conf
    
    • 在主服务器的keepalived配置文件中加入如下内容:
    global_defs { 
    	   notification_email { 
    	   		acassen@firewall.loc 
    	   		failover@firewall.loc
    	   	 	sysadmin@firewall.loc 
    	   	}
    	   	notification_email_from Alexandre.Cassen@firewall.loc
    	   	smtp_server 192.168.17.129 #邮件服务ip
       		smtp_connect_timeout 30 #超时时间
       		router_id LVS_DEVEL 
    }
    vrrp_script chk_http_port { 
    		   script "/usr/local/src/nginx_check.sh"  #脚本所在路径
    		   interval 2 #(检测脚本执行的间隔) 
    		   weight -10 #权值设置
    }
    vrrp_instance VI_1 { 
    		 state MASTER  #状态 - 主服务器
    		 interface ens33  #网卡
    		 virtual_router_id 33  #主、备机的 virtual_router_id 必须相同
    		 priority 130 #服务器的优先级
    		 advert_int 1  
    		 authentication { 
    		 		 auth_type PASS  
    		 		 auth_pass 1111 
    		 }
    		 virtual_ipaddress { 
     				192.168.1.110/24 dev ens33 label ens33:1  #VRRP H 虚拟地址
     		} 
    }	 
    
    • 在从服务器上添加如下配置:
    global_defs { 
    	   notification_email { 
    	   		acassen@firewall.loc 
    	   		failover@firewall.loc
    	   	 	sysadmin@firewall.loc 
    	   	}
    	   	notification_email_from Alexandre.Cassen@firewall.loc
    	   	smtp_server 192.168.17.129 #邮件服务ip
       		smtp_connect_timeout 30 #超时时间
       		router_id LVS_DEVEL 
    }
    vrrp_script chk_http_port { 
    		   script "/usr/local/src/nginx_check.sh"  #脚本所在路径
    		   interval 2 #(检测脚本执行的间隔) 
    		   weight -5 #权值设置
    }
    vrrp_instance VI_1 { 
    		 state BACKUP  #状态 - 备份服务器
    		 interface ens33  #网卡
    		 virtual_router_id 33  #主、备机的 virtual_router_id 必须相同
    		 priority 80 #服务器的优先级
    		 advert_int 1  
    		 authentication { 
    		 		 auth_type PASS  
    		 		 auth_pass 1111 
    		 }
    		 virtual_ipaddress { 
     				192.168.1.110/24 dev ens33 label ens33:1  #VRRP H 虚拟地址
     		} 
    }	 
    

    3.在主备服务器的/usr/local/src中添加检测脚本

    • 在/usr/local/src下添加检测脚本:
    #!/bin/bash
    A=`ps -C nginx –no-header |wc -l`
    if [ $A -eq 0 ];then
        /usr/local/nginx/sbin/nginx
        sleep 2
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
            killall keepalived
        fi
    fi
    

    4.重启nginx,keepalived,进行测试

    ./nginx -s stop
    ./nginx
    systemctl restart keepalived
    
    • 如果将主服务器的nginx和keepalived杀死后,仍然能访问到nginx,说明高可用集群部署成功!

    附录:nginx提供的负载均衡的策略
    1、轮询(默认)
    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
    2、weight
    weight 代表权,重默认为 1,权重越高被分配的客户端越多
    3、ip_hash
    每个请求按访问ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决session 的问题。
    4、fair(第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

    展开全文
  • Redis 高可用集群

    千次阅读 2018-06-01 15:21:09
    本章主要内容有:高可用集群的搭建,Jedis连接集群,新增集群节点,删除集群节点,其他配置补充说明。高可用集群搭建集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、...

    转:https://blog.csdn.net/cool_summer_moon/article/details/80525353

    Redis 的集群主从模型是一种高可用的集群架构。本章主要内容有:高可用集群的搭建,Jedis连接集群,新增集群节点,删除集群节点,其他配置补充说明。

    高可用集群搭建

    集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。

    Redis 3.0 之后便支持集群。Redis 集群中内置了 16384 个哈希槽。Redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
    所有节点之间彼此互联(PING-PONG机制),当超过半数的主机认为某台主机挂了,则该主机就是真的挂掉了,整个集群就不可用了。
    若给集群中的每台主机分配多台从机。主机挂了,从机上位,依然能正常工作。但是若集群中超过半数的主机挂了,无论是否有从机,该集群也是不可用的。

    搭建前的准备工作

    搭建ruby环境

    redis集群管理工具 redis-trib.rb 是依赖 ruby 环境。

    [root@itdragon ~]# yum install ruby
    [root@itdragon ~]# yum install rubygems
    [root@itdragon ~]# gem install redis
    [root@itdragon ~]# cd redis-4.0.2/src/
    [root@itdragon src]# cp redis-trib.rb /usr/local/redis-4/bin/

    第一步:安装 ruby 环境
    第二步:安装 gem 软件包(gem是用来扩展或修改Ruby应用程序的)。参考地址:https://rubygems.org/gems/redis/versions/
    第三步:在redis解压目录中找到 redis-trib.rb 文件,将其拷贝到启动redis服务的目录下,方便管理。

    可能存在的问题
    1 redis requires Ruby version >= 2.2.2,解决方法如下
    2 没有/usr/local/rvm/scripts/rvm 这个目录.可能是上一步执行失败

    [root@itdragon ~]# ruby --version
    ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
    [root@itdragon ~]# yum install curl
    [root@itdragon ~]# curl -L get.rvm.io | bash -s stable
    [root@itdragon ~]# source /usr/local/rvm/scripts/rvm 
    [root@itdragon ~]# rvm list known
    [root@itdragon ~]# rvm install 2.3.3
    [root@itdragon ~]# rvm use 2.3.3
    [root@itdragon ~]# gem install redis

    准备六台redis服务器

    和上一章节主从复制逻辑一样,将redis.conf文件拷贝6次,端口从6000~6005

    [root@itdragon bin]# cp redis.conf redis6000.conf
    [root@itdragon bin]# vim redis6000.conf  
    port xxxx                           #修改端口
    cluster-enabled yes                 #打开注释,开启集群模式
    cluster-config-file nodes-xxxx.conf #集群的配置文件
    pidfile /var/run/redis_xxxx.pid     #pidfile文件
    logfile "xxxx.log"                  #日志文件
    dbfilename dump_xxxx.rdb            #rdb持久化文件
    cluster-node-timeout 5000           #请求超时,单位毫秒
    appendonly yes                      #开启aof持久化方式
    [root@itdragon bin]# vim start-all.sh
    ./redis-server redis6000.conf
    ./redis-server redis6001.conf
    ./redis-server redis6002.conf
    ./redis-server redis6003.conf
    ./redis-server redis6004.conf
    ./redis-server redis6005.conf
    [root@itdragon bin]# chmod u+x start-all.sh
    [root@itdragon bin]# ./start-all.sh 
    [root@itdragon bin]# ps aux | grep redis
    root     28001  0.0  0.9 145964  9696 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6000 [cluster]
    root     28003  0.0  0.9 145964  9696 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6001 [cluster]
    root     28008  0.0  0.9 145964  9656 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6002 [cluster]
    root     28013  0.0  0.9 145964  9656 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6003 [cluster]
    root     28018  0.1  0.9 145964  9652 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6004 [cluster]
    root     28023  0.0  0.9 145964  9656 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6005 [cluster]

    第一步:复制六个redis.conf 并修改相关配置,如果觉得麻烦可以用我配置的文件:https://github.com/ITDragonBlog/daydayup/tree/master/Redis/reids.conf
    第二步:新增批量开启redis服务程序,并增加执行权限
    第三步:查看六台redis服务是否启动成功

    主从集群搭建

    集群创建命令: ./redis-trib.rb create 创建集群,--replicas 1 给每个主机分配一个从机,后面其他参数都是redis服务的ip:port。最后输入yes来接受建议的配置

    [root@itdragon bin]# ./redis-trib.rb create --replicas 1 112.74.83.71:6000 112.74.83.71:6001 112.74.83.71:6002 112.74.83.71:6003 112.74.83.71:6004 112.74.83.71:6005
    >>> Creating cluster
    >>> Performing hash slots allocation on 6 nodes...
    Using 3 masters:
    112.74.83.71:6000
    112.74.83.71:6001
    112.74.83.71:6002
    Adding replica 112.74.83.71:6003 to 112.74.83.71:6000
    Adding replica 112.74.83.71:6004 to 112.74.83.71:6001
    Adding replica 112.74.83.71:6005 to 112.74.83.71:6002
    ...... #省略
    Can I set the above configuration? (type 'yes' to accept): yes
    ...... #省略
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered. #有16384个可用的插槽提供服务说明搭建成功
    
    [root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6002 -c
    112.74.83.71:6002> set testKey value
    -> Redirected to slot [5203] located at 112.74.83.71:6000
    OK
    
    112.74.83.71:6000> cluster info
    cluster_state:ok
    ......
    
    112.74.83.71:6000> cluster nodes
    0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 112.74.83.71:6002@16002 master - 0 1512035804722 3 connected 10923-16383
    13ddd4c1b8c00926f61aa6daaa7fd8d87ee97830 112.74.83.71:6005@16005 slave 0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 0 1512035803720 6 connected
    a3bb22e04deec2fca653c606edf5b02b819f924f 112.74.83.71:6003@16003 slave 1d4779469053930f30162e89b6711d27a112b601 0 1512035802000 4 connected
    1d4779469053930f30162e89b6711d27a112b601 112.74.83.71:6000@16000 myself,master - 0 1512035802000 1 connected 0-5460
    a3b99cb5d22f5cbd293179e262f5eda931733c88 112.74.83.71:6001@16001 master - 0 1512035802719 2 connected 5461-10922
    915a47afc4f9b94389676b4e14f78cba66be9e5d 112.74.83.71:6004@16004 slave a3b99cb5d22f5cbd293179e262f5eda931733c88 0 1512035801717 5 connected

    第一步:搭建集群 ./redis-trib.rb create ,选择yes接受建议的配置
    第二步:进入集群客户端 ./redis-cli -h 任意主机host -p 任意主机port -c,-c表示以集群方式连接redis
    第三步:保存数据
    第四步:cluster info 查询集群状态信息
    第五步:cluster nodes 查询集群结点信息,这里有一个坑,后面会介绍

    可能存在的问题

    Sorry, the cluster configuration file nodes.conf is already used by a different Redis Cluster node. Please make sure that different nodes use different cluster configuration files.

    说的很明确,修改cluster-config-file nodes.conf 文件避免重名,或者删除该文件重新创建集群。

    cluster nodes 查询集群节点信息
    这是很重要的命令,我们需要关心的信息有:
    第一个参数:节点ID
    第二个参数:IP:PORT@TCP 这里一个坑,jedis-2.9.0之前的版本解析@出错
    第三个参数:标志(Master,Slave,Myself,Fail...)
    第四个参数:如果是从机则是主机的节点ID
    最后两个参数:连接的状态和槽的位置。

    Jedis 连接集群

    首先要配置防火墙

    [root@itdragon ~]# vim /etc/sysconfig/iptables
    -A INPUT -p tcp -m tcp --dport 6000 -j ACCEPT
    -A INPUT -p tcp -m tcp --dport 6001 -j ACCEPT
    -A INPUT -p tcp -m tcp --dport 6002 -j ACCEPT
    -A INPUT -p tcp -m tcp --dport 6003 -j ACCEPT
    -A INPUT -p tcp -m tcp --dport 6004 -j ACCEPT
    -A INPUT -p tcp -m tcp --dport 6005 -j ACCEPT
    [root@itdragon ~]# service iptables restart

    最后是整合Spring

    <!-- jedis集群版配置 -->
    <bean id="redisClient" class="redis.clients.jedis.JedisCluster">
        <constructor-arg name="nodes">
            <set>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                    <constructor-arg name="port" value="6000" />
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                    <constructor-arg name="port" value="6001" />
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                    <constructor-arg name="port" value="6002" />
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                    <constructor-arg name="port" value="6003" />
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                    <constructor-arg name="port" value="6004" />
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                    <constructor-arg name="port" value="6005" />
                </bean>
            </set>
        </constructor-arg>
        <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
    </bean>
    <bean id="jedisClientCluster" class="com.itdragon.service.impl.JedisClientCluster"></bean>

    单元测试

    /**
     * 集群版测试
     * 若提示以下类似的错误:
     * java.lang.NumberFormatException: For input string: "6002@16002"
     * 若安装的redis 版本大于4,则可能是jedis 的版本低了。选择 2.9.0
     * 因为 cluster nodes 打印的信息中,4版本之前的是没有 @16002 tcp端口信息
     * 0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 112.74.83.71:6002@16002 master - 0 1512035804722 3 connected 10923-16383
     */
    @Test
    public void testJedisCluster() throws IOException {
        HashSet<HostAndPort> nodes = new HashSet<>();
        nodes.add(new HostAndPort(HOST, 6000));
        nodes.add(new HostAndPort(HOST, 6001));
        nodes.add(new HostAndPort(HOST, 6002));
        nodes.add(new HostAndPort(HOST, 6003));
        nodes.add(new HostAndPort(HOST, 6004));
        nodes.add(new HostAndPort(HOST, 6005));
        JedisCluster cluster = new JedisCluster(nodes);
        cluster.set("cluster-key", "cluster-value");
        System.out.println("集群测试 : " + cluster.get("cluster-key"));
        cluster.close();
    }

    可能存在的问题

    java.lang.NumberFormatException: For input string: "6002@16002"

    若redis 的版本在4.0.0之上,建议使用jedis-2.9.0以上。

    源码:
    https://github.com/ITDragonBlog/daydayup/tree/master/Redis/ssm-redis

    集群节点操作

    添加主节点

    [root@itdragon bin]# cp redis6005.conf redis6006.conf
    [root@itdragon bin]# ./redis-server redis6006.conf
    [root@itdragon bin]# ./redis-trib.rb add-node 112.74.83.71:6006 112.74.83.71:6000
    [root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes
    916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6006@16006 master - 0 1512115612162 0 connected   # 没有分配槽
    [root@itdragon bin]# ./redis-trib.rb reshard 112.74.83.71:6000
    How many slots do you want to move (from 1 to 16384)? 500
    What is the receiving node ID? 916d26e9638dc51e168f32969da11e19c875f48f
    Please enter all the source node IDs.
      Type 'all' to use all the nodes as source nodes for the hash slots.
      Type 'done' once you entered all the source nodes IDs.
    Source node #1:all
    Do you want to proceed with the proposed reshard plan (yes/no)? yes
    [root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes
    916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6006@16006 master - 0 1512116047897 7 connected 0-165 5461-5627 10923-11088
    

    第一步:创建 redis6006.conf 的新主机,并启动Redis服务
    第二步:新增主机节点,若打印"[OK] New node added correctly." 表示添加成功
    第三步:查询集群节点信息,发现6006端口的主机虽然已经添加,但连接状态后面没有内容,即没分配槽
    第四步:给6006端口主机分配槽,

    • 第一个参数:需要移动槽的个数,
    • 第二个参数:接受槽的节点ID,
    • 第三个参数:输入"all"表示从所有原节点中获取槽,
    • 第四个参数:输入"yes"开始移动槽到目标结点id

    第五步:查询集群节点信息,发现6006端口的主机已经分配了槽

    核心命令:
    ./redis-trib.rb add-node 新增主机ip:port 集群任意节点ip:port
    ./redis-trib.rb reshard 集群任意节点ip:port

    可能存在的问题
    [ERR] Sorry, can't connect to node 112.74.83.71:6006
    说明:新增的主机必须要是启动状态。

    添加从节点

    [root@itdragon bin]# cp redis6006.conf redis6007.conf
    [root@itdragon bin]# vim redis6007.conf 
    [root@itdragon bin]# ./redis-server redis6007.conf
    [root@itdragon bin]# ./redis-trib.rb add-node --slave --master-id 916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6007 112.74.83.71:6006
    [root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes
    80315a4dee2d0fa46b8ac722962567fc903e797a 112.74.83.71:6007@16007 slave 916d26e9638dc51e168f32969da11e19c875f48f 0 1512117377000 7 connected

    第一步:创建 redis6007.conf 的新主机,并启动Redis服务
    第二步:新增从机节点,在原来的命令上多了 --slave --master-id 主节点ID
    第三步:查询集群节点信息

    删除结点

    删除节点前,要确保该节点没有值,否则提示:is not empty! Reshard data away and try again. 若该节点有值,则需要把槽分配出去

    ./redis-trib.rb del-node 112.74.83.71:6006 916d26e9638dc51e168f32969da11e19c875f48f 

    配置文件补充

    前几章Redis教程中介绍了以下配置
    1 开启Redis 的守护进程 :daemonize yes
    2 指定pid文件写入文件名 :pidfile /var/run/redis.pid
    3 指定Redis 端口:port 6379
    4 绑定的主机地址 :bind 127.0.0.1
    5 Redis持久化默认开启压缩数据:rdbcompression yes
    6 指定rdb文件名:dbfilename dump.rdb
    7 指定rdb文件位置:dir ./
    8 从机启动时,它会自动从master进行数据同步:slaveof < masterip> < masterport>
    9 开启aof持久化方式:appendonly yes
    10 指定aof文件名:appendfilename appendonly.aof
    11 触发aof快照机制:appendfsync everysec (no/always)

    本章节是Redis教程中的最后一章,把剩下的配置也一起说了吧
    1 设置客户端连接超时时间,0表示关闭 :timeout 300
    2 设置Redis日志级别,debug、verbose(默认)、notice、warning:loglevel verbose
    3 设置数据库的数量:databases 16
    4 设置Redis连接密码:requirepass foobared
    5 设置同一时间最大客户端连接数,默认无限制:maxclients 128
    6 指定Redis最大内存限制:maxmemory < bytes>
    7 指定是否启用虚拟内存机制:vm-enabled no
    8 指定虚拟内存文件路径:vm-swap-file /tmp/redis.swap
    9 指定包含其它的配置文件:include /path/to/local.conf

    到这里Redis 的教程就结束了,还有其他知识可以访问官网学习。有什么不对的地方请指正。谢谢!

    更多内容可学习官网:https://redis.io/topics/cluster-tutorial


    展开全文
  • redis cluster高可用集群

    千次阅读 2020-07-20 16:40:55
    redis cluster高可用集群1.redis cluster集群是什么?redis cluster集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis cluster集群不需要sentinel哨兵也能完成节点移除和故障...
  • 1. 自己实现高可用集群 有实例有讲解!postgresql 高可用集群搭建 :PostgreSQL_HA_with_primary_standby_2vip 2. pgpool 实现高可用集群 pgpool+Keepalived 实现postgresql 高可用集群:PostgreSQL+pgpooll...
  • hadoop高可用集群的搭建

    千次阅读 2020-07-06 16:03:03
    文章目录一.HDFS-HA 集群配置1.1 配置 HDFS-HA ...1.HDFS 高可用集群规划,请保证 Hadoop 完全分布式和 ZooKeeper 完全分布式环境已经安装完成。 hadoop集群搭建 hadoop110 hadoop111 JournalNode JournalNo
  • RabbitMQ 高可用集群搭建

    千次阅读 2020-08-11 12:18:43
    RabbitMQ 高可用集群搭建 1 集群简介 1.1 集群架构 ​ 当单台 RabbitMQ 服务器的处理消息的能力达到瓶颈时,此时可以通过 RabbitMQ 集群来进行扩展,从而达到提升吞吐量的目的。RabbitMQ 集群是一个或多个节点的...
  • rhel HA高可用集群

    千次阅读 2018-09-24 14:03:05
    高可用集群,英文原文为High Availability Cluster,简称HA Cluster,简单的说,集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源。这些单个的计算机系统 就是集群的节点(node)。高可用性...
  • 搭建 Harbor 1.10.6 高可用集群

    千次阅读 2020-12-07 15:38:56
    搭建 Harbor 1.10.6 高可用集群 一、集群模式说明 Harbor 支持如下几种集群模式: 主从同步 双主复制 多 Harbor 实例共享后端存储 1. 主从同步 其中主从同步方式是 Harbor 官方提供的模式,只要向其中的主 Harbor ...
  • RabbitMQ 高可用集群

    千次阅读 2018-05-25 15:37:32
    RabbitMQ 高可用集群 韩学鹏 关注2017.11.12 20:07* 字数 5043 阅读 662评论 1喜欢 17整体架构RabbitMQ Cluster 架构图部署步骤基于 Docker基本概念内存节点只保存状态到内存,例外情况是:持久的 queue 的内容...
  • 搭建 RabbitMQ Server 高可用集群

    千次阅读 2018-05-25 15:25:21
    搭建 RabbitMQ Server 高可用集群阅读目录:准备工作搭建 RabbitMQ Server 单机版RabbitMQ Server 高可用集群相关概念搭建 RabbitMQ Server 高可用集群搭建 HAProxy 负载均衡因为公司测试服务器暂不能用,只能在自己...
  • kubespray部署kubernetes高可用集群

    千次阅读 2020-06-08 16:51:12
    kubespray部署kubernetes高可用集群 Kubespray是Google开源的一个部署生产级别的Kubernetes服务器集群的项目,它整合了Ansible作为部署的工具。 可以部署在AWS,GCE,Azure,OpenStack,vSphere,Packet(Bare ...
  • 高可用集群架构 — N+1 模型

    千次阅读 2020-07-02 13:22:30
    文章目录目录前言高可用集群架构高可用集群模型模型N+1 模型N+1 模型关键技术单进程多定时器的设计冗余节点快速切换技术服务器池多级检测机制 前言 本地是对论文《服务器池的高可用 N+1 冗余结构模型》的学习记录,...
  • NEO4J高可用集群搭建

    千次阅读 2018-08-03 15:38:15
    NEO4J高可用集群搭建 高可用的neo4j集群主要采用了主从的结构,来保证集群的容错能力和应变能力,同时也保证了了集群在读取密集型的数据的场景下可横向的扩展能力。同时,它还支持缓存分区,使得NEO4J高可用性集群...
  • 高可用集群详解

    千次阅读 2018-09-19 23:45:02
    高可用集群原理详解   资源粘性: 资源约束:Constraint  排列约束: (colocation)  资源是否能够运行于同一节点  score:  正值:可以在一起  负值:不能在一起  位置约束:(location), score(分数)  ...
  • Linux集群介绍及配置高可用集群

    千次阅读 2018-06-30 21:02:01
    高可用:高可用集群即“HA集群”,也常称作“双机热备”,用于关键业务。通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务,实现高可用的开源软件有:heartbeat、...
  • mongodb高可用集群方案

    2017-08-31 17:03:20
    一、高可用集群的解决方案 高可用性即HA(High Availability)指的是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性。 计算机系统的高可用在...
  • K8s Master节点高可用集群搭建

    千次阅读 2020-07-03 22:12:54
    Kubernetes 高可用集群高可用集群概念高可用集群搭建一、节点准备环境二、上传所需要的 master节点组件 镜像文件三、修改 HAproxy,keepalived文件四、初始化集群主从master五、安装 flannel 插件六、重新加载 ...
  • Flink的高可用集群环境
  • linux高可用集群(HA)原理详解

    万次阅读 2018-05-02 10:39:32
    高可用集群一、什么是高可用集群 高可用集群就是当某一个节点或服务器发生故障时,另一个节点能够自动且立即向外提供服务,即将有故障节点上的资源转移到另一个节点上去,这样另一个节点有了资源既可以向外提供服务...
  • LVS(DR模式)+ Keepalived 高可用集群

    千次阅读 2020-09-23 16:31:48
    LVS + Keepalived 高可用集群配置2.1 LVS + Keepalived 高可用集群的意义2.2 Keepalived + LVS 高可用集群实验规划2.3 配置主服务器2.31 调整/proc响应参数2.32 配置Keepalived 配置文件2.321 全局配置,热备配置2....
  • 企业主流MySQL高可用集群

    千次阅读 2019-04-03 20:59:28
    企业主流MySQL高可用集群 了解 MySQL 集群之前,先看看单节点数据库的弊病: 大型互联网程序用户群体庞大,所以架构需要特殊设计。 单节点数据库无法满足大并发时性能上的要求。 单节点的数据库没有冗余设计,无法...
  • rabbitmq高可用集群搭建踩坑

    千次阅读 2019-06-29 01:16:22
    rabbitmq高可用集群搭建踩坑 搭建rabbtmq集群时,执行 rabbitmqctl join_cluster rabbit@rabbit-node1报错 Clustering node rabbit@slave1 with rabbit@rabbit-node1 Error: unable to perform an operation on ...
  • keepalived搭建Nacos高可用集群

    千次阅读 2020-08-20 15:39:23
    keepalived搭建nacos高可用集群 JDK 使用 jdk8 系统使用linux的Centos7.6版本(keepalived已经是系统基本的软件,业界广泛接受) 集群架构 官方给出的集群部署架构图 因此开源的时候推荐用户把所有服务列表放到一...
  • AMQ高可用集群-jdbc方式搭建集群

    千次阅读 2017-03-12 14:42:20
    AMQ高可用集群-JDBC方式搭建
  • Hadoop集群升级HA高可用集群配置

    千次阅读 2018-04-16 16:58:54
    在原有的Hadoop集群的基础上,配置HA高可用集群,简单修改配置文件,具体配置及启动方案如下:(先停止Hadoop集群)修改core-site.xml(指定ZK集群,使ZK能够监督master的运行,启动备用节点,我的主节点主机名为...
  • ActiveMQ与Zookeeper高可用集群

    万次阅读 2018-01-13 13:32:55
    其中mq机器出了故障宕机了,那么mq消息就不能发送了,系统就崩溃了,所以我们需要集群MQ,当其中一台MQ出了故障,其余的MQ机器可以接着继续运转,所以这里描述一下如何使用ZooKeeper来进行ActiveMQ的高可用集群。...
  • Hbase高可用集群搭建

    千次阅读 2018-05-16 14:28:53
    Hbase高可用集群搭建 本文采用3台机器,server01,server02,server03机器搭建。 server01 : 主Master server02 : 备用的Master server01,server02,server03 : 分别为Worker 1. 下载并解压安装包 1.1 ...
  • 一文搞定Hadoop高可用集群搭建

    千次阅读 2020-05-08 16:43:24
    Hadoop高可用集群搭建1. 前期准备和规划1.1 前期准备1.2 集群规划2.安装步骤2.1 .安装配置zooekeeper集群(在hadoop05上)2.1.1解压2.1.2.修改配置2.1.3将配置好的zookeeper拷贝到其他节点3.安装配置hadoop集群(在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,142
精华内容 17,656
关键字:

高可用集群