天天看点

mysql高可用详解(二):MySQL Replicant

MySQL Replicant库是由作者们开发的用于管理复制的简单库。

Replicant库的基本思想是建立一个服务器间的连接模型(可以使用任何的计算机,比如笔记本电脑),设计这个库可以通过更改模型来管理连接。例如:想要把slave重新连接到其他的master,只需要把模型中的slave重新连接就可以了,这个库会发送适合的命令完成这个工作;

【使用库创建拓扑】

MASTER=Server(

)

SLAVES=[

         Server(

),

Server(

)

]

【使用库重定向slave】

import my_deployment

from mysql.replicant.commands import change_master

for slave in my_deployment.slaves:

         slave.stop()

         change_master(slave,my_deployment.master)

         slave.start()

【基本类和函数】

要想使用这个库,首先需要了解一些常用的概念的基本定义,例如用异常来报告错误,用简单对象来表示位置和用户信息;

库中给出了完成的异常列表。所有异常都继承自同一个基类Error。涉及的异常有如下:

EmptyRowError:

当select查询不返回任何行的时候抛出这个异常

NoOptionError:

当ConfigManager找不到配置项的时候抛出该异常;

SlaveNotRunningError:

当slave应该运行但是没有运行的时候抛出这个异常;

NotMasterError:

当服务器不是master并且操作非法的时候抛出这个异常;

NotSlaveError:

当服务器不是slave并且操作非法的时候抛出这个异常;

【Position 和 GTID】

这些类表示binlog位置,包括文件名和文件内的字节偏移,或者全局事务标识符(GTID,MySQL 5.6引入)。使用表示方法将binlog位置以一种可以解析的表示形式输出出来,因而binlog位置可以存储在二级存储中,或者在你需要查看的时候才用;

注意:如果不采用全局事务标识符,那么不同服务器上的位置可能有所区别,所以比较不同服务器上的位置是没有用的。因此,如果试图比较不同类型的位置,将会抛出异常;

【User类】

代表用户,包括用户名和密码,可用于多种类型的账号,比如MySQL用户账号、shell账号、复制用户等

【对各种操作系统的支持】

为了支持不同的操作系统,你可以用一组类将它们之间的区别抽象出去。基本思想是为不同的操作系统上的任务实现其各自的类方法。这样只需要这些方法就可以停止和启动服务器了;

Machine类:机器的基类,存储机器的共同信息,一个机器实例至少包括以下成员:

Machine.defaults_file:该机器上my.cnf文件的默认存储位置;

Machine.start_server(server):启动服务器的方法;

Machine.stop_server(server):停止服务器的方法

Linux:负责处理运行在Linux机器上的服务器,通过存储在/etc/init.d位置的init(8)脚本来启动和停止服务器;

Solaris:负责处理运行在Solaris机器上的服务器,svadm(1M)命令来启动和停止服务器;

【服务器Server】

Server类定义了接口中高级函数实现所需的所有基本功能,包括如下几项:

Server(name,…):Server类表示系统中的一个服务器,整个系统中的每一个服务器都对应一个对象。这里是一些重要的参数:

Name:服务器名字

host、port和socket:

host:服务器所在主机地址;

port:MySQL客户端连接服务器用的端口;

socket:用于同一台主机上的连接;

ssh_user和sql_user:

         使用用户和密码的组合连接机器或者服务器。这些用户用来执行管理性的命令,例如启动和停止服务器。读写配置文件,或者在服务器上执行SQL命令;

machine:

存储操作系统特定原语的对象。这个参数允许使用不同的方法来启动和停止服务器或者执行其他的任务

server_id:

存储服务器标识的可选参数,在每个服务器的配置文件中定义。如果配置文件也中没有定义,那么这个服务器就不参与复制架构,既不是master也不是slave;

config_manager:

该选项存储配置管理器的引用;从这个选项可以查询到服务器配置的相关信息;

【Server.connect()和Server.disconnect()】

