mysql主从复制 动态ip_毕业设计之mysql+主从复制+keepalived

环境介绍

mysql_VIP:192.168.111.123mysql_M!:192.168.111.151mysql_M2:192.168.111.152

安装mysql可以查看

两个数据库都需要设置主从复制使用的账号和权限

mysql> grant replication slave on *.* to bbs_slave@'192.168.111.%' identified by 'salve2004';

Query OK, 0 rows affected, 1 warning (0.16 sec)

mysql> flush privileges;

注意:其中relication slave是权限 bbs_slave 是账号名字

主库开启二进制日志和设置server_id

主要加入这些

#开启二进制日志并指定位置

log-bin=/data/mysql/logs/mysql-bin

#设置id

server-id=1

重启主库服务器;

[root@mysql.quan.bbs ~]$service mysqld restart

Shutting down MySQL.. SUCCESS!

Starting MySQL.. SUCCESS!

查看master状态:

48304ba5e6f9fe08f3fa1abda7d326ab.png

mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000001 | 1058 | | | |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

上面的File Position是后面需要用到的

48304ba5e6f9fe08f3fa1abda7d326ab.png

导出以存在的数据并复制到从库(这里只列出一库)

[root@mysql.quan.bbs data]$mysqldump -u root -p --all-databases >/tmp/2020.02.20.sql

Enter password:

[root@mysql.quan.bbs data]$scp -P 20042 /tmp/2020.02.20.sql apps@192.168.111.153:/tmp

apps@192.168.111.153's password:

2020.02.20.sql 100% 3136KB 3.1MB/s 00:00

两个从库都需要设置的

导入接受到的数据文件:

48304ba5e6f9fe08f3fa1abda7d326ab.png

[root@mysql.bktwo.quan.bbs tmp]$mysql -u root -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 10

Server version: 5.7.29-log Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> source /tmp/2020.02.20.sql

48304ba5e6f9fe08f3fa1abda7d326ab.png

修改配置文件:

主要加入这些

#开启二进制日志并指定位置

log-bin=/data/mysql/logs/mysql-bin

#设置id

server-id=33 #不能和master重复

重启服务器:

[root@mysql.bkone.quan.bbs data]$service mysqld restart

登陆数据库设置master信息:

建议先确保slave是停止的(stop slave)

48304ba5e6f9fe08f3fa1abda7d326ab.png

mysql> change master to

-> master_host='192.168.111.151',

-> master_user='bbs_slave',

-> master_password='slave2004',

-> master_port=3306,

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

-> master_log_pos=1058;

Query OK, 0 rows affected, 2 warnings (0.01 sec)

48304ba5e6f9fe08f3fa1abda7d326ab.png

注意:有些数据是主库拿到的,master_log_file   master_log_pos

启动slave并查看状态:

48304ba5e6f9fe08f3fa1abda7d326ab.png

mysql> start slave;

Query OK, 0 rows affected (0.10 sec)

mysql> show slave status\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.111.151

Master_User: bbs_slave

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000003

Read_Master_Log_Pos: 154

Relay_Log_File: mysql-relay-bin.000002

Relay_Log_Pos: 320

Relay_Master_Log_File: mysql-bin.000003

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 154

Relay_Log_Space: 527

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 1

Master_UUID: ad0e3900-4a82-11ea-927e-005056370631

Master_Info_File: /data/mysql/data/master.info

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

Master_Retry_Count: 86400

Master_Bind:

Last_IO_Error_Timestamp:

Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set:

Executed_Gtid_Set:

Auto_Position: 0

Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:

1 row in set (0.00 sec)

48304ba5e6f9fe08f3fa1abda7d326ab.png

测试就主库创建一个数据库,去从库查看有无同步即可

按照上面的使M1和M2达到互为主从同步

配置keepalived高可用

M1 M2都需要安装

[root@mysql.bkone.quan.bbs ~]$yum install keepalived -y

先修改M1的配置文件:

[root@mysql.quan.bbs ~]$vim /etc/keepalived/keepalived.conf

global_defs {

router_id MYSQL_MM # 标识

vrrp_skip_check_adv_addr

vrrp_strict # 严格执行 VRRP 协议规范

vrrp_garp_interval0vrrp_gna_interval0}

