MYSQL8.0+远程连接|主从复制配置|各种错误(吐血整理)

news2024/11/19 17:27:49

目录

环境介绍

主机/从机文件配置

主机部分

从机部分

连接测试

报错踩坑|解决办法


写在前面:最近在做项目优化,看完黑马的mysql的主从复制后,准备着手来练练,没想到这入坑就是三四天的错,心情烦躁。如今已解决,留下此篇,恭祝各道友顺利搭建。请大家认真阅读红字部分。

环境介绍

服务器:阿里云服务器(主机)、华为云服务器(从机)

系统:两者均为Centos7.6(  建议服务器系统保持一致 )

mysql安装版本:8.0.21

主机/从机文件配置

小知识:

        数据库主从复制,就是通过配置把数据(指新写入的数据,旧的数据不会复制)从主数据库复制到从数据库,使得数据保持一致性!
前提:数据库版本需要一致!不同版本对应的配置项名称可能存在改动,请自行查看官网文档!

mysql官方文档https://dev.mysql.com/doc/refman/8.0/en/replication.html        阅读官方文档可知,我们有两种方法配置主从复制,一种是传统的基于二进制日志文件的方法(需要配置同步日志文件及其位置),另外一种是基于全局事务标识符(GTID)的方法(实际也需要用到二进制日志文件,但不需要配置同步日志文件及其位置)。

        这里主要介绍第一种,基于二进制日志文件的方法,同步日志。并且mysql的版本在8.0.26以下!
 

主机部分

配置主数据库的 my.cnf 配置文件,本人的文件位置在:

vim /etc/my.cnf
[mysqld]
#这是安装时候配置的文件路径(不要复制)
basedir=/usr/local/mysql-8.0/
datadir=/usr/local/mysql-8.0/data/
socket=/tmp/mysql.sock
character-set-server=UTF8MB4
#上面安装时候配置的文件路径(不要复制)

# 设置同步的binary log二进制日志文件名前缀,默认为binlog;在MySQL 8.0中,无论是否指定--log bin选项,默认情况下都会启用二进制日志记录,并将log_bin系统变量设置为ON。
log-bin=mysql-bin
# 服务器唯一id,默认为1,值范围为1~2^32−1. ;主数据库和从数据库的server-id不能重复
server-id=1

###可选配置
# 需要主从复制的数据库,如多个则重复配置
binlog-do-db=test
# 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步),如多个则重复配置
binlog-ignore-db=mysql
# 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
binlog_format=row
# 配置二进制日志自动删除/过期时间,单位秒,默认值为2592000,即30天;8.0.3版本之前使用expire_logs_days,单位天数,默认值为0,表示不自动删除。
binlog_expire_logs_seconds=2592000
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断,默认OFF关闭,可选值有OFF、all、ddl_exist_errors以及错误码列表。8.0.26版本之前使用slave_skip_errors
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

注意:以下是必须有的

  • server-id 主机和从机不要设置成一样的;
  • log-bin 主机必须有,从机可有可无,如果有和主机保持一致;

重启数据库:

service mysql restart

效果图

 登录mysql:

mysql -u root -p 123456

启动主数据库,创建一个同步复制用户(非必需,也可以用root用户,但不建议):

ps:本人最终还是用了root,原因可参考目录 报错踩坑|解决办法 部分

CREATE USER 'liusir'@'%' IDENTIFIED BY '123456';

ps:如果这里执行报错,可以使用 use mysql,随便选择一个库。然后执行上述命令。

说明:

  •     MySQL创建用户命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password';
  •     username:指定创建的用户名
  •     host:指定用户登录的主机ip,% 表示任意主机都可远程登录,localhost 表示本地才能登录
  •     password:指定该用户的登录密码
     

接着给创建的用户授权同步复制权限:

GRANT REPLICATION SLAVE ON *.* TO 'liusir'@'%';

