Mysql高可用集群

概述
node

Heartbeat 项目是Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统。心跳服务和集群通讯是高可用集群的两个关键组件,在 Heartbeat 项目里,由heartbeat 模块实现了这两个功能mysql

Heartbeat是Linux-HA工程的一个组件,自1999年开始到如今,发布了众多版本,是目前开源Linux-HA项目最成功的一个例子,Linux-HA的全称是High-Availability Linux;这个开源项目的目标是:经过社区开发者的共同努力,提供一个加强Linux可靠性(reliability)、可用性(availavility)和可服务性(serviceability) RAS的集群解决方案linux

工做原理sql

Heartbeat(Linux-HA)的工做原理:heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测能够经过网络链路和串口进行,并且支持冗余链路,它们之间相互发送报文来告诉对方本身当前的状态,若是在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务数据库

高可用集群vim

高可用集群是指一组经过硬件和软件链接起来的独立计算机,它们在用户面前表现为一个单一系统,在这样的一组计算机系统内部的一个或者多个节点中止工做,服务会从故障节点切换到正常工做的节点上运行,不会引发服务中断。从这个定义能够看出,集群必须检测节点和服务什么时候失效,什么时候恢复为可用。这个任务一般由一组被称为“心跳”的代码完成。在Linux-HA里这个功能由一个叫作heartbeat的程序完成
bash


系统规划:服务器

这里都是使用Centos 6.4_x86_64操做系统,nod1与nod2主机有两块网卡,eth0用于链接外部网络,eth1用于链接两台Mysql服务器节点,做为心跳线监控;nod3做为共享存储"NFS",只有一块网卡;网络

节点类型 IP地址 主机名 IP工做类型
主节点服务器 eth0:172.16.14.2 nod1.allen.com 外部通讯IP
eth1:192.168.14.2 心跳线链接IP
eth0:0 172.16.14.10 虚拟IP
备用节点服务器 eth0:172.16.14.4 nod2.allen.com
外部通讯IP
eth1:192.168.14.4 心跳线链接IP
NFS服务器 eth0:172.16.14.3 nod3.allen.com 外部通讯IP
网 关 172.16.0.1
也用于仲裁

拓扑图以下:
ssh

082929829.gif

如上所示:eth0:0 172.16.14.10为虚拟IP地址,提供外网访问;172.16.0.1为出口网关,同时为了不两个节点争抢资源,出口网关作为仲裁IP;当nod1对NFS服务器操做时,nod2只是监听状态不能对NFS服务器作操做;若是nod1挂了,这时nod2会自动启动本身的Mysql服务,同时对NFS服务器上面的数据有操做权限;若是nod1恢复正常工做,服务会自动切换回nod1上面


基本配置

一、配置IP地址;eth0网卡为桥接,eth1为VMnet3;并设置好IP地址

nod1
[root@localhost ~]# ifconfig eth0 |grep "inet addr:";ifconfig eth1 | grep "inet addr:"
          inet addr:172.16.14.2  Bcast:172.16.255.255  Mask:255.255.0.0
          inet addr:192.168.14.2  Bcast:192.168.14.255  Mask:255.255.255.0
nod2
[root@localhost ~]# ifconfig eth0 |grep "inet addr:";ifconfig eth1 | grep "inet addr:"
          inet addr:172.16.14.4  Bcast:172.16.255.255  Mask:255.255.0.0
          inet addr:192.168.14.4  Bcast:192.168.14.255  Mask:255.255.255.0
nod3
[root@localhost ~]# ifconfig eth0 | grep "inet addr:"
          inet addr:172.16.14.3  Bcast:172.16.255.255  Mask:255.255.0.0

二、修改主机名称

######在各个主机上配置主机名称,编辑配置文件永久有效,须重启系统
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME=nod1.allen.com
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME=nod2.allen.com
[root@localhost ~]# vim /etc/sysconfig/network
HOSTNAME=nod3.allen.com
######若是不想编辑配置文件可使用"hostname"命令设置主机名,但重启后失效如:hostname nod1.allen.com

三、配置各主机之间能相互解析到主机名,修改"/etc/hosts"文件,各主机的hosts文件相同,这里只作一次介绍如:

######添加以下记录在nod一、nod二、nod3节点上
[root@nod1 ~]# vim /etc/hosts
192.168.14.2    nod1.allen.com
192.168.14.4    nod2.allen.com
172.16.14.2     nod1.allen.com
172.16.14.4     nod2.allen.com
172.16.14.3     nod3.allen.com

