关于#微服务负载均衡的问题,如何解决?

问题遇到的现象和发生背景

请教一个问题,我这有一个项目是采用微服务架构和动静分离。想做高可用,和负载均衡。

操作环境、软件版本等信息

系统是linux7.6版本。我想用nginx+keepalived实现nginx的高可用,通过nginx负载均衡,配置多个后端节点,分配用户的并发访问请求,那么多个后端节点,怎么连接一个数据库,(多个后端节点同时读取写入一个数据库,有没有什么影响,怎么解决),服务采用nacos自动注册,多个后端节点,怎么注册到一个nacos,会不会有冲突?

  1. 多个微服务,每个微服务部署多个节点;服务连接什么数据库,在配置里指定数据库的域名就行。
  2. 至于你问的一个数据库,我理解下来是一个IP实例数据库么?生产环境下,哪怕没有高并发高流量,也会将数据库部署到多个节点保证高可用。多个微服务连接一个数据库,如果流量上来了,此时可以考虑数据库的水平和垂直拆分。
  3. Nacos注册,注册时,会带上服务的名称和节点IP的啊,IP肯定不一致,不会有冲突。无论是前端还是后端请求其他后端服务,Nacos通过软件负载均衡自动选择一个节点转发请求。
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    关于问题的回答如下:

    高可用和负载均衡的实现: 1.采用nginx+keepalived实现nginx高可用。需要确保已经安装并启动了nginx和keepalived,可以参考官方文档进行配置。 2.通过nginx实现服务的负载均衡,可以采用ip_hash或round-robin等策略,在nginx.conf文件中配置upstream来实现,示例代码如下:

    upstream backend { ip_hash; server 192.168.1.10:8080 weight=1; server 192.168.1.11:8080 weight=1; server 192.168.1.12:8080 weight=1; }

    3.对于多个后端节点连接一个数据库,可以采用主从复制实现读写分离,同时使用连接池保证连接的可用性。一般情况下,读操作可以优先路由到从库上,写操作可以路由到主库上。可以使用不同的配置文件对主库和从库进行配置,示例代码如下:

    主库配置文件

    spring.datasource.url=jdbc:mysql://192.168.1.10:3306/dbname?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.hikari.connection-timeout=3000 spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.minimum-idle=5

    从库配置文件

    spring.datasource.url=jdbc:mysql://192.168.1.11:3306/dbname?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.hikari.connection-timeout=3000 spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.read-only=true

    4.多个后端节点可以注册到一个nacos上,只需要在application.properties或application.yml文件中进行配置即可,示例代码如下:

    spring.cloud.nacos.discovery.server-addr=192.168.1.10:8848,192.168.1.11:8848,192.168.1.12:8848

    对于nacos配置中的用户名密码转义问题,可以避免使用#符号,或者在密码中使用url编码来解决。同时,服务注册时需要注意填写正确的服务地址,以及服务注册成功后在nacos控制台中进行查看。如果出现问题,需要检查nacos集群是否已经升级到2.x版本,并且关闭双写。可以使用curl命令来关闭双写,示例代码如下:

    curl -X PUT 'localhost:8848/nacos/v1/ns/operator/switches?entry=doubleWriteEnabled&value=false'

    如果存在节点没有以2.x模式启动的情况,可以尝试重启该节点,或者手动将其切换到2.x模式。可以通过查看naming-server.log中的元数据字段来确定节点是否准备好升级。最终需要确保所有节点都升级成功,以保证服务的正常注册和调用。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^