1mysql
前言linux
在应用程序中,应用配置链接的数据库IP地址和端口号都是固定一个的,当所属IP地址的服务器宕机后,须要人为手工更改IP地址切换数据库服务器。同时当应用接收到成千上万的并发 http 请求时,会致使服务器消耗大量系统资源,轻则响应速度下降,严重的甚至会引起宕机。nginx
为了充分合理的利用服务器资源,提升数据服务的性能和稳定性,在较低成本的前提下,保证在部分服务器宕机或发生故障的状况下不影响业务的正常运做。本文主要介绍 Nginx+Keepalived 链接 SequoiaDB -MySQL 实例的高可用方案与实践。web
2算法
SequoiaDB 数据库介绍sql
SequoiaDB 巨杉数据库是一款彻底自研的金融级分布式数据库产品,采用计算与存储分离架构,由数据库实例层和数据库存储引擎层组成。数据库实例层负责解析请求并转发至数据库存储引擎层处理,同时会将数据库存储引擎层的响应结果反馈给应用层,数据库实例层支持包括针对结构化数据的 MySQL 实例、PostgreSQL 实例、SparkSQL 实例,以及针对非结构化数据的 S3 和 PosixFS 文件系统的对象存储实例实例,而数据库存储引擎层是由 SequoiaDB 巨杉数据库的协调节点、编目节点和数据节点组成。该数据库集群架构能方便用户实现由传统数据库到巨杉数据库的无缝迁移,减小应用开发者的开发和学习成本。数据库
2.1bash
SequoiaDB MySQL实例 的关系服务器
如图所示是 SequoiaDB 巨杉数据库集群的逻辑架构图,用户由图可知,应用程序实际是经过计算层的实例节点链接、访问数据库。例如图中所示,应用程序能够直接经过 MySQL 的 JDBC 驱动链接、访问 SequoiaDB 数据库集群。网络
SequoiaDB 数据库的存储层是一个可以支持分布式事务、多中心容灾的分布式存储集群。
SequoiaDB 的分布式存储层,其中包括:协调节点、编目节点和数据库节点三类角色节点。分布式存储层中的全部节点均支持多节点部署,支持分布式水平扩展和高可用容灾功能。
计算层中的 MySQL 实例和分布式存储引擎的链接,能够经过多协调节点的负载均衡功能实现高可用和避免单点故障。而在传统的应用程序中,应用程序经过 JDBC 链接 MySQL 时,通常只会填写一个服务器的IP 地址和端口号。在这种架构中,为了解决 MySQL 链接的单点故障隐患,会在应用服务器和数据库服务器中间,搭建一层负载均衡服务,以实现应用程序和数据库链接的高可用切换。
2.2
传统解决方案
在过去企业级解决方案中,为了解决数据库的高可用问题,通常会在数据库服务器与外部网络之间安装负载均衡器(如F5),从而避免由于某台服务器宕机而对业务形成影响。
虽然这种硬件负载均衡技术较为成熟,在过去的企业重要系统中均有部署使用,但该种方案须要额外购买价格高昂的负载均衡设备,成本比较高。
3
Nginx+Keepalived 解决方案
3.1
总体架构
本方案与传统解决方案的思路一致,在数据库服务器与外部网络之间新增负载均衡层,惟一不一样的是传统解决方案使用负载均衡器,而本方案采用 Nginx+Keepalived 来实现负载均衡。该种解决方案采用纯软件的方式,实现多机器的数据库服务器统一固定一个IP 地址和服务端口,部署方式灵活。
具体部署架构以下图所示,Nginx 反向代理三台数据库服务器的 MySQL 及负载使用实例,将3306端口映射到3307端口,而应用程序服务器会经过 Keepalived 虚拟IP地址的 Nginx 反向代理端口3307来链接三台数据库服务器的 MySQL 实例。
VRRP 技术能够将两台或者多台物理路由器设备虚拟成一个虚拟路由器,这个虚拟路由器经过虚拟IP(192.168.81.100)对外提供服务。
在虚拟路由器内部,同一时间只有一台物理路由器在对外提供服务,这台物理路由器被称为主路由器(Master),通常而言Master经过选举算法产生,它拥有对外服务的虚拟IP,提供各类网络功能。而其余物理路由器不拥有对外的虚拟IP,仅仅接收 Master 的 VRRP 状态通告信息,这部分路由器叫作备份路由器(Slave)。
当主路由器失效的时候,备份路由器从新进行选举,产生一个新的路由器成为 Master。以下图所示,当主路由器(Master)宕机后,备份路由器(Slave)进行选举成为Master,而后接管虚拟IP,继续对外提供服务,对应用程序服务器而言,整个切换过程是对应用程序透明,无任何影响。
3.2
Nginx 产品介绍
Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。Nginx是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特色是占有内存少,并发能力强,事实上Nginx的并发能力在同类型的网页服务器中表现较好。
Nginx 有很强的代理功能,可是仅在一台服务器部署 Nginx 服务,依然存在 Nginx 单点故障的问题,所以在高可用负载均衡解决方案中,Nginx 须要结合 Keepalived 软件解决单点故障问题。
Nginx+Keepalived 双机实现 Nginx 反向代理服务的高可用,保证任意服务器宕机,或者是任何 Nginx 服务被意外中止,也会不影响业务的正常运做。
3.3
Keepalived 产品介绍
Keepalived 软件的做用是检测服务器的状态。
在部署了 Keepalived 服务的软件中,若是一台服务器意外宕机,或工做出现故障, Keepalived 软件将会检测到该问题服务器,并将有故障的服务器从系统中剔除。
同时,Keepalived 软件会自动使用其余服务器代替该问题服务器的工做。当问题服务器从新正常工做后,Keepalived 软件又会自动将原来问题服务器加入到服务器列表中。整个高可用切换工做所有由 Keepalived 软件自动感知,自动切换,无任何需人工干涉。
4
Nginx+Keepalived 安装部署
假设存在如下的服务器环境环境,后续内容将介绍如何经过 Keepalived + Nginx 软件实现 SequoiaDB 数据库的 MySQL 实例高可用部署:
4.1
部署前环境检查
检查 selinux 状态是否为 disabled
sestatus
使用 root 权限,打开 /etc/selinux/config 文件
vi /etc/selinux/config
将 SELINUX 调整成 disabled
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
重启操做系统以使SELINUX 设置生效
reboot
安装依赖插件
yum install -y gcc pcre pcre-devel openssl openssl-devel gd gd-devel net-snmp-agent-libs
4.2
Nginx 安装与部署
经过如下命令下载 Nginx 安装包
wget https://nginx.org/download/nginx-1.16.0.tar.gz
解压并安装
tar -zxvf nginx-1.16.0.tar.gz
cd nginx-1.16.0
打开 Nginx 配置文件
vi /usr/local/nginx/conf/nginx.conf
修改 Nginx 配置文件,新增如下内容,stream 段的配置要与 http 段在同级目录。新增内容表示将13四、135和136 服务器的 3306 服务加入到 Nginx 的负载均衡中,而且 Nginx 对外发布 3307 的服务端口。
stream {
添加全局命令
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
测试安装
nginx -V
预期返回结果
nginx version: nginx/1.16.0
新建Nginx服务脚本
vi /etc/init.d/nginx
新增如下内容
#!/bin/sh
赋予nginx服务脚本权限
chmod 755 /etc/init.d/nginx
添加Nginx到系统服务
chkconfig --add nginx
启动 Nginx 服务
systemctl start nginx.service
设置 Nginx 为开机自启动
systemctl enable nginx.service
检查 Nginx 服务
systemctl status nginx.service
预期返回结果
● nginx.service - SYSV: Nginx is an HTTP(S) server, HTTP(S) reverse proxy and IMAP/POP3 proxy server
经过 Nginx 登陆 MySQL 实例
mysql -h 192.168.81.134 -uroot -P 3307 -proot
预期返回结果
mysql: [Warning] Using a password on the command line interface can be insecure.
4.3
Keepalived 安装与部署
用户经过如下命令下载 Keepalived 安装包
wget https://www.keepalived.org/software/keepalived-2.0.19.tar.gz
解压并安装
tar -zxvf keepalived-2.0.19.tar.gz
cd keepalived-2.0.19
添加全局命令
ln -s /usr/local/keepalived/sbin/keepalived /usr/bin/keepalived
测试安装
keepalived -v
预期返回结果
Keepalived v2.0.19 (10/19,2019)
Copyright(C) 2001-2019 Alexandre Cassen, <acassen@gmail.com>
新建 Nginx 检查脚本
vi /usr/local/keepalived/nginx_check.sh
添加如下内容
#!/bin/bash
赋予检查脚本可执行权限
chmod +x /usr/local/keepalived/nginx_check.sh
打开 Keepalived 配置文件
vi /usr/local/keepalived/etc/keepalived/keepalived.conf
修改主 Keepalived 的配置文件
! Configuration File for keepalived
修改备 Keepalived 的配置文件
! Configuration File for keepalived
修改配置文件路径vi /usr/local/keepalived/etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -f /usr/local/keepalived/etc/keepalived/keepalived.conf"
启动 Keepalived 服务
systemctl start keepalived.service
设置 Keepalived 为开机自启动
systemctl enable keepalived.service
检查 Keepalived 服务
systemctl status keepalived.service
预期返回结果
keepalived.service - LVS and VRRP High Availability Monitor
检查 Master 和 Backup 的虚拟IP地址
ip addr show ens33
Master 预期返回结果,部分截取inet 192.168.81.134/24 brd 192.168.81.255 scope global ens33
valid_lft forever preferred_lft forever
Backup 预期返回结果,部分截取
inet 192.168.81.135/24 brd 192.168.81.255 scope global ens33
经过虚拟IP地址登陆 MySQL 实例
mysql -h 192.168.81.100 -uroot -P 3307 -proot
预期返回结果
mysql: [Warning] Using a password on the command line interface can be insecure.
4.4
Keepalived + Nginx 实现负载均衡高可用
用户经过 Navicat 链接MySQL数据库,IP 使用Keepalived 提供的虚拟IP 地址,MySQL实例的端口为Nginx 提供的3307 服务端口。
由于 sdb1 服务器部署的 Keepalived 为 Master,因此 Navicat 链接的是这台机器,经过执行 netstat 命令能够确认
[root@sdb1 ~]# netstat -nap|grep 3307
若是主动关闭 sdb1 服务器
shutdown -h now
而后继续检查sdb2的虚拟IP地址
ip addr show ens33
预期返回结果,部分截取
inet 192.168.81.135/24 brd 192.168.81.255 scope global ens33
若是此时主动关闭sdb2 服务器的MySQL服务
service sequoiasql-mysql stop
在Navicat 中继续查询一张表的数据,显示查询成功。
81.136:3306 192.168.81.135:49646 ESTABLISHED 1388/mysqld
经过以上验证步骤,能够证实 Keepalived 软件可以实现多服务器之间虚拟 IP 地址自动漂移,Nginx 服务可以自动实现 MySQL 实例的负载均衡。用户用过 Keepalived 软件和 Nginx 服务,最终实现了在对应用零影响的状况下,实现了 SequoiaDB 数据库集群的多 MySQL 实例的负载均衡高可用功能。
5
总结
本文介绍了如何经过 Nginx+Keepalived 双机实现数据库实例的高可用,用户能够经过 Nginx+Keepalived 解决方案来实现应用经过一个 IP 地址和端口号来访问多个 MySQ 实例,保证在任意一台机器宕机或 MySQL 服务中止的时候,应用也能基于同一个 IP 地址来访问 SequoiaDB 数据库。