MySQL双主热备与Keepalived高可用配置

文章发布时间:

最后更新时间:

文章总字数:
2.7k

预计阅读时间:
11 分钟

摘要

本文记录了MySQL双机互为主从,Keepalived高可用的本地模拟配置方式。
文章内还会包含少许其它配置时可能用到的操作。

说明

虚拟机系统:Ubuntu Server 22.04 LTS
虚拟机软件:VMware Workstation 17 版本号:17.0.0 build-20800274
MySQL版本:8.0.39-0ubuntu0.22.04.1
虚拟机1 IP:192.168.75.131
虚拟机2 IP:192.168.75.132

原理

配置

在配置之前建议为两台虚拟机配置不同的主机名便于区分并统一时区设置,配置方法见后文配置主机名和统一时区章节。

MySQL

1.首先确认MySQL已经安装并处于运行状态,打开MySQL:

1
sudo mysql

2.使用mysql数据库:

1
use mysql;

3.然后在两台主机上的MySQL中,分别为对方创建一个用户。该用户被授予REPLICATION SLAVE权限。
由于MySQL 8授权语句中不能出现IDENTIFIED BY ‘password’,因此创建用户和授予权限分开执行。

以2号机(192.168.75.132)为例:
I.创建用户 创建一个名为replicate,密码为repPass,仅允许192.168.75.131(1号机)登入的用户:

1
CREATE USER 'replicate'@'192.168.75.131' IDENTIFIED WITH 'mysql_native_password' BY 'repPass';

II.给予权限 给予replicate用户REPLICATION SLAVE权限:

1
GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'192.168.75.131';

1号机配置同理:

1
2
CREATE USER 'replicate'@'192.168.75.132' IDENTIFIED WITH 'mysql_native_password' BY 'repPass';
GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'192.168.75.132';

权限变更后,须更新权限信息:

1
flush privileges;

4.开启远程访问:

1
UPDATE user SET host='%' WHERE user='root';

允许 root 用户从任何主机连接到 MySQL 服务器,而不仅仅是从特定的主机。

5.更改绑定IP:
此时,若MySQL监听的只是127.0.0.1:3306则会导致其它服务器无法远程连接。这种情况需要修改MySQL的配置文件:

1
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

在配置文件中找到bind-address = 127.0.0.1这一项,在前面加#符号注释掉或改为bind-address = 0.0.0.0。
重新启动MySQL,更新修改后的监听IP:

1
sudo systemctl restart mysql

修改后,可以在一台虚拟机中使用工具查看另一台虚拟机上,该端口是否打开。工具的安装和使用见后文检测目标端口是否打开章节。

6.创建完成后可以通过尝试远程访问另一台主机:

1
2
mysql -h 192.168.75.131 -u replicate -prepPass
mysql -h 192.168.75.132 -u replicate -prepPass

测试通过,可以正常访问后继续进行下一步。

7.修改两台服务器MySQL的配置文件:

I.修改MySQL的配置文件:

1
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

在[mysqld]一节中,添加以下内容(以虚拟机1为例):

1
2
3
4
5
6
7
server-id=1 # 唯一id
innodb_flush_log_at_trx_commit=2 # 默认为1
log-bin=mysql-bin-1 #binlog日志文件名(可以任意命名)
#binlog-do-db=test # 记录日志的数据库(如果没有此项,表示同步所有的库)
binlog-ignore-db=mysql,information_schema,performance_schema,sys # 不记录日志的数据库
sync_binlog=1 #开启binlog日志同步功能
slave_skip_errors=1146 # 跳过1146错误

第二台服务器同理,注意修改唯一ID和日志文件名:

1
2
3
4
5
6
7
server-id=2 # 唯一id
innodb_flush_log_at_trx_commit=2 # 默认为1
log-bin=mysql-bin-2 #binlog日志文件名(可以任意命名)
#binlog-do-db=test # 记录日志的数据库(如果没有此项,表示同步所有的库)
binlog-ignore-db=mysql,information_schema,performance_schema,sys # 不记录日志的数据库
sync_binlog=1 #开启binlog日志同步功能
slave_skip_errors=1146 # 跳过1146错误

