第二篇:mysql负载均衡、高可用方案:mysqlcluster+haproxy+keepalived

2023-11-02

上一篇介绍了mysqlcluster的安装和配置,本篇将描述高可用的mysql集群组建方式,高可用的mysql集群有多种方式,本篇介绍的是 mysqlcluster+haproxy+keepalived方案,

下篇将介绍通过普通版本的mysql+haproxy+keepalived实现主从复制,读写分离的高可用方案。

一、方案概述

在此方案中引入了haproxy和keepalived两个工具:

    1. Haproxy主要功能是进行负载均衡
    2. Keepalived的主要功能是检查mysql可用状态,辅助切换

方案拓扑关系如下:

此方案中:

1)mysqlcluster集群部分

管理节点: 192.168.136.215, 192.168.136.115

数据节点和mysql节点:192.168.136.216, 192.168.136.217,。。。

其他红色标注的表示实际环境下可以进行横向扩展(数据节点和mysql节点可以分别部署)

2)负载均衡和高可用

部署节点:192.168.136.215, 192.168.136.115

虚拟路由节点:192.168.136.200

也可以另外单独找两台服务器进行部署,虚拟节点是面向用户(web调用)的节点

二、部署mysqlcluster

参见上一篇,mysqlcluster的部署,在此基础上,新增加192.168.136.115节点的部署,细节和215服务器的部署一致(略)。

115和215的配置文件/var/lib/mysql-cluster/config.ini需要进行修改:

/var/lib/mysql-cluster/config.ini内容如下:

[ndbd default]

NoOfReplicas= 2

DataMemory= 512M

IndexMemory= 18M

 

[ndb_mgmd]

NodeId= 1

HostName= 192.168.136.215          # hostname is a valid network adress

DataDir= /var/lib/mysql-cluster    #

 

[ndb_mgmd]

NodeId= 2

HostName= 192.168.136.115          # hostname is a valid network adress

DataDir= /var/lib/mysql-cluster    #

 

[ndbd]

NodeId= 3

HostName= 192.168.136.216   # hostname is a valid network adress

DataDir= /var/lib/mysql-cluster

 

[ndbd]

NodeId= 5

HostName= 192.168.136.217   # hostname is a valid network adress

DataDir= /var/lib/mysql-cluster

 

[mysqld]

hostname=192.168.136.216

 

[mysqld]

hostname=192.168.136.217

 

[mysqld]

 

[mysqld]

 

根据拓扑图,新增了115服务器作为管理节点(mgm),因此在216,217服务器上,修改一下配置文件,增加一个mgm节点,具体内容如下:

vim  /etc/my.cnf

[mysqld]

#skip-grant-tables

ndbcluster

ndb-connectstring=192.168.136.215,192.168.136.115

 

[mysql_cluster]

ndb-connectstring=192.168.136.215,192.168.136.115

三、部署haproxy

Haproxy部署在192.168.136.215和192.168.136.115上,作用是实现负载均衡,通过部署在mysql节点(216,217)服务器上的监控脚本和监控服务,来自动判断外部的请求应该发送到哪个节点。

3.1 Haproxy下载、编译、安装

首先下载haproxy, 网址www.haproxy.org被墙了,因此下面提供了二个链接:

wget -P /home/soft http://www.haproxy.org/download/1.7/src/haproxy-1.8.10.tar.gz

wget -P /home/soft http://download.openpkg.org/components/cache/haproxy/haproxy-1.8.10.tar.gz

下载完成后,解压缩

tar  -vxf  haproxy-1.8.10.tar.gz

设定部署目录为/usr/local/haproxy

所以进入haproxy-1.8.10目录后,执行如下编译和安装命令

make TARGET=linux2628 ARCH=x86_64 PREFIX=/usr/local/haproxy

make install PREFIX=/usr/local/haproxy

 

#TARGET=linux26,ARCH=x86_64#26以上的都用linux26

#TARGET是指内核版本,ARCH指定CPU架构

 

 

 

[root@mysql-1 haproxy-1.8.10]# make install PREFIX=/usr/local/haproxy

install -d "/usr/local/haproxy/sbin"

install haproxy  "/usr/local/haproxy/sbin"

install -d "/usr/local/haproxy/share/man"/man1

install -m 644 doc/haproxy.1 "/usr/local/haproxy/share/man"/man1

install -d "/usr/local/haproxy/doc/haproxy"

