Quantcast
Channel: 容器云计算,Devops,DBA,网络安全。
Viewing all articles
Browse latest Browse all 780

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

$
0
0

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 端口:13311mariadb02实例 IP: 192.168.137.40 端口:13312mariadb03实例 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把请求尽量发往从节点,不会把请求发到不可读(根据延迟值判断)与不可用的从节点






Viewing all articles
Browse latest Browse all 780

Trending Articles


FORECLOSURE OF REAL ESTATE MORTGAGE


HOY PANGIT, MAGBAYAD KA!


Arbol genealogico para colorear


Sapos para colorear


Tropa Quotes


Re:Mutton Pies (lleechef)


El Vibora (1971) by Francisco V. Coching and Federico C. Javinal


Ka longiing longsem kaba skhem bad kaba khlain ka pynlong kein ia ka...


Vimeo 3.42.0 by Vimeo Inc


Vimeo 11.5.1 by Vimeo.com, Inc.