JAVAEE——宜立方商号13:Mycat数据库分片、主从复制、读写分离、百分百Linux中中标安装Mysql的办法

by admin on 2019年10月15日

海量数据的仓库储慰藉题

当今趁着网络的向上,数据的量级也是撑指数的升高,从GB到TB到PB。对数码的各样操作也是更加的的困难,守旧的关系性数据库已经智尽能索满意连忙查询与插入数据的急需。那一年NoSQL的产出不时消除了这一危害。它通过降落数据的安全性,减弱对事情的扶持,收缩对复杂查询的支撑,来博取品质上的升官。

然而,在有个别场馆NoSQL一些投降是无力回天满意使用意况的,就譬喻某个使用处境是应当要有事情与新余指标的。那一年NoSQL明确是不可能满足的,所以依然须求利用关系性数据库。要是应用关系型数据库消除海量存款和储蓄的主题材料呢?此时就须要做数据库集群,为了增长查询品质将贰个数据库的数额分散到区别的数据库中存放。

转自http://blog.csdn.net/jaysonhu/article/details/52858535

1. 学学布署

1、订单系统贯彻

2、订单生成

3、Mycat数据库分片

 

写在前头

  Mycat作为独立的数据库中间件,大家只需求张开相关的安顿,就足以十一分有扶植的帮大家达成程度切分、垂直切分、读写分离等效率,但Mysql的主从复制需求大家通过其余方法贯彻。这里假使大家早就搭建好不非亲非故系的条件,上面就早先我们的实施吧!

检测遭受
系统window
mysql:
行使的是phpstudy自带数据库

1.1 怎样是数据库分片

简单的话,正是指通过某种特定的准则,将我们寄放在同贰个数据库中的数据分散贮存到三个数据库(主机)上边,以实现疏散单台设备负载的法力。

数据的切分(Sharding)遵照其切分法则的项目,能够分成二种切分情势。

(1)一种是依照差异的表(或然Schema)来切分到不相同的数据库(主机)之上,这种切称得上数据的垂直(纵向)切分

图片 1

 

 

 

(2)别的一种则是基于表中的数量的逻辑关系,将同一个表中的数码遵照某种条件拆分到多台数据库(主机)下边,这种切分称之为数据的程度(横向)切分。

 图片 2

 

mysql安装

  1. 下载mysql

  2. 解压
    tar -zxvf mysql-5.6.32-linux-glibc2.5-x86_64.tar.gz

  3. 把mysql文件夹移动到 /usr/local/ 下
    mv mysql-5.6.32-linux-glibc2.5-x86_64 /usr/local/mysql

  4. 开创mysql客商和组

    groupadd mysql
    adduser -r -g mysql mysql
    chown -R mysql.mysql /usr/local/mysql  //修改mysql目录所属mysql用户
    
  5. 安装

    /usr/local/mysql/scripts/mysql_install_db

  6. 修改配置文件my.cnf,必供给修改能力应用mycat

    终极一行增加

    lower_case_table_names = 1

  7. 设置mysql服务

    cp -f /usr/local/mysql/support-files/mysql.server  /etc/init.d/mysqld
    
  8. 启动mysql

    service mysqld start

  9. 把mysql命令加入境遇变量

    修改/etc/profile文件,最终行加多
    export PATH=$PATH:/usr/local/mysql/bin

    下一场施行

    source /etc/profile

    使配置立时生效

  10. 登陆mysql假如提醒错误
    Can't connect to local MySQL server through socket '/tmp/mysql.sock'
    实行命令
    ln /var/lib/mysql/mysql.sock /tmp/mysql.sock
    后再登录

  11. root顾客伊始密码为空,修改密码使用mysqladmin命令
    mysqladmin -uroot -p password

  12. 登入顾客端

    mysql -uroot -p

  13. 创建测验数据库

 CREATE database db1;
 CREATE database db2;
 CREATE database db3;

到现在mysql已经设置到位了

2. 订单系统

打算条件

  • Mysql(Version : 5.7)主从景况搭建
  • 对应数据库构建(以下例子中要建的数据库是:master1mycat 和
    master2mycat)

主库 定义为 123.207.43.xx

1.2 什么样兑现数据库分片

当数据库分片后,数据由二个数据库分散到两个数据库中。此时系统要查询时供给切换差别的数据库实行询问,那么系统怎样领悟要询问的数量在哪个数据库中?当增添一条记下时要向哪个数据库中插入呢?那几个难点管理起来都以非常的麻烦。

这种意况下能够利用一个数据库中间件mycat来消除相关的标题。接下来明白一下如何是mycat。

安装java

2.1. 作用深入分析

1、在购物车页面点击“去付钱”开关,跳转到订单确认页面

a) 必需必要客户登陆

b) 使用拦截器达成。

c) 要是客商未登陆跳转到登陆页面。

d) 如若客户已经报到,放行。突显确认页面。

e) 剖断cookie中是不是有购物车多少

f) 如若有一块到服务端。

2、订单确认页面中甄选收货地址,选拔支付办法,确认商品列表。

a) 依据客商id查询收货地址列表

b) 体现支付格局列表。

c) 从购物车中取商品列表,从服务端取购物车列表。

3、订单确认页面点击“提交”,生成订单。

4、显示订单生成完结,或然跳转到支付页面。

 

配置server.xml

        <user name="mysqlmycat">
                <property name="password">mysqlmycat</property>
                <property name="schemas">mysqlmycats</property>
        </user>
#  power by php中文网 2017  www.php.cn  官网下载最新版

[client]
port=3306
[mysql]
default-character-set=utf8

[mysqld]
port=3306

log-error = C:/phpStudy/PHPTutorial/MySQL/mylog/error.log
basedir="C:/phpStudy/PHPTutorial/MySQL/"
datadir="C:/phpStudy/PHPTutorial/MySQL/data/"
character-set-server=utf8
default-storage-engine=MyISAM
#支持 INNODB 引擎模式。修改为 default-storage-engine=INNODB 即可。
#如果 INNODB 模式如果不能启动,删除data目录下ib开头的日志文件重新启动
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=512

query_cache_size=0
table_cache=256
tmp_table_size=18M

thread_cache_size=8
myisam_max_sort_file_size=64G
myisam_sort_buffer_size=35M
key_buffer_size=25M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K

innodb_additional_mem_pool_size=2M

innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M

innodb_buffer_pool_size=47M
innodb_log_file_size=24M
innodb_thread_concurrency=8
innodb_thread_concurrency=8
innodb_thread_concurrency=8


#主从复制
server-id=1

log_bin

sync_binlog=1


binlog_format=MIXED

Mycat介绍

