在应用 pcs 进行管理的 pacemaker 集群中,每个节点都会启动一个 pcsd 守护进程,监听 2224/tcp 端口。随后,我们可以从任一节点中,通过 pcs 命令管理整个集群。

误解

按照套路,通常这是一种 client/server 架构, pcs 命令行工具向相应节点的 pcsd 发送请求, pcsd 在相应节点完成动作。

然而实际与此有所出入。

实际套路

实际上,真正对 pacemaker 执行操作的,是 pcs 这个命令行工具。pcsd 负责接收来自其他节点的请求,随之调用本地的 pcs 工具,最后由本地的 pcs 执行操作。

本地命令示例

以 `pcs cluster start` 命令为例。在 Node A 中执行 `pcs cluster start`, Node A 本地的 cluster 相关服务将被启动。

在此操作中,不需要经过 pcsd. 即, pcs ---> execute. 具体过程如下。

1. Node A 的 pcs 脚本被调用。

### pcs/pcs

10 from pcs import app

11

12 app.main(sys.argv[1:])

2. Node A 的 pcs 调起 app.py.

### pcs/app.py

14 from pcs import (

15     acl,

16     cluster,

17     config,

18     constraint,

19     node,

20     pcsd,

21     prop,

22     qdevice,

23     quorum,

24     resource,

25     settings,

26     status,

27     stonith,

28     usage,

29     utils,

30     alert,

31 )

### 找到 cluster 子命令对应的入口,cluster.cluster_cmd.

176     cmd_map = {

177         "resource": resource.resource_cmd,

178         "cluster": cluster.cluster_cmd,

179         "stonith": stonith.stonith_cmd,

180         "property": prop.property_cmd,

181         "constraint": constraint.constraint_cmd,

182         "acl": acl.acl_cmd,

183         "status": status.status_cmd,

184         "config": config.config_cmd,

185         "pcsd": pcsd.pcsd_cmd,

186         "node": node.node_cmd,

187         "quorum": lambda argv: quorum.quorum_cmd(

188             utils.get_library_wrapper(),

189             argv,

190             utils.get_modificators()

191         ),

192         "qdevice": lambda argv: qdevice.qdevice_cmd(

193             utils.get_library_wrapper(),

194             argv,

195             utils.get_modificators()

196         ),

197         "alert": lambda args: alert.alert_cmd(

198             utils.get_library_wrapper(),

199             args,

200             utils.get_modificators()

201         ),

202     }

3. 由于`pcs cluster start`后面没有接节点名或`--all`,所以判断为在本地节点进行操作。

可以看到,这个命令实际会在本地启动 corosync 和 pacemaker 服务。

###pcs/cluster.py

57 def cluster_cmd(argv):

86     elif (sub_cmd == "start"):

87         if "--all" in utils.pcs_options:

88             start_cluster_all()

89         else:

90             start_cluster(argv)

859 def start_cluster(argv):

860     wait = False

861     wait_timeout = None

862     if "--wait" in utils.pcs_options:

863         wait_timeout = utils.validate_wait_get_timeout(False)

864         wait = True

865

866     if len(argv) > 0:     ######

867         start_cluster_nodes(argv)

868         if wait:

869             wait_for_nodes_started(argv, wait_timeout)

870         return

871

872     print("Starting Cluster...")

873     if utils.is_rhel6():

874 #   Verify that CMAN_QUORUM_TIMEOUT is set, if not, then we set it to 0

875         retval, output = getstatusoutput('source /etc/sysconfig/cman ; [ -z "$CMAN_QUORUM_TIMEOUT" ]')

876         if retval == 0:

877             with open("/etc/sysconfig/cman", "a") as cman_conf_file:

878                 cman_conf_file.write("\nCMAN_QUORUM_TIMEOUT=0\n")

879

880         output, retval = utils.run(["service", "cman","start"])

881         if retval != 0:

882             print(output)

883             utils.err("unable to start cman")

884     else:

885         output, retval = utils.run(["service", "corosync","start"]) #####

