热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL数据库运维之MySQL高可用01

前面文章介绍了MySQL的读写分离及分库分表过程。对于分库和分表,实现策略有好多种,需要根据业务来确定最适合的分库分表架构,文章中还有好多未涉及到的,读者可以自己找资料学习。分库分

前面文章介绍了MySQL的读写分离及分库分表过程。对于分库和分表,实现策略有好多种,需要根据业务来确定最适合的分库分表架构,文章中还有好多未涉及到的,读者可以自己找资料学习。分库分表完成之后,数据容量及性能增加了,但是紧接着会面临着可用性的问题。从本篇文章开始,将会介绍MySQL的高可用实现方案!

一、基本概念

1、什么是高可用

“高可用性”(High Availability),简称HA,通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。 –来自”百度百科”

2、高可用架构的工作方式

(1)主从
服务同时部署在主从服务器上。初始,主服务器上的服务正常运行,从服务器通过心跳等方式实时监测主服务器的运行状态,一旦出现主服务器宕机或者主服务器上的服务异常终止等故障,从服务器会自动接管主服务器的工作,对外提供服务。

(2)双主
服务同时部署在两台主服务器上。起初,只有一台主服务器对外提供服务,另外一台服务器只处于实时监听状态,当其中的一台主服务器宕机或者服务不可用时,另外一台主服务器会立刻接管出故障的主服务器,对外提供服务,一般通过VIP自动切换来实现。

(3)集群
服务同时部署在多台服务器上。多台服务器共同工作,每一个服务器都有一台或者多台备机。起初,多台服务器可以通过反向代理共同对外提供服务,当某一台服务器出现故障或者其上的服务不可用时,其他服务可以立刻进行接管,对外提供服务,通常可以使用Nginx,HaProxy,LVS等代理实现服务的高可用。但是,Nginx,HaProxy,LVS本身也是单点,需要实现高可用,后面介绍Web应用高可用时会详细介绍。

3、高可用的衡量指标-系统可用率

计算方法:可用率=系统无故障运行时间/(系统无故障运行时间+系统故障维护时间)
根据可用率估计系统可用性指标如下:
《MySQL数据库运维之MySQL高可用01》

二、实现方案

(1)KeepAlived+MySQL+MM复制
实现方法:通过双主复制,在每个节点上部署Keepalived,通过vip向外提供服务,当某个节点故障时,vip自动转移到可用的节点上。

(2)HeartBeat+DRBD+MySQL
实现方法:分布式复制块设备,类似于RAID1,当数据保存到一台服务器上的时候,会同时将数据冗余备份一份到另外一台服务器,通过HeartBeat向服务器发送心跳信息监听服务器的存活状态,当一台服务器故障时,服务会自动转移到另外一个服务器上。

(3)MySQL Cluster
实现方法:MySQL集群是由一组服务器组成,每个服务器上都运行着多个服务进程,MySQL的数据节点,MySQL的管理服务,以及转们的数据访问程序,搭建起来十分复杂。时间成本特别高,但是可以通过MySQL Cluster Manager来快速完成搭建,但是这个软件是收费的,所以这种方案使用的特别少。

(4)MySQL主从+读写分离+自定义脚本
实现方法:插入数据的时候,通过MySQL的主从复制将数据分别保存到两个服务器上,当其中某一台服务器出现故障时,会自动将其中的一台从库提升为主库,对外提供服务器。

三、双主+KeepAlived实现MySQL的高可用

1、环境准备

(1)服务器:CenterOS6.9

(2)MySQL环境
版本:mysql-5.6.39
节点一:192.168.0.4(mysql-master01)
节点二:192.168.0.5(mysql-master02)

2、搭建过程

  • 搭建双主复制

(1)建立复制用户,在节点一上建立一个复制用户’repl’@’192.168.0.%’

#登陆mysql
[root@mysql-master01 ~]# mysql -uroot -proot -h127.0.0.1 -P3306
#建立复制用户,注意主机权限是'192.168.0.%',因为等会需要导入数据到节点二上
mysql> grant all on *.* to 'repl'@'192.168.0.%' identified by 'repl';

(2)全备节点一的所有数据,然后发送到节点二上

[root@mysql-master01 ~]# mysqldump -uroot -proot -h127.0.0.1 -P3306 --all-databases --flush-logs --single-transaction --triggers --routines --master-data=2 --events --hex-blob > /tmp/mysql_all_data.sql
[root@mysql-master01 ~]# scp /tmp/mysql_all_data.sql 192.168.0.5:/tmp/

(3)在节点二所在的服务器上导入节点一备份的数据

[root@mysql-master02 ~]# mysql -uroot -proot -h127.0.0.1 -P3306

(4)修改节点一的配置文件,添加如下内容