mycat安装

  1. 下载mycat

  2. 解压

    tar -zxvf Mycat-server-1.6-RELEASE-20161012170031-linux.tar.gz

  3. 把mycat文件夹移动到 /usr/local/ 下
    mv Mycat-server-1.6-RELEASE-20161012170031-linux /usr/local/mycat

  4. 新建用户和组

    groupadd mycat
    adduser -r -g mycat mycat
    chown -R mycat.mycat /usr/local/mycat  //修改mycat目录所属mycat用户
    
  5. 修改配置文件 /usr/local/mycat/conf/schema.xml

    这里配置mysql的地点、顾客名和密码

    <writeHost host="hostM1" url="localhost:3306" user="root" password="root">
        <readHost host="hostS1" url="localhost:3306" user="root" password="root" />
    </writeHost>
    

    server.xml

    这里配置mycat的顾客名密码

    <user name="root">
       <property name="password">digdeep</property>
       <property name="schemas">TESTDB</property>
    </user>
    
  6. 启动mycat

    /usr/local/mycat/bin/mycat start

  7. 连接mycat

    mysql -uroot -pdigdeep -h127.0.0.1 -P8066 -DTESTDB

    只顾这里 -h 前面总得是ip,使用localhost会出错

  8. 创制测验数据

use TESTDB;
create table company(id int not null primary key,name varchar(50),addr varchar(255));
insert into company values(1,"facebook","usa");
  1. 结果:查看mysql上的数据库db1,db2,db3上都成立了表company

2.2. 工程搭建

E3-order

  |–E3-order-interface(jar)

  |–E3-order-service(war)

E3-order-web(war)

 

配置schema.xml

        <schema name="mysqlmycats" checkSQLschema="false" sqlMaxLimit="100">
                <table name="tb_user" dataNode="mydn1,mydn2" rule="user-mod-long" />
                <table name="tb_student" dataNode="mydn1,mydn2" rule="student-mod-long" />
        </schema>

        <dataNode name="mydn1" dataHost="myhost1" database="master1mycat" />
        <dataNode name="mydn2" dataHost="myhost2" database="master2mycat" />

        <dataHost name="myhost1" maxCon="100" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native">
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostM1" url="localhost:3306" user="root" password="xxx">
                        <readHost host="hostS1" url="localhost:3307" user="root" password="xxx"/>
                </writeHost>
        </dataHost>

        <dataHost name="myhost2" maxCon="100" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native">
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostM2" url="localhost:3308" user="root" password="xxx" >
                        <readHost host="hostS2" url="localhost:3309" user="root" password="xxx"/>
                </writeHost>
        </dataHost>

此地日志接纳混合情势

2.1 什么是Mycat?

 

Mycat 背后是Ali曾经开源的大名鼎鼎产品——Cobar。Cobar 的基本成效和优势是 MySQL 数据库分片,此产品已经流传,据书上说最早的发起者对
Mysql 很理解,后来从Ali换工作了,Ali随后开源的
Cobar,并保持到 2011 年年底,然后,就不曾然后了。

Cobar 的笔触和兑现路子的确不易。基于
Java 开辟的,完成了 MySQL 公开的二进制传输公约,神奇地将团结伪装成一个MySQL Server,目前市情上绝大相当多 MySQL 客商端工具和平运动用都能合营。比自身达成贰个新的数据库公约要明智的多,因为生态情况在何地摆着。

 

Mycat 是依靠 cobar 衍生和变化而来,对 cobar 的代码实行了绝望的重构,使用 NIO 重构了互连网模块,並且优化了 Buffer 内核,巩固了集聚,Join 等骨干特色,同一时候协作绝大比非常多数据库成为通用的数据库中间件。

简单的讲的说,MyCAT便是:

·叁个新星的数据库中间件产品协理mysql集群,也许mariadb cluster,提供高可用性数据分片集群。你能够像使用mysql同样采纳mycat。对于开拓人士来讲根本感到不到mycat的存在。

 图片 3

mysql主从服务器配置

  1. 修改主mysql配置文件my.cnf

    [mysqld]
    log_bin = mysql-bin  #记录操作日志
    binlog_ignore_db =  mysql  #不同步mysql系统数据库
    server_id = 1
    
  2. 起步主mysql,在主mysql创立二个顾客user让从mysql连接,实行sql

    grant replication slave on *.* to 'user'@'%' identified by 'password'
    
  3. 修改从mysql配置文件my.cnf

    log_bin = mysql-bin  #记录操作日志
    replicate_ignore_db = mysql #不同步mysql系统数据库
    slave_skip_errors = all 
    server_id = 2
    
  4. 主mysql执行sql

    show master status;\G

    图片 4

    1.jpg

  5. 从mysql连接主mysql

    依据第2步配创造的user,password 和 第4步获取的file,position
    连接主mysql

//如果是mysql5.5
change master to master_host='node1',master_user='user',master_password='password',master_log_file='mysql-bin.000004',master_log_pos=120;
//如果是mysql5.6即以上可以不需要master_log_file和master_log_pos,mysql会自动识别
change master to master_host='node1',master_user='user',master_password='password';
  1. 开启从mysql,从mysql中执行

    start slave;

  2. 查看从mysql状态,从mysql执行

    show slave status\G;

    图片 5

    2.png

`红色下划线部分为yes则开启成功`
  1. 测量试验成果

    首先在着力mysql上都新建数据库testdb

    主mysql:use testdb;create table user(id int not null primary key,name varchar(50));

    从mysql上也会发出user表,主从mysql配置成功!

2.3. 出示订单确认页面

配置rule.xml

       <tableRule name="user-mod-long">
                <rule>
                        <columns>id</columns>
                        <algorithm>mod-long</algorithm>
                </rule>
        </tableRule>
       <tableRule name="student-mod-long">
                <rule>
                        <columns>user_id</columns>
                        <algorithm>mod-long</algorithm>
                </rule>
        </tableRule>

        <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
            <property name="count">2</property>
        </function>

  修改了配备文件后,别忘了重启Mycat,要是有那多个出现,请通过翻看logs目录下的日记文件进行各种核实。

接下来主库配置就到那边

2.2 Mycat补助的数据库

 图片 6

 