for x in 51Degrees-device-detection architecture close-options configuration cookie-options DeviceAtlas-device-detection intro linux-syn-cookies lua management netscaler-client-ip-insertion-protocol network-namespaces peers peers-v2.0 proxy-protocol SPOE WURFL-device-detection; do \

                install -m 644 doc/$x.txt "/usr/local/haproxy/doc/haproxy" ; \

        done

[root@mysql-1 haproxy-1.8.10]#

[root@mysql-1 haproxy-1.8.10]#

创建相关的目录

mkdir -pv /usr/local/haproxy/{conf,run,log}

 

3.2 创建proxy的启动脚本

启动脚本 vim /etc/init.d/haproxy,具体内容如下:

#! /bin/bash

# chkconfig: - 85 15

# description: haproxy is a World Wide Web server. It is used to serve

PROGDIR=/usr/local/haproxy

PROGNAME=haproxy

DAEMON=$PROGDIR/sbin/$PROGNAME

CONFIG=$PROGDIR/conf/$PROGNAME.conf

PIDFILE=$PROGDIR/run/$PROGNAME.pid

DESC="HAProxy daemon"

SCRIPTNAME=$PROGDIR/init.d/$PROGNAME

# Gracefully exit if the package has been removed.

test -x $DAEMON || exit 0

start()

{

   if [ $(pidof haproxy | wc -l) -gt 0 ]

   then

  echo "$PROGNAME is Runing"

   else

    echo -n "Starting $DESC: $PROGNAME"

   $DAEMON -f $CONFIG

   echo "."

fi

        }

stop()

{

 

   if [ $(pidof haproxy | wc -l) -le 0 ]

   then

  echo "$PROGNAME  is not running."

   else

  echo -n "Stopping $DESC: $PROGNAME"

    cat $PIDFILE | xargs kill

    echo "."

fi

}

 

reload()

{ echo -n "reloading $DESC: $PROGNAME"

   $DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)

}

case "$1" in

  start)

  start

  ;;

stop)

  stop

   ;;

restart)

        stop

        start

        ;;

reload)

reload

   ;;

*)

echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2

exit 1

;;

esac

exit 0

完成后修改脚本权限

chmod +x  /etc/init.d/haproxy # 可执行权限

 

3.3 配置haproxy的配置文件

注意一下frontend admin_stat绑定的是本机haproxy的端口,mysql-cluster配置的是mysql集群中mysql api的服务器和端口(既 [mysqld]中配置的节点)

 

vim /usr/local/haproxy/conf/haproxy.conf

global

                log 127.0.0.1   local0

                log 127.0.0.1  local1 notice

                #log loghost    local0 info

                maxconn 50000

                chroot  /usr/local/haproxy

                uid 99

                gid 99

 

                daemon

                nbproc 2

                pidfile  /usr/local/haproxy/run/haproxy.pid

                #debug

                #quiet

 

defaults

                log     global

                mode    tcp

                option  tcplog

                option  dontlognull

                option  forwardfor

                option  redispatch

                retries 3

                timeout connect     3000

                timeout client      50000

                timeout server 50000

 

frontend admin_stat

         bind *:9166

         mode http

         default_backend stats-back

 

frontend cluster-front

         bind    *:3306

         mode    tcp

         default_backend mysql-cluster

 

backend mysql-cluster

        mode    tcp

        balance roundrobin

        option httpchk

        server  mysql1 192.168.136.216:3306 check port 9200 inter 12000 rise 3 fall 3

        server  mysql2 192.168.136.217:3306 check port 9200 inter 12000 rise 3 fall 3

 

backend stats-back

        mode http

        balance roundrobin

        stats uri /admin?stats

        stats auth admin:admin

        stats realm Haproxy\ Statistics

3.4 Haproxy rsyslog 日志配置

vim /etc/rsyslog.conf 

确保如下选项按图中设置

重启rsyslog服务:

service rsyslog restart

 

[root@mysql-11 haproxy]# service rsyslog restart

Shutting down system logger: [  OK  ]

Starting system logger: [  OK  ]

[root@mysql-11 haproxy]#

 

3.5 启动Haproxy 

启动haproxy

service haproxy start
加入开机启动
chkconfig haproxy on
查看haproxy  是否启动
ps -ef | grep haproxy

 

[root@mysql-11 haproxy]# ps -ef  | grep  haproxy

nobody     4013      1  0 17:26 ?        00:00:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf

nobody     4014      1  0 17:26 ?        00:00:00 /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.conf

root       4017   2734  0 17:27 pts/1    00:00:00 grep haproxy

[root@mysql-11 haproxy]#

 

