该方案的主要思想是在跨region数据访问时引入中间代理层,作为数据请求和响应之间的桥梁。具体地,该代理层将负责实现以下功能:
1.连接管理:代理层通过连接池技术管理区域间的数据库连接,并根据需要对连接进行优化。
2.数据加速:代理层通过使用缓存等技术对请求数据进行缓存、压缩、拆分等操作,以提高数据传输效率和速度。
3.数据安全:代理层通过数据加密、身份验证等技术对数据进行保护,确保数据传输过程中的机密性和完整性。
4.访问控制:代理层可以实现灵活的访问控制策略,包括IP白名单、角色授权等方式,防止非法访问。
5.容错处理:代理层可以实现故障转移、自动切换等功能,提高系统的可用性和鲁棒性。
基于以上要求,我们提出了一种基于Haproxy的跨region数据库代理访问方案。具体地,该方案包括以下几个组件:
-
Haproxy:作为代理层的核心组件,它通过反向代理技术将请求转发到后端数据库,并对响应进行处理,实现数据加速和安全保护等功能。
-
Keepalived:作为高可用的组件,它可以实现故障转移和自动切换等功能,确保系统的可用性。
-
Redis:作为缓存组件,它可以实现对请求数据的缓存和压缩等操作,提高数据传输效率。
-
MySQL/MongoDB:作为后端数据库,它们负责存储和检索数据。
在具体实现中,我们结合了以上组件,并通过配置文件来实现不同的功能。例如,haproxy通过使用连接池技术和多个worker进程来管理连接,以最大限度地减少网络延迟和资源消耗。同时,它还可以根据请求内容对连接进行分类和调度,以提高系统的并发性和吞吐量,haproxy可以通过使用cache模块实现对请求数据的缓存和拦截,以减少后端服务器的负载和响应时间。具体来说,haproxy会在内存中缓存那些经常被请求的数据,从而避免每次请求都需要访问后端数据库或应用服务器。此外,haproxy还可以通过使用stick-table模块实现对会话的存储和管理,以保证会话的连续性和一致性,Haproxy可以通过使用SSL/TLS模块实现对请求和响应数据的加密和解密,以确保通信的机密性和安全性。具体来说,haproxy会创建与客户端和服务器之间的SSL/TLS加密通道,并使用预共享密钥或证书来进行身份验证和数据加密。此外,haproxy还可以通过使用ACL模块实现对特定请求或响应的过滤和加解密操作,以进一步提高数据安全性。
同时,我们还可以通过Keepalived的VRRP模式实现故障转移和自动切换,以提高系统的可用性。在高可用方面,还可以通过使用多台Haproxy服务器和多台后端数据库服务器来实现负载均衡和容错处理,进一步提高整个系统的可靠性,实现架构图如下所示:
具体实施方案
一、前期准备
regionA负载均衡机器a.a.a.a和b.b.b.b,VIP设置为c.c.c.c。
regionB负载均衡机器d.d.d.d和e.e.e.e,VIP设置为f.f.f.f。
regionBMysql代理服务提供:x.x.x.x:3306。
regionBMongo代理服务提供:y.y.y.y:57017。
regionBRedis代理服务提供:z.z.z.z:16379。
regionA之前各服务通过管理网与代理服务VIPc.c.c.c进行网络通信,regionA与regionB之间通过CN2网络进行通信,regionB之前各服务通过与regionB代理管理网进行网络通信
所有负载均衡机器中沿用原服务的占用端口,因此均需要开启3306,57017以及16379端口。
firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --permanent --add-port=3306/udp
firewall-cmd --permanent --add-port=16379/tcp && firewall-cmd --permanent --add-port=16379/udp
firewall-cmd --permanent --add-port=57017/tcp && firewall-cmd --permanent --add-port=57017/udp
firewall-cmd --reload
测试:firewall-cmd --list-all
所有负载均衡机器主机执行以下操作:
- 安装haproxy:sudo yum install haproxy。
安装keepalived:sudo yum install keepalived
二、regionB负载均衡代理
代理机器:
- 创建配置文件映射:sudo vi /etc/haproxy/haproxy.cfg。
- 填入配置文件cfg的内容,填写服务提供机器对应的IP地址和端口。
- 配置haproxy日志(关闭注释):sudo sed -i 's/\#$ModLoad imudp/$ModLoad imudp/' /etc/rsyslog.conf && sudo sed -i 's/\#$UDPServerRun 514/$UDPServerRun 514/' /etc/rsyslog.conf。
- 配置haproxy日志(local5与conf中对应):sudo vi /etc/rsyslog.conf,最后一行加入 local5.* /var/log/haproxy.log。
- 配置haproxy日志(重启rsyslog):sudo systemctl restart rsyslog。最终haproxy的日志存储在/var/log/haproxy.log中(haproxy产生日志该文件才会生成)。
- 启动haproxy:sudo systemctl start haproxy。
global
log 127.0.0.1 local5 info
daemon
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 10
timeout connect 5000
timeout client 50000
timeout server 50000
listen mysql
bind 0.0.0.0:3306
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin #使用轮询的方式
# 填入IP地址和暴露的外部端口
server mysql1 x.x.x.x:3306 check weight 1 maxconn 5000
#使用keepalive检测死链
option tcpka
listen redis
bind 0.0.0.0:16379
# 负载均衡算法(轮询算法)
balance roundrobin
# 填入IP地址和暴露的外部端口
server redis1 z.z.z.z:16379 check maxconn 5000 inter 2000 rise 2 fall 3
listen mongo
bind 0.0.0.0:57017
#负载均衡算法(轮询算法)
balance roundrobin
# 填入IP地址和暴露的外部端口
server mongo1 y.y.y.y:57017 check maxconn 5000 inter 2000 rise 2 fall 3
7.Keepalived配置文件:sudo vi /etc/keepalived/keepalived.conf。route_id不同(推荐填写IP地址),virtual_route_id相同,unicast单播地址不同。
global_defs {
route_id 本机ip
script_user root
enable_script_security
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 1
weight -5
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 89
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass xxxxxxx
}
unicast_src_ip 本机ip
unicast_peer {
备节点ip
}
virtual_ipaddress {
f.f.f.f dev eth0
}
track_script {
check_haproxy
}
notify_backup "/bin/bash /etc/keepalived/start_haproxy.sh"
}
8.脚本:sudo vi /etc/keepalived/check_haproxy.sh。
#!/bin/sh
systemctl status haproxy | grep 'running'
9.脚本sudo vi /etc/keepalived/start_haproxy.sh
#!/bin/sh
systemctl restart haproxy
10.为脚本添加执行权限:sudo chmod +x /etc/keepalived/*.sh
11.启动keepalived服务: sudo systemctl start keepalived,通过sudo systemctl status keepalived查看keepalived状态。
haproxy和keepalived保活:
- 开启自动启动:sudo systemctl enable keepalived&& sudo systemctl enable haproxy。
- 定时任务:crontab -e; 加入*/1 * * * * sudo systemctl start keepalived和*/1 * * * * sudo systemctl start haproxy,每分钟尝试重启;
3.sudo systemctl restart crond,通过crontab -l查看是否添加成功
三、regionA负载均衡代理
regionA机器:操作与regionB基本一致。
注:/etc/haproxy/haproxy.cfg文件中不同,此处代理regionB的VIP机器。
global
log 127.0.0.1 local5 info
daemon
defaults
log global
mode tcp
option tcplog
option dontlognull
retries 10
timeout connect 5000
timeout client 50000
timeout server 50000
listen mysql
bind 0.0.0.0:3306
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin #使用轮询的方式
# 填入IP地址和暴露的外部端口
server mysql1 f.f.f.f:3306 check weight 1 maxconn 5000
listen redis
bind 0.0.0.0:16379
# 负载均衡算法(轮询算法)
balance roundrobin
# 填入IP地址和暴露的外部端口
server redis1 f.f.f.f:16379 check maxconn 5000 inter 2000 rise 2 fall 3
listen mongo
bind 0.0.0.0:57017
#负载均衡算法(轮询算法)
balance roundrobin
# 填入IP地址和暴露的外部端口
server mongo1 f.f.f.f:57017 check maxconn 5000 inter 2000 rise 2 fall 3
注:keepalived配置不同,VIP以及绑定的网卡不同。
global_defs {
route_id 本机ip
script_user root
enable_script_security
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 1
weight -5
}
vrrp_instance VI_1 {
state BACKUP
interface ens32
virtual_router_id 89
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass Wangdf135246!
}
unicast_src_ip 本机ip
unicast_peer {
备节点ip
}
virtual_ipaddress {
c.c.c.c dev ens32
}
track_script {
check_haproxy
}
notify_backup "/bin/bash /etc/keepalived/start_haproxy.sh"
}
四、 访问规则
regionA机器:统一通过c.c.c.c访问mysql、redis和mongo服务。
端口分别为3306,16379和57017。