读写分离配置

  1. 注意事项

    长途 mysql 必需同意 mycat主机
    远程连接,修改mysql.user表中的顾客数量,实行sql

    update mysql.user set host = '%' where user = 'root'
    
  2. schema.xml配置

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
    writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
        <heartbeat>show slave status</heartbeat>
        <writeHost host="hostM1" url="node1:3306" user="root" password="root">
            <readHost host="hostS1" url="node2:3306" user="root" password="root" />
        </writeHost>
    </dataHost>
    

    dbDriver

    属性

    点名连接后端数据库使用的 Driver,近日可选的值有 native 和 JDBC。使用
    native 的话,因为这些值施行的是二进制的 mysql 合同,所以能够行使
    mysql 和 maridb。别的类别的数据库则供给选用 JDBC 驱动来支撑。

    从 1.6 版本伊始扶植 postgresql 的 native 原始合同。

    若果选取 JDBC 的话必要将符合 JDBC 4 标准的驱动 JA索罗德 包放到 MYCAT\lib
    目录下,并检讨驱动 JAHighlander包中回顾如下目录结构的文件:META-INF\services\java.sql.Driver。在此个文件内写上实际的
    Driver 类名,比如:com.mysql.jdbc.Driver。

    balance

    属性

    负载均衡类型,最近的取值有 3 种:

    1. balance=”0”, 不开启读写分离机制,全体读操作都发送到当前可用的
      writeHost 上。

    2. balance=”1”,全体的 readHost 与 stand by writeHost 参预 select
      语句的负载均衡,简单的讲,当双主双从情势(M1->S1,M2->S2,何况M1 与 M2 互为主备),平常情形下,M2,S1,S2 都踏足 select
      语句的负载均衡。

    3. balance=”2”,全体读操作都随便的在 writeHost、readhost 上散发。

    4. balance=”3”,全部读央浼随机的分发到 wiriterHost 对应的 readhost
      试行,writerHost 不承担读压

      力,注意 balance=3 只在 1.4 及其以往版本有,1.3 未有。

    writeType

    属性

    负载均衡类型,这两天的取值有 3 种:

    1. writeType=”0”, 全部写操作发送到配置的率先个
      writeHost,第多少个挂了切到还在世的第三个

      writeHost,重新启航后已切换后的为准,切换记录在配备文件中:dnindex.properties
      .

    2. writeType=”1”,全体写操作都随便的发送到配置的 writeHost,1.5
      现在撤销不推荐。

    switchType

    属性

    • -1 代表不自行切换

    • 1 私下认可值,自动切换

    • 2 基于 MySQL 主从同步的意况调整是还是不是切换

      心跳语句为 show slave status

  3. 基于主从延时切换本领

    Mycat1.4起来扶持MySQL主从复制状态绑定的读写分离机制,让读越发安全可信赖,配置如下:
    MyCAT心跳检查语句配置为 show slave status ,dataHost
    上定义三个新性子: switchType=”2”
    与slaveThreshold=”100”,此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制,Mycat心跳机制通过检验show slave status 中的 “Seconds_Behind_Master”,
    “Slave_IO_Running”, “Slave_SQL_Running”
    八个字段来明显当前中央同步的情景以致Seconds_Behind_Master
    主从复制时延, 当Seconds_Behind_Master>slaveThreshold
    时,读写分离筛选器会过滤掉此Slave机器,防止读到相当久从前的旧数据,而当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是还是不是为0,为0时则象征主从同步,能够安全切换,不然不会切换。

  4. 重启mycat,连接创制测量试验数据

    use TESTDB;
    create table company(id int not null primary key,name varchar(50),addr varchar(255));
    insert into company values(1,"facebook","usa");
    
  5. 结果:查看主从mysql上的db1,db2,db3上都创建了表company

  6. 倘使您的mysql的复制形式为STATEMENT(可以在my.cnf中安顿binlog_format="STATEMENT"),仍可以够如此测量检验。

    mycat执行sql :

    insert into company values(1,@@hostname,"usa");`
    select * from company ;
    

图片 7

3.jpg

 可以看出,读取数据是从从mysql读出的

2.3.1. 作用深入分析

1、依据id查询顾客的收货地址列表(使用静态数据)

2、从购物车中取商品列表,显示到页面。调用购物车服务查询。

 

品类搭建(SpringBoot + JPA)

  • 安不忘忧:首次建表,设置application.yml中的spring.jpa.hibernate.ddl-auto属性为:create(JPA自动建表实施方案,使用update的话在接二连三mycat的时候会报找不到表的荒唐)。为保险数据不被废弃,在建表之后方可改造为:update

  • 添加application.yml:

spring:
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update
      naming:
        strategy: org.hibernate.cfg.ImprovedNamingStrategy
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL5Dialect
  datasource:
    url: jdbc:mysql://localhost:8066/mysqlmycats?characterEncoding=UTF-8&useSSL=false&autoReconnect=true&rewriteBatchedStatements=true
    username: mysqlmycat
    password: mysqlmycat
  • 添加User Entity

@Entity
@Table(name = "tb_user")
@Data
public class User {

    @Id
    private Long id;

    private String name;

    private Integer gender;

}
  • 添加Student Entity

@Entity
@Table(name = "tb_student")
@Data
public class Student {

    @Id
    private Long id;

    private String name;

    @Column(unique = true)
    private Long userId;

}
  • 添加UserDao

public interface UserDao extends JpaRepository<User, Long> {

    Page<User> findByNameLike(String name, Pageable pageable);

}
  • 添加StudentDao

public interface StudentDao extends JpaRepository<Student, Long> {

    Page<User> findByNameLike(String name, Pageable pageable);

}

接下去大家要求设置钦州访谈权限

2.3 Mycat的分片战略

 图片 8

 

 

 

2.3.2. Dao层

直白从redis中取购车商品列表。

 

品类测验

  1. 测量试验增添

@Test
public void testAdd() {
        for (long i = 0; i < 30; i++) {
            User user = new User();
            user.setId(i);
            user.setName("张三" + i);
            user.setGender(i % 2 == 0 ? 0 : 1);
            userDao.save(user);

            Student student = new Student();
            student.setId(System.currentTimeMillis() + i);
            student.setName("张三学生" + i);
            student.setUserId(i);
            studentDao.save(student);
        }
}

测量检验结果:数据按id取模的不二等秘书诀分割到了三个数据库中,同不常候从库同步了主库的数量

图片 9

水平切分(id取模)

  1. 测量试验模糊查询+分页

@Test
public void testFind() {
        Pageable pageable = new PageRequest(0, 10, Sort.Direction.DESC, "id");
        List<User> userList = userDao.findByNameLike("%张三2%", pageable).getContent();
        userList.forEach(System.out::println);

        Pageable pageable2 = new PageRequest(0, 10, Sort.Direction.DESC, "userId");
        List<Student> studentList = studentDao.findByNameLike("%张三学生1%", pageable2).getContent();
        studentList.forEach(System.out::println);
}

测量试验结果:遵照模糊相称及id降序的措施出口结果

图片 10

测量试验模糊查询+分页

测量检验结果:读操作都走了从库

图片 11

读写分离,读都走了从库

  1. 除去及修改请自行测量试验

GRANT ALL PRIVILEGES ON . TO ‘myuser’@’%’IDENTIFIED BY ‘mypassword’
WITH GRANT OPTION;

2.4 概念表明

2.3.3. Service层

收货地址静态数据,未有server。

调用购物车的service查询购物车物品列表。

 

仿效链接

Mycat官网
Mycat从零开首
Mycat权威指南

GitHub:Mycat-Server
Wiki:Mycat-Server
Issues:Mycat-Server
mysql中间件切磋(Atlas,Cobar,TDDL)
mysql中间件钻探(Atlas,Cobar,TDDL,Mycat,Heisenberg,Oceanus,Vitess,OneProxy)

myuser mypassword随意起 不过要铭记在心那个是您从库登入凭证

2.4.1 逻辑库(schema) :

前方一节讲了数据库中间件,常常对实在利用来讲,并无需知道中间件的留存,业务开拓职员只须要精晓数据库的定义,所以数据库中间件能够被看做是二个或多少个数据库集群构成的逻辑库。

2.3.4. Controller

援引购物车服务

 图片 12

图片 13

 

 

 

请求的url:/order/order-cart

参数:未有参数

重临值:逻辑视图

 

Controller

@Controller
public class OrderCartController {

    @Autowired
    private CartService cartService;

    @RequestMapping("/order/order-cart")
    public String showOrderCart(HttpServletRequest request) {
        //取用户信息
        TbUser user = (TbUser) request.getAttribute("user");
        //取购物车商品列表
        List<TbItem> cartList = cartService.getCartList(user.getId());
        //把商品列表传递给jsp
        request.setAttribute("cartList", cartList);
        //返回逻辑视图
        return "order-cart";
    }
}

 

2.4. 记名拦截器 

我们还索要查询一下log的地方与名字
showmaster status;
笔录一下 之后会用到

2.4.2 逻辑表(table):

既然如此有逻辑库,那么就能有逻辑表,分布式数据库中,对应用来讲,读写多少的表就是逻辑表。逻辑表,可以是数额切分后,布满在贰个或五个分片库中,也足以不做多少切分,不分片,只有多少个表构成。

分片表:是指那么些原来的十分大数指标表,需求切分到八个数据库的表,那样,每种分片皆有一部分数据,全体分片构成了完整的数据。
简单的讲正是内需展开分片的表。

非分片表:二个数据库中并不是装有的表都不小,有些表是能够不用举行切分的,非分片是相持分片表来讲的,就是那贰个无需举办数量切分的表。

2.4.1. 成效解析

1、从cookie中取token

2、若无取到,未有登陆,跳转到sso系统的报到页面。拦截

3、假设取到token。判别登入是还是不是过期,需求调用sso系统的服务,依照token取客商音讯

4、若无取到顾客音信,登陆已经过期,重新登陆。跳转到登入页面。拦截

5、假诺取到客户消息,客商已是登陆情状,把顾客音讯保存到request中。放行

6、决断cookie中是不是有购物车音信,纵然有统一购物车

 

从库
my.ini配置

2.4.3 分片节点(dataNode)

数码切分后,叁个大表被分到差异的分片数据库方面,各种表分片所在的数据库正是分片节点(dataNode)。

2.4.2. 拦截器达成

 

/**
 * 用户登录判断拦截器
 * <p>Title: LoginInterceptor</p>
 * <p>Description: </p>
 * <p>Company: www.itcast.cn</p> 
 * @version 1.0
 */
public class LoginInterceptor implements HandlerInterceptor {

    @Value("${COOKIE_TOKEN_KEY}")
    private String COOKIE_TOKEN_KEY;
    @Value("${COOKIE_CART_KEY}")
    private String COOKIE_CART_KEY;
    @Value("${SSO_URL}")
    private String SSO_URL;
    @Autowired
    private UserService userService;
    @Autowired
    private CartService cartService;

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 1、从cookie中取token
        String token = CookieUtils.getCookieValue(request, COOKIE_TOKEN_KEY);
        // 2、如果没有取到,没有登录,跳转到sso系统的登录页面。拦截
        if (StringUtils.isBlank(token)) {
            //跳转到登录页面
            response.sendRedirect(SSO_URL + "/page/login?redirect=" + request.getRequestURL());
            return false;
        }
        // 3、如果取到token。判断登录是否过期,需要调用sso系统的服务,根据token取用户信息
        E3Result e3Result = userService.getUserByToken(token);
        // 4、如果没有取到用户信息,登录已经过期,重新登录。跳转到登录页面。拦截
        if (e3Result.getStatus() != 200) {
            response.sendRedirect(SSO_URL + "/page/login?redirect=" + request.getRequestURL());
            return false;
        }
        // 5、如果取到用户信息,用户已经是登录状态,把用户信息保存到request中。放行
        TbUser user = (TbUser) e3Result.getData();
        request.setAttribute("user", user);
        // 6、判断cookie中是否有购物车信息,如果有合并购物车
        String json = CookieUtils.getCookieValue(request, COOKIE_CART_KEY, true);
        if (StringUtils.isNotBlank(json)) {
            cartService.mergeCart(user.getId(), JsonUtils.jsonToList(json, TbItem.class));
            //删除cookie中的购物车数据
            CookieUtils.setCookie(request, response, COOKIE_CART_KEY, "");
        }
        //放行
        return true;
    }

}

 

2.4.3. Springmvc配置 

<!-- 拦截器配置 -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="cn.e3mall.order.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

  

主从复制

server-id = 2

只需投入那句话

下一场设置连接

mysql>grantreplication slave on . to ‘testcreate’@’192.168.1.61’
identified by ‘123456’;

表达:’testcreate’:同步的数据库;

  ‘192.168.1.61’:同步的数据库地址;

    ‘123456’ :同步的数据库密码,在从库配置时需要设置。

mysql>showslave status\G;

实行上述命令呈现:

两个yes那么成功

图片 14

image.png

假诺遇到关于position相关的谬误,就需求再手动设置以下File/Postion的音讯

mysql>Changemaster to master_host = ‘192.168.1.60’

master_user= ‘test’

master_password=’123456’

master_log_file=’mysql-bin.000001’, 主库的文书消息

master_log_pos=’106’;主库的Position信息

把前边查到的名字 和pos填进去
然后slave start

2.4.4 节点主机(dataHost)

多少切分后,种种分片节点(dataNode)不必然都会把持一台机器,同一机器上边能够有五个分片数据库,那样一个或七个分片节点(dataNode)所在的机器正是节点主机(dataHost),为了逃脱单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的位于不相同的节点主机(dataHost)。

2.4.4. 落实sso系统的回调

 图片 15

 

2.4.5 分片准绳(rule)

前方讲了数码切分,二个大表被分为若干个分片表,就需求确定的条条框框,那样根据某种业务法则把数量分到有个别分片的准则正是分片法则,数据切分采用合适的分片法则不行重大,将比异常的大的制止后续数据处理的难度。

2.5. 付出订单

Mycat的下载及安装

2.5.1. 功效剖析

1、在订单确认页面点击“提交订单”开关生成订单。

2、请求的url:/order/create

3、参数:提交的是表单的数量。保存的数量:订单、订单明细、配送地址。

a) 向tb_order中插入记录。

  1. 订单号须求手动生成。

供给订单号不可能再度。

订单号可读性号。

能够应用redis的incr命令生成订单号。订单号必要二个开端值。

  1. Payment:表单数据
  2. payment_type:表单数据
  3. user_id:客商新闻
  4. buyer_nick:用户名
  5. 其它字段null

b) 向tb_order_item订单明细表插入数据。

  1. Id:使用incr生成
  2. order_id:生成的订单号
  3. 其他的都以表单中的数据。

c) tb_order_shipping,订单配送音信

  1. order_id:生成的订单号
  2. 其余字段都是表单中的数据。

d) 使用pojo接收表单的数量。

能够扩大TbOrder,在子类中增加两本性情四个是货品明细列表,八个是配送新闻。

把pojo放到e3-order-interface工程中。

public class OrderInfo extends TbOrder implements Serializable{
    private List<TbOrderItem> orderItems;
    private TbOrderShipping orderShipping;
    public List<TbOrderItem> getOrderItems() {
        return orderItems;
    }
    public void setOrderItems(List<TbOrderItem> orderItems) {
        this.orderItems = orderItems;
    }
    public TbOrderShipping getOrderShipping() {
        return orderShipping;
    }
    public void setOrderShipping(TbOrderShipping orderShipping) {
        this.orderShipping = orderShipping;
    }

}

 

政工逻辑: 

1、接收表单的数码

2、生成订单id

3、向订单表插入数据。

4、向订单明细表插入数据

5、向订单物流表插入数据。

6、返回e3Result。

 

返回值:e3Result

 

3.1 设置情形

1、jdk:供给jdk必得是1.7及以上版本

2、Mysql:推荐mysql是5.5上述版本

3、Mycat:

Mycat的官方网站:

http://www.mycat.org.cn/

下载地址:

https://github.com/MyCATApache/Mycat-download

 

2.5.2. Dao层

能够动用逆向工程。

 

3.2 安装步骤

Mycat有windows、linux多种本子。本课程为linux安装步骤,windows基本同样。

第一步:下载Mycat-server-xxxx-linux.tar.gz

其次步:将审核消减包解压缩。提议将mycat放到/usr/local/mycat目录下。

第三步:进入mycat目录,启动mycat

./mycat start

停止:

./mycat stop

mycat 援救的下令{ console | start | stop | restart | status
| dump }

Mycat的默许端口号为:8066

2.5.3. Service层

参数:OrderInfo

返回值:e3Result

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private TbOrderMapper orderMapper;
    @Autowired
    private TbOrderItemMapper orderItemMapper;
    @Autowired
    private TbOrderShippingMapper orderShippingMapper;
    @Autowired
    private JedisClient jedisClient;

    @Value("${ORDER_GEN_KEY}")
    private String ORDER_GEN_KEY;
    @Value("${ORDER_ID_BEGIN}")
    private String ORDER_ID_BEGIN;
    @Value("${ORDER_ITEM_ID_GEN_KEY}")
    private String ORDER_ITEM_ID_GEN_KEY;

    @Override
    public e3Result createOrder(OrderInfo orderInfo) {
        // 1、接收表单的数据
        // 2、生成订单id
        if (!jedisClient.exists(ORDER_GEN_KEY)) {
            //设置初始值
            jedisClient.set(ORDER_GEN_KEY, ORDER_ID_BEGIN);
        }
        String orderId = jedisClient.incr(ORDER_GEN_KEY).toString();
        orderInfo.setOrderId(orderId);
        orderInfo.setPostFee("0");
        //1、未付款,2、已付款,3、未发货,4、已发货,5、交易成功,6、交易关闭
        orderInfo.setStatus(1);
        Date date = new Date();
        orderInfo.setCreateTime(date);
        orderInfo.setUpdateTime(date);
        // 3、向订单表插入数据。
        orderMapper.insert(orderInfo);
        // 4、向订单明细表插入数据
        List<TbOrderItem> orderItems = orderInfo.getOrderItems();
        for (TbOrderItem tbOrderItem : orderItems) {
            //生成明细id
            Long orderItemId = jedisClient.incr(ORDER_ITEM_ID_GEN_KEY);
            tbOrderItem.setId(orderItemId.toString());
            tbOrderItem.setOrderId(orderId);
            //插入数据
            orderItemMapper.insert(tbOrderItem);
        }
        // 5、向订单物流表插入数据。
        TbOrderShipping orderShipping = orderInfo.getOrderShipping();
        orderShipping.setOrderId(orderId);
        orderShipping.setCreated(date);
        orderShipping.setUpdated(date);
        orderShippingMapper.insert(orderShipping);
        // 6、返回e3Result。
        return e3Result.ok(orderId);
    }

}

 

  

Mycat的分片

2.5.4. Controller

请求的url:/order/create

参数:使用OrderInfo接收

再次来到值:逻辑视图。

政工逻辑:

1、接收表单提交的数码OrderInfo。

2、补全客户消息。

3、调用Service创立订单。

4、重临逻辑视图彰显成功页面

a) 要求Service重回订单号

b) 当后天子加八天。

 

在拦截器中增多客户管理逻辑:

 图片 16

@RequestMapping(value="/order/create", method=RequestMethod.POST)
    public String createOrder(OrderInfo orderInfo, HttpServletRequest request) {
        // 1、接收表单提交的数据OrderInfo。
        // 2、补全用户信息。
        TbUser user = (TbUser) request.getAttribute("user");
        orderInfo.setUserId(user.getId());
        orderInfo.setBuyerNick(user.getUsername());
        // 3、调用Service创建订单。
        e3Result result = orderService.createOrder(orderInfo);
        //取订单号
        String orderId = result.getData().toString();
        // a)需要Service返回订单号
        request.setAttribute("orderId", orderId);
        request.setAttribute("payment", orderInfo.getPayment());
        // b)当前日期加三天。
        DateTime dateTime = new DateTime();
        dateTime = dateTime.plusDays(3);
        request.setAttribute("date", dateTime.toString("yyyy-MM-dd"));
        // 4、返回逻辑视图展示成功页面
        return "success";
    }

 

3. Mycat数据库分片

 

4.1 需求

把商品表分片存款和储蓄到五个数据节点上。

 

海量数据的蕴藏难点

近日乘机互连网的前行,数据的量级也是撑指数的增进,从GB到TB到PB。对数据的种种操作也是更为的困难,古板的关系性数据库已经江郎才尽满足快捷查询与插入数据的要求。这年NoSQL的产出一时半刻缓和了这一危害。它通过降落数据的安全性,收缩对作业的支撑,减弱对复杂查询的协理,来收获品质上的晋级换代。

不过,在有个别场馆NoSQL一些低头是无法满足使用境况的,就举例某些使用境况是一定要有作业与嘉峪关目标的。这年NoSQL料定是力无法及餍足的,所以依旧必要接纳关系性数据库。借使选取关系型数据库化解海量存款和储蓄的主题素材吗?此时就须求做数据库集群,为了加强查询品质将一个数据库的数目分散到差别的数据库中蕴藏。

4.2 安装遭受分析

两台mysql数据库服务器:

Host1:192.168.25.134

Host2:192.168.25.166

 

host1环境

操作系统版本 : centos6.4

数据库版本 : mysql-5.6

mycat版本 :1.4 release

数据库名 : db1、db3

 

 

mysql节点2环境

操作系统版本 : centos6.4

数据库版本 : mysql-5.6

mycat版本 :1.4 release

数据库名 : db2

 

MyCat安装到节点1上(须要安装jdk)

 

1.1 怎么样是数据库分片

轻便易行来讲,就是指通过某种特定的规范化,将大家存放在同多少个数据库中的数据分散贮存到多个数据库(主机)上面,以到达疏散单台设备负载的机能。

多少的切分(Sharding)遵照其切分准绳的项目,能够分成两种切分格局。

(1)一种是服从分裂的表(也许Schema)来切分到不一样的数据库(主机)之上,这种切堪称数据的垂直(纵向)切分

图片 17

 

 

 

(2)别的一种则是基于表中的多少的逻辑关系,将同三个表中的多寡依据某种条件拆分到多台数据库(主机)上边,这种切分称之为数据的水平(横向)切分。

 图片 18

 

4.3 配置schema.xml

1.2 何以落到实处数据库分片

当数据库分片后,数据由二个数据库分散到八个数据库中。此时系统要询问时索要切换不一致的数据库实行查询,那么系统怎么样掌握要询问的多少在哪些数据库中?当增多一条记下时要向哪个数据库中插入呢?这个主题材料管理起来都以十二分的难为。

这种情景下能够运用三个数据库中间件mycat来消除有关的主题素材。接下来了然一下什么样是mycat。

4.3.1 Schema.xml介绍

Schema.xml作为MyCat中任重先生而道远的配置文件之一,处理着MyCat的逻辑库、表、分片准则、DataNode以致DataSource。弄懂那几个布署,是科学生运动用MyCat的前提。这里就一难得对该文件举行分析。

 

schema 标签用于定义MyCat实例中的逻辑库

Table 标签订义了MyCat中的逻辑表

dataNode 标签订义了MyCat中的数据节点,也正是我们平常说所的数额分片。

dataHost标签在mycat逻辑库中也是用作最尾部的标签存在,间接定义了具体的数据库实例、读写分离配置和心跳语句。

 

注意:若是LINUX版本的MYSQL,则需要设置为Mysql大小写不敏感,否则可能会发生表找不到的问题。

在MySQL的配置文件中/etc/my.cnf [mysqld] 中增加一行

  lower_case_table_names=1

 

Mycat介绍

4.3.2 Schema.xml配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

        <schema name="e3mall" checkSQLschema="false" sqlMaxLimit="100">
                <!-- auto sharding by id (long) -->
                <table name="tb_item" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost2" database="db2" />
        <dataNode name="dn3" dataHost="localhost1" database="db3" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="192.168.25.134:3306" user="root"
                        password="root">
                        <!-- can have multi read hosts -->

                </writeHost>
        </dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="192.168.25.166:3306" user="root"
                        password="root">
                        <!-- can have multi read hosts -->

                </writeHost>
        </dataHost>
</mycat:schema>

 

4.4 配置server.xml 

 

2.1 什么是Mycat?

 

Mycat 背后是Ali已经开源的显赫产品——Cobar。Cobar 的着力功效和优势是 MySQL 数据库分片,此产品早已流传,据说最初的发起者对
Mysql 很驾驭,后来从Ali换工作了,Ali随之开源的
Cobar,并保证到 二零一一 年年底,然后,就从未然后了。

Cobar 的笔触和实现路线的确不易。基于
Java 开荒的,完结了 MySQL 公开的二进制传输合同,美妙地将本身伪装成四个MySQL Server,近期市道上绝大好多 MySQL 客商端工具和利用都能相称。比自个儿达成多少个新的数据库合同要明智的多,因为生态境遇在哪儿摆着。

 

Mycat 是依靠 cobar 演化而来,对 cobar 的代码举行了根本的重构,使用 NIO 重构了互联网模块,而且优化了 Buffer 内核,加强了汇聚,Join 等着力特点,相同的时间宽容绝大半数以上据库成为通用的数据库中间件。

简单的讲的说,MyCAT正是:

·二个新型的数据库中间件产品匡助mysql集群,也许mariadb cluster,提供高可用性数据分片集群。你能够像使用mysql相同采取mycat。对于开采人士来讲根本感到不到mycat的留存。

 图片 19

4.4.1 Server.xml介绍

server.xml大约保存了富有mycat供给的类别安插信息。最常用的是在这里布局顾客名、密码及权限。

 

2.2 Mycat帮忙的数据库

 图片 20

4.4.2 Server.xml配置

<user name="test">
    <property name="password">test</property>
    <property name="schemas">e3mall</property>
    <property name="readOnly">false</property>
</user>

 

4.5 配置rule.xml 

rule.xml里面就定义了我们对表进行拆分所关联到的平整定义。大家能够灵活的对表使用不一致的分片算法,只怕对表使用一样的算法但现实的参数区别。那一个文件之中根本有tableRule和function那三个标签。在实际应用进度中能够根据供给增多tableRule

和function。

此布局文件能够毫不修改,使用默许就能够。

2.3 Mycat的分片战略

 图片 21

 

 

 

4.6 测验分片

2.4 概念表达

4.6.1 创建表

布局达成后,重新起动mycat。使用mysql客户端连接mycat,创设表。

-- ----------------------------
-- Table structure for tb_item
-- ----------------------------
DROP TABLE IF EXISTS `tb_item`;
CREATE TABLE `tb_item` (
  `id` bigint(20) NOT NULL COMMENT '商品id,同时也是商品编号',
  `title` varchar(100) NOT NULL COMMENT '商品标题',
  `sell_point` varchar(500) DEFAULT NULL COMMENT '商品卖点',
  `price` bigint(20) NOT NULL COMMENT '商品价格,单位为:分',
  `num` int(10) NOT NULL COMMENT '库存数量',
  `barcode` varchar(30) DEFAULT NULL COMMENT '商品条形码',
  `image` varchar(500) DEFAULT NULL COMMENT '商品图片',
  `cid` bigint(10) NOT NULL COMMENT '所属类目,叶子类目',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '商品状态,1-正常,2-下架,3-删除',
  `created` datetime NOT NULL COMMENT '创建时间',
  `updated` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `cid` (`cid`),
  KEY `status` (`status`),
  KEY `updated` (`updated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';

 