haproxy 访问端口9155 账号密码 admin:admin,访问url如下:

http://192.168.136.115:9166/admin?stats

http://192.168.136.215:9166/admin?stats

 

 

 

3.6 在mysql节点添加xinetd服务(监控服务)

Xinetd服务是linux下提供一个守护进程,我们可以使用它来帮忙将一些服务映射到某个端口上,通过这个端口查看此服务的状态。我们利用xinetd的这个功能来实现mysql的监控,部署和调用关系如下图所示:

 

安装xinetd,可以通过yum 方式或者下载rpm包进行安装

yum -y install xinetd

安装完成后 使用如下命令启动:

service xinetd start

3.7 在mysql主机上添加监控节点

1. 添加监控MySQL状态的端口

# vi /etc/services

mysqlchk      9200/tcp                        # MySQL status check

2. 使用xinetd守护进程运行MySQL状态检测

# vim /etc/xinetd.d/mysqlchk

 

# default: on

# description: mysqlchk

service mysqlchk

{

# this is a config for xinetd, place it in /etc/xinetd.d/

        disable = no

        flags           = REUSE

        socket_type     = stream

        type            = UNLISTED

        port            = 9200

        wait            = no

        user            = root

        server          = /usr/local/sbin/mysqlchk_status.sh

        log_on_failure  += USERID

        only_from       = 0.0.0.0/0

        per_source      = UNLIMITED

}

 

3. 状态检测脚本

# vi /usr/local/sbin/mysqlchk_status.sh

 

#!/bin/bash

MYSQL_HOST="localhost"

MYSQL_PORT="3306"

MYSQL_USERNAME="root"

MYSQL_PASSWORD="nmc123"

ERR_FILE="${4:-/dev/null}"

 

ERROR_MSG=$(/usr/local/mysql/bin/mysql -u${MYSQL_USERNAME} -p${MYSQL_PASSWORD} -h ${MYSQL_HOST}  -e "show databases;")

if [ "$ERROR_MSG" != "" ]

then

 

    # mysql Cluster node local state is 'runing' => return HTTP 200

    # Shell return-code is 0

    echo -en "HTTP/1.1 200 OK\r\n"

    echo -en "Content-Type: text/plain\r\n"

    echo -en "Connection: close\r\n"

    echo -en "Content-Length: 40\r\n"

    echo -en "\r\n"

    echo -en "MYSQL Cluster Node is Runing.\r\n"

    sleep 1

else

    # mysql Cluster node local state is not 'runing' => return HTTP 503

    # Shell return-code is 1

    echo -en "HTTP/1.1 503 Service Unavailable\r\n"

    echo -en "Content-Type: text/plain\r\n"

    echo -en "Connection: close\r\n"

    echo -en "Content-Length: 57\r\n"

    echo -en "\r\n"

    echo -en "MYSQL Cluster  is not  Runing. \r\n"

    sleep 1

fi

 

 

添加权限: chmod +x /usr/local/sbin/mysqlchk_status.sh

检查脚本工作情况:

 

负载均衡主机上检查mysql主机的端口情况:

[root@mysql-1 ~]# telnet  192.168.136.216 9200

Trying 192.168.136.216...

Connected to 192.168.136.216.

Escape character is '^]'.

HTTP/1.1 200 OK

Content-Type: text/plain

Connection: close

Content-Length: 40

 

MYSQL Cluster Node is Runing.

Connection closed by foreign host.

[root@mysql-1 ~]#

 

 

注意检查haproxy的状态

 

至此,我们可以通过haproxy的两台服务器(215,115)进行连接实际mysql接口的服务器(216,217)

 

3.8 验证负载均衡

关闭217服务器的ndb和mysql(api)服务,通过管理节点观察:

Haproxy显示有一个mysql节点(mysql2,即217)连接不上

从115负载均衡主机连出去,依然正常,这个时候,是通过115连接到216主机完成的mysql接入。

 

四、部署keepalived

前面Haproxy主要功能是实现负载均衡,还需要通过keepalived 实现高可用。

yum -y install  keepalived

 

启动keepalived

 

/etc/init.d/keepalived start

 

启动后有三个进程

[root@mysql-1 keepalived-1.3.2]# ps  -ef  | grep  keepalived

root       6125      1  0 12:04 ?        00:00:00 /usr/sbin/keepalived -D

root       6126   6125  0 12:04 ?        00:00:00 /usr/sbin/keepalived -D

root       6127   6125  0 12:04 ?        00:00:00 /usr/sbin/keepalived -D

