alibaba / nacos

an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.
https://nacos.io
Apache License 2.0
30.27k stars 12.84k forks source link

Configuration cannot be synchronized when two different nacos instances share a database #12643

Closed 48038411 closed 1 month ago

48038411 commented 1 month ago

Describe the bug Nacos version: 2.4.0 When I changed the Nacos data source to MySQL, the local nacos service and the online nacos service shared a database. After creating a new configuration file in the local nacos configuration center, the parameters can be returned normally when linking the local nacos service to call the configuration. However, when my online machine connects to the online nacos, the configuration is empty and the return code is "config not exist".

Expected behavior When I share the same data source, the configuration should be synchronized regardless of the service. Why is it that the same data source and configuration are the same, but only the service that created the configuration can read it?

Actually behavior When creating a configuration for a data source, only the service that currently creates the configuration can obtain the configuration, and other services that use the data source cannot obtain the configuration.

How to Reproduce Steps to reproduce the behavior:

  1. Deploy Nacos 2.4.0 on machine A, change the data source to MySQL, and start it
  2. Deploy Nacos 2.4.0 on machine B, change the data source to MySQL, and use the same data source as the first machine
  3. Machine A creates a configuration such as abc.yml, creates any service, and calls the interface of machine A to obtain the configuration, and it can be obtained
  4. After machine A creates the abc.yml configuration, the console of machine B can see that it cannot obtain the configuration file by creating any service and calling the interface of machine B to obtain the configuration

Desktop (please complete the following information):

Additional context Add any other context about the problem here.

MatthewAden commented 1 month ago

After machine A creates the configuration file abc.yml, can the consoles of both machine A and machine B see this configuration file abc.yml?

48038411 commented 1 month ago

After machine A creates the configuration file abc.yml, can the consoles of both machine A and machine B see this configuration file abc.yml?

Yes, it can, because they use the same data source, abc.yml is saved in the database

fuhouyu commented 1 month ago

you can see this issue #12515.

console query is use mysql database. but application query is use server cache.

48038411 commented 1 month ago

您可以查看此问题#12515。

控制台查询使用 mysql 数据库。但应用程序查询使用服务器缓存。

所以我认为这并不太合理,您发的issue链接我看了,最新评论说2.3.0之后的版本加了增量对账功能可以在30s内同步MySQL的变更到服务器本地,但实际上还是不存在

KomachiSion commented 1 month ago

数据库是作为数据的存储介质, 控制台因为查询流量不会很大, 主要是运维人员点击, 所以直接获取到数据库数据保证最新状态。

但是正常的客户端请求,如果也直接读取数据库, 那么就失去了水平扩展的可能, 所以设计必须是使用缓存来进行,这就要求更新配置必须通过暴露的对应api进行,以保证变更事件能够顺利通知到集群内到节点,进行缓存的更新,这个时间很短,基本1s内能完成。

如果想要两个不同的集群,使用同一个数据库做数据共享,这才是不合理的,2.3.0增加的增量数据对账,不是为了解决这个问题,是解决全量对账时间过长且对数据库存在瞬时压力的问题。

48038411 commented 1 month ago

数据库是作为数据的存储介质, 控制台因为查询流量不会很大, 主要是运维人员点击, 所以直接获取到数据库数据保证最新状态。

但是正常的客户端请求,如果也直接读取数据库, 那么就失去了水平扩展的可能, 所以设计必须是使用缓存来进行,这就要求更新配置必须通过暴露的对应api进行,以保证变更事件能够顺利通知到集群内到节点,进行缓存的更新,这个时间很短,基本1s内能完成。

如果想要两个不同的集群,使用同一个数据库做数据共享,这才是不合理的,2.3.0增加的增量数据对账,不是为了解决这个问题,是解决全量对账时间过长且对数据库存在瞬时压力的问题。

所以目前如果我是以运维人员的方式来登录控制台并添加配置,两台机器共用一个数据库,是不可行的对吧,A机器创建开发环境配置文件,B机器创建线上环境配置文件。独立开来,这样的做法才是正确的吗

fuhouyu commented 1 month ago

数据库是作为数据的存储介质, 控制台因为查询流量不会很大, 主要是运维人员点击, 所以直接获取到数据库数据保证最新状态。 但是正常的客户端请求,如果也直接读取数据库, 那么就失去了水平扩展的可能, 所以设计必须是使用缓存来进行,这就要求更新配置必须通过暴露的对应api进行,以保证变更事件能够顺利通知到集群内到节点,进行缓存的更新,这个时间很短,基本1s内能完成。 如果想要两个不同的集群,使用同一个数据库做数据共享,这才是不合理的,2.3.0增加的增量数据对账,不是为了解决这个问题,是解决全量对账时间过长且对数据库存在瞬时压力的问题。

所以目前如果我是以运维人员的方式来登录控制台并添加配置,两台机器共用一个数据库,是不可行的对吧,A机器创建开发环境配置文件,B机器创建线上环境配置文件。独立开来,这样的做法才是正确的吗

如果是开发和线上使用的是同一个数据库的话,是可以使用命名空间做隔离的吧。 还是说你们的机器配置是,A和B均可以连接数据库,但是A和B,或者说服务部署时只能单连接A/B服务器,所以才需要这样。

KomachiSion commented 1 month ago

如果需要做开发和线上环境隔离,为什么不是开发和线上2个nacos+2个数据库,而是使用2个nacos+1个数据库?

即使用一个数据库实例,也不至于用同一个database吧。

KomachiSion commented 1 month ago

No more response from author for a long time, and this problem seems env problem.