码迷,mamicode.com
首页 > 数据库 > 详细

High availability MySql

时间:2015-06-02 06:55:57      阅读:399      评论:0      收藏:0      [点我收藏+]

标签:ha   corosync   pacemaker   mysql   heartbeat   

一、High availability Cluster

    高可用集群是保证服务稳定运行,给用户一种服务从未中断过的感觉,从而达到服务的高可用性。例如我们的网站后台做了高可用性集群,当我们的一台web服务器宕机后,另一台web服务器立马接管它的服务,替代它的位置,实现用户访问网站时感觉网站从未中断过服务一般。

    最近一段时间有几个门户网站都出现了系统崩溃,服务中断的事情,例如某易,某宝,某程;造成用户一时无法登陆其网站访问,损失无法估计,所以对于一个需要24小时不间断提供服务的网站来讲,高可用性集群是多么的重要。

技术分享


    实现高可用性的项目:

    目前常用的有四个项目支持服务的高可用,分别是:

    heartbeat ---------->linuxHA开源项目,以发展出三个版本;

    corosync  ---------->OpenAIS项目衍生出的一个项目,未来的HA方向;

    cman      ---------->redhat维护的HA开源项目;

    keepalived --------->工作方式完全不同于以上三种,较轻量级;



二、corosync

    corosync是从openais(开放性应用接口标准)中衍生出的一个分项目。第一版本的corosync只能提供节点间心跳的功能,无法提供管理资源的能力,需要借助与cman或者heartbeat提供的资源管理能力。第二版的corosync功能已经完善,不需要借助于第三方软件就可以实现高可用集群中的全部管理功能。

    各个HA项目之间有不一样的功能,具体的方案选择要根据环境的实际需要来选择。

    常用的解决方案组合:

    heartbeat v1 v2 + haresource     //一般常用于CentOS 5.X

    heartbeat v3 + pacemaker         //一般常用于CentOS 6.X

    corosync + pacemaker             //最常用的组合

    cman + rgmanager                 //红帽集群套件中的组件,还包括gfs2,clvm

    keepalive + lvs                  //常用于lvs



三、HA cluster中使用到的名词解释:

    1.HA------>High availability Cluster高可用性集群;

    2.resource----->资源,集群中的每个元素都可以是资源,例如一台web服务器,一个IP,一个httpd进程等;

    3.node----->节点,集群中的服务器;

    4.DC------>主节点,是唯一的,对资源的修改,只能修改DC上的cib来实现,其他节点上的cib是不能同步的;

    5.heartbeat------>心跳,各节点通过udp协议进行组播,其他节点能够接受到此组播说明节点正常工作,一旦超过设定时间没有接受到某节点发出的组播信号,就判断此节点故障;

    6.Split brain------->脑裂,又叫集群分裂,由不确定的原因导致集群中一些节点无法联系上另外的节点,导致集群分裂为两个伪集群的情况;

    7.CCM----->Cluster Consensus Menbership Service集群共享视图,在全局级别构建节点关系视图,判断集群发生分裂后哪些节点可以成为活动节点,哪些节点将被判断为离线节点,并把这些消息传递给集群资源管理层;

    8.cib----->XML格式的全局配置文件,工作的时候常驻内存,只有DC才能对CIB进行修改,其他节点上的复制DC上的CIB而来。集群的所有信息都会反馈在CIB中,要修改Cib要使用gui或命令行模式工具;

    9.PE----->policy engine根据各节点的状况生成决策,发送给TE执行;

    10.TE----->transition engine将决策传送给本地资源管理层LRM;

    11.LRM----->调用资源代理,将资源需要执行的动作交给代理执行;

    12.RA----->资源代理;

    13.CRM----->集群资源管理层,拥有管理集群给各种资源的能力,提供了LRM,PE,TE,CIB等功能;

    14.STONITH----->Shoot The Other Node in the Head,"爆头",这种机制直接操作电源开关,控制故障节点的电源开关,通过暂时断电又上电的方式,使故障节点重启,这种方式需要硬件支持。

