本文详细介绍了实战化部署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)]>
测试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]>
此时去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创建的表内容。
上面的步骤创建为写操作,无法判断读写分离的情况,现在两个从库上插入新的数据。由于是主从架构,在从库上的操作不会同步到主库上,如果使用mycat查询可以查询到在从库插入的数据,表示mycat读数据库的时候是走的从库,从而证明读写佢分离成功。
#分别在从库上操作
insert into t1 values (003,'test_test',33,'test');
此时在登录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
来源:本文内容搜集或转自各大网络平台,并已注明来源、出处,如果转载侵犯您的版权或非授权发布,请联系小编,我们会及时审核处理。
声明:江苏教育黄页对文中观点保持中立,对所包含内容的准确性、可靠性或者完整性不提供任何明示或暗示的保证,不对文章观点负责,仅作分享之用,文章版权及插图属于原作者。
Copyright©2013-2024 JSedu114 All Rights Reserved. 江苏教育信息综合发布查询平台保留所有权利
苏公网安备32010402000125
苏ICP备14051488号-3技术支持:南京博盛蓝睿网络科技有限公司
南京思必达教育科技有限公司版权所有 百度统计