886         if retval != 0:

887             print(output)

888             utils.err("unable to start corosync")

889     output, retval = utils.run(["service", "pacemaker", "start"])

890     if retval != 0:

891         print(output)

892         utils.err("unable to start pacemaker")

893     if wait:

894         wait_for_nodes_started([], wait_timeout)

远程命令示例

以`pcs cluster start --all`为例。在 Node A 执行该命令,会启动所有节点的的 cluster 相关服务。

这个命令会向每个节点的 pcsd 发送请求,随后每个节点的 pcsd 调用本地的 pcs 命令执行相应操作。

即, pcs ----> remote psdc ----> remote pcs ---> execute. 具体过程如下。

1. Node A 中执行 `pcs cluster start --all` 命令。由于存在`--all`参数,进入start_cluster_all()分支。

57 def cluster_cmd(argv):

86     elif (sub_cmd == "start"):

87         if "--all" in utils.pcs_options:

88             start_cluster_all()

89         else:

90             start_cluster(argv)

91     elif (sub_cmd == "stop"):

92         if "--all" in utils.pcs_options:

93             stop_cluster_all()

94         else:

95             stop_cluster(argv)

896 def start_cluster_all():

897     wait = False

898     wait_timeout = None

899     if "--wait" in utils.pcs_options:

900         wait_timeout = utils.validate_wait_get_timeout(False)

901         wait = True

902

903     all_nodes = utils.getNodesFromCorosyncConf()  ######

904     start_cluster_nodes(all_nodes)                ######

905

906     if wait:

907         wait_for_nodes_started(all_nodes, wait_timeout)

909 def start_cluster_nodes(nodes):

910     error_list = parallel_for_nodes(utils.startCluster, nodes, quiet=True)

911     if error_list:

912         utils.err("unable to start all nodes\n" + "\n".join(error_list))

2. Node A 向各节点的 pcsd 发送 http 请求。

### pcs/utils.py

246 def startCluster(node, quiet=False):

247     return sendHTTPRequest(node, 'remote/cluster_start', None, False, not quiet)

346 def sendHTTPRequest(host, request, data = None, printResult = True, printSuccess = True):

347     url = 'https://' + host + ':2224/' + request

3. 各节点(包括A)的 pcsd 接收到请求. 随后在本地执行 `pcs cluster start`. 后面的过程与上述本地的过程一致。

### pcsd/remote.rb

17 def remote(params, request, auth_user)

