数据库中间件mycat

海量数据存储问题

         随着互联网的发展,数据的量级也是呈指数增长,从GB到TB再到PB,对数据的各种操作也愈加困难。如果使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储。

1,什么是数据库分片

简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。

数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式:

垂直切分:按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分

        

水平切分:根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分

         

一、概念

         mycat就是一个数据库中间件,支持mysql集群,提供高可用性数据分片集群。你可以像使用mysql一样使用mycat,对于开发人员来说根本感觉不到mycat的存在。

二、mycat的分片策略

        

逻辑库(schema):数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。

逻辑表(table):分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。

分片节点(Datanlde):数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode)

节点主机(dataHost):数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)

分片规则(rule):一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则

接下来以一个例子来讲解Mycat

1,需求:把商品表(tb_item)分片存储到三个数据节点上

2,环境信息

两台mysql数据库服务器:Host1:192.168.25.134   Host2:192.168.25.166

host1环境:数据库名 : db1、db3、Mycat

host1环境:数据库名 : db2

三、Mycat分片实现

1,安装Mycat(三个重要配置文件)

2,配置schemal.xml文件

schema 标签用于定义MyCat实例中的逻辑库。逻辑库取名:e3mall-32

Table 标签定义了MyCat中的逻辑表。逻辑表取名:tb_item

dataNode 标签定义了MyCat中的数据节点,也就是我们通常说所的数据分片。

dataHost标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。

<heartbeat>select user()</heartheat>:使用select user()心跳检测是否正常

分片规则:rule="auto-sharding-long"  以表字段id范围分片(不同表存不同id范围数据:1~500万,500万~1000万,1000万到~1500万)

注:rule.xml定义了很多分片规则,也可以根据实际开发自定义规则

3,配置server.xml文件

<user name="test">

    <property name="password">test</property>

    <property name="schemas">e3mall-32</property>

    <property name="readOnly">false</property>

</user>

1,用户名、密码(我们连接Mycat中间件的用户名、密码),2,允许访问的逻辑库名字。3,可读可写

注:我们在使用Mycat时就跟使用mysql一样,也可以用Navicat去连接

使用Navicat连接192.168.25.134 上的Mycat后,在Mycat上创建一个表tb_item,此时db1,db2,db3中都有这个表。当在操作数据时,根据分片规则来决定操作那个数据库。db1:1~500万  db2:500万~1000万  db3:1000万到~1500万

四、Mycat读写分离

用Mycat实现mysql读写分离,前提必须实现mysql主从复制(当往主数据库写数据时,会自动同步到从数据库,保持两个数据库数据一致)

mysql主从复制

原理:主服务器开启写二进制日志的功能,默认这个功能不开启的。Mysql在主服务器上有数据操作的SQL(建表,修改表结构,新增,删除,修改)就会被自动记录到二进制日志中。从库启动两个线程,一个线程监控主库二进制日志文件,当这个日志文件有变化时,实时把这些新增的内容同步到从库中,会写一个中继日志文件。另一个线程监控中继日志文件,如果有新的内容,把它的SQL语句在从库中“回访replay”。两个数据库的数据就同步了

主从配置需要注意:

1、主DB server和从DB server数据库的版本一致

2、主DB server和从DB server数据库数据名称一致

3、主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一

如:

Host1:192.168.25.134  上安装了 mysql5.6,有个数据库名叫 db1(主)

 Host2:192.168.25.166  上安装了 mysql5.6,有个数据库名叫 db1

Mysql主服务器配置

第一步:修改my.conf文件:在[mysqld]段下添加:

#对那个数据库使用binlog
binlog-do-db=db1

#对那个数据库禁用binlog
binlog-ignore-db=mysql

#启用二进制日志
log-bin=mysql-bin

#服务器唯一ID,一般取IP最后一段
server-id=134

第二步:重启mysql服务   service mysqld restart

第三步:建立帐户并授权slave

mysql>GRANT FILE ON *.* TO 'backup'@'%' IDENTIFIED BY '123456';

mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'backup'@'%' identified by '123456';

#一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.25.166,加强安全。  

刷新权限  mysql> FLUSH PRIVILEGES;

第四步:查询binlog的状态  show master status;

File:binlog文件  Position:文件位置  Binlog_Do_DB:支持binlog的数据库名

Mysql从服务器配置

第一步:修改my.conf文件:在[mysqld]段下添加:

server-id=166

第二步:配置从服务器

change master to  Mysql>master_host='192.168.25.134',master_port=3306,master_user='backup',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=120

第二步:启动从服务器复制功能   Mysql>start slave;

第三步:检查从服务器复制功能状态:mysql> show slave status

注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。

主从复制配置完成后接下来就可以配置读写分离了:(结合数据库分片)

场景:商品表 分片到 Host1上的db1和Host2上的db2(先配置好主从复制)

Host1:192.168.25.134  上安装了 mysql5.6,有个数据库名叫 db1(主) db2(主)

Host2:192.168.25.166  上安装了 mysql5.6,有个数据库名叫 db1(从) db2(从)

schemal.xml文件配置如下:

<dataNode name="dn1" dataHost="localhost1" database="db1" />
	<dataNode name="dn2" dataHost="localhost2" database="db2" />
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
		writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
		<heartbeat>show slave status</heartbeat>
		<writeHost host="hostM" url="192.168.25.134:3306" user="root"
			password="root">
			<readHost host="hostS" url="192.168.25.166:3306" user="root"
			password="root" />
		</writeHost>
	</dataHost>
	
	<dataHost name="localhost2" maxCon="1000" minCon="10" balance="1"
		writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
		<heartbeat>show slave status</heartbeat>
		<writeHost host="hostM" url="192.168.25.134:3306" user="root"
			password="root">
			<readHost host="hostS" url="192.168.25.166:3306" user="root"
			password="root" />
		</writeHost>
	</dataHost>

这样就实现了数据库的分片和读写分离,解决了海量数据存储,操作数据库性能上的问题,也实现了高可用

(1) 设置 balance="1"与writeType="0"

Balance参数设置:

1. balance=“0”, 所有读操作都发送到当前可用的writeHost上。

2. balance=“1”,所有读操作都随机的发送到readHost。

3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发

WriteType参数设置:

1. writeType=“0”, 所有写操作都发送到可用的writeHost上。

2. writeType=“1”,所有写操作都随机的发送到readHost。

3. writeType=“2”,所有写操作都随机的在writeHost、readhost分上发

“readHost是从属于writeHost的,即意味着它从那个writeHost获取同步数据,因此,当它所属的writeHost宕机了,则它也不会再参与到读写分离中来,即“不工作了”,这是因为此时,它的数据已经“不可靠”了。若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在Mycat里配置为两个writeHost并设置banlance=1。”

(2) 设置 switchType="2" 与slaveThreshold="100"

switchType 目前有三种选择:

-1:表示不自动切换

1 :默认值,自动切换

2 :基于MySQL主从同步的状态决定是否切换

“Mycat心跳检查语句配置为 show slave status ,dataHost 上定义两个新属性: switchType="2" 与slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制。Mycat心跳机制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running", "Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master主从复制延迟。

注:Host1的db1和Host2上的db2也可以配置互为主从(双机热备), switchType="2" 与slaveThreshold="100",Mycat发出心跳3次检测如果Host1上主机没给出响应,则启用Host2上主机

 

Mysql主从复制有】中的问题:

有天然的同步延迟!!!不能完全实时同步数据库。实际开发中允许。最终一致性,查看日志,通过日志补全从库。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值