主从复制、读写分离水平拆分及库表散列
来源:互联网 发布:博达软件 编辑:程序博客网 时间:2024/06/11 06:31
web项目最原始的情况是一台服务器只能连接一个mysql服务器(c3p0只能配置一个mysql),但随着项目的增大,这种方案明显已经不能满足需求了。
Mysql主从复制,读写分离:
上面的方案使用mysql-Proxy代理,分发读写请求,写操作转发到Mysql主服务器,读操作转发到Mysql从服务器(多个),Mysql主服务器数据有变动时,会把变化以二进制的形式写入到log日志里,然后Mysql从服务器再从log日志中读取变化数据,以完成数据同步。
缺点:因为Mysql分发代理和Mysql主服务器都只有一台,一旦宕机就不行了,即很不稳定。
改进方案:
1,把tomcat和mysql代理放一台服务器上,比如一个项目有10台App服务器,每台服务器上都有tomat和Mysql-Proxy,进行数据库操作时,tomcat先连接本机上的myql代理,代理帮忙转发到各个mysql
2,同时,为了使mysql主机可靠,mysql主机也要配置多台,为了实现这种功能,要在多台myql主机之前配置负载均衡服务器,同时为了保证负载均衡服务器的可靠性,还要配置负载均衡—备机。虽然mysql主机有多台,但要保证只有一台会把数据变化写入到log日志里。
缺点:
1,会有数据延迟,比如mysql主机被写入修改了数据,但mysql从机还需要时间进行同步
2,比如运行一年之后,mysql主机上已经有了1千万条数据,并且这些数据都会被同步到所有从属mysql上,因为mysql对千万级别数据查询会变慢,导致mysql集群性能都会大大降低。
进一步改进方案,即数据库水平拆分及库表散列:
水平拆分一种方案:
比如有3个分片数据库服务器,每一个都有一个备机,每一组主机和备机数据都会同步。(至少一半的服务器效率浪费了)
(当资源有限时,可以把A分片数据库和B分片数据库的备机放在同一个服务器上,B数据库和C数据库的备机放到同一个服务器上....这样稳定性虽然降低了,服务器使用效率提高了)
然后一个用户表,因为id经常是数据库自动生成的,所以在新增用户数据的时候id是未知,不能根据id进行水平拆分。
可以根据用户用字段username.hashCode()返回一个int型数据,然后Math.abs()取绝对值,然后再% 1024取余数,这样获得的结果result就是0~1023
然后当0 <= result && result < 333时,把数据存放到第一个数据库,当333 <= result && result < 666时,把数据存放到第二个数据库,当666 <= result && result < 1024时,把数据存放到第三个数据库。
具体一些的代码:
①首先在spring配置文件application-context.xml中配置6个数据源:
②引入配置的6个数据源(3组,每组一个主数据库一个备数据库):
③继续在application-context.xml中配置路由规则其中,sharding-rules-on-namespace.xml:HashFunction.java:- 主从复制、读写分离水平拆分及库表散列
- mysql主从复制、读写分离到数据库水平拆分及库表散列
- mysql主从复制、读写分离到数据库水平拆分及库表散列
- mysql主从复制及读写分离试验
- MYSQL 主从复制及读写分离
- mysql主从复制 及读写分离
- mysql主从复制及mycat读写分离
- 主从复制,读写分离
- 主从复制,读写分离
- 读写分离 主从复制
- MySQL主从复制 读写分离
- Mysql 主从复制,读写分离
- Mysql 主从复制,读写分离
- redis 主从复制,读写分离
- Mysql主从复制,读写分离
- MySQL主从复制读写分离
- 主从复制和读写分离
- redis 主从复制,读写分离
- Win8.1无法安装msi软件提示2502、2503错误怎么解决?
- maven中端口占用报错
- js构造函数,原型对象,继承 (2)
- C#指定图片添加文字
- springboot-加载自定义的properties文件
- 主从复制、读写分离水平拆分及库表散列
- Java编辑pdf
- oracle数据库用户管理操作(DCL)
- CodeForces
- 常见的简单笔试题却又要小心的题
- Unity2D游戏入门教程(一)宝石迷阵(1)创建项目
- hdu 1018
- 打印当前时间。
- 【C#】身份证识别(三):身份证信息识别