主节点在某一端时间由于某种原因,没时间传递心跳信息,这个时候集群会选取新的DC,从新分配资源提供服务,如果主节点服务器还没有宕掉,这样就会导致服务器分隔、资源争用,这种情况被称为脑裂(brain-split)。此时,用户能访问,一旦有写的操作,就会导致文件系统崩溃,损失惨重。为避免这种情况,新的DC一旦产生,第一时间对主节点执行stonith,这种操作叫做资源隔离。

    15.Resource isolation----->资源隔离

     节点级别:这种就叫STONITH,直接把对方的电源给切断,一般这种主机都是连接到电源交换机上的。

     资源级别:同样需要依赖一些硬件设备来完成。比如节点通过光纤交换机连接到共享存储,通过把需要踢除出去的节点的光纤接口屏蔽来实现资源隔离。 

16.Arbitration device----->仲裁设备

     ping node:两个节点的模式下,一旦其中一个节点发生故障,发生集群分隔以后,无法判定哪个节点不正常,但工作正常的节点一定是可以连到互联网,故正常的节点是可以跟前端路由通信,所以可以把前端路由当成第三个节点,如果可以ping通,那就说明自己是正常的,可以将对方隔离掉。

     qdisk: RHCS不是使用ping节点来判断,而是使用一个共享存储的设备,节点按照心跳信息频率每隔一个信息频率时间就往磁盘里写一个数据位,如果设备每隔一个心跳时间间隔就更新一次数据位,就说明这个设备处于活动状态的,可以将对方隔离掉。

    


四、HA的工作机制:

    高可用集群的工作原理是,在底层组成集群的各个节点服务器上配置心跳传递机制,将各节点的活动状态通过心跳机制传递出去,让其他节点知道,一旦其中有一个节点发生故障或损坏导致服务不可用,心跳也将停止,其他节点收不到故障节点的心跳信息就判断此节点故障,从而由上层的管理机制通过决策来指定一个节点加载故障节点上运行的服务,从而替代故障节点来工作。

    1.HA工作模型中的四个层次

        messaging and infrastructure layer

               心跳传输层,主要用于节点之间传递心跳信息。节点之间传递心跳信息可以通过广播,组播,单播等方式。

               心跳信息:集群中每一台服务器都不停的将自己在线的信息通告给集群中的其他主机。

               心跳信息的传递是基于套接字通信的,通过软件提供服务监听套接字,实现数据发送、请求。必须安装软件,并开启服务,这是实现高可用集群的基础。

        membershio layer

               CCM 用来统计集群中所有节点的状态的全局视图,并把各种状态通知CRM;

               这层最重要的作用是通过Cluster Consensus Menbership Service(CCM)这种服务由Messaging层提供的信息,来产生一个完整的成员关系。

               CCM 组件(Cluster Consensus Menbership Service):作用,承上启下,监听底层接受的心跳信息,当监听不到心跳信息的时候就重新计算整个集群的票数和收敛状态信息,并将结果转递给上层,让上层做出决定采取怎样的措施。CCM 还能够生成一个各节点状态的拓扑结构概览图,以本节点做为视角,保证该节点在特殊情况下能够采取对应的动作。

        resource allocation layer

               资源管理器层,真正实现集群服务的层。包含CRM(集群资源管理器,cluster Resource Manager),CIB(集群信息基库,Cluster Infonation Base),PE(策略引擎,PolicyEngine),TE(实施引擎,Transition Engine), LRM(Local Resource Manager,本地资源管理器)。

               CRM组件:核心组件,实现资源的分配和管理。每个节点上的CRM都维护一个CIB用来定义资源特定的属性,哪些资源定义在同一个节点上。主节点上的CRM被选举为DC(Designated Coordinator指定协调员,主节点挂掉会选出新的DC),成为管理者,它的工作是决策和管理集群中的所有资源。

    resource layer

              任何资源代理都要使用同一种风格,接收四个参数:{start|stop|restart|status},每个种资源的代理都要完成这四个参数据的输出。

              工作机制:PE根据CIB获取资源的配置信息(集群上的所有信息都会收集到DC的CIB,同步到其它节点),而后做出决策,一旦做得决策就会进行资源的管理。PE借助于本地的CCM通知给其它节点CIB来实现对某些资源管理信息的传递,比如说通告其它CRM要启动某一资源了,收到信息后CRM并不负责启动,转由LRM(Local Resource Manager本地资源管理)启动,而并发资源又借助于RA(Resource Agent资源代理)实现资源管理。


    2.HA工作模型图