4.6.2 插入数据 

 

将此文件中的数据插入到数据库:

 图片 22

 

 

2.4.1 逻辑库(schema) :

眼下一节讲了数据库中间件,平常对实际行使来说,并无需知道中间件的存在,业务开垦职员只须要掌握数据库的概念,所以数据库中间件能够被看做是一个或七个数据库集群构成的逻辑库。

4.6.3 分片测验

是因为配备的分片准绳为“auto-sharding-long”,所以mycat会依照此法则自动分片。

每个datanode中保留一定数额的数目。依照id举行分片

经测试id范围为:

Datanode1:1~5000000

Datanode2:5000000~10000000

Datanode3:10000001~15000000

 

当16000000上述的id插入时报错:

[Err] 1064 – can’t find any valid datanode :TB_ITEM -> ID ->
15000001

那儿急需增多节点了。

 

2.4.2 逻辑表(table):

既然有逻辑库,那么就能够有逻辑表,遍布式数据库中,对利用来讲,读写多少的表便是逻辑表。逻辑表,能够是多少切分后,分布在三个或三个分片库中,也可以不做多少切分,不分片,独有一个表构成。

分片表:是指那几个原本的十分大数据的表,供给切分到八个数据库的表,那样,种种分片都有一部分数额,全数分片构成了整机的数额。
简单来说正是内需开展分片的表。

