Corosync简介:

   Corosync在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等。它是一个新兴的软件,2008年推出,但其实它并不是一个真正意义上的新软件,在2002年的时候有一个项目Openais , 它由于过大,分裂为两个子项目,其中可以实现HA心跳信息传输的功能就是Corosync,它的代码60%左右来源于Openais。Corosync可以提供一个完整的HA功能,但是要实现更多,更复杂的功能,那就需要将两者结合起来。二者主要提供心跳探测,但是没有资源管理能力。pacemaker 可以提供资源管理能力,是从heartbeat的v3版本中分离出来的一个项目。Corosync是未来的发展方向,在以后的新项目里,一般采用Corosync,而heartbeat_gui可以提供很好的HA管理功能,可以实现图形化的管理。另外相关的图形化有RHCS的套件luci+ricci。

高可用群集要求:


1、硬件一致性

2、软件(系统)一致性

3、时间一致性

拓扑图:

150650315.jpg
安装配置前准备:

 
  
  1. 设定172.16.11.11的节点名称为node1,172.16.11.12的节点名称为node2;

  2. 修改172.16.11.11和172.16.11.12的主机名称,使其节点名称与主机名称保持一致;

  3. # hostname node1

  4. # hostname node2

  5. 将主机名称写进node1和node2的配置文件中:

  6. # sed -i s@HOSTNAME=.*@HOSTNAME=node1@g /etc/sysconfig/network

  7. # sed -i s@HOSTNAME=.*@HOSTNAME=node2@g /etc/sysconfig/network

  8. 编辑node1和node2的/etc/hosts文件添加如下内容:

  9. 172.16.11.12    node2

  10. 172.16.11.11    node1

  11. 配置node1和node2的ssh互联互通;

  12. 在node1配置如下:

  13. # ssh-keyken -t rsa #生成一对密钥;

  14. # ssh-copy-id -i ./.ssh/id_rsa.pub root@node2 #将密钥放到node2节点上;

  15. 在node2配置如下:

  16. # ssh-keygen -t rsa #生成一对密钥;

  17. # ssh-copy-id -i ./.ssh/id_rsa.pub root@node1 #将密钥放到node1节点上;

  18. 修改node1和node2的时间保持一致

  19. # hwclock -s   将系统时间设置与硬件时间一致;

  20. 如果时间同步不了可以直接使用date命令修改即可;

  21. date命令格式:

  22. # date 月日时分年.秒

一、配置nfs服务器:

 
  
  1. # fdisk /dev/sda

  2. 创建两个大小为20G,类型为8e的分区,分区文件分别为/dev/sda5和/dev/sda6

  3. # partprobe /dev/sda

  4. # pvcreate /dev/sda{5,6}

  5. # vgcreate myvg /dev/sda{5,6}

  6. # lvcreate -L 20G -n mydata myvg

  7. # mke2fs -j -L MYDATA /dev/myvg/mydata

  8. 创建共享目录

  9. # mkdir /sharedata

  10. 将lvs开机自动挂载至/sharedata目录下

  11. # vim /etc/fstab

  12. 添加如下行

  13. LABEL=MYDATA  /sharedata   ext3    defaults  0 0

  14. # mount -a

  15. 添加mysql用户

  16. # useradd -r -u 150 mysql

  17. 修改/sharedata目录的属主和属组为mysql用户,让mysql用户对/sharedata目录具有读写权限;

  18. # chown -R mysql:mysql /sharedata/

  19. 通过nfs共享/sharedata/目录

  20. # vim /etc/exports

  21. 添加如下行

  22. /sharedata    172.16.11.11(rw,no_root_squash) 172.16.11.12(rw,no_root_squash)

  23. # service nfs start

  24. 让nfs开机自动启动

  25. # chkconfig nfs on

  26. # showmount -e localhost

  27. Export list for localhost:

  28. /sharedata 172.16.11.12,172.16.11.11

  29. 为node1和node2添加mysql用户并挂载nfs的共享目录

  30. # useradd -r -u 150 mysql

  31. 创建/data/mydata目录,让nfs服务器上的共享目录挂载在该目录下

  32. # mkdir -pv /data/mydata

  33. # mount -t nfs 172.16.11.21:/sharedata /data/mydata

  34. # ls /data/mydata/

  35. lost+found

  36. 验证一下mysql用户对/data/mydata目录的读写权限

  37. # su - mysql

  38. su: warning: cannot change directory to /home/mysql: No such file or directory

  39. -bash-3.2$ cd /data/mydata/

  40. -bash-3.2$ ls

  41. lost+found

  42. -bash-3.2$ touch test.txt

  43. -bash-3.2$ ls

  44. lost+found  test.txt

  45. -bash-3.2$ rm test.txt  

  46. -bash-3.2$ ls

  47. lost+found

  48. -bash-3.2$

  49. 以上操作验证mysql用户对/data/mydata目录的读写权限正常