vrrp_script check_mysql {

script"/bin/sh /etc/keepalived/keepalived_mysql_check.sh"# 检查脚本

interval10# 检查周期

}

vrrp_instance MYSQL_MM {

state BACKUP # 都设为 BACKUP,避免起来后抢占interfaceeth0 # 网卡名称,根据实际情况填写

virtual_router_id222 # 用来区分 VRRP 组播的标记,取值 0-255priority100advert_int1nopreempt # 设为非抢占

authentication {

auth_type PASS

auth_pass1111}virtual_ipaddress {192.168.111.123}

# Slave 节点可以注释下面检查脚本,Slave 没有必要一直检查

track_script {

check_mysql

}

}

M2的配置文件: 主要修改

virtual_router_idnopreempt priority

global_defs {

router_id MYSQL_MM # 标识

vrrp_skip_check_adv_addr

vrrp_strict # 严格执行 VRRP 协议规范

vrrp_garp_interval0vrrp_gna_interval0}

vrrp_script check_mysql {

script"/bin/sh /etc/keepalived/keepalived_mysql_check.sh"# 检查脚本

interval10# 检查周期

}

vrrp_instance MYSQL_MM {

state BACKUP # 都设为 BACKUP,避免起来后抢占interfaceeth0 # 网卡名称,根据实际情况填写

virtual_router_id223 # 用来区分 VRRP 组播的标记,取值 0-255priority99advert_int1# nopreempt # 设为非抢占

authentication {

auth_type PASS

auth_pass1111}

virtual_ipaddress {192.168.111.123}

# Slave 节点可以注释下面检查脚本,Slave 没有必要一直检查

track_script {

check_mysql

}

}

M1 M2都需要编写检测脚本:

#!/bin/bash

counter=$(netstat -an|grep "LISTEN"|grep "3306"|wc -l)if [ "${counter}" -eq 0]; then/etc/init.d/keepalived stop

fi

测试:

#M1未关闭

[root@mysql.quan.bbs ~]$mysql -u bbs_slave -h 192.168.111.123 -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection idis 648Server version:5.7.29-log Source distribution

Copyright (c)2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracleis a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type'help;' or '\h' for help. Type '\c'to clear the current input statement.

mysql> show variables like 'hostname';+---------------+----------------+

| Variable_name | Value |

+---------------+----------------+

| hostname | mysql.quan.bbs |

+---------------+----------------+

1 row in set (0.00sec)

mysql>exit

Bye

#M1关闭

[root@mysql.quan.bbs~]$service mysqld stop

Shutting down MySQL........... SUCCESS![root@mysql.quan.bbs~]$mysql -u bbs_slave -h 192.168.111.123 -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection idis 105Server version:5.7.29-log Source distribution

Copyright (c)2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracleis a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type'help;' or '\h' for help. Type '\c'to clear the current input statement.

mysql> show variables like 'hostname';+---------------+----------------------+

| Variable_name | Value |

+---------------+----------------------+

| hostname |mysql.bkone.quan.bbs |

+---------------+----------------------+

1 row in set (0.01sec)

mysql>exit

Bye

#M1 重新开始

[root@mysql.quan.bbs~]$service mysqld start

Starting MySQL. SUCCESS![root@mysql.quan.bbs~]$mysql -u bbs_slave -h 192.168.111.123 -p

Enter password:

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection idis 107Server version:5.7.29-log Source distribution

Copyright (c)2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracleis a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type'help;' or '\h' for help. Type '\c'to clear the current input statement.

mysql> show variables like 'hostname';+---------------+----------------------+

| Variable_name | Value |

+---------------+----------------------+

| hostname | mysql.bkone.quan.bbs |

+---------------+----------------------+

1 row in set (0.00 sec)

原理解析:

】双主KeepAlived

【4.0】概念

MySQL的高可用方案有很多,比如Cluster、MMM、MHA、DRBD,以及Oracle官方推出的Fabric等,这些方案各有优劣,但都比较复杂,安装配置有一定难度,对线上库实施动静太大。就我们的具体情况而言,并不需要这么复杂的环境,实施简单、对现有架构影响最小、能迅速解决问题的方案才是最适合的。比如我们现在只是配置了MySQL Replication,加上如Keepalived这样的高可用软件,就能实现我们的需求。

