环境架构
|-----------|---------|---------|
| 主机 | 角色 | MySQL版本 |
| 10.0.0.30 | mysql-主 | 8.0.41 |
| 10.0.0.31 | mysql-从 | 8.0.41 |
| 10.0.0.32 | mycat | |
1. java环境准备 和文件获取
bash
yum install java-1.8.0-openjdk
[root@rocky32 ~] java -version
openjdk version "1.8.0_472"
OpenJDK Runtime Environment (build 1.8.0_472-b08)
OpenJDK 64-Bit Server VM (build 25.472-b08, mixed mode)
java的版本过高会报错
从官网把包获取下来
bash
[root@rocky32 ~] mkdir /data/softs -p
[root@rocky32 ~] cd /data/softs/
[root@rocky32 softs] ls
Mycat-server-1.6.7.6-release-20220524173810-linux.tar.gz
2.Mycat部署
bash
[root@rocky32 softs] mkdir /apps
[root@rocky32 softs] tar xf /data/softs/Mycat-server-1.6.7.6-release-20220524173810-linux.tar.gz -C /apps/
#日志
logs/wrapper.log #mycat启动日志
logs/mycat.log #mycat详细工作日志
#常用配置文件
conf/server.xml #Mycat 软件本身相关的配置文件,设置账号、参数等
conf/schema.xml #对应的物理数据库和数据库表的配置,读写分离、高可用、分布式策略定制、节点控制
conf/rule.xml #Mycat分片(分库分表)规则配置文件,记录分片规则列表、使用方法等
定制环境变量
bash
[root@rocky9-18 ~] vim /etc/profile.d/mycat.sh
PATH=/apps/mycat/bin:$PATH
source /etc/profile.d/mycat.sh
启动Mycat服务
bash
[root@rocky32 ~] mycat start
Starting Mycat-server...
[root@rocky32 ~] mycat status
Mycat-server is running (4158).
mycat默认路径:/apps/mycat/conf/server.xml
连接mycat -- 需要提前安装mysql的客户端工具
bash
安装mysql客户端
[root@rocky9-18 ~] yum install mysql -y
连接mycat:
[root@rocky9-18 ~] mysql -uroot -p123456 -h 127.0.0.1 -P8066
3. schema.xml配置
schema.xml是最主要的配置项,此文件关联mysql读写分离策略,读写分离、分库分表策略、分片节点都是在此文件中配置的。
schema #数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应
dataNode #分片信息,也就是分库相关配置
dataHost #物理数据库,真正存储数据的数据库
schemaname #逻辑数据库名,与server.xml中的schema对应
checkSQLschema #数据库前缀相关设置,这里为false
sqlMaxLimit #select 时默认的limit,避免查询全表
table
name #表名,物理数据库中表名
dataNode #表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name
primaryKey #主键字段名,自动生成主键时需要设置
autoIncrement #是否自增
rule #分片规则名,具体规则下文rule详细介绍
dataNodename #节点名,与table中dataNode对应
datahost #物理数据库名,与datahost中name对应
database #物理数据库中数据库名
dataHostname #物理数据库名,与dataNode中dataHost对应
balance #均衡负载的方式
writeType #写入方式
dbType #数据库类型
heartbeat #心跳检测语句,注意语句结尾的分号要加
schema.xml 文件中有三点需要注意:balance="1",writeType="0" ,switchType="1"schema.xml 中的 balance 的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类型,目前的取值有 4 种:
- balance="0":
不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上,即读请求仅发送到
writeHost 上。
- balance="1":
一般用此模式,读请求随机分发到当前 writeHost 对应的 readHost 和 standby 的 writeHost上。即全部的 readHost 与stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1, S2 都参与 select
语句的负载均衡。
- balance="2":
读请求随机分发到当前 dataHost 内所有的 writeHost 和 readHost 上。即所有读操作都随机的在 writeHost, readhost 上分发。
- balance="3":
读请求随机分发到当前 writeHost 对应的 readHost上。即所有读请求随机的分发到 wiriterHost对应的 readhost 执行, writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
4.配置 MySQL 环境
参考前面的内容,确保存在主从环境即可
测试同步
bash
create database db1;
use db1;
创建表
mysql> CREATE TABLE stu (
id int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
age tinyint UNSIGNED,
gender ENUM('M','F') default 'M'
)ENGINE=InnoDB;
写数据
insert into stu(name,age)values('tom',10);
slave节点上查看
mysql> use db1;
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| stu |
+---------------+
1 row in set (0.00 sec)
mysql> select * from stu;
+----+------+------+--------+
| id | name | age | gender |
+----+------+------+--------+
| 1 | tom | 10 | M |
+----+------+------+--------+
5.配置 Mycat 连接账号
在master节点上创建账号并授权,该帐号会被同步到 slave 节点
bash
mysql> create user 'mycater'@'10.0.0.%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL ON db1.* TO 'mycater'@'10.0.0.%';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
修改 server.xml 配置 mycat 连接后端数据库的账号密码
bash
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useHandshakeV10">1</property>
<property name="serverPort">3306</property> #mycat 监听的端口从8066改成3306
</system>
<user name="root"> #客户端连接mycat的配置
<property name="password">123456</property>
<property name="schemas">db1</property>
<property name="defaultSchema">db1</property>
</user>
</mycat:server>
注意:该文件中,不允许出现 # 之类的注释信息
6.配置读写分离
bash
vim /apps/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="db1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user();</heartbeat>
<writeHost host="host1" url="10.0.0.12:3306" user="mycater" password="123456">
<readHost host="host2" url="10.0.0.15:3306" user="mycater" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
重启mycat 服务
bash
[root@rocky32 ~] mycat restart
Stopping Mycat-server...
Mycat-server was not running.
Starting Mycat-server...
[root@rocky32 ~] mycat status
Mycat-server is running (5797).
测试
bash
[root@rocky32 ~] mysql -uroot -p123456 -h127.1
mysql> show databases;
+----------+
| DATABASE |
+----------+
| db1 |
+----------+
mysql> show tables from db1;
+---------------+
| Tables_in_db1 |
+---------------+
| stu |
+---------------+
1 row in set (0.14 sec)
7.验证读写分离
验证读写分离, 分别在master 和 slave节点上开启通用日志
bash
vim /etc/my.cnf.d/mysql-server.cnf
......
general_log
重启mysql服务
systemctl restart mysqld.service
通用日志, master, slave节点都有,文件名与机名同名
8. slave异常
当 slave 节点离线,mycat 会将查操作移换到 master 节点
9.问题
存在单点故障,可以用两个mycat之后用keepalived解决IP问题