Corosync:它属于OpenAIS(开放式应用接口规范)中的一个项目corosync一版本中本身不具 备投票功能,到了corosync 2.0之后引入了votequorum子系统也具备了投票功能了,如果我们用的是1版本的,又需要用到票数做决策时那该如何是好呢;当然,在红帽上把 cman + corosync结合起来用,但是早期cman跟pacemaker没法结合起来,如果想用pacemaker又想用投票功能的话,那就把cman当成 corosync的插件来用,把cman当成corodync的投票功能,当然,这里结合了两个了Messaging Lader;Corosync目前有两个主流的版本:一个是2系列的,另一个是1系列的稳定版;2版本和1版本差别很大,1版本不具有投票功能,2版本之 后引入了votequorum后支持投票功能了;OpenAIS自从诞生之后,红帽就基于这个规范研发了一个高可用集群的解决方案叫cman,并为cman提供了rgmangaer作为资源管理器,并且容合conga全生命周期的管理接口形成了RHCS;
Conrosync是从OpenAIS这个大项目中分支出来的一个项目,而Pacemaker是heartbeat v3版本中分裂出来专门用于提供高可用集群CRM的组件,功能十分强大, Coreosync在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等,Corosync可以提供一个完整的HA功 能,Corosync是未来的发展方向,在以后的新项目里,一般采用Corosync,而heartbeat_gui可以提供很好的HA管理功能,可以实 现图形化的管理。 # vim /etc/hosts 172.16.27.1 node1.tanxw.com 172.16.27.2 node2.tanxw.com # ssh-keygen -t rsa -P ‘’ # ssh-copy-id -i id_rsa.pub node2.tanxw.com 2、安装corosync,这里我们用ansible来安装,要使用ansible在一台主机上操作多台主机得需要事先安装ansible,那这里我们 就先说说安装和配置使用ansible,安装ansible也可以用yum来安装,不过需要解决依赖关系: # yum -y install python-jinja2 解决依赖关系 # yum -y install ansible 安装好之后再去/etc/ansible下配置两个节点的hostname: # vim /etc/ansible/hosts 把里面的内容全都注释掉,加下面你的节点hostname [corosync] node1.tanxw.com node2.tanxw.com
保存退出! # yum -y install python-jinja2 解决依赖关系 # yum -y install ansible 安装好之后再去/etc/ansible下配置两个节点的hostname: # vim /etc/ansible/hosts 把里面的内容全都注释掉,加下面你的节点hostname [corosync] node1.tanxw.com node2.tanxw.com 3、时间同步,需要事先配置好一台时间服务器,然后在crontab -e中输入: # crontab -e */5 * * * * /usr/sbin/ntpdte 172.16.27.0 &> /dev/null 表示每隔5分钟同步一次 好,准备工作做好了之后就可以安装corosync了,使用ansible查看两个节点是否已经安装了corosync:
[root@node0 ~]# ansible corosync -m shell -a 'rpm -q corosync' node2.tanxw.com | FAILED | rc=1 >> package corosync is not installed node1.tanxw.com | FAILED | rc=1 >> package corosync is not installed # ansible corosync -m yum -a "name=corosync state=present" 全部输出显示为绿色说明安装成功 [root@node0 ~]# ansible corosync -m shell -a 'rpm -q corosync' 再查看一下corosync的安装版本 node2.tanxw.com | success | rc=0 >> corosync-1.4.1-17.el6.x86_64 node1.tanxw.com | success | rc=0 >> corosync-1.4.1-17.el6.x86_64 # cp /etc/corosync/corosync.conf.example /etc/corosync.conf 复制一份corosync的样本配置文件 # vim /etc/corosync/corosync.conf 编辑配置文件修改如下内容 compatibility: whitetank #这个表示是否兼容0.8之前的版本 totem { #图腾,这是用来定义集群中各节点中是怎么通信的以及参数 version: 2 #图腾的协议版本,它是种协议,协议是有版本的,它是用于各节点互相通信的协议,这是定义版本的 secauth: on #表示安全认证功能是否启用的 threads: 0 #实现认证时的并行线程数,0表示默认配置 interface { # 指定在哪个接口上发心跳信息的,它是个子模块 ringnumber: 0 #环号码,集群中有多个节点,每个节点上有多个网卡,别的节点可以接收,同时我们本机的别一块网卡也可以接收,为了避免这些信息在这样的环状发送,因此要为这个网卡定义一个唯一的环号码,以避免心跳信息环发送。 bindnetaddr: 192.168.1.1 # 绑定的网络地址 mcastaddr: 226.94.1.1 #多播地址,一对多通信 mcastport: 5405 # 多播端口 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: AMF debug: off } } amf { # 跟编程接口相关的 mode: disabled } service { #定义一个服务来启动pacemaker ver: 0 #定义版本 name: pacemaker #这个表示启动corosync时会自动启动pacemaker } aisexec { #表示启动ais的功能时以哪个用户的身份去运行的 user: root group: root #其实这个块定义不定义都可以,corosync默认就是以root身份去运行的 } 这里我们改一个随机数墒池,再把配置好的corosync的配置和认证文件复制到另一个节点上去: # mv /dev/random /dev/m # ln /dev/urandom /dev/random 如果这把这个随机数墒池改了可以会产生随机数不够用,这个就要敲击键盘给这个墒池一些随机数;生成完这个key后把链接删除,再把墒池改回来;不过这样改可以会有点为安全,不过做测试的应该不要紧; # corosync-keygen # rm -rf /dev/random # mv /dev/m /dev/random 对于corosync而言,我们各节点之间通信时必须要能够实现安全认证的,要用到一个密钥文件: # corosync-keygen # 生成密钥文件,用于双机通信互信,会生成一authkey的文件 # scp authkey corosync.conf node2.tanxw.com:/etc/corosync/ 在配置好的节点上把这两个文件复制给另一个节点上的corosync的配置文件中去 安装pacemaker # ansible corosync -m yum -a “name=pacemaker state=present” 我们要想使用pacemaker配置的话需要安装一个pacemaker的接口,它的这个程序的接口叫crmshell,它在新版本的 pacemaker已经被独立出来了,不再是pacemaker的组成部分了,早期装上pacemaker就会自带有crmshell,因此要想用 crmshell的话得去安装crmshell,而安装crmshell又依赖于pssh的相关包,因此得安装这两个组件,(这里的这两个包是自己制件 的),哪个节点配置就安装在哪个节点上就可以了,也无需两个节点都安装这两个包: crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm # yum -y install crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm
一切都OK了之后就可以启动服务了,两个节点都需要启动:
在这里crm是一个很复杂的命令,可以在命令行直接输入crm进入crm的命令行模式:# crm
那在这里,我们如何去配置一个资源呢,虽然它跟heartbeat略有区别,但是概念基本上是一样的,下面我们就来配置一个web资源吧! [root@node1 corosync]# crm configure #进入crm命令行模式配置资源等 crm(live)configure# property #切换到property目录下,可以用两次tab键进行补全和查看 usage: property [$id=<set_id>] <option>=<value> # property的用法和格式 crm(live)configure# property stonith-enabled=false #禁用stonith-enabled crm(live)configure# verify #检查设置的属性是否正确 crm(live)configure# commit #检查没问题就可以提交了 crm(live)configure# show #查看当前集群的所有配置信息 node node1.tanxw.com node node2.tanxw.com #两个节点 property $id="cib-bootstrap-options" \ dc-version="1.1.10-14.el6-368c726" \ #DC的版本号 cluster-infrastructure="classic openais (with plugin)" \ #集群的基础架构,使用的是OpenAIS,插件式的 expected-quorum-votes="2" \ #期望节点的票数 stonith-enabled="false" #禁用stonith功能 crm(live)configure# 查看一下节点的运行状态:
要注意:如果一个节点挂了,就不拥有法定票数了,那资源是不会切换的
再进入crm定义我们所需要的资源吧! crm(live)# configure crm(live)configure# primitive webip ocf:heartbeat:IPaddr params ip=172.16.27.88 crm(live)configure# verify crm(live)configure# commit crm(live)configure# show node node1.tanxw.com node node2.tanxw.com primitive webip ocf:heartbeat:IPaddr \ params ip="172.16.27.88" property $id="cib-bootstrap-options" \ dc-version="1.1.10-14.el6-368c726" \ cluster-infrastructure="classic openais (with plugin)" \ expected-quorum-votes="2" \ stonith-enabled="false" crm(live)configure#
定义一个组,把之后定义的资源加到这个组里面去:
让node1节点离线:
好了,这种功能我们也完成了,如果让node1上线它也不会转回的,因为我们没有定义它的倾向性和故障转回,所以node1回来就回来吧,而服务依然运行在node2上;
DRBD (Distributed Replicated Block Device)分布式复制块设备,它是 Linux 平台上的分散式储存系统,通常用于高可用性(high availability, HA)集群中。DRBD 类似磁盘阵列的RAID 1(镜像),只不过 RAID 1 是在同一台电脑内,而 DRBD 是透过网络。
数据存储的几种类型: 9
1.1存储的概念与术语 1.1.3 DAS 介绍 DAS 是直连式存储(Direct-Attached Storage)的简称,是指将存储设备通过SCSI接口 或光纤通道直接连接到一台计算机上。当服务器在地理上比较分散,很难通过远程进行互连 时,DAS是比较好的解决方案。但是这种式存储只能通过与之连接的主机进行访问,不能实现数据与其他主机的共享,同时,DAS会占用服务器操作系统资源, 例如CPU资源、IO资 源等,并且数据置越大,占用操作系统资源就越严重。 NAS:(Network Attach Srorage)网络附加存储,它 就是个文件服务器,是文件系统级别,NAS和传统的文件存储服务或直接存储设备不同的地方在于NAS设备上面的操作系统和软件只提供了数据存储、数据访 问、以及相关的管理功能;此外,NAS设备也提供了不止一种文件传输协议。NAS系统通常有一个以上的硬盘,而且和传统的文件服务器一样,通常会把它们组 成RAID来提供服务;有了NAS以后,网络上的其他服务器就可以不必再兼任文件服务器的功能。NAS的型式很多样化,可以是一个大量生产的嵌入式设备, 也可以在一般的计算机上运行NAS的软件。
NAS用的是以文件为单位的通信协议,例如像是NFS(在UNIX系统上很常见)或是SMB(常 用于Windows系统)。NAS所用的是以文件为单位的通信协议,大家都很清楚它们的运作模式,相对之下,存储区域网络(SAN)用的则是以区块为单位 的通信协议、通常是通过SCSI再转为光纤通道或是iSCSI。(还有其他各种不同的SAN通信协议,像是ATA over Ethernet和HyperSCSI,不过这些都不常见。)
DRBD在远程传输上支持三种模式: 官方提供的DRBD的工作流程图:
第一步:配置两个节点上的双机互信,这步我前面的博文中已经写到过了,可以参数前面的博文:CentOS 6.5 heartbeat高可用集群的详解实现以及工作流程;
第二步:安装DRBD程序包,这一步一定要格外注意版本匹配问题:
内核模块程序包一定要跟你的系统内核保持一致,uname -r查看你的内核版本,内核模块的版本必须要严格对应,而用户空间的模块就不那么严格要求了,两个节点的时间也需要保持一致性;
# yum -y install drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm 每个节点都需要安装上这两个程序包 安装完成可以看一下drbd的配置文件: # vim /etc/drbd.conf 主配置文件 # vim /etc/drbd.d/global_common.conf 全局和common的配置 global { #全局配置 usage-count no; #这个为yes表示如果你本机可以连接互联网时drbd会通过互联网收集到你安装drbd的信息,官方统计说又多了一个人使用drbd实例,不用可以改为no # minor-count dialog-refresh disable-ip-verification } common { handlers { #处理器 # These are EXAMPLE handlers only. # They may have severe implications, # like hard resetting the node under certain circumstances. # Be careful when chosing your poison. pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; 定义了如果主节点降级了怎么处理的 pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f"; 这个定义了如果有脑裂了之后找不到主节点怎么处理的 local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f"; 定义了一旦本地节点发生IO错误时应该怎么处理 # fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; # split-brain "/usr/lib/drbd/notify-split-brain.sh root"; # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; } startup { 定义一个节点启动时另一个节点应该怎么做 # wfc-timeout(等待另一个节点上线的超时时长) # degr-wfc-timeout(等待超时后做降级处理) # outdated-wfc-timeout(过期的等待超时) # wait-after-sb(脑裂之后等待多长时长) } options { # cpu-mask on-no-data-accessible } disk { on-io-error detach; # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes # disk-drain md-flushes resync-rate resync-after al-extents # c-plan-ahead c-delay-target c-fill-target c-max-rate # c-min-rate disk-timeout } net { protocol C; cram-hmac-alg "sha1"; shared-secret "drbd.tanxw.com"; # protocol timeout max-epoch-size max-buffers unplug-watermark # connect-int ping-int sndbuf-size rcvbuf-size ko-count # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri # after-sb-1pri after-sb-2pri always-asbp rr-conflict # ping-timeout data-integrity-alg tcp-cork on-congestion # congestion-fill congestion-extents csums-alg verify-alg # use-rle } syncer { rate 1000M; } }
保存退出。 [root@node2 drbd.d]# fdisk /dev/sda WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): p Disk /dev/sda: 85.9 GB, 85899345920 bytes 255 heads, 63 sectors/track, 10443 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000e89e2 Device Boot Start End Blocks Id System /dev/sda1 * 1 26 204800 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 26 7859 62914560 8e Linux LVM /dev/sda3 7859 9164 10489446 8e Linux LVM Command (m for help): n Command action e extended p primary partition (1-4) e Selected partition 4 First cylinder (9165-10443, default 9165): Using default value 9165 Last cylinder, +cylinders or +size{K,M,G} (9165-10443, default 10443): Using default value 10443 Command (m for help): n First cylinder (9165-10443, default 9165): Using default value 9165 Last cylinder, +cylinders or +size{K,M,G} (9165-10443, default 10443): +3G Command (m for help): p Disk /dev/sda: 85.9 GB, 85899345920 bytes 255 heads, 63 sectors/track, 10443 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000e89e2 Device Boot Start End Blocks Id System /dev/sda1 * 1 26 204800 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 26 7859 62914560 8e Linux LVM /dev/sda3 7859 9164 10489446 8e Linux LVM /dev/sda4 9165 10443 10273567+ 5 Extended /dev/sda5 9165 9557 3156741 83 Linux Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) Syncing disks. [root@node2 drbd.d]# kpartx -af /dev/sda device-mapper: reload ioctl on sda1 failed: Invalid argument create/reload failed on sda1 device-mapper: reload ioctl on sda2 failed: Invalid argument create/reload failed on sda2 device-mapper: reload ioctl on sda3 failed: Invalid argument create/reload failed on sda3 device-mapper: reload ioctl on sda4 failed: Invalid argument create/reload failed on sda4 device-mapper: reload ioctl on sda5 failed: Invalid argument create/reload failed on sda5 [root@node2 drbd.d]# partx -a /dev/sda BLKPG: Device or resource busy error adding partition 1 BLKPG: Device or resource busy error adding partition 2 BLKPG: Device or resource busy error adding partition 3 [root@node2 drbd.d]# partx -a /dev/sda BLKPG: Device or resource busy error adding partition 1 BLKPG: Device or resource busy error adding partition 2 BLKPG: Device or resource busy error adding partition 3 BLKPG: Device or resource busy error adding partition 4 BLKPG: Device or resource busy error adding partition 5 [root@node2 drbd.d]#
第四步:根据上面的描述,我们要给它定义资源,包括资源名,drbd设备,disk以及网络属性,主要是这四个方面; # cd /etc/drbd.d/ # vim mystore.res resource mystore { #定义一个资源,用关键字resource; on node1.tanxw.com { #on说明在哪个节点上,跟uname -n保持一致,有多少个节点就定义多少个; device /dev/drbd0; #在磁盘上表现的drbd叫什么名; disk /dev/sda5; #所使用的磁盘设备是哪个; address 172.16.27.1:7789; #在node1这个节点上监听的套接字,默认监听在7789端口上; meta-disk internal; #保存drbd元数据信息的,表示就放在自己的磁盘区分上,也可以放在外部的磁盘上; } on node2.tanxw.com { device /dev/drbd0; disk /dev/sda5; address 172.16.27.2:7789; meta-disk internal; } } 保存退出,复制一份到别一个节点上,它们的配置文件要保持一致: # scp global_common.conf mystore.res node2.tanxw.com:/etc/drbd.d/ # drdbadm create-md mystore 在各自的节点上初始化资源 # server drbd start 启动drbd # watch -n 1 'cat /proc/drbd' 实现查看磁盘信息 # drbdadm primary --force mystore 在节点上把其中一个提升为主的 # watch -n 1 'cat /proc/drbd' 提升为主的之后再实现查看磁盘信息 注意:哪个是主节点哪个就可以挂载使用,不是主节点的连挂载都不可以挂载; OK、看到两个节点上的数据正在同步了,磁盘越大同步时需要时间越久;
第五步:在其中一个节点上进行格式化: # scp global_common.conf mystore.res node2.tanxw.com:/etc/drbd.d/ # drdbadm create-md mystore 在各自的节点上初始化资源 # server drbd start 启动drbd # watch -n 1 'cat /proc/drbd' 实现查看磁盘信息 # drbdadm primary --force mystore 在节点上把其中一个提升为主的 # watch -n 1 'cat /proc/drbd' 提升为主的之后再实现查看磁盘信息 好了,到这里就完成的drbd的工作模式就这么顺利的完成了,我不知道我是否说明白了!
要完成drbd的角色自动切换得要借助于corosync+pacmaker,那接下来我们就来安装配置corosync和pacemaker吧; 为了让高可用的配置顺利,两个节点都不能设置为主的,而且都不能启动,也不能开机自动启动,所以卸载降级: # cd # umount /dev/drbd0 # drbdadm secondary mystore 哪个是主的就在哪相节点上降级 # service drbd stop 两个节点都需要停止服务 # chkconfig drbd off 第六步:安装corosync + pacemaker,这里直接用yum来安装,两个节点都要安装上; # yum -y install corosync pacemaker # yum -y install crmsh pssh # cp /etc/corosync.conf.example /etc/corosync/corosync.conf # vim /etc/corosync/corosync.conf compatibility: whitetank totem { version: 2 secauth: on threads: 0 interface { ringnumber: 0 bindnetaddr: 172.16.0.0 mcastaddr: 226.98.188.188 mcastport: 5405 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: AMF debug: off } } amf { mode: disabled } service { name: pacemaker ver: 0 } aisexce { user: root group: root } # mv /dev/random /dev/m # ln /dev/urandom /dev/random 如果这把这个随机数墒池改了可以会产生随机数不够用,这个就要敲击键盘给这个墒池一些随机数;生成完这个key后把链接删除,再把墒池改回来;不过这样改可以会有点为安全,不过做测试的应该不要紧; # corosync-keygen # rm -rf /dev/random # mv /dev/m /dev/random 再把改好的配置复制一份到别一个节点上去,也保留一份给另一个节点: # scp -p authkey corosync.conf node2.tanxw.com:/etc/corosync/ 启动Corosync,每个节点都需要启动;
第七步:接下来进入crm命令行接口定义资源: # crm status 查看节点的运行状态 # crm # configure # property stonith-enabled=false # property no-quorum-policy=ignore # rsc_defaults resource-stickiness=100 # verify # commit # show # meta ocf:linbit:drbd 查看drbd的详细信息 # 定义资源,切换到configure中,mysqlstore定义资源名,drbd_resource=mystore这个是drbd名,后面定义的都是一些监控 # primitive mysqlstore ocf:linbit:drbd params drbd_resource=mystore op monitor role=Master interval=30s timeout=20s op monitor role=Slave interval=60s timeout=20s op start timeout=240s op stop timeout=100s # verify 检查语法 # 定义主资源 # master ms_mysqlstore mysqlstore meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=”True” # verify #commit 定义共享文件的资源,并且让服务器切换时可以自动挂载,device=/dev/drbd0挂载的设备,directory=/drbd挂载点,两个挂载点的文件名要一致: # primitive mysqlfs ocf:heartbeat:Filesystem params device=/dev/drbd0 directory=/drbd fstype=ext4 op monitor interval=30s timeout=40s on-fail-restart op start timeout=60s op stop timeout=60s # verify 定义排列约束: # collocation mysqlfs_with_ms_mysqlstore_master inf: mysqlfs ms_mysqlstore:Master # verify 定义顺序约束: # order mysqlfs_after_ms_mysqlstore_master mandatory: ms_mysqlstore:promote mysqlfs:start # show # commit
OK,再查看一下它们现在的状态,node2是主的,而node1是从的,可以到node2上查看文件是否已经挂载上去的,验证一下,再创建或修改几个文件进去都可以做一下测试的,而后再让node2停掉,看看node1是否会自动切换为主的:
改变节点的主从位置:
crm(live)# node standby node2.tanxw.com 把node2提升为备用的
crm(live)# node noline node2.tanxw.com 让node2上线
crm(live)# node standby node1.tanxw.com 把node1提升为备用的
crm(live)# node noline node1.tanxw.com 让node1上线,都可以随意切换一下再检测一下挂载的效果的;
(责任编辑:IT) |