ngrinder-换成自己熟悉的mysql数据库

ngrinder默认的数据库是H2,但代码中是支持H2cubrid 的,老实讲,这2个数据库,我第一次看见项目中有用到,恕我孤陋寡闻了,查了一下,才知道是2个开源的关系型数据库,鉴于平时自己99%用mysql,对mysql甚是喜欢,所以换一下更好开展工作呢,虽然我现在还没有解读透ngrinder的源码~~~

网上也有教程,自己又实践了,有一些不同,但总体流程是一样的,这里仅作记录

  • 添加mysql依赖
    ngrinder-controller/pom.xml添加既可,一般rlt+insert可进行搜索添加
<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>8.0.22</version>
</dependency>

import maven build没错即可,一般都无错!

  • 本地新建mysql数据库,并进行初始化
    进入本地服务器,创建数据库,建用户密码并授权,刷新权限
create database ngrinder;
GRANT ALL ON ngrinder.* TO 'ngrinder'@'%' IDENTIFIED BY 'ngrinder'
flush privileges;
  • 初始化
    我在3.5的源码包里找的建表语句,先用
    ngrinder-ngrinder-3.5.2-20200929\tools\migrator
create table if not exists AGENT (
    id bigint auto_increment unique,
    approved char(1) not null,
    hostName varchar(255),
    ip varchar(255),
    primary key (id)
);
#########################################################
create table if not exists NUSER (
    id bigint auto_increment unique,
    created_date timestamp NULL DEFAULT NULL,
    last_modified_date timestamp NULL DEFAULT NULL,
    authentication_provider_class varchar(255),
    description varchar(255),
    email varchar(255),
    enabled char(1) not null,
    is_external char(1),
    mobile_phone varchar(255),
    password varchar(255),
    role_name varchar(255) not null,
    timeZone varchar(255),
    user_id varchar(255) not null unique,
    user_language varchar(255),
    user_name varchar(255),
    created_user bigint,
    last_modified_user bigint,
    primary key (id)
);
#########################################################
create table if not exists PERF_TEST (
    id bigint auto_increment unique,
    created_date timestamp NULL DEFAULT NULL,
    last_modified_date timestamp NULL DEFAULT NULL,
    agent_count int,
    description text,
    distribution_path varchar(255),
    duration bigint,
    errors bigint,
    finish_time timestamp NULL DEFAULT NULL,
    ignore_sample_count int,
    ramp_up_init_count int,
    ramp_up_init_sleep_time int,
    last_progress_message text,
    mean_test_time double,
    peak_tps double,
    port int,
    ramp_up_step int,
    ramp_up_increment_interval int,
    processes int,
    progress_message text,
    run_count int,
    scheduled_time timestamp NULL DEFAULT NULL,
    script_name varchar(255),
    script_revision varchar(255),
    send_mail char(1),
    start_time timestamp NULL DEFAULT NULL,
    status varchar(255),
    stop_request char(1),
    tag_string varchar(255),
    target_hosts text,
    test_comment text,
    test_error_cause varchar(255),
    name varchar(255),
    test_time_standard_deviation double,
    tests bigint,
    threads int,
    threshold varchar(255),
    tps double,
    use_rampup char(1),
    vuser_per_agent int,
    created_user bigint,
    last_modified_user bigint,
    region varchar(255),
    safe_distribution char(1) default 'F',
    sampling_interval int default 1,
    param varchar(256) default '',
    ramp_up_type varchar(10) default 'PROCESS',
    scm varchar(30) default 'svn',
    ignore_too_many_error char(1) default 'F',
    primary key (id)
);
#########################################################
create table if not exists PERF_TEST_TAG (
    perf_test_id bigint not null,
    tag_id bigint not null,
    primary key (perf_test_id, tag_id)
);
#########################################################
create table if not exists TAG (
    id bigint auto_increment unique,
    created_date timestamp NULL DEFAULT NULL,
    last_modified_date timestamp NULL DEFAULT NULL,
    tagValue varchar(255),
    created_user bigint,
    last_modified_user bigint,
    primary key (id)
);
#########################################################
create table if not exists SHARED_USER (
    owner_id bigint not null,
    follow_id bigint not null,
    primary key (owner_id, follow_id)
);

