记一次mysql高可用技术分享

mysql负载均衡集群

1.1 haproxy介绍

HAProxy 是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于 TCP 和 HTTP 的应用程序代理。

  • HAProxy 特别适用于那些负载特大的 web 站点,这些站点通常又需要会话保持或七层处理。
  • HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的 web 服务器不被暴露到网络上。
  • HAProxy 实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间 (User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个 CPU 时间片 Cycle 做更多的工作。
  • 相较与 Nginx,HAProxy 更专注与反向代理,因此它可以支持更多的选项,更精细的控制,更多的健康状态检测机制和负载均衡算法。
  • 包括 GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter 和 Tuenti 在内的知名网站,及亚马逊网络服务系统都使用了 HAProxy。

Haproxy的特性:

1. 可靠性与稳定性都非常出色,可与硬件级设备媲美。

  1. 支持连接拒绝,可以用于防止 DDoS 攻击
  2. 支持长连接、短连接和日志功能,可根据需要灵活配置
  3. 路由 HTTP 请求到后端服务器,基于 cookie 作会话绑定;同时支持通过获取指定的 url 来检测后端服务器的状态
  4. HAProxy 还拥有功能强大的 ACL 支持,可灵活配置路由功能,实现动静分离,在架构设计与实现上带来很大方便
  5. 可支持四层和七层负载均衡,几乎能为所有服务常见的提供负载均衡功能
  6. 拥有功能强大的后端服务器的状态监控 web 页面,可以实时了解设备的运行状态 ,还可实现设备上下线等简单操作。
  7. 支持多种负载均衡调度算法,并且也支持 session 保持。
  8. Haproxy 七层负载均衡模式下,负载均衡与客户端及后端的服务器会分别建立一次 TCP连接,而在四层负载均衡模式下(DR),仅建立一次 TCP 连接;七层负载均衡对负载均衡设备的要求更高,处理能力也低于四层负载均衡

1.2 配置文件详细介绍

注意:此处只做配置文件介绍,不做为后期负载均衡配置

global
    log 127.0.0.1 local0                                        # 定义全局的 syslog 服务器,最多可定义2,格式:log <address> <facility> [max level [min level]]
    chroot /var/lib/haproxy                                     # 修改 haproxy 的工作目录至指定的目录并在放弃权限之前执行,保证haproxy的安全,使用配置文件默认值即可
    pidfile /var/run/haproxy.pid
    maxconn 10000                                               # 设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的;
    user haproxy                                                # 以指定的 user 运行haproxy,建议使用专用于运行 haproxy 的 user, 以免因权限问题带来风险;
    group haproxy                                               # 以指定的 group 运行haproxy,建议使用专用于运行 haproxy 的 group, 以免因权限问题带来风险;
    daemon                                                      # 让 haproxy 以守护进程的方式工作于后台,其等同于 “-D” 选项的功能, 当然,也可以在命令行中以 “-db” 选项将其禁用;
    ulimit-n 100000                                             # 设定每进程所能够打开的最大文件描述符数目,默认情况下其会自动进行计算,因此不推荐修改此选项;Linux默认单进程打开文件数为1024个
    stats socket /var/lib/haproxy/stats level admin process 1   # 开启一个 socket 管理接口
    nbproc 12                                                   # 指定启动的 haproxy 进程个数,只能用于守护进程模式的 haproxy;默认只启动一个进程,
    cpu-map 1 0                                                 # 绑定 cpu,和 nbproc 数量相对。进程号从1开始,cpu 核数从0开始;

defaults
    log global
    option tcplog                                               # 启用日志记录;tcplog 请求;
    option dontlognull                                          # 日志中将不会记录空连接;
    retries 3                                                   # 定义连接后端服务器的失败重连次数
    timeout connect 2s                                          # 定义 haproxy 将客户端请求转发至后端服务器所等待的超时时长
    timeout client 3600s                                        # 客户端非活动状态的超时时长
    timeout server 3600s                                        # 客户端与服务器端建立连接后,等待服务器端的超时时长
    maxconn 10000                                               # 默认和前段的最大连接数,但不能超过 global 中的 maxconn 限制数

listen admin_stats                                              # 开启一个统计报告服务
    bind *:1080                                                 # 监听1080端口
    mode http                                                   # 基于http协议
    maxconn 10
    stats refresh 10s                                           # 统计页面自动刷新时间间隔
    stats uri /haproxy                                          # url 地址
    stats realm Haproxy                                         # 统计页面密码框上提示文本
    stats auth admin:admin                                      # 账号:密码
    stats hide-version                                          # 隐藏统计报告版本信息
    stats admin if TRUE                                         # 在制定条件下开启admin 功能

frontend haproxy                                                # 前端应用
    bind *:40000                                                # 端口
    mode tcp                                                    # tcp 模式
    default_backend tidb                                        # 此前端对应的后端应用

backend tidb                                                    # 后端应用
    balance leastconn                                           # balance 基于最少连接数
    mode tcp                                                    # tcp 模式
    # acl internal_networks src 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 127.0.0.1  定义一条ACLACL是根据数据包的指定属性以指定表达式计算出的true/false值。
    # tcp-request content reject if ! internal_networks
    # option mysql-check user haproxy post-41
    server tidb1 10.0.1.4:4000 check                            # 后端应用地址,代理将会将对应客户端的请求转发至这些服务器。
    server tidb2 10.0.1.10:4000 check

1.3 haproxy安装与环境配置

在192.168.199.175与192.168.199.172(负载均衡服务器)中安装与配置如下:

  1. 安装haproxy负载均衡器
yum install haproxy -y
  1. 配置haproxy配置文件,目录:/etc/haproxy/haproxy.cfg
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    mode                   tcp
    log                     global
    option                  tcplog
    option                  dontlognull
    option http-server-close
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend    mysql
    bind        0.0.0.0:3307
    mode       tcp
    log             global
    default_backend         mysql_server

backend     mysql_server
    balance     roundrobin
    server  mysql1 192.168.199.172:3306 check inter 5s rise 2 fall 3
    server  mysql2 192.168.199.175:3306 check inter 5s rise 2 fall 3

listen stats
    mode http
    bind 0.0.0.0:1080
    stats enable
    stats hide-version
    stats uri /haproxyadmin?stats
    stats realm Haproxy\ Statistics
    stats auth admin:admin
    stats admin if TRUE
  1. 启动haproxy负载均衡
./usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
  1. 查看状态

192.168.126.101:1080/haproxyadmin?s...

2.1 Keepalived介绍

Keepalived的作用是检测服务器的状态,如果有一台服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其它服务器代替该服务器的工作,当服务器工作 正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

2.2 Keepalived安装

  1. 安装Keepalived需要的扩展
[root@localhost keepalived]# yum install gcc gcc-c++ openssl openssl-devel
[root@localhost home]# wget -q https://www.keepalived.org/software/keepalived-1.2.18.tar.gz

2.解压Keepalived并安装

[root@localhost home]# tar -zxvf keepalived-1.2.18.tar.gz
[root@localhost home]# cd keepalived-1.2.18
[root@localhost keepalived-1.2.18]# ./configure --prefix=/usr/local/keepalived
[root@localhost keepalived-1.2.18]# make && make install
  1. 将 keepalived 安装成 Linux 系统服务

因为没有使用 keepalived 的默认路径安装(默认是/usr/local) ,安装完成之后,需要做一些工作 复制默认配置文件到默认路径

[root@localhost keepalived-1.2.18]# mkdir /etc/keepalived
[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

复制 keepalived 服务脚本到默认的地址

[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[root@localhost keepalived-1.2.18]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
[root@localhost keepalived-1.2.18]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/

设置 keepalived 服务开机启动

[root@localhost keepalived-1.2.18]# chkconfig keepalived on

3. mysql高可用搭建

3.1 Keepalived配置

keepalived主机配置

! Configuration File for keepalived
global_defs {
    router_id LVS_MASTER
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh" ## 检测 haproxy 状态的脚本路径
    interval 2 ## 检测时间间隔
    weight 2 ## 如果条件成立,权重+2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 79
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.29.101
    }
    track_script {
        chk_haproxy
    }
}
# 写VIP virtual_server,只配置本地机器
virtual_server 192.168.29.101 3307 {# 定义虚拟服务器,地址与上面的virtual_ipaddress相同
    delay_loop 3 # 健康检查时间间隔,3秒
    lb_algo rr # 负载均衡调度算法:rr|wrr|lc|wlc|sh|dh|lblc
    lb_kind DR # 负载均衡转发规则:NAT|DR|TUN
    # persistence_timeout 5 # 会话保持时间5秒,动态服务建议开启
    protocol TCP # 转发协议protocol,一般有tcp和udp两种
    real_server 192.168.29.106 3307 {
        weight 1 # 权重越大负载分越大,0表示失效
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

Keepalived从机配置

! Configuration File for keepalived
global_defs {
    router_id LVS_MASTER
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh" ## 检测 haproxy 状态的脚本路径
    interval 2 ## 检测时间间隔
    weight 2 ## 如果条件成立,权重+2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 79
    priority 90
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.29.101
    }
    track_script {
        chk_haproxy
    }
}
# 写VIP virtual_server,只配置本地机器
virtual_server 192.168.29.101 3307 {# 定义虚拟服务器,地址与上面的virtual_ipaddress相同
    delay_loop 3 # 健康检查时间间隔,3秒
    lb_algo rr # 负载均衡调度算法:rr|wrr|lc|wlc|sh|dh|lblc
    lb_kind DR # 负载均衡转发规则:NAT|DR|TUN
    # persistence_timeout 5 # 会话保持时间5秒,动态服务建议开启
    protocol TCP # 转发协议protocol,一般有tcp和udp两种
    real_server 192.168.29.107 3307 {
        weight 1 # 权重越大负载分越大,0表示失效
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }
    }
}

启动

[root@localhost keepalived]# service keepalived start

haproxy状态检测脚本

 touch /etc/keepalived/haproxy_check.sh
#!/bin/bash
START_HAPROXY="/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg" #haproxy启动命令
LOG_FILE="/usr/local/keepalived/log/haproxy-check.log" # 日志文件
HAPS=`ps -C haproxy --no-header |wc -l` # 检测haproxy的状态,0代表未启动,1已经启动
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE #在日志文件当中记录检测时间
echo "check haproxy status" >> $LOG_FILE # 记录haproxy的状态
if [ $HAPS -eq 0 ];then #执行haproxy判断
  echo $START_HAPROXY >> $LOG_FILE #记录启动命令
  /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg #启动haproxy
  sleep 3
  if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
    echo "start haproxy failed, killall keepalived" >> $LOG_FILE
    killall keepalived
    service keepalived stop
  fi
fi

测试 网卡漂移

D:\phpstudy_pro\Extensions\MySQL5.7.26\bin>mysql -h192.168.126.33 -uslave -p1234
5678 -P3307  -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+

D:\phpstudy_pro\Extensions\MySQL5.7.26\bin>mysql -h192.168.126.33 -uslave -p1234
5678 -P3307  -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 3     |
+---------------+-------+

D:\phpstudy_pro\Extensions\MySQL5.7.26\bin>mysql -h192.168.126.33 -uslave -p1234
5678 -P3307  -e "show variables like 'server_id'"
mysql: [Warning] Using a password on the command line interface can be insecure.

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 3     |
+---------------+-------+
本作品采用《CC 协议》,转载必须注明作者和本文链接
有梦想的人睡不着,没有梦想的人睡不醒。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 1

keepalived不好,容易出现脑裂

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
文章
88
粉丝
23
喜欢
134
收藏
269
排名:228
访问:4.2 万
私信
所有博文
博客标签
redis
1
php
1
laravel
7
docker
3
orm
2
sync
1
pivot
1
detach
2
attach
2
算法
1
递归
1
多对多
1
lnmp环境搭建
1
GO变量
1
GO数据类型
1
IOC注入反转
1
IOC容器的绑定解析过程(绑定单例)
1
原生微信网页授权登录(natapp穿墙)
1
VMwareNAT网卡配置
1
MySQL基础架构
1
redis 主从搭建
1
Sentinel哨兵模式解决故障转移
1
elasticsearch安装
1
elasticsearch集群安装3台
1
安装kibana
1
必须了解的mysql三大日志-binlog、redo log和undo log
1
何处理数据恢复 数据丢失 面试tx的架构师的岗位问的
1
分库分表插入数据
1
创建分库分表(在主从复制的基本上)
1
分库分表总结
1
mysql总结
1
haproxy状态检测脚本(完成高可用)
1
mysql高可用衡搭建(Keepalived)
1
mysql负载均衡搭建(haproxy)
1
mysql主从恢复数据一致性(pt工具-t-table-checksum和pt-table-sync)
1
终于解决了《====》记一次mysql热备份xtrabackup(没有解决问题)
1
mysql事务
1
MYSQL8.0安装
1
Redis-cluster分布式集群搭建部署
1
比Redis-cluster还好的redis分布式集群(twemproxy)
1
Redis缓存穿透/缓存雪崩/缓存击穿(案例:产生的原因 解决方案利/弊)
1
数据结构之MySQL独爱B+树(二叉树、AVL树、红黑树、B树对比)
1
B-tree
1
B+tree
1
Mycat实现mysql的负载均衡读写分离
2
mysql双主双从 搭建配置
1
mycat 双主双从-负载均衡-高可用
1
Mycat垂直分库
1
记一次mysql高可用技术分享
1
【rabbitmq】安装ampq的扩展的踩坑总结
1
PHP操作MongoDB(增删改查)
1
golang总结
5
社区赞助商