四、配置时间同步,在每台服务器上作任务计划使用"ntpdate"命令指定时间服务器自动更新时间如:

[root@nod1 ~]# crontab -e
######每分钟同步一次,在nod1 nod2 nod3服务器上都作
*/1 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null

五、配置nod1与nod2双机信任如:

######在nod1服务器上生成密钥,一直按回车键生成密钥便可
[root@nod1 ~]# ssh-keygen -t rsa
######将生成的公钥上传到nod2服务器上
[root@nod1 ~]# ssh-copy-id -i .ssh/id_rsa.pub 172.16.14.4
=========================================================
######在nod2服务器上生成密钥
[root@nod2 ~]# ssh-keygen -t rsa
######将生成的公钥上传到nod1服务器上
[root@nod2 ~]# ssh-copy-id -i .ssh/id_rsa.pub 172.16.14.2
注释:作完信任后,测试是否还须要使用密码,这里不在演示

配置NFS存储服务器 NFS详细介绍点此处

一、配置好YUM并安装NFS软件

[root@nod3 ~]# yum -y install nfs-utils rpcbind
######查看已安装的NFS软件
[root@nod3 ~]# rpm -qa | grep nfs
nfs-utils-1.2.3-36.el6.x86_64
nfs-utils-lib-1.1.5-6.el6.x86_64
[root@nod3 ~]# rpm -q rpcbind
rpcbind-0.2.0-11.el6.x86_64

二、因为NFS用户验证是靠用户ID来作验证,建立用户用于nod1与nod2服务器挂载NFS文件系统使用

######建立的用户UID为300,在nod1与nod2服务器上面建立用户请保持UID相同
[root@nod3 ~]# useradd -r -u 300 mysql

三、建立NFS共享目录

[root@nod3 ~]# mkdir -p /mydata/data

四、修改主配置文件,共享NFS目录;并启动NFS服务

[root@nod3 ~]# vim /etc/exports
/mydata/data    172.16.14.2(rw,no_root_squash) 172.16.14.4(rw,no_root_squash)
[root@nod3 ~]# service nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Stopping RPC idmapd:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]

安装Mysql Mysql编译安装点此

一、在nod1上面安装Mysql服务,这里直接使用通用二进制包来安装

