Ubuntu20.04LTS:MySQL8 + Nacos + Docker (解决痛点 No DataSource set)

成功配图

笔者只想在云服务器打开 单机模式练习微服务养老,奈何受尽纳克斯的折磨,现将成功的关键要点简述如下:

🎯 核心:初始化数据库

意思就是,你要启动服务器,首先你得要有这个数据库:

nacos-mysql.sql

把它下载下来(或者复制全文,新建文本保存,修改后缀为 .sql
数据表

把 nacos 服务跑通!

我重启服务器发现 nacos 挂了,反复挂空表、或者注入 sql 启动测试得知:

  • nacos 只支持 utf-8 编码(即 utf-8mb3 两者等同)的数据库(不支持 utf-8mb4 编码,否则启动报错无数据源设置;可以在 navicat 中右键点击数据库名字 > 更改编码设置)
  • 数据库如果覆盖过用户密码表,nacos 网页需要清空缓存,才能用老密码访问。

(初始化,不是叫你删完所有的数据库,也不是谷歌搜到什么 mysql --initial 简直不要太吓人!😨

如果你要测试挂空表,记得先备份好数据)

官方手册 的内容很老(参数过时了),项目库的文档才是新的,而且提案 No DataSource set 80%原因就是首次启动要初始化数据库,它本身不会自动初始化。

数据库管理工具(可选):

  • Navicat 软件

  • 原生的 MySQL 命令:

# 备份
mysqldump -uroot -p  {{database_name}} > {{new_database_name.sql}}

# 导入
create database <newdb>
use <newdb>
source /path/to/file.sql
show tables;

🐱‍👤 参考我的配置(半封装版)

完全封装版(一键拉取)看起来简单好用,但一旦不好用,那真是喊破喉咙也都没人救你。

好在 Nacos Docker 官方使用说明书 有 docker-files 这种半封装的,可以自己改好几个配置,再运行起来。

但觉得它的样例不够简单,特别对我 1 核 2G 的服务器来说,内存很吃紧,所以稍微优化了一下

# vim example/standalone-mysql-8.yaml
version: "2"
services:
  nacos:
    image: nacos/nacos-server:${NACOS_VERSION}
    container_name: nacos
    env_file:
      - ../env/nacos-standlone-mysql.env
    volumes:
      - ./standalone-logs/:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
		environment:      # 设置环境变量,相当于docker run命令中的-e
	  # JVM调优参数
      - JVM_XMS=64m   #-Xms default :1g
      - JVM_XMX=64m   #-Xmx default :1g
      - JVM_XMN=16m   #-Xmn default :512g
      - JVM_MS=8m     #-XX:MetaspaceSize default :128m
      - JVM_MMS=8m    #-XX:MaxMetaspaceSize default :320    
ports:
      - "8848:8848"
    depends_on:
      - mysql
    restart: always
  mysql:
    container_name: mysql
    image: mysql:8.0.26
    env_file:
      - ../env/mysql.env
    volumes:
      - /mydata/mysql/log:/var/log/mysql
      - /mydata/mysql/data:/var/lib/mysql
      - /mydata/mysql/conf:/etc/mysql
      - /home/mysql/mysql-files:/var/lib/mysql-files
    ports:
      - "3306:3306"

官方定制 MySQL 版本 8.0.16 ,版本不用卡那么死,其实 8+ 都是支持的(因为依赖项 java-mysql-connector.jar 只要满足 8+ 就行)。

挂载文件看喜好。

单机模式一个 8848 端口够用了。

配置中提到的两个运行环境文件也要修改一下:

# vim env/nacos-standlone-mysql.env
PREFER_HOST_MODE=hostname
MODE=standalone
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=admin
MYSQL_SERVICE_PASSWORD=mima
MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai

注意 :

MYSQL_SERVICE_HOST=mysql 这里要写 mysql 服务的host,不能写 127.0.0.1 或者 localhost ;如果你测试能用(我跑通懒得测了),可以评论区告诉我修改。

这里参数不指定上海时区,也可以运行。(又一个奇怪的特性🙄)

MYSQL_DATABASE=nacos
MYSQL_USER=admin
MYSQL_PASSWORD=mima

MySQL 初始化的配置,不过你还需要满足条件:创建用户、赋予权限、创建数据库、导入空表等等

CREATE USER 'admin'@'%' IDENTIFIED BY 'mima';
grant all on nacos.* to 'admin'@'%' WITH GRANT OPTION;
create database nacos character set utf8mb4;

最后

# 启动
docker start nacos
# 查看进程
docker logs -f nacos

阿里云防火墙放行 8848 端口,通过 ip 就能访问 nacos 了,没必要用反向代理(如果用了,和 HTTPS 的转发冲突,搞晕你 😵):

# 没必要使用反向代理,但你也可以试试
server {

        listen   8848;
        location / {
                return      301 http://$server_name$request_uri;
        }

        # Nacos
        location /nacos {
                proxy_pass http://localhost:8848;             #反向代理地址+端口
                proxy_set_header Host $http_host;             #设置Host
                proxy_set_header X-Real-Ip $remote_addr;      #设置客户端远程地址
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-NginX-Proxy true;
        }

}

打开网页。

登陆,修改密码。

数据库工具,导入原来备份的数据。

刷新网页。

搞定。

如文章开头所示。

🥰 这样就能节省本地虚拟机的爆炸多的内存呢!而且还不担心关机掉线。

省内存
而且配置还能本地备份,甚至从数据库改参数(比如网页不能改的md5),不要太方便。
Navicat
经过 JVM 性能调优,压缩了堆内存空间,现在的结果我是比较满意的:
服务器上的监控

🥴 测出来的奇怪特性

1)Ubuntu 本地服务 和 Doker 完全封装版(一键拉取) Nacos 不兼容

