Java实现高可用主备服务器切换 (java 实现主备服务器切换)


随着互联网的普及和云计算、大数据等技术的发展,运维管理变得越来越复杂,高可用性和容错性也成为了运维管理的重要问题之一,如何保证系统的可用性和稳定性是每一个运维人员需要掌握的技能,本文介绍了如何使用Java实现高可用的主备服务器切换。

一、高可用主备服务器切换的概念

高可用主备服务器切换是一种实现服务器容错的解决方案,通过在两个或多个服务器之间共享任务,保证系统的高可用性。主服务器和备服务器共享相同的计算任务,并在主服务器出现故障时自动将任务转移到备服务器上,确保业务的连续性。

二、的原理

在Java中实现高可用主备服务器切换的基础是在服务端和客户端之间建立TCP连接,使用心跳检测和状态同步的方法进行故障切换,保证服务在主服务器发生故障时能够迅速地切换到备用服务器上。

在Java中,可以使用ZooKeeper实现高可用主备服务器切换,ZooKeeper是一个分布式的服务框架,它可以用于协调分布式系统中的进程、提供数据备份和恢复服务,同时也是一个分布式锁服务的实现。

具体实现步骤如下:

1.使用ZooKeeper建立一个znode来保存当前主服务器的信息

2.在备用服务器上建立一个监听程序,当主服务器发生故障时,备用服务器会通过监听程序接收到故障信息,并接管主服务器的任务

3.当主服务器恢复正常工作后,它会再次尝试注册自己到znode,并检查当前的状态,如果发现有备用服务器已将主服务器的任务接管,则主服务器会放弃任务,并成为其它服务器的备用服务器。

三、的代码实现

以下是的代码实现,代码分为服务端和客户端两部分。

1. Server端代码实现

“`

public class Server {

private String zkServerUrl = “localhost:2181”;

private String znodePath = “/master/slave”;

private int port = 9999;

private boolean isLeader = false;

private String masterHostName;

private String slaveHostName;

private ZooKeeper zkClient;

public static void mn(String[] args) throws Exception {

Server server = new Server();

server.execute();

}

public void execute() throws Exception {

connectToZooKeeper();

//create listener

MasterNodeListener listener = new MasterNodeListener(this);

listener.listen();

while (true) {

try {

Thread.sleep(5000);

} catch (InterruptedException e) {

System.out.println(“Error in thread sleeping ” + e.getMessage());

}

}

}

private void connectToZooKeeper() throws Exception {

zkClient = new ZooKeeper(zkServerUrl, 12023, null);

zkClient.create(znodePath, “CandidateMaster”.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);

}

public boolean getIsLeader() {

return isLeader;

}

public void setIsLeader(boolean isLeader) {

this.isLeader = isLeader;

}

public String getMasterHostName() {

return masterHostName;

}

public void setMasterHostName(String masterHostName) {

this.masterHostName = masterHostName;

}

public String getSlaveHostName() {

return slaveHostName;

}

public void setSlaveHostName(String slaveHostName) {

this.slaveHostName = slaveHostName;

}

public ZooKeeper getZkClient() {

return zkClient;

}

public void setZkClient(ZooKeeper zkClient) {

this.zkClient = zkClient;

}

}

“`

2. Client端代码实现

“`

public class Client {

public static void mn(String[] args) throws Exception {

Socket socket = null;

String serverHostname = “localhost”;

int serverPort = 9999;

while (true) {

try {

socket = new Socket(serverHostname, serverPort);

OutputStream out = socket.getOutputStream();

out.write(“This is a heart beat”.getBytes());

System.out.println(“Ping….”);

Thread.sleep(5000);

} catch (IOException e) {

System.out.println(“Server ” + serverHostname + “:” + serverPort + ” is not avlable”);

Thread.sleep(10000);

} finally {

if (socket != null) {

try {

socket.close();

} catch (IOException e) {

System.out.println(“Error closing socket ” + e.getMessage());

}

}

}

}

}

}

“`

四、的相关技术

在Java中,实现高可用主备服务器切换也需要运用到以下相关技术:

1. ZooKeeper:提供了分布式协作的解决方案,可用于在多个节点之间进行状态协调和管理。

