mysql学习-mysql8.0配置双主复制+keepalived实现高可用架构

一般小型公司数据库,使用主从复制即可保证数据库的高可用,但是一旦主数据库故障,切换到从库需要一定的时间,这样就导致了停机时间过长,不能及时恢复业务。使用双主(master)配合keepalived这种mysql高可用架构也是基于主从复制的原理而搭建的。这是一种简单、便捷的解决方案,在高可用集群环境中,keepalived使用vip,利用keepalived自带的服务监控功能和自定义脚本来实现mysql故障时自动切换。

1、mysql双主复制介绍

双主复制,就是相互做主从复制,每个master既是master又是另外一台服务器的slave。这样,任何一方所做的变更,都会通过复制应用到另外一方的数据库中。

主从复制涉及三个线程,一个运行到主节点(log dump thread),其余两个(I/O thread,SQL thread)运行在从节点,如下所示:


i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;

主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;

SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

主从复制重点:

1)主从复制是异步的逻辑的sql语句级的复制

2)复制时,主库有一个I/O线程,从库有有两个线程,即I/O和SQL线程。

3)实现主从复制的必要条件是主库需要开启binlog功能

4)作为复制的所有mysql节点的server-id都不能相同

5)binlog文件只记录对数据库有更改的sql语句,不记录任何查询语句。

大致的逻辑流程图如下所示:

2 keepalived

Keepalived 是一个基于 vrrp 协议来实现的服务器高可用解决方案,可以利用其实现避免IP单点故障,类似的工具还有 heartbeat 、 corosync 。不过其不会单独出现,而是搭配着 LVS、Nginx、HAproxy,一起协同工作达到高可用的目的

VRRP 全称Vritual Router Redundancy Protocol,虚拟路由冗余协议。通过把几台提供路由功能的设备组成一个虚拟路由设备,使用一定的机制保证虚拟路由的高可用,从而达到保持业务的连续性与可靠性。

在这组成的一个虚拟路由器中,有 master 和 backup 之分。master是主节点,在一个虚拟路由器中,只能有一个master,但可以有多个backup;backup是备用节点,也就是当master挂掉之后,backup接手master节点的所有资源,当有多个backup节点时,根据其 priority (优先级)的值的大小,来选择谁作为master的替代者。当backup节点的优先级值相同时,根据其IP地址的大小,来决定。
工作原理图

大致的工作流程如下所示:

3 实验配置

3.1 基础环境

基于社区版myql8.0进行实验
172.31.208.123 主master A,
172.31.208.124 备库 master B
vip 172.31.208.125
架构原理如下所示:

3.2 数据库配置文件

要是实现主主复制,就是在主从复制的基础上配置相互为主从

数据库主master A,配置文件如下所示,/etc/my.cnf

server-id = 1                                                #任意自然n,只需要保证两台mysql主机不重复就可以
log-bin=mysql-bin                                        #开启二进制日志
auto_increment_increment=2                      #步进值auto_imcrement 。一般有n台主mysql就填n
auto_increment_offset=1                             #起始值,一般填写第n台主机mysql.此时为第一台主  mysql
#binlog-ignore=mysql                                  #忽略mysql库,可以不填写
#binlog-ignore=infomation_schema            #忽略information_schema库,一般不填写
replicate-do-db=test_db                              #指定同步的数据库,不填写则默认所有的数据库

数据库主master B,配置文件如下所示,/etc/my.cnf

server-id = 2
log-bin=mysql-bin
auto_increment_increment=2
auto_increment_offset=2
#binlog-ignore=mysql
#binlog-ignore=infomation_schema
replicate-do-db=test_db

完成配置后,重启mysql

3.3 主库masterA主从配置

然后开始创建复制用户,repel,密码repel
主库master A

create user ‘repl‘@‘172.31.208.124‘ identified with mysql_native_password by ‘[email protected]‘;      #创建用户 mysql.0中密码需要填写mysql_native_password
grant replication slave on *.* to ‘repl‘@‘172.31.208.124‘;                         #分配权限
flush privileges;                                                                                         #刷新权限