非分片表:三个数据库中并非有所的表都异常的大,有个别表是能够不用进行切分的,非分片是相对分片表来讲的,正是那么些不须求张开数量切分的表。

Mycat读写分离

数据库读写分离对于大型系统或然访谈量相当高的网络选择来讲,是少不了的贰个非常重要功效。对于MySQL来讲,规范的读写分离是基本情势,二个写节点Master后边随着七个读节点,读节点的数码决定于系统的下压力,经常是1-3个读节点的布局

 图片 23

 

Mycat读写分离和自行切换机制,供给mysql的主从复制机制同盟。

 图片 24

 

2.4.3 分片节点(dataNode)

数量切分后,贰个大表被分到不一致的分片数据库方面,每一种表分片所在的数据库就是分片节点(dataNode)。

5.1 Mysql的主从复制

 

骨干配置要求专心的地点

1、主DB server和从DB server数据库的本子同样

2、主DB server和从DB server数据库数据名称同样

3、主DB server开启二进制日志,主DB
server和从DB server的server_id都不可能不唯一

 

2.4.4 节点主机(dataHost)

数量切分后,每一种分片节点(dataNode)不明显都会占据一台机器,同一机器上边能够有八个分片数据库,那样二个或四个分片节点(dataNode)所在的机器正是节点主机(dataHost),为了逃避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不一致的节点主机(dataHost)。

