在当前的互联网行业中,软件发展速度极快,用户也对软件的更新频率要求越来越高。因此,在软件开发领域中,热更新已经成为了一种常见的解决方案。热更新技术可以使服务器在不停机的情况下对应用程序或服务器软件进行更新,从而提高程序的稳定性和运行效率,减少故障和停机时间,提高用户体验。本文将针对C服务器的情况,介绍如何实现热更新。
1. 热更新的原理
一般情况下,服务器软件运行后会被加载到内存中,服务器软件和应用程序是一起工作的,应用程序调用服务器软件的函数来执行相应的服务。而在热更新时,我们需要将最新的服务器软件加载到内存中,此时如果是直接覆盖服务器软件,会导致服务器软件停机,从而影响了应用程序的运行。因此,我们需要采用边运行边更新的方式,将最新的服务器软件通过动态库的方式加载到内存中,由应用程序去调用最新的库函数。
2. 热更新的实现步骤
2.1 编译动态库
在C服务器中,我们需要将服务器软件编译成动态库的形式,即将其编译为.so文件。编译命令如下:
gcc -shared -fPIC -o lib.so server.c
2.2 加载动态库
使用dlopen()函数可以将动态库加载到进程的地址空间,并返回一个句柄,以供后续的使用。dlopen()函数的调用如下:
void *handle = dlopen(“./lib.so”, RTLD_LAZY);
2.3 获取库函数地址
获取库函数地址即获取动态库中函数的指针,方法是使用dlsym()函数,调用该函数后返回动态库中函数的指针,并转换为函数指针类型。dlsym()函数的调用如下:
void (*Func)() = (void (*)()) dlsym(handle, “FuncName”);
2.4 卸载动态库
在热更新时,需要卸载旧版本的动态库,使用dlclose()函数来释放动态库所占用的内存。dlclose()函数的调用如下:
dlclose(handle);
3. 实现过程举例
下面我们以一个简单的C服务器程序为例,介绍如何实现热更新。服务器程序的主要功能是监听端口,接收客户端信息,并返回响应信息。
3.1 服务器程序代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#define MAXLINE 1024
#define PORT 8080
void (*Hello)();
void server(char *p)
{
void *handle = dlopen(p, RTLD_LAZY);
if (!handle)
{
fprintf(stderr, “%s\n”, dlerror());
exit(EXIT_FLURE);
}
Hello = (void (*)()) dlsym(handle, “Hello”);
if (!Hello)
{
fprintf(stderr, “%s\n”, dlerror());
dlclose(handle);
exit(EXIT_FLURE);
}
int listenfd, connfd;
struct sockaddr_in servaddr, clientaddr;
char recvbuf[MAXLINE], sendbuf[MAXLINE];
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror(“socket”);
exit(EXIT_FLURE);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1)
{
perror(“bind”);
exit(EXIT_FLURE);
}
if (listen(listenfd, 10) == -1)
{
perror(“listen”);
exit(EXIT_FLURE);
}
printf(“server listen …\n”);
while(1)
{
socklen_t addrlen = sizeof(clientaddr);
if ((connfd = accept(listenfd, (struct sockaddr *) &clientaddr, &addrlen)) == -1)
{
perror(“accept”);
continue;
}
bzero(recvbuf, sizeof(recvbuf));
if (recv(connfd, recvbuf, MAXLINE, 0) == -1)
{
perror(“recv”);
close(connfd);
continue;
}
printf(“recv: %s\n”, recvbuf);
sprintf(sendbuf, “Hello, %s”, recvbuf);
Hello();
if (send(connfd, sendbuf, strlen(sendbuf), 0) == -1)
{
perror(“send”);
close(connfd);
continue;
}
close(connfd);
}
}
int mn(int argc, char **argv)
{
char *p = “./lib.so”;
server(p);
return 0;
}
3.2 动态库程序代码如下:
#include
void Hello()
{
printf(“Hello World!\n”);
}
3.3 编译动态库程序代码
编译服务器程序,生成server可执行文件:
gcc -o server server.c -ldl
编译动态库程序,生成动态库文件:
gcc -shared -fPIC -o lib.so lib.c
3.4 运行服务器
在命令行中输入以下指令运行服务器程序:
./server
3.5 修改动态库
在修改动态库之前,通过telnet模拟一个客户端连接:
telnet localhost 8080
输入任意字符串后,会返回“Hello, xxx”的字符串。这表明服务器程序已经在监听服务器端口,并且动态库已经被正确加载。
接下来,我们修改动态库代码,将Hello()函数的实现从“Hello World!”改为“Hello Server!”:
#include
void Hello()
{
printf(“Hello Server!\n”);
}
重新编译动态库程序:
gcc -shared -fPIC -o lib.so lib.c
接下来,我们运行C服务器的热升级程序,将修改后的动态库加载到内存中:
void hot_update()
{
char *p = “./lib.so”;
server(p);
}
在命令行中输入以下指令运行热升级程序:
./hot_update
通过telnet模拟一个客户端连接,可以看到程序已经被升级成功。此时,应用程序并没有停机,而是通过边运行边升级的方式,保证了程序的稳定运行。
4.
相关问题拓展阅读:
- 500T的文件存储服务器,有什么方案;
- 双机热备的方案
- 一台服务器,其他工作点只有显示器和鼠标键盘
500T的文件存储服务器,有什么方案;
阿里云oss,七牛云存储等
在C/S模式下,文件服务器(file server)是一台对中央存储和数据文件管理负责的计算机,这样在同一网络中的其他计算机就可以访问这些文件。文件服务器允许用户在网络上共享信息,而不用通过软盘或一些其它外部存储设备来物理地移动文件。任何计算机都能被设置为主机,并作为文件服务器(file server)运行。
最简单的形式是,文件服务器可以是一台普通的个人计算机,它处理文件要求并在网络中发送它们。在更复杂的网络中,文件服务器也可以是一台专门的网络附加存储(NAS)设燃弊备,它也可以作为其他计算机的远程硬盘驱动器来运行,并允许网络中的人像在他们自己的硬盘中一样在服务器芹段旁中存储文件.
文件服务器具有分时系统文件管理的全部功能,提供网络用户访问文件、目录的并发控制和安全保密措施的局域网(LAN)服务器。亿万克携“算力大师”G952N5、M522N6、R322N6 明星产品初次亮相本届电博会,负责人依次介绍了三款产品的核心优势,产品以杰出的性能、灵活的配置、优异的系统设计、全面的安全性等特点赢得市场的一致好评。亿万克集服务器和存储等数据中心产品的研发、生嫌橡产、销售、服务系统整合于一体,是民族高科技制造企业领导品牌。
【感兴趣请点击此处,了解一下。 】
双机热备的方案
组成双机热备的方案主要的三种方式分别为:基于共享存储(磁盘阵列)的方式,全冗余方式和复制方式。
基于共享存储(磁盘阵列)的方式
共享存储方式主要通过磁盘阵列提供切换后,对数据完整性和连续性的保障。用户数据一般会放在磁盘阵列上,当主机宕机后,备机继续从磁盘阵列上取得原有数据。如下图所示这种方式因为使用一台存储设备,往往被业内人士称为磁盘单点故障。但一般来讲存储的安全性较高。所以如果忽略存储设备故障的情况下,这种方式也是业内采用最多的热备方式。
全冗余方式
全冗余方式就是双机双存储,基于单台存储的传统双机热备方式,确实存在存储单点故障的情况,为实现存储冗余,存储高可用也已经越来越多的被用户接受。我们从理解上可以看出,双机热备最早是为解决服务器的计划性停机与非计划性宕机的解决方案,但是我们无法实现存储的计划性停机与非计划性宕机带来的服务器停机,而存储作为双机热备中唯一存储数据的设备,它一旦发生故障往往会造成双机热备系统全面崩溃。
随着科技的进步,云存储,云计算发展,对于存储热备已经进入了成熟及快速发展阶段,双机热备也随着技术的进步,进入到了没有单点故障的全冗余双机热备方式。如图:
这种方式的特点在于:
1、存储之间的数据复制不经过网络,而是由存储之间进行复制。
2、两个存储之间的复制是完全实时的,不存在任何时间延时。
3、主备存储之间的切换时间小于500ms,以确保系统存储时不产生延时。
4、硬盘盘符及分区不因为主备存储之间的切换而改变。
5、服务器的切换,不影响存储之间的初始化,增量同步及数据复制。
6、某一世橡存储设备的计划性停机,不影响整个服务器双机热备系统的工作。
7、存储设备之间使用重复数据删除技术,完成增量同步工作。
8、真正的7X24小时或切换的全冗余方案。
复制方式
这种方式主要利用数据的同步方式,保证主备服务器的数据一致性。
基于数据复制的方式有多种方法,其性能和安全也不尽相同,其主要方法有以下几种:
A、单纯的文件方式的拷贝不适用于数据库等应用,因为打开的文件是不能被复制的,如果要复制必须将数据库关闭,这显然是不可以的。以文件方式的复制主要适用于WEB页的更新,FTP上传应用,对闭哪主备机数据完整性,连续性轿返码要求不高的情况下使用。
B、利用数据库所带有复制功能,比如SQLServer2023或2023所带的定阅复制,这种方式用户要根据自己的应用小心使用,原因主要是:
(1)SQLServer的定阅复制会在用户表上增加字段,对那些应用软件编程要求较高,如果在应用软件端书写时未明确指定字段的用户,而使用此功能会造成应用程序无法正常工作。
(2)数据滞留,这个限制怕也是最要命的,因为SQLServer在数据传输过程中数据并非实时的到达主备机,而是数据先写到主机,再写到备机,如此一来,备机的数据往往来不及更新,此时如果发生切换,备机的数据将不完整,也不连续,如果用户发现已写入的数据在备机找不到,重新写入的话,则主机修复后,就会发生主备机数据严重冲突,数据库会乱掉。
(3)复杂应用切莫使用定阅复制来做双机热备,包括数据结构中存储过程的处理,触发器和序列,一旦发生冲突,修改起来非常麻烦。
(4)服务器性能降低,对于大一点的数据库,SQLServer2023或2023所带的定阅复制会造成服务器数据库运行缓慢。
总之SQLServer2023或2023所带的定阅复制主要还是应用于数据快照服务,切莫用他来做双机热备中的数据同步。
C:硬盘数据拦截,目前国际国内,比较成熟的双机热备软件通常会使用硬盘数据拦截的技术,通常称为镜像软件即Mirror软件,这种技术当前已非常成熟,拦截的方式也不尽相同。
(1)分区拦截技术,以Pluswell热备份产品为例,他采用的是一种分区硬盘扇区拦截的技术,通过驱动级的拦截方式,将数据写往硬盘的数据提取,并首先写到备用服务器,以保证备用服务器的数据最新,然后再将数据回写到主机硬盘。这种方式将绝对保证,主备机数据库的数据完全一致,无论发生哪种切换,都能保证数据库的完整性与连续性。由于采用分区拦截技术,所以用户可以根据需要在一块硬盘上划分适合大小的分区来完成数据同步工作。
(2)硬盘拦截技术,以Symantec的Co-Standby为例,也是一种有效的硬盘拦截软件,他的拦截主要基于一整块硬盘,往往在硬盘初始化时需要消耗大量的时间。
双机热备中需要指出的几个概念
89详解防火墙vrrp、双旦桥机热备哗迟雀、mstp配置乱早
一台服务器,其他工作点只有显示器和鼠标键盘
这就是服务器虚拟化掘搭,你可以参考正睿的服务哪散渗器虚拟化李脊解决方案(含拓扑图)
方案名称:服务器虚拟化解决方案
方案地址:
c 服务器热更新方案的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c 服务器热更新方案,C 服务器解决方案:热更新实现指南,500T的文件存储服务器,有什么方案;,双机热备的方案,一台服务器,其他工作点只有显示器和鼠标键盘的信息别忘了在本站进行查找喔。