数据库修仙筑基篇十——corosync-qnetd投票机制

Linux(HA)高可用集群框架及Corosync详解 Linux(HA)高可用集群框架及Corosync详解 集群系统:高可扩展性、高可用性、高性能、高性价比 一、Linux HA cluster架构 1.集群扩展方式: 1).scale on:向上扩展,即升级服务器硬件 扩大服务器的内存容量、增加cpu数量,在一定的范围内能增大服务器性能。 缺点:随着cpu个数的增加需要给CPU仲裁,此外CPU个数的增加会增大资源的竞争性, 所以超出... 阅读详情

corosync-qnetd投票机制

corosync-qnetd是corosync的第三方仲裁机制,当corosync出现网络分区时,集群内部无法选择出quorate一方时,就会借助corosync-qnetd来进行辅助投票。

  • corosync-qnetd作为服务端,会根据各分区连接到qnetd的客户端数目,完成启发式算法的客户端数目等信息来对各分区节点进行投票
  • corosync-qdevice作为客户端会连接到qnetd,同时在本地会执行一组启发式命令,并将启发式命令执行结果发送到qnetd
  • corosync-qnetd根据ring id来区分不同的分区

votequorum

corosync本身提供了votequorum模块和与其配套的接口,支持用户自定义投票规则,实现第三方投票仲裁。corosync-qdevice就是corosync官方实现的一套第三方投票仲裁机制。

每次投票配置即将改变(例如节点加入或离开集群)时,都会调用votequorum_nodelist_notification_fn_t回调。 回调函数由以下类型定义描述:

typedef void (*votequorum_nodelist_notification_fn_t) (
votequorum_handle_t handle,
uint64_t context,
uint32_t node_list_entries,
uint32_t node_list[]
);

当前的 ring_id(votequorum_quorum_notification_fn_t获取)必须传递给 votequorum_qdevice_poll 以使 qdevice 投票有效。

每次仲裁状态改变(例如节点加入或离开集群)时,都会调用votequorum_quorum_notification_fn_t回调。 回调函数由以下类型定义描述:

typedef void (*votequorum_quorum_notification_fn_t) (
votequorum_handle_t handle,
uint64_t context,
uint32_t quorate,
uint32_t node_list_entries,
votequorum_node_t node_list[]
);

corosync-qdevice

qdevice主流程

qdevice_advanced_settings_init
cli_parse
qdevice_instance_init
qdevice_heuristics_init
qdevice_cmap_init
qdevice_log_init
a
b
qdevice_votequorum_init
qdevice_ipc_init
qdevice_model_register_all
qdevice_instance_configure_from_cmap
qdevice_votequorum_master_wins

qdevice_heuristics_init会fork出一个进程在本机来执行启发式命令,当所有启发式命令均执行成功后,会将结果发送给qnetd,帮助qnetd进行投票决策。

qdevice投票处理

qdevice通过net模块和qnetd通信,并根据qnetd返回的投票结果,来通知本机器节点是否能获得qnetd的投票。

qdevice_model_net_init
qdevice_net_cast_vote_timer_update
qdevice_net_cast_vote_timer_callback
qdevice_votequorum_poll

qdevice获取到qnet的投票后会进行如下处理逻辑:

	switch (instance->cast_vote_timer_vote) {
	case TLV_VOTE_ACK: // 获取到了qnetd的投票
		case_processed = 1;
		cast_vote = 1;
		break;
	case TLV_VOTE_NACK: // 没有获取到qnetd的投票
		case_processed = 1;
		cast_vote = 0;
		break;
	case TLV_VOTE_ASK_LATER:
	case TLV_VOTE_WAIT_FOR_REPLY:
	case TLV_VOTE_NO_CHANGE:
	case TLV_VOTE_UNDEFINED:
		/*
		 * Shouldn't happen
		 */
		break;
	/*
	 * Default is not defined intentionally. Compiler shows warning when
	 * new tlv_vote is added.
	 */
	}
	if (!case_processed) { // 如果没有获取正确的投票结果,直接返回
		log(LOG_CRIT, "qdevice_net_timer_cast_vote: Unhandled cast_vote_timer_vote %u",
		    instance->cast_vote_timer_vote);
		exit(EXIT_FAILURE);
	}
	// 将投票信息传到corosync,如果cast_vote为1,则会把qdevice的vote计算在内,否则不会包含qdevice的vote
	if (qdevice_votequorum_poll(instance->qdevice_instance_ptr, cast_vote) != 0) { 
		instance->disconnect_reason = QDEVICE_NET_DISCONNECT_REASON_CANT_SCHEDULE_VOTING_TIMER;
		instance->schedule_disconnect = 1;
		instance->cast_vote_timer = NULL;
		return (0);
	}