[mysqld]
server_id = 4
log_bin=/mysql_data/mysql-bin
log_bin_index=/mysql_data/mysql-bin.index
#让主节点同时作为其他节点的从节点
log_slave_updates = 1
binlog_format = mixed
relay_log = /mysql_data/mysql-relay
relay_log_index = /mysql_data/mysql-relay.index

(5)修改节点二的配置文件,添加如下内容

[mysqld]
server_id = 5
log_bin = /mysql_data/mysql-bin
log_bin_index = /mysql_data/mysql-bin.index
log_slave_updates = 1
relay_log = /mysql_data/mysql-relay
relay_log_index = /mysql_data/mysql-relay.index

(6)重启节点一和节点二
(7)登陆节点一中,然后查看当前二进制日志的位置点及日志文件

root@127.0.0.1 (none)> show master status \G
*************************** 1. row ***************************
File: mysql-bin.000075
Position: 120
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.10 sec)

(8)登陆节点二中,执行”change master”命令,将节点二配置为节点一的从库,然后启动复制

mysql> change master to master_host='192.168.0.4',master_port=3306,master_user='repl',master_password='repl',master_log_file='mysql-bin.000075',master_log_pos=120;
mysql> start slave;
#查看复制状态
mysql> show slave status \G
#看到输出结果中如下两个参数的值为Yes,表示节点二到节点一的复制配置成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

(9)在节点二中查看当前二进制日志的位置点及日志文件

root@127.0.0.1 (none)> show master status \G
*************************** 1. row ***************************
File: mysql-bin.000050
Position: 160
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

(10)在节点一中执行”change master”命令,将节点一配置为节点二的从库,然后启动复制

mysql> change master to master_host='192.168.0.5',master_port=3306,master_user='repl',master_password='repl',master_log_file='mysql-bin.000050',master_log_pos=160;
mysql> start slave;
#查看略,同上

(11)验证,在节点一上创建一张表,然后登陆节点二查看。然后在节点二上创建一张表,然后登陆节点一查看,正常的话,会相互复制,验证过程省略。

至此,MySQL的双主复制搭建完成。

  • 安装及配置keepalived

(1)在节点一上,挂载CentOS6.9的镜像,然后使用yum方式安装keepalived,对于镜像的挂载,可以参考之前的博客:https://segmentfault.com/a/11… 此处不再赘述。安装过程如下:

[root@mysql-master01 ~]# yum install -y keepalived
#安装完成之后,使用该命令查看是否安装成功
[root@mysql-master01 ~]# rpm -qa | grep keep
keepalived-1.2.13-5.el6_6.x86_64

(2)在节点二上,同样挂载CentOS6.9的镜像,然后安装keepalived。此处略。
(3)keepalived安装完成之后,配置文件默认在/etc/keepalived目录下,首先配置节点一上的keepalived,如下:

[root@mysql-master01 ~]# cd /etc/keepalived/
#备份配置文件,需要养成习惯
[root@mysql-master01 keepalived]# cp keepalived.conf keepalived.conf.bak

写入如下内容:

! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
!负载均衡器标识,在同一网段内,可以相同
router_id LVS_DEVEL
}
!定义VRR实例
vrrp_instance VI_1 {
state BACKUP !指定主节点和备节点,此处都是用BACKUP备机
interface eth0 !虚拟IP绑定的网卡,根据自己的情况而定
virtual_router_id 51 !同一个VRR实例下virtual_router_id必须相同
priority 100 !节点的优先级(范围为:1-254之间),备用节点必须比主节点优先级低
advert_int 1 !组播信息发送间隔,两个节点设置必须一样
nopreempt !表示不抢占的模式,只需要在优先级高的机器上设置即可,优先级低的机器可不设置
!设置验证信息,两个节点必须一致,不一致会失败
authentication {
auth_type PASS
auth_pass 1111
}
!配置VIP,可以随意取,但是需要和数据库所在服务器在同一个IP端内,两个节点必须相同
virtual_ipaddress {
192.168.0.100
}
}
!配置监听的VIP及端口
virtual_server 192.168.0.100 3306 {
delay_loop 2 !健康检查时间间隔,单位为s
lb_algo wrr !调度算法权重轮训Weight Round robin
lb_kind DR !LVS实现负载均衡的机制,可以有NAT、TUN和DR三个模式可以选择
nat_mask 255.255.255.0
persistence_timeout 60 !回话保持时间
protocol TCP !转发协议类型,有tcp和udp两种
real_server 192.168.0.4 3306 {
weight 1 #权重,此处和第二个节点设置的相同,表示均衡轮训
notify_down /server/scripts/shutdown.sh !检测到服务故障之后执行的脚本
TCP_CHECK {
connect_timeout 10 !连接超时时间
nb_get_retry 3 !重连次数
delay_before_retry 3 !重连间隔时间
connect_port 3306 !健康检查端口
}
}
}

shutdown.sh的内容请继续往下看。

(4)配置节点二上的keepalived配置文件

