Difference between revisions of "Corosync基础"

From 工程技术中心维基
Jump to: navigation, search
(创建页面,内容为“== # OpenSSL组件 == OpenSSL 是一个开源项目,其组成主要包括一下三个组件: * openssl:多用途的命令行工具 * libcrypto:加密算法...”)
 
 
Line 1: Line 1:
== # OpenSSL组件 ==
+
= Corosync 概述 =
  
OpenSSL 是一个开源项目,其组成主要包括一下三个组件:
+
Corosync 是一个源自OpenAIS项目,基于BSD许可证的集群引擎.核心功能是一个群组通信系统,具有实现应用程序高可用性的附加功能。该项目提供了四个 C API功能:
  
* openssl:多用途的命令行工具
+
* 具有虚拟同步的封闭进程组通信模型保证了用于创建复制状态机。
* libcrypto:加密算法库
+
* 一个简单的可用性管理器,在失败时重新启动应用程序进程。
* libssl:加密模块应用库,实现了ssl及tls
+
* 内存数据库配置和统计信息,提供设置,检索和接收信息更改通知的功能。
 +
* 达到法定人数或丢失时通知应用程序的法定人数系统。
 +
* 该软件设计用于在UDP/IP 和 InfiniBand网络上运行。
  
openssl可以实现:秘钥证书管理、对称加密和非对称加密 。
+
== 前提准备工作 ==
  
== ## 术语 ==
+
系统 : CentOS 7 前提 :时间同步、防火墙关闭, selinux关闭; 集群模式 : 双机高可用 主机数量 :2
  
openssl中有如下约定熟成的后缀名称:
+
完成准备工作后,在每个主机都要安装软件包: <code>corosync</code>, 设置两台主机名解析(/etc/hosts),解析的结果必须要和本地使用的主机名保持一致.
  
<pre>* .key:  私有的密钥
+
例如 /etc/hosts
* .csr:  证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
+
* .crt:  证书文件,certificate的缩写
+
* .crl:  证书吊销列表,Certificate Revocation List的缩写
+
* .pem:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式</pre>
+
== ## 加密和签名 ==
+
  
* 加密: 公钥用于对数据进行加密,私钥用于对数据进行解密
+
<pre>10.1.11.109 HA1
* 签名: 私钥用于对数据进行签名,公钥用于对签名进行验证
+
10.1.11.203 HA2</pre>
 +
== corosync的程序环境 ==
  
== ## Openssl 操作指南 ==
+
* 配置文件:/etc/corosync/corosync.conf
 +
* 密钥文件:/etc/corosync/authkey
 +
* 服务配置:/lib/systemd/system/corosync.service
  
=== 生成密钥 ===
+
== corosync的配置实例及参数解析 ==
  
* 生成私钥: openssl genrsa -out private.key 2048
+
主机1配置,编辑配置文件 /etc/corosync/corosync.conf 修改内容参考如下:
* 到出公钥: openssl rsa -in private.key -pubout -out public.key
+
  
<!-- -->
+
<pre>totem {
<pre>genrsa       产生RSA密钥命令。
+
       version: 2
-aes256     使用AES算法(256位密钥)对产生的私钥加密。可选算法包括DES,DESede,IDEA和AES。
+
      crypto_cipher: aes256
-out        输出路径,这里指private/server.key.pem。
+
      crypto_hash: sha1
2048        指RSA密钥长度位数,默认长度为512位。</pre>
+
      interface {
=== 创建CA ===
+
          ringnumber: 0
 +
          bindnetaddr: &lt;主机IP&gt;
 +
          mcastaddr: 239.255.100.1
 +
          mcastport: 5405
 +
          ttl: 1
 +
      }
 +
}                             
  
CA是专门签发证书的权威机构,处于证书的最顶端。自签是用自己的私钥给证书签名,CA签发则是用CA的私钥给自己的证书签名来保证证书的可靠性 CA根证书的生成步骤: 生成CA私钥(.key)--&gt;生成CA证书请求(.csr)--&gt;自签名得到根证书(.crt)(CA给自已颁发的证书)。
+
logging {
 +
      fileline: off
 +
      to_stderr: no
 +
      to_logfile: yes
 +
      logfile: /var/log/cluster/corosync.log
 +
      to_syslog: no
 +
      debug: off
 +
      timestamp: on
 +
      logger_subsys {
 +
          subsys: QUORUM
 +
          debug: off
 +
      }
 +
}
  
<code>   openssl genrsa -out ca.key 2048     </code><br />
+
quorum {
<code>   openssl req -new -key ca.key -out ca.csr    </code><br />
+
      provider: corosync_votequorum
<code>   openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt  </code><br />
+
}
<code>   </code><br />
+
<code>  以上操作合并操作如下:</code><br />
+
<code>   openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ca.key -out ca.crt</code>
+
  
<pre>req
+
nodelist {
-x509
+
      node {
-nodes 本option被set的话,生成的私有密钥文件将不会被加密
+
        ring0_addr: HA1
-days 365 </pre>
+
        nodeid: 1
* 查看自签名CA证书:openssl x509 -text -in ca.crt
+
      }
 +
      node {
 +
        ring0_addr: HA2
 +
        nodeid: 2
 +
      }
 +
}</pre>
 +
执行命令: <code>corosync-keygen</code> 生成用于双机通信互信密钥文件 /etc/corosync/authkey,至此主机1配置完成。
  
=== 颁发证书 ===
+
下面进行主机2的配置
  
颁发证书就是用CA的秘钥给其他人签名证书,输入需要证书请求,CA的私钥及CA的证书,输出的是签名好的还给用户的证书. 用户的证书请求信息填写的国家省份等需要与CA配置一致,否则颁发的证书将会无效。
+
* 将主机1的/etc/corosync/authkey 分发到主机相同位置,两台主机共用相同的密钥文件,
 +
* 将主机1的配置 /etc/corosync/corosync.conf 分发到另一台主机,其中 bindnetaddr 修改为相应的IP
  
用户证书的生成步骤
+
== 启动Corosync服务 ==
  
生成私钥(.key)--&gt;生成证书请求(.csr)--&gt;CA的私钥及CA的证书签名得到用户证书(.crt)
+
分别在两台主机上执行命令 <code>systemctl start corosync</code> 重启服务,观察两台主机的corosync日志,如果服务器运行正常,将会返回如下类似结果:
  
* 生成密钥: openssl genrsa -out client.key 2048
+
<pre>tail -f /var/log/cluster/corosync.log
* 生成请求: openssl req -new -subj -key client.key -out client.csr
+
Jan 10 02:46:16 [2297] HA2 corosync notice  [SERV  ] Service engine loaded: corosync cluster quorum service v0.1 [3]
* 签发证书: openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA ca.crt -CAkey ca.key -CAserial ca.srl -CAcreateserial -in client.csr -out client.crt
+
Jan 10 02:46:16 [2297] HA2 corosync info    [QB    ] server name: quorum
 +
Jan 10 02:46:16 [2297] HA2 corosync warning [TOTEM ] JOIN or LEAVE message was thrown away during flush operation.
 +
Jan 10 02:46:16 [2297] HA2 corosync notice  [TOTEM ] A new membership (10.1.11.203:16) was formed. Members joined: 2
 +
Jan 10 02:46:16 [2297] HA2 corosync notice  [QUORUM] Members[1]: 2
 +
Jan 10 02:46:16 [2297] HA2 corosync notice  [MAIN  ] Completed service synchronization, ready to provide service.
 +
Jan 10 02:46:16 [2297] HA2 corosync notice  [TOTEM ] A new membership (10.1.11.109:20) was formed. Members joined: 1
 +
Jan 10 02:46:16 [2297] HA2 corosync notice  [QUORUM] This node is within the primary component and will provide service.
 +
Jan 10 02:46:16 [2297] HA2 corosync notice  [QUORUM] Members[2]: 1 2
 +
Jan 10 02:46:16 [2297] HA2 corosync notice  [MAIN  ] Completed service synchronization, ready to provide service</pre>
 +
== 验证Corosync配置 ==
  
<!-- -->
+
* 主机1执行命令:<code>corosync-cfgtool -s</code> 将会返回如下类似结果:
<pre>req          产生证书签发申请命令
+
-new        表示新请求。
+
-key        密钥,这里为client.key文件
+
-out        输出路径,这里为client.csr文件
+
-subj        指定用户信息
+
  
x509          签发X.509格式证书命令。
+
<pre>[root@HA1 ~]# corosync-cfgtool -s
-req            表示证书输入请求。
+
Printing ring status.
-days          表示有效天数,这里为3650天。
+
Local node ID 1
-sha1          表示证书摘要算法,这里为SHA1算法。
+
RING ID 0
-extensions    表示按OpenSSL配置文件v3_req项添加扩展
+
         id     = 10.1.11.109
-CA            表示CA证书,这里为ca.cert
+
        status  = ring 0 active with no faults
-CAkey         表示CA证书密钥,这里为ca.key
+
</pre>
-CAserial     表示CA证书序列号文件,这里为ca.srl
+
* 主机2执行命令:<code>corosync-cfgtool -s</code> 将会返回如下类似结果:
-CAcreateserial表示创建CA证书序列号
+
-in            表示输入文件,这里为private/client.csr
+
-out          表示输出文件,这里为certs/client.crt</pre>
+
* 验证CA颁发的证书提取的公钥和私钥导出的公钥是否一致 openssl x509 -in client.cert -pubkey
+
* 验证server证书 openssl verify -CAfile ca.crt client.crt
+
* 生成pem格式证书有时需要用到pem格式的证书,可以用以下方式合并证书文件(crt)和私钥文件(key)来生成 cat client.crt client.key&gt; client.pem
+
  
== ## 参考 ==
+
<pre>[root@HA2 ~]# corosync-cfgtool -s
 +
Printing ring status.
 +
Local node ID 2
 +
RING ID 0
 +
        id      = 10.1.11.203
 +
        status  = ring 0 active with no faults
 +
</pre>
 +
* 在其中任意一台主机执行命令:<code>corosync-cmapctl |grep member</code>
  
* OpenSSL Command-Line HOWTO: https://www.madboa.com/geek/openssl/
+
<pre>[root@HA2 ~]# corosync-cmapctl |grep member
* 自建 CA 和颁发 SSL证书 : http://www.jianshu.com/p/79c284e826fa
+
runtime.totem.pg.mrp.srp.members.1.config_version (u64) = 0
* OpenSSL 标准命令详细解释 : http://blog.csdn.net/scuyxi/article/details/54884976
+
runtime.totem.pg.mrp.srp.members.1.ip (str) = r(0) ip(10.1.11.109)
* openssl详解: http://blog.csdn.net/w1781806162/article/details/46358747 ## 未整理部分 --- 若服务端要求客户端认证,需要将pfx证书转换成pem格式
+
runtime.totem.pg.mrp.srp.members.1.join_count (u32) = 1
 +
runtime.totem.pg.mrp.srp.members.1.status (str) = joined
 +
runtime.totem.pg.mrp.srp.members.2.config_version (u64) = 0
 +
runtime.totem.pg.mrp.srp.members.2.ip (str) = r(0) ip(10.1.11.203)
 +
runtime.totem.pg.mrp.srp.members.2.join_count (u32) = 1
 +
runtime.totem.pg.mrp.srp.members.2.status (str) = joined</pre>
 +
以上就是corosync的配置过程, corosync 只是一个集群引擎,如果需要构建一个完整的应用集群,还需要和资源管理器Pacemaker 或者DRBD 以及具体的应用结合
  
openssl pkcs12 -clcerts -nokeys -in cert.pfx -out client.pem #客户端个人证书的公钥<br />
+
== corosync配置文件参考 ==
openssl pkcs12 -nocerts -nodes -in cert.pfx -out key.pem #客户端个人证书的私钥
+
  
也可以转换为公钥与私钥合二为一的文件
+
* totem{} #节点间的通信协议,主要定义通信方式、通信协议版本、加密算法等
 +
* version: 2 #定义协议版本
 +
* crypto_hash: #哈希加密算法 md5, sha1, sha256, sha384 and sha512.
 +
* crypto_cipher: #对称加密算法 aes256, aes192, aes128 and 3des
 +
* interface{} #定义集群心跳信息传递的接口,可以有多组;
 +
** ringnumber #环号
 +
** bindnetaddr #绑定的网络地址
 +
** mcastaddr #多播地址
 +
** mcastport #实现多播地址的端口
 +
** ttl #一个报文最多被中继转发多少次,一般设置为1
 +
* logging {} # 跟日志相关
 +
* fileline: off
 +
* to_stderr: no # 表示是否需要发送到错误输出
 +
* to_logfile: yes #是不是送给日志文件
 +
* to_syslog: no #是不是送给系统日志
 +
* logfile: /var/log/cluster/corosync.log #日志文件路径
 +
* debug: off #是否启动调试
 +
* timestamp: on #日志是否需要记录时间戳
 +
* logger_subsys {} #日志的子系统
 +
* subsys: QUORUM #是否记录子系统的QUORUM日志信息
 +
* quorum {} #投票子系统
 +
* provider: corosync_votequorum #指明使用哪一种算法完成投票选举
 +
* nodelist {} #节点列表
  
openssl pkcs12 -in cert.pfx -out all.pem -nodes #客户端公钥与私钥,一起存在all.pem中
+
== 参考资源 ==
  
执行curl命令
+
* 高可用集群基础概念: http://blog.csdn.net/tjiyu/article/details/52643096
 
+
* 官方主页:http://corosync.github.io/corosync/
1、使用client.pem+key.pem
+
 
+
curl -k --cert client.pem --key key.pem https://www.xxxx.com
+
 
+
2、使用all.pem
+
 
+
curl -k --cert all.pem https://www.xxxx.com
+
 
+
使用-k,是不对服务器的证书进行检查,这样就不必关心服务器证书的导出问题了。 OpenSSL组件
+

Latest revision as of 16:21, 10 January 2018

Corosync 概述

Corosync 是一个源自OpenAIS项目,基于BSD许可证的集群引擎.核心功能是一个群组通信系统,具有实现应用程序高可用性的附加功能。该项目提供了四个 C API功能:

  • 具有虚拟同步的封闭进程组通信模型保证了用于创建复制状态机。
  • 一个简单的可用性管理器,在失败时重新启动应用程序进程。
  • 内存数据库配置和统计信息,提供设置,检索和接收信息更改通知的功能。
  • 达到法定人数或丢失时通知应用程序的法定人数系统。
  • 该软件设计用于在UDP/IP 和 InfiniBand网络上运行。

前提准备工作

系统 : CentOS 7 前提 :时间同步、防火墙关闭, selinux关闭; 集群模式 : 双机高可用 主机数量 :2

完成准备工作后,在每个主机都要安装软件包: corosync, 设置两台主机名解析(/etc/hosts),解析的结果必须要和本地使用的主机名保持一致.

例如 /etc/hosts

10.1.11.109 HA1
10.1.11.203 HA2

corosync的程序环境

  • 配置文件:/etc/corosync/corosync.conf
  • 密钥文件:/etc/corosync/authkey
  • 服务配置:/lib/systemd/system/corosync.service

corosync的配置实例及参数解析

主机1配置,编辑配置文件 /etc/corosync/corosync.conf 修改内容参考如下:

totem {
      version: 2
      crypto_cipher: aes256
      crypto_hash: sha1
      interface {
          ringnumber: 0
          bindnetaddr: <主机IP>
          mcastaddr: 239.255.100.1
          mcastport: 5405
          ttl: 1
      }
}                              

logging {
      fileline: off
      to_stderr: no
      to_logfile: yes
      logfile: /var/log/cluster/corosync.log
      to_syslog: no
      debug: off
      timestamp: on
      logger_subsys {
           subsys: QUORUM
           debug: off
      }
}

quorum {
      provider: corosync_votequorum
}

nodelist {
      node {
         ring0_addr: HA1
         nodeid: 1
      }
      node {
         ring0_addr: HA2
         nodeid: 2
      }
}

执行命令: corosync-keygen 生成用于双机通信互信密钥文件 /etc/corosync/authkey,至此主机1配置完成。

下面进行主机2的配置

  • 将主机1的/etc/corosync/authkey 分发到主机相同位置,两台主机共用相同的密钥文件,
  • 将主机1的配置 /etc/corosync/corosync.conf 分发到另一台主机,其中 bindnetaddr 修改为相应的IP

启动Corosync服务

分别在两台主机上执行命令 systemctl start corosync 重启服务,观察两台主机的corosync日志,如果服务器运行正常,将会返回如下类似结果:

tail -f /var/log/cluster/corosync.log 
Jan 10 02:46:16 [2297] HA2 corosync notice  [SERV  ] Service engine loaded: corosync cluster quorum service v0.1 [3]
Jan 10 02:46:16 [2297] HA2 corosync info    [QB    ] server name: quorum
Jan 10 02:46:16 [2297] HA2 corosync warning [TOTEM ] JOIN or LEAVE message was thrown away during flush operation.
Jan 10 02:46:16 [2297] HA2 corosync notice  [TOTEM ] A new membership (10.1.11.203:16) was formed. Members joined: 2
Jan 10 02:46:16 [2297] HA2 corosync notice  [QUORUM] Members[1]: 2
Jan 10 02:46:16 [2297] HA2 corosync notice  [MAIN  ] Completed service synchronization, ready to provide service.
Jan 10 02:46:16 [2297] HA2 corosync notice  [TOTEM ] A new membership (10.1.11.109:20) was formed. Members joined: 1
Jan 10 02:46:16 [2297] HA2 corosync notice  [QUORUM] This node is within the primary component and will provide service.
Jan 10 02:46:16 [2297] HA2 corosync notice  [QUORUM] Members[2]: 1 2
Jan 10 02:46:16 [2297] HA2 corosync notice  [MAIN  ] Completed service synchronization, ready to provide service

验证Corosync配置

  • 主机1执行命令:corosync-cfgtool -s 将会返回如下类似结果:
[root@HA1 ~]# corosync-cfgtool -s
Printing ring status.
Local node ID 1
RING ID 0
        id      = 10.1.11.109
        status  = ring 0 active with no faults
  • 主机2执行命令:corosync-cfgtool -s 将会返回如下类似结果:
[root@HA2 ~]# corosync-cfgtool -s
Printing ring status.
Local node ID 2
RING ID 0
        id      = 10.1.11.203
        status  = ring 0 active with no faults
  • 在其中任意一台主机执行命令:corosync-cmapctl |grep member
[root@HA2 ~]# corosync-cmapctl |grep member
runtime.totem.pg.mrp.srp.members.1.config_version (u64) = 0
runtime.totem.pg.mrp.srp.members.1.ip (str) = r(0) ip(10.1.11.109) 
runtime.totem.pg.mrp.srp.members.1.join_count (u32) = 1
runtime.totem.pg.mrp.srp.members.1.status (str) = joined
runtime.totem.pg.mrp.srp.members.2.config_version (u64) = 0
runtime.totem.pg.mrp.srp.members.2.ip (str) = r(0) ip(10.1.11.203) 
runtime.totem.pg.mrp.srp.members.2.join_count (u32) = 1
runtime.totem.pg.mrp.srp.members.2.status (str) = joined

以上就是corosync的配置过程, corosync 只是一个集群引擎,如果需要构建一个完整的应用集群,还需要和资源管理器Pacemaker 或者DRBD 以及具体的应用结合

corosync配置文件参考

  • totem{} #节点间的通信协议,主要定义通信方式、通信协议版本、加密算法等
  • version: 2 #定义协议版本
  • crypto_hash: #哈希加密算法 md5, sha1, sha256, sha384 and sha512.
  • crypto_cipher: #对称加密算法 aes256, aes192, aes128 and 3des
  • interface{} #定义集群心跳信息传递的接口,可以有多组;
    • ringnumber #环号
    • bindnetaddr #绑定的网络地址
    • mcastaddr #多播地址
    • mcastport #实现多播地址的端口
    • ttl #一个报文最多被中继转发多少次,一般设置为1
  • logging {} # 跟日志相关
  • fileline: off
  • to_stderr: no # 表示是否需要发送到错误输出
  • to_logfile: yes #是不是送给日志文件
  • to_syslog: no #是不是送给系统日志
  • logfile: /var/log/cluster/corosync.log #日志文件路径
  • debug: off #是否启动调试
  • timestamp: on #日志是否需要记录时间戳
  • logger_subsys {} #日志的子系统
  • subsys: QUORUM #是否记录子系统的QUORUM日志信息
  • quorum {} #投票子系统
  • provider: corosync_votequorum #指明使用哪一种算法完成投票选举
  • nodelist {} #节点列表

参考资源