然后查看账户是否权限分配正确

show grants for ‘repl‘@‘172.31.208.124‘;


查看masterA状态,记录二进制文件名和位置

show master status;

登陆masterB数据库,执行同步语句

mysql> change master to
    -> master_host=‘172.31.208.123‘,
    -> master_user=‘repl‘,
    -> master_password=‘[email protected]‘,
    -> master_log_file=‘mysql-bin.000001‘,
    -> master_log_pos=896;

然后启动slave同步进程

mysql> start slave;

然后检查slave状态

show slave status\G


如果在error没有看到配置错误信息,则说明配置成功

3.4 备库masterB 主从配置

基本跟主库masterA配置方式一样
创建用户repl分配权限

mysql> create user ‘repl‘@‘172.31.208.123‘ identified with mysql_native_password by ‘[email protected]‘;
mysql> grant replication slave on *.* to ‘repl‘@‘172.31.208.123‘;
mysql> flush privileges;

查看masterB的状态

然后登陆masterA,执行同步语句

mysql> change master to
    -> master_host=‘172.31.208.124‘,
    -> master_user=‘repl‘,
    -> master_password=‘[email protected]‘,
    -> master_log_file=‘mysql-bin.000001‘,
    -> master_log_pos=866;

然后启动slave同步,检查slave状态·

 mysql>start slave;
 mysql>show slave status\G


查看到以上信息,说明配置正确

3.5 测试

主库masterA上创建test_db,并创建表product

mysql> create table product(
    ->        product_id int(10) not NULL,
    ->        product_name varchar(100) not NULL,
    ->        product_tyep varchar(32) not NULL,
    ->        sale_price int(10) default 0,
    ->        input_price int(10) default 0,
    ->        regist_time date,
    ->        primary key (product_id)
    -> );

masterB上查看

mysql> show databases;
mysql> use test_db;
mysql> show tables;
mysql> desc product;


能够看到masterA中test_db库中的表product已经同步过来

然后备库masterB上创建test_db库中的表product_new,然后再masterA上查看

mysql> create table product_new(
    -> product_id int(10) not NULL,
    ->        product_name varchar(100) not NULL,
    ->        product_tyep varchar(32) not NULL,
    ->        sale_price int(10) default 0,
    ->        input_price int(10) default 0,
    ->        regist_time date,
    ->        primary key (product_id)
    -> );

masterA上查看


至此 证明,双主配置成功

注意事项
1、主主复制配置文件中auto_increment_increment和auto_increment_offset只能保证主键不重复,却不能保证主键有序。

2、当配置完成Slave_IO_Running、Slave_SQL_Running不全为YES时,show slave status\G信息中有错误提示,可根据错误提示进行更正。

3、Slave_IO_Running、Slave_SQL_Running不全为YES时,大多数问题都是数据不统一导致。
4、两个数据库最好软件硬件等规格配置要一致

常见出错点:

1、两台数据库都存在db数据库,而第一台MySQL db中有tab1,第二台MySQL db中没有tab1,那肯定不能成功。

2、已经获取了数据的二进制日志名和位置,又进行了数据操作,导致POS发生变更。在配置CHANGE MASTER时还是用到之前的POS。

3、stop slave后,数据变更,再start slave。出错。

终极更正法:重新执行一遍CHANGE MASTER就好了。

4、配置keepalived

两台数据库,使用yum安装keepalived的软件包

yum install -y keepalived

在配置前,要确保两边时间一致,可以用ntp chrony等工具进行时间同步
同时关闭防火墙和相关配置,保证两边心跳
然后确认网卡多播支持

没有开启的话按照如下方式开启

ip link set multicast on dev eth0  

安装keepalived后,检查版本

keepalived的配置文件路径为:/etc/keepalived/keepalived.conf,里面有很多无用的配置,需要进行清理,按照我们的需要进行重新配置
完成修改后主masterA 的配置文件如下:

! Configuration File for keepalived

vrrp_script check_mysql_status {                                #定义vrrp脚本,检测mysql主从状态
script "keepalived_check_mysql.sh"                           #脚本名称

interval 10                                                                   #脚本检测执行间隔时间 10秒
}

