其他分享
首页 > 其他分享> > Mycat学习笔记

Mycat学习笔记

作者:互联网

1.安装

  1. 下载安装包

    资源地址:http://dl.mycat.org.cn/2.0/

     1.安装程序包:http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip
     2.Jar包:http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies.jar
  2. 将jar包拷贝进安装包lib目录下

  3. 将安装包上传到服务器/usr/local目录下

  4. 修改安装包bin目录下的文件权限

     1.mycat文件
     2.wrapper-linux-ppc-64
     3.wrapper-linux-x86-32
     4.wrapper-linux-x86-64
  5. 修改mycat的prototype的配置

     修改/bin/datasources/目录下的prototypeDs.datasource.json配置文件

     

 

2.启动

  1. 启动命令

     ./mycat start
     ./mycat restart

     

 

 

3.mysql主从复制实践

步骤:

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

     # 主服务器唯一id
     server-id=1
     # 启用二进制文件
     log-bin=mysql-bin
     # 设置不要复制的数据库(可以设置多个)
     binlog-ignore-db=mysql
     binlog-ignore-db=information_schema
     # 设置需要复制的数据库
     binlog-do-db=test
     # 设置binlog格式
     binlog_format=STATEMENT

    主从复制的三种模式:

     statement
     ​
     ​
     row
     ​
     ​
     mixed
  2. 修改从机mysql的配置文件my.cnf

     # 从服务器唯一id
     server-id=2
     # [可选] 启用中继日志
     relay-log=mysql-relay
  3. 在主机为从机创建一个账户,并授权

     # 创建账户并授权
     CREATE USER 'slave1'@'%' IDENTIFIED BY '123456';
     GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';
     # 此语句必须执行
     ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
     flush privileges;
     # 查询master状态
     show master status;
  4. 在从机上执行命令(配置需要复制的主机)

     CHANGE MASTER TO MASTER_HOST ='主机的IP地址',
     MASTER_PORT = 主机端口号
     MASTER_USER = 'slave1',
     MASTER_PASSWORD = '123456',
     MASTER_LOG_FILE = 'mysql-bin.具体数字',
     MASTER_LOG_POS = 具体值;
     ​
     # 启动从服务器复制功能
     start slave;
     ​
     # 查看从服务器状态
     show slave status\G;      
     ​
     # 查看Slave_IO_Runnging和Slave_SQL_Runnging的值是不是Yes,如果不是,可查看Last_IO_Error和Last_SQL_Error字段的值,查看具体原因

 

常见问题:

如果想重新配置,可停下从机复制功能

 # 从服务停止复制功能
 stop slave;
 ​
 # 重置配置的主机信息
 reset master;

 

 

 

4.配置MyCat读写分离

  1. 查看数据源

     /*+ mycat:showDataSources{} */;
  2. 查看集群

     /*+ mycat:showClusters{} */;
  3. 创建数据源

     /*+ mycat:createDataSource{
      "name":"数据源名称",
      "url":"jdbc:mysql://127.0.0.1:3306",
      "user":"root",
      "password":"123456"
     }*/

     

  4. 添加集群配置

    /*! mycat:createCluster{
    "name":"集群名称",
    "masters":["主数据源1",...],
    "replicas":["从数据源1", ...]
    }*/

     

 

5.搭建双主双从双从

关系图

image-20220710085818345

1.master1配置

修改mysql配置文件my.cnf

 # 主服务器唯一id
 server-id=1
 # 启用二进制文件
 log-bin=mysql-bin
 # 设置不要复制的数据库(可以设置多个)
 binlog-ignore-db=mysql
 binlog-ignore-db=information_schema
 # 设置需要复制的数据库
 binlog-do-db=test
 # 设置binlog格式
 binlog_format=STATEMENT
 ​
 # 作为从数据库的时候,写入操作也要更新二进制日志文件
 log-slave-updates
 # 自增长字段每次递增的量,其默认值是1
 auto-increment-increment=2
 # 自增长字段从哪个数开始,指字段一次递增多少,取值范围是1
 auto-increment-offset=1

 

2.master2配置

修改mysql配置文件my.cnf

 # 主服务器唯一id
 server-id=3
 # 启用二进制文件
 log-bin=mysql-bin
 # 设置不要复制的数据库(可以设置多个)
 binlog-ignore-db=mysql
 binlog-ignore-db=information_schema
 # 设置需要复制的数据库
 binlog-do-db=test
 # 设置binlog格式
 binlog_format=STATEMENT
 ​
 # 作为从数据库的时候,写入操作也要更新二进制日志文件
 log-slave-updates
 # 自增长字段每次递增的量,其默认值是1
 auto-increment-increment=2
 # 自增长字段从哪个数开始,指字段一次递增多少,取值范围是1
 auto-increment-offset=2

 