18   remote_cmd_without_pacemaker = {

39       :cluster_start => method(:cluster_start),

193 def cluster_start(params, request, auth_user)

194   if params[:name]

195     code, response = send_request_with_token(

196       auth_user, params[:name], 'cluster_start', true

197     )

198   else

199     if not allowed_for_local_cluster(auth_user, Permissions::WRITE)

200       return 403, 'Permission denied'

201     end

202     $logger.info "Starting Daemons"

203     output, stderr, retval = run_cmd(auth_user, PCS, 'cluster', 'start') ####<<<

204     $logger.debug output

205     if retval != 0

206       return [400, (output + stderr).join]

207     else

208       return output

209     end

210   end

211 end

linux查pcsd服务端口,Pacemaker管理工具中 pcs/pcsd 的关系相关推荐

  1. Linux日志记录服务,日志管理工具

    syslog 简介: syslog是一种广泛使用的日志记录服务,用于记录系统和应用程序的事件,详细记录包括时间戳.主机IP地址.应用程序名称.优先级.消息内容等信息.syslog有三个主要部分:客户端 ...

  2. linux如deepin manjaro对笔记本电脑电池的伤害解决方案:TLP:一个可以延长 Linux 笔记本电池寿命的高级电源管理工具

    TLP:一个可以延长 Linux 笔记本电池寿命的高级电源管理工具 笔记本电池是针对 Windows 操作系统进行了高度优化的,当我在笔记本电脑中使用 Windows 操作系统时,我已经意识到这一点, ...

  3. ASP.NET 网站管理工具中的“安全”制表页

    使用网站管理工具中的"安全"制表页可以对 Web 应用程序特定资源的保护规则进行管理.ASP.NET 使用的安全系统允许你对特定用户帐号或角色的访问权限进行限制.通过"安 ...

  4. cerebro管理工具中添加elasticsearch字段

    cerebro管理工具中添加elasticsearch字段 查看文档mapping 7.*版本的ES查看或者操作需要再url之后增加?include_type_name=true 向已有的type中新 ...

  5. 解决管理工具中没有Internet 信息服务(IIS)管理器

    控制面板下的系统和安全下的管理工具中没有Internet 信息服务(IIS)管理器,      按路径"c:\windows\system32\inetsrv"确认是否有iis.m ...

  6. Docker 服务终端 UI 管理工具

    这是一个简单的基于终端的 UI 管理工具,主要适用于对 docker 和 docker-compose 容器以及服务的管理和便捷使用,灵感来自于 gocui 并使用 Go 语言改写. 轻度用户使用尚可 ...

  7. TLP:一个可以延长 Linux 笔记本电池寿命的高级电源管理工具

    笔记本电池是针对 Windows 操作系统进行了高度优化的,当我在笔记本电脑中使用 Windows 操作系统时,我已经意识到这一点,但对于 Linux 来说却不一样. 多年来,Linux 在电池优化方 ...

  8. Linux下KVM的图形界面管理工具(virt-manager)(桌面版)

    背景: virt-manager是用于管理KVM虚拟环境的主要工具,virt-manager默认设置下需要使用root用户才能够使用该工具.当你想在KVM hypervisor服务器上托管虚拟机,由最 ...

  9. linux系统高级管理工具包,linux两大系统的包管理工具

    linux系统分为两大阵营: 1. redhat系统:包括Redhat.Centos.Fedora等 2. debian系统:包括Debian.Ubuntu等 RedHat 系列 1 常见的安装包格式 ...

最新文章

  1. 深入理解Eureka之源码解析
  2. Spring Cloud架构的各个组件的原理分析
  3. win10系统上安装cmder并实现右键启动
  4. bootstrap 垂直居中 布局_给你一份详细的CSS布局指南,请查收
  5. 113 - Power of Cryptography 浮点数 pow()函数
  6. python hibernate_将Java/MVC/Hibernate webapp移植到Python
  7. C++STL容器大全
  8. linux怎么使多条命令同时执行
  9. 连接上linux上的ip在哪个文件夹,linux – 当IP别名时,操作系统如何确定哪个IP地址将用作出站TCP / IP连接的源?...
  10. 同事之间关系可以,吃饭喝酒没问题,怎么没有一个说知心话的人?
  11. Ubuntu 创建启动器
  12. Linux安装MySQL5.7
  13. c语言矩形法e3x x7,矩形法(梯形法)求定积分的方法
  14. 斯托克斯定理(Stokes' theorem)
  15. 邵阳职院计算机专业怎么样,邵阳市古峰职业学校怎么样?
  16. Android DES加密解密
  17. matplotlib之pyplot模块——向子图添加箭头(arrow())
  18. 使用photoshop对图片像素级的标注
  19. 电容笔和Apple pencil区别有什么?双十一值得入手的电容笔推荐
  20. NOAA气象数据下载攻略

热门文章

  1. 百度api通过经纬度转换为城市名称
  2. composer 安装问题
  3. PS4 + ESP32 制作无线遥控器
  4. 我为何不介意女朋友不是处女?
  5. 微信小程序自定义组件开发即组件间通信详解
  6. html网页制作注意事项,使用网页设计模板的注意事项-
  7. 如何用java实现发邮件功能
  8. 计算机网络技术职业生涯规划书一千字,计算机网络技术大学生职业生涯规划书...
  9. 【文献阅读】MSPM: A multi-agent reinforcement learning-based system for financial portfolio management
  10. Excel函数公式大全—函数真经