千家信息网

Centenos7.4下搭建mysql集群--mysql主主互备,keepalived高可用

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,mysql + keepalived环境搭建1.环境准备系统:Centenos7.4mysql版本 mysql-5.7.26-linux-glibc2.12-x86_64.tar.gzkeepaliv
千家信息网最后更新 2026年11月01日Centenos7.4下搭建mysql集群--mysql主主互备,keepalived高可用

mysql + keepalived环境搭建

1.环境准备
系统:Centenos7.4
mysql版本 mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
keepalived版本 keepalived-2.0.13.tar.gz
node1 :192.168.5.235
node2 :192.168.5.236
vip: 192.168.5.58 (最好是同一ip段,不然肯定会出现网络问题)
主机用户:具有sudo权限的test

2.mysql主主搭建
由于分配的虚拟机只有一个系统需要安装各种系统软件,磁盘也需要自己挂在
2.1磁盘分区
[test@host-192-168-5-235 ~]$sudo fdisk -l

Disk /dev/vda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000adb11

Device Boot Start End Blocks Id System
/dev/vda1 * 2048 1026047 512000 83 Linux
/dev/vda2 1026048 9414655 4194304 82 Linux swap / Solaris
/dev/vda3 9414656 41943039 16264192 83 Linux

Disk /dev/vdb: 536.9 GB, 536870912000 bytes, 1048576000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

[test@host-192-168-5-236 ~]$ sudo fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xf2a1312e.

Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-1048575999, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-1048575999, default 1048575999):
Using default value 1048575999
Partition 1 of type Linux and of size 500 GiB is set

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

分区格式化
[test@host-192-168-5-235 /]$ sudo mkfs -t ext3 /dev/vdb1
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
32768000 inodes, 131071744 blocks
6553587 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
4000 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

创建目录并挂载
[test@host-192-168-5-235 /]$ sudo mkdir /data
[test@host-192-168-5-235 ~]$ sudo mount /dev/vdb1 /data

开机自动挂载按照里边的格式增加
sudo vi /etc/fstab

2.2 mysql配置node1和node2相同的操作
查看
rpm -qa | grep -i mysql
rpm -qa | grep mariadb
删除(查出来的一个个全删了)
sudo rpm -e mariadb-libs-5.5.56-2.el7.x86_64 -nodeps
解压mysql安装包
[test@host-192-168-5-236 ~]$ tar -xvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz

将目录属主和组更改为test为了方便并赋予777权限
sudo chown test:test -R /data/
chmod 777 /data/
cd /data/
mkdir mysql
cd /data/mysql/
创建数据目录,日志目录,pid目录
mkdir data logs run