二、node1和node2安装mysql

 
  
  1. node1安装mysql-5.5.24-linux2.6-i686.tar.gz

  2. #tar xf mysql-5.5.24-linux2.6-i686.tar.gz -C /usr/local/

  3. #cd /usr/local/

  4. #ln -sv mysql-5.5.24-linux2.6-i686 mysql

  5. #cd mysql

  6. #chown -R mysql:mysql .

  7. #scripts/mysql_install_db --datadir=/data/mydata/ --user=mysql

  8. #chown -R root .

  9. 提供配置文件并进行相应修改

  10. #cp support-files/my-large.cnf /etc/my.cnf

  11. #vim /etc/my.cnf

  12. datadir = /data/mydata

  13. thread_concurrency = 2

  14. 为mysql提供sysv服务脚本

  15. #cp support-files/mysql.server /etc/rc.d/init.d/mysqld

  16. 添加至服务列表

  17. #chkconfig --add mysqld

  18. # service mysqld start

  19. 修改PATH环境变量,让系统可以直接使用mysql的相关命令;

  20. #vim /etc/profile

  21. PATH=/usr/local/mysql/bin:$PATH  

  22. #export PATH=/usr/local/mysql/bin:$PATH

  23. #mysql   连上mysql成功

  24. 停掉mysql服务并使其不开机自动启动

  25. # service mysqld stop

  26. # chkconfig mysqld off

  27. # chkconfig --list mysqld   一定要确保开机不自动启动

  28. mysqld          0:off   1:off   2:off   3:off   4:off   5:off   6:off

  29. 卸载nfs

  30. # umount /data/mydata/

  31. node2安装mysql-5.5.24-linux2.6-i686.tar.gz

  32. #tar xf mysql-5.5.24-linux2.6-i686.tar.gz -C /usr/local/

  33. #cd /usr/local/

  34. #ln -sv mysql-5.5.24-linux2.6-i686 mysql

  35. #cd mysql

  36. #chown -R root:mysql .

  37. 提供配置文件并进行相应修改

  38. #cp support-files/my-large.cnf /etc/my.cnf

  39. #vim /etc/my.cnf

  40. datadir = /data/mydata

  41. thread_concurrency = 2

  42. 为mysql提供sysv服务脚本

  43. #cp support-files/mysql.server /etc/rc.d/init.d/mysqld

  44. 添加至服务列表

  45. #chkconfig --add mysqld

  46. # service mysqld start

  47. 修改PATH环境变量,让系统可以直接使用mysql的相关命令;

  48. #vim /etc/profile

  49. PATH=/usr/local/mysql/bin:$PATH  

  50. #export PATH=/usr/local/mysql/bin:$PATH

  51. #mysql   连上mysql成功

  52. 停掉mysql服务并使其不开机自动启动

  53. # service mysqld stop

  54. # chkconfig mysqld off

  55. # chkconfig --list mysqld   一定要确保开机不自动启动

  56. mysqld          0:off   1:off   2:off   3:off   4:off   5:off   6:off

  57. 卸载nfs

  58. # umount /data/mydata/

三、安装配置集群服务

