设为首页 收藏本站
查看: 739|回复: 0

[经验分享] MySQL+Heartbeat+DRBD架构部署

[复制链接]

尚未签到

发表于 2019-1-7 08:08:09 | 显示全部楼层 |阅读模式
  

  

  MySQL高可用生成业务需求
  在企业实际生产场景中,一主多从的MYSQL数据库架构是最常用的DB架构方案,该架构方案部署简单,维护方便,并且通过配置简单的代理或者通过程序的方式就可以实现应用服务队主从库的读写分离,且多个从库还可以通过LVS或者Haproxy等代理实现多个从库的负载均衡,分担读的压力,同时排除单点问题
  但是MYSQL数据库架构中,我们不难发现,虽然从库是多个,但是主库仅有一个,也就是说主库一旦宕机,所以写的业务都会终止,而从库宕机1个就没什么影响,那么如何解决这个主库单点的问题呢,其实最简单的方案就是做好监控,然后主库单机后,有管理人为手工选择最快的从库改为主,然后让其它从库和新的主同步,这个方案是简单易行的,但是需要人工处理,对有些高要求场合高度不够,那样就需要下面说的MySQL+Heartbeat+DRBD架构方案
  

  

  

  MySQL+Heartbeat+DRBD架构方案说明:
  正常情况下:
  1、heartbeat通过串口线或者以太网网线直链网卡对对端的服务做监控检查,并负责执行drbd,mysql,vip等资源的自动切换
  2、MYSQL_S作为MYSQL_M的高可用热备,正常情况下MYSQL_M提供一个分区sdb1给MYSQL使用。
  3、物理磁盘做RAID10或者RAID0,根据性能和冗余需求来选择
  4、服务器之间,服务器和交换机直接都是千兆网卡做bongding
  5、应用服务(包括但不限于web)通过VIP访问MYSQL从库,通过不同的VIP访问负载均衡的从库池。
  

  

  故障情况下:
  1、MYSQL_S的heartbeat通过串口线或者以太网网线对MYSQL_M做健康检查,发现MYSQL_M挂掉后,自动在MYSQL_S上启动DRBD/MYSQL等服务及负载VIP的动态切换,确保主库业务被正常接管,自动通过对外提供服务
  2、MYSQL_M上的MYSQL在/dev/sdb1分区中,故障后在MYSQL_S上同时实现高可用切换
  3、故障后MYSQL客户端,从库等。通过VIP和MYSQL_S的MYSQL 服务相连,MYSQL对外正常提供服务
  4、当MYSQL_M故障修复后,可以设置自动把自己原来的业务,从MYSQL_S中取回来,但是一般不建议这样做。如果两台服务器之前存在性能的差异,最好也是人工进行切换
  

  2、MYSQL高可以生产需求描述
  本案例假设有3台MYSQL服务器,他们的IP分别是
MYSQL_M 10.0.0.3
MYSQL_S 10.0.0.4
MYSQL_C 10.0.0.5  MYSQL_M的MYSQL目录为/data,前端提供的访问VIP是10.0.0.103
  配置目标:一段主MYSQL服务器MYSQL_M宕机,该服务器上的MYSQL和虚拟IP会自动切换当热备服务器MYSQL_S上继续提供服务,从而达到MYSQL高可用宕机后无业务影响的目的
  这里会有一个特别的问题,就是以前的多个从库如何能和新的主库同步,经过实践,通过DRBD的方式同步的MYSQL数据库,以及做从库MYSQL时使用和主库VIP为同步VIP,当主MYSQL宕机后,VIP漂移到热备主MYSQL,默认情况在60秒内,从库就可以连接到新的VIP,从而自动和新的主库同步,这里需要强调的下,通过MYSQL同步做双主的方式,是难以做到主库单机从库和新的主库自动同步的。这也是这个架构的难点。
  提示:本文讲解的MYSQL数据库服务主备高可用模式,对于MYSQL数据库服务高可用,也可以是主主的双向高可用模式。
  

  

  3、系统环境
##MYSQL_M                 #主库,主服务器
eth0:10.0.0.3            #管理IP,用于LAN内数据转发
eth1:172.16.1.3           #MYSQL服务器间心跳连接(直链)
VIP:10.0.0.103            #用于提供对外MYSQL存储系统服务VIP
##MYSQL_S                 #主库的备用服务器
eth0:10.0.0.4            
eth1:172.16.1.4
##MYSQL_C                #mysql从库
eth0:10.0.0.5

  同时在MYSQL_M需要添加一个1G的磁盘,MYSQL_S需要添加一个1.5G的磁盘。测试用
  

  

  4、部署前准备
  

  #要配置主机名和hosts文件.
  主机名称要以uname -n为准
