首页 文章 精选 留言 我的

精选列表

搜索[VMware替代],共10000篇文章
优秀的个人博客,低调大师

【运维小实验】基于VMware的虚拟Linux集群搭建-lvs+keepalived

通过keepalived实现lvs服务器的的双机热备和真实服务器之间的负载均衡的blog挺多的,在搭建的时候也参考了相关博文,不同人搭建的实验环境不一样,本文是基于VM搭建的虚拟集群环境,全部虚拟机网卡模式为NAT方式相连,处于同一网段。 搭建环境: 使用redhead 2.6.32-431.el6.x86_64版本的linux,创建四台,配置相关网络信息,确保同一网段下。 配置好各自ip即可,虚拟ip在配置lvs时设定。 安装配置LVS 1.在主备Lvs上安装ipvsadm和keepalived LVS是通过IPVS模块实现的,检查kernel是否支持LVS的IPVS模块,再安装IPVS管理软件ipvsadm [root@rex ~]# modprobe -l | grep ipvs kernel/net/netfilter/ipvs/ip_vs.ko kernel/net/netfilter/ipvs/ip_vs_rr.ko kernel/net/netfilter/ipvs/ip_vs_wrr.ko kernel/net/netfilter/ipvs/ip_vs_lc.ko kernel/net/netfilter/ipvs/ip_vs_wlc.ko kernel/net/netfilter/ipvs/ip_vs_lblc.ko kernel/net/netfilter/ipvs/ip_vs_lblcr.ko kernel/net/netfilter/ipvs/ip_vs_dh.ko kernel/net/netfilter/ipvs/ip_vs_sh.ko kernel/net/netfilter/ipvs/ip_vs_sed.ko kernel/net/netfilter/ipvs/ip_vs_nq.ko kernel/net/netfilter/ipvs/ip_vs_ftp.ko kernel/net/netfilter/ipvs/ip_vs_pe_sip.ko 安装ipvsadm [root@rex ~]# yum install ipvsadm 能通过ipvsadm --help查看相关信息即安装成功。 安装keepalived 安装依赖库:yum install -y openssl openssl-devel(我是缺这两个,具体编译时候如果报错则安装相关提示补安装相关缺漏) 下载keepalived: http://www.keepalived.org/software/keepalived-1.2.6.tar.gz 安装命令: # tar zxvf keepalived-1.2.6.tar.gz # cd keepalived-1.2.6 # ./configure --sysconf=/etc --with-kernel-dir=/lib/modules/2.6.32-431.el6.x86_64 #指定配置文件存放路径,指定使用内核源码中的头文件。 #make #make install #ln -s /usr/local/sbin/keepalived /sbin/ #把启动命令软连接到sbin,方便以后直接使用 能通过keepalived --help查看相关信息即安装成功。 配置LVS: 主LVS: ! Configuration File for keepalived global_defs { notification_email {#配置告警邮件发送 XXXX@qq.com } notification_email_from Keepalived@localhost smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER#主LVS标志 interface eth1#设置对外服务口 virtual_router_id 51 priority 100#设置优先级,优先级高的为主机 advert_int 1#设置同步时间间隔 authentication {#设置主备LVS验证类型和密码,两边必须一致 auth_type PASS auth_pass 1111 } virtual_ipaddress {#设置虚拟服务IP 192.168.153.110 } } virtual_server 192.168.153.110 80 { delay_loop 6#健康检查时间间隔 lb_algo rr#负载均衡算法,此为轮询算法 lb_kind DR#负载均衡转发规则,也就是IP转发规则,DR转发方式最快,但是所有机器必须在一个网段内,还有NAT和TUNEL两种转发方式 protocol TCP real_server 192.168.153.131 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.153.135 80 { weight 1 TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } 备用LVS配置:复制上面配置修改两处即可:1.state MASTER改为state BACKUP 2.将priority 100改低,这里改为80 配置Realserver 对所有Realserver重复做一下步骤 在/etc/init.d下创建脚本lvsrs 1 #!/bin/bash 2 3 VIP=192.168.153.110 4 ./etc/rc.d/init.d/functions 5 case "$1" in 6 start) 7 echo "Start LVS of Realserver!" 8 /sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up 9 echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore 10 echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce 11 echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore 12 echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce 13 14 ;; 15 16 stop) 17 18 /sbin/ifconfig lo:0 down 19 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore 20 echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce 21 echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore 22 echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce 23 echo "RealServer Stoped" 24 25 ;; 26 27 *) 28 29 echo "Usage: $0 {start|stop}" 30 31 exit 1 32 33 esac 修改其执行权限:chmod 755 /etc/init.d/lvsrs 执行启动脚本: #service lvsrs start 查看其ip: lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:480 (480.0 b) TX bytes:480 (480.0 b) lo:0 Link encap:Local Loopback inet addr:192.168.153.110 Mask:255.255.255.255 UP LOOPBACK RUNNING MTU:16436 Metric:1 在realserver上安装apache并且启动! 在/var/www/hmtl/下添加index.html测试主页,不同server用不同界面进行区分。 启动LVS并且测试: 主备LVS启动:/etc/init.d/keepalived start 查看启动状态: 主LVS: Feb 4 20:11:41 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) Transition to MASTER STATE Feb 4 20:11:42 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) Entering MASTER STATE Feb 4 20:11:42 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) setting protocol VIPs. Feb 4 20:11:42 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth2 for 192.168.153.110 Feb 4 20:11:42 rex Keepalived_healthcheckers[9521]: Netlink reflector reports IP 192.168.153.110 added Feb 4 20:11:47 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth2 for 192.168.153.110 备LVS: Feb 4 20:18:16 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) Received higher prio advert Feb 4 20:18:16 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) Entering BACKUP STATE Feb 4 20:18:16 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) removing protocol VIPs. Feb 4 20:18:16 rex Keepalived_healthcheckers[9521]: Netlink reflector reports IP 192.168.153.110 removed Feb 4 20:19:06 rex dhclient[1265]: DHCPREQUEST on eth2 to 192.168.153.254 port 67 (xid=0x6f9b7b38) 用ip addr和ipvsadm查看路由情况 主LVS# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:3e:ce:ce brd ff:ff:ff:ff:ff:ff inet 192.168.153.133/24 brd 192.168.153.255 scope global eth1 inet 192.168.153.110/32 scope global eth1 inet6 fe80::20c:29ff:fe3e:cece/64 scope link valid_lft forever preferred_lft forever 备LVS# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:0e:6c:b0 brd ff:ff:ff:ff:ff:ff inet 192.168.153.134/24 brd 192.168.153.255 scope global eth2 inet6 fe80::20c:29ff:fe0e:6cb0/64 scope link valid_lft forever preferred_lft forever [root@rex ~]# ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP bogon:http rr -> bogon:http Route 1 0 0 -> bogon:http Route 1 0 0 测试: 1.高可用×××测试--主备lvs切换 把主lvs stop!然后查看备lvs日志,然后把主恢复,再看备lvs的日志 Feb 4 20:11:41 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) Transition to MASTER STATE Feb 4 20:11:42 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) Entering MASTER STATE Feb 4 20:11:42 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) setting protocol VIPs. Feb 4 20:11:42 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth2 for 192.168.153.110 Feb 4 20:11:42 rex Keepalived_healthcheckers[9521]: Netlink reflector reports IP 192.168.153.110 added Feb 4 20:11:47 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth2 for 192.168.153.110 Feb 4 20:18:16 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) Received higher prio advert Feb 4 20:18:16 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) Entering BACKUP STATE Feb 4 20:18:16 rex Keepalived_vrrp[9522]: VRRP_Instance(VI_1) removing protocol VIPs. Feb 4 20:18:16 rex Keepalived_healthcheckers[9521]: Netlink reflector reports IP 192.168.153.110 removed Feb 4 20:19:06 rex dhclient[1265]: DHCPREQUEST on eth2 to 192.168.153.254 port 67 (xid=0x6f9b7b38) Feb 4 20:19:06 rex dhclient[1265]: DHCPACK from 192.168.153.254 (xid=0x6f9b7b38) Feb 4 20:19:06 rex dhclient[1265]: bound to 192.168.153.134 -- renewal in 737 seconds. Feb 4 20:19:06 rex NetworkManager[1241]: <info> (eth2): DHCPv4 state changed renew -> renew Feb 4 20:19:06 rex NetworkManager[1241]: <info> address 192.168.153.134 Feb 4 20:19:06 rex NetworkManager[1241]: <info> prefix 24 (255.255.255.0) Feb 4 20:19:06 rex NetworkManager[1241]: <info> gateway 192.168.153.2 Feb 4 20:19:06 rex NetworkManager[1241]: <info> nameserver '192.168.153.2' Feb 4 20:19:06 rex NetworkManager[1241]: <info> domain name 'localdomain' 2.负载均衡测试 在本地浏览器上访问192.168.153.110,不断刷新,可以看到代表不同realserver的主界面。 3.故障切换测试 把realserver1的服务stop掉,查看LVS的日志,然后恢复再看: Feb 4 20:25:59 rex Keepalived_healthcheckers[9588]: Netlink reflector reports IP 192.168.153.110 added Feb 4 20:26:04 rex Keepalived_vrrp[9589]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth1 for 192.168.153.110 Feb 4 20:27:53 rex Keepalived_healthcheckers[9588]: TCP connection to [192.168.153.135]:80 failed !!! Feb 4 20:27:53 rex Keepalived_healthcheckers[9588]: Removing service [192.168.153.135]:80 from VS [192.168.153.110]:80 Feb 4 20:27:53 rex Keepalived_healthcheckers[9588]: Remote SMTP server [192.168.200.1]:25 connected. Feb 4 20:28:14 rex Keepalived_healthcheckers[9588]: Error reading data from remote SMTP server [192.168.200.1]:25. Feb 4 20:28:29 rex Keepalived_healthcheckers[9588]: TCP connection to [192.168.153.135]:80 success. Feb 4 20:28:29 rex Keepalived_healthcheckers[9588]: Adding service [192.168.153.135]:80 to VS [192.168.153.110]:80 Feb 4 20:28:29 rex Keepalived_healthcheckers[9588]: Remote SMTP server [192.168.200.1]:25 connected.

