MySQL代理实现方式

代理技术

代理简介

  • 名词

    • DB Proxy,数据库中间件
  • 功能

    1. 读写分离 M-S-S M-M-S-S

    2. 负载均衡 Galera Cluster

    3. 支持数据的分片自动路由与聚合(分库分表)

      如果数据表数据量庞大,记录多,列数多的时候,可把数据表进行裁开,放在不同的表上

      这些都是代理解决的

产品

  • MySQL Proxy MySQL官方
  • Atlas 奇虎360
  • DBProxy 美团点评
  • Amoeba 早期阿里巴巴
  • cober 阿里巴巴
  • MyCat 阿里巴巴

Mycat实战

架构
  • 请准备好域名解析
  • MyCat
    • 192.168.229.59 mycat
  • M-M-S-S
    • 192.168.229.19 master1
    • 192.168.229.29 master2
    • 192.168.229.39 slave1
    • 192.168.229.49 slave2
案例1:
1、配置 Java环境
  • 下载jdk图示
    JAVA

请添加图片描述

  • mycat服务器(59)解压java软件开发工具包

    • # ls
      anaconda-ks.cfg  jdk-8u411-linux-x64.tar.gz
      
      # tar -zxf jdk-8u411-linux-x64.tar.gz  -C /usr/local/
      
      
  • 给目录创建一个软连接

    ln -s /usr/local/jdk1.8.0_411/ /usr/local/java 
    

    请添加图片描述

  • tail -3 /etc/profile

    • 添加三行 设置JAVA变量,便于JAVA调用

      vim /etc/profile

    • JAVA_HOME=/usr/local/java
      PATH=$JAVA_HOME/bin:$PATH
      export JAVA_HOME PATH
      
    • 执行环境变量配置文件

      source /etc/profile
      
    • 可以查看关于java的环境变量

      env |grep JAVA
      
  • java -version

    • 查询到版本。说明jdk安装成功
2、配置Mycat
  • 下载mycat

mycat
请添加图片描述

    • mycat虽然已经推出2.0版本。但是语言繁琐,使用率不高。1.6的版本才是企业常用的版本。

    • # ls
      anaconda-ks.cfg  jdk-8u411-linux-x64.tar.gz  Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
      
      #tar xf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz -C /usr/local
      
      
    • ls /usr/local/mycat/
      
  • 配置mycat前端

    • vim  /usr/local/mycat/conf/server.xml
      
    • 注释掉多余用户

请添加图片描述

    • 115行-119行
  • 启动mycat管理员

请添加图片描述

配置mycat后端

  • 请备份该文件

  • vim  /usr/local/mycat/conf/schema.xml
    
    • 代码

      • <?xml version="1.0"?>
        <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
        <mycat:schema xmlns:mycat="http://io.mycat/">
                <schema name="mydb2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
                </schema>
                <dataNode name="dn1" dataHost="localhost1" database="mydb2" />
                <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="master1" url="master1:3306" user="mycatproxy"  password="Lixinyi@123">
        <readHost host="slave1" url="slave1:3306" user="mycatproxy" password="Lixinyi@123" />
        </writeHost>
        <writeHost host="master2" url="master2:3306" user="mycatproxy"  password="Lixinyi@123">
        <readHost host="slave2" url="slave2:3306" user="mycatproxy" password="Lixinyi@123" />
        </writeHost>
        </dataHost>
        </mycat:schema>
        
        

        注释:

         checkSQLschema 校验数据库
         sqlMaxLimit     每秒最大连接数
         dataNode       关联前方的登录主机和后方的集群
         dataHost       集群
         maxCon         最大和后面的设备产生多少的连接
        
         writeType				
         
        
      • 注释

        • schema name:mycat维护的集群名称。
          datanode:后方节点群的名称。
          datahost:后方节点群的主机名称。
          writehost:写主机
          readhost:读主机
          倒着看。
          
        • 在本例中switchType值设置为1,表示自动切换,某些对主从数据一致要求较高的场景,建议使用2判断主从状态后再切换 切换的触发条件为主节点mysql服务崩溃或停止 slaveThreshold 主从的延迟在多少秒以内,则把读请求分发到这个从节点,否则不往这个节点分发,假设生产环境能容忍的主从延时为60秒,则设置此值为60,此例中设置值为100

  • 关于属性的介绍

    • balance 类型

      - balance指的负载均衡类型,目前的取值有4种:
      - 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",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
      
    • writeType 属性

      • 备份型

        1. writeType="0", 所有写操作发送到配置的第一个 writeHost, 第一个挂了切到还生存的第二个writeHost, 重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
        
      • 负载型

        2. writeType="1",所有写操作都随机的发送到配置的 writeHost。
        
    • switchType 模式

      • switchType指的是切换的模式,目前的取值也有4种:
        1. switchType=‘-1’ 负1表示不自动切换
        1. switchType=‘1’ 默认值,表示根据延时自动切换
        1. switchType=‘2’ 根据MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
    • slaveThreshold=“100”,此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制

      1.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时则表示主从同步,可以安全切换,否则不会切换。

3、配置mysql群
  • M-M-S-S 准备Mycat连接的用户及权限

  • 例如master1

    • mysql> create user 'mycatproxy'@'192.168.145.145' identified by 'Lixinyi@123';
      
    • mysql> grant all on *.* to 'mycatproxy'@'192.168.145.145' ;
      
      • 192.168.229.59是mycat服务器的IP
    • flush privileges;
      