qdevice重要API

votequorum_qdevice_register 用于注册一个新的仲裁设备。 仲裁设备是向小型集群添加投票的外部方式。 仲裁设备实际上是集群中的一个伪节点,它根据一些外部设备(通常是共享磁盘分区或网络路由器)提供投票。
此调用会创建设备,但不会将其标记为活动的。 必须调用 votequorum_qdevice_poll 才能将选票包含在法定人数计算中。
name 是包含仲裁设备信息名称的字符串。 它是简单的由 votequorum 存储,用于 corosync-quorumtool 的显示,最多可以是 254 个字符。
仲裁设备贡献的票数对于 votequorum 是已知的,它是在 cmap quorum.device.votes 中设置的,而不是由设备设置的。
请注意,仲裁设备子系统(未作为 votequorum 的一部分提供)负责让所有节点了解仲裁设备状态。

#include <corosync/votequorum.h>
int votequorum_qdevice_register(votequorum_handle_t handle, const char * name);

votequorum_qdevice_poll 由仲裁设备子系统(未作为 votequorum 的一部分提供)调用,以告知投票系统仲裁设备是否存在/活动。 如果 cast_vote 为 1,则设备的投票包含在仲裁计算中,否则不包含。 当前的 ring_id 必须设置(votequorum_notification_fn 回调被调用时获取)否则轮询被忽略。 应定期调用此例程,以确保设备状态始终为 votequorum 所知。 如果在(默认)10 秒(或同步阶段为 30 秒)内未调用 votequorum_qdevice_poll,则该设备将被视为已死,并将其投票从集群中删除。 这不会取消注册设备。 默认轮询时间可以通过为正常操作设置 cmap 变量 quorum.device.timeout 或为同步阶段设置 quorum.device.sync_timeout 来更改。

#include <corosync/votequorum.h>
int votequorum_qdevice_poll(votequorum_handle_t handle, const char * name, unsigned int cast_vote, votequorum_ring_id_t ring_id);

corosync-qnetd

主流程

qnetd_advanced_settings_init
cli_parse
qnetd_instance_init
PR_Listen
qnetd_algorithm_register_all
qnetd_run_main_loop

接收消息

