mirror of
https://github.com/berkeleydb/je.git
synced 2024-11-15 01:46:24 +00:00
165 lines
7.7 KiB
HTML
165 lines
7.7 KiB
HTML
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|||
|
<head>
|
|||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
|||
|
<title>Chapter 5. Writing Monitor Nodes</title>
|
|||
|
<link rel="stylesheet" href="gettingStarted.css" type="text/css" />
|
|||
|
<meta name="generator" content="DocBook XSL Stylesheets V1.73.2" />
|
|||
|
<link rel="start" href="index.html" title="Getting Started with Berkeley DB, Java Edition High Availability Applications" />
|
|||
|
<link rel="up" href="index.html" title="Getting Started with Berkeley DB, Java Edition High Availability Applications" />
|
|||
|
<link rel="prev" href="enablerep.html" title="Converting Existing Environments for Replication" />
|
|||
|
<link rel="next" href="events.html" title="Listening for Events" />
|
|||
|
</head>
|
|||
|
<body>
|
|||
|
<div xmlns="" class="navheader">
|
|||
|
<div class="libver">
|
|||
|
<p>Library Version 12.2.7.5</p>
|
|||
|
</div>
|
|||
|
<table width="100%" summary="Navigation header">
|
|||
|
<tr>
|
|||
|
<th colspan="3" align="center">Chapter 5. Writing Monitor Nodes</th>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td width="20%" align="left"><a accesskey="p" href="enablerep.html">Prev</a> </td>
|
|||
|
<th width="60%" align="center"> </th>
|
|||
|
<td width="20%" align="right"> <a accesskey="n" href="events.html">Next</a></td>
|
|||
|
</tr>
|
|||
|
</table>
|
|||
|
<hr />
|
|||
|
</div>
|
|||
|
<div class="chapter" lang="en" xml:lang="en">
|
|||
|
<div class="titlepage">
|
|||
|
<div>
|
|||
|
<div>
|
|||
|
<h2 class="title"><a id="monitors"></a>Chapter 5. Writing Monitor Nodes</h2>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="toc">
|
|||
|
<p>
|
|||
|
<b>Table of Contents</b>
|
|||
|
</p>
|
|||
|
<dl>
|
|||
|
<dt>
|
|||
|
<span class="sect1">
|
|||
|
<a href="monitors.html#monitorclass">Monitor Class</a>
|
|||
|
</span>
|
|||
|
</dt>
|
|||
|
<dt>
|
|||
|
<span class="sect1">
|
|||
|
<a href="events.html">Listening for Events</a>
|
|||
|
</span>
|
|||
|
</dt>
|
|||
|
</dl>
|
|||
|
</div>
|
|||
|
<p>
|
|||
|
So far in this book we have mostly discussed electable and
|
|||
|
secondary nodes, which are by definition nodes that have access
|
|||
|
to a JE <a class="ulink" href="../java/com/sleepycat/je/rep/ReplicatedEnvironment.html" target="_top">ReplicatedEnvironment</a>. However, replication groups
|
|||
|
can include any number of nodes that have no access to the JE
|
|||
|
replicated environment in use by the replication group.
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
These type of nodes without environments are called
|
|||
|
<span class="emphasis"><em>monitor nodes</em></span>. The point of a monitor node
|
|||
|
is to allow a process to have some understanding of the
|
|||
|
replication group's structure such as which node is the Master
|
|||
|
and what nodes belong to the group as Replicas. Monitor nodes
|
|||
|
also have the ability to know when certain events have happened
|
|||
|
in the replication group, such as when a new Master is elected or
|
|||
|
when new nodes are added to, or removed from, the group.
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
There are many uses for Monitor nodes, starting with the ability to
|
|||
|
write processes that monitor the current status of your HA
|
|||
|
application. But another, arguably more interesting, use for
|
|||
|
Monitor nodes is for request routing. As we have explained earlier
|
|||
|
in this book, Replicas can only service read-only requests; all
|
|||
|
write requests must occur on the Master. However, Replicas are only
|
|||
|
capable of noticing that they have been asked to process a write
|
|||
|
request. At most, out of the box, they can complain about it by
|
|||
|
throwing a <a class="ulink" href="../java/com/sleepycat/je/rep/ReplicaWriteException.html" target="_top">ReplicaWriteException</a>, and then completely rejecting
|
|||
|
the request.
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
One way to handle this problem is by writing an request router that
|
|||
|
sits on your network between the data nodes and your clients.
|
|||
|
This router can send write requests to the Master, and read
|
|||
|
requests to the Replicas. A robust example of this sort of thing
|
|||
|
could also perform load balancing across the various Replicas, so
|
|||
|
that no one Replica becomes swamped by too many read requests.
|
|||
|
</p>
|
|||
|
<div class="sect1" lang="en" xml:lang="en">
|
|||
|
<div class="titlepage">
|
|||
|
<div>
|
|||
|
<div>
|
|||
|
<h2 class="title" style="clear: both"><a id="monitorclass"></a>Monitor Class</h2>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<p>
|
|||
|
You implement Monitor nodes using the <a class="ulink" href="../java/com/sleepycat/je/rep/monitor/Monitor.html" target="_top">Monitor</a> class. The
|
|||
|
<code class="classname">Monitor</code> class allows you to obtain
|
|||
|
information about the replication group, such as its name,
|
|||
|
where the Master is, and other such information. The
|
|||
|
<code class="classname">Monitor</code> class also allows you to run an
|
|||
|
event listener that can alert you to changes in the composition
|
|||
|
of the replication group.
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
You instantiate a <code class="classname">Monitor</code> class object
|
|||
|
in much the same way as you instantiate a
|
|||
|
<a class="ulink" href="../java/com/sleepycat/je/rep/ReplicatedEnvironment.html" target="_top">ReplicatedEnvironment</a> class object. It is necessary to give
|
|||
|
the node a name, to indicate that it is a Monitor node, to
|
|||
|
identify the node's host and port information, and to identify
|
|||
|
helper hosts. You use a <a class="ulink" href="../java/com/sleepycat/je/rep/monitor/MonitorConfig.html" target="_top">MonitorConfig</a> object to do these
|
|||
|
things.
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
Once the <code class="classname">Monitor</code> object has been
|
|||
|
instantiated, it must be registered at least once with the
|
|||
|
Master so that the replication group will know to keep the node
|
|||
|
informed about changes in the group composition. (Subsequent
|
|||
|
attempts to register the node are simply ignored by the
|
|||
|
Master.) You use the <a class="ulink" href="../java/com/sleepycat/je/rep/monitor/Monitor.html#register()" target="_top">Monitor.register()</a> method to register a
|
|||
|
Monitor node with a Master.
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
For example:
|
|||
|
</p>
|
|||
|
<pre class="programlisting"> // Initialize the monitor node config
|
|||
|
MonitorConfig config = new MonitorConfig();
|
|||
|
config.setGroupName("MyRepGroupName");
|
|||
|
config.setNodeName("mon1");
|
|||
|
config.setNodeHostPort("monhost1.acme.com:7000");
|
|||
|
config.setHelperHosts("node1.acme.com:5000,node2.acme.com:5000");
|
|||
|
|
|||
|
Monitor monitor = new Monitor(config);
|
|||
|
|
|||
|
// If the monitor has not been registered as a member of the
|
|||
|
// group, register it now. register() returns the current node
|
|||
|
// that is the master.
|
|||
|
ReplicationNode currentMaster = monitor.register(); </pre>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="navfooter">
|
|||
|
<hr />
|
|||
|
<table width="100%" summary="Navigation footer">
|
|||
|
<tr>
|
|||
|
<td width="40%" align="left"><a accesskey="p" href="enablerep.html">Prev</a> </td>
|
|||
|
<td width="20%" align="center"> </td>
|
|||
|
<td width="40%" align="right"> <a accesskey="n" href="events.html">Next</a></td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td width="40%" align="left" valign="top">Converting Existing Environments for Replication </td>
|
|||
|
<td width="20%" align="center">
|
|||
|
<a accesskey="h" href="index.html">Home</a>
|
|||
|
</td>
|
|||
|
<td width="40%" align="right" valign="top"> Listening for Events</td>
|
|||
|
</tr>
|
|||
|
</table>
|
|||
|
</div>
|
|||
|
</body>
|
|||
|
</html>
|