安装需要的rpm包有:
corosync-1.2.7-1.1.el5.i386.rpm
corosynclib-1.2.7-1.1.el5.i386.rpm
heartbeat-3.0.3-2.3.el5.i386.rpm
heartbeat-libs-3.0.3-2.3.el5.i386.rpm
pacemaker-1.1.5-1.1.el5.i386.rpm
pacemaker-cts-1.1.5-1.1.el5.i386.rpm
pacemaker-libs-1.1.5-1.1.el5.i386.rpm
cluster-glue-1.0.6-1.6.el5.i386.rpm
cluster-glue-libs-1.0.6-1.6.el5.i386.rpm
resource-agents-1.0.4-1.1.el5.i386.rpm
libesmtp-1.0.4-5.el5.i386.rpm
 
  
  1. 下载上述rpm包至node1和node2的/root目录下,然后分别在node1和node2上安装上述rpm包;

  2. 安装corosync

  3. # yum -y --nogpgcheck localinstall *.rpm

  4. node1和node2提供配置文件

  5. # cp /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf

  6. # vim /etc/corosync/corosync.conf

  7. corosync.conf配置文件解析:

    1. totem {                   // HA多个节点之间实现心跳信息传递的相关协议简称;
             version: 2;       //版本号
             secauth: on       //是否打开安全认证
             threads: 0         //启用的线程数,一般和CPU数保持一致,0表示无限制
             interface {
                     ringnumber: 0
                     bindnetaddr: 10.15.62.0     //通过哪个网络地址进行通讯,可以给个网络地址,该地址掩码会自动计算;
                     mcastaddr: 226.94.1.1       //广播地址
                     mcastport: 5405             //广播地址端口
             }
      }
      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: AMF
                     debug: off
             }
      }



  8. 修改如下选项:

  9. secauth: on  

  10. bindnetaddr: 172.16.11.1

  11. mcastaddr: 226.100.7.1

  12. to_syslog: no   //关掉记录到系统日志功能,减轻系统I/O资源;

  13. 添加如下选项:

  14. service {       //定义一个服务来使用pacemaker;

  15.        ver:  0 //版本号;

  16.        name: pacemaker //使用到了pacemaker

  17. }

  18. aisexec {        //定义corosync的工作用户,需要用root用户使用到openais的一些子选项

  19.    user:   root

  20.    group:  root

  21. }

  22. 生成节点间通信认证密钥:

  23. # corosync-keygen  //会自动的在/etc/corosync目录下生成一个二进制格式的key文件,权限为400

  24. 复制/etc/corosync/下的authkey、corosync.conf至node2的/etc/corosync/目录下

  25. # scp authkey corosync.conf node2:/etc/corosync/

  26. node1和node2节点创建日志文件目录:

  27. # mkdir -p /var/log/cluster/

  28. # ssh node2 'mkdir -p /var/log/cluster/'

  29. 启动corosync服务:

  30. # service corosync start

  31. # ssh node2 '/etc/rc.d/init.d/corosync start'

  32. 查看corosync引擎是否正常启动:

  33. # grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log

  34. 查看初始化成员节点通知是否正常发出:

  35. # grep  TOTEM  /var/log/cluster/corosync.log

  36. 检查启动过程中是否有错误产生:

  37. # grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources

  38. 查看pacemaker是否正常启动:

  39. # grep pcmk_startup /var/log/cluster/corosync.log

  40. 使用如下命令查看集群节点的启动状态:

  41. # crm status

  42. ============

  43. Last updated: Tue Aug  7 12:43:40 2012

  44. Stack: openais

  45. Current DC: node1 - partition with quorum

  46. Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f

  47. 2 Nodes configured, 2 expected votes

  48. 1 Resources configured.

  49. ============

  50. Online: [ node1 node2 ]

四、添加集群资源
node1上添加集群资源(集群资源在任意一个节点配置即可,这里选择node1节点)

在添加集群资源前首先对进行简单的配置
 
  
  1. 禁用stonith:

  2. # crm configure property stonith-enabled=false

  3. corosync默认启用了stonith,而当前集群并没有相应的stonith设备,因此此默认配置目前尚不可用,这可以通过如下命令验正:

  4. # crm_verify -L
    crm_verify[5202]: 2012/04/16_18:10:38 ERROR: unpack_resources: Resource start-up disabled since no STONITH resources have been defined
    crm_verify[5202]: 2012/04/16_18:10:38 ERROR: unpack_resources: Either configure some or disable STONITH with the stonith-enabled option
    crm_verify[5202]: 2012/04/16_18:10:38 ERROR: unpack_resources: NOTE: Clusters with shared data need STONITH to ensure data integrity
    Errors found during check: config not valid
     -V may provide more detail
  1. 修改忽略quorum不能满足的集群状态检查:

  2. # crm configure property no-quorum-policy=ignore

  3. 对于只有两节点的集群来讲,此时的集群状态为"WITHOUT quorum",即已经失去了quorum,此时集群服务本身已经不满足正常运行的条件,因此,我们修改忽略quorum不能满足的集群状态检查:

  4. 为资源指定默认黏性值:

  5. # crm configure rsc_defaults resource-stickiness=100

  6. 资源黏性值解析:

  7. 在实际应用中,如果两台主机的性能差不多,当主节点当机后,次节点接受web资源,而当主节点恢复的时候,次节点又需要将WEB资源还给主节点,这就造成了一段时间内服务不可访问,降低了高可用性,这时候,我们就需要定义资源的粘性值,资源根据粘性值在决定当主节点恢复后,是否离开当前节点。

    资源黏性值范围及其作用:
    0:这是默认选项。资源放置在系统中的最适合位置。这意味着当负载能力较好或较差的节点变得可用时才转移资源。此选项的作用基本等同于自动故障回复,只是资源可能会转移到非之前活动的节点上;
    大于0:资源更愿意留在当前位置,但是如果有更合适的节点可用时会移动。值越高表示资源越愿意留在当前位置;
    小于0:资源更愿意移离当前位置。绝对值越高表示资源越愿意离开当前位置;
    INFINITY:如果不是因节点不适合运行资源(节点关机、节点待机、达到migration-threshold 或配置更改)而强制资源转移,资源总是留在当前位置。此选项的作用几乎等同于完全禁用自动故障回复;
    -INFINITY:资源总是移离当前位置