qnetd_client_net_socket_poll_loop_read_cb
qnetd_client_net_read
qnetd_client_msg_received
  • 处理投票请求信息

    qnetd_client_msg_received_ask_for_vote
    qnetd_algorithm_ask_for_vote_received
    ask_for_vote_received
    qnetd_algo_lms_ask_for_vote_received
    do_lms_algorithm
    msg_create_ask_for_vote_reply

    消息

    • 消息类型
    enum msg_type {
    	MSG_TYPE_PREINIT = 0,
    	MSG_TYPE_PREINIT_REPLY = 1,
    	MSG_TYPE_STARTTLS = 2,
    	MSG_TYPE_INIT = 3,
    	MSG_TYPE_INIT_REPLY = 4,
    	MSG_TYPE_SERVER_ERROR = 5,
    	MSG_TYPE_SET_OPTION = 6,
    	MSG_TYPE_SET_OPTION_REPLY = 7,
    	MSG_TYPE_ECHO_REQUEST = 8,
    	MSG_TYPE_ECHO_REPLY = 9,
    	MSG_TYPE_NODE_LIST = 10,
    	MSG_TYPE_NODE_LIST_REPLY = 11,
    	MSG_TYPE_ASK_FOR_VOTE = 12,
    	MSG_TYPE_ASK_FOR_VOTE_REPLY = 13,
    	MSG_TYPE_VOTE_INFO = 14,
    	MSG_TYPE_VOTE_INFO_REPLY = 15,
    	MSG_TYPE_HEURISTICS_CHANGE = 16,
    	MSG_TYPE_HEURISTICS_CHANGE_REPLY = 17,
    };
    
    • 消息格式
    struct msg_decoded {
    	enum msg_type type;
    	uint8_t seq_number_set;
    	uint32_t seq_number;	/* Only valid if seq_number_set != 0 */
    	size_t cluster_name_len;
    	/* Valid only if != NULL. Trailing \0 is added but not counted in cluster_name_len */
    	char *cluster_name;
    	uint8_t tls_supported_set;
    	enum tlv_tls_supported tls_supported;	/* Valid only if tls_supported_set != 0. */
    	uint8_t tls_client_cert_required_set;
    	uint8_t tls_client_cert_required;	/* Valid only if tls_client_cert_required_set != 0 */
    	size_t no_supported_messages;
    	enum msg_type *supported_messages;	/* Valid only if != NULL */
    	size_t no_supported_options;
    	enum tlv_opt_type *supported_options;	/* Valid only if != NULL */
    	uint8_t reply_error_code_set;
    	enum tlv_reply_error_code reply_error_code;	/* Valid only if reply_error_code_set != 0 */
    	uint8_t server_maximum_request_size_set;
    	/* Valid only if server_maximum_request_size_set != 0 */
    	size_t server_maximum_request_size;
    	uint8_t server_maximum_reply_size_set;
    	size_t server_maximum_reply_size;	/* Valid only if server_maximum_reply_size_set != 0 */
    	uint8_t node_id_set;
    	uint32_t node_id;
    	size_t no_supported_decision_algorithms;
    	/* Valid only if != NULL */
    	enum tlv_decision_algorithm_type *supported_decision_algorithms;
    	uint8_t decision_algorithm_set;
    	/* Valid only if decision_algorithm_set != 0 */
    	enum tlv_decision_algorithm_type decision_algorithm;
    	uint8_t heartbeat_interval_set;
    	uint32_t heartbeat_interval;	/* Valid only if heartbeat_interval_set != 0 */
    	uint8_t ring_id_set;
    	struct tlv_ring_id ring_id;	/* Valid only if ring_id_set != 0 */
    	uint8_t config_version_set;
    	uint64_t config_version;	/* Valid only if config_version_set != 0 */
    	uint32_t data_center_id;	/* Valid only if != 0 */
    	enum tlv_node_state node_state;	/* Valid only if != TLV_NODE_STATE_NOT_SET */
    	struct node_list nodes;		/* Valid only if node_list_is_empty(nodes) != 0 */
    	uint8_t node_list_type_set;
    	enum tlv_node_list_type node_list_type;	/* Valid only if node_list_type_set != 0 */
    	uint8_t vote_set;
    	enum tlv_vote vote;	/* Valid only if vote_set != 0 */
    	uint8_t quorate_set;
    	enum tlv_quorate quorate;	/* Valid only if quorate_set != 0 */
    	uint8_t tie_breaker_set;
    	struct tlv_tie_breaker tie_breaker;
    	enum tlv_heuristics heuristics;	/* Always valid but can be TLV_HEURISTICS_UNDEFINED */
    	enum tlv_keep_active_partition_tie_breaker keep_active_partition_tie_breaker;
    	uint8_t keep_active_partition_tie_breaker_set;
    };
    

    lms算法执行流程

    将ring id加入缓存里
    创建分区并计算分数,启发算法通过分数加1,节点个数增加分数加1,同时返回分区个数
    do_lms_algorithm
    qnetd_algo_all_ring_ids_match
    qnetd_algo_create_partitions
    qnetd_algo_dump_partitions
    int
    qnetd_algo_create_partitions(struct qnetd_client *client, partitions_list_t *partitions_list, const struct tlv_ring_id *ring_id)
    {
     	struct qnetd_client *other_client;
    	int num_partitions = 0; // 计算分区数量
    
    	TAILQ_FOREACH(other_client, &client->cluster->client_list, cluster_entries) {
    		struct qnetd_algo_partition *partition;
    
    		if (other_client->last_ring_id.seq == 0){
    			continue; /* not initialised yet */
    		}
    		partition = qnetd_algo_find_partition(partitions_list, &other_client->last_ring_id);
    		if (!partition) { /// 找不到已经存在的分区,重新分配一个分区
    			partition = malloc(sizeof(struct qnetd_algo_partition));
    			if (!partition) {
    				return (-1);
    			}
    			partition->num_nodes = 0;
    			partition->score = 0;
    			memcpy(&partition->ring_id, &other_client->last_ring_id, sizeof(*ring_id));
    			num_partitions++;
    			TAILQ_INSERT_TAIL(partitions_list, partition, entries);
    		}
    		partition->num_nodes++; ///< 分区节点个数加1
    
    		/*
    		 * Score is computer similar way as in the ffsplit algorithm
    		 */
    		partition->score++; /// 分数加1
    		if (other_client->last_heuristics == TLV_HEURISTICS_PASS) {/// 如果启发算法通过了,分数加1
    			partition->score++;
    		} else if (other_client->last_heuristics == TLV_HEURISTICS_FAIL) { ///< 如果启发算法没有通过,分数减1
    			partition->score--;
    		}
    
    	}
    
    	return (num_partitions);
    }
    
  1. qnet收到某个节点MSG_TYPE_ASK_FOR_VOTE消息后,会计算该节点是否能获取到投票;
  2. 当配置lms时,会根据lms算法计算投票;
    1. 会根据节点的ring_id(由node_id和seq组成)插入节点信息并创建分区插入节点;
    2. 每个分区都会有它的分数,分区中每插入一个节点分数加1,启发算法通过分数加1,启发算法执行失败分数减1;
    3. 如果只有一个分区,那么该分区内的所有节点都会获得投票;
    4. 如果有多个分区,则会选出得分最高的那个分区,该分区内的所有节点都会获得投票;
    5. 如果有多个分区的分数相同,则会比较分区的节点个数,分区节点个数多的会获得投票;
    6. 如果多个分区的节点个数也相同,则会选择id最小的那个分区,该分区内的节点都会获得投票;
  3. qnet计算完投票后会将投票结果通过网络发送给发起MSG_TYPE_ASK_FOR_VOTE请求的节点;
  • 对于两节点集群来说,若集群只有一个分区,则所有节点都会获得投票,不论启发算法是否执行成功;
  • 对于两节点集群来说,若节点a和节点b相互隔离,且节点a执行启发算法成功,节点b执行启发算法失败,则节点a所在的分区得2分(0+1+1),节点b所在的分区得0分(0+1-1),得分高的节点a所在的分区将获得投票;
  • 对于两节点集群来说,若节点a和节点b相互隔离,且节点a和节点b均执行启发算法成功,则节点a所在的分区得2分(0+1+1),节点b所在的分区得2分(0+1+1),此时比较节点个数,两个分区节点个数均为1,需要进一步比较节点a和节点b的node_id,node_id小的将获得投票;