说明:

  •     MySQL创建授权命令:GRANT REPLICATION SLAVE ON database.table TO 'username'@'host';
  •     privilege :指定授权的权限,比如create、drop等权限,具体有哪些权限,可查看官网文档
  •     database:指定哪些数据库生效,*表示全部数据库生效
  •     table:指定所在数据库的哪些数据表生效,*表示所在数据库的全部数据表生效
  •     username:指定被授予权限的用户名
  •     host:指定用户登录的主机ip,%表示任意主机都可远程登录

 刷新权限:

FLUSH PRIVILEGES;

接着执行命令查看并记下binary log二进制日志文件名 File 以及位置 Position的值,需要在从数据库用到:

SHOW MASTER STATUS;

从机部分

配置从数据库的 my.cnf 配置文件,本人的文件位置在:

vim /etc/my.cnf
[mysqld]
#这是安装时候配置的文件路径(不要复制)
basedir=/usr/local/mysql-8.0/
datadir=/usr/local/mysql-8.0/data/
socket=/tmp/mysql.sock
character-set-server=UTF8MB4
#上面安装时候配置的文件路径(不要复制)

# 设置同步的binary log二进制日志文件名前缀,默认是binlog
log-bin=mysql-bin
# # 服务器唯一id,默认为1,值范围为1~2^32−1. ;主数据库和从数据库的server-id不能重复
server-id=2
#
# ###可选配置
# # 需要主从复制的数据库 ,如多个则重复配置
replicate-do-db=test
# # 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步) ,如多个则重复配置
binlog-ignore-db=mysql
# # 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# # 主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
binlog_format=row
# # 配置二进制日志自动删除/过期时间,单位秒,默认值为2592000,即30天;8.0.3版本之前使用expire_logs_days,单位天数,默认值为0,表示不自动删除。
binlog_expire_logs_seconds=2592000
# # 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断,默认OFF关闭,可选值有OFF、all、ddl_exist_errors以及错误码列表。8.0.26版本之前使用slave_skip_errors
# # 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# # relay_log配置中继日志,默认采用 主机名-relay-bin 的方式保存日志文件
relay_log=replicas-mysql-relay-bin
# # log_replica_updates表示slave是否将复制事件写进自己的二进制日志,默认值ON开启;8.0.26版本之前使用log_slave_updates
log_slave_updates=ON
# # 防止改变数据(只读操作,除了特殊的线程)
read_only=ON
CHANGE MASTER TO MASTER_HOST='101.201.82.111',MASTER_PORT=3306,MASTER_USER='liusir',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000018',MASTER_LOG_POS=156;

说明

  •     MASTER_HOST/SOURCE_HOST:主数据库的主机ip
  •     MASTER_PORT/SOURCE_PORT:主数据库的端口,不设置则默认是3306
  •     MASTER_USER/SOURCE_USER:主数据库被授予同步复制权限的用户名
  •     MASTER_PASSWORD/SOURCE_PASSWORD:对应的用户密码
  •     MASTER_LOG_FILE/SOURCE_LOG_FILE:在主数据库执行命令show master status 查询到的二进制日志文件名称
  •     MASTER_LOG_POS/SOURCE_LOG_POS:在主数据库执行命令show master status 查询到的位置 Position的值
     

最后开启主从复制工作:

START SLAVE;

 易错点:

mysql>  start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

若发生错误,这里可以使用:

 reset slave;

reset slave是各版本Mysql都有的功能,在stop slave之后使用。主要做:

  • 删除master.info和relay-log.info文件;
  • 删除所有的relay log(包括还没有应用完的日志),创建一个新的relay log文件;

ps: 从Mysql 5.5开始,多了一个all参数。如果不加all参数,那么所有的连接信息仍然保留在内存中,包括主库地址、端口、用户、密码等。这样可以直接运行start slave命令而不必重新输入change master to命令,而运行show slave status也仍和没有运行reset slave一样,有正常的输出。但如果加了all参数,那么这些内存中的数据也会被清除掉,运行show slave status就输出为空了。
 

