精华内容
下载资源
问答
  • mysql高可用架构详解

    千次阅读 2021-01-18 18:58:28
    高可用(High Availabiltity)应用提供持续不间断(可用)的服务的能力系统高可用性的评价通常用可用率表示造成不可用的原因硬件故障(各种)预期中的系统软硬件维护软件缺陷(应用代码,服务程序都可能存在bug)***,泄露,...

    高可用(High Availabiltity)应用提供持续不间断(可用)的服务的能力

    系统高可用性的评价通常用可用率表示

    f9e9df1aea042bfdf5838a2f68414145.png

    f5dfcfd366620257acbf39ef7e1158b9.png

    造成不可用的原因硬件故障(各种)

    预期中的系统软硬件维护

    软件缺陷(应用代码,服务程序都可能存在bug)

    ***,泄露,认为失误...等安全事件

    对于系统来说,不可用时间是各关键组件不可用时间的总和.....

    提高可用性的主要手段冗余,Redundancy

    关键软硬件通过备用冗余避免故障时长时间的不可用

    数据软件,硬件,存储的数据,都需要通过冗余确保故障时可替换

    f9e9df1aea042bfdf5838a2f68414145.png

    c489631e0c67c070b248185c61a4c932.png

    mysql高可用常见方案:数据库服务在冗余实现上有其特殊性

    数据:服务"有状态"与数据冗余

    数据库可用性考虑两部分:数据可用性,服务可用性;

    实现方式多种多样,同一种数据也会有多种实现方案

    可用性目标循序渐进

    任何故障都不会造成数据丢失->可以较快速恢复服务(高可用)

    高可用方案

    1.mysql--基于共享存储的单活方案(不常用)

    f9e9df1aea042bfdf5838a2f68414145.png

    c559f1b225967c9b2b26b245a48c89da.pngSAN,方案比较昂贵;因此不常用;

    且数据库备用机,只是机器活着,但是没有没有起mysql服务;

    因为大部分共享存储或数据库是不允许同一份数据被不同数据使用的;

    本地数据通过RAID等手段保证数据安全

    2.基于存储复制的数据冗余单活(不常用)

    4172d7392050bfdda56fc94c65a466cc.png

    f9e9df1aea042bfdf5838a2f68414145.png存在一定浪费,备用机器一直不在用,等待主机挂掉,才会使用备用机;

    而且DRBD(两台机器间通过网络,备份数据),不是100%的保证数据不丢失;

    3.基于集群提交通信协议的多主复制(一定场景适用)

    f9e9df1aea042bfdf5838a2f68414145.png

    60a0a6c0023b03f004df34477bb823f3.png

    基于主从复制的高可用方案

    4.基于Mysql主从复制(常用,普适)

    f9e9df1aea042bfdf5838a2f68414145.png

    925003e20ddcc7fea2e2686e9bf788fa.png

    备库,在线上也会提供服务,避免浪费;

    而主从复制,也保证了数据不会丢失。

    mysql主从复制高可用方案需要改进的问题主从服务器各自有IP地址,发生主从切换后应用需要修改重启;如何让应用快速找到从库;VIP/DNS

    人工判断主库是否故障再发起切换需要花较多时间如何自动探知;监控探知并自动VIP/DNS;

    主从复制存在客观延迟,切换后可能造成事务数据丢失。由于网络延时,如何避免数据丢失。

    1.为了避免应用人工修改切换IP,引入VIP(virtual ip)漂移方案:

    f9e9df1aea042bfdf5838a2f68414145.png

    f9e9df1aea042bfdf5838a2f68414145.png

    f468156442ae2db1ace95bae3b941636.png

    16ffede297200ce1935ae65eac22da36.png

    方案二:

    DNS,应用服务器,使用域名;

    平时,将域名注册在主库上,而主库挂掉,将域名注册到从库就可以了;

    2.为了减少人工介入处理的时间开销引入自动探活处理机制

    f9e9df1aea042bfdf5838a2f68414145.png

    9e47a7f797972078c1f529f77b32efac.png

    高可用中间层与RDSVIP/DNS解决 应用切换问题

    监控和管理服务器解决自动判断故障切换和VIP/DNS漂移

    VIP/DNS管理+探活+主从关系切换 = 高可用中间层

    透明切换管理+靠谱数据探活+使用切换 = 高可用中间层

    云环境+高可用中间层+底层数据库=一种PaaS=基本RDS、

    高可用中间层MHA

    自动选择复制延迟最小的从节点并试图补全日志(但大部分主机故障下行不通)

    通常要求两从以上,会进行主从关系切换

    不提供VIP管理方案

    MMM

    提供了基本的VIP管理功能

    适合双主配置的一对主机,不会主动切换主从关系

    不支持主从数据延迟判断和补全

    一般使用MHA,开源;

    3.mysql主从复制延迟

    为什么日志传输延迟

    为什么主从复制,主从库会数据不一致;

    f9e9df1aea042bfdf5838a2f68414145.png

    2b9be420e207971deac7dc36bf0e8116.png

    解决方案:

    mysql半同步技术:

    主库一次commit,要等到主库持久化完成,以及从库也持久化完成,才给主键放回commit成功。

    但是问题:

    主库等待从库的时间是不可控的;

    主库发现从库写不进去了,可以等待几秒,之后主库复制自动降级成异步复制;但这也可能导致数据不一致;

    f9e9df1aea042bfdf5838a2f68414145.png

    48c61ada00816cbc2e7537eda4037d34.png

    较完善的mysql高可用方案半同步复制+高可用中间层+VIP管理方案

    高可用中间层=靠谱探活+主从切换+使用VIP管理的接口

    例如:半同步复制+MHA(高可用中间层)+Keeplive(VIP管理方案)

    半同步复制+RDS

    总结

    高可用指标至少3个9目标4个9

    高可用核心就是使用冗余

    数据库高可用两个部分

    数据可用性--数据有状态

    服务可用性

    高可用方案

    基于SAN方案的改进,不使用SAN设备

    单活,备用机浪费

    DRBD基于两台机器间通过网络备份数据,数据不能100%保证

    SAN,设备昂贵

    单活,备用机浪费,因为同一份数据不能被不同mysql实例使用;

    本地数据可以通过RAID等手段保证

    基于共享存储SAN的单活方案

    基于DRBD存储复制的数据冗余单活

    多主复制--mysql cluster

    基于mysql主从复制(常用,普适)

    备份,在线上可提供只读服务,避免浪费;

    主从复制,也保证了数据不会丢失

    基于mysql主从复制的问题

    VIP管理方案+高可用中间层+半同步复制

    使用半同步复制技术,但也要考虑到从库宕机,主库应该自动降级成异步复制;

    使用监控服务器,自动靠谱探知+自动主从切换

    使用VIP(virtual IP)/DNS管理方案,当发生切换是,只需要将VIP从主库漂移到从库,对应用来说是透明的。主从服务器各有IP地址,发生主从切换后应用需要修改重启;

    人工判断主库是否故障,在发起切换需要时间长

    主从复制存在客观延迟,切换后可能造成事务数据丢失

    解决问题后的mysql高可用方案

    高可用中间层

    VIP/DNS管理+靠谱探活+主从关系切换=高可用中间层

    云环境+高可用中间层+底层数据库=一种paas=基本RDS

    MHA/MMM

    MHA

    自动选择复制延迟最小的从节点并试图补全日志(主机故障下行不通)

    自动探活

    自动主从切换

    不提供VIP管理方案,但提供使用VIP方案的接口

    展开全文
  • 系统环境及架构#主机名 系统版本 mysql版本 ip地址mysqlMaster centos7.4 mysql5.7 192.168.1.42mysqlSlave centos7.4 mysql5.7 192.168.1.43#vip:192.168.1.41在master和slave上分别进行数据库的安装yum insta...

    系统环境及架构

    #主机名 系统版本 mysql版本 ip地址

    mysqlMaster centos7.4 mysql5.7 192.168.1.42

    mysqlSlave centos7.4 mysql5.7 192.168.1.43

    #vip:192.168.1.41

    b347c432f8d50aff3754d1348e9d2fa2.png

    在master和slave上分别进行数据库的安装

    yum install epel* -y && yum clean all && yum makecache

    rpm -Uvh http://repo.mysql.com/mysql57-community-release-el7.rpm

    yum clean all && yum makecache

    yum install gcc gcc-c++ openssl-devel mysql mysql-server mysql-devel -y

    创建数据库文件存放路径

    mkdir /data/mysql -p

    chown -R mysql:mysql /data/mysql

    配置mysql配置文件

    #在mysqlMaster上配置mysql配置文件

    vi /etc/my.cnf

    [mysqld]

    server-id = 1#全局唯一,每台都不能一样

    log-bin = mysql-bin#log-bin表示开启二进制日志记录,mysql-bin表示日志文件的命名格式,会生成mysql-bin.0001 等等

    relay-log = mysql-relay-bin#指定中继日志格式(拉取主mysql日志后,在从库上生成的日志)

    replicate-wild-ignore-table=mysql.%#指定那些库或则表不进行同步,mysql是库名,.%表示下面所有的表,mysql.user 表示不同不mysql库下的user表

    replicate-wild-ignore-table=test.%

    replicate-wild-ignore-table=information_schema.%

    #replicate-wild-do-table=boke.%#表示同步那个库

    #注意:不要在主库上使用binlog-do-db 或 binlog-ignore-db选项

    #也不要在从库上使用 replicate-do-db 或 replicate-ignore-db 选项,因为这有可能产生跨库更新失败的问题.推荐从库上使用 replicate_wild_do_table 和 replicate_wild_ignore_table 这两个选项来解决复制过滤问题

    datadir=/data/mysql

    socket=/data/mysql/mysql.sock

    user=mysql

    symbolic-links=0

    log-error=/var/log/mysqld.log

    pid-file=/var/run/mysqld/mysqld.pid

    character-set-server=utf8

    [mysql]

    socket=/data/mysql/mysql.sock

    default-character-set=utf8

    [client]

    socket=/data/mysql/mysql.sock

    default-character-set=utf8

    user=root

    password=NCYD-tianyu@0791

    #若是不写上这个字段,在本机用命令进入mysql会报错,提示默认路径/var/lib/mysql/mysql.sock找不到

    在mysqlSlave上配置mysql配置文件

    vi /etc/my.cnf

    [mysqld]

    server-id = 2

    log-bin = mysql-bin

    relay-log = mysql-relay-bin

    replicate-wild-ignore-table=mysql.%

    replicate-wild-ignore-table=test.%

    replicate-wild-ignore-table=information_schema.%

    datadir=/data/mysql

    socket=/data/mysql/mysql.sock

    user=mysql

    symbolic-links=0

    log-error=/var/log/mysqld.log

    pid-file=/var/run/mysqld/mysqld.pid

    character-set-server=utf8

    [mysql]

    socket=/data/mysql/mysql.sock

    default-character-set=utf8

    [client]

    socket=/data/mysql/mysql.sock

    default-character-set=utf8

    user=root

    password=NCYD-tianyu@0791

    #若是不写上这个字段,在本机用命令进入mysql会报错,提示默认路径/var/lib/mysql/mysql.sock找不到,先初始化数据库(需要进行初始化在/data/mysql目录里生成必要的信息)

    #mysql5.7.7以后的初始化方法

    mysqld --initialize --user=mysql --datadir=/data/mysql

    #mysql5.7.7以前的初始化方法

    mysql_install_db --user=mysql --datadir=/data/mysql

    分别启动主从数据库

    #在centos7里面,必须先关闭selinux,否在无法启动mysqld

    systemctl start mysqld

    分别为主从mysql做安全加固

    #查到上一步,首次启动mysql,系统自动生成的密码( cat /var/log/mysqld.log |grep pass )

    mysql_secure_installation#使用该命令更改随机root密码(修改为 NCYD-tianyu@0791 )

    手动同步数据(假如现在的环境,主上已经有数据了,从是新的)

    1:在主上数据库中创建用于复制的用户,并授权

    mysql> GRANT REPLICATION SLAVE ON *.* to 'tongbu'@'192.168.1.43' identified by '123456789';

    2:在主mysql上先锁表(使其所有表变成只读状态)

    mysql> flush tables with read lock;#不要退出终端,否在这个锁就失效了

    3:再开启另一个命令行终端,使用myqldump等工具将数据导出(或则直接打包存储mysql数据的目录,并发送到从机上)

    4:将导出数据复制到从机上,并创建新库并导入数据

    互相置从,互相置主(以达到双主模式)

    在mysqlMaster上将mysqlSlave设置为自己的主角色服务器

    mysql> show master status;#查看mysqlSlave的状态(记录File名字,和Position)

    change master to

    master_host = '192.168.1.43',

    master_user = 'tongbu',

    master_password = '123456789',

    master_log_file = 'mysql-bin.000002',

    master_log_pos = 1006;

    mysql> start slave; #启动slave端的复制进程(某些版本是:slave start; )

    mysql> show slave status\G #查看slaves端的I/O进程,与SQL进程

    在从上将mysqlMaster设置为自己的主角色服务器

    mysql> show master status;#查看mysqlMaster的状态(记录File名字,和Position)

    change master to

    master_host = '192.168.1.42',

    master_user = 'tongbu',

    master_password = '123456789',

    master_log_file = 'mysql-bin.000002',

    master_log_pos = 1006;

    mysql> start slave; #启动slave端的复制进程

    mysql> show slave status\G #查看slaves端的I/O进程,与SQL进程

    验证是否同步

    1:第一验证在myssqlMaster上创建库,mysqlSlave上是否存在

    2:第二验证在mysqlSlave上创建库,mysqlMaster上是否存在

    安装keepalived实现VIP切换,达到高可用

    yum install keepalived -y

    #在mysqlMaster和mysqlSlave上都创建检查mysql的检查脚本,并赋予执行权限

    touch /etc/keepalived/mysql_check.sh

    chmod +x /etc/keepalived/mysql_check.sh

    vi /etc/keepalived/mysql_check.sh

    #!/bin/bash

    #slave_is=( $(mysql -uroot -pNCYD-tianyu@0791 -e "show slave status\G" | grep "Slave_.*_Running" | awk '{print $2}') ) 在新版本的myql中,直接将密码写在命令行,会进行安全提示,解决办法是将其写在mysql的配置文件里的 [client] 字段里,写法见上面mysql的配置文件

    slave_is=( $(mysql -e "show slave status\G" | grep "Slave_.*_Running" | awk '{print $2}') )

    if [ "${slave_is[0]}" = "Yes" -a "$slave_is[1]" = "Yes"]

    then

    exit 0

    else

    exit 1

    fi

    #注意,keepalived检查脚本vrrp_script,只认两个返回值,0表示正常,非0表示不正常(这在写脚本是要注意),不正常就要做相关的切换

    配置keepalived,以实现高可用

    vi /etc/keepalived/keepalived.conf

    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_skip_check_adv_addr

    #vrrp_strict#注意:当你发现无法ping通虚拟VIP时,建议将此行注释掉

    vrrp_garp_interval 0

    vrrp_gna_interval 0

    }

    vrrp_script mysql_check {

    script "/etc/keepalived/mysql_check.sh"

    #这个脚本,若是发现不执行,可以检查他的权限,777是不可以的,日志提示不安全,可以直接chmod +x /etc/keepalived/mysql_check.sh 就行

    #script "shutdown -r now"#或者,直接用命令进行调试

    interval 2

    weight 2

    }

    vrrp_instance VI_1 {

    state MASTER#mysqlMaster上是MASTER;mysqlSlave上是BACKUP

    interface ens192

    virtual_router_id 52

    priority 100#mysqlMaster上是100;mysqlSlave上是90

    advert_int 1

    nopreempt#配置VIP(注意:故障切换抢占模式,尽量关闭,默认是开启的,这个参数只需要在高优先级上设置即可)

    authentication {

    auth_type PASS

    auth_pass 1111

    }

    track_script {#调用上面定义检查mfsmaster的脚本

    mysql_check

    }

    virtual_ipaddress {

    192.168.1.41/24 dev ens192

    }

    }

    启动keepalived

    systemctl start keepalived

    展开全文
  • MySQL高可用架构对比

    2021-01-19 19:11:36
    MMM与MHA以及MGR,高可用架构都有如下的共同点:对主从复制集群中的Master节点进行监控自动的对Master进行迁移,通过VIP。重新配置集群中的其它slave对新的Master进行同步MMM需要两个Master,同一时间只有一个Master...

    MMM与MHA以及MGR,高可用架构都有如下的共同点:

    对主从复制集群中的Master节点进行监控

    自动的对Master进行迁移,通过VIP。

    重新配置集群中的其它slave对新的Master进行同步

    MMM

    需要两个Master,同一时间只有一个Master对外提供服务,可以说是主备模式。

    dbe467264877732cd31499445da58f27.png

    需要基础资源:

    资源

    数量

    说明

    主DB

    2

    用于主备模式的主主复制

    从DB

    0~N台

    可以根据需要配置N台从服务器

    IP地址

    2n+1

    N为MySQL服务器的数量

    监控用户

    1

    用户监控数据库状态的MySQL用户(replication)

    代理用户

    1

    用于MMM代理端改变read_only状态

    故障转移步骤:

    Slave服务器上的操作

    完成原主上已经复制的日志恢复

    使用Change Master命令配置新主

    主服务器上操作

    设置read_only关闭

    迁移VIP到新主服务器

    优点:

    提供了读写VIP的配置,试读写请求都可以达到高可用

    工具包相对比较完善,不需要额外的开发脚本

    完成故障转移之后可以对MySQL集群进行高可用监控

    缺点:

    故障简单粗暴,容易丢失事务,建议采用半同步复制方式,减少失败的概率

    目前MMM社区已经缺少维护,不支持基于GTID的复制

    适用场景:

    读写都需要高可用的

    基于日志点的复制方式

    MHA

    0caedeba6902440b9fc18e42f92988bd.png

    需要资源:

    资源

    数量

    说明

    主DB

    2

    用于主备模式的主主复制

    从DB

    2~N台

    可以根据需要配置N台从服务器

    IP地址

    n+2

    N为MySQL服务器的数量

    监控用户

    1

    用户监控数据库状态的MySQL用户(replication)

    复制用户

    1

    用于配置MySQL复制的用户

    MHA采用的是从slave中选出Master,故障转移:

    从服务器:

    选举具有最新更新的slave

    尝试从宕机的master中保存二进制日志

    应用差异的中继日志到其它的slave

    应用从master保存的二进制日志

    提升选举的slave为master

    配置其它的slave向新的master同步

    优点:

    MHA除了支持日志点的复制还支持GTID的方式

    同MMM相比,MHA会尝试从旧的Master中恢复旧的二进制日志,只是未必每次都能成功。如果希望更少的数据丢失场景,建议使用MHA架构。

    缺点:

    MHA需要自行开发VIP转移脚本。

    MHA只监控Master的状态,未监控Slave的状态

    MGR

    MGR是基于现有的MySQL架构实现的复制插件,可以实现多个主对数据进行修改,使用paxos协议复制,不同于异步复制的多Master复制集群。

    支持多主模式,但官方推荐单主模式:

    多主模式下,客户端可以随机向MySQL节点写入数据

    单主模式下,MGR集群会选出primary节点负责写请求,primary节点与其它节点都可以进行读请求处理.

    2ab2662b9dbde18c7c87f3893fd7a752.png

    // 查看MGR的组员

    select * from performance_schema.replication_group_members;

    // 查看MGR的状态

    select * from performance_schema.replication_group_member_stats;

    // 查看MGR的一些变量

    show variables like 'group%';

    // 查看服务器是否只读

    show variables like 'read_only%';

    复制代码

    优点:

    基本无延迟,延迟比异步的小很多

    支持多写模式,但是目前还不是很成熟

    数据的强一致性,可以保证数据事务不丢失

    缺点:

    仅支持innodb

    只能用在GTID模式下,且日志格式为row格式

    适用的业务场景:

    对主从延迟比较敏感

    希望对对写服务提供高可用,又不想安装第三方软件

    数据强一致的场景

    读写负载大问题

    读负载大:

    增加slave

    加中间层(MyCat,ProxySQL,Maxscale)

    读写分离

    关于写负载大:

    分库分表

    增加中间层

    最后

    展开全文
  • MHA架构图本次MHA的部署基于GTID复制成功构建,普通主从复制也可以构建MHA架构。下载所需的软件包mkdir /server/tools -p //创建存放包的目录[root@db01 tools]# lltotal 5136-rw-r--r-- 1 root root 4963681 Oct 26...

    MHA架构图

    275e69e2af00fb1ab7b963bbcde396cf.png

    本次MHA的部署基于GTID复制成功构建,普通主从复制也可以构建MHA架构。

    下载所需的软件包

    912903815d26b09d18e7ef194ec67428.png

    mkdir /server/tools -p //创建存放包的目录

    [root@db01 tools]# ll

    total 5136

    -rw-r--r-- 1 root root 4963681 Oct 26 15:39 Atlas-2.2.1.el6.x86_64.rpm

    -rw-r--r-- 1 root root 87119 Oct 26 15:39 mha4mysql-manager-0.56-0.el6.noarch.rpm

    -rw-r--r-- 1 root root 113914 Oct 26 15:39 mha4mysql-manager-0.56.tar.gz

    -rw-r--r-- 1 root root 36326 Oct 26 15:39 mha4mysql-node-0.56-0.el6.noarch.rpm

    -rw-r--r-- 1 root root 50172 Oct 26 15:39 mha4mysql-node-0.56.tar.gz

    下载地址:https://github.com/yoshinorim/mha4mysql-manager/wiki/Downloads

    安装依赖包(所有节点)

    yum install perl-DBD-MySQL -y

    所有节点安装node

    #安装node包

    [root@mysql-db01 tools]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm

    Preparing... ########################################### [100%]

    1:mha4mysql-node ########################################### [100%]

    创建mha用户(主库)

    grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha'; //主库上创建,从库会自动复制(在从库上查看)

    创建命令软连接(重要)

    //如果不创建命令软连接,检测mha复制情况的时候会报错

    ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql

    ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog

    //在所有节点创建

    部署管理节点(mha-manager)

    在mysql-db03上部署管理节点

    # 安装epel源,软件需要

    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

    # 安装manager 依赖包

    yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes

    # 安装manager管理软件

    rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

    出现的报错

    3b143ada94272e7ddec974950d4c395b.png

    解决办法:

    更新epel源 ,yum clean all ,yum makecache

    下载epel 7 的源

    再次执行下载

    创建必须的目录(db03)

    mkdir -p /etc/mha     //创建配置文件目录

    mkdir -p /var/log/mha/app1 ----> 可以管理多套主从复制 ,创建日志目录

    编辑MHA配置文件(db03)

    [root@mysql-db03 ~]# vim /etc/mha/app1.cnf

    [server default]

    manager_log=/var/log/mha/app1/manager

    manager_workdir=/var/log/mha/app1

    master_binlog_dir=/usr/local/mysql/data

    user=mha

    password=mha

    ping_interval=2

    repl_user=rep

    repl_password=123

    ssh_user=root

    [server1]

    hostname=10.0.0.51

    port=3306

    [server2]

    candidate_master=1

    check_repl_delay=0

    hostname=10.0.0.52

    port=3306

    [server3]

    hostname=10.0.0.53

    port=3306

    配置文件详解

    [server default]

    #设置manager的工作目录

    manager_workdir=/var/log/masterha/app1

    #设置manager的日志

    manager_log=/var/log/masterha/app1/manager.log

    #设置master 保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录

    master_binlog_dir=/data/mysql

    #设置自动failover时候的切换脚本

    master_ip_failover_script= /usr/local/bin/master_ip_failover

    #设置手动切换时候的切换脚本

    master_ip_online_change_script= /usr/local/bin/master_ip_online_change

    #设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码

    password=123456

    #设置监控用户root

    user=root

    #设置监控主库,发送ping包的时间间隔,尝试三次没有回应的时候自动进行failover

    ping_interval=1

    #设置远端mysql在发生切换时binlog的保存位置

    remote_workdir=/tmp

    #设置复制用户的密码

    repl_password=123456

    #设置复制环境中的复制用户名

    repl_user=rep

    #设置发生切换后发送的报警的脚本

    report_script=/usr/local/send_report

    #一旦MHA到server02的监控之间出现问题,MHA Manager将会尝试从server03登录到server02

    secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02 --user=root --master_host=server02 --master_ip=192.168.0.50 --master_port=3306

    #设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)

    shutdown_script=""

    #设置ssh的登录用户名

    ssh_user=root

    [server1]

    hostname=10.0.0.51

    port=3306

    [server2]

    hostname=10.0.0.52

    port=3306

    #设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave。

    candidate_master=1

    #默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master

    check_repl_delay=0

    配置ssh信任(所有节点)

    #创建秘钥对

    [root@mysql-db01 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1

    #发送公钥,包括自己

    [root@mysql-db01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.51

    [root@mysql-db01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.52

    [root@mysql-db01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@10.0.0.53

    分发完成后测试分发是否成功

    for i in 1 2 3 ;do ssh 10.0.0.5$i date ;done

    [root@db03 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf

    最后一行信息为如下字样即为分发成功:

    Thu Dec 28 18:44:53 2017 - [info] All SSH connection tests passed successfully.

    启动测试

    经过上面的部署过后,mha架构已经搭建完成

    # 启动mha

    nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

    启动成功后,检查主库状态

    [root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf

    app1 (pid:3298) is running(0:PING_OK), master:10.0.0.51

    ssh免密测试

    #测试ssh

    [root@mysql-db03 ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf

    #看到如下字样,则测试成功

    Tue Mar 7 01:03:33 2017 - [info] All SSH connection tests passed successfully.

    #测试复制

    [root@mysql-db03 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf

    #看到如下字样,则测试成功

    MySQL Replication Health is OK.

    报错:

    0402784f308cd514ca5d755f83fe56a8.png

    切换master测试

    查看现在的主库是哪个

    [root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf

    app1 (pid:11669) is running(0:PING_OK), master:10.0.0.51 ------> 51为主库

    手动停止主库

    [root@db01 ~]# systemctl stop mysqld

    再停止数据的同时查看日志信息的变化

    [root@db03 ~]# grep -i "change master to" /var/log/mha/app1/manager

    77fff2f22115b0305e5414d040d7292e.png

    修复主从

    启动原主库,添加change master to 信息

    [root@db01 ~]# systemctl start mysqld

    mysql> CHANGE MASTER TO MASTER_HOST='10.0.0.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123';

    mysql> start slave;

    查看主从复制状态

    mysql> show slave status\G

    Master_Host: 10.0.0.52

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

    修复MHA

    修改app1.cnf配置文件,添加回被剔除主机

    [root@db03 ~]# cat /etc/mha/app1.cnf

    [binlog1]

    hostname=10.0.0.53

    master_binlog_dir=/data/mysql/binlog/

    no_master=1

    [server default]

    manager_log=/var/log/mha/app1/manager

    manager_workdir=/var/log/mha/app1

    master_binlog_dir=/data/mysql

    master_ip_failover_script=/usr/local/bin/master_ip_failover

    password=mha

    ping_interval=2

    repl_password=123

    repl_user=repl

    ssh_user=root

    user=mha

    [server1]

    hostname=10.0.0.51

    port=3306

    [server2]

    hostname=10.0.0.52

    port=3306

    [server3]

    hostname=10.0.0.53

    port=3306

    检查状态

    mha检查复制状态

    [root@db03 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf

    MySQL Replication Health is OK.

    启动mha程序

    nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

    到此主库切换成功

    [root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf

    app1 (pid:11978) is running(0:PING_OK), master:10.0.0.52

    实验结束将主库切换回db01

    ① 停止mha

    [root@db03 ~]# masterha_stop --conf=/etc/mha/app1.cnf

    Stopped app1 successfully.

    ② 停止所有从库slave(所有库操作)

    stop slave;

    reset slave all;

    ③ 重做主从复制(db02、db03)

    CHANGE MASTER TO

    MASTER_HOST='10.0.0.51',

    MASTER_PORT=3306,

    MASTER_AUTO_POSITION=1,

    MASTER_USER='repl',

    MASTER_PASSWORD='123';

    ④ 启动slave

    start slave; //启动之后检查从库是否为两个yes show slave status\G

    ⑤ mha检查主从复制

    [root@db03 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf

    MySQL Replication Health is OK.

    ⑥ 启动mha

    nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

    //检查切换是否成功

    [root@db03 ~]# masterha_check_status --conf=/etc/mha/app1.cnf

    app1 (pid:12127) is running(0:PING_OK), master:10.0.0.51 //到此主主节点有切回到db01

    设置权重

    修改[server1]的权重

    [server1]

    hostname=10.0.0.51port=3306candidate_master=1check_repl_delay=0配置说明:

    candidate_master=1 ----> 不管怎样都切到优先级高的主机,一般在主机性能差异的时候用

    check_repl_delay=0 ----> 不管优先级高的备选库,数据延时多久都要往那切

    展开全文
  • 本文将说明各种高可用架构以及适用场景。 一 、高可用架构 MySQL Replication 经典的主从复制,需要多个步骤手动进行配置。例如,用户管理、备份恢复、配置复制…MySQL仅提供了核心功能,整体架构需要用户自己决定...
  • 主要介绍:复制功能介绍、mysql二进制日志、mysql复制拓扑、高可用框架、单点故障、读写分离和负载均衡介绍等mysql复制功能介绍mysql复制功能提供分担读负载复制解决的问题实现在不同服务器上的数据分布利用二进制...
  • 内容来源:2017年7月22日,UCloud高级研发工程师王松磊在“饿了么技术沙龙【第九弹】上海研发中心·运维专场”进行《数据库高可用架构》演讲分享。IT 大咖说作为独家视频合作方,经主办方和讲者审阅授权发布。阅读...
  • MySQL高可用架构

    2021-04-22 21:19:38
    高可用”是互联网一个永恒的话题,先避开MySQL不谈,为了保证各种服务的高可用有几种常用的解决方案。 服务冗余:把服务部署多份,当某个节点不可用时,切换到其他节点。服务冗余对于无状态的服务是相对容易的。 ...
  • 探索MySQL高可用架构之MHA(8)-----构建mysql高可用系列(共9篇)上一篇文章介绍了本次架构的mha读写分离!世上本来就没有十全十美的事物。你不能要求一个人没有一点缺点错误。要正视自己的长处和短处,取他人之长补己...
  • {0mysql高可用架构方案之一(keepalived+主主双活),有需要的朋友可以参考下。"r2tK%Ex(M#O2K051Testing软件测试网(TtoEpw eM;~eMysql双主双活+keepalived实现可用51Testing软件测试网'xx&q3r1Way4IG7lN0xy}s...
  • Friends 2021 杭州站 的演讲内容《基于 Kubernetes 的新一代 MySQL 高可用架构实现方案》。 本文是 MySQL 容器化系列的第三篇文章,主要介绍 MySQL 容器化 Helm 版本[1] 的设计思路。 Dockerfile 简介 首先 ...
  • MySQL Group Replication(以下简称MGR),于5.7.17版本正式GA,由Oracle官方出品,为MySQL高可用方案注入了新血液。其一致性,以及不依赖外部组件实现的自动切换、多点写入,给DBA带来了不少期待。一、背景以MHA...
  • 关键词:mysql高可用概述,mysql高可用架构常用可用方案20190918 现在业内常用的MySQL高可用方案有哪些?目前来说,用的比较多的开源方案分内置可用与外部实现,内置可用有如下:1、官方版本分支:MGR(首推)2...
  • 概述MySQL高可用,顾名思义就是当MySQL主机或服务发生任何故障时能够立马有其他主机顶替其工作,并且最低要求是要保证数据一致性。因此,对于一个MySQL高可用系统需要达到的目标有以下几点:数据一致性保证--这个是...
  • MYSQL高可用架构实践

    2021-01-26 01:01:36
    mysql> 6.10 修复宕机的Master通常情况下自动切换以后,原master可能已经废弃掉,待原master主机修复后,如果数据完整的情况下,可能想把原来master重新作为新主库的slave,这时我们可以借助当时自动切换时刻的...
  • -----构建mysql高可用系列(共9篇)上一篇文章介绍了本次架构的Atlas读写分离!本篇文章主要介绍本次架构中的keepalive部分!什么是Keepalived呢????keepalived是一款c语言写的实现在linux系统上实现负载均衡和高可用...
  • 今天,咱们就实操一下使用keepalived如何构建MySQL高可用架构一、 系统信息二、 安装部署mysql1、安装两台服务器现在linux安装时,好多安装了mysql,下面以从节点安装为例进行说明[root@mytest2 mysqldb]# rpm -qa...
  • 探索MySQL高可用架构之MHA(4)-----构建mysql高可用系列(共9篇)上一篇文章介绍了本次架构中的Mysql源码安装。本篇文章主要介绍本次架构中的ABBB复制。首先我们先介绍什么是MySql AB复制????AB复制又称主从复制,实现...
  • 高可用的优势1、成本低2、解决单点故障3、不容易遇到性能瓶颈一 、Mysql主从同步架构搭建案例优点如下:·在业务繁忙阶段,在从服务器上可以执行查询工作(即我们常说的读写分离),降低主服务器压力;·在从服务器...
  • Mysql双主双活+keepalived实现高可用文件夹1、前言...... 111、前言近期研究了下高可用的东西,这里总结一下mysql主主双活的架构方案,总体上提高服务的高可用性。出现故障也不须要手动切换。提高总...
  • MySQL发展至今,在高可用性方面不断前进,从最初的异步复制、半同步复制、群组复制,演进到现在的InnoDB Cluster和InnoDB Replica Set。在这一篇里将说明各种...
  • 保证事务的一致性达到真正意义上的高可用MHA提供了什么功能监控主数据库服务器是否可用当主DB不可用时,从多个从服务器中选举出新的主数据库服务器提供了主从切换和故障转移功能MHA可以与半同步结合提供主从切换和...
  • { #是否开启debug模式 "Debug": true, #是否记录到系统日志 "EnableSyslog": false, #web 端口 "ListenAddress": ":3000", #被管理数据库用户 ...#被管理的MySQL的用户密码配置文件 "MySQLTopologyCred

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 135,672
精华内容 54,268
关键字:

mysql高可用架构

mysql 订阅