zoukankan      html  css  js  c++  java
  • 基于keepalived搭建mysql双主高可用

    目录

    • 概述
    • 环境准备
    • keepalived搭建
    • mysql搭建
    • mysql双主搭建
    • mysql双主高可用搭建

    概述

        传统(不借助中间件)的数据库主从搭建,如果主节点挂掉了,从节点只能读取无法写入,只能把人肉去恢复故障,既不想引用中间件也不想人肉恢复故障,可以折中选择双主方案,本文将介绍通过keepalived搭建mysql双主方案。

        本例中vip为:172.16.0.169,  两台mysql实例服务器ip分别为:172.16.0.1和172.16.0.2

    转帖请注明来源: https://my.oschina.net/u/2342969/blog/2963153

    环境准备

    1. 最小化安装centos7
    2. mysql-5.7.23
    3. keepalived 1.4.5
    4. 虚拟ip(下文简称vip):172.16.0.169

    keepalived搭建

        点击查看keepalived搭建教程,博主亲自操作过来的,如有疑问欢迎随时私信或者评论

    mysql单机搭建

        点击查看mysql搭建教程,博主亲自操作过来的,如有疑问欢迎随时私信或者评论

    双主搭建

        本方案仅限两台均是全新安装的mysql,如果是旧mysql实例和新mysql实例改为双主,在新mysql实例中记得导入旧mysql实例的数据,另外可能同步复制还会报异常,自行解决一下。

    环境安装检查

    1. 两台mysql实例均可以访问
    2. keepalived可以正常漂移

    数据库配置更改

    
    #vim /etc/my.cnf
    

        进入mysql配置修改一下配置:

    1. server-id 两台mysql要不一样,一般是ip最后一位。注意命名规范不要加下划线/中横线/点等特殊符号
    2. #skip_slave_start = 1  注释掉这个配置

    创建复制账号

    
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'172.16.0.%' identified by 'repl_password';
    mysql> flush privileges;
    mysql> select @@server_id;
    

    两台mysql分别执行以上语句,语句解析:

    1. 创建mysql复制账号
    2. repl_user: 复制权限账号的用户名,可自行更改
    3. 172.16.0.%: 此处使用的通配符,也可以写固定ip,可同步的mysql实例ip
    4. repl_password: 复制权限账号的密码,自行更改
    5. select @@server_id; 查询出的结果一定要不一样

    配置互为主备   

    
    mysql> CHANGE MASTER TO MASTER_HOST="对方ip", MASTER_USER="repl_user", MASTER_PASSWORD="repl_password", MASTER_PORT=3316, MASTER_AUTO_POSITION = 1;
    mysql> start slave;
    mysql> show slave statusG;
    

    两台mysql分别执行以上sql,语句解析:

    1. 互相设置对方为主节点,自己为备节点
    2. MASTER_HOST:对方ip
    3. MASTER_USER:对方复制权限账号用户名,即上一步设置的用户名
    4. MASTER_PASSWORD:对方复制权限账号密码,即上一步设置的密码
    5. MASTER_PORT:对方mysql实例的端口, 如果开了防火墙一定要记得打开端口
    6. show slave statusG; 注意查看Slave_IO_Running 和 Slave_SQL_Running 状态如果有一个为no 就代表配置失败

    检查点:

    1. Master_Host: 是否是对方ip
    2. Master_User: 是否是对方的复制账号的用户名
    3. Master_Port: 是否是对方mysql实例的端口号
    4. Last_SQL_Errno:最近sql错误条数,正常情况为0
    5. Last_SQL_Error:最新sql错误详细信息,正常情况为空

    如果有异常,根据异常信息解决掉问题后,执行一下命令

    
    mysql> stop slave;
    mysql> reset master;
    

    两台mysql分别执行以上命令,再执行一下上一步的配置。

    验证

    1. 在任意一台mysql创建数据库,另一台也会同步到
    2. 在任意一台mysql创建表,另一台也会同步到
    3. 在任意一台mysql表中插入数据,另一台也会同步到

    双主高可用

    修改keepalived配置

    
    # vim /etc/keepalived/keepalived.conf
    

    配置内容如下:

    
    <code class="language-apache">! Configuration File for keepalived
    global_defs {
    router_id MYSQL-1 ## 名称自定义,两台机器需要不一样
    }
    
    vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 60
    priority 100    # 两台机器需要一个大一个小,数值大的先启动,哪台先启动vip会先在哪台机器
    advert_int 1
    nopreempt
    authentication {
    auth_type PASS
    auth_pass 123456
    }
    virtual_ipaddress {
    172.16.0.169    # 填写自己的vip
    }
    }
    
    virtual_server 172.16.0.169 3316 {  # 填写自己的vip 和mysql端口
    delay_loop 2
    #lb_algo rr
    #lb_kind DR
    persistence_timeout 60
    protocol TCP
    real_server 172.16.0.1 3316 { # 填写mysql服务器真实ip 和mysql端口
    weight 3
    notify_down /etc/keepalived/checkmysql.sh  # 检查mysql是否存活脚本,根据脚本位置自行填写
    TCP_CHECK {
    connect_timeout 3
    nb_get_retry 3
    delay_before_retry 3
    connect_port 3316  # mysql的端口号
    }
    }
    }
    
    

    注意: 上面配置注释的部分,两台机器根据实际情况修改,配置文件中的注释一定要去掉,以免出现奇怪问题

    编写mysql监测脚本

    
    #vim  /etc/keepalived/checkmysql.sh
    

    脚本内容如下:

    
    #!/bin/sh
    datetime=`date +20\%y\%m\%d_\%H\%M\%S`
    isok=$(/usr/local/mysql/bin/mysql -h localhost -u数据库账号 -p数据库密码 -P数据库端口 -S /tmp/mysql3316.sock 2&gt;/dev/null  -e 'select 1' |sed -n '2p')
    function error_query(){
    systemctl stop keepalived
    echo $datetime  &gt;&gt; /etc/keepalived/keepalived.log
    echo "mysql down, keepalived 切换" &gt;&gt; /etc/keepalived/keepalived.log
    }
    echo "isok: $isok"  &gt;&gt; /etc/keepalived/keepalived.log
    if [ "$isok" != "1" ]
    then
    error_query
    fi
    
    

    注意:根据实际情况调整脚本中的中文部分

    给脚本赋权限:

    
    # chmod +x /etc/keepalived/*.sh
    

    验证

        一定要先阅读博文[centos7 下源码安装keepalived踩坑记],根据这篇博文中"操作keepalived"章节操作keepalived

    1. 两台服务器分别启动keepalived, 注意先启动keepalived配置中priority 数值大的
    2. 停掉vip所在机器的mysql实例,查看另外一台机器ip是否有vip了

    两台机器记得交叉验证,以免有问题, 如果不能正常漂移,请认真检查操作步骤,是否和本文一致

    原文链接:https://my.oschina.net/u/2342969/blog/2963153
  • 相关阅读:
    UITableView 排序、删除
    iOS中arc的设置
    dynamics ax 2009 distinct实现及数组集合
    将关系数据库映射到业务实体
    常见负载均衡实现
    ibatis经验
    百度贴吧10亿量级LAMP架构分享
    dynamics ax 2009 字段类似的表绑定界面注意
    [转]大型动态应用系统框架
    .net 发展历程
  • 原文地址:https://www.cnblogs.com/datiangou/p/10245840.html
Copyright © 2011-2022 走看看