root       6133   2601  0 12:05 pts/0    00:00:00 grep keepalived

[root@mysql-1 keepalived-1.3.2]#

 

停止:

 /etc/init.d/keepalived stop

 

加入开机启动

chkconfig  keepalived on

如果是yum安装,那么这是默认的路径
[root@kep1 ~]# ls -l /etc/keepalived/keepalived.conf 
-rw-r--r--. 1 root root 3562 3
月  19 2015 /etc/keepalived/keepalived.conf

 

4.1修改配置

修改keepalived的配置

 

[root@mysql-1 keepalived-1.3.2]# vi   /etc/keepalived/keepalived.conf

 

! Configuration File for keepalived

global_defs {

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 192.168.136.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}

 

vrrp_script chk_haproxy {                       

    script "/etc/keepalived/check_haproxy.sh"

    interval 2

    weight 2

}

 

vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.136.200

    }

 

    track_script {                                       

        chk_haproxy

    }

    notify_backup "/etc/init.d/haproxy restart"

    notify_fault "/etc/init.d/haproxy stop"

}

以上配置中priority 100 属性在第二台的配置文件中为priority 99,根据级别来决定虚拟地址绑定到哪台主机。

其他属性:

virtual_ipaddress {

        192.168.136.200

}

192.168.136.200是浮动主机地址,用来动态绑定haproxy (215或者115),对外提供了统一的200接口,保证了故障发生时,应用调用服务透明。

创建/etc/keepalived/chk_haproxy.sh

#!/bin/bash

if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ];then

    /etc/init.d/haproxy start

fi

sleep 2

if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then

    /etc/init.d/keepalived stop

fi

 

 

chmod +x /etc/keepalived/chk_haproxy.sh

下面验证高可用

4.2正常启动

  1. 启动215和115的keepalived

检查215主机的ip,注意标红色的说明,215当前绑定了一个虚拟地址, 192.168.136.200(这个地址也是对外的接口地址)

 

打开一个mysql连接,这里用navicat来模拟

 

当前工作正常。

4.3 模拟215服务器中断,服务高可用

关闭215服务,这时192.168.136.200虚拟地址会漂移到115服务器

检查mysql服务,关闭再打开,依然正常

检查115服务器上的集群状态

Mgmd节点,只有115还正常,另外一个节点显示not connected,115haproxy显示也正常

以上结果符合预期,

4.4 服务器215重启

重新启动215服务器,将管理节点服务启动,由于已经部署了haproxy监控脚本,因此看看是否自动启动了haproxy

Keepalived启动后会自己检查根据优先级重新将虚拟地址 192.168.136.200接管过来。

可以看到通过haprox+keepalived以及一些辅助脚本,一起实现了mysql集群的高可用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第二篇:mysql负载均衡、高可用方案:mysqlcluster+haproxy+keepalived 的相关文章