查看主从复制的状态:

SHOW SLAVE STATUS \G;

假如显示 Slave_IO_Running/Replica_IO_RunningSlave_SQL_Running/Replica_SQL_RunningYes ,以及Slave_IO_State/Replica_IO_StateWaiting for master to send event/Waiting for source to send event,则证明主从复制成功!

效果图

 假如需要停止主从复制工作,则执行以下命令:

STOP SLAVE;

假如需要重启主从复制工作,则执行以下命令:

RESTART SLAVE;

如果你上述所有步骤都没有问题,那恭喜你可以直接进入测试环节:

连接测试

在主数据库创建一个test数据库,并新建user表,然后在主数据库执行插入语句:

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> use test;
Database changed

mysql> create table sucess(id int auto_increment,name varchar(10),primary key(id));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into sucess(id,name) values (1,'hello');
Query OK, 1 row affected (0.00 sec)

ps:除了命令行界面,也可以在客户端进行创建测试;

切换至从库,查看从库同步更新效果:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

发现test已经同步更新成功!如果这就好了,那就恭喜你了,真让人羡慕^__^


报错踩坑|解决办法

客户端远程连接错误

        现在市面上有很多连接数据库的客户端软件,比如sqlyog、Navicat、dataGrip等。这些软件相对来说Navicat更好用一些。就拿IDEA系列的dataGrip来说,在测试连接的时候可能会报[08S01]错误:

[08S01]
    Communications link failure

    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
No appropriate protocol (protocol is disabled or cipher suites are inappropriate).

这个解决办法一般是将useSSL改为false,默认是TRUE。但本人第一次测试的时候,TRUE也是可访问的,所以这个应该还存在些其他错误。总之就是有些坑。如果实在解决不了,建议换成Navicat,新版挺好用的。

 Slave_IO_Running:Connecting

这个就是 MySQL配置主从同步失败:Slave_IO_Running:Connecting ,错误样例如下所示

 正确的预期目标如下所示:

下面给创建的用户授权同步复制权限,可能会因为权限问题导致连接不上主库,所以我在尝试了其他所有办法后,最终还是选择了直接使用root,使用root用户后就成功了

GRANT REPLICATION SLAVE ON *.* TO 'liusir'@'%';

这就意味着你使用root,可能就直接连接上了:

CHANGE MASTER TO MASTER_HOST='101.201.82.111',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000018',MASTER_LOG_POS=156;

ps:不太清除具体原因,可能是其他原因导致的,当然你也可以使用下面这个sql给用户赋所有权限尝试,不过我并未取得成功。

grant all privileges on *.* to 'liusir'@'%';

上面是我最后成功发现的,如果你直接按照我的也成功了,那就恭喜了。如果还没成功的话,或者想深究的话,请看下面故障分析过程,所用到的命令都会一一罗列,就不需要到处查其他资料了。


 故障梳理

  1.       网络不通
  2.       防火墙端口未开放
  3.       mysql账户密码错误
  4.       mysql主从机配置文件写错
  5.       配置从机连接语法错误
  6.       主机未开放账户连接权限

网络不通

在主机和从机中分别进行 ping 命令测试:

[root@liustudy /]# ping 120.16.222.20(你的ip)
PING 120.46.222.20 (120.46.222.20) 56(84) bytes of data.
64 bytes from 120.46.222.20: icmp_seq=1 ttl=47 time=5.89 ms
64 bytes from 120.46.222.20: icmp_seq=2 ttl=47 time=5.81 ms
64 bytes from 120.46.222.20: icmp_seq=3 ttl=47 time=5.86 ms
64 bytes from 120.46.222.20: icmp_seq=4 ttl=47 time=5.83 ms
64 bytes from 120.46.222.20: icmp_seq=5 ttl=47 time=5.81 ms

如果是上述结果,就说明可ping通。使用Ctrl+C结束命令。如果不通那可能就是服务器问题了。

