lixiaolong 发表于 2018-10-1 12:38:34

High availability MySql

  一、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
  
datalost+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                  //在下添加如下三行内容
  
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........                                    
  
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.cnfnode2:/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........                                    
  
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.rpmpssh-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的高可用的话,就是多配一些规则,搞清楚规则的启动先后顺序罢了,道理都是一样的。


页: [1]
查看完整版本: High availability MySql