学习预览:
(一)mysql 运维基础篇(Linux云计算从入门到精通)
(三)mysql 触发器、存储过程和函数(数据库运维基础补充)
(五)mysql数据备份—物理备份(完备+lvm快照+xtrabackup)+逻辑备份(mysqldump+导入导出)
(六)mysql复制技术—M-S主从配置(传统+GTID)+M-M-S-S主从配置(GTID)
(七)mysql中间件mycat配置和部署(基于M-M-S-S)
(八) 数据库集群技术—Galera Cluster安装与配置
(九)数据库集群技术Galera+mycat(数据库运维学习终章)
声明:
上一章我已经介绍了数据库集群技术—Galera Cluster安装与配置,这篇mycat的配置就是基于上篇文章的基础而做的。
配置好Galera Cluster之后,就开始安装配置mycat了。安装mycat之前的java环境和安装的教程可以看下面这篇博客:
这篇博客主要介绍下配置文件schema.xml 和server.xml在Galera集群下的配置。还有其它区别于之前mysql8下安装mycat。因为之前装的是mysql8,这次装的mysql5.7,其实区别并不大,就需要修改下mysql-connector-java的版本(正常你下载的mycat不需要额外花功夫搞这个,只是上次做实验我装的mysql-connector-java8,这次又要换回来。其它主要都是配置文件schema.xml 的区别)。
(1)先在Galera1创数据库并授权给mycat用户,我就先创三个数据库(根据需要授权数据库)。
create database blog;
create database shop;
create database blog;
grant all on testdb.* to testdb@'%' identified by 'Galera@123';
grant all on shop.* to shop@'%' identified by 'Galera@123';
grant all on blog.* to blog@'%' identified by 'Galera@123';
flush privileges;
(2)更换 mysql-connector-java(提醒,如果你做过我之前的实验这一步要做的,没做过的话可以跳过这一步)
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.35/mysql-connector-java-5.1.35.jar
ll
cp mysql-connector-java-5.1.35.jar /usr/local/mycat/lib/
cd /usr/local/mycat/
mv lib/mysql-connector-java-8.0.19.jar /root
chmod 777 lib/mysql-connector-java-5.1.35.jar
ll lib
(3) vim /usr/local/mycat/conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<!--配置连接mycat的用户-->
<user name="testdb">
<property name="password">123456</property>
<!--虚拟数据库,这个要和schema.xml定义的数据库相一致-->
<property name="schemas">testdb</property>
</user>
<user name="shop">
<property name="password">123456</property>
<!--虚拟数据库,这个要和schema.xml定义的数据库相一致-->
<property name="schemas">shop</property>
</user>
<user name="blog">
<property name="password">123456</property>
<!--虚拟数据库,这个要和schema.xml定义的数据库相一致-->
<property name="schemas">blog</property>
</user>
</mycat:server>
(4)vim /usr/local/mycat/conf/schema.xml 。先做一个简单介绍:
- balance=1 开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
- wirteType=0 所有写操作发送到第-个writeHost ,第一个挂了切换到第二个
- switchType=3 基于MySQL Galera cluster的切换机制, 心跳语句为show status like 'wsrep%'
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<schema name="shop" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
</schema>
<schema name="blog" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn3">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="testdb" />
<dataNode name="dn2" dataHost="localhost2" database="shop" />
<dataNode name="dn3" dataHost="localhost3" database="blog" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="3" slaveThreshold="100">
<heartbeat>show status like 'wsrep%'</heartbeat>
<writeHost host="galera1" url="galera1:3306" user="testdb" password="Galera@123"> </writeHost>
<writeHost host="galera2" url="galera2:3306" user="testdb" password="Galera@123"> </writeHost>
<writeHost host="galera3" url="galera3:3306" user="testdb" password="Galera@123"> </writeHost>
<writeHost host="galera4" url="galera4:3306" user="testdb" password="Galera@123"> </writeHost>
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="3" slaveThreshold="100">
<heartbeat>show status like 'wsrep%'</heartbeat>
<writeHost host="galera1" url="galera1:3306" user="shop" password="Galera@123"> </writeHost>
<writeHost host="galera2" url="galera2:3306" user="shop" password="Galera@123"> </writeHost>
<writeHost host="galera3" url="galera3:3306" user="shop" password="Galera@123"> </writeHost>
<writeHost host="galera4" url="galera4:3306" user="shop" password="Galera@123"> </writeHost>
</dataHost>
<dataHost name="localhost3" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="3" slaveThreshold="100">
<heartbeat>show status like 'wsrep%'</heartbeat>
<writeHost host="galera1" url="galera1:3306" user="blog" password="Galera@123"> </writeHost>
<writeHost host="galera2" url="galera2:3306" user="blog" password="Galera@123"> </writeHost>
<writeHost host="galera3" url="galera3:3306" user="blog" password="Galera@123"> </writeHost>
<writeHost host="galera4" url="galera4:3306" user="blog" password="Galera@123"> </writeHost>
</dataHost>
</mycat:schema>
(5)启动mycat
#先关掉mycat,在控制台中运行mycat,检查错误,没有错误就启动mycat
/usr/local/mycat/bin/mycat stop
/usr/local/mycat/bin/mycat console
Running Mycat-server...
wrapper | --> Wrapper Started as Console
wrapper | Launching a JVM...
jvm 1 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
jvm 1 |
jvm 1 | MyCAT Server startup successfully. see logs in logs/mycat.log
#启动mycat
/usr/local/mycat/bin/mycat start
#检测java端口是否打开
ss -nltp | grep java
LISTEN 0 1 127.0.0.1:32000 *:* users:(("java",pid=88675,fd=4))
LISTEN 0 100 :::9066 :::* users:(("java",pid=88675,fd=68))
LISTEN 0 100 :::8066 :::* users:(("java",pid=88675,fd=72))
(6)客户端登录
先添加主机解释,这个自己做相应的修改(每台都要做的)
192.168.119.163 galera1
192.168.119.160 galera2
192.168.119.161 galera3
192.168.119.162 galera4
开始登录(登录三个账号查看)
mysql -h192.168.119.165 -utestdb -p123456 -P8066
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| testdb |
+----------+
mysql -h192.168.119.165 -ushop -p123456 -P8066
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| shop |
+----------+
mysql -h192.168.119.165 -ublog -p123456 -P8066
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| blog |
+----------+
(7)检测mycat是否实现读写分离
- 所有节点都正常writeHost负责写操作,备writHost负责读操作
- 当第一个writeHost失效时 ,其中一个备的writeHost负责写操作,其他备的writeHost负责读操作
- 当只有一个writeHost时,同时负担读写
先配置conf/log4j.xml文件,将输出级别调整为debug级别,便于观察问题:
vim /usr/local/mycat/conf/log4j2.xml
然后在客户机上插入数据,并在mycat主机上查看日志:tailf /usr/local/mycat/logs/mycat.log
MySQL [(none)]> insert into testdb.t1 values (5,'77777777777777777777');
如下图,很明显在Galera1上进行写的:
如果读呢?很明显从Galera2上读。
MySQL [(none)]> select * from testdb.t1 where name='77777777777777777777';
如果我直接把Galera1和Galera2挂掉呢?看看有什么改变:
读的时候发生读节点转换,转换到Galera3上读。
MySQL [(none)]> select * from testdb.t1 where name='77777777777777777777';
写入数据的时候,开始从Galera4上写入数据:
MySQL [(none)]> insert into testdb.t1 values (7,'888888888888887');
结束语:
自此Linux云计算之mysql运维篇就结束了,我觉得这些还挺实用的,后面讲的数据库中间件mycat,其实介绍的很浅显。有兴趣的童鞋可以去官网下载官方文档好好学习,比如它还适用于分布式数据库等等。后面如果我还会遇到一些比较有用的知识,也愿意和大家一起分享。😀