优秀的个人博客,低调大师

Windows Azure Pack与VMware VRA 对比(二)安装VRA IaaS服务器

IaaS服务器主要提供web portal 的访问,工作流的处理等。这个服务要装在Windows server 2012 R2服务器上,前提条件比较多,安装过程中容易失败。首先通过访问https://vra.yueque.com:5480/installer/进行下载安装Management Agent。 输入vra的信息,如下图: 等待安装过程的完成 首次安装完成vRealize Automation Appliance, 访问https://vra.yueque.com,可以进行IaaS服务器的安装。 下图中输入time server ,这里输入AD IP,点击“下一步”。 这里输入vra的地址。 设置单点登录的密码。 填写IaaS服务器的信息。 填写IaaS SQL服务器信息。sql已经安装并有实例。 填写DEM的信息,设置密码。 填写Agent信息,这里的agent是连接vcenter时所用的,所以Endpoint名称一定要记下来。 填写证书信息。 填写web证书信息。 填写manager证书信息 点击“验证”时,会提示iaas服务器未满足前提条件。 这里我借助IaaS Installer进行安装前提条件。访问https://vra.yueque.com:5480/installer/下载并安装到iaas和sql服务器上,进行前提条件的检查安装。 在IaaS服务器上安装iaas installer完毕后,可以点击桌面“setup__10.10.106.200@5480”的图标进行配置。要确保安装成功,vRealize Automation 服务器和 Windows 服务器上的时钟必须同步。 输入vra用户名和密码。 选择“Complete Install” 完成红色错误的前提条件安装和配置。sql数据库只需要检查database的前提条件即可。 安装前提条件后,再重新验证通过即可。 创建好iaas服务器快照,确认无误后,点击“安装” 等待安装完成。最后可以登录appliance检查iaas是否安装同步成功: 至此,iaas服务器安装成功。