MySQL架构为Master/Slave,当Master故障时,虚IP漂移到Slave上提供服务,简单环境如图1所示。在这种架构中,故障自动切换以后,需要采取手动操作的方式与新的Master进行复制。当然也可以设置为Active-Passive模式下的双Master复制。

6a119f14c04fc24227d36039ea8f3ff0.png

利用KeepAlived实现故障转移(功能上类似于MSSQL的镜像,形式上类似于windows的故障转移群集)

【4.1】keepalived 简介

(4.1.1)起源

keepalived软件起初是专门为了LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后台又加入了可以实现高可用的VRRP功能。(VRRP:全称 virtual router redundancy protocol,虚拟路由冗余协议)

因此Keepalived除了能够管理LVS软件外,还可以作为其他服务(如:Nginx/Haproxy/Mysql)的高可用解决方案软件;

(4.1.2)实现与组成

keepalived 软件主要是通过VRRP协议实现高可用功能的。

VRRP是 virtual route redundancyProtocol(虚拟路由器荣誉协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题,它能够保证当个别节点宕机时,整个网络可以不间断的运行。

(4.1.3)常见运作场景

一个web服务器至少有2台PC运行Keepalived,一台作为主服务器(master),一台作为备份服务器(Backup),但是对外表现为一个虚拟IP,在Keepalived服务政策工作时,主Master节点会不断地向备节点发送(多播的方式,组播地址为224.0.0.18)心跳消息,用以告诉备节点自己还活着。

当主Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续监测到来自主Master节点的心跳,于是调用自身接管程序,接管主Master节点的IP资源及服务。

而当主Master节点恢复时,备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。(抢占模式)(也可以设置成非抢占模式,让其保持主,而不释放资源给原主,具体见4.1.7)

所以,keepAlived,一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能,而且Keepalived是可以工作在网络的 Layer3,4&7,即网络层(IP层),传输层(TCP层),及应用层,再后面就直接在很多场景下代替了原始的LVS软件方案。

(4.1.4)keepalived服务的三个重要功能

(1)管理LVS负载均衡软件

(2)实现LVS集群节点的健康检查

(3)作为系统网络服务的高可用性(failover)

(4.1.5)Keepalived服务的工作原理

Keepalived服务对之间通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的(有点像故障转移群集中的投票仲裁形式),主的优先级高于备,因此工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外服务。

在Keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用(也就是备没有受到VRRP广播包信息),就会启动相关服务接管资源,保证业务的连续性,接管速度最快可以小于1秒。

(4.1.6)keepalived 的三个核心模块

分别是core/check/vrrp

core:keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。

check:负责健康检查,包括常见的各种检查方式。

vrrp:是用来实现VRRP协议的;(VRRP:全称 virtual router redundancy protocol,虚拟路由冗余协议)

(4.1.7)什么是VRRP?

VRRP,全称 virtual router redundancy protocol,虚拟路由冗余协议。

VRRP的出现就是为了解决静态路由的单点故障问题,VRRP是通过一种竞选机制来将路由的任务交给某台VRRP路由器的。

(1)VRRP是怎么解决通信问题的?

在现实的网络环境中,两台需要通信的主机(end-host)大多数情况下并没有直接地物理连接。对于这样的情况,它们之间的路由怎么选择?通常有两种方法解决如何选定到达目的主机的下一跳路由问题:

使用动态路由协议,如RIP、OSPF等。

配置静态路由。

很明显,在主机上配置动态路由,因为管理、维护成本以及是否支持等诸多问题是不切实际的。那么配置静态路由就变得很流行。

实际上,这种方式一直沿用至今。但是,路由器,或者说默认网关(default gateway)却经常成为单故障点。就算配置了多个静态路由,却因为必须重启网络才能生效而变得不实用。

VRRP(虚拟路由冗余协议,Virtual Router Redundancy Protocol)的目的就是为了解决静态路由单点故障问题。

它通过一种竞选(election)协议动态地将路由任务交给LAN中虚拟路由器中的某台VRRP路由器。这里有两个关键名词:VRRP路由器和虚拟路由器。

VRRP路由器:VRRP路由器就是一台路由器,只不过上面运行了VRRPD程序来实现VRRP协议而已,是物理的路由器。一台VRRP路由器可以位于多个虚拟路由器中。

虚拟路由器:所谓虚拟,就是说并不是实际存在的,是一个逻辑而不是物理的路由器。

虚拟路由器通常由多台VRRP路由器通过某种方式组成,就好像将这些物理路由器都丢到一个池里面去,整个池对外看起来就像是一台路由器,但其实内部有多台。虚拟路由器的标识称为VRID。

在一个VRRP虚拟路由中,有多台物理的VRRP路由器,但是这多台物理路由并不同时工作,而是由一台称为master的负责路由工作,其它的都是backup。

master并非一成不变,VRRP协议让每个VRRP路由器参与竞选,最终获胜的就是master。master有一些特权,比如拥有虚拟路由器的IP地址,我们的主机就是用这个IP地址作为静态路由的。

拥有特权的master要负责转发发送给网关地址的包和响应ARP请求。

(2)VRRP的工作机制

VRRP通过竞选协议来实现虚拟路由器的功能,所有的协议报文都是通过IP多播(multicast)包形式发送的,多播地址为224.0.0.18。虚拟路由器由VRID(范围0-255)和一组IP地址组成,对外表现为一个众所周知的MAC地址:00-00-5E-00-01-{VRID}。所以,在一个虚拟路由器中,不管谁是master,对外都是相同的MAC和IP(称之为VIP)。客户端主机并不需要因为master的改变而修改自己的路由配置,对它们来说,这种主从的切换是透明的。

在一个虚拟路由器中,只有作为master的VRRP路由器会一直发送VRRP广告包(VRRP Advertisement Message),backup不会抢占master,除非它的优先级更高。

当master不可用时,backup收不到广告包,多台backup中优先级最高的这台会抢占为master。这种抢占是非常快速的(<1秒),以保证服务的连续性。出于安全性考虑,VRRP包使用了加密协议进行加密

(3)keepalived的实现模式

Keepalived通过组播(默认)、单播(自定义),实现keepalived主备推选,工作模式分为抢占和非抢占。

《1》抢占模式

主服务器正常工作时,虚拟IP会在主上,备不提供服务,当主服务优先级低于备的时候,备会自动抢占虚拟IP,这时,主提供服务,备提供服务。

也就是说,抢占模式下,不分主备,只管优先级。

不管 keepalived.conf 里的 state 配置成 master 还是 backup ,只看谁的priority 优先级高, priority 优先级高的那一个,在故障恢复后,会自动将VIP资源再次抢回来。

《2》非抢占模式

这种方式通过参数nopreempt(一般设置在advert_int 的那一行下面)来控制。不管priority优先级,只要master机器发生故障,VIP资源就会被切换到backup上。

并且,当master机器恢复后,也不会将VIP资源抢回来。除非Backup机器发生故障,才能自动把VIP等资源切换会主库。

nopreempt 这个参数只能用户state为backup的情况,所以在配置的时候要把master和backup的state都设置成backup,这样才会实现keepalived的非抢占模式!

也就是说

a)当state状态一个为master,一个为backup的时候,加不加nopreempt 这个参数都是一样的效果。

即都是根据priority优先级来决定谁抢占VIP资源,属于抢占模式!

b)当state状态都设置成backup,如果不配置nopreempt参数。

也是根据priority优先级来决定谁抢占VIP资源,属于抢占模式!

c)当state状态都设置成backup,如果配置了 nopreempt 参数,那么久不会去考虑priority优先级了。

是非抢占模式! 即只有VIP当前所在机器发生故障,另一台机器才能接管VIP。 不考虑优先级问题。

【4.2】Keepalived在MySQL上有什么作用?

mysql双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备。

但一个Master宕机后不能实现动态切换,使用Keepalived,可以通过虚拟IP,实现双主对外的统一接口以及自动检查、失败切换机制,从而实现MySQL数据库的高可用方案。

《1》架构1:主备集群架构(双主HA+keepalived)

方案:mysql 双主 或者 主从+keepalived 主从自动切换

服务器:2台PC

优点:架构简单,节省资源

缺点:无法线性扩展,主从失败后需要手动恢复主从架构

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值