目录

⼀、分布式数据库介绍

⼆、MySQL的主从复制

2.1 主服务器和从服务器分别创建数据库

2.2 配置主库

2.3 配置从库

三、MyCat

3.1 myCat的下载与配置下载

3.2 mycat配置

3.3 参考配置

⼀、分布式数据库介绍


微服务架构解决了单体项⽬的冗余问题,避免单点故障,提⾼了系统的可⽤性;同时每个服务都可以进⾏集群部署,解决了⽤户的⾼并发访问题;但是在现在的微服务系统架构中所有的服务还是连接的同⼀个数据库,也就是说多个服务可以接受更⾼的⽤户并发,系统的并发瓶颈就落在数据库上;

虽然可以使⽤ redis 缓存数据库数据库数据,有效的降低对数据库的并发连接请求,但是在⾼并发系统中⽤户越多势必对数据库的并发能⼒就有更⾼的要求,当⼀个数据库服务器不能满⾜并发需求时该如何解决呢? —— 分布式数据库。

1.读写分离

⼀个数据库服务器不能满⾜应⽤系统的并发访问压⼒,我们可以使⽤多个数据库来协同⼯作,这些数据库服务器根据业务需求提供服务,部分数据库只提供数据的写操作,另外⼀部分数据库只提供读操作 —— 也就是说应⽤系统中的不同操作访问不同的数据库

读写分离模型

mysql 分布健 mysql数据库分布式_java


 2.主从复制

为了保证读库数据与写库数据的⼀致性,需要将读库的数据与写库同步 ——MySQL 提供

了数据库服务器之间的主从复制功能,以写库为主库,以读库为从库

主从复制模型



mysql 分布健 mysql数据库分布式_mysql_02


 

3.负载均衡

在⼀个应⽤系统的数据库操作中 90% 都是读操作, 10% 是写操作。通常情况下,⼀个数据库服务器是可以满⾜写操作的并发访问需求;但是对于读操作, 当⽤户并发访问⽐较⾼的时候,需要就需要通过对读库进⾏集群来提供并发能⼒,但凡有集群就要做负载均衡

负载均衡



mysql 分布健 mysql数据库分布式_java_03


 

4.分库分表

分库分表

mysql 分布健 mysql数据库分布式_数据库_04


 

⼆、MySQL的主从复制

2.1 主服务器和从服务器分别创建数据库

服务器 A1 --- db_2010

服务器 B1 ---- db_2010

2.2 配置主库

启动⽇志记录功能

  • 修改mysql的配置⽂件:
vim /etc/my.cnf

mysql 分布健 mysql数据库分布式_mysql_05

 

  • 重启mysql
systemctl restart mysqld
  • 检查主库配置

mysql 分布健 mysql数据库分布式_数据库_06

2.3 配置从库

指定当前数据库以谁为主库

  • 修改my.cnf(windows系统中的mysql的配置⽂件 my.ini)
vim /etc/my.cnf

mysql 分布健 mysql数据库分布式_mysql 分布健_07

 

  • 重启mysql
systemctl restart mysqld
  • 设置主库信息
use db_2010;
change master to
master_host='121.43.54.151',master_user='root',master_password='Admi
n123!!';
  • 启动主从复制
start slave;
  • 查看从库的状态
show slave status;

三、MyCat

3.1 myCat的下载与配置下载


下载地址: http://dl.mycat.io/1.6-RELEASE/


3.2 mycat配置


conf/server.xml 参考配置


  • 配置mycat的⽤户名
<user name="root">
 <property name="password">123456</property>
 <property name="schemas">TESTDB</property>
 
 <!-- 表级 DML 权限设置 -->
 <!-- 
 <privileges check="false">
 <schema name="TESTDB" dml="0110" >
 <table name="tb01" dml="0000"></table>
 <table name="tb02" dml="1111"></table>
 </schema>
 </privileges> 
 -->
</user>