QOne、QData开关机操作 Qone、QData开关机 阅读详情

相关推荐

科研笔记:怎样写好博士论文?

博士论文外审避坑指南与写作要点 博士论文外审的核心关注点呈现5级优先级:科研成果(硬指标)>创新性>逻辑结构与场景合理性>文献综述与规范性>工作量验证。外审专家会重点核查:1)成果清单是否达标;2)创新点是否真实明确;3)章节逻辑是否自洽、应用场景是否细化;4)文献综述是否构建"研究坐标系";5)实验/理论支撑是否充分。需特别注意三大雷区:科学错误(直接挂稿)、伪创新、场景不合理。写作时应强化选题依据的场景细化,通过"发展阶段+跨领域对比"提升文献综述质量。

Grow into a more wonderful you 1065

数据库修仙筑基篇九——corosync-qdevice详解

corosync-qdevice详解

growdu的网络博客 1324

SAP成本核算变式OKKN配置详解:从CK11N到CK24,手把手教你搞定标准成本发布

本文深入解析SAP成本核算变式OKKN的配置原理与实战应用,涵盖从CK11N到CK24的标准成本发布全流程。详细讲解数量结构控制、价值结构配置及间接费用计算规则,帮助成本会计精准掌握标准成本计算逻辑,解决BOM版本选择、工艺路线获取等常见问题,提升企业成本管理效率。