添加资源
 
  
  1. 添加访问mysql的ip

  2. # crm configure primitive vip ocf:heartbeat:IPaddr params ip=172.16.11.1

  3. 添加nfs文件系统

  4. # crm configure primitive mynfs ocf:heartbeat:Filesystem params device="172.16.11.21:/sharedata" directory="/data/mydata" fstype="nfs" op start timeout=60s op stop timeout=60s

  5. # crm configure commit

  6. 查看定义的资源

  7. # crm configure show

  8. node node1 \

  9.    attributes standby="off"

  10. node node2 \

  11.    attributes standby="off"

  12. primitive mynfs ocf:heartbeat:Filesystem \

  13.    params device="172.16.11.21:/sharedata" directory="/data/mydata" fstype="nfs" \

  14.    op start interval="0" timeout="60s" \

  15.    op stop interval="0" timeout="60s"

  16. primitive vip ocf:heartbeat:IPaddr \

  17.    params ip="172.16.11.1"

  18. property $id="cib-bootstrap-options" \

  19.    dc-version="1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f" \

  20.    cluster-infrastructure="openais" \

  21.    expected-quorum-votes="2" \

  22.    stonith-enabled="false" \

  23.    last-lrm-refresh="1344248837" \

  24.    no-quorum-policy="ignore"

  25. 查看资源工作状态

  26. # crm status

  27. ============

  28. Last updated: Tue Aug  7 14:14:06 2012

  29. Stack: openais

  30. Current DC: node2 - partition with quorum

  31. Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f

  32. 2 Nodes configured, 2 expected votes

  33. 2 Resources configured.

  34. ============

  35. Online: [ node1 node2 ]

  36. vip    (ocf::heartbeat:IPaddr):    Started node1

  37. mynfs  (ocf::heartbeat:Filesystem):    Started node2

  38. 此时mynfs资源在node2上启动,去node2节点查看/data/mydata目录

  39. # ls /data/mydata/

  40. ibdata1  ib_logfile0  ib_logfile1  lost+found  mysql  mysql-bin.000001  mysql-bin.000002  mysql-bin.index  node1.err  node2.err  performance_schema  test  testdb

  41. node2上有数据文件,而node1没有数据文件

  42. 让node2变为被动节点

  43. # crm node standby

  44. 此时查看资源工作状态

  45. # crm status

  46. ============

  47. Last updated: Tue Aug  7 14:21:08 2012

  48. Stack: openais

  49. Current DC: node2 - partition with quorum

  50. Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f

  51. 2 Nodes configured, 2 expected votes

  52. 2 Resources configured.

  53. ============

  54. Node node2: standby

  55. Online: [ node1 ]

  56. vip    (ocf::heartbeat:IPaddr):    Started node1

  57. mynfs  (ocf::heartbeat:Filesystem):    Started node1

  58. 此时mynfs工作在node1节点上

  59. 去node1节点的/data/mydata目录验证一下

  60. # ls /data/mydata/

  61. ibdata1  ib_logfile0  ib_logfile1  lost+found  mysql  mysql-bin.000001  mysql-bin.000002  mysql-bin.index  node1.err  node2.err  performance_schema  test  testdb

  62. 此是node1的/data/mydata/目录已经有数据文件,而node2的/data/mydata/目录中没有任何数据文件

    添加mysqld服务

  1. # crm configure primitive mysqld lsb:mysqld

  2. # crm configure commit

    资源约束解析:

    从上面的信息中可以看出vip和mynfs有可能会分别运行于两个节点上,这对于通过此IP提供mysql服务的应用来说是不成立的,即此两者资源必须同时运行在某节点上。由此可见,即便集群拥有所有必需资源,但它可能还无法进行正确处理。资源约束则用以指定在哪些群集节点上运行资源,以何种顺序装载资源,以及特定资源依赖于哪些其它资源。pacemaker共给我们提供了三种资源约束方法:

    1)Resource Location(资源位置):定义资源可以、不可以或尽可能在哪些节点上运行;
    2)Resource Collocation(资源排列):排列约束用以定义集群资源可以或不可以在某个节点上同时运行;
    3)Resource Order(资源顺序):顺序约束定义集群资源在节点上启动的顺序;
    定义约束时,还需要指定分数。各种分数是集群工作方式的重要组成部分。其实,从迁移资源到决定在已降级集群中停止哪些资源的整个过程是通过以某种方式修改分数来实现的。分数按每个资源来计算,资源分数为负的任何节点都无法运行该资源。在计算出资源分数后,集群选择分数最高的节点。 INFINITY(无穷大)目前定义为 1,000,000。加减无穷大遵循以下3个基本规则:
    1)任何值 + 无穷大 = 无穷大
    2)任何值 - 无穷大 = -无穷大
    3)无穷大 - 无穷大 = -无穷大
    定义资源约束时,也可以指定每个约束的分数。分数表示指派给此资源约束的值。分数较高的约束先应用,分数较低的约束后应用。通过使用不同的分数为既定资源创建更多位置约束,可以指定资源要故障转移至的目标节点的顺序。
  1. 定义排列约束

  2. # crm configure collocation mysqld_with_mynfs_vip inf: vip mynfs mysqld

  3. 定义顺序约束,

  1. # crm configure order mysqld_after_mynfs_after_vip mandatory: vip mynfs mysqld

  2. # crm configure commit

  3. 查看集群信息库中定义的collocation和order约束

  4. # crm configure show xml

  5. //collocation约束配置信息//

  6. <rsc_colocation id="mysqld_with_mynfs_vip" score="INFINITY">

  7.        <resource_set id="mysqld_with_mynfs_vip-0">

  8.          <resource_ref id="vip"/>

  9.          <resource_ref id="mynfs"/>

  10.          <resource_ref id="mysqld"/>

  11. //order约束配置信息//

  12. <rsc_order id="mysqld_after_mynfs_after_vip" score="INFINITY">

  13.        <resource_set id="mysqld_after_mynfs_after_vip-0">

  14.          <resource_ref id="vip"/>

  15.          <resource_ref id="mynfs"/>

  16.          <resource_ref id="mysqld"/>

  17. 查看资源工作状态

  18. # crm status

  19. ============

  20. Last updated: Tue Aug  7 14:59:46 2012

  21. Stack: openais

  22. Current DC: node2 - partition with quorum

  23. Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f

  24. 2 Nodes configured, 2 expected votes

  25. 3 Resources configured.

  26. ============

  27. Online: [ node1 node2 ]

  28. vip    (ocf::heartbeat:IPaddr):    Started node1

  29. mynfs  (ocf::heartbeat:Filesystem):    Started node1

  30. mysqld (lsb:mysqld):   Started node1

  31. 让node1节点切换为备用状态

  32. # crm node1 standby

  33. 查看资源工作状态

  34. # crm status

  35. ============

  36. Last updated: Tue Aug  7 15:03:26 2012

  37. Stack: openais

  38. Current DC: node2 - partition with quorum

  39. Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f

  40. 2 Nodes configured, 2 expected votes

  41. 3 Resources configured.

  42. ============

  43. Node node1: standby

  44. Online: [ node2 ]

  45. vip    (ocf::heartbeat:IPaddr):    Started node2

  46. mynfs  (ocf::heartbeat:Filesystem):    Started node2

  47. mysqld (lsb:mysqld):   Started node2

  48. 此时mysqld工作在node2节点上,去node2节点验证一下

  49. # mysql

  50. Welcome to the MySQL monitor.  Commands end with ; or \g.

  51. Your MySQL connection id is 1

  52. Server version: 5.5.24-log MySQL Community Server (GPL)

  53. Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

  54. Oracle is a registered trademark of Oracle Corporation and/or its

  55. affiliates. Other names may be trademarks of their respective

  56. owners.

  57. Type 'help;' or '\h'for help. Type '\c' to clear the current input statement.

  58. mysql> show databases;

  59. +---------------------+

  60. | Database            |

  61. +---------------------+

  62. | information_schema  |

  63. | #mysql50#lost+found |

  64. | mysql               |

  65. | performance_schema  |

  66. | test                |

  67. | testdb              |

  68. +---------------------+

  69. 6 rows in set (0.06 sec)

  70. mysql>

  71.                              由此资源已经成功生效;

以上就是基于corosync+pacemaker+nfs实现mysql的过程。