实战: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

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

Copyright©2013-2024 JSedu114 All Rights Reserved. 江苏教育信息综合发布查询平台保留所有权利

苏公网安备32010402000125 苏ICP备14051488号-3技术支持:南京博盛蓝睿网络科技有限公司

南京思必达教育科技有限公司版权所有   百度统计

最热文章
最新文章
  • 阿里云上云钜惠,云产品享最低成本,有需要联系,
  • 卡尔蔡司镜片优惠店,镜片价格低
  • 苹果原装手机壳