weixin_27219587的博客 292

LINUX 高可用群集之 ~Corosync~

Corosync:它属于OpenAIS(开放式应用接口规范)中的一个项目corosync一版本中本身不具 备投票功能,到了corosync 2.0之后引入了votequorum子系统也具备了投票功能了,如果我们用的是1版本的,又需要用到票数做决策时那该如何是好呢;当然,在红帽上把 cman +...

chuifuhuo6864的博客 627

Acgis中实现栅格经纬度和行政区关联

目前已有意大利的shp文件,希望将意大利划分成0.1*0.1经纬度的栅格,并且关联每个栅格中心点所属的省份信息。最终希望得到的输出是一个表格,里面包含栅格的经纬度、所属省份信息。

qq_42183184的博客 3369

利用featureCounts实现高效转录本定量:从比对到下游分析

本文详细介绍了利用featureCounts工具进行RNA-seq转录本定量的完整流程。从软件安装、输入文件准备,到核心命令参数解析与批量样本处理,再到将生成的计数矩阵无缝衔接至DESeq2进行差异表达分析,提供了从比对到下游分析的一站式实战指南。文章重点阐述了featureCounts在效率与易用性上的优势,并分享了常见问题排查与性能优化技巧,帮助研究者高效完成转录本定量这一关键步骤。

weixin_29069131的博客 319

数据库修仙筑基篇八——corosync-qdevice使用

corosync-qdevice使用

growdu的网络博客 1009

超速U盘选购避坑指南:如何通过Rx Detect机制识别真伪USB3.0设备

本文深入解析了USB 3.0超速U盘的选购避坑要点,重点介绍了通过Rx Detect机制识别真伪设备的核心原理。文章提供了从软件检测到实际性能测试的完整方案,帮助消费者和技术人员有效辨别虚假的USB3.0设备,确保获得真正的超速传输体验。

weixin_29189373的博客 446

数据库修仙筑基篇六——corosync编程指南

corosync编程指南。

growdu的网络博客 1069

如何用Python编程实现算术割圆术?

第10章 割圆术 Python编程要点 from … import …语句 math模块的sqrt()函数 round()函数 10.1 图解九章 {:–}觚( gū ):正多边形。“六觚”即正六边形,“十二觚”即正十二边形。 图10-1 六觚、十二觚、二十四觚 提示 图10-1所示由图解九章源码中的“图解割圆术.py”自动绘制而成,我们可运行脚本文件,查看动态的绘制过程。 割六觚以...

人邮异步社区 3237

SAP_SD模块路径及运输功能后台配置简介

后台路径:SPRO—后勤执行—装运—基本发运功能—定义路线—定义传输模式根据实际运输过程运输地理的类型:海运、公路运输、空运后台路径:SPRO—后勤执行—装运—基本发运功能—定义路线—定义发运类型根据实际运输过程运输方式:汽车、卡车、火车、轮船、飞机后台路径:SPRO—后勤执行—装运—基本发运功能—路径—定义路线—定义运输连接点指在运输过程中需要中转的地区可以维护中转地区的停留的时间后台路径:SPRO—后勤执行—装运—基本发运功能—路径—定义路线—定义路径和阶段。

我小时候很黑的博客 1400

HA02-管理节点与quorum

管理(增删)node。 quorum的含义和。 vote和quorum的关系及配置。 初步添加集群资源。

福来阁86号技师的妖孽日常 600

OpenLayers6入门,快速搭建Vue+OpenLayers地图脚手架项目

本章针对Vue初学者,对Vue不熟悉,甚至还不会Vue的入门学生读者。本章会详细讲解从环境到环境的各个步骤,再到使用脚手架快速生成项目,以及添加地图库依赖,编写简单的高德地图显示页面的。如果已有VUE项目或者熟悉VUE的读者可以不用看本章,直接添加ol依赖到VUE项目中即可。

