具有负载均衡功能的MySQL服务器集群部署及实现

在实际生产环境中,部署和实现具有一定负载均衡功能的 MySQL服务器集群,对于提高用户数据库应用系统的性能、速度和稳定性具有明显的作用。本文简要介绍了在 FreeBSD 7.0-Release系统上部署实现MySQL服务器集群的方案,并对可能出现的问题提供了相应的解决方法。
1. 引言
MySQL是一个高速度、高性能、多线程、开放源代码,建立在客户/服务器(Client /Server)结构上的关系型数据库管理系统(RDBMS)。它始于1979年,最初是Michael Widenius为瑞典TcX公司创建的UNIREG数据库系统,当时的UNIREG没有SQL(Structured Query Language结构化查询语言)接口,限制了它的应用。1996年5月,Widenius开发出了MySQL的最初版本,开始在Internet上公开发行。MySQL的开发人员从一开始就一直关注它的性能,为此不惜特性集,直到今天,MySQL依然保持本色,以高速度高性能为首要原则。随着时间的推移,MySQL也加入了大型数据库产品的高级特性,如存储过程、视图、触发器等,使其在企业级数据库系统中开始被部署应用[1]。2008年10 月,SUN公司收购了MySQL AB公司,开始进入开源领域。随着重量级操作系统Solaris的开源,SUN MySQL在数据库市场占有的份额将会进一步提高。因此,在生产环境中部署具有负载均衡功能的MySQL服务器集群,对于提高企业数据库应用系统的速度、稳定性及可伸缩性具有很大的现实意义,也可以有效降低应用系统的投资成本。本文将以FreeBSD 7.0-Release操作系统为例,利用MySQL数据库的复制(Replication)特性,简要介绍部署MySQL服务器集群的实现方法和相关注意事项。
2. 系统模型
本集群的结构为一个主MySQL服务器(Master)服务器与多个从属 MySQL服务器(Slave)建立复制(replication)连接,主服务器与从属服务器实现一定程度上的数据同步,多个从属服务器存储相同的数据副本,实现数据冗余,提供容错功能。部署开发应用系统时,对数据库操作代码进行优化,将写操作(如UPDATE、INSERT)定向到主服务器,把大量的查询操作(SELECT)定向到从属服务器,实现集群的负载均衡功能。如果主服务器发生故障,从属服务器将转换角色成为主服务器,使应用系统为终端用户提供不间断的网络服务;主服务器恢复运行后,将其转换为从属服务器,存储数据库副本,继续对终端用户提供数据查询检索服务。
3. 部署实现
本文以一台主服务器带三台从属服务器为例,简要介绍MySQL服务器集群的实现方案和具体方法步骤。
3.1 系统部署
由于FreeBSD系统对机器硬件要求较低,出于降低系统部署成本考虑,主服务器和从属服务器操作系统均采用FreeBSD 7.0-Release,并采用最小化定制安装,完成以后系统占用磁盘空间仅为254M(不计swap分区所占空间,它随具体机器内存容量的变化而变化)。为充分发挥系统硬件性能,MySQL数据库采用源代码编译安装。
3.1.1 安装FreeBSD系统
在主服务器和从属服务器上安装FreeBSD 7.0-Release,具体安装方法步骤不是本文主要内容,在此略过,如有疑问可以参考FreeBSD系统手册。需要说明的是为方便用户系统运行期间的维护管理,要打开系统的SSH服务功能,系统安装配置期间允许root用户远程登录,正常运行以后要关闭root用户的远程登录功能。在/etc/ssh /sshd_config配置文件中对PermitRootLogin设置为yes为允许root用户远程登录到系统,设置为no即为不允许。修改保存文件后执行kill –HUP `cat /var/run/sshd.pid`命令即可重启sshd守护进程,使设置生效[2]。上述操作需要root用户权限。
3.1.2 编译安装MySQL
到MySQL的官方网站http://www.mysql.com下载MySQL数据库的安装源代码压缩包,本例下载的是mysql-5.1.30.tar.gz,以root用户身份登录到系统,开始安装MySQL数据库系统。

由于在对MySQL进行源代码编译安装时要求使用GNU的C编译器,而FreeBSD系统本身提供的不是该编译器,因此用户必须下载安装GNU C编译器[3]。把下载的gnumake-3.81.tar.gz解压安装,按如下步骤即可安装GNU C编译器:

