环境介绍
mysql_VIP:192.168.111.123
mysql_M!:192.168.111.151
mysql_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状态:
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是后面需要用到的
导出以存在的数据并复制到从库(这里只列出一库)
[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
两个从库都需要设置的
导入接受到的数据文件:
[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
修改配置文件:
主要加入这些
#开启二进制日志并指定位置
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)
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)
注意:有些数据是主库拿到的,master_log_file master_log_pos
启动slave并查看状态:
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)
测试就主库创建一个数据库,去从库查看有无同步即可
按照上面的使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_interval 0
vrrp_gna_interval 0
} vrrp_script check_mysql {
script "/bin/sh /etc/keepalived/keepalived_mysql_check.sh" # 检查脚本
interval 10 # 检查周期
} vrrp_instance MYSQL_MM {
state BACKUP # 都设为 BACKUP,避免起来后抢占
interface eth0 # 网卡名称,根据实际情况填写
virtual_router_id 222 # 用来区分 VRRP 组播的标记,取值 0-255
priority 100
advert_int 1
nopreempt # 设为非抢占
authentication {
auth_type PASS
auth_pass 1111
} virtual_ipaddress {
192.168.111.123
} # Slave 节点可以注释下面检查脚本,Slave 没有必要一直检查
track_script {
check_mysql
}
}
M2的配置文件: 主要修改
virtual_router_id nopreempt priority
global_defs {
router_id MYSQL_MM # 标识
vrrp_skip_check_adv_addr
vrrp_strict # 严格执行 VRRP 协议规范
vrrp_garp_interval 0
vrrp_gna_interval 0
} vrrp_script check_mysql {
script "/bin/sh /etc/keepalived/keepalived_mysql_check.sh" # 检查脚本
interval 10 # 检查周期
} vrrp_instance MYSQL_MM {
state BACKUP # 都设为 BACKUP,避免起来后抢占
interface eth0 # 网卡名称,根据实际情况填写
virtual_router_id 223 # 用来区分 VRRP 组播的标记,取值 0-255
priority 99
advert_int 1
# nopreempt # 设为非抢占
authentication {
auth_type PASS
auth_pass 1111
} 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 id is 648
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> show variables like 'hostname';
+---------------+----------------+
| Variable_name | Value |
+---------------+----------------+
| hostname | mysql.quan.bbs |
+---------------+----------------+
1 row in set (0.00 sec) 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 id is 105
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> show variables like 'hostname';
+---------------+----------------------+
| Variable_name | Value |
+---------------+----------------------+
| hostname | mysql.bkone.quan.bbs |
+---------------+----------------------+
1 row in set (0.01 sec) 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 id is 107
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> 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复制。
利用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
优点:架构简单,节省资源
缺点:无法线性扩展,主从失败后需要手动恢复主从架构