附录2 分布式数据库系统

附录2 分布式数据库系统

学习目标

了解分布式数据库系统

学习分布式数据库部署

读写分离

由于计算机网络通信的迅速发展以及地理上分散的公司、团体和组织对数据库更为广泛的应用的需求。20世纪80年代在集中式数据库系统成熟技术的基础上产生和发展了分布式数据库系统(Distributed Database System)。分布式数据库系统是数据库技术和网络技术两者相互渗透和有机结合的结果。

这一章介绍分布式数据库系统的基本概念。由于分布式系统数据库系统比集中式数据库系统更复杂,在有限的篇幅中只能论述最基本的概念和技术。作为今后进一步学习分布式数据库系统的基础。

2.1 概述

2.1.1 分布式数据库系统

什么样的一个数据库系统才算是分布式数据库系统呢?一个粗略的定义是:

“分布式数据库由一组数据组成,这些数据物理上分布在计算机网络的不同节点上(亦称场地)上,逻辑上是属于同一个系统。”

这个定义强调了下面两点:

(1) 分布性。数据库中的数据不是存储在同一场地上,更确切地讲,不存储在同一计算机的存储设备上,这就可以和集中式数据库相区别。

(2) 逻辑整体性。这些数据逻辑上是互相联系的,是一个整体(逻辑上如同集中数据库)。这就可以和分散在计算机网络不同节点上的那些集中式数据库或文件的集合相区别。后者各节点的数据之间没有内在的逻辑联系,所以在讨论分布式数据库时就有了全局数据库(逻辑上)和局部数据库(物理上)的概念。

2.1.2 分布式数据库系统的特点

分布式数据库系统是在集中式数据库系统技术的基础上发展起来的。它具有自己的特性和特征。集中式数据库的许多概念和技术,如数据独立性、数据共享性和减少冗余度、并发控制、完整性、安全性和恢复等。

一、数据独立性

在集中式数据库系统中,数据独立性包括两个方面:数据的逻辑独立性和数据的物理独立性。其含义是用户程序与数据的全局逻辑结构及数据的存储结构无关。在分布式数据库系统中除了数据的逻辑独立性和物理独立性外,还有数据分布独立性亦称为分布透明性。分布透明性是指用户不必关心数据的逻辑分片,不必关心数据物理位置分布的细节,也不必关心重复副本(冗余数据问题)一致性问题 ,同时也不必关心局部场地上数据库支持哪种数据模型。

二、集中于自治相结合的控制结构

数据库是多个用户共享的资源,在集中式数据库系统中,为了保证数据库的安全性和完整性,对共享数据库的控制是集中的,并有DBA负责监督和维护系统的正常运行。

在分布式数据库系统中,数据的共享有两个层次:

(1) 局部共享。即在局部数据库中存储局部场地各用户的共享数据,这些数据是本场地用户常用的。

(2) 全局共享。即在分布式数据库系统的各个场地也存储其它场地的用户共享的数据,支持系统的全局应用。

因此,相应的控制机构也具有两个层次:集中和自治。

三、适当增加数据冗余度

在集中式数据库系统中,尽量减少冗余度是系统目标之一。其原因是,冗余数据不仅浪费空间,而且容易造成各数据副本之间的不一致性,为了保证数据的一致性,系统要付出一定的维护代价,减少冗余度的目标是用数据共享来达到的。

而在分布式数据系统中却希望存储必要的荣誉数据,在不同的场地存储同一数据的多个副本,其原因是:

(1) 提高系统的可靠性、可用性:当某一场地出现故障时,系统可以对另一场地上的相同副本进行操作,不会因为一处故障而造成整个系统的瘫痪。

(2) 提高系统性能:系统可以选择用户最近的数据副本进行操作,减少通信代价,改善整个系统的性能。冗余副本之间数据不一致的问题是分布式数据库系统必须着力解决的问题。

四、全局一致性、可串行性和可恢复性

分布式数据库系统中个局部数据库应满足集中式数据库的一致性、并发事务的可串行性和可恢复性。除此以外还应保证数据库的全局一致性、全局并发食物的可串行性和系统的全局可恢复性。

2.2 使用Mysql-Cluster搭建数据库集群