NUSER会执行失败,原因是,user_id太长了,库是utf8mb4,mysql索引长度不能超767,长度要*4<767才可以,所以这里最大只能填191,而不能填255

  • 添加mysql数据源选择
    ngrinder-controller/org.ngrinder.infra.config.database.java database枚举类
/**
	 * mysql
	 */
	mysql(com.mysql.jdbc.Driver.class, org.hibernate.dialect.MySQL5Dialect.class, "jdbc:mysql://%s?%s") {
		@Override
		protected void setupVariants(BasicDataSource dataSource, PropertiesWrapper databaseProperties) {
			dataSource.setUrl(String.format(getUrlTemplate(),
				databaseProperties.getProperty(DatabaseConfig.PROP_DATABASE_URL),
				StringUtils.trimToEmpty(databaseProperties.getProperty(DatabaseConfig.PROP_DATABASE_URL_OPTION))));
			dataSource.setUsername(databaseProperties.getProperty(DatabaseConfig.PROP_DATABASE_USERNAME));
			dataSource.setPassword(databaseProperties.getProperty(DatabaseConfig.PROP_DATABASE_PASSWORD));
		}
	};
  • 配置数据源连接
    ngrinder-ngrinder-3.4.2-20180830\ngrinder-controller\src\main\resources\ngrinder_home_template\database.conf
    默认的注释掉
# H2 / cubrid can be set
#database.type=H2
#database.type=cubrid
database.type=mysql

# for cubrid. You should configure the following.
# database.url=localhost:33000:ngrinder
database.url=192.168.53.100:3306/ngrinder
database.url_option=useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&nullNamePatternMatchesAll=true&nullCatalogMeansCurrent=true
database.username=ngrinder
database.password=ngrinder
  • 重新打包
    mvn clean install -Dmaven.test.skip=true

  • 测试
    上传到服务器上,执行[root@52-118 ngrinder]# java -jar ngrinder-controller-3.4.2.war
    很不幸,报错,

liquibase.exception.DatabaseException: Error executing SQL CREATE TABLE `DATABASECHANGELOG` (`ID` VARCHAR(63) NOT NULL, `AUTHOR` VARCHAR(63) NOT NULL, `FILENAME` VARCHAR(200) NOT NULL, `DATEEXECUTED` DATETIME NOT NULL, `ORDEREXECUTED` INT NOT NULL, `EXECTYPE` VARCHAR(10) NOT NULL, `MD5SUM` VARCHAR(35) NULL, `DESCRIPTION` VARCHAR(255) NULL, `COMMENTS` VARCHAR(255) NULL, `TAG` VARCHAR(255) NULL, `LIQUIBASE` VARCHAR(20) NULL, CONSTRAINT `PK_DATABASECHANGELOG` PRIMARY KEY (`ID`, `AUTHOR`, `FILENAME`)): Specified key was too long; max key length is 767 bytes
	at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:62)
	at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:104)
	at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:70)
	at liquibase.database.AbstractDatabase.checkDatabaseChangeLogTable(AbstractDatabase.java:504)
	at liquibase.Liquibase.checkDatabaseChangeLogTable(Liquibase.java:576)
	at org.ngrinder.infra.init.LiquibaseEx.update(LiquibaseEx.java:76)
	at org.ngrinder.infra.init.DatabaseUpdater.init(DatabaseUpdater.java:86)
	at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:800)
	at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:444)
	at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:791)
	at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:294)
	at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1349)
	at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1342)
	at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741)
	at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:505)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132)
	at org.eclipse.jetty.server.Server.start(Server.java:387)
	at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114)
	at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61)
	at org.eclipse.jetty.server.Server.doStart(Server.java:354)
	at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
	at org.ngrinder.NGrinderControllerStarter.run(NGrinderControllerStarter.java:236)
	at org.ngrinder.NGrinderControllerStarter.main(NGrinderControllerStarter.java:310)