在会话中执行命令之前使用connect方法连接服务器,然后在结束会话之后使用disconnect方法断开连接;

在某些情况下,即使SQL命令执行结束还需要保持服务器连接有效,这个时候这两个方法就很有效。举例来讲,执行FLUSH TABLES WITH READ LOCK 的时候,如果连接失效了,锁就会自动的释放。

【Server.ssh(command,args…)和Server.sql(command,args…)】

用于在服务器上执行shell命令或者SQL命令;

ssh和sql方法都返回一个迭代类型,ssh返回命令执行结果行的list,而sql返回内部类Row对象的list。Row类定义_iter_和next方法迭代结果行;

【Server.fetch_config()和Server.replace_config()】

fetch_config和replace_config方法将远程服务器中的配置文件读到内存中,这样用户可以增删配置选项或者更改某些选项的值;

【Server.start()和Server.stop()】

start和stop方法向machine对象发送相应的信息,取决于服务器使用的操作系统。这两个方法分别完成启动和停止服务器的功能;

【服务器角色】

根据角色的不同,服务器的工作方法也略有不同。例如:master要求slave通过复制用户来连接而slave不需要用户账户,除非slave同时担任master角色并且有其他的slave请求连接。为了灵活的获得服务器配置,引入一些代表不同角色的类;

在服务器上使用imbue方法的时候,服务器将接受合适的命令去正确的配置那个角色。注意:在整个部署周期中服务器可能变换角色,所以这里赋予的角色只是用于最初的部署配置。在部署中,服务器总有一个指定的角色,所以服务器还有一个关联的角色;

如果服务器角色改变,可能需要从服务器删除某些配置。因此还需要为角色定义一个unimbue方法,在服务器转换角色的时候使用;

MySQL Replicant库中定义了以下三种角色:

1》Role:

这是所有角色的基类。每个派生类都需要定义imbue和unimbue方法(可选),为服务器赋予角色。为了帮助派生类完成一些常见的任务,Role类还定义了很多帮助函数,包括:

Role.imbue(server):

         通过执行适当的代码,该方法为服务器赋予新的角色;

Role.unimbue(server):

         在赋予其他角色之前,这个方法进行一些清理的工作;

Role._create_repl_user(server,user):

         该方法在服务器上创建一个复制用户,并向它授予必要的权限,担任复制slave的角色;

Role._enable_binlog(server,config):

         通过将log-in和log-bin-index设置为适当的值,该方法在服务器上启用二进制日志。如果log-bin已经设置过了,那么这个方法什么都不做;

Role._disable_binlog(server,config):

         通过清空配置文件中log-bin和log-bin-index的值,该方法禁用二进制日志;

2》Vagabond:

         这是服务器的默认角色,不参与复制部署。因此,这种vagabond服务器不承担任何的职责;

3》Master:

         这是master服务器角色。这个角色会设置服务器标识符,启用二进制日志,并为slave创建复制用户。复制用户的用户名和密码将存储在服务器上,当slave请求连接的时候,这个类会查找复制用户名;

4》Final:

         这是final类型slave(即没有二进制日志的slave)的角色。如果服务器被赋予这个角色,将会获得服务器标识符,二进制日志被禁用,而且连接master的时候使用CHANGE MASTER命令;

注意:在写回配置文件之前需要停止服务器,并且在写完之后重新启动服务器。当服务器在运行的时候,配置文件是只读的,并且读完即关闭。为了保证文件的安全性,在修改它之前需要先停止服务器;

一个重要的设计理念是:角色不存储任何与服务器相关的信息。因此,要得到一份完整的master列表,需要向role对象添加master;但由于服务器的角色在整个部署周期中是随时间变化的,所以仅在系统搭建的时候使用角色。由于角色可以包含参数,所以同样的信息可用于配置多台服务器;

【小结】

介绍了如何创建库来简化服务器的管理,并简单介绍了MySQL Replicant库;

继续阅读