在分布式数据库中,分区,分片,分库,分表的区别是什么?
分区:
原来所有的数据都是在一个数据库上的,网络IO及文件IO都集中在一个数据库上的,因此CPU、内存、文件IO、网络IO都可能会成为系统瓶颈。而分区的方案就是把某一个或某几张相关的表的数据放在一个独立的数据库上,这样就可以把CPU、内存、文件IO、网络IO分解到多个机器中,从而提升系统处理能力。
分表:
当数据量大到一定程度的时候,都会导致处理性能的不足,这个时候就没有办法了,只能进行分表处理。也就是把数据库当中数据根据按照分库原则分到多个数据表当中,这样,就可以把大表变成多个小表,不同的分表中数据不重复,从而提高处理效率。
分库:
分表和分区都是基于同一个数据库里的数据分离技巧,对数据库性能有一定提升,对MySQL数据库的吞吐量无质的变化。当业务系统的数据容量接近或超过单台X86服务器的容量、QPS/TPS接近或超过单个MySQL数据库实例的处理极限等,则重点在于扩展MySQL数据库的吞吐量和数据处理量。此时,往往是采用垂直和水平结合的数据拆分方法,把数据服务和数据存储分布到多台MySQL数据库服务器上。
分库只是一个通俗说法,更标准名称是数据分片,采用类似分布式数据库理论指导的方法实现,对应用程序达到数据服务的全透明和数据存储的全透明
分片:
分区有两种模式,一种是主从模式,用于做读写分离;另外一种模式是分片模式,也就是说把一个表中的数据分解到多个表中。一个分区只能是其中的一种模式。
分片演示场景:
特点:不仅能实现数据库的分片,还能实现负载均衡,读写分离;不足之处是对分片的支持不是太好;
应用场景:分片,业务透明,在物理实现上分成多个服务器,不同的分片在不同服务器上。分区可以把表分到不同的硬盘上,但不能分配到不同服务器上。一台机器的性能是有限制的,用分片可以解决单台服务器性能不够,或者成本过高问题。
当分区之后,表还是很大,处理不过来,这时候可以用分片。
了解oneproxy:http://www.onexsoft.com/zh/oneproxy.html
1、Node3上下载oneproxy
wget http://www.onexsoft.cn/software/oneproxy-rhel6-linux64-v5.8.1-ga.tar.gz
tar -zxf oneproxy-rhel6-linux64-v5.8.1-ga.tar.gz
cd oneproxy
vim demo.sh
![](https://img-blog.csdn.net/20170105191020367?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzYwMzA0MTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
cd oneproxy
vim demo.sh
cd conf
vim proxy.conf
生成密码:
在Node1中:
create user test@'192.168.1.%' identified by '123456';
create databases orders;
grant all privileges on order.* to test@'192.168.1.%';
在Node2中:
create user test@'192.168.1.%' identified by '123456';
create databases orders;
grant all privileges on order.* to test@'192.168.1.%';
create user test@'192.168.1.%' identified by '123456';
create databases orders;
grant all privileges on order.* to test@'192.168.1.%';
Node3中:
cd ..
./demo.sh
mysql -p4041 -uadmin -pOneProxy -h127.0.0.1 #进入oneProxy管理页面
passwd "123456"; #加密密码
进入配置文件修改:
vim 自己制定配置名称
设置自己的分区规则:
订单商品表复制上面就可以;
在Node1创建:
在Node2中创建和以上一样的表;
在Node3中重启oneproxy;
mysql -p4041 -uadmin -pOneProxy -h127.0.0.1 #进入oneProxy管理页面
list backend; #查看后台服务
vim test.sh #写一个sh脚本
运行 bash ./test.sh
查询表中的数量
select count(*) from order_product;