vrrp_instance VI_1 {                                                  #实例名字V1_1,相同的实例备节点名字要和这个相同
    nopreempt                                                             #采取非抢占模式
    state BACKUP                                                    # 状态为BACKUP状态,避免发生裂脑、冲突现象
    interface ens192                                                  #定义通信接口为ens192,此参数备节点和主节点相同,根据网卡实际名称来
    virtual_router_id 51                                              #实例ID为51
    priority 100                                                          #优先级为90,备节点的优先级必须比此数字低
    advert_int 5                                                           #通信检查检查间隔时间为1秒
    authentication {
        auth_type PASS                                                #认证类型,此参数备节点设置和主节点设置相同
        auth_pass 1111                                                  #密码是1111,此参数备节点设置和主节点相同
    }
    virtual_ipaddress {                                                 #虚拟机IP,即VIP为172.31.208.95/24,绑定接口为ens192,别名为ens192:1,此参数备节点设置和主节点相同
        172.31.208.124/24 dev ens192 label ens192:1
    }
    track_script {
    check_mysql_status                                              #触发检查
    }
}

以下为masterB的配置文件

script "keepalived_check_mysql.sh"

interval 10
}

vrrp_instance VI_1 {
    nopreempt
    state BACKUP
    interface ens192
    virtual_router_id 51
    priority 100
    advert_int 5
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.31.208.125/24 dev ens192 label ens192:1
    }
    track_script {
    check_mysql_status
    }
}

说明:

1、总体配置和其他keepalived配置一致
2、使用双主,状态都要配置成backup状态,并且使用非抢占模式,通过优先级来判断谁是主库,避免裂闹,冲突

注意,默认情况下,keepalived软件仅仅在对方机器宕机或者keepalive停掉的时候才会接管业务。有时mysql服务停止,但是keepalived服务还在工作,此时就会导致用户的访问的vip无法找到对应的服务,所以需要编写脚本,检测mysql服务状态,当服务中断时,keepalive服务也中断,这里的keepalived_check_mysql.sh脚本的作用就是这样。脚本如下,保存在主maserA和备masterB的/etc/keepalived/路径下

#!/bin/bash
#for centos7
mysqlstr=/usr/sbin/mysqld
user=user
[email protected]

##mysql服务状态正常为1,否则为0
#mysql_status=1

####check mysql status######
$mysqlstr  -u $user -p$password -e "show status;" >/dev/null 2>&1  #执行成功,代表数据库服务正常
echo "mysql_status=1"
exit 0
else
systemctl stop mysqld
fi

记得加上可执行权限

配置完成后,分别启动masterA和masterB的keepalived服务

systemctl start keepalived
systemctl enable keepalvied

注意,当配置文件有任何错误的时候,systemctl 不会提示keepalived启动失败,需要使用systemclt status检查服务

也可通过日志文件查看启动情况

tail -f /var/log/messages

当配置正确主masterA会有vip

而masterB不会有vip

keepalived总结

原文地址:https://blog.51cto.com/11555417/2407532

时间: 2024-11-08 20:38:32

mysql学习-mysql8.0配置双主复制+keepalived实现高可用架构的相关文章

Mysql双主互备+keeplived高可用架构(部分)

一.Mysql双主互备+keeplived高可用架构介绍 Mysql主从复制架构可以在很大程度保证Mysql的高可用,在一主多从的架构中还可以利用读写分离将读操作分配到从库中,减轻主库压力.但是在这种架构中,主库出现故障时需要手动将一台从库提升为主库.在对写操作要求较高的环境中,主库故障在主从架构中会成为单点故障.因此需要主主互备架构,避免主节点故障造成写操作失效. 在双主互备的架构中,每台Mysql都充当主服务器,同时充当对方的从服务器.在任意一台服务器上的写操作都会被复制到另一台服务器上,从

mysql主主复制+keepalived实现高可用