5.2 Mysql主服务器配置

第一步:修改my.cnf文件:

在[mysqld]段下增添:

binlog-do-db=db1

binlog-ignore-db=mysql

#启用二进制日志

log-bin=mysql-bin

#服务器唯一ID,一般取IP最后一段

server-id=134

第二步:重启mysql服务

service mysqld restart

其三步:建设构造帐户并授权slave

mysql>GRANT FILE ON *.* TO ‘backup’@’%’ IDENTIFIED BY ‘123456’;

mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to
‘backup’@’%’ identified by ‘123456’;

#常常不要root帐号,“%”表示全数客商端都或许连,只要帐号,密码精确,此处可用具体顾客端IP代替,如192.168.145.226,压实安全。

 

刷新权限

mysql> FLUSH PRIVILEGES;

  

翻看mysql以后有怎么样顾客

mysql>select user,host from mysql.user;

 

第四步:查询master的状态

mysql> show master status;

+——————+———-+————–+——————+——————-+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
Executed_Gtid_Set |

+——————+———-+————–+——————+——————-+

| mysql-bin.000001 |      120 | db1          | mysql            |
                  |

+——————+———-+————–+——————+——————-+

1 row in set

 

 

 

2.4.5 分片法规(rule)

前方讲了数码切分,多少个大表被分成若干个分片表,就需求自然的法规,那样依据某种业务法则把多少分到有些分片的平整就是分片法规,数据切分选拔相符的分片准则不行重大,将比十分的大的避免后续数据管理的难度。

