centos8 mycat 2.0安装及使用

安装前准备

服务器已安装Jdk8
对应数据库安装,本测试使用的Mycat2操作Mysql,所以也完成了Mysql安装

jdk安装

1、下载

我用夸克网盘分享了「jdk-8u341-linux-x64.tar.gz」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。 链接:https://pan.quark.cn/s/34e1f58045f8 提取码:LNvG

2、解压到 usr/local
sudo tar -zxvf jdk-8u341-linux-x64.tar.gz -C /usr/local
3、切换到etc/profile.d/文件下
cd /etc/profile.d/
4、 在profile.d下创建一个jdk.sh文件
sudo vi /etc/profile.d/jdk.sh
5、 jdk.sh文件内容
export JAVA_HOME=/usr/local/jdk1.8.0_341
export PATH=$JAVA_HOME/bin:$PATH   
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
6、配置生效
source /etc/profile
7、查询版本
java -version

mycat安装

可以通过绑定的资源下载
也可以通过官网下载mycat2

如果在windows下载 需传入centos8

D:\BaiduNetdiskDownload\mycat2.zip 需要传入的文件目录
root@192.168.245.132:/Admin/
root 虚拟机账号名
192.168.245.132 虚拟机iip地址
/Admin/ 存放地址

scp D:\BaiduNetdiskDownload\mycat2.zip root@192.168.245.132:/root/

解压 然后给/mycat/bin文件下的所有文件赋值最高级权限

在这里插入图片描述
或者通过在/mycat/bin命令行中

chmod +x *

修改 Mycat 服务 /mycat/conf/server.json

主要添加了serverVersion配置 serverVersion前面是MySQL的版本后面是Mycat的版本

查询mysql版本

登录mysql后查询
select version();

server.json文件内容

{
  "loadBalance":{
    "defaultLoadBalance":"BalanceRandom",
    "loadBalances":[]
  },
  "mode":"local",
  "properties":{},
  "server":{
    "bufferPool":{

    },
    "idleTimer":{
      "initialDelay":3,
      "period":60000,
      "timeUnit":"SECONDS"
    },
    "ip":"0.0.0.0",
    "mycatId":1,
    "port":8066,
    "serverVersion":"8.0.40-mycat-2.0",
    "reactorNumber":8,
    "tempDirectory":null,
    "timeWorkerPool":{
      "corePoolSize":0,
      "keepAliveTime":1,
      "maxPendingLimit":65535,
      "maxPoolSize":2,
      "taskTimeout":5,
      "timeUnit":"MINUTES"
    },
    "workerPool":{
      "corePoolSize":1,
      "keepAliveTime":1,
      "maxPendingLimit":65535,
      "maxPoolSize":1024,
      "taskTimeout":5,
      "timeUnit":"MINUTES"
    }
  }
}

原型库连接

只用设置一次。
在主节点创建 Mycat 使用的数据库 mycat

CREATE DATABASE IF NOT EXISTS mycat;

这个库称为 Mycat 的原型库(prototype),Mycat 在启动时,会自动在原型库下创建其运行时所需的数据表。