[root@MYSQL_S ~]# uname -n
MYSQL_S
[root@MYSQL_S ~]# uname -m
x86_64
[root@MYSQL_S ~]#
================================
MYSQL_M
cp /etc/hosts /etc/hosts.bak
cp /etc/sysconfig/network /etc/sysconfig/network.bak
sed -i '$a 10.0.0.3 MYSQL_M' /etc/hosts
sed -i '$a 10.0.0.4 MYSQL_S' /etc/hosts
sed -i '/HOSTNAME=/d' /etc/sysconfig/network
sed -i '/$/aHOSTNAME=MYSQL_M' /etc/sysconfig/network
===============================
MYSQL_S
sed -i '$a 10.0.0.3 MYSQL_M' /etc/hosts
sed -i '$a 10.0.0.4 MYSQL_S' /etc/hosts
sed -i '/HOSTNAME=/d' /etc/sysconfig/network
sed -i '/$/aHOSTNAME=MYSQL_S' /etc/sysconfig/network
############################start测试:
[root@MYSQL_S ~]# ping MYSQL_M
PING MYSQL_M (10.0.0.3) 56(84) bytes of data.
64 bytes from MYSQL_M (10.0.0.3): icmp_seq=1 ttl=64 time=0.347 ms
64 bytes from MYSQL_M (10.0.0.3): icmp_seq=2 ttl=64 time=0.297 ms
^C
--- MYSQL_M ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1424ms
rtt min/avg/max/mdev = 0.297/0.322/0.347/0.025 ms
[root@MYSQL_S ~]# ping MYSQL_S
PING MYSQL_S (10.0.0.4) 56(84) bytes of data.
64 bytes from MYSQL_S (10.0.0.4): icmp_seq=1 ttl=64 time=0.027 ms
64 bytes from MYSQL_S (10.0.0.4): icmp_seq=2 ttl=64 time=0.043 ms
^C
--- MYSQL_S ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1226ms
rtt min/avg/max/mdev = 0.027/0.035/0.043/0.008 ms
[root@MYSQL_S ~]#
===========================
[root@MYSQL_M ~]# ping MYSQL_S
PING MYSQL_S (10.0.0.4) 56(84) bytes of data.
64 bytes from MYSQL_S (10.0.0.4): icmp_seq=1 ttl=64 time=0.720 ms
64 bytes from MYSQL_S (10.0.0.4): icmp_seq=2 ttl=64 time=0.346 ms
64 bytes from MYSQL_S (10.0.0.4): icmp_seq=3 ttl=64 time=0.329 ms
^C
--- MYSQL_S ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2150ms
rtt min/avg/max/mdev = 0.329/0.465/0.720/0.180 ms
[root@MYSQL_M ~]# ping MYSQL_M
PING MYSQL_M (10.0.0.3) 56(84) bytes of data.
64 bytes from MYSQL_M (10.0.0.3): icmp_seq=1 ttl=64 time=0.022 ms
64 bytes from MYSQL_M (10.0.0.3): icmp_seq=2 ttl=64 time=0.131 ms
^C
--- MYSQL_M ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1388ms
rtt min/avg/max/mdev = 0.022/0.076/0.131/0.055 ms
[root@MYSQL_M ~]#
###########################end  

  #两台服务器都添加下面的心跳路由   生产环境建议加route。现在不加也不影响搭建.
/sbin/route add -host 172.16.1.4 dev eth1
/sbin/route add -host 172.16.1.3 dev eth1
echo '/sbin/route add -host 172.16.1.3 dev eth1' >> /etc/rc.local
echo '/sbin/route add -host 172.16.1.4 dev eth1' >> /etc/rc.local#######################start
[root@MYSQL_M ~]# ping 172.16.1.4
PING 172.16.1.4 (172.16.1.4) 56(84) bytes of data.
64 bytes from 172.16.1.4: icmp_seq=1 ttl=64 time=1.56 ms
64 bytes from 172.16.1.4: icmp_seq=2 ttl=64 time=0.310 ms
^C
--- 172.16.1.4 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1267ms
rtt min/avg/max/mdev = 0.310/0.935/1.561/0.626 ms
[root@MYSQL_M ~]#
============================
[root@MYSQL_S ~]# /sbin/route add -host 172.16.1.3 dev eth1
[root@MYSQL_S ~]#
[root@MYSQL_S ~]# ping 172.16.1.3
PING 172.16.1.3 (172.16.1.3) 56(84) bytes of data.
64 bytes from 172.16.1.3: icmp_seq=1 ttl=64 time=0.391 ms
^C
--- 172.16.1.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 897ms
rtt min/avg/max/mdev = 0.391/0.391/0.391/0.000 ms
[root@MYSQL_S ~]#  

  3、安装heartbeat
  a、下载并安装epel包.两台服务器都要操作
