配置mysql服务的高可用

一、总括:
1.本配置共有两个测试节点node1.magedu.com 和node2.magedu.com,IP地址分别为172.16.24.2和172.16.24.3
2.单独在一台机器上创建mysql的共享存储,IP地址为172.16.24.1,为其建立一个逻辑卷,并自动挂载至一个目录,并使用共享存储nfs将此目录共享出去。
3.在正常工作的时候,node1节点处于运行状态,一旦node1节点宕机,node2节点能够马上顶替,实现高可用的集群。
二、配置前端准备工作:
1、首先确保node1节点和node2节点的主机名保持一致
(1)在node1节点上作如下操作:
#hostname node1.magedu.com
#vim /etc/sysconfig/network             --在配置文件中修改主机名
将hostname改为:node1.magedu.com
确保使用#hostname 和#uname -n 显示的主机名称一致.
所有节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n"命令的结果保持一致,要作如下操作:
#vim /etc/hosts
172.16.24.2 node1.magedu.com node1
172.16.24.2 node2.magedu.com ndoe2 
(2)在node2节点上作如下操作:
#hostname node2.magedu.com
#vim /etc/sysconfig/network             --在配置文件中修改主机名
将hostname改为:node2.magedu.com
确保使用#hostname 和#uname -n 显示的主机名称一致.
(3)设定两个节点可以基于密钥进行ssh通信,这可以通过类似如下的命令实现:
Node1:
# ssh-keygen -t rsa
# ssh-copy-id -i .ssh/id_rsa.pub root@node2
 
Node2:
# ssh-keygen -t rsa
# ssh-copy-id -i  .ssh/id_rsa.pub root@node1
(4).将node1节点中的/etc/hosts文件拷贝到node2上,随便验证ssh互信是否成功。
在node1上:
#scp /etc/hosts node2:/etc   --拷贝成功,则双机互信建立成功。
确保node1节点的系统时间和node2节点的系统时间保持一致,以免发生不必要的错误!
三、具体配置实现过程
基于nfs的共享存储,要保node1和node2节点的mysql的ID号是一样的。
1、在172.16.24.1主机上建立nfs共享存储:
先分区,为mysql专门建立一个逻辑卷,让其自动挂载至/mydata目录之下(此过程不再给出),然后创建mysql用户
#groupadd -r -g 306 mysql             --指定mysql这个系统用户的ID为306
#useradd -g mysql -u 306 -r -s /sbin/nologin mysql 
#chown -R mysql.mysql /mydata
将/mysql目录共享给172.16.24.2和172.16.24.3主机:
#vim /etc/exports
/mydata   172.16.0.0/16(rw,root_no_squash)
 
#service nfs start
#rpcinfo -p localhost      --查看nfs启动状况
#chkconfig nfs on          --让nfs开机自动启动
  
#showmount -e 172.16.24.1  --查看本机都共享了哪些文件系统
 
二、在node1.magedu.com上配置:
#groupadd -r -g 306 mysql
#useradd -g mysql -r -u 306 mysql
 
#mkdir /mydata
chown -R mysql.mysql /mydata
#showmount -e 172.16.24.1             --查看172.16.24.1主机上共享了哪些文件系统
#mount -t nfs 172.16.24.1:/mydata /mydata
#mount                                --查看是否挂载成功
#su - mysql 
#cd /mydata
#mkdir mydata
在node1.magedu.com服务器上安装mysql服务
 
首先下载mysql软件包到本地,然后解压安装:此处使用的mysql是mysql-5.5.20
#tar xf mysql-5.5.20-linux2.6-i686.tar.gz -C /usr/local
#cd /usr/local
#ln -sv  mysql-5.5.20-linux2.6-i686 mysql
#cd mysql
#chown -R mysql.mysql .
 
#scripts/mysql_install_db --user=mysql --datadir=/mydata/data
#cp support-files/my-large.conf  /etc/my.cnf
#vim /etc/my.cnf
修改文件中的thread_concurrency的值为你的CPU个数乘以2,如:
thread_concurrency = 2
并在thread_concurrency下面添加mysql的数据文件存放路径:
datadir=/mydata/data
 
#cp support-files/mysql.server /etc/rc.d/init.d/mysqld
#chown -R root . 
#chkconfig --add mysqld
#chkconfig --list mysqld
#chkconfig mysqld off
 
#vim /etc/profile                     -- 添加mysql的环境变量:     
 
PATH=$PATH:/usr/local/mysql/bin      --重新登录后才生效
也可以在命令行中定义:
#export PATH=$PATH:/usr/local/mysql/bin
#vim /etc/man.config                 --添加帮助文档,可以查看mysql的帮助文档
MANPATH /usr/local/mysql/man
 
#echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf     --输出mysql的库文件给系统库查找路径
 
#service mysqld start             
 
#cd /mydata/data                   --启动mysql,查看/mydata/data目录下是否有数据库的相关信息
 
#scp mysql-5.5.20-linux2.6-i686.tar.gz node2:/root  
#scp /etc/my.cnf node2:/etc
 
#service mysqld stop
 
三、在node2.magedu.com上配置
#groupadd -r -g 306 mysql
#useradd -g mysql -r -u 306 mysql
#mkdir /mydata
#mount -t nfs 172.16.24.1:/mydata /mydata/
 
#chown -R mysql.mysql /mydata
 
