存储的类型:
DAS:Direct Attached Storage,直接附加存储。
NAS:Network Attached Storage,网络。
SAN:Storage Area Network,存储区域网络。
ide, usb, sata, scsi, sas,主板的硬盘接口上有控制芯片,硬盘的集成电路板上也有控制芯片,磁盘上的数据交换就是通过两个芯片完成的。IDE既是一种接口规范,同时也是一种协议,硬件之间的通信都需要协议来完成。不同的接口类型,使用的是它们专有的线缆,和专有的协议。而且它们之间的协议设计有高低级之分,SCSI就很牛,一个主板上的接口,可以接入15*32块硬盘。SCSI协议分为物理层、传输层、和应用层三层,就像tcp/ip协议一样,协议用来保证报文能够准确的送到指定的硬盘中。SCSI的传输最高速度可达480MB/s。为了保证带宽可用,一般使用光纤线缆。但是使用了光纤线缆,此前的SCSI控制器将无法使用。于是,SCSI的驱动程序将SCSI报文封装之后,不再通过SCSI控制器,而是经由光适配器转换成光信号后,发送到光缆上。但是接收方必须能够处理光信号,硬盘是处理不了的,所以便有了光交换机。它能够接收光信号,在另外的接口上,转换成SCSI报文,进而传递到SCSI硬盘。光网的协议为FC,当然,SCSI只是为了方便说明,其他接口也一样。
而如果光交换机的接口够多,可以使用光纤接入其他的主机,就构成了SAN。但是光纤太贵了,很多人根本买不起,于是就有人将光纤换成了网线。这样一来,只要将SCSI协议转换成tcp/ip协议,并将光交换机换成linux主机,让报文通过网卡传递到linux主机就可以了,传递到linux主机上的报文为iscsi协议的报文。但是千兆以太网的传输速度才125MB/s,连个IDE的最大速度都达不到,性能也就可想而知了。
两台主机,每台主机提供一个块设备,任何程序需要往硬盘中存数据,都需要发起系统调用。而drbd是在硬盘驱动和系统调用之间加入了一个中间层。另一台主机也一样。当应用程序需要存数据时,将存储请求发给内核,内核中有个叫块层的接收请求后,本来是应该通过调度器交由磁盘驱动,写入磁盘的。但由于需要经过drbd层,这个层次不对请求做任何修改,只是将其复制一份。然后兵分两路,一份继续扔给驱动,另一份则扔给网卡,经过网络达到另一台主机。另一台主机的网卡收到后,内核知道此报文是要和brbd进行通信的,于是交给了brbd层,brbd层再交给磁盘驱动。
两台主机不能同时写,只能为主从模式,当主挂了后,从就称为主,就能写了。等新主机上线后成为从,再由主进行数据同步。
disk scheduler,磁盘调度器,它会将缓冲中的所有请求排队后,再发给磁盘驱动。所谓的排队就是将读的请求分为一类,写分为一类。发送的时候不是按照先到先发送的方式进行的,而是将所有的比如读合并为一个请求发给驱动,再将写请求合并为一个发送给驱动。因此,如果调度器设计的足够好的话,可以极大的提升磁盘读写的性能。
raw device,没有文件系统的存储,就是写入的时候不经过文件系统,而直接到达调度器的。裸设备。
分布式复制块设备,跨主机的块设备镜像系统。基于网络实现数据镜像,工作在内核,通过软件实现。因此,需要在用户空间“写规则”并发往内核功能,让它得以工作。
尽可能使用在高可用集群中,尽可能使用stonith设备,以阻断离线节点对数据的访问。如果在互联网上进行数据传输,建议使用vpn。
用户空间管理工具:drbdadm, drbdsetup, drbdmeta
工作特性:实时、透明、同步或异步
primary/primary,双主模型,需要借助于dlm(分布式锁管理器)完成分布式锁管理,将dlm定义clone类型资源,从而使得多个节点都能够使用此资源。依赖Cluster FS。
磁盘的读写操作阻塞的时间是不一样的,读操作必须将磁盘中的文件先加载进内存,然后才能显示;而写就不同了,只需写进内存即可,速度相当的块。但是再加入drbd之后就不一样了,写操作可能要等到报文传递到另一台主机并写入磁盘之后,可能更为保险。但是这样一来,速度比写入本地磁盘还慢,因此,数据同步模型分为三种协议:
A:Async,只需要将报文发送到本机的网卡发送队列。性能最好,不安全。
B:Semi-Sync,需要将报文发送至对方主机后。
C:sync,需要将文件写入对方磁盘中。性能最差,安全性最高。
每组drbd设备都由"drbd resource"进行定义,定义四个属性:
名字:只能由空白字符之外ASCII字符组成,并且唯一。
drbd设备:/dev/drbd#
主设备号:147
次设备号:从0开始编号
磁盘配置:各主机上用于组成此drbd设备的磁盘或分区,编号可以不同,但大小需要一样。
网络配置:数据同步时的网络通信属性,何时同步、同步带宽、如何同步等。
/etc/drbd.conf:啥都没写
/etc/drbd.d/global_common.conf:提供全局配置,及多个drbd设备相同的配置。
/etc/drbd.d/*.res:资源定义
global:全局属性,定义drbd自己的工作特性。
common:通用属性,定义多组drbd设备通用特性。
*.res:资源特有的配置
工作模型:master/slave。但在必要时,可以使用dual master(双主模型),要求必须在HA集群使用集群文件系统。
配置前提:时间同步、基于主机名访问
2.6.33内核版本之后才支持drbd,不过还在有人提供了rpm包。不过drbd的性能和可靠性还有待考证。
kmod-drbd84-8.4.5-504.1.el6.x86_64.rpm:内核模块
drbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm
1、每台主机1个5G的分区,不用格式化
2、安装
[root@web1 drbd]# rpm -ivh kmod-drbd84-8.4.5-504.1.el6.x86_64.rpm drbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm
3、查看生成的文件
[root@web1 drbd]# rpm -qa | grep drbd [root@web1 drbd]# rpm -ql drbd84-utils-8.9.1-1.el6.elrepo [root@web1 drbd]# rpm -ql kmod-drbd84-8.4.5-504.1.el6 … /lib/modules/2.6.32-504.el6.x86_64/extra/drbd84/drbd.ko # 最主要的就是此模块,此模块已被自动加载 …
4、查看配置文件
[root@web1 drbd]# cd /etc/drbd.d/ [root@web1 drbd.d]# vim global_common.conf global { usage-count no; # 统计使用习惯 } common { handlers { # 定义主从发生分裂时应该怎么办,这个不要动,需要整合进高可用 } startup { # 定义超时之类的 } options { # 定义一些同步的属性 } disk { on-io-error detach; # I/O发生错误时,拆掉该节点 #fencing resource-only; } net { cram-hmac-alg "sha1"; # 消息校验的算法 shared-secret "mydrbdlab"; # 使用的密钥,域共享密钥,随便往里写 } syncer { # 定义同步器的,属于net的一个子功能 rate 500M; # 最多可以使用多高的速率 } [root@web1 drbd.d]# vim mystore.res resource mystore { device /dev/drbd0; disk /dev/sda2p1; meta-disk internal; on web1 { address 172.16.45.1:7789; } on web2 { address 172.16.45.2:7789; } }
5、同步给另一台
[root@web1 ~]# scp -r /etc/drbd.* web2:/etc/
6、在两个节点上初始化已定义的资源并启动服务
(1) 初始化资源,在Node1和Node2上分别执行
[root@web1 ~]# drbdadm create-md mystore # 创建多磁盘设备
(2) 启动服务
[root@web1 ~]# /etc/init.d/drbd start
7、查看输出的状态
(1) 第一种
[root@web1 ~]# cat /proc/drbd version: 8.4.5 (api:1/proto:86-101) GIT-hash: 1d360bde0e095d495786eaeb2a1ac76888e4db96 build by root@node1.magedu.com, 2015-01-02 12:06:20 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----- # 从和从,未完成数据同步 ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:5253020
(2) 第二种
[root@web1 ~]# drbd-overview 0:mystore/0 Connected Secondary/Secondary Inconsistent/Inconsistent
8、设置主节点,从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary。
(1) 在要设置为Primary的节点上执行如下命令:
[root@web1 ~]# drbdadm primary --force mystore
(2) 再次查看输出信息,可以发现数据同步过程已经开始
[root@web1 ~]# watch -n1 ‘cat /proc/drbd‘
(3) 等数据同步完成以后再次查看状态,可以发现节点已经牌实时状态,且节点已经有了主次
[root@web1 ~]# cat /proc/drbd version: 8.4.5 (api:1/proto:86-101) GIT-hash: 1d360bde0e095d495786eaeb2a1ac76888e4db96 build by root@node1.magedu.com, 2015-01-02 12:06:20 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ns:5253020 nr:0 dw:0 dr:5253684 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
9、创建文件系统,文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化
[root@web1 ~]# mkfs -t ext4 /dev/drbd0 [root@web1 ~]# mount /dev/drbd0 /mnt/
10、切换Primary和Secondary节点
(1) 对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary
[root@web1 ~]# drbdadm secondary mystore [root@web1 ~]# drbd-overview 0:mystore/0 Connected Secondary/Secondary UpToDate/UpToDate
(2) web2升为主
[root@web2 drbd.d]# drbdadm primary mystore [root@web2 drbd.d]# drbd-overview 0:mystore/0 Connected Primary/Secondary UpToDate/UpToDate
但此时需要手动切换主从,很不方便,所以drbd一般和Pacemaker一起使用。
两个主,需要使用克隆资源中的主从资源。首先定义为基本资源,然后复制多份就为克隆资源,其中一份为主资源,另外一份为从资源。
在pacemaker中定义克隆资源的专用属性:
clone-max:最多克隆出的资源份数
clone-node-max:在单个节点上最多运行几份克隆
notify:true|false,当一份克隆资源启动或停止时,是否通知给其它的副本,默认为true。
globally-unique:true|false,每一个副本是否运行为一个不同的功能,默认为true,无需修改。
notify:所有副本是否串行启动,true|false,默认为true,无需修改。
master-max:最多启动几份master资源,只有在定义主从资源时才会使用。
master-node-max:同一个节点最多运行几份master类型资源,只有在定义主从资源时才会使用。
1、停止两主机的drbd服务,最后同时都降级为从后,再停止服务。
2、确保drbd服务一定不能开机启动
[root@web1 ~]# chkconfig drbd off
3、将CoroSync清理为干净状态
4、定义主从资源
(1) 安装了drbd后,引入了新的ocf的linbit子类型。因此,资源代理的类型应该为linbit之下的drbd。
crm(live)ra# classes lsb ocf / heartbeat linbit pacemaker service stonith crm(live)ra# list ocf linbit drbd crm(live)ra# info ocf:linbit:drbd # 查看资源代理使用格式 … Operations‘ defaults (advisory minimum): # 监控选项 start timeout=240 promote timeout=90 # 升为主 demote timeout=90 # 降为从 notify timeout=90 stop timeout=100 monitor_Slave timeout=20 interval=20 # 监控从 monitor_Master timeout=20 interval=10 # 监控主
(2) 定义一个基本资源,但是不要启动,因为需要对它做主从。对主从资源的监控要在基本资源中定义。
crm(live)configure# primitive mystor ocf:linbit:drbd params drbd_resource="mystore" op monitor role="Master" interval=10 timeout=20 op monitor role="Slave" interval=20 timeout=20 op start timeout=240 op stop timeout=100 crm(live)configure# verify
(3) 定义主从资源
crm(live)configure# ms ms_mystor mystor meta clone-max="2" clone-node-max="1" master-max="1" master-node-max="1" notify="true" # meta为定义元数据属性 [root@web1 ~]# crm status # 状态查看 … Online: [ web1 web2 ] Master/Slave Set: ms_myst [myst] Masters: [ web2 ] Slaves: [ web1 ]
5、定义文件系统资源
(1) 创建目录,两个节点同时创建
[root@web1 ~]# mkdir /mydata
(2) 定义约束:必须要求先切换主从,而后才能挂载文件系统,而且文件系统必须跟主节点在一起。此时先定义资源
crm(live)configure# primitive mydata ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mydata" fstype="ext4" op monitor interval=20 timeout=40 op start timeout=60 op stop timeout=60 crm(live)configure# verify
(3) 定义排列约束
crm(live)configure# colocation mydata_with_ms_myst_master inf: mydata ms_myst:Master crm(live)configure# verify
(4) 定义顺序约束
crm(live)configure# order mydata_after_ms_mystor_master Mandatory: ms_myst:promote mydata:start # Mandatory强制,promote提升为主节点 crm(live)configure# verify crm(live)configure# commit
(5) 进行查看
[root@web1 ~]# crm status [root@web1 ~]# mount
MariaDB应该在主节点上配置
1、MariaDB准备
[root@web2 ~]# tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local/ [root@web2 ~]# cd /usr/local/ [root@web2 local]# ln -s mariadb-5.5.43-linux-x86_64/ mysql [root@web2 local]# cd mysql [root@web2 mysql]# groupadd -r -g 306 mysql [root@web2 mysql]# useradd -r -g 306 -u 306 mysql [root@web2 mysql]# mkdir /mydata/data [root@web2 mysql]# chown -R mysql.mysql /mydata/data [root@web2 mysql]# chown -R root.mysql ./* [root@web2 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/ data/ issue lost+found/ passwd [root@web2 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/ [root@web2 mysql]# mkdir /etc/mysql [root@web2 mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf [root@web2 mysql]# vim /etc/mysql/my.cnf thread_concurrency = 2 datadir = /mydata/data innodb_file_per_table = on skip_name_resolve = on [root@web2 mysql]# cp support-files/mysql.server /etc/init.d/mysqld [root@web2 mysql]# chkconfig --add mysqld [root@web2 mysql]# /etc/init.d/mysqld start [root@web2 mysql]# /usr/local/mysql/bin/mysql MariaDB [(none)]> GRANT ALL ON *.* TO ‘root‘@‘172.16.%.%‘ IDENTIFIED BY ‘123456‘; MariaDB [(none)]> FLUSH PRIVILEGES; MariaDB [(none)]> \q [root@web2 mysql]# chkconfig mysqld off [root@web2 mysql]# /etc/init.d/mysqld stop [root@web2 mysql]# crm node standby # 让web1成为主节点,接下来就配置web1的MariaDB [root@web2 mysql]# crm node online # web1配置基本相同,只是不用初始化
2、将MariaDB定义成资源
(1) 定义ip资源
crm(live)configure# primitive myip ocf:heartbeat:IPaddr params ip="172.16.45.11" op monitor interval=10 timeout=20 crm(live)configure# verify
(2) 定义MariaDB资源
crm(live)configure# primitive myserver lsb:mysqld op monitor interval=20 timeout=20 crm(live)configure# verify
(3) 将myip和主节点定义在一起
crm(live)configure# colocation myip_with_ms_myst_master inf: myip ms_myst:Master
(4) 将myserver和mydata定义在一起
crm(live)configure# colocation myserver_with_mydata inf: myserver mydata
(5) 定义先挂载,后启动myserver
crm(live)configure# order myserver_after_mydata Mandatory: mydata:start myserver:start crm(live)configure# verify
(6) 定义myip先与myserver启动
crm(live)configure# order myserver_after_myip Mandatory: myip:start myserver:start crm(live)configure# verify
3、通过远程主机安装mysql客户端后登录MariaDB
[root@web4 ~]# mysql -uroot -h172.16.45.11 –p
(1) 不要断开,切换主从后,看是不是还处于连接状态。
(2) 在mysql上创建表,切换主从后,看表是否存在。
原文地址:http://10042224.blog.51cto.com/10032224/1658057