当业务到达一定的当量,肯定需要一定数量的数据库来负载均衡数据库请求,关于如何实现负载均衡,可以参考网上的教程。但是还有一个问题就是数据同步,因为负载均衡的前提就是,各个服务器的数据库是数据同步的。在业务量不大的时候,会使用主从复制的方法实现服务器数据同步,一主多从或者是双主等,但是虽然进行了读写分离,但是对于读的方法限制还是比较大,所以解决数据同步的问题就是数据库集群的意义。这里使用mysql官网提供的mysql-cluster实现集群。

2.2.1 mysql cluster中的几个概念解释

➢ mysql-cluster已经包含了mysql,这里下载的mysql-cluster7.5,官方说明包含的是mysql版本是5.7。所以不需要使用别的msyql的安装包安装数据库。同时注意mysql5.7的版本在安装的命令和配置上面和之前的版本有很大的不同,所以网上有很多mysql-cluster7.5之前的版本,所包含的mysql版本不同,所以安装方法不同。

➢ 管理节点,mysql-cluster管理节点负责管理、配置、监控整个集群。

➢ 数据节点,使用内存存放数据,保存进数据节点的数据都会自动复制并存储到其他数据节点。

➢ mysql节点,也叫数据库节点,和平时使用的mysql相同,作为数据库使用。被数据节点访问。

2.2.2 架构图及说明

图附录2.1

配置如图所示,因为虚拟机占用内存较大,只使用了3台服务器,在实际情况中最好将数据节点和mysql节点分开。在实际中负载均衡服务还需要做备份,因为万一负载均衡服务器宕机将会导致所有数据节点都无法访问,所以需要对负载均衡服务器备份,有条件的话,分开管理节点和负载均衡器。实验只实现整个数据库集群,负载均衡可以参考 HAProxy实现mysql负载均衡 也可以使用的别的负载均衡方案。

2.2.3 下载mysql cluster

首先下载mysql cluster,推荐使用镜像下载,下载速度比官网快一些。

本次下载的版本是mysql-cluster-gpl-7.5.4-linux-glibc2.5-x86_64.tar.gz,64位版本。

2.2.4 安装mysql cluster之前

安装之前,如果之前安装过mysql,那么需要删除相应的各种mysql文件,删除之前请停止mysql服务。并且不要忘记删除my.cnf这些配置文件。确保删除干净。不然可能会和后面的安装有冲突。如果是实验,关闭防火墙,实际中,防火墙打开对应端口,{注意实际中需要使用的端口不只有3306端口,还有同步需要使用的1186端口!!!}。保证服务器之前能互相访问,能ping通。保证固定的ip地址。保证没有别的程序占用需要使用的端口。如3306等。这些都确认完毕后再进行安装。需要linux基础的命令熟练,需要熟练安装mysql基本版本等操作,因为后序的一些操作会简单描述,不做过多的说明了。

2.2.5 安装配置管理节点

将下载后的包上传至服务器/usr/local下

解压

# tar xvf mysql-cluster-gpl-7.5.4-linux-glibc2.5-x86_64.tar.gz

将需要的文件取出

# cd mysql-cluster-gpl-7.5.4-linux-glibc2.5-x86_64

# cp bin/ndb_mgm* /usr/local/bin

# cd /usr/local/bin

# chmod +x ndb_mgm*

新建配置文件并且初始化管理节点

# mkdir /var/lib/mysql-cluster

# mkdir /usr/local/mysql

# vi /var/lib/mysql-cluster/config.ini

下面是配置文件,根据自己的需求修改,首先给出官网的默认配置文件,然后给出修改后的配置文件,根据修改后的配置文件修改即可,别的均可不动。

默认配置文件:

修改过的:

使用配置文件初始化管理节点

# /usr/local/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial

出现MySQL Cluster Management Server mysql-5.7.16 ndb-7.5.4

然后就能使用ndbd进去管理了(如果ndbd命令不行,就使用在/usr/local/bin目录下使用ndb_mgm命令)

# ndbd

ndb_mgm>show(使用show命令查看管理情况,当数据节点配置完毕之后,再用这个命令查看和管理)

到此为止管理节点配置完毕,接下去配置数据和sql节点。

2.2.6 安装配置数据和mysql节点

以下的所有操作需要在所有的集群节点都要进行相同的操作

新增用户组mysql和用户msyql

# groupadd mysql

# useradd -g mysql -s /bin/false mysql

新建文件夹并赋予权限

# mkdir /var/lib/mysql-cluster

# chown root:mysql /var/lib/mysql-cluster

将下载后的包上传至服务器/usr/local下