5.3 Mysql从服务器配置

第一步:修改my.cnf文件

[mysqld]

server-id=166

 

第二步:配置从服务器

mysql>change master to
master_host=’192.168.25.128′,master_port=3306,master_user=’backup’,master_password=’123456′,master_log_file=’mysql-bin.000001′,master_log_pos=120

 

留意语句中间不要断开,master_port为mysql服务器端口号(无引号),master_user为施行同步操作的数据库账户,“120”无单引号(此处的120正是show master status 中看见的position的值,这里的mysql-bin.000001就是file对应的值)。

 

第二步:运转从服务器复制功效

Mysql>start slave;

 

其三步:检查从服务器复制作用状态:

mysql> show slave status

 

……………………(省略部分)

Slave_IO_Running: Yes //此状态必需YES

Slave_SQL_Running: Yes //此状态必得YES

……………………(省略部分)

 

注:Slave_IO及Slave_SQL进度必得符合规律运作,即YES状态,否则都以不对的景观(如:其中三个NO均属不当)。

 

错误处理:

如果出现此错误:

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

因为是mysql是克隆的系统所以mysql的uuid是一样的,所以需要修改。

解决方法:

删除/var/lib/mysql/auto.cnf文件,重新启动服务。

 

 图片 25

 

以上操作进度,从服务器配置完毕。

 

Mycat的下载及安装

5.4 Mycat配置

Mycat 1.4 支持MySQL主从复制状态绑定的读写分离机制,让读越发安全可相信,配置如下:

 

<dataNode name="dn1" dataHost="localhost1" database="db1" />

<dataNode name="dn2" dataHost="localhost1" database="db2" />

<dataNode name="dn3" dataHost="localhost1" database="db3" />

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"

writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">

<heartbeat>show slave status</heartbeat>

<writeHost host="hostM" url="192.168.25.134:3306" user="root"

    password="root">

    <readHost host="hostS" url="192.168.25.166:3306" user="root"

    password="root" />

  </writeHost>

</dataHost>

 

 

 

(1) 设置
balance=”1″与writeType=”0″

Balance参数设置:

  1. balance=“0”, 全部读操作都发送到当前可用的writeHost上。

2.
balance=“1”,全数读操作都随便的发送到readHost。

  1. balance=“2”,全数读操作都随便的在writeHost、readhost上散发

WriteType参数设置:

  1. writeType=“0”,
    全体写操作都发送到可用的writeHost上。

  2. writeType=“1”,全部写操作都随便的发送到readHost。

  3. writeType=“2”,全部写操作都随便的在writeHost、readhost分上发。

 “readHost是附属于writeHost的,即意味着它从那三个writeHost获取同步数据,因而,当它所属的writeHost宕机了,则它也不会再到场到读写分离中来,即“不做事了”,那是因为那时,它的数目现已“不可相信”了。基于这么些怀念,这两天mycat
1.3和1.4本子中,若想援救MySQL一主一从的标准配置,并且在主节点宕机的事态下,从节点还是能够读取数据,则须求在Mycat里安排为四个writeHost并安装banlance=1。”

(2) 设置 switchType=”2″
与slaveThreshold=”100″

switchType 如今有几种选取:

-1:表示不自动切换

1 :暗中同意值,自动切换

2 :基于MySQL主从同步的情事调控是还是不是切换

