OneProxy :: 全部无单点架构设计,确保数据库中间件7×24小时高可用!

数据库保存业务关键数据,相对比较集中,其高可用对业务至关重要,作为数据访问层的OneProxy中间件,因为所有的数据访问流量都经过它,所以高可用同样也变得非常重要。好消息是中间件因为其无状态,不需要持久化来保存任何状态数据,其高可用方案比较好设计,做到7×24小时运行并不难。

oneproxy_high_availability

OneProxy首先是一个无持久化状态的软件,主要工作是在应用程序和后端数据库之间智能地根据上下文转发SQL语句,和网络交换机、路由器转发数据包是一个运行机制,只是处理的协议层次不同,除了启动时所需的配置数据外,其他无任何需要持久化的数据。网络交换机、路由器的瞬断(只要不挂起)对系统并没有大的影响,短连接的应用会有一些报错,下次重试就好了;对于长连接的数据库应用,则原来的连接会断开,事务会自动回滚,只要应用能快速重新连接,业务也不会不中断,OneProxy也是如此。如果你的应用面对过网络交换机、路由器的瞬断,并且没有大的影响,那么你的应用也一定能完全适应OneProxy的高可用方案。

对于单台机器内的OneProxy进程级故障,比如说操作系统OOM Killer不小心杀死了进程,或者人为错误,或者是程序Bug等原因,只需要立马重起一个进程就行,为此在OneProxy中设计了“keepalive”选项来启动一个守护进程,实时监控OneProxy的工作进程,如果发现进程不存在,则立马重起一个。

[root@rh4srv1 ~]# ps -ef | grep oneproxy
root      4656     1  0 10:00 ?        00:00:00 /data/oneproxy/oneproxy --defaults-file=/data/oneproxy/proxy.conf
root      4657  4656  0 10:00 ?        00:00:12 /data/oneproxy/oneproxy --defaults-file=/data/oneproxy/proxy.conf
root      6955  2393  0 12:07 pts/0    00:00:00 grep oneproxy
[root@rh4srv1 ~]# kill -9 4657
[root@rh4srv1 ~]# ps -ef | grep oneproxy
root      4656     1  0 10:00 ?        00:00:00 /data/oneproxy/oneproxy --defaults-file=/data/oneproxy/proxy.conf
root      6958  4656  0 12:07 ?        00:00:00 /data/oneproxy/oneproxy --defaults-file=/data/oneproxy/proxy.conf
root      6972  2393  0 12:07 pts/0    00:00:00 grep oneproxy

进程“4645”就是守户进程,唯一的工作是监控有无OneProxy进程(其子进程)在提供服务,因此不会被操作系统杀死,也不会撞上Bug而退出。在上面的测试中,当我们杀死工作进程时,守护进程会在小于一秒的时间内立马再启动一个,以提供正常服务,类似于网络设备的瞬间重起。而应用只需要能够马上重新连接,就不会让业务受到影响而中断。

针对主机层面的故障,可以在两台不同的机器上布署OneProxy,然后使用HA软件来做高可用,比如说使用Keepalived和Corosync等。或者直接使用OneProxy里的HA机制(VIP)来做高可用,只需要配置“remote-address”和“vip-address”两个选项,不需要安装其他的HA软件,也不需要编写状态监控脚本,也没有复杂的配置选项。比如现在有两台服务器(“rh4srv1”=“192.168.1.119”、 “rh4srv2”=“192.168.1.20”),决定用虚拟IP地址(“192.168.1.200”)来提供高可用服务(两台机器中有一台会得到虚拟IP地址)。只需要在第一台机器(“rh4srv1”)上做如下配置:

[root@rh4srv1 oneproxy]# cat proxy.conf
[oneproxy]
keepalive = 1
......
remote-address           = 192.168.1.20:4041
vip-address              = 192.168.1.200/eth0:0
......

在第二台机器(“rh4srv2”)作同样相应的配置:

[root@rh4srv2 oneproxy]# cat proxy.conf
[oneproxy]
keepalive = 1
......
remote-address           = 192.168.1.119:4041
vip-address              = 192.168.1.200/eth0:0
......

然后重起两台机器上的OneProxy服务,其中一台机器会拿到虚拟IP地址(VIP),只需要告诉应用程序使用虚拟IP来连接OneProxy即可。当其中一台机器意外停止后,另一台会马上启用虚拟 IP地址来提供服务,无须第三方的HA软件,将给你的运维工作带来极大的简化 。也可以在更多的机器上布署OneProxy,然后用第三方的负载均衡设备(比如F5或LVS/Haproxy等)来给OneProxy做流量均衡,同样也是一种非常好的高可用机制。