MySQL双主+keepalived实现高可用
文章目录
一、环境准备
操作系统:CentOS 7.6
数据库:MySQL 5.7.26社区版
keepalived:1.4.5
Service1:192.168.5.130 安装MySQL+keepalived
Service2:192.168.5.131 安装MySQL+keepalived
VIP:192.168.5.125
时钟同步
//1.下载安装时钟同步依赖包
# yum install ntp
//2.将ntp设置为默认启动
# systemctl enable ntpd
//3.修改启动参数,允许ntp在系统时间误差较大时仍能工作
# vi /etc/sysconfig/ntpd
# Command line options for ntpd
OPTIONS="-g"
修改为:
OPTIONS="-g -x"
//4.将系统时间设置为上海时区
# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
//5.查看时间
# date
二、环境部署–MySQL
1.解压MySQL安装包
下载的MySQL 5.7.26社区版安装包是tar文件,解压
# tar vxf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
2.检查MariaDB
//在安装MySQL数据库之前先检查CentOS是否自带MariaDB
# rpm -qa|grep maria*
//存在即卸载
# yum -y remove maria*
//如果不是root权限用户登录,执行上面方法时会提示请使用root权限操作
//删除完成后再次查看,已经没有了
//如果yum命令卸载失败,可以直接使用rpm命令强制删除
# rpm -e -nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
3.安装MySQL
先安装MySQL需要的依赖
# yum install net-tools
# yum install -y gcc* make automake ncurses-devel cmake
安装完依赖后安装MySQL(之前解压的rpm文件)
# rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
# rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
# rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
# rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
4.检查安装
启动MySQL,查看是否安装成功
// 启动server mysqld start 或 systemctl start mysqld
# server mysqld start
// 查看状态 server mysqld status 或 systemctl status mysqld
# server mysqld status
// 停止 server mysqld stop 或 systemctl stop mysqld
5.配置双主
先将MySQL进程停止 server mysqld stop ,并在130和131两个服务下修改/etc/my.cnf 文件 vi /etc/my.cnf
server1:
server_id = 1
binlog-ignore-db = mysql
log-bin = mysql-bin
binlog_cache_size = 1M
binlog_format = mixed
expire_logs_days = 7
slave_skip_errors = 1062
relay_log = edu.mysql-relay-bin
log_slave_updates = 1
auto_increment_increment = 2
auto_increment_offset = 1
server2:
server_id = 2
binlog-ignore-db = mysql
log-bin = mysql-bin
binlog_cache_size = 1M
binlog_format = mixed
expire_logs_days = 7
slave_skip_errors = 1062
relay_log = edu.mysql-relay-bin
log_slave_updates = 1
auto_increment_increment = 2
auto_increment_offset = 2
修改完成后重启MySQL
6.修改密码
安装完成MySQL后,会在 /var/log/mysqld.log文件中生成一个随机的初始密码
# cat /var/log/mysqld.log|grep -n password
如图所示,mQgtTJhmf5.9就是生成的初始密码
// 使用初始密码进入sql命令
# mysql -uroot -p
Enter password: {将随机密码复制粘贴进来}
mysql>
// 修改root账号的密码
mysql> alter user 'root'@'localhost' identified by '123456';
ERROR 1819(HY000): Your password does not satisfy the current policy requirements
// 报错提示:密码强度不符合校验规则(必须要包含数字、大小写字母和特殊字符)
// 可以按照检验规则修改密码或者修改密码的校验规则
mysql> set global validate_password_policy=0; // 0代表不做校验,默认值为1
mysql> set global validate_password_length=4; // 指定密码长度
//设置完成校验规则后再次修改密码
7.创建用户并赋予远程权限
// username和password替换为创建的用户和密码
mysql> grant all privileges on *.* to 'slave'@'%' identified by '123456';
mysql> flush privileges;
8.配置主服务器
// 在server1上执行
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000005 | 154 | | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
// 记录下File和Position的内容
// File -- mysql-bin.000005 Position -- 154
// 在server2中执行如下语句配置主服务
mysql> change master to master_host='192.168.5.130', //server1的IP
> master_user='slave',master_password='123456', //server1中建立的用户和密码
> master_log_file='mysqld-bin.000005',mysql_log_pos='154'; //之前记录的File和Position内容
mysql> slave start;
//同理,在server2中执行上述内容
//并在server1中配置主服务(注意替换成server2中查询到的乃荣)
9.验证设置
双主设置完成后,分别在server1和server2中执行:
mysql> show slave status\G
当Slave_SQL_Running和Slave_IO_Running都为Yes的时候,代表双主配置成功。
如果Slave_SQL_Running为Connecting时,检查3306默认端口是否开放。
10.设置开机启动
// 退出sql命令
mysql> exit;
//设置开机启动
# systemctl enable mysqld
# systemctl daemon-reload
三、环境部署–keepalived
1.下载文件
登录keepalived官网下载1.4.5版本文件 keepalvied-1.4.5.tar.gz
官网地址:https://www.keepalived.org/download.html
2.解压
将文件上传到 /usr/local/src 目录下并解压
# tar -zxvf keepalived-1.4.5.tar.gz
3.安装keepalived
// 进入解压后的文件夹
# cd /usr/local/src/keepalived1.4.5
// 通过yum安装依赖文件
# yum install gcc-c++ -y //安装MySQL后可不用执行该依赖
# yum -y install gcc //安装MySQL后可不用执行该依赖
# yum -y install openssl-devel
# yum -y install libnl libnl-devel
# yum -y install libnfnetlink-devel
# yum -y install net-tools //安装MySQL后可不用执行该依赖
# yum -y install vim
// 安装keepalived
// 生成makefile文件
# ./configure --prefix=/usr/local/keepalived
// 安装
# make && make install
4.配置文件
//keepalived启动脚本变量引用文件,默认文件路径是/etc/sysconfig/,也可以不做软链接,直接修改启动脚本中文件路径即可(安装目录下)
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
//将keepalived主程序加入到环境变量(安装目录下)
# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived
//keepalived启动脚本(源码目录下),放到/etc/init.d/目录下就可以使用server命令便捷调用
# cp /usr/local/src/keepalived-1.4.5/keepalived/etc/init.d/keepalived /etc/init.d/keepalived
//将配置文件放到默认路径下
# mkdir /etc/keepalived
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
5.设置开机启动
// 将keepalived设置为系统服务
# chkconfig -add keepalived
# chkconfig keepalived on
6.启动验证
# server keepalived start
Starting keepalived (via systemctl): [ 确定 ]
7.配置VIP
两个server都需要修改文件 /etc/keepalived/keepalived.conf
Server1:
! Configuration File for keepalived
global_defs {
router_id 1 #ID 两个服务器配置不一样的
}
vrrp_instance VI_1 {
state BACKUP #类型 都配置BACKUP即可 若配置为MASTER,后续的优先级即无用
interface ens33 #网卡
virtual_router_id 60 #vrid 默认51 建议修改一下,但两个server配置要相同
priority 100 #优先级 配置BACKUP是通过这个进行VIP漂移
#nopreempt #配置该属性,即为不抢占模式(即宕机重启后不会根据优先级抢夺回VIP)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.5.125 # 虚拟IP
}
}
virtual_server 192.168.5.125 3306 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.5.130 3306 { # 真实IP 端口
weight 1
notify_down /etc/keepalived/shutdown.sh # 检查脚本
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
Server2:
! Configuration File for keepalived
global_defs {
router_id 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 60
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.5.125
}
}
virtual_server 192.168.5.125 3306 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.5.131 3306 {
weight 1
notify_down /etc/keepalived/shutdown.sh
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
8.创建脚本
// 建立MySQL方式失败脚本:MySQL访问失败时,keepalived进程自动结束
// 建立脚本的目录和上面配置keepalived.conf中的检查脚本目录要一致
# vim /etc/keepalived/shutdown.sh
#! /bin/bash
pkill keepalived
// 执行启动权限命令
# chmod +x /etc/keepalived/shutdown.sh
9.开启vrrp协议
// 开启防火墙vrrp协议,防止双主两台服务器同时抢夺VIP
# firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --protocol vrrp -j ACCEPT
# firewall-cmd --reload
四、漂移测试
1.通过mysql验证
// 使用除130和131以外的一台服务器访问VIP验证
# mysql -h 192.168.5.125 -uslave -p123456
// 若能够登陆成功,则说明配置VIP成功
// 执行如下sql,查看当前VIP连接的是哪台服务器的mysql
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 1 |
+---------------+-------+
1 row in set (0.01 sec)
// 当前连接的server_id为1,server_id是在/etc/my.cnf中配置的
断开server1服务器上的MySQL、keepalived或者网络,再次查看server_id变为2
重启后,由于配置的keepalived.conf中未设置非抢占模式,且由于server1的优先级高,因此查询到的server_id又会变成1
2.通过ip验证
分别在两台服务器上查询ip信息
# ip addr
或
# ip a l
server1:
server2:
设置的VIP出现在server1的ip中,说明当前的Master是server1服务器
断开server1服务器上的MySQL、keepalived或者网络,再次查看ip信息时VIP出现在server2中
重启后,由于配置的keepalived.conf中未设置非抢占模式,且由于server1的优先级高,因此查询到的VIP又回到server1中
3.通过抓包验证
需要先下载抓包工具
// 下载并安装抓过工具
# yum install tcpdump
// 查询抓包信息
# tcpdump -i ens33 vrrp -n
每1秒,作为Master的服务器发送vrrp消息;断开服务后则发送IP变为另外一台服务器
4.通过日期验证
日志文件的目录 /var/log/message
先将两个服务器的keepalived断开并清除日志信息
完成日志信息清理后首先启动优先级(在keepalived.conf文件中配置)低的keepalived服务,查看message
由于配置文件中默认为BACKUP,所以启动时首先将自己默认设置为BACKUP,然而不存在MASTER发送消息,则将自己转换为Master并使用VIP。
启动另外一台优先级高的keepalived,查看message
虽然已经存在Master,但由于优先级关系,自动抢夺VIP。
再查看优先级低的message
由于优先级低,将自己转为BACKUP并交出VIP。
以上4种验证方式,均可通过停止MySQL服务、断网操作模拟服务器宕机,来验证VIP漂移。
五、注意事项
1.安装MySQL前要注意卸载CentOS自带的数据库,防止安装时发生冲突导致安装失败。
2.配置MySQL双主时,Slave_IO_Running和Slave_SQL_Running都为Yes时才表示配置成功。若有No或者Slave_IO_Running为Connecting时配置双主失败。
3.Keepalived要从官网下载源码包进行安装,不要通过yum安装。否则会造成keepalived报错自动停止。
4.Keepalived源码包上传至/usr/local/src 目录下进行解压,若放在其他位置下解压会造成启动失败,需要根据实际解压目录修改启动文件keepalived.server中的配置目录.
5.一定要开放防火墙的vrrp协议,否则会造成两台服务器同时对外发布VIP。
6.实际下载的keepalived版本为1.4.5,而图中部分截图中使用的是2.0.20版本。由于使用2.0.20版本的keepalived会造成脑裂,无法解决,因此转为更加稳定的1.4.5.
搭建过程就是上面这些了,在网上找了很多资料,看了好多的搭建文档,然后自己进行尝试,整理出上述内容。
如下内容是搭建过程中部分参考网站:
https://blog.csdn.net/yiyuf/article/details/40340895
https://blog.csdn.net/stubborn_cow/article/details/48155081
https://blog.csdn.net/u011409801/article/details/80521711
https://blog.csdn.net/m0_37328475/article/details/82684699
https://blog.csdn.net/nimasike/article/details/52463806
推荐阅读
-
MySQL双主+keepalived实现高可用
-
主数据库宕机怎么办?MHA高可用帮你实现主从服务器自动切换(详细操作与命令详解)
-
利用keepalived构建高可用MySQL-HA(转) 博客分类: DATABASE mysql集群
-
AWS 亚马逊云实现内网资源高可用(Keepalived broadcast失效的情况) 博客分类: keepalived高可用mysqlawsha awskeepalived高可用hamysql
-
MYSQL 主主热备高可用方案与实现 博客分类: mysql
-
keepalived-nginx-apache-mysql实现高可用、负载均衡的网站(上) NginxKeepalived
-
Keepalived+HAProxy实现MySQL高可用负载均衡的配置
-
Mysql之双向主从加keepalived高可用
-
利用Keepalived构建高可用的MySQL
-
Ubuntu下LVS + Keepalived 实现MySQL高可用负载均衡实现