GIS技术方向,GIS地图技术分享(GIS入门、Openlayers教程、Leaflet教程),做最好的GIS地图开发教程。关注博主公众号:eguid 5441

在CentOS7上部署GFS集群

在CentOS7上部署GFS集群 在CentOS7上部署GFS集群 准备工作 了解GFS的知识(一定要熟读!) 集群各主机hostname和hosts文件设置 确保各主机已连接到SAN或IP-SAN 安装必要的软件包 配置corosync服务 配置lvm 启动相关服务 设置集群卷组等并格式化gfs分区 挂载gfs2逻辑卷 常见错误 准备工作 了解GFS的知识(一定要熟...

胡振伟博客 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Centos7.6加pcs搭建高可用数据库集群

1.安裝前環境 1.1.關閉防火墻(主備機) systemctl stop firewalld systemctl disable firewalld systemctl disable NetworkManager systemctl stop NetworkManager vi /etc/selinux/config 1.2.修改主機名(主備機) vi /etc/hostname -------------------- pcs01 -------------------- 1.3.配

Vic的博客 1785

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

linux下高可用集群之corosync详解

linux下高可用集群之corosync详解1.corosync相当于heartbeat功能,提供Messaging Layer,收集节点之间心跳等信息pacemaker相当于haresources,提供crm管理资源信息2.实验:双集群节点为node1.willow.com,IP为1.1.1.18node2.willow.com,IP为1.1.1.19 ...

weixin_34110749的博客 833

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

CentOS 7 corosync高可用集群的实现

CentOS 7 corosync高可用集群的实现===============================================================================概述:===============================================================================cr...

weixin_33798152的博客 693

Corosync与Pacemaker集成指南:打造高可用集群的终极方案

在现代IT基础设施中,高可用性已成为关键需求。Corosync作为集群引擎的核心组件,与Pacemaker资源管理器的完美结合,为构建稳定可靠的集群系统提供了强大支持。本文将详细介绍如何将这两款工具无缝集成,帮助新手用户快速掌握高可用集群的搭建方法。 ## 一、核心组件简介:为何选择Corosync+Pacemaker组合? Corosync是一个开源集群引擎,提供集群成员管理、消息传递和仲裁

gitblog_00083的博客 351

Pacemaker+Corosync集群与网络故障检测

Pacemaker+Corosync集群中,Corosync负责消息的传递,成员关系以及QUORUM服务,它实现了TOTEM协议确保应用也就是Pacemaker通过Corosync传递的消息是可靠有序的。由于Corosync负责通信,集群中各种网络故障的检测自然也是Corosync的事情。 ...

weixin_34268753的博客 898

数据库修仙筑基篇七——corosync使用

corosync使用

growdu的网络博客 791

quorum failgroup disk (3)

需求: 共两个diskgroup,+DATA和+SYS。其中+DATA有n个盘,external redundancy 类型;+SYS有3块盘,normal redundancy类型。 需要将OCR和VOTE存放到+SYS diskgroup,并将OCR冗余到+DATA diskgroup。 另外还需要将SYSTEM表空间存放到+SYS diskgroup,保证同一个extent,分布到不同

bruce 1445

高可用集群 corosync 搭建步骤

实验环境: OS : CentOS 6.6 corosync: corosync-1.4.7-1.el6.x86_64 pacemaker:pacemaker-1.1.12-4.el6.x86_64 crmsh:crmsh-2.1-1.6.x86_64.rpm pssh: pssh-2.3.1-2.el6.x86_64.rpm...

weixin_34419321的博客 338

Linux 高可用(HA)集群之Corosync详解(二)

一、概述 在上篇博客中我们已经完成了Corosync、Pacemaker和crmsh的安装!现在让我们来介绍下是如何通过Pacemaker这个资源管理器来添加管理资源的.在这之前先来简单了解下Pacemaker的工作原理!1、Pacemaker组件说明:stonithd:心跳系统。lrmd:本地资源管理守护进程。它提供了一个通用的接口支持的资源类型。直接调用资源代理...

weixin_33711641的博客 355
上一篇: 数据库修化神篇六——持久化到磁盘
下一篇: 数据库修化神篇七——游标
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我在数据库世界里修仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值