[root@FreebsdMaster/softwares]# tar –zxvf gnumake-3.81.tar.gz
[root@FreebsdMaster /softwares]# cd make-3.81

[root@FreebsdMaster /softwares/make-3.81]# ./configure ; make; make install; make clean

GNU C编译器默认安装到/usr/local/bin,在安装MySQL时按绝对路径调用make命令即可,如# /usr/local/bin/make。

MySQL的编译安装比较复杂,具体操作及相关注意事项如下:

(1). 解压mysql-5.1.30.tar.gz,并进行配置

[root@FreebsdMaster /softwares]# tar –zxvf mysql-5.1.30.tar.gz

[root@FreebsdMaster /softwares]# cd mysql-5.1.30

[root@FreebsdMaster /softwares/mysql-5.1.30]# ./configure \

-–prefix=/app/mysql5 -–with-charset=gb2312

说明:MySQL默认的安装目录是/usr/local/mysql,为了增强系统部署的灵活性,紧贴用户应用系统实际情况,可以用—-prefix 参数定制安装目录。--with-charset参数是使MySQL数据库支持中文gb2312字符集,如果需要支持其它字符集,使用--with- extra-charset参数,格式为—-with-extra-charset=CHARSET1,CHARSET2, … 。

(2). 编译安装MySQL

[root@FreebsdMaster /softwares/mysql-5.1.30]# /usr/local/bin/make

[root@FreebsdMaster /softwares/mysql-5.1.30]# /usr/local/bin/make install

[root@FreebsdMaster /softwares/ mysql-5.1.30]# /usr/local/bin/make clean

注意一定要按绝对路径调用GNU C编译器,否则编译过程报错退出。

(3). 为系统添加mysql用户组和用户

[root@FreebsdMaster /]# pw group add mysql

[root@FreebsdMaster /]# adduser

FreeBSD系统没有groupadd命令,其添加用户组的命令是pw,添加用户命令adduser按系统提示操作即可完成。当然用 pw user add mysql命令也可以完成添加用户mysql的功能,但不如adduser命令功能完善。

(4). 更改/app/mysql5目录及文件属性

[root@FreebsdMaster /app]# chmod –R mysql mysql5

[root@FreebsdMaster /app]# chgrp –R mysql mysql5

说明:/app/mysql5为MySQL数据库系统所在目录,如果用户部署的应用系统数据量极大,可以将数据库系统目录设在大容量磁盘阵列上。磁盘阵列设置与具体机器硬件相关性很大,具体操作设置参考具体硬件系统说明和FreeBSD操作手册。不借助第三方软件,FreeBSD 7.0-Release系统可以配置RAID0、RAID1磁盘阵列。

(5). 安装MySQL系统初始数据库

[root@FreebsdMaster /softwares/ mysql-5.1.30]# ./scripts/mysql_install_db.sh --basedir=/app/mysql5 –-data-dir=/app/mysql5/data

注意:必须考虑Unix系统的文件权限特性,首先给mysql_install_db.sh脚本添加可执行属性,否则安装脚本无法执行。执行 chmod +x ./scripts/mysql_install_db.sh命令即可。参数--basedir=/app/mysql5和--datadir=/app /msyql5/data为必加参数,否则脚本运行报错退出,无法安装系统初始数据库mysql和测试数据库test,mysql数据库包含系统权限设置表,没有这些表数据库服务进程mysqld将无法启动。

(6). 再次更改/app/mysql5目录及其文件属性

[root@FreebsdMaster /app]# chmod –R root mysql5

[root@FreebsdMaster /app]# chmod –R mysql mysql5/data

这样做是为了保证系统安全,防止通过MySQL系统漏洞的入侵行为。MySQL以mysql用户身份运行,对/data目录具有完全访问权限,对其它目录则只有系统管理员根据需要设置的访问权限,确保FreeBSD系统的安全。这里需要特别提醒用户注意的是要确保mysqld文件(MySQL的守护进程,位于/app/mysql5/libexec目录下)没有设置setuid标志位,如果设置了该标志位,入侵者对其它文件就具有其不应有的权限。具体原因参考关于Unix系统安全的手册,本文对这个问题不再赘述。

(7). 启动MySQL服务器