随机推荐

  • 基础练习—矩阵乘法

    题目描述 给定一个N阶矩阵A 输出A的M次幂 M是非负整数 例如 A 1 2 3 4 A的2次幂 7 10 15 22 输入 第一行是一个正整数N M 1 lt N lt 30 0 lt M lt 5 表示矩阵A的阶数和要求的幂数 接下来N
  • excel或txt格式坐标到面图层(python)

    背景 现有如下图所示的多个界址点坐标 excel格式或txt格式 需求 根据大量界址点坐标转换为界址点坐标对应的面shp图层 解决思路 一 为方便处理首先将txt文件或excel文件转换为csv文件 逗号分割符 二 为方便理解和使用 我们将
  • python numpy的学习

    0 引入numpy import numpy as np 1 将list变成np a 1 2 3 4 5 6 b np array a 将list变成array a shape 2 3 2行3列 a shape 0 2 获取行数 a sha
  • 攻防世界之WEB新手练习区(更新至11)

    攻防世界之WEB新手练习区 目录 001 view source 002 get post 003robots 004backup 005cookie 006disable button 007simple js 008xff refere
  • FTDI FT2232H在嵌入式教学中的应用

    FT2232H是FTDI chip在2012年发布的一款高速USB转串行通信的协议转换芯片 作为第五代USB协议转串行总线通信协议的芯片 完全符合USB2 0规范 480Mb s 并且可以依靠编程的方式配置成为串行或者并行的其他总线接口规范
  • Pycharm无法正常安装第三方库的时候,有以下几条应对方法

    1 首先检查自己的环境变量是否配置正确 点击setting 点击 Python Interpreter 点击Add Interpreter 配置完毕之后再试一次从这里下载 如果还不行的话可以换其他方法 2 从cmd或Pycharm Term
  • 什么是EL表达式

    EL表达式 expression language 即表达语言 它是为了便于存取数据而定义的一种语言 JSP2 0之后才成为一种标准 形式 以 开头 以 结尾 通过PAGE指令来说明是否支持EL表达式 具体举例 声明可以使用EL表达式 如果
  • 【腾讯云 TDSQL-C Serverless 产品测评】全面测评TDSQL-C Mysql Serverless

    全面测评TDSQL C Mysql Serverless 文章目录 全面测评TDSQL C Mysql Serverless 前言 什么是TDSQL C Mysql Serverless 初始化 TDSQL C Mysql Serverle
  • 前车之覆,后车之鉴——开源项目经验谈

    前车之覆 后车之鉴 开源项目经验谈 本文发表于 程序员 2005年第2期 随着开源文化的日益普及 参与开源 似乎也变成了一种时尚 一时间 似乎大家都乐于把自己的代码拿出来分享了 就在新年前夕 我的一位老朋友 一位向来对开源嗤之以鼻的J2EE
  • 毕设 ssd tf_gpu2 predict.py 备份代码

    如图 代码所属 https github com bubbliiiing ssd tf2 怕到时候改坏了 unbelievable 不是 import time import cv2 import numpy as np import te
  • 数据结构顺序表和链表(超详细)

    线性表 线性表 linear list 是 n 个具有相同特性的数据元素的有限序列 线性表是一种在实际中广泛使 用的数据结构 常见的线性表 顺序表 链表 栈 队列 字符串 线性表在逻辑上是线性结构 也就说是连续的一条直线 但是在物理结构上并
  • Java中如何编解码

    继续学习Java Web的编解码章节 记录Java中如何把ISO 8859 GB 2312 GBK UTF 16 UTF 8编码进行编码 额 System out printf x int b i 这句代码没有懂 希望大家评论帮忙解决 pu
  • html嵌入地图

    一 打开 百度地图生成器 的网址 http api map baidu com lbsapi creatmap index html 复制代码 保存html 二 在需要地图的位置 插入这行代码 长宽大小可以自定义 三 效果
  • javaweb应用的MVC分层,开发太方便了!!!

    javaweb应用的MVC分层 让我们先来了解一下 MVC开发模式的组成吧 看完这张图 你有什么看法 知道了这样的开发模式后 动手创建一个工程吧 如图是根据上图创建的一个实例 当然有很多的优点 相对于javaweb的初级开发 优点 耦合性低
  • C++简介

    C 是一种计算机高级程序设计语言 由C语言扩展升级而产生 最早于1979年由本贾尼 斯特劳斯特卢普在AT T贝尔工作室研发 C 既可以进行C语言的过程化程序设计 又可以进行以抽象数据类型为特点的基于对象的程序设计 还可以进行以继承和多态为特
  • SpringFramework核心技术一(IOC容器:IOC容器和Bean介绍)

    题记 做技术还是得一步步慢慢来 先搞懂核心原理 一味的只会用 是没有未来的啊 在现在的区块链公司当带着大家做项目的时候 我就经常说作为一名工程师 一定不能浮于表面 如果想在技术这条路上走下去 懂原理才是根本 现在框架太多 但是Spring依
  • JetBrains出品必属精品

    文章目录 JetBrains出品必属精品 数据库工具DataGrip 使用背景 工具优势 新手使用说明及常用设置说明 总结说明 JetBrains出品必属精品 数据库工具DataGrip 使用背景 笔者从业七八年 用过的数据库工具不下四五个
  • Linux 查看服务器开放的端口号

    在讨论这个问题前 我们先来了解一下物理端口 逻辑端口 端口号等计算机概念 端口相关的概念 在网络技术中 端口 Port 包括逻辑端口和物理端口两种类型 物理端口指的是物理存在的端口 如ADSL Modem 集线器 交换机 路由器上用 于连接
  • 二分查找-(在一个有序数组查找某个数字n)

    1 二分查找 注意前提 有序数组 传统方法查找的代码演示 include
  • 第二篇:mysql负载均衡、高可用方案:mysqlcluster+haproxy+keepalived

    上一篇介绍了mysqlcluster的安装和配置 本篇将描述高可用的mysql集群组建方式 高可用的mysql集群有多种方式 本篇介绍的是 mysqlcluster haproxy keepalived方案 下篇将介绍通过普通版本的mysq