技术分享


六、示例

    corosync+pacemaker 基于NFS实现高可用的 mysql

    1.网络拓扑图

技术分享


    2.规划

    (1)三台主机分别为node1;node2;node3

           时间同步

           基于主机名访问

           基于密钥认证

    (2)安装corosync+pacemaker+crmsh+pssh

    (3)修改配置文件

    (4)开启服务

    (5)检测服务可用性

    (6)配置NFS主机,提供共享目录

    (7)各节点挂载nfs目录

    (8)各节点安装mysql

    (9)测试mysql可用性

    (10)在任意一个节点上运行rcm,进行高可用规则配置

    (11)测试mysql的高可用实现



七、实施

    前期准备

  技术分享    


    1.配置node1和node2的时间同步、基于主机名访问、ssh互联

node1:  
hwclock -s
ntpdate -u 172.16.0.1
crontab -e
*/3 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null  
ssh-keygen -t rsa -f /root/.ssh/id_rsa -P ‘‘
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.13.14
vim /etc/hosts  
172.16.13.13 node1  
172.16.13.14 node2 
vim /etc/sysconfig/network
HOSTNAME=node1.wuhf.com 
node2:  
hwclock -s
ntpdate -u 172.16.0.1
crontab -e
*/3 * * * * /usr/sbin/ntpdate 172.16.0.1 &> /dev/null  
ssh-keygen -t rsa -f /root/.ssh/id_rsa -P ‘‘
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.13.13
vim /etc/hosts  
172.16.13.13 node1  
172.16.13.14 node2 
vim /etc/sysconfig/network
HOSTNAME=node2.wuhf.com

    2.配置nfs服务器

fdisk /dev/sda       //创建一个大小为10G 类型为8e的分区 本文为/dev/sda5  
partx -a /dev/sda  
pvcreate /dev/sda5  
vgcreate myvg /dev/sda5  
lvcreate -L 10G -n mydata myvg  
mke2fs -t ext4 -L MYDATA /dev/myvg/mydata   
mkdir /mydata  
vim /etc/fstab    
LABEL=MYDATA            /mydata                 ext4    defaults        0 0  
mount -a  
  
groupadd -g 309 -r mysql       //添加mysql用户 
useradd -r -g 309 -u 309 -s /sbin/nologin mysql  
chown -R mysql:mysql /mydata/      //让mysql用户对/mydata目录有读写的权限
vim /etc/exports                   //通过nfs共享/mydata目录
/mydata         172.16.13.13(rw,no_root_squash) 172.16.13.14(rw,no_root_squash)   
service nfs start  
showmount -e localhost  
Export list for localhost:/mydata 172.16.220.12,172.16.220.11

     3.在node1和node2上验证nfs共享目录的读写权限

node1 node2:  
groupadd -r -g 309 mysql  
useradd -g 309 -u 309 -r mysql  
mkdir /mydata  
mount -t nfs 172.16.13.15:/mydata /mydata/  
ls /mydata/  
lost+found    
su - mysql            //验证mysql用户是否对/mydata目录有写权限
su: warning: cannot change directory to /home/mysql: No such file or directory  
-bash-3.2$ cd /mydata  
-bash-3.2$ mkdir data           //创建这个目录,作为mysql的数据目录
-bash-3.2$ ls  
data  lost+found

    4.安装maysql

