heartbeat+drbd+mysql的高可用性
- 格式:doc
- 大小:10.46 MB
- 文档页数:42
/thread-3689681-1-1.html我们下面来实现一个架构,heartbeat+drbd+nfs实现mysql和网站数据的同步,keepalived 实现nginx的高可用,而用nginx和dns轮询实现负载均衡。
架构说明目录规划/usr/local/src/lnmp:用来存放源码工具等等/data:用来存放所有数据和NFS以及DRBD的挂载/data/shell:用来存放所有管理脚本/data/mysql:用来挂载DRBD的mysql资源,以供mysql存放数据库/data/wwwnfs:用来挂载DRBD生成的www资源,以供两个节点挂载到各个节点的/data/www 目录,以供论坛等程序数据使用/data/www:用来挂载NFS资源,用来存放论坛(网站)等程序数据拓扑工作原理内网:1,DRBD网络存储创建出两个资源,一个mysql给mysql数据库同步用,一个www给web(论坛)数据NFS共享挂载用,虚拟出两个虚拟IP,一个是 192.168.1.100,用来连接数据库,一个是192.168.1.200,用来给节点挂载NFS注意:NFS底下挂载了三次:DRBD挂载一次,文件系统挂载一次,客户端挂载一次2,Heartbeat来实现DRBD的HA,同时虚拟出两个内网IP,并管理NFS,MySQL的启动和关闭外网:1,两个节点都用Nginx做均衡器,通过内网调度负载两个节点,实现内部均衡2,DNS配置双IP对应一个域名的方式来实现DNS轮询,实现外网均衡3,Keepalived使用双主(master)配置虚拟出两个虚拟IP:节点一 12.12.12.100和节点二12.12.12.200,同时共外网访问,两个节点互为主从关系,当某个节点挂掉的时候,另外一个节点将同时是两个资源的master,同时拥有两个虚拟IP,实现资源转移。
我们知道DNS的缺点就是生效慢,分配资源不合理,理论上有可能把所有的请求都发送给同一节点,导致均衡不合理导致所有资源不可用,这里我们由于有了NGINX内部负载,就不怕DNS轮询不均衡了,因为NGINX内部有严谨的调度方式,不管那台请求有多少,在内部都能实现理想的调度,这样就能把 DNS负载均衡和NGINX完美结合,是硬件资源得到合理的利用,然后利用keepalive保证了每个节点的可靠性,几乎完美!拓扑图如下:架构实现LNMP架构配置配置LNMp架构需要注意两点:注意一:这里MYSQL都不要初始化,不要启动!后面有专门的配置的注意二:nginx所有端口都改成 8080,因为一会还要安装nginx来做均衡器并对外提供服务,所以不要用默认的80注意三、nginx和php-fpm运行的用户都是www。
MySQL⾼可⽤⽅案-PXC环境部署记录之前梳理了,对于mysql⾼可⽤⽅案,经常⽤到的的主要有下⾯三种:⼀、基于主从复制的⾼可⽤⽅案:双节点主从 + keepalived⼀般来说,中⼩型规模的时候,采⽤这种架构是最省事的。
两个节点可以采⽤简单的⼀主⼀从模式,或者双主模式,并且放置于同⼀个VLAN中,在master节点发⽣故障后,利⽤keepalived/heartbeat的⾼可⽤机制实现快速切换到slave节点。
在这个⽅案⾥,有⼏个需要注意的地⽅:采⽤keepalived作为⾼可⽤⽅案时,两个节点最好都设置成BACKUP模式,避免因为意外情况下(⽐如脑裂)相互抢占导致往两个节点写⼊相同数据⽽引发冲突;1)把两个节点的auto_increment_increment(⾃增步长)和auto_increment_offset(⾃增起始值)设成不同值。
其⽬的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应⽤,从⽽会导致slave新写⼊数据的⾃增值和原先master上冲突了,因此⼀开始就使其错开;当然了,如果有合适的容错机制能解决主从⾃增ID冲突的话,也可以不这么做;2)slave节点服务器配置不要太差,否则更容易导致复制延迟。
作为热备节点的slave服务器,硬件配置不能低于master节点;3)如果对延迟问题很敏感的话,可考虑使⽤MariaDB分⽀版本,或者直接上线MySQL 5.7最新版本,利⽤多线程复制的⽅式可以很⼤程度降低复制延迟;4)对复制延迟特别敏感的另⼀个备选⽅案,是采⽤semi sync replication(就是所谓的半同步复制)或者后⾯会提到的PXC⽅案,基本上⽆延迟,不过事务并发性能会有不⼩程度的损失,需要综合评估再决定;5)keepalived的检测机制需要适当完善,不能仅仅只是检查mysqld进程是否存活,或者MySQL服务端⼝是否可通,还应该进⼀步做数据写⼊或者运算的探测,判断响应时间,如果超过设定的阈值,就可以启动切换机制;6)keepalived最终确定进⾏切换时,还需要判断slave的延迟程度。
Drbd+mysql+keepalived实现高可用测试一、drbd安装和配置DRBD版本:drbd-8.4.3Primary:192.168.1.2 (dbm1)Secondary:192.168.1.7 (dbm2)虚拟IP: 192.168.1.202(Primary)为仅主服务器端配置(Secondary)为仅从服务器端配置(Primary,Secondary)为主服务器端从服务器端共同配置1.准备环境:(Primary,Secondary)1)设置hosts文件# vi /etc/hosts192.168.1.2 dbm1 dbm1192.168.1.7 dbm2 dbm22)在控制台左侧―硬盘‖,新建两块容量为10G的硬盘vdc,分别分配给两台主机。
分区为vdc1,大小为10G,并在本地系统创建/data目录,不做挂载操作。
# fdisk /dev/vdc出现command (m for help) :输入n,回车//增加一个分区输入p,回车;输入1,回车;输入1,回车;输入20805,回车;//将整个硬盘作为1个分区输入w,回车//保存分区退出#fdisk –l查看硬盘分区是否成功# mkdir /data //创建/data目录3)更改主机名:(Primary)# vi /etc/sysconfig/networkHOSTNAME=dbm1(Secondary)# vi /etc/sysconfig/networkHOSTNAME=dbm22.DRBD的安装配置:1)安装依赖包:(Primary,Secondary)# yum install gcc gcc-c++ make glibc flex kernel-devel kernel-headers注意:安装kernel-devel一定要和你uname -r 看到的内核版本一致。
若不一致,则输入以下指令:#yum update kernel#reboot重启之后继续安装2)安装DRBD:(Primary,Secondary)# wget /drbd/8.4/drbd-8.4.3.tar.gz# tar zxvf drbd-8.4.3.tar.gz# cd drbd-8.4.3# ./configure --prefix=/usr/local/drbd --with-km# make KDIR=/usr/src/kernels/2.6.32-279.el6.x86_64///红色处需要根据自己具体情况修改,可通过以下指令查看#cd /usr/src/kernels#ls //查看具体路径# make install# mkdir -p /usr/local/drbd/var/run/drbd# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d# chkconfig --add drbd# chkconfig drbd on加载DRBD模块:# modprobe drbd查看DRBD模块是否加载到内核:# lsmod |grep drbddrbd 292307 0 //出现类似内容则安装成功3)配置(Primary,Secondary)#vi /usr/local/drbd/etc/drbd.d/drbd,res //新建drbd.res资源文件加入以下内容:注意IP修改为自己的IP4)创建DRBD设备并激活r0资源(Primary,Secondary) #mknod /dev/drbd0 b 147 0#drbdadm create-md r0若drbdadm出现以下错误提示:则输入以下指令:#dd if=/dev/zero of=/dev/vdc1 bs=1M count=128等待片刻,显示success表示drbd块创建成功Writing meta data...initializing activity logNOT initializing bitmapNew drbd meta data block successfully created.(… …)* If you wish to opt out entirely, simply enter 'no'.* To continue, just press [RETURN]Success再次输入该命令:#drbdadm create-md r0 //成功激活r0Writing meta data...initializing activity logNOT initializing bitmapNew drbd meta data block successfully created.5)创建启动(Primary,Secondary)#cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/init.d/drbd#Chconfig —add drbd#Chconfig drbd on6)启动DRBD (Primary,Secondary)#service drbd start7) 文件系统在primary上#mkfs –t ext3 /dev/drbd0然后primary把它安装(仅primary安装)Mount /dev/drbd0 /data注意,如果主\从同时安装该设备,则不能自动同步,若只有一个服务器安装,则可以自动同步. Drbdsetup /dev/drbd0 primary –force 把某服务器设置为master二、mysql安装及配置安装MySQL。
MySQL数据库服务器双机热备的实现方法两则2011-08-31 12:56:43分类:Mysql/postgreSQL在实际的应用中,数据库是非常重要和关键的一个环节。
在保障数据库安全的同时,提高应用性和缩短出故障后的恢复时间,也同等重要。
特别是在一些持续性和实时性要求高的应用中,故障一小时,可能会让你损失几千到几万甚至更高。
本方案致力于数据库实时备份,并且在故障发生后以最短的时间恢复和修复。
在mysql数据库的备份应用中,主从复制结构是应用的比较广泛,数据同步和实时性都很高,基本上能满足大部分的需求。
本方案基于主从复制结构的基础上,当主库出现故障时,从库能自动接管主库的功能,向外提供服务,且将自身设置为主库,将这个故障时间和影响缩短至最小,5秒内可切换完成。
待原主库修复后,会自动进入从库的备份角色,如此循环。
在本方案的实现中,有两种方法且均基于mysql的主从结构中:1、高可用(High Availability)HA集群,用heartbeat实现及增加了故障后的恢复功能。
2 、同样是高可用,只是是自己编写脚本程序来监控,切换,恢复。
在方法1中,使用稳定的heartbeat开源软件实现,但此方法,需要多一个IP对外访问,同时在监控上,是监控机器的状态而不是mysql,有些情况下,机器是好的但mysql服务挂了,这种情况下就不准确了。
不过可以修改监控方式或增加对mysql服务的监控。
方法2中,可以不用增加一个对外IP,同时在监控上,可以直接监控mysql 的服务,至于稳定性,有待测试。
此方法中还有一个问题,就是提供给客户端的数据库连接IP,因为切换后,IP也就变了。
如果说更改程序,那不现实。
所以,这里可以用域名,不过仍然需要修改域名的IP指向或是修改客户机的 hosts 文件。
本文使用的是修改DNS的方法,因为DNS是自己配置的,可以灵活操作。
本文分两部分进行说明第一部分用 heartbeat 实现的高可用1环境条件两个虚拟机(IP:192.168.1.91/92/93),CentOS5.4,mysql-5.1.37,heartbeat-2.1.3-32 安装前的准备Heartbeat 的工作原理:heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未受到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。
Heartbeat⾼可⽤解决⽅案Heartbeat⾼可⽤1. Heartbeat作⽤:通过heartbeat,可以将资源(ip以及程序服务等资源)从⼀台已经故障的计算机快速转移到另⼀台正常运转的机器上继续提供服务,⼀般称之为⾼可⽤服务。
heartbeat和keepalived有很多相同之处,但是也有区别。
1. ⼯作原理:通过修改heartbeat的配置⽂件,可以指定⼀台heartbeat服务器作为主服务器,另⼀台⾃动成为热备服务器。
在热备服务器上⾯配置heartbeat守护程序来监听来⾃主服务器的⼼跳信息。
如果在规定时间内,⽆法监听到⼼跳信息,那么就启动故障转移,取得主服务器上的相关资源的所有权,接替主服务器继续不间断的提供服务,从⽽达到资源以及服务⾼可⽤的⽬的。
heartbeat还⽀持主主模式,及两台服务器互为主备。
⼀般故障切换时间在5~20s之间。
另外:和keepalived的服务⼀样,heartbeat⾼可⽤是服务器级别的,不是服务级别的。
1. 服务器宕机2. heartbeat软件故障3. ⼼跳连接线故障)服务故障不会导致切换,可以通过服务宕机把heartbeat服务停掉。
1. ⼼跳连接:⾄少需要两台主机才可以实现⾼可⽤服务。
两台heartbeat服务之间通信:穿⾏电缆,所谓的串⼝(⾸先,缺点是距离不能太远)⼀根以太⽹电缆两⽹卡直连(常⽤⽅式)以太⽹电缆,通过交换机等⽹络设备连接。
(交换机可能出现问题等)1. Heartbeat裂脑(splitbrain)两台服务器在⼀定时间内,⽆法相互检测到对⽅⼼跳⽽各⾃启动故障转移功能,取得资源和服务的所有权,会导致同⼀个IP在两端同时启动服务,存在两个相同的VIP,造成冲突的严重问题。
1. 裂脑的原因:⼼跳链路故障,导致⽆法正常通信开启了防⽕墙阻挡了⼼跳信息传输⼼跳⽹卡地址等配置不正确⼼跳⽅式,⼼跳⼴播冲突,软件bug1. 防⽌裂脑⽅案:同时使⽤串⾏电缆和以太⽹电缆连接,同时使⽤两条⼼跳线检测到裂脑时,强制关闭⼀个节点。
构建Heartbeat+DRBD+NFS高可用文件共享存储DRBD的介绍:Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。
数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)工具:drbdadm:高级管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta发送指令,drbdsetup:配置装载进kernel的DRBD模块,平时很少直接用drbdmeta:管理META数据结构,平时很少直接用。
在DRBD中,资源是特指某复制的存储设备的所有方面。
包括资源名称、DRBD设备(/dev/drbdm,这里m是设备最小号,最大号可到147)、磁盘配置(使本地数据可以为DRBD所用)、网络配置(与对方通信)每个资源有个角色,是Primary或Secondary,下面简称“主”和“备” 主角色的DRBD设备可以不受限制的读和写,比如创建和映射文件系统、对于块设备的raw或直接IO访问。
备角色的DRBD设备接受来自对方的所有修改,但是不能被应用程序读写,甚至只读也不行。
角色可以改变。
DRBD功能单主模式:典型的高可靠性集群方案。
复主模式:需要采用共享cluster文件系统,如GFS和OCFS2。
用于需要从2个节点并发访问数据的场合,需要特别配置。
复制模式:3种模式:协议A:异步复制协议。
本地写成功后立即返回,数据放在发送buffer 中,可能丢失。
协议B:内存同步(半同步)复制协议。
本地写成功并将数据发送到对方后立即返回,如果双机掉电,数据可能丢失。
协议C:同步复制协议。
本地和对方写成功确认后返回。
如果双机掉电或磁盘同时损坏,则数据可能丢失。
一般用协议C。
选择协议将影响流量,从而影响网络时延。
有效的同步:按线性而不是当初写的顺序同步块。
同步损坏时间内的不一致数据。
这段时间一直在研究mysql的集群方案,前几天发了一个关于mysql+heartbeat+存储的方案,今天把mysql+drbd+heartbeat的方案也放出来吧,这个方案,我个人觉得有瑕疵,就是主机挂了通过heartbeat往备机上面切换这个没有问题,但是如果有failback的话,那么主机回切将会有一系列的问题,主要应该就是脑裂吧,遇到问题的欢迎和我讨论。
1.环境说明:2.test1:192.168.122.10 as5u33.test2:192.168.122.11 as5u34.V I P:192.168.122.125.6.7.第一部分:mysql的安装(主备机一样)8.# tar -zxvf mysql-5.0.67.tar.gz9.# cd mysql-5.0.6710.# groupaddmysql11.# useradd -g mysql -s /sbin/nologin -M mysql12.# ./configure --prefix=/usr/local/mysql --with-charset=gbk--localstatedir=/var/data --with-extra-charset=all--enable-thread-safe-client13.# make && make install14.15.# cp support-files/f /etc/f16.# cp support-files/mysql.server /etc/rc.d/init.d/mysqld17.# chmod 755 /etc/rc.d/init.d/mysqld18.加入服务队列:19.# chkconfig --add mysqld20.21.# chown -R mysql.mysql /usr/local/mysql/22.# /usr/local/mysql/bin/mysql_install_db --user=mysql(这一步可以先不用执行,放到drbd那一块执行)23.# chown -R mysql.mysql /usr/local/mysql/var24.25.# /usr/local/mysql/bin/mysqld_safe --user=mysql&26.27.*************************************************************************28.配置库文件搜索路径(有时间自己做吧)29.# echo "/usr/local/mysql/lib/mysql" >> /etc/ld.so.conf30.# ldconfig31.添加/usr/local/mysql/bin到环境变量PATH中32.#echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile33.#source /etc/profile34.**************************************************************************35.36.######################################################################37.38.第二部分:DRBD的安装和设置(首先hosts做好主备解析,关闭iptables相关选项)39./drbd/40.(1)安装DRBD(主从服务器安装相同)41.# tar -zxvf drbd-8.3.0.tar.gz42.# cd drbd-8.3.043.# make KDRI=/usr/src/redhat/44.# make install45.检查是否生成了相应的文件:/etc/drbd.conf ; /etc/init.d/drbd ; 以及./drbd/drbd.ko46.加载安装drbd模块47.# modprobedrbd48.通过lsmod检查是否已经成功49.#lsmod |grepdrbd50.如果有,则表示成功了51.(2)更改drbd配置文件(主从服务器相同)52.准备drbd要使用的分区,该分区最好是干净的分区,我在虚拟机中重新划分了一个分区/dev/sdb1作为drbd使用。
Ubuntu下Mysql+drbd+heartbeat高性能服务集群配置。
环境如下:VMware下的两台虚拟机,drbd01 192.168.1.22drbd02 192.168.1.23vip 192.168.100.120(heartbeat会自动给我们配好,不用担心)Ubuntudisk:/dev/sdb1(一个5G的分区)一、安装drbd1.修改hosts文件和主机名在drbd01上echo "192.168.1.22 drbd2" >> /etc/hostsecho "drbd01" > /etc/hostname在drbd02上echo "192.168.1.23 drbd1" >> /etc/hostsecho "drbd02" > /etc/hostname(需要reboot后设置生效)2.安装drbd(主从都要安装)apt-get install drbd8-utils3.配置drbd.conf(/etc/drbd.conf)的配置文件(主从都要做)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.confglobal {usage-count no; //帮LINBIT公司统计drbd使用量}common {protocol C;//C为最安全同时也是性能最好的一种确认写操作完成的方法syncer {rate 100M; //同步的速率}}vim /etc/drbd.d/r0.resresource r0 { //r0资源名称,以后很多地方会用到on drbd01 {device /dev/drbd0; //逻辑设备的路径disk /dev/sdb1; //物理设备address 192.168.1.22:7788; //主节点meta-disk internal;}on drbd02 {device /dev/drbd0;disk /dev/sdb1;address 192.168.1.23:7788; //从节点meta-disk internal;}}4.初始化drbd的metadata(在主节点上操作)drbdadm create-md r0(如果出现如下错误:md_offset 21467942912al_offset 21467910144bm_offset 21467254784Found ext3 filesystem20964792 kB data area apparently used20964116 kB left usable by current configurationDevice size would be truncated, whichwould corrupt data and result in'access beyond end of device' errors.You need to either* use external meta data (recommended)* shrink that filesystem first* zero out the device (destroy the filesystem)Operation refused.Command 'drbdmeta 1 v08 /dev/sdb1 internal create-md' terminated with exit code 40drbdadm create-md r0exited with code 40)执行如下命令:dd if=/dev/zero bs=1M count=1 of=/dev/sdb1;sync再次执行drbdadm create-md r0看到success则表示成功。
开源的高可用性软件heartbeat1. 需求的提出服务器连续运行是非常关键的,但服务器可能由多种原因引起服务停止,如设备故障、操作系统故障、软件系统故障等等。
一般地讲,在技术人员在现场的情况下,恢复服务器正常可能需要10分钟、几小时甚至几天。
从实际经验上看,除非是简单地重启服务器(可能隐患仍然存在),否则往往需要几个小时以上。
而如果技术人员不在现场,则恢复服务的时间就更长。
而对于一些重要系统而言,用户是很难忍受这样长时间的服务中断的,信息系统的可用性(即系统是否可以可靠地运行)已成为衡量其资源利用率的最重要的尺度,因此,就需要高可用性系统来避免长时间的服务中断,保证系统长期、可靠的服务。
2. 高可能性系统heartbeat2.1. 高可性系统说明高可用性(High Available)系统,是指在某一台主机上特定的服务因主机设备异常而无法继续运作时,在最短的时间内在其它台正常的主机上重新启动该项服务。
如此一来即使故障的主机无法立即修复,此特定的业务依然可以继续运作。
2.2. Heartbeat简介当前有大量的高可能性商业软件如HACMP、Legato、LifeKeeper、Veritas Cluster Server 等。
这里介绍一下开源的集高可能性软件heartbeat。
Heartbeat是可以从/下载的开源高可用性软件,其实现了基于串口和UDP的心跳信号多通道传输,即使所有的通道都发生故障,Heartbeat还可以通过第三方参考IP 的方式,保证两个节点系统的一致性防止裂脑(split-brain 暨两台服务器都认为对方down 机,从而同时争夺资源提供服务);同时提供了IP地址的转移和资源组的概念,以便用户自行扩展功能。
3. Heartbeat应用实例3.1. 最终达到的效果服务器HA1和HA2为双机热备的Apache服务器,正常情况HA1起动Apache服务,并通过浮动IP 202.202.202.2对外提供服务,通过以下情况保持202.202.202.2地址上的Apache服务高可用性。
高可用群集让mysql服务器从此高枕无忧实验环境:redhat enterprise 5.4 内核版本号:2.6.18-164.el5注意的事项1:Yum 服务器的构建2:各个节点之间的时间的一致性(hwclock –s 或者搭建ntp服务器)3:被定义为群集的资源都不可以在本地主机上进行启动,他们要被crm来进行管理。
4:由于dbrd,corosync,pacemaker等各群集的服务都需要通过主机名来进行解析,所以我们的主机的名字一定要能够被正确的解析。
(hosts文件)5:本实验要用到的软件包。
//*************由于drbd内核模块代码只在linux内核2.6.3.33以后的版本中才有,所以我们要同时安装内核模块和管理工具*********//drbd83-8.3.8-1.el5.centos.i386.rpm drbd的管理包kmod-drbd83-8.3.8-1.el5.centos.i686.rpm drbd的内核模块//*************由于drbd内核模块代码只在linux内核2.6.3.33以后的版本中才有,所以我们要同时安装内核模块和管理工具*********//cluster-glue-1.0.6-1.6.el5.i386.rpm 为了在群集中增加对更多节点的支持cluster-glue-libs-1.0.6-1.6.el5.i386.rpmcorosync-1.2.7-1.1.el5.i386.rpm corosync的主配置文件corosynclib-1.2.7-1.1.el5.i386.rpm corosync的库文件heartbeat-3.0.3-2.3.el5.i386.rpm 我们的heartbeat在这里是做四层的资源代理用的heartbeat-libs-3.0.3-2.3.el5.i386.rpm heartbeat的库文件ldirectord-1.0.1-1.el5.i386.rpm 在高可用性群集中实验对后面realserver的探测libesmtp-1.0.4-5.el5.i386.rpmopenais-1.1.3-1.6.el5.i386.rpm做丰富pacemake的内容使用openaislib-1.1.3-1.6.el5.i386.rpm openais 的库文件pacemaker-1.1.5-1.1.el5.i386.rpm pacemake的主配置文档pacemaker-libs-1.1.5-1.1.el5.i386.rpm pacemaker的库文件pacemaker-cts-1.1.5-1.1.el5.i386.rpmperl-TimeDate-1.16-5.el5.noarch.rpmresource-agents-1.0.4-1.1.el5.i386.rpm 开启资源代理用的mysql-5.5.15-linux2.6-i686.tar.gz mysql的绿色软件说明:资源的下载地址/data/402802具体的实验步骤:一:修改群集中各节点的网络参数node1:[root@node1 ~]# vim /etc/sysconfig/networkNETWORKING=yesNETWORKING_IPV6=noHOSTNAME=[root@node1 ~]# vim /etc/hosts192.168.2.10 node1192.168.2.20 node2[root@node1 ~]#hostnamenode2:[root@node2 ~]# vim /etc/sysconfig/networkNETWORKING=yesNETWORKING_IPV6=noHOSTNAME=[root@node2 ~]# vim /etc/hosts192.168.2.10 node1192.168.2.20 node2[root@node2 ~]#hostname二:同步群集中各节点的时间node1:[root@node1~]# hwclock -snode2:[root@node2 ~]# hwclock -s三:在各个节点上面产生密钥实现无密码的通讯node1:[root@node1 ~]# ssh-key -t rsa 产生一个rsa的非对称加密的私钥对[root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub node2 拷贝到node2节点node2:[root@node2 ~]# ssh-key -t rsa 产生一个rsa的非对称加密的私钥对[root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub node2 拷贝到node1节点四:在各个节点上面配置好yum客户端node1:[root@node1 ~]# vim /etc/yum.repos.d/server.repo[rhel-server]name=Red Hat Enterprise Linux serverbaseurl=file:///mnt/cdrom/Serverenabled=1gpgcheck=1gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release[rhel-vt]name=Red Hat Enterprise Linux vtbaseurl=file:///mnt/cdrom/VTenabled=1gpgcheck=1gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release[rhel-cluster] 做群集需要用到的仓库name=Red Hat Enterprise Linux clusterbaseurl=file:///mnt/cdrom/Clusterenabled=1gpgcheck=1gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release[rhel-clusterstorage] 做群集文件系统需要用到的仓库name=Red Hat Enterprise Linux clusterstoragebaseurl=file:///mnt/cdrom/ClusterStorageenabled=1gpgcheck=1gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release node2:[root@node2 ~]# vim /etc/yum.repos.d/server.repo [rhel-server]name=Red Hat Enterprise Linux serverbaseurl=file:///mnt/cdrom/Serverenabled=1gpgcheck=1gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release [rhel-vt]name=Red Hat Enterprise Linux vtbaseurl=file:///mnt/cdrom/VTenabled=1gpgcheck=1gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release [rhel-cluster] 做群集需要用到的仓库name=Red Hat Enterprise Linux clusterbaseurl=file:///mnt/cdrom/Clusterenabled=1gpgcheck=1gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release [rhel-clusterstorage] 做群集文件系统需要用到的仓库name=Red Hat Enterprise Linux clusterstorage baseurl=file:///mnt/cdrom/ClusterStorageenabled=1gpgcheck=1gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release五:将下载好的rpm包上传到linux上的各个节点node1:[root@node1 ~]# ll-rw-r--r-- 1 root root 221868 May 9 10:34 drbd83-8.3.8-1.el5.centos.i386.rpm -rw-r--r-- 1 root root 44377 May 9 10:34 ldirectord-1.0.1-1.el5.i386.rpm -rw-r--r-- 1 root root 271360 May 8 13:07cluster-glue-1.0.6-1.6.el5.i386.rpm 为了在群集中增加对更多节点的支持-rw-r--r-- 1 root root 133254 May 8 13:07cluster-glue-libs-1.0.6-1.6.el5.i386.rpm-rw-r--r-- 1 root root 170052 May 8 13:07corosync-1.2.7-1.1.el5.i386.rpm corosync的主配置文件-rw-r--r-- 1 root root 158502 May 8 13:07corosynclib-1.2.7-1.1.el5.i386.rpm corosync的库文件-rw-r--r-- 1 root root 165591 May 8 13:07heartbeat-3.0.3-2.3.el5.i386.rpm 我们的heartbeat在这里是做四层的资源代理用的-rw-r--r-- 1 root root 289600 May 8 13:07heartbeat-libs-3.0.3-2.3.el5.i386.rpm heartbeat的库文件-rw-r--r-- 1 root root 60458 May 813:07 libesmtp-1.0.4-5.el5.i386.rpm-rw-r--r-- 1 root root 126663 May 5 11:26 libmcrypt-2.5.7-5.el5.i386.rpm -rw-r--r-- 1 root root 207085 May 8 13:07openais-1.1.3-1.6.el5.i386.rpm 做丰富pacemake的内容使用-rw-r--r-- 1 root root 94614 May 8 13:07openaislib-1.1.3-1.6.el5.i386.rpm-rw-r--r-- 1 root root 796813 May 8 13:07pacemaker-1.1.5-1.1.el5.i386.rpm pacemake的主配置文档-rw-r--r-- 1 root root 207925 May 8 13:07pacemaker-cts-1.1.5-1.1.el5.i386.rpm-rw-r--r-- 1 root root 332026 May 8 13:07pacemaker-libs-1.1.5-1.1.el5.i386.rpm pacemaker的库文件-rw-r--r-- 1 root root 32818 May 8 13:07perl-TimeDate-1.16-5.el5.noarch.rpm-rw-r--r-- 1 root root 388632 May 8 13:07resource-agents-1.0.4-1.1.el5.i386.rpm-rw-r--r-- 1 root root 162247449 May 9 16:44mysql-5.5.15-linux2.6-i686.tar.gznode2:[root@node2 ~]# ll-rw-r--r-- 1 root root 221868 May 9 10:34 drbd83-8.3.8-1.el5.centos.i386.rpm -rw-r--r-- 1 root root 44377 May 9 10:34 ldirectord-1.0.1-1.el5.i386.rpm -rw-r--r-- 1 root root 271360 May 8 13:07cluster-glue-1.0.6-1.6.el5.i386.rpm 为了在群集中增加对更多节点的支持-rw-r--r-- 1 root root 133254 May 8 13:07cluster-glue-libs-1.0.6-1.6.el5.i386.rpm-rw-r--r-- 1 root root 170052 May 8 13:07corosync-1.2.7-1.1.el5.i386.rpm corosync的主配置文件-rw-r--r-- 1 root root 158502 May 8 13:07corosynclib-1.2.7-1.1.el5.i386.rpm corosync的库文件-rw-r--r-- 1 root root 165591 May 8 13:07heartbeat-3.0.3-2.3.el5.i386.rpm 我们的heartbeat在这里是做四层的资源代理用的-rw-r--r-- 1 root root 289600 May 8 13:07heartbeat-libs-3.0.3-2.3.el5.i386.rpm heartbeat的库文件-rw-r--r-- 1 root root 60458 May 813:07 libesmtp-1.0.4-5.el5.i386.rpm-rw-r--r-- 1 root root 126663 May 5 11:26 libmcrypt-2.5.7-5.el5.i386.rpm-rw-r--r-- 1 root root 207085 May 8 13:07openais-1.1.3-1.6.el5.i386.rpm 做丰富pacemake的内容使用-rw-r--r-- 1 root root 94614 May 8 13:07openaislib-1.1.3-1.6.el5.i386.rpm-rw-r--r-- 1 root root 796813 May 8 13:07pacemaker-1.1.5-1.1.el5.i386.rpm pacemake的主配置文档-rw-r--r-- 1 root root 207925 May 8 13:07pacemaker-cts-1.1.5-1.1.el5.i386.rpm-rw-r--r-- 1 root root 332026 May 8 13:07pacemaker-libs-1.1.5-1.1.el5.i386.rpm pacemaker的库文件-rw-r--r-- 1 root root 32818 May 8 13:07perl-TimeDate-1.16-5.el5.noarch.rpm-rw-r--r-- 1 root root 388632 May 8 13:07resource-agents-1.0.4-1.1.el5.i386.rpm-rw-r--r-- 1 root root 162247449 May 9 16:44mysql-5.5.15-linux2.6-i686.tar.gz六:在各节点上面安装所有的rpm包node1: [root@node1 ~]# yum localinstall *.rpm -y --nogpgchecknode2: [root@node2~]# yum localinstall *.rpm -y --nogpgcheck七:在各节点上增加一个大小类型都相关的drbd设备(sdb1)Node1:[root@node1 ~]# fdisk /dev/sdbCommand (m for help): nCommand actione extendedp primary partition (1-4)pPartition number (1-4): 1First cylinder (1-522, default 1):Using default value 1Last cylinder or +size or +sizeM or +sizeK (1-522, default 522): +1000M Command (m for help): pDisk /dev/sdb: 4294 MB, 4294967296 bytes255 heads, 63 sectors/track, 522 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id System/dev/sdb1 1 123 987966 83 Linux[root@node1 ~]# partprobe /dev/sdb //重新加载内核模块[root@node1 ~]# cat /proc/partitionsmajor minor #blocks name8 0 20971520 sda8 1 104391 sda18 2 1052257 sda28 3 19808145 sda38 16 4194304 sdb8 17 987966 sdb1Node2:[root@node2 ~]# fdisk /dev/sdbCommand (m for help): nCommand actione extendedp primary partition (1-4)pPartition number (1-4): 1First cylinder (1-522, default 1):Using default value 1Last cylinder or +size or +sizeM or +sizeK (1-522, default 522): +1000M Command (m for help): pDisk /dev/sdb: 4294 MB, 4294967296 bytes255 heads, 63 sectors/track, 522 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesDevice Boot Start End Blocks Id System/dev/sdb1 1 123 987966 83 Linux[root@node2 ~]# partprobe /dev/sdb //重新加载内核模块[root@node2 ~]# cat /proc/partitionsmajor minor #blocks name8 0 20971520 sda8 1 104391 sda18 2 1052257 sda28 3 19808145 sda38 16 4194304 sdb8 17 987966 sdb1八:配置drbdnode1:1: 复制样例配置文件为即将使用的配置文件.[root@node1 ~]# cp /usr/share/doc/drbd83-8.3.8/drbd.conf /etc/2:将文件global_common.conf 备份一份[root@node1 ~]# cd /etc/drbd.d/[root@node1 drbd.d]# ll-rwxr-xr-x 1 root root 1418 Jun 4 2010 global_common.conf[root@node1 drbd.d]# cp global_common.conf global_common.conf.bak3:编辑global_common.conf[root@node1 drbd.d]# vim global_common.confglobal {usage-count no; 不开启统计}common {protocol C;handlers {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";}startup {wfc-timeout 120; 等待连接的超时时间degr-wfc-timeout 120; 等待降级的节点连接的超时时间}disk {on-io-error detach; 当出现I/O错误,节点要拆掉drbd设备 }net {cram-hmac-alg "sha1"; 使用sha1加密算法实现节点认证shared-secret "mydrbdlab"; 认证码,两个节点内容要相同}syncer {rate 100M; 定义同步数据时的速率}}4:定义mysql的资源[root@node1 drbd.d]# vim mysql.resresource mysql {on {device /dev/drbd0;disk /dev/sdb1;address 192.168.2.10:7789;meta-disk internal;}on {device /dev/drbd0;disk /dev/sdb1;address 192.168.2.20:7789;meta-disk internal;}}5:将以上的drbd.*文件都拷贝到node2上面[root@node1 drbd.d]# scp -r /etc/drbd.* node2:/etc/ 6:node1初始化定义的mysql的资源并启动相应的服务[root@node1 drbd.d]# drbdadm create-md mysql Writing meta data...initializing activity logNOT initialized bitmapNew drbd meta data block successfully created. [root@node1 drbd.d]# service drbd start7:node2初始化定义的mysql的资源并启动相应的服务[root@node2 drbd.d]# drbdadm create-md mysqlWriting meta data...initializing activity logNOT initialized bitmapNew drbd meta data block successfully created.[root@node2 drbd.d]# service drbd start8: 使用drbd-overview命令来查看启动状态[root@node1 drbd.d]# drbd-overview0:mysql Connected Secondary/Secondary Inconsistent/Inconsistent C r---- 从上面的信息中可以看出此时两个节点均处于Secondary状态。
MySQL数据库高可用性方案一、综述数据库位于现代企业应用的核心,它储存了组织机构中最有价值的资产,包括客户信息、产品信息、订单信息和历史数据。
另外,组织机构依赖于数据库来运行他们关键业务应用。
几小时甚至是几分钟的宕机,往往会造成收入的大量流失和客户的不满。
因此,保证数据库高可用是所有组织机构优先考虑的事情。
对于希望在当今瞬息万变的经济环境立于不败之地并取得成功的企业来说,构建一个具有高可用性的IT 基础架构至关重要。
二、完成目标通过技术手段实现mysql数据库的高可用性,从而减少停工时间保证服务的正常稳定运行。
三、方案建设概要1、现有高可用方案分析Mysql作为一款开源软件经过多年的发展,已经形成很多套实现高可用方案,并且均都投入生产使用,主要为这几种:mysql + replication 、mysql + heartbeat + 存储、mysql + drbd + heartbeat 、mysql cluster。
以下将依次对各个方案进行分析。
2、Mysql+replication2.1 概述Mysql的复制(Replication)是一个异步的复制,从一个Mysql instace (称之为Master)复制到另一个Mysql instance(称之Slave)。
实现整个复制操作主要由三个进程完成的,其中两个进程在Slave(Sql进程和IO进程),另外一个进程在Master(IO进程)上。
2.2 Mysqlreplication方案拓扑图Mysql+replication主从复制拓扑图方案具体解释:要实施复制,首先必须打开Master端的binary log(bin-log)功能,否则无法实现。
因为整个复制过程实际上就是Slave从Master端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。
2.3 Mysql+replication优缺点优点:易实施、成本低、经济实惠、后期维护方便,且由于整套系统架构简单,不涉及到存储及双机软件,因此系统出现故障率很低。
heartbeat基础知识1.heartbeat介绍通过heartbeat,可以将资源(IP及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用服务。
和keepalive有很多相同之处。
2.heartbeat工作原理通过修改配置文件,可以指定哪一台heartbeat是主服务器,则另一台将自动成为热备服务器,主节点像备节点发送心跳消息,然后在热备服务器上配置heartbeat守护程序来监听来自主服务器的心跳消息。
如果热备服务器在指定时间内未监听来自主服务器的心跳,就会启动故障转移程序,并取得主服务器上的相关资源服务的所有权,接替主服务器继续不间断的提供服务,从而达到资源及服务高可用性的目的。
以上描述的是heartbeat主备模式,heartbeat还支持主主模式,即两台服务器互为主备,这时它们之间会相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未受到对方发送的心跳报文,那么,一方就会认为对方失效或者宕机了,这时每个运行正常的主机就会启动自身的资源接管模块来接管运行在对方主机上的资源或者服务,继续为用户提供服务。
注意:所谓业务不间断指的是:在故障转移期间也是需要切换时间的,切换时间内会无响应,但不会数据不一致,切换时间一般为:5-20秒左右。
和keepalived服务一样,htartbeat高可用是服务器级别的,不是服务级别的。
3.heartbeat切换的常见条件1)服务器宕机。
2)heartbeat服务本身故障。
3)心跳连接故障。
注意:服务故障不会导致切换,可以通过服务宕机把heartbeat服务停掉,切换服务。
4.heartbeat心跳连接两台heartbeat主机之间通信的一般的可行方法:1)串行电缆,所谓的串口。
(首选,缺点是距离不能太远)2)一根以太网电缆两网卡直连(推荐)3)以太网电缆,通过交换机等网络设备连接(次选,增加了故障点,不是专门线路,易受到影响)5.什么是裂脑?由于两台高可用服务器对之间在指定时间无法互相检测到对方心跳而各自启动故障转移功能,取得了资源及服务的所有权,而此时的两台高可用服务器都还活着并在正常运行,这样就会导致同一个IP或服务在两端同时启动而发生冲突的严重问题,最严重的是两台主机占用同一个VIP地址,当用户写入数据时候可能分别写入到两端,谁快可能就先写到谁上面,这样可能会导致服务器两端的数据不一致或者造成数据丢失,这种情况就被称为是裂脑。
linux平台mysql_5.6+keepalived高可用双主架构日期操作内容Figo 2016/07/27撰写linux平台mysql_5.6+keepalived高可用双主架构搭建一、简述关于MySQL-HA,目前有多种解决方案,比如heartbeat、drbd、mmm、共享存储,但是它们各有优缺点。
heartbeat、drbd配置较为复杂,需要自己写脚本才能实现MySQL自动切换,对于不会脚本语言的人来说,这无疑是一种脑裂问题;对于mmm,生产环境中很少有人用,且mmm 管理端需要单独运行一台服务器上,要是想实现高可用,就得对mmm管理端做HA,这样无疑又增加了硬件开支;对于共享存储,个人觉得MySQL数据还是放在本地较为安全,存储设备毕竟存在单点隐患。
使用MySQL双master+keepalived是一种非常好的解决方案,在MySQL-HA环境中,MySQL互为主从关系,这样就保证了两台MySQL数据的一致性,然后用keepalived实现虚拟IP,通过keepalived自带的服务监控功能来实现MySQL故障时自动切换。
二、安装过程2.1实施规划[root@mysql3 ~]# cat /etc/hosts** localhost localhost.localdomain localhost4 localhost4.localdomain4** mysql32.2** mysql4Mysql双主实施vi /etc/security/limits.confmysql soft nproc 16384mysql hard nproc 16384mysql soft nofile 65536mysql hard nofile 65536mysql hard stack 1024000mysql soft stack 1024000mkdir -p /u01mkdir -p /mysql/3306/datamkdir -p /mysql/3306/binlogmkdir -p /mysql/3306/logchown -R mysql:mysql /u01/chown -R mysql:mysql /mysql/3306vi .bash_profile将PATH=$PATH:$HOME/bin改为:PATH=$PATH:$HOME/bin:/u01/mysql/bin:/u01/mysql/lib:/u01/mysqlcd /u01tar -xvf mysql-5.6.25-linux-glibc2.5-x86_64.tar.gzmv mysql-5.6.25-linux-glibc2.5-x86_64 mysqlchown -R mysql:mysql /u01/mysqlcd /u01/mysqlcp ./support-files/mysql.server /etc/init.d/mysql.servercp ./support-files/my-f /etc/fchown mysql:mysql /etc/fchown mysql:mysql /etc/init.d/mysql.serverchkconfig mysql.server onmy.txtchown -R mysql:mysql /u01/mysqlchown -R mysql:mysql /mysql/3306chmod -R 755 /mysql/3306su - mysqlcd /u01/mysql./scripts/mysql_install_db --defaults-file=/etc/f --user=mysql --datadir=/mysql/3306/dataln -s /u01/mysql/support-files/mysql.server /u01/mysql/grant replication slave on *.* to 'repl'@'%' identified by '123456';flush privileges;change master tomaster_host='192.168.9.71',master_port=3306,master_user='repl',master_password='123456',master_log_file='bin.000003',master_log_pos=351;start slave详情可参见“linux平台mysql_5.6主从复制搭建_V1.0.0”2.3Keepalived 安装与配置tar -xvf keepalived-1.2.13.tar.gzyum install gccyum install -y openssl openssl-develcd /tmp/keepalived-1.2.13./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.18-164.el6-i686 make && make install配置keepalived节点一:[root@mysql3 ~]# cat /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {notification_email {XX}notification_email_from XXsmtp_server 127.0.0.1smtp_connect_timeout 30router_id MySQL-ha}vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 100advert_int 1nopreemptauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.9.57}}virtual_server 192.168.9.57 3306 {delay_loop 2lb_algo wrrlb_kind DRpersistence_timeout 60protocol TCPreal_server 192.168.9.55 3306 {weight 3notify_down /usr/local/MySQL.shTCP_CHECK {connect_timeout 10nb_get_retry 3delay_before_retry 3connect_port 3306}}[root@mysql3 ~]# cat /usr/local/MySQL.sh#!/bin/shpkill keepalived[root@mysql3 ~]#节点二:[root@mysql4 keepalived]# cat keepalived.conf ! Configuration File for keepalivedglobal_defs {notification_email {XX}notification_email_from XXsmtp_server 127.0.0.1smtp_connect_timeout 30router_id MySQL-ha}vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 90advert_int 1# nopreemptauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.9.57}}virtual_server 192.168.9.57 3306 {delay_loop 2lb_algo wrrlb_kind DRpersistence_timeout 60protocol TCPreal_server 192.168.9.56 3306 {weight 3notify_down /usr/local/MySQL.shTCP_CHECK {connect_timeout 10nb_get_retry 3delay_before_retry 3connect_port 3306}}[root@mysql4 keepalived]# cat /usr/local/MySQL.sh#!/bin/shpkill keepalived[root@mysql4 keepalived]#把keepalived 加入到系统服务里面:cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ cp /usr/local/keepalived/sbin/keepalived /usr/sbin/2.4开启服务测试/etc/init.d/keepalived start/etc/init.d/keepalived status可以查看操作系统日志:tail -f /var/log/messages先在服务器端授权远程连接:grant all privileges on *.* to 'root'@'%' identified by '123456'; flush privileges;然后在第三台服务器上用vip连接数据库:[root@mysql1 ~]# mysql -uroot -p -h 192.168.9.57Enter password:Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 5094Server version: 5.6.25-log MySQL Community Server (GPL)Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>mysql> show variables like '%host%';+-------------------------------+--------+| Variable_name | Value |+-------------------------------+--------+| host_cache_size | 653 || hostname | mysql4 || performance_schema_hosts_size | 100 || report_host | |+-------------------------------+--------+如果停止当前连接节点mysql4 mysql服务:[mysql@mysql4 ~]$ mysql.server stopShutting down MySQL.............[ OK ][mysql@mysql4 ~]$过一会儿查看目标连接:mysql> show variables like '%host%';+-------------------------------+--------+| Variable_name | Value |+-------------------------------+--------+| host_cache_size | 653 || hostname | mysql3 || performance_schema_hosts_size | 100 || report_host | |+-------------------------------+--------+4 rows in set (0.00 sec)此时再开启mysql4上的mysql服务:[mysql@mysql4 ~]$ mysql.server startStarting MySQL...[ OK ]再次在客户端查看连接:mysql> show variables like '%host%';+-------------------------------+--------+| Variable_name | Value |+-------------------------------+--------+| host_cache_size | 653 || hostname | mysql3 || performance_schema_hosts_size | 100 || report_host | |+-------------------------------+--------+4 rows in set (0.00 sec)三、管理维护四、附录4.1Keepalved.conf解释vi/etc/keepalived/keepalived.conf 参数中:global_defs {notification_email {XX}notification_email_from XXsmtp_server 127.0.0.1smtp_connect_timeout 30router_id MySQL-ha #标识,双主相同}vrrp_instance VI_1 {state BACKUP #两台都设置BACKUPinterface eth0virtual_router_id 51 #主备相同priority 100 #优先级,backup设置90advert_int 1nopreempt #不主动抢占资源,只在master这台优先级高的设置,backup不设置authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.9.57}}virtual_server 192.168.9.57 3306 {delay_loop 2lb_algo wrr #LVS算法lb_kind DR #LVS模式persistence_timeout 60 #同一IP的连接60秒内被分配到同一台真实服务器protocol TCPreal_server 192.168.9.55 3306 { #检测本地mysql,backup也要写检测本地mysqlweight 3notify_down /usr/local/MySQL.sh #当mysq服down时,执行此脚本,杀死keepalived 实现切换TCP_CHECK {connect_timeout 10nb_get_retry 3 #连接超时delay_before_retry 3 #重试次数connect_port 3306 #重试间隔时间}}4.2更复杂的keepalived.conf主的keepalived配置文件修改后如下,其实不相同的就优先级而已[root@mysql-server-01 keepalived]# cat keepalived.confglobal_defs {router_id MySQL-HA}vrrp_script check_run {script "/data/sh/mysql_check.sh"interval 300}vrrp_sync_group VG1 {group {VI_1}}vrrp_instance VI_1 {state BACKUPinterface eth1virtual_router_id 51priority 100advert_int 1nopreemptauthentication {auth_type PASSauth_pass 1111}track_script {check_run}notify_master /data/sh/master.shnotify_backup /data/sh/backup.shnotify_stop /data/sh/stop.shvirtual_ipaddress {192.168.0.88}}其中有几个关键参数的地方:notify_master:状态改变为master以后执行的脚本。
MySQL高可用方案介绍随着互联网的快速发展和数据量的不断增长,数据库成为了企业重要的核心组件之一。
MySQL作为一种功能强大且广泛应用的开源数据库,其高可用性方案备受关注。
本文将介绍MySQL高可用性方案,并探讨其应用和优缺点。
一、概述高可用性是指系统或组件在保证持续稳定运行的前提下,能够提供连续可用的服务。
在数据库领域中,高可用性关乎数据的持久性、可恢复性和服务的连续性。
MySQL高可用性方案主要包括主从复制、主主复制以及多主复制三种形式。
二、主从复制主从复制是一种常见且广泛应用的MySQL高可用性方案。
它的工作原理是通过将写入主节点的数据同步到一个或多个从节点,实现数据的冗余和备份。
主从复制可以提高系统的可用性,同时减轻主节点的负载压力。
当主节点发生故障时,可以快速切换到一个从节点作为新的主节点,从而保证系统的连续可用。
主从复制的配置主要包括以下几个步骤:1. 在主节点上启动二进制日志,并配置唯一的server-id。
2. 在从节点上配置从主节点同步数据的参数,包括指定主节点的地址和端口、启用二进制日志、设置唯一的server-id以及指定同步策略。
3. 在主节点上创建一个用于复制的用户,并赋予复制权限。
4. 在从节点上启动复制进程,将从主节点同步数据到从节点。
主从复制的优点包括:1. 数据冗余和备份,提高系统的可用性和可靠性。
2. 分担主节点的负载,提高系统的性能。
3. 可以实现主节点的故障切换,确保系统的连续可用。
主从复制的缺点包括:1. 从节点只能读取数据,不具备写入的能力。
2. 主节点的写入延迟会影响到从节点的数据同步。
3. 从节点数量的增加会增加系统的管理复杂性。
三、主主复制主主复制是另一种常见的MySQL高可用性方案。
它的工作原理是将两个或多个节点同时作为主节点和从节点,实现数据的双向同步。
主主复制可以提高系统的可用性和灵活性,适用于读写都很频繁的场景。
主主复制的配置主要包括以下几个步骤:1. 在每个节点上启动二进制日志,并配置唯一的server-id。
一、安装heartbeat 和drbd主机名修改之后最好重启一下查看主机server1 和server2 的IP:配置两台主机的hosts 文件:yum 这个命令要root 用户才有权限配置drbd一般只需要添加红色字体部分global {usage-count yes;}common {handlers {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";}startup {}options {}disk {}net {protocol C;}}resource r0 {on server1 {device /dev/drbd1;disk /dev/sda2;address 192.168.1.123:7789; # 主机server1 的ip meta-disk internal;}on server2 {device /dev/drbd1;disk /dev/sda2;address 192.168.1.129:7789; # 主机server2 的ip meta-disk internal;}}Drbd 管理:两台主机启动drbd两台主机查看drbd 状态:设置server1 为主节点,并格式化和挂载目录配置heartbeatha.cf 主配置文件haresource 资源管理文件authkeys 心跳加密文件配置主机其中一张网卡的静态IP:配置ha.cfdebugfile /var/log/ha-debug //调试日志位置logfacility local0keepalive 2 //2秒检测一次心跳连接deadtime 30 //多长时间检测不到主服务器心跳为有问题,不要设置太低warntime 10 //警告时间(最好在2-10秒)initdead 120 //初始化启动时,120秒内无链接为正常udpport 694 //使用udp 694做为bcast/ucast通讯端口ucast eth3 10.0.0.201 //单播方式连接,eth1是本身对应的心跳网卡主从都写对方的心跳ipauto_failback on //开启自动切换,主服恢复后,自动切换回来node s erver1 //申明主服,注意是uname -n的完全限定域名node s erver2 //申明备服,注意是uname -n的完全限定域名ping 192.168.1.254 // ping 的是网关crm respawnapiauth mgmtd uid=haclusterrespawn root /usr/lib64/heartbeat/mgmtd -v配置authkeysauth 11 crcchmod 600 authkeys命令设置authkeys 权限(authkeys 的权限一定要设置,不然日志报错)配置haresources注:该文件内IPaddr,Filesystem等脚本存放路径在/etc/ha.d/resource.d/下,也可在该目录下存放服务动脚本(例如:mysqld),将相同脚本名称添到/etc/ha.d/haresources内容中,从而跟随heartbeat启而启动该脚本。
IPaddr::192.168.1.100/24/eth2:用IPaddr脚本配置浮动VIPdrbddisk::r0:用drbddisk脚本实现DRBD主从节点资源组的挂载和卸载Filesystem::/dev/drbd0::/data::ext4:用Filesystem脚本实现磁盘挂载和卸载二、安装MYSQL以下方法是解决上上面报错问题的方法:登录mysql注意:@ 左边是用户名,右边是域名、IP或%,表示可以访问mysql 的域名和IP,% 表示外部任何地址都能访问。
修改mysql 的默认引擎为InnoDB停止mysql,命令service mysqld stop编辑f配置好heartbeat之后,因为主heartbeat启动的时候会挂载drdb文件系统以及启动mysql,切换的时候会将主上的mysql停止并卸载文件系统,从上会挂载文件系统,并启动mysql。
因此需要做如下操作(两台服务器):到这里heartbeat+drbd+mysql高可用环境就搭建结束了。
接下来进行测试。
高可用测试:启动 server1 主机上的 mysql查看data 目录发现只有存放数据的mysqldata 目录启动drbd (两台服务器):查看drbd 的状态:设置server1 为主机,并挂载启动heartbeat(两台服务器):查看非心跳网卡的IP:可以看见虚拟ip 192.168.1.100已经存在了。
说明成功了。
我们看看heartbeat的日志就能发现。
先看看两台服务器的状态:可以看见挂载在server1服务器。
测试方法:1.停掉master上的mysqld,看看是否切换(因为heartheat不检查服务的可用性,因此需要通过而外的脚本来实现)。
2.停掉master的heartheat看看是否能正常切换。
3.停掉master的网络或者直接将master系统shutdown,看看能否正常切换。
4.启动master的heartbeat看看是否能正常切换回来。
5.重新启动master看看能否切换过程是否OK。
注意:这里说的切换是不是已经将mysql停掉、是否卸载了文件系统等等。
我就停止server1上的heartbeat来测试是否会自动切换,这里除了第一条无法实现,其他的都可以切换:可以看见已经切换了,我们看 server2的情况:查看server2 的ip 和浮动IP:查看日志,查看发生的情况:对于mysqld服务挂掉的情况无法实现自动切换,所以需要一个脚本来帮助我们完成,我这里有个简单的脚本,能实现当mysqld服务不可用时进行自动切换,当进行切换时发送邮件等。
该脚本放在主服务器执行,也就是运行mysqld服务的服务器上执行。
脚本存在灵活性所以不建议使用脚本(可以直接跳过这一段,阅读下面的 HA 图形界面的安装和配置部分):Mysqlmon.sh 的内容如下:#!/bin/bashtrap 'echo PROGRAM INTERRUPTED; exit 1' INTusername=rootpassword=123456n=0log='/var/log/mysqlmon.log'while truedoif /usr/local/mysql/bin/mysql -u${username} -p${password} -e "usetest" >&/dev/null;thenecho"`date +"%Y-%m-%d %H:%M:%S"` mysqld is alive!" >> ${log}n=0elseecho"`date +"%Y-%m-%d %H:%M:%S"` mysqld cannot be connected!" >> ${log}n=$[n + 1]if [ $n -eq 3 ];then/etc/init.d/heartbeat stopecho"`date +"%Y-%m-%d %H:%M:%S"` mysqld switched to backup!" >> ${log}echo"`date +"%Y-%m-%d %H:%M:%S"` mysqld switched to backup"| mutt -s "mysqld switched to backup" saltstack@breakfifisleep10done说明:mysql 编译安装的路径和yum 命令安装mysql的路径是不一样的,所以/usr/local/mysql/bin/mysql 根据安装方式的不一样具体修改Mutt 是发送邮件命令,通过 rpm -qa | grep -e mutt 查看 mutt 是否安装,如果没有安装,那么需要安装通过nohup mysqlmon.sh & 挂在后台执行,但是报错如下:分析和解决办法:因为操作系统是windows,在windows下编辑的脚本,所以有可能有不可见字符。
从你的脚本及报告的错误看来, 很有可能是你的脚本文件是DOS格式的, 即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A.可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是MAC格式的(1). vi filename然后用命令:set ff?可以看到dos或unix的字样. 如果的确是dos格式的, 那么你可以用set ff=unix把它强制为unix格式的, 然后存盘退出. 再运行一遍看.ok了。
希望遇到类似问题的同学能够如此解决。
解决方法:打开mysqlmon.sh打开之后按一下键盘上Esc 键,随后输入:set ff? 回车将文件格式转换为unix 之后需要修改mysqlmon.sh 文件的权限重新将 mysqlmon.sh 挂在后台执行,执行的时候 mysqlmon.sh 最好是绝对路径:另外一个脚本:#!/bin/shcat << EOF+-----------------------------------------------------------------------------+| === Welcome to LinuxTone=== | |---------------------[url][/url]-------------------------|+-------------------------------By:hamgua--------------------------------+EOFMYPORT=`netstat -na|grep "tcp"|grep "3306"|awk -F[:" "]+ '{print $5}'`HAPORT=`netstat -na|grep "udp"|grep "694"|awk -F[:" "]+ '{print $5}'`PING=`ping -c 5 |awk -F, '/packets/{print $3}'|cut -c 2-|awk '{print $1}'` DB1IP=`ifconfig eth0|awk '/inet/{print $2}'|cut -c 6-`#DB2IP is your next mysqlserver and haserver IP,According to it own IP to filllog='/var/log/mysqlmon.log'while [ "$PING" != "100\%" ]doif [ "$MYPORT" == "3306"];thenif [ "$HAPORT" == "694" ];thenecho "$DB1IP mysql and ha is running......"elseecho "$DB1IP mysql is running,but ha is down,start ha now"/etc/init.d/heartbeat startif [ "$HAPORT" == "694"];thenecho "$DB1IP ha start successful,mysql and ha all running......"elseecho "$DB1IP ha is down,let (DB2IP) to take over mysql,please start ha now!" > ${log}fifielseif [ "$HAPORT" == "694" ];thenecho "$DB1IP mysql is down,but ha is runing,now shutdown ha,let (DB2IP) to take over mysql,then restart mysql....." > ${log}/etc/init.d/heartbeat stop/etc/init.d/mysqld startif [ "$MYPORT" == "3306"];then/etc/init.d/heartbeat startecho "$DB1IP$mysql restart successful,now mysql and ha all running......"fielseecho "$DB1IPmysql and ha all down,first restart msyql,when mysql is run,restart ha"/etc/init.d/mysqld startif [ "$MYPORT" == "3306"];then/etc/init.d/heartbeat startif [ "$HAPORT" == "694" ];thenecho "$DB1IPmysql and ha all running......"elseecho "$DB1IPmysql is running,ha is down,please restart ha" > ${log}fielseecho "$DB1IPmysql and ha all down,let (DB2IP) to take over mysql,please restart mysql" > ${log}fififisleep 10done要在/etc/sysconfig/iptables 文件中添加如下内容:-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT -A INPUT -p udp -m --udp --dport 694 -d 10.0.0.201 -j ACCEPT在server1 上将mysqlmon.sh 挂在后台执行:三、安装、配置HA-GUI :网上下载pacemaker-mgmt-master.zip ,下载路径如下:https:///ClusterLabs/pacemaker-mgmt如下图所示:下载下来的zip 包不要放置在挂载的网络磁盘上,要将它放置在主机本身的磁盘上,我是将磁盘拷贝在home/用户名目录/Downloads 目录下使用unzip 命令解压zip 包:然后通过cd 命令打开解压的文件编译安装:第一步:./ConfigureMe configure有可能会报错,错误如下:那么需要安装一下依赖包:yum install perl-TimeDate OpenIPMI-libs lm_sensors libxslt libibverbs librdmacm pkg config libtool intltool gettext-devel glib2-devel python-devel libxml2-devel pam-de vel ncurses-devel pygtk2 libtool-ltdl libqb clusterlib libtool-ltdl-devel swig gnutls-devel -y第二部编译:Make第三步安装:Make install打开 ha 的图形界面用命令 ha_gui & 打开图形界面如果IP(主机名)、用户名、密码都是正确的,但是不可以连接,那么可能是主机上的pacemaker 或者corosync 没有启动(因为我这里将pacemaker 作为corosync 的插件使用,所以只需要启动corosync 即可),启动corosync:登录后的默认界面:关闭STONITH 支持默认的情况下pacemaker中启用了stonith,但是我们实际部署集群时可能一般都不会用到stonith资源。