[笔记]具有负载均衡功能MySQL服务器集群部署实现_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2147 | 回复: 0   主题: [笔记]具有负载均衡功能MySQL服务器集群部署实现        下一篇 
xiaoyang
注册用户
等级:上士
经验:253
发帖:75
精华:0
注册:2011-10-19
状态:离线
发送短消息息给xiaoyang 加好友    发送短消息息给xiaoyang 发消息
发表于: IP:您无权察看 2014-12-25 11:10:15 | [全部帖] [楼主帖] 楼主

     3.3 系统实现

  完成上述准备后可以开始实现MySQL数据库的一对多复制,对应用系统的数据库访问代码进行优化,使更新操作UPDATE、INSERT等SQL语句定向到Master服务器,查询检索SELECT语句定向到Slave服务器,从而实现负载均衡;当主服务器Master出现故障停止服务时,通过服务器角色转换实现冗余容错;上述所有服务器通过高速核心交换机连接在一起,协同工作,提供集群(Cluster)性能。下面,本文就此举一简例,具体说明实现(Implementation)步骤。

  3.3.1 准备主服务器

  (1). 在主服务器上创建示例数据库repl_db

  从本地或远程终端登录到Master服务器,执行CREATE DATABASE repl_db;语句,创建示例数据库repl_db。建立表repl_table:

mysql>CREATE TABLE repl_table (f1 INT, f2 VARCHAR(20)) ;


  向表中添加数据:

mysql>INSERT INTO repl_table (f1, f2) VALUES(1, ‘first’);


  (2). 授予Slave复制(Replication)权限

  授予从属服务器Slave进行复制的权限。假设从属服务器连接到主服务器复制的用户名为“repl”,密码为“g00r002b”:

mysql>GRANT REPLICATION SLAVE ON *.* TO repl@’%’ IDENTIFIED BY ‘g00r002b’;


  刷新系统权限表,锁定写入语句操作:

mysql>FLUSH TABLES WITH READ LOCK;


  这时所有写入操作都被锁定,包括支持事务(Transaction)特性的InnoDB类型表的提交(COMMIT)操作也被锁定,为数据库初始复制(copy)做好准备。

  (3). 简单备份repl_db

  在此,通过tar命令把数据库初始数据备份到/tmp目录。

# tar cvf /tmp/mysql-data.tar /app/mysql5/data/repl_db


  (4). 记录主服务器状态

  执行SHOW MASTER STATUS 语句:

mysql> SHOW MASTER STATUS;
-------------------------------------+------------------+-----------------------+---------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------------------------+------------------+-----------------------+--------------------------+
| mysql-master-bin.000001 | 1027 | | |
+------------------------------------+------------------+----------------------+---------------------------+


  记下File和Position两个参数的值,从属服务器Slave为了复制(replication)连接到主服务器Master时要用到这两个参数,如果参数与此不符将导致复制(replication)失败!

  (5). 释放主服务器表级写入锁定

mysql>UNLOCK TABLES;


  至此,主服务器解除写入锁定,一对多复制准备工作已全部完成,准备接受Slave的复制(replication)连接。

  3.3.2 准备从属服务器

  (1). 停止从属服务器的MySQL数据库服务

# /app/mysql5/bin/mysqladmin uroot p shutdown
Enter password:


  输入MySQL系统root用户密码,MySQL服务停止。

  (2). 简单copy数据库初始数据

  在从属服务器上执行ftp操作,访问主服务器,下载/tmp/mysql-data.tar文件,在/app/mysql5/data目录下执行如下操作,把初始数据copy到Slave服务器:

[root@FreebsdSlave1 /app/mysql5/data]# tar xvf /tmp/msyql-data.tar


  其它两台Slave服务器执行同样操作,实现数据库初始数据的简单copy。

  (3). 重启从属服务器上的MySQL数据库服务

# /app/mysql5/bin/mysqld_safe -user=mysql -log-bin &


  从属服务器已启动,同时启动二进制更新日志功能,为角色转换做好准备。

  (4). 登录到从属服务器Slave的MySQL客户端

# /app/mysql/bin/msyql uroot -p


  (5). 启动从属服务器上的复制(replication)线程

mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.1.100',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='g00r002b',
-> MASTER_LOG_FILE=' mysql-master-bin.000001',
-> MASTER_LOG_POS=1027;
Query OK, 0 rows affected (0.00 sec)
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)


  在所有从属服务器上执行相同的操作,自此从属服务器已连接到主服务器,开始真正意义上的replication工作。测试从属服务器的复制工作是否正常:

