master<=slavephp
10.24.6.4:3306<=10.24.6.6:3306html
10.24.6.20node
必须使得VIP和mysql处于同一网段,不然没法ping经过mysql
http://wenku.baidu.com/link?url=QF1pG6DGMtl2uV1yt998xCduKsiEO7Bwn4CW79g0nx6EUw4iNgcBUz_jAA1W0FigPhjpiIs8FPLc9TxvFq_Yx7G-VvWeikFLzZchifM_tSSlinux
共享硬盘/dev/sdb1程序员
在10.24.6.4上sql
echo "10.24.6.4 drbd01" >> /etc/hosts数据库
echo "drbd01" > /etc/hostnamevim
在10.24.6.6上api
echo "10.24.6.6 drbd02" >> /etc/hosts
echo "drbd02" > /etc/hostname
在10.24.6.4/10.24.6.6上
sudo apt-get install drbd8-utils
vim /etc/drbd.conf默认信息为:
include "/etc/drbd.d/global_common.conf";
include "/etc/drbd.d/*.res";
这样你须要去配置global_common.conf以及新建一个以res结尾的资源文件,这里为r0.res
vim /etc/drbd.d/global_common.conf
global {
usage-count no; //帮LINBIT公司统计drbd使用量 }
common {
protocol C;//C为最安全同时也是性能最好的一种确认写操做完成的方法
syncer {
rate 100M; //同步的速率
}
}
sudo vim /etc/drbd.d/r0.res
resource r0 {//r0资源名称,之后不少地方会用到
on drbd01 {
device /dev/drbd0; //逻辑设备的路径
disk /dev/sdb1; //物理设备
address 10.24.6.4:7788; //主节点
meta-disk internal;
}
on drbd02 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.24.6.6:7788; //从节点
meta-disk internal;
}
}
不能够有注释
10.24.6.4:
Sudo drbdadm create-md r0
执行以下命令: dd if=/dev/zero bs=1M count=1 of=/dev/sdb1;sync
再次执行drbdadm create-md r0看到success则表示成功。
/etc/init.d/drbd start
cat /proc/drbd
ro:Secondary/ Secondary表示尚未创建主盘
ds:Inconsistent/Inconsistent表示两节点(master/slave)的逻辑设备(即/dev/drbd0)中的数据未同步
本地和对等节点的硬盘有可能为下列状态之一:
Diskless 无盘:本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误致使自动分离
Attaching:读取无数据时候的瞬间状态
Failed 失败:本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘
Negotiating:在已经链接的DRBD设置进行Attach读取无数据前的瞬间状态
Inconsistent:数据是不一致的,在两个节点上(初始的彻底同步前)这种状态出现后当即建立一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态
Outdated:数据资源是一致的,可是已通过时
DUnknown:当对等节点网络链接不可用时出现这种状态
Consistent:一个没有链接的节点数据一致,当创建链接时,它决定数据是UpToDate或是Outdated
UpToDate:一致的最新的数据状态,这个状态为正常状态
10.24.6.4:
10.24.6.6:
drbdadm -- --overwrite-data-of-peer primary r0
查看同步进度
cat /proc/drbd
ds:UpToDate/Inconsistent表示两节点正在同步数据
######手动启用资源
drbdadm up <resource>
######手动禁用资源
drbdadm down <resource>
注释:
resource:为资源名称;固然也可使用all表示[停用|启用]全部资源
######升级资源
drbdadm primary <resource>
######降级资源
drbdadm secondary <resource>
注释:在单主模式下的DRBD,两个节点同时处于链接状态,任何一个节点均可以在特定的时间内变成主;但两个节点中只能一为主,若是已经有一个主,需先降级才可能升级;在双主模式下没有这个限制
[root@nod1 ~]# drbdadm cstate r0 #r0为资源名称
Connected
状态意义:
资源的链接状态;一个资源可能有如下链接状态中的一种
StandAlone 独立的:网络配置不可用;资源尚未被链接或是被管理断开(使用 drbdadm disconnect 命令),或是因为出现认证失败或是脑裂的状况
Disconnecting 断开:断开只是临时状态,下一个状态是StandAlone独立的
Unconnected 悬空:是尝试链接前的临时状态,可能下一个状态为WFconnection和WFReportParams
Timeout 超时:与对等节点链接超时,也是临时状态,下一个状态为Unconected悬空
BrokerPipe:与对等节点链接丢失,也是临时状态,下一个状态为Unconected悬空
NetworkFailure:与对等节点推进链接后的临时状态,下一个状态为Unconected悬空
ProtocolError:与对等节点推进链接后的临时状态,下一个状态为Unconected悬空
TearDown 拆解:临时状态,对等节点关闭,下一个状态为Unconected悬空
WFConnection:等待和对等节点创建网络链接
WFReportParams:已经创建TCP链接,本节点等待从对等节点传来的第一个网络包
Connected 链接:DRBD已经创建链接,数据镜像如今可用,节点处于正常状态
StartingSyncS:彻底同步,有管理员发起的刚刚开始同步,将来可能的状态为SyncSource或PausedSyncS
StartingSyncT:彻底同步,有管理员发起的刚刚开始同步,下一状态为WFSyncUUID
WFBitMapS:部分同步刚刚开始,下一步可能的状态为SyncSource或PausedSyncS
WFBitMapT:部分同步刚刚开始,下一步可能的状态为WFSyncUUID
WFSyncUUID:同步即将开始,下一步可能的状态为SyncTarget或PausedSyncT
SyncSource:以本节点为同步源的同步正在进行
SyncTarget:以本节点为同步目标的同步正在进行
PausedSyncS:以本地节点是一个持续同步的源,可是目前同步已经暂停,多是由于另一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
PausedSyncT:以本地节点为持续同步的目标,可是目前同步已经暂停,这能够是由于另一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
VerifyS:以本地节点为验证源的线上设备验证正在执行
VerifyT:以本地节点为验证目标的线上设备验证正在执行
10.24.6.4:
10.24.6.6:
如今将磁盘格式化后并能够向其中写数据,这些数据会同步到从节点中
mkfs.ext4 /dev/drbd0
mount /dev/drbd0 /mnt/data
(注意:只有主盘节点才能挂载磁盘)
cd /mnt/data
mkdir testfile //新建名为testfile的测试文件
umount /dev/drbd0 //卸载磁盘
drbdadm secondary r0 //主降为次,即刚开始主节点的磁盘是主盘,如今降为从盘,往主盘里写数据,从从盘里读数据。 在drbd02上(从节点)
drbdadm primary r0 //次升为主,即将从节点的磁盘升为主盘资格这样才能从从节点的机器读取磁盘的数据。
mount /dev/drbd0 /mnt/data //升主后才有挂在权限 cd /mnt/data ls –l
将会看到咱们在主节点中创建的名为testfile的文件夹。 (啰嗦一下:
要想完成主从Mysql数据的备份,到这里你们应该有点启发了,我么只须要将Mysql的数据保存到/mnt/data(咱们将/dev/drbd0挂在的路径)中便可这样主Mysql往这个区域写数据,drbd会帮咱们自动将这些数据同步到从节点中,这样装在从节点机
器上的Mysql也从这里读取数据。这样便实现了两份数据的自动备份。 )
主降为次失败:
由于降级的自己的目录正在使用
默认状况下数据库的存储位置是/var/lib/mysql(能够在/etc/mysql/my.cnf中的datadir位置找到),如今要将其改成存在/share_mysql下。
将/var/lib/mysql下的数据复制到/share_mysql下
cp -r /var/lib/mysql /share_mysql
vim /etc/mysql/my.cnf
找到datadir这一行将其值改成/share_mysql/mysq
140602 22:36:39 mysqld_safe Starting mysqld daemon with databases from /home/mysql
140602 22:36:39 [Warning] Can't create test file /home/mysql/localhost.lower-test
140602 22:36:39 [Warning] Can't create test file /home/mysql/localhost.lower-test
/usr/libexec/mysqld: Can't change dir to '/home/mysql/' (Errcode: 13)
140602 22:36:39 [ERROR] Aborting
140602 22:36:39 [Note] /usr/libexec/mysqld: Shutdown complete
140602 22:36:39 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
你已经修改了my.cnf中的datadir的值
你已经chown和chmod了数次新数据目录或者其父路径的属主和权限
你无数次地试图service mysql start,或者 /etc/init.d/mysql start,以及mysql_install_db!
恭喜你看见这篇文章,我在被系统坑了几个小时以后,找到了解决的方法。
这个缘由有二,其中任意的一个缘由都会形成你被系统告知这个warning。若是你不是一个专业的linux系统安全工程师,或者你只是个PHP程序员,并无对系统安全有深刻的研究,你就不会太容易找到它的答案。
第一,selinux,记得当年念书时,字符界面安装redhat(很古老的操做系统么。。。)的时候,有这么一个选项,一般你们都听取前辈的建议,改变默认值以不安装它。但若是你刚好要操做的这台机器开着selinux,它确实可以使你的mysql没法在新目标位置进行mysql_install_db的操做,并爆出标题所示的警告。一个简单的解决办法是使用命令暂时关闭selinux,以便让你的操做能够继续下去
setenforce 0
但最好使用一个永久方法,以便在重启后继续不要这货。
修改/etc/selinux/config文件中设置SELINUX=disabled ,而后重启或等待下次重启。
第二,apparmor,这个坑爹货和selinux同样的坑爹,它也对mysql所能使用的目录权限作了限制
在 /etc/apparmor.d/usr.sbin.mysqld 这个文件中,有这两行,规定了mysql使用的数据文件路径权限
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
你必定看到了,/var/lib/mysql/就是以前mysql安装的数据文件默认路径,apparmor控制这里mysqld可使用的目录的权限
我想把数据文件移动到/data/mysql下,那么为了使mysqld可使用/data/mysql这个目录,照上面那两条,增长下面这两条就能够了
/data/mysql/ r,
/data/mysql/** rwk,
重启apparmor,/etc/init.d/apparmor restart
以后,就能够顺利地干你想干的事儿了!
在10.24.6.4上启动mysql 创建一个名为share_mysql的数据库。
第一步保证10.24.6.4为primary,10.24.6.6为secondary
主从切换挂载
service mysql stop # 关闭mysql服务
drbdadm secondary r0 # 将10.24.6.4降为备用
umount /dev/drbd0 # 卸载虚拟硬盘
在drbd02上
drbdadm primary r0 #将10.24.6.6升为主用
mount /dev/drbd0 # 挂载虚拟硬盘
service mysql start # 启动数据库
进去mysql中查看是否已有从drbd01同步过来的名为test的数据库。
OK至此测试就完成了。
(啰嗦下:聪明的读者可能会问,每次都这样操做效率也过低了吧,对的,接下来heartbeat会自动帮咱们作好这些事,它会监听服务,一旦服务中止,则从服务会接管服务)
让虚拟硬盘的主从切换更智能
apt-get install heartbeat
(ps: Heartbeat的主要配置文件有ha.cf、haresources和authkeys。在Heartbeat安装后,默认并无这3个文件,能够从官方网站下载获得,也能够直接从解压的源码目录中找到)
sudo cp /usr/share/doc/heartbeat/ha.cf.gz / etc/ha.d
sudo gzip -d ha.cf.gz
sudo vim ha.cf:
logfacility local0 #这个是设置heartbeat的日志,这里是用的系统日志
keepalive 500ms #多长时间检测一次
deadtime 10 #连续多长时间联系不上后认为对方挂掉了(单位是妙)
warntime 5 #连续多长时间联系不上后开始警告提示
initdead 100 #这里主要是给重启后预留的一段忽略时间段(好比:重启后启动网络等, 若是在网络尚未通,
keepalive检测确定通不过,但这时候并不能切换)
bcast eth0
auto_failback off #恢复正常后是否须要再自动切换回来
node drbd01 #节点名(必须是集群中机器的主机名,经过uname -n取得)
node drbd02 #节点名(必须是集群中机器的从机名,经过uname -n取得)
ping 10.0.65.250(默认网关,能够经过route命令获得)
respawn root /usr/lib/heartbeat/ipfail #这里是配置ip绑定和切换的功能, ipfail就是控制ip切换的程序
apiauth ipfail gid=root uid=root #控制ip切换的时候所使用的用户 deadping 5
sudo cp /usr/share/doc/heartbeat/haresources.gz /etc/ha.d/
cd /etc/ha.d
sudo gzip -d haresources.gz
Haresources文件用于指定双机系统的主节点、集群IP、子网掩码、广播地址以 及启动的服务等集群资源,文件每一行能够包含一个或多个资源脚本名,资源之间使用空格隔开,参数之间使用两个冒号隔开,在两个HA节点上该文件必须彻底一致,此文件的通常格式为:
node-name network <resource-group> node-name表示主节点的主机名,必须和ha.cf文件中指定的节点名一致。network用于设定集群的IP地址、子网掩码和网络设备标识等。须要注意的是,这里指定的IP地址就是集群对外服务的IP地址,resource-group用来指定须要Heartbeat托管的服务,也就是这些服务能够由Heartbeat来启动和关闭。若是要托管这些服务,就必须将服务写成能够经过start/stop来启动和关闭的脚步,而后放到/etc /init.d/或者/etc/ha.d/resource.d/目录下,Heartbeat会根据脚本的名称自动去/etc/init.d或者/etc /ha.d/resource.d/目录下找到相应脚步进行启动或关闭操做。
下面对配置方法进行具体说明:
drbd01 IPaddr::192.68.100.120/24/eth0:0 drbddisk::r0
Filesystem::/dev/drbd0::/mnt/data::ext4 mysql
(ps:在上面的例子中,提供了对mysql资源的启动和关闭,因此须要在/etc/ha.d/resource.d这个目录下去建立一个控制该资源启动脚本,命令为: ln -s /etc/init.d/mysql /etc/ha.d/resource.d/mysql)
其中,drbd01是HA集群的主节点,IPaddr为heartbeat自带的一个执行脚本,Heartbeat首先将执行/etc/ha.d/resource.d/IPaddr 192.68.100.120/24 start的操做,也就是虚拟出一个子网掩码为255.255.255.0,IP为192.68.100.120的地址。此IP为Heartbeat对外提供服务的网络地址,同时指定此IP使用的网络接口为eth0。接着,Heartbeat将执行共享磁盘分区的挂载操做,"Filesystem::/dev/drbd0::/mnt/data::ext4"至关于在命令行下执行mount操做,即"mount -t ext4 /dev/drbd0 /mnt/data",最后mysql服务。 注意主节点和备份节点中资源文件haresources要彻底同样。 所以对于咱们应该这样写
drbd01 IPaddr::192.68.100.120/24/eth0:0
drbddisk::r0
Filesystem::/dev/drbd0::/mnt/data::ext4 mysql 不要写成以下这样:
drbd01 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/data::ext4 mysql192.68.100.120
会报heartbeat Cannot use default route w/o netmask的错误,具体缘由见: http://lists.linux-ha.org/pipermail/linux-ha/2002-November/005911.html
drbd01 IPaddr::10.24.6.20/24/eth0:0 drbddisk::r0 Filesystem::/dev/drbd0::/share_mysql::ext4 mysql
sudo cp /usr/share/doc/heartbeat/authkeys /etc/ha.d/
authkeys文件用于设定Heartbeat的认证方式,共有3种可用的认证方式,即 crc、 md5和sha1。3种认证方式的安全性依次提升,可是占用的系统资源也依次增长。若是Heartbeat集群运行在安全的网络上,可使用 crc方式;若是HA每一个节点的硬件配置很高,建议使用sha1,这种认证方式安全级别最高;若是是处于网络安全和系统资源之间,可使用md5认证方式。这里咱们使用crc认证方式,设置以下: auth 1 1 crc #2 sha1 sha1_any_password #3 md5 md5_any_password
须要说明的一点是:不管auth后面指定的是什么数字,在下一行必须做为关 键字再次出现,例如指定了"auth 6",下面必定要有一行"6 认证类型"。
最后确保这个文件的权限是600(即-rw——-)。
启动日志:
启动日志
主heartbeat日志:
主drbd变成从drbd
从drbd变成主drbd
主heartbeat机器上没有mysql服务
从heartbeat机器上开启mysql服务