最近捣鼓了一下mysql数据库的高可用方案。借助mysql官方的InnoDB Cluster 以及nginx+keepalived。能够轻易的做到。效果及稳定性令人满意。
前言:
首先这里默认你已经安装好了mysql集群,并且集群是可用的。不会安装的可以参考另外一篇博文:http://blog.csdn.net/kokjuis/article/details/78401022
这里不介绍mysql InnoDB Cluster 的安装,只介绍通过nginx+keepalived对mysql进行高可用配置。
实际上应该是对mysql-router做高可用。因为mysql InnoDB Cluster本身就是mysql的高可用方案。只是其中的mysql-router可能存在单点问题。
mysql-router本身没有提供高可用方案,但我们可以通过nginx实现负载均衡以及高可用,nginx的高可用可以通过keepalived主备方式实现。
安装nginx
先安装nginx需要的依赖
一. gcc 安装
安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装:
yum install gcc-c++
二. PCRE pcre-devel 安装
PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:
yum install -y pcre pcre-devel
三. zlib 安装
zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
yum install -y zlib zlib-devel
四. OpenSSL 安装
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
yum install -y openssl openssl-devel
安装nginx
到官网直接下载nginx 。直接下载.tar.gz
安装包,地址:https://nginx.org/en/download.html
注意:代理mysql需要支持tcp。只有nginx1.9及以上才可以支持tcp协议,官网下载最新版本即可;
安装:
tar -zxvf nginx-1.13.7.tar.gz
cd nginx-1.13.7
编译nginx:
注意:
Nginx有两种方式实现TCP代理功能:
一种是使用nginx_tcp_proxy_module模块,一般用于Nginx早期版本。
一种是使用官方ngx_stream_core_module模块,用于1.9及其以后版本。
推荐使用官方ngx_stream_core_module。
只有在configure时使用了--with-stream参数,编译出来的nginx程序才支持stream方式实现TCP代理。
./configure --prefix=/usr/nginx --with-stream --with-stream_ssl_module
make
#已经在使用的nginx则不需make install,否则就覆盖了
make install
配置tcp代理功能
在nginx.conf配置文件中添加
stream配置块以及其中的server配置块。
stream {
upstream mysql {
hash $remote_addr consistent;
#mysql-router连接地址
server 172.30.12.14:7001 weight=5 max_fails=3 fail_timeout=30s;
server 172.30.12.17:7001 weight=5 max_fails=3 fail_timeout=30s;
}
server {
listen 7777;
#建立连接超时时间
proxy_connect_timeout 5s;
#proxy_timoute指定Nginx与客户端,以及Nginx与被代理的主机之间在两个相邻的读或写数据的操作之间的最大时间间隔。超过此时间间隔而没有数据读或写操作发生,则断开连接。
proxy_timeout 5m;
proxy_pass mysql;
}
}
至于其他的nginx配置什么的这里不说了。网上很多
Keepalived的安装和配置:
从官网下载keepalived的最新版本。
keepalived 的安装步骤
#解压
tar -zxvf keepalived-1.2.24.tar.gz
#进入目录
cd keepalived-1.2.24
#编译
./configure --prefix=/usr/keepalived
#创建文件夹
mkdir /etc/keepalived
#复制配置
cp /usr/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/keepalived-1.3.9/keepalived/etc/init.d/keepalived /usr/keepalived/etc/rc.d/init.d/keepalived
cp /usr/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
#授权
chmod +x /etc/rc.d/init.d/keepalived
#添加软链接
ln -s /usr/sbin/keepalived/usr/sbin/
ln -s /usr/keepalived/sbin/keepalived/sbin/
#添加到服务
chkconfig --add /etc/init.d/keepalived
chkconfig keepalived on
#查看服务
chkconfig --list keepalived
注:
cp /usr/keepalived-1.3.9/keepalived/etc/init.d/keepalived /usr/keepalived/etc/rc.d/init.d/keepalived
新版本可能keepalived不存在,直接从/keepalived-1.3.9/keepalived/etc/init.d/ 目录下拷贝过去即可。
系统提示警告
*** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
安装:
yum -y install libnl libnl-devel
系统提示错误
configure: error: libnfnetlink headers missing
安装
yum install -y libnfnetlink-devel
配置keepalived.conf
主:
global_defs {
# 设置nginx master的id,在一个网络应该是唯一的
router_id nginx_master
}
vrrp_script chk_http_port {
#最后手动执行下此脚本,以确保此脚本能够正常执行
script "/etc/keepalived/check_nginx_pid.sh"
#(检测脚本执行的间隔,单位是秒)
interval 2
weight 2
#检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
fall 2
#检测1次成功就算成功。但不修改优先级
rise 1
}
vrrp_instance VI_1 {
# 指定keepalived的角色,MASTER为主,BACKUP为备
state MASTER
# 当前进行vrrp通讯的网络接口卡(当前centos的网卡),通过命令 ip addr 可以查看,必须要填对
interface enp2s0
# 虚拟路由编号,主从要一致
virtual_router_id 66
# 优先级,数值越大,获取处理请求的优先级越高
priority 100
# 检查间隔,默认为1s(vrrp组播周期秒数)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
#(调用检测脚本)
chk_http_port
}
virtual_ipaddress {
# 定义虚拟ip(VIP),可多设,每行一个
172.30.12.200
}
}
备:
global_defs {
# 设置nginx master的id,在一个网络应该是唯一的
router_id nginx_slave
}
vrrp_script chk_http_port {
#最后手动执行下此脚本,以确保此脚本能够正常执行
script "/etc/keepalived/check_nginx_pid.sh"
#(检测脚本执行的间隔,单位是秒)
interval 2
weight 2
#检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
fall 2
#检测1次成功就算成功。但不修改优先级
rise 1
}
vrrp_instance VI_1 {
# 指定keepalived的角色,MASTER为主,BACKUP为备
state BACKUP
# 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
interface enp2s0
# 虚拟路由编号,主从要一致
virtual_router_id 66
# 优先级,数值越大,获取处理请求的优先级越高
priority 99
# 检查间隔,默认为1s(vrrp组播周期秒数)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
#(调用检测脚本)
chk_http_port
}
virtual_ipaddress {
# 定义虚拟ip(VIP),可多设,每行一个
172.30.12.200
}
}
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
/usr/nginx/sbin/nginx #重启nginx
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败,则停掉keepalived服务,进行VIP转移
killall keepalived
fi
fi
#启动服务
service keepalived start
#停止服务
service keepalived stop
注意:keepalived启动时不会检查配置文件的语法是否正确,所以我们在编写配置文件时要特别小心,别写错了,否则会出现一些意想不到的现象。
通过命令 ip addr 命令可以查看虚拟IP已经生效。
注意:同一时间只有主服务生效,只有主服务器宕机以后,vip才会偏移到从机上。等主机恢复以后,vip又会自动偏移到主机上。
然后通过vip(172.30.12.200:7777)即可访问数据库,并且已经实现高可用和负载均衡