### **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. 可靠性与稳定性都非常出色,可与硬件级设备媲美。 2. 支持连接拒绝,可以用于防止 DDoS 攻击 3. 支持长连接、短连接和日志功能,可根据需要灵活配置 4. 路由 HTTP 请求到后端服务器,基于 cookie 作会话绑定;同时支持通过获取指定的 url 来检测后端服务器的状态 5. HAProxy 还拥有功能强大的 ACL 支持,可灵活配置路由功能,实现动静分离,在架构设计与实现上带来很大方便 6. 可支持四层和七层负载均衡,几乎能为所有服务常见的提供负载均衡功能 7. 拥有功能强大的后端服务器的状态监控 web 页面,可以实时了解设备的运行状态 ,还可实现设备上下线等简单操作。 8. 支持多种负载均衡调度算法,并且也支持 session 保持。 9. Haproxy 七层负载均衡模式下,负载均衡与客户端及后端的服务器会分别建立一次 TCP连接,而在四层负载均衡模式下(DR),仅建立一次 TCP 连接;七层负载均衡对负载均衡设备的要求更高,处理能力也低于四层负载均衡 **1. haproxy 的配置文件由两部分组成:** 1. 全局设定(global settings) 2. 对代理的设定(proxies) global settings:主要用于定义 haproxy 进程管理安全及性能相关的参数 proxies 共分为4段:defaults,frontend,backend,listen proxies:代理相关的配置可以有如下几个配置端组成 defaults:为除了 global 以外的其它配置段提供默认参数,默认配置参数可由下一个 “defaults” 重新设定。 frontend:定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。 backend:定义 “后端” 服务器,前端代理服务器将会把客户端的请求调度至这些服务器。 listen:定义监听的套接字和后端的服务器。类似于将 frontend 和 backend 段放在一起 所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL 名称会区分字母大小写。 ### **haproxy配置文件详细介绍** **注:** 此处只做配置文件介绍,不做为后期负载均衡配置 ~~~cfg global log 127.0.0.1 local0 # 定义全局的 syslog 服务器,最多可定义2个,格式:log
[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开始; cpu-map 2 1 cpu-map 3 2 cpu-map 4 3 cpu-map 5 4 cpu-map 6 5 cpu-map 7 6 cpu-map 8 7 cpu-map 9 8 cpu-map 10 9 cpu-map 11 10 cpu-map 12 11 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 # 开启一个统计报告服务(frontend 和 backend 的组合体,监控组的名称,按需自定义名称) 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 # (leastconn :基于最少连接数 roundrobin:轮询 source:ip 最近原则) 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 定义一条ACL,ACL是根据数据包的指定属性以指定表达式计算出的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 global # 全局配置 log 127.0.0.1 local0 # 定义全局的 syslog 服务器,最多可以定义两个 chroot /var/lib/haproxy # 将当前目录为指定目录,设置超级用户权限启动进程,提高安全性 pidfile /var/run/haproxy.pid # 将 HAProxy 进程写入 PID 文件 maxconn 4000 # 设置每个 HAProxy 进程锁接受的最大并发连接数 user haproxy # 同 uid 参数,使用是用户名 group haproxy # 同 gid 参数,建议专用用户组 nbproc 40 # 启动多个进程来转发请求,需要调整到足够大的值来保证 HAProxy 本身不会成为瓶颈 daemon # 让 HAProxy 以守护进程的方式工作于后台,等同于“-D”选项的功能。当然,也可以在命令行中用“-db”选项将其禁用。 stats socket /var/lib/haproxy/stats # 定义统计信息保存位置 defaults # 默认配置 log global # 日志继承全局配置段的设置 retries 2 # 向上游服务器尝试连接的最大次数,超过此值就认为后端服务器不可用 timeout connect 2s # HAProxy 与后端服务器连接超时时间,如果在同一个局域网内可设置成较短的时间 timeout client 30000s # 定义客户端与 HAProxy 连接后,数据传输完毕,不再有数据传输,即非活动连接的超时时间 timeout server 30000s # 定义 HAProxy 与上游服务器非活动连接的超时时间 listen admin_stats # frontend 和 backend 的组合体,监控组的名称,按需自定义名称 bind 0.0.0.0:8080 # 配置监听端口 mode http # 配置监控运行的模式,此处为 `http` 模式 option httplog # 表示开始启用记录 HTTP 请求的日志功能 maxconn 10 # 最大并发连接数 stats refresh 30s # 配置每隔 30 秒自动刷新监控页面 stats uri /haproxy # 配置监控页面的 URL stats realm HAProxy # 配置监控页面的提示信息 stats auth admin:pingcap123 # 配置监控页面的用户和密码 admin,可以设置多个用户名 stats hide-version # 配置隐藏统计页面上的 HAProxy 版本信息 stats admin if TRUE # 配置手工启用/禁用,后端服务器(HAProxy-1.4.9 以后版本) listen tidb-cluster # 配置 database 负载均衡 bind 0.0.0.0:3390 # 配置浮动 IP 和 监听端口 mode tcp # HAProxy 中要使用第四层的应用层 balance leastconn # 连接数最少的服务器优先接收连接。`leastconn` 建议用于长会话服务,例如 LDAP、SQL、TSE 等,而不是短会话协议,如 HTTP。该算法是动态的,对于实例启动慢的服务器,权重会在运行中作调整。(leastconn :基于最少连接数 roundrobin:轮询 source:ip 最近原则) server tidb-1 10.9.18.229:4000 check inter 2000 rise 2 fall 3 # 检测 4000 端口,检测频率为 2000 毫秒。如果检测出 2 次正常就认定机器已恢复正常使用,如果检测出 3 次失败便认定该服务器不可用。 server tidb-2 10.9.39.208:4000 check inter 2000 rise 2 fall 3 server tidb-3 10.9.64.166:4000 check inter 2000 rise 2 fall 3 ### **haproxy安装与环境配置** **前期:** 环境搭建准备: **流程:** 写操作去找主节点192.168.244.20(master),读的时候通过负载均衡 haproxy,在所有的从节点 192.168.244.30(slave),192.168.244.40(slave) 前面搭载负载均衡 proxy 节点,这个节点 1192.168.244.10(haproxy)就维护了所有节点的列表,当应用过来的时候只需要请求 haproxy 节点就可以了,这个节点对我们的请求内容进行分发到下面 192.168.244.30(slave),192.168.244.40(slave) 各节点,返回数据该由(haproxy) 节点返回。 | 服务器名称 | IP | 操作系统 | 安装服务 | | --- | --- | --- | --- | | mysql-master | 192.168.244.20 | CentOS7 | mysql | | mysql-slave1 | 192.168.244.30 | CentOS7 | mysql| | mysql-slave2 | 192.168.244.40 | CentOS7 | mysql| | mysql-haproxy| 192.168.244.10 | CentOS7 | haproxy| **1. 在 192.168.244.10 安装haproxy负载均衡器** yum install -y haproxy **2. 配置haproxy配置文件,目录:/etc/haproxy/haproxy.cfg** **2.1 haproxy 客户端配置:** # haproxy 客户端 listen http_front # 配置监听端口 bind 0.0.0.0:8100 # 配置监控运行的模式,此处为 `http` 模式 mode http # 表示开始启用记录 HTTP 请求的日志功能 option httplog # 配置ui 后缀 stats uri /haproxy # web界面用户和密码 stats auth root:0000 # 配置每隔 10 秒自动刷新监控页面 stats refresh 10s stats enable **2.1.1 访问方式:** ip:8100/haproxy ![](https://img.kancloud.cn/89/c2/89c238a82da00cd26e649215defd0465_2157x1107.png) **2.2 192.168.244.10 haproxy 服务配置:** # mysql 负载均衡服务 listen mysql_server # 配置监听端口 bind 0.0.0.0:3307 # 配置监控运行的模式,此处为 `tcp` 模式 mode tcp # 日志继承全局配置段的设置 log global # balance:基于最少连接数 roundrobin:轮询 balance roundrobin # 服务(rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用) server mysql_server_1 192.168.244.30:3306 check inter 5s rise 2 fall 3 server mysql_server_2 192.168.244.40:3306 check inter 5s rise 2 fall 3 **2.2.1 在 两台192.168.244.30(slave)192.168.244.40(slave) 添加用户授权** grant all privileges on *.* to 'wangqianshun'@'%' identified by 'wangqianshun';flush privileges; ![](https://img.kancloud.cn/2c/e3/2ce3692b797129bef11e8bd06372cc76_1024x471.png) **2.2.2 直接连接 192.168.244.10(haproxy)端口:3307 进行测试** mysql -uwangqianshun -pwangqianshun -h192.168.244.10 -P 3307 ![](https://img.kancloud.cn/2a/72/2a72c5803c638d61c781833d7e0a5ef8_1201x365.png) **2.2.3 查看 server_id** # 只要配置了不同的 server_id 多次退出重新登录 mysql 查看 server_id 则 实现轮询 show variables like 'server_id'; ![](https://img.kancloud.cn/f2/f5/f2f5a9143dd4d11dd1fd745d0897cafd_1239x761.png) **3. 启动/停止 haproxy** # 启动方式一:直接启动 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg # 启动方式二:systemd 启动 HAProxy,默认读取(推荐) systemctl start haproxy.service # 停止方式一: ps -ef | grep haproxy kill -9 haproxy.pid # 停止方式二:systemd 停止 haproxy(如果使用 systemd 启动) systemctl stop haproxy.service keepalived 是集群管理中保证集群高可用的一个服务软件, 用来防止单点故障。 Keepalived的作用是检测服务器的状态,如果有一台服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其它服务器代替该服务器的工作,当服务器工作 正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。 ***** ### **keepalived 工作原理:** keepalived 是以 VRRP 协议为实现基础的,VRRP 全称 Virtual Router Redundancy Protocol,即虚拟路由冗余协议。 ![](https://img.kancloud.cn/fb/52/fb52cbf82cb3b0ac62d389db70e3d9e1_435x257.png) 虚拟路由冗余协议,可以认为是实现路由器高可用的协议, 即将 N 台提供相同功能的路由器组成一个路由器组,这个组 里面有一个 master 和多个 backup,master 上面有一个对外 提供服务的 vip(该路由器所在局域网内其他机器的默认路 由为该 vip),master 会发组播,当 backup 收不到 vrrp 包时就认为 master 宕掉了,这时就需要根据 VRRP 的优先级来选举一个 backup 当 master。这样的话就可以保证路由器的高 可用了。 ### **keepalived 工具安装:** (方式一:) **1. 安装 keepalived 需要用到 openssl** yum install gcc gcc-c++ openssl openssl-devel cd /usr/local # wget -q 不显示任何下载信息 wget -q https://www.keepalived.org/software/keepalived-1.2.18.tar.gz **2. 解压并编译安装** tar -zxvf keepalived-1.2.18.tar.gz && cd keepalived-1.2.18 ./configure --prefix=/usr/local/keepalived make && make install **3. 将 keepalived 安装成 Linux 系统服务** 复制默认配置文件到默认路径: mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ 复制 keepalived 服务脚本到默认的地址: cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/ **4. 设置 keepalived 服务开机启动** # 开机启动: systemctl enable keepalived # 启动方式一:on off reset chkconfig keepalived on # 启动方式二: service keepalived start # 启动方式三: systemctl start keepalived ### **keepalived 工具安装:** (方式二:) yum install keepalived -y 配置文件默认地址: /etc/keepalived/keepalived.conf >[info] keepalived 示例 ### **前期:** 环境搭建准备: 注: 已配置好一主二从 | 服务器名称 | IP | 操作系统 | 安装服务 | | --- | --- | --- | --- | | mysql-master | 192.168.244.20 | CentOS7 | mysql、keepalived | | mysql-slave1 | 192.168.244.30 | CentOS7 | mysql、keepalived | | mysql-slave2 | 192.168.244.40 | CentOS7 | mysql| ### **1. keepalived 配置文件:** **1.1 keepalived master 节点配置文件(192.168.244.20)** 注: 直接将文件内容清空 注: 只需要修改 2 个 vip ip 和 物理机 ip 即可 注: master 和 backup 有其他配置项不一致,请勿直接复制 master 到 backup 修改。 参数: >nopreempt //非抢占,配合backup,防止切换后,主库服务恢复正常后,IP 漂移过来。(master backup都设置) ![](https://img.kancloud.cn/a3/e4/a3e493d6055842ddf96271b07aada715_382x471.png) ! Configuration File for keepalived global_defs { router_id LVS_MASTER vrrp_sync_group VG1 { group { vrrp_script haproxy_check { 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 12345678 virtual_ipaddress { # 该ip为虚拟出来的vip地址(网段内只要不冲突 随便定义) 192.168.244.240 track_script { haproxy_check # 写VIP virtual_server,只配置本地机器 virtual_server 192.168.244.240 3306 {# 定义虚拟服务器,地址与上面的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 该配置为实际物理机ip地址 以及实际物理机mysql端口 real_server 192.168.244.20 3306 { weight 1 # 权重越大负载分越大,0表示失效 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 **1.2 keepalived backup 节点配置文件(192.168.244.30)** 注: 直接将文件内容清空 注: 只需要修改 2 个 vip ip 和 物理机 ip 即可 注: master 和 backup 有其他配置项不一致,请勿直接复制 backup 到 master 修改。 ! Configuration File for keepalived global_defs { router_id LVS_MASTER vrrp_sync_group VG1 { group { vrrp_script haproxy_check { 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 12345678 virtual_ipaddress { # 该ip为虚拟出来的vip地址(网段内只要不冲突 随便定义) 192.168.244.240 track_script { haproxy_check # 写VIP virtual_server,只配置本地机器 virtual_server 192.168.244.240 3306 {# 定义虚拟服务器,地址与上面的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 该配置为实际物理机ip地址 以及实际物理机mysql端口 real_server 192.168.244.30 3306 { weight 1 # 权重越大负载分越大,0表示失效 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 connect_port 3306 **1.3 haproxy 状态检测脚本** 1. 创建检测日志文件 mkdir -p /usr/local/keepalived/log && touch /usr/local/keepalived/log/haproxy-check.log 2. 在 192.168.244.20(master)和 192.168.244.30(slave) ``/etc/keepalived/``新建:`haproxy_check.sh` 注: windows 的 sh 复制到 linux 会存在 换行符问题 ![](https://img.kancloud.cn/b6/c2/b6c26103094e60392243d7a7efcc8296_1045x402.png) ~~~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 #!/bin/bash # 检测 mysql 服务 /usr/bin/mysql -uroot -p'123456' -e "show status" &>/dev/null # 服务挂掉 if [ $? -ne 0 ] ;then # 直接停止 keepalived 让其漂移 systemctl stop keepalived 执行授权: chmod +x /etc/keepalived/haproxy_check.sh ### **2. 测试一:** **2.1 先从 192.168.244.30(backup) 启动 keepalived 使用 ip a 查看是否存在 192.168.244.240 网卡** systemctl restart keepalived ip a | grep 192.168.244.240 ![](https://img.kancloud.cn/a4/f5/a4f5a22134dfa2dccb69903f5bff91ec_1151x565.png) **2.2 再从 192.168.244.20(master) 启动 keepalived 使用 ip a 查看是否存在 192.168.244.240 网卡 存在则ip偏移过来了 则 `backup` 使用 ip a 192.168.244.240 网卡不存在** systemctl restart keepalived ip a | grep 192.168.244.240 ![](https://img.kancloud.cn/ac/a3/aca367092520d361407770851e423cd8_1004x425.png) ![](https://img.kancloud.cn/55/c8/55c88878d391296b207d3ec2bf0d54b0_1082x576.png) **2.3 本地通过 虚拟ip 端口:3306 直接连接 mysql 进行测试 server_id** (vip 在 backup master 和外部连接都能成功) (vip 在 master backup 连接失败 外部能够成功) mysql -uwangqianshun -pwangqianshun -h192.168.244.240 -P 3306 ### **3. 测试二:** 1. `master` 或 `backup` 停止 keepalived,查看主从切换。(ip切换)(成功) 2. 停止 `master` 上 `mysql`,查看主从切换(正常本机 keepalived 检查到 mysql不在了,会执行 haproxy_check.sh 脚本直接 kill 掉 keepalived 进程)。(成功) ![](https://img.kancloud.cn/3c/c8/3cc835812c29f9f2146e030112315903_1071x398.png) 注: haproxy 状态检测脚本不执行问题,如果是使用的 `service keeplived start` 或者是 `systemctl` 方式启动,脚本可能会不执行,可以使用`keepalived -f /etc/keepalived/keepalived.conf` 方式启动 keepalived 注: keepalived 配置注意点 - 配置完成但是ip不生效; 1. 查看虚拟机/机器系统时间是否一致 2. virtual_router_id 路由id不对,不能冲突。可以通过 /var/log/messages 查看此错误。 如:server-1、server-2为一组,virtual_router_id = 51 如:server-3、server-4为一组,则 virtual_router_id 不能为 51 注: keepalive 默认的日志写入了 /var/log/messages下。 ### **4. 测试三:** **介绍:** > 两台mysql互为主从,但只有master写,slave只负责读。主从通过keepalive做成高可用,当master出问题,由slave接替master工作,即读写都在slave操作。当master恢复正常,master自动同步故障时间段数据,接替slave的写工作。 1. master1 直接停止 mysql 使 keepalived 漂移到 backup ![](https://img.kancloud.cn/c4/31/c431093182c0db6a8f321888eee89ed0_840x145.png) ![](https://img.kancloud.cn/be/e9/bee9b2237283793b2015c40210ed274e_860x123.png)