sijie closed pull request #2243: [website] add a terminology page and replace 
popovers with hyperlinks
URL: https://github.com/apache/incubator-pulsar/pull/2243
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/site2/docs/admin-api-brokers.md b/site2/docs/admin-api-brokers.md
index 35ff69fbeb..9cc3023898 100644
--- a/site2/docs/admin-api-brokers.md
+++ b/site2/docs/admin-api-brokers.md
@@ -6,10 +6,10 @@ sidebar_label: Brokers
 
 Pulsar brokers consist of two components:
 
-1. An HTTP server exposing a [REST interface](reference-rest-api.md) 
administration and {% popover topic %} lookup.
-2. A dispatcher that handles all Pulsar {% popover message %} transfers.
+1. An HTTP server exposing a [REST interface](reference-rest-api.md) 
administration and [topic](reference-terminology.md#topic) lookup.
+2. A dispatcher that handles all Pulsar 
[message](reference-terminology.md#message) transfers.
 
-{% popover Brokers %} can be managed via:
+[Brokers](reference-terminology.md#broker) can be managed via:
 
 * The [`brokers`](reference-pulsar-admin.md#brokers) command of the 
[`pulsar-admin`](reference-pulsar-admin.md) tool
 * The `/admin/v2/brokers` endpoint of the admin [REST 
API](reference-rest-api.md)
@@ -80,9 +80,9 @@ admin.brokers().getOwnedNamespaces(cluster,brokerUrl);
 
 ### Dynamic broker configuration
 
-One way to configure a Pulsar {% popover broker %} is to supply a 
[configuration](reference-configuration.md#broker) when the broker is [started 
up](reference-cli-tools.md#pulsar-broker).
+One way to configure a Pulsar [broker](reference-terminology.md#broker) is to 
supply a [configuration](reference-configuration.md#broker) when the broker is 
[started up](reference-cli-tools.md#pulsar-broker).
 
-But since all broker configuration in Pulsar is stored in {% popover ZooKeeper 
%}, configuration values can also be dynamically updated *while the broker is 
running*. When you update broker configuration dynamically, ZooKeeper will 
notify the broker of the change and the broker will then override any existing 
configuration values.
+But since all broker configuration in Pulsar is stored in ZooKeeper, 
configuration values can also be dynamically updated *while the broker is 
running*. When you update broker configuration dynamically, ZooKeeper will 
notify the broker of the change and the broker will then override any existing 
configuration values.
 
 * The [`brokers`](reference-pulsar-admin.md#brokers) command for the 
[`pulsar-admin`](reference-pulsar-admin.md) tool has a variety of subcommands 
that enable you to manipulate a broker's configuration dynamically, enabling 
you to [update config values](#update-dynamic-configuration) and more.
 * In the Pulsar admin [REST API](reference-rest-api.md), dynamic configuration 
is managed through the `/admin/v2/brokers/configuration` endpoint.
diff --git a/site2/docs/admin-api-clusters.md b/site2/docs/admin-api-clusters.md
index e625ae1e75..9f0d23eab9 100644
--- a/site2/docs/admin-api-clusters.md
+++ b/site2/docs/admin-api-clusters.md
@@ -4,7 +4,8 @@ title: Managing Clusters
 sidebar_label: Clusters
 ---
 
-Pulsar clusters consist of one or more Pulsar {% popover brokers %}, one or 
more {% popover BookKeeper %} servers (aka {% popover bookies %}), and a {% 
popover ZooKeeper %} cluster that provides configuration and coordination 
management.
+Pulsar clusters consist of one or more Pulsar 
[brokers](reference-terminology.md#broker), one or more 
[BookKeeper](reference-terminology.md#bookkeeper)
+servers (aka [bookies](reference-terminology.md#bookie)), and a 
[ZooKeeper](https://zookeeper.apache.org) cluster that provides configuration 
and coordination management.
 
 Clusters can be managed via:
 
@@ -56,7 +57,7 @@ When provision a new cluster, you need to initialize that 
cluster's [metadata](g
 * The local ZooKeeper connection string for the cluster
 * The global ZooKeeper connection string for the entire instance
 * The web service URL for the cluster
-* A broker service URL enabling interaction with the {% popover brokers %} in 
the cluster
+* A broker service URL enabling interaction with the 
[brokers](reference-terminology.md#broker) in the cluster
 
 You must initialize cluster metadata *before* starting up any 
[brokers](admin-api-brokers.md) that will belong to the cluster.
 
@@ -147,7 +148,7 @@ admin.clusters().updateCluster(clusterName, clusterData);
 
 ### Delete
 
-Clusters can be deleted from a Pulsar {% popover instance %}.
+Clusters can be deleted from a Pulsar 
[instance](reference-terminology.md#instance).
 
 #### pulsar-admin
 
@@ -171,7 +172,7 @@ admin.clusters().deleteCluster(clusterName);
 
 ### List
 
-You can fetch a list of all clusters in a Pulsar {% popover instance %}.
+You can fetch a list of all clusters in a Pulsar 
[instance](reference-terminology.md#instance).
 
 #### pulsar-admin
 
@@ -197,7 +198,7 @@ admin.clusters().getClusters();
 
 ### Update peer-cluster data
 
-Peer clusters can be configured for a given cluster in a Pulsar {% popover 
instance %}.
+Peer clusters can be configured for a given cluster in a Pulsar 
[instance](reference-terminology.md#instance).
 
 #### pulsar-admin
 
diff --git a/site2/docs/admin-api-namespaces.md 
b/site2/docs/admin-api-namespaces.md
index 6d95aaf030..9ebd77029a 100644
--- a/site2/docs/admin-api-namespaces.md
+++ b/site2/docs/admin-api-namespaces.md
@@ -4,7 +4,7 @@ title: Managing Namespaces
 sidebar_label: Namespaces
 ---
 
-Pulsar {% popover namespaces %} are logical groupings of {% popover topics %}.
+Pulsar [namespaces](reference-terminology.md#namespace) are logical groupings 
of [topics](reference-terminology.md#topic).
 
 Namespaces can be managed via:
 
@@ -16,7 +16,7 @@ Namespaces can be managed via:
 
 ### Create
 
-You can create new namespaces under a given {% popover tenant %}.
+You can create new namespaces under a given 
[tenant](reference-terminology.md#tenant).
 
 #### pulsar-admin
 
@@ -85,7 +85,7 @@ admin.namespaces().getPolicies(namespace);
 
 ### List namespaces within a tenant
 
-You can list all namespaces within a given Pulsar {% popover tenant %}.
+You can list all namespaces within a given Pulsar 
[tenant](reference-terminology.md#tenant).
 
 #### pulsar-admin
 
@@ -631,7 +631,7 @@ Coming soon.
 
 ### Unloading from a broker
 
-You can unload a namespace, or a {% popover namespace bundle %}, from the 
Pulsar {% popover broker %} that is currently responsible for it.
+You can unload a namespace, or a [namespace 
bundle](reference-terminology.md#namespace-bundle), from the Pulsar 
[broker](reference-terminology.md#broker) that is currently responsible for it.
 
 #### pulsar-admin
 
diff --git a/site2/docs/admin-api-overview.md b/site2/docs/admin-api-overview.md
index f85752df8e..2220418825 100644
--- a/site2/docs/admin-api-overview.md
+++ b/site2/docs/admin-api-overview.md
@@ -4,11 +4,11 @@ title: The Pulsar admin interface
 sidebar_label: Overview
 ---
 
-The Pulsar admin interface enables you to manage all of the important entities 
in a Pulsar {% popover instance %}, such as {% popover properties %}, {% 
popover topics %}, and {% popover namespaces %}.
+The Pulsar admin interface enables you to manage all of the important entities 
in a Pulsar [instance](reference-terminology.md#instance), such as 
[tenants](reference-terminology.md#tenant), 
[topics](reference-terminology.md#topic), and 
[namespaces](reference-terminology.md#namespace).
 
 You can currently interact with the admin interface via:
 
-- Making HTTP calls against the admin [REST API](reference-rest-api.md) 
provided by Pulsar {% popover brokers %}. For some restful apis, they might be 
redirected to topic owner brokers for serving
+- Making HTTP calls against the admin [REST API](reference-rest-api.md) 
provided by Pulsar [brokers](reference-terminology.md#broker). For some restful 
apis, they might be redirected to topic owner brokers for serving
    with [`307 Temporary 
Redirect`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/307), hence 
the HTTP callers should handle `307 Temporary Redirect`. If you are using 
`curl`, you should specify `-L`
    to handle redirections.
 - The `pulsar-admin` CLI tool, which is available in the `bin` folder of your 
[Pulsar installation](getting-started-standalone.md):
@@ -28,7 +28,7 @@ In this document, examples from each of the three available 
interfaces will be s
 
 ## Admin setup
 
-Each of Pulsar's three admin interfaces---the 
[`pulsar-admin`](reference-pulsar-admin.md) CLI tool, the [Java admin 
API](/api/admin), and the [REST API](reference-rest-api.md)---requires some 
special setup if you have 
[authentication](security-overview.md#authentication-providers) enabled in your 
Pulsar {% popover instance %}.
+Each of Pulsar's three admin interfaces---the 
[`pulsar-admin`](reference-pulsar-admin.md) CLI tool, the [Java admin 
API](/api/admin), and the [REST API](reference-rest-api.md)---requires some 
special setup if you have 
[authentication](security-overview.md#authentication-providers) enabled in your 
Pulsar [instance](reference-terminology.md#instance).
 
 ### pulsar-admin
 
@@ -46,11 +46,11 @@ If you have 
[authentication](security-overview.md#authentication-providers) enab
 
 ### REST API
 
-You can find documentation for the REST API exposed by Pulsar {% popover 
brokers %} in [this reference document](reference-rest-api.md).
+You can find documentation for the REST API exposed by Pulsar 
[brokers](reference-terminology.md#broker) in [this reference 
document](reference-rest-api.md).
 
 ### Java admin client
 
-To use the Java admin API, instantiate a {% javadoc PulsarAdmin admin 
org.apache.pulsar.client.admin.PulsarAdmin %} object, specifying a URL for a 
Pulsar {% popover broker %} and a {% javadoc ClientConfiguration admin 
org.apache.pulsar.client.admin.ClientConfiguration %}. Here's a minimal example 
using `localhost`:
+To use the Java admin API, instantiate a {% javadoc PulsarAdmin admin 
org.apache.pulsar.client.admin.PulsarAdmin %} object, specifying a URL for a 
Pulsar [broker](reference-terminology.md#broker) and a {% javadoc 
ClientConfiguration admin org.apache.pulsar.client.admin.ClientConfiguration 
%}. Here's a minimal example using `localhost`:
 
 ```java
 URL url = new URL("http://localhost:8080";);
diff --git a/site2/docs/admin-api-tenants.md b/site2/docs/admin-api-tenants.md
index da2e9195c3..fdd63bf61a 100644
--- a/site2/docs/admin-api-tenants.md
+++ b/site2/docs/admin-api-tenants.md
@@ -15,7 +15,7 @@ Tenants, like namespaces, can be managed using the [admin 
API](admin-api-overvie
 
 #### pulsar-admin
 
-You can list all of the tenants associated with an {% popover instance %} 
using the [`list`](reference-pulsar-admin.md#tenants-list) subcommand:
+You can list all of the tenants associated with an 
[instance](reference-terminology.md#instance) using the 
[`list`](reference-pulsar-admin.md#tenants-list) subcommand:
 
 ```shell
 $ pulsar-admin tenants list
diff --git a/site2/docs/administration-dashboard.md 
b/site2/docs/administration-dashboard.md
index 427f355281..9305f1e2d6 100644
--- a/site2/docs/administration-dashboard.md
+++ b/site2/docs/administration-dashboard.md
@@ -4,7 +4,7 @@ title: The Pulsar dashboard
 sidebar_label: Dashboard
 ---
 
-The Pulsar dashboard is a web application that enables users to monitor 
current stats for all {% popover topics %} in tabular form.
+The Pulsar dashboard is a web application that enables users to monitor 
current stats for all [topics](reference-terminology.md#topic) in tabular form.
 
 The dashboard is a data collector that polls stats from all the brokers in a 
Pulsar instance (across multiple clusters) and stores all the information in a 
[PostgreSQL](https://www.postgresql.org/) database.
 
diff --git a/site2/docs/administration-geo.md b/site2/docs/administration-geo.md
index fb5a8b654c..1093323bf8 100644
--- a/site2/docs/administration-geo.md
+++ b/site2/docs/administration-geo.md
@@ -44,7 +44,7 @@ All messages produced in any cluster will be delivered to all 
subscriptions in a
 
 ## Configuring replication
 
-As stated [above](#geo-replication-and-pulsar-properties), geo-replication in 
Pulsar is managed at the {% popover property %} level.
+As stated [above](#geo-replication-and-pulsar-properties), geo-replication in 
Pulsar is managed at the [tenant](reference-terminology.md#tenant) level.
 
 ### Granting permissions to properties
 
diff --git a/site2/docs/administration-zk-bk.md 
b/site2/docs/administration-zk-bk.md
index 54d00eaeee..7f8c69c8d9 100644
--- a/site2/docs/administration-zk-bk.md
+++ b/site2/docs/administration-zk-bk.md
@@ -245,7 +245,7 @@ In Pulsar, you can set *persistence policies*, at the 
namespace level, that dete
 
 ### Set persistence policies
 
-You can set persistence policies for BookKeeper at the {% popover namespace %} 
level.
+You can set persistence policies for BookKeeper at the 
[namespace](reference-terminology.md#namespace) level.
 
 #### pulsar-admin
 
@@ -254,7 +254,7 @@ Use the 
[`set-persistence`](reference-pulsar-admin.md#namespaces-set-persistence
 Flag | Description | Default
 :----|:------------|:-------
 `-a`, `--bookkeeper-ack-quorom` | The number of acks (guaranteed copies) to 
wait on for each entry | 0
-`-e`, `--bookkeeper-ensemble` | The number of {% popover bookies %} to use for 
topics in the namespace | 0
+`-e`, `--bookkeeper-ensemble` | The number of 
[bookies](reference-terminology.md#bookie) to use for topics in the namespace | 0
 `-w`, `--bookkeeper-write-quorum` | How many writes to make for each entry | 0
 `-r`, `--ml-mark-delete-max-rate` | Throttling rate for mark-delete operations 
(0 means no throttle) | 0
 
diff --git a/site2/docs/client-libraries-go.md 
b/site2/docs/client-libraries-go.md
index 92a88df336..687fcd44e9 100644
--- a/site2/docs/client-libraries-go.md
+++ b/site2/docs/client-libraries-go.md
@@ -85,8 +85,8 @@ The following configurable parameters are available for 
Pulsar clients:
 Parameter | Description | Default
 :---------|:------------|:-------
 `URL` | The connection URL for the Pulsar cluster. See [above](#urls) for more 
info |
-`IOThreads` | The number of threads to use for handling connections to Pulsar 
{% popover brokers %} | 1
-`OperationTimeoutSeconds` | The timeout for some Go client operations 
(creating producers, subscribing to and unsubscribing from {% popover topics 
%}). Retries will occur until this threshold is reached, at which point the 
operation will fail. | 30
+`IOThreads` | The number of threads to use for handling connections to Pulsar 
[brokers](reference-terminology.md#broker) | 1
+`OperationTimeoutSeconds` | The timeout for some Go client operations 
(creating producers, subscribing to and unsubscribing from 
[topics](reference-terminology.md#topic)). Retries will occur until this 
threshold is reached, at which point the operation will fail. | 30
 `MessageListenerThreads` | The number of threads used by message listeners 
([consumers](#consumers) and [readers](#readers)) | 1
 `ConcurrentLookupRequests` | The number of concurrent lookup requests that can 
be sent on each broker connection. Setting a maximum helps to keep from 
overloading brokers. You should set values over the default of 5000 only if the 
client needs to produce and/or subscribe to thousands of Pulsar topics. | 5000
 `Logger` | A custom logger implementation for the client (as a function that 
takes a log level, file path, line number, and message). All info, warn, and 
error messages will be routed to this function. | `nil`
@@ -129,7 +129,7 @@ Pulsar Go producers have the following methods available:
 
 Method | Description | Return type
 :------|:------------|:-----------
-`Topic()` | Fetches the producer's {% popover topic %} | `string`
+`Topic()` | Fetches the producer's [topic](reference-terminology.md#topic)| 
`string`
 `Name()` | Fetchs the producer's name | `string`
 `Send(context.Context, ProducerMessage) error` | Publishes a 
[message](#messages) to the producer's topic. This call will block until the 
message is successfully acknowledged by the Pulsar broker, or an error will be 
thrown if the timeout set using the `SendTimeout` in the producer's 
[configuration](#producer-configuration) is exceeded. | `error`
 `SendAsync(context.Context, ProducerMessage, func(ProducerMessage, error))` | 
Publishes a [message](#messages) to the producer's topic asynchronously. The 
third argument is a callback function that specifies what happens either when 
the message is acknowledged or an error is thrown. |
@@ -193,10 +193,10 @@ func main() {
 
 Parameter | Description | Default
 :---------|:------------|:-------
-`Topic` | The Pulsar {% popover topic %} to which the producer will publish 
messages |
+`Topic` | The Pulsar [topic](reference-terminology.md#topic) to which the 
producer will publish messages |
 `Name` | A name for the producer. If you don't explicitly assign a name, 
Pulsar will automatically generate a globally unique name that you can access 
later using the `Name()` method.  If you choose to explicitly assign a name, it 
will need to be unique across *all* Pulsar clusters, otherwise the creation 
operation will throw an error. |
-`SendTimeout` | When publishing a message to a topic, the producer will wait 
for an acknowledgment from the responsible Pulsar {% popover broker %}. If a 
message is not acknowledged within the threshold set by this parameter, an 
error will be thrown. If you set `SendTimeout` to -1, the timeout will be set 
to infinity (and thus removed). Removing the send timeout is recommended when 
using Pulsar's [message de-duplication](cookbooks-deduplication.md) feature. | 
30 seconds
-`MaxPendingMessages` | The maximum size of the queue holding pending messages 
(i.e. messages waiting to receive an acknowledgment from the {% popover broker 
%}). By default, when the queue is full all calls to the `Send` and `SendAsync` 
methods will fail *unless* `BlockIfQueueFull` is set to `true`. |
+`SendTimeout` | When publishing a message to a topic, the producer will wait 
for an acknowledgment from the responsible Pulsar 
[broker](reference-terminology.md#broker). If a message is not acknowledged 
within the threshold set by this parameter, an error will be thrown. If you set 
`SendTimeout` to -1, the timeout will be set to infinity (and thus removed). 
Removing the send timeout is recommended when using Pulsar's [message 
de-duplication](cookbooks-deduplication.md) feature. | 30 seconds
+`MaxPendingMessages` | The maximum size of the queue holding pending messages 
(i.e. messages waiting to receive an acknowledgment from the 
[broker](reference-terminology.md#broker)). By default, when the queue is full 
all calls to the `Send` and `SendAsync` methods will fail *unless* 
`BlockIfQueueFull` is set to `true`. |
 `MaxPendingMessagesAcrossPartitions` | |
 `BlockIfQueueFull` | If set to `true`, the producer's `Send` and `SendAsync` 
methods will block when the outgoing message queue is full rather than failing 
and throwing an error (the size of that queue is dictated by the 
`MaxPendingMessages` parameter); if set to `false` (the default), `Send` and 
`SendAsync` operations will fail and throw a `ProducerQueueIsFullError` when 
the queue is full. | `false`
 `MessageRoutingMode` | The message routing logic (for producers on 
[partitioned 
topics](getting-started-concepts-and-architecture.md#partitioned-topics)). This 
logic is applied only when no key is set on messages. The available options 
are: round robin (`pulsar.RoundRobinDistribution`, the default), publishing all 
messages to a single partition (`pulsar.UseSinglePartition`), or a custom 
partitioning scheme (`pulsar.CustomPartition`). | 
`pulsar.RoundRobinDistribution`
@@ -246,13 +246,13 @@ Pulsar Go consumers have the following methods available:
 
 Method | Description | Return type
 :------|:------------|:-----------
-`Topic()` | Returns the consumer's {% popover topic %} | `string`
+`Topic()` | Returns the consumer's [topic](reference-terminology.md#topic) | 
`string`
 `Subscription()` | Returns the consumer's subscription name | `string`
 `Unsubcribe()` | Unsubscribes the consumer from the assigned topic. Throws an 
error if the unsubscribe operation is somehow unsuccessful. | `error`
 `Receive(context.Context)` | Receives a single message from the topic. This 
method blocks until a message is available. | `(Message, error)`
-`Ack(Message)` | {% popover Acknowledges %} a message to the Pulsar {% popover 
broker %} | `error`
-`AckID(MessageID)` | {% popover Acknowledges %} a message to the Pulsar {% 
popover broker %} by message ID | `error`
-`AckCumulative(Message)` | {% popover Acknowledges %} *all* the messages in 
the stream, up to and including the specified message. The `AckCumulative` 
method will block until the ack has been sent to the broker. After that, the 
messages will *not* be redelivered to the consumer. Cumulative acking can only 
be used with a [shared](getting-started-concepts-and-architecture.md#shared) 
subscription type.
+`Ack(Message)` | [Acknowledges](reference-terminology.md#acknowledgment-ack) a 
message to the Pulsar [broker](reference-terminology.md#broker) | `error`
+`AckID(MessageID)` | 
[Acknowledges](reference-terminology.md#acknowledgment-ack) a message to the 
Pulsar [broker](reference-terminology.md#broker) by message ID | `error`
+`AckCumulative(Message)` | 
[Acknowledges](reference-terminology.md#acknowledgment-ack) *all* the messages 
in the stream, up to and including the specified message. The `AckCumulative` 
method will block until the ack has been sent to the broker. After that, the 
messages will *not* be redelivered to the consumer. Cumulative acking can only 
be used with a [shared](getting-started-concepts-and-architecture.md#shared) 
subscription type.
 `Close()` | Closes the consumer, disabling its ability to receive messages 
from the broker | `error`
 `RedeliverUnackedMessages()` | Redelivers *all* unacknowledged messages on the 
topic. In [failover](getting-started-concepts-and-architecture.md#failover) 
mode, this request is ignored if the consumer isn't active on the specified 
topic; in [shared](getting-started-concepts-and-architecture.md#shared) mode, 
redelivered messages are distributed across all consumers connected to the 
topic. **Note**: this is a *non-blocking* operation that doesn't throw an 
error. |
 
@@ -305,7 +305,7 @@ func main() {
 
 Parameter | Description | Default
 :---------|:------------|:-------
-`Topic` | The Pulsar {% popover topic %} on which the consumer will establish 
a subscription and listen for messages |
+`Topic` | The Pulsar [topic](reference-terminology.md#topic) on which the 
consumer will establish a subscription and listen for messages |
 `SubscriptionName` | The subscription name for this consumer |
 `Name` | The name of the consumer |
 `AckTimeout` | | 0
@@ -335,7 +335,7 @@ Pulsar Go readers have the following methods available:
 
 Method | Description | Return type
 :------|:------------|:-----------
-`Topic()` | Returns the reader's {% popover topic %} | `string`
+`Topic()` | Returns the reader's [topic](reference-terminology.md#topic) | 
`string`
 `Next(context.Context)` | Receives the next message on the topic (analogous to 
the `Receive` method for [consumers](#consumer-operations)). This method blocks 
until a message is available. | `(Message, error)`
 `Close()` | Closes the reader, disabling its ability to receive messages from 
the broker | `error`
 
@@ -396,7 +396,7 @@ reader, err := client.CreateReader(pulsar.ReaderOptions{
 
 Parameter | Description | Default
 :---------|:------------|:-------
-`Topic` | The Pulsar {% popover topic %} on which the reader will establish a 
subscription and listen for messages |
+`Topic` | The Pulsar [topic](reference-terminology.md#topic) on which the 
reader will establish a subscription and listen for messages |
 `Name` | The name of the reader |
 `StartMessageID` | THe initial reader position, i.e. the message at which the 
reader begins processing messages. The options are `pulsar.EarliestMessage` 
(the earliest available message on the topic), `pulsar.LatestMessage` (the 
latest available message on the topic), or a `MessageID` object for a position 
that isn't earliest or latest. |
 `MessageChannel` | The Go channel used by the reader. Messages that arrive 
from the Pulsar topic(s) will be passed to this channel. |
diff --git a/site2/docs/client-libraries-java.md 
b/site2/docs/client-libraries-java.md
index 97a1ef1b76..1913bea142 100644
--- a/site2/docs/client-libraries-java.md
+++ b/site2/docs/client-libraries-java.md
@@ -71,7 +71,7 @@ pulsar+ssl://pulsar.us-west.example.com:6651
 
 ## Client configuration
 
-You can instantiate a {% javadoc PulsarClient client 
org.apache.pulsar.client.api.PulsarClient %} object using just a URL for the 
target Pulsar {% popover cluster %}, like this:
+You can instantiate a {% javadoc PulsarClient client 
org.apache.pulsar.client.api.PulsarClient %} object using just a URL for the 
target Pulsar [cluster](reference-terminology.md#cluster), like this:
 
 ```java
 PulsarClient client = PulsarClient.builder()
@@ -89,7 +89,7 @@ Check out the Javadoc for the {% javadoc PulsarClient client 
org.apache.pulsar.c
 
 ## Producers
 
-In Pulsar, producers write messages to topics. Once you've instantiated a {% 
javadoc PulsarClient client org.apache.pulsar.client.api.PulsarClient %} object 
(as in the section [above](#client-configuration)), you can create a {% javadoc 
Producer client org.apache.pulsar.client.api.Producer %} for a specific Pulsar 
{% popover topic %}.
+In Pulsar, producers write messages to topics. Once you've instantiated a {% 
javadoc PulsarClient client org.apache.pulsar.client.api.PulsarClient %} object 
(as in the section [above](#client-configuration)), you can create a {% javadoc 
Producer client org.apache.pulsar.client.api.Producer %} for a specific Pulsar 
[topic](reference-terminology.md#topic).
 
 ```java
 Producer<byte[]> producer = client.newProducer()
@@ -176,9 +176,9 @@ get a future returned.
 
 ## Consumers
 
-In Pulsar, consumers subscribe to topics and handle messages that producers 
publish to those topics. You can instantiate a new {% popover consumer %} by 
first instantiating a {% javadoc PulsarClient client 
org.apache.pulsar.client.api.PulsarClient %} object and passing it a URL for a 
Pulsar broker (as [above](#client-configuration)).
+In Pulsar, consumers subscribe to topics and handle messages that producers 
publish to those topics. You can instantiate a new 
[consumer](reference-terminology.md#consumer) by first instantiating a {% 
javadoc PulsarClient client org.apache.pulsar.client.api.PulsarClient %} object 
and passing it a URL for a Pulsar broker (as [above](#client-configuration)).
 
-Once you've instantiated a {% javadoc PulsarClient client 
org.apache.pulsar.client.api.PulsarClient %} object, you can create a {% 
javadoc Consumer client org.apache.pulsar.client.api.Consumer %} by specifying 
a {% popover topic %} and a 
[subscription](getting-started-concepts-and-architecture.md#subscription-modes).
+Once you've instantiated a {% javadoc PulsarClient client 
org.apache.pulsar.client.api.PulsarClient %} object, you can create a {% 
javadoc Consumer client org.apache.pulsar.client.api.Consumer %} by specifying 
a [topic](reference-terminology.md#topic) and a 
[subscription](getting-started-concepts-and-architecture.md#subscription-modes).
 
 ```java
 Consumer consumer = client.newConsumer()
@@ -187,7 +187,7 @@ Consumer consumer = client.newConsumer()
         .subscribe();
 ```
 
-The `subscribe` method will automatically subscribe the consumer to the 
specified topic and subscription. One way to make the consumer listen on the 
topic is to set up a `while` loop. In this example loop, the consumer listens 
for messages, prints the contents of any message that's received, and then {% 
popover acknowledges %} that the message has been processed:
+The `subscribe` method will automatically subscribe the consumer to the 
specified topic and subscription. One way to make the consumer listen on the 
topic is to set up a `while` loop. In this example loop, the consumer listens 
for messages, prints the contents of any message that's received, and then 
[acknowledges](reference-terminology.md#acknowledgment-ack) that the message 
has been processed:
 
 ```java
 do {
@@ -335,7 +335,7 @@ Producer<byte[]> producer = client.newProducer()
         .create();
 ```
 
-The producer above is equivalent to a `Producer<byte[]>` (in fact, you should 
*always* explicitly specify the type). If you'd like to use a producer for a 
different type of data, you'll need to specify a **schema** that informs Pulsar 
which data type will be transmitted over the {% popover topic %}.
+The producer above is equivalent to a `Producer<byte[]>` (in fact, you should 
*always* explicitly specify the type). If you'd like to use a producer for a 
different type of data, you'll need to specify a **schema** that informs Pulsar 
which data type will be transmitted over the 
[topic](reference-terminology.md#topic).
 
 ### Schema example
 
diff --git a/site2/docs/client-libraries-websocket.md 
b/site2/docs/client-libraries-websocket.md
index 575841ba8a..794f9da419 100644
--- a/site2/docs/client-libraries-websocket.md
+++ b/site2/docs/client-libraries-websocket.md
@@ -28,7 +28,7 @@ webSocketServiceEnabled=true
 
 ### As a separate component
 
-In this mode, the WebSocket service will be run from a Pulsar {% popover 
broker %} as a separate service. Configuration for this mode is handled in the 
[`conf/websocket.conf`](reference-configuration.md#websocket) configuration 
file. You'll need to set *at least* the following parameters:
+In this mode, the WebSocket service will be run from a Pulsar 
[broker](reference-terminology.md#broker) as a separate service. Configuration 
for this mode is handled in the 
[`conf/websocket.conf`](reference-configuration.md#websocket) configuration 
file. You'll need to set *at least* the following parameters:
 
 * 
[`globalZookeeperServers`](reference-configuration.md#websocket-globalZookeeperServers)
 * [`webServicePort`](reference-configuration.md#websocket-webServicePort)
@@ -96,7 +96,7 @@ Key | Type | Required? | Explanation
 `properties` | key-value pairs | no | Application-defined properties
 `context` | string | no | Application-defined request identifier
 `key` | string | no | For partitioned topics, decides which partition to use
-`replicationClusters` | array | no | Restrict replication to this list of {% 
popover clusters %}, specified by name
+`replicationClusters` | array | no | Restrict replication to this list of 
[clusters](reference-terminology.md#cluster), specified by name
 
 
 ##### Example success response
@@ -268,7 +268,7 @@ You can also download it from 
[PyPI](https://pypi.python.org/pypi/websocket-clie
 
 #### Python producer
 
-Here's an example Python producer that sends a simple message to a Pulsar {% 
popover topic %}:
+Here's an example Python producer that sends a simple message to a Pulsar 
[topic](reference-terminology.md#topic):
 
 ```python
 import websocket, base64, json
diff --git a/site2/docs/cookbooks-deduplication.md 
b/site2/docs/cookbooks-deduplication.md
index 651c1ff0e4..77b0feb8ef 100644
--- a/site2/docs/cookbooks-deduplication.md
+++ b/site2/docs/cookbooks-deduplication.md
@@ -24,7 +24,7 @@ You can configure message deduplication in Pulsar using the 
[`broker.conf`](refe
 
 Parameter | Description | Default
 :---------|:------------|:-------
-`brokerDeduplicationEnabled` | Sets the default behavior for message 
deduplication in the Pulsar {% popover broker %}. If set to `true`, message 
deduplication will be enabled by default on all namespaces; if set to `false` 
(the default), deduplication will have to be [enabled](#enabling) and 
[disabled](#disabling) on a per-namespace basis. | `false`
+`brokerDeduplicationEnabled` | Sets the default behavior for message 
deduplication in the Pulsar [broker](reference-terminology.md#broker). If set 
to `true`, message deduplication will be enabled by default on all namespaces; 
if set to `false` (the default), deduplication will have to be 
[enabled](#enabling) and [disabled](#disabling) on a per-namespace basis. | 
`false`
 `brokerDeduplicationMaxNumberOfProducers` | The maximum number of producers 
for which information will be stored for deduplication purposes. | `10000`
 `brokerDeduplicationEntriesInterval` | The number of entries after which a 
deduplication informational snapshot is taken. A larger interval will lead to 
fewer snapshots being taken, though this would also lengthen the topic recovery 
time (the time required for entries published after the snapshot to be 
replayed). | `1000`
 `brokerDeduplicationProducerInactivityTimeoutMinutes` | The time of inactivity 
(in minutes) after which the broker will discard deduplication information 
related to a disconnected producer. | `360` (6 hours)
diff --git a/site2/docs/cookbooks-message-queue.md 
b/site2/docs/cookbooks-message-queue.md
index a4da5b4dbe..81e0cfa5d8 100644
--- a/site2/docs/cookbooks-message-queue.md
+++ b/site2/docs/cookbooks-message-queue.md
@@ -9,19 +9,19 @@ Message queues are essential components of many large-scale 
data architectures.
 Pulsar is a great choice for a message queue because:
 
 * it was built with [persistent message 
storage](getting-started-concepts-and-architecture.md#persistent-storage) in 
mind
-* it offers automatic load balancing across {% popover consumers %} for 
messages on a topic (or custom load balancing if you wish)
+* it offers automatic load balancing across 
[consumers](reference-terminology.md#consumer) for messages on a topic (or 
custom load balancing if you wish)
 
 > You can use the same Pulsar installation to act as a real-time message bus 
 > and as a message queue if you wish (or just one or the other). You can set 
 > aside some topics for real-time purposes and other topics for message queue 
 > purposes (or use specific namespaces for either purpose if you wish).
 
 
 # Client configuration changes
 
-To use a Pulsar popover topic as a message queue, you should distribute the 
receiver load on that topic across several consumers (the optimal number of 
consumers will depend on the load). Each consumer must:
+To use a Pulsar [topic](reference-terminology.md#topic) as a message queue, 
you should distribute the receiver load on that topic across several consumers 
(the optimal number of consumers will depend on the load). Each consumer must:
 
 * Establish a [shared 
subscription](getting-started-concepts-and-architecture.md#shared) and use the 
same subscription name as the other consumers (otherwise the subscription is 
not shared and the consumers can't act as a processing ensemble)
-* If you'd like to have tight control over message dispatching across 
consumers, set the consumers' **receiver queue** size very low (potentially 
even to 0 if necessary). Each Pulsar {% popover consumer %} has a receiver 
queue that determines how many messages the consumer will attempt to fetch at a 
time. A receiver queue of 1000 (the default), for example, means that the 
consumer will attempt to process 1000 messages from the topic's backlog upon 
connection. Setting the receiver queue to zero essentially means ensuring that 
each consumer is only doing one thing at a time.
+* If you'd like to have tight control over message dispatching across 
consumers, set the consumers' **receiver queue** size very low (potentially 
even to 0 if necessary). Each Pulsar 
[consumer](reference-terminology.md#consumer) has a receiver queue that 
determines how many messages the consumer will attempt to fetch at a time. A 
receiver queue of 1000 (the default), for example, means that the consumer will 
attempt to process 1000 messages from the topic's backlog upon connection. 
Setting the receiver queue to zero essentially means ensuring that each 
consumer is only doing one thing at a time.
 
-   The downside to restricting the receiver queue size of consumers is that 
that limits the potential throughput of those consumers and cannot be used with 
{% popover partitioned topics %}. Whether the performance/control trade-off is 
worthwhile will depend on your use case.
+   The downside to restricting the receiver queue size of consumers is that 
that limits the potential throughput of those consumers and cannot be used with 
[partitioned topics](reference-terminology.md#partitioned-topic). Whether the 
performance/control trade-off is worthwhile will depend on your use case.
 
 ## Java clients
 
diff --git a/site2/docs/cookbooks-non-persistent.md 
b/site2/docs/cookbooks-non-persistent.md
index 64eb454c2d..0c595ed6f2 100644
--- a/site2/docs/cookbooks-non-persistent.md
+++ b/site2/docs/cookbooks-non-persistent.md
@@ -14,7 +14,7 @@ sidebar_label: Non-persistent messaging
 
 By default, Pulsar persistently stores *all* unacknowledged messages on 
multiple [BookKeeper](#persistent-storage) bookies (storage nodes). Data for 
messages on persistent topics can thus survive broker restarts and subscriber 
failover.
 
-Pulsar also, however, supports **non-persistent topics**, which are topics on 
which messages are *never* persisted to disk and live only in memory. When 
using non-persistent delivery, killing a Pulsar {% popover broker %} or 
disconnecting a subscriber to a topic means that all in-transit messages are 
lost on that (non-persistent) topic, meaning that clients may see message loss.
+Pulsar also, however, supports **non-persistent topics**, which are topics on 
which messages are *never* persisted to disk and live only in memory. When 
using non-persistent delivery, killing a Pulsar 
[broker](reference-terminology.md#broker) or disconnecting a subscriber to a 
topic means that all in-transit messages are lost on that (non-persistent) 
topic, meaning that clients may see message loss.
 
 Non-persistent topics have names of this form (note the `non-persistent` in 
the name):
 
diff --git a/site2/docs/cookbooks-partitioned.md 
b/site2/docs/cookbooks-partitioned.md
index 61db75f412..82c8885687 100644
--- a/site2/docs/cookbooks-partitioned.md
+++ b/site2/docs/cookbooks-partitioned.md
@@ -10,7 +10,7 @@ You can [publish](#publishing-to-partitioned-topics) to 
partitioned topics using
 
 ## Publishing to partitioned topics
 
-When publishing to partitioned topics, the only difference from 
non-partitioned topics is that you need to specify a [routing 
mode](getting-started-concepts-and-architecture.md#routing-modes) when you 
create a new {% popover producer %}. Examples for [Java](#java) are below.
+When publishing to partitioned topics, the only difference from 
non-partitioned topics is that you need to specify a [routing 
mode](getting-started-concepts-and-architecture.md#routing-modes) when you 
create a new [producer](reference-terminology.md#producer). Examples for 
[Java](#java) are below.
 
 ### Java
 
diff --git a/site2/docs/cookbooks-retention-expiry.md 
b/site2/docs/cookbooks-retention-expiry.md
index 3564c8cf9d..d961b25182 100644
--- a/site2/docs/cookbooks-retention-expiry.md
+++ b/site2/docs/cookbooks-retention-expiry.md
@@ -35,7 +35,7 @@ size retention.
 
 ### Defaults
 
-There are two configuration parameters that you can use to set {% popover 
instance %}-wide defaults for message retention: 
[`defaultRetentionTimeInMinutes=0`](reference-configuration.md#broker-defaultRetentionTimeInMinutes)
 and 
[`defaultRetentionSizeInMB=0`](reference-configuration.md#broker-defaultRetentionSizeInMB).
+There are two configuration parameters that you can use to set 
[instance](reference-terminology.md#instance)-wide defaults for message 
retention: 
[`defaultRetentionTimeInMinutes=0`](reference-configuration.md#broker-defaultRetentionTimeInMinutes)
 and 
[`defaultRetentionSizeInMB=0`](reference-configuration.md#broker-defaultRetentionSizeInMB).
 
 Both of these parameters are in the 
[`broker.conf`](reference-configuration.md#broker) configuration file.
 
@@ -130,7 +130,7 @@ admin.namespaces().getRetention(namespace);
 You can control the allowable size of backlogs, at the namespace level, using 
*backlog quotas*. Setting a backlog quota involves setting:
 
 * an allowable *size threshold* for each topic in the namespace
-* a *retention policy* that determines which action the {% popover broker %} 
takes if the threshold is exceeded.
+* a *retention policy* that determines which action the 
[broker](reference-terminology.md#broker) takes if the threshold is exceeded.
 
 The following retention policies are available:
 
@@ -149,7 +149,7 @@ Backlog quotas are handled at the namespace level. They can 
be managed via:
 
 ### Set size thresholds and backlog retention policies
 
-You can set a size threshold and backlog retention policy for all of the 
topics in a {% popover namespace %} by specifying the namespace, a size limit, 
and a policy by name.
+You can set a size threshold and backlog retention policy for all of the 
topics in a [namespace](reference-terminology.md#namespace) by specifying the 
namespace, a size limit, and a policy by name.
 
 #### pulsar-admin
 
diff --git a/site2/docs/deploy-aws.md b/site2/docs/deploy-aws.md
index f533e99b7d..1ef3cc3db0 100644
--- a/site2/docs/deploy-aws.md
+++ b/site2/docs/deploy-aws.md
@@ -6,7 +6,7 @@ sidebar_label: Amazon Web Services
 
 > For instructions on deploying a single Pulsar cluster manually rather than 
 > using Terraform and Ansible, see [Deploying a Pulsar cluster on bare 
 > metal](deploy-bare-metal.md). For instructions on manually deploying a 
 > multi-cluster Pulsar instance, see [Deploying a Pulsar instance on bare 
 > metal](deploy-bare-metal-multi-cluster.md).
 
-One of the easiest ways to get a Pulsar {% popover cluster %} running on 
[Amazon Web Services](https://aws.amazon.com/) (AWS) is to use the the 
[Terraform](https://terraform.io) infrastructure provisioning tool and the 
[Ansible](https://www.ansible.com) server automation tool. Terraform can create 
the resources necessary to run the Pulsar 
cluster---[EC2](https://aws.amazon.com/ec2/) instances, networking and security 
infrastructure, etc.---while Ansible can install and run Pulsar on the 
provisioned resources.
+One of the easiest ways to get a Pulsar 
[cluster](reference-terminology.md#cluster) running on [Amazon Web 
Services](https://aws.amazon.com/) (AWS) is to use the the 
[Terraform](https://terraform.io) infrastructure provisioning tool and the 
[Ansible](https://www.ansible.com) server automation tool. Terraform can create 
the resources necessary to run the Pulsar 
cluster---[EC2](https://aws.amazon.com/ec2/) instances, networking and security 
infrastructure, etc.---while Ansible can install and run Pulsar on the 
provisioned resources.
 
 ## Requirements and setup
 
@@ -102,7 +102,7 @@ When you run the Ansible playbook, the following AWS 
resources will be used:
 
 * 6 total [Elastic Compute Cloud](https://aws.amazon.com/ec2) (EC2) instances 
running the [ami-9fa343e7](https://access.redhat.com/articles/3135091) Amazon 
Machine Image (AMI), which runs [Red Hat Enterprise Linux (RHEL) 
7.4](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html-single/7.4_release_notes/index).
 By default, that includes:
   * 3 small VMs for ZooKeeper 
([t2.small](https://www.ec2instances.info/?selected=t2.small) instances)
-  * 3 larger VMs for Pulsar {% popover brokers %} and BookKeeper {% popover 
bookies %} ([i3.4xlarge](https://www.ec2instances.info/?selected=i3.4xlarge) 
instances)
+  * 3 larger VMs for Pulsar [brokers](reference-terminology.md#broker) and 
BookKeeper [bookies](reference-terminology.md#bookie) 
([i3.4xlarge](https://www.ec2instances.info/?selected=i3.4xlarge) instances)
 * An EC2 [security 
group](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html)
 * A [virtual private cloud](https://aws.amazon.com/vpc/) (VPC) for security
 * An [API Gateway](https://aws.amazon.com/api-gateway/) for connections from 
the outside world
diff --git a/site2/docs/deploy-bare-metal-multi-cluster.md 
b/site2/docs/deploy-bare-metal-multi-cluster.md
index d20047efc7..d2bb62a5db 100644
--- a/site2/docs/deploy-bare-metal-multi-cluster.md
+++ b/site2/docs/deploy-bare-metal-multi-cluster.md
@@ -209,7 +209,7 @@ As you can see from the example above, the following needs 
to be specified:
 * The local ZooKeeper connection string for the cluster
 * The configuration store connection string for the entire instance
 * The web service URL for the cluster
-* A broker service URL enabling interaction with the {% popover brokers %} in 
the cluster
+* A broker service URL enabling interaction with the 
[brokers](reference-terminology.md#broker) in the cluster
 
 If you're using [TLS](security-tls.md), you'll also need to specify a TLS web 
service URL for the cluster as well as a TLS broker service URL for the brokers 
in the cluster.
 
@@ -268,7 +268,7 @@ Brokers can be configured using the 
[`conf/broker.conf`](reference-configuration
 
 The most important element of broker configuration is ensuring that each 
broker is aware of its local ZooKeeper quorum as well as the global ZooKeeper 
quorum. Make sure that you set the 
[`zookeeperServers`](reference-configuration.md#broker-zookeeperServers) 
parameter to reflect the local quorum and the 
[`configurationStoreServers`](reference-configuration.md#broker-configurationStoreServers)
 parameter to reflect the configuration store quorum (although you'll need to 
specify only those ZooKeeper servers located in the same cluster).
 
-You also need to specify the name of the {% popover cluster %} to which the 
broker belongs using the 
[`clusterName`](reference-configuration.md#broker-clusterName) parameter.
+You also need to specify the name of the 
[cluster](reference-terminology.md#cluster) to which the broker belongs using 
the [`clusterName`](reference-configuration.md#broker-clusterName) parameter.
 
 Here's an example configuration:
 
@@ -314,7 +314,8 @@ You can also use your own service discovery system if you'd 
like. If you use you
 
 The service discovery mechanism included with Pulsar maintains a list of 
active brokers, stored in ZooKeeper, and supports lookup using HTTP and also 
Pulsar's [binary protocol](developing-binary-protocol.md).
 
-To get started setting up Pulsar's built-in service discovery, you need to 
change a few parameters in the 
[`conf/discovery.conf`](reference-configuration.md#service-discovery) 
configuration file. Set the 
[`zookeeperServers`](reference-configuration.md#service-discovery-zookeeperServers)
 parameter to the cluster's ZooKeeper quorum connection string and the 
[`configurationStoreServers`](reference-configuration.md#service-discovery-configurationStoreServers)
 setting to the {% popover configuration store %} quorum connection string.
+To get started setting up Pulsar's built-in service discovery, you need to 
change a few parameters in the 
[`conf/discovery.conf`](reference-configuration.md#service-discovery) 
configuration file. Set the 
[`zookeeperServers`](reference-configuration.md#service-discovery-zookeeperServers)
 parameter to the cluster's ZooKeeper quorum connection string and the 
[`configurationStoreServers`](reference-configuration.md#service-discovery-configurationStoreServers)
 setting to the [configuration
+store](reference-terminology.md#configuration-store) quorum connection string.
 
 ```properties
 # Zookeeper quorum connection string
@@ -356,7 +357,7 @@ $ bin/pulsar-admin tenants create test-tentant \
 
 This will allow users who identify with role `test-admin-role` to administer 
the configuration for the tenant `test` which will only be allowed to use the 
cluster `us-west`. From now on, this tenant will be able to self-manage its 
resources.
 
-Once a tenant has been created, you will need to create {% popover namespaces 
%} for topics within that tenant.
+Once a tenant has been created, you will need to create 
[namespaces](reference-terminology.md#namespace) for topics within that tenant.
 
 The first step is to create a namespace. A namespace is an administrative unit 
that can contain many topics. A common practice is to create a namespace for 
each different use case from a single tenant.
 
diff --git a/site2/docs/deploy-dcos.md b/site2/docs/deploy-dcos.md
index 64b3d962b5..6d6f53f6f3 100644
--- a/site2/docs/deploy-dcos.md
+++ b/site2/docs/deploy-dcos.md
@@ -39,8 +39,8 @@ $ dcos marathon group add PulsarGroups.json
 
 This command will deploy Docker container instances in three groups, which 
together comprise a Pulsar cluster:
 
-* 3 bookies (1 {% popover bookie %} on each agent node and 1 [bookie 
recovery](http://bookkeeper.apache.org/docs/latest/admin/autorecovery/) 
instance)
-* 3 Pulsar {% popover brokers %} (1 broker on each node and 1 admin instance)
+* 3 bookies (1 [bookie](reference-terminology.md#bookie) on each agent node 
and 1 [bookie 
recovery](http://bookkeeper.apache.org/docs/latest/admin/autorecovery/) 
instance)
+* 3 Pulsar [brokers](reference-terminology.md#broker) (1 broker on each node 
and 1 admin instance)
 * 1 [Prometheus](http://prometheus.io/) instance and 1 
[Grafana](https://grafana.com/) instance
 
 
@@ -58,7 +58,7 @@ To monitor the status of the BookKeeper cluster deployment, 
click on the **bookk
 
 ![DC/OS bookkeeper status](assets/dcos_bookkeeper_status.png)
 
-At this point, 3 {% popover bookies %} should be shown as green, which means 
that they have been deployed successfully and are now running.
+At this point, 3 [bookies](reference-terminology.md#bookie) should be shown as 
green, which means that they have been deployed successfully and are now 
running.
  
 ![DC/OS bookkeeper running](assets/dcos_bookkeeper_run.png)
  
diff --git a/site2/docs/deploy-kubernetes.md b/site2/docs/deploy-kubernetes.md
index 1bdd1b4162..39dc06aa76 100644
--- a/site2/docs/deploy-kubernetes.md
+++ b/site2/docs/deploy-kubernetes.md
@@ -38,7 +38,8 @@ To get started, you'll need:
 
 You can create a new GKE cluster using the [`container clusters 
create`](https://cloud.google.com/sdk/gcloud/reference/container/clusters/create)
 command for `gcloud`. This command enables you to specify the number of nodes 
in the cluster, the machine types of those nodes, and more.
 
-As an example, we'll create a new GKE cluster for Kubernetes version 
[1.6.4](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG.md#v164) 
in the 
[us-central1-a](https://cloud.google.com/compute/docs/regions-zones/regions-zones#available)
 zone. The cluster will be named `pulsar-gke-cluster` and will consist of three 
VMs, each using two locally attached SSDs and running on 
[n1-standard-8](https://cloud.google.com/compute/docs/machine-types) machines. 
These SSDs will be used by {% popover bookie %} instances, one for the 
BookKeeper 
[journal](getting-started-concepts-and-architecture.md#journal-storage) and the 
other for storing the actual message data.
+As an example, we'll create a new GKE cluster for Kubernetes version 
[1.6.4](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG.md#v164) 
in the 
[us-central1-a](https://cloud.google.com/compute/docs/regions-zones/regions-zones#available)
 zone. The cluster will be named `pulsar-gke-cluster` and will consist of three 
VMs, each using two locally attached SSDs and running on 
[n1-standard-8](https://cloud.google.com/compute/docs/machine-types) machines. 
These SSDs will be used by
+[bookie](reference-terminology.md#bookie) instances, one for the BookKeeper 
[journal](getting-started-concepts-and-architecture.md#journal-storage) and the 
other for storing the actual message data.
 
 ```bash
 $ gcloud container clusters create pulsar-gke-cluster \
@@ -161,7 +162,7 @@ This step may take several minutes, as Kubernetes needs to 
download the Docker i
 
 #### Initialize cluster metadata
 
-Once ZooKeeper is running, you need to [initialize the 
metadata](#cluster-metadata-initialization) for the Pulsar cluster in 
ZooKeeper. This includes system metadata for {% popover BookKeeper %} and 
Pulsar more broadly. There is a Kubernetes 
[job](https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/)
 in the `cluster-metadata.yaml` file that you only need to run once:
+Once ZooKeeper is running, you need to [initialize the 
metadata](#cluster-metadata-initialization) for the Pulsar cluster in 
ZooKeeper. This includes system metadata for 
[BookKeeper](reference-terminology.md#bookkeeper) and Pulsar more broadly. 
There is a Kubernetes 
[job](https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/)
 in the `cluster-metadata.yaml` file that you only need to run once:
 
 ```bash
 $ kubectl apply -f cluster-metadata.yaml
@@ -235,7 +236,7 @@ Now that you have a namespace and property set up, you can 
move on to [experimen
 
 #### Experimenting with your cluster
 
-Now that a property and namespace have been created, you can begin 
experimenting with your running Pulsar cluster. Using the same `pulsar-admin` 
pod via an alias, as in the section above, you can use 
[`pulsar-perf`](reference-cli-tools.md#pulsar-perf) to create a test {% popover 
producer %} to publish 10,000 messages a second on a topic in the {% popover 
property %} and {% popover namespace %} you created.
+Now that a property and namespace have been created, you can begin 
experimenting with your running Pulsar cluster. Using the same `pulsar-admin` 
pod via an alias, as in the section above, you can use 
[`pulsar-perf`](reference-cli-tools.md#pulsar-perf) to create a test 
[producer](reference-terminology.md#producer) to publish 10,000 messages a 
second on a topic in the [tenant](reference-terminology.md#tenant) and 
[namespace](reference-terminology.md#namespace) you created.
 
 First, create an alias to use the `pulsar-perf` tool via the admin pod:
 
@@ -250,7 +251,7 @@ $ pulsar-perf produce persistent://public/default/my-topic \
   --rate 10000
 ```
 
-Similarly, you can start a {% popover consumer %} to subscribe to and receive 
all the messages on that topic:
+Similarly, you can start a [consumer](reference-terminology.md#consumer) to 
subscribe to and receive all the messages on that topic:
 
 ```bash
 $ pulsar-perf consume persistent://public/default/my-topic \
@@ -273,7 +274,7 @@ All Pulsar metrics in Kubernetes are collected by a 
[Prometheus](https://prometh
 
 #### Grafana
 
-In your Kubernetes cluster, you can use [Grafana](https://grafana.com) to view 
dashbaords for Pulsar {% popover namespaces %} (message rates, latency, and 
storage), JVM stats, {% popover ZooKeeper %}, and {% popover BookKeeper %}. You 
can get access to the pod serving Grafana using `kubectl`'s 
[`port-forward`](https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster)
 command:
+In your Kubernetes cluster, you can use [Grafana](https://grafana.com) to view 
dashbaords for Pulsar [namespaces](reference-terminology.md#namespace) (message 
rates, latency, and storage), JVM stats, 
[ZooKeeper](https://zookeeper.apache.org), and 
[BookKeeper](reference-terminology.md#bookkeeper). You can get access to the 
pod serving Grafana using `kubectl`'s 
[`port-forward`](https://kubernetes.io/docs/tasks/access-application-cluster/port-forward-access-application-cluster)
 command:
 
 ```bash
 $ kubectl port-forward \
@@ -284,7 +285,7 @@ You can then access the dashboard in your web browser at 
[localhost:3000](http:/
 
 #### Pulsar dashboard
 
-While Grafana and Prometheus are used to provide graphs with historical data, 
[Pulsar dashboard](administration-dashboard.md) reports more detailed current 
data for individual {% popover topics %}.
+While Grafana and Prometheus are used to provide graphs with historical data, 
[Pulsar dashboard](administration-dashboard.md) reports more detailed current 
data for individual [topics](reference-terminology.md#topic).
 
 For example, you can have sortable tables showing all namespaces, topics, and 
broker stats, with details on the IP address for consumers, how long they've 
been connected, and much more.
 
diff --git a/site2/docs/developing-binary-protocol.md 
b/site2/docs/developing-binary-protocol.md
index 1dd6c48534..380e492037 100644
--- a/site2/docs/developing-binary-protocol.md
+++ b/site2/docs/developing-binary-protocol.md
@@ -60,7 +60,7 @@ Message metadata is stored alongside the 
application-specified payload as a seri
 | `sequence_id`                        | The sequence ID of the message, 
assigned by producer}                                                           
                                                                                
                                             |
 | `publish_time`                       | The publish timestamp in Unix time 
(i.e. as the number of milliseconds since January 1st, 1970 in UTC)             
                                                                                
                                                       |
 | `properties`                         | A sequence of key/value pairs (using 
the 
[`KeyValue`](https://github.com/apache/incubator-pulsar/blob/master/pulsar-common/src/main/proto/PulsarApi.proto#L32)
 message). These are application-defined keys and values with no special 
meaning to Pulsar. |
-| `replicated_from` *(optional)*       | Indicates that the message has been 
replicated and specifies the name of the {% popover cluster %} where the 
message was originally published                                                
                                                             |
+| `replicated_from` *(optional)*       | Indicates that the message has been 
replicated and specifies the name of the 
[cluster](reference-terminology.md#cluster) where the message was originally 
published                                                                       
                                      |
 | `partition_key` *(optional)*         | While publishing on a partition 
topic, if the key is present, the hash of the key is used to determine which 
partition to choose                                                             
                                                             |
 | `compression` *(optional)*           | Signals that payload has been 
compressed and with which compression library                                   
                                                                                
                                                            |
 | `uncompressed_size` *(optional)*     | If compression is used, the producer 
must fill the uncompressed size field with the original payload size            
                                                                                
                                                     |
diff --git a/site2/docs/functions-api.md b/site2/docs/functions-api.md
index f0f4f8c325..b26183797d 100644
--- a/site2/docs/functions-api.md
+++ b/site2/docs/functions-api.md
@@ -103,7 +103,7 @@ Both the [Java](#java-sdk) and [Python](#python-sdk) SDKs 
provide access to a **
 * The name of the topic on which the message was sent
 * The names of all input topics as well as the output topic associated with 
the function
 * The name of the class used for [SerDe](#serde)
-* The {% popover tenant %} and namespace associated with the function
+* The [tenant](reference-terminology.md#tenant) and namespace associated with 
the function
 * The ID of the Pulsar Functions instance running the function
 * The version of the function
 * The [logger object](#logging) used by the function, which can be used to 
create function log messages
@@ -518,7 +518,7 @@ Regardless of which [deployment 
mode](functions-deploying.md) you're using, you'
 * grpcio
 * grpcio-tools
 
-That could be your local machine for [local run 
mode](functions-deploying.md#local-run) or a machine running a Pulsar {% 
popover broker %} for [cluster mode](functions-deploying.md#cluster-mode). To 
install those libraries using pip:
+That could be your local machine for [local run 
mode](functions-deploying.md#local-run) or a machine running a Pulsar 
[broker](reference-terminology.md#broker) for [cluster 
mode](functions-deploying.md#cluster-mode). To install those libraries using 
pip:
 
 ```bash
 $ pip install pulsar-client protobuf futures grpcio grpcio-tools
@@ -577,7 +577,7 @@ Method | What it provides
 `record_metric` | Records a per-key [metric](#python-metrics)
 `publish` | Publishes a message to the specified Pulsar topic
 `get_output_serde_class_name` | The name of the output [SerDe](#python-serde) 
class
-`ack` | {% popover Acks %} the message being processed to Pulsar
+`ack` | [Acks](reference-terminology.md#acknowledgment-ack) the message being 
processed to Pulsar
 
 ### Python SerDe
 
diff --git a/site2/docs/functions-deploying.md 
b/site2/docs/functions-deploying.md
index 82c4228b7c..1bd6d1f5c6 100644
--- a/site2/docs/functions-deploying.md
+++ b/site2/docs/functions-deploying.md
@@ -21,7 +21,7 @@ In order to deploy and manage Pulsar Functions, you need to 
have a Pulsar cluste
 * You can run a [standalone cluster](getting-started-standalone.md) locally on 
your own machine
 * You can deploy a Pulsar cluster on [Kubernetes](deploy-kubernetes.md), 
[Amazon Web Services](deploy-aws.md), [bare metal](deploy-bare-metal.md), 
[DC/OS](deploy-dcos.md), and more
 
-If you're running a non-{% popover standalone %} cluster, you'll need to 
obtain the service URL for the cluster. How you obtain the service URL will 
depend on how you deployed your Pulsar cluster.
+If you're running a non-[standalone](reference-terminology.md#standalone) 
cluster, you'll need to obtain the service URL for the cluster. How you obtain 
the service URL will depend on how you deployed your Pulsar cluster.
 
 ## Command-line interface
 
@@ -76,7 +76,7 @@ $ bin/pulsar-admin functions localrun \
   --output persistent://public/default/output-1
 ```
 
-By default, the function will connect to a Pulsar cluster running on the same 
machine, via a local {% popover broker %} service URL of 
`pulsar://localhost:6650`. If you'd like to use local run mode to run a 
function but connect it to a non-local Pulsar cluster, you can specify a 
different broker URL using the `--brokerServiceUrl` flag. Here's an example:
+By default, the function will connect to a Pulsar cluster running on the same 
machine, via a local [broker](reference-terminology.md#broker) service URL of 
`pulsar://localhost:6650`. If you'd like to use local run mode to run a 
function but connect it to a non-local Pulsar cluster, you can specify a 
different broker URL using the `--brokerServiceUrl` flag. Here's an example:
 
 ```bash
 $ bin/pulsar-admin functions localrun \
@@ -230,7 +230,7 @@ This function has been triggered with a value of hello world
 
 Pulsar supports three different [subscription 
types](getting-started-concepts-and-architecture.md#subscription-modes) (or 
subscription modes) for Pulsar clients:
 
-* With [exclusive](getting-started-concepts-and-architecture.md#exclusive) 
subscriptions, only a single {% popover consumer %} is allowed to attach to the 
subscription.
+* With [exclusive](getting-started-concepts-and-architecture.md#exclusive) 
subscriptions, only a single [consumer](reference-terminology.md#consumer) is 
allowed to attach to the subscription.
 * With [shared](getting-started-concepts-and-architecture.md#shared) . Please 
note that strict message ordering is *not* guaranteed with shared subscriptions.
 * With [failover](getting-started-concepts-and-architecture.md#failover) 
subscriptions
 
diff --git a/site2/docs/functions-overview.md b/site2/docs/functions-overview.md
index d7c2b505ad..da2591dba4 100644
--- a/site2/docs/functions-overview.md
+++ b/site2/docs/functions-overview.md
@@ -54,7 +54,7 @@ Pulsar Functions could be described as
 
 The core programming model behind Pulsar Functions is very simple:
 
-* Functions receive messages from one or more **input {% popover topics %}**. 
Every time a message is received, the function can do a variety of things:
+* Functions receive messages from one or more **input 
[topics](reference-teminology.md#topic)**. Every time a message is received, 
the function can do a variety of things:
   * Apply some processing logic to the input and write output to:
     * An **output topic** in Pulsar
     * [Apache BookKeeper](#state-storage)
@@ -268,7 +268,7 @@ The Pulsar Functions feature was built to support a variety 
of deployment option
 Deployment mode | Description
 :---------------|:-----------
 [Local run mode](#local-run) | The function runs in your local environment, 
for example on your laptop
-[Cluster mode](#cluster-run) | The function runs *inside of* your Pulsar 
cluster, on the same machines as your Pulsar popover brokers
+[Cluster mode](#cluster-run) | The function runs *inside of* your Pulsar 
cluster, on the same machines as your Pulsar 
[brokers](reference-terminology.md#broker)
 
 ### Local run mode
 
diff --git a/site2/docs/functions-quickstart.md 
b/site2/docs/functions-quickstart.md
index e8a9c4ddb0..d50ae9c417 100644
--- a/site2/docs/functions-quickstart.md
+++ b/site2/docs/functions-quickstart.md
@@ -4,7 +4,7 @@ title: Getting started with Pulsar Functions
 sidebar_label: Getting started
 ---
 
-This tutorial will walk you through running a {% popover standalone %} Pulsar 
{% popover cluster %} on your machine and then running your first Pulsar 
Functions using that cluster. The first function will run in local run mode 
(outside your Pulsar {% popover cluster %}), while the second will run in 
cluster mode (inside your cluster).
+This tutorial will walk you through running a 
[standalone](reference-teminology.md#standalone) Pulsar 
[cluster](reference-teminology.md#cluster) on your machine and then running 
your first Pulsar Functions using that cluster. The first function will run in 
local run mode (outside your Pulsar 
[cluster](reference-teminology.md#cluster)), while the second will run in 
cluster mode (inside your cluster).
 
 > In local run mode, your Pulsar Function will communicate with your Pulsar 
 > cluster but will run outside of the cluster.
 
@@ -14,7 +14,7 @@ In order to follow along with this tutorial, you'll need to 
have [Maven](https:/
 
 ## Run a standalone Pulsar cluster
 
-In order to run our Pulsar Functions, we'll need to run a Pulsar cluster 
locally first. The easiest way to do that is to run Pulsar in {% popover 
standalone %} mode. Follow these steps to start up a standalone cluster:
+In order to run our Pulsar Functions, we'll need to run a Pulsar cluster 
locally first. The easiest way to do that is to run Pulsar in 
[standalone](reference-teminology.md#standalone) mode. Follow these steps to 
start up a standalone cluster:
 
 ```bash
 $ wget 
https://repository.apache.org/content/repositories/snapshots/org/apache/pulsar/distribution/2.0.0-incubating-SNAPSHOT/distribution-2.0.0-incubating-{{
 site.preview_version_id }}-bin.tar.gz
diff --git a/site2/docs/getting-started-concepts-and-architecture.md 
b/site2/docs/getting-started-concepts-and-architecture.md
index 14eb69f16d..ec99f27c32 100644
--- a/site2/docs/getting-started-concepts-and-architecture.md
+++ b/site2/docs/getting-started-concepts-and-architecture.md
@@ -40,7 +40,7 @@ Once a subscription has been created, all messages will be 
[retained](#persisten
 
 ### Producers
 
-A producer is a process that attaches to a topic and publishes messages to a 
Pulsar {% popover broker %} for processing.
+A producer is a process that attaches to a topic and publishes messages to a 
Pulsar [broker](reference-terminology.md#broker) for processing.
 
 #### Send modes
 
@@ -68,7 +68,7 @@ A consumer is a process that attaches to a topic via a 
subscription and then rec
 
 #### Receive modes
 
-Messages can be received from {% popover brokers %} either synchronously 
(sync) or asynchronously (async).
+Messages can be received from [brokers](reference-terminology.md#broker) 
either synchronously (sync) or asynchronously (async).
 
 | Mode          | Description                                                  
                                                                                
                                                                 |
 
|:--------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
@@ -90,7 +90,7 @@ Client libraries can provide their own listener 
implementations for consumers. T
 
 ### Topics
 
-As in other pub-sub systems, topics in Pulsar are named channels for 
transmitting messages from {% popover producers %} to {% popover consumers %}. 
Topic names are URLs that have a well-defined structure:
+As in other pub-sub systems, topics in Pulsar are named channels for 
transmitting messages from [producers](reference-terminology.md#producer) to 
[consumers](reference-terminology.md#consumer). Topic names are URLs that have 
a well-defined structure:
 
 ```http
 {persistent|non-persistent}://tenant/namespace/topic
@@ -334,7 +334,7 @@ Pulsar uses a system called [Apache 
BookKeeper](http://bookkeeper.apache.org/) f
 * It's horizontally scalable in both capacity and throughput. Capacity can be 
immediately increased by adding more bookies to a cluster.
 * Bookies are designed to handle thousands of ledgers with concurrent reads 
and writes. By using multiple disk devices---one for journal and another for 
general storage--bookies are able to isolate the effects of read operations 
from the latency of ongoing write operations.
 
-In addition to message data, *cursors* are also persistently stored in 
BookKeeper. Cursors are {% popover subscription %} positions for {% popover 
consumers %}. BookKeeper enables Pulsar to store consumer position in a 
scalable fashion.
+In addition to message data, *cursors* are also persistently stored in 
BookKeeper. Cursors are [subscription](reference-terminology.md#subscription) 
positions for [consumers](reference-terminology.md#consumer). BookKeeper 
enables Pulsar to store consumer position in a scalable fashion.
 
 At the moment, Pulsar only supports persistent message storage. This accounts 
for the `persistent` in all topic names. Here's an example:
 
@@ -419,7 +419,7 @@ In the second scenario at the bottom, the producer 
publishes message 1, which is
 
 ### Producer idempotency
 
-The other available approach to message deduplication is to ensure that each 
message is *only produced once*. This approach is typically called **producer 
idempotency**. The drawback of this approach is that it defers the work of 
message deduplication to the application. In Pulsar, this is handled at the {% 
popover broker %} level, which means that you don't need to modify your Pulsar 
client code. Instead, you only need to make administrative changes (see the 
[Managing message deduplication](cookbooks-deduplication.md) cookbook for a 
guide).
+The other available approach to message deduplication is to ensure that each 
message is *only produced once*. This approach is typically called **producer 
idempotency**. The drawback of this approach is that it defers the work of 
message deduplication to the application. In Pulsar, this is handled at the 
[broker](reference-terminology.md#broker) level, which means that you don't 
need to modify your Pulsar client code. Instead, you only need to make 
administrative changes (see the [Managing message 
deduplication](cookbooks-deduplication.md) cookbook for a guide).
 
 ### Deduplication and effectively-once semantics
 
@@ -445,7 +445,7 @@ As you can see, the tenant is the most basic unit of 
categorization for topics (
 To each tenant in a Pulsar instance you can assign:
 
 * An [authorization](security-authorization.md) scheme
-* The set of {% popover clusters %} to which the tenant's configuration applies
+* The set of [clusters](reference-terminology.md#cluster) to which the 
tenant's configuration applies
 
 ### Namespaces
 
@@ -533,7 +533,7 @@ client = Client('pulsar://pulsar-cluster.acme.com:6650')
 
 ## Reader interface
 
-In Pulsar, the "standard" [consumer interface](#consumers) involves using 
consumers to listen on {% popover topics %}, process incoming messages, and 
finally acknowledge those messages when they've been processed. Whenever a 
consumer connects to a topic, it automatically begins reading from the earliest 
un-acked message onward because the topic's cursor is automatically managed by 
Pulsar.
+In Pulsar, the "standard" [consumer interface](#consumers) involves using 
consumers to listen on [topics](reference-terminology.md#topic), process 
incoming messages, and finally acknowledge those messages when they've been 
processed. Whenever a consumer connects to a topic, it automatically begins 
reading from the earliest un-acked message onward because the topic's cursor is 
automatically managed by Pulsar.
 
 The **reader interface** for Pulsar enables applications to manually manage 
cursors. When you use a reader to connect to a topic---rather than a 
consumer---you need to specify *which* message the reader begins reading from 
when it connects to a topic. When connecting to a topic, the reader interface 
enables you to begin with:
 
@@ -613,7 +613,7 @@ When topic compaction is triggered [via the 
CLI](cookbooks-compaction.md), Pulsa
 
 After that, the broker will create a new [BookKeeper ledger](#ledgers) and 
make a second iteration through each message on the topic. For each message, if 
the key matches the latest occurrence of that key, then the key's data payload, 
message ID, and metadata will be written to the newly created ledger. If the 
key doesn't match the latest then the message will be skipped and left alone. 
If any given message has an empty payload, it will be skipped and considered 
deleted (akin to the concept of 
[tombstones](https://en.wikipedia.org/wiki/Tombstone_(data_store)) in key-value 
databases). At the end of this second iteration through the topic, the newly 
created BookKeeper ledger is closed and two things are written to the topic's 
metadata: the ID of the BookKeeper ledger and the message ID of the last 
compacted message (this is known as the **compaction horizon** of the topic). 
Once this metadata is written compaction is complete.
 
-After the initial compaction operation, the Pulsar {% popover broker %} that 
owns the topic is notified whenever any future changes are made to the 
compaction horizon and compacted backlog. When such changes occur:
+After the initial compaction operation, the Pulsar 
[broker](reference-terminology.md#broker) that owns the topic is notified 
whenever any future changes are made to the compaction horizon and compacted 
backlog. When such changes occur:
 
 * Clients (consumers and readers) that have read compacted enabled will 
attempt to read messages from a topic and either:
   * Read from the topic like normal (if the message ID is greater than or 
equal to the compaction horizon) or
diff --git a/site2/docs/reference-terminology.md 
b/site2/docs/reference-terminology.md
new file mode 100644
index 0000000000..d236b36aa6
--- /dev/null
+++ b/site2/docs/reference-terminology.md
@@ -0,0 +1,161 @@
+---
+id: reference-terminology
+title: Pulsar Terminology
+sidebar_label: Terminology
+---
+
+Here is a glossary of terms related to Apache Pulsar:
+
+### Concepts
+
+#### Pulsar
+
+Pulsar is a distributed messaging system originally created by Yahoo but now 
under the stewardship of the Apache Software Foundation.
+
+#### Message
+
+Messages are the basic unit of Pulsar. They're what [producers](#producer) 
publish to [topics](#topic)
+and what [consumers](#consumer) then consume from topics.
+
+#### Topic
+
+A named channel used to pass messages published by [producers](#producer) to 
[consumers](#consumer) who
+process those [messages](#message).
+
+#### Partitioned Topic
+
+A topic that is served by multiple Pulsar [brokers](#broker), which enables 
higher throughput.
+
+#### Namespace
+
+A grouping mechanism for related [topics](#topic).
+
+#### Namespace Bundle
+
+A virtual group of [topics](#topic) that belong to the same 
[namespace](#namespace). A namespace bundle
+is defined as a range between two 32-bit hashes, such as 0x00000000 and 
0xffffffff.
+
+#### Tenant
+
+An administrative unit for allocating capacity and enforcing an 
authentication/authorization scheme.
+
+#### Subscription
+
+A lease on a [topic](#topic) established by a group of [consumers](#consumer). 
Pulsar has three subscription
+modes (exclusive, shared, and failover).
+
+#### Pub-Sub
+
+A messaging pattern in which [producer](#producer) proccesses publish messages 
on [topics](#topic) that
+are then consumed (processed) by [consumer](#consumer) processes.
+
+#### Producer
+
+A process that publishes [messages](#message) to a Pulsar [topic](#topic).
+
+#### Consumer
+
+A process that establishes a subscription to a Pulsar [topic](#topic) and 
processes messages published
+to that topic by [producers](#producer).
+
+#### Reader
+
+Pulsar readers are message processors much like Pulsar [consumers](#consumer) 
but with two crucial differences:
+
+- you can specify *where* on a topic readers begin processing messages 
(consumers always begin with the latest
+  available unacked message);
+- readers don't retain data or acknowledge messages.
+
+#### Cursor
+
+The subscription position for a [consumer](#consumer).
+
+#### Acknowledgment (ack)
+
+A message sent to a Pulsar broker by a [consumer](#consumer) that a message 
has been successfully processed.
+An acknowledgement (ack) is Pulsar's way of knowing that the message can be 
deleted from the system;
+if no acknowledgement, then the message will be retained until it's processed.
+
+#### Unacknowledged
+
+A message that has been delivered to a consumer for processing but not yet 
confirmed as processed by the consumer.
+
+#### Retention Policy
+
+Size and/or time limits that you can set on a [namespace](#namespace) to 
configure retention of [messages](#message)
+that have already been [acknowledged](#acknowledgement-ack).
+
+#### Multi-Tenancy
+
+The ability to isolate [namespaces](#namespace), specify quotas, and configure 
authentication and authorization
+on a per-[tenant](#tenant) basis.
+
+### Architecture
+
+#### Standalone
+
+A lightweight Pulsar broker in which all components run in a single Java 
Virtual Machine (JVM) process. Standalone
+clusters can be run on a single machine and are useful for development 
purposes.
+
+#### Cluster
+
+A set of Pulsar [brokers](#broker) and [BookKeeper](#bookkeeper) servers (aka 
[bookies](#bookie)).
+Clusters can reside in different geographical regions and replicate messages 
to one another
+in a process called [geo-replication](#geo-replication).
+
+#### Instance
+
+A group of Pulsar [clusters](#cluster) that act together as a single unit.
+
+#### Geo-Replication
+
+Replication of messages across Pulsar [clusters](#cluster), potentially in 
different datacenters
+or geographical regions.
+
+#### Configuration Store
+
+Pulsar's configuration store (previously known as global ZooKeeper) is a 
ZooKeeper quorum that
+is used for configuration-specific tasks. A multi-cluster Pulsar installation 
requires just one
+configuration store across all [clusters](#cluster).
+
+#### Topic Lookup
+
+A service provided by Pulsar [brokers](#broker) that enables connecting 
clients to automatically determine
+which Pulsar [cluster](#cluster) is responsible for a [topic](#topic) (and 
thus where message traffic for
+the topic needs to be routed).
+
+#### Service Discovery
+
+A mechanism provided by Pulsar that enables connecting clients to use just a 
single URL to interact
+with all the [brokers](#broker) in a [cluster](#cluster).
+
+#### Broker
+
+A stateless component of Pulsar [clusters](#cluster) that runs two other 
components: an HTTP server
+exposing a REST interface for administration and topic lookup and a 
[dispatcher](#dispatcher) that
+handles all message transfers. Pulsar clusters typically consist of multiple 
brokers.
+
+#### Dispatcher
+
+An asynchronous TCP server used for all data transfers in-and-out a Pulsar 
[broker](#broker). The Pulsar
+dispatcher uses a custom binary protocol for all communications.
+
+### Storage
+
+#### BookKeeper
+
+[Apache BookKeeper](http://bookkeeper.apache.org/) is a scalable, low-latency 
persistent log storage
+service that Pulsar uses to store data.
+
+#### Bookie
+
+Bookie is the name of an individual BookKeeper server. It is effectively the 
storage server of Pulsar.
+
+#### Ledger
+
+An append-only data structure in [BookKeeper](#bookkeeper) that is used to 
persistently store messages in Pulsar [topics](#topic).
+
+### Functions
+
+Pulsar Functions are lightweight functions that can consume messages from 
Pulsar topics, apply custom processing logic, and, if desired, publish results 
to topics.
+
diff --git a/site2/docs/security-athenz.md b/site2/docs/security-athenz.md
index 27b84a31f7..3b881b2948 100644
--- a/site2/docs/security-athenz.md
+++ b/site2/docs/security-athenz.md
@@ -10,17 +10,17 @@ sidebar_label: Authentication using Athenz
 
 In a [decentralized Athenz 
system](https://github.com/yahoo/athenz/blob/master/docs/dev_decentralized_access.md)
 there is both an [authori**Z**ation **M**anagement 
**S**ystem](https://github.com/yahoo/athenz/blob/master/docs/setup_zms.md) 
(ZMS) server and an  [authori**Z**ation **T**oken 
**S**ystem](https://github.com/yahoo/athenz/blob/master/docs/setup_zts.md) 
(ZTS) server.
 
-To begin, you need to set up Athenz service access control. You should create 
domains for the *provider* (which provides some resources to other services 
with some authentication/authorization policies) and the *tenant* (which is 
provisioned to access some resources in a provider). In this case, the provider 
corresponds to the Pulsar service itself and the tenant corresponds to each 
application using Pulsar (typically, a {% popover property %} in Pulsar).
+To begin, you need to set up Athenz service access control. You should create 
domains for the *provider* (which provides some resources to other services 
with some authentication/authorization policies) and the *tenant* (which is 
provisioned to access some resources in a provider). In this case, the provider 
corresponds to the Pulsar service itself and the tenant corresponds to each 
application using Pulsar (typically, a 
[tenant](reference-terminology.md#tenant) in Pulsar).
 
 ### Create the tenant domain and service
 
-On the {% popover tenant %} side, you need to:
+On the [tenant](reference-terminology.md#tenant) side, you need to:
 
 1. Create a domain, such as `shopping`
 2. Generate a private/public key pair
 3. Create a service, such as `some_app`, on the domain with the public key
 
-Note that the private key generated in step 2 needs to be specified when the 
Pulsar client connects to the {% popover broker %} (see client configuration 
examples for [Java](client-libraries-java.md#tls-authentication) and 
[C++](client-libraries-cpp.md#tls-authentication)).
+Note that the private key generated in step 2 needs to be specified when the 
Pulsar client connects to the [broker](reference-terminology.md#broker) (see 
client configuration examples for 
[Java](client-libraries-java.md#tls-authentication) and 
[C++](client-libraries-cpp.md#tls-authentication)).
 
 For more specific steps involving the Athenz UI, please refer to [this 
doc](https://github.com/yahoo/athenz/blob/master/docs/example_service_athenz_setup.md#client-tenant-domain).
 
diff --git a/site2/docs/security-authorization.md 
b/site2/docs/security-authorization.md
index 8fa50a912f..433f35051f 100644
--- a/site2/docs/security-authorization.md
+++ b/site2/docs/security-authorization.md
@@ -7,7 +7,7 @@ sidebar_label: Authorization and ACLs
 In Pulsar, the [authentication 
provider](security-overview.md#authentication-providers) is charged with 
properly identifying clients and
 associating them with [role tokens](security-overview.md#role-tokens). 
*Authorization* is the process that determines *what* clients are able to do.
 
-Authorization in Pulsar is managed at the {% popover tenant %} level, which 
means that you can have multiple authorization schemes active
+Authorization in Pulsar is managed at the 
[tenant](reference-terminology.md#tenant) level, which means that you can have 
multiple authorization schemes active
 in a single Pulsar instance. You could, for example, create a `shopping` 
tenant that has one set of [roles](security-overview.md#role-tokens)
 and applies to a shopping application used by your company, while an 
`inventory` tenant would be used only by an inventory application.
 
@@ -16,7 +16,7 @@ and applies to a shopping application used by your company, 
while an `inventory`
 
 ## Creating a new tenant
 
-A Pulsar {% popover tenant %} is typically provisioned by Pulsar {% popover 
instance %} administrators or by some kind of self-service portal.
+A Pulsar [tenant](reference-terminology.md#tenant) is typically provisioned by 
Pulsar [instance](reference-terminology.md#instance) administrators or by some 
kind of self-service portal.
 
 Tenants are managed using the [`pulsar-admin`](reference-pulsar-admin.md) 
tool. Here's an example tenant creation command:
 
diff --git a/site2/docs/security-tls.md b/site2/docs/security-tls.md
index fb197f63ec..190b5c8f06 100644
--- a/site2/docs/security-tls.md
+++ b/site2/docs/security-tls.md
@@ -88,7 +88,7 @@ For the client common name, you need to use a string that you 
intend to use as t
 
 ## Configure the broker for TLS
 
-To configure a Pulsar {% popover broker %} to use TLS authentication, you'll 
need to make some changes to the `broker.conf` configuration file, which is 
located in the `conf` directory of your [Pulsar 
installation](getting-started-standalone.md).
+To configure a Pulsar [broker](reference-terminology.md#broker) to use TLS 
authentication, you'll need to make some changes to the `broker.conf` 
configuration file, which is located in the `conf` directory of your [Pulsar 
installation](getting-started-standalone.md).
 
 Add these values to the configuration file (substituting the appropriate 
certificate paths where necessary):
 
@@ -110,7 +110,7 @@ 
authenticationProviders=org.apache.pulsar.broker.authentication.AuthenticationPr
 
 ## Configure the discovery service
 
-The {% popover discovery %} service used by Pulsar brokers needs to redirect 
all HTTPS requests, which means that it needs to be trusted by the client as 
well. Add this configuration in `conf/discovery.conf` in your Pulsar 
installation:
+The [discovery service](reference-terminology.md#service-discovery) used by 
Pulsar brokers needs to redirect all HTTPS requests, which means that it needs 
to be trusted by the client as well. Add this configuration in 
`conf/discovery.conf` in your Pulsar installation:
 
 ```properties
 tlsEnabled=true
diff --git a/site2/website/sidebars.json b/site2/website/sidebars.json
index 0dffa73388..660df1c523 100644
--- a/site2/website/sidebars.json
+++ b/site2/website/sidebars.json
@@ -83,6 +83,7 @@
       "develop-cpp"
     ],
     "Reference": [
+      "reference-terminology",
       "reference-rest-api",
       "reference-cli-tools",
       "pulsar-admin",


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to