• 基于Mycat进行读写分离


    主机IP
    Master 192.168.100.23
    Slave 192.168.100.26
    Mycat 192.168.100.27

    准备工作

    所有主机关闭防火墙和selinux

    systemctl stop firewalld
    setenforce 0

    mycat需要java7以上版本,这里java的版本是1.8,大体说一下步骤,首先下载java1.8的包,然后解压移动到/usr/local,改名为java,然后修改/etc/profile,最后使其生效。
    tar xf jdk-8u191-linux-x64.tar.gz
    mv jdk1.8.0_191/ /usr/local/java
    vim /etc/profile   #末尾添加这两行
        export JAVA_HOME=/usr/local/java
        export PATH=$PATH:$JAVA_HOME/bin
    source /etc/profile
    [root@localhost ]# java -version
    java version "1.8.0_191"
    Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
    Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

    下载mycat,上传到服务器,解压移动到/usr/local/,创建一个mycat用户,并对mycat目录下进行授权

    useradd -M -s /sbin/nologin mycat
    chown -R mycat:mycat /usr/local/mycat/
    [root@localhost ~]# cd /usr/local/mycat/
    [root@localhost mycat]# ll
    总用量 16
    drwxr-xr-x. 2 mycat mycat  190 1月   6 12:18 bin
    drwxrwxrwx. 2 mycat mycat    6 2月  13 2019 catlet
    drwxrwxrwx. 4 mycat mycat 4096 1月   7 11:44 conf
    drwxr-xr-x. 2 mycat mycat 4096 1月   6 12:18 lib
    drwxr-xr-x. 3 mycat mycat   75 1月   6 19:55 logs
    drwxr-xr-x. 2 mycat mycat    6 1月   6 14:10 tmlogs
    -rwxrwxrwx. 1 mycat mycat  185 2月  13 2019 version.txt
    -rw-r--r--. 1 mycat mycat  665 1月   6 14:09 wrapper.log

    若没有logs目录的话,可以手动创建一个,不然mycat启动会报错

    Mycat除了做读写分离外还能做分库分表的操作,这里只说一下读写分离的配置,主要就是修改conf下schema.xml和server.xml

    cd /usr/local/mycat/conf
    vim schema.xml
    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="aaa" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn01">
        </schema>
        <dataNode name="dn01" dataHost="dh1" database="aaa" />
        <dataHost name="dh1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native">
                <heartbeat>select user()</heartbeat>
                <writeHost host="master" url="192.168.100.23:3306" user="root" password="123456">
                    <readHost host="slave" url="192.168.100.26:3306" user="root" password="123456"></readHost>
                </writeHost>
        </dataHost>
    </mycat:schema>
    简单解释一下

    schema标签中的name指的是一个逻辑库,个人建议和真实库名相同;dataNode是节点,用的是dn01节点,与下面相对应
    dataNode标签中的name来定义节点名称,dataHost是指采用的dh1主机,database是采用的库名,这里是真实库名,要有这个库才可以
    dataHost 标签中定义了虚拟主机的名称为dh1,balance=3是指的是开启读写分离,writeHost 是负责写的主机,子标签readHost 是指的负责读操作的主机,url格式为数据库的IP:端口,后面是数据库的连接账号和密码

    server.xml文件配置比较简单,只需要注意schemas要对应schema.xml文件中schema标签中的name

    [root@localhost conf]# vim server.xml
     <user name="root" defaultAccount="true">
                    <property name="password">123456</property>
                    <property name="schemas">aaa</property>

    然后启动mycat

    [root@localhost mycat]# ./bin/mycat start
    Starting Mycat-server...
    netstat -lnpt
    tcp6       0      0 :::8066                 :::*                    LISTEN      1573/java           
    tcp6       0      0 :::9066                 :::*                    LISTEN      1573/java

    9066为管理端口,8066为正常连接端口

    在这里我出了一个错 ,能看到aaa库,但进去很慢,就算进去了,也看不到表,网上乱七八糟的,反正我是这样做的,主从上都做了

    mysql>use mysql;
    
    mysql>update user set host = '%'  where user ='root';
    select user,host from user,
    
    mysql>select 'host','user' from user where user='root';
    
    mysql>quit

    然后就行了。
    不过我估计是因为主库没创建mycat所登陆的用户导致的

    然后进行测试
    master和slave的主从复制就不做了,本次只是看读写分离的效果

    master
    create databases aaa;
    create table user(ID int(10),NAME int(10));
    insert into user values('1','abc');
    select * from aaa.user;
    +------+------+
    | ID   | NAME |
    +------+------+
    |    1 |    0 |
    +------+------+
    slave
    create databases aaa;
    create table user(ID int(10),NAME int(10));
    insert into user values('2','2222');
    select * from user;
    +------+------+
    | ID   | NAME |
    +------+------+
    |    2 | 2222 |
    +------+------+
    登录进行读写分离测试
    mysql -uroot -p123456 -P8066 -h192.168.100.27
    select * from aaa.user;
    +------+------+
    | ID   | NAME |
    +------+------+
    |    2 | 2222 |
    +------+------+
    insert into aaa.user values('3','3333');
    Query OK, 1 row affected (0.19 sec)
    select * from aaa.user;
    +------+------+
    | ID   | NAME |
    +------+------+
    |    2 | 2222 |
    +------+------+

    但是查看Master

    select * from aaa.user;
    +------+------+
    | ID   | NAME |
    +------+------+
    |    1 |    0 |
    |    3 | 3333 |
    +------+------+

    完成

  • 相关阅读:
    JSON.parse()与JSON.stringify()的区别
    响应式布局
    document.selection
    jQuery $.proxy() 方法
    <转> 键值表
    jquery-jqzoom 插件 用例
    jquery 笔记
    前端表单验证常用的15个JS正则表达式<转>
    css 问题解决
    <转>break与continue
  • 原文地址:https://www.cnblogs.com/yuan9910/p/13807619.html
Copyright © 2020-2023  润新知