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

1、mysql双主复制介绍

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

b95a2b855639db8065a6ecedd5372acb.png

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

7979e2be8f09ee5dcdd326e0fca64017.png

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语句,不记录任何查询语句。

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

5632c90d6b7d029d78d5d17f990ba69d.png

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地址的大小,来决定。

工作原理图

543979cb56d81a24cb96178950326d44.png

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

9a60e96524d2caaf2b490369011747a3.png

3 实验配置

3.1 基础环境

基于社区版myql8.0进行实验

172.31.208.123 主master A,

172.31.208.124 备库 master B

vip 172.31.208.125

架构原理如下所示:

07cd980a09e0fc7f19696c6d30710c99.png

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 [email protected] identified with mysql_native_password by [email protected]; #创建用户 mysql.0中密码需要填写mysql_native_password

grant replication slave on *.* to [email protected]; #分配权限

flush privileges; #刷新权限

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

835aaf9896d26a4b7c5a1ee278db954f.png

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

show master status;

d27906716660c1566b2bc1b9c70a3ca0.png

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

mysql> change master to

-> master_host=‘172.31.208.123‘,

-> master_user=‘repl‘,

-> [email protected],

-> master_log_file=‘mysql-bin.000001‘,

-> master_log_pos=896;

然后启动slave同步进程

mysql> start slave;

然后检查slave状态

show slave status\G

cc419ae2769731d59cb39b9400da8e71.png

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

3.4 备库masterB 主从配置

基本跟主库masterA配置方式一样

创建用户repl分配权限

mysql> create user [email protected] identified with mysql_native_password by [email protected];

mysql> grant replication slave on *.* to [email protected];

mysql> flush privileges;

查看masterB的状态

7515114133095f8c0f24563f53622f38.png

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

mysql> change master to

-> master_host=‘172.31.208.124‘,

-> master_user=‘repl‘,

-> [email protected],

-> master_log_file=‘mysql-bin.000001‘,

-> master_log_pos=866;

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

mysql>start slave;

mysql>show slave status\G

6b222352a7142e4e1d9b23433ad434a1.png

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

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;

b9a4ed493e4df737c6c5da1968a0172f.png

能够看到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上查看

7e7563eaa1f203ef6431f433faaebe19.png

至此 证明,双主配置成功

注意事项

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等工具进行时间同步

同时关闭防火墙和相关配置,保证两边心跳

然后确认网卡多播支持

b473c89683d518422529ff78a756d67d.png

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

ip link set multicast on dev eth0

安装keepalived后,检查版本

aba9f47c70e4e187acdf9010606b413b.png

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检查服务

869e46e7b8331d479250c31f03a46f06.png

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

tail -f /var/log/messages

8c2648ddcbc17ba7a81b8b23bd728b03.png

当配置正确主masterA会有vip

d622f4b0a809046a4cc3acee735e0f1e.png

而masterB不会有vip

0e7e98577c4bf6b2cab61978bdfd5eae.png

keepalived总结

1ca10df1975882d906494417c8951f1e.png

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值