概述
采用了MySQL+KeepAlived实现MySQL高可用,旨在当主机发生宕机等异常情况时,使用备机的MySQL服务,以此保证系统服务的高可用。这套环境的搭建过程中,需要注意的事项如下:
1、MySQL是否数据同步(在大批量数据写入的情况下,数据没有同步将导致MySQL主从备份失效)
2、Keepalived产生的虚拟IP是否生效,是否可以正常切换。
环境说明
操作系统:CentOS8
MySQL:5.7.24
Keepalived: keepalived-2.0.18
准备两台以上的服务器或者虚拟机,保证它们相互之间能够正常通信
我准备了两台分别是:192.168.20.200 192.168.20.201
MySQL安装
1、下载MySQL的安装包
网络正常的情况下:
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
网络不通的情况可采用ftp上传 tar包
2、安装部署
#解压
tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz
#重命名
mv mysql-5.7.24-linux-glibc2.12-x86_64 mysql5.7.24
#移动到/usr/local/,这里一般为软件安装的目录
mv mysql5.7.24/ /usr/local/
#进入mysql5.7.24的安装目录新建data目录
cd /usr/local/mysql5.7.24
#创建data目录
mkdir data
#更改mysql目录下的所有目录的权限及用户组,如果用户组不存在,请使用useradd mysql命令
chown -R mysql:mysql /usr/local/mysql5.7.24
chmod 765 /usr/local/mysql5.7.24
#编译安装并初始化mysql,务必记住初始化输出日志末尾的密码(数据库管理员临时密码)
cd /usr/local/mysql5.7.24/bin
./mysqld --initialize --user=mysql --datadir=/usr/local/mysql5.7.24/data --basedir=/usr/local/mysql5.7.24
3、编译完成,注意保存临时密码
4、编辑配置文件
vim /etc/my.cnf
#添加如下配置
[mysqld]
basedir=/usr/local/mysql5.7.24 #mysql默认安装在/usr/local/mysql
datadir=/usr/local/mysql5.7.24/data
port=3306
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
symbolic-links=0
max_connections=600
innodb_file_per_table=1
lower_case_table_names=1
character_set_server=utf8
log-bin=mysql-bin
server-id=200 #作为主从集群的唯一标识,用ip地址的最后一组数据标识
参数说明:
lower_case_table_names:是否区分大小写,1表示存储时表名为小写,操作时不区分大小写;0表示区分大小写;不能动态设置,修改后,必须重启才能生效:
character_set_server:设置数据库默认字符集,如果不设置默认为latin1
innodb_file_per_table:是否将每个表的数据单独存储,1表示单独存储;0表示关闭独立表空间,可以通过查看数据目录,查看文件结构的区别;
5、启动MySQL Server服务器
/usr/local/mysql5.7.24/support-files/mysql.server start
#添加软链接,并重启mysql服务
ln -s /usr/local/mysql5.7.24/support-files/mysql.server /etc/init.d/mysql
ln -s /usr/local/mysql5.7.24/bin/mysql /usr/bin/mysql
service mysql restart
如果出现了 ERROR! MySQL server PID file could not be found! 错误。解决方案操作如下
#把SELINUX=enforcing改为SELINUX=disabled 重启MySQL服务
vim /etc/selinux/config
6、登录MySQL修改密码、开放远程连接
注意:输入的密码是图1保存的临时密码
#修改密码
set password for root@localhost = password('yourpass');
#开放远程连接
mysql>use mysql;
msyql>update user set user.Host='%' where user.User='root';
mysql>flush privileges;
#设置开机自启动
#将服务文件拷贝到init.d下,并重命名为mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
#赋予可执行权限
chmod +x /etc/init.d/mysqld
#添加服务
chkconfig --add mysqld
#显示服务列表
chkconfig --list
至此,MySQL5.7.24 安装完成,在其他的服务器或虚拟机上按照同样的方式进行安装部署。注意配置文件中server-id不能相同。
主从集群配置
环境说明:
两台虚拟机:虚拟机IP192.168.20.200,192.168.20.201
使用数据库友好界面工具Navicat 连接两台MySQL服务器,进行主从配置。
192.168.20.200节点为201节点创建用户并授权
#创建用户
CREATE USER 'slave'@'192.168.20.201' IDENTIFIED BY '123456';
#为用户授权
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.20.201';
#刷新权限
flush privileges;
结果如下: 记住File和Position两个参数
接下来在192.168.20.201节点进行配置:
配置步骤如下:
1、连接MySQL数据库
2、执行如下图所示的SQL脚本,注意需要修改Position和File
#配置201节点的master为200,master_user为我们授权的用户
CHANGE MASTER TO MASTER_HOST='192.168.20.200', MASTER_USER='slave',MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000019', MASTER_LOG_POS=488
#201开启slave工作模式
START SLAVE;
参数说明:
MASTER_HOST: MASTER节点的IP地址
MASTER_USER: MASTER上MySQL创建的用户
MASTER_PASSWORD: 该用户所对应的密码
MASTER_LOG_FILE : MYSQL开启的日志类型
192.168.20.201节点进行同样的配置
执行show slave status;如果Slave_IO_Running 和 Slave_SQL_Running 均为yes,则主从备份搭建成功。
常用指令:
#查看master状态
show master status;
#开启slave模式
start slave;
#停止slave模式
stop slave;
MySQL主从备份测试
192.168.20.200 | 192.168.20.201 | 预期结果 | 测试结果 |
---|---|---|---|
添加数据库 | 不做操作 | 201同步添加 | 与预期结果一致 |
不做操作 | 添加数据库 | 200同步添加 | 与预期结果一致 |
创建表 | 不做操作 | 201同步创建 | 与预期结果一致 |
不做操作 | 创建表 | 200同步创建 | 与预期结果一致 |
插入数据 | 不做操作 | 201同步插入 | 与预期结果一致 |
不做操作 | 插入数据 | 200同步插入 | 与预期结果一致 |
高可用双主热备宕机自动切换演练
通常说的「双机热备」是指两台机器都在运行,但并不是两台机器都同时在提供服务。当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短。
Keepalived的工作原理是VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议。在VRRP中有两组重要的概念:VRRP路由器和虚拟路由器,主控路由器和备份路由器。
VRRP路由器是指运行VRRP的路由器,是物理实体,虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。 Vrrp中存在着一种选举机制,用以选出提供服务的路由即主控路由,其他的则成了备份路由。当主控路由失效后,备份路由中会重新选举出一个主控路由,来继续工作,来保障不间断服务。
安装Keepalived
wget http://www.keepalived.org/software/keepalived-2.0.18.tar.gz
cd keepalived-2.0.18 && ./configure --prefix=/usr/local/keepalived-2.0.18
make && make install
cd /etc/ && mkdir keepalived
cp /home/install/keepalived-2.0.18/keepalived/etc/init.d/keepalived /etc/init.d/keepalived
cp /home/install/keepalived-2.0.18/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
vim /home/keepalived/keepalived-2.0.18/keepalived/etc/keepalived/keepalived.conf
cp /home/keepalived/keepalived-2.0.18/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
cp /home/install/keepalived-2.0.18/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
ln -s /home/install/keepalived-2.0.18/sbin/keepalived /usr/bin/
修改配置文件
global_defs {
router_id hyq_master #唯一
}
vrrp_script chk_mysql {
script "/etc/keepalived/mysql_check.sh"
interval 2
timeout 2
fall 3
}
vrrp_instance VI_1 {
state BACKUP # 必填,可以是MASTER或BACKUP
interface ens33
virtual_router_id 100
priority 80 #启动的优先级,数字越大表示先启动。从机上的keepalived服务该值应小于80
nopreempt
advert_int 1
unicast_src_ip 192.168.20.201
unicast_peer {
192.168.20.200
}
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_mysql #检查脚本
}
virtual_ipaddress {
192.168.20.100 #对外提供的统一IP
}
}
对应的Mysql脚本
#!/bin/bash
A=`ps -C mysqld --no-header |wc -l`
if [ $A -eq 0 ]; then
killall keepalived
fi
启动Keepalived
service keepalived start
systemctl daemon-reload
查看Keepalived状态
当我们看到active(running) 表示Keepalived已经启动成功了,我们可以通过192.168.20.100来连接192.168.20.200上的MSYQL数据库。
MYSQL高可用服务测试
关闭192.168.20.200 上面的MySQL服务 ,200所在机器上的keepalived服务也应该停止,并且192.168.20.201上的keepalived服务开始工作,通过keepalived,当200所在的MySQL发生故障了就会切换并使用201上MySQL服务。这样就实现了简单的高可用。