记录日常工作关于系统运维,虚拟化云计算,数据库,网络安全等各方面问题。

Centos7+Keepalived+mycat2+Mysql/MariaDB读写分离方案

一,环境介绍。

1,架构信息。

Mycat2中间件主机两台,安装Centos7+keepalived+mycat2 ,使用vip 192.168.137.141,实现mycat高可用。

Docker主机一台,安装Centos7+docker+三个mariadb实例, 使用 IP 192.168.137.40。

2,数据库实例信息。

mariadb01实例 IP: 192.168.137.40 端口:13311

mariadb02实例 IP: 192.168.137.40 端口:13312

mariadb03实例 IP: 192.168.137.40 端口:13313


二,具体安装过程。

这里不再讲docker与keepalived安装过程。


1, 安装jdk环境。

rpm -ivh jdk-linux-x64.rpm
#安装jdk软件包

#/etp/profile配置文件中添加JAVA环境变量
export JAVA_HOME=/usr/java/default
export CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:/usr/java/kotlin/bin:$PATH

 

wget http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip
wget http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies-2022-3-9.jar
#下载软件包

cp -a mycat2-* /opt/
unzip mycat2-install-template-1.21.zip
#复制到/opt目录并解压文件

cd mycat/
chmod +x bin/*
#给脚本添加执行权限

cp /opt/mycat2-1.21-release-jar-with-dependencies-2022-3-9.jar lib/
#复制jar依赖包到/opt/mycat/lib目录。

 

cd /opt/mycat2/mycat/conf/users/

cat root.user.json
{
        "dialect":"mysql",
        "ip":null,
        "password":"12345678",
        "transactionType":"xa",
        "username":"root"
}

#注意 /opt/mycat2/mycat/conf/users/root.user.json里面的username与password是配置mycat的管理账号与密码。不是mysql的账号密码。

 

2,启动mycat

#先删除/opt/mycat/conf/clusters和/opt/mycat/conf/datasources目录中的json文件

/opt/mycat/bin/mycat start
#启动mycat中间件
mysql -uroot -h192.168.137.31 -P8066 -p
#使用客户端工具测试,这里登陆使用的是mycat账号root 密码是: 12345678

3,配置mycat的datasource,定义后端的mysql服务器。这里采用的是一主二从,所以需要定义三个数据源。

mariadb01是主节点,instanceType是WRITE,也可以是READ_WRITE。

mariadb02是从节点,instanceType只能是READ。

mariadb03是从节点,instanceType只能是READ。


4,以下三个命令是登陆mycat中执行。

/*+ mycat:createDataSource{
"name":"mariadb01",
"instanceType":"WRITE",
"url":"jdbc:mysql://192.168.137.40:13311",
"user":"root",
"password":"alpha.abc"
} */;

#注意主节点数据库的instanceType是WRITE,也可以是READ_WRITE,从节点的只能是READ
/*+ mycat:createDataSource{
"name":"mariadb02",
"instanceType":"READ",
"url":"jdbc:mysql://192.168.137.40:13312",
"user":"root",
"password":"alpha.abc"
} */;

#从节点,instanceType只能是READ。
/*+ mycat:createDataSource{
"name":"mariadb03",
"instanceType":"READ",
"url":"jdbc:mysql://192.168.137.40:13313",
"user":"root",
"password":"alpha.abc"
} */;

#从节点,instanceType只能是READ。

 

5,查看/opt/mycat/conf/datasources目录,可以看到生成三个数据源文件。

[root@node2 conf]# ls datasources/
mariadb01.datasource.json  mariadb02.datasource.json  mariadb03.datasource.json

6,配置集群信息。根据自已情况添加参数,这里配置集群名称 prototype,集群中的masters,replicas,以及查询策略。

执行下面命令。

/*! mycat:createCluster{
"name":"prototype",
"masters":"mariadb01",
"replicas":["mariadb02","mariadb03"],
"readBalanceType":"BALANCE_ALL_READ",
"readBalanceName":"BalanceLeastActive"
} */;

使用命令 /*+ mycat:showClusters{} */; 可以查看集群信息。通过下图,可以看出一个主节点,两个从节点。



 

7,查看/opt/mycat/conf/clusters目录,可以看到集群配置文件。

