>[info] keepalived + haproxy + mysql双主高可用
### **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 <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开始;
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 工作原理:**
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 示例
### **前期:** 环境搭建准备:
<span style="color:red"><b> 注:</b></span> 已配置好一主二从
| 服务器名称 | 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)**
<span style="color:red"><b> 注:</b></span> 直接将文件内容清空
<span style="color:red"><b> 注:</b></span> 只需要修改 2 个 vip ip 和 物理机 ip 即可
<span style="color:red"><b> 注:</b></span> master 和 backup 有其他配置项不一致,请勿直接复制 master 到 backup 修改。
<span style="color:red"><b> 参数:</b></span>
>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 {
VI_1
}
}
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)**
<span style="color:red"><b> 注:</b></span> 直接将文件内容清空
<span style="color:red"><b> 注:</b></span> 只需要修改 2 个 vip ip 和 物理机 ip 即可
<span style="color:red"><b> 注:</b></span> master 和 backup 有其他配置项不一致,请勿直接复制 backup 到 master 修改。
~~~
! Configuration File for keepalived
global_defs {
router_id LVS_MASTER
}
vrrp_sync_group VG1 {
group {
VI_1
}
}
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`
<span style="color:red"><b> 注:</b></span> 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
fi
fi
~~~
~~~
#!/bin/bash
# 检测 mysql 服务
/usr/bin/mysql -uroot -p'123456' -e "show status" &>/dev/null
# 服务挂掉
if [ $? -ne 0 ] ;then
# 直接停止 keepalived 让其漂移
systemctl stop keepalived
fi
~~~
执行授权:
```
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** <span style="color:green"><b>(vip 在 backup master 和外部连接都能成功)</b></span> <span style="color:red"><b>(vip 在 master backup 连接失败 外部能够成功)</b></span>
```
mysql -uwangqianshun -pwangqianshun -h192.168.244.240 -P 3306
```
### **3. 测试二:**
1. `master` 或 `backup` 停止 keepalived,查看主从切换。(ip切换)<span style="color:green"><b>(成功)</b></span>
2. 停止 `master` 上 `mysql`,查看主从切换(正常本机 keepalived 检查到 mysql不在了,会执行 haproxy_check.sh 脚本直接 kill 掉 keepalived 进程)。<span style="color:green"><b>(成功)</b></span>
![](https://img.kancloud.cn/3c/c8/3cc835812c29f9f2146e030112315903_1071x398.png)
<span style="color:red"><b> 注:</b></span>
haproxy 状态检测脚本不执行问题,如果是使用的 `service keeplived start` 或者是 `systemctl` 方式启动,脚本可能会不执行,可以使用`keepalived -f /etc/keepalived/keepalived.conf` 方式启动 keepalived
<span style="color:red"><b> 注:</b></span>
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
<span style="color:red"><b> 注:</b></span>
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)
- PHP
- ThinkPHP5
- 变量修饰符:input()
- 常用函数封装
- 01. 数据集转为树(Tree)
- 02. 生成订单号
- 03. 将时间戳转换为日期时间
- 04. 将字节转换为可读文本
- 05. 首字母头像
- 06. 随机小数/截取小数
- 07. 判断字符串是否序列化
- 08. 根据生日计算年龄
- 09. 判断是PC或WAP端
- 10. 请求网页返回code码状态
- 11. 计算代码执行时间
- 12. String 字符处理类
- 13. Http 请求类
- 14. StrRand 随机生成字符类
- 15. 获取当天开始时间和结束时间
- 16. 手机邮箱身份证
- 17. jsonEncode和jsonDecode助手函数
- 18. tp6跨域检测
- 19.日期转换为时间戳
- 20.excel导入日期格式问题
- 21.取整数函数常用的四种方法
- 22.PHPExcel导入导出
- 23.计算文件大小
- 24.计算按天数
- 25.文件夹不存在则创建
- 26.递归获取部门所有子级id
- 27.根据用户名生成默认文字头像
- 28.生成短信验证码
- 29.数据脱敏
- 30.根据身份证判断禁止未成年人下单
- 31.数组向指定位置插入元素
- 32.从字符串中获取城市名称
- 33.收货地址拆分省市区
- 34.根据时间戳获取本月开始-结束日期
- 35.循环每次查询指定数据集
- 36.判断日期是否符合范围
- Laravel6
- 01.Dingo API 2.0.0 扩展包
- 01.laravel 安装扩展包
- 02.创建端点
- 03.响应
- 04.api认证
- 监听sql 语句
- 安装easywechat
- 路由分组
- ThinkPHP6
- ThinkPHP6读写分离
- 定时计划任务
- 伪静态
- 多应用模式
- Join关联查询
- 跨域中间件
- extend扩展
- 1.操纵文件类
- 2.压缩包驱动
- Xdebug调试
- Easy Task开发文档
- 01.EasyTask介绍
- 02.EasyTask环境安装
- 03.EasyTask基础入门
- EasySwoole
- 999.状态类
- 01.EasySwoole快速开始
- 1.EasySwoole介绍
- 2.EasySwoole快速上手
- 3.EasySwoole基本管理命令
- 4.EasySwoole基础开始示例(CURD)
- 02.EasySwoole协程操作指南
- 1.什么是协程
- MySQL
- MySQL批量修改表前缀
- 重置【主键ID】
- 查看【文件存储位置】
- MySQL主从同步
- 添加用户权限
- MySQL主从复制集群
- 01.主从复制技术原理介绍
- 02.基于 binlog 主从复制搭建
- 03.基于binlog不影响业务搭建主从
- 04.主从复制 binlog 格式
- 05.主从复制过滤规则
- 06.在线增加从服务器
- 07.MySQL 双主复制
- 08.双主如何防止和解决主键冲突
- keepalived+haproxy+mysql双主高可用
- lvs+keepalived+双主mysql负载均衡
- MyCAT实现MySQL读写分离
- 09.多线程复制
- MHA
- 1.理解MHA高可用
- 2.搭建MySQL一主二从
- 3.建立节点互信
- 4.构建MHA
- 5.启动并测试MHA
- 6.修复宕机的Master
- 重置root密码
- MySQL 开发规范
- mycat
- 01.mycat 简介与安装
- 02.mycat 配置详解
- 03.mycat 切片规则
- 常用SQL语句大全
- 01.取数骚SQL
- 02.评估表数据体量SQL
- Linux
- Contos 7
- 常用命令
- 解压【zip】
- vmhgfs 挂载
- 跨主机免密码认证
- 宝塔Linux面板
- 01.宝塔专业/企业版一键脚本破解版
- Windows
- 服务器
- 调出【桌面图标】
- 查看【端口使用】
- 查看【操作日志】
- 查看【本地组策略】
- HTML
- URL编码参照表
- RabbitMQ
- 01.rabbitMQ 快速入门
- 1. 认识 RabbitMQ
- 4. 消费者生产者代码实例
- 3. 安装 amqp 扩展
- 2. RabbitMQ安装和启动
- 02.rabbitMQ 高级特性
- 1. 高级特性前言
- 2. 高级特性之一ack comfirm机制
- 3. 高级特性之二如何保证消息的100%接收(一)
- 4. 高级特性之二如何保证消息的100%接收(二)
- 5. 高级特性之三幂等性
- 6. 高级特性之四 return机制
- 7. 高级特性之五 限流机制
- 8. 高级特性之六 重回队列
- 9. 高级特性之七 TTL
- 10. 高级特性之八 死信队列
- 03.tp6简单应用 RabbitMQ
- 04.fanout 订阅/广播模式
- 05.topic 通配符模式
- Composer
- Composer 镜像
- Compsoer 基础使用
- Composer require 忽略依赖
- 微信公众号
- 返回错误代码说明
- 福利专区
- layuiAdmin框架模板
- Swoole
- 01.快速入门
- 1.swoole的概念介绍
- 2.安装swoole
- 3. 快速运用swoole与理解
- 02.快速上手swoole与网络协议
- 1.阻塞与非阻塞,同步与异步
- 2.HttpServer 加速php框架
- 3.WebSocket 简单运用
- 4.tcp 与 upd 与 定时器
- 5.理解进程-非详细
- 6.swoole结构
- 03.连接与tcp和upd
- 1.短链接与长连接
- 2.健康检查
- 3.tcp 和 udp对比
- 4.tcp粘包的问题
- 5.tcp粘包问题的处理
- 04.理解网络模型
- 1.linux内核与用户空间调度
- 2.网络io模型
- 3.构建worker结构iostar
- 4.理解stream系列函数
- 05.阻塞模型与非阻塞模型
- 1.构建基础worker结构
- 2.搭建工程的结构
- 3.实现基础版本的worker
- 4.完善worker模型
- 5.非阻塞模型与stream_select函数
- 6.补充
- 06.实现io复用与信号模型
- 07.实现异步io模型与Reactor模型
- 08.实现多进程reactor
- 09.详解task进程
- 10.swostar之http与websocket
- 11.think-swoole使用
- 12.swostar之构建基础核心结构
- 99.其他
- 西部数码
- 01.NginxSLB搭建
- 02.windows 服务器取消多登录
- PHP中高级面试题
- PHP基础面试题
- MySQL面试题
- Redis面试题
- es面试题
- rqbbitMQ面试题
- 魔鬼训练营
- 现场解答课-面试解答
- Laravel技术社区(干货题库汇总)
- 01.干货题库(一)
- 02.干货题库(二)
- 03.MySQL 常见面试题(1-25)
- 04.MySQL 常见面试题(26-58)
- Redis(2010期)
- 01.认识redis和安装
- 02.Redis数据类型与string类型与list类型
- 03.Redis数据类型之hash类型与zset类型
- 04.Redis数据类型之set类型与性能检测
- 05.Redis事务
- 06.Redis发布订阅与stream应用
- 07.Redis-lua脚本
- 08.缓存击穿,失效以及维度划分
- 09.缓存穿透,雪崩问题
- 10.Redis缓存问题以及分布式锁实现
- 11.redis持久化
- 1.redis-rdb持久化
- 2.redis-aof持久化
- 3.aof 和 rdb对比
- 12.redis主从复制
- 1.主从配置及原理
- 2.全量复制 和 部分复制
- 3.主从问题
- 13.redis哨兵机制
- 1.哨兵初识
- 2.redis哨兵原理
- 3.redis哨兵配置
- 4.redis哨兵问题
- 14.redis集群
- 1.集群搭建
- 2.故障转移
- 3.redis集群伸缩
- 999.redis 常用命令
- key
- string(字符串)
- hash(哈希)
- list(列表)
- set(集合)
- zset(有序集合)
- Stream
- Redis 发布订阅
- Docker
- 1.docker快速入门
- 01.docker 了解
- 02.docker核心概念介绍
- 2.docker安装
- 3.docker基本使用
- 01.常用命令(镜像容器)
- 999.docker基本使用(示例)
- 01.docker部署es
- 02.docker部署lnmp
- 4.portainer可视化面板安装
- 5.docker镜像原理
- 01.docker镜像联合文件系统
- 02.docker分层理解
- 6.commit镜像
- 7.docker容器数据卷
- 01.容器数据卷基本使用
- 02.容器数据卷示例
- 03.容器数据卷具名挂载和匿名挂载
- 04.多个容器数据卷数据共享
- 8.dockerFile
- 01.Dockerfile介绍
- 02.Dockerfile指令说明
- 03.发布镜像到dockerhub
- 04.发布镜像到阿里云
- 999.Dockerfile示例
- 01.Dockerfile构建 centos 镜像
- 02.Dockerfile构建 tomcat 镜像
- 03.Dockerfile构建 redis 镜像
- 04.Dockerfile构建 lnmp 镜像
- 9.docker网络
- 01.理解docker0
- 02.容器互联-link
- 03.自定义网络
- 04.网络互通
- 999.redis集群部署实战
- 10.docker composer容器编排
- 01.docker-compose 介绍
- 02.安装docker-compose
- 03.docker-compose 基本命令
- 04.docker-compose yml 常用命令
- 999.docker-compose示例
- 01.构建 nginx 镜像(docker-compose)
- 02.构建 lnmp 镜像(docker-compose)
- 11.docker swarm集群
- 12.ci/cd之jenkins
- 01.jenkins介绍
- 02.jenkins安装(docker-compose)
- 13.k8s
- 01.什么是k8s
- 02.k8s使用场景
- 03.k8s部署架构分析
- 04.k8s运行架构分析
- Git
- 01.git理论和特点
- 02.gitlab安装配置以及项目创建
- 03.用户从windows接入并拉取+提交+修改代码提交
- 04.如何把团队弄进来一起开发
- 05.git基础操作,练习命令
- 06.如果你让三毛自己新建分支,并在上面开发这个时候三毛该怎么办呢?
- 07.在分支开发完毕之后,如何合并到master
- 08.2个分支合并,发生冲突的演示,以及如何解决?
- 09.为什么要用git工作流,git工作流的好处
- 999.git常用命令
- phpstudy
- localhsot不显示目录
- tp6获取不到header头Authorization问题(apache)
- 分布式架构
- elk日志系统
- 01.elk为何而生
- 02.标准的日志系统包括哪些
- 03.什么是elk
- 04.架构设计分析
- 05.elk实操部署
- elasticsearch(简称:es)
- 01.es的简介
- 02.es的安装前提与安装
- 03.es-head 与 kibana安装
- 04.es的概念
- 05.ik分词器
- 06.es对于restful的基本操作
- 07.es花式查询
- 07.01 基本使用增删改查
- 07.02 高级查询
- 07.00 es花式搜索示例
- 01.大型互联网架构演进过程
- 1.何为大型互联网架构
- 2.分布式架构的演变过程
- 02.分布式通信技术介绍
- 1.分布式亿级架构实战
- 2.分布式-集群-微服务
- 3.分布式通信
- 4.分布式通信协议
- 03.分布式通信-实战
- 1.分布式队列原理
- 2.分布式队列实战
- 3.RPC代码实战
- 04.主流分布式架构设计详解
- 1.分布式架构特性
- 2.CAP理论
- 3.BASE理论
- 05.consul服务注册发现
- 1.consul的工作原理
- 2.consul集群实战与操作
- 06.consul配置中心与实战
- 1.配置中心是个什么
- 2.consul实现配置中心
- 3.consul的基本实战操作
- 4.实战跨服务调用
- 07.分布式数据库
- 1.为什么要分库分表
- 2.动态伸缩
- 08.分布式实战数据库实战
- 09.分布式-分库分表实战
- 10.分布式事务
- 1.分布式事务
- 2.2PC-两阶段提交
- 3.3PC-三阶段提交
- 4.TCC
- 5.MQ事务最终一致性
- 11.分布式实战
- 12.elastic
- 13.elastic实战
- 14.elastic场景实战分析
- 15.elk
- 16.rabbitMQ
- 17.Kafka
- Redis、Nginx优化(2004期)
- 新能源汽车
- 数据表介绍
- 汽车租赁后台管理
- 微信小程序授权
- 微信小程序接口
- Go
- Beego 框架
- 命令行大全
- go_zero
- 01.基础部分
- 1.环境安装并输出HelloWorld
- 2.基础语法与数据类型
- 3.Go语言变量常量定义
- 4.Go语言作用域
- 5.Go常用占位符
- 6.Go异常处理
- 7.Go中的包
- 8.指针与fmt
- 9.下划线
- 10.数组(Array)
- 11.切片(Slice)
- 12.指针
- 13.Map
- 14.结构体
- 第三方库
- 01.strconv
- 02.json
- 03.air实时加载
- 04.gjson
- 05.lo
- 06.time
- 07.reflect(反射)
- 08.retry-go(重试机制)
- 09.strings
- 数据库操作
- 1.go操作mysql
- 2.go操作redis
- MongoDB
- 1.MongoDB 简介
- 2.MongoDB 安装
- 3.MongoDB 简单CURD
- 4.MongoDB 条件操作符
- 5.MongoDB Limit/Skip/Sort方法
- 6.MongoDB 索引
- 7.MongoDB 聚合与管道
- 8.MongoDB 复制(副本集)
- 99. 客户端安装与PHP操作
- Swoft
- 01.框架安装
- simpledingtalk修改点
- ThinkPHP6API基础模板
- uniapp
- 01.微信小程序获取页面路由参数
- 02.通用提示
- 03.缓存
- 04.日期转时间戳
- 05.VConsole调试
- Tailwind CSS
- 01.安装以及基础配置
- Vue
- 助手函数
- 1.时间戳格式化日期倒计时
- 2.获取不重复的id
- 3.获取正确的url路经
- 4.Object对象格式化为Query语法
- 5.数组转Tree
- 6.Tree转数组
- 7.判断值是否为空
- 9.数字前置补零
- 10.在线时间
- 11.html转义
- 12.pid形式数据转children形式
- 13.遍历children形式数据
- 14.全屏切换
- 15.获取屏幕宽高度
- 16.获取设备信息
- 17.百度高德地图坐标转换
- 18.深度克隆
- 19.获取变量类型
- 20.播放音频
- 21.导出excel
- 22.数字千分位
- 23.判断是否是外链
- 24.获取url参数
- ElementUI
- 1.表单验证
- 模板
- Yii2
- 01.SQL慢查询分块