防火墙端口未开放

查看防火墙状态命令:

service  iptables status
systemctl status firewalld
[root@liustudy /]# systemctl status firewalld
● firewalld.service
   Loaded: masked (/dev/null; bad)
   Active: inactive (dead)

[root@liustudy /]# service  iptables status
Redirecting to /bin/systemctl status iptables.service
● iptables.service - IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Mon 2023-01-02 19:14:36 CST; 2 days ago
  Process: 9304 ExecStop=/usr/libexec/iptables/iptables.init stop (code=exited, status=0/SUCCESS)
  Process: 560 ExecStart=/usr/libexec/iptables/iptables.init start (code=exited, status=0/SUCCESS)
 Main PID: 560 (code=exited, status=0/SUCCESS)

ps:至于这两个命令的更详细的信息可以参考博客:

linux的防火墙firewalld和iptables区别和用法icon-default.png?t=MBR7http://t.csdn.cn/T9FIm

CentOs7关闭防火墙的命令,根据需要自行选择即可

(1)暂时关闭防火墙

  • systemctl stop firewalld
  • service  iptables stop

(2)永久关闭防火墙

  • systemctl disable firewalld
  • chkconfig iptables off

Mysql账户密码错误

用"mysql -u用户名 -p密码 -h主机ip"尝试登录主机,测试是否为账号密码错误。

mysql -uroot -p123456 -h101.120.22.102

如果因为多次尝试远程登录而导致远程连接被拒,如下面错误:

ERROR 1129 (HY000): Host 'ip' is blocked because of many connection errors; unblock with
"mysqladmin flush-hosts!

解决办法:

在主机执行"mysqladmin -uroot -pxxx flush-hosts ",提示不要输入明文密码可以忽略,然后重新登录

 mysql主从机配置文件写错

检查主机和从机中的server-id是否不同,查看主从机配置文件命令: "vim /etc/my.cnf"

 

注:确保主机配置文件中没有配置bind-address参数,该参数用于指定访问主机的ip地址

 配置从机连接语法错误

CHANGE MASTER TO
MASTER_HOST='master_host_name',
MASTER_USER='replication_user_name',
MASTER_PASSWORD='replication_password',
MASTER_LOG_FILE='recorded_log_file_name',
MASTER_LOG_POS=recorded_log_position;
  •        master_host_name : MySQL主机地址
  •        replication_user_name : 备份账户用户名
  •        replication_password :备份账户密码
  •        recorded_log_file_name :bin-log的文件名
  •        recorded_log_position : bin-log的位置(数字型)

 bin-log的文件名和位置可以通过主机执行"show master status"指令查看!

查看bin-log文件列表:

show binary logs;

主机未开放账户连接权限

        通过指令"select user,host from user;"查看备份账号IP访问权限是否为'%',通过"show grants for liuyu;"查看复制账户是否拥有REPLICATION CLIENT、REPLICATION SLAVE、SUPER、RELOAD权限;

 如果缺少权限,则可以使用:

grant REPLICATION CLIENT ON *.* TO liusir;
grant REPLICATION SLAVE ON *.* TO liusir;
grant SUPER ON *.* TO liusir;
grant reload on *.* to liusir;
FLUSH PRIVILEGES;

一般以上六步排查即可解决问题,如果还有其它问题,欢迎评论一起讨论!


常用命令:

1. 在登录mysql后,可使用下面命令来获取错误日志的路径,然后退出登录使用cat进行查看即可:

SHOW VARIABLES LIKE 'log_error';

2. 查看防火状态

systemctl status firewalld
service  iptables status

3. 暂时关闭防火墙

systemctl stop firewalld

service  iptables stop

4.永久关闭防火墙

systemctl disable firewalld

chkconfig iptables off

5.重启防火墙

systemctl enable firewalld

service iptables restart  

6.永久关闭后重启

chkconfig iptables on

