在第一部分,我们演示了如何在CentOS 6.3 VM中部署MySQL 5.6数据库,并将安装了MySQL数据库的虚拟机制作成映像。在这部分,我们将基于这个映像来搭建主从式数据库集群。

基于VM映像创建VM实例

1)基于映像创建mysql-master VM实例

在Windows Azure管理门户的“虚拟机”页面,点击“新建”按钮,在“我的映像”中选中“centos64-mysql56-image“。


由于创建映像会导致原有的mysql-master VM实例被删除,所以,我们需要再次创建mysql-master VM实例。接下来,按照第一部分所示,再配置好mysql-master VM的云服务、端点等信息,即可创建mysql-master VM实例。注意:mysql-master VM实例一定要记得增添MySQL端点,这个端点定义了3306的公共端口,否则将无法从外部访问MySQL数据库。



2)基于映像创建mysql-slave1 VM实例

仿照前面的步骤,继续创建mysql-slave1 VM实例。创建好后,我们将会得到如下的虚拟机:

当mysql-slave1 VM创建成功后,需要做一件特别的事,清除MySQL服务器的UUID。从MySQL 5.6起,为了支持新的数据复制功能,MySQL服务器会产生UUID,以相互区别。一个集群中的MySQL服务器的UUID不能重复,否则会产生无法预料的后果。对于CentOS 6.3而言,MySQL服务器产生的UUID存储于/var/lib/mysql/auto.cnf文件中。既然slave数据库是基于同一个VM映像创建的,它可能也继承了相同的auto.cnf文件,这会导致UUID冲突。避免UUID冲突的一个简单方法是删除auto.cnf,这样,服务器启动时会重新产生一个UUID。为此,我们需要登录到mysql-slave1 VM中,执行下述命令:

cd /var/lib/mysql

rm auto.cnf


配置MySQL主数据库

1)准备好MySQL配置文件my.cnf

使用PuTTY登录到mysql-master VM中。然后输入下面的命令,检查MySQL的配置文件/etc/mysql/my.cnf是否存在:

cat /etc/mysql/my.cnf

如果该文件不存在,需要执行下述命令查找一份模板配置文件:

rpm -ql MySQL-server

查找/usr/share/mysql/my-default.cnf文件,将它拷贝至/etc/mysql目录下,并将文件名改为my.cnf。

cp /usr/share/mysql/my-default.cnf /etc/mysql/my.cnf


2)编辑my.cnf文件

首先,添加下面一行:

bind-address = 192.168.0.4

它使得mysql数据库绑定在mysql-master VM的内部IP上。VM的内部IP可以在该虚拟机的仪表板中查到。下图显示了mysql-master VM的内部IP:


接下来,需要修改server-id属性。在mysql集群中,每个mysql数据库的server-id都必须是唯一的。我们可以将mysql-master的server-id设为1。

server-id = 1

再下来,修改log_bin属性。MySQL主从数据库的数据同步是通过读取二进制日志文件来实现的。这里要配置的log_bin属性的值代表了master数据库的二进制日志文件。

log_bin = /var/log/mysql/mysql-bin.log

最后,增加binlog_do_db属性,指定需要进行复制的数据库名称。如果有多个数据库要复制,对于每个数据库都需要添加一行binlog_do_db。这里,我们假设要复制的数据库名称是travex。因此,

binlog_do_db = travex


完成上述步骤后,保存并退出编辑器。需要注意的是,mastermysql数据库的二进制日志文件所在的目录可能并不存在,所以我们需要先创建这个目录,并且将目录的owner从root用户变为mysql用户。

mkdir /var/log/mysql

chown -R mysql:mysql /var/log/mysql


3)启动master数据库,并做权限处理

输入下述命令,检查mysql数据库是否已启动:

mysqladmin -uroot -p ping

如果数据库还未启动,输入下述命令启动mysql:

service mysql start

登录到mysql,在数据库命令行界面下输入下述命令,将复制二进制日志文件的权限赋给slave数据库。

mysql –uroot -p

GRANT REPLICATION SLAVE ON *.* TO 'azureuser'@'%' IDENTIFIEDBY 'password';

FLUSH PRIVILEGES;


4)在master mysql上建立目标数据库

还记得在前面编辑mastermysql的my.cnf时,我们指定要复制的数据库是travex。这个数据库如果还不存在,就需要创建。创建数据库可以基于命令行,也可以使用MySQL的图形化客户端。这里使用的是开源的HeidiSQL客户端,创建了travex数据库,并在其中创建了一个名为User的数据表。


5)完成上述操作后,请返回至mysql-master VM的PuTTY窗口。点击PuTTY窗口的左上角图标,在下拉菜单中选择”DuplicateSession”,启动一个新的窗口。再次登录进mysql-master VM。注意:下面的操作需要在这个新窗口完成。

登录到mysql,然后输入下面的命令:

