存储类型设备
1、 DAS :Direct Attach Storage 直接附加存储,块级别设备
#主板上有CPU,运算器,控制器,存储器,自重内存属于非持久性存储(cup的临时存储),硬盘 (持久性存储) 硬盘 接口 IDE (ATA):133MB/S 并行接口 SATA : 600MB/s 串行接口 SCSI : 640MB/s 并行接口 SAS : 6Gbps 串行接口 USB : 480MB/s USB3.0 # 接口:不同的存储设备使用的总线不同,从而有自己特定的连接接口连接到主板总线上,由控制器控制; # I/0控制器:控制硬件设备完成电气动作,将cpu和内存中的数据信号转换为能够在总线线缆上传输的电气信号,从而实现数据转换传输并存储; # 知识点:HBA,即主机总线适配器英文“Host Bus Adapter”缩写。是一个在服务器和存储装置间提供输入/输出(I/O)处理和物理连接的电路板和/或集成电路适配器。 板载的为控制器(controler ),不是板载而是外部 扩展的则为适配器 (adapter) 如果主板上PCI PCI-E扩展槽,适配器板卡插在这些插槽上; 总结:适配器或者板载的控制器连接的存储都是DAS设备--------因为其直接连在了主板总线上,由主机主板提供电源。
思考:两个节点同时使用同一个DAS,是否会出现资源的争用?
#任何一个客户机挂载一个块级别的存储设备,对数据和元数据的操作时是在内存中实现的,然后由内存同步到磁盘当中,所以两个主机无法看到彼此的操作,因此存在对资源的争用情况;------因为块级别设备等级太低,-------如此一来可能会导致数据的损坏;
2、NAS :Network Attached Storage 网络附加存储 ,文件系统级别
#NFS文件系统被主机识别为一个文件系统,不同于DAS,DAS被主机识别为块设备可以直接分区格式化,而NFS不可以! #接口:文件API,文件共享服务器,文件系统级别,却无法对其分区格式化,已经是现成的文件系统,直接挂载使用 #能够提供NAS的协议:NFS协议,SMB协议(samba) #在网络上传输的是封装好的文件,使用TCP/IP协议封装数据传输的。 #缺陷:基于网络封装传输,存在性能问题
思考:如何提高NAS存储的吞吐量?
增大网络带宽,比如使用万兆以太网网络连接NAS存储;
3 SAN :Storage Area Network 存储区域网络,块级别
SCSI:Small Computer System Interface 小计算机系统接口 #窄带的SCSI:共8个接口,7个用于连接硬盘,1个用于做终结器 #宽带的SCSI:共16个接口,15个用于连接硬盘,1个用于做终结器 #不论窄带还是宽带,终结器接口一般为第7个 思考:如何标记SCSI一个总线上的每个磁盘? # 每个硬盘设定为一个target,使用target id 标识其位置 SCSI机制 思考:文件如何存放到对应的磁盘上? #文件由内核封装为数据块 ,内核调用主机上的适配器或者控制器 与磁盘通过总线中特定线缆通信,(线缆上运行的为scsi协议),使用scsi协议将数据块封装了scsi报文首部(包括目标地址),然后经过scsi线缆传输到特定目标地址的磁盘上; SAN机制 ----由SCSI机制拓展而来 # 数据块设备借助一个特定底层传输隧道(以太网、光缆) 替代scsi 线缆,从而将数据传输到特定网络的存储磁盘上; # 文件存储的信号传输 :包括 FC(光纤传输),FCoE(光信号在以太网传输),iSCSI(以太网传输)等
思考:initiator请求端,target目标端;如果目标端的磁盘数量不够用如何解决?
#将target作为一个大的逻辑单元,分隔为多个lun(Logical Unit Number),一个lun就作为一个存储磁盘使用;
思考:SAN存储的架构中,能否实现两个主机同时对一个target或者一个lun读写?
#SAN虽然实现了DAS的远距离传输(借助于FC,Internet等特定介质)----但是它依然是块级别。两个节点同时读写,依然会导致数据损坏;---------SAN和NAS的区别体现于此;
DRBD
DRBD:Distributed Replicated Block Device 分布式复制块设备 ,块级别存储
#DRBD 属于内核中的一种功能,实现本身无法复制的数据文件能够在内核级别进行传输复制,不再依赖于程序本身。 #DRBD 属于块级别的存储,本地一份数据,异地一份镜像数据,类似于RAID1,不过RAID1属于同一台机器,DRBD可以理解为两个位于网络连接的DAS设备。
工作机制:
如上图所示:DRBD工作在了内核中,借助于网络实现跨主机存储,生成按位对应的镜像。块设备级别,即可以对其进行分区格式化
(一)DRBD 的工作协议及与之对应的复制工作模式
A 协议 #异步模式 DRBD---TCP/IP 即可 B 协议 #半同步模式 NIC---NIC---NII Driver---TCP/IP即可 C 协议 #同步模式 DRBD--TCP/IP--NIC Driver---TCP/IP--DRBD--Disk Scheduler --Disk Driver --Disk Storage
默认工作模式为C协议 同步模式,从而保障了数据的安全,同时带来了网络I/0性能的降低,需要强大的网络带宽
生产环境中,本人认为数据安全放在第一位,使用C协议同步模式;当然可以自行定夺!
(二)DRBD 的工作模型
主从模型 #主节点的可以读写;从节点不可以读写,因为其无法挂载 双主模型 #资源必须以克隆资源的形式存在,分别存在于每个节点上;此时该资源作为高可用资源存在,一般在文件系统的高可用上使用;
(三)DRBD 的角色
primary:主节点,可读写 secondary:从节点,不能挂载更不可能读写 #缺点:DRBD在角色的切换比较慢!并且需要手动实现角色的升级与角色降级,不过考虑到DRBD的性价比,比起那些昂贵的存储设备,可以选择
(四)DRBD 发生集群分裂后的处理
针对两个节点来讲 #方法一:以谁的数据最新为准 #方法二:以谁的数据最老为准 #方法三:以谁的数据变化最少为准 #方法四:以谁的数据变化最大为准 以上四种方法根据情况而使用
(五) DRBD的组成部分
用户空间工具+内核模块(2.6.33及以后版本的内核) #用户空间工具(drbdadm):跟内核版本关系松散,只要能使用于Centos 6及对应硬件平台就可以 #内核模块:必须与当下的内核版本严格对应;
配置DRBD --主从模式
(一)必备步骤
#1、同步时间 #2、解析主机名 node11.linux.com node11 192.168.1.97 node12.linux.com node12 192.168.1.98 #3、ssh交换密钥 #以上步骤请参照我的博客:
(二)安装drbd用户工具,drbd-kmdl内核工具
drbd 工具包下载 #http://rpm.pbone.net/index.php3/stat/4/idpl/21657218/dir/redhat_el_6/com/drbd-8.4.3-33.el6.x86_64.rpm.html drbd-kmdl 内核工具包下载 #ftp://fr2.rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm
node11、node12两个节点安装
#rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm
(三)编辑配置文件
node11 上操作 #cd /etc/drbd.d #vim global_common.conf handlers { --------处理器(特定条件下执行的脚本或者程序) pri-on-incon-degr -------主节点降级后的动作,开启 pri-lost-after-sb -------集群脑裂后的动作,开启 local-io-error -------本地io错误后的动作,开启 starup { ---------------启动时 wfc-timeout 120; ------等待时间,开启 degr-wfc-timeout 240;------降级等待时间,开启 outdated-wfc-timeout ------超时等待时间,开启 options { --------------调优时使用 disk { --------------定义磁盘设备 on-io-error detach; ------一旦io错误就拆除,开启 net { protocol C ; --------使用C协议,同步复制模式,开启 cram-hamc-alg "sha1"; ------消息认证机制,加密使用sha1 shared-secret "2597758"; ------共享的密码 syncer { ------------------定义数据占用的带宽 rate 1000M
(四)创建磁盘分区
#两个节点都要创建分区,提供组件drbd设备的磁盘 #fdisk /dev/sda n +5G w #partx -a /dev/sda node11、node12分别创建一个5G大小的/sda9
(五) 配置资源
node11 上配置 #cd /etc/drbd.d #vim mystore.res 内容如下 resource mystore { on node11.linux.com { device /dev/drbd0; disk /dev/sda9; address 192.168.1.97:7789; meta-disk internal; } on node12.linux.com { device /dev/drbd0; disk /dev/sda9; address 192.168.1.98:7789; meta-disk internal; } } #resource name :可以使用除空白字符外的任意ACSII表中的字符; #drdb设备 :drbd的设备的访问路径,设备文件 /dev/drbd# #disk :各节点为组成此drbd设备所提供的块设备 #网络属性 :节点间为了实现跨主机磁盘镜像而使用网络配置 ###只有在使用drbdadm工具时(或者启动服务时)才会读取配置文件;对于多个资源的公共配置,可以提取出来只配置一次,通常保存在common中;此外还有global配置;除此以外以上的资源不会被使用;
以上global.common.conf 和 mystore.res 两个文件在node11、node12上必须相同
#scp golobal_common.conf mysqtore.res node12:/etc/drbd.d/
(六)两个设备上初始化资源,启动drbd服务
1)初始化资源,在node11、node12上分别执行 # drbdadm create-md mystore 管理工具 创建设备 资源名
2) 启动drbd服务,第一次读取配置文件(node11,、node12) # service drbd start
3)各节点查看当前的role # drbd-overview
此时还没有主节点与从节点,并且数据不一致
(七)设置主节点
node12 上设置为主节点 # drbdadm primary --force mystore # watch -n 1 ‘cat /proc/drbd‘ 查看主节点数据同步情况
node11 上查看 # watch -n 1 ‘cat /proc/drbd‘
主节点降级,node12上操作 #drbdadm secondary mystore #drbd-overview
从节点升级,node11上操作 #drbdadm primary mystore #drbd-overview
(八) 格式化磁盘
node11 (此时node11为主节点) # mke2fs -t ext4 /dev/drbd0 格式化磁盘 # mkdir /mysqldata 创建目录 # mount /dev/drbd0 /mysqldata 挂载磁盘到目录 # cd /mysqldata 进入目录 # touch 1.txt 创建文件 # umount /mysqldata -----------卸载/mydata # drbdadm secondary mystore ------------主节点先降级 node12 # drbdadm primary mystore -------------从节点先升级 # mkdir /mysqldata # mount /dev/drbd0 /mysqldata -------------挂载/dev/drbd0 到 /mydata # cd /mysqldata # ls
DRBD+Pacemaker 实现DRBD在文件系统上的高可用
根据上边node11、node12实现的DRBD结构,下边我们来实现DRBD在文件系统上的高可用
(1)安装程序包
#yum -y install corosync pacemaker #yum -y install crmsh-1.2.6-4.el6.x86_64.rpm pssh-2.3.1-2.el6.x86_64.rpm 注意:安装pacemaker之前确保没有安装hearbeat,否则会冲突
(2)保证集群资源开机不能启动
#cat /proc/drbd ------查看node11当前角色 #umount /mysqldata --------卸载 #drbdadm secondary mystore --------角色降级,保证当前两个节点没有升级角色 #service drbd stop -----停止drbd服务 #chkconfig drbd off -----开机不启动
(3)配置corosync
提供配置文件并编辑 #cd /etc/corosync #cp corosync.conf.example corosync.conf #vim corosync.conf 做如下修改 secauth: on bindnetaddr: 192.168.0.0 mcastaddr: 226.94.1.1 to_syslog: no timestamp: off service { name: pacemaker ver: 0 } aisexec { user: root group: root }
提供aukeys,保证各个节点信息传递安全 # mv /dev/random/ /dev/random.bak # ln /dev/urandom /dev/random # coronsync-keygen # rm /dev/random # mv /dev/random.bak /dev/random
将corosync.conf authkeys 文件拷贝到node12上一份,保证两个节点相同 #scp corosync.conf authkeys node12:/etc/corosync/ node11、node12 启动corsync服务 #service corosync start #crm status 查看当前节点状态
(3)添加集群资源
1)集群资源默认属性配置 #crm # crm(live)# configure # crm(live)configure# #property stonith-enabled=false # crm(live)configure##property no-quorum-policy=ignore # crm(live)configure##property default-resource-stikiness=100 # crm(live)# configure# show
2)设置drbd资源(mystore)设置为主资源类型 # crm(live)configure# 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 # crm(live)configure# verify # crm(live)configure# commit # crm(live)configure# show
3)将drbd|(mystore)的主资源类型设置为主从资源类型 # crm(live)configure# master ms_sqlstore mysqlstore meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify="True" # crm(live)configure# verify # crm(live)configure# commit # crm(live)configure# show
4)再定义一个主资源:文件系统资源mysqlfs,并且其必须要和主从资源的主节点上的资源在一起 # crm(live)configure# primitive mysqlfs ocf:heartbeat:Filesystem params device=/dev/drbd0 directory=/mysqldata fstype=ext4 op monitor interval=40 timeout=60 op start timeout=60s op stop timeout=60s on-fail=restart # crm(live)configure#verify 切记,此处不要提交commit
5)定义排列约束(定义mysqlfs主资源必须和 my_mysqlstore主从资源的主节点在一起) # crm(live)configure# colocation mysqlfs_with_ms_msyqlstore_master inf: mysqlfs ms_sqlstore:Master # crm(live)configure#verify 切记不要提交commit 6)定义顺序约束(一定是ms_sqlstore主从资源有一个节点先升级为主节点后,再挂载文件系统) # crm(live)configure# order mysqlfs_after_ms_sqlstore_master inf: ms_sqlstore:promote mysqlfs:start # crm(live)configure#verify # crm(live)configure#show
# crm(live)configure#show xml ---自我排查是否有错误 # crm(live)configure#commit ---提交事务
7)查看当前的资源及节点状态 # crm status
8)node11上查看 # mount --------查看当前已挂在的文件系统 # cd /mysqldata # ls
这个时候我们将node11设为备用,查看node12是否会自动升级为主节点,并挂载文件系统
9)node11 设为备用 # crm node standby node11.linux.com # crm status
node12 上查看挂载情况 # cd /mysqlsta # ls
node12 已经由从节点自动升级为了主节点,并将文件系统挂载了本地。基于文件系统的drbd高可用已经成功实现
拓展篇+
如果加一个mysql 资源,将mysql的数据存放在 /mysqldata目录中,成为一个mysql集群,需要注意什么? #VIP、 mysql资源代理、 mysqlfs文件系统资源 都要和ms_sqlstore:Master在一起 (定位为组资源即可)
PS:个人水平有限,不足之处请指出!
本文出自 “西风瘦猪” 博客,请务必保留此出处http://jungege.blog.51cto.com/4102814/1403350