7.查看进程

ps -ef |grep mysql

8.查找文件

find / -name mysql

9.复制权限

grant all privileges on *.* to 'liusir'@'%';

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud笔记 - Day1 概念注册中心负载均衡

https://www.bilibili.com/video/BV1LQ4y127n4 1. 微服务导学 异步通信可以大大提高服务的并发。 服务的异常定位: 分布式日志服务系统监控和链路追踪 自动化部署:Jenkins——docker——k8s——RANCHER 持续集成 2. 微服务导学2 微服务治理、异步通…

【EHub_tx1_tx2_E100】Ubuntu18.04 + ROS_ Melodic + RS-LiDAR-16 激光雷达测试

简介:介绍 RS-LiDAR-16 16线激光雷达 在EHub_tx1_tx2_E100载板,TX1核心模块环境(Ubuntu18.04)下测试ROS驱动,如何打开使用RVIZ 查看点云数据,本文的前提条件是你的TX1里已经安装了ROS版本:Melo…

类和对象2

static关键字 1.静态变量或方法不属于对象,但依赖类。 2.静态变量是全局变量,生命周期从类被加载后一直到程序结束 3.静态变量内存只存一份,在静态方法区存储(静态方法区:静态变量,类信息(方法…

Odoo 16 企业版手册 - 库存管理之仓库管理

仓库管理 仓库管理是公司库存运营中的重要活动之一。为了使库存运营和调拨的顺利运作,公司的仓库应该得到适当的管理和监控。Odoo,作为一名优秀的库存管理助理,可以为您提供有效管理公司仓库的专用平台。Odoo提供的工具可以帮助您同时管理多个…

解决Tinkphp的success跳转“使用路由别名后模块和控制器访问不了”问题

遇到的问题:我的thinkphp5网站添加了以下路由别名:Route::alias([ index>index/index, ]);使用http://域名/Index/user/password.html访问正常但使用http://域名/index/user/password.html就访问失败使用$this->success(修改密码成功);进行提示跳转…

【MySQL】MySQL面试题八股文详解——事务篇

【MySQL】MySQL面试题八股文详解——事务篇 1:什么是数据库事务? 一言蔽之,事务是逻辑上的一组操作,要么都执行,要么都不执行。 是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作&…

C语言经典编程题 --- 打印菱形

目录 一、题目描述 二、普通解法 三、曼哈顿距离解法 一、题目描述 输入一个奇数 n,输出一个由 * 构成的 n 阶实心菱形 输入格式:一个奇数 n。 输出格式:输出一个由 * 构成的 n 阶实心菱形。 输入样例:5输出样例&#xff1…

【操作系统】生产环境消失的进程如何排查

文章目录1.生产环境问题描述2.Linux软件环境准备3.编译运行程序,分析现象4.进程消失原因分析5.生产类似进程消失的案例6.如何通过日志查看消失进程1.生产环境问题描述 一台机器上的某个进程直接就消失了,别的机器上的服务都正常跑着,怎么排查…

AI城管占道经营识别检测算法 yolo

AI城管占道经营识别检测算法通过yolopython深度学习训练框架模型对道路街区小摊贩占道经营违规摆摊行为进行检测,检测有出店经营占道经营违规摆摊情况,yolopython深度学习训练框架模型会立即抓拍存档。我们使用YOLO(你只看一次)算法进行对象检测。YOLO是…

重学ElasticSearch (ES) :ELK搭建SpringBoot日志实时分析系统

一、概述 在一个大型的分布式架构的项目里,不同的服务模块部署在不同的服务器上,如果想要定位问题,可能需要去不同的服务器上查看不同服务的日志。 那么,ELK可以很方便的把日志集成到一起,无须再去各个服务器上的日志中…

Python自带的常数scipy.constants

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】Python自带的常数scipy.constants[太阳]选择题以下python代码结果错误的一项是?from scipy import constants print(【圆周率constants.pi】,constants.pi)print(【时间单位constants.minute】…

[实例讲解]计算机处理任务的方法和原理--线程

[实例讲解]计算机处理任务的方法和原理 文章目录[实例讲解]计算机处理任务的方法和原理情景一 所有的事情自己做情景二 找人去帮忙处理打印情景三 分别找人处理编码和打印情景四 不特定指定人去帮忙结束语在学习和工作中,我们自己都需要做很多的事情,事情…

【机器学习】匈牙利和KM匹配个人理解

基础知识 二分图 【定义】图论中的一种特殊模型。若能将无向图G(V,E)的顶点V划分为两个交集为空的顶点集,并且任意边的两个端点都分属于两个集合,则称图G为一个为二分图。 【解释】一张图要是二分图,需要满足以下几个要求: &a…

PS 矩形选区工具(2)模式快捷键 选区比例调整 颜色填充

本文为PS 矩形选区工具(1)基本用法 生成图层 选区方式演示讲解的续文 拉出选区后 用鼠标拖动选区 是可以拖动选区位置的 拉出一块选区是 按住键盘 Shift键 就可以用鼠标再拖出一块选区 加选区快捷键 按住 Shift 减选区 按住键盘 Alt 键 用鼠标拖出不要的选区位置即可 减选…

新认定金山区企业技术中心给予一次性奖励15万元

金山区企业技术中心一、主管部门金山区经济委员会二、政策依据《金山区关于深化建设打响“上海制造”品牌的重要承载区促进实体经济高质量发展的若干政策》&#xff08;金府发〔2019〕8号&#xff09;《印发<关于深化建设打响“上海制造”品牌的重要承载区促进实体经济高质量…

衣服、商品、商城网站模板首页,仿U袋网,vue+elementui简洁实现(三)

一.以往版本回顾 作者成品效果访问&#xff1a;点击访问 官方详情页访问&#xff1a;点击访问 版本1《衣服、商品、商城网站模板首页&#xff0c;仿U袋网&#xff0c;vueelementui简洁实现》版本2《衣服、商品、商城网站模板首页&#xff0c;仿U袋网&#xff0c;vueelementui…

【微服务】springboot 实现elasticsearch索引数据迁移

一、前言 在生产系统中&#xff0c;经常可能面临的一个状况就是&#xff0c;随着实际业务发生变更&#xff0c;现有的数据模型可能需要调整&#xff0c;而且到了必须调整不可的时候&#xff0c;那就只能硬着头皮做了&#xff1b; 数据模型的调整&#xff0c;说的大一点&#xf…

flask 和 echarts 使用柱状图折线图等可视化图表展示二手房统计数据

目录 一、实战场景 二、知识点 python 基础语法 python 文件读写 pandas 数据处理 flask web 框架 echarts 图表 jinja 模版 三、菜鸟实战 初始化 Flask 框架&#xff0c;设置路由 各行政区房屋均价柱状图分析 echarts 渲染柱状图 各面积区间房屋占比饼状图 echa…

逻辑漏洞渗透与攻防(六)之其他类型逻辑漏洞

目录 其他类型逻辑漏洞 数据包重放漏洞 条件竞争漏洞 订单金额任意修改 接口无限制枚举 支付漏洞 修改商品数量 修改支付状态 修改附属值 越权支付 无限制试用 支付漏洞总结 SRC中的逻辑漏洞总结 其他类型逻辑漏洞 数据包重放漏洞 漏洞介绍&#xff1a;通…

SpringBoot下RabbitMQ的实战应用:动态创建和动态监控队列、死信、备份交换机

一、应用场景 业务中心根据业务需求向特定用户发送消息&#xff1b;发送前不确定由哪个用户接收 特定用户接收特定消息&#xff1b;用户可以退出&#xff0c;再切换别的用户登录&#xff0c;用户登录后只接收与自已对应的消息 二、总体要求 项目要足够稳健&#xff0c;消息不能…