ToB企服应用市场:ToB评测及商务社交产业平台

标题: MySQL高可用架构搭建实战 [打印本页]

作者: 梦见你的名字    时间: 2022-8-13 10:32
标题: MySQL高可用架构搭建实战

 
 
前言
 
对于 MySQL 数据库作为各个业务系统的存储介质,在系统中承担着非常重要的职责,如果数据库崩了,那么对于读和写数据库的操作都会受到影响。如果不能迅速恢复,对业务的影响是非常大的。本文我将分享MySQL 双主 + Keepalived 的高可用落地和踩坑之路。
 
一、方案选择
 
对于 MySQL 的高可用,主要分为两步,配置 MySQL 主主模式和 keepalived 软件。拓扑图如下所示:
 
 
 
 
1、MySQL 数据库的主主模式
 
两个数据库分别部署在两台服务器上,相互同步数据,但是只有一个提供给外部访问,当一个宕机后,另外一个可以继续提供服务,在没有 keepalived 软件的帮助下,只能手动切换。
 
2、keepalived 监测、自动重启、流量切换
 
 
两台服务器上都部署 keepalived 软件,定时检测 MySQL 服务是否正常,如果一个数据库服务崩了,keepalived 会用脚本尝试重启 mysql 服务。
 
 
两个 keepalived 服务都提供了虚拟 IP 供客户端使用,但是流量只会转到一台 MySQL 服务上。
 
 
keepalived 配置好了后,会有一个 虚拟 IP,对于客户端来说,不关心连接的是哪台 MySQL,访问虚拟 IP 就可以了。
 
 
如果客户端正在访问的 MySQL 服务崩了后,keepalived 会用我们写的脚本自动重启 MySQL,如果重启失败,脚本主动停掉 keepalived,客户端的流量就不会访问到这台服务器上的 MySQL 服务,后续访问的流量都会切到另外一台 MySQL 服务。
 
检测和重启的原理如下所示:

 
 
 
需要配置的内容如下:
 
 
二、主主复制的原理
 
对于 MySQL 的主主架构,其实原理就是两台服务器互为主从,双向复制。而复制的原理如下。
 
主从复制主要有以下流程:
 
 
 
 
 
 
 
大白话就是:
 
 
 
 
 
接下来我们先把 MySQL 的基础环境在两台 Ubuntu 服务器上搭建好,后续操作都是基于这个来做的。
 
三、配置 MySQL 环境
 
作为演示,我在本机启动了两台 Ubuntu 虚拟机,安装有 docker。因为我们的测试和生产环境是用 Docker 跑的,所以我将环境的镜像打包后,还原到我的虚拟机上面。
 
1、备份和还原 mysql 镜像
 
保存测试环境的 mysql 镜像:
  1. sudo docker save -o mysql.tar  hcr:5000/hschub/hscmysql:0.0.2
  2. sudo chmod 777 mysql.tar
复制代码
两台机器导入镜像:
 
  1. sudo docker load -i mysql.tar
复制代码
启动容器,需要注意的是需要映射本地文件夹:
  1. sudo docker run -p 3306:3306 --name mysql \
  2. -v /home/hss/mysql/data:/var/lib/mysql \
  3. -v /home/hss/mysql/etc/mysql:/etc/mysql \
  4. -e MYSQL_ROOT_PASSWORD='123456' \
  5. -d 46b
复制代码
-v 代表映射的文件夹,-d 表示后台运行,46b 代表镜像 id。
 
进入容器,连接 mysql,node1的mysql 密码是 123456,node2 是 123456。
 
  1. # 查询容器 id
  2. docker ps
  3. # 进入 mysql 容器
  4. docker exec -it <容器 id> /bin/bash
  5. # 连接 mysql
  6. mysql -u root -p
复制代码
接下来我们配置 MySQL 的主从架构,需要注意的是后续搭建的主主架构是基于主从架构来的,区别就是修改了一部分配置。
 
四、配置 MySQL 的主从架构
 
拓扑结构:
 
 
  
 
 
   7、解除锁定表
 
  1. UNLOCK TABLES
复制代码
  8、从节点还原数据库
  1. mysql -uroot -p -hlocalhost -P3306 < /var/lib/mysql/backup/all_databases.sql
复制代码
  9、设置同步信息
 
在 MySQL 命令行窗口中执行以下命令设置同步信息。这里就是配置主数据库的 IP 地址、Port、用户名、密码,二进制文件名,偏移量。
  1. CHANGE MASTER TO MASTER_HOST='192.168.56.11',
  2. MASTER_PORT=3306,
  3. MASTER_USER='vagrant',
  4. MASTER_PASSWORD='vagrant',
  5. MASTER_LOG_FILE='mysql-bin.000008',
  6. MASTER_LOG_POS=1020;
复制代码
  10、启动从数据库的复制线程
 
在 MySQL 命令行窗口中执行以下命令启动从数据库的复制线程。
  1. START salve;
复制代码
  11、查看从数据库的同步状态
  1. SHOW slave status \G
复制代码
如果 Slave_IO_Running 和 Slave_SQL_Running 显示 Yes,就表示启动同步成功。如下图所示:

 
 
 在主库上执行以下命令显示当前连接过来的从库线程。
  1. SHOW PROCESSLIST
复制代码
如下所示,Slave has read all relay log; wating for more updates,说明从库已经同步完了。
 
 
 
 使用上面的两个命令,我们可以判断当前的复制情况。
  12、验证同步功能
 