解压

# tar xvf mysql-cluster-gpl-7.5.4-linux-glibc2.5-x86_64.tar.gz

创建链接方便访问

# ln -s /usr/local/mysql-cluster-gpl-7.5.4-linux-glibc2.5-x86_64/usr/local/mysql

初始化数据库(这里要注意,如果安装的版本与这里的不同,数据库初始化的命令使不同的,很多之前的版本会使用:scripts/mysql_install_db --user=mysql来初始化,这个已经被mysql在新的版本中废弃了,所以需要使用下面的命令安装,如果需要安装别的版本请参考mysql官网的对应版本的安装命令。)

进入刚才创建的目录下

# cd /usr/local/mysql

如果下方这个命令无法使用,那么就进入bin目录下使用./mysqld --initialize进行初始化,总之正常安装mysql如何初始化就如何进行安装就可以了,这里还可以设置安装数据库的data目录等参数这里就不多解释了,网上安装mysql5.7的教程很多。

# mysqld --initialize

如果初始化成功之后,系统会提示一个随机生成的数据库密码,此时需要记住这个密码,之后登录数据库需要使用这个密码。

修改权限:

配置数据节点:

其中的IP为管理节点的IP

启动集群节点上面的服务启动mysql(成功会有success)

# /etc/init.d/mysql.server start

启动mysql成功之后请自己登录进mysql内然后进行密码修改等操作,就和正常安装完成mysql的操作一样。需要注意的是,集群数据库的密码需要相同哦!

启动ndbd# /etc/init.d/ndbd --initial如果上述不行使用绝对路径的这个:

# /usr/local/mysql/bin/ndbd --initial如果出现下述现象就成功了

2017-03-06 14:04:07 [ndbd] INFO-- Angel connected to '192.168.75.129:1186'

2017-03-06 14:04:07 [ndbd] INFO-- Angel allocated nodeid: 2

最后当所有的节点配置完成,回到管理节点,使用上述说过的show查看,如下的类似显示,证明已经连接完成。

2.2.7 测试

修改mysql密码统一,修改mysql的访问权限,使外部ip能远程访问mysql。

然后创建在一台上面创建数据库,看另一台是否被同步,然后创建表,然后新增删除等等。

唯一需要注意的是,创建表的时候必须选择表的引擎为NDBCLUSTER,否则表不会进行同步。

下面是测试的截图,如图附录2.2所示。

图附录2.2

如果使用sql创建表,命令为:

2.2.8 启动和关闭

启动mysql集群。启动顺序为:管理节点→数据节点→SQL节点。

启动的命令上面都有,删去--initial即可

关闭时只需要关闭管理节点,后面的数据节点会同时被关闭,mysql就和原来一样即可管理节点关闭命令:ndb_mgm -e shutdown

(执行完成之后管理节点会关闭,数据节点也会关闭,但SQL节点不会,也就是数据库服务需要手动到每一台服务器上停止以保证数据同步)

2.3 读写分离

当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来。然而有很多办法可以缓解数据库的压力。分布式数据库、负载均衡、读写分离、增加缓存服务器等等。这里将采用读写分离技术进展缓解数据库的压力。

MySQL的主从复制和MySQL的读写分离两者有着紧密联系,首先部署主从复制,只有主从复制完了,才能在此基础上进行数据的读写分离。

简单来说,读写分离就是只在主服务器上写,只在从服务器上读,基本的原理是让主数据库处理事务性操作,而从数据库处理非事务性操作,然后再采用主从复制来把master上的事务性操作同步到slave数据库中。

2.3.1 实现方式

1.基于程序代码内部实现

在代码中根据select,insert进行路由分类,这类方法也是目前生产环境应用最广泛的,优点是性能好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支,缺点是需要开发人员来实现,运维人员无从下手。

2.基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有两个代表性程序。

(1) mysql-proxy 为mysql开源项目,通过其自带的lua脚本进行SQL判断,虽然是mysql的官方产品,但是mysql官方不建议将其应用到生产环境。

(2) Amoeba (变形虫)由陈思儒开发,曾就职与阿里巴巴,该程序由java语言进行开发,阿里巴巴将其应用于生成环境,它不支持事物和存储过程。

2.3.2 实现过程

实现读写分离的技术有很多方法,这里将采用mysql-proxy这个中间软件来实现。这个软件中含有一个读写分离的lua文件,这也是使用mysql-proxy实现读写分离必用的文件,它需要lua解析器进行解析。因此还需要安装一个lua解析器。

