一、背景
当前大多网站采用MYSQL+Linux+APACHE这种经典配置,如何防止单点失败造成的整个网站的不可用是网站管理者必须要考虑的问题,其中数据库的高可用性(Database server’s high availability)是重中之重。
对于数据库的高可用性,各商业软件的厂商都有各自的解决方案,比如Oracle OPS server和IBM DB2 (share-nothing architecture)。最近MYSQL AB也发布了MYSQL cluster 软件,使用与IBM DB2类似的技术。
MySQL cluster可能会是日后最理想的方案,但是从资源、可集成度方面考虑,给出一个简单实用的方案借鉴。本文介绍的是性价比比较高的一种: 使用Heartbeat 2.0配置Linux高可用性集群。
二、实现原理
通过Linux HA 软件 heartbeat 实现IP的自动漂移,即当一台服务器宕机后,浮动IP(整个cluster的对外IP )自动漂移到另外一台服务器。
通过Mysql自身的replication 实现不同机器上多个数据库的同步整体性能此方案将会降低MYSQL 1%左右的性能,可用性及数据安全性将大有提高,同时服务器的切换对终端使用者是透明的,终端应用不需要进行更改。
所需硬件
安装有双网卡的配置大致相同的服务器或工作机两台 一条交叉网线(用于双机对连的心跳线)
所需软件
Linux HA 软件 heartbeat (只支持两个节点),安装盘里集成的有这个软件的rpm包
软件主页:http://www.linux-ha.org/
Mysql软件
软件主页:http://www.mysql.com
实现步骤
一、设置硬件环境:如下表:
计算机名: |
网卡 |
ip地址 |
primary |
Eth0
eth1
|
192.168.0.10/255.255.255.0
10.0.0.1/255.0.0.0 (用于心跳)
|
backup |
Eth0
eth1
|
192.168.0.11/255.255.255.0
10.0.0.2/255.0.0.0 (用于心跳
|
primary和backup的eth0分别连接到你的交换机
primary和backup的eth1之间用心跳线直连起来,做心跳
浮动IP为192.168.0.8/255.255.255.0
二、安装MYSQL
在primary节点上安装mysql数据库
这里我开始都把它下载到本地了,所以这里我用软件把mysql包上传到服务器root目录下
1、在linux系统中添加运行Mysql的用户和组
[root@primary ~]# groupadd mysql
[root@primary ~]# useradd -g mysql mysql
2、解压缩源码包
[root@primary ~]# tar -zxvf mysql-5.0.22.tar.gz
[root@primary ~]# cd mysql-5.0.22
3、配置编译
配置mysql的安装目录,并制定数据库的存放位置
[root@primary mysql-5.0.22]# ./configure –prefix=/usr/local/mysql \
–localstatedir=/var/lib/mysql
4、编译并安装
[root@primary mysql-5.0.22]#make
[root@primary mysql-5.0.22]#make install
5、装载原始授权到数据库
[root@primary mysql-5.0.22]#./scripts/mysql_install_db
6、copy配置文件到/etc目录
[root@primary mysql-5.0.22]# cp support-files/my-medium.cnf /etc/my.cnf
7、copy启动脚本到资源目录
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
8、添加mysql服务,让系统启动时自动启动mysql服务
[root@primary mysql-5.0.22]#chmod +x /etc/rc.d/init.d/mysqld
[root@primary mysql-5.0.22]#chkconfig –level 235 mysqld on
9、更改目录属主/var/lib/mysql
[root@primary mysql-5.0.22]#chown -R mysql.mysql /var/lib/mysql
10、启动mysql
[root@primary mysql-5.0.22]#service mysqld start
11、设置环境变量
[root@primary ~]# vi /etc/profile添加一行就 ,在运行mysql的时候就不用输入很长的路经了
export PATH=$PATH:/usr/local/mysql/bin
设置好之后,用下行命令是设置立即生效
# source /etc/profile
在backup服务器上安装mysql如同上面的步骤
在mysql数据库中创建一个库,用来同步数据和测试用,mysql安装完后有一个练习库test这里就不建了直接就用它了。在test库里面先建一个表
登陆mysql数据库
mysql -u root -p
(执行后提示输入密码,正确输入mysql root用户密码后,登入mysql,以下操作在mysql命令行下进行)
要使用test数据库,先用use命令选择该数据库:
mysql> use test
创建一个表
下面使用create table语句指定你要建的表的布局,下面只是用于一个测试的表。我就随便建了一个:
mysql> create table data(name VARCHAR(20), address VARCHAR(50), phone VARCHAR(20));
Query OK, 0 rows affected (0.11 sec)
在表中添加一条记录,用insert into语句:
mysql> insert into data(name,address,phone) values(‘jhone’,'beijing’,’138000000′);
Query OK, 1 row affected (0.02 sec)
查看表中的记录
mysql> select * from data;
+——-+———+———–+
| name | address | phone |
+——-+———+———–+
| jhone | beijing | 138000000 |
+——-+———+———–+
1 row in set (0.05 sec)
三、设置Mysql Replication
3.1、在primary主机上mysql的设置
1、)增加一用于数据库同步的用户replicate
mysql -u root -p
(执行后提示输入密码,正确输入mysql root用户密码后,登入mysql,以下操作在mysql命令行下进行)
mysql>GRANT REPLICATION SLAVE,REPLICATION CLIENT,RELOAD,SUPER ON *.* TO ‘replicate’@’10.1.1.2′ IDENTIFIED BY ‘you password’;
(授与从10.0.0.2主机上登录用户replicate数据复制权限,4.02版本以前用:GRANT FILE ON *.* TO replicate@10.0.0.1 IDENTIFIED BY ‘password’;)
mysql>flush privileges;
使权限生效,这步可不做,因为过会要重启mysql)
mysql> exit
(退出mysql命令行界面)
2、) 停止mysql服务
service mysqld stop
3、)建立用于更新日志的目录,并给于mysql的权限
[root@primary ~]# mkdir /var/log/mysql
[root@primary ~]# chown mysql.mysql /var/log/mysql/
4、)更改Mysql配置文件/etc/my.cnf 没有的添加上去
vi /etc/my.cnf
log-bin=mysql-bin |
启动二进制日志系统 |
binlog-do-db=db1 |
二进制需要同步的数据库名 |
server-id = 1 |
本机数据库ID 标示为主 |
log-bin=/var/log/mysql/updatelog |
设定生成log文件名和目录 上面已经建好 |
binlog-ignore-db=mysql |
避免同步mysql用户配置,以免不必要的麻烦 |
5、)将要进行复制的数据库打包传到server服务器上
[root@primary mysql]# tar -zcvf /root/db.tar test/ (将要进行复制的test数据库打包)
[root@primary ~]# scp db.tar root@10.1.1.2:/var/lib/mysql/ (将.tar复制到server的/var/lib/mysql/目录)
6、)启动Mysql
service mysqld start
至此,primary上的Mysql设置完毕,
3.2、在backup主机上mysql的配置
1、)增加一用于数据库同步的用户replicate
mysql -u root -p (执行后提示输入密码,正确输入mysql root用户密码后,登入mysql,以下操作在mysql命令行下进行)
GRANT REPLICATION SLAVE,REPLICATION CLIENT,RELOAD,SUPER ON *.* TO ‘replicate’@’10.1.1.1′ IDENTIFIED BY ‘you password’;
(授与从10.0.0.1主机上登录用户replicate数据复制权限,4.02版本以前用:GRANT FILE ON *.* TO replicate@10.0.0.1 IDENTIFIED BY ‘password’;)
mysql>flush privileges; (使权限生效,这步可不做,因为过会要重启mysql)
mysql> exit (退出mysql命令行界面)
2、)停止mysql服务
service mysqld stop
3、)更改Mysql配置文件/etc/my.cnf
vi /etc/my.cnf
server-id = 2 |
从服务器ID号,不要和主ID相同 |
master-host = 10.1.1.1 |
指定主服务器IP地址 |
master-user = repl |
制定在主服务器上可以进行同步的用户名 |
master-password = 123 |
数据同步使用户密码 |
master-port = 3306 |
同步所用的端口 |
master-connect-retry=60 |
断点重新连接时间 |
replicate-ignore-db=mysql |
屏蔽对mysql库的同步 |
replicate-do-db=db1 |
同步数据库名称 |
4、)将先前从primary上发过来的数据库的打包文件解压并替换掉原有文件,并确保属主及权限正确
cd /var/lib/mysql
tar -xvf /db.tar
chown -R mysql.mysql test
chmod 700 test
chmod 660 test
5、)启动Mysql服务
service mysqld start
至此server服务器上的Mysql设置完毕
3.3、查询配置
Show Slave status:此处Slave_IO_Running ,Slave_SQL_Running 都应该是yes,表示从库的I/O,Slave_SQL线程都正确开启.
在Mysql中可通过以下命令来查看主从状态
show master status 查看master状态
show slave status 查看slave状态
show processlist G 查看当前进程
stop slave 暂时停止slave进程
start slave 开始slave进程
在primary服务器上 MySQL命令符下输入:
mysql> show master status;
+——————+———-+————–+——————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+——————+———-+————–+——————+
| updatelog.000001 | 614 | test | mysql |
+——————+———-+————–+——————+
显示(不同主机结果不同)
用show slave status\G;
查看一下从服务器的同步情况
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
主要是看这两行,如果都是yes,那代表已经在同步
更多详细信息以及参数设置,请参考MySQL 5.0 Manual手册.
四、安装配置Linux HA软件heartbeat
在每个节点上分别安装heartbeat
1.安装支持包(linux-ha.org站点提供下载)
Linux的版本不同,RPM文件名可能会不同,请选择相应版本的RPM
rpm -iUvh libnet-*
rpm -iUvh perl-Parse-RecDescent-*
rpm -iUvh perl-Mail-IMAPClient-*
rpm -iUvh perl-Net-SSLeay-*
rpm -iUvh perl-Digest-SHA1-*
rpm -iUvh perl-Digest-HMAC-*
rpm -iUvh perl-Authen-SASL-*
rpm -iUvh perl-Convert-ASN1-*
rpm -iUvh perl-IO-Socket-SSL-*
rpm -iUvh perl-XML-NamespaceSupport-*
rpm -iUvh perl-XML-SAX-*
rpm -iUvh perl-ldap-*
2.按装heartbeat
以RPM方式按装(推荐),Linux的版本不同,RPM文件名可能会不同,请选择相应版本的RPM
rpm -iUvh heartbeat-pils-2.1.3-1.rh.el.3.0.i386.rpm
rpm -iUvh heartbeat-stonith-2.1.3-1.rh.el.3.0.i386.rpm
rpm -iUvh heartbeat-ldirectord-2.1.3-1.rh.el.3.0.i386.rpm
rpm -iUvh heartbeat-2.1.3-1.rh.el.3.0.i386.rpm
3.Copy配置文件到/etc/ha.d目录 (只在一个节点上做即可,所有配置完成后copy到其它节点)
cp /usr/share/doc/heartbeat-2.1.3 /ha.cf /etc/ha.d/
cp /usr/share/doc/heartbeat-2.1.3/haresources /etc/ha.d/
cp /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/
3.Copy配置文件到/etc/ha.d目录 (只在一个节点上做即可,所有配置完成后copy到其它节点)
cp /usr/share/doc/heartbeat-2.1.3/ha.cf /etc/ha.d/
cp /usr/share/doc/heartbeat-2.1.3/haresources /etc/ha.d/
cp /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/
安装好HA之后就开始配置
4.配置/etc/ha.d/ha.cf (只在一个节点上配即可,配好后copy到其它节点)
vi /etc/ha.d/ha.cf
按如下内容进行修改(文件中#开头的行为注释行,更多的选项及选项的详细说明请参考文件中的注释及相关文档)
debugfile /var/log/ha-debug |
#写debug信息到这个文件中 |
logfile /var/log/ha-log |
#写运行日志到这个文件中 |
keepalive 2 |
#设置心跳时间为2秒 |
deadtime 30 |
#设置离最近一次心跳多长时间没有心跳时表明节点失败 |
warntime 10 |
#设置离最近的一次心跳多长时间没有心跳时发出警告 |
initdead 120 |
#机器重启动或是刚开机时,网络能正确开始工作的时间,最小设置为deadtime的两倍 |
udpport 694 |
#bcast/ucast方式心跳通讯所用的UDP端口 |
#baud 19200 |
#串口的波特率,使用串口作心跳时需设置 |
#serial /dev/ttyS0 |
#串口设备名,使用串口作心跳时需设置 |
bcast eth1 |
#使用哪一个设备(网卡)做心跳 |
#bcast eth1 eth2 |
#使用多个设备(网卡)做心跳时的设置 |
auto_failback on |
#当主节点从失败状态恢复时是否恢复其主节点的身份,即应用是否返回到其自身运行
#on 返回
#off 不返回,其它节点继续作为主节点运行
|
#legacy |
#当所有节点都不支持自动返回时,将自身设为自动返回 |
node primary |
#节点的主机名或域名,需在/etc/hosts文件或DNS服务器中设置 |
node backup |
#所有节点都以node开始的行列出 |
ping 192.168.0.1 |
#ping节点,不属于cluster内的节点,通常选一台路由器或交换机作为Ping节点, |
#ipfail |
模块通过此节点来验证网络的连通性,可指定多个Ping节点,如:
#ping 192.168.168.253 192.168.0.254 ns1.rhel.com ping.linux-ha.org
respawn hacluster /usr/lib/heartbeat/ipfail #由heartbeat调用并监视ipfail模块
|
5、)配置/etc/ha.d/haresources (只在一个节点上配即可,配好后copy到其它节点)
按如下内容进行修改(文件中#开头的行为注释行,更多的选项及选项的详细说明请参考文件中的注释及相关文档)
vi /etc/ha.d/haresources在配置文件中添加如下一行
primary 192.168.0.8 mysqld #设置heartbeat管理的资源或服务
#格式为:主节点主机名或域名 浮动IP 服务名
#主节点主机名或域名为ha.cf中node行中指定的任一节点
#浮动IP 为对外提供访问的IP,主节点失败后会自动漂移到其它节点,继续对外提供服务.
#服务名 为 heartbeat管理的服务
#注意,此文件内容所有节点必须保持一致。
6.配置/etc/ha.d/authkeys (只在一个节点上配即可,配好后copy到其它节点)
vi /etc/ha.d/authkeys
按如下内容进行修改(文件中#开头的行为注释行,更多的选项及选项的详细说明请参考文件中的注释及相关文档)
auth 1 |
#设置认证方式 |
1 crc |
#格式为:auth <number> |
#auth 2 |
# <number> <authmethod> [<authkey>] |
#2 md5 Hello! |
#如果是用心跳是用交叉线直接对连两个节点,用crc方式即可,CPU占用最少 |
#auth 3 |
#如果心跳位于不安全的网络,如通过共用交换机连接节点,则选用sha1或md5 |
#3 sha1 HI! |
#sha1占用CPU资源更多,但是更安全,md5安全性及CPU占用率居中 |
#sha1和md5都需要提供认证KEY,即用来加密的KEY
#注意,此文件权限必须设置为600。如果不权限不是600HA将不能正常启动。
7.copy配置文件到backup服务器上
#/scp /etc/ha.d/ha.cf /etc/ha.d/haresources /etc/ha.d/authkeys root@10.1.1.2:/etc/ha.d/
8.分别设置各节点/etc/ha.d/authkeys文件权限
#/chmod 600 /etc/ha.d/authkeys (文件权限必须设置为600,否则heartbeat不能正常启动)
9、设置主服务器和备份服务器时间同步
虽然Heartbeat不要求在两个服务器上使系统钟同步主要和备份服务器,但是系统时钟应该在的几十秒之内,否则在高可用性服务的环境下会产生故障。 在在两个系统启动Heartbeat之前,你应该人工检查并且放置系统时间(使用date命令)。 关于一种更好的长期的解决的方法你应该在两个系统上使用NTP软件同步钟。
10、在每个节点上启动heartbeat
#/service heartbeat start 或者 #/etc/init.d/heartbeat start
五、测试
1、 主服务器的mysql服务应该被heartbeat启动,同时heartbeat为主节点设置IP地址192.168.0.8。使用ifconfig eth0:0可以看到如下信息
Eth0:0 Link encap:Ethernet HWaddr 00:0C:29:22:7E:15
inet addr:192.168.0.8 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe22:7e15/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:324 errors:0 dropped:0 overruns:0 frame:0
TX packets:34 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:43369 (42.3 KiB) TX bytes:7878 (7.6 KiB)
2、 查看主服务器日志信息
可以使用命令查看日志文件:
#tail -f /var/log/messages
此时会发现出现如下信息:
primary heartbeat[2886]: info: Heartbeat restart on node backup
primary heartbeat[2886]: info: Link backup:eth1 up.
primary heartbeat[2886]: info: Node backup: status up
primary heartbeat: info: Running /etc/ha.d/rc.d/status status
primary heartbeat: info: Running /etc/ha.d/rc.d/ifstat ifstat
primary heartbeat[2886]: info: Node backup: status active
primary heartbeat: info: Running /etc/ha.d/rc.d/status status
可以使用tcpdump命令查看心跳广播是否到达两个服务器节点。
#tcpdump -i all -n -p udp port 694
3、 停止主服务器的Heartbeat
停止主服务器的Heartbeat,使用命令:
#/etc/init.d/heartbeat stop 或者 #service heartbeat stop
现在使用ifconfig eth0:0可以看到如下信息:
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:E1:14:84
inet addr:192.168.0.8 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fee1:1484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:73 errors:0 dropped:0 overruns:0 frame:0
TX packets:39 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:8218 (8.0 KiB) TX bytes:8147 (7.9 KiB)
这说明浮动IP已经切换到backup服务器上了。
此时可以使用命令查看backup服务器日志文件:
#tail -f /var/log/messages
此时会发现出现如下信息:
backup heartbeat[4950]: WARN: node primary: is dead
backup heartbeat[4950]: info: Link primary:eth1dead.
backup heartbeat: info: Running /etc/ha.d/rc.d/status status
backup heartbeat: info: Running /etc/ha.d/rc.d/ifstat ifstat
backup heartbeat: info: Taking over resource group test
*** /etc/ha.d/resource.d/test called with status
backup heartbeat: info: Acquiring resource group:
primary.
com test
backup heartbeat: info: Running /etc/ha.d/resource.d/test start
*** /etc/ha.d/resource.d/test called with start
backup heartbeat: info: mach_down takeover complete.
在这个过程中,使用ping命令进行不间断监测,可以发现集群IP地址一直处于可通状态,并没有产生任何阻塞或延迟,所以,在关闭处于激活状态的heartbeat的情况下,双机系统可以实现无缝切换。
相关推荐
使用MySQL+keepalived是一种非常好的解决方案,在MySQL-HA环境中,MySQL互为主从关系,这样就保证了两台 MySQL数据的一致性,然后用keepalived实现虚拟IP,通过keepalived自带的服务监控功能来实现MySQL故障时自动切换
mysql 双主单活+keepalived 实现高可用指导文档,按步骤操作,接完成数据库高可用的自动切换部署
Keepalived+mysql双主来实现MySQL-HA,我们必须保证两台MySQL数据库的数据完全一样,基本思路是两台MySQL互为主从关系,通过Keepalived配置虚拟IP,实现当其中的一台MySQL数据库宕机后,应用能够自动切换到另外一台...
两台数据库的MYSQL互为主从从关系,通过keepalived配置的虚拟IP(VIP),实现其中一台MYSQL数据库宕机后,应用能自动切换到另外一台MYSQL数据库上,且宕机的数据库恢复后,能自动同步现有的数据,保证系统的高可用与...
关于MySQL-HA,目前有多种解决方案,比如...在MySQL-HA环境中,MySQL互为主从关系,这样就保证了两台MySQL数据的一致性,然后用keepalived实现虚拟IP,通过keepalived自带的服务监控功能来实现MySQL故障时自动切换。
利用keepalived构建高可用MySQL-HA,保证两台MySQL数据的一致性,然后用keepalived实现虚拟VIP,通过keepalived自带的服务监控功能来实现MySQL故障时自动切换。硬件拓扑如下:操作系统:CentOSrelease6.3(32位)...
本文详细描述了MySQL 5.6 主从复制功能的详细搭建步骤及相关参数说明,保证一次成功。文末附带主从切换方法。
MHA是一位日本MySQL大牛用Perl写的一套MySQL故障切换方案,来保证数据库系统的高可用.在宕机的时间内(通常10—30秒内),完成故障切换,部署MHA,可避免主从一致性问题,节约购买新服务器的费用,不影响服务器性能...
mysql 双机热备,通过linux HA软件heartbeat实现IP的自动漂移,即当一台服务器宕机后,浮动IP自动漂移到另外一台服务器。再结合mon监控应用服务资源当一台服务器的mysql挂掉,也会自动切换到备用服务器上。防止了单...
《mysql管理之道:性能调优、高可用与监控》由资深mysql专家撰写,以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、...
主要特点: $作为第三方应用对MySQL可用性检查; 专治OSHANG,MySQL无响应...$支持多实例HA;N+1扩展; $对MySQL免维护 $脑裂后不会产生资源争夺 $系统HANG支持从带外重启OS $切换速度快(2秒内完成) $对应用完全透明
由运行结果可以看出,使用 REPLACE('aaa.mysql.com','a','w') 将“aaa.mysql.com”字符串的“a”字符替换为“w”字符,结果为“www.mysql.com”。 UPDATE name SET path = REPLACE ( name, '...
需要至少2台centos7机器,最好6台配置,mysql双主读写分离并且故障自动切换,只需要安装好并且把配制文件放到指定目录下就可以了。
MoHA通过自动进行主节点故障转移和快速的主节点切换,为跨区域MySQL集群提供了高可用性(HA)。 高可用性主站故障检测和主站故障转移自动化可在几秒钟内实现主站切换。 预防脑裂通过配置适当的租约ttl,MoHA可以随时...
第26讲 配置mysql+lvs+keeplived实现mysql读操作的负载均衡 课程目标: 熟练掌握mysql+lvs+keeplived的部署方式 keeplived简介 通过配置lvs+keeplived实现mysql读操作的负载均衡 测试mysql+lvs+keeplived负载均衡...
支持 ACCESS, Excel, SQL 服务器, Oracle, MySQL, IBM DB2 * Visual BASIC 6 二进制文件 * Visual BASIC 6 方案 (VBP) 和窗体 (FRM) 支持 WYSIWYG 编辑器以及从代码中提取文本 * 通用文本文件解析器 支持许多不同的...
(资源不再更新,请移至码云获取最新版本)主要功能概述:...实现Windows服务器上高可用集群,可用于Web站点以及数据库,对代码和业务无感,主备自动切换,保证系统的高可用性,是Windows服务器上难得一见的优秀HA软件
本地(master)与远程主机(backup)的保证实时同步,如果本地系统出现故障...在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,切换时,远程主机只要使用它上面的那份备份数据
以达到数据库动态切换的目的。但是在实践过程中,发现mycat的框架体系把结构化数据库的事务性完全丢失,还包括MYSQL的存储过程无法有效满足。所以整个应用在Doubbo的传递传递变量存在一些参考价值。也许mycat 2.0或...