mkdir -p /home/lvnian/tools && cd /home/lvnian/tools
wget http://mirrors.opencas.cn/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -qa |grep epel
[ epel-release-6-8.noarch.rpm ]&& rpm -ivh epel-release-6-8.noarch.rpm
rpm -qa |grep epel  

  b、安装heartbeat,下面是在centos版本系统中部署,.两台服务器都要操作。所有用yum install heartbeat* -y
  

yum install heartbeat -y  

  c、拷贝ha的配置文件,资源文件以及授权文件到/etc/ha.d/下面
ll /usr/share/doc/heartbeat-3.0.4/
cd /usr/share/doc/heartbeat-3.0.4/
cp ha.cf haresources  authkeys /etc/ha.d/  d、开始配置
cd /etc/ha.d
mv ha.cf ha.bak
mv authkeys authkeys.bak
mv haresources haresources.bak  注意点:下面ha.cf、authkeys、haresources这三个文件在主备都是一样的
  ########配置ha.cf
cat>/etc/ha.d/ha.cf CHANGE MASTER TO
    -> MASTER_HOST='10.0.0.103',            MASTER_PORT=3306,
    -> MASTER_USER='rep',
    -> MASTER_PASSWORD='lvnian123456',
    -> MASTER_LOG_FILE='mysql-bin.000003',
    -> MASTER_LOG_POS=302;
Query OK, 0 rows affected (0.08 sec)
mysql>
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)
mysql> show  slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.4
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 9759
               Relay_Log_File: S_MYSQL-relay-bin.000005
                Relay_Log_Pos: 9905
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 9759
              Relay_Log_Space: 10106
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
1 row in set (0.00 sec)
ERROR:
No query specified
mysql>
成功的表现:
[root@S_MYSQL ~]# mysql -uroot -e "show  slave status\G;"|egrep "Slave_IO_Runnin|Slave_SQL_Running"
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
[root@S_MYSQL ~]#
出现上面两个yes证明数据库主从同步成功了  再次用heartbeat让mysql主库进行主备切换。看看mysql客户端,也就是从库的状态。
  用下面命令看在从库10.0.0.5看主备切换,从库数据同步的情况:
mysql -uroot -e "show  slave status\G;"|egrep "Slave_IO_Runnin|Slave_SQL_Running"
for i in `seq 100`;do  mysql -uroot -e "show  slave status\G;"|egrep "Slave_IO_Runnin|Slave_SQL_Running";sleep 10;echo -e "========$i=======\n" ; done  用下面命令进行主备切换
  

/usr/share/heartbeat/hb_standby
/usr/share/heartbeat/hb_takeover  

  往主库写数据
for n in `seq 2000 2300`;do mysql -uroot -e "use lvnian;insert test values($n,'lvnian$n');"; sleep 10 ;done;
for n in `seq 100`;do  mysql -uroot -e "use lvnian; select * from test;"|tail -5 ;sleep 10;echo -e "=========$i==========" ;done;
mysql -uroot -e "use lvnian; select * from test;"
######################################################
[root@MYSQL_C ~]# for i in `seq 100`;do  mysql -uroot -e "show  slave status\G;"|egrep "Slave_IO_Runnin|Slave_SQL_Running";sleep 10;echo -e "========$i=======\n" ; done
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
========1=======
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
========2=======
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
========3=======
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
========4=======
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
========5=======
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
========6=======
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
========7=======
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
========8=======
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
========9=======
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
####################################
通过上面的主备切换时,从库同步主库的情况,因为每次查看同步情况,是10秒,所以得出结论:在主备进行切换时,mysql可不得大概会有1分钟的延迟,导致无法正常进行使用mysql数据库  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-660142-1-1.html 上篇帖子: DRBD+Heartbeat+Mysql环境搭建 下篇帖子: Linux集群系统Heartbeat-DevilRex119
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表