[root@node2 conf]# cat clusters/prototype.cluster.json
{
        "clusterType":"MASTER_SLAVE",
        "heartbeat":{
                "heartbeatTimeout":1000,
                "maxRetryCount":3,
                "minSwitchTimeInterval":300,
                "showLog":false,
                "slaveThreshold":0.0
        },
        "masters":[
                "mariadb01"
        ],
        "maxCon":2000,
        "name":"prototype",
        "readBalanceName":"BalanceLeastActive",
        "readBalanceType":"BALANCE_ALL_READ",
        "replicas":[
                "mariadb02",
                "mariadb03"
        ],
        "switchType":"SWITCH"

 

8,测试中间件工作情况。使用SQLyog登陆mycat后,可以看到三个库,主从节点中已经存在的其它数据库是看不到的。




9,mycat中间件中创建数据库。执行以下SQL命令,可以通过mycat与mysql中查看,已经同步创建相关数据库与表。

CREATE DATABASE dbapp;
USE dbapp;
CREATE TABLE `name`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `sex` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `user_name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `id`(`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1129569 CHARACTER SET = utf8mb4;




10,查看/opt/mycat/conf/schemas/目录下,已经多了dbapp.schema.json配置文件,内容有表结构相关信息。

[root@node2 conf]# cat schemas/dbapp.schema.json
{
        "customTables":{},
        "globalTables":{},
        "normalProcedures":{},
        "normalTables":{
                "name":{
                        "createTableSQL":"CREATE TABLE dbapp.`name` (\n\t`id` bigint(20) NOT NULL AUTO_INCREMENT,\n\t`sex` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n\t`user_name` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,\n\tPRIMARY KEY USING BTREE (`id`),\n\tINDEX `id` USING BTREE(`id`)\n) ENGINE = InnoDB AUTO_INCREMENT = 1129569 CHARACTER SET = utf8mb4",
                        "locality":{
                                "schemaName":"dbapp",
                                "tableName":"name",
                                "targetName":"prototype"
                        }
                }
        },
        "schemaName":"dbapp",
        "shardingTables":{},
        "views":{}

 

11,最后可以在表中插入一些数据。可以在mycat中执行,也可以在主节点mysql中执行。

USE dbapp;
INSERT INTO `name` VALUES (1, 'girl', 'ddd');
INSERT INTO `name` VALUES (2, 'boy', 'fff');
INSERT INTO `name` VALUES (3, 'xxx', 'aaa');

 

12,将两个从节点表中的数据都删除一行内容,删除不同数据,客户端在通过mycat节点查询,可以看到每次会返回不同节点的数据。

mysql> select * from dbapp.name;
+----+------+-----------+
| id | sex  | user_name |
+----+------+-----------+
|  1 | girl | ddd       |
|  3 | xxx  | aaa       |
+----+------+-----------+
2 rows in set (0.01 sec)

mysql> select * from dbapp.name;
+----+------+-----------+
| id | sex  | user_name |
+----+------+-----------+
|  1 | girl | ddd       |
|  2 | boy  | fff       |
+----+------+-----------+
2 rows in set (0.01 sec)

从上面结果可以看出,mycat中间件已经将查询结果分配到不同的节点了。实现了读写分离功能。

 

 

clusterType相关内容:

SINGLE_NODE:单一节点

MASTER_SLAVE:普通主从

GARELA_CLUSTER:garela cluster/PXC集群

MHA:1.21-2022年1月完善

MGR:1.21-2022年1月完善,MIC集群可以使用此配置

MHA与MGR集群会在心跳过程中根据READ_ONLY状态判断当前节点是否从节点(READ_ONLY=ON),主节点(READ_ONLY=OFF)动态更新主从节点信息,这样可以支持多主,单主.但是实际上生产上建议暂时使用单主模式,或者多主作为单主使用

 

readBalanceType 相关内容:

查询负载均衡策略

可选值:

BALANCE_ALL(默认值)

获取集群中所有数据源

BALANCE_ALL_READ

获取集群中允许读的数据源

BALANCE_READ_WRITE

获取集群中允许读写的数据源,但允许读的数据源优先

BALANCE_NONE

获取集群中允许写数据源,即主节点中选择

switchType相关内容:

NOT_SWITCH:不进行主从切换

SWITCH:进行主从切换

 

readBalanceName与writeBalanceName相关内容:

配置负载均衡策略,默认值是BalanceRandom

BalanceLeastActive**最少正在使用的连接数的mysql数据源被选中,如果连接数相同,则从连接数相同的数据源中的随机,使慢的机器收到更少。

BalanceRandom**利用随机算法产生随机数,然后从活跃的mysql数据源中进行选取。

BalanceRoundRobin**加权轮训算法,记录轮训的权值,每次访问加一,得到n,然后对mysql数据源进行轮训,

如果权值已经为零,则跳过,如果非零则减一,n减1,直n为零则选中的节点就是需要访问的mysql数据源节点。

BalanceRunOnReplica**io.mycat.plug.loadBalance.BalanceRunOnReplica把请求尽量发往从节点,不会把请求发到不可读(根据延迟值判断)与不可用的从节点







转载请标明出处【Centos7+Keepalived+mycat2+Mysql/MariaDB读写分离方案】。

《www.micoder.cc》 虚拟化云计算,系统运维,安全技术服务.

网站已经关闭评论