优秀的个人博客,低调大师

解决Vmware虚拟机中克隆Centos后无法启动网卡的问题

0.前面的话:困扰很久的问题 之前经常出现这样的问题,但由于实在找不到解决的办法,只能硬着头皮自己重新去安装一个新的操作系统,虽然是浪费点时间,但也勉强解决了吧。 但有问题不解决总不好,后来经过各种搜索和询问网友,找出了下面这个非常好的解决方法,经测试,这个方法可以完美解决这个问题。 1.问题引出:克隆Centos后出现网卡无法配置的情况 在实验环境中经常要用到多个Linux操作系统的情况,为了避免再次安装等待的时间,这时我们一般会采取克隆操作系统的方法,但是这样就会出现一个问题,就是克隆后的操作系统无法启动网卡,情况如下: 网卡启动不了,网络连接就成了问题,而没有网络连接的Linux操作系统,对于运维测试来说,那是非常麻烦的一件事情。怎么办? 2.问题分析:无法启动网卡的原因 问题就出在/etc/udev/rules.d/70-persistent-net.rules这个文件上,因为这个文件绑定了网卡和mac地址,也就是说,我们克隆的操作系统,这个文件跟原来我们的操作系统是一样的,但是克隆过来的操作系统,由于网卡变了,网卡的MAC地址也变了,这样的话,我们的操作系统的网卡和MAC地址就跟/etc/udev/rules.d/70-persistent-net.rules中绑定的不一样,于是才出现了网卡启动不了的情况。 3.问题解决:删除网卡绑定文件 既然上面所说的文件绑定了之前的网卡和MAC地址,以至于跟现在的网卡和MAC地址对应不上,才导致网卡无法启动,那么,我们就可以采取把该文件删除的方法: 1 [root@xpleaf~]#rm/etc/udev/rules.d/ 70 -persistent-net.rules 删除后,重新启动系统,系统就会帮我们自动生成一个新的绑定了当前的网卡和MAC地址的配置文件,这样的话,我们的网卡也就可以启动了。 当然,除了使用删除这样看起来似乎有点极端的方法外,也可以自己手动去修改上面的文件,但是,比起删除的方法,那得多麻烦!