conf/schema.xml 配置说明


  • 修改schema.xml配置mycat的节点
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
 <!--
 schema ⽤于配置mycat中的逻辑数据库信息
 name属性设置数据名(此名称可以⾃定义,但是需要保持与server.xml中⽤户的配置⼀
致)
 checkSQLschema属性设置是否执⾏mycat的sql验证
 sqlMaxLimit属性 设置mycat查询返回的最⼤记录属 
 -->
 <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
 <!--
 table ⽤户配置mycat中的逻辑数据表信息
 name 属性设置逻辑表名,需要与物理数据库表名保持⼀致
 dataNode 属性设置当前数据表操作对应的节点(物理数据库)
 rule 属性⽤于指定当前数据表中数据的分⽚规则(可以在conf/rule.xml⽂件中查
询)
 -->
 <table name="tb_books" dataNode="dn1,dn2,dn3" rule="auto-shardinglong" />
 </schema>
 
 <!--
 dataNode ⽤于定义mycat中的数据节点,配置在逻辑表中
 name属性⽤于配置节点的名字
 dataHost属性⽤于配置物理数据库服务器的名称
 database属性⽤于配置物理数据库服务器中的物理数据库名称
 -->
 <dataNode name="dn1" dataHost="localhost1" database="db_a" />
 <dataNode name="dn2" dataHost="localhost1" database="db_x" />
 <dataNode name="dn3" dataHost="minggeHost" database="db_wfx2" />
 <!--
 dataHost 定义物理数据库服务器信息
 --name 唯⼀标示dataHost标签,供上层使⽤
 --maxCon 指定每个读写实例连接池的最⼤连接。
 --minCon 指定每个读写实例连接池的最⼩连接,初始化连接池的⼤⼩
 --balance 负载均衡类型
 balance="0":不开启读写分离机制,所有读操作都发送到当前可⽤的writeHost上
 balance="1":全部的readHost与stand by writeHost参与select语句的负载均
衡,简单的说,当双主双从模式(M1-S1,M2-S2 并且M1 M2互为主备),正常情况下,
M2,S1,S2都参与select语句的负载均衡。
 balance="2":所有读操作都随机的在writeHost、readHost上分发
 balance="3":所有读请求随机的分发到writeHst对应的readHost执⾏,
writeHost不负担读压⼒。(1.4之后版本有)
 --writeType 负载均衡类型。
 writeType="0", 所有写操作发送到配置的第⼀个 writeHost,第⼀个挂了切到还⽣
存的第⼆个writeHost,重新启动后已切换后的为准,切换记录在配置⽂件
中:dnindex.properties .
 writeType="1",所有写操作都随机的发送到配置的 writeHost。1.5以后版本废弃
不推荐。
 --switchType -1不⾃动切换
 1 默认值 ⾃动切换
 2 基于MySql主从同步的状态决定是否切换⼼跳语句为 show slave status
 3 基于mysql galary cluster 的切换机制(适合集群)1.4.1 ⼼跳语句为 show
status like 'wsrep%'
 --dbType 指定后端链接的数据库类型⽬前⽀持⼆进制的mysql协议,还有其他使⽤
jdbc链接的数据库,例如:mongodb,oracle,spark等
 --dbDriver 指定连接后段数据库使⽤的driver,⽬前可选的值有native和JDBC。使
⽤native的话,因为这个值执⾏的是⼆进制的mysql协议,所以可以使⽤mysql和maridb,其
他类型的则需要使⽤JDBC驱动来⽀持。
 如果使⽤JDBC的话需要符合JDBC4标准的驱动jar 放到mycat\lib⽬录下,并检查驱
动jar包中包括如下⽬录结构⽂件 META-INF\services\java.sql.Driver。 在这个⽂件
写上具体的driver类名,例如com.mysql.jdbc.Driver
 --tempReadHostAvailable
 如果配置了这个属性 writeHost 下⾯的 readHost 仍旧可⽤,默认 0 可配置(0、 1)。
 -->
 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" 
slaveThreshold="100">
 <heartbeat>select user()</heartbeat>
 <writeHost host="hostM1" url="localhost:3306" user="root"
password="admin123"/>
 </dataHost>
 
 <dataHost name="minggeHost" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" 
slaveThreshold="100">
 <heartbeat>select user()</heartbeat>
 <writeHost host="hostM2" url="47.103.29.234:3306" user="root"
password="admin123"></writeHost>
 </dataHost>
 
</mycat:schema>

3.3 参考配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
 <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
 <table name="tb_books" dataNode="dn1,dn2,dn3" rule="auto-shardinglong" />
 </schema>
 <dataNode name="dn1" dataHost="localhost1" database="db_a" />
 <dataNode name="dn2" dataHost="localhost1" database="db_x" />
 <dataNode name="dn3" dataHost="minggehost" database="db_wfx2" />
 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" 
slaveThreshold="100">
 <heartbeat>select user()</heartbeat>
 <writeHost host="hostM1" url="localhost:3306" user="root"
password="admin123"/>
 </dataHost>
 <dataHost name="minggehost" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" 
slaveThreshold="100">
 <heartbeat>select user()</heartbeat>
 <writeHost host="hostM1" url="47.103.29.234:3306" user="root"
password="admin123">
 <readHost host="hostM3" url="192.168.54.50:3306" user="root"
password="123456"/>
 <readHost host="hostM2" url="localhost:3306" user="root"
password="admin123"/> 
 </writeHost>
 </dataHost>
 
</mycat:schema>