Ubuntu:20.04 LTS
MySQL:8.0.25 ,System.Service
Docker:20.10.8, build 3967b7d
nacos/nacos-server: 2.0.3

❯ systemctl status mysql.service

● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2021-05-22 12:09:49 CST; 2 months 27 days ago
   Main PID: 103154 (mysqld)
     Status: "Server is operational"
      Tasks: 43 (limit: 2318)
     Memory: 361.6M
     CGroup: /system.slice/mysql.service
             └─103154 /usr/sbin/mysqld

May 22 12:09:48 Ubuntu systemd[1]: Starting MySQL Community Server...
May 22 12:09:49 Ubuntu systemd[1]: Started MySQL Community Server.

尝试过:

  • 封装版,无参数。成功
  • 封装版,运行加一堆连接数据库的参数。失败
  • 封装版,运行加一堆连接数据库的参数,进入容器修改 application.properties 。失败
  • 封装版,运行修改各种连接数据库的参数。失败
  • 手动登陆MySQL查看表数据。正常

总之想持久化保存配置,用系统服务管理的,老不成功,索性备份数据库,卸载本地服务版 MySQL,改 Docker 版 MySQL。

为什么统一用 docker 管理呢,因为

2)CentOS8 配置 Docker 完全封装版(一键拉取)很简单

在虚拟机,用 Docker 管理 MySQL 和 nacos,用简单的封装版本,配置还算顺利

docker run -p 8848:8848 --name nacos \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=虚拟机ip \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=yonghuming \
-e MYSQL_SERVICE_PASSWORD=mima \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e MYSQL_SERVICE_DB_PARAM="characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai" \
-v /mydata/nacos/logs:/home/nacos/logs \
-d nacos/nacos-server

最开始下载了 nacos 源码自己编译,才配置数据库,初始化数据库开始的。

第二天,重启电脑莫名其名网页打不开,看日志发现报错 No DataSource set ,感觉就是那种输出很多段 Cause By, 但没有一个告诉你老板去哪了的保安。

谷歌发现 MySQL8+ 需要指定时区,进入容器修改 &serverTimezone=Asia/Shanghai 就修好了。

或者,像上面在运行时指定参数。

但同样的方法在 Ubuntu 失效。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值