mysql>show slave status\G
************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.100
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-master-bin.000001
Read_Master_Log_Pos: 1027
Relay_Log_File: FreebsdSlave1-relay-bin.000005
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-master-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes


  看到上述信息说明从属服务器已启动了与replication相关的线程I/O和SQL,一对多的replication已经开始工作。

  (6). 功能测试

  在主服务器上写入新的数据:

mysql>INSERT INTO repl_table (f1, f2) VALUES(2, ‘second’);
mysql>SELECT * FROM repl_table;
+--------+---------+
| f1 | f2 |
+--------+----------+
| 1 | first |
| 2 | second |
+-----=--+----------+
2 rows in set (0.01 sec)


  在Slave上执行相同的查询操作:

mysql>SELECT * FROM repl_table;
+--------+---------+
| f1 | f2 |
+--------+----------+
| 1 | first |
| 2 | second |
+--------+----------+
2 rows in set (0.01 sec)


  得到相同的查询结果,说明复制(replication)机制已成功开始工作!

  3.3.3 配置网络DNS服务器

  在BIND DNS服务器中,为上述三台从属服务器Slave配置同一个名字,客户端的查询检索操作将由DNS服务器定向到其中的一台Slave。因此,对于同一名字,不同的客户端会定向到不同的地址,访问不同的MySQL服务器,从而达到负载均衡的目的。假设用户为三台Slave分配的DNS名字为mysqlslave.yourdomain,DNS服务器区域文件/var/named/yourdomain.zone中应包含如下数据项[6]:

sqlmaster.yourdomain. IN A 192.168.1.100
sqlslave1.yourdomain. IN A 192.168.1.101
sqlslave2.yourdomain. IN A 192.168.1.102
sqlslave3.yourdomain. IN A 192.168.1.103
sqlslave IN CNAME sqlslave1
sqlslave IN CNAME sqlslave2
sqlslave IN CNAME sqlslave3


  当客户端进行查询操作时,提交给主机sqlslave.yourdomain的请求将由DNS服务器随机定向到三台Slave中的一台,由其执行查询作业,返回结果。从而在三台Slave之间实现查询级别的负载均衡。

  3.3.4 应用系统程序代码优化

  实际应用中,对数据库的写入操作相对查询操作少得多,因此,优化应用程序的数据库连接代码,把写入操作定向到Master服务器,查询操作定向到Slave服务器,提供主服务器和从属服务器之间更新、查询的负载均衡功能。本文以PHP数据库连接代码为例,简要介绍代码优化方法[7]。

  (1). 准备不同的数据库连接配置文件

  准备两个数据库连接文件mysql_connect_master.php和mysql_connect_slave.php,其文件内容如下:

  mysql_connect_master.php文件的内容:

// Connect to the Database Server
$linkID = @mysql_connect("sqlmaster.yourdomain", "user", "password") or die("Sorry, could not connect to the database!");
// Select the Database
@mysql_select_db("repl_db") or die("Sorry, Could not select database!");
?>


  mysql_connect_slave.php文件的内容:

// Connect to the Database Server
$linkID = @mysql_connect("sqlslave.yourdomain", "user", "password") or die("Sorry, could not connect to the database!");
// Select the Database
@mysql_select_db("repl_db") or die("Sorry, Could not select database!");
?>


  (2). 优化程序SQL语句代码

  对应用程序中访问数据库的代码段做出如下优化:

...
// $sql is the query string to be committed to MySQL server.
if ( stripos( $sql, " SELECT" ) )
{
      include_once("./mysql_connect_slave.php");
      ...
      mysql_close();
}
else
{
include_once("./mysql_connect_master.php");
...
mysql_close();
}
...
?>


  说明:每当向MySQL服务器提交数据库操作时,加入一个if-else判断语句对变量$sql进行判断定向,如果是SELECT查询操作,将其定向到从属服务器Slave中的一个;如果是其它更新语句,则将其定向到主服务器Master。此处代码段是应用系统实现负载均衡的关键,用户务必根据自己实际情况,写出准确无误的代码。每次对数据库操作完毕都要及时释放数据库连接,以免更新、查询操作分别定向失败,影响系统负载均衡功能。这样做虽然在一定程度上增加Web服务器或应用服务器的开销,但与MySQL服务器集群负载均衡功能带来的大幅性能提升及冗余容错特性相比,这个开销绝对是物超所值!

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论