MySQL主主+Keepalived实现高可用

Posted 阿超的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL主主+Keepalived实现高可用相关的知识,希望对你有一定的参考价值。

 在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动。因此,如果是双主或者多主,就会增加mysql入口,增加高可用。不过多主需要考虑自增长ID问题,这个需要特别设置配置文件,比如双主,可以使用奇偶总之,主之间设置自增长ID相互不冲突就能完美解决自增长ID冲突问题

主主方案实现思路

 

1、 两台mysql都可读写,互为主备默认只使用一台masterA负责数据的写入,另一台masterB备用处于备用状态

 

2、 masterAmasterB的主库,masterB又是masterA的主库,它们互为主从;

 

3、 两台主库之间做高可用,可以采用keepalived等方案使用VIP对外提供服务;

 

4所有提供服务的从服务器与masterB进行主从同步(双主多从);

 

5建议采用高可用策略的时候,masterAmasterB均不因宕机恢复后而抢占VIP(非抢占模式);

 

这样做可以在一定程度上保证主库的高可用,在一台主库down掉之后,可以在极短的时间内切换到另一台主库上尽可能减少主库宕机对业务造成的影响,减少了主从同步给生产主库带来的压力;

实验步骤:

master:192.168.200.111

slave:192.168.200.112

配置master1服务器:

1.修改配置文件

 vim /etc/my.cnf

添加内容

[mysqld]

server-id=1

log-bin=mysql-binlog#打开二进制功能

log-slave-updates=true#将复制事件写入binlog,一台服务器既做主库又做从库此选项必须要开启

max_binlog_size=1024M#binlog单文件最大值

auto_increment_offset = 1#自增长ID数

auto_increment_increment = 2#奇数ID

 

replicate-ignore-db = information_schema#忽略不同步主从的数据库

replicate-ignore-db = performance_schema

replicate-ignore-db = test

replicate-ignore-db = mysql

 

max_connections = 3000

max_connect_errors = 30

 

skip-character-set-client-handshake#忽略应用程序想要设置的其他字符集

init-connect=\'SET NAMES utf8\'#连接时执行的SQL

character-set-server=utf8#服务端默认字符集

wait_timeout=1800#请求的最大连接时间

interactive_timeout=1800#和上一参数同时修改才会生效

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES#sql模式

 

relay-log=relay-log-bin#开启中继日志

relay-log-index=slave-relay-bin.index

 2.重启数据库

systemctl restart mariadb

3.登录数据库进行授权

mysql -uroot -p\'密码\'

3.给master2授权

grant replication slave on *.* to \'repl\'@\'192.168.200.112\' identified by \'123456\';

4.刷新授权表

 flush privileges;

5.查看信息表

show master status;

  类似上表

 

配置master2服务器:

1.修改配置文件

vim /etc/my.cnf

添加内容:

[mysqld]

server-id       = 2

log-bin=mysql-binlog

log-slave-updates=true

max_binlog_size=1024M

auto_increment_offset = 2

auto_increment_increment = 2#ID

 

replicate-ignore-db = information_schema

replicate-ignore-db = performance_schema

replicate-ignore-db = test

replicate-ignore-db = mysql

 

max_connections = 3000

max_connect_errors = 30

 

skip-character-set-client-handshake

init-connect=\'SET NAMES utf8\'

character-set-server=utf8

wait_timeout=1800

interactive_timeout=1800

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

 

relay-log=relay-log-bin

relay-log-index=slave-relay-bin.index

2.重启数据库

systemctl restart mariadb

3.登录数据库进行授权

mysql -uroot -p\'密码\'

4.给master1授权

 grant replication slave on *.* to \'repl\'@\'192.168.200.111\' identified by \'123123\';

5.刷新授权表

 flush privileges;

6.查看信息表

show master status;

 

 类似上表

实现主主复制:

配置master1数据库:

1.登录到数据库

mysql -uroot -p\'密码\'

2.停掉从服务

stop slave;

3.指向master2

change master to master_host=\'192.168.200.112\',master_port=3306,master_user=\'repl\',master_password=\'123123\',master_log_file=\'mysql-binlog.000001\',master_log_pos=889;

#对应master2的IP地址、设置密码、binlog进程数和position号

4.开启从服务

start slave;

5.查看从服务信息

 show slave status\\G

 

 

#确保两个线程处于开启状态

 

master2数据库与master1数据库步骤相同

唯一不同的是指向命令

change master to master_host=\'192.168.200.111\',master_port=3306,master_user=\'repl\',master_password=\'123123\',master_log_file=\'mysql-binlog.000004\',master_log_pos=486;

 #对应master1的IP地址、设置密码、进程数和position号

查看从服务信息

 

show slave status\\G

 

 

 
#确保两个线程处于开启状态

进行测试:
测试环境,可以保证没数据写入。步骤是:先masterA锁表-->masterA备份数据-->masterA解锁表 -->masterB导入数据-->masterB设置主从-->查看主从

1.在master1数据库中创建库

create database hhh;

2.在master2中查看数据库

show databases;

 

 

 3.在master2中创建库jjj

create database jjj;

4.在master1中查看数据库

show databases;

 

 

 实现主主复制

配置keepalived实现主主复制高可用

配置master1数据库:

1.安装keepalived软件

yum -y install keepalived

2.修改keepalived配置文件

vim /etc/keepalived/keepalived.conf

修改内容:

! Configuration File for keepalived

 

global_defs {

   router_id LVS_MASTER-A#指定LVS负载标识

}

 

vrrp_script mysql {

    script "/opt/mysql.sh"#准备触发脚本

    interval 2

    weight -5                 

    fall 2                 

    rise 1

}

 

vrrp_instance VI_1 {

    state BACKUP

    interface eno16777728#本机网卡名

    virtual_router_id 51

priority 100#优先级

nopreempt#采用不抢占模式

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    track_script {

        mysql#指定要触发的脚本

    }

    virtual_ipaddress {

        192.168.200.254#指定VIP地址

    }

}

3.编辑触发脚本

vim /opt/mysql.sh

编辑内容:

#!/bin/bash

counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)

if [ "${counter}" -eq 0 ]; then

    systemctl stop keepalived

fi

4.给与脚本执行权限

chmod +x /opt/mysql.sh

5.重启keepalived服务使其生效

systemctl start keepalived

6.查看IP信息

ip a

 

 

 #VIP地址为254被篇master1所占用

7.查看日志信息

 tail -f /var/log/messages

 

 

 

master2数据库操作与master1相同

唯一不同的地方是keepalived配置文件做调整

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   router_id LVS_MASTER-B

}

 

vrrp_script mysql {

    script "/opt/mysql.sh"

    interval 2

    weight -5                 

    fall 2                 

    rise 1

}

 

vrrp_instance VI_1 {

    state BACKUP

    interface eno16777728

    virtual_router_id 51

    priority 99

    nopreempt

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    track_script {

        mysql

    }

    virtual_ipaddress {

        192.168.200.254

    }

}

实现双主复制并给予keepalived实现高可用

 

以上是关于MySQL主主+Keepalived实现高可用的主要内容,如果未能解决你的问题,请参考以下文章

MySQL+Keepalived实现主主高可用方案

MySQL主主复制+keepalived高可用方案实现

MySQL主主复制+keepalived高可用方案实现

keepalived+mysql主主实现高可用

MySQL主主+Keepalived实现高可用

MySQL 主主复制 + LVS + Keepalived 实现 MySQL 高可用性