优秀的个人博客,低调大师

用 IntersectionObserver 替代 scroll 事件实现图片懒加载,避免主线程卡顿

图片懒加载是博客、电商列表、后台表格里最常见的性能优化手段。过去大多数实现依赖监听 scroll 事件,在回调里遍历所有图片,用 getBoundingClientRect() 判断是否进入视口。这种做法在页面图片数量少的时候没问题,可一旦列表有几百个节点,滚动时每次事件触发都同步计算布局,主线程会被大量 getBoundingClientRect 和样式读取占满,滚动掉帧、白屏、卡顿就跟着来了。更麻烦的是,scroll 事件本身触发频率极高,即使用节流,也无法避免在快速滚动时漏掉图片进入视口的那一帧。浏览器后来提供了 IntersectionObserver,它把“元素是否进入视口”的检测交给合成器线程异步处理,回调只在交叉状态变化时执行,主线程不再需要参与滚动计算。这篇文章会从实际代码出发,讲清楚如何用 IntersectionObserver 写一个可复用的懒加载指令,处理图片加载失败、占位图、提前加载距离,以及和现代框架结合时的注意事项。

优秀的个人博客,低调大师

CSS scroll-driven animations:用滚动进度替代JS监听,减少卡顿

页面里做滚动驱动的动画,过去基本靠 scroll 事件加 requestAnimationFrame,再手动计算 scrollTop 和目标元素的位置。这种写法在桌面端通常没事,一到移动端或者滚动容器嵌套比较深的时候,掉帧就很明显。原因是 scroll 事件触发频率极高,回调里如果有 getBoundingClientRect() 这类强制同步布局的操作,主线程会被反复打断,合成器线程只能干等。CSS scroll-driven animations 把进度计算交给浏览器合成器,动画属性在合成阶段直接更新,不经过主线程。它提供 scroll() 和 view() 两个 timeline,前者跟踪滚动容器进度,后者跟踪元素进入视口的过程。这篇文章会讲清楚两个 timeline 的坐标系差异、animation-range 的实际用法、以及什么情况下仍然得回退到 JS。