II.分别重启两台设备上的MySQL,应用修改后的配置文件

1
sudo systemctl restart mysql

8.打开MySQL,查看作为主服务器的状态

1
sudo mysql
1
show master status\G

成功示意:

1
2
3
4
5
6
7
8
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin-1.000001
Position: 157
Binlog_Do_DB:
Binlog_Ignore_DB: mysql,information_schema,performance_schema,sys
Executed_Gtid_Set:
1 row in set (0.00 sec)

9.修改同步位置:
修改虚拟机1,先停止slave服务线程:

1
stop slave;

然后执行

1
2
change master to master_host='192.168.75.132',master_user='replicate',
master_password='repPass',master_log_file='mysql-bin-2.000001',master_log_pos=157;

虚拟机2同理:

1
2
change master to master_host='192.168.75.131',master_user='replicate',
master_password='repPass',master_log_file='mysql-bin-1.000001',master_log_pos=157;

然后分别在两台服务器上启动从服务:

1
start slave;

查看从服务状态:

1
show slave status\G

在调试环境,若安装完MySQL之后使用虚拟机克隆功能,则会导致MySQL服务的UUID一同被复制,查看slave状态时就会出现IO错误,这种情况需要修改UUID。报错信息类似于下面:

1
2
Last_IO_Errno: 13117
Last_IO_Error: Fatal error: The replica I/O thread stops because source and replica have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

在其中一台虚拟机上打开储存有UUID的文件:

1
sudo vim /var/lib/mysql/auto.cnf

使用工具生成一个新的UUID,将文件中储存的UUID替换掉即可。

10.检验效果

在其中一台虚拟机中打开MySQL,手动输入一些测试数据:

1
2
3
4
create database test;
use test;
create table tb_test (id int,name varchar(20));
insert into tb_test(id,name) values (1, 'test');

在另一台虚拟机中打开MySQL,查询数据:

1
2
use test;
select * from tb_test;

可以查询到结果:

1
2
3
4
5
6
7
mysql> select * from tb_test;
+------+------+
| id | name |
+------+------+
| 1 | test |
+------+------+
1 row in set (0.00 sec)

Keepalived

1.首先为系统安装Keepalived

1
sudo apt install keepalived

2.接下来以虚拟机1为例,修改Keepalived配置

1
sudo vim /etc/keepalived/keepalived.conf

2.1文件默认为空,此时向里写入配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
global_defs {
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}

vrrp_script chk_mysql_port { #检测mysql服务是否运行
script "/opt/chk_mysql.sh" #通过脚本监测
interval 2
weight -5
fall 2
rise 1
}

vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 100
advert_int 1
nopreempt #不抢占模式,只有优先级高的机器上设置即可,优先级低的机器可不设置
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.250 #根据需要修改此处虚拟IP。两台机器的设置要一致
}
track_script {
chk_mysql_port
}}

2.2这里设置通过脚本检测MySQL的运行状态,此时设置脚本:

1
sudo vim /opt/chk_mysql.sh

2.3写入脚本内容:

1
2
3
4
5
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
/etc/init.d/keepalived stop
fi

2.4为脚本添加执行权限:

1
sudo chmod +x /opt/chk_mysql.sh

3.修改Keepalived服务的启动顺序,使其在MySQL服务启动后再启动:

1
sudo vim /lib/systemd/system/keepalived.service

服务的默认值中有一项After=network-online.target,在后面添加空格和mysql服务名,结果为After=network-online.target mysql.service
最后启动或重新启动Keepalived服务

1
2
sudo systemctl start keepalived
sudo systemctl restart keepalived

其它配置

配置主机名

多台机器进行配置时,更改不同的主机名有助于配置时进行区分。

1.使用hostnamectl对主机名进行修改:

