OneProxy :: 配置类数据的高可用方案,数据库故障的自动切换与回切!

在系统中往往有一类业务配置数据,会被各个系统频烦地访问,但却极少更新。出于数据保护的目的,一般数据库都至少一个或多个备库,对于极少更新的配置类数据,在紧急情况下从备库读取数据也是完全可以接受的。当这些数据还存放在Oracle中时,可以让应用程序先偿试连接主库去访问,当主库不可用时,则连接到备库去访问;但要求应用及时检测主库状态,一旦发现主库可以连接,再后续的访问以切回主库。 这个机制让我们的配置数据没有单点,并且当主库需要维护(比如机房搬迁)时,业务也不受影响,只要提前告知各业务方配置数据在什么时间段可以更改即可。

oneproxy_read_failover_arch

当已经有很多现成的应用在运行时,更改应用并不容易,除需要做测试外,还需要安排维护窗口做应用发布。如果将配置数据保存在MySQL中,则不需要应用更改任何代码,包括添加一个新的数据源。只需要将主库和备库一起放到OneProxy中间件的同一个组中,然后调整一下组的策略就可以达到上述效果。下面是一个详细的配置例子:

export ONEPROXY_HOME=/data/oneproxy

# valgrind --leak-check=full --show-reachable=yes \
${ONEPROXY_HOME}/oneproxy --keepalive --proxy-address=:3307 \
  --proxy-master-addresses=172.30.12.4:3306@conf \
  --proxy-slave-addresses=172.30.12.5:3306@conf \
  --proxy-user-list=test/1378F6CC3A8E8A43CA388193FBED5405982FBBD3@test \
  --proxy-group-policy=conf:read_failover \
  --log-file=${ONEPROXY_HOME}/oneproxy.log \
  --pid-file=${ONEPROXY_HOME}/oneproxy.pid

然后可以连接到OneProxy上执行查询,按照如下步骤做测试。

  1. 使用MySQL客户端连接到工作端口,然后保持连接不要退出。
  2. 在主库(“master”库)执行一个SQL语句。
  3. 在另外的窗口中关闭主库,使用OneSQL的话可以设置成限制登录模式来停止从主库查询。
  4. 在刚才启动的MySQL客户端窗口中再次执行查询,思考会不会因为主库不可用而报错。
  5. 起动主库,再次执行同样的查询。

将发现MySQL客户端工具,在主库不可用时没有报任何错,即没有报连接被断开也没有报查询错误,对于MySQL客户端来讲,好象没有发生过任何事情,因而服务不会受到丝毫损伤。下面是对前面配置文件中部份主要配置项的一些解释:

  1. “proxy-master-addresses”,指定MySQL主库(Master节点)的地址信息(格式:IP地址:端口@集群名字),OneProxy允许将多个MySQL主备集群挂到其下,只要给他们一个不同的集群名字。具有主备复制关系(数据一致)的MySQL节点应当属于同一个集群。
  2. “proxy-slave-addresses”,指定MySQL从库(Slave节点)的地址信息(格式:IP地址:端口@集群名字),OneProxy允许将多个MySQL主备集群挂到其下,只要给他们一个不同的集群名字。具有主备复制关系(数据一致)的MySQL节点应当属于同一个集群。
  3. “proxy-group-policy”,指定OneProxy中某个MySQL集群的流量分配策略(格式:集群名字+“:”+策略名字)。在这个例子中,“read_failover”表示先停试读主库,失败后偿试读从库的策略。

为了达到良好的效果,可以让主库和备库的值不相同,以便你随时可以判断数据是从哪个库查出来的。使用OneProxy中间件可以不改任何应用程 序来优化调整数据库的底层架构,是不是可以帮助公司节约很多的研发资源呢?