本文詳細(xì)介紹了實(shí)戰(zhàn)化部署MySQL+MYCAT讀寫(xiě)分離的過(guò)程,包括環(huán)境的搭建、三臺(tái)Docker容器的創(chuàng)建、my.cnf文件的復(fù)制和編輯、重啟容器和再次修改my.cnf的步驟。在環(huán)境配置上,需要確保每個(gè)容器的id必須唯一且...
實(shí)戰(zhàn)MYSQL+MYCAT讀寫(xiě)分離實(shí)戰(zhàn),實(shí)現(xiàn)MYSQL數(shù)據(jù)庫(kù)1主2從架構(gòu)。以下為詳細(xì)部署過(guò)程:
mysql的一主兩從環(huán)境:
1、由于我主機(jī)硬件條件限制,環(huán)境使用docker容器的方式部署,其它環(huán)境類同,僅需要把容器的ip改為實(shí)際的ip地址即可,其它操作一樣;
2、啟動(dòng)3臺(tái)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文件復(fù)制出來(lái)備用:
docker cp mysql8_01:/etc/my.cnf ./
#文件復(fù)制出來(lái)后編輯my.cnf文件(分3次,每一次不可混淆):
vi my.cnf
#在[mysqld]字段后面加入如下內(nèi)容:
server-id = 1 #此id在三個(gè)容器里必須唯一,不得重復(fù),否則會(huì)報(bào)錯(cuò)。
log-bin = mysql-bin
#保存文件后使用docker cp命令復(fù)制到mysql8_01容器原來(lái)位置:
docker cp my.cnf mysql8_01:/etc/
#重啟容器:
docker restart mysql8_01
#再次修改my.cnf
#在[mysqld]字段后面加入如下內(nèi)容:
server-id = 2 #此id在三個(gè)容器里必須唯一,不得重復(fù),否則會(huì)報(bào)錯(cuò)。
#保存文件后使用docker cp命令復(fù)制到mysql8_02容器原來(lái)位置:
docker cp my.cnf mysql8_02:/etc/
#重啟容器:
docker restart mysql8_02
#再次修改my.cnf
#在[mysqld]字段后面加入如下內(nèi)容:
server-id = 3 #此id在三個(gè)容器里必須唯一,不得重復(fù),否則會(huì)報(bào)錯(cuò)。
#保存文件后使用docker cp命令復(fù)制到mysql8_03容器原來(lái)位置:
docker cp my.cnf mysql8_03:/etc/
#重啟容器:
docker restart mysql8_03
4、進(jìn)入mysql8_01容器查看其master status:
docker exec -it mysql8_01 /bin/bash
#登錄本容器的mysql server
mysql -u root -p -h 127.0.0.1
#在mysql server進(jìn)入如下操作:
mysql>CREATE USER 'tongbu'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
mysql>GRANT REPLICATION SLAVE ON *.* TO 'tongbu'@'%';
#查看master狀態(tài):
mysql>show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000001
Position: 1578
5、退出mysql8_01進(jìn)入mysql8_02容器:
docker exec -it mysql8_02 /bin/bash
bash-4.4# mysql -u root -p
#在mysql server進(jìn)入如下操作:
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;
#啟動(dòng)slave:
start slave;
#查看狀態(tài),確保標(biāo)紅處的兩個(gè)Yes,如果是No需要排錯(cuò)才能繼續(xù):
show slave status\G;
*************************** 1. row ***************************
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
6、退出mysql8_02進(jìn)入mysql8_03容器:
docker exec -it mysql8_03 /bin/bash
bash-4.4# mysql -u root -p
#在mysql server進(jìn)入如下操作:
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;
#啟動(dòng)slave:
start slave;
#查看狀態(tài),確保標(biāo)紅處的兩個(gè)Yes,如果是No需要排錯(cuò)才能繼續(xù):
show slave status\G;
*************************** 1. row ***************************
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
7、此時(shí)試驗(yàn)在mysql8_01容器上進(jìn)行mysql的增刪改,mysql8_02和mysql8_03均會(huì)自動(dòng)同步;
mycat的部署:
為學(xué)習(xí)mycat的部署過(guò)程,不使用現(xiàn)有的mycat鏡像,先構(gòu)建一個(gè)可以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
構(gòu)建新的鏡像:
#需要在上一步創(chuàng)建的Dockerfile文件所在的目錄執(zhí)行
docker build -t centos-ssh:v1 .
使用新構(gòu)建的鏡像運(yùn)行一個(gè)容器:
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語(yǔ)言開(kāi)發(fā)的,所以安裝mycat前,需要先安裝JDK(jave環(huán)境,,此處安裝JDK8.0:
#下載地址https://www.oracle.com/java/technologies/downloads/#java8,需要注冊(cè)賬號(hào)。
#為了加快實(shí)驗(yàn)速度,下面使用群共享的文件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
創(chuàng)建java環(huán)境變量,修改/etc/profile文件:
#在文件尾部加入如下內(nèi)容(注意路徑要與實(shí)際相符):
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環(huán)境:
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運(yùn)行包: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運(yùn)行包,并移動(dòng)至/usr/local目錄下:
unzip mycat2-install-template-1.21.zip
mv mycat/ /usr/local/
#復(fù)制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目錄下的所有文件加執(zhí)行權(quán)限
chmod a+x /usr/local/mycat/bin/*
在mysql創(chuàng)建一個(gè)mycat賬號(hào)用于后繼的登錄(也可以使用root賬號(hào),此處使用root賬號(hào))。在mysql上創(chuàng)建一個(gè)mycat的原型庫(kù),mycat在啟動(dòng)時(shí)會(huì)在此原型庫(kù)上創(chuàng)建運(yùn)行所需的各種表數(shù)據(jù),此庫(kù)必須提前手動(dòng)創(chuàng)建,否則mycat在啟動(dòng)時(shí)會(huì)報(bào)錯(cuò)。
#在容器mysql8_01上創(chuàng)建:
create database mycat;
Query OK, 1 row affected (0.10 sec)
#此時(shí)可以查看兩個(gè)從庫(kù)是否同步了主庫(kù)的數(shù)據(jù),作為驗(yàn)證一主兩從架構(gòu)是否正確
創(chuàng)建原型庫(kù)的數(shù)據(jù)源,此步驟也必須創(chuàng)建,否則mycat啟動(dòng)時(shí)會(huì)報(bào)錯(cuò):
cd /usr/local/mycat/conf/datasources/
#編輯該json文件,注意修改的位置,如果上一步創(chuàng)建了mycat賬號(hào),這里的用戶名要改為mycat賬號(hào)名
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
#由于有兩個(gè)從庫(kù),需要生成2個(gè)slave配置文件,名稱可以任意,最好方便記憶,后面配置過(guò)程會(huì)用到
cp prototypeDs.datasource.json slave-01.datasource.json
cp prototypeDs.datasource.json slave-02.datasource.json
分別修改3個(gè)配置文件:
vi master.datasource.json
name改為master,ip為mysql8_01容器的ip,讀寫(xiě)分離數(shù)據(jù)庫(kù)為test001(需要提前創(chuàng)建好)
vi slave-01.datasource.json
instanceType改為READ表示只讀不寫(xiě),name改為slave-01,ip為mysql8_02容器的ip,讀寫(xiě)分離數(shù)據(jù)庫(kù)為test001
vi slave-02.datasource.json
instanceType改為READ表示只讀不寫(xiě),name改為slave-02,ip為mysql8_03容器的ip,讀寫(xiě)分離數(shù)據(jù)庫(kù)為test001
添加數(shù)據(jù)庫(kù)test001的數(shù)據(jù)源的集群信息,此步驟必須操作,如果多個(gè)主或者多個(gè)從,需要用逗號(hào)分隔:
cd /usr/local/mycat/conf/clusters/
#復(fù)制創(chuàng)建一個(gè)新文件
cp prototype.cluster.json master-slave.cluster.json
vi master-slave.cluster.json
#修改為以下內(nèi)容:
{
"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"
}
配置物理數(shù)據(jù)庫(kù)和mycat中數(shù)據(jù)源/數(shù)據(jù)源集群的關(guān)系,此步驟必須操作
cp mysql.schema.json test001.schema.json
#在test001.schema.json輸入以下內(nèi)容,原內(nèi)容全部清空
{
"schemaName": "test001",
"targetName": "master-slave",
"normalTables": {}
}
修改登錄用戶信息,此步驟必須操作
cd /usr/local/mycat/conf/users/
vi root.user.json
#修改登錄的用戶名和密碼,此處用root用戶,如果是別的用戶需要更改為對(duì)應(yīng)的密碼
#"transactionType":"xa",表示支持事務(wù)類型(具體還不明白)
{
"dialect":"mysql",
"ip":null,
"password":"123456",
"transactionType":"xa",
"username":"root"
}
如有需要,修改mycat的監(jiān)聽(tīng)端口,在server.json里修改,此處使用默認(rèn)的8066端口
萬(wàn)事具備,只欠最后一步啟動(dòng):
[root@a8628fb36ec2 bin]# /usr/local/mycat/bin/mycat start
Starting mycat2...
查看啟動(dòng)日志,如日志有started up提示,表示mycat已經(jīng)正常啟動(dòng)
[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.
查看監(jiān)聽(tīng)端口,可以看到有8066監(jiān)聽(tīng)
查看java進(jìn)程:
如果沒(méi)有java進(jìn)程,需要檢查java是否正常啟動(dòng):java -version,做相應(yīng)的排錯(cuò)工作。
使用telnet命令測(cè)試8066端口,如沒(méi)有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端口已經(jīng)通了
#使用ctrl+] 組合鍵退出telnet命令行界面。
登陸mycat測(cè)試
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)]>
測(cè)試mycat的讀寫(xiě)分離
#登陸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]>
#可以看到默認(rèn)沒(méi)有表,測(cè)試創(chuàng)建一個(gè)表
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]>
#測(cè)試在該表插入內(nèi)容:
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]>
此時(shí)去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創(chuàng)建的數(shù)據(jù)庫(kù)及表和表內(nèi)容
在從庫(kù)(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)
#兩臺(tái)從庫(kù)上均可以查詢到mycat創(chuàng)建的表內(nèi)容。
上面的步驟創(chuàng)建為寫(xiě)操作,無(wú)法判斷讀寫(xiě)分離的情況,現(xiàn)在兩個(gè)從庫(kù)上插入新的數(shù)據(jù)。由于是主從架構(gòu),在從庫(kù)上的操作不會(huì)同步到主庫(kù)上,如果使用mycat查詢可以查詢到在從庫(kù)插入的數(shù)據(jù),表示mycat讀數(shù)據(jù)庫(kù)的時(shí)候是走的從庫(kù),從而證明讀寫(xiě)佢分離成功。
#分別在從庫(kù)上操作
insert into t1 values (003,'test_test',33,'test');
此時(shí)在登錄mycat查詢,可以看到從庫(kù)上的數(shù)據(jù)表示是在從庫(kù)上讀取的信息:
[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實(shí)現(xiàn)mysql讀寫(xiě)分離。
原文來(lái)源:https://mp.weixin.qq.com/s/J_p01l12cIcplF4s01R-sQ
來(lái)源:本文內(nèi)容搜集或轉(zhuǎn)自各大網(wǎng)絡(luò)平臺(tái),并已注明來(lái)源、出處,如果轉(zhuǎn)載侵犯您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)聯(lián)系小編,我們會(huì)及時(shí)審核處理。
聲明:江蘇教育黃頁(yè)對(duì)文中觀點(diǎn)保持中立,對(duì)所包含內(nèi)容的準(zhǔn)確性、可靠性或者完整性不提供任何明示或暗示的保證,不對(duì)文章觀點(diǎn)負(fù)責(zé),僅作分享之用,文章版權(quán)及插圖屬于原作者。
Copyright?2013-2024 JSedu114 All Rights Reserved. 江蘇教育信息綜合發(fā)布查詢平臺(tái)保留所有權(quán)利
蘇公網(wǎng)安備32010402000125
蘇ICP備14051488號(hào)-3技術(shù)支持:南京博盛藍(lán)睿網(wǎng)絡(luò)科技有限公司
南京思必達(dá)教育科技有限公司版權(quán)所有 百度統(tǒng)計(jì)