OneProxy :: 完成读写分离之后,还需对备库的复制时延进行监控和管理。

在使用OneProxy完成读写分离方案之后,还需要更上一层楼,对备库的复制时延进行监控和管理,才是完整的读写分离方案。比如当备库时延超过一定时长后,是否还能满足业务查询的实时性要求?当停掉一个备库来进行数据备份时,是否还要让这台备库提供查询服务?相信在真实的业务场景中,是有这样的需求的,而要在应用层实现此功能则会非常复杂。由于应用一般布署很多台,因而不适合在每台应用上都布署监控程序,而需要独立的监控中心和配置中心与应用程序一起协同工作。

  1. 监控中心实时检测主备之间的复制差距,当发现时延过大时,需要生成一条配置更改指令到配置中心。
  2. 配置中心收到指令后,向有关的应用程序发送应用配置变更指令。
  3. 应用程序收到指令后,对程序中数据源的状态做出变更,以便在下次流量分配时生效。

可以看到,整个业务流程依赖的系统增多了,并且对应用不够透明。在OneProxy中提供了极为简洁明了的方案,只需要创建一个复制管理帐号并配置几个参数就可以了。先来了解一下复制管理账号的创建,OneProxy需要有一个能够运行“show master status”和“show slave status”两条命令的数据库帐户,以便用来取得复制的运行数据。可以用如下语句来创建账号:

create user 'repadmin'@'%' identified by 'repadmin';
grant replication slave on *.* to 'repadmin'@'%';
grant replication client on *.* to 'repadmin'@'%'; 
flush privileges;

请保证所有的节点上都存在此帐号,并且密码也要保持相同,请务必使用mysql客户端工具来进行登录验证后,再进行后续的OneProxy配置。然后在OneProxy中使用“repadmin-usernname”和“repadmin-password”选项来指定复制账号的用户名和口令(需要进行加密处理,请在配置文件中指定刚创建的用户名和密码),在读写分离的运行模式下,OneProxy就可以监控到主备的Binlog信息及时延(复制关系需要DBA自行搭建,OneProxy无法自动处理)。

......
repadmin-username = repadmin
repadmin-password = 956C97523BADD23B6091B09E332A77B5CBDBBEEF
......

当所有配置都准确设定后,重起一下OneProxy,就可以在管理端口中使用“LIST BACKEND”命令查询到复制相关的信息了。

mysql> list backend\G
......
*************************** 2. row ***************************
    INDX: 2
 ADDRESS: 127.0.0.1:3306
......
    IS_M: Yes
    IS_S: No
   MFile: 6/120
   DFile: NULL
   RFile: NULL
      IO: NULL
     SQL: NULL
 Seconds: NULL
*************************** 3. row ***************************
    INDX: 3
 ADDRESS: 127.0.0.1:3305
......
    IS_M: No
    IS_S: Yes
   MFile: NULL
   DFile: 6/120
   RFile: 6/120
      IO: Yes
     SQL: Yes
 Seconds: 0
3 rows in set (0.00 sec)

其中“IS_M”表示这台机器是否是一台Master,“IS_S”表示是否为一台Slave,“MFile”表示主库上的Binlog位置,而“DFile”和“RFile”则表示备机上IO线程和SQL线程处理的位置,在这个例子中三个值完全一致,表示主备完全跟上,而备库的“Seconds”则表示备库落后于主库的时延,该值取自“Seconds_Behind_Master”列,依靠MySQL自身的机制来判断备库时延。从OneProxy的管理端口中可以非常清楚地看到主备时延的情况后,接下来只要设置MySQL集群能接受的最大时延值就行了。

mysql> set gdelay server1 5;
Query OK, 0 rows affected (0.00 sec)

mysql> list group \G
*************************** 1. row ***************************
    NAME: server1
  POLICY: read_slave
  ACCESS: 1
  MASTER: 0
  MANUAL: 0
 SERVERS: 2
REQUESTS: 0
BACKENDS: 2, 3
MAXDELAY: 5
1 row in set (0.00 sec)

最大时延值可以使用“SET GDELAY”命令进行动态调整,也可以在参数文件中使用“proxy-group-slavedelay”选项在启动时指定,如下所示:

proxy-group-slavedelay   = server1:5

当某个备库的时延超过指定值时,OneProxy将不再分流到该节点;当备库追上主库后,将再次承担流量。当停止某一个Slave的IO线程和SQL线程时(进行数据备份),时延值会变成9999,表示时延极大,不再承担流量。在OneProxy下监控主备时延,既不需要监控中心,也不需要配置中心,所需要的只是设置三个参数,还有比这更为简单的吗?