1
sudo hostnamectl set-hostname <NewHostName>

将<NewHostName>替换为新主机名;新主机名不应包含空格、特殊字符或者大写字母。

2.编辑/etc/hosts文件,更新与127.0.0.1相关联的旧主机名:

1
sudo vim /etc/hosts

找到文件中127.0.0.1的项,将后面的旧主机名改为新主机名
3.重启系统

1
sudo reboot

统一时区

将系统的时区改到东八区:

1
sudo timedatectl set-timezone Asia/Shanghai

查看网络状态

查看网络状态可安装net-tools:

1
sudo apt install net-tools

安装后,可使用ifconfig指令查看包括IP地址在内的网络信息。

检测目标端口是否打开

在Ubuntu中,可以使用netcat(nc)工具来检查端口是否开放。netcat是一个非常强大的网络调试工具,可以用来监听端口、连接到某个端口、发送数据等。

安装netcat:

1
2
sudo apt-get update
sudo apt-get install netcat

检查端口是否开放的命令,以127.0.0.1:22为例:

1
nc -zv 127.0.0.1 22

如果端口开放:

1
Connection to 127.0.0.1 22 port [tcp/ssh] succeeded!

如果端口关闭:

1
nc: connect to 127.0.0.1 port 22 (tcp) failed: Connection refused

VMware workstation虚拟网络与Ubuntu静态IP配置

虚拟网络配置

1.通过虚拟网络编辑器编辑虚拟网络配置
打开VMware workstation中的虚拟网络编辑器,然后界面会提示需要管理员权限才能编辑配置。按照提示给予其管理员权限。
图片01

如图所示,虚拟网络编辑器中应自带一个NAT模式的VMnet,选中它。然后关闭下方的“使用本地DHCP服务将IP地址分配给虚拟机”,并根据实际需求编辑下方的子网和子网掩码。一般情况下,子网IP和子网掩码最后一段为0即可。然后点击右侧“NAT设置”

图片02

在此处需要修改子网的网关,最后一段设置为.2即可。VMnet默认已经占用了.1的IP,如果需要将网关设置为.1则需要在之后修改Windows网络适配器设置。
最后保存设置即可

2.编辑Windows网络适配器配置

图片03

在“网络和Internet”设置界面中找到对应的适配器,修改“属性”中的“Internet协议版本4”。IP最后一段默认应该为.1,此处便是上面说的VMnet默认占用的.1的IP。这个IP可以进行修改,需要在这个IP段内,并且不与网关或者其他设备IP重复。子网掩码、网关地址均与前面在虚拟网络编辑器中设置的子网掩码和网关IP地址一致。

3.编辑Ubuntu网络配置

1
sudo vim /etc/netplan/01-network-manager-all.yaml

文件夹里面可能会默认带着50-cloud-init.yaml文件,这类配置文件文件的命名格式均类似于此。第一个横杠前面的数字代表该配置文件的优先级,数字越小优先级越高,高优先级的配置会覆盖掉低优先级的配置。后面的命名可以自定义。

1
2
3
4
5
6
7
8
9
10
11
12
network:
ethernets:
ens32: # 修改为你需要的连接。可通过ifconfig命令查看,该指令需要安装net-tools
addresses: [192.168.76.131/24] # 更换为你需要的设备静态IP地址和掩码
routes: # 设置网关。部分教程会使用“gateway4”代替,在应用配置时netplan会提示gateway4已经被弃用
- to: default
via: 192.168.76.2 # 网关地址
dhcp4: false # 禁用dhcp
nameservers:
addresses: [223.5.5.5, 114.114.114.114] # 设置主、备DNS
version: 2
renderer: networkd # 设置网络管理工具,可填写NetworkManager、networkd,对应不同的网络管理工具。这里发现前者不自带,故填写后者

在编写配置文件时需严格注意缩进,且每个冒号后面都有空格。
编辑完成后重新加载配置文件并应用:

1
sudo netplan apply