#tar xf  mysql-5.5.20-linux2.6-i686.tar.gz  -C /usr/local
#cd /usr/local
#ln -sv mysql-5.5.20-linux2.6-i686 mysql 
#cd mysql
#chown -R mysql.mysql .
注意:mysql已经在node1节点上安装过了,在node2节点上不必再安装!!!
#cp support-files/mysql.server /etc/rc.d/init.d/mysqld
#chown -R root . 
#chkconfig --add mysqld
#chkconfig --list mysqld
#chkconfig mysqld off
 
添加环境变量:
PATH=$PATH:/usr/local/mysql/bin      --重新登录后才生效
也可以在命令行中定义:
#export PATH=$PATH:/usr/local/mysql/bin
添加帮助文档:
#vim /etc/man.config
MANPATH /usr/local/mysql/man
输出mysql的库文件给系统库查找路径:
#echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
 
现在可以启动mysql进行测试了,但要确保mysql服务已经在node1上关闭了!
 
四、再回到node1上进行安装配置corosync服务
 
下载软件包至本地:
cluster-glue
cluster-glue-libs
heartbeat
openaislib
resource-agents
corosync
heartbeat-libs
pacemaker
corosynclib
libesmtp
pacemaker-libs
下载地址:http://clusterlabs.org/rpm/。请根据硬件平台及操作系统类型选择对应的软件包;这里建议每个软件包都使用目前最新的版本。
 
使用如下命令安装:确保事先已经配置好yum源。
# yum -y --nogpgcheck localinstall *.rpm
 
4、配置corosync,(以下命令在node1.magedu.com上执行)
 
#cd /etc/corosync
#cp corosync.conf.example corosync.conf
 
接着编辑corosync.conf,添加如下内容:
totem { 
         version: 2
         secauth:off                          --是否做安全认证的,如果要做安全认证可以修改为secauth:on 
         threads: 0                           --启用的线程数,一般和CPU数保持一致
         interface {
                   ringnumber: 0
                   bindnetaddr: 172.16.0.0    --网络地址,和网卡保持一致,这里也可以直接写成提供web服务的地址为172.16.24.100
                   mcastaddr: 226.94.24.1   
                   mcastport: 5405
          }
}
.
.
.
 
service {
ver:  0
name: pacemaker
use_mgmtd: yes
}
 
aisexec {
user:
root
group:  root
}
 
并设定此配置文件中 bindnetaddr后面的IP地址为你的网卡所在网络的网络地址,这里的两个节点在172.16.0.0网络,因此这里将其设定为172.16.0.0;如下
bindnetaddr: 172.16.0.0
 
生成节点间通信时用到的认证密钥文件:
# corosync-keygen
 
将corosync.conf和authkey复制至node2:
# scp -p corosync.conf  authkey  node2:/etc/corosync/
 
分别为两个节点创建corosync生成的日志所在的目录:
# mkdir /var/log/cluster
# ssh node2  'mkdir /var/log/cluster'
 
5、尝试启动,(以下命令在node1上执行):
 
# service corosync start
 
#ssh node2 'service corosync start'  --确保corosync在node1和node2上都能正行启动。如果能正常启动,会显示如下图所示信息:

配置资源:
#crm
crm(live)configure# property stonith-enabled=false         --关闭stonith
crm(live)configure# verify
crm(live)configure# property no-quorum-policy=ignore       --设置不够法定票数是的处理机制,此处设置为ignore忽略
crm(live)configure# rsc_defaults resource-stickiness=100   --设置资源黏性值
crm(live)configure# verify
crm(live)configure# commit
将MyIp定义为资源:
crm(live)configure# permitive MyIp ocf:heartbeat:IPaddr
crm(live)configure# commit
crm(live)configure#show   --查看定义的资源信息
#umount /mydata
 
在node2上,也卸载/mydata目录:
#umount /mydata
 
将nfs文件系统定义为高可用资源:
#crm configure
crm(live)configure# permitive mynfs ocf:heartbeat:Filesystem params device="172.16.24.1:/mydata" directory="/mydata" fstype="nfs" 
op start timeout=60 op stop timeout=60
crm(live)configure#commit
crm(live)configure#show
 
#crm status     --此时mynfs资源在node2节点上(也可能在node1节点上,视情况而定),在node2上查看信息,如下图所示:并且已经自动将172.16.24.1的/mydata目录挂载至了node2的/mydata目录之下!

如果将node2节点处于standby状态,那么定义的mynfs资源就会流入到node1节点上。而此时如果再让node2节点上线(online),所有资源依然会留在node1上,因为我们前面定义了资源黏性,node1和node2都是100.
 
配置mysqld服务资源:
#crm configure
crm(live)configure#primitive mysqld lsb:mysqld
crm(live)configure#colocation mysqld-with-mynfs inf: mysqld mynfs MyIp   --定义排列约束,让mysqld和mynfs、MyIp 资源要保持在一起,不能分离。
crm(live)configure#order mysqld-after-myip inf: MyIp mysqld              --定义顺序约束,mysqld要晚于MyIp启动
crm(live)configure#order mysqld-after-mynfs inf: mynfs mysqld:start      --定义顺序约束,mysqld要在mynfs启动之后再启动
crm(live)configure#verify
crm(live)configure#commit
crm(live)configure#show     --查看定义的资源和约束信息(也可以使用show xml 以html格式显示的资源信息),如下图所示:

#crm status            --此时我们查看节点的状态和资源的启动次序,如下图所示:

注:以上配置内容没有使用stonith设备,所以node1和node2仍然不能同时向数据库写入数据!