将mysql软件放在/usr/local/下
cd /usr/local/
sudo mkdir mysql
sudo chown test:test ./mysql/
cd /data
mv mysql-5.7.26-linux-glibc2.12-x86_64/* /usr/local/mysql/
删除空目录
rm mysql-5.7.26-linux-glibc2.12-x86_64/

编辑mysql配置文件node1
sudo vi /etc/my.cnf
[mysqld]
port=9060
datadir=/data/mysql/data
socket=/data/mysql/data/mysql.sock

server-id=1
log-bin=mysql-bin
symbolic-links=0
[mysqld_safe]
log-error=/data/mysql/logs/mysql.log
pid-file=/data/mysql/run/mysql.pid
[client]
default-character-set=utf8
socket=/data/mysql/data/mysql.sock

[mysql]
default-character-set=utf8
socket=/data/mysql/data/mysql.sock

vi .bash_profile

PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/mysql/bin
export PATH
source .bash_profile
初始化
mysqld --initialize --user=test --datadir=/data/mysql/data

安全启动:
mysqld_safe --user=test &

用初始化生成的root密码登录并更改密码
mysql -uroot -p
set password=password("123456");
flush privileges;

编辑mysql配置文件node2
sudo vi /etc/my.cnf
[mysqld]
port=9060
datadir=/data/mysql/data
socket=/data/mysql/data/mysql.sock

server-id=2
log-bin=mysql-bin
symbolic-links=0
[mysqld_safe]
log-error=/data/mysql/logs/mysql.log
pid-file=/data/mysql/run/mysql.pid
[client]
default-character-set=utf8
socket=/data/mysql/data/mysql.sock

[mysql]
default-character-set=utf8
socket=/data/mysql/data/mysql.sock

vi .bash_profile


PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/mysql/bin
export PATH
source .bash_profile
初始化
mysqld --initialize --user=test --datadir=/data/mysql/data

安全启动:
mysqld_safe --user=test &

用初始化生成的root密码登录并更改密码
mysql -uroot -p
set password=password("123456");
flush privileges;

配置主从
主节点(192.168.5.235)
创建同步用户
CREATE USER 'sync'@'%' IDENTIFIED WITH mysql_native_password BY 'sync@123456';
GRANT REPLICATION SLAVE ON *.* TO 'sync'@'%';
flush privileges;
show master status;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 997 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

备节点(192.168.5.236)
CHANGE MASTER TO MASTER_HOST='192.168.5.235', MASTER_USER='sync', MASTER_PASSWORD='sync@2019#Zy',MASTER_PORT=9060,MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=997;
start slave;
# 停止 stop slave
# 重置 reset slave

mysql> show slave status\G

反过来配置一遍
原备节点(192.168.5.236)
创建同步用户
CREATE USER 'sync'@'%' IDENTIFIED WITH mysql_native_password BY 'sync@123456';
GRANT REPLICATION SLAVE ON *.* TO 'sync'@'%';
flush privileges;
show master status;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 997 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
原主节点(192.168.5.235)

CHANGE MASTER TO MASTER_HOST='192.168.5.236', MASTER_USER='sync', MASTER_PASSWORD='sync@2019#Zy',MASTER_PORT=9060,MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=997;
start slave;
# 停止 stop slave
# 重置 reset slave

mysql> show slave status\G
看到两个YES,代表主主成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

赋予root用户远程访问(为了远程访问root用户)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' identified by 'otn@2019#zy';
flush privileges;

测试:
创建数据库
create database test;
创建普通用户
CREATE USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
grant all privileges on test.* to 'test'@'%';
grant all privileges on mysql.* to 'test'@'%';
flush privileges;
查看数据库
show databases;
查看用户
select user,host from mysql.user;
创建表
create table testa( Id varchar(100));
两边都能看到testa表
show tables;
插入语句
insert into testa values('1231');
insert into testa values('4567');
insert into testa values('5464');
另一个数据库都能看到
select * from testa;
delete from testa where Id='1231';
另一个数据库数据显也被删除
至此,mysql主主已经完全配置成功。

3.Keepalived安装
安装相关的系统环境(必须是root用户或者sudo用户)
yum -y install gcc openssl-devel openssl ipvsadm
yum -y install libnl libnl-devel (支持ipv6)

[test@host-192-168-5-235 ~]$ tar -xvf keepalived-2.0.13.tar.gz
cd keepalived-2.0.13
sudo ./configure --prefix=/usr/local/keepalived --安装到/usr/local/keepalived
sudo make && sudo make install

cd /etc
mkdir keepalived
sudo cp -r /data/keepalived-2.0.13/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
sudo cp -r /data/keepalived-2.0.13/keepalived/etc/init.d /etc/rc.d/init.d/keepalived
sudo cp /data/keepalived-2.0.13/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived

keepalived.conf 配置内容:#清空默认内容,直接采用下面配置
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs { #全局配置标识,表明这个区域{}是全局配置
notification_email {
xxx@xxx #表示发送通知邮件时邮件源地址是谁
}
notification_email_from xxx@xxx #表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个,每行一个notification_email_from xxx@xxx
smtp_server 127.0.0.1 #表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现
smtp_connect_timeout 30 #连接smtp连接超时时间
router_id host-192-168-5-235 #机器标识
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}

vrrp_script chk_mysql_port { #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
script "/root/chk_mysql.sh" #这里通过脚本监测
interval 2 #脚本执行间隔,每2s检测一次
weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
}

vrrp_instance VI_1 {
state MASTER
interface eth0 #主机网卡
mcast_src_ip 192.168.5.235 #主机ip
virtual_router_id 35 #路由器标识,MASTER和BACKUP必须是一致的
priority 101 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.5.58
}
track_script {
chk_mysql_port
}
}

bakcup主机上的keepalived配置

vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
notification_email {
xxx@xxxx
}
notification_email_from xxx@xxxx
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id host-192-168-5-236
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0
}

vrrp_script chk_mysql_port {
script "/root/chk_mysql.sh"
interval 2
weight -5
fall 2
rise 1
}

vrrp_instance VI_1 {
state BACKUP
interface eth0
mcast_src_ip 192.168.5.236
virtual_router_id 35
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.5.58
}

track_script {
chk_mysql_port
}
}

[test@host-192-168-5-227 data]$ cd /root
[test@host-192-168-5-227 root]$ vi chk_mysql.sh

#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "9060"|wc -l)
if [ "${counter}" -eq 0 ]; then
service keepalived stop
fi

启动
shell> sudo systemctl enable keepalived.service #设置开机自动启动
shell> sudo service keepalived start #启动服务
shell> sudo service keepalived stop #停止服务
shell> sudo service keepalived restart #重启服务

验证登录
mysql -h292.168.5.58 -P9060 -uroot -p123456 可以登录
mysql -h292.168.5.235 -P9060 -uroot -p123456
mysql -h292.168.5.236 -P9060 -uroot -p123456

MySQL启动与关闭

1、查看mysql服务的两种方式

[root@localhost bin]ps -ef|grep mysql

[root@localhost bin]netstat -nlp

2、启动服务的两种方式

命令行方式

[root@localhost bin]cd /usr/bin

[root@localhost bin]./mysqld_safe &

服务方式

[root@localhost ~]service mysql start

如果服务在启动状态,直接重启服务用以下命令:

[root@localhost ~]service mysql restart

3、关闭服务的两种方式

命令行方式:

[ root@localhost ~]mysqladmin -u root shutdown

服务方式:

[root@localhost ~]service mysql stop


遇到的问题
此时发现问题使用vip在主节点可以但是再备节点和其他同段的主机不能正常访问,
在备节点(或其他节点)ping vip 只能ping通9次
初步怀疑是网络问题,但是网络侧那边说限制放开了
我测试ping通9次,vip对应hwaddress没有获取我手动添加就能ping通,理论上应该是自动获取的,
手动添加没有意义,如果vip漂移了那还是不能访问了
最后折腾了两周在自己虚拟机同样的配置访问都没有问题,
这次找到虚拟化的同事咨询这个问题,他们从底层放开网络限制好了

服务 配置 用户 优先级 方式 节点 数据 问题 检测 主机 目录 脚本 成功 地址 密码 数据库 系统 网络 邮件 登录 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技 南京欣网互联网络科技有限公司 互联网扶贫科技 网络科技有限互联网 互联网科技有限公司 翻译 四个字互联网科技公司取名 互联网之后的科技是什么 随着互联网科技发展 互联网科技有哪些公司 厦门比较好的科技互联网公司 赶超互联网科技 微信多开 晓花互联网科技有限公司网址 本届互联网博览会上的黑科技 烟台灵鸽互联网科技有限公司 互联网科技数字货币 新氧科技和美国互联网有关系吗 河南商务圈互联网科技有限公司 东风日产互联网科技公司叫什么 如何强化互联网金融科技 互联网 科技节活动 微视频大赛 上海喔噻互联网科技有限公司 金融科技创新监管互联网金融 互联网经济与金融科技 山东子淼互联网科技有限公司 四川互联网展示科技馆设计 上海乐五互联网科技有限公司 亚光科技低轨卫星互联网 华人运通互联网科技公司 青岛互联网科技园 互联网科技企业文化
0