[root@mysql-master02 ~]# cd /etc/keepalived/
[root@mysql-master02 keepalived]# cp keepalived.conf keepalived.conf.bak

写入如下内容:

! Configuration File for keepalived
!注意,global_defs可以完全不用动
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.100
}
}
! 配置VIP及监听的端口
virtual_server 192.168.0.100 3306 {
delay_loop 2
lb_algo wrr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 60
protocol TCP
real_server 192.168.0.5 3306 {
weight 1
notify_down /server/scripts/shutdown.sh
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}

shutdown.sh的内容如下,主要是用来关闭keepalived进程的:

[root@mysql-master01 keepalived]# cat /server/scripts/shutdown.sh
#!/bin/bash
#
killall keepalived
#注意,编辑完成之后,需要授权,否则不能执行,节点二上的脚本与此相同
[root@mysql-master01 keepalived]# chmod +x /server/scripts/shutdown.sh

(5)keepalived安装完成之后,默认会生成Sysv脚本,使用service命令启动节点一上的keepalived,并监控试试日志,如下:

[root@mysql-master01 keepalived]# service keepalived start
[root@mysql-master01 keepalived]# tail -f /var/log/messages
#如果未看到错误消息,就是好消息。正常的话,可以在启动日志中看到VIP的启动信息。
#查看进程
[root@mysql-master01 keepalived]# ps -ef | grep keep
root 8258 1 0 May20 ? 00:00:02 /usr/sbin/keepalived -D
root 8260 8258 0 May20 ? 00:00:07 /usr/sbin/keepalived -D
root 8261 8258 0 May20 ? 00:00:12 /usr/sbin/keepalived -D
root 9434 8463 1 04:08 pts/0 00:00:00 grep keep

(6)启动节点二上的keepalived

[root@mysql-master02 keepalived]# service keepalived start

(7)验证主从功能是否正常,验证方法为在节点一上创建数据库,观察节点二上是否同步;然后在节点二上创建数据库,观察节点一上是否同步。验证过程此处略。
(8)两个节点都启动之后,在先启动的节点上查看VIP,如下:

[root@mysql-master01 keepalived]# ip addr | grep "0.100"
inet 192.168.0.100/32 scope global eth0

(9)验证高可用
在另一个客户端上使用VIP连接数据库,比如windows上(VIP需要和windows宿主机在同一个ip段内,否则无法连接),然后查看当前的主机名称,如下:

C:\Users\wangbin>mysql -uroot -proot -h192.168.0.100 -P3306
#查看主机名
mysql> show variables like 'hostname';
+---------------+----------------+
| Variable_name | Value |
+---------------+----------------+
| hostname | mysql-master01 |
+---------------+----------------+
1 row in set (0.00 sec)

关闭节点一上的数据库服务:

[root@mysql-master01 keepalived]# service mysqld stop
#过5秒左右,查看VIP,可以发现,ip已经不在了
[root@mysql-master01 keepalived]# ip addr | grep "0.100"

此时再查看主机名称,如下:

mysql> show variables like 'hostname';
+---------------+----------------+
| Variable_name | Value |
+---------------+----------------+
| hostname | mysql-master02 |
+---------------+----------------+
1 row in set (0.00 sec)
#发现已经变成server02了,VIP已经可以自动切换了

创建一个数据库,然后重新启动节点一上的mysql服务和keepalived服务,登陆节点一查看创建的数据库是否复制。

[root@mysql-master01 keepalived]# service keepalived start
[root@mysql-master01 keepalived]# service mysqld start

经过查看,发现已经复制,在数据库节点重新启动之后,会开始同步节点二上的数据。

后续更多文章将更新在个人小站上,欢迎查看。

另外提供一些优秀的IT视频资料,可免费下载!如需要请查看https://www.592xuexi.com

至此,MySQL的高可用概念及使用(Keepalived+MySQL)实现的MySQL高可用已经搭建验证完毕,篇幅较长,难免有笔误,欢迎评论转发!


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • MySQL 数据库基础学习 一、SQL的作用及分类 二、数据类型 三、存储引擎  (建库建表、数据插入等))
    MySQL 数据库基础学习 一、SQL的作用及分类 二、数据类型 三、存储引擎 (建库建表、数据插入等)) ... [详细]
  • 点此学习更多SQL相关函数与字符串处理函数mysql函数一、简明总结ASCII(char)        返回字符的ASCII码值BIT_LENGTH(str)      返回字 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • HTML5网页模板怎么加百度统计?
    本文介绍了如何在HTML5网页模板中加入百度统计,并对模板文件、css样式表、js插件库等内容进行了说明。同时还解答了关于HTML5网页模板的使用方法、表单提交、域名和空间的问题,并介绍了如何使用Visual Studio 2010创建HTML5模板。此外,还提到了使用Jquery编写美好的HTML5前端框架模板的方法,以及制作企业HTML5网站模板和支持HTML5的CMS。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
author-avatar
tt
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有