CREATE DATABASE IF NOT EXISTS `mycat`;
USE `mycat`;
DROP TABLE IF EXISTS `analyze_table`;
CREATE TABLE `analyze_table` (
  `table_rows` bigint(20) NOT NULL,
  `name` varchar(64) NOT NULL,
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
DROP TABLE IF EXISTS `config`;
CREATE TABLE `config` (
  `key` varchar(22) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `value` longtext,
  `version` bigint(20) DEFAULT NULL,
  `secondKey` longtext,
  `deleted` tinyint(1) DEFAULT '0',
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
DROP TABLE IF EXISTS `replica_log`;
CREATE TABLE `replica_log` (
  `name` varchar(22) DEFAULT NULL,
  `dsNames` text,
  `time` datetime DEFAULT NULL,
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
DROP TABLE IF EXISTS `spm_baseline`;
CREATE TABLE `spm_baseline` (
  `id` bigint(22) NOT NULL AUTO_INCREMENT,
  `fix_plan_id` bigint(22) DEFAULT NULL,
  `constraint` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `extra_constraint` longtext,
  PRIMARY KEY (`id`),
  UNIQUE KEY `constraint_index` (`constraint`(22)),
  KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
DROP TABLE IF EXISTS `spm_plan`;
CREATE TABLE `spm_plan` (
  `id` bigint(22) NOT NULL AUTO_INCREMENT,
  `sql` longtext,
  `rel` longtext,
  `baseline_id` bigint(22) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
DROP TABLE IF EXISTS `sql_log`;
CREATE TABLE `sql_log` (
  `instanceId` bigint(20) DEFAULT NULL,
  `user` varchar(64) DEFAULT NULL,
  `connectionId` bigint(20) DEFAULT NULL,
  `ip` varchar(22) DEFAULT NULL,
  `port` bigint(20) DEFAULT NULL,
  `traceId` varchar(22) NOT NULL,
  `hash` varchar(22) DEFAULT NULL,
  `sqlType` varchar(22) DEFAULT NULL,
  `sql` longtext,
  `transactionId` varchar(22) DEFAULT NULL,
  `sqlTime` bigint(20) DEFAULT NULL,
  `responseTime` datetime DEFAULT NULL,
  `affectRow` int(11) DEFAULT NULL,
  `result` tinyint(1) DEFAULT NULL,
  `externalMessage` tinytext,
  PRIMARY KEY (`traceId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
DROP TABLE IF EXISTS `variable`;
CREATE TABLE `variable` (
	`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
	`value` varchar(22) DEFAULT NULL,
	PRIMARY KEY (`name`)
) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
DROP TABLE IF EXISTS `xa_log`;
CREATE TABLE `xa_log` (
	`xid` bigint(20) NOT NULL,
	PRIMARY KEY (`xid`)
) ENGINE = InnoDB CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;

修改数据源 mycat/conf/datasources/prototypeDs.datasource.json

只修改password、url、user 三部分

password:原型库的密码
user :原型库的用户
url:请求url  localhost:3306/mycat 可更改为mysql所在的具体的Ip地址和具体的库

"password":"123456",
"url":"jdbc:mysql://localhost:3306/mycat?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"root",
{
"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://localhost:3306/mycat?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"root",
"weight":0
}

记住或者自己重新设置mycat登录的账号和密码

在这里插入图片描述

验证数据库访问情况

Mycat作为数据库中间件要和数据库部署在不同机器上,所以要验证远程访问情况

mysql -u root -p -h 192.168.140.100 -P 3306;

如远程访问报错,请建对应用户

防火墙拦截:检查数据库服务器所在主机的防火墙设置,看是否拦截了 MyCat默认的 8066
端口(如果使用的是默认端口配置)。如果防火墙阻止了客户端与服务器之间的连接通信,就会出现连接超时情况。可以按照相应操作系统的规则去开放
8066端口,比如在 Linux 系统中使用firewalld防火墙时,通过命令sudo firewall-cmd
–zone=public --add-port=8066/tcp --permanent添加允许 8066端口的 TCP 协议通信规则,然后执行sudo firewall-cmd --reload使规则生效;若使用iptables防火墙,可使用iptables
-A INPUT -p tcp --dport 3306 -j ACCEPT等相关命令来允许访问 8066端口,并做好规则保存工作。

grant all privileges on *.* to 'root'@'缺少的host' identified by '密码';

打开mycat 在/mycat/bin 中通过./mycat start

在这里插入图片描述

验证Mycat是否正常运行

在mycat/bin 中通过

./mycat start  运行
./mycat status 查看状态

登录Mycat

9066 运维人员管理、维护 mycat的端口
8066 开发人员管理、维护 mycat的端口

mysql -u root -p -P 9066 -h  远程mysql的ip
mysql -u root -p -P 8066 -h  远程mysql的ip

通过创建一个库

created database mycat_db

查看/mycat/conf/schemas下是否有同名库 有则成功
在这里插入图片描述

报错

Mycat-server is not running.

查看日志
1、通过命令行

mycat console

2.myCat 根目录下查看
在这里插入图片描述

错误信息

Running Mycat-server...wrapper  | ERROR: Could not write pid file /opt/mycat/logs/mycat.pid: No such file or directory

解决:mycat 根目录下创建logs 重启mycat
在这里插入图片描述

<think>好的,我现在需要帮用户解决在第三台机器上使用Python脚本部署Mycat实现MySQL主从节点的读写分离的问题。首先,我需要回顾一下Mycat的基本概念和配置步骤。Mycat是一个开源的数据库中间件,主要用于MySQL的读写分离和分库分表。用户的主从节点IP是10.0.0.151和10.0.0.156,需要在第三台服务器上安装配置Mycat。 首先,我得确定Mycat安装流程。通常需要下载Mycat安装包,解压,然后配置schema.xml和server.xml等文件。用户希望用Python脚本来自动化这个过程,所以脚本需要处理下载、解压、配置文件修改以及启动Mycat服务这些步骤。 接下来,考虑如何用Python脚本实现这些步骤。可能需要使用subprocess模块执行shell命令,比如wget下载Mycat,tar解压,以及编辑配置文件。对于配置文件的修改,可以用Python的文件操作来替换模板中的占位符,比如替换主从数据库的IP地址、用户名和密码等。 然后,我需要检查Mycat的配置文件结构。schema.xml中定义逻辑库和数据节点,以及读写分离的规则。server.xml则配置Mycat的用户权限。在Python脚本中,可能需要准备模板文件,然后通过字符串替换或正则表达式来插入用户提供的IP和认证信息。 另外,需要确保Mycat所需的Java环境已经安装,因为Mycat是基于Java的。所以在脚本中可能需要先检查Java是否安装,如果没有,则自动安装Java。不过用户可能已经具备环境,或者需要脚本包含这一步,但考虑到用户可能的环境差异,这一步可能需要用户自行处理,或者在脚本中添加检查。 还有防火墙的问题,需要开放Mycat的默认端口8066和9066,这可能需要脚本中添加iptables规则或者firewalld配置,但这也取决于用户的操作系统,可能需要更多的处理,或者提醒用户手动配置。 然后,编写脚本的大致步骤可能是:下载Mycat,解压,配置schema.xml和server.xml,启动Mycat。可能需要使用Python的os模块和subprocess模块来执行这些命令。例如,使用wget下载,tar解压,然后使用sed命令替换配置文件中的占位符,或者用Python读取文件内容,替换后写入。 测试部分也很重要,脚本可能需要包含一个测试步骤,比如使用mysql命令连接Mycat,执行简单的读写操作来验证配置是否成功。不过这部分可能在脚本中较难自动化,可能需要用户手动验证,或者在脚本中加入简单的测试命令。 用户还可能关心如何验证读写分离是否生效,可能需要检查Mycat的日志,或者在从库上设置监控,查看读请求是否被正确路由。这部分可能超出脚本的范围,但可以在回答中给出建议。 最后,需要考虑异常处理,比如下载失败、解压错误、配置文件错误等,脚本应该能够捕获这些错误并给出提示,但Python脚本处理这些可能需要较多的try-except块,或者简单的错误检查。 总结,Python脚本需要完成以下步骤: 1. 安装Java(如果需要) 2. 下载并解压Mycat 3. 配置schema.xml和server.xml 4. 启动Mycat服务 5. 验证配置 现在需要将这些步骤转化为具体的Python代码,使用subprocess调用系统命令,并处理文件配置。同时,提供相关的注意事项和验证方法,帮助用户确保部署成功。</think>以下是通过Python脚本在第三台服务器部署Mycat实现MySQL读写分离的完整方案: ### 一、基础环境准备 1. 确保第三台服务器已安装Java 1.8+环境 2. 建议使用CentOS 7+系统 3. 开放防火墙端口:8066(数据端口)/9066(管理端口) ### 二、Python部署脚本 ```python import os import subprocess import shutil # 配置参数 MYCAT_URL = "http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip" MYSQL_MASTER = "10.0.0.151" MYSQL_SLAVE = "10.0.0.156" DB_USER = "root" DB_PASSWORD = "your_password" def deploy_mycat(): try: # 安装依赖 subprocess.run("yum install -y wget unzip java", shell=True, check=True) # 下载Mycat subprocess.run(f"wget {MYCAT_URL} -O /tmp/mycat.zip", shell=True, check=True) subprocess.run("unzip /tmp/mycat.zip -d /usr/local/", shell=True, check=True) # 配置schema.xml with open("/usr/local/mycat/conf/schema.xml", "w") as f: f.write(f'''<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="testdb" checkSQLschema="true" sqlMaxLimit="100"> <table name="tb_blog" primaryKey="id" dataNode="dn1"/> </schema> <dataNode name="dn1" dataHost="dh1" database="testdb"/> <dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="master" url="{MYSQL_MASTER}:3306" user="{DB_USER}" password="{DB_PASSWORD}"> <readHost host="slave" url="{MYSQL_SLAVE}:3306" user="{DB_USER}" password="{DB_PASSWORD}"/> </writeHost> </dataHost> </mycat:schema>''') # 配置server.xml shutil.copy("/usr/local/mycat/conf/server_template.xml", "/usr/local/mycat/conf/server.xml") # 启动Mycat subprocess.run("/usr/local/mycat/bin/mycat start", shell=True, check=True) print("Mycat部署成功!访问端口:8066(数据)/9066(管理)") except subprocess.CalledProcessError as e: print(f"部署失败: {str(e)}") if __name__ == "__main__": deploy_mycat() ``` ### 三、配置说明 1. `balance="1"` 表示读写分离模式:写请求发送到master,读请求随机分发到slave 2. `writeType="0"` 表示所有写请求发送到第一个writeHost 3. 通过`show @@datasource`命令可查看数据源状态[^1] ### 四、验证步骤 1. 连接Mycat测试: ```bash mysql -utest -p123456 -h第三台服务器IP -P8066 ``` 2. 执行写操作验证主库同步: ```sql CREATE TABLE tb_blog(id INT PRIMARY KEY, title VARCHAR(50)); ``` 3. 执行读操作验证从库路由: ```sql SELECT * FROM tb_blog; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值