mysql最简单的高可用 2台pc机 mysql主主复制实现数据的同步 keepalive实现双机热备,保证服务的正常运行 1.环境 Master1  10.0.0.201 Master2 10.0.0.202 2.Master1操作授权 mysql>grant replication slave on *.* to'admin'@'10.0.0.202' identified by '123456';///授权 mysql>show master status\G; 3.Master2操作授

mysql主主复制+keepalived 打造高可用mysql集群

为了响应公司需求,打造出更安全的mysql集群,能够实现mysql故障后切换,研究了几天终于有了成果,一起分享一下. 首先介绍一下这套集群方案实现的功能 1.mysql服务器故障后自动转移,修好后自动切回 2.mysql服务故障自动转移,修好后自动切回 3.可以实现在几秒钟内转移 以下内容均是实验环境,请根据实际情况修改响应参数 实验环境: mysql1 ip:10.1.1.20 mysql2  ip:10.1.1.21 mysql vip:10.1.1.25 三台机器均安装centos 6.5

MySQL 5.7 双主复制+keepalived,常规业务一般够用了

业务需求: 为Zabbix搭建2个数据库,一个库给服务器监控用,一个库给网络监控用. 硬件: 两台服务器,硬盘是1.2 T SSD卡,内存128G 架构: 希望做双主复制+keepalived,架构大概如下图 主机A IP:192.168.1.2 主机B IP:192.168.1.3 VIP:192.168.1.4 一.首先安装MySQL 5.7 到下面的url下载你操作系统对应的yum包 http://dev.mysql.com/downloads/repo/yum/ 运行下面两个命令安装 r

keepalived双主模式实现nginx高可用及LNAMMP架构

keepalived双主模式实现nginx高可用及LNAMMP架构 一.利用keepalived实现nginx调度器高可用: 二.构建LNAMMP架构: 1) Nginx既是前端调度器,又是缓存服务器: 2) 将php的session缓存于memcached中: 3) 在Apache和php上部署Discuz论坛程序: 4) 使用https连接,即使用户使用的是http协议也可以以https协议进行访问: ---------------------------------------------

超详细MySQL主主复制+MMM实现高可用

简介 MMM(Master-Master Replication Manager for MySQL, MySQL主主复制管理器)是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置.注意同一时间只有一个节点是可写.MMM的监管端会提供多个虚拟IP(VIP)包括一个可写VIP,多个可读VIP,通过监管的管理,这些IP会绑定在可用mysql之上,当某一台mysql宕机时,会将VIP迁移至其他my

Memcached 主主复制 + Keepalived 高可用架构【附上原理】

目录: 1·Memcached 主主复制概念2·Memcached 高可用的实现3·案例部署4·总结 Memcached 主主复制概念 (1)主主复制概念: Memcached 主主复制是指在任意一台 Memcached 服务器修改数据都会被同步到另外一台,但是 Memcached API 客户端无法判断连接到那一台 Memcached 服务器,所有需要设置 VIP 地址,提供给 Memcached API 客户端进行连接. (2)文章推荐: 知道了主主复制,那么需要了解 Memcached 是

mysql高可用架构方案之一(keepalived+主主双活)

Mysql双主双活+keepalived实现高可用 目录 1.前言... 4 2.方案... 4 2.1.环境及软件... 4 2.2.IP规划... 4 2.3.架构图... 4 3.安装设置MYSQL半同步... 5 4.Keepalived实现MYSQL的高可用... 11 1.前言 最近研究了下高可用的东西,这里总结一下mysql主主双活的架构方案,整体上提高服务的高可用性,出现问题也不需要手动切换,提高整体的维护效率.确定改造的话,只需要让他们的程序中使用vip地址就可以,实现起来比较

mysql-双主+keepalived高可用架构

在生产环境中,任何架构的建立,必须拥有防止单点故障的存在.mysql可以拥有主从,或者双主,加上keepalived的VRRP热备切换功能可以实现还有其他的,MHA,PXC,MMM,heartbeat+DRBD等----------------------------------------------------------------------------------- 搭建思路,首先两台mysql互为主从复制关系,通过keepalived的虚拟IP来提供mysql服务centos7+双m