官网:http://shardingsphere.apache.org/index_zh.html
Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能
Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。 目前,数据分片、读写分离、数据加密、影子库压测等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。 开发者能够像使用积木一样定制属于自己的独特系统。
定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。
适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC。
支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP 等。
支持任意实现 JDBC 规范的数据库,目前支持 MySQL,Oracle,SQLServer,PostgreSQL 以及任何遵循 SQL92 标准的数据库。
1.分别找两台服务器 创建两个数据源(服务器centos7.3 数据库MySql 5.7.34-log)
2.MySQL配置过程
配置 MySQL拓展源
[root@izj3n2w98pz7akz ~]# rpm -ivh https://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql57-community-release-el7-10.noarch.rpm
Yum安装mysql
[root@izj3n2w98pz7akz ~]# yum install mysql-community-server -y
启动mysql
[root@izj3n2w98pz7akz ~]# systemctl start mysqld
查看mysql启动状态,active 代表激活的 也就是启动
[root@izj3n2w98pz7akz ~]# systemctl status mysqld
查看数据库密码
[root@izj3n2w98pz7akz ~]# grep "password" /var/log/mysqld.log
登录MySQL
[root@izj3n2w98pz7akz ~]# mysql -uroot -p-puMnQj39<&K93
设置密码等级
mysql> set global validate_password_policy=LOW;
设置密码长度
mysql> set global validate_password_length=5;
重置密码
mysql> set password for root@localhost = password ('qq123');
远程授权登录
mysql> grant all on *.* to root@'%' identified by 'qq123';
刷新
mysql> flush privileges;
此时数据库已经配置好并且可以远程登录,可以用Navicat尝试登录一下
1.原理
Master 主库负责数据写入 通过一个二进制日志文件(Binary log)这个日志文件会把数据库一些增删改的操作记录下来,通过TCP连接 IO线程同步到从库中继日志文件,中继日志文件通过Replay(重刷机制)重新执行一次sql语句。(原理大概意思就是 把一个主机的sql执行记录复制到另外一个主机上在执行一次,来实现数据库同步)
注意:ShardingJDBC 不能完成主从复制(数据层面) 可以完成读写分离(业务层面),用读写分离肯定需要用到主从复制,保持数据一致性。
2 搭建mysql主从复制环境
配置主库
vim /etc/my.cnf
[mysqld]
server-id = 1 # 节点ID,确保唯一 一般设置为IP
log-bin = mysql-bin #开启mysql的binlog日志功能 可以随便取,最好有含义
sync_binlog = 1 #控制数据库的binlog刷到磁盘上去 , 0 不控制,性能最好,1每次事物提交都会刷到日志文件中,性能最差,最安全
binlog_format = mixed #binlog日志格式,mysql默认采用statement,建议使用mixed
binlog_cache_size = 4m #binlog缓存大小 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog-ignore-db=mysql #不需要备份的数据库不生成日志文件的数据库,多个忽略数据库可以用逗号拼接,或者 复制这句话,写多行
配置从库
vim /etc/my.cnf
[mysqld]
server-id = 2
log-bin=mysql-slave-bin
relay-log = mysql-relay-bin
##复制过滤 不需要备份的数据库
binlog-ignore-db=mysql
###需要同步函数或者存取过程
log_bin_trust_function_creators=true
binlog_cache_size = 4m
binlog_format = mixed
重启数据库服务(配置完成后主库和从库都重启一下数据库服务)
systemctl restart mysqld
在主服务器授权从服务器可以同步权限**(主服务器执行)**
grant replication slave,replication client on *.* to 'root'@'主服务ip' identified by 'qq123'
检查是否授权成功
mysql> flush privileges;
mysql>select user,host from mysql.user;
查看主服务器二进制日志文件
mysql> show master status;
change master to master_host='主服务器ip',master_user='root',master_password='qq123',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=926;
配置完成后启动从服务器
start leave;
查看连接状态
mysql> show slave status\G;
如果两个为YES证明配置成功
接下来可以直接在主库里面新建一个数据库,此时会自动同步到从库
新建一个SpringBoot工程
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.4version>
<scope>runtimescope>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.4.2version>
dependency>
<dependency>
<groupId>org.apache.shardingspheregroupId>
<artifactId>sharding-jdbc-spring-boot-starterartifactId>
<version>4.0.0-RC1version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>1.1.14version>
dependency>
application.yml
server:
port: 8088
spring:
main: #允许相同bean名称覆盖
allow-bean-definition-overriding: true
shardingsphere:
datasource:
names: db0,db1
db0:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://主库ip:3306/sharding?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT&useSSL=false
username: root
password: qq123
type: com.alibaba.druid.pool.DruidDataSource
db1:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://从库ip:3306/sharding?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT&useSSL=false
username: root
password: qq123
type: com.alibaba.druid.pool.DruidDataSource
sharding:
##配置默认数据源 主要用于写
default-data-source-name: db0
masterslave:
name: ms
#配置主库 主要用于写 只可以配置一个
master-data-source-name: db0
#配置主库 主要用于读取 可以配置多个
slave-data-source-names: db1
load-balance-algorithm-type: round_robin
props:
sql:
show: true
# mybatis-plus配置
mybatis-plus:
mapper-locations: classpath*:/mappers/*.xml
configuration:
call-setters-on-nulls: true
type-aliases-package: com.xhl.shardingjdbc.model