暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql主主+keepalived高可用

IT那活儿 2022-06-07
1100

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!

01

MySQL双主(主主)架构方案思路

  • 两台mysql都可读写,互为主备,默认只使用一台(masterA)负责数据的写入,另一台(masterB)备用;

  • masterA是masterB的主库,masterB又是masterA的主库,它们互为主从;

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

  • 建议采用高可用策略的时候,masterA或masterB均不因宕机恢复后而抢占VIP(非抢占模式)。

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

1)环境

两台安装好mysql的服务器(yum安装比较快且方便),关闭防火墙,关闭selinux。

  • systemctl stop firewalld(临时关闭)

  • setenforce 0(临时关闭)

2)我的主机地址

  • mysql1:192.168.44.131

  • mysql2:192.168.44.133

  • 虚拟ip:192.168.44.199

02

mysql1配置

在/etc/my.cnf新增以下内容:

[mysqld]

#作为主从复制的唯一标识,集群中,不能重复

server-id = 1

#开启二进制日志

log-bin = master-log

#开启中继日志

relay-log = slave-log

auto_increment_offset = 1

auto_increment_increment = 2

复制

注:auto_increment_offset确定AUTO_INCREMENT列值的起点,也就是初始值。

auto_increment_increment控制列中的值的增量值,也就是步长。

mysql中有自增长字段,在做数据库的主主同步时需要设置自增长的两个相关配置:auto_increment_offset和auto_increment_increment。

在主主同步配置时,需要将两台服务器的auto_increment_increment增长量都配置为2,而要把auto_increment_offset分别配置为1和2。

03

mysql2配置

[mysqld]

#作为主从复制的唯一标识,集群中,不能重复

server-id = 2

#开启二进制日志

log-bin = master-log

#开启中继日志

relay-log = slave-log

auto_increment_offset = 2

auto_increment_increment = 2

复制

04

重启mysql服务

systemctl restart mysqld
复制


05

mysql1为主,mysql为从配置

进入mysql1数据库创建同步账号并赋予权限:

mysql> create user 'zjf'@'192.168.44.%' identified by '123456';
复制

mysql> grant replication slave on *.* to 'zjf'@'192.168.44.%';
复制

mysql> show master status;
复制

进入mysql2数据库执行以下语句:

#log_file和log_pos的数据是mariad1上show master status得到的数据。

mysql> change master to master_host='192.168.44.131', 
master_user='zjf', master_password='123456',
master_log_file='master-log.000001', master_log_pos=441;

复制

开启主从:

mysql> start slave;
复制

mysql> show slave status\G;
复制

06

mysql2为主,mysql1为从配置

进入mysql2数据库创建同步账号并赋予权限:

mysql> create user 'zjf'@'192.168.44.%' identified by '123456';
复制

mysql> grant replication slave on *.* to 'zjf'@'192.168.44.%';
复制

show master status;
复制

进入mysql2数据库执行以下语句:

#log_file和log_pos的数据是mariad1上show master status得到的数据。

mysql> change master to master_host='192.168.44.131', 
master_user='zjf', master_password='123456',
master_log_file='master-log.000004', master_log_pos=441;

复制

开启主从:

mysql> start slave;
复制

mysql> show slave status\G;
复制

至此, 主主同步复制配置完成!!!

07

在mysql1创建一个库test1:

Create database test1
复制

mysql1和mysql2都有。

Show databases
复制

在mysql2创建一个库test2:

Create database test2
复制

Mysql1和msql2都有。

Show databases
复制

主主同步复制配置便测试成功。

08

keepalived高可用

8.1 Mysql1和MySQL2都安装keepalived

yum -y install keepalived
复制

8.2 mysql1的/etc/keepalived/keepalived.conf配置

! configuration File for keepalived

global_defs {

router_id mysql-01 #主机标示符,不一定要用主机名,默认值取主机名

}

vrrp_instance VI_1 {

state BACKUP #非抢占模式两台服务器都为BACKUP

interface ens33 #根据机器的ifconfig来定,vip要绑定的网卡

virtual_router_id 50 #虚拟路由ID,俩节点保持一致 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同

priority 100 #主节点的优先级(1-254),备用节点必须比主节点优先级低

advert_int 1 #组播信息发送间隔,两个节点设置必须一样

nopreempt #不抢占vip资源,防止故障节点恢复后因为优先级高导致vip再次飘移

authentication { #设置验证信息,两个节点必须一样

auth_type PASS

auth_pass 1111

}

virtual_ipaddress { #指定虚拟ip,两个节点必须一致

192.168.44.199

}

}

#虚拟主机是可选部分,主要用来配置负载均衡。这里可以绑定端口

virtual_server 192.168.44.199 3306 { #绑定端口为3306,0代表所有端口

delay_loop 2

lb_algo rr ##负载均衡轮训算法,详见官方文档

lb_kind DR #路由模式,同网段DR,不同网段NAT

persistence_timeout 50

protocol TCP

real_server 192.168.44.131 3306 {

weight 3

notify_down etc/keepalived/bin/killkeepalived.sh

notify_down /etc/keepalived/bin/mysql_check.sh

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

}

}

}

复制

8.3 mysql2的/etc/keepalived/keepalived.conf配置

! configuration File for keepalived

global_defs {

router_id mysql-02 #主机标示符,不一定要用主机名,默认值取主机名

}

vrrp_instance VI_1 {

state BACKUP #非抢占模式两台服务器都为BACKUP

interface ens33 #根据机器的ifconfig来定,vip要绑定的网卡

virtual_router_id 50 #虚拟路由ID,俩节点保持一致 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同

priority 50 #主节点的优先级(1-254),备用节点必须比主节点优先级低

advert_int 1 #组播信息发送间隔,两个节点设置必须一样

nopreempt #不抢占vip资源,防止故障节点恢复后因为优先级高导致vip再次飘移

authentication { #设置验证信息,两个节点必须一样

auth_type PASS

auth_pass 1111

}

virtual_ipaddress { #指定虚拟ip,两个节点必须一致

192.168.44.199

}

}

#虚拟主机是可选部分,主要用来配置负载均衡。这里可以绑定端口

virtual_server 192.168.44.199 3306 { #绑定端口为3306,0代表所有端口

delay_loop 2

lb_algo rr ##负载均衡轮训算法,详见官方文档

lb_kind DR #路由模式,同网段DR,不同网段NAT

persistence_timeout 50

protocol TCP

real_server 192.168.44.133 3306 {

weight 3

notify_down /etc/keepalived/bin/killkeepalived.sh

notify_down /etc/keepalived/bin/mysql_check.sh

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

}

}

}

复制

8.4 脚本

在两台服务器上编写两个脚本,就在keepalived配置文件指定的地方创建notify_down,当Mysql和keepalived 出现问题的时候会触发此脚本,用于关掉本机的keepalived进程,之后才能进行切换到另外一个节点上去,并且授予执行权限+x。

#!/bin/bash

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

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

systemctl stop keepalived

fi

复制

8.5 结果

启动两台服务器的keepalived,可以看到一台服务器有虚拟ip,另一台没有。

8.6 测试

停掉有虚拟ip的那台主机的keepalived,虚拟ip会跑到另一台主机上,且配置了不抢占规则,即使恢复服务,ip也不会漂移回去。


END



本文作者:朱景锋

本文来源:IT那活儿(上海新炬王翦团队)

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论