node1 :  
mariadb-5.5.43-linux-x86_64.tar.gz    //安装此mysql
tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local/  
cd /usr/local/  
ln -sv mariadb-5.5.43-linux-x86_64 mysql  
cd mysql         
chown -R mysql:mysql .      //初始化mysql
scripts/mysql_install_db --user=mysql --datadir=/mydata/data/  
cp /usr/local/mysql/support-files/my-large.cnf /etc/my.cnf    //提供配置文件
vim /etc/my.cnf                  //在[mysql]下添加如下三行内容
datadir = /mydata/data
innodb_file_per_table = on
skip_name_resolve = on
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld    //提供脚本
chkconfig --add mysqld  
service mysqld start  
Starting MySQL........                                     [  OK  ] 
vim /etc/profile.d/mysql.sh                        //补全路径
export PATH=/usr/local/mysql/bin:$PATH 
. /etc/profile.d/mysql.sh
mysql            //连上mysql  
\q                 //退出mysql  
service mysqld stop          //停止服务 
chkconfig mysqld off  
chkconfig --list mysqld      //保证都是off  
umount  /mydata              //取消挂载
node2: 
tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local/  
cd /usr/local/  
ln -sv mariadb-5.5.43-linux-x86_64 mysql
cd mysql  
chown -R root:mysql   
scp /etc/my.cnf  node2:/etc/       //将node1上mysql配置文件复制一份给node2,此步骤要在node1上进行  
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld  
chkconfig --add mysqld  
service mysqld start  
Starting MySQL........                                     [  OK  ]  
vim /etc/profile.d/mysql.sh                       
export PATH=/usr/local/mysql/bin:$PATH 
. /etc/profile.d/mysql.sh
mysql              
\q                   
service mysqld stop           
chkconfig mysqld off  
chkconfig --list mysqld       
umount  /mydata

    5.安装corosync+pacemaker

corosync-1.4.7-1.el6.x86_64.rpm      //需要提前准备的安装包                            
corosynclib-3.0.12-68.el6.x86_64.rpm    
pacemaker-1.1.12-4.el6.x86_64.rpm  
pacemaker-libs-1.1.12-4.el6.x86_64.rpm 
corosynclib-1.4.7-1.el6.x86_64.rpm
libibverbs-1.1.8-3.el6.x86_64.rpm        
libqb-0.16.0-2.el6.x86_64.rpm
librdmacm-1.0.18.1-1.el6.x86_64.rpm 
lm_sensors-libs-3.1.1-17.el6.x86_64.rpm 
net-snmp-libs-1:5.5-49.el6_5.3.x86_64.rpm 
pacemaker-cli-1.1.12-4.el6.x86_64.rpm 
pacemaker-cluster-libs-1.1.12-4.el6.x86_64.rpm 
perl-TimeDate-1:1.16-13.el6.noarch.rpm
resource-agents-3.9.5-12.el6.x86_64.rpm
yum install corosync pacemaker -y          //因为centos6.6上有,所以我直接使用yum安装,node1和node2都要安装
cd /etc/corosync 
cp corosync.conf.example corosync.conf
vim corosync.conf                         //编辑corosync配置文件
compatibility withetank                  //兼容性选项
toten {
    secauth:on                          //安全认证功能开启
    threads:0                           //多线程
    interface{ 
             ringnumber:0               //心跳回传功能,一般不需要
             bindnetaddr:172.16.0.0     //给网络地址
             mcastaddr:239.165.17.13    //多播地址
             mcastport: 5405            //监听端口,开启服务后查看此项有没有被corosync监听
             ttl:1
             }
}
loggging {
         fileline:off                              
         to_stderr:no                              //日志发往标准错误输出,建议关闭
         to_logfile:yes
         logfile:/var/log/cluster/corosync.log
         to_syslog:no                           
         debug:off
         timestamp:on                //日志记录时间戳,建议关闭,影响性能,占用资源
         logger_subsys {
                    subsys:AME
                    debug:off
              }
}
service {                              //将pacemaker用作corosync的插件来运行,在配置文件中添加下面两项;
  ver:  0
  name: pacemaker
  # use_mgmtd: yes
}
aisexec {
  user: root
  group:  root
}

