zoukankan      html  css  js  c++  java
  • Mysql2 分库分表(mycat), centos7安装jdk

    0Centos7 安装jdk1.8

    一 下载linux版jdk

    地址:https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html

     找到对应版本

     下载:需要账号(从网上找个别人的账号或者注册一个即可:账号2696671285@qq.com,密码Oracle123)

    二 解压

    # 创建目录
    mkdir /usr/local/java
    # 将下载的tar.gz 解压到当前路径下
    tar -zxvf jdk-8u241-linux-x64.tar.gz
    rm -f jdk-8u241-linux-x64.tar.gz # 删除压缩包
    '''
    命令介绍:
    tar            备份文件
    -zxvf
    -z                通过gzip指令处理备份文件
    -x                从备份文件中还原文件
    -v                显示指令执行过程
    -f                指定备份文件
    jdk-8u241-linux-x64.tar        文件名
    '''
    # 进入bin文件,输入./java -version可以看到java版本,如果想直接使用,需要将命令加入环境变量

    三 配置环境变量

    # vim 打开profile
    vim /etc/profile
    # 在最后一行输入
    export JAVA_HOME=/usr/local/java/jdk1.8.0_241
    export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
    export PATH=$PATH:${JAVA_HOME}/bin
        
    # 使配置生效
    source /etc/profile
    
    # 检查
    java -version

    1分库分表方案

    # 1  单表数据量到达千万级  (分库:一个库有table1,table2表,另一个库有table3,table4表)
    
    # 2 分表方案
      -垂直分表:把原来一个大表,做成一对一关系
      -水平分表:水平切,假设把2000万的数据,分到两个表中(按id分,按hash分)#可能会有热点问题,活跃的用户都在第一张表上,用hash分表会均匀的落在两个表中
    
    # 备注:
    # 先读写分离,再搭集群(提高查询性能),(单表数据量过了千万级,若果是innodb数据引擎,查询基本就废了。即便做了集群,也需要分表)再做分库分表
    # 大公司真正数据量大的东西(上亿级)不会放在mysql中, 用es,hadoop,mongodb

    2 分库分表实战

    mycat原理图

    # 1 通过mycat数据库中间件实现(生根于阿里)
    拓展:支持高并发,就是尽量让请求少往后走(写服务器中间件,不重要的或者处理不了的请求直接返回回去,或者放队列里做缓存),或者是异步。
    # mycat官网:http://www.mycat.org.cn/ ##右边有下载地址,上边有github地址    
    # mycat作用:支持多种数据库,读写分离,自动故障切换(高可用),mysql主从.基于nio(Java)解决高并发问题(IO多路复用,异步io目前还没有成熟的解决方案)。支持跨库分页,聚合函数。。。mycat监控参考官网

    mycat高可用方案

    # 2 基于java开发,需要安装jdk
    # 3 实现了 MySQL 公开的二进制传输协议,巧妙地将自己伪装成一个  MySQL Server,目前市面上绝大多数 MySQL  客户端工具和应用都能兼容
    # 4 javase(基础,io,网络,并发) javaee(web相关) javame
    
    # 5 需要有两台服务器(docker模拟两个mysql)
    ## 使用docker启动多个数据库
    docker run -di --name=test1_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
    docker run -di --name=test2_mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
    # 分库:mycat两种方式都支持
      垂直分库:(用户相关表,订单相关表,支付相关表)
      水平分库 :(用户表拆到了不同的库中)

    分库垂直切分分库水平切分

      ## mycat分片策略
        如图,一个库有表A和表B,mycat把表根据分片规则(id和hash值)拆分成两个节点,分别放在两台机器上

    # 6 安装mycat
      -1 安装jdk8以上(必须1.8及以上版本)
      -2 下载,解压即可(安装完成,不需要编译)  # 此处从官网下载1.6.7.5版本
        # 放到~路径下,解压出mycat文件夹
        tar -xzf Mycat-server-1.6.7.5-release-20200410174409-linux.tar.gz
      -3 cd到bin路径下,启动 ./mycat start    stop    console(前台运行,可以查看日志)
        # ./mycat start启动mycat     # 返回Starting Mycat-server... ,代表启动了
        # mycat的默认端口为8066
        # ./mycat stop        #停止mycat     
        # ./mycat console     #启动,前台一直hang着  可以看到日志,报错信息
        
    # 7 mycat安装完,需要关注的几个文件  ##都在mycat/conf中 
        server.xml:综合配置数据库的相关信息,端口,内存占用,创建账号,密码 
        schema.xml:对数据库表结构的定义#mycat连接后面的数据在,显示出来表结构
        rule.xml:指定相关算法,来实现不同的分片数据库#来定义按id分,还是hash分
        ## 推荐使用Sublime Text编辑(激活后,看是否有sftp功能。若无则设定channel_v3.json地址不翻墙,装sftp插件)。本地改完(edit编辑,Chmod改变权限,ctrl+s自动保存上去),远程同步过去。比直接vim修改体验好
        
        ## server.xml大概配置讲解,一般不需要动,除非加个用户    具体看文档
    106行     <user name="root" defaultAccount="true">    # 配置一个用户(navicat连接使用)    
            <property name="password">123456</property>    # 配置密码
            <property name="schemas">TESTDB</property>    # 数据库
            <property name="defaultSchema">TESTDB</property>#默认能看到的数据库(Navicat连接就能看到的库)
            
    123行 <user name="user">
            <property name="password">user</property>
            <property name="schemas">TESTDB</property>
            <property name="readOnly">true</property>    # 只有读的权限
            <property name="defaultSchema">TESTDB</property>
        </user>
        
    44行        <!--        # 默认参数配置,想修改只要解开端口号修改即可 默认端口8066
            <property name="serverPort">8066</property> <property name="managerPort">9066</property> 
            <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
            <property name="dataNodeIdleCheckPeriod">300000</property> 5 * 60 * 1000L; //连接空闲检查
            <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
        
    # 8 id分表规则配置
    -shema.xml
        # schema name和server.xml中的<property name="schemas">TESTDB</property>名字对上
        <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
        # name指定表名,dataNode指定节点,rule指定分片规则(水平分表的规则),auto-sharding-long通过id来分片
        ##————在mycat上的user表会分表,经测试没配置的表不能在mycat上修改
          <table name="user" primaryKey="id" dataNode="dn1,dn2" rule="auto-sharding-long" autoIncrement="true" fetchStoreNodeByJdbc="true">
          </table>
        
        
       # 上面的dataNode="dn1,dn2" 跟这个地方对应,dataHost在下面配置,database数据库名,name随意(这里的db1就要在对应的地址建db1库)
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost2" database="db1" />
      
      
      # 在这配置跟上面对应,主机的地址和端口,连接mysql服务端的用户名和密码
      # maxCon最多连接数,minCon最小连接数,dbType数据库类型
          <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
            <heartbeat>select user()</heartbeat># 用心跳监测是否还有连接,有响应说明还没挂
            <!-- can have multi write hosts -->    # 地址为本地3306端口,本地跑不用改
            <writeHost host="hostM1" url="jdbc:mysql://localhost:3306" user="root"
                       password="123456">
            </writeHost>
            <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
        </dataHost>
    
    
        <dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
                  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <!-- can have multi write hosts -->
            <writeHost host="hostM1" url="jdbc:mysql://localhost:3307" user="root"
                       password="123456">
            </writeHost>
            <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
        </dataHost>
      
    # 9 配置规则
    auto-sharding-long---》rule.xml    # shema.xml中设置分片规则在rule.xml中配的
        <tableRule name="auto-sharding-long">
            <rule>
                <columns>id</columns>
                <algorithm>rang-long</algorithm>
            </rule>
        </tableRule>
      # rang-long   ##全文查找rang-long,下面对应java的类,对应一个txt
          <function name="rang-long"
                  class="io.mycat.route.function.AutoPartitionByLong">
            <property name="mapFile">autopartition-long.txt</property>
        </function>
    # autopartition-long.txt    ## 在conf文件夹中打开autopartition-long.txt文件,内容如下
    # range start-end ,data node index
    # K=1000,M=10000.
    0-500M=0        # id号为0---5000000的数据落在 0库上
    500M-1000M=1    # id号为5000000---10000000的数据落在 1库上  意味着id最大1千万,超了会报错
    
    
    # 10 启动mycat    cd bin/    ./mycat console启动看看会不会报错
    # 11 远程连接,需要在3306和3307库上创建出db1数据库(名字是shema.xml里设的)
    # 12 远程连接到mycat,创建表(配置过的表),插入数据,如果是不通范围的id会落到不同库上
      ##通过Navicat在mycat库中直接建user表,会报错连接的库里没表(没事),两个链接的库会自动创建表(正常操作是三个库都先建表。如果连接库原本没表,用mycat直接建表,所有连接库表名都会大写)

    navicat连接mycat效果mycat插入数据

    库1user表库2user表

    ## 通过hash方式实现水平分表
        -只需要修改shema.xml(添加下表,sharding-by-murmur代表hash分表)
          #相当于再添加article表,按照sharding-by-murmur方法做,其他配置之前已经配好了(该配置规则不需要修改配置)
            <table name="article" primaryKey="id" dataNode="dn1,dn2" rule="sharding-by-murmur">
            </table>
      -重启mycat
      -在客户端测试,创建article表。插入数据,会均匀的散落在两个库上

    mycat表表1表2

      # 原来由于我的设计,没有考虑到分表的情况(单数据---》数据量越来越大,要分表了?)
          -起一个从库,把原来的业务数据同步过来---》操作从库---》通过mycat从库分表--》再练mycat(缺一部分数据---》把这部分数据重放回来)
  • 相关阅读:
    IBinder介绍
    Android组成部分
    Android中handler,looper与messageQueue的代码解析
    JS
    设计模式
    冒泡排序
    战斗逻辑
    mongo数据库基础
    JS闭包
    c/c++
  • 原文地址:https://www.cnblogs.com/ludingchao/p/14109270.html
Copyright © 2011-2022 走看看