3.slave1配置

修改mysql的配置文件my.cnf

 # 从服务器唯一id
 server-id=2
 # [可选] 启用中继日志
 relay-log=mysql-relay

 

4.slave2配置

修改mysql的配置文件my.cnf

 # 从服务器唯一id
 server-id=4
 # [可选] 启用中继日志
 relay-log=mysql-relay

 

5.各服务器防火墙开放mysql端口

 firewall-cmd --zone=public --add-port=3306/tcp --permanent
 firewall-cmd --reload

 

6.两台主机上建立账户并授权给slave

 # 创建账户并授权
 CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
 GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
 # 此语句必须执行
 ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
 flush privileges;
 # 查询master状态
 show master status;

 

7.各从机上配置需要复制的主机

Slave1复制Master1,Slave2复制Master2

CHANGE MASTER TO MASTER_HOST ='主机的IP地址',
MASTER_PORT = 主机端口号
MASTER_USER = 'slave',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'mysql-bin.具体数字',
MASTER_LOG_POS = 具体值;

# 启动从服务器复制功能
start slave;

# 查看从服务器状态
show slave status\G;

# 查看Slave_IO_Runnging和Slave_SQL_Runnging的值是不是Yes,如果不是,可查看Last_IO_Error和Last_SQL_Error字段的值,查看具体原因

 

8.两个主机相互复制

Master2复制Master1,Master1复制Master2

CHANGE MASTER TO MASTER_HOST ='主机的IP地址',
MASTER_PORT = 主机端口号
MASTER_USER = 'slave',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'mysql-bin.具体数字',
MASTER_LOG_POS = 具体值;

# 启动从服务器复制功能
start slave;

# 查看从服务器状态
show slave status\G;

# 查看Slave_IO_Runnging和Slave_SQL_Runnging的值是不是Yes,如果不是,可查看Last_IO_Error和Last_SQL_Error字段的值,查看具体原因

 

9.修改mycat2的集群配置实现多主多从

1.双主双从集群角色划分
m1:主机
m2:备机,也负责读
s1,s2:从机

 

1.各数据源配置(看情况配置)

cd /usr/local/mycat/conf/datasources

vim master01.datasource.json

vim master02.datasource.json

vim slave01.datasource.json

vim slave02.datasource.json

 {
         "dbType":"mysql",
         "idleTimeout":60000,
         "initSqls":[],
         "initSqlsGetConnection":true,
         "instanceType":"READ_WRITE",
         "maxCon":1000,
         "maxConnectTimeout":3000,
         "maxRetryCount":5,
         "minCon":1,
         "name":"master",
         "password":"root123",
         "type":"JDBC",
         "url":"jdbc:mysql://1.117.226.189:33056/test?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
         "user":"root",
         "weight":0
 }

 

2.修改集群配置

cd /usr/local/mycat/clusters

cp prototype.cluster.json master-slave.cluster.json

vim master-slave.cluster.json

 {
         "clusterType":"MASTER_SLAVE",
         "heartbeat":{
                 "heartbeatTimeout":1000,
                 "maxRetry":3,
                 "minSwitchTimeInterval":300,
                 "slaveThreshold":0
        },
         // 主节点数据源
         "masters":[
                 "master01","master02"
        ],
         // 从节点数据源
         "replicas":[
                "master02","slave-01","slave-02"
        ],
         "maxCon":200,
         // 集群名称
         "name":"master-slave",
         // 负载均衡
         "readBalanceType":"BALANCE_ALL",
         "switchType":"SWITCH"
 }

 

10.重启Mycat

./mycat restart

 

 

 

6.分库分表

垂直拆分:分库

水平拆分:分表

分库原则:有紧密关联关系的表放在同一个库里,相互没有关联关系的表可以分到不同的库里。

 

1.添加数据库、存储数据源

 /*+ mycat:createDataSource{
  "name":"dw0",
  "url":"jdbc:mysql://1.117.226.189:33056",
  "user":"root",
  "password":"root123"
 }*/
 ​
 /*+ mycat:createDataSource{
  "name":"dr0",
  "url":"jdbc:mysql://1.117.226.189:33056",
  "user":"root",
  "password":"root123"
 }*/
 /*+ mycat:createDataSource{
  "name":"dw1",
  "url":"jdbc:mysql://120.76.137.249:33056",
  "user":"root",
  "password":"root123"
 }*/
 ​
 /*+ mycat:createDataSource{
  "name":"dr1",
  "url":"jdbc:mysql://120.76.137.249:33056",
  "user":"root",
  "password":"root123"
 }*/

 