4、启动Mycat
  • 在mycat服务器上

    • mycat1.6和mysql8的版本问题(如果使用的是mycat1.6和mysql5.*则跳过这个步骤

      • mysql-master1服务器上需要修改用户的加密方式

      • mysql> ALTER USER 'mycatproxy'@'192.168.145.145' IDENTIFIED WITH mysql_native_password BY 'Lixinyi@123';
        
      • mysql> ALTER USER 'mycatproxy'@'192.168.145.145' IDENTIFIED BY 'Lixinyi@123' PASSWORD EXPIRE NEVER;
        
        
        flush privileges;
        

        下面是了解的

      • 增加mysql尝试连接的限制

      • 刷新mysql连接池

        • mysqladmin flush-hosts  -uroot  -p'Lixinyi@123'
          
      • 修改mysql配置文件,在[mysqld]下面添加

        max_connect_errors=1000
        
    • Mycat服务器:

      /usr/local/mycat/bin/mycat start
      
      • Starting Mycat-server… 启动成功,否则就是配置Mycat后端语法错误。
    • 监测端口是否启动(mycat默认端口8066)

      netstat  -anpt | grep java
      
      [root@localhost ~]# netstat  -anpt | grep java
      tcp        0      0 127.0.0.1:32000         0.0.0.0:*               LISTEN      3487/java           
      tcp6       0      0 :::1984                 :::*                    LISTEN      3487/java           
      tcp6       0      0 :::8066                 :::*                    LISTEN      3487/java           
      tcp6       0      0 :::59268                :::*                    LISTEN      3487/java           
      tcp6       0      0 :::9066                 :::*                    LISTEN      3487/java           
      tcp6       0      0 :::44500                :::*                    LISTEN      3487/java           
      tcp6       0      0 127.0.0.1:31000         127.0.0.1:32000         ESTABLISHED 3487/java  
      
    • 检测进程是否启动

      ps aux | grep mycat
      
      root       3487  4.0 35.4 6473184 172568 ?      Sl   23:36   0:03 java -DMYCAT_HOME=. -server -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1984 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xmx4G -Xms1G -Djava.library.path=lib -classpath lib/wrapper.jar:conf:lib/zookeeper-3.4.6.jar:lib/jline-0.9.94.jar:lib/ehcache-core-2.6.11.jar:lib/log4j-1.2.17.jar:lib/fastjson-1.2.12.jar:lib/curator-client-2.11.0.jar:lib/joda-time-2.9.3.jar:lib/log4j-slf4j-impl-2.5.jar:lib/libwrapper-linux-x86-32.so:lib/netty-3.7.0.Final.jar:lib/druid-1.0.26.jar:lib/log4j-api-2.5.jar:lib/mapdb-1.0.7.jar:lib/slf4j-api-1.6.1.jar:lib/univocity-parsers-2.2.1.jar:lib/hamcrest-core-1.3.jar:lib/Mycat-server-1.6-RELEASE.jar:lib/objenesis-1.2.jar:lib/leveldb-api-0.7.jar:lib/hamcrest-library-1.3.jar:lib/wrapper.jar:lib/commons-lang-2.6.jar:lib/reflectasm-1.03.jar:lib/mongo-java-driver-2.11.4.jar:lib/guava-19.0.jar:lib/curator-recipes-2.11.0.jar:lib/curator-framework-2.11.0.jar:lib/libwrapper-linux-ppc-64.so:lib/log4j-core-2.5.jar:lib/leveldb-0.7.jar:lib/sequoiadb-driver-1.12.jar:lib/mysql-binlog-connector-java-0.4.1.jar:lib/kryo-2.10.jar:lib/jsr305-2.0.3.jar:lib/commons-collections-3.2.1.jar:lib/disruptor-3.3.4.jar:lib/log4j-1.2-api-2.5.jar:lib/velocity-1.7.jar:lib/libwrapper-linux-x86-64.so:lib/dom4j-1.6.1.jar:lib/minlog-1.2.jar:lib/asm-4.0.jar -Dwrapper.key=cECV31vA3vcZHrvr -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=3485 -Dwrapper.version=3.2.3 -Dwrapper.native_library=wrapper -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperSimpleApp io.mycat.MycatStartup start
      
      

      如果启动失败:

      ls /usr/local/mycat/logs

      查看mycat.log或者wrapper.log 这里面存储着失败日志记录

    • 安装客户端

      mycat下操作:

      yum install -y mariadb
      

      mariadb只是一个客户端

      如果安装的是mariadb-server ,那么该服务器就是一个数据库服务器了

    • mycat登录测试

      mysql -hmycat -uroot -p123456 -P8066
      
      mycat的工作端口是8066
      
    • 查看数据库

      mysql>show databases;
      
      MySQL [(none)]> show databases;
      +----------+
      | DATABASE |
      +----------+
      | mydb2 |
      +----------+
      1 row in set (0.01 sec)
      
      
      • 看到的数据库是虚拟的。
      • 注意后方mysql群中应该创建该库
  • 在mysql-master1上创库创表

    • create database mydb2;
      
    • create table mydb2.t1 (id int);
      
5、Mycat使用后方数据库
  • 在mycat上

    • select * from mydb2.t1;
      
    • insert into mydb2.t1 values(3);
      
  • 在mysql集群能 查询到数据。实验完成。

案例2
  • 多库时如何设置mycat

请添加图片描述
请添加图片描述

  • 13
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值