2. Java网络编程:使用TCP连接来实现服务器之间的通讯,用于主备服务器之间数据的同步和控制。

3. Java多线程:运用多线程技术来实现主备服务器之间的数据同步、故障检测等功能,保证服务器之间的快速响应和及时传输。

五、

是一种非常重要的技术,可以保证应用服务器在出现故障时能够迅速地切换到备用服务器上,保证应用的连续性和可用性。本文通过介绍高可用主备服务器切换的概念、原理、代码实现和相关技术,帮助读者深入了解的过程和方法,掌握该技能对于提高运维人员的实战能力和工作效率具有重要的意义和价值。

相关问题拓展阅读:

  • redis集群角色切换java调用异常
  • 双机热备怎么弄的?

redis集群角色切换java调用异常

redis集群角色切换java调用异常解决办法:

1:打开软件java

2:编辑所需要的信息

3:然后编辑好了蔽老之后确认,点击右上角的设置中心

4:在设置液并枣中心里面找到信息就可闹拆以了

redis集群角色切换java调用异常

一、Redis状态检查

唯一标记一个redis实例的是ip和端口,前端是用tcp方式来访问redis的,我们提供给应用访问的是一个ip+63379(一般使用63379) 端口。因此我们执行如下命令检查redis状态:

上面的巧梁role这个值一定是master的,只要保证vip在master上我们的Padis cache服务就是没有问题的,如果不通或者role的角色是slave,那就得继续查看是什么问题.

二、两个redis的角色都是slave的问题

当两个主机都挂了或者我们自己不小心将两个redis停了,并且我们用下面的命令检查

/wls/wls81/redis/bin/redis-cli -h {ip} -p {port} -a {password} info replication

发现无论是vip还是另外的两个ip都是role:slave 的角色,这个册则时候需要对vip所在的主机执行slaveof no one 的操作,将vip 所在的redis变成master,如:

/wls/wls81/redis/bin/redis-cli -h {vip} -p {port} -a {password} slaveof no one

三、sentinel的配置参数

我们的sentinel 配置文件里面有两个重要的配置

sentinel monitor pds_jks-core-prd 10.33.94.配置的ip和端口任何时候都需要是master的ip端口,切换的时候程序自动会改 。另外,红色所示部分pds_jks-core-prd为redis对外提供的主机名,一般Jedis在调用redis时会用到此名称。如果配置多个哨兵则一般要求此名称唯一标识

sentinel down-after-milliseconds pds_jks-core-prd——这个是sentinel连接州宽棚master的超时时间,超过这个时间就认为master挂了,实现自动切换。这个默认是30秒,这个时间得调节好,大了会在真正出现故障的时候切换时间会长,小了有时候master由于持久化数据,繁忙不响应,会导致自动切换,实际只是瞬间不可用,现在认为设置为15秒为宜.

四、AOF日志

这个日志记录了每一个写入命令或者删除命令的,这个对于我们审计功能是有用的,由于占用很多磁盘,默认我们是关闭的

如果开启会生成一个.aof的文件在data文件中. 如: /wls/apache/servers/pds_jks-core-prd/data

在redis运行中中开启:

/wls/wls81/redis-icore/bin/redis-cli -h {ip} -p {port} -a {password} config set appendonly yes

开启了可以查看日志,记录每一个命令,如有必要可以开启查完问题后关闭. 同时说明一下

/wls/wls81/redis-icore/bin/redis-cli -h {ip} -p {port} -a {password} config set 可以在redis运行的时候设置多个它的参数

五、空闲连接的timeout

redis服务端不会自动断开客户端来的连接,redis服务端有设置客户端空闲连接超时时间,可用命令

/wls/wls81/redis-icore/bin/redis-cli -h {ip} -p {port} -a {password} config get timeout

查看当前timeout时间,默认是0,就是不断开空闲的连接,如果不断开空闲的连接,就会造成redis连接过多

所以一般情况下可以设置为3600秒:

/wls/wls81/redis-icore/bin/redis-cli -h {ip} -p {port} -a {password} config set timeout 3600