通过注释命令添加数据源后,会在对应的目录生成相关的配置文件

cd /usr/local/mycat/conf/datasources

如图:

image-20220710190012368

 

2.添加集群配置

在mycat执行命令:

 /*! mycat:createCluster{
  "name":"c0",
  "masters":["dw0"],
  "replicas":["dr0"]
 }*/
 ​
 /*! mycat:createCluster{
  "name":"c1",
  "masters":["dw1"],
  "replicas":["dr1"]
 }*/

在对应的目录可查看配置

cd /usr/local/mycat/conf/clusters

如图:

image-20220710190654480

 

3.在mycat上创建逻辑库

 create DATABASE db1;

对应的mycat的配置文件:

cd /usr/local/mycat/conf/datasources

如图:

image-20220710191445090

 

4.广播表(全局表)的创建

mycat只需要在建表语句最后加上BROADCAST关键字

 CREATE TABLE db1.`user` (
   `id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
   `name` varchar(255) DEFAULT NULL COMMENT '姓名',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 BROADCAST

 

5.数据分片

dbpartition BY mod_hash(order_no) tbpartition BY mod_hash(order_no) tbpartitions 1 dbpartitions 2

数据库根据用户id取模分片,数据表根据用户id取模分片,数据库分2个,数据表在每个数据库里分1个

 CREATE TABLE db1.`orders` (
   `id` int NOT NULL COMMENT 'id',
   `order_no` varchar(255) DEFAULT NULL COMMENT '订单号',
   `user_id` int DEFAULT NULL COMMENT '用户id',
   `amount` decimal(12, 2) DEFAULT NULL COMMENT '金额',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
 dbpartition BY mod_hash(user_id) tbpartition BY mod_hash(user_id) tbpartitions 1 dbpartitions 2
 ​
 ​
 -- 插入数据
 insert into db1.`orders` (id, order_no, user_id, amount) VALUES (1,"101", 4, 432.12);
 insert into db1.`orders` (id, order_no, user_id, amount) VALUES (2,"102", 4, 543.34);
 insert into db1.`orders` (id, order_no, user_id, amount) VALUES (3,"103", 4, 543.33);
 insert into db1.`orders` (id, order_no, user_id, amount) VALUES (4,"104", 5, 754.74);
 insert into db1.`orders` (id, order_no, user_id, amount) VALUES (5,"105", 5, 937.23);
 insert into db1.`orders` (id, order_no, user_id, amount) VALUES (6,"106", 5, 342.34);
 ​
 -- 查询数据
 select * from order;

 

6.创建ER表

与分片表关联的表如何分表,也就是ER表如何分表,如下

 CREATE TABLE db1.`order_details` (
   `id` int NOT NULL AUTO_INCREMENT COMMENT 'id',
   `order_id` int DEFAULT NULL COMMENT '订单id',
   `detail` varchar(128) DEFAULT NULL COMMENT '详情',
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
 dbpartition BY mod_hash(order_id) tbpartition BY mod_hash(order_id) tbpartitions 1 dbpartitions 2
 ​
 ​
 # 插入数据
 insert into order_details(id, order_id, detail) VALUES(1, 1, 'detail');
 insert into order_details(id, order_id, detail) VALUES(2, 2, 'detail');
 insert into order_details(id, order_id, detail) VALUES(3, 3, 'detail');
 insert into order_details(id, order_id, detail) VALUES(4, 4, 'detail');
 insert into order_details(id, order_id, detail) VALUES(5, 5, 'detail');
 insert into order_details(id, order_id, detail) VALUES(6, 6, 'detail');
 ​
 # 关联查询
 select * from order o INNER JOIN order_details od on o.id = od.order_id;

 

查看配置的表是否具有ER关系,使用以下执行语句:

 /*+ mycat:showErGroup{}*/

group_id表示相同的组,改组中的表具有相同的存储分布

 

 

7.常用分片规则

mycat2支持常用的(自动)HASH型分片算法,也兼容1.6的内置(cobar)分片算法.

HASH型分片算法默认要求集群名字以c开头为前缀,数字为后缀,c0就是就是分片表第一个节点,c1就是第二个节点,改命名规则允许用户手动改变.

标签:slave,笔记,id,学习,mycat,mysql,MASTER,Mycat,order
来源: https://www.cnblogs.com/zhouqiangshuo/p/16511978.html