上述操作全部完成以后,输入如下命令启动MySQL数据库服务守护进程:
[root@FreebsdMaster /]# /app/mysql5/bin/mysqld_safe –user=mysql &
--user参数表示以mysql用户身份运行MySQL数据库服务守护进程,“&”符号表示以后台方式运行。输入 netstat –an|grep 3306命令,如果看到下面的输出则表示MySQL5.1.30已在用户系统上编译安装成功。其中,3306是MySQL数据库系统默认的监听端口号。
[root@FreebsdMaster /]# netstat –an|grep 3306
tcp4 0 0 *.3306 *.* LISTEN
按照同样方法与步骤在其它三台机器上安装FreeBSD 7.0-Release与MySQL5.1.30,为下面的MySQL服务器集群配置准备好系统平台基础。
3.2 系统配置
所有系统安装完毕之后,需要对它们做一些必要的配置方可按照用户预先设计的结构模型实现具有负载均衡功能的MySQL服务器集群。
3.2.1 FreeBSD操作系统配置
(1). 调整内核参数,优化操作系统性能
因为是处于生产环境的服务器,投入正常运行之前一定要对内核参数进行必要的调整,提升系统性能,加强稳定性。简要说就是去掉不必要的硬件支持选项,使新内核占用更少的内存,加快启动速度。不同机器硬件系统差异很大,用户可根据具体系统的硬件情况不断调整试验,最终定制出最优化、最安全的FreeBSD 系统。一定要屏蔽掉组合键Ctrl+Alt+Del的热重启功能,防止用户误按Ctrl+Alt+Del重启系统,引起数据库系统服务意外中断。在内核配置文件如MYKERNEL中加入:
options SC_DISABLE_REBOOT
重新编译系统内核,重启后即可屏蔽Ctrl+Alt+Del组合键的热重启功能。如何定制新内核及重新编译FreeBSD系统,用于可参考FreeBSD系统手册,此不赘述。
(2). 进行其它设置,增强系统安全性
用户可根据以下一般安全准则设置自己的FreeBSD系统。
·选择一个好的密码并予以妥善保护。
·对于敏感文件采用适当安全等级的加密算法进行加密。对于敏感级别不是很高的文件采用系统自带的crypt工具加密;对于敏感度极高的文件则使用专用加密工具,如PGP、GPG进行不对称加密,提高加密文件的防攻击能力。
·仔细设置文件访问权限,达到保护文件目的。
·保护好自己的.profile文件。恰当设置.profile文件的访问权限,确保只有自己能访问。
·仔细维护已设置setuid或setgid标志位的任何程序。
·禁止不加防范地离开已注册终端。任何时候都必须按常规正常退出系统,先执行clear清屏命令,防止其它用户看到操作痕迹,再执行exit命令退出终端。
·防范特洛伊木马程序。正确设置PATH变量的检索顺序,确保系统目录位于当前目录的前面。
·防范病毒的入侵。
·监控最近一次注册时间,确保没有他人盗用自己的帐号。
特别提示:对于生产环境的服务器,一定要保证服务器的物理安全,安全措施再完善的系统,一旦被入侵者物理接触,所有的安全措施将形同虚设!
Unix系统安全是一个很大的课题,本文只是提及了一些最肤浅的常识,具体内容用户可以参考相关书籍或网上资源。为确保Unix系统的配置具有高度的安全性,可以使用Internet安全中心(Center for Internet Security,CIS)提供的安全测试工具Benchmarks或评估工具Scoring Tools,检验和监控系统配置的安全性 [4]。
3.2.2 MySQL数据库系统配置
为了能使上述系统实现一对多的主从复制(replication)和冗余机制,还需要对以上四个MySQL服务器进行一些必要的配置。
(1). 配置主机名和IP地址
本实现方案中把MySQL服务器Master主机名设为FreebsdMaster,IP地址配置为192.168.1.100,其它三台Slave 依次设为 FreebsdSlave1,192.168.1.101;FreebsdSlave2,192.168.1.102;FreebsdSlave3,IP 地址192.168.1.103。
(2). 设置root用户密码
MySQL的root用户初始密码为空,为保证系统安全必须为root用户设置密码:
[root@FreebsdMaster /]# /app/mysql5/bin/mysql –uroot –p
Enter password:
mysql>SET PASSWORD=PASSWORD(‘secret');
同Unix系统一样,输入密码时屏幕没有任何回显,进入系统后执行SET PASSWORD SQL语句设置或修改MySQL root用户密码。为使应用系统服务器远程连接到MySQL数据库服务器,除本地root用户以外,还要设置一个能从用户内部网络其它终端登录的root 用户。具体操作如下:
  mysql>USE mysql;
  mysql>UPDATE user SET Host='%' WHERE Host='hostname.yourdomain' AND User='root';
  mysql>flush privileges;
  完成上述操作后应用系统服务器就可以连接到MySQL数据库服务器进行各种操作了,这个远程root用户的初始密码为空,用户需要从远程终端登录,为其设置密码。
  (3). 开启MySQL服务器的二进制更新日志功能
  上述MySQL服务器安装完成后,安装程序没有生成my.cnf配置文件,为此用户需要手工添加/etc/my.cnf文件。MySQL服务是由 /app/myql5/libexec/mysqld提供的,其寻找my.cnf配置文件的默认顺序为/etc/my.cnf,~/.my.cnf, /usr/local/mysql/etc/my.cnf。启动ee编辑器,# ee /etc/my.cnf,在Master机器的配置文件写入如下内容:
  [mysqld]
  log-bin=mysql-master-bin
  server-id=1
  在其它三台Slave机器的配置文件/etc/my.cnf文件写入如下内容:
  [mysqld]
  server-id=int
  其中,int为一大于1且互不相等的正整数,如2,3,4等。务必要正确设置每个机器上的/etc/my.cnf配置文件,尤其是server-id不能有重复,这是一对多数据库复制能否成功的关键[5]!
  设定好上述/etc/my.cnf文件后启动Master上的MySQL数据库服务时就自动开启了二进制更新日志功能。在Slave上启动MySQL时要加上—log-bin参数,即可开启二进制更新日志功能。在Slave机器上启动MySQL服务的命令如下:
  # /app/mysql5/bin/mysqld_safe --user=mysql --log-bin &
  这样做的目的为了实现冗余容错功能。当主服务器Master出现故障停止服务时,在预转换角色成为Master的Slave上执行STOP SLAVE; RESET MASTER SQL语句,在其它两台Slave上执行CHANGE MASTER TO SQL语句,执行STOP SLAVE; RESET MASTER SQL语句的Slave服务器即转换成新的Master,其余两台机器则从新的Master复制数据库数据(复制的是更新UPDATE、INSERT等操作,并不是简单的copy),从而实现冗余容错。
 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服务器集群负载均衡功能带来的大幅性能提升及冗余容错特性相比,这个开销绝对是物超所值!
3.4 注意事项
正确部署实现具有负载均衡功能的MySQL服务器集群必须注意以下事项:

(1). MySQL数据库复制(replication)特性是核心

此处的复制不是简单的copy,从属服务器启动两个线程(thread):I/O线程和SQL线程,I/O线程接收主服务器对参与复制数据库的更新操作事件(event),并记入自己的中继二进制更新日志文件(hostname-relay-bin.00000n),由SQL线程将更新操作写入自己的数据库表项。主从服务器之间复制的不是具体的数据内容,而是具体的以二进制格式记录的操作事件,因而在一定程度上实现主从服务器之间的数据同步。(这种复制类似于生物学意义上的按基因复制,在英语中replication的主要词义就是指该种复制。)
(2). 复制的复杂性
主从数据库服务器间的replication要求Master与Slave上的MySQL版本最好一致,主从服务器必须设置相同的字符集,否则很容易造成复制失败。主服务器上更新权限表内容的FLUSH语句不会被复制[8]。
(3). 按照范式化要求设计数据库
生产环境下基于MySQL服务器的应用系统要想稳定运行,按范式化设计系统数据库是基本要求,具体内容可参考相关书籍。
(4). 打开数据库服务器的远程用户连接功能
打开主从服务器的远程用户连接是实现更新、查询操作分别定向的必要条件,否则,来自应用服务器的连接请求失败,影响系统应用正常运行。
(5). 负载均衡功能的实现需要良好的团队合作
BIND DNS服务器实现了从属服务器Slave之间的负载均衡,Slave和Master之间的负载均衡则由应用系统开发人员在程序代码级实现。整个系统的性能提升和冗余容错需要网络管理和应用系统开发团队之间的良好合作,否则负载均衡功能的实现就会失败。
4. 常见问题
(1). 如何估算MySQL服务器集群的性能提升量?
针对本文采用的结构模式,可对应用系统整体性能提升做出大致估算。假设应用系统写操作占10%,读操作占90%,写操作耗时是读操作的2倍,系统的吞吐量(throughput)为T(用reads/s读操作次数/秒来衡量)。把写操作线性转换为读操作,则有:
T= 2Xwrites + 9Xwrites ==>writes=T/11① (不采用主从复制模式,读写操作集中到一个服务器上)
T= 2Xwrites + 9Xwrites/N ==> writes=T/(2+9/N)② (采用一对多的主从复制模式,读操作在从属服务器,写操作在主服务器)
其中,writes为系统单位时间内所能承受的最大写操作次数,N为从属服务器个数,N大于等于2。在不采用主从复制模式时,系统性能 writes=T/11;采用本文一对三的复制模式时,系统性能writes=T/5。采用负载均衡模式与不采用系统性能之比为11:5,即2.2:1,考虑到应用服务器的额外开销,系统整体性能提升了整整1倍!从②式可以看出,系统整体性能理论极限为T/2,当然在实际生产环境中不可能达到。具体部署时用户可以根据自己的实际情况估算出合理的从属服务器数量,主要影响因素是网络带宽和机器整体性能[9]。
(2). 如何应对主从服务器崩溃?
当某台从属服务器崩溃时,修复故障重启后重新连接到主服务器,根据其master.info文件更新其数据,保持与主服务器的数据同步。如果主服务器崩溃,在某一从属服务器上执行STOP SLAVES; GRANT REPLICATION SLAVE ON *.* repl_db TO ‘repl'@'%' IDENTIFIED BY ‘g00r002b';RESET MASTER;这三个SQL语句,由于从属服务器已启动了二进制更新日志功能,因此具备了角色转换的必要条件。更改其主机名、IP地址及server- id与Master一样,重启MySQL服务器,系统开始正常对外提供服务。其它两台从属服务器则不需执行任何操作,继续执行replication过程。BIND DNS服务器和应用程序也不需做任何调整,继续对系统用户提供不间断服务。主服务器排除故障恢复正常后,将其网络配置改为与现有Master转换角色之前一样的配置,重启MySQL服务,将其角色转换为从属服务器。也就是说,整个集群机器的角色可以相互循环转换,提高系统的冗余性和可靠性。在此需要注意的是,在应用系统调试运行正常之后,在Slave角色服务器的/etc/my.cnf文件[mysqld]段加入slave-skip- errors=all,保证集群之间复制(replication)的正常运行。
5. 结束语
部署与实现具有负载均衡功能的MySQL服务器集群是一项复杂的系统工程,需要多方面良好的协同合作才能做好。服务器的搭建配置、BIND DNS服务器的配置部署,以及应用系统程序的开发都要紧紧围绕实现MySQL服务器集群负载均衡功能这个目标。必须对主服务器的运行状态进行动态监控,如果发生故障,立即执行角色转换过程,确保为终端用户提供可靠、不间断的服务。可以针对具体系统环境写出监控脚本或程序,确保系统的可靠性与稳定性。

(0)

相关推荐

  • MySQL Cluster集群的初级部署教程

    Mysql Cluster概述 MySql Cluster最显著的优点就是高可用性,高实时性,高冗余,扩展性强. 它允许在无共享的系统中部署"内存中"数据库的Cluster.通过无共享体系结构,系统能够使用廉价的硬件.此外,由于每个组件有自己的内存和磁盘,所以不存在单点故障. 它由一组计算机构成,每台计算机上均运行者多种进程,包括mysql服务器,NDB cluster的数据节点,管理服务启,以及专门的数据访问程序 所有的这些节点构成一个完整的mysql集群体系.数据保存在"

  • Windows下部署Apache+PHP+MySQL运行环境实战

    官方下载地址:MySQL http://www.mysql.com/downloads/mysql/ 找个MSI文件下下来.Apache http://httpd.apache.org/download.cgiPhp http://windows.php.net/download/#php-5.4 首先是MySQL,(这边吐槽一下被Oracle收购的MySQL) 一步一步往下,无需更多的配置 然后安装Apache, 也是一步一步往下 安装PHP,(我偷懒我自豪, 在PHP下载页面找那个Insta

  • MySQL下高可用故障转移方案MHA的超级部署教程

    MHA介绍 MHA是一位日本MySQL大牛用Perl写的一套MySQL故障切换方案,来保证数据库系统的高可用.在宕机的时间内(通常10-30秒内),完成故障切换,部署MHA,可避免主从一致性问题,节约购买新服务器的费用,不影响服务器性能,易安装,不改变现有部署.      还支持在线切换,从当前运行master切换到一个新的master上面,只需要很短的时间(0.5-2秒内),此时仅仅阻塞写操作,并不影响读操作,便于主机硬件维护.   在有高可用,数据一致性要求的系统上,MHA 提供了有用的功能

  • 在Linux系统上部署Apache+Python+Django+MySQL环境

    Linux+apache+mysql+python+mod_python+Django 说明:系统rhel 5.3,默认安装httpd.mysql,没有安装的,请下载安装RPM包,删除/etc/httpd/modules/mod_python.so,如果有的话. 一.安装python wget http://www.python.org/ftp/python/2.7.1/Python-2.7.1.tgz  tar xfz mod_python-2.7.11.tgz cd python-2.7.1

  • 分享MySQL的自动化安装部署的方法

    有过MySQL运维的人应该都清楚,线上的MySQL一般都采用源码编译,因为这样才可以根据企业的各自需要选择要编译的功能,虽然MySQL的源码编译挺简单的,但是试想一下,如果你有几百台服务器同时要安装MySQL,难道你还一台台去手动编译.编写配置文件吗?这显然太低效了,本文讨论MySQL的自动化安装部署. 1.制作符合自己需求的RPM包 我们要根据MySQL的源码编译符合企业需求的RPM包,源码获取命令如下: wget http://downloads.mysql.com/archives/get

  • MySQL高可用MMM方案安装部署分享

    1 install mysql 请参考http://www.jb51.net/article/47094.htm 2. Basic configuration of master 1 3. Create users GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'%' IDENTIFIED BY 'mmm_monitor'; GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agen

  • PHP的Laravel框架结合MySQL与Redis数据库的使用部署

    相对于熟读官方文档,更重要的是要把框架环境搭起来. 零.环境介绍 操作系统:centOS 数据库: mysql 5.6 (阿里云RDS) PHP 5.4.4 (>=5.4即可) Laravel 5.0 一.安装LNMP 在安装Laravel之前,需要把Linux + Nginx + Mysql + Php的环境搭建好.具体的搭建步骤这里就不再详述了. P.S. Linux阿里云已经自带了,本文使用的是centOS 6.5 64位的ECS 关于Nginx和Apache的选择看自己喜好,本文使用的是

  • 快速实现MySQL的部署以及一机多实例部署

    MySQL有三个版本:二进制,源码包,RPM. 下面讲讲二进制包的安装过程 下载地址:http://dev.mysql.com/downloads/mysql/ 选择Linux-Generic 我这里选择的是mysql-5.6.28-linux-glibc2.5-x86_64.tar.gz 解压后,里面有个文件INSTALL-BINARY,其实给出了二进制包的部署过程 shell> groupadd mysql shell> useradd -r -g mysql -s /bin/false

  • 具有负载均衡功能的MySQL服务器集群部署及实现

    在实际生产环境中,部署和实现具有一定负载均衡功能的 MySQL服务器集群,对于提高用户数据库应用系统的性能.速度和稳定性具有明显的作用.本文简要介绍了在 FreeBSD 7.0-Release系统上部署实现MySQL服务器集群的方案,并对可能出现的问题提供了相应的解决方法.1. 引言MySQL是一个高速度.高性能.多线程.开放源代码,建立在客户/服务器(Client /Server)结构上的关系型数据库管理系统(RDBMS).它始于1979年,最初是Michael Widenius为瑞典TcX公

  • MySQL如何实现负载均衡功能

    前言 MySQL是一个高速度.高性能.多线程.开放源代码,建立在客户/服务器(Client/Server)结构上的关系型数据库管理系(RDBMS).它始于1979年,最初是MichaelWidenius为瑞典TcX公司创建的UNIREG数据库系统,当时的UNIREG没有SQL(StructuredQueryLanguage结构化查询语言)接口,限制了它的应用. 1996年5月,Widenius开发出了MySQL的最初版本,开始在Internet上公开发行.MySQL的开发人员从一开始就一直关注它

  • 详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南

    Nginx是一种服务器软件,也是一种高性能的http和反向代理服务器,同时还是一个代理邮件服务器.也就是说,我们在Nginx上可以发布网站,可以实现负载均衡(提高应答效率,避免服务器崩溃),还可以作为邮件服务器实现收发邮件等功能.而最常见的就是使用Nginx实现负载均衡. Nginx与其他服务器的性能比较: Tomcat服务器面向Java语言,是重量级的服务器,而Nginx是轻量级的服务器.Apache服务器稳定.开源.跨平台,但是Apache服务器不支持高并发,Nginx能支持处理百万级的TC

  • SpringCloud与Consul集成实现负载均衡功能

    负载均衡(Load Balance,简称LB)是一种服务器或网络设备的集群技术.负载均衡将特定的业务(网络服务.网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性.负载均衡基本概念有:实服务.实服务组.虚服务.调度算法.持续性等,其常用应用场景主要是服务器负载均衡,链路负载均衡. 一.背景 SpringCloud微服务目前比较流行,其中大都在使用的服务注册与发现是Eureka,最近研究了Consul的集群搭建,现使用Consul实现服务的负载均衡.其主要拓扑结构

  • Nginx使用ngx_http_upstream_module实现负载均衡功能示例

    目录 负载均衡介绍 什么是负载均衡 为什么需要负载均衡 负载均衡调度算法 负载均衡后端节点状态 负载均衡介绍 什么是负载均衡 负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡.分摊到多个操作单元(服务器,组件)上进行执行. 为什么需要负载均衡 当单台web服务器直接面向用户,可能要承载着大量的并发请求,单台服务器可能难以负荷,我们需要使用多台web服务器组成一个集群,利用Nginx负载均衡功能,将请求分发给不同的后端服务器,实现负载的流量分发,提升整体性能.以及系

  • Redis整合MySQL主从集群的示例代码

    目录 1.用Docker搭建MySQL主从集群 1.1 拉取mysql镜像 1.2 创建配置文件夹 1.3 编写主服务器的配置文件信息 1.4 启动mysql主服务器的容器 1.5 观察主服务器状态 1.6 配置mysql从服务器 1.7 启动mysql从服务器 1.8 确认主从关系 2.准备数据 2.1 创建数据库 2.2 创建student数据表 2.3 向student表插入几条数据 3.用Java代码读写MySQL集群和Redis 3.1 引入redis和mysql依赖 3.2 代码整合

  • MySQL的集群配置的基本命令使用及一次操作过程实录

    1. 先了解一下你是否应该用MySQL集群. 减少数据中心结点压力和大数据量处理,采用把MySQL分布,一个或多个application对应一个MySQL数据库.把几个MySQL数据库公用的数据做出共享数据,例如购物车,用户对象等等,存在数据结点里面.其他不共享的数据还维持在各自分布的MySQL数据库本身中. 2. 集群MySQL中名称概念.(如上图) 1)Sql结点(SQL node--上图对应为MySQLd):分布式数据库.包括自身数据和查询中心结点数据. 2)数据结点(Data node

  • MySQL之高可用集群部署及故障切换实现

    一.MHA 1.概念 2.MHA 的组成 3.MHA 的特点 二.搭建MySQL+MHA 思路和准备工作 1.MHA架构 数据库安装 一主两从 MHA搭建 2.故障模拟 模拟主库失效 备选主库成为主库 原故障主库恢复重新加入到MHA成为从库 3.准备4台安装MySQL虚拟机 MHA高可用集群相关软件包 MHAmanager IP:192.168.221.30 MySQL1 IP:192.168.221.20 MySQL2 IP:192.168.221.100 MySQL3 IP: 192.168

  • Redis中常见的几种集群部署方案

    目录 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 举个栗子 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 RedisCluster方案 哈希槽重新分配 避免HotKey 如何发现HotKey HotKey如何解决 避免BigKey BigKey存在问题 如何发现BigKey BigKey如何避免 BigKey如何删除 参考 前言 这里来了解一下,Redis 中常见的集群方案 几种常用的集群方案 主从集群模式 哨兵机制 切

  • 以示例讲解Clickhouse Docker集群部署以及配置

    目录 写在前面 环境部署 Zookeeper集群部署 Clickhouse集群部署 1.临时镜像拷贝出配置 2.修改config.xml配置 3.拷贝到其他文件夹 4.分发到其他服务器 配置集群 1.修改配置 2.新增集群配置文件metrika.xml 集群运行及测试 写在前面 抽空来更新一下大数据的玩意儿了,起初架构选型的时候有考虑Hadoop那一套做数仓,但是Hadoop要求的服务器数量有点高,集群至少6台或以上,所以选择了Clickhouse(后面简称CH).CH做集群的话,3台服务器起步

随机推荐