也就是3600秒后将空闲的连接关闭掉. 可以用下面的命令查看某个连接空闲了多久:

/wls/wls81/redis-icore/bin/redis-cli -h {ip} -p {port} -a {password} client list

六、监控redis执行的命令

/wls/wls81/redis-icore/bin/redis-cli -h {ip} -p {port} -a {password} monitor

上述这个monitor命令可以查看redis执行了什么命令,有时候查问题很有必要用到,我们可以知道那段时间redis执行了什么,从而进行我们的问题诊断。

七、key的查找与执行

/wls/wls81/redis-icore/bin/redis-cli -h {ip} -p {port} -a {password} keys “*”

keys这个命令查找所有的key,但是更好慎用,因为它很耗redis的性能,每个key都遍历一遍. 也可以进行模糊匹配如: keys “send*”

千万记住在生产环境上不能随便乱用,因为它会将redis性能耗尽,导致其他连接获取不到响应.

/wls/wls81/redis/bin/redis-cli -h {ip} -p {port} -a {password} dbsize

dbsize 这个命令可以看到整一个redis里面有多少个key,当然和keys “*” | wc -l结果是一样的。

当我们需要批量删除key值时可以用如下命令即可:

/wls/wls81/redis/bin/redis-cli -h {ip} -p {port} -a {password} keys “send*” | xargs /wls/wls81/redis/bin/redis-cli -h {ip} -p {port} -a {password} del

我们需要将整个db都flush掉可以用:

/wls/wls81/redis/bin/redis-cli -h {ip} -p {port} -a {password} -a MamcCorePrd flushdb

/wls/wls81/redis/bin/redis-cli -h {ip} -p {port} -a {password} -a flushall

八、由于连接redis的客户端使用jedisPool

如果设置了

redis.pool.testOnBorrow.REL=true

redis.pool.testOnReturn.REL=true

这两个参数是说在或者pool中的连接和返回连接给pool的时候都需要检查一下连接的有用性,也就是ping一下这个redis是不是好的,

这样在高并发的时候,由于并发线程太多,ping操作相对线程启动来说很慢,因此,应用会堵在类似如下线程dump的地方

” ExecuteThread: ’19’ for queue: ‘weblogic.kernel.Default (self-tuning)'” id=33 idx=0x9c tid=prio=5 alive, native_blocked, daemon