“Mycat心跳检查语句配置为 show slave status ,dataHost 上定义三个新特性:
switchType=”2″
与slaveThreshold=”100″,此时代表开启MySQL主从复制状态绑定的读写分离与切换机制。Mycat心跳机制通过检查实验show slave status 中的 “Seconds_Behind_Master”, “Slave_IO_Running”,
“Slave_SQL_Running”
四个字段来明确当前核心同步的情形以致Seconds_Behind_Master主从复制时延。“

 

 

3.1 设置碰着

1、jdk:须求jdk必得是1.7及以上版本

2、Mysql:推荐mysql是5.5以上版本

3、Mycat:

Mycat的官方网站:

http://www.mycat.org.cn/

下载地址:

https://github.com/MyCATApache/Mycat-download

 

附:Centos6.5下安装mysql

首先步:查看mysql是不是安装。

rpm -qa|grep mysql

其次步:假如mysql的本子不是想要的版本。须要把mysql卸载。

yum remove mysql mysql-server mysql-libs mysql-common

rm -rf /var/lib/mysql

rm /etc/my.cnf

其三步:安装mysql。供给使用yum命令安装。在设置mysql以前须求安装mysql的下载源。供给从oracle的官网下载。

1)下载mysql的源包。

我们是centos6.4对应的rpm包为:mysql-community-release-el6-5.noarch.rpm

2)安装mysql下载源:

yum localinstall mysql-community-release-el6-5.noarch.rpm

(图片 26)此附属类小部件可保存

 图片 27

 

3)在线安装mysql:

yum install mysql-community-server

第四步:启动mysql

service mysqld start

第五步:须求给root客商设置密码。

/usr/bin/mysqladmin -u root password ‘new-password’  //
为root账号设置密码

第六步:远程连接授权。

GRANT ALL PRIVILEGES ON *.* TO ‘myuser’@’%’ IDENTIFIED BY
‘mypassword’ WITH GRANT
OPTION;

注意:’myuser’、’mypassword’ 需求替换来实际的客商名和密码。

 

3.2 设置步骤

Mycat有windows、linux八种版本。本学科为linux安装步骤,windows基本一样。

第一步:下载Mycat-server-xxxx-linux.tar.gz

其次步:将核减包解压缩。建议将mycat放到/usr/local/mycat目录下。

第三步:进入mycat目录,启动mycat

./mycat start

停止:

./mycat stop

mycat 帮衬的一声令下{ console | start | stop | restart | status
| dump }

Mycat的默许端口号为:8066

Mycat的分片

4.1 需求

把商品表分片存款和储蓄到几个数据节点上。

 

4.2 安装景况深入分析

两台mysql数据库服务器:

Host1:192.168.25.134

Host2:192.168.25.166

 

host1环境

操作系统版本 : centos6.4

数据库版本 : mysql-5.6

mycat版本 :1.4 release

数据库名 : db1、db3

 

 

mysql节点2环境

操作系统版本 : centos6.4

数据库版本 : mysql-5.6

mycat版本 :1.4 release

数据库名 : db2

 

MyCat安装到节点1上(需求安装jdk)

 

4.3 配置schema.xml

4.3.1 Schema.xml介绍

Schema.xml作为MyCat中首要的配备文件之一,管理着MyCat的逻辑库、表、分片准绳、DataNode以致DataSource。弄懂那个布署,是不错接纳MyCat的前提。这里就一百年不遇对该文件进行剖判。

 

schema 标签用于定义MyCat实例中的逻辑库

Table 标签署义了MyCat中的逻辑表

dataNode 标签定义了MyCat中的数据节点,也正是大家日常说所的多寡分片。

dataHost标签在mycat逻辑库中也是当做最尾巴部分的价签存在,间接定义了切实可行的数据库实例、读写分离配置和心跳语句。

 

注意:若是LINUX版本的MYSQL,则需要设置为Mysql大小写不敏感,否则可能会发生表找不到的问题。

在MySQL的配置文件中/etc/my.cnf [mysqld] 中增加一行

  lower_case_table_names=1

 

4.3.2 Schema.xml配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

        <schema name="e3mall" checkSQLschema="false" sqlMaxLimit="100">
                <!-- auto sharding by id (long) -->
                <table name="tb_item" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost2" database="db2" />
        <dataNode name="dn3" dataHost="localhost1" database="db3" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="192.168.25.134:3306" user="root"
                        password="root">
                        <!-- can have multi read hosts -->

                </writeHost>
        </dataHost>
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="192.168.25.166:3306" user="root"
                        password="root">
                        <!-- can have multi read hosts -->

                </writeHost>
        </dataHost>
</mycat:schema>

 

4.4 配置server.xml 

 

4.4.1 Server.xml介绍

server.xml差十分少保存了富有mycat需求的种类布置音讯。最常用的是在那布局顾客名、密码及权限。

 

4.4.2 Server.xml配置

<user name="test">
    <property name="password">test</property>
    <property name="schemas">e3mall</property>
    <property name="readOnly">false</property>
</user>

 

4.5 配置rule.xml 

rule.xml里面就定义了我们对表进行拆分所关联到的平整定义。大家得以灵活的对表使用不一样的分片算法,大概对表使用一样的算法但现实的参数差异。那些文件之中根本有tableRule和function那三个标签。在具体应用进程中得以依照供给增加tableRule

和function。

此安排文件能够不用修改,使用暗中同意就能够。

4.6 测验分片

4.6.1 创建表

布署实现后,重新开动mycat。使用mysql顾客端连接mycat,成立表。

-- ----------------------------
-- Table structure for tb_item
-- ----------------------------
DROP TABLE IF EXISTS `tb_item`;
CREATE TABLE `tb_item` (
  `id` bigint(20) NOT NULL COMMENT '商品id,同时也是商品编号',
  `title` varchar(100) NOT NULL COMMENT '商品标题',
  `sell_point` varchar(500) DEFAULT NULL COMMENT '商品卖点',
  `price` bigint(20) NOT NULL COMMENT '商品价格,单位为:分',
  `num` int(10) NOT NULL COMMENT '库存数量',
  `barcode` varchar(30) DEFAULT NULL COMMENT '商品条形码',
  `image` varchar(500) DEFAULT NULL COMMENT '商品图片',
  `cid` bigint(10) NOT NULL COMMENT '所属类目,叶子类目',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '商品状态,1-正常,2-下架,3-删除',
  `created` datetime NOT NULL COMMENT '创建时间',
  `updated` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `cid` (`cid`),
  KEY `status` (`status`),
  KEY `updated` (`updated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';

 

4.6.2 布署数据 

 

将此文件中的数据插入到数据库:

 图片 28

 

 

4.6.3 分片测验

出于配备的分片法则为“auto-sharding-long”,所以mycat会根据此法则自动分片。

各种datanode中保存一定数量的数目。依据id举行分片

经测试id范围为:

Datanode1:1~5000000

Datanode2:5000000~10000000

Datanode3:10000001~15000000

 

当1伍仟000以上的id插入时报错:

[Err] 1064 – can’t find any valid datanode :TB_ITEM -> ID ->
15000001

此时亟需增加节点了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图