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;node
Conrosync是从OpenAIS这个大项目中分支出来的一个项目,而Pacemaker是heartbeat v3版本中分裂出来专门用于提供高可用集群CRM的组件,功能十分强大, Coreosync在传递信息的时候能够经过一个简单的配置文件来定义信息传递的方式和协议等,Corosync能够提供一个完整的HA功 能,Corosync是将来的发展方向,在之后的新项目里,通常采用Corosync,而heartbeat_gui能够提供很好的HA管理功能,能够实 现图形化的管理。
Pacemaker是一个集群管理器。它利用首选集群基础设施(OpenAIS 或heartbeat)提供的消息和成员能力,由辅助节点和系统进行故障检测和回收,实现性群集服务(亦称资源)的高可用性。
corosync+pacemaker:在配置corosync时最好具备三个以上的节点,而且节点个数为奇数个,若是使用偶数个节点的话也不要紧,只是要关闭不具备法定票数的决策策略功能;
实现过程:
一、双机互信须要设置好,hosts文件须要解析好,时间要同步 python
# 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
二、安装corosync,这里咱们用ansible来安装,要使用ansible在一台主机上操做多台主机得须要事先安装ansible,那这里咱们 就先说说安装和配置使用ansible,安装ansible也能够用yum来安装,不过须要解决依赖关系: mysql
# yum -y install python-jinja2 解决依赖关系 # yum -y install ansible 安装好以后再去/etc/ansible下配置两个节点的hostname: # vim /etc/ansible/hosts 把里面的内容全都注释掉,加下面你的节点hostname [corosync] node1.tanxw.com node2.tanxw.com
保存退出!
咱们这里使用172.16.27.0这台主机安装ansible,操做172.16.27.1和.2这两台主机,测试一下: web
# yum -y install python-jinja2 解决依赖关系 # yum -y install ansible 安装好以后再去/etc/ansible下配置两个节点的hostname: # vim /etc/ansible/hosts 把里面的内容全都注释掉,加下面你的节点hostname [corosync] node1.tanxw.com node2.tanxw.com
三、时间同步,须要事先配置好一台时间服务器,而后在crontab -e中输入: sql
# crontab -e */5 * * * * /usr/sbin/ntpdte 172.16.27.0 &> /dev/null 表示每隔5分钟同步一次
好,准备工做作好了以后就能够安装corosync了,使用ansible查看两个节点是否已经安装了corosync:shell
[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的配置文件中去
安装pacemakerbootstrap
# ansible corosync -m yum -a “name=pacemaker state=present”vim
咱们要想使用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资源吧!
因为咱们的corosync默认是启用stonith功能的,可是咱们这里没有stonith设备,若是咱们直接去配置资源的话,因为没有 stonith功能,因此资源的切换并不会完成,因此要禁用stonith功能,但禁用stonoith须要咱们去配置集群的全局stonith属性,全 局属性是对全部的节点都生效;
[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#
查看一下节点的运行状态:
要注意:若是一个节点挂了,就不拥有法定票数了,那资源是不会切换的
集群的策略有几种:
stopped :中止服务
ignore :忽略,继续运行
freeze :冻结,已经链接的请求继续响应,新的请求再也不响应
suicide :自杀,将服务kill掉
再进入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#
定义一个组,把以后定义的资源加到这个组里面去:
# group weservice webip webserver
好了,这种功能咱们也完成了,若是让node1上线它也不会转回的,由于咱们没有定义它的倾向性和故障转回,因此node1回来就回来吧,而服务依然运行在node2上;
crm(live)node# online node1.tanxw.com 让node1重新上线
DRBD (Distributed Replicated Block Device)分布式复制块设备,它是 Linux 平台上的分散式储存系统,一般用于高可用性(high availability, HA)集群中。DRBD 相似磁盘阵列的RAID 1(镜像),只不过 RAID 1 是在同一台电脑内,而 DRBD 是透过网络。
DRBD Resource:DRBD所具备的几种属性:
resource name:可使用除空白字符外的任意ACSII表中的字符;
drbd设备:drbd的设备的访问路径,设备文件/dev/drbd#;
disk:各节点为组成此drbd设备所提供的块设备,一般是一个磁盘分区;
网络属性:节点间为了实现跨主机磁盘镜像而使用的网络配置;
注意:用户空间工具与drdb与内核中使用的模块版本要保持一致,只有在使用drbdadm工具时才会读取配置文件,对多个资源的公共配置,能够提取出来只配置一次,一般保存在Common中,此外还有global配置,这种配置跟资源自己没有关系的;
drbd的组成部分:第一部分用户空间工具;第二部分是内核模块(在2.6.33及之后版本的内核直接在内核中就有了)
用户空间工具:跟内核版本关系比较松散,只要是能适用于CentOS 6及对应硬件平台的就OK;
内核模块:必须与当下内核版本严格对应;其中drbd内核模块代码已经整合进Linux内核2.6.33之后的版本中,所以,若是您的内核版本高于此版本的话,你只须要安装管理工具便可;不然,您须要同时安装内核模块和管理工具两个软件包,而且此二者的版本号必定要保持对应。
进程间通讯的三种方式:消息序列、旗语及共享内存:
什么是消息队列:
消息被发送到队列中,"消息队列"是在消息的传输过程当中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是 提供路由并保证消息的传递;若是发送消息时接收者不可用,消息队列会保留消息,直到能够成功地传递它;消息队列就是一个消息的链表。能够把消息看做一个记 录,具备特定的格式以及特定的优先级。对消息队列有写权限的进程能够向消息队列中按照必定的规则添加新消息;对消息队列有读权限的进程则能够从消息队列中 读走消息。消息队列是随内核持续的。
什么是旗语、什么是信号量:
Linux的旗语就是操做系统原理中的信号量,有PV操做,释放旗语会自动唤醒下一个等待获取旗语的进程;
为了防止出现因多个程序同时访问一个共享资源而引起的一系列问题,咱们须要一种方法,它能够经过生成并使用令牌来受权,在任一时刻只能有一个执行线程访 问代码的临界区域。临界区域是指执行数据更新的代码须要独占式地执行。而信号量就能够提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问 它,也就是说信号量是用来调协进程对共享资源的访问的。
信号量是一个特殊的变量,程序对其访问都是原子操做,且只容许对它进行等待(即P(信号变量))和发送(即V(信号变量))信息操做。最简单的信号量是只能取0和1的变量,这也是信号量最多见的一种形式,叫作二进制信号量。而能够取多个正整数的信号量被称为通用信号量。
什么是共享内存:
顾名思义,共享内存就是容许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种很是有效的方式。不一样进程之 间共享的内存一般安排为同一段物理内存。进程能够将同一段共享内存链接到它们本身的地址空间中,全部进程均可以访问共享内存中的地址,就好像它们是由用C 语言函数malloc分配的内存同样。而若是某个进程向共享内存写入数据,所作的改动将当即影响到能够访问同一段共享内存的任何其余进程。
数据存储的几种类型:
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,不过这些都不常见。)
SAN:(Storage Area Network)存储区域网络,把 SCSI协议借助于其它网络协议实现传送的;1991年,IBM公司在S/390服务器中推出了ESCON(Enterprise System Connection)技术。它是基于光纤介质,最大传输速率达17MB/s的服务器访问存储器的一种链接方式。在此基础上,进一步推出了功能更强的 ESCON Director(FC SWitch),构建了一套最原始的SAN系统。
它是一种高速网络或子网络,提供在计算机与存储系统之间的数据传输。存储设备是指一台或多台用以存储计算机数据的磁盘设备,一般指磁盘阵列。
DAS、NAS和SAN三种存储方式比较
存储应用最大的特色是没有标准的体系结构,这三种存储方式共存,互相补充,已经很好知足企业信息化应用。
从 链接方式上对比,DAS采用了存储设备直接链接应用服务器,具备必定的灵活性和限制性;NAS经过网络(TCP/IP,ATM,FDDI)技术链接存储 设备和应用服务器,存储设备位置灵活,随着万兆网的出现,传输速率有了很大的提升;SAN则是经过光纤通道(Fibre Channel)技术链接存储设备和应用服务器,具备很好的传输速率和扩展性能。三种存储方式各有优点,相互共存,占到了磁盘存储市场的70%以上。 SAN和NAS产品的价格仍然远远高于DAS.许多用户出于价格因素考虑选择了低效率的直连存储而不是高效率的共享存储。
客观的说,SAN和NAS系统已经能够利用相似自动精简配置(thin provisioning)这样的技术来弥补早期存储分配不灵活的短板。然而,以前它们消耗了太多的时间来解决存储分配的问题,以致于给DAS留有足够的 时间在数据中心领域站稳脚跟。此外,SAN和NAS依然问题多多,至今没法解决。
DRBD在远程传输上支持三种模式:
一、异步:所谓异步就是指数据只须要发给本地的TCP/IP协议栈就能够了,本地存完就OK;而DRBD只须要把数据放到TCP/IP协议栈,放到发送队列中准备发送就返回了;这种方式更高效;
二、半同步:数据已经发送到对方的TCP/IP协议栈上,对方的TCP/IP协议栈已经把数据接收下来了就返回,数据存不存下来就无论了;
三、同步:数据必须确保对方把数据写入对方的磁盘再返回的就叫同步;这种方式数据更可靠;
官方提供的DRBD的工做流程图:
====================DRBD + Corosync、Pacemaker实现DRBD角色自动切换=======================
在 运行drbd时,他并不会自动完成角色的切换,那怎么让它具备这样的功能呢,这里就得用到Corosync+Pacemaker了,结合 corosync+pacemaker的drbd就能够自动完成角色的切换,一旦一个drbd的节点出现故障就能够自动切换到别一个节点上继续提供服务, 那接下来咱们就来配置一下drbd + corosync、pacemaker的实现;
第一步:配置两个节点上的双机互信,这步我前面的博文中已经写到过了,能够参数前面的博文:CentOS 6.5 heartbeat高可用集群的详解实现以及工做流程;
第二步:安装DRBD程序包,这一步必定要格外注意版本匹配问题:
内核模块程序包必定要跟你的系统内核保持一致,uname -r查看你的内核版本,内核模块的版本必需要严格对应,而用户空间的模块就不那么严格要求了,两个节点的时间也须要保持一致性;
drbd-8.4.3-33.el6.x86_64.rpm -->用户空间工具
drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm -->内核空间模块,这个必需要跟内核版本保持一致
# 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以及网络属性,主要是这四个方面;
定义一个资源/etc/drbd.d/,内容以下:
# 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上线,均可以随意切换一下再检测一下挂载的效果的;