Nacos 是配置管理中心,由阿里开源,java编写的能够帮助我们快速实现动态服务发现、服务配置、服务元数据及流量管理。是以服务为中心的架构中的基础设施;
官网https://nacos.io/
Nacos由多种部署方式,单机、集群、多集群, 数据的存储除了内置的嵌入式数据库实现数据的存储以外,0.7版本增加了支持mysql数据源能力;但是当通过docker+mysql进行部署时,由于官方提供的docker image,更新并不及时,导致部署时问题不少;下面是我部署时遇到的一些问题;我参考了文档上提供的docker-compose 文档(https://github.com/nacos-group/nacos-docker)
-
首先是mysql的版本问题,nacos只支持的mysql版本是5.6.5+
-
当使用自己非官方提供的mysql docker image (nacos/nacos-mysql:8.0.16) 时,需要在合适用户下添加一个合适的数据库,并导入nacos预制的表结构,如果你是直接通过上述的docker-compose文件中的standalone-mysql-8.yaml 来启动docker的话,当访问nacos控制台并提交配置或者相关创建操作时,会报参数格式错误,这是因为nacos/nacos-mysql:8.0.16 镜像中,预置的sql文件中,config_info 和his_config_info 表中缺失字段encrypted_data_key,log日志中也是报无法找到这个字段,需要手动添加这个字段
ALTER TABLE <表名> ADD encrypted_data_key text not null;
最新的nacos-msyql.sql 文件见https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql添加链接描述
报错示例:
caused: PreparedStatementCallback; bad SQL grammar
[SELECTid,data_id,group_id,tenant_id,app_name,content,md5,gmt_create,gmt_modified,
src_user,src_ip,c_desc,c_use,effect,type,c_schema,encrypted_data_key FROM
config_info WHERE data_id=? AND group_id=? AND tenant_id=?];
nested exception is java.sql.SQLSyntaxErrorException:
Unknown column 'encrypted_data_key' in 'field list';
caused: Unknown column 'encrypted_data_key' in 'field list';
- nacos docker 启动时,需要在配置mysql url参数中指定时区serverTimezone=Asia/Shanghai 否则会链接数据库失败;既 MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
Caused by: java.lang.IllegalStateException: No DataSource set
at org.springframework.util.Assert.state(Assert.java:73)
at org.springframework.jdbc.support.JdbcAccessor.obtainDataSource(JdbcAccessor.java:77)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:371)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:452)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:462)
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:473)
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:480)
at com.alibaba.nacos.config.server.service.repository.extrnal.ExternalStoragePersistServiceImpl.findConfigMaxId(ExternalStoragePersistServiceImpl.java:674)
at com.alibaba.nacos.config.server.service.dump.processor.DumpAllProcessor.process(DumpAllProcessor.java:51)
at com.alibaba.nacos.config.server.service.dump.DumpService.dumpConfigInfo(DumpService.java:282)
at com.alibaba.nacos.config.server.service.dump.DumpService.dumpOperate(DumpService.java:195)
... 61 common frames omitted
- 如果还是发现无法连接你的mysql时, 检查nacos docker启动时 配置的环境变量mysql相关参数是否正确 ,主要参数是 MYSQL_SERVICE_HOST、MYSQL_SERVICE_DB_NAME、MYSQL_SERVICE_PORT、MYSQL_SERVICE_USER、MYSQL_SERVICE_PASSWORD