优秀的个人博客,低调大师

用 IntersectionObserver 替代滚动监听:解决长列表页面卡顿与重复触发

在做后台管理系统或者内容 feed 流时,经常遇到“滚动到某个区域才加载更多”或者“元素进入可视区域后播放入场动画”的需求。最早我们普遍用 scroll 事件监听配合 getBoundingClientRect 计算位置,简单场景没问题,但随着列表变长、DOM 节点变多,滚动时频繁触发布局计算和重绘,页面掉帧明显,而且节流参数没调好会出现加载两次、动画闪烁。IntersectionObserver 是浏览器原生提供的异步观察 API,它把“元素是否进入视口”这件事交给浏览器内部调度,不再需要持续监听滚动。这篇文章从实际踩坑出发,讲清楚 IntersectionObserver 的基础用法、常见误用、懒加载与无限滚动的实现细节,以及如何跟 Vue、React 的生命周期配合,避免重复 observe 和内存泄漏。

优秀的个人博客,低调大师

科技预言家凯文·凯利:AI 不会替代人类工作

2025可持续全球领导者大会于10月16日-18日在上海市黄浦区世博园区召开。著名未来学家、《2049》作者、科技预言家、《连线》杂志创始主编凯文·凯利表示,未来人类将会变得非常具有价值,尽管AI变得越来越强大,AI有些东西还是无法进行提升,这就是人类具有价值的原因。 “比如你招人去做一个事情,其中可以让AI取代它,这就是AI任务。你雇佣人的话他有责任完成这个任务,但是AI没有责任感,它不在乎,比如你把钱给它让它买东西,它会不会找零,只有人有这样的责任心,当然未来它们也许会有。”他说。 他指出,非常重要的一点是,在工作中不断学习的能力。在可见的未来,可能很多任务可以由AI来完成,但是工作本身是属于人的,所以它是对人类进行提升,而不是把人类取代。 他还提到,中国在 AI 应用方面展现出极高效率,五年内中国可能会做出世界上最好的人工智能芯片,这是很多人非常期待的一点,或许未来的超级网络 AI 会在中国出现,这是一个非常好的机会。

优秀的个人博客,低调大师

OpenAI:GPT-4 本月底退役,由 4o 完全替代

OpenAI 发布公告表示,自 2025 年 4 月 30 日起,GPT-4 将从 ChatGPT 中退役,并完全由 GPT-4o 取代。但 GPT-4 仍将继续通过API提供使用。 “GPT-4o 是我们较新的、原生的多模态模型。在 head‑to‑head 评估中,它在写作、编码、STEM 等方面始终超越 GPT-4。最近的升级进一步改善了 GPT-4o 的指令遵循、问题解决和对话流程,使其成为 GPT-4 的自然继承者。” GPT-4 于 2023 年 3 月在 ChatGPT 和微软的 Copilot 网络聊天机器人上推出,是一个多模态大型语言模型,支持接受图像和文本输入,以文本形式输出。OpenAI 创始人兼首席执行官 Sam Altman 曾表示,GPT-4 的规模据称非常庞大,其训练成本超过 1 亿美元。 值得一提的是,Sam Altman 最新在社交平台上发文表示,从明天(即北京时间周二)开始,该公司将在本周发布很多精彩的产品。其中将包括GPT-4.1—— 4o多模态模型的改进版,以及推出更小的GPT-4.1 mini和nano版本,o3“推理”模型和新的名为o4-mini的推理模型。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册