######解压缩Mysql
[root@nod1 ~]# tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/
[root@nod1 ~]# cd /usr/local/
######建立软连接
[root@nod1 local]# ln -s mysql-5.5.33-linux2.6-x86_64 mysql
[root@nod1 local]# cd mysql
######为Mysql提供Sysv服务脚本
[root@nod1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
######添加执行权限并加入到系统服务
[root@nod1 mysql]# chmod +x /etc/rc.d/init.d/mysqld
[root@nod1 mysql]# chkconfig --add mysqld
######提供Mysql主配置文件
[root@nod1 mysql]# cp support-files/my-large.cnf /etc/my.cnf
######修改主配置文件数据存放目录位置
[root@nod1 mysql]# vim /etc/my.cnf
datadir = /data
######添加Mysql的PATH环境变量
[root@nod1 mysql]# echo "PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
[root@nod1 mysql]# . /etc/profile
######添加Mysql的库文件
[root@nod1 mysql]# echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf
[root@nod1 mysql]# ldconfig
######添加Mysql头文件信息
[root@nod1 mysql]# ln -s /usr/local/mysql/include /usr/include/mysql
######建立数据存放目录,并挂载NFS文件系统
[root@nod1 mysql]# mkdir /data
[root@nod1 ~]# mount -t nfs 172.16.14.3:/mydata/data  /data
######建立Mysql用户与NFS服务器上面的用户UID相同,初始化数据库并启动
[root@nod1 mysql]# useradd -r -u 300 mysql
[root@nod1 ~]# cd /usr/local/mysql
[root@nod1 mysql]# ./scripts/mysql_install_db --user=mysql --datadir=/data/
[root@nod1 mysql]# service mysqld start
Starting MySQL....                                         [  OK  ]
######登陆Mysql,受权一个用户为方便后面测试
[root@nod1 mysql]# mysql
[root@nod1 mysql]# mysql> grant all on *.* to 'root'@'172.16.%.%' identified by 'mypass';
######禁止Mysqld开机自启动并中止服务,由于要使用heartbeat来管理Mysqld
[root@nod1 mysql]# chkconfig mysqld off
[root@nod1 mysql]# service mysqld stop

2、在nod2服务器上面安装Mysql

[root@nod2 ~]# tar xf mysql-5.5.33-linux2.6-x86_64.tar.gz -C /usr/local/
[root@nod2 ~]# cd /usr/local/
[root@nod2 local]# ln -s mysql-5.5.33-linux2.6-x86_64 mysql
[root@nod2 local]# cd mysql
[root@nod2 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@nod2 mysql]# chmod +x /etc/rc.d/init.d/mysqld
[root@nod2 mysql]# chkconfig --add mysqld
[root@nod2 mysql]# cp support-files/my-large.cnf /etc/my.cnf
[root@nod2 mysql]# mkdir /data
[root@nod2 mysql]# vim /etc/my.cnf
datadir = /data
[root@nod2 mysql]# echo "PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
[root@nod2 mysql]# . /etc/profile
[root@nod2 mysql]# echo "/usr/local/mysql/lib/" >> /etc/ld.so.conf
[root@nod2 mysql]# ldconfig
[root@nod2 mysql]# ln -s /usr/local/mysql/include /usr/include/mysql
[root@nod2 ~]# cd /usr/local/mysql
[root@nod2 mysql]# useradd -r -u 300 mysql
 ######在启动前须要把nod1上面的Mysql服务中止,不然不能启动,这里不须要初始化数据库
[root@nod2 mysql]# service mysqld start
Starting MySQL...                                          [  OK  ]
[root@nod2 mysql]# chkconfig mysqld off
[root@nod2 mysql]# service mysqld stop
Shutting down MySQL.                                       [  OK  ]

安装Heartbeat

一、在nod1与nod2服务器上安装Heartbeat

######在nod1服务器上安装Heartbeat依赖环境
[root@nod1 ~]# yum -y install PyXML libnet ipvsadm net-snmp-libs
######这里使用rpm包安装
[root@nod1 ~]# rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm heartbeat-gui-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm
######在nod2服务器上安装Heartbeat依赖环境
[root@nod2 ~]# yum -y install PyXML libnet ipvsadm net-snmp-libs
[root@nod2 ~]# rpm -ivh heartbeat-2.1.4-12.el6.x86_64.rpm heartbeat-stonith-2.1.4-12.el6.x86_64.rpm heartbeat-gui-2.1.4-12.el6.x86_64.rpm heartbeat-pils-2.1.4-12.el6.x86_64.rpm

二、在nod1服务器上面配置Heartbeat认证文件、主配置文件与资源文件并拷贝到nod2服务器

######切换目录为Heartbeat提供配置文件
[root@nod1 ~]# cd /usr/share/doc/heartbeat-2.1.4/
[root@nod1 heartbeat-2.1.4]# cp ha.cf authkeys haresources /etc/ha.d/
######切换到Heartbeat配置文件目录
[root@nod1 heartbeat-2.1.4]# cd /etc/ha.d/
######生成一个随机数
[root@nod1 ha.d]# openssl rand -hex 4
dca1f0ac
######修改认证文件
[root@nod1 ha.d]# vim authkeys
auth 3            #启用的哪个认证,就把下面所对应的认证开启
#1 crc
#2 sha1 HI!
3 md5 dca1f0ac
====================================================================
######修改主配置文件
[root@nod1 ha.d]# vim ha.cf
logfile /var/log/ha-log        #日志文件开启
#logfacility    local0         #与上面日志文件开启任意一个便可
keepalive 2                    #发送通知频率
mcast eth0 225.14.2.1 694 1 0  #组播
auto_failback on               #开启此项为若是主节点从故障恢复到正常状态是否把服务自动切换到主节点
node    nod1.allen.com         #节点主机名称,把全部节点都须要加入
node    nod2.allen.com
ping 172.16.0.1                #仲裁IP地址
compression     bz2            #启用压缩
compression_threshold 2        #大于多少KB启用压缩,默认2KB
====================================================================
######修改资源文件
[root@nod1 ha.d]# vim haresources
######设置资源类型
nod1.allen.com  IPaddr::172.16.14.10/16/eth0 Filesystem::172.16.14.3:/mydata/data::/data::nfs mysqld
注释:
nod1.allen.com:为主节点主机名称
IPaddr:虚拟IP地址
Filesystem: 要挂载的文件系统资源:挂载点:文件系统类型
mysqld:服务类型,为哪一个服务作高可用
====================================================================
######拷贝Mysqld的服务脚本到Heartbeat资源目录
[root@nod1 ha.d]# cp /etc/rc.d/init.d/mysqld resource.d/
######将配置文件拷贝到nod2一份
[root@nod1 ha.d]# scp -p authkeys ha.cf haresources 172.16.14.4:/etc/ha.d

三、在nod1服务器上面启动Heartbeat服务并查看Heartbeat与Mysqld是否启动

[root@nod1 ~]# service heartbeat start
[root@nod1 ~]# netstat -naput|grep 3306
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      36711/mysqld
[root@nod1 ~]# netstat -naput|grep 694
udp        0      0 225.14.2.1:694              0.0.0.0:*                               35926/heartbeat: wr

四、启动nod2服务器上面的Heartbeat服务并查看Heartbeat启动

[root@nod1 ~]# ssh nod2.allen.com 'service heartbeat start'
[root@nod1 ~]# ssh nod2.allen.com 'netstat -naput|grep 694'
udp        0      0 225.14.2.1:694              0.0.0.0:*                               39592/heartbeat: wr
注释:在nod2服务器Mysqld不会启动,若是把nod1服务器的Heartbeat服务中止,这里会自动运行Mysqld服务

五、在nod1服务器上建立数据库并查看,而后中止Heartbeat服务

[root@nod1 ~]# mysql -e 'create database allen;'
[root@nod1 ~]# mysql -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| allen              |
| log                |
| mysql              |
| performance_schema |
| test               |
+--------------------+
[root@nod1 ~]# service heartbeat stop

六、查看nod2服务器上面的Mysqld服务是否启动,而后链接到数据库查看数据库

[root@nod1 ~]# ssh nod2.allen.com 'netstat -naput|grep 3306'
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      40473/mysqld
[root@nod1 ~]# mysql -h 172.16.14.4 -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| allen              |
| log                |
| mysql              |
| performance_schema |
| test               |
+--------------------+

七、假设把nod1服务器已经修复,启动Heartbeat服务,查看Mysqld是否能自动切换到nod1服务器

[root@nod1 ~]# mysql -h 172.16.14.4 -e 'create database allen_yang;'
[root@nod1 ~]# service heartbeat start
######查看数据库,能查看到说明已经启动
[root@nod1 ~]# mysql -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| allen              |
| allen_yang         |
| log                |
| mysql              |
| performance_schema |
| test               |
+--------------------+

八、测试使用客户端工具使用虚拟IP“172.16.14.10”链接Mysqld服务

093144944.gif


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


使用CRM图形化界面来管理集群资源

一、在nod1服务器上面修改Heartbeat主配置文件并拷贝到nod2服务器,使用两台服务器配置保持一致

######切换到Heartbeat配置文件目录
[root@nod1 ~]# cd /etc/ha.d/
######修改主配置文件
[root@nod1 ha.d]# vim ha.cf
######添加以下内容;下面两个任选其一配置便可
crm respawn | crm on
######在启动CRM图形管理界面时会须要此用户的密码,因此先为此用户添加密码
[root@nod1 ha.d]# echo hacluster | passwd --stdin hacluster

二、启动图形化配置界面并链接到服务器

[root@nod1 ha.d]# hb_gui &

095014340.gif

三、建立资源组用于统一管理

095102906.gif

四、设置组名及组的属性

095105846.gif

五、添加虚拟IP资源

095400568.gif

五、添加虚拟IP的其余属性

095403516.gif

六、肯定添加虚拟IP资源

095406404.gif

七、添加文件系统资源并选择添加的资源类型

100256549.gif

八、肯定添加文件系统资源

100259456.gif

九、添加数据库资源

100520776.gif

100523707.gif

十、启动资源以下

100708751.gif

十一、已经成功在nod2服务器上运行

100711783.gif

十二、使用客户端工具测试链接虚拟IP

100856348.gif

1三、已以成功链接到数据库

100858289.gif

1四、暂停nod2服务器上的资源,测试是否会切换到nod1服务器

101120264.gif

1五、资源已经成功切换到nod1服务器

101124366.gif

1六、再次使用客户端工具测试使用虚拟IP链接Mysqld

101348525.gif

1七、已经成功链接到Mysqld

101352740.gif

到此Mysql高可用集群就此结束;后面将会介绍其余开源集群软件的安装配置及使用;敬请期待...