mysql主从和mycat初体验

???

咱也不知道学这玩意干嘛- -要不是因为招聘上面写了要会这个我真不想学!!!🙄

mysql主从配置

首先准备一台虚拟机,里面装上docker。或者你准备两台上面直接装mysql也行,我这图个方便用docker。

接着准备下mysql的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
# 主要的配置就下面俩
# 二进制log(master必须,slave非必须
log-bin=yuuki_log
# 主从的id要不一致
server-id=1
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

然后启动俩mysql实例,这边只放一个命令,注意自己改下端口,映射文件目录,容器名

1
2
3
4
5
6
docker run \
--name mysql \
-p3306:3306 \
-v /root/mysql/my1.cnf:/etc/mysql/my.cnf \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7.29

启动完成后用工具连上,我们先进入master做一些配置

  1. 新建一个用户用户主从连接时

    1
    2
    3
    create USER 'repl'@'%' IDENTIFIED by 'yuuki@123456';
    GRANT replication slave on *.* to 'repl'@'%';
    FLUSH PRIVILEGES;
  2. 锁表,并把master的数据库、表和数据同步到slave(我这边直接用Navicat同步了,也可以用别的比如mysqldump)

    1
    2
    FLUSH TABLES WITH READ LOCK;
    UNLOCK TABLES;
  3. 同步完成后解锁,然后查看下master节点状态

    1
    show MASTER status;

    可以看到下图,注意file和pos,待会会用到
    1

  4. 配置从节点
    1
    2
    3
    4
    5
    6
    7
    8
    change MASTER to
    master_host='192.168.56.101',
    master_user='repl',
    master_password='yuuki@123456',
    master_log_file='yuuki_log.000003',
    master_port=33060,
    master_log_pos=1496;
    START SLAVE;

发现没,我们指定得log-file和log—pos都是上面查出来的东东,之前新建的用户现在也派上用场了。没问题的话现在在master的表里插一条数据刷新从节点就能看到主节点插的那条数据了!

mycat

mycat就先简单的使用下,官方那个pdf很不错的。

  1. 准备虚拟机

    |ip|备注|
    |—|—|
    192.169.56.101|mysql
    192.169.56.101|mysql
    192.169.56.101|mycat

    就用这三台先玩玩

  2. 下载安装mycat(mycat.io)
  3. 修改配置文件(在conf目录下)

    server.xml(这边主要就是配置下用户名,schemas会对应下面schema.xml里的配置)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <user name="root" defaultAccount="true">
    <property name="password">123456</property>
    <property name="schemas">user</property>
    <property name="defaultSchema">user</property>
    <!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
    </user>

    <user name="user">
    <property name="password">user</property>
    <property name="schemas">user</property>
    <property name="readOnly">true</property>
    <property name="defaultSchema">user</property>
    </user>

    server.xml(配置数据库连接,表,分库分表规则等)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <!-- schema配置表,rule指向rule.xml就是分表规则这边选用的这个是根据id大小分,还有别的日后再说 -->
    <schema name="user" checkSQLschema="true" sqlMaxLimit="100">
    <table name="user" primaryKey="id" dataNode="dn1,dn2" rule="auto-sharding-long">
    <!--<childTable name="customer_addr" primaryKey="id" joinKey="customer_id" parentKey="id"> </childTable>-->
    </table>
    </schema>
    <!-- dataNode配置数据库,dataHost属性只想dataHost节点 -->
    <dataNode name="dn1" dataHost="101" database="user" />
    <dataNode name="dn2" dataHost="102" database="user" />
    <!-- dataHost配置mysql连接,里面还能配置读节点什么的具体看官方指导 -->
    <dataHost name="101" 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="192.168.56.101" url="jdbc:mysql://192.168.56.101:3306" user="root"
    password="root">
    </writeHost>
    <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
    </dataHost>

    <dataHost name="102" 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="192.168.56.102" url="jdbc:mysql://192.168.56.102:3306" user="root"
    password="root">
    </writeHost>
    <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
    </dataHost>

    rule.xml(这边都是一些分库分表的规则)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!-- 这段就是我们在schema配置的规则,algorithm指向下面的function节点 -->
    <tableRule name="auto-sharding-long">
    <rule>
    <columns>id</columns>
    <algorithm>rang-long</algorithm>
    </rule>
    </tableRule>
    <!-- 可以看到这边配置映射到了一个txt文件 -->
    <function name="rang-long"
    class="io.mycat.route.function.AutoPartitionByLong">
    <property name="mapFile">autopartition-long.txt</property>
    </function>

    autopartition-long.txt(rule.xml映射的文件)

    1
    2
    3
    4
    5
    # range start-end ,data node index
    # K=1000,M=10000.
    0-500M=0
    500M-1000M=1
    #1000M-1500M=2

    配置的就是主键0-500万会存到第一个库,500万到1000万会存到第二个库,第三个我们先注释掉因为我们只有俩

  4. 启动mycat(在bin目录下,先用console启动这样可以看到启动日志)

    1
    mycat console
  5. 用工具连接(端口8066)

这样就好了,在mycat插入一条id落在0-500万的数据,去101数据库查看,再插入一条id落在500万-1000万的数据去102查看,没毛病的话就算完了。

end…