1.基本环境

三台linux虚拟主机

Linux版本CentOS6.6、MySQL 5.5

mysql-proxy-0.8.5

lua-5.1.4

ip:192.168.95.11(写)、192.168.95.12(读)、192.168.95.13(mysql-proxy)

2.配置主从复制

第一步:在192.168.95.11中创建一个192.168.95.12主机中可以登录的MySQL用户。

用户:mysql12

密码:mysql12

第二步:查看192.168.95.11 MySQL服务器二进制文件名与位置。

mysql>SHOW MASTER STATUS;

图附录2.3

第三步:告知二进制文件名与位置。

在192.168.95.12中执行:

第四步:在192.168.95.12中

mysql>SLAVE START;#开启复制

mysql>SHOW SLAVE STATUS\G #查看主从复制是否配置成功

图附录2.4

主从复制配置成功。

3.安装lua

Lua 是一个小巧的脚本语言。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。

一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。

(1) 安装lua需要依赖很多软件包。

可以通过rpm -qa | grep name检查以下软件是否安装:

gcc*、gcc-c++*、autoconf*、automake*、zlib*、libxml*、ncurses-devel*、libmcrypt*、libtool*、flex*、pkgconfig*、libevent*、glib*

若缺少相关的软件包,可通过yum -y install方式在线安装,或直接从系统安装光盘中找到并通过rpm -ivh方式安装。(一般是直接在系统光盘软件库中找到直接rpm安装的,有些找不到,则先在网上下载然后在ftp传给linux再进行安装)

(2) 依赖软件安装完毕后则进行编译安装lua。

MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua。

官网下载源码包:

4.安装mysql-proxy

(1) 首先查看linux版本确认是32位还是64为系统

查看linux内核版本

# cat /etc/issue

查看linux版本

# cat /proc/version

(2) 按系统位数下载

到MySQL官方网站下载。

(3) 安装

安装成功。

图附录2.5

2.3.3 读写分离测试

1.修改rw-splitting.lua文件

修改默认连接,进行快速测试,不修改的话要达到连接数为4时才启用读写分离。

#cp /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ./

图附录2.6

# vi rw-splitting.lua

图附录2.7

2.修改完成后,启动mysql-proxy

参数:

图附录2.8

3.创建用于读写分离的数据库连接用户

用户名:proxy1

密 码:321

因为已经开启了主从复制所以,11、12主机mysql中都创建了这个用户。

4.测试登录账号proxy1@192.168.95.13进行添加数据

可以使用任意ip客户端登录这个账号,在192.168.95.13登陆:

# ./mysql -u proxy1 -P4040 -h192.168.95.13 -p

图附录2.9

在两个mysql中查看结果一致。

图附录2.10

结果表明:账号使用。

5.关闭12mysql的从复制

mysql> stop slave;

图附录2.11

6.证明写分离

使用proxy1@192.168.95.13账号打开多个客户端进行插入数据。

打开三个mysql客户端分别插入2条数据:

查看:

分别登陆11mysql与12mysql查看aa.tab1中的数据。

主数据库:

图附录2.12

从数据库:

图附录2.13

结果中显示插入的数据存在与主数据库,而从数据库没有,所以证明写能够分离。

7.证明读分离

使用proxy1@192.168.95.13账号登录mysql,查看aa.tab1中的数据。

结果中显示只有从数据库的数据,结合上面的测试,可以证明读分离。

图附录2.14

总结

Mysql-Cluster:

➢ 在实际中需要分开数据节点和sql节点。

➢ 安装最好参考官网的文档进行配置安装,网上的博客安装的可能为旧版本,命令可能不同。

➢ 配置文件过于简单,还有很多配置会在实际中被使用到,需要参考文档进行添加。(my.cnf文件的配置需要根据实际情况进行修改)

➢ 架构简单,实验足够,现实远不足。(需要使用备份数据库,要备份管理节点等)。

➢ 数据库服务停止之后,或者服务器停止之后,只要管理节点正常,数据会之后在开启之后同步过去,但是为了防止万一还是需要做好数据备份工作。

读写分离:

为了方便启动与管理mysql-proxy可以创建mysql-proxy服务管理脚本。

作业

利用本章所学知识,搭建一个由不低于4台服务器组成的mysql服务器集群并实现读写分离。