USE travex;

FLUSH TABLES WITH READ LOCK;

SHOW MASTER STATUS;


Master状态显示了复制的起始二进制日志文件及起始位置。如上图所示,slave将从mysql-bin.000004文件的916字节处开始复制。

退出mysql,在bash shell环境下输入下述命令,将travex数据库的内容导出到一个sql文件中。之后,会使用这个sql文件在slave中重建travex数据库。

mysqldump -uroot -p --opt travex > travex.sql

完成这个步骤后,再登入mysql,输入下述命令将master mysql解锁。

UNLOCK TABLES;

QUIT;

6)将sql文件从mysql-master VM传输至mysql-slave1 VM

在mysql-master VM输出的travex.sql需要传输至mysql-slave1 VM中,以便于在slave虚拟机中重建travex数据库。我们使用scp进行跨虚拟机的文件传输,如下:

scp travex.sql azureuser@192.168.0.5:/home/azureuser/travex.sql

这里有两点要注意:

一,我们使用的是mysql-slave1 VM的内部IP。在Azure中,如果两个虚拟机在同一个云服务或虚拟网络中,它们可以通过内部IP相互通信,这有利于提高传输效率,降低通信相关的费用。

二,确保拥有对文件拷贝的目标目录的写权限。由于scp是以azureuser用户的身份登录到mysql-slave1VM,这个用户不是root用户,因此对很多目录都没有写权限,但是它对/home/azureuser目录拥有写权限。



配置MySQL从数据库

我们对主数据库的配置已经完成。下面的关注重点转向从数据库。首先,还是登录到mysql-slave1VM。请注意,mysql-slave1 VM的SSH端口不再是22,而是另一个数字。这是因为mysql-master和mysql-slave1同属于一个云服务中,同一个云服务中只允许有一个22的公共端口,因此mysql-slave1 VM的SSH端口被自动修改。

1)登录mysql,创建travex数据库

使用下述命令,创建一个空的travex数据库:

CREATE DATABASE travex;

EXIT;

2)导入travex数据库的定义和数据

mysql -uroot -p travex < /home/azureuser/travex.sql


3)编辑从数据库的my.cnf配置文件

注意,如果mysql-slave1 VM中还没有/etc/mysql/my.cnf文件,请参照mysql-master VM中准备my.cnf的步骤来创建该文件。使用编辑器打开/etc/mysql/my.cnf文件,按下述方式设置好相应属性:

relay-log = /var/log/mysql/mysql-relay-bin.log

log_bin = /var/log/mysql/mysql-bin.log

binlog_do_db = travex

server-id = 10


完成上述步骤后,保存并退出编辑器。注意:/var/log/mysql目录可能并不存在,所以需要先创建这个目录,并且将目录的owner从root用户变为mysql用户。

mkdir /var/log/mysql

chown -R mysql:mysql /var/log/mysql

4)重启从数据库,设置好复制参数

service mysql start

CHANGE MASTER TOMASTER_HOST='192.168.0.4',MASTER_USER='azureuser', MASTER_PASSWORD='password',MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=916;

注意:

a) MASTER_HOST使用的是mysql-master VM的内部IP地址

b) MASTER_LOG_FILE和MASTER_LOG_POS属性的值使用的是配置mysql主数据库时通过SHOWMASTER STATUS命令所显示的信息。


5)启动slave,查看其状态

在mysql命令行环境下,输入下述命令,启动slave,并查看状态:

START SLAVE;

SHOW SLAVE STATUS\G


检测主从式数据库

完成上述的所有步骤后,我们已经搭建好了主从式MySQL数据库的结构。下面我们需要检测这个系统是否如我们所期待的那样。检测方法是,向mysql-master数据库中增添多行数据,然后检测mysql-slave1数据库是否会自动复制这些数据。为此,我们希望使用Heidi SQL客户端同时连接mysql-master和mysql-slave1。

为了使得Heidi SQL客户端可以连接mysql-slave1数据库,我们需要为mysql-slave1VM添加一个MySQL端点。注意:这个新端点的公用端口不能取3306,因为mysql-masterVM已经占用了这个公用端口。为了避免端口冲突,我们使用的是3307端口:


新端点创建好后,使用Heidi SQL客户端连接mysql-slave1数据库。


通过Heidi SQL客户端向mysql-master的travex数据库的User表中插入数据:


刷新mysql-slave1服务器,如果一切顺利,您会看到下面的结果:


至此,我们最终在Windows Azure上实现了MySQL一主一从数据库的复制。如果你能耐着性子跟随以上步骤走到最后,那么相信你已经对WA上IaaS VM有了一个比较全面的理解。如果有可能再重复1-2遍,你会更加得心应手。


资料索引

配置MySQL主从式数据库部分参考了如下链接:

https://www.digitalocean.com/community/articles/how-to-set-up-master-slave-replication-in-mysql


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