• 当前位置: 首 页 > 教育百科 > 学历/技能 > 正文

    实战:MySQL一主两从+MyCAT读写分离

    :2025年02月11日
    linux运维之路

    本文详细介绍了实战化部署MySQL+MYCAT读写分离的过程,包括环境的搭建、三台Docker容器的创建、my.cnf文件的复制和编辑、重启容器和再次修改my.cnf的步骤。在环境配置上,需要确保每个容器的id必须唯一且...

    实战MYSQL+MYCAT读写分离实战,实现MYSQL数据库1主2从架构。以下为详细部署过程:

    mysql的一主两从环境:

    1、由于我主机硬件条件限制,环境使用docker容器的方式部署,其它环境类同,仅需要把容器的ip改为实际的ip地址即可,其它操作一样;

    2、启动3台docker容器,镜像为mysql8.0:

    docker run -d --name=mysql8_01 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

    docker run -d --name=mysql8_02 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

    docker run -d --name=mysql8_03 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

    3、使用docker cp命令把mysql8_01里的my.cnf文件复制出来备用:

    docker cp mysql8_01:/etc/my.cnf ./

    #文件复制出来后编辑my.cnf文件(分3次,每一次不可混淆):

    vi my.cnf

    #在[mysqld]字段后面加入如下内容:

    server-id = 1 #此id在三个容器里必须唯一,不得重复,否则会报错。

    log-bin = mysql-bin

    #保存文件后使用docker cp命令复制到mysql8_01容器原来位置:

    docker cp my.cnf mysql8_01:/etc/

    #重启容器:

    docker restart mysql8_01

    #再次修改my.cnf

    #在[mysqld]字段后面加入如下内容:

    server-id = 2 #此id在三个容器里必须唯一,不得重复,否则会报错。

    #保存文件后使用docker cp命令复制到mysql8_02容器原来位置:

    docker cp my.cnf mysql8_02:/etc/

    #重启容器:

    docker restart mysql8_02

    #再次修改my.cnf

    #在[mysqld]字段后面加入如下内容:

    server-id = 3 #此id在三个容器里必须唯一,不得重复,否则会报错。

    #保存文件后使用docker cp命令复制到mysql8_03容器原来位置:

    docker cp my.cnf mysql8_03:/etc/

    #重启容器:

    docker restart mysql8_03

    4、进入mysql8_01容器查看其master status:

    docker exec -it mysql8_01 /bin/bash

    #登录本容器的mysql server

    mysql -u root -p -h 127.0.0.1

    #在mysql server进入如下操作:

    mysql>CREATE USER 'tongbu'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

    mysql>GRANT REPLICATION SLAVE ON *.* TO 'tongbu'@'%';

    #查看master状态:

    mysql>show master status\G;

    *************************** 1. row ***************************

    File: mysql-bin.000001

    Position: 1578

    5、退出mysql8_01进入mysql8_02容器:

    docker exec -it mysql8_02 /bin/bash

    bash-4.4# mysql -u root -p

    #在mysql server进入如下操作:

    mysql>change master to

    master_host='172.17.0.2',master_port=3306,master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1578;

    #启动slave:

    start slave;

    #查看状态,确保标红处的两个Yes,如果是No需要排错才能继续:

    show slave status\G;

    *************************** 1. row ***************************

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

    6、退出mysql8_02进入mysql8_03容器:

    docker exec -it mysql8_03 /bin/bash

    bash-4.4# mysql -u root -p

    #在mysql server进入如下操作:

    mysql>change master to

    master_host='172.17.0.2',master_port=3306,master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1578;

    #启动slave:

    start slave;

    #查看状态,确保标红处的两个Yes,如果是No需要排错才能继续:

    show slave status\G;

    *************************** 1. row ***************************

    Slave_IO_Running: Yes

    Slave_SQL_Running: Yes

    7、此时试验在mysql8_01容器上进行mysql的增删改,mysql8_02和mysql8_03均会自动同步;

    mycat的部署:

    为学习mycat的部署过程,不使用现有的mycat镜像,先构建一个可以ssh的centos7:

    FROM freedoms1988/centos7-sshd

    MAINTAINER wulvcan

    RUN rm -rf /etc/yum.repos.d/epel*

    RUN ssh-keygen -A

    RUN echo "abc123ABC" | passwd --stdin root

    RUN sed -i -e '/DNS/s/#//g' -e '/DNS/s/yes/no/g' /etc/ssh/sshd_config

    ENTRYPOINT /usr/sbin/init

    CMD /usr/sbin/sshd -D

            构建新的镜像:

    #需要在上一步创建的Dockerfile文件所在的目录执行

    docker build -t centos-ssh:v1 .

            使用新构建的镜像运行一个容器:

    docker run -d --name=centos7 --privileged=true centos-ssh:v1

    a8628fb36ec2d943c3a6e0b0391d4a1aa56c51889c91cba3f0edb48104277f4c

    root@wulvcan:~#docker inspect centos7 | grep IPAddress

    "SecondaryIPAddresses": null,

    "IPAddress": "172.17.0.5",

    "IPAddress": "172.17.0.5",

    #使用ssh登录172.17.0.5

    root@wulvcan:~# ssh root@172.17.0.5

    root@172.17.0.5's password:

    [root@a8628fb36ec2 ~]#

    mycat是java语言开发的,所以安装mycat前,需要先安装JDK(jave环境,,此处安装JDK8.0:

    #下载地址https://www.oracle.com/java/technologies/downloads/#java8,需要注册账号。

    #为了加快实验速度,下面使用群共享的文件jdk1.8.0_131.tar.gz

    #把tar包放在/usr/local/java目录下,解压。

    mkdir -p /usr/local/java

    mv jdk1.8.0_131.tar.gz /usr/local/java

    cd /usr/local/java

    tar -xvf jdk1.8.0_131.tar.gz

    创建java环境变量,修改/etc/profile文件:

    #在文件尾部加入如下内容(注意路径要与实际相符):

    export JAVA_HOME=/usr/local/jave/jdk1.8.0_131

    export JRE_HOME=${JAVA_HOME}/jre

    #export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

    #export PATH=${JAVA_HOME}/bin:$PATH

    export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar

    export PATH=$PATH:${JAVA_HOME}/bin

    重新加载profile文件:

    source /etc/profile

            查看java环境:

    java -version

    java version "1.8.0_131"

    Java(TM) SE Runtime Environment (build 1.8.0_131-b11)

    Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

            下载mycat运行包:http://dl.mycat.org.cn/2.0/install-template/

    wget http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip

            下载mycat的jar依赖包:http://dl.mycat.org.cn/2.0/1.20-release/

    wget http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies2022-5-5.jar

            解压mycat运行包,并移动至/usr/local目录下:

    unzip mycat2-install-template-1.21.zip

    mv mycat/ /usr/local/

    #复制mycat依赖包mycat2-1.21-release-jar-with-dependencies2022-5-5.jar

    #mycat2-1.21-release-jar-with-dependencies2022-5-5.jar到/usr/local/mycat/lib/目录

    cp mycat2-1.21-release-jar-with-dependencies2022-5-5.jar /usr/local/mycat/lib/

    #把/usr/local/mycat/bin目录下的所有文件加执行权限

    chmod a+x /usr/local/mycat/bin/*

    在mysql创建一个mycat账号用于后继的登录(也可以使用root账号,此处使用root账号)。在mysql上创建一个mycat的原型库,mycat在启动时会在此原型库上创建运行所需的各种表数据,此库必须提前手动创建,否则mycat在启动时会报错。

    #在容器mysql8_01上创建:

    create database mycat;

    Query OK, 1 row affected (0.10 sec)

    #此时可以查看两个从库是否同步了主库的数据,作为验证一主两从架构是否正确

    创建原型库的数据源,此步骤也必须创建,否则mycat启动时会报错:

    cd /usr/local/mycat/conf/datasources/

    #编辑该json文件,注意修改的位置,如果上一步创建了mycat账号,这里的用户名要改为mycat账号名

    vim prototypeDs.datasource.json

    {

    "dbType":"mysql",

    "idleTimeout":60000,

    "initSqls":[],

    "initSqlsGetConnection":true,

    "instanceType":"READ_WRITE",

    "maxCon":1000,

    "maxConnectTimeout":3000,

    "maxRetryCount":5,

    "minCon":1,

    "name":"prototypeDs",

    "password":"123456",

    "type":"JDBC",

    "url":"jdbc:mysql://172.17.0.2:3306/mycat?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",        "user":"root",

    "weight":0

    }

            在同一目录下生成master和slave配置文件:

    cp prototypeDs.datasource.json master.datasource.json

    #由于有两个从库,需要生成2个slave配置文件,名称可以任意,最好方便记忆,后面配置过程会用到

    cp prototypeDs.datasource.json slave-01.datasource.json

    cp prototypeDs.datasource.json slave-02.datasource.json

            分别修改3个配置文件:

            vi master.datasource.json

            name改为master,ip为mysql8_01容器的ip,读写分离数据库为test001(需要提前创建好)

            vi slave-01.datasource.json

            instanceType改为READ表示只读不写,name改为slave-01,ip为mysql8_02容器的ip,读写分离数据库为test001

            vi slave-02.datasource.json

            instanceType改为READ表示只读不写,name改为slave-02,ip为mysql8_03容器的ip,读写分离数据库为test001

            添加数据库test001的数据源的集群信息,此步骤必须操作,如果多个主或者多个从,需要用逗号分隔:

    cd /usr/local/mycat/conf/clusters/

    #复制创建一个新文件

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

    vi master-slave.cluster.json

    #修改为以下内容:

    {

    "clusterType":"MASTER_SLAVE",

    "heartbeat":{

    "heartbeatTimeout":1000,

    "maxRetry":3,

    "minSwitchTimeInterval":300,

    "slaveThreshold":0

    },

    "masters":[

    "master"

    ],

    "replicas":[

    "slave-01",

    "slave-02"

    ],

    "maxCon":5000,

    "name":"master-slave",

    "readBalanceType":"BALANCE_ALL",

    "switchType":"NOT_SWITCH"

    }

            配置物理数据库和mycat中数据源/数据源集群的关系,此步骤必须操作

    cp mysql.schema.json test001.schema.json

    #在test001.schema.json输入以下内容,原内容全部清空

    {

    "schemaName": "test001",

    "targetName": "master-slave",

    "normalTables": {}

    }

            修改登录用户信息,此步骤必须操作

    cd /usr/local/mycat/conf/users/

    vi root.user.json

    #修改登录的用户名和密码,此处用root用户,如果是别的用户需要更改为对应的密码

    #"transactionType":"xa",表示支持事务类型(具体还不明白)

    {

    "dialect":"mysql",

    "ip":null,

    "password":"123456",

    "transactionType":"xa",

    "username":"root"

    }

            如有需要,修改mycat的监听端口,在server.json里修改,此处使用默认的8066端口

            万事具备,只欠最后一步启动:

    [root@a8628fb36ec2 bin]# /usr/local/mycat/bin/mycat start

    Starting mycat2...

            查看启动日志,如日志有started up提示,表示mycat已经正常启动

    [root@a8628fb36ec2 bin]# tail /usr/local/mycat/logs/

    mycat.pid    wrapper.log

    [root@a8628fb36ec2 bin]# tail /usr/local/mycat/logs/wrapper.log

    INFO   | jvm 1    | 2022/08/27 08:40:55 | 2022-08-27 08:40:55,824[INFO]com.alibaba.druid.pool.DruidDataSource.init:990{dataSource-2} inited

    INFO   | jvm 1    | 2022/08/27 08:40:58 | 2022-08-27 08:40:58,688[INFO]io.mycat.config.MycatRouterConfigOps.recoveryXA:735readXARecoveryLog start

    INFO   | jvm 1    | 2022/08/27 08:40:58 | 2022-08-27 08:40:58,872[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:119Mycat Vertx server e302ad53-7d70-4d53-b1d0-fcd966fd631c started up.

    INFO   | jvm 1    | 2022/08/27 08:40:58 | 2022-08-27 08:40:58,873[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:119Mycat Vertx server b149a5a3-d1a5-43d7-9131-593373bca64e started up.

    INFO   | jvm 1    | 2022/08/27 08:40:58 | 2022-08-27 08:40:58,873[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:119Mycat Vertx server 7d3fb2ab-ad0f-44f3-b339-aa601dd3c9a0 started up.

    INFO   | jvm 1    | 2022/08/27 08:40:58 | 2022-08-27 08:40:58,874[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:119Mycat Vertx server 6eb7c8e7-eff4-4adc-8387-534287f13555 started up.

    INFO   | jvm 1    | 2022/08/27 08:40:58 | 2022-08-27 08:40:58,874[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:119Mycat Vertx server 44a16fc0-68fc-4bac-9e09-f12ecc67e67a started up.

    INFO   | jvm 1    | 2022/08/27 08:40:58 | 2022-08-27 08:40:58,874[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:119Mycat Vertx server c3f9733c-720b-42bc-9297-cf76d7efce52 started up.

    INFO   | jvm 1    | 2022/08/27 08:40:58 | 2022-08-27 08:40:58,874[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:119Mycat Vertx server 9345b7a0-86ca-435b-a792-87b67df1fa65 started up.

    INFO   | jvm 1    | 2022/08/27 08:40:58 | 2022-08-27 08:40:58,875[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:119Mycat Vertx server 4688e2b0-5fb2-4ce2-be46-053c7d73e1ee started up.

            查看监听端口,可以看到有8066监听

            查看java进程:

            如果没有java进程,需要检查java是否正常启动:java -version,做相应的排错工作。

            使用telnet命令测试8066端口,如没有telnet命令可用yum install telnet安装

    [root@a8628fb36ec2 /]# telnet 127.0.0.1 8066

    Trying 127.0.0.1...

    Connected to 127.0.0.1.

    Escape character is '^]'.

    T

    5.7.33-mycat-2.0ZXHVkHTqwWZwnCwYcMhmysql_native_password

    #表示8066端口已经通了

    #使用ctrl+] 组合键退出telnet命令行界面。

            登陆mycat测试

    mysql -uroot -p -P 8066 -h 127.0.0.1

    Server version: 5.7.33-mycat-2.0 MySQL Community Server - GPL

    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    MySQL [(none)]>

    1. 测试mycat的读写分离

    #登陆mycat

    mysql -uroot -p -P 8066 -h 127.0.0.1

    MySQL [(none)]> use test001;

    Database changed

    MySQL [test001]>

    MySQL [test001]> show tables;

    Empty set (0.00 sec)

    MySQL [test001]>

    #可以看到默认没有表,测试创建一个表

    MySQL [test001]> create table t1(id char(100),name varchar(100),age char(20),job char(20));

    Query OK, 0 rows affected (1.49 sec)

    MySQL [test001]>

    MySQL [test001]> show tables;

    +-------------------+

    | Tables_in_test001 |

    +-------------------+

    | t1                |

    +-------------------+

    1 row in set (0.14 sec)

    MySQL [test001]>

    MySQL [test001]> desc t1;

    +-------+--------------+------+-----+---------+-------+

    | Field | Type         | Null | Key | Default | Extra |

    +-------+--------------+------+-----+---------+-------+

    | id    | char(100)    | YES  |     | NULL    |       |

    | name  | varchar(100) | YES  |     | NULL    |       |

    | age   | char(20)     | YES  |     | NULL    |       |

    | job   | char(20)     | YES  |     | NULL    |       |

    +-------+--------------+------+-----+---------+-------+

    4 rows in set (0.12 sec)

    MySQL [test001]>

    #测试在该表插入内容:

    MySQL [test001]> insert into t1 values (001,'wulvcan',18,'IT');

    Query OK, 1 row affected (0.08 sec)

    MySQL [test001]> insert into t1 values (002,'laowu',48,'IT');

    Query OK, 1 row affected (0.02 sec)

    MySQL [test001]>

    MySQL [test001]> select * from t1;

    +------+---------+------+------+

    | id   | name    | age  | job  |

    +------+---------+------+------+

    | 1    | wulvcan | 18   | IT   |

    | 2    | laowu   | 48   | IT   |

    +------+---------+------+------+

    2 rows in set (0.08 sec)

    MySQL [test001]>

    1. 此时去mysql8_01容器登陆mysql查看:

    mysql> show databases;

    +--------------------+

    | Database           |

    +--------------------+

    | information_schema |

    | mycat              |

    | mysql              |

    | nibu               |

    | performance_schema |

    | sys                |

    | test001            |

    +--------------------+

    7 rows in set (0.00 sec)

    mysql> use test001;

    Reading table information for completion of table and column names

    You can turn off this feature to get a quicker startup with -A

    Database changed

    mysql> select * from t1;

    +------+---------+------+------+

    | id   | name    | age  | job  |

    +------+---------+------+------+

    | 1    | wulvcan | 18   | IT   |

    | 2    | laowu   | 48   | IT   |

    +------+---------+------+------+

    2 rows in set (0.00 sec)

    #可以看到刚才在mycat创建的数据库及表和表内容

    在从库(mysql8_02和mysql8_03)上登陆查询:

    mysql> use test001;

    Reading table information for completion of table and column names

    You can turn off this feature to get a quicker startup with -A

    Database changed

    mysql> select * from t1;

    +------+---------+------+------+

    | id   | name    | age  | job  |

    +------+---------+------+------+

    | 1    | wulvcan | 18   | IT   |

    | 2    | laowu   | 48   | IT   |

    +------+---------+------+------+

    2 rows in set (0.00 sec)

    #两台从库上均可以查询到mycat创建的表内容。

    1. 上面的步骤创建为写操作,无法判断读写分离的情况,现在两个从库上插入新的数据。由于是主从架构,在从库上的操作不会同步到主库上,如果使用mycat查询可以查询到在从库插入的数据,表示mycat读数据库的时候是走的从库,从而证明读写佢分离成功。

    #分别在从库上操作

    insert into t1 values (003,'test_test',33,'test');

    1. 此时在登录mycat查询,可以看到从库上的数据表示是在从库上读取的信息:

    [root@a8628fb36ec2 /]# mysql -uroot -p -P 8066 -h 127.0.0.1

    Enter password:

    Welcome to the MariaDB monitor.  Commands end with ; or \g.

    Your MySQL connection id is 1

    Server version: 5.7.33-mycat-2.0 MySQL Community Server - GPL

    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    MySQL [(none)]> use test001

    Reading table information for completion of table and column names

    You can turn off this feature to get a quicker startup with -A

    Database changed

    MySQL [test001]> select * from t1;

    +------+-----------+------+------+

    | id   | name      | age  | job  |

    +------+-----------+------+------+

    | 1    | wulvcan   | 18   | IT   |

    | 2    | laowu     | 48   | IT   |

    | 3    | test_test | 33   | test |

    +------+-----------+------+------+

    3 rows in set (0.05 sec)

    MySQL [test001]>

    至此,mycat实现mysql读写分离。

    原文来源:https://mp.weixin.qq.com/s/J_p01l12cIcplF4s01R-sQ

    [编辑:宋聪乔 &发表于江苏]
    [我要纠错]

    来源:本文内容搜集或转自各大网络平台,并已注明来源、出处,如果转载侵犯您的版权或非授权发布,请联系小编,我们会及时审核处理。
    声明:江苏教育黄页对文中观点保持中立,对所包含内容的准确性、可靠性或者完整性不提供任何明示或暗示的保证,不对文章观点负责,仅作分享之用,文章版权及插图属于原作者。

    关键词: 实战 MYSQL+MYCAT 读写 分离 实战
    有价值
    0
    无价值
    0
    猜您喜欢
    最热文章

    暂不支持手机端,请登录电脑端访问

    正在加载验证码......

    请先完成验证