at jrockit/net/SocketNativeIO.readBytesPinned(Ljava/io/FileDescriptor;

at jrockit/net/SocketNativeIO.socketRead(SocketNativeIO.java:32)

at java/net/SocketInputStream.socketRead0(Ljava/io/FileDescriptor;

at java/net/SocketInputStream.read(SocketInputStream.java:129)

at java/net/SocketInputStream.read(SocketInputStream.java:90)

at redis/clients/util/RedisInputStream.fill(RedisInputStream.java:109)

at redis/clients/util/RedisInputStream.readByte(RedisInputStream.java:45)

at redis/clients/jedis/Protocol.process(Protocol.java:64)

at redis/clients/jedis/Protocol.read(Protocol.java:131)

at redis/clients/jedis/Jedis.ping(Jedis.java:35)

at redis/clients/jedis/JedisPool$JedisFactory.validateObject(JedisPool.java:104)

at org/apache/commons/pool/impl/GenericObjectPool.addObjectToPool(GenericObjectPool.java:922)

at org/apache/commons/pool/impl/GenericObjectPool.returnObject(GenericObjectPool.java:917)

^– Holding lock: org/apache/commons/pool/impl/GenericObjectPool@0xb

at redis/clients/util/Pool.returnResourceObject(Pool.java:29)

at redis/clients/util/Pool.returnResource(Pool.java:41)

at com/paic/icore/mams/common/jedis/util/RedisPoolCacheTools.release(RedisPoolCacheTools.java:43)

虽然后面会自动恢复,不过导致应用响应缓慢.解决方法是将该两个参数设置为false,并且定期检查:

testOnBorrow.REL=false

testOnReturn.REL=false

timeBetweenEvictionRunsMillis=—–每隔60秒定期检查空闲连接

minEvictableIdleTimeMillis=连接在池中保持空闲而不被空闲连接回收器线程回收的最小时间值,单位毫秒

numTestsPerEvictionRun=空闲连接扫描时,每次最多扫描的连接数,一般设置为-1,全部扫描

设置成这样之后就不用每次都测试了,这样就提高了应用的性能

有时候由于持久化导致master变得缓慢,所以建议关闭master的持久化,让slave持久化

关闭持久化 /wls/wls81/redis/bin/redis-cli -h {ip} -p {port} -a {password} config set save “”

开通持久化 /wls/wls81/redis/bin/redis-cli -h {ip} -p {port} -a {password} config set save “”

关闭持久化后如果发生主备切换了,请将master的持久化关闭,slave的持久化开启

九、查询每秒执行的命令个数

十、单位时间内Redis执行的命令次数

1.

Redis状态检查 唯一标记一蠢竖衫个redis实例的是ip和端口,前端是用tcp方式来访问redis的,我们提供给应用访问的是一个ip+63379(一般使用63379) 端口。因此我们执行如下命令检查redis状态: 上面的role这个值一定是master的,只要保证vip在master上我们的Padis cache服务就是没有问题的,如果不通或者role的角色是slave,那就得继续查看是什么问题纤空.

2.

两个redis的角色都是slave的问题 当两个主机都挂了或者我们自己不小心将两个redis停了,并且我们用带腔下面的命令检查 /wls/wls81/redis/bin/redis-

异常的分类: 所有的异常类都是属于Throwable类的子类。其主要分为两大类派,Exception类和Error类。Error类是十分姿老高严重的错误如Java运行系统中的内部错误及Java虚拟机资源耗尽等,我们无法解决。而Exception类又衍生出两个子类RuntimeException(运行时异常/非检测异常)类以及CheckedException(检测异常)类。 CheckedException(检测异常)在代码编译的过程中,编译器要求你含明对可迹尺能出现的异常必须做出相应的处理的异常。如IOException、SQLException

Redis状态检查 唯一标记一个redis实例的是ip和端口,前端是液扮用tcp方式来访问redis的,我们提供给应用访问的是一个ip+63379(一般使用63379) 端口。因此我们执行如下命令检查闹碧灶redis状态: 上面的role这个值一定是master的,只要保证vip在master上我们的Padis cache服务就是没有问题的,如果不通或者role的角色是slave,那就得继续查看是什么问题.

2.

双机热备怎么弄的?

1,双机热备特指基于高可用系统中的两台服务器的热备(或高可用),因两机高可用在国内使用较多,故得名双机热备。

2,以一般常用的SQL服务的双机热备为例:先在两台服务器上安装服务器系统。

3,然后建立一个或多个磁盘阵列,将两台服务器上的SQL数据保存在磁盘阵列上。

4,然后安装一款集群软件,如:微软MSCS,Symantec VCS,ATANG Cluster等。

5,然后在软件上分别设置主和副服务器。以MSCS为例,先在服务器上安装Advanced Server或DataCenter Server。 然后在两台服务器添加相同的管理员帐号和密码。即帐号在每个节点上,都必须具有管理员权限。所有节点都必须是成员戚裤服务器,或者所有的节点是同一个域里的域控制器。在群集中,不允许一部分是域成员,一部分是域控制器。 

6,然后安装集群管理软件,开启磁盘阵列,在两台电脑上设置共享磁盘,并验证共享磁盘国。

7,然后关闭之一个服务器,配置第二个节点,配置完成后,关闭第二个服务器,打开之一个服务器,配置之一个节点。

8,最后,开启两个服务器和磁盘阵列。

双机热备特指基于高可用系统中的两台服务器的热备(或高可用),因两机高可用在国内使用较多,故得名双机热备,双机高可用按工作中的切换方式分为:主-备方式(Active-Standby方式)和双主机方式(Active-Active方式),主-备方式即指的是一台服务器处于某种业世毁务的激活状态(即Active状态),另一台服务器处于该业务的备用状态(即Standby状态)。而双主机方搜仔备式即指两种不同业务分别在两台服务器上互为主备状态(即Active-Standby和Standby-Active状态)。

关于java 实现主备服务器切换的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。