Caused by: 
java.sql.SQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
  • 是老问题,试着解决

于是,我用tomcat容器启动了服务,结果报错:3.4.2还是springmvc,没有内置容器,所以还是要额外配置tomcat
在这里插入图片描述

  • 发现是jdk1.8+ api都不支持这个sun.net.spi.nameservice.NameServiceDescriptor

在这里插入图片描述

这个项目要用jdk1.7编译才能成功,idea修改file-project structure
在这里插入图片描述
再次build,成功
在这里插入图片描述

  • 接下来,轮到真正的添加一个tomcat容器了,这个网上搜,不提供细节
    在这里插入图片描述
  • 启动tomcat报错
27-Nov-2020 14:55:56.163 警告 [main] org.apache.catalina.core.AprLifecycleListener.init The APR based Apache Tomcat Native library failed to load. The error reported was [E:\apache-tomcat-8.5.32\bin\tcnative-1.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform]
 java.lang.UnsatisfiedLinkError: E:\apache-tomcat-8.5.32\bin\tcnative-1.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform

删除E:\apache-tomcat-8.5.32\bin\tcnative-1.dll 解决

  • 再报错
27-Nov-2020 14:58:44.143 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file
27-Nov-2020 14:58:44.144 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Context [/ngrinder_controller_war_exploded] startup failed due to previous errors
[2020-11-27 02:58:44,198] Artifact ngrinder-controller:war exploded: Error during artifact deployment. See server log for details.

我看了2天,并没有解决这2个问题:

  1. 启动时报转库建表语句中索引长度超长,启动失败
  2. 本地idea中增加tomcat容器启动失败

因为临时接到任务,要去搞APP自动化,所以目前ngrinder暂时放一放,感觉好难。springmvc源码看上去认识,但实际却还没有吃进去。

您好!要在Kubernetes上部署ngrinder,您可以按照以下步骤进行操作: 1. 创建一个Kubernetes命名空间(可选): ``` kubectl create namespace ngrinder ``` 2. 创建一个ngrinder的配置文件 `ngrinder.yaml`,内容如下: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: ngrinder-controller labels: app: ngrinder spec: replicas: 1 selector: matchLabels: app: ngrinder template: metadata: labels: app: ngrinder spec: containers: - name: ngrinder-controller image: ngrinder/controller:3.4 ports: - containerPort: 80 env: - name: NGRINDER_CONTROLLER_PORT value: "80" - name: NGRINDER_CONTROLLER_REGION value: "default" - name: NGRINDER_CONTROLLER_ADMIN_SECURITY value: "false" - name: NGRINDER_CONTROLLER_SERVER_MODE value: "single" - name: NGRINDER_CONTROLLER_CLUSTER_MODE value: "false" volumeMounts: - mountPath: /opt/ngrinder-controller/logs name: ngrinder-logs volumes: - name: ngrinder-logs emptyDir: {} --- apiVersion: v1 kind: Service metadata: name: ngrinder-controller-service labels: app: ngrinder spec: ports: - port: 80 targetPort: 80 selector: app: ngrinder type: LoadBalancer ``` 3. 使用kubectl命令创建deployment和service: ``` kubectl apply -f ngrinder.yaml -n ngrinder ``` 4. 等待ngrinder-controller的pod启动并暴露出外部服务,可以使用以下命令确认服务的IP地址: ``` kubectl get services -n ngrinder ``` 5. 当服务可用后,您可以通过浏览器访问ngrinder的Web UI,使用前一步中获取到的IP地址。 ``` http://<ngrinder-controller-service-external-ip> ``` 现在,您应该能够成功部署ngrinder在Kubernetes上了。请注意,这只是一个基本的示例配置,您可能需要根据自己的需求进行进一步的配置和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值