下面验证下主从节点之间是否能正常同步数据。
 
主节点创建 testdb 数据库和 member 表。
 
刷新下从节点,发现从节点自动创建了 member 表。如下图所示。
 
然后在主节点插入一条数据,刷新从节点后,发现从节点也自动创建了一条数据。

 
 
 
五、配置主主架构
 
1、步骤
 
配置主主架构就是在主从架构中交换下配置信息。步骤如下:
 
 
 
 
 
  2、node2 节点上的操作
 
1)停止同步
 
  1. STOP slave
复制代码
 
2)添加主节点 mysql 账户信息
 
  1. CREATE USER 'vagrant'@'192.168.56.11' IDENTIFIED BY 'vagrant';
  2. ALTER USER 'vagrant'@'192.168.56.11' IDENTIFIED WITH mysql_native_password BY 'vagrant';
  3. GRANT REPLICATION SLAVE ON *.* TO 'vagrant'@'192.168.56.11';
  4. FLUSH PRIVILEGES;
复制代码
3)查看二进制日志文件和位置信息
 
  1. SHOW MASTER STATUS
复制代码

 
 
 4)开启主从复制
  1. start slave
复制代码
5)查看同步状态

 
 
 
3、node 1 节点上的操作
 
1)设置同步信息
  1. CHANGE MASTER TO MASTER_HOST='192.168.56.12',
  2. MASTER_PORT=3306,
  3. MASTER_USER='vagrant',
  4. MASTER_PASSWORD='vagrant',
  5. MASTER_LOG_FILE='mysql-bin.000001',
  6. MASTER_LOG_POS=2453;
复制代码
2)启动从数据库的复制线程
  1. START salve
复制代码
3)查看从数据库的同步状态
 
  1. SHOW slave status \G
复制代码

 
 
 
4、测试主主同步
 
node2 的 member 表增加一条数据 (2,zzz),node1 上同步成功。

 
 
 node 1 的 member 表增加一条数据(3,aaa),node2 上同步成功。

 
 
 
六、搭建 keepalived 环境
 
1、Keepalived 的应用场景
 
Keepalived 软件在主主架构中,可以配置成两种应用场景:
 
 
 
这里我配置成第二种功能场景,保障 MySQL 服务的高可用。另外可以配置 MySQL 服务异常时,发送邮件给运维或开发人员,由他们检查服务器的状态。
 
2、使用 Keepalived 的原理

 
 
 
Keepalived 提供了一个虚拟 IP (简称 VIP),对外提供访问。当客户端连接这个虚拟 IP 后,只会访问其中一个 MySQL。MySQL 节点故障后,keepalived 执行脚本进行重启,如果重启失败,脚本自动停掉 keepalived,备用节点自动切换为主节点。
 
keepalived 检测和重启的流程图如下:

 
 
 
3、安装 keepalived 软件
 
安装依赖、获取 keepalived 安装包、解压安装包、删除安装包。
 
  1. # 安装依赖
  2. sudo apt-get install -y libssl-dev
  3. sudo apt-get install -y openssl
  4. sudo apt-get install -y libpopt-dev
  5. sudo apt-get install -y libnl-dev
  6. sudo apt-get install -y libnl-3-dev
  7. sudo apt-get install -y libnl-genl-3.dev
  8. sudo apt-get install daemon
  9. sudo apt-get install libc-dev
  10. sudo apt-get install libnfnetlink-dev
  11. sudo apt-get install gcc
  12. # 获取 keepalived 安装包
  13. cd /usr/local
  14. sudo su
  15. sudo wget https://www.keepalived.org/software/keepalived-2.2.2.tar.gz
  16. # 解压安装包
  17. sudo tar -zxvf keepalived-2.2.2.tar.gz
  18. # 删除安装包
  19. mv keepalived-2.2.2 keepalived
复制代码
6、启动 keepalived
 
1)启动两台服务器上的 keepalived
 
7、测试 keepalived 是否会重启 mysql
 
8、测试 MySQL 节点切换
 
验证下当 MySQL 重启失败后,keepalived 自动停止后,客户端连接的 MySQL 是否会自动切到另外一个 MySQL 节点上。
 
首先用 mysql 客户端工具 navicat 连接虚拟 ip 地址,账号和密码就是 node 1 和 node2 的 mysql 账号密码(root/123456)

 
 
 可以连接上,然后执行以下命令,查看当前虚拟 ip 连接的是哪个数据库。
  1. SHOW VARIABLES LIKE '%hostname%'
复制代码
可以看到连接的是 node2 的容器的 id,说明 keepalived 已经通过虚拟 ip 连接到 node2 的 mysql 了,是正常工作的,node2 现在是作为主节点,node1 作为备用节点。
 
 
 
 由于本地环境重新启动  MySQL 都是成功的,不会停掉 keepalived 服务。出于演示目的,我就直接停掉 keepalived 服务。
  1. pkill keepalived
复制代码
执行下面这个命令可以查看 keepalived 进程,发现已经没有了。(控制台显示的 grep --color=auto keepalived 表示是查找命令)
  1. ps -ef | grep keepalived
复制代码

 
 
 
重新查询客户端的连接信息,发现已经切换到 92b (node1)机器上的 mysql 了。
 
  1. SHOW VARIABLES LIKE '%hostname%'
复制代码

 
 
 再次查看 node1 上 keepalived 上的状态,再发送信息给
  1. sudo systemctl status keepalived
复制代码

 
 
 
七、遇到的坑
 
1、密码不正确,无法登录的问题
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4