Sharding-Proxy——分库分表+读写分离

一、简介

sharding-proxy定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。 目前先提供MySQL/PostgreSQL版本,它可以使用任何兼容MySQL/PostgreSQL协议的访问客户端(如:MySQL Command Client, MySQL Workbench, Navicat等)操作数据,对DBA更加友好。

  • 向应用程序完全透明,可直接当做MySQL/PostgreSQL使用。
  • 适用于任何兼容MySQL/PostgreSQL协议的的客户端。
    在这里插入图片描述
Sharding-JDBCSharding-Proxy
数据库任意MySQL
连接消耗数
异构语言JAVA任意
性能损耗低损耗略高
无中心化高是
静态入口

——摘自官方文档

二、实现分库分表和读写分离

(一)准备工作

服务器名称数据库角色
192.168.30.130server1ordersorders独立
192.168.30.131server2ordersorders,user独立
192.168.30.132server3testt_user
192.168.30.133server4testt_user从(只读)

目标:

  • user表全部存储到server2的orders数据库。
  • orders表根据customer_id进行判断,偶数存放在server1中,奇数存放在server2中
  • t_user表存储到主从server3和server4的test数据库中,其中server3的test为主库,server4的test为从库(只读),实现读写分离。

(二)安装配置

官方网站下载sharding-jdbc的二进制安装包,本例使用4.1.1版本。

在/opt目录解压。
修改conf文件夹下面的配置文件:
server.yaml:

 authentication:
   users:
     root:
       password: 123456
     sharding:
       password: sharding
       authorizedSchemas: sharding_db

config-sharding.yaml:

######################################################################################################
#
# If you want to connect to MySQL, you should manually copy MySQL driver to lib directory.
#
######################################################################################################
schemaName: sharding_db
#
dataSources:
# server1
  ds_0:
    url: jdbc:mysql://192.168.30.130:3306/orders?serverTimezone=GMT%2B8&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
  #server2
  ds_1:
    url: jdbc:mysql://192.168.30.131:3306/orders?serverTimezone=GMT%2B8&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
 # server3 主
  ds_m_0:
    url: jdbc:mysql://192.168.30.132:3306/test?serverTimezone=GMT%2B8&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
  # server4 从
  ds_s_0:
    url: jdbc:mysql://192.168.30.133:3306/test?serverTimezone=GMT%2B8&useSSL=false
    username: root
    password: root
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50

shardingRule:
  tables:
  # orders表,根据customer_id判断分表的策略
    orders:
      actualDataNodes: ds_${0..1}.orders
      databaseStrategy:
        inline:
          shardingColumn: customer_id
          algorithmExpression: ds_${customer_id % 2}
# user表,存放在ds_1即server2的user表中
    user:
      actualDataNodes: ds_$->{1}.user
 # t_user,使用读写分离进行读和写操作,规则命名为m_s_0(见下面读写分离规则配置)
    t_user:
      actualDataNodes: m_s_$->{0}.t_user
#读写分离规则
  masterSlaveRules:
    m_s_0:
      masterDataSourceName: ds_m_0
      slaveDataSourceNames: [ds_s_0]
  • 按照提示,需要将mysql驱动放到lib目录下,本人放置了mysql-connector-java-5.1.47.jar,但是还是无法在shell窗口访问sharding-proxy,使用图形化客户端工具可以访问。。。待查

在bin目录下,启动sharding-proxy:

[root@server3 bin]# ./start.sh 
Starting the Sharding-Proxy ...
The classpath is .:..:/opt/sharding-proxy-4.1.1/lib/*:/opt/sharding-proxy-4.1.1/lib/*:/opt/sharding-proxy-4.1.1/ext-lib/*
Please check the STDOUT file: /opt/sharding-proxy-4.1.1/logs/stdout.log
[root@server3 bin]# pwd
/opt/sharding-proxy-4.1.1/bin

默认端口为3307

(三)验证

使用客户端访问:
在这里插入图片描述

1. 分库
insert  into user (id, name) values (1,'a');
insert  into user (id, name) values (2,'b');

全部存储在server2的orders库的user表中。

2. 分表
insert into orders (id, order_type,customer_id,amount) values (1,100,100,1000);
insert into orders (id, order_type,customer_id,amount) values (2,101,101,2000);
insert into orders (id, order_type,customer_id,amount) values (3,100,102,3000);
insert into orders (id, order_type,customer_id,amount) values (4,101,103,4000);

customer_id为100和102的存储到server1中,customer_id为101和103的存储到server2中

3. 读写分离
insert into t_user (uid,uname) values (1,@@hostname);

server3中的数据为1-server3;server4中的数据为1-server4,写操作通过server3实现(server4只读模式);
查询:

select * from t_user;

获取到server4中的数据,读操作通过server4实现。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值