corosync-keygen        //会自动的在/etc/corosync目录下生成一个key文件,是二进制格式的,权限为400    
scp -p authkey corosync.conf node2:/etc/corosync/    //将corosync和authkey复制至node2:   
service corosync start ssh node2 ‘service sorosync start‘   //同时在两节点启动corosync服务

     6.安装corosync的命令行接口crmsh

crmsh-2.1-1.6.x86_64.rpm               //准备两个安装包
pssh-2.3.1-2.e16.x86_64.rpm
yum --nogpgcheck install   crmsh-2.1-1.6.x86_64.rpm  pssh-2.3.1-2.e16.x86_64.rpm
crm                            //使用crm工具进入命令行配置界面
>help
>status
>bye
crm status                  //查看节点状态

    7.在node1上运行crmsh,配置高可用集群规则

crm
crm configure property stonith-enabled=false                       //禁用stonith
crm configure property no-quorum-policy=ignore                     //修改忽略quorum不能满足的集群状态检查
crm configure rsc_defaults resource-stickiness=100                 //为资源指定默认黏性值
crm configure primitive myip ocf:heartbeat:IPaddr params ip=172.16.13.209     //配置VIP
crm(live)configure# primitive mynfs ocf:heartbeat:Filesystem params device="172.16.13.15:/mydata" directory="/mydata" fstype="nfs" op monitor interval=20s timeout=40s op start timeout=60s op stop timeout=60s                                                //配置自动挂载nfs目录
crm(live)configure# primitive websql lsb:mysqld op monitor interval=10s timeout=15s       //配置mysqld启动
crm(live)configure# group sqlservice myip mynfs websql                 //定义组约束,使资源在一起
crm(live)configure# order webip_before_webstore Mandatory: myip mynfs websql   //定义资源先后启动顺序
crm(live)configure# location myip_on_node1 sqlservice rule 100: #uname eq node1.wuhf.com    //定义位置约束,资源更依赖于在哪一个节点上运行
crm(live)configure# verify     //检测
crm(live)configure# commit     //提交,提交后配置信息自动同步到集群个节点上
crm(live)configure# edit       //编辑配置文件,可以在这里面删除或更改不需要的配置信息,操作同vim
crm(live)resource# status      //查看资源状态
crm(live)resource# stop group       //停止资源运行
crm(live)node# standby            //将默认节点下线,查看资源有没有转移到另外一个节点
crm(live)node# online             //将默认节点上线,查看资源有没有返回当前节点上

     8.测试mysql的高可用

crm status            //可以看到node1目前是下线状态,资源全都运行在node2上

技术分享

crm onde online        //现在node1上线了,因为资源被定义为更依赖于node1,所以资源全部回到了node1上运行

技术分享

mysql> grant all on *.* to wuhf@‘172.16.%.%‘ identified by 1234‘;           //在node1上为mysql创建一个远程连接用户
mysql> flush privileges;
mysql -uwuhf -h172.16.13.209 -p1234                 //在nfs上安装mysql,并测试连接远程 mysq:l172.16.13.209 成功!

技术分享



    总结:

    由于NFS提供的文件系统,容易在生产环境中成为单点故障,所以生产实现mysql的高可用方案千万别选择NFS,我现在是测试环境,所以无所谓。

    corosync是未来高可用解决方案中的主导项目,功能强大稳定,所以要掌握其命令和运行方式,主要在对于感念的理解上。

    如果要做LAMP的高可用的话,就是多配一些规则,搞清楚规则的启动先后顺序罢了,道理都是一样的。

本文出自 “铜锣湾” 博客,请务必保留此出处http://wuhf2015.blog.51cto.com/8213008/1657338

High availability MySql

标签:ha   corosync   pacemaker   mysql   heartbeat   

原文地址:http://wuhf2015.blog.51cto.com/8213008/1657338

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!