diff --git a/bin/rebuild-docs-out.sh b/bin/rebuild-docs-out.sh index b43a289..b630889 100755 --- a/bin/rebuild-docs-out.sh +++ b/bin/rebuild-docs-out.sh @@ -2,7 +2,7 @@ BIN_DIR=`dirname $0` PROJECT_HOME=$BIN_DIR/.. -OUT_DIR="$PROJECT_HOME/out" +OUT_DIR="$PROJECT_HOME/preview/contents" DITAMAP="$PROJECT_HOME/ja/learn/admin/Couchbase.ditamap" [ -f $BIN_DIR/env.sh ] && . $BIN_DIR/env.sh @@ -23,5 +23,12 @@ then fi echo "generating contents using $DITAMAP..." -dita -f html5 -i $DITAMAP -o $OUT_DIR +dita -f com.couchbase.docs.html -i $DITAMAP -o $OUT_DIR +if [ ! -e $OUT_DIR/assets ] +then + # Work around for missing assets link from some pages. + echo "Creating assets symlink..." + cd $PROJECT_HOME/preview + ln -s contents/assets assets +fi diff --git a/index.html b/index.html index 78ae488..da9f87d 100644 --- a/index.html +++ b/index.html @@ -2,11 +2,11 @@ SYSTEM "about:legacy-compat"> - The Tudors - + Couchbase Server ドキュメント(プレビュー) + -

This page has moved to a +

This page has moved to a preview.

diff --git a/preview/assets/fonts/kievitot-bold.eot b/preview/assets/fonts/kievitot-bold.eot new file mode 100644 index 0000000..6a17c7f Binary files /dev/null and b/preview/assets/fonts/kievitot-bold.eot differ diff --git a/preview/assets/fonts/kievitot-bold.woff b/preview/assets/fonts/kievitot-bold.woff new file mode 100644 index 0000000..0c0a673 Binary files /dev/null and b/preview/assets/fonts/kievitot-bold.woff differ diff --git a/preview/assets/fonts/kievitot-bolditalic.eot b/preview/assets/fonts/kievitot-bolditalic.eot new file mode 100644 index 0000000..9c787cf Binary files /dev/null and b/preview/assets/fonts/kievitot-bolditalic.eot differ diff --git a/preview/assets/fonts/kievitot-bolditalic.woff b/preview/assets/fonts/kievitot-bolditalic.woff new file mode 100644 index 0000000..ace6ea0 Binary files /dev/null and b/preview/assets/fonts/kievitot-bolditalic.woff differ diff --git a/preview/assets/fonts/kievitot-italic.eot b/preview/assets/fonts/kievitot-italic.eot new file mode 100644 index 0000000..2f562f5 Binary files /dev/null and b/preview/assets/fonts/kievitot-italic.eot differ diff --git a/preview/assets/fonts/kievitot-italic.woff b/preview/assets/fonts/kievitot-italic.woff new file mode 100644 index 0000000..a948a2c Binary files /dev/null and b/preview/assets/fonts/kievitot-italic.woff differ diff --git a/preview/assets/fonts/kievitot-regular.eot b/preview/assets/fonts/kievitot-regular.eot new file mode 100644 index 0000000..ff3e024 Binary files /dev/null and b/preview/assets/fonts/kievitot-regular.eot differ diff --git a/preview/assets/fonts/kievitot-regular.woff b/preview/assets/fonts/kievitot-regular.woff new file mode 100644 index 0000000..d58f8a9 Binary files /dev/null and b/preview/assets/fonts/kievitot-regular.woff differ diff --git a/preview/assets/images/figures/why-nosql-2.png b/preview/assets/images/figures/why-nosql-2.png new file mode 100644 index 0000000..db9bd87 Binary files /dev/null and b/preview/assets/images/figures/why-nosql-2.png differ diff --git a/preview/assets/images/figures/why-nosql-3.png b/preview/assets/images/figures/why-nosql-3.png new file mode 100644 index 0000000..668fbfa Binary files /dev/null and b/preview/assets/images/figures/why-nosql-3.png differ diff --git a/preview/assets/images/figures/why-nosql-4.png b/preview/assets/images/figures/why-nosql-4.png new file mode 100644 index 0000000..8d97af8 Binary files /dev/null and b/preview/assets/images/figures/why-nosql-4.png differ diff --git a/preview/assets/images/figures/why-nosql-5.png b/preview/assets/images/figures/why-nosql-5.png new file mode 100644 index 0000000..159108d Binary files /dev/null and b/preview/assets/images/figures/why-nosql-5.png differ diff --git a/preview/assets/images/icons/article-arrow.png b/preview/assets/images/icons/article-arrow.png new file mode 100644 index 0000000..6917e0e Binary files /dev/null and b/preview/assets/images/icons/article-arrow.png differ diff --git a/preview/assets/images/icons/carousel-next.png b/preview/assets/images/icons/carousel-next.png new file mode 100644 index 0000000..ce931c7 Binary files /dev/null and b/preview/assets/images/icons/carousel-next.png differ diff --git a/preview/assets/images/icons/carousel-previous.png b/preview/assets/images/icons/carousel-previous.png new file mode 100644 index 0000000..c642e15 Binary files /dev/null and b/preview/assets/images/icons/carousel-previous.png differ diff --git a/preview/assets/images/icons/close.png b/preview/assets/images/icons/close.png new file mode 100644 index 0000000..d386d2f Binary files /dev/null and b/preview/assets/images/icons/close.png differ diff --git a/preview/assets/images/icons/contact-avatar.png b/preview/assets/images/icons/contact-avatar.png new file mode 100644 index 0000000..ea44c58 Binary files /dev/null and b/preview/assets/images/icons/contact-avatar.png differ diff --git a/preview/assets/images/icons/developer-portal-mobile.png b/preview/assets/images/icons/developer-portal-mobile.png new file mode 100644 index 0000000..77ad871 Binary files /dev/null and b/preview/assets/images/icons/developer-portal-mobile.png differ diff --git a/preview/assets/images/icons/developer-portal-projects.png b/preview/assets/images/icons/developer-portal-projects.png new file mode 100644 index 0000000..e1c0b1c Binary files /dev/null and b/preview/assets/images/icons/developer-portal-projects.png differ diff --git a/preview/assets/images/icons/developer-portal-server.png b/preview/assets/images/icons/developer-portal-server.png new file mode 100644 index 0000000..584725a Binary files /dev/null and b/preview/assets/images/icons/developer-portal-server.png differ diff --git a/preview/assets/images/icons/developer-portal-sidebar-navigation--active.png b/preview/assets/images/icons/developer-portal-sidebar-navigation--active.png new file mode 100644 index 0000000..a61487e Binary files /dev/null and b/preview/assets/images/icons/developer-portal-sidebar-navigation--active.png differ diff --git a/preview/assets/images/icons/developer-portal-sidebar-navigation-toggler.png b/preview/assets/images/icons/developer-portal-sidebar-navigation-toggler.png new file mode 100644 index 0000000..e10651b Binary files /dev/null and b/preview/assets/images/icons/developer-portal-sidebar-navigation-toggler.png differ diff --git a/preview/assets/images/icons/developer-portal-sidebar-navigation.png b/preview/assets/images/icons/developer-portal-sidebar-navigation.png new file mode 100644 index 0000000..49254fc Binary files /dev/null and b/preview/assets/images/icons/developer-portal-sidebar-navigation.png differ diff --git a/preview/assets/images/icons/developer-portal-sidebar-versions-toggler--active.png b/preview/assets/images/icons/developer-portal-sidebar-versions-toggler--active.png new file mode 100644 index 0000000..c18109a Binary files /dev/null and b/preview/assets/images/icons/developer-portal-sidebar-versions-toggler--active.png differ diff --git a/preview/assets/images/icons/developer-portal-sidebar-versions-toggler.png b/preview/assets/images/icons/developer-portal-sidebar-versions-toggler.png new file mode 100644 index 0000000..e44dde0 Binary files /dev/null and b/preview/assets/images/icons/developer-portal-sidebar-versions-toggler.png differ diff --git a/preview/assets/images/icons/download-next.png b/preview/assets/images/icons/download-next.png new file mode 100644 index 0000000..d0e64fa Binary files /dev/null and b/preview/assets/images/icons/download-next.png differ diff --git a/preview/assets/images/icons/download-previous.png b/preview/assets/images/icons/download-previous.png new file mode 100644 index 0000000..73c30b5 Binary files /dev/null and b/preview/assets/images/icons/download-previous.png differ diff --git a/preview/assets/images/icons/download.png b/preview/assets/images/icons/download.png new file mode 100644 index 0000000..d692c8e Binary files /dev/null and b/preview/assets/images/icons/download.png differ diff --git a/preview/assets/images/icons/event-date.png b/preview/assets/images/icons/event-date.png new file mode 100644 index 0000000..905bffe Binary files /dev/null and b/preview/assets/images/icons/event-date.png differ diff --git a/preview/assets/images/icons/event-location.png b/preview/assets/images/icons/event-location.png new file mode 100644 index 0000000..f4b8bd0 Binary files /dev/null and b/preview/assets/images/icons/event-location.png differ diff --git a/preview/assets/images/icons/event.png b/preview/assets/images/icons/event.png new file mode 100644 index 0000000..1b98bbc Binary files /dev/null and b/preview/assets/images/icons/event.png differ diff --git a/preview/assets/images/icons/header-backlink.png b/preview/assets/images/icons/header-backlink.png new file mode 100644 index 0000000..49268af Binary files /dev/null and b/preview/assets/images/icons/header-backlink.png differ diff --git a/preview/assets/images/icons/homepage-products-availability.png b/preview/assets/images/icons/homepage-products-availability.png new file mode 100644 index 0000000..203ee33 Binary files /dev/null and b/preview/assets/images/icons/homepage-products-availability.png differ diff --git a/preview/assets/images/icons/homepage-products-mobility.png b/preview/assets/images/icons/homepage-products-mobility.png new file mode 100644 index 0000000..cc4109c Binary files /dev/null and b/preview/assets/images/icons/homepage-products-mobility.png differ diff --git a/preview/assets/images/icons/homepage-products-performance.png b/preview/assets/images/icons/homepage-products-performance.png new file mode 100644 index 0000000..889faa4 Binary files /dev/null and b/preview/assets/images/icons/homepage-products-performance.png differ diff --git a/preview/assets/images/icons/homepage-products-scalability.png b/preview/assets/images/icons/homepage-products-scalability.png new file mode 100644 index 0000000..e5d0977 Binary files /dev/null and b/preview/assets/images/icons/homepage-products-scalability.png differ diff --git a/preview/assets/images/icons/learn-blog.png b/preview/assets/images/icons/learn-blog.png new file mode 100644 index 0000000..f3bd3e6 Binary files /dev/null and b/preview/assets/images/icons/learn-blog.png differ diff --git a/preview/assets/images/icons/learn-events.png b/preview/assets/images/icons/learn-events.png new file mode 100644 index 0000000..a7c0bbf Binary files /dev/null and b/preview/assets/images/icons/learn-events.png differ diff --git a/preview/assets/images/icons/learn-presentations.png b/preview/assets/images/icons/learn-presentations.png new file mode 100644 index 0000000..900d0d7 Binary files /dev/null and b/preview/assets/images/icons/learn-presentations.png differ diff --git a/preview/assets/images/icons/learn-training.png b/preview/assets/images/icons/learn-training.png new file mode 100644 index 0000000..9d94cb9 Binary files /dev/null and b/preview/assets/images/icons/learn-training.png differ diff --git a/preview/assets/images/icons/learn-webinars.png b/preview/assets/images/icons/learn-webinars.png new file mode 100644 index 0000000..2447649 Binary files /dev/null and b/preview/assets/images/icons/learn-webinars.png differ diff --git a/preview/assets/images/icons/learn-whitepapers.png b/preview/assets/images/icons/learn-whitepapers.png new file mode 100644 index 0000000..b5610c6 Binary files /dev/null and b/preview/assets/images/icons/learn-whitepapers.png differ diff --git a/preview/assets/images/icons/nav-arrow--active.png b/preview/assets/images/icons/nav-arrow--active.png new file mode 100644 index 0000000..cc0960f Binary files /dev/null and b/preview/assets/images/icons/nav-arrow--active.png differ diff --git a/preview/assets/images/icons/nav-arrow.png b/preview/assets/images/icons/nav-arrow.png new file mode 100644 index 0000000..5151f71 Binary files /dev/null and b/preview/assets/images/icons/nav-arrow.png differ diff --git a/preview/assets/images/icons/open.png b/preview/assets/images/icons/open.png new file mode 100644 index 0000000..7b64f26 Binary files /dev/null and b/preview/assets/images/icons/open.png differ diff --git a/preview/assets/images/icons/pagination-next.png b/preview/assets/images/icons/pagination-next.png new file mode 100644 index 0000000..f4746d9 Binary files /dev/null and b/preview/assets/images/icons/pagination-next.png differ diff --git a/preview/assets/images/icons/pagination-previous.png b/preview/assets/images/icons/pagination-previous.png new file mode 100644 index 0000000..f6690e8 Binary files /dev/null and b/preview/assets/images/icons/pagination-previous.png differ diff --git a/preview/assets/images/icons/play.png b/preview/assets/images/icons/play.png new file mode 100644 index 0000000..52372d3 Binary files /dev/null and b/preview/assets/images/icons/play.png differ diff --git a/preview/assets/images/icons/press-release.png b/preview/assets/images/icons/press-release.png new file mode 100644 index 0000000..c8a2e6c Binary files /dev/null and b/preview/assets/images/icons/press-release.png differ diff --git a/preview/assets/images/icons/pricing-expertise.png b/preview/assets/images/icons/pricing-expertise.png new file mode 100644 index 0000000..0aa68e4 Binary files /dev/null and b/preview/assets/images/icons/pricing-expertise.png differ diff --git a/preview/assets/images/icons/pricing-options.png b/preview/assets/images/icons/pricing-options.png new file mode 100644 index 0000000..9cf3e6c Binary files /dev/null and b/preview/assets/images/icons/pricing-options.png differ diff --git a/preview/assets/images/icons/pricing-success.png b/preview/assets/images/icons/pricing-success.png new file mode 100644 index 0000000..9572060 Binary files /dev/null and b/preview/assets/images/icons/pricing-success.png differ diff --git a/preview/assets/images/icons/pricing-support.png b/preview/assets/images/icons/pricing-support.png new file mode 100644 index 0000000..b0a86f7 Binary files /dev/null and b/preview/assets/images/icons/pricing-support.png differ diff --git a/preview/assets/images/icons/pricing-updates.png b/preview/assets/images/icons/pricing-updates.png new file mode 100644 index 0000000..9599ec8 Binary files /dev/null and b/preview/assets/images/icons/pricing-updates.png differ diff --git a/preview/assets/images/icons/quote.png b/preview/assets/images/icons/quote.png new file mode 100644 index 0000000..b63e80f Binary files /dev/null and b/preview/assets/images/icons/quote.png differ diff --git a/preview/assets/images/icons/related-content--close.png b/preview/assets/images/icons/related-content--close.png new file mode 100644 index 0000000..66ebed8 Binary files /dev/null and b/preview/assets/images/icons/related-content--close.png differ diff --git a/preview/assets/images/icons/related-content--grid.png b/preview/assets/images/icons/related-content--grid.png new file mode 100644 index 0000000..5657a54 Binary files /dev/null and b/preview/assets/images/icons/related-content--grid.png differ diff --git a/preview/assets/images/icons/sales-office-marker.png b/preview/assets/images/icons/sales-office-marker.png new file mode 100644 index 0000000..f266259 Binary files /dev/null and b/preview/assets/images/icons/sales-office-marker.png differ diff --git a/preview/assets/images/icons/search-close.png b/preview/assets/images/icons/search-close.png new file mode 100644 index 0000000..dd61ec8 Binary files /dev/null and b/preview/assets/images/icons/search-close.png differ diff --git a/preview/assets/images/icons/search.png b/preview/assets/images/icons/search.png new file mode 100644 index 0000000..9595e0c Binary files /dev/null and b/preview/assets/images/icons/search.png differ diff --git a/preview/assets/images/icons/share-email.png b/preview/assets/images/icons/share-email.png new file mode 100644 index 0000000..c4af359 Binary files /dev/null and b/preview/assets/images/icons/share-email.png differ diff --git a/preview/assets/images/icons/share-facebook.png b/preview/assets/images/icons/share-facebook.png new file mode 100644 index 0000000..f0425ff Binary files /dev/null and b/preview/assets/images/icons/share-facebook.png differ diff --git a/preview/assets/images/icons/share-reddit.png b/preview/assets/images/icons/share-reddit.png new file mode 100644 index 0000000..495d34a Binary files /dev/null and b/preview/assets/images/icons/share-reddit.png differ diff --git a/preview/assets/images/icons/share-twitter.png b/preview/assets/images/icons/share-twitter.png new file mode 100644 index 0000000..d4c5600 Binary files /dev/null and b/preview/assets/images/icons/share-twitter.png differ diff --git a/preview/assets/images/icons/social-facebook.png b/preview/assets/images/icons/social-facebook.png new file mode 100644 index 0000000..eac0d8d Binary files /dev/null and b/preview/assets/images/icons/social-facebook.png differ diff --git a/preview/assets/images/icons/social-googleplus.png b/preview/assets/images/icons/social-googleplus.png new file mode 100644 index 0000000..2dc595f Binary files /dev/null and b/preview/assets/images/icons/social-googleplus.png differ diff --git a/preview/assets/images/icons/social-linkedin.png b/preview/assets/images/icons/social-linkedin.png new file mode 100644 index 0000000..e4e4952 Binary files /dev/null and b/preview/assets/images/icons/social-linkedin.png differ diff --git a/preview/assets/images/icons/social-twitter.png b/preview/assets/images/icons/social-twitter.png new file mode 100644 index 0000000..95c7b21 Binary files /dev/null and b/preview/assets/images/icons/social-twitter.png differ diff --git a/preview/assets/images/icons/stats-population.png b/preview/assets/images/icons/stats-population.png new file mode 100644 index 0000000..da5e5ca Binary files /dev/null and b/preview/assets/images/icons/stats-population.png differ diff --git a/preview/assets/images/icons/stats-time.png b/preview/assets/images/icons/stats-time.png new file mode 100644 index 0000000..957e11f Binary files /dev/null and b/preview/assets/images/icons/stats-time.png differ diff --git a/preview/assets/images/icons/stats-users.png b/preview/assets/images/icons/stats-users.png new file mode 100644 index 0000000..ddcda39 Binary files /dev/null and b/preview/assets/images/icons/stats-users.png differ diff --git a/preview/assets/images/icons/whitepaper.png b/preview/assets/images/icons/whitepaper.png new file mode 100644 index 0000000..a72e357 Binary files /dev/null and b/preview/assets/images/icons/whitepaper.png differ diff --git a/preview/assets/images/logo.png b/preview/assets/images/logo.png new file mode 100644 index 0000000..238d063 Binary files /dev/null and b/preview/assets/images/logo.png differ diff --git a/preview/assets/images/logo.svg b/preview/assets/images/logo.svg new file mode 100644 index 0000000..c9f16f2 --- /dev/null +++ b/preview/assets/images/logo.svg @@ -0,0 +1 @@ +logo \ No newline at end of file diff --git a/preview/assets/images/logos/android.png b/preview/assets/images/logos/android.png new file mode 100644 index 0000000..3ce2e99 Binary files /dev/null and b/preview/assets/images/logos/android.png differ diff --git a/preview/assets/images/logos/homepage-aol.png b/preview/assets/images/logos/homepage-aol.png new file mode 100644 index 0000000..035eda0 Binary files /dev/null and b/preview/assets/images/logos/homepage-aol.png differ diff --git a/preview/assets/images/logos/homepage-cisco.png b/preview/assets/images/logos/homepage-cisco.png new file mode 100644 index 0000000..8bea1a7 Binary files /dev/null and b/preview/assets/images/logos/homepage-cisco.png differ diff --git a/preview/assets/images/logos/homepage-docomo.png b/preview/assets/images/logos/homepage-docomo.png new file mode 100644 index 0000000..82de6ac Binary files /dev/null and b/preview/assets/images/logos/homepage-docomo.png differ diff --git a/preview/assets/images/logos/homepage-ebay.png b/preview/assets/images/logos/homepage-ebay.png new file mode 100644 index 0000000..c7088c4 Binary files /dev/null and b/preview/assets/images/logos/homepage-ebay.png differ diff --git a/preview/assets/images/logos/homepage-intel.png b/preview/assets/images/logos/homepage-intel.png new file mode 100644 index 0000000..16bc3bc Binary files /dev/null and b/preview/assets/images/logos/homepage-intel.png differ diff --git a/preview/assets/images/logos/homepage-orbitz.png b/preview/assets/images/logos/homepage-orbitz.png new file mode 100644 index 0000000..b911a92 Binary files /dev/null and b/preview/assets/images/logos/homepage-orbitz.png differ diff --git a/preview/assets/images/logos/homepage-salesforce.png b/preview/assets/images/logos/homepage-salesforce.png new file mode 100644 index 0000000..f7ceb52 Binary files /dev/null and b/preview/assets/images/logos/homepage-salesforce.png differ diff --git a/preview/assets/images/logos/java.png b/preview/assets/images/logos/java.png new file mode 100644 index 0000000..c339b1c Binary files /dev/null and b/preview/assets/images/logos/java.png differ diff --git a/preview/assets/images/logos/linux.png b/preview/assets/images/logos/linux.png new file mode 100644 index 0000000..1bd9a49 Binary files /dev/null and b/preview/assets/images/logos/linux.png differ diff --git a/preview/assets/images/logos/mac.png b/preview/assets/images/logos/mac.png new file mode 100644 index 0000000..146267c Binary files /dev/null and b/preview/assets/images/logos/mac.png differ diff --git a/preview/assets/images/logos/redhat.png b/preview/assets/images/logos/redhat.png new file mode 100644 index 0000000..fbbfbbe Binary files /dev/null and b/preview/assets/images/logos/redhat.png differ diff --git a/preview/assets/images/logos/ubuntu.png b/preview/assets/images/logos/ubuntu.png new file mode 100644 index 0000000..6ce452a Binary files /dev/null and b/preview/assets/images/logos/ubuntu.png differ diff --git a/preview/assets/images/logos/windows.png b/preview/assets/images/logos/windows.png new file mode 100644 index 0000000..573bda4 Binary files /dev/null and b/preview/assets/images/logos/windows.png differ diff --git a/preview/assets/images/patterns/exhaust.jpg b/preview/assets/images/patterns/exhaust.jpg new file mode 100644 index 0000000..64f8650 Binary files /dev/null and b/preview/assets/images/patterns/exhaust.jpg differ diff --git a/preview/assets/images/patterns/mosaic-bright.png b/preview/assets/images/patterns/mosaic-bright.png new file mode 100644 index 0000000..86c0398 Binary files /dev/null and b/preview/assets/images/patterns/mosaic-bright.png differ diff --git a/preview/assets/images/patterns/mosaic-dark.png b/preview/assets/images/patterns/mosaic-dark.png new file mode 100644 index 0000000..634fc08 Binary files /dev/null and b/preview/assets/images/patterns/mosaic-dark.png differ diff --git a/preview/assets/images/patterns/mosaic-light.png b/preview/assets/images/patterns/mosaic-light.png new file mode 100644 index 0000000..2f74257 Binary files /dev/null and b/preview/assets/images/patterns/mosaic-light.png differ diff --git a/preview/assets/images/patterns/thatch.png b/preview/assets/images/patterns/thatch.png new file mode 100644 index 0000000..d1b8e31 Binary files /dev/null and b/preview/assets/images/patterns/thatch.png differ diff --git a/preview/assets/images/photos/company-hq.jpg b/preview/assets/images/photos/company-hq.jpg new file mode 100644 index 0000000..6d28452 Binary files /dev/null and b/preview/assets/images/photos/company-hq.jpg differ diff --git a/preview/assets/images/photos/homepage-image-header.jpg b/preview/assets/images/photos/homepage-image-header.jpg new file mode 100644 index 0000000..8d760e4 Binary files /dev/null and b/preview/assets/images/photos/homepage-image-header.jpg differ diff --git a/preview/assets/images/products/always-available--sm--2x.png b/preview/assets/images/products/always-available--sm--2x.png new file mode 100644 index 0000000..604ae23 Binary files /dev/null and b/preview/assets/images/products/always-available--sm--2x.png differ diff --git a/preview/assets/images/products/always-available--sm.png b/preview/assets/images/products/always-available--sm.png new file mode 100644 index 0000000..7cc21ea Binary files /dev/null and b/preview/assets/images/products/always-available--sm.png differ diff --git a/preview/assets/images/products/always-available.png b/preview/assets/images/products/always-available.png new file mode 100644 index 0000000..bfdceae Binary files /dev/null and b/preview/assets/images/products/always-available.png differ diff --git a/preview/assets/images/products/available-anywhere--2x.png b/preview/assets/images/products/available-anywhere--2x.png new file mode 100644 index 0000000..06d120c Binary files /dev/null and b/preview/assets/images/products/available-anywhere--2x.png differ diff --git a/preview/assets/images/products/available-anywhere--sm.png b/preview/assets/images/products/available-anywhere--sm.png new file mode 100644 index 0000000..2e94144 Binary files /dev/null and b/preview/assets/images/products/available-anywhere--sm.png differ diff --git a/preview/assets/images/products/available-anywhere.png b/preview/assets/images/products/available-anywhere.png new file mode 100644 index 0000000..20e8560 Binary files /dev/null and b/preview/assets/images/products/available-anywhere.png differ diff --git a/preview/assets/images/products/data-mobility--sm--2x.png b/preview/assets/images/products/data-mobility--sm--2x.png new file mode 100644 index 0000000..84b1195 Binary files /dev/null and b/preview/assets/images/products/data-mobility--sm--2x.png differ diff --git a/preview/assets/images/products/data-mobility--sm.png b/preview/assets/images/products/data-mobility--sm.png new file mode 100644 index 0000000..7e35b3e Binary files /dev/null and b/preview/assets/images/products/data-mobility--sm.png differ diff --git a/preview/assets/images/products/data-mobility.png b/preview/assets/images/products/data-mobility.png new file mode 100644 index 0000000..063ab83 Binary files /dev/null and b/preview/assets/images/products/data-mobility.png differ diff --git a/preview/assets/images/products/dev-power--sm--2x.png b/preview/assets/images/products/dev-power--sm--2x.png new file mode 100644 index 0000000..0ebb902 Binary files /dev/null and b/preview/assets/images/products/dev-power--sm--2x.png differ diff --git a/preview/assets/images/products/dev-power--sm.png b/preview/assets/images/products/dev-power--sm.png new file mode 100644 index 0000000..d4cd1e0 Binary files /dev/null and b/preview/assets/images/products/dev-power--sm.png differ diff --git a/preview/assets/images/products/dev-power.png b/preview/assets/images/products/dev-power.png new file mode 100644 index 0000000..296ea73 Binary files /dev/null and b/preview/assets/images/products/dev-power.png differ diff --git a/preview/assets/images/products/feature-rich--2x.png b/preview/assets/images/products/feature-rich--2x.png new file mode 100644 index 0000000..eb41acd Binary files /dev/null and b/preview/assets/images/products/feature-rich--2x.png differ diff --git a/preview/assets/images/products/feature-rich--sm.png b/preview/assets/images/products/feature-rich--sm.png new file mode 100644 index 0000000..092abda Binary files /dev/null and b/preview/assets/images/products/feature-rich--sm.png differ diff --git a/preview/assets/images/products/feature-rich.png b/preview/assets/images/products/feature-rich.png new file mode 100644 index 0000000..fc861f4 Binary files /dev/null and b/preview/assets/images/products/feature-rich.png differ diff --git a/preview/assets/images/products/flexible-map--sm--2x.png b/preview/assets/images/products/flexible-map--sm--2x.png new file mode 100644 index 0000000..cbe3a5e Binary files /dev/null and b/preview/assets/images/products/flexible-map--sm--2x.png differ diff --git a/preview/assets/images/products/flexible-map--sm.png b/preview/assets/images/products/flexible-map--sm.png new file mode 100644 index 0000000..2a5a7d5 Binary files /dev/null and b/preview/assets/images/products/flexible-map--sm.png differ diff --git a/preview/assets/images/products/flexible-map.png b/preview/assets/images/products/flexible-map.png new file mode 100644 index 0000000..7064c2b Binary files /dev/null and b/preview/assets/images/products/flexible-map.png differ diff --git a/preview/assets/images/products/general-purpose--sm--2x.png b/preview/assets/images/products/general-purpose--sm--2x.png new file mode 100644 index 0000000..9573801 Binary files /dev/null and b/preview/assets/images/products/general-purpose--sm--2x.png differ diff --git a/preview/assets/images/products/general-purpose--sm.png b/preview/assets/images/products/general-purpose--sm.png new file mode 100644 index 0000000..ccc9b08 Binary files /dev/null and b/preview/assets/images/products/general-purpose--sm.png differ diff --git a/preview/assets/images/products/general-purpose.png b/preview/assets/images/products/general-purpose.png new file mode 100644 index 0000000..9398651 Binary files /dev/null and b/preview/assets/images/products/general-purpose.png differ diff --git a/preview/assets/images/products/native-api--2x.png b/preview/assets/images/products/native-api--2x.png new file mode 100644 index 0000000..2f36c35 Binary files /dev/null and b/preview/assets/images/products/native-api--2x.png differ diff --git a/preview/assets/images/products/native-api--sm.png b/preview/assets/images/products/native-api--sm.png new file mode 100644 index 0000000..0e33461 Binary files /dev/null and b/preview/assets/images/products/native-api--sm.png differ diff --git a/preview/assets/images/products/native-api.png b/preview/assets/images/products/native-api.png new file mode 100644 index 0000000..c476dff Binary files /dev/null and b/preview/assets/images/products/native-api.png differ diff --git a/preview/assets/images/products/onecode--2x.png b/preview/assets/images/products/onecode--2x.png new file mode 100644 index 0000000..08442e5 Binary files /dev/null and b/preview/assets/images/products/onecode--2x.png differ diff --git a/preview/assets/images/products/onecode--sm.png b/preview/assets/images/products/onecode--sm.png new file mode 100644 index 0000000..c13da45 Binary files /dev/null and b/preview/assets/images/products/onecode--sm.png differ diff --git a/preview/assets/images/products/onecode.png b/preview/assets/images/products/onecode.png new file mode 100644 index 0000000..a316e3b Binary files /dev/null and b/preview/assets/images/products/onecode.png differ diff --git a/preview/assets/images/products/performance--sm--2x.png b/preview/assets/images/products/performance--sm--2x.png new file mode 100644 index 0000000..cd72eb0 Binary files /dev/null and b/preview/assets/images/products/performance--sm--2x.png differ diff --git a/preview/assets/images/products/performance--sm.png b/preview/assets/images/products/performance--sm.png new file mode 100644 index 0000000..bd65b99 Binary files /dev/null and b/preview/assets/images/products/performance--sm.png differ diff --git a/preview/assets/images/products/performance.png b/preview/assets/images/products/performance.png new file mode 100644 index 0000000..e08cc75 Binary files /dev/null and b/preview/assets/images/products/performance.png differ diff --git a/preview/assets/images/products/powerful-admin--sm--2x.png b/preview/assets/images/products/powerful-admin--sm--2x.png new file mode 100644 index 0000000..17f78bd Binary files /dev/null and b/preview/assets/images/products/powerful-admin--sm--2x.png differ diff --git a/preview/assets/images/products/powerful-admin--sm.png b/preview/assets/images/products/powerful-admin--sm.png new file mode 100644 index 0000000..d6ca0d4 Binary files /dev/null and b/preview/assets/images/products/powerful-admin--sm.png differ diff --git a/preview/assets/images/products/powerful-admin.png b/preview/assets/images/products/powerful-admin.png new file mode 100644 index 0000000..432ec90 Binary files /dev/null and b/preview/assets/images/products/powerful-admin.png differ diff --git a/preview/assets/images/products/real-time--sm--2x.png b/preview/assets/images/products/real-time--sm--2x.png new file mode 100644 index 0000000..d07ad00 Binary files /dev/null and b/preview/assets/images/products/real-time--sm--2x.png differ diff --git a/preview/assets/images/products/real-time--sm.png b/preview/assets/images/products/real-time--sm.png new file mode 100644 index 0000000..c086fec Binary files /dev/null and b/preview/assets/images/products/real-time--sm.png differ diff --git a/preview/assets/images/products/real-time.png b/preview/assets/images/products/real-time.png new file mode 100644 index 0000000..d9725c7 Binary files /dev/null and b/preview/assets/images/products/real-time.png differ diff --git a/preview/assets/images/products/sync--2x.png b/preview/assets/images/products/sync--2x.png new file mode 100644 index 0000000..f77ae03 Binary files /dev/null and b/preview/assets/images/products/sync--2x.png differ diff --git a/preview/assets/images/products/sync--sm.png b/preview/assets/images/products/sync--sm.png new file mode 100644 index 0000000..8315530 Binary files /dev/null and b/preview/assets/images/products/sync--sm.png differ diff --git a/preview/assets/images/products/sync.png b/preview/assets/images/products/sync.png new file mode 100644 index 0000000..90ba08f Binary files /dev/null and b/preview/assets/images/products/sync.png differ diff --git a/preview/assets/javascripts/application.js b/preview/assets/javascripts/application.js new file mode 100644 index 0000000..3849f31 --- /dev/null +++ b/preview/assets/javascripts/application.js @@ -0,0 +1,25 @@ +require( + [ + 'modules/navigation', + 'modules/globalheadersearch' + ], + + function(Navigation, GlobalHeaderSearch) { + new Navigation(); + new GlobalHeaderSearch(); + + var modules = document.body.getAttribute('data-modules'); + + if (modules !== null) { + modules = modules.trim(); + + if (modules.length) { + modules.split(' ').forEach(function(module) { + require(['modules/' + module], function(Module) { + new Module(); + }); + }); + } + } + } +); \ No newline at end of file diff --git a/preview/assets/javascripts/init.js b/preview/assets/javascripts/init.js new file mode 100644 index 0000000..65a6477 --- /dev/null +++ b/preview/assets/javascripts/init.js @@ -0,0 +1,39 @@ +var BASEPATH; +if (!BASEPATH) { + BASEPATH = '../'; +} + +(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement); + +/* Added placeholder for GCSE */ +window.__gcse = { + callback: function() { + var gcse_el = document.getElementById('gsc-i-id1'); + gcse_el.setAttribute('placeholder', 'Search Documentation'); + } +}; + +/* Load Vendor Things */ +(function(d,t) { + if ('querySelector' in d && 'addEventListener' in window) { + r=d.createElement(t);s=d.querySelector(t); + r.src=BASEPATH+'assets/javascripts/vendor/require.js'; + r.setAttribute('data-main', BASEPATH+'assets/javascripts/application'); + s.parentNode.insertBefore(r,s); + } +})(document,'script'); + +/* Load Google Analytics */ +/* +var _gaq = _gaq || []; + _gaq.push(['_setAccount', 'UA-7763794-10']); + _gaq.push(['_setDomainName', '.couchbase.com']); + _gaq.push(['_setAllowLinker', true]); + _gaq.push(['_setAllowHash', false]); + _gaq.push(['_trackPageview']); + (function() { + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); +})(); +*/ diff --git a/preview/assets/javascripts/modules/carousel.js b/preview/assets/javascripts/modules/carousel.js new file mode 100644 index 0000000..d78ce9a --- /dev/null +++ b/preview/assets/javascripts/modules/carousel.js @@ -0,0 +1,161 @@ +define(function() { + var Carousel = function() { + var modules = document.querySelectorAll('.carousel'); + + for (var i = 0, j = modules.length; i < j; i++) { + new CarouselModule(modules[i]); + } + }; + + var CarouselModule = function(el) { + this.el = el; + + this.init(); + }; + + CarouselModule.prototype = { + init: function() { + this.setVars(); + + if (this.pages.length > 1) { + this.appendNavigation(); + this.bindEvents(); + + this.setPagesWrapperHeight(); + this.setPageClasses(); + } + }, + + appendNavigation: function() { + this.nextNav.innerHTML = 'Next'; + this.nextNav.classList.add('carousel__navigation--next'); + this.nextNav.setAttribute('data-delta', '1'); + this.nextNav.setAttribute('type', 'button'); + + this.prevNav.innerHTML = 'Previous'; + this.prevNav.classList.add('carousel__navigation--previous'); + this.prevNav.setAttribute('data-delta', '-1'); + this.prevNav.setAttribute('type', 'button'); + + this.carouselWrapper.appendChild(this.nextNav); + this.carouselWrapper.appendChild(this.prevNav); + }, + + bindEvents: function() { + this.nextNav.addEventListener('click', this.click.bind(this)); + this.prevNav.addEventListener('click', this.click.bind(this)); + + window.addEventListener('resize', this.resize.bind(this)); + }, + + click: function(event) { + event.preventDefault(); + + var button = event.currentTarget, + delta = parseInt(button.getAttribute('data-delta'), 10); + + this.updateIndices(delta); + this.setPageClasses(); + }, + + resize: function(event) { + var t = setTimeout(function() { + this.pagesWrapper.removeAttribute('style'); + this.maxPageHeight = 0; + + this.setPagesWrapperHeight(); + + clearTimeout(t); + }.bind(this), 100); + }, + + setPageClasses: function() { + for (var i = 0, j = this.pages.length; i < j; i++) { + var page = this.pages[i]; + + page.classList.remove(this.classNames.currentPage); + page.classList.remove(this.classNames.nextPage); + page.classList.remove(this.classNames.previousPage); + + if (i == this.currentIndex) { + page.classList.add(this.classNames.currentPage); + } else if (i == this.prevIndex) { + page.classList.add(this.classNames.previousPage); + } else { + page.classList.add(this.classNames.nextPage); + } + } + }, + + setMaxPageHeight: function() { + for (var i = 0, j = this.pages.length; i < j; i++) { + var page = this.pages[i], + pageHeight = page.offsetHeight; + + this.maxPageHeight = pageHeight > this.maxPageHeight ? pageHeight : this.maxPageHeight; + } + }, + + setPagesWrapperHeight: function() { + this.setMaxPageHeight(); + + this.pagesWrapper.style.height = this.maxPageHeight + 'px'; + }, + + setVars: function() { + this.classNames = { + currentPage: 'carousel__page--current', + nextPage: 'carousel__page--next', + previousPage: 'carousel__page--previous' + }; + + this.carouselWrapper = this.el.querySelector('.carousel__wrapper'); + this.pagesWrapper = this.carouselWrapper.querySelector('.carousel__pages'); + this.pages = this.pagesWrapper.querySelectorAll('.carousel__page'); + + this.nextNav = document.createElement('button'); + this.prevNav = document.createElement('button'); + + this.totalPages = this.pages.length; + this.currentIndex = 0; + this.nextIndex = 1; + this.prevIndex = this.totalPages - 1; + this.maxPageHeight = 0; + }, + + updateIndices: function(delta) { + var newCurrentIndex = this.currentIndex + delta, + newNextIndex = newCurrentIndex + 1, + newPrevIndex = newCurrentIndex -1, + lastPageIndex = this.totalPages - 1; + + switch(newCurrentIndex) { + case -1: + newCurrentIndex = lastPageIndex; + newNextIndex = 0; + newPrevIndex = newCurrentIndex - 1; + break; + case 0: + newPrevIndex = lastPageIndex; + break; + case this.totalPages: + newCurrentIndex = 0; + newNextIndex = 1; + newPrevIndex = lastPageIndex; + break; + case this.totalPages - 1: + newNextIndex = 0; + break; + default: + newNextIndex = newCurrentIndex + 1; + newPrevIndex = newCurrentIndex - 1; + } + + this.currentIndex = newCurrentIndex; + this.nextIndex = newNextIndex; + this.prevIndex = newPrevIndex; + } + }; + + return Carousel; +}); \ No newline at end of file diff --git a/preview/assets/javascripts/modules/developer-portal-sidebar-navigation.js b/preview/assets/javascripts/modules/developer-portal-sidebar-navigation.js new file mode 100644 index 0000000..bb4cc47 --- /dev/null +++ b/preview/assets/javascripts/modules/developer-portal-sidebar-navigation.js @@ -0,0 +1,43 @@ +define(function() { + var DeveloperPortalSidebarNavigation = function() { + this.el = document.getElementById('developer-portal-sidebar-navigation'); + + if (this.el) { + this.init(); + } + }; + + DeveloperPortalSidebarNavigation.prototype = { + init: function() { + var attributes = { + 'aria-controls': 'developer-portal-sidebar-navigation', + 'aria-pressed': 'false', + 'class': 'developer-portal-sidebar__navigation__toggler', + 'type': 'button' + }; + + this.toggler = document.createElement('button'); + + for (var attr in attributes) { + this.toggler.setAttribute(attr, attributes[attr]); + } + + this.toggler.innerHTML = '' + this.el.querySelector('.current').textContent.trim() + ''; + this.toggler.addEventListener('click', this.click.bind(this)); + + this.el.setAttribute('aria-expanded', 'false'); + this.el.parentNode.insertBefore(this.toggler, this.el); + }, + + click: function(event) { + event.preventDefault(); + + var isPressed = this.toggler.getAttribute('aria-pressed') !== 'true'; + + this.el.setAttribute('aria-expanded', isPressed); + this.toggler.setAttribute('aria-pressed', isPressed); + } + }; + + return DeveloperPortalSidebarNavigation; +}); \ No newline at end of file diff --git a/preview/assets/javascripts/modules/developer-portal-versions-navigation.js b/preview/assets/javascripts/modules/developer-portal-versions-navigation.js new file mode 100644 index 0000000..dc730f2 --- /dev/null +++ b/preview/assets/javascripts/modules/developer-portal-versions-navigation.js @@ -0,0 +1,49 @@ +define(function() { + var DeveloperPortalVersionsNavigation = function() { + this.el = document.getElementById('developer-portal-versions-navigation'); + + if (this.el) { + this.init(); + } + }; + + DeveloperPortalVersionsNavigation.prototype = { + init: function() { + var attributes = { + 'aria-controls': 'developer-portal-versions-navigation', + 'aria-pressed': 'false', + 'class': 'developer-portal-sidebar__versions__toggler', + 'type': 'button' + }; + + var togglerWrapper = document.createElement('div'); + + togglerWrapper.setAttribute('class', 'developer-portal-sidebar__versions__toggler'); + + this.toggler = document.createElement('button'); + + for (var attr in attributes) { + this.toggler.setAttribute(attr, attributes[attr]); + } + + this.toggler.innerHTML = '' + this.el.querySelector('.active').textContent.trim() + ''; + this.toggler.addEventListener('click', this.click.bind(this)); + + togglerWrapper.appendChild(this.toggler); + + this.el.setAttribute('aria-expanded', 'false'); + this.el.parentNode.insertBefore(togglerWrapper, this.el); + }, + + click: function(event) { + event.preventDefault(); + + var isPressed = this.toggler.getAttribute('aria-pressed') !== 'true'; + + this.el.setAttribute('aria-expanded', isPressed); + this.toggler.setAttribute('aria-pressed', isPressed); + } + }; + + return DeveloperPortalVersionsNavigation; +}); \ No newline at end of file diff --git a/preview/assets/javascripts/modules/download-section.js b/preview/assets/javascripts/modules/download-section.js new file mode 100644 index 0000000..c7612da --- /dev/null +++ b/preview/assets/javascripts/modules/download-section.js @@ -0,0 +1,62 @@ +define(function() { + var DownloadSection = function() { + var modules = document.querySelectorAll('.download-section'); + + for (var i = 0, j = modules.length; i < j; i++) { + new DownloadSectionModule(modules[i]); + } + }; + + var DownloadSectionModule = function(el) { + this.el = el; + + this.init(); + }; + + DownloadSectionModule.prototype = { + init: function() { + this.initInstructions(); + this.initAdditionalVersions(); + }, + + initAdditionalVersions: function() { + var anchors = this.el.querySelectorAll('.additional-versions a'), + containers = this.el.querySelectorAll('.download-table--additional-versions'); + + this.initElements(anchors, containers); + }, + + initInstructions: function() { + var anchors = this.el.querySelectorAll('.instructions'), + containers = this.el.querySelectorAll('.download-table__instructions'); + + this.initElements(anchors, containers); + }, + + initElements: function(anchors, containers) { + for (var i = 0, j = anchors.length; i < j; i++) { + var anchor = anchors[i], + container = containers[i]; + + anchor.addEventListener('click', this.click.bind(this)); + anchor.setAttribute('aria-controls', container.getAttribute('id')); + anchor.setAttribute('aria-pressed', 'false'); + + container.setAttribute('aria-expanded', 'false'); + } + }, + + click: function(event) { + event.preventDefault(); + + var anchor = event.currentTarget, + isActive = anchor.getAttribute('aria-pressed') !== 'true', + containerId = anchor.getAttribute('aria-controls'); + + this.el.querySelector('#' + containerId).setAttribute('aria-expanded', isActive); + anchor.setAttribute('aria-pressed', isActive); + } + }; + + return DownloadSection; +}); \ No newline at end of file diff --git a/preview/assets/javascripts/modules/globalheadersearch.js b/preview/assets/javascripts/modules/globalheadersearch.js new file mode 100644 index 0000000..89d0619 --- /dev/null +++ b/preview/assets/javascripts/modules/globalheadersearch.js @@ -0,0 +1,51 @@ +define(function() { + var GlobalHeaderSearch = function() { + this.el = document.querySelector('#global-header-search'); + + if (this.el) { + this.init(); + } + }; + + GlobalHeaderSearch.prototype = { + init: function() { + var attributes = { + 'aria-controls': 'global-header-search__items', + 'aria-pressed': 'false', + 'class': 'global-header-search__toggler', + 'type': 'button' + }; + + this.searchInput = this.el.querySelector('input[type="search"]'); + this.toggler = document.createElement('button'); + + for (var attr in attributes) { + this.toggler.setAttribute(attr, attributes[attr]); + } + + this.toggler.innerHTML = 'Search'; + this.toggler.addEventListener('click', this.click.bind(this)); + + this.el.setAttribute('aria-expanded', 'false'); + this.el.appendChild(this.toggler); + this.el.classList.add('global-header-search--js'); + }, + + click: function(event) { + event.preventDefault(); + + var isPressed = this.toggler.getAttribute('aria-pressed') !== 'true'; + + this.el.setAttribute('aria-expanded', isPressed); + this.toggler.setAttribute('aria-pressed', isPressed); + + if (isPressed) { + this.searchInput.focus(); + } else { + this.toggler.focus(); + } + } + }; + + return GlobalHeaderSearch; +}); \ No newline at end of file diff --git a/preview/assets/javascripts/modules/image-header.js b/preview/assets/javascripts/modules/image-header.js new file mode 100644 index 0000000..5d783a1 --- /dev/null +++ b/preview/assets/javascripts/modules/image-header.js @@ -0,0 +1,51 @@ +define(function() { + var ImageHeader = function() { + var modules = document.querySelectorAll('.image-header[data-bg-large][data-bg-small]'); + + for (var i = 0, j = modules.length; i < j; i++) { + new ImageHeaderModule(modules[i]); + } + }; + + var ImageHeaderModule = function(el) { + this.el = el; + + this.init(); + }; + + ImageHeaderModule.prototype = { + init: function() { + this.setVars(); + this.bindEvents(); + + this.setBackgroundImage(window.outerWidth); + }, + + bindEvents: function() { + window.addEventListener('resize', this.resize.bind(this)); + }, + + resize: function(event) { + var t = setTimeout(function() { + this.setBackgroundImage(window.outerWidth); + + clearTimeout(t); + }.bind(this), 500); + }, + + setBackgroundImage: function(width) { + var src = (width < this.breakpoint) ? this.smallSrc : this.largeSrc; + + this.el.style.backgroundImage = 'url(' + src + ')'; + }, + + setVars: function() { + this.breakpoint = 800; + + this.largeSrc = this.el.getAttribute('data-bg-large'); + this.smallSrc = this.el.getAttribute('data-bg-small'); + } + }; + + return ImageHeader; +}); \ No newline at end of file diff --git a/preview/assets/javascripts/modules/navigation.js b/preview/assets/javascripts/modules/navigation.js new file mode 100644 index 0000000..6170134 --- /dev/null +++ b/preview/assets/javascripts/modules/navigation.js @@ -0,0 +1,45 @@ +define(function() { + var Navigation = function() { + this.el = document.getElementById('primary-navigation'); + + if (this.el) { + this.init(); + } + }; + + Navigation.prototype = { + init: function() { + var attributes = { + 'aria-controls': 'primary-navigation__wrapper', + 'aria-pressed': 'false', + 'class': 'primary-navigation__toggler', + 'type': 'button' + }; + + this.wrapper = document.getElementById('primary-navigation__wrapper'); + this.toggler = document.createElement('button'); + + for (var attr in attributes) { + this.toggler.setAttribute(attr, attributes[attr]); + } + + this.toggler.innerHTML = 'Menu'; + this.toggler.addEventListener('click', this.click.bind(this)); + + this.wrapper.setAttribute('aria-expanded', 'false'); + + this.el.insertBefore(this.toggler, this.wrapper); + }, + + click: function(event) { + event.preventDefault(); + + var isPressed = this.toggler.getAttribute('aria-pressed') !== 'true'; + + this.wrapper.setAttribute('aria-expanded', isPressed); + this.toggler.setAttribute('aria-pressed', isPressed); + } + }; + + return Navigation; +}); \ No newline at end of file diff --git a/preview/assets/javascripts/modules/related-content.js b/preview/assets/javascripts/modules/related-content.js new file mode 100644 index 0000000..cf0bf90 --- /dev/null +++ b/preview/assets/javascripts/modules/related-content.js @@ -0,0 +1,59 @@ +define(function() { + var RelatedContent = function() { + var modules = document.querySelectorAll('.related-content'); + + for (var i = 0, j = modules.length; i < j; i++) { + new RelatedContentModule(modules[i]); + } + }; + + var RelatedContentModule = function(el) { + this.el = el; + + this.init(); + }; + + RelatedContentModule.prototype = { + init: function() { + this.setVars(); + this.initToggler(); + this.initItems(); + }, + + click: function(event) { + event.preventDefault(); + + var isPressed = this.toggler.getAttribute('aria-pressed') !== 'true'; + + this.toggler.innerHTML = isPressed ? this.togglerTextClose : this.togglerTextOpen; + this.toggler.setAttribute('aria-pressed', isPressed); + + this.items.setAttribute('aria-expanded', isPressed); + }, + + initItems: function() { + this.items.setAttribute('aria-expanded', 'false'); + }, + + initToggler: function() { + this.toggler.innerHTML = this.togglerTextOpen; + this.toggler.classList.add('related-content__toggler'); + this.toggler.setAttribute('aria-pressed', 'false'); + this.toggler.setAttribute('type', 'button'); + + this.toggler.addEventListener('click', this.click.bind(this)); + + this.el.insertBefore(this.toggler, this.items); + }, + + setVars: function() { + this.items = this.el.querySelector('.related-content__items'); + this.toggler = document.createElement('button'); + + this.togglerTextOpen = this.el.getAttribute('data-toggler-text-open'); + this.togglerTextClose = this.el.getAttribute('data-toggler-text-close'); + } + }; + + return RelatedContent; +}); \ No newline at end of file diff --git a/preview/assets/javascripts/modules/section-scroller.js b/preview/assets/javascripts/modules/section-scroller.js new file mode 100644 index 0000000..b957da4 --- /dev/null +++ b/preview/assets/javascripts/modules/section-scroller.js @@ -0,0 +1,160 @@ +define( + [ + 'vendor/smooth-scroll', + 'vendor/enquire', + 'vendor/radio', + 'modules/section-video' + ], function(smoothScroll, enquire, radio, sectionVideo) { + + 'use strict'; + + var SectionScroll = function() { + new sectionVideo(); + new SectionScroller(document.querySelector('.section-scroller')); + }; + + var SectionScroller = function(elem) { + this.elem = elem; + + if (this.elem) { + enquire.register('(min-width: 900px)', { + setup: this.setup.bind(this), + deferSetup: true, + match: this.init.bind(this), + unmatch: this.destroy.bind(this) + }); + } + }; + + SectionScroller.prototype = { + setup: function() { + this.setVars(); + this.bindEvents(); + }, + + init: function() { + this.active = true; + this.current = null; + this.checkScroll(); + + smoothScroll.init({ + updateURL: true, + callbackAfter: this.navClick.bind(this) + }); + }, + + destroy: function() { + this.active = false; + this.current = null; + + this.sectionNavHide(); + smoothScroll.destroy(); + }, + + setVars: function() { + this.classShow = 'section-nav--show'; + this.current = null; + this.currentFocused = null; + this.globalHeader = document.querySelector('.global-header'); + this.globalHeaderH = this.globalHeader.clientHeight; + this.sections = this.elem.querySelectorAll('.product-section'); + this.sectionH = this.sections[0].clientHeight; + this.sectionNav = document.querySelector('.product-section__nav'); + this.sectionNavH = this.sectionNav.clientHeight; + this.sectionNavLinks = this.sectionNav.querySelectorAll('.product-section__nav__links a'); + this.scrollPos = 0; + }, + + bindEvents: function() { + window.addEventListener('scroll', this.checkScroll.bind(this)); + window.addEventListener('resize', this.findCurrent.bind(this)); + + // move between section nav links with keyboard arrows + this.sectionNav.addEventListener('keydown', this.sectionNavKeyboard.bind(this)); + }, + + sectionNavShow: function() { + this.sectionNav.classList.add(this.classShow); + }, + + sectionNavHide: function() { + this.sectionNav.classList.remove(this.classShow); + }, + + sectionNavKeyboard: function(event) { + if (event.which >= 37 && event.which <= 40) { + event.preventDefault(); + + // move prev + if (event.which === 37 || event.which === 38) { + this.currentFocused--; + if (this.currentFocused < 0) this.currentFocused = this.sectionNavLinks.length - 1; + + // move next + } else if (event.which === 39 || event.which === 40) { + this.currentFocused++; + if (this.currentFocused > this.sectionNavLinks.length - 1) this.currentFocused = 0; + } + + this.sectionNavLinks[this.currentFocused].focus(); + } + }, + + navClick: function(toggle, anchor) { + var target = document.querySelector(toggle.getAttribute('href')); + target.focus(); + + this.findCurrent(); + }, + + checkScroll: function() { + if (this.active) { + this.scrollPos = this.getScrollTop(); + + // trigger section header when main header is scrolled past + (this.scrollPos >= this.globalHeaderH) ? this.sectionNavShow() : this.sectionNavHide(); + + this.findCurrent(); + } + }, + + findCurrent: function() { + + // adjust trigger by difference in height between main header and section header + var currentPanel = Math.floor((this.scrollPos - (this.globalHeaderH - this.sectionNavH)) / this.sectionH); + currentPanel = (currentPanel < 0) ? 0 : currentPanel; + + if (currentPanel !== this.current) { + if (this.currentNav) { + this.currentNav.setAttribute('aria-selected', 'false'); + this.currentNav.setAttribute('tabindex', '-1'); + + radio('exitSection').broadcast(this.currentNav.getAttribute('href').substr(1)); + } + + this.currentNav = this.sectionNavLinks[currentPanel]; + this.currentNav.setAttribute('aria-selected', 'true'); + this.currentNav.setAttribute('tabindex', '0'); + + this.current = this.currentFocused = currentPanel; + + radio('enterSection').broadcast(this.currentNav.getAttribute('href').substr(1)); + } + }, + + getScrollTop: function() { + if (typeof pageYOffset != 'undefined') { + //most browsers except IE before #9 + return pageYOffset; + } else { + var B = document.body; //IE 'quirks' + var D = document.documentElement; //IE with doctype + D = (D.clientHeight) ? D : B; + + return D.scrollTop; + } + } + }; + + return SectionScroll; +}); diff --git a/preview/assets/javascripts/modules/section-video.js b/preview/assets/javascripts/modules/section-video.js new file mode 100644 index 0000000..51a5945 --- /dev/null +++ b/preview/assets/javascripts/modules/section-video.js @@ -0,0 +1,265 @@ +define(['vendor/radio', 'vendor/enquire'], function(radio, enquire) { + + 'use strict'; + + var SectionVideo = function() { + + // detect video support + var supports_video = false; + if ((/iP(ad|hone|od)/i).test(navigator.userAgent) || (/android/i).test(navigator.userAgent)) { + supports_video = false; + } else if (!!document.createElement('video').canPlayType) { + supports_video = true; + } + + // add video class to body + document.body.classList.add('video-' + supports_video); + + if (supports_video) { + + // add safari colors class + if (safari()) document.body.classList.add('safari-colors'); + + // set variables + var videos = document.querySelectorAll('.product-section'); + + // set up videos + for (var i = 0, len = videos.length; i < len; i++) { + new Video(videos[i]); + } + + // set up enquire + enquire.register('(min-width: 900px)', { + match: function() { + radio('largeViewSetup').broadcast(); + }, + unmatch: function() { + radio('largeViewTeardown').broadcast(); + } + }).register('(max-width: 899px)', { + match: function() { + radio('mobileViewSetup').broadcast(); + }, + unmatch: function() { + radio('mobileViewTeardown').broadcast(); + } + }); + } + + window.addEventListener('resize', function() { + radio('videoResize').broadcast(); + }); + }; + + var Video = function(elem) { + this.elem = elem; + if (this.elem) this.init(); + }; + + Video.prototype = { + classVideo: 'has-video', + classImage: 'has-image', + + attrs: { + 'aria-hidden': 'true', + 'preload': '', + 'tabindex': '-1' + }, + + init: function() { + this.setVariables(); + this.subscribe(); + }, + + setVariables: function() { + this.container = this.elem.querySelector('.product-section__graphic__inner'); + this.src = this.container.getAttribute('data-src'); + this.poster = this.container.getAttribute('data-poster'); + this.videoStateTimer; + if (this.src) this.aspectRatio = this.container.getAttribute('data-ratio').split(':'); + }, + + subscribe: function() { + // mobile + radio('mobileViewSetup').subscribe(this.mobileViewSetup.bind(this)); + radio('mobileViewTeardown').subscribe(this.mobileViewTeardown.bind(this)); + + // large + radio('largeViewSetup').subscribe(this.largeViewSetup.bind(this)); + radio('largeViewTeardown').subscribe(this.largeViewTeardown.bind(this)); + + // scrolling + radio('enterSection').subscribe(this.playVideo.bind(this)); + radio('exitSection').subscribe(this.stopVideo.bind(this)); + }, + + + /** setup/teardown */ + + largeViewSetup: function() { + if (this.src) { + this.container.classList.add(this.classVideo); + + this.createVideo(); + this.sizeVideo(); + this.container.appendChild(this.videoContainer); + + radio('videoResize').subscribe(this.sizeVideo.bind(this)); + } else { + this.container.classList.add(this.classImage); + } + }, + + largeViewTeardown: function() { + if (this.src) { + this.container.classList.remove(this.classVideo); + this.removeVideo(); + + radio('videoResize').unsubscribe(this.sizeVideo.bind(this)); + } else { + this.container.classList.remove(this.classImage); + } + + }, + + mobileViewSetup: function() { + this.container.classList.add(this.classImage); + }, + + mobileViewTeardown: function() { + this.container.classList.remove(this.classImage); + }, + + + /** create video */ + + createVideo: function() { + var poster = (this.poster) ? this.poster : 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='; + + this.videoContainer = document.createElement('div'); + this.videoContainer.classList.add('video__container'); + + this.video = document.createElement('video'); + for (var key in this.attrs) this.video.setAttribute(key, this.attrs[key]); + this.video.setAttribute('poster', poster); + + this.video.classList.add('video'); + + this.setSource('webm'); + this.setSource('mp4'); + + this.videoContainer.appendChild(this.video); + }, + + setSource: function(type) { + var src = document.createElement('source'); + src.setAttribute('src', this.src + '.' + type); + src.setAttribute('type', 'video/' + type); + + this.video.appendChild(src); + }, + + sizeVideo: function() { + var clientW = this.container.clientWidth; + var clientH = this.container.clientHeight; + + var newSize = scaleSize( + clientW, + clientH, + parseInt(this.aspectRatio[0], 10), + parseInt(this.aspectRatio[1], 10) + ); + + this.videoContainer.style.left = ((clientW - newSize[0]) / 2) + 'px'; + this.videoContainer.style.top = ((clientH - newSize[1]) / 2) + 'px'; + this.videoContainer.style.width = Math.floor(newSize[0]) + 'px'; + this.videoContainer.style.height = Math.floor(newSize[1]) + 'px'; + }, + + + /** play/pause video */ + + playVideo: function(section) { + if (this.src && section === this.elem.getAttribute('id')) { + this.video.classList.add('play'); + this.videoStateChecker(); + } + }, + + videoStateChecker: function() { + this.videoStateTimer = setTimeout(this.checkVideoState.bind(this), 10); + }, + + checkVideoState: function() { + if (this.video.readyState === 4) { + this.video.currentTime = 0; + this.video.play(); + } else { + this.videoStateChecker(); + } + }, + + stopVideo: function(section) { + if (this.src) { + clearTimeout(this.videoStateTimer); + + if (section === this.elem.getAttribute('id')) { + this.video.classList.remove('play'); + this.video.pause(); + } + } + }, + + + /** remove video */ + + removeVideo: function() { + this.container.removeChild(this.videoContainer); + } + }; + + + /** utilities */ + + var scaleSize = function(maxW, maxH, currW, currH) { + var ratio = currH / currW; + + var sizeHeight = function() { + currH = maxH; + currW = currH / ratio; + }; + + var sizeWidth = function() { + currW = maxW; + currH = currW * ratio; + }; + + if (ratio <= 1) { + sizeHeight(); + + if (currW > maxW) sizeWidth(); + } else { + sizeWidth(); + + if (currH > maxH) sizeHeight(); + } + + return [currW, currH]; + }; + + var safari = function() { + var ua = navigator.userAgent; + + return ( + ua.indexOf('Mac OS X') !== -1 && + ua.indexOf('Safari') !== -1 && + ua.indexOf('Chrome') === -1 && + ua.indexOf('Mobile') === -1 && + (ua.indexOf('Version/5') !== -1 || + ua.indexOf('Version/6') !== -1 || + ua.indexOf('Version/7') !== -1) + ) ? true : false; + }; + + return SectionVideo; +}); diff --git a/preview/assets/javascripts/modules/videoblock.js b/preview/assets/javascripts/modules/videoblock.js new file mode 100644 index 0000000..0464dd4 --- /dev/null +++ b/preview/assets/javascripts/modules/videoblock.js @@ -0,0 +1,45 @@ +define(function() { + var Videoblock = function() { + var modules = document.querySelectorAll('.videoblock'); + + for (var i = 0, j = modules.length; i < j; i++) { + new VideoblockModule(modules[i]); + } + }; + + var VideoblockModule = function(el) { + this.el = el; + + this.init(); + }; + + VideoblockModule.prototype = { + init: function() { + this.container = this.el.querySelector('.videoblock__content'); + this.iframe = this.el.querySelector('iframe'); + + this.button = document.createElement('button'); + this.button.innerHTML = 'Play'; + this.button.setAttribute('class', 'videoblock__button'); + this.button.setAttribute('type', 'button'); + + this.button.addEventListener('click', this.click.bind(this)); + + this.cover = document.createElement('div'); + this.cover.setAttribute('class', 'videoblock__cover'); + + this.container.appendChild(this.cover); + this.container.appendChild(this.button); + }, + + click: function(event) { + event.preventDefault(); + + this.container.removeChild(this.button); + this.container.removeChild(this.cover); + this.iframe.setAttribute('src', this.iframe.getAttribute('src') + '?autoplay=1'); + } + }; + + return Videoblock; +}); \ No newline at end of file diff --git a/preview/assets/javascripts/polyfills/addEventListener.js b/preview/assets/javascripts/polyfills/addEventListener.js new file mode 100644 index 0000000..d65d8e3 --- /dev/null +++ b/preview/assets/javascripts/polyfills/addEventListener.js @@ -0,0 +1,71 @@ +(function() { + if (!Event.prototype.preventDefault) { + Event.prototype.preventDefault=function() { + this.returnValue=false; + }; + } + if (!Event.prototype.stopPropagation) { + Event.prototype.stopPropagation=function() { + this.cancelBubble=true; + }; + } + if (!Element.prototype.addEventListener) { + var eventListeners=[]; + + var addEventListener=function(type,listener /*, useCapture (will be ignored) */) { + var self=this; + var wrapper=function(e) { + e.target=e.srcElement; + e.currentTarget=self; + if (listener.handleEvent) { + listener.handleEvent(e); + } else { + listener.call(self,e); + } + }; + if (type=="DOMContentLoaded") { + var wrapper2=function(e) { + if (document.readyState=="complete") { + wrapper(e); + } + }; + document.attachEvent("onreadystatechange",wrapper2); + eventListeners.push({object:this,type:type,listener:listener,wrapper:wrapper2}); + + if (document.readyState=="complete") { + var e=new Event(); + e.srcElement=window; + wrapper2(e); + } + } else { + this.attachEvent("on"+type,wrapper); + eventListeners.push({object:this,type:type,listener:listener,wrapper:wrapper}); + } + }; + var removeEventListener=function(type,listener /*, useCapture (will be ignored) */) { + var counter=0; + while (counter>> 0; + + // 4. If IsCallable(callback) is false, throw a TypeError exception. + // See: http://es5.github.com/#x9.11 + if (typeof callback !== "function") { + throw new TypeError(callback + ' is not a function'); + } + + // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. + if (arguments.length > 1) { + T = thisArg; + } + + // 6. Let k be 0 + k = 0; + + // 7. Repeat, while k < len + while (k < len) { + + var kValue; + + // a. Let Pk be ToString(k). + // This is implicit for LHS operands of the in operator + // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. + // This step can be combined with c + // c. If kPresent is true, then + if (k in O) { + + // i. Let kValue be the result of calling the Get internal method of O with argument Pk. + kValue = O[k]; + + // ii. Call the Call internal method of callback with T as the this value and + // argument list containing kValue, k, and O. + callback.call(T, kValue, k, O); + } + // d. Increase k by 1. + k++; + } + // 8. return undefined + }; +} \ No newline at end of file diff --git a/preview/assets/javascripts/polyfills/html5shiv.js b/preview/assets/javascripts/polyfills/html5shiv.js new file mode 100644 index 0000000..d4c731a --- /dev/null +++ b/preview/assets/javascripts/polyfills/html5shiv.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document); \ No newline at end of file diff --git a/preview/assets/javascripts/polyfills/matchMedia.addListener.js b/preview/assets/javascripts/polyfills/matchMedia.addListener.js new file mode 100644 index 0000000..764232d --- /dev/null +++ b/preview/assets/javascripts/polyfills/matchMedia.addListener.js @@ -0,0 +1,75 @@ +/*! matchMedia() polyfill addListener/removeListener extension. Author & copyright (c) 2012: Scott Jehl. Dual MIT/BSD license */ +(function(){ + // Bail out for browsers that have addListener support + if (window.matchMedia && window.matchMedia('all').addListener) { + return false; + } + + var localMatchMedia = window.matchMedia, + hasMediaQueries = localMatchMedia('only all').matches, + isListening = false, + timeoutID = 0, // setTimeout for debouncing 'handleChange' + queries = [], // Contains each 'mql' and associated 'listeners' if 'addListener' is used + handleChange = function(evt) { + // Debounce + clearTimeout(timeoutID); + + timeoutID = setTimeout(function() { + for (var i = 0, il = queries.length; i < il; i++) { + var mql = queries[i].mql, + listeners = queries[i].listeners || [], + matches = localMatchMedia(mql.media).matches; + + // Update mql.matches value and call listeners + // Fire listeners only if transitioning to or from matched state + if (matches !== mql.matches) { + mql.matches = matches; + + for (var j = 0, jl = listeners.length; j < jl; j++) { + listeners[j].call(window, mql); + } + } + } + }, 30); + }; + + window.matchMedia = function(media) { + var mql = localMatchMedia(media), + listeners = [], + index = 0; + + mql.addListener = function(listener) { + // Changes would not occur to css media type so return now (Affects IE <= 8) + if (!hasMediaQueries) { + return; + } + + // Set up 'resize' listener for browsers that support CSS3 media queries (Not for IE <= 8) + // There should only ever be 1 resize listener running for performance + if (!isListening) { + isListening = true; + window.addEventListener('resize', handleChange, true); + } + + // Push object only if it has not been pushed already + if (index === 0) { + index = queries.push({ + mql : mql, + listeners : listeners + }); + } + + listeners.push(listener); + }; + + mql.removeListener = function(listener) { + for (var i = 0, il = listeners.length; i < il; i++){ + if (listeners[i] === listener){ + listeners.splice(i, 1); + } + } + }; + + return mql; + }; +}()); diff --git a/preview/assets/javascripts/polyfills/matchMedia.js b/preview/assets/javascripts/polyfills/matchMedia.js new file mode 100644 index 0000000..7774538 --- /dev/null +++ b/preview/assets/javascripts/polyfills/matchMedia.js @@ -0,0 +1,46 @@ +/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */ + +window.matchMedia || (window.matchMedia = function() { + "use strict"; + + // For browsers that support matchMedium api such as IE 9 and webkit + var styleMedia = (window.styleMedia || window.media); + + // For those that don't support matchMedium + if (!styleMedia) { + var style = document.createElement('style'), + script = document.getElementsByTagName('script')[0], + info = null; + + style.type = 'text/css'; + style.id = 'matchmediajs-test'; + + script.parentNode.insertBefore(style, script); + + // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers + info = ('getComputedStyle' in window) && window.getComputedStyle(style) || style.currentStyle; + + styleMedia = { + matchMedium: function(media) { + var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }'; + + // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers + if (style.styleSheet) { + style.styleSheet.cssText = text; + } else { + style.textContent = text; + } + + // Test if media query is true or false + return info.width === '1px'; + } + }; + } + + return function(media) { + return { + matches: styleMedia.matchMedium(media || 'all'), + media: media || 'all' + }; + }; +}()); diff --git a/preview/assets/javascripts/polyfills/respond.js b/preview/assets/javascripts/polyfills/respond.js new file mode 100644 index 0000000..1736d82 --- /dev/null +++ b/preview/assets/javascripts/polyfills/respond.js @@ -0,0 +1,7 @@ +/*! Respond.js v1.4.2: min/max-width media query polyfill + * Copyright 2014 Scott Jehl + * Licensed under MIT + * http://j.mp/respondjs + */ + +!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;be.length)break e;if(!(d instanceof a)){c.lastIndex=0;var m=c.exec(d);if(m){u&&(f=m[1].length);var y=m.index-1+f,m=m[0].slice(f),v=m.length,k=y+v,b=d.slice(0,y+1),w=d.slice(k+1),N=[p,1];b&&N.push(b);var O=new a(l,g?t.tokenize(m,g):m,h);N.push(O),w&&N.push(w),Array.prototype.splice.apply(r,N)}}}}}return r},hooks:{all:{},add:function(e,n){var a=t.hooks.all;a[e]=a[e]||[],a[e].push(n)},run:function(e,n){var a=t.hooks.all[e];if(a&&a.length)for(var r,i=0;r=a[i++];)r(n)}}},n=t.Token=function(e,t,n){this.type=e,this.content=t,this.alias=n};if(n.stringify=function(e,a,r){if("string"==typeof e)return e;if("[object Array]"==Object.prototype.toString.call(e))return e.map(function(t){return n.stringify(t,a,e)}).join("");var i={type:e.type,content:n.stringify(e.content,a,r),tag:"span",classes:["token",e.type],attributes:{},language:a,parent:r};if("comment"==i.type&&(i.attributes.spellcheck="true"),e.alias){var l="Array"===t.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(i.classes,l)}t.hooks.run("wrap",i);var o="";for(var s in i.attributes)o+=s+'="'+(i.attributes[s]||"")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'" '+o+">"+i.content+""},!self.document)return self.addEventListener?(self.addEventListener("message",function(e){var n=JSON.parse(e.data),a=n.language,r=n.code;self.postMessage(JSON.stringify(t.util.encode(t.tokenize(r,t.languages[a])))),self.close()},!1),self.Prism):self.Prism;var a=document.getElementsByTagName("script");return a=a[a.length-1],a&&(t.filename=a.src,document.addEventListener&&!a.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)),self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism);; +Prism.languages.markup={comment://g,prolog:/<\?.+?\?>/,doctype://,cdata://i,tag:{pattern:/<\/?[\w:-]+\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|[^\s'">=]+))?\s*)*\/?>/gi,inside:{tag:{pattern:/^<\/?[\w:-]+/i,inside:{punctuation:/^<\/?/,namespace:/^[\w-]+?:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/gi,inside:{punctuation:/=|>|"/g}},punctuation:/\/?>/g,"attr-name":{pattern:/[\w:-]+/g,inside:{namespace:/^[\w-]+?:/}}}},entity:/\&#?[\da-z]{1,8};/gi},Prism.hooks.add("wrap",function(t){"entity"===t.type&&(t.attributes.title=t.content.replace(/&/,"&"))});; +Prism.languages.css={comment:/\/\*[\w\W]*?\*\//g,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*{))/gi,inside:{punctuation:/[;:]/g}},url:/url\((["']?).*?\1\)/gi,selector:/[^\{\}\s][^\{\};]*(?=\s*\{)/g,property:/(\b|\B)[\w-]+(?=\s*:)/gi,string:/("|')(\\?.)*?\1/g,important:/\B!important\b/gi,punctuation:/[\{\};:]/g,"function":/[-a-z0-9]+(?=\()/gi},Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{style:{pattern:/[\w\W]*?<\/style>/gi,inside:{tag:{pattern:/|<\/style>/gi,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.css}}});; +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//g,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*?(\r?\n|$)/g,lookbehind:!0}],string:/("|')(\\?.)*?\1/g,"class-name":{pattern:/((?:(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/gi,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/g,"boolean":/\b(true|false)\b/g,"function":{pattern:/[a-z0-9_]+\(/gi,inside:{punctuation:/\(/}},number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/g,operator:/[-+]{1,2}|!|<=?|>=?|={1,3}|&{1,2}|\|?\||\?|\*|\/|\~|\^|\%/g,ignore:/&(lt|gt|amp);/gi,punctuation:/[{}[\];(),.:]/g};; +Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|function|get|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/g,number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?|NaN|-?Infinity)\b/g}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,lookbehind:!0}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/[\w\W]*?<\/script>/gi,inside:{tag:{pattern:/|<\/script>/gi,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.javascript}}});; +Prism.languages.java=Prism.languages.extend("clike",{keyword:/\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/g,number:/\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+[e]?[\d]*[df]\b|\W\d*\.?\d+\b/gi,operator:{pattern:/(^|[^\.])(?:\+=|\+\+?|-=|--?|!=?|<{1,2}=?|>{1,3}=?|==?|&=|&&?|\|=|\|\|?|\?|\*=?|\/=?|%=?|\^=?|:|~)/gm,lookbehind:!0}});; +Prism.languages.php=Prism.languages.extend("clike",{keyword:/\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/gi,constant:/\b[A-Z0-9_]{2,}\b/g,comment:{pattern:/(^|[^\\])(\/\*[\w\W]*?\*\/|(^|[^:])(\/\/|#).*?(\r?\n|$))/g,lookbehind:!0}}),Prism.languages.insertBefore("php","keyword",{delimiter:/(\?>|<\?php|<\?)/gi,variable:/(\$\w+)\b/gi,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/g,lookbehind:!0,inside:{punctuation:/\\/}}}),Prism.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/g,lookbehind:!0}}),Prism.languages.markup&&(Prism.hooks.add("before-highlight",function(e){"php"===e.language&&(e.tokenStack=[],e.backupCode=e.code,e.code=e.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/gi,function(n){return e.tokenStack.push(n),"{{{PHP"+e.tokenStack.length+"}}}"}))}),Prism.hooks.add("before-insert",function(e){"php"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),Prism.hooks.add("after-highlight",function(e){if("php"===e.language){for(var n,a=0;n=e.tokenStack[a];a++)e.highlightedCode=e.highlightedCode.replace("{{{PHP"+(a+1)+"}}}",Prism.highlight(n,e.grammar,"php"));e.element.innerHTML=e.highlightedCode}}),Prism.hooks.add("wrap",function(e){"php"===e.language&&"markup"===e.type&&(e.content=e.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g,'$1'))}),Prism.languages.insertBefore("php","comment",{markup:{pattern:/<[^?]\/?(.*?)>/g,inside:Prism.languages.markup},php:/\{\{\{PHP[0-9]+\}\}\}/g}));; +Prism.languages.coffeescript=Prism.languages.extend("javascript",{comment:[/([#]{3}\s*\r?\n(.*\s*\r*\n*)\s*?\r?\n[#]{3})/g,/(\s|^)([#]{1}[^#^\r^\n]{2,}?(\r?\n|$))/g],keyword:/\b(this|window|delete|class|extends|namespace|extend|ar|let|if|else|while|do|for|each|of|return|in|instanceof|new|with|typeof|try|catch|finally|null|undefined|break|continue)\b/g}),Prism.languages.insertBefore("coffeescript","keyword",{"function":{pattern:/[a-z|A-z]+\s*[:|=]\s*(\([.|a-z\s|,|:|{|}|\"|\'|=]*\))?\s*->/gi,inside:{"function-name":/[_?a-z-|A-Z-]+(\s*[:|=])| @[_?$?a-z-|A-Z-]+(\s*)| /g,operator:/[-+]{1,2}|!|=?<|=?>|={1,2}|(&){1,2}|\|?\||\?|\*|\//g}},"attr-name":/[_?a-z-|A-Z-]+(\s*:)| @[_?$?a-z-|A-Z-]+(\s*)| /g});; +Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(\/\*[\w\W]*?\*\/|\/\/.*?(\r?\n|$))/g,lookbehind:!0},atrule:/@[\w-]+(?=\s+(\(|\{|;))/gi,url:/([-a-z]+-)*url(?=\()/gi,selector:/([^@;\{\}\(\)]?([^@;\{\}\(\)]|&|\#\{\$[-_\w]+\})+)(?=\s*\{(\}|\s|[^\}]+(:|\{)[^\}]+))/gm}),Prism.languages.insertBefore("scss","atrule",{keyword:/@(if|else if|else|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)|(?=@for\s+\$[-_\w]+\s)+from/i}),Prism.languages.insertBefore("scss","property",{variable:/((\$[-_\w]+)|(#\{\$[-_\w]+\}))/i}),Prism.languages.insertBefore("scss","ignore",{placeholder:/%[-_\w]+/i,statement:/\B!(default|optional)\b/gi,"boolean":/\b(true|false)\b/g,"null":/\b(null)\b/g,operator:/\s+([-+]{1,2}|={1,2}|!=|\|?\||\?|\*|\/|\%)\s+/g});; +Prism.languages.bash=Prism.languages.extend("clike",{comment:{pattern:/(^|[^"{\\])(#.*?(\r?\n|$))/g,lookbehind:!0},string:{pattern:/("|')(\\?[\s\S])*?\1/g,inside:{property:/\$([a-zA-Z0-9_#\?\-\*!@]+|\{[^\}]+\})/g}},keyword:/\b(if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)\b/g}),Prism.languages.insertBefore("bash","keyword",{property:/\$([a-zA-Z0-9_#\?\-\*!@]+|\{[^}]+\})/g}),Prism.languages.insertBefore("bash","comment",{important:/(^#!\s*\/bin\/bash)|(^#!\s*\/bin\/sh)/g});; +Prism.languages.c=Prism.languages.extend("clike",{string:/("|')([^\n\\\1]|\\.|\\\r*\n)*?\1/g,keyword:/\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/g,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\//g}),Prism.languages.insertBefore("c","string",{property:{pattern:/((^|\n)\s*)#\s*[a-z]+([^\n\\]|\\.|\\\r*\n)*/gi,lookbehind:!0,inside:{string:{pattern:/(#\s*include\s*)(<.+?>|("|')(\\?.)+?\3)/g,lookbehind:!0}}}}),delete Prism.languages.c["class-name"],delete Prism.languages.c["boolean"];; +Prism.languages.cpp=Prism.languages.extend("c",{keyword:/\b(alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|delete\[\]|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|new\[\]|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/g,"boolean":/\b(true|false)\b/g,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|:{1,2}|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\/|\b(and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/g}),Prism.languages.insertBefore("cpp","keyword",{"class-name":{pattern:/(class\s+)[a-z0-9_]+/gi,lookbehind:!0}});; +Prism.languages.python={comment:{pattern:/(^|[^\\])#.*?(\r?\n|$)/g,lookbehind:!0},string:/"""[\s\S]+?"""|("|')(\\?.)*?\1/g,keyword:/\b(as|assert|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|with|yield)\b/g,"boolean":/\b(True|False)\b/g,number:/\b-?(0x)?\d*\.?[\da-f]+\b/g,operator:/[-+]{1,2}|=?<|=?>|!|={1,2}|(&){1,2}|(&){1,2}|\|?\||\?|\*|\/|~|\^|%|\b(or|and|not)\b/g,ignore:/&(lt|gt|amp);/gi,punctuation:/[{}[\];(),.:]/g};; +Prism.languages.sql={comment:{pattern:/(^|[^\\])(\/\*[\w\W]*?\*\/|((--)|(\/\/)|#).*?(\r?\n|$))/g,lookbehind:!0},string:{pattern:/(^|[^@])("|')(\\?[\s\S])*?\2/g,lookbehind:!0},variable:/@[\w.$]+|@("|'|`)(\\?[\s\S])+?\1/g,"function":/\b(?:COUNT|SUM|AVG|MIN|MAX|FIRST|LAST|UCASE|LCASE|MID|LEN|ROUND|NOW|FORMAT)(?=\s*\()/ig,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALTER|ANALYZE|APPLY|AS|ASC|AUTHORIZATION|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADE|CASCADED|CASE|CHAIN|CHAR VARYING|CHARACTER VARYING|CHECK|CHECKPOINT|CLOSE|CLUSTERED|COALESCE|COLUMN|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS|CONTAINSTABLE|CONTINUE|CONVERT|CREATE|CROSS|CURRENT|CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP|CURRENT_USER|CURSOR|DATA|DATABASE|DATABASES|DATETIME|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DOUBLE PRECISION|DROP|DUMMY|DUMP|DUMPFILE|DUPLICATE KEY|ELSE|ENABLE|ENCLOSED BY|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPE|ESCAPED BY|EXCEPT|EXEC|EXECUTE|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR|FOR EACH ROW|FORCE|FOREIGN|FREETEXT|FREETEXTTABLE|FROM|FULL|FUNCTION|GEOMETRY|GEOMETRYCOLLECTION|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|IDENTITY|IDENTITY_INSERT|IDENTITYCOL|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTO|INVOKER|ISOLATION LEVEL|JOIN|KEY|KEYS|KILL|LANGUAGE SQL|LAST|LEFT|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONGBLOB|LONGTEXT|MATCH|MATCHED|MEDIUMBLOB|MEDIUMINT|MEDIUMTEXT|MERGE|MIDDLEINT|MODIFIES SQL DATA|MODIFY|MULTILINESTRING|MULTIPOINT|MULTIPOLYGON|NATIONAL|NATIONAL CHAR VARYING|NATIONAL CHARACTER|NATIONAL CHARACTER VARYING|NATIONAL VARCHAR|NATURAL|NCHAR|NCHAR VARCHAR|NEXT|NO|NO SQL|NOCHECK|NOCYCLE|NONCLUSTERED|NULLIF|NUMERIC|OF|OFF|OFFSETS|ON|OPEN|OPENDATASOURCE|OPENQUERY|OPENROWSET|OPTIMIZE|OPTION|OPTIONALLY|ORDER|OUT|OUTER|OUTFILE|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREV|PRIMARY|PRINT|PRIVILEGES|PROC|PROCEDURE|PUBLIC|PURGE|QUICK|RAISERROR|READ|READS SQL DATA|READTEXT|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEATABLE|REPLICATION|REQUIRE|RESTORE|RESTRICT|RETURN|RETURNS|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROWCOUNT|ROWGUIDCOL|ROWS?|RTREE|RULE|SAVE|SAVEPOINT|SCHEMA|SELECT|SERIAL|SERIALIZABLE|SESSION|SESSION_USER|SET|SETUSER|SHARE MODE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|START|STARTING BY|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLE|TABLES|TABLESPACE|TEMP(?:ORARY)?|TEMPTABLE|TERMINATED BY|TEXT|TEXTSIZE|THEN|TIMESTAMP|TINYBLOB|TINYINT|TINYTEXT|TO|TOP|TRAN|TRANSACTION|TRANSACTIONS|TRIGGER|TRUNCATE|TSEQUAL|TYPE|TYPES|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNPIVOT|UPDATE|UPDATETEXT|USAGE|USE|USER|USING|VALUE|VALUES|VARBINARY|VARCHAR|VARCHARACTER|VARYING|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH|WITH ROLLUP|WITHIN|WORK|WRITE|WRITETEXT)\b/gi,"boolean":/\b(?:TRUE|FALSE|NULL)\b/gi,number:/\b-?(0x)?\d*\.?[\da-f]+\b/g,operator:/\b(?:ALL|AND|ANY|BETWEEN|EXISTS|IN|LIKE|NOT|OR|IS|UNIQUE|CHARACTER SET|COLLATE|DIV|OFFSET|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b|[-+]{1}|!|[=<>]{1,2}|(&){1,2}|\|?\||\?|\*|\//gi,punctuation:/[;[\]()`,.]/g};; +Prism.languages.groovy=Prism.languages.extend("clike",{keyword:/\b(as|def|in|abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/g,string:/("""|''')[\W\w]*?\1|("|'|\/)[\W\w]*?\2|(\$\/)(\$\/\$|[\W\w])*?\/\$/g,number:/\b0b[01_]+\b|\b0x[\da-f_]+(\.[\da-f_p\-]+)?\b|\b[\d_]+(\.[\d_]+[e]?[\d]*)?[glidf]\b|[\d_]+(\.[\d_]+)?\b/gi,operator:{pattern:/(^|[^.])(={0,2}~|\?\.|\*?\.@|\.&|\.{1,2}(?!\.)|\.{2}|\?:|[-+]{1,2}|!|<=>|>{1,3}|<{1,2}|={1,2}|&{1,2}|\|{1,2}|\?|\*{1,2}|\/|\^|%)/g,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/g}),Prism.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(setup|given|when|then|and|cleanup|expect|where):/g}),Prism.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0}}),Prism.hooks.add("wrap",function(e){if("groovy"===e.language&&"string"===e.type){var t=e.content[0];if("'"!=t){var n=/([^\\])(\$(\{.*?\}|[\w\.]+))/;"$"===t&&(n=/([^\$])(\$(\{.*?\}|[\w\.]+))/),e.content=Prism.highlight(e.content,{expression:{pattern:n,lookbehind:!0,inside:Prism.languages.groovy}}),e.classes.push("/"===t?"regex":"gstring")}}});; +Prism.languages.http={"request-line":{pattern:/^(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\b\shttps?:\/\/\S+\sHTTP\/[0-9.]+/g,inside:{property:/^\b(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\b/g,"attr-name":/:\w+/g}},"response-status":{pattern:/^HTTP\/1.[01] [0-9]+.*/g,inside:{property:/[0-9]+[A-Z\s-]+$/g}},keyword:/^[\w-]+:(?=.+)/gm};var httpLanguages={"application/json":Prism.languages.javascript,"application/xml":Prism.languages.markup,"text/xml":Prism.languages.markup,"text/html":Prism.languages.markup};for(var contentType in httpLanguages)if(httpLanguages[contentType]){var options={};options[contentType]={pattern:new RegExp("(content-type:\\s*"+contentType+"[\\w\\W]*?)\\n\\n[\\w\\W]*","gi"),lookbehind:!0,inside:{rest:httpLanguages[contentType]}},Prism.languages.insertBefore("http","keyword",options)}; +Prism.languages.ruby=Prism.languages.extend("clike",{comment:/#[^\r\n]*(\r?\n|$)/g,keyword:/\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/g,builtin:/\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z][a-zA-Z_0-9]*[?!]?\b/g}),Prism.languages.insertBefore("ruby","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,lookbehind:!0},variable:/[@$]+\b[a-zA-Z_][a-zA-Z_0-9]*[?!]?\b/g,symbol:/:\b[a-zA-Z_][a-zA-Z_0-9]*[?!]?\b/g});; +Prism.languages.csharp=Prism.languages.extend("clike",{keyword:/\b(abstract|as|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\b/g,string:/@?("|')(\\?.)*?\1/g,preprocessor:/^\s*#.*/gm,number:/\b-?(0x)?\d*\.?\d+\b/g});; +Prism.languages.go=Prism.languages.extend("clike",{keyword:/\b(break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/g,builtin:/\b(bool|byte|complex(64|128)|error|float(32|64)|rune|string|u?int(8|16|32|64|)|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(ln)?|real|recover)\b/g,"boolean":/\b(_|iota|nil|true|false)\b/g,operator:/([(){}\[\]]|[*\/%^!]=?|\+[=+]?|-[>=-]?|\|[=|]?|>[=>]?|<(<|[=-])?|==?|&(&|=|^=?)?|\.(\.\.)?|[,;]|:=?)/g,number:/\b(-?(0x[a-f\d]+|(\d+\.?\d*|\.\d+)(e[-+]?\d+)?)i?)\b/gi,string:/("|'|`)(\\?.|\r|\n)*?\1/g}),delete Prism.languages.go["class-name"];; +Prism.languages.scala=Prism.languages.extend("java",{keyword:/(<-|=>)|\b(abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\b/g,builtin:/\b(String|Int|Long|Short|Byte|Boolean|Double|Float|Char|Any|AnyRef|AnyVal|Unit|Nothing)\b/g,number:/\b0x[\da-f]*\.?[\da-f\-]+\b|\b\d*\.?\d+[e]?[\d]*[dfl]?\b/gi,symbol:/'([^\d\s]\w*)/g,string:/(""")[\W\w]*?\1|("|\/)[\W\w]*?\2|('.')/g}),delete Prism.languages.scala["function"];; +Prism.languages.objectivec=Prism.languages.extend("c",{keyword:/(\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while|in|self|super)\b)|((?=[\w|@])(@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b)/g,string:/(?:("|')([^\n\\\1]|\\.|\\\r*\n)*?\1)|(@"([^\n\\"]|\\.|\\\r*\n)*?")/g,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\/|@/g});; +Prism.languages.ini={comment:/^\s*;.*$/gm,important:/\[.*?\]/gm,constant:/^\s*[^\s\=]+?(?=[ \t]*\=)/gm,"attr-value":{pattern:/\=.*/gm,inside:{punctuation:/^[\=]/g}}};; +Prism.languages.latex={comment:/%.*?(\r?\n|$)$/m,string:/(\$)(\\?.)*?\1/g,punctuation:/[{}]/g,selector:/\\[a-z;,:\.]*/i};; +Prism.languages.git={comment:/^#.*$/m,string:/("|')(\\?.)*?\1/gm,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s(--|-)\w+/m}},coord:/^@@.*@@$/m,deleted:/^-(?!-).+$/m,inserted:/^\+(?!\+).+$/m,commit_sha1:/^commit \w{40}$/m} +Prism.languages.xml=Prism.languages.extend('markup',{}); +Prism.languages.json=Prism.languages.extend('javascript',{}); +; +Prism.hooks.add("after-highlight",function(e){var n=e.element.parentNode;if(n&&/pre/i.test(n.nodeName)&&-1!==n.className.indexOf("line-numbers")){var t,a=1+e.code.split("\n").length;lines=new Array(a),lines=lines.join(""),t=document.createElement("span"),t.className="line-numbers-rows",t.innerHTML=lines,n.hasAttribute("data-start")&&(n.style.counterReset="linenumber "+(parseInt(n.getAttribute("data-start"),10)-1)),e.element.appendChild(t)}});; +!function(){if(self.Prism){var a={csharp:"C#",cpp:"C++"};Prism.hooks.add("before-highlight",function(e){var t=a[e.language]||e.language;e.element.setAttribute("data-language",t)})}}();; diff --git a/preview/assets/javascripts/vendor/radio.js b/preview/assets/javascripts/vendor/radio.js new file mode 100644 index 0000000..a6ce52c --- /dev/null +++ b/preview/assets/javascripts/vendor/radio.js @@ -0,0 +1,176 @@ +/** + Radio.js - Chainable, Dependency Free Publish/Subscribe for Javascript + http://radio.uxder.com + Author: Scott Murphy 2011 + twitter: @hellocreation, github: uxder + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ +(function (name, global, definition) { + if (typeof module !== 'undefined') module.exports = definition(name, global); + else if (typeof define === 'function' && typeof define.amd === 'object') define(definition); + else global[name] = definition(name, global); +})('radio', this, function (name, global) { + + "use strict"; + + /** + * Main Wrapper for radio.$ and create a function radio to accept the channelName + * @param {String} channelName topic of event + */ + function radio(channelName) { + arguments.length ? radio.$.channel(channelName) : radio.$.reset(); + return radio.$; + } + + radio.$ = { + version: '0.2', + channelName: "", + channels: [], + + /** + * Reset global state, by removing all channels + * @example + * radio() + */ + reset: function() { + radio.$.channelName = ""; + radio.$.channels = []; + }, + + /** + * Broadcast (publish) + * Iterate through all listeners (callbacks) in current channel and pass arguments to subscribers + * @param arguments data to be sent to listeners + * @example + * //basic usage + * radio('channel1').broadcast('my message'); + * //send an unlimited number of parameters + * radio('channel2').broadcast(param1, param2, param3 ... ); + */ + broadcast: function() { + var i, c = this.channels[this.channelName], + l = c.length, + subscriber, callback, context; + //iterate through current channel and run each subscriber + for (i = 0; i < l; i++) { + subscriber = c[i]; + //if subscriber was an array, set the callback and context. + if ((typeof(subscriber) === 'object') && (subscriber.length)) { + callback = subscriber[0]; + //if user set the context, set it to the context otherwise, it is a globally scoped function + context = subscriber[1] || global; + } + callback.apply(context, arguments); + } + return this; + }, + + /** + * Create the channel if it doesn't exist and set the current channel/event name + * @param {String} name the name of the channel + * @example + * radio('channel1'); + */ + channel: function(name) { + var c = this.channels; + //create a new channel if it doesn't exists + if (!c[name]) c[name] = []; + this.channelName = name; + return this; + }, + + /** + * Add Subscriber to channel + * Take the arguments and add it to the this.channels array. + * @param {Function|Array} arguments list of callbacks or arrays[callback, context] separated by commas + * @example + * //basic usage + * var callback = function() {}; + * radio('channel1').subscribe(callback); + * + * //subscribe an endless amount of callbacks + * radio('channel1').subscribe(callback, callback2, callback3 ...); + * + * //adding callbacks with context + * radio('channel1').subscribe([callback, context],[callback1, context], callback3); + * + * //subscribe by chaining + * radio('channel1').subscribe(callback).radio('channel2').subscribe(callback).subscribe(callback2); + */ + subscribe: function() { + var a = arguments, + c = this.channels[this.channelName], + i, l = a.length, + p, ai = []; + + //run through each arguments and subscribe it to the channel + for (i = 0; i < l; i++) { + ai = a[i]; + //if the user sent just a function, wrap the fucntion in an array [function] + p = (typeof(ai) === "function") ? [ai] : ai; + if ((typeof(p) === 'object') && (p.length)) c.push(p); + } + return this; + }, + + /** + * Remove subscriber from channel + * Take arguments with functions and unsubscribe it if there is a match against existing subscribers. + * @param {Function} arguments callbacks separated by commas + * @example + * //basic usage + * radio('channel1').unsubscribe(callback); + * //you can unsubscribe as many callbacks as you want + * radio('channel1').unsubscribe(callback, callback2, callback3 ...); + * //removing callbacks with context is the same + * radio('channel1').subscribe([callback, context]).unsubscribe(callback); + */ + unsubscribe: function() { + var a = arguments, + i, j, c = this.channels[this.channelName], + l = a.length, + cl = c.length, + offset = 0, + jo; + //loop through each argument + for (i = 0; i < l; i++) { + //need to reset vars that change as the channel array items are removed + offset = 0; + cl = c.length; + //loop through the channel + for (j = 0; j < cl; j++) { + jo = j - offset; + //if there is a match with the argument and the channel function, unsubscribe it from the channel array + if (c[jo][0] === a[i]) { + //unsubscribe matched item from the channel array + c.splice(jo, 1); + offset++; + } + } + } + return this; + } + }; + + return radio; +}); \ No newline at end of file diff --git a/preview/assets/javascripts/vendor/require.js b/preview/assets/javascripts/vendor/require.js new file mode 100644 index 0000000..e6244f1 --- /dev/null +++ b/preview/assets/javascripts/vendor/require.js @@ -0,0 +1,36 @@ +/* + RequireJS 2.1.14 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved. + Available via the MIT or new BSD license. + see: http://github.com/jrburke/requirejs for details +*/ +var requirejs,require,define; +(function(ba){function G(b){return"[object Function]"===K.call(b)}function H(b){return"[object Array]"===K.call(b)}function v(b,c){if(b){var d;for(d=0;dthis.depCount&&!this.defined){if(G(l)){if(this.events.error&&this.map.isDefine||g.onError!==ca)try{f=i.execCb(c,l,b,f)}catch(d){a=d}else f=i.execCb(c,l,b,f);this.map.isDefine&&void 0===f&&((b=this.module)?f=b.exports:this.usingExports&& +(f=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",w(this.error=a)}else f=l;this.exports=f;if(this.map.isDefine&&!this.ignore&&(r[c]=f,g.onResourceLoad))g.onResourceLoad(i,this.map,this.depMaps);y(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a= +this.map,b=a.id,d=p(a.prefix);this.depMaps.push(d);q(d,"defined",u(this,function(f){var l,d;d=m(aa,this.map.id);var e=this.map.name,P=this.map.parentMap?this.map.parentMap.name:null,n=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(f.normalize&&(e=f.normalize(e,function(a){return c(a,P,!0)})||""),f=p(a.prefix+"!"+e,this.map.parentMap),q(f,"defined",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=m(h,f.id)){this.depMaps.push(f); +if(this.events.error)d.on("error",u(this,function(a){this.emit("error",a)}));d.enable()}}else d?(this.map.url=i.nameToUrl(d),this.load()):(l=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),l.error=u(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];B(h,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&y(a.map.id)});w(a)}),l.fromText=u(this,function(f,c){var d=a.name,e=p(d),P=M;c&&(f=c);P&&(M=!1);s(e);t(j.config,b)&&(j.config[d]=j.config[b]);try{g.exec(f)}catch(h){return w(C("fromtexteval", +"fromText eval for "+b+" failed: "+h,h,[b]))}P&&(M=!0);this.depMaps.push(e);i.completeLoad(d);n([d],l)}),f.load(a.name,n,l,j))}));i.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){V[this.map.id]=this;this.enabling=this.enabled=!0;v(this.depMaps,u(this,function(a,b){var c,f;if("string"===typeof a){a=p(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=m(L,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;q(a,"defined",u(this,function(a){this.defineDep(b, +a);this.check()}));this.errback&&q(a,"error",u(this,this.errback))}c=a.id;f=h[c];!t(L,c)&&(f&&!f.enabled)&&i.enable(a,this)}));B(this.pluginMaps,u(this,function(a){var b=m(h,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){v(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};i={config:j,contextName:b,registry:h,defined:r,urlFetched:S,defQueue:A,Module:Z,makeModuleMap:p, +nextTick:g.nextTick,onError:w,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=j.shim,c={paths:!0,bundles:!0,config:!0,map:!0};B(a,function(a,b){c[b]?(j[b]||(j[b]={}),U(j[b],a,!0,!0)):j[b]=a});a.bundles&&B(a.bundles,function(a,b){v(a,function(a){a!==b&&(aa[a]=b)})});a.shim&&(B(a.shim,function(a,c){H(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);b[c]=a}),j.shim=b);a.packages&&v(a.packages,function(a){var b, +a="string"===typeof a?{name:a}:a;b=a.name;a.location&&(j.paths[b]=a.location);j.pkgs[b]=a.name+"/"+(a.main||"main").replace(ia,"").replace(Q,"")});B(h,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=p(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ba,arguments));return b||a.exports&&da(a.exports)}},makeRequire:function(a,e){function j(c,d,m){var n,q;e.enableBuildCallback&&(d&&G(d))&&(d.__requireJsBuild= +!0);if("string"===typeof c){if(G(d))return w(C("requireargs","Invalid require call"),m);if(a&&t(L,c))return L[c](h[a.id]);if(g.get)return g.get(i,c,a,j);n=p(c,a,!1,!0);n=n.id;return!t(r,n)?w(C("notloaded",'Module name "'+n+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):r[n]}J();i.nextTick(function(){J();q=s(p(null,a));q.skipMap=e.skipMap;q.init(c,d,m,{enabled:!0});D()});return j}e=e||{};U(j,{isBrowser:z,toUrl:function(b){var d,e=b.lastIndexOf("."),k=b.split("/")[0];if(-1!== +e&&(!("."===k||".."===k)||1e.attachEvent.toString().indexOf("[native code"))&&!Y?(M=!0,e.attachEvent("onreadystatechange",b.onScriptLoad)): +(e.addEventListener("load",b.onScriptLoad,!1),e.addEventListener("error",b.onScriptError,!1)),e.src=d,J=e,D?y.insertBefore(e,D):y.appendChild(e),J=null,e;if(ea)try{importScripts(d),b.completeLoad(c)}catch(m){b.onError(C("importscripts","importScripts failed for "+c+" at "+d,m,[c]))}};z&&!q.skipDataMain&&T(document.getElementsByTagName("script"),function(b){y||(y=b.parentNode);if(I=b.getAttribute("data-main"))return s=I,q.baseUrl||(E=s.split("/"),s=E.pop(),O=E.length?E.join("/")+"/":"./",q.baseUrl= +O),s=s.replace(Q,""),g.jsExtRegExp.test(s)&&(s=I),q.deps=q.deps?q.deps.concat(s):[s],!0});define=function(b,c,d){var e,g;"string"!==typeof b&&(d=c,c=b,b=null);H(c)||(d=c,c=null);!c&&G(d)&&(c=[],d.length&&(d.toString().replace(ka,"").replace(la,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));if(M){if(!(e=J))N&&"interactive"===N.readyState||T(document.getElementsByTagName("script"),function(b){if("interactive"===b.readyState)return N=b}),e=N;e&&(b|| +(b=e.getAttribute("data-requiremodule")),g=F[e.getAttribute("data-requirecontext")])}(g?g.defQueue:R).push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(q)}})(this); \ No newline at end of file diff --git a/preview/assets/javascripts/vendor/smooth-scroll.js b/preview/assets/javascripts/vendor/smooth-scroll.js new file mode 100644 index 0000000..8b6f7dd --- /dev/null +++ b/preview/assets/javascripts/vendor/smooth-scroll.js @@ -0,0 +1,393 @@ +/** + * smooth-scroll v5.1.2 + * Animate scrolling to anchor links, by Chris Ferdinandi. + * http://github.com/cferdinandi/smooth-scroll + * + * Free to use under the MIT License. + * http://gomakethings.com/mit/ + */ + +(function (root, factory) { + if ( typeof define === 'function' && define.amd ) { + define([], factory(root)); + } else if ( typeof exports === 'object' ) { + module.exports = factory(root); + } else { + root.smoothScroll = factory(root); + } +})(this, function (root) { + + 'use strict'; + + // + // Variables + // + + var smoothScroll = {}; // Object for public APIs + var supports = !!document.querySelector && !!root.addEventListener; // Feature test + var settings; + + // Default settings + var defaults = { + speed: 500, + easing: 'easeInOutCubic', + offset: 0, + updateURL: true, + callbackBefore: function () {}, + callbackAfter: function () {} + }; + + + // + // Methods + // + + /** + * A simple forEach() implementation for Arrays, Objects and NodeLists + * @private + * @param {Array|Object|NodeList} collection Collection of items to iterate + * @param {Function} callback Callback function for each iteration + * @param {Array|Object|NodeList} scope Object/NodeList/Array that forEach is iterating over (aka `this`) + */ + var forEach = function (collection, callback, scope) { + if (Object.prototype.toString.call(collection) === '[object Object]') { + for (var prop in collection) { + if (Object.prototype.hasOwnProperty.call(collection, prop)) { + callback.call(scope, collection[prop], prop, collection); + } + } + } else { + for (var i = 0, len = collection.length; i < len; i++) { + callback.call(scope, collection[i], i, collection); + } + } + }; + + /** + * Merge defaults with user options + * @private + * @param {Object} defaults Default settings + * @param {Object} options User options + * @returns {Object} Merged values of defaults and options + */ + var extend = function ( defaults, options ) { + var extended = {}; + forEach(defaults, function (value, prop) { + extended[prop] = defaults[prop]; + }); + forEach(options, function (value, prop) { + extended[prop] = options[prop]; + }); + return extended; + }; + + /** + * Get the closest matching element up the DOM tree + * @param {Element} elem Starting element + * @param {String} selector Selector to match against (class, ID, or data attribute) + * @return {Boolean|Element} Returns false if not match found + */ + var getClosest = function (elem, selector) { + var firstChar = selector.charAt(0); + for ( ; elem && elem !== document; elem = elem.parentNode ) { + if ( firstChar === '.' ) { + if ( elem.classList.contains( selector.substr(1) ) ) { + return elem; + } + } else if ( firstChar === '#' ) { + if ( elem.id === selector.substr(1) ) { + return elem; + } + } else if ( firstChar === '[' ) { + if ( elem.hasAttribute( selector.substr(1, selector.length - 2) ) ) { + return elem; + } + } + } + return false; + }; + + /** + * Escape special characters for use with querySelector + * @private + * @param {String} id The anchor ID to escape + * @author Mathias Bynens + * @link https://github.com/mathiasbynens/CSS.escape + */ + var escapeCharacters = function ( id ) { + var string = String(id); + var length = string.length; + var index = -1; + var codeUnit; + var result = ''; + var firstCodeUnit = string.charCodeAt(0); + while (++index < length) { + codeUnit = string.charCodeAt(index); + // Note: there’s no need to special-case astral symbols, surrogate + // pairs, or lone surrogates. + + // If the character is NULL (U+0000), then throw an + // `InvalidCharacterError` exception and terminate these steps. + if (codeUnit === 0x0000) { + throw new InvalidCharacterError( + 'Invalid character: the input contains U+0000.' + ); + } + + if ( + // If the character is in the range [\1-\1F] (U+0001 to U+001F) or is + // U+007F, […] + (codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F || + // If the character is the first character and is in the range [0-9] + // (U+0030 to U+0039), […] + (index === 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) || + // If the character is the second character and is in the range [0-9] + // (U+0030 to U+0039) and the first character is a `-` (U+002D), […] + ( + index === 1 && + codeUnit >= 0x0030 && codeUnit <= 0x0039 && + firstCodeUnit === 0x002D + ) + ) { + // http://dev.w3.org/csswg/cssom/#escape-a-character-as-code-point + result += '\\' + codeUnit.toString(16) + ' '; + continue; + } + + // If the character is not handled by one of the above rules and is + // greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or + // is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to + // U+005A), or [a-z] (U+0061 to U+007A), […] + if ( + codeUnit >= 0x0080 || + codeUnit === 0x002D || + codeUnit === 0x005F || + codeUnit >= 0x0030 && codeUnit <= 0x0039 || + codeUnit >= 0x0041 && codeUnit <= 0x005A || + codeUnit >= 0x0061 && codeUnit <= 0x007A + ) { + // the character itself + result += string.charAt(index); + continue; + } + + // Otherwise, the escaped character. + // http://dev.w3.org/csswg/cssom/#escape-a-character + result += '\\' + string.charAt(index); + + } + return result; + }; + + /** + * Calculate the easing pattern + * @private + * @param {String} type Easing pattern + * @param {Number} time Time animation should take to complete + * @returns {Number} + */ + var easingPattern = function ( type, time ) { + var pattern; + if ( type === 'easeInQuad' ) pattern = time * time; // accelerating from zero velocity + if ( type === 'easeOutQuad' ) pattern = time * (2 - time); // decelerating to zero velocity + if ( type === 'easeInOutQuad' ) pattern = time < 0.5 ? 2 * time * time : -1 + (4 - 2 * time) * time; // acceleration until halfway, then deceleration + if ( type === 'easeInCubic' ) pattern = time * time * time; // accelerating from zero velocity + if ( type === 'easeOutCubic' ) pattern = (--time) * time * time + 1; // decelerating to zero velocity + if ( type === 'easeInOutCubic' ) pattern = time < 0.5 ? 4 * time * time * time : (time - 1) * (2 * time - 2) * (2 * time - 2) + 1; // acceleration until halfway, then deceleration + if ( type === 'easeInQuart' ) pattern = time * time * time * time; // accelerating from zero velocity + if ( type === 'easeOutQuart' ) pattern = 1 - (--time) * time * time * time; // decelerating to zero velocity + if ( type === 'easeInOutQuart' ) pattern = time < 0.5 ? 8 * time * time * time * time : 1 - 8 * (--time) * time * time * time; // acceleration until halfway, then deceleration + if ( type === 'easeInQuint' ) pattern = time * time * time * time * time; // accelerating from zero velocity + if ( type === 'easeOutQuint' ) pattern = 1 + (--time) * time * time * time * time; // decelerating to zero velocity + if ( type === 'easeInOutQuint' ) pattern = time < 0.5 ? 16 * time * time * time * time * time : 1 + 16 * (--time) * time * time * time * time; // acceleration until halfway, then deceleration + return pattern || time; // no easing, no acceleration + }; + + /** + * Calculate how far to scroll + * @private + * @param {Element} anchor The anchor element to scroll to + * @param {Number} headerHeight Height of a fixed header, if any + * @param {Number} offset Number of pixels by which to offset scroll + * @returns {Number} + */ + var getEndLocation = function ( anchor, headerHeight, offset ) { + var location = 0; + if (anchor.offsetParent) { + do { + location += anchor.offsetTop; + anchor = anchor.offsetParent; + } while (anchor); + } + location = location - headerHeight - offset; + return location >= 0 ? location : 0; + }; + + /** + * Determine the document's height + * @private + * @returns {Number} + */ + var getDocumentHeight = function () { + return Math.max( + document.body.scrollHeight, document.documentElement.scrollHeight, + document.body.offsetHeight, document.documentElement.offsetHeight, + document.body.clientHeight, document.documentElement.clientHeight + ); + }; + + /** + * Convert data-options attribute into an object of key/value pairs + * @private + * @param {String} options Link-specific options as a data attribute string + * @returns {Object} + */ + var getDataOptions = function ( options ) { + return !options || !(typeof JSON === 'object' && typeof JSON.parse === 'function') ? {} : JSON.parse( options ); + }; + + /** + * Update the URL + * @private + * @param {Element} anchor The element to scroll to + * @param {Boolean} url Whether or not to update the URL history + */ + var updateUrl = function ( anchor, url ) { + if ( history.pushState && (url || url === 'true') ) { + history.pushState( { + pos: anchor.id + }, '', window.location.pathname + anchor ); + } + }; + + /** + * Start/stop the scrolling animation + * @public + * @param {Element} toggle The element that toggled the scroll event + * @param {Element} anchor The element to scroll to + * @param {Object} settings + * @param {Event} event + */ + smoothScroll.animateScroll = function ( toggle, anchor, options ) { + + // Options and overrides + var settings = extend( settings || defaults, options || {} ); // Merge user options with defaults + var overrides = getDataOptions( toggle ? toggle.getAttribute('data-options') : null ); + settings = extend( settings, overrides ); + anchor = '#' + escapeCharacters(anchor.substr(1)); // Escape special characters and leading numbers + + // Selectors and variables + var fixedHeader = document.querySelector('[data-scroll-header]'); // Get the fixed header + var headerHeight = fixedHeader === null ? 0 : (fixedHeader.offsetHeight + fixedHeader.offsetTop); // Get the height of a fixed header if one exists + var startLocation = root.pageYOffset; // Current location on the page + var endLocation = getEndLocation( document.querySelector(anchor), headerHeight, parseInt(settings.offset, 10) ); // Scroll to location + var animationInterval; // interval timer + var distance = endLocation - startLocation; // distance to travel + var documentHeight = getDocumentHeight(); + var timeLapsed = 0; + var percentage, position; + + // Update URL + updateUrl(anchor, settings.updateURL); + + /** + * Stop the scroll animation when it reaches its target (or the bottom/top of page) + * @private + * @param {Number} position Current position on the page + * @param {Number} endLocation Scroll to location + * @param {Number} animationInterval How much to scroll on this loop + */ + var stopAnimateScroll = function (position, endLocation, animationInterval) { + var currentLocation = root.pageYOffset; + if ( position == endLocation || currentLocation == endLocation || ( (root.innerHeight + currentLocation) >= documentHeight ) ) { + clearInterval(animationInterval); + settings.callbackAfter( toggle, anchor ); // Run callbacks after animation complete + } + }; + + /** + * Loop scrolling animation + * @private + */ + var loopAnimateScroll = function () { + timeLapsed += 16; + percentage = ( timeLapsed / parseInt(settings.speed, 10) ); + percentage = ( percentage > 1 ) ? 1 : percentage; + position = startLocation + ( distance * easingPattern(settings.easing, percentage) ); + root.scrollTo( 0, Math.floor(position) ); + stopAnimateScroll(position, endLocation, animationInterval); + }; + + /** + * Set interval timer + * @private + */ + var startAnimateScroll = function () { + settings.callbackBefore( toggle, anchor ); // Run callbacks before animating scroll + animationInterval = setInterval(loopAnimateScroll, 16); + }; + + /** + * Reset position to fix weird iOS bug + * @link https://github.com/cferdinandi/smooth-scroll/issues/45 + */ + if ( root.pageYOffset === 0 ) { + root.scrollTo( 0, 0 ); + } + + // Start scrolling animation + startAnimateScroll(); + + }; + + /** + * If smooth scroll element clicked, animate scroll + * @private + */ + var eventHandler = function (event) { + var toggle = getClosest(event.target, '[data-scroll]'); + if ( toggle && toggle.tagName.toLowerCase() === 'a' ) { + event.preventDefault(); // Prevent default click event + smoothScroll.animateScroll( toggle, toggle.hash, settings, event ); // Animate scroll + } + }; + + /** + * Destroy the current initialization. + * @public + */ + smoothScroll.destroy = function () { + if ( !settings ) return; + document.removeEventListener( 'click', eventHandler, false ); + settings = null; + }; + + /** + * Initialize Smooth Scroll + * @public + * @param {Object} options User settings + */ + smoothScroll.init = function ( options ) { + + // feature test + if ( !supports ) return; + + // Destroy any existing initializations + smoothScroll.destroy(); + + // Selectors and variables + settings = extend( defaults, options || {} ); // Merge user options with defaults + + // When a toggle is clicked, run the click handler + document.addEventListener('click', eventHandler, false); + + }; + + + // + // Public APIs + // + + return smoothScroll; + +}); diff --git a/preview/assets/stylesheets/application.css b/preview/assets/stylesheets/application.css new file mode 100644 index 0000000..4f6b60b --- /dev/null +++ b/preview/assets/stylesheets/application.css @@ -0,0 +1,5096 @@ +@charset "UTF-8"; +/* + image naming convention: + desktop: image.png + mobile: image--sm.png + mobile retina: image--sm--2x.png + $image: '../images/slide' image path plus name fragment + $ext: 'png' +*/ +/* line 1, ../sass/placeholder_selectors/_clear.scss */ +.blog-entry-meta dl, .blog-entry-meta ul, .company-hq-details__content, .contactblock__content, .customer-grouping__items, .developer-portal-logo-grid__items, .download-table__header, .event-date-location__wrapper, .featured-speakers__items, .featured-speakers__item, .icon-link-grid__items, .link-block, .logo-grid__items, .pagination__items, .related-content__items, .sales-offices .sales-offices__items, .stats--contained__content ul, .stats__content ul, .toggle-group, .developer-portal-global-content, .developer-portal-header__hgroup, .developer-portal-header__navigation__items, .developer-portal-sidebar__navigation__wrapper a, .developer-portal-sidebar__versions a, .developer-portal-sidebar__versions__toggler, .global-footer, .global-footer__contact, .global-footer__contact__social, .global-header, .global-sub-footer, .homepage-products__content ul, .homepage-promos, .footer-navigation, .primary-navigation__items { + zoom: 1; +} +/* line 4, ../sass/placeholder_selectors/_clear.scss */ +.blog-entry-meta dl:after, .blog-entry-meta ul:after, .company-hq-details__content:after, .contactblock__content:after, .customer-grouping__items:after, .developer-portal-logo-grid__items:after, .download-table__header:after, .event-date-location__wrapper:after, .featured-speakers__items:after, .featured-speakers__item:after, .icon-link-grid__items:after, .link-block:after, .logo-grid__items:after, .pagination__items:after, .related-content__items:after, .sales-offices .sales-offices__items:after, .stats--contained__content ul:after, .stats__content ul:after, .toggle-group:after, .developer-portal-global-content:after, .developer-portal-header__hgroup:after, .developer-portal-header__navigation__items:after, .developer-portal-sidebar__navigation__wrapper a:after, .developer-portal-sidebar__versions a:after, .developer-portal-sidebar__versions__toggler:after, .global-footer:after, .global-footer__contact:after, .global-footer__contact__social:after, .global-header:after, .global-sub-footer:after, .homepage-products__content ul:after, .homepage-promos:after, .footer-navigation:after, .primary-navigation__items:after { + clear: both; + content: ""; + display: table; +} + +/* line 1, ../sass/placeholder_selectors/_image-replace.scss */ +.blog-entry-meta .share-icon, .carousel__navigation--next span, +.carousel__navigation--previous span, .pagination__item--next b, +.pagination__item--previous b, .videoblock__button span, .developer-portal-header__logo a, .developer-portal-header__search button span, .global-footer__contact__social a, .global-header-search button span, .global-header__logo a, .product-section__nav__logo a { + overflow: hidden; + text-indent: 100%; + text-shadow: none; + white-space: nowrap; +} + +/* line 1, ../sass/placeholder_selectors/_ui-list.scss */ +.blog-entry-meta ul, .customer-grouping__items, .developer-portal-logo-grid__items, .download-intro__wrapper ul, .download-section__content .links, .download-section__links .download-links, .download-table, .featured-speakers__items, .icon-link-grid__items, .logo-grid__items, .pagination__items, .pricing-icon-list__items, .related-content__items, .sales-offices .sales-offices__items, .sponsor-grid__items, .stats--contained__content ul, .stats .stats__content ul, .toggle-group, .developer-portal-header__navigation__items, .developer-portal-header__search ul, .developer-portal-sidebar__navigation__wrapper ul, .developer-portal-sidebar__versions ul, .global-footer__contact__social, .global-header-search ul, .homepage-customers__items, .homepage-get-started__content ul, .homepage-products__content ul, .homepage-products__actions ul, .footer-navigation__items, .primary-navigation__items, .secondary-navigation__items { + list-style: none; + margin: 0; + padding: 0; +} + +@-ms-viewport { + width: device-width; +} +/* line 5, ../sass/base/_elements.scss */ +*, +*:before, +*:after { + box-sizing: inherit; +} + +/* line 11, ../sass/base/_elements.scss */ +html { + box-sizing: border-box; + -webkit-text-size-adjust: 100%; +} + +/* line 16, ../sass/base/_elements.scss */ +body { + font-family: "Kievit OT", sans-serif; + color: #000; + margin: 0; +} + +/* @group HTML5 elements */ +/* line 24, ../sass/base/_elements.scss */ +article, +figure, +footer, +header, +main { + display: block; +} + +/* @end */ +/* @group Links */ +/* line 36, ../sass/base/_elements.scss */ +a { + background: none; + color: #ec1e2c; + text-decoration: none; +} +/* line 41, ../sass/base/_elements.scss */ +a:focus, a:hover { + color: #d7181b; +} + +/* @end */ +/* @group Text-level semantics */ +/* line 51, ../sass/base/_elements.scss */ +b, +strong { + font-weight: 700; +} + +/* @end */ +/* @group Embedded content */ +/* line 60, ../sass/base/_elements.scss */ +img { + border: 0; + -ms-interpolation-mode: bicubic; + vertical-align: middle; +} + +/* @end */ +/* @group Grouping content */ +/* line 70, ../sass/base/_elements.scss */ +hr { + background: #ec1e2c; + border: 0; + height: 2px; + margin: 3em auto; + width: 2em; +} +/* line 77, ../sass/base/_elements.scss */ +hr.wide { + background: #cccccc; + border: solid #fff; + border-width: 0 1em; + max-width: 52em; + width: 100%; +} + +/* @end */ +/* @group Forms */ +/* line 90, ../sass/base/_elements.scss */ +button, +input, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} + +/* line 99, ../sass/base/_elements.scss */ +button { + overflow: visible; +} + +/* line 103, ../sass/base/_elements.scss */ +button, +select { + text-transform: none; +} + +/* line 108, ../sass/base/_elements.scss */ +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} + +/* line 116, ../sass/base/_elements.scss */ +button[disabled], +html input[disabled] { + cursor: default; +} + +/* line 121, ../sass/base/_elements.scss */ +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/* line 127, ../sass/base/_elements.scss */ +input { + line-height: normal; +} + +/* line 131, ../sass/base/_elements.scss */ +input[type="checkbox"], +input[type="radio"] { + padding: 0; +} + +/* line 136, ../sass/base/_elements.scss */ +input[type="search"] { + -webkit-appearance: textfield; +} +/* line 139, ../sass/base/_elements.scss */ +input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* line 145, ../sass/base/_elements.scss */ +textarea { + overflow: auto; +} + +/* @end */ +@font-face { + font-family: "Kievit OT"; + font-style: normal; + font-weight: normal; + src: url("../fonts/kievitot-regular.eot"); + src: url("../fonts/kievitot-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/kievitot-regular.woff") format("woff"); +} +@font-face { + font-family: "Kievit OT"; + font-style: normal; + font-weight: bold; + src: url("../fonts/kievitot-bold.eot"); + src: url("../fonts/kievitot-bold.eot?#iefix") format("embedded-opentype"), url("../fonts/kievitot-bold.woff") format("woff"); +} +@font-face { + font-family: "Kievit OT"; + font-style: italic; + font-weight: normal; + src: url("../fonts/kievitot-italic.eot"); + src: url("../fonts/kievitot-italic.eot?#iefix") format("embedded-opentype"), url("../fonts/kievitot-italic.woff") format("woff"); +} +@font-face { + font-family: "Kievit OT"; + font-style: italic; + font-weight: bold; + src: url("../fonts/kievitot-bolditalic.eot"); + src: url("../fonts/kievitot-bolditalic.eot?#iefix") format("embedded-opentype"), url("../fonts/kievitot-bolditalic.woff") format("woff"); +} +/* line 1, ../sass/components/_article-listing.scss */ +.article-listing__header { + margin: 0 auto 1em auto; + max-width: 52em; + padding: 0 1em; +} + +/* line 7, ../sass/components/_article-listing.scss */ +.article-listing__header__title { + font-size: 32px; + font-weight: normal; + margin: 0; + text-align: center; +} + +/* line 1, ../sass/components/_article.scss */ +.article__wrapper { + margin: 0 auto; + max-width: 52em; + padding: 0 1em 3em 1em; + position: relative; +} + +/* line 8, ../sass/components/_article.scss */ +.article__header { + padding: 3em 0 0 0; +} +/* line 11, ../sass/components/_article.scss */ +.article + .article .article__header { + border-top: 2px solid #bfbfbf; +} + +/* line 16, ../sass/components/_article.scss */ +.article__title { + font-size: 28px; + margin: 0; +} + +/* line 21, ../sass/components/_article.scss */ +.article__meta { + font-weight: bold; + margin: 0.5em 0; +} + +/* line 26, ../sass/components/_article.scss */ +.article__avatar { + border-radius: 50%; + display: none; + left: -5em; + position: absolute; + top: 3em; +} +@media (min-width: 65.5em) { + /* line 26, ../sass/components/_article.scss */ + .article__avatar { + display: block; + } +} + +/* line 38, ../sass/components/_article.scss */ +.article__content { + line-height: 1.6; + margin: 1em 0; +} + +/* line 43, ../sass/components/_article.scss */ +.article__footer { + margin-top: 1.5em; +} +/* line 46, ../sass/components/_article.scss */ +.article__footer a { + background: url("../images/icons/article-arrow.png") no-repeat 100% 40%; + display: inline-block; + font-weight: bold; + padding-right: 1em; + text-transform: uppercase; +} + +/* line 1, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta { + margin: 3em auto; + max-width: 52em; + padding: 0 1em; +} +/* line 10, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta dt { + font-weight: bold; + margin-bottom: 0.5em; +} +@media (min-width: 40em) { + /* line 10, ../sass/components/_blog-entry-meta.scss */ + .blog-entry-meta dt { + float: left; + padding-top: 0.5em; + width: 4em; + } +} +/* line 21, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta dd { + margin: 0 0 1.5em 0; +} +@media (min-width: 40em) { + /* line 21, ../sass/components/_blog-entry-meta.scss */ + .blog-entry-meta dd { + margin-left: 4em; + } +} +/* line 34, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta li { + float: left; + margin: 0 0.5em 0.5em 0; +} +/* line 39, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta .tag { + background: #7bbdcb; + border-radius: 0.25em; + color: #fff; + display: inline-block; + padding: 0.5em 1em; + white-space: nowrap; + text-transform: uppercase; +} +/* line 48, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta .tag:focus, .blog-entry-meta .tag:hover { + background: #8ec5d2; +} +/* line 54, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta .share-icon { + background: no-repeat 50% 50%; + display: inline-block; + height: 2em; + width: 2em; +} +/* line 63, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta .share-icon--twitter { + background-image: url("../images/icons/share-twitter.png"); +} +/* line 63, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta .share-icon--facebook { + background-image: url("../images/icons/share-facebook.png"); +} +/* line 63, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta .share-icon--reddit { + background-image: url("../images/icons/share-reddit.png"); +} +/* line 63, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta .share-icon--email { + background-image: url("../images/icons/share-email.png"); +} + +/* line 1, ../sass/components/_buttonblock.scss */ +.buttonblock { + margin: 3em 0; + padding: 0 1em; + text-align: center; +} + +/* line 1, ../sass/components/_buttons.scss */ +.button, .button--blue, .button--teal, .button--grey, .global-footer__contact__button, .global-header__download-button { + background: #ec1e2c; + border-radius: 3px; + color: #fff; + display: inline-block; + font-size: 16px; + font-weight: bold; + line-height: 1; + padding: 1em 2.5em; + text-align: center; + text-transform: uppercase; +} +/* line 13, ../sass/components/_buttons.scss */ +.button:focus, .button--blue:focus, .button--teal:focus, .button--grey:focus, .global-footer__contact__button:focus, .global-header__download-button:focus, .button:hover, .button--blue:hover, .button--teal:hover, .button--grey:hover, .global-footer__contact__button:hover, .global-header__download-button:hover { + background: #d7181b; + color: #fff; +} +/* line 19, ../sass/components/_buttons.scss */ +.button:active, .button--blue:active, .button--teal:active, .button--grey:active, .global-footer__contact__button:active, .global-header__download-button:active { + background: #be0e11; +} + +/* line 24, ../sass/components/_buttons.scss */ +.button--blue { + background: #0081a5; +} +/* line 28, ../sass/components/_buttons.scss */ +.button--blue:focus, .button--blue:hover { + background: #006d8b; +} + +/* line 34, ../sass/components/_buttons.scss */ +.button--teal { + background: #6da6b3; +} +/* line 38, ../sass/components/_buttons.scss */ +.button--teal:focus, .button--teal:hover { + background: #7fb5c1; +} +/* line 43, ../sass/components/_buttons.scss */ +.button--teal:active { + background: #8fcad7; +} + +/* line 48, ../sass/components/_buttons.scss */ +.button--grey { + background: #e6e6e6; + color: #000; +} +/* line 53, ../sass/components/_buttons.scss */ +.button--grey:focus, .button--grey:hover { + background: #bfbfbf; + color: #000; +} +/* line 59, ../sass/components/_buttons.scss */ +.button--grey:active { + background: #4a4947; + color: #fff; +} + +/* line 65, ../sass/components/_buttons.scss */ +.button--outlined { + background: none; + border: 2px solid #1b1a19; + border-radius: 5px; + color: #1b1a19; + display: block; + font-weight: bold; + line-height: 1.1; + margin: 0 auto; + max-width: 26em; + padding: 1.1em 1em 1em 1em; + text-align: center; + text-transform: uppercase; + width: 100%; +} +/* line 80, ../sass/components/_buttons.scss */ +.button--outlined:focus, .button--outlined:hover { + border-color: #1b1a19; + color: #1b1a19; +} + +/* line 1, ../sass/components/_carousel.scss */ +.carousel { + margin: 3em 0; +} + +/* line 5, ../sass/components/_carousel.scss */ +.carousel__wrapper { + padding: 0 2em; + position: relative; +} + +/* line 10, ../sass/components/_carousel.scss */ +.carousel__pages { + overflow: hidden; + position: relative; +} + +/* line 15, ../sass/components/_carousel.scss */ +.carousel__page { + transition: all 200ms ease-in-out; + -ms-transform: translate3d(0, 0, 0); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + width: 100%; +} + +/* line 21, ../sass/components/_carousel.scss */ +.carousel__page--current { + opacity: 1; + position: relative; + z-index: 1; +} + +/* line 27, ../sass/components/_carousel.scss */ +.carousel__page--previous, +.carousel__page--next { + opacity: 0; + position: absolute; + top: 0; +} + +/* line 34, ../sass/components/_carousel.scss */ +.carousel__page--previous { + -ms-transform: translate3d(-100%, 0, 0); + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); +} + +/* line 38, ../sass/components/_carousel.scss */ +.carousel__page--next { + -ms-transform: translate3d(100%, 0, 0); + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); +} + +/* line 42, ../sass/components/_carousel.scss */ +.carousel__navigation--next, +.carousel__navigation--previous { + background: no-repeat 50% 50%; + border: 0; + display: block; + height: 41px; + margin-top: -1.5em; + position: absolute; + top: 50%; + width: 24px; + z-index: 10; +} +/* line 54, ../sass/components/_carousel.scss */ +.carousel__navigation--next span, +.carousel__navigation--previous span { + display: block; +} + +/* line 60, ../sass/components/_carousel.scss */ +.carousel__navigation--next { + background-image: url("../images/icons/carousel-next.png"); + right: 0; +} + +/* line 65, ../sass/components/_carousel.scss */ +.carousel__navigation--previous { + background-image: url("../images/icons/carousel-previous.png"); + left: 0; +} + +/* line 1, ../sass/components/_company-hq-details.scss */ +.company-hq-details { + background: #7bbdcb; + min-height: 20em; + padding: 3em 1em; +} +/* line 6, ../sass/components/_company-hq-details.scss */ +.company-hq-details .layout-wrapper { + max-width: 60em; + position: relative; +} +@media (min-width: 40em) { + /* line 6, ../sass/components/_company-hq-details.scss */ + .company-hq-details .layout-wrapper { + padding-left: 16em; + } +} + +/* line 16, ../sass/components/_company-hq-details.scss */ +.company-hq-details__header { + margin-bottom: 1.5em; +} +/* line 19, ../sass/components/_company-hq-details.scss */ +.company-hq-details__header h1 { + color: #0d4c5a; + font-size: 32px; + font-weight: normal; + margin: 0; +} + +/* line 27, ../sass/components/_company-hq-details.scss */ +.company-hq-details__content { + color: #fff; + line-height: 1.4; +} +/* line 32, ../sass/components/_company-hq-details.scss */ +.company-hq-details__content img { + border: 0.25em solid #fff; + border-radius: 50%; + display: block; + margin-bottom: 1.5em; +} +@media (min-width: 40em) { + /* line 32, ../sass/components/_company-hq-details.scss */ + .company-hq-details__content img { + left: 0; + position: absolute; + top: 0; + } +} +/* line 46, ../sass/components/_company-hq-details.scss */ +.company-hq-details__content .column + .column { + margin-top: 1.5em; +} +@media (min-width: 64em) { + /* line 45, ../sass/components/_company-hq-details.scss */ + .company-hq-details__content .column { + float: left; + padding-right: 3em; + width: 50%; + } + /* line 55, ../sass/components/_company-hq-details.scss */ + .company-hq-details__content .column + .column { + margin-top: 0; + } +} +/* line 61, ../sass/components/_company-hq-details.scss */ +.company-hq-details__content h2, +.company-hq-details__content p { + font-size: 20px; + margin: 0; +} +/* line 67, ../sass/components/_company-hq-details.scss */ +.company-hq-details__content a { + color: #fff; + text-decoration: underline; +} + +/* line 1, ../sass/components/_contactblock.scss */ +.contactblock { + margin: 3em auto; + max-width: 52em; + padding: 0 1em; +} + +/* line 7, ../sass/components/_contactblock.scss */ +.contactblock__content { + border: 0.25em solid #f2f2f2; + padding: 1.5em 1.5em 1.5em 6.5em; + position: relative; +} +/* line 13, ../sass/components/_contactblock.scss */ +.contactblock__content p { + line-height: 1.4; + margin: 0; +} + +/* line 19, ../sass/components/_contactblock.scss */ +.contactblock__avatar { + background: #00bfe8; + border-radius: 50%; + display: block; + height: 58px; + left: 1.5em; + margin-bottom: 0.5em; + overflow: hidden; + position: absolute; + top: 1.5em; + width: 58px; +} + +/* line 32, ../sass/components/_contactblock.scss */ +.contactblock__title { + font-size: 16px; + margin: 0 0 0.25em 0; +} + +/* line 1, ../sass/components/_ctablock.scss */ +.ctablock, .ctablock--bright, .ctablock--grey { + background: #282725 url("../images/patterns/exhaust.jpg") repeat-y 50% 50%; + color: #fff; + margin: 3em 0; +} + +/* line 7, ../sass/components/_ctablock.scss */ +.ctablock__wrapper { + margin: 0 auto; + max-width: 52em; + padding: 3em 1em; + text-align: center; +} + +/* line 14, ../sass/components/_ctablock.scss */ +.ctablock__title { + font-size: 32px; + font-weight: normal; + margin: 0; +} + +/* line 20, ../sass/components/_ctablock.scss */ +.ctablock__content { + font-size: 20px; + line-height: 1.6; + margin: 1.5em 0; +} +/* line 25, ../sass/components/_ctablock.scss */ +.ctablock__content p { + margin: 0; +} + +/* @group Bright variant */ +/* line 32, ../sass/components/_ctablock.scss */ +.ctablock--bright { + background: #00bfe8 url("../images/patterns/mosaic-bright.png") repeat 50% 50%; +} + +/* @end */ +/* @group Grey variant */ +/* line 41, ../sass/components/_ctablock.scss */ +.ctablock--grey { + background: #f2f2f2; + border-top: 1px solid #e6e6e6; +} +/* line 46, ../sass/components/_ctablock.scss */ +.global-content .ctablock--grey:last-child { + margin-bottom: 0; +} +/* line 50, ../sass/components/_ctablock.scss */ +.ctablock--grey .ctablock__content { + color: #000; + font-weight: bold; + margin-top: 0; + text-transform: uppercase; +} + +/* @end */ +/* line 1, ../sass/components/_customer-grouping.scss */ +.customer-grouping { + margin: 3em auto; + max-width: 68em; + padding: 0 1em; +} + +/* line 7, ../sass/components/_customer-grouping.scss */ +.customer-grouping__title { + font-size: 28px; + font-weight: normal; + margin: 0; + text-align: center; +} + +/* line 19, ../sass/components/_customer-grouping.scss */ +.customer-grouping__item { + margin-top: 1.5em; +} +@media (min-width: 45em) { + /* line 19, ../sass/components/_customer-grouping.scss */ + .customer-grouping__item { + float: left; + padding: 0 0.75em; + width: 33.33333%; + } + /* line 27, ../sass/components/_customer-grouping.scss */ + .customer-grouping__item:nth-child(3n) { + padding-right: 0; + } + /* line 31, ../sass/components/_customer-grouping.scss */ + .customer-grouping__item:nth-child(3n+1) { + padding-left: 0; + } +} +/* line 36, ../sass/components/_customer-grouping.scss */ +.customer-grouping__item a { + background: rgba(0, 0, 0, 0.6); + display: table; + height: 13.75em; + transition: background 100ms linear; + width: 100%; +} +/* line 43, ../sass/components/_customer-grouping.scss */ +.customer-grouping__item a:focus, .customer-grouping__item a:hover { + background: rgba(0, 0, 0, 0.5); +} + +/* line 50, ../sass/components/_customer-grouping.scss */ +.customer-grouping__item__wrapper { + background: no-repeat 50% 50%; + background-size: cover; +} + +/* line 55, ../sass/components/_customer-grouping.scss */ +.customer-grouping__item__logo { + display: table-cell; + margin: 0; + padding: 1em; + text-align: center; + vertical-align: middle; +} +/* line 62, ../sass/components/_customer-grouping.scss */ +.customer-grouping__item__logo img { + max-width: 235px; + width: 100%; +} + +/* line 1, ../sass/components/_developer-portal-logo-grid.scss */ +.developer-portal-logo-grid { + margin: 3em auto; + max-width: 52em; + padding: 0 1em; +} + +/* line 12, ../sass/components/_developer-portal-logo-grid.scss */ +.developer-portal-logo-grid__item { + display: block; + text-align: center; +} +/* line 16, ../sass/components/_developer-portal-logo-grid.scss */ +.developer-portal-logo-grid__item + .developer-portal-logo-grid__item { + margin-top: 3em; +} +@media (min-width: 36em) { + /* line 12, ../sass/components/_developer-portal-logo-grid.scss */ + .developer-portal-logo-grid__item { + float: left; + padding: 0 1em; + width: 33.33333%; + } + /* line 25, ../sass/components/_developer-portal-logo-grid.scss */ + .developer-portal-logo-grid__item + .developer-portal-logo-grid__item { + margin-top: 0; + } +} +/* line 31, ../sass/components/_developer-portal-logo-grid.scss */ +.developer-portal-logo-grid__item span:before { + background: #00bfe8 no-repeat 50% 50%; + border-radius: 50%; + content: ""; + display: block; + margin: 0 auto 2em auto; + height: 7.5em; + width: 7.5em; +} +/* line 45, ../sass/components/_developer-portal-logo-grid.scss */ +.developer-portal-logo-grid__item .server span:before { + background-image: url("../images/icons/developer-portal-server.png"); +} +/* line 45, ../sass/components/_developer-portal-logo-grid.scss */ +.developer-portal-logo-grid__item .mobile span:before { + background-image: url("../images/icons/developer-portal-mobile.png"); +} +/* line 45, ../sass/components/_developer-portal-logo-grid.scss */ +.developer-portal-logo-grid__item .projects span:before { + background-image: url("../images/icons/developer-portal-projects.png"); +} + +/* line 1, ../sass/components/_download-intro.scss */ +.download-intro__wrapper { + line-height: 1.4; + margin: 3em auto; + max-width: 52em; + padding: 0 1em; + text-align: center; +} +/* line 8, ../sass/components/_download-intro.scss */ +.download-intro__wrapper p:first-child { + color: #757575; + font-size: 24px; + font-weight: bold; +} +/* line 14, ../sass/components/_download-intro.scss */ +.download-intro__wrapper ul { + margin-top: 3em; +} +/* line 19, ../sass/components/_download-intro.scss */ +.download-intro__wrapper li { + display: inline-block; + margin: 0 1em; +} +/* line 23, ../sass/components/_download-intro.scss */ +.download-intro__wrapper li a { + font-size: 24px; + font-weight: bold; +} + +/* line 1, ../sass/components/_download-section.scss */ +.download-section { + background: #f2f2f2; +} +/* line 4, ../sass/components/_download-section.scss */ +.download-section hr { + border-color: #f2f2f2; + max-width: 64em; +} + +/* line 10, ../sass/components/_download-section.scss */ +.download-section__header { + background: #282725; + color: #fff; + padding: 1.5em 0; + text-align: center; +} +/* line 16, ../sass/components/_download-section.scss */ +.download-section__header h1 { + font-size: 32px; + font-weight: normal; + margin: 0; +} + +/* line 23, ../sass/components/_download-section.scss */ +.download-section__content { + margin: 0 auto; + max-width: 70em; + padding: 3em 1em; +} +/* line 28, ../sass/components/_download-section.scss */ +.download-section__content .title { + font-size: 24px; + margin: 0; +} +/* line 33, ../sass/components/_download-section.scss */ +.download-section__content .links { + margin-top: 0.75em; +} +/* line 37, ../sass/components/_download-section.scss */ +.download-section__content .links li { + display: inline-block; +} +/* line 41, ../sass/components/_download-section.scss */ +.download-section__content .links li + li:before { + content: "•"; + display: inline-block; + margin: 0 0.75em 0 0.5em; +} + +/* line 49, ../sass/components/_download-section.scss */ +.download-section__subheader { + margin-bottom: 3em; + position: relative; + text-align: center; +} +/* line 54, ../sass/components/_download-section.scss */ +.download-section__subheader .next-version, +.download-section__subheader .previous-version { + font-weight: bold; + position: absolute; + text-transform: uppercase; + top: 1.5em; +} +/* line 62, ../sass/components/_download-section.scss */ +.download-section__subheader .next-version:after, +.download-section__subheader .previous-version:before { + background: no-repeat 0 0; + content: ""; + display: inline-block; + height: 15px; + vertical-align: middle; + width: 9px; +} +/* line 72, ../sass/components/_download-section.scss */ +.download-section__subheader .next-version { + right: 0; +} +/* line 75, ../sass/components/_download-section.scss */ +.download-section__subheader .next-version:after { + background-image: url("../images/icons/download-next.png"); + margin-left: 0.5em; +} +/* line 81, ../sass/components/_download-section.scss */ +.download-section__subheader .previous-version { + left: 0; +} +/* line 84, ../sass/components/_download-section.scss */ +.download-section__subheader .previous-version:before { + background-image: url("../images/icons/download-previous.png"); + margin-right: 0.5em; +} + +/* line 91, ../sass/components/_download-section.scss */ +.download-section__links { + text-align: center; +} +/* line 94, ../sass/components/_download-section.scss */ +.download-section__links .sub-title { + font-size: 20px; + margin: 2em 0 0 0; + text-transform: uppercase; +} +/* line 100, ../sass/components/_download-section.scss */ +.download-section__links .download-links { + margin-top: 0.5em; +} +/* line 104, ../sass/components/_download-section.scss */ +.download-section__links .download-links li { + display: inline-block; + margin-top: 1.5em; + padding: 0 1em; + width: 30%; +} +/* line 110, ../sass/components/_download-section.scss */ +.download-section__links .download-links li a { + font-weight: bold; +} +/* line 114, ../sass/components/_download-section.scss */ +.download-section__links .download-links li span { + display: block; + margin-top: 0.5em; +} + +/* line 1, ../sass/components/_download-table.scss */ +.download-table__wrapper { + background: #fff; + padding: 2em 3em; +} + +/* line 6, ../sass/components/_download-table.scss */ +.download-table__header { + margin-bottom: 1.5em; +} +/* line 10, ../sass/components/_download-table.scss */ +.download-table__header .toggle-group { + float: left; +} +/* line 13, ../sass/components/_download-table.scss */ +.download-table__header .toggle-group + .toggle-group { + margin-left: 2em; +} +/* line 18, ../sass/components/_download-table.scss */ +.download-table__header p { + float: left; + font-weight: bold; + margin: 0 0 0 1em; + padding: 1em 0; +} + +/* line 29, ../sass/components/_download-table.scss */ +.download-table > li { + border-top: 2px solid #bfbfbf; + padding: 1em 0; +} + +/* line 36, ../sass/components/_download-table.scss */ +.download-table--additional-versions[aria-expanded="false"] { + display: none; +} +/* line 40, ../sass/components/_download-table.scss */ +.download-table--additional-versions > li:first-child { + border-top: 0; +} + +/* line 45, ../sass/components/_download-table.scss */ +.download-table__row { + display: table; + table-layout: fixed; + width: 100%; +} + +/* line 51, ../sass/components/_download-table.scss */ +.download-table__cell { + display: table-cell; + vertical-align: middle; +} +/* line 55, ../sass/components/_download-table.scss */ +.download-table__cell .platform { + display: block; + font-size: 20px; +} +/* line 59, ../sass/components/_download-table.scss */ +.download-table__cell .platform:before { + background: no-repeat 50% 50%; + content: ""; + display: inline-block; + height: 80px; + margin-right: 1em; + width: 80px; + vertical-align: middle; +} +/* line 71, ../sass/components/_download-table.scss */ +.download-table__cell .platform--android:before { + background-image: url("../images/logos/android.png"); +} +/* line 71, ../sass/components/_download-table.scss */ +.download-table__cell .platform--java:before { + background-image: url("../images/logos/java.png"); +} +/* line 71, ../sass/components/_download-table.scss */ +.download-table__cell .platform--linux:before { + background-image: url("../images/logos/linux.png"); +} +/* line 71, ../sass/components/_download-table.scss */ +.download-table__cell .platform--mac:before { + background-image: url("../images/logos/mac.png"); +} +/* line 71, ../sass/components/_download-table.scss */ +.download-table__cell .platform--redhat:before { + background-image: url("../images/logos/redhat.png"); +} +/* line 71, ../sass/components/_download-table.scss */ +.download-table__cell .platform--ubuntu:before { + background-image: url("../images/logos/ubuntu.png"); +} +/* line 71, ../sass/components/_download-table.scss */ +.download-table__cell .platform--windows:before { + background-image: url("../images/logos/windows.png"); +} +/* line 76, ../sass/components/_download-table.scss */ +.download-table__cell .download, +.download-table__cell .instructions { + font-weight: bold; +} +/* line 80, ../sass/components/_download-table.scss */ +.download-table__cell .download:before, +.download-table__cell .instructions:before { + background: no-repeat 50% 50%; + content: ""; + display: inline-block; + margin: -2px 0.5em 0 0; + height: 20px; + vertical-align: middle; + width: 20px; +} +/* line 91, ../sass/components/_download-table.scss */ +.download-table__cell .download:before { + background-image: url("../images/icons/download.png"); +} +/* line 96, ../sass/components/_download-table.scss */ +.download-table__cell .instructions:before { + background-image: url("../images/icons/open.png"); +} +/* line 100, ../sass/components/_download-table.scss */ +.download-table__cell .instructions[aria-pressed="true"] { + background: #f2f2f2; + border-radius: 0.25em 0.25em 0 0; + color: #000; + display: inline-block; + margin-bottom: -2em; + padding: 1em 1.5em 3em 1.5em; +} +/* line 108, ../sass/components/_download-table.scss */ +.download-table__cell .instructions[aria-pressed="true"]:before { + background-image: url("../images/icons/close.png"); +} + +/* line 115, ../sass/components/_download-table.scss */ +.download-table__cell--actions { + color: #ec1e2c; + font-size: 20px; + text-align: right; +} + +/* line 121, ../sass/components/_download-table.scss */ +.download-table__cell--instructions { + text-align: center; +} + +/* line 125, ../sass/components/_download-table.scss */ +.download-table__instructions { + background: #f2f2f2; + margin-bottom: -1em; + padding: 1.5em; +} +/* line 130, ../sass/components/_download-table.scss */ +.download-table__instructions[aria-expanded="false"] { + display: none; +} +/* line 134, ../sass/components/_download-table.scss */ +.download-table__instructions .title { + font-size: 16px; + margin: 0; +} + +/* line 140, ../sass/components/_download-table.scss */ +.additional-versions { + border-top: 2px solid #bfbfbf; + padding-top: 1em; + margin: 0 0 1.5em 0; +} +/* line 146, ../sass/components/_download-table.scss */ +.additional-versions a:before { + background: url("../images/icons/open.png") no-repeat 50% 50%; + content: ""; + display: inline-block; + margin: -2px 0.5em 0 0; + height: 20px; + vertical-align: middle; + width: 20px; +} +/* line 156, ../sass/components/_download-table.scss */ +.additional-versions a[aria-pressed="true"]:before { + background-image: url("../images/icons/close.png"); +} + +/* line 1, ../sass/components/_event-agenda.scss */ +.event-agenda { + margin: 3em auto; + max-width: 52em; + padding: 0 1em; +} + +/* line 7, ../sass/components/_event-agenda.scss */ +.event-agenda__title { + font-size: 32px; + font-weight: normal; + margin: 0; + text-align: center; +} + +/* line 14, ../sass/components/_event-agenda.scss */ +.event-agenda__content { + margin-top: 3em; +} +/* line 17, ../sass/components/_event-agenda.scss */ +.event-agenda__content table { + border-collapse: collapse; + width: 100%; +} +/* line 22, ../sass/components/_event-agenda.scss */ +.event-agenda__content th, +.event-agenda__content td { + vertical-align: top; +} +/* line 27, ../sass/components/_event-agenda.scss */ +.event-agenda__content th { + font-size: 20px; + font-weight: bold; + text-align: left; + text-transform: uppercase; +} +/* line 34, ../sass/components/_event-agenda.scss */ +.event-agenda__content thead th { + padding: 0 0 1em 1.25em; +} +/* line 39, ../sass/components/_event-agenda.scss */ +.event-agenda__content tbody th { + border-right: 2px solid #cccccc; + min-width: 10.5em; +} +/* line 43, ../sass/components/_event-agenda.scss */ +.event-agenda__content tbody th span { + display: block; + padding-right: 1.5em; + position: relative; +} +/* line 48, ../sass/components/_event-agenda.scss */ +.event-agenda__content tbody th span:after { + background: #ec1e2c; + border: 3px solid #fff; + border-radius: 50%; + box-shadow: 0 0 0 2px #cccccc; + content: ""; + display: block; + height: 18px; + position: absolute; + right: -11px; + top: 0; + width: 18px; +} +/* line 64, ../sass/components/_event-agenda.scss */ +.event-agenda__content tbody tr:last-child th { + border-color: #fff; +} +/* line 68, ../sass/components/_event-agenda.scss */ +.event-agenda__content tbody td { + line-height: 1.6; + padding: 0 1.5em 1.5em 1.5em; +} +@media (max-width: 40em) { + /* line 75, ../sass/components/_event-agenda.scss */ + .event-agenda__content table, + .event-agenda__content tbody, + .event-agenda__content tr, + .event-agenda__content th, + .event-agenda__content td { + display: block; + } + /* line 83, ../sass/components/_event-agenda.scss */ + .event-agenda__content thead, + .event-agenda__content tbody th span:after { + display: none; + } + /* line 89, ../sass/components/_event-agenda.scss */ + .event-agenda__content tbody th { + border: 0; + margin-bottom: 1em; + } + /* line 94, ../sass/components/_event-agenda.scss */ + .event-agenda__content tbody td { + margin-bottom: 1.5em; + padding: 0; + } + /* line 98, ../sass/components/_event-agenda.scss */ + .event-agenda__content tbody td:before { + content: attr(data-title); + display: block; + font-weight: bold; + text-transform: uppercase; + } +} + +/* line 1, ../sass/components/_event-date-location.scss */ +.event-date-location { + margin: 3em auto; + max-width: 52em; + padding: 0 1em; + position: relative; +} +/* line 7, ../sass/components/_event-date-location.scss */ +.event-date-location:after { + background: #cccccc; + bottom: 1.5em; + content: ""; + display: block; + left: 50%; + margin-left: -1px; + position: absolute; + top: 0; + width: 2px; +} + +/* line 20, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper { + border-bottom: 2px solid #cccccc; + line-height: 1.4; + padding-bottom: 1.5em; +} +/* line 26, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper .title { + display: block; + font-size: 20px; + font-weight: bold; + margin-bottom: 0.25em; +} +/* line 33, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper .event-date, +.event-date-location__wrapper .event-location { + float: left; + min-height: 7em; + position: relative; + width: 50%; +} +@media (min-width: 50em) { + /* line 33, ../sass/components/_event-date-location.scss */ + .event-date-location__wrapper .event-date, + .event-date-location__wrapper .event-location { + padding: 1em 0 0 8.5em; + } +} +/* line 44, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper .event-date:before, +.event-date-location__wrapper .event-location:before { + background: #7bbdcb no-repeat 50% 50%; + border-radius: 50%; + content: ""; + display: block; + margin-bottom: 1em; + height: 5.125em; + width: 5.125em; +} +@media (min-width: 50em) { + /* line 44, ../sass/components/_event-date-location.scss */ + .event-date-location__wrapper .event-date:before, + .event-date-location__wrapper .event-location:before { + left: 2em; + position: absolute; + top: 0; + } +} +/* line 61, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper .event-date { + padding-right: 1.5em; +} +/* line 64, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper .event-date:before { + background-image: url("../images/icons/event-date.png"); +} +/* line 69, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper .event-location { + padding-left: 1.5em; +} +@media (min-width: 50em) { + /* line 69, ../sass/components/_event-date-location.scss */ + .event-date-location__wrapper .event-location { + padding-left: 8.5em; + } +} +/* line 76, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper .event-location:before { + background-image: url("../images/icons/event-location.png"); +} + +/* line 1, ../sass/components/_featured-article.scss */ +.featured-article { + background: #7bbdcb; +} + +/* line 5, ../sass/components/_featured-article.scss */ +.featured-article__wrapper { + margin: 0 auto; + max-width: 52em; + padding: 3em 1em; + position: relative; +} + +/* line 12, ../sass/components/_featured-article.scss */ +.featured-article__tag { + color: #0d4c5a; + display: block; + font-weight: bold; + margin-bottom: 1em; + text-transform: uppercase; +} + +/* line 20, ../sass/components/_featured-article.scss */ +.featured-article__title { + color: #fff; + font-size: 32px; + margin: 0; +} + +/* line 26, ../sass/components/_featured-article.scss */ +.featured-article__meta { + color: #fff; + font-weight: bold; + margin: 0.5em 0; +} + +/* line 32, ../sass/components/_featured-article.scss */ +.featured-article__avatar { + border: 0.25em solid #fff; + border-radius: 50%; + display: none; + left: -7.5em; + position: absolute; + top: 3em; +} +@media (min-width: 70em) { + /* line 32, ../sass/components/_featured-article.scss */ + .featured-article__avatar { + display: block; + } +} + +/* line 46, ../sass/components/_featured-article.scss */ +.featured-article__content { + color: #fff; + font-size: 20px; + line-height: 1.5; +} + +/* line 53, ../sass/components/_featured-article.scss */ +.featured-article__footer a { + background: #388695; + border-radius: 3px; + color: #fff; + display: inline-block; + font-size: 20px; + font-weight: bold; + padding: 0.6em 2em 0.5em 2em; + text-transform: uppercase; +} + +/* line 1, ../sass/components/_featured-speakers.scss */ +.featured-speakers { + background: #7bbdcb url("../images/patterns/mosaic-light.png") repeat 50% 0; + color: #fff; + margin: 3em 0; +} + +/* line 7, ../sass/components/_featured-speakers.scss */ +.featured-speakers__wrapper { + margin: 0 auto; + max-width: 52em; + padding: 3em 1em 0 1em; +} + +/* line 13, ../sass/components/_featured-speakers.scss */ +.featured-speakers__title { + font-size: 32px; + font-weight: normal; + margin: 0; + text-align: center; +} + +/* line 20, ../sass/components/_featured-speakers.scss */ +.featured-speakers__items { + margin-top: 3em; +} + +/* line 26, ../sass/components/_featured-speakers.scss */ +.featured-speakers__item { + margin-bottom: 3em; +} +@media (min-width: 30em) { + /* line 26, ../sass/components/_featured-speakers.scss */ + .featured-speakers__item { + float: left; + padding-right: 1.5em; + width: 50%; + } + /* line 35, ../sass/components/_featured-speakers.scss */ + .featured-speakers__item:nth-child(odd) { + clear: left; + } +} +/* line 40, ../sass/components/_featured-speakers.scss */ +.featured-speakers__item .avatar { + background: #fff; + border: 0.25em solid #fff; + border-radius: 50%; + display: block; + height: 6.75em; + margin-bottom: 1em; + width: 6.75em; +} +@media (min-width: 40em) { + /* line 40, ../sass/components/_featured-speakers.scss */ + .featured-speakers__item .avatar { + float: left; + } +} +/* line 53, ../sass/components/_featured-speakers.scss */ +.featured-speakers__item .avatar img { + border-radius: 50%; +} + +/* line 59, ../sass/components/_featured-speakers.scss */ +.featured-speakers__item__details { + line-height: 1.2; +} +@media (min-width: 40em) { + /* line 59, ../sass/components/_featured-speakers.scss */ + .featured-speakers__item__details { + margin-left: 7.75em; + padding-top: 1em; + } +} +/* line 67, ../sass/components/_featured-speakers.scss */ +.featured-speakers__item__details .name { + font-size: 20px; + margin: 0; +} +/* line 72, ../sass/components/_featured-speakers.scss */ +.featured-speakers__item__details .title { + margin: 0.35em 0; +} +/* line 76, ../sass/components/_featured-speakers.scss */ +.featured-speakers__item__details .company { + font-style: italic; + margin: 0; +} + +/* line 1, ../sass/components/_generic-header.scss */ +.generic-header, .image-header--no-bg { + background: #f1f1f1 url("../images/patterns/thatch.png") repeat 50% 50%; + background-size: auto; + color: #000; + padding: 0 1em; +} + +/* line 8, ../sass/components/_generic-header.scss */ +.generic-header__content { + padding: 3.125em 0; + text-align: center; +} + +/* line 13, ../sass/components/_generic-header.scss */ +.generic-header__type, .image-header__type { + display: block; + font-size: 12px; + font-weight: bold; + text-transform: uppercase; +} +@media (min-width: 42em) { + /* line 13, ../sass/components/_generic-header.scss */ + .generic-header__type, .image-header__type { + font-size: 16px; + } +} + +/* line 24, ../sass/components/_generic-header.scss */ +.generic-header__title, .image-header__title { + font-size: 32px; + font-weight: normal; + line-height: 1.1; + margin: .3em 0 .4em 0; +} +@media (min-width: 42em) { + /* line 24, ../sass/components/_generic-header.scss */ + .generic-header__title, .image-header__title { + font-size: 56px; + } +} + +/* line 35, ../sass/components/_generic-header.scss */ +.generic-header__detail { + font-size: 16px; + margin: 0; +} +@media (min-width: 42em) { + /* line 35, ../sass/components/_generic-header.scss */ + .generic-header__detail { + font-size: 20px; + } +} + +/* line 44, ../sass/components/_generic-header.scss */ +.generic-header__avatar { + border-radius: 50%; + display: inline-block; + margin: 0 8px; +} + +/* line 1, ../sass/components/_highlighted-link.scss */ +.highlighted-link { + background: #e6e6e6; + border: 2px solid #bfbfbf; + border-radius: 0.25em; + display: block; + font-size: 20px; + font-weight: bold; + line-height: 1; + margin: 2.4em 0; + padding: 1.5em; + text-align: center; +} + +/* line 1, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid { + margin: 3em auto; + max-width: 65em; + padding: 0 1em; +} + +/* line 12, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item { + border-top: 2px solid #cccccc; +} +/* line 15, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item:first-child { + border-top: 0; +} +@media (min-width: 38em) { + /* line 12, ../sass/components/_icon-link-grid.scss */ + .icon-link-grid__item { + border-left: 2px solid #cccccc; + float: left; + width: 50%; + } + /* line 24, ../sass/components/_icon-link-grid.scss */ + .icon-link-grid__item:nth-child(odd) { + border-left-color: transparent; + clear: left; + } + /* line 29, ../sass/components/_icon-link-grid.scss */ + .icon-link-grid__item:nth-child(2) { + border-top: 0; + } +} +@media (min-width: 57em) { + /* line 12, ../sass/components/_icon-link-grid.scss */ + .icon-link-grid__item { + width: 33.33333%; + } + /* line 37, ../sass/components/_icon-link-grid.scss */ + .icon-link-grid__item:nth-child(odd) { + border-left-color: #cccccc; + clear: none; + } + /* line 42, ../sass/components/_icon-link-grid.scss */ + .icon-link-grid__item:nth-child(3n+1) { + border-left-color: transparent; + clear: left; + } + /* line 47, ../sass/components/_icon-link-grid.scss */ + .icon-link-grid__item:nth-child(3) { + border-top: 0; + } +} +/* line 52, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item a { + display: block; + font-weight: bold; + padding: 3em; + text-align: center; + text-transform: uppercase; +} +/* line 59, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item a:before { + background: #7bbdcb no-repeat 50% 50%; + border-radius: 50%; + content: ""; + display: block; + margin: 0 auto 2em auto; + height: 7.5em; + width: 7.5em; +} +/* line 69, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item a span { + font-size: 20px; +} +/* line 75, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item .webinars:before { + background-image: url("../images/icons/learn-webinars.png"); +} +/* line 75, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item .whitepapers:before { + background-image: url("../images/icons/learn-whitepapers.png"); +} +/* line 75, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item .blog:before { + background-image: url("../images/icons/learn-blog.png"); +} +/* line 75, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item .training:before { + background-image: url("../images/icons/learn-training.png"); +} +/* line 75, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item .events:before { + background-image: url("../images/icons/learn-events.png"); +} +/* line 75, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item .presentations:before { + background-image: url("../images/icons/learn-presentations.png"); +} + +/* line 1, ../sass/components/_image-header.scss */ +.image-header { + background: no-repeat 50% 50%; + background-size: cover; + color: #fff; + padding: 0 1em; +} + +/* line 12, ../sass/components/_image-header.scss */ +.image-header__content { + max-width: 26em; + padding: 6em 0 3em 0; +} +@media (min-width: 42em) { + /* line 12, ../sass/components/_image-header.scss */ + .image-header__content { + height: 32.5em; + padding: 9em 0 0 0; + } +} + +/* line 26, ../sass/components/_image-header.scss */ +.image-header__title { + margin-bottom: 0; +} + +/* line 1, ../sass/components/_introblock.scss */ +.introblock { + background: #f9f9f9; + border-bottom: 1px solid #e6e6e6; + padding: 0 1em; +} + +/* line 7, ../sass/components/_introblock.scss */ +.introblock__content { + color: #757575; + font-size: 20px; + line-height: 1.6; + padding: 2em 0 0 0; +} +/* line 13, ../sass/components/_introblock.scss */ +.introblock__content p { + margin: 0; +} + +/* line 18, ../sass/components/_introblock.scss */ +.introblock__sidebar { + padding: 2em 0; +} +/* line 21, ../sass/components/_introblock.scss */ +.introblock__sidebar p { + color: #6da6b3; + line-height: 1.4; + margin: 0.5em 0 0 0; +} +/* line 27, ../sass/components/_introblock.scss */ +.introblock__sidebar a { + color: #6da6b3; + font-weight: bold; +} + +/* line 33, ../sass/components/_introblock.scss */ +.introblock__sidebar__title { + margin: 0; + font-size: 20px; + text-transform: uppercase; +} +/* line 38, ../sass/components/_introblock.scss */ +* + .introblock__sidebar__title { + margin-top: 1.5em; +} + +@media (min-width: 56em) { + /* line 44, ../sass/components/_introblock.scss */ + .introblock .layout-wrapper { + display: table; + width: 100%; + } + + /* line 49, ../sass/components/_introblock.scss */ + .introblock__content { + display: table-cell; + padding: 2em 2em 2em 0; + vertical-align: top; + } + + /* line 55, ../sass/components/_introblock.scss */ + .introblock__sidebar { + border-left: 1px solid #e6e6e6; + display: table-cell; + padding: 2em 0 2em 2em; + vertical-align: top; + width: 22em; + } +} +/* line 1, ../sass/components/_layout-wrapper.scss */ +.layout-wrapper { + margin: 0 auto; + max-width: 68em; +} + +/* line 1, ../sass/components/_link-block.scss */ +.link-block { + border: 3px solid #e6e6e6; + list-style: none; + margin: 2em 0; + padding: .75em; + width: 100%; +} +@media (min-width: 40em) { + /* line 1, ../sass/components/_link-block.scss */ + .link-block { + margin: 3em 0; + } +} + +/* line 15, ../sass/components/_link-block.scss */ +.link-block__item a { + display: block; + line-height: 1.2; + padding: .3em; + position: relative; + text-align: center; +} +@media (min-width: 40em) { + /* line 15, ../sass/components/_link-block.scss */ + .link-block__item a { + padding: 1.125em 0; + } +} +@media (min-width: 40em) { + /* line 14, ../sass/components/_link-block.scss */ + .link-block__item { + display: inline-block; + margin-right: -4px; + vertical-align: middle; + width: 50%; + } + /* line 34, ../sass/components/_link-block.scss */ + .link-block__item:nth-child(odd) a { + padding-left: 2em; + padding-right: 3.125em; + text-align: right; + } + /* line 43, ../sass/components/_link-block.scss */ + .link-block__item:nth-child(even) a { + padding-left: 3.125em; + padding-right: 2em; + text-align: left; + } + /* line 48, ../sass/components/_link-block.scss */ + .link-block__item:nth-child(even) a:before { + background-color: #e6e6e6; + content: ''; + display: block; + height: 1.2em; + left: -1px; + margin-top: -0.6em; + position: absolute; + top: 50%; + width: 2px; + } +} + +/* line 1, ../sass/components/_logo-grid.scss */ +.logo-grid { + background: #f1f1f1; + margin: 3em 0; + padding: 3em 0; +} +/* line 6, ../sass/components/_logo-grid.scss */ +.logo-grid .layout-wrapper { + padding: 0 1em; +} + +/* line 11, ../sass/components/_logo-grid.scss */ +.logo-grid__title { + font-size: 20px; + margin: 0; + text-align: center; + text-transform: uppercase; +} + +/* line 18, ../sass/components/_logo-grid.scss */ +.logo-grid__items { + padding: 1em 0; +} + +/* line 24, ../sass/components/_logo-grid.scss */ +.logo-grid__item { + float: left; + margin-top: 0.5em; + width: 50%; +} +@media (min-width: 30em) { + /* line 24, ../sass/components/_logo-grid.scss */ + .logo-grid__item { + width: 33.33333%; + } +} +@media (min-width: 40em) { + /* line 24, ../sass/components/_logo-grid.scss */ + .logo-grid__item { + width: 25%; + } +} +@media (min-width: 50em) { + /* line 24, ../sass/components/_logo-grid.scss */ + .logo-grid__item { + width: 20%; + } +} + +/* line 42, ../sass/components/_logo-grid.scss */ +.logo-grid__item__wrapper { + display: table; + width: 100%; +} + +/* line 47, ../sass/components/_logo-grid.scss */ +.logo-grid__item__logo { + display: table-cell; + margin: 0; + padding: 1em; + text-align: center; + vertical-align: middle; +} +/* line 54, ../sass/components/_logo-grid.scss */ +.logo-grid__item__logo img { + max-width: 170px; + width: 100%; +} + +/* line 1, ../sass/components/_mediablock.scss */ +.mediablock { + margin: 3em 0; +} +/* line 4, ../sass/components/_mediablock.scss */ +.mediablock .layout-wrapper { + max-width: 42em; + padding: 0 1em; +} + +/* line 10, ../sass/components/_mediablock.scss */ +.mediablock__content { + height: 0; + margin: 0 auto; + padding-bottom: 56.25%; + position: relative; + width: 100%; +} +/* line 17, ../sass/components/_mediablock.scss */ +.mediablock__content iframe { + border: 0.25em solid #e6e6e6; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +/* line 1, ../sass/components/_page-intro.scss */ +.page-intro { + line-height: 1.6; + margin: 4em auto; + max-width: 52em; + padding: 0 1em; + text-align: center; +} + +/* line 9, ../sass/components/_page-intro.scss */ +.page-intro__headline { + color: #757575; + font-size: 20px; + font-weight: bold; +} + +/* line 1, ../sass/components/_pagination.scss */ +.pagination { + overflow: hidden; + margin: 3em auto; +} + +/* line 6, ../sass/components/_pagination.scss */ +.pagination__items { + float: left; + left: 50%; + position: relative; +} + +/* line 14, ../sass/components/_pagination.scss */ +.pagination__item { + border: solid #1b1a19; + border-width: 2px 2px 2px 0; + float: left; + font-weight: bold; + position: relative; + right: 50%; +} +/* line 22, ../sass/components/_pagination.scss */ +.pagination__item a, +.pagination__item span { + display: block; + line-height: 3em; + padding: 0 1em; + min-width: 3em; + text-align: center; +} +/* line 31, ../sass/components/_pagination.scss */ +.pagination__item span { + background: #e6e6e6; +} + +/* line 36, ../sass/components/_pagination.scss */ +.pagination__item--next, +.pagination__item--previous { + background: no-repeat 50% 50%; + width: 4em; +} +/* line 41, ../sass/components/_pagination.scss */ +.pagination__item--next b, +.pagination__item--previous b { + display: block; +} + +/* line 47, ../sass/components/_pagination.scss */ +.pagination__item--next { + background-image: url("../images/icons/pagination-next.png"); + border-radius: 0 3px 3px 0; +} + +/* line 52, ../sass/components/_pagination.scss */ +.pagination__item--previous { + background-image: url("../images/icons/pagination-previous.png"); + border-radius: 3px 0 0 3px; + border-width: 2px; +} + +/* line 1, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list { + margin: 3em auto; + max-width: 52em; + padding: 0 1em; +} + +/* line 11, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item { + margin-bottom: 3em; + min-height: 5.125em; + position: relative; +} +@media (min-width: 40em) { + /* line 11, ../sass/components/_pricing-icon-list.scss */ + .pricing-icon-list__item { + padding-left: 6.625em; + } +} +@media (min-width: 68em) { + /* line 11, ../sass/components/_pricing-icon-list.scss */ + .pricing-icon-list__item { + padding-left: 0; + } +} +/* line 24, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item:before { + background: #7bbdcb no-repeat 50% 50%; + border-radius: 50%; + content: ""; + display: block; + margin-bottom: 1em; + height: 5.125em; + width: 5.125em; +} +@media (min-width: 40em) { + /* line 24, ../sass/components/_pricing-icon-list.scss */ + .pricing-icon-list__item:before { + left: 0; + margin: 0; + position: absolute; + top: 0; + } +} +@media (min-width: 68em) { + /* line 24, ../sass/components/_pricing-icon-list.scss */ + .pricing-icon-list__item:before { + left: -6.625em; + } +} +/* line 46, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item--success:before { + background-image: url("../images/icons/pricing-success.png"); +} +/* line 46, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item--expertise:before { + background-image: url("../images/icons/pricing-expertise.png"); +} +/* line 46, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item--support:before { + background-image: url("../images/icons/pricing-support.png"); +} +/* line 46, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item--updates:before { + background-image: url("../images/icons/pricing-updates.png"); +} +/* line 46, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item--options:before { + background-image: url("../images/icons/pricing-options.png"); +} +/* line 51, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item h1 { + font-size: 24px; + margin: 0; +} +/* line 56, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item p { + line-height: 1.6; + margin: 0.5em 0 0 0; +} + +/* line 1, ../sass/components/_quoteblock.scss */ +.quoteblock { + background: #1b1a19 no-repeat 50% 50%; + background-size: cover; + color: #fff; + font-family: Georgia, serif; + margin: 6em 0 3em 0; + position: relative; + text-align: center; +} +/* line 10, ../sass/components/_quoteblock.scss */ +.quoteblock:before { + background: #455154; + bottom: 0; + content: ""; + display: block; + left: 0; + opacity: 0.5; + position: absolute; + right: 0; + top: 0; +} +/* line 22, ../sass/components/_quoteblock.scss */ +.quoteblock blockquote { + margin: 0 auto; + max-width: 52em; + padding: 3em 1em 2em 1em; + position: relative; +} +@media (min-width: 40em) { + /* line 22, ../sass/components/_quoteblock.scss */ + .quoteblock blockquote { + padding: 4.5em 1em 3em 1em; + } +} +@media (min-width: 48em) { + /* line 22, ../sass/components/_quoteblock.scss */ + .quoteblock blockquote { + padding-top: 6em; + } +} +/* line 37, ../sass/components/_quoteblock.scss */ +.quoteblock p { + font-style: italic; + line-height: 1.4; + margin: 0; +} +@media (min-width: 40em) { + /* line 37, ../sass/components/_quoteblock.scss */ + .quoteblock p { + font-size: 20px; + } +} +@media (min-width: 48em) { + /* line 37, ../sass/components/_quoteblock.scss */ + .quoteblock p { + font-size: 28px; + } +} +/* line 51, ../sass/components/_quoteblock.scss */ +.quoteblock cite { + display: block; + font-size: 14px; + font-style: normal; + margin-top: 1em; +} +@media (min-width: 48em) { + /* line 51, ../sass/components/_quoteblock.scss */ + .quoteblock cite { + font-size: 20px; + } +} +/* line 61, ../sass/components/_quoteblock.scss */ +.quoteblock cite:before { + border-top: 1px solid #fff; + content: ""; + display: block; + height: 0; + margin: 0 auto 1em auto; + width: 2em; +} + +/* line 72, ../sass/components/_quoteblock.scss */ +.quoteblock__avatar { + background: #7bbdcb url("../images/icons/quote.png") no-repeat 50% 50%; + border: 0.25em solid #fff; + border-radius: 50%; + display: block; + margin-left: -2.75em; + left: 50%; + position: absolute; + top: -2.75em; + width: 5em; +} +@media (min-width: 40em) { + /* line 72, ../sass/components/_quoteblock.scss */ + .quoteblock__avatar { + margin-left: -3.25em; + top: -3.25em; + width: 6em; + } +} +/* line 89, ../sass/components/_quoteblock.scss */ +.quoteblock__avatar img { + border-radius: 50%; + display: block; + width: 100%; +} + +/* line 1, ../sass/components/_related-content.scss */ +.related-content { + margin: 3em auto; + max-width: 65em; + padding: 0 1em; +} + +/* line 7, ../sass/components/_related-content.scss */ +.related-content__toggler { + background: none; + border: 2px solid #1b1a19; + border-radius: 5px; + color: #1b1a19; + display: block; + font-weight: bold; + line-height: 1.1; + margin: 0 auto; + max-width: 26em; + padding: 1.1em 1em 1em 1em; + text-transform: uppercase; + width: 100%; +} +/* line 21, ../sass/components/_related-content.scss */ +.related-content__toggler:before { + background: url("../images/icons/related-content--grid.png") no-repeat 0 0; + content: ""; + display: inline-block; + height: 19px; + margin-right: 1em; + position: relative; + top: -2px; + vertical-align: middle; + width: 19px; +} +/* line 33, ../sass/components/_related-content.scss */ +.related-content__toggler[aria-pressed="true"]:before { + background-image: url("../images/icons/related-content--close.png"); +} + +/* line 38, ../sass/components/_related-content.scss */ +.related-content__items { + padding-bottom: 1.5em; +} +/* line 43, ../sass/components/_related-content.scss */ +.related-content__items[aria-expanded="false"] { + display: none; +} + +/* line 48, ../sass/components/_related-content.scss */ +.related-content__item { + margin-top: 1.5em; +} +@media (min-width: 35em) { + /* line 48, ../sass/components/_related-content.scss */ + .related-content__item { + float: left; + padding: 0 0.75em; + width: 50%; + } + /* line 56, ../sass/components/_related-content.scss */ + .related-content__item:nth-child(odd) { + padding-left: 0; + } + /* line 60, ../sass/components/_related-content.scss */ + .related-content__item:nth-child(even) { + padding-right: 0; + } +} +@media (min-width: 60em) { + /* line 48, ../sass/components/_related-content.scss */ + .related-content__item { + width: 33.33333%; + } + /* line 68, ../sass/components/_related-content.scss */ + .related-content__item:nth-child(odd) { + padding-left: 0.75em; + } + /* line 72, ../sass/components/_related-content.scss */ + .related-content__item:nth-child(even) { + padding-right: 0.75em; + } +} +/* line 77, ../sass/components/_related-content.scss */ +.related-content__item a { + background: rgba(0, 0, 0, 0.6); + display: table; + height: 13.5em; + transition: background 100ms linear; + width: 100%; +} +/* line 84, ../sass/components/_related-content.scss */ +.related-content__item a:focus, .related-content__item a:hover { + background: rgba(0, 0, 0, 0.5); +} + +/* line 91, ../sass/components/_related-content.scss */ +.related-content__item__wrapper { + background: no-repeat 50% 50%; + background-size: cover; +} + +/* line 96, ../sass/components/_related-content.scss */ +.related-content__item__title { + color: #fff; + display: table-cell; + font-size: 20px; + font-weight: bold; + padding: 1em; + text-align: center; + vertical-align: middle; +} + +/* line 1, ../sass/components/_sales-offices.scss */ +.sales-offices .sales-offices__items { + margin-left: 2em; +} +@media (min-width: 56em) { + /* line 1, ../sass/components/_sales-offices.scss */ + .sales-offices .sales-offices__items { + margin-left: 0; + } +} + +/* line 12, ../sass/components/_sales-offices.scss */ +.sales-offices__item, .sales-offices__item + .sales-offices__item { + margin-top: 3em; +} +@media (min-width: 40em) { + /* line 11, ../sass/components/_sales-offices.scss */ + .sales-offices__item { + float: left; + padding-right: 2.5em; + width: 50%; + } + /* line 22, ../sass/components/_sales-offices.scss */ + .sales-offices__item:nth-child(odd) { + clear: left; + } +} +@media (min-width: 50em) { + /* line 11, ../sass/components/_sales-offices.scss */ + .sales-offices__item { + width: 33.33333%; + } + /* line 30, ../sass/components/_sales-offices.scss */ + .sales-offices__item:nth-child(odd) { + clear: none; + } + /* line 34, ../sass/components/_sales-offices.scss */ + .sales-offices__item:nth-child(3n+1) { + clear: left; + } +} +/* line 39, ../sass/components/_sales-offices.scss */ +.sales-offices__item:last-child { + margin-bottom: 0; +} +/* line 43, ../sass/components/_sales-offices.scss */ +.sales-offices__item .title { + color: #000; + font-size: 16px; + margin: 0; +} +/* line 49, ../sass/components/_sales-offices.scss */ +.sales-offices__item p { + margin: 0; +} + +/* line 54, ../sass/components/_sales-offices.scss */ +.sales-offices__item--has-address { + position: relative; +} +/* line 57, ../sass/components/_sales-offices.scss */ +.sales-offices__item--has-address:before { + background: url("../images/icons/sales-office-marker.png") no-repeat 0 0; + content: ""; + display: block; + height: 30px; + left: -2em; + position: absolute; + top: 0; + width: 20px; +} + +/* line 1, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid { + margin: 3em 0; +} +/* line 4, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid .layout-wrapper { + padding: 0 1em; +} + +/* line 9, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid__title { + font-size: 32px; + font-weight: normal; + margin: 0; + text-align: center; +} + +/* line 16, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid__items { + padding: 1em 0; + text-align: center; +} + +/* line 22, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid__item { + display: inline-block; + margin-top: 0.5em; + width: 50%; +} +@media (min-width: 30em) { + /* line 22, ../sass/components/_sponsor-grid.scss */ + .sponsor-grid__item { + width: 33.33333%; + } +} +@media (min-width: 40em) { + /* line 22, ../sass/components/_sponsor-grid.scss */ + .sponsor-grid__item { + width: 25%; + } +} +@media (min-width: 50em) { + /* line 22, ../sass/components/_sponsor-grid.scss */ + .sponsor-grid__item { + width: 20%; + } +} + +/* line 40, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid__item__wrapper { + display: table; + width: 100%; +} + +/* line 45, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid__item__logo { + display: table-cell; + margin: 0; + padding: 1em; + text-align: center; + vertical-align: middle; +} +/* line 52, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid__item__logo img { + max-width: 170px; + width: 100%; +} + +/* line 1, ../sass/components/_stats--contained.scss */ +.stats--contained { + background: #7bbdcb url("../images/patterns/mosaic-light.png") repeat 50% 50%; + color: #fff; + margin: 3em 0; + padding: 3em 0; +} + +/* line 8, ../sass/components/_stats--contained.scss */ +.stats--contained__header, +.stats--contained__content { + margin: 0 auto; + max-width: 65em; + padding: 0 1em; +} + +/* line 15, ../sass/components/_stats--contained.scss */ +.stats--contained__title { + font-size: 28px; + margin: 0; + text-align: center; +} + +/* line 27, ../sass/components/_stats--contained.scss */ +.stats--contained__content li { + font-size: 20px; + font-weight: bold; + line-height: 1.4; + margin-top: 1.5em; + padding: 0 0.5em; + text-align: center; +} +@media (min-width: 50em) { + /* line 27, ../sass/components/_stats--contained.scss */ + .stats--contained__content li { + float: left; + width: 33.33333%; + } +} +/* line 40, ../sass/components/_stats--contained.scss */ +.stats--contained__content li b { + display: block; + font-size: 56px; +} + +/* line 1, ../sass/components/_stats.scss */ +.stats { + margin: 1.5em auto 3em auto; +} +/* line 7, ../sass/components/_stats.scss */ +.stats .stats__content ul li + li { + margin-top: 1.5em; +} + +/* line 18, ../sass/components/_stats.scss */ +.stats__content li { + color: #000; + font-size: 20px; + font-weight: bold; + line-height: 1.4; + margin-top: 1.5em; + padding: 0 0.5em; + text-align: center; +} +@media (min-width: 50em) { + /* line 18, ../sass/components/_stats.scss */ + .stats__content li { + float: left; + width: 33.33333%; + } +} +/* line 32, ../sass/components/_stats.scss */ +.stats__content li span { + background: #ec1e2c no-repeat 50% 50%; + border-radius: 50%; + content: ""; + display: block; + height: 104px; + margin: 0 auto; + width: 104px; +} +/* line 42, ../sass/components/_stats.scss */ +.stats__content li b { + display: block; + font-size: 72px; +} + +/* line 1, ../sass/components/_textblock--centered.scss */ +.textblock--centered { + margin: 4em auto; + max-width: 52em; + padding: 0 1em; +} + +/* line 7, ../sass/components/_textblock--centered.scss */ +.textblock--centered__header { + text-align: center; +} + +/* line 11, ../sass/components/_textblock--centered.scss */ +.textblock--centered__header__title { + font-size: 32px; + font-weight: normal; +} + +/* line 16, ../sass/components/_textblock--centered.scss */ +.textblock--centered__content { + color: #757575; + font-size: 20px; + line-height: 1.6; + text-align: center; +} + +/* line 1, ../sass/components/_textblock--contained.scss */ +.textblock--contained { + background: #f2f2f2; + border: solid #e6e6e6; + border-width: 1px 0; + padding: 3em 1em; +} + +/* line 8, ../sass/components/_textblock--contained.scss */ +.textblock--contained__header, +.textblock--contained__content { + margin: 0 auto; + max-width: 50em; +} + +/* line 14, ../sass/components/_textblock--contained.scss */ +.textblock--contained__header { + margin-bottom: 3em; + text-align: center; +} + +/* line 19, ../sass/components/_textblock--contained.scss */ +.textblock--contained__header__title { + color: #757575; + font-size: 20px; + font-weight: bold; +} + +/* line 25, ../sass/components/_textblock--contained.scss */ +.textblock--contained__content { + color: #4a4947; + line-height: 1.6; +} +/* line 29, ../sass/components/_textblock--contained.scss */ +.textblock--contained__content ul { + padding-left: 1em; +} +/* line 33, ../sass/components/_textblock--contained.scss */ +.textblock--contained__content li + li { + margin-top: 0.5em; +} + +/* line 1, ../sass/components/_textblock.scss */ +.textblock { + margin: 4em auto; + max-width: 52em; + padding: 0 1em; +} + +/* line 7, ../sass/components/_textblock.scss */ +.textblock__header { + text-align: center; +} + +/* line 11, ../sass/components/_textblock.scss */ +.textblock__header__title { + font-size: 32px; + font-weight: normal; + line-height: 1.2; +} + +/* line 17, ../sass/components/_textblock.scss */ +.textblock__content { + color: #4a4947; + line-height: 1.6; +} +/* line 21, ../sass/components/_textblock.scss */ +.textblock__content .centered-title { + text-align: center; +} +/* line 25, ../sass/components/_textblock.scss */ +.textblock__content ul { + padding-left: 1em; +} +/* line 29, ../sass/components/_textblock.scss */ +.textblock__content li + li { + margin-top: 0.5em; +} +/* line 33, ../sass/components/_textblock.scss */ +.textblock__content figure { + margin: 1.5em 0; +} +/* line 36, ../sass/components/_textblock.scss */ +.textblock__content figure img { + display: block; + margin: 0 auto 1.5em auto; + max-width: 100%; +} +/* line 43, ../sass/components/_textblock.scss */ +.textblock__content figcaption { + color: #999; +} + +/* line 6, ../sass/components/_toggle-group.scss */ +.toggle-group__item { + float: left; +} +/* line 9, ../sass/components/_toggle-group.scss */ +.toggle-group__item a { + background: #f2f2f2; + border: 1px solid #e6e6e6; + border-radius: 0 0.25em 0.25em 0; + color: #bfbfbf; + display: block; + font-weight: bold; + padding: 1em 1.5em; +} +/* line 18, ../sass/components/_toggle-group.scss */ +.toggle-group__item a:focus, .toggle-group__item a:hover { + color: #9a9a9a; +} +/* line 24, ../sass/components/_toggle-group.scss */ +.toggle-group__item:first-child a { + border-radius: 0.25em 0 0 0.25em; +} + +/* line 29, ../sass/components/_toggle-group.scss */ +.toggle-group__item--current a { + background: #ec1e2c; + border-color: #ec1e2c; + color: #fff; +} +/* line 34, ../sass/components/_toggle-group.scss */ +.toggle-group__item--current a:focus, .toggle-group__item--current a:hover { + color: #fff; +} + +/* line 1, ../sass/components/_videoblock.scss */ +.videoblock { + margin: 3em 0; +} +/* line 4, ../sass/components/_videoblock.scss */ +.videoblock .layout-wrapper { + max-width: 52em; + padding: 0 1em; +} + +/* line 10, ../sass/components/_videoblock.scss */ +.videoblock__header { + margin-bottom: 3em; +} +/* line 13, ../sass/components/_videoblock.scss */ +.videoblock__header h1 { + font-size: 32px; + font-weight: normal; + margin: 0; + text-align: center; +} + +/* line 21, ../sass/components/_videoblock.scss */ +.videoblock__content { + height: 0; + margin: 0 auto; + padding-bottom: 56.25%; + position: relative; + width: 100%; +} +/* line 28, ../sass/components/_videoblock.scss */ +.videoblock__content iframe { + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +/* line 37, ../sass/components/_videoblock.scss */ +.videoblock__cover { + background: rgba(0, 0, 0, 0.75); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +/* line 46, ../sass/components/_videoblock.scss */ +.videoblock__button { + background: #ec1e2c; + border: 0; + border-radius: 3px; + color: #fff; + font-weight: bold; + left: 50%; + margin: -1.75em 0 0 -1.75em; + padding: 0; + position: absolute; + text-transform: uppercase; + top: 50%; +} +/* line 59, ../sass/components/_videoblock.scss */ +.videoblock__button:focus, .videoblock__button:hover { + background: #d7181b; +} +/* line 64, ../sass/components/_videoblock.scss */ +.videoblock__button span { + background: url("../images/icons/play.png") no-repeat 50% 50%; + display: block; + height: 3.5em; + width: 3.5em; +} + +@media (min-width: 58em) { + /* line 1, ../sass/components/developer-portal/_base.scss */ + .developer-portal { + height: 100%; + } + /* line 5, ../sass/components/developer-portal/_base.scss */ + .developer-portal body { + height: 100%; + overflow-x: auto; + overflow-y: hidden; + padding: 122px 0 0; + } +} + +/* line 1, ../sass/components/developer-portal/_content.scss */ +.developer-portal-global-content { + margin: 0 auto; + max-width: 68em; +} +@media (min-width: 58em) { + /* line 1, ../sass/components/developer-portal/_content.scss */ + .developer-portal-global-content { + height: 100%; + } +} + +@media (min-width: 58em) { + /* line 12, ../sass/components/developer-portal/_content.scss */ + .developer-portal-sidebar { + background: #f1f1f1 url("../images/patterns/thatch.png") repeat 50% 50%; + float: left; + height: 100%; + overflow-x: hidden; + overflow-y: scroll; + width: 25%; + } + + /* line 21, ../sass/components/developer-portal/_content.scss */ + .developer-portal-content { + border-left: 2px solid #e6e6e6; + float: left; + height: 100%; + overflow-x: hidden; + overflow-y: scroll; + width: 75%; + } +} +/* line 31, ../sass/components/developer-portal/_content.scss */ +.developer-portal-content__wrapper { + padding: 1em; +} +@media (min-width: 58em) { + /* line 31, ../sass/components/developer-portal/_content.scss */ + .developer-portal-content__wrapper { + padding: 3em; + } +} + +/* line 1, ../sass/components/developer-portal/_footer.scss */ +.developer-portal-footer { + background: #1b1a19; + padding: 1em; +} +@media (min-width: 42em) { + /* line 1, ../sass/components/developer-portal/_footer.scss */ + .developer-portal-footer { + padding-right: 3em; + } +} +/* line 9, ../sass/components/developer-portal/_footer.scss */ +.developer-portal-footer p { + color: #4a4947; + font-size: 12px; + line-height: 1.6; + margin: 0 -1em 0 0; + text-align: right; +} +/* line 17, ../sass/components/developer-portal/_footer.scss */ +.developer-portal-footer a { + color: #4a4947; + display: inline-block; + margin-right: 1em; +} +/* line 22, ../sass/components/developer-portal/_footer.scss */ +.developer-portal-footer a:focus, .developer-portal-footer a:hover { + text-decoration: underline; +} +/* line 28, ../sass/components/developer-portal/_footer.scss */ +.developer-portal-footer .license { + display: block; + margin: 0 1em 0.5em 0; +} +@media (min-width: 42em) { + /* line 28, ../sass/components/developer-portal/_footer.scss */ + .developer-portal-footer .license { + display: inline-block; + margin-bottom: 0; + } +} +/* line 38, ../sass/components/developer-portal/_footer.scss */ +.developer-portal-footer .company-name { + font-weight: normal; + text-transform: uppercase; +} + +/* line 1, ../sass/components/developer-portal/_header.scss */ +.developer-portal-header { + background: #fff; + border-bottom: 2px solid #e6e6e6; + padding: 1em; + width: 100%; +} +@media (min-width: 58em) { + /* line 1, ../sass/components/developer-portal/_header.scss */ + .developer-portal-header { + border-top: 3em solid #e6e6e6; + position: absolute; + top: 0; + width: 100%; + } +} +/* line 14, ../sass/components/developer-portal/_header.scss */ +.developer-portal-header > .layout-wrapper { + position: relative; +} + +/* line 1, ../sass/components/developer-portal/_header__logo.scss */ +.developer-portal-header__logo { + font-size: 16px; + margin: 0; +} +@media (min-width: 44em) { + /* line 1, ../sass/components/developer-portal/_header__logo.scss */ + .developer-portal-header__logo { + float: left; + } +} +/* line 9, ../sass/components/developer-portal/_header__logo.scss */ +.developer-portal-header__logo a { + background: url("../images/logo.svg") no-repeat 0 0; + background-size: contain; + display: block; + height: 26px; + width: 114px; +} +@media (min-width: 44em) { + /* line 9, ../sass/components/developer-portal/_header__logo.scss */ + .developer-portal-header__logo a { + height: 40px; + width: 175px; + } +} + +@media (min-width: 44em) { + /* line 1, ../sass/components/developer-portal/_header__navigation.scss */ + .developer-portal-header__navigation .primary-navigation__toggler { + display: block; + top: 1em; + } +} +@media (min-width: 58em) { + /* line 1, ../sass/components/developer-portal/_header__navigation.scss */ + .developer-portal-header__navigation .primary-navigation__toggler { + display: none; + } +} + +/* line 12, ../sass/components/developer-portal/_header__navigation.scss */ +.developer-portal-header__navigation__wrapper { + border-top: 2px solid #e6e6e6; + margin: 1em -1em 0 -1em; +} +@media (min-width: 58em) { + /* line 12, ../sass/components/developer-portal/_header__navigation.scss */ + .developer-portal-header__navigation__wrapper { + border: 0; + margin: 0; + } +} +/* line 21, ../sass/components/developer-portal/_header__navigation.scss */ +.primary-navigation__toggler + .developer-portal-header__navigation__wrapper { + clip: rect(0 0 0 0); + height: 0; + overflow: hidden; + position: absolute; + width: 0; +} +/* line 25, ../sass/components/developer-portal/_header__navigation.scss */ +.developer-portal-header__navigation__wrapper[aria-expanded="true"] { + clip: auto; + height: auto; + overflow: visible; + position: static; + width: auto; +} +@media (min-width: 58em) { + /* line 30, ../sass/components/developer-portal/_header__navigation.scss */ + .primary-navigation__toggler + .developer-portal-header__navigation__wrapper { + clip: auto; + height: auto; + overflow: visible; + position: static; + width: auto; + } +} + +/* line 36, ../sass/components/developer-portal/_header__navigation.scss */ +.developer-porta-header__navigation__back { + background: url("../images/icons/header-backlink.png") no-repeat 0 40%; + display: none; + font-weight: bold; + left: 0; + padding-left: 1em; + position: absolute; + text-transform: uppercase; + top: -3em; +} +@media (min-width: 68em) { + /* line 36, ../sass/components/developer-portal/_header__navigation.scss */ + .developer-porta-header__navigation__back { + display: inline-block; + } +} + +/* line 51, ../sass/components/developer-portal/_header__navigation.scss */ +.developer-portal-header__navigation__items { + padding: 0.5em 0; +} +@media (min-width: 58em) { + /* line 51, ../sass/components/developer-portal/_header__navigation.scss */ + .developer-portal-header__navigation__items { + margin: -4em -0.75em 0 0; + position: absolute; + right: 0; + top: 0; + } +} + +@media (min-width: 58em) { + /* line 64, ../sass/components/developer-portal/_header__navigation.scss */ + .developer-portal-header__navigation__item { + float: left; + } +} +/* line 69, ../sass/components/developer-portal/_header__navigation.scss */ +.developer-portal-header__navigation__item a { + color: #000; + display: block; + font-size: 20px; + padding: 0.4em 0.8em; +} +@media (min-width: 58em) { + /* line 69, ../sass/components/developer-portal/_header__navigation.scss */ + .developer-portal-header__navigation__item a { + font-size: 16px; + font-weight: bold; + padding: 0.5em 0.75em; + } +} +/* line 81, ../sass/components/developer-portal/_header__navigation.scss */ +.developer-portal-header__navigation__item a:focus, .developer-portal-header__navigation__item a:hover { + color: #ec1e2c; +} + +/* line 1, ../sass/components/developer-portal/_header__page-title.scss */ +.developer-portal-header__page-title { + display: none; + float: left; + font-size: 24px; + font-weight: normal; + margin: 0 0 0 1em; + padding-top: 0.4em; +} +@media (min-width: 44em) { + /* line 1, ../sass/components/developer-portal/_header__page-title.scss */ + .developer-portal-header__page-title { + display: block; + } +} + +/* line 1, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search { + background: #f2f2f2; + margin-bottom: -1em; + clear: both; +} +@media (min-width: 58em) { + /* line 1, ../sass/components/developer-portal/_header__search.scss */ + .developer-portal-header__search { + background: none; + border: solid #e6e6e6; + border-width: 0 2px; + bottom: -1em; + margin: 0; + padding: 0.8em 1em 0.8em 2em; + position: absolute; + top: -1em; + right: 0; + width: 22em; + } +} +/* line 19, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search ul { + display: table; + width: 100%; +} +/* line 25, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search li { + display: table-cell; + vertical-align: top; +} +/* line 29, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search li + li { + width: 3em; +} +/* line 34, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search label { + clip: rect(0 0 0 0); + height: 0; + overflow: hidden; + position: absolute; + width: 0; +} +/* line 38, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search input[type="search"] { + background: none; + border: 0; + padding: 0 1em; + height: 3em; + width: 100%; +} +@media (min-width: 58em) { + /* line 38, ../sass/components/developer-portal/_header__search.scss */ + .developer-portal-header__search input[type="search"] { + padding-left: 0; + } +} +/* line 50, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search button { + background: #e6e6e6 url("../images/icons/search.png") no-repeat 50% 50%; + background-size: contain; + border: 0; + height: 3em; + width: 3em; +} +@media (min-width: 58em) { + /* line 50, ../sass/components/developer-portal/_header__search.scss */ + .developer-portal-header__search button { + border-radius: 0.25em; + } +} +/* line 61, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search button:focus, .developer-portal-header__search button:hover { + background-color: #d9d9d9; +} +/* line 66, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search button span { + display: block; +} +/* line 72, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search li button { + display: block; +} + +/* line 1, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__toggler { + background: none; + border: 0; + padding: 0; + text-align: left; + width: 100%; +} +@media (min-width: 58em) { + /* line 1, ../sass/components/developer-portal/_sidebar__navigation.scss */ + .developer-portal-sidebar__navigation__toggler { + display: none; + } +} +/* line 12, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__toggler span { + background: #f2f2f2 url("../images/icons/developer-portal-sidebar-navigation-toggler.png") no-repeat 100% 50%; + border-radius: 0.25em; + display: block; + font-weight: bold; + margin: 0.5em 1em; + padding: 1em 3.5em 1em 1em; +} + +/* line 22, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper { + background: #f2f2f2; +} +/* line 25, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper[aria-expanded="false"] { + display: none; +} +@media (min-width: 58em) { + /* line 25, ../sass/components/developer-portal/_sidebar__navigation.scss */ + .developer-portal-sidebar__navigation__wrapper[aria-expanded="false"] { + display: block; + } +} +/* line 37, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper a { + border-bottom: 2px solid #e6e6e6; + display: block; + font-weight: bold; +} +/* line 43, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper a:focus, .developer-portal-sidebar__navigation__wrapper a:hover { + background: rgba(0, 0, 0, 0.02); +} +/* line 48, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper a span { + display: block; + padding: 1em; + width: 100%; +} +@media (min-width: 58em) { + /* line 48, ../sass/components/developer-portal/_sidebar__navigation.scss */ + .developer-portal-sidebar__navigation__wrapper a span { + max-width: 20em; + float: right; + } +} +/* line 60, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper .section--has-sub-sections > a span { + background: url("../images/icons/developer-portal-sidebar-navigation.png") no-repeat 100% 50%; + padding-right: 3.5em; +} +/* line 66, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper .section--active a { + color: #000; +} +/* line 70, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper .section--active > a { + background: #e6e6e6; +} +/* line 73, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper .section--active > a span { + background-image: url("../images/icons/developer-portal-sidebar-navigation--active.png"); +} +/* line 80, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper .sub-sections span { + padding-left: 2.5em; +} +/* line 84, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper .sub-sections ul span { + padding-left: 4em; +} + +/* line 1, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions { + background: #fff; +} +/* line 4, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions ul { + padding: 0.5em 0; +} +/* line 8, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions ul[aria-expanded="false"] { + display: none; +} +/* line 13, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions a { + display: block; + font-weight: bold; +} +/* line 18, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions a span { + display: block; + padding: 0.5em 1em; + width: 100%; +} +@media (min-width: 58em) { + /* line 18, ../sass/components/developer-portal/_versions.scss */ + .developer-portal-sidebar__versions a span { + max-width: 20em; + float: right; + } +} +/* line 30, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions .active a { + color: #bfbfbf; +} + +/* line 35, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions__toggler { + border-bottom: 4px solid #bfbfbf; +} +/* line 39, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions__toggler button { + background: none; + border: 0; + display: block; + padding: 0; + text-align: left; + width: 100%; +} +@media (min-width: 58em) { + /* line 39, ../sass/components/developer-portal/_versions.scss */ + .developer-portal-sidebar__versions__toggler button { + max-width: 20em; + float: right; + } +} +/* line 53, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions__toggler span { + background: url("../images/icons/developer-portal-sidebar-versions-toggler.png") no-repeat 100% 50%; + color: #bfbfbf; + display: block; + font-weight: bold; + padding: 1em; +} +/* line 61, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions__toggler [aria-pressed="true"] span { + background-image: url("../images/icons/developer-portal-sidebar-versions-toggler--active.png"); + color: #000; +} + +/* line 1, ../sass/components/global/_global-footer.scss */ +.global-footer { + background: #282725; + padding: 3em 1em; +} + +/* line 7, ../sass/components/global/_global-footer.scss */ +.global-footer__contact { + margin-bottom: 3em; +} +@media (min-width: 58em) { + /* line 7, ../sass/components/global/_global-footer.scss */ + .global-footer__contact { + float: left; + margin-right: 3em; + width: 16em; + } +} + +/* line 18, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__button { + background: #4a4947; + color: #fff; + display: block; +} +@media (min-width: 42em) { + /* line 18, ../sass/components/global/_global-footer.scss */ + .global-footer__contact__button { + float: left; + width: 14em; + } +} +@media (min-width: 58em) { + /* line 18, ../sass/components/global/_global-footer.scss */ + .global-footer__contact__button { + width: 100%; + } +} +/* line 33, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__button:focus, .global-footer__contact__button:hover { + background: #454442; +} + +/* line 39, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social { + margin-top: 1.5em; +} +@media (min-width: 42em) { + /* line 39, ../sass/components/global/_global-footer.scss */ + .global-footer__contact__social { + float: right; + margin-top: 0.5em; + width: 16em; + } +} +@media (min-width: 58em) { + /* line 39, ../sass/components/global/_global-footer.scss */ + .global-footer__contact__social { + margin-top: 1.5em; + } +} +/* line 54, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social li { + float: left; + text-align: center; + width: 25%; +} +/* line 60, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social a { + background: no-repeat 0 0; + display: block; + margin: 0 auto; + height: 32px; + width: 32px; +} +/* line 70, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social .facebook { + background-image: url("../images/icons/social-facebook.png"); +} +/* line 70, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social .googleplus { + background-image: url("../images/icons/social-googleplus.png"); +} +/* line 70, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social .linkedin { + background-image: url("../images/icons/social-linkedin.png"); +} +/* line 70, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social .twitter { + background-image: url("../images/icons/social-twitter.png"); +} +/* line 75, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social .twitter { + width: 36px; +} + +/* line 1, ../sass/components/global/_global-header-search.scss */ +.global-header-search { + background: #f2f2f2; + clear: both; +} +/* line 5, ../sass/components/global/_global-header-search.scss */ +.global-header-search ul { + display: table; + width: 100%; +} +/* line 11, ../sass/components/global/_global-header-search.scss */ +.global-header-search li { + display: table-cell; + vertical-align: top; +} +/* line 15, ../sass/components/global/_global-header-search.scss */ +.global-header-search li + li { + width: 3em; +} +/* line 20, ../sass/components/global/_global-header-search.scss */ +.global-header-search label { + clip: rect(0 0 0 0); + height: 0; + overflow: hidden; + position: absolute; + width: 0; +} +/* line 24, ../sass/components/global/_global-header-search.scss */ +.global-header-search input[type="search"] { + background: none; + border: 0; + height: 3em; + width: 100%; +} +@media (min-width: 44em) { + /* line 24, ../sass/components/global/_global-header-search.scss */ + .global-header-search input[type="search"] { + padding-left: 1em; + } +} +/* line 35, ../sass/components/global/_global-header-search.scss */ +.global-header-search button { + background: #e6e6e6 url("../images/icons/search.png") no-repeat 50% 50%; + background-size: contain; + border: 0; + height: 3em; + width: 3em; +} +/* line 42, ../sass/components/global/_global-header-search.scss */ +.global-header-search button:focus, .global-header-search button:hover { + background-color: #d9d9d9; +} +/* line 47, ../sass/components/global/_global-header-search.scss */ +.global-header-search button span { + display: block; +} +/* line 53, ../sass/components/global/_global-header-search.scss */ +.global-header-search li button { + display: block; +} + +@media (min-width: 68em) { + /* line 59, ../sass/components/global/_global-header-search.scss */ + .global-header-search--js { + left: 16.25em; + padding-right: 3em; + position: absolute; + right: 9.5em; + top: 0; + } + /* line 66, ../sass/components/global/_global-header-search.scss */ + .global-header-search--js[aria-expanded="false"] { + left: auto; + overflow: hidden; + width: 3em; + } + /* line 72, ../sass/components/global/_global-header-search.scss */ + .global-header-search--js li button { + background-color: transparent; + } +} +/* line 78, ../sass/components/global/_global-header-search.scss */ +.global-header-search__toggler { + display: none; + position: absolute; + right: 0; + top: 0; +} +@media (min-width: 68em) { + /* line 78, ../sass/components/global/_global-header-search.scss */ + .global-header-search__toggler { + display: block; + } + /* line 87, ../sass/components/global/_global-header-search.scss */ + .global-header-search--js[aria-expanded="true"] .global-header-search__toggler { + background-image: url("../images/icons/search-close.png"); + } +} + +/* line 1, ../sass/components/global/_global-header.scss */ +.global-header { + padding: 1em 1em 0 1em; +} +/* line 5, ../sass/components/global/_global-header.scss */ +.global-header > .layout-wrapper { + position: relative; +} + +/* line 10, ../sass/components/global/_global-header.scss */ +.global-header__download-button { + display: none; + padding: 1em; + width: 8.75em; +} +@media (min-width: 68em) { + /* line 10, ../sass/components/global/_global-header.scss */ + .global-header__download-button { + display: inline-block; + position: absolute; + right: 0; + top: 0; + } +} + +/* line 1, ../sass/components/global/_global-header__logo.scss */ +.global-header__logo { + font-size: 16px; + margin: 0; +} +@media (min-width: 58em) { + /* line 1, ../sass/components/global/_global-header__logo.scss */ + .global-header__logo { + float: left; + margin-bottom: 0.75em; + } +} +/* line 10, ../sass/components/global/_global-header__logo.scss */ +.global-header__logo a { + background: url("../images/logo.svg") no-repeat 0 0; + background-size: contain; + display: block; + height: 26px; + width: 114px; +} +@media (min-width: 44em) { + /* line 10, ../sass/components/global/_global-header__logo.scss */ + .global-header__logo a { + height: 52px; + width: 227px; + } +} + +/* line 1, ../sass/components/global/_global-sub-footer.scss */ +.global-sub-footer { + background: #1b1a19; + padding: 1em; +} +/* line 6, ../sass/components/global/_global-sub-footer.scss */ +.global-sub-footer p { + color: #4a4947; + font-size: 12px; + line-height: 1.6; + margin: 0; +} +/* line 13, ../sass/components/global/_global-sub-footer.scss */ +.global-sub-footer a { + color: #4a4947; + display: inline-block; + margin-right: 1em; +} +/* line 18, ../sass/components/global/_global-sub-footer.scss */ +.global-sub-footer a:focus, .global-sub-footer a:hover { + text-decoration: underline; +} +@media (min-width: 58em) { + /* line 25, ../sass/components/global/_global-sub-footer.scss */ + .global-sub-footer .legal { + float: left; + } +} +/* line 30, ../sass/components/global/_global-sub-footer.scss */ +.global-sub-footer .license { + display: block; + margin-bottom: 1em; +} +@media (min-width: 42em) { + /* line 30, ../sass/components/global/_global-sub-footer.scss */ + .global-sub-footer .license { + display: inline-block; + margin: 0 1em 0 0; + } +} +/* line 40, ../sass/components/global/_global-sub-footer.scss */ +.global-sub-footer .company-name { + font-weight: normal; + text-transform: uppercase; +} +/* line 45, ../sass/components/global/_global-sub-footer.scss */ +.global-sub-footer .languages { + margin-top: 1em; +} +@media (min-width: 58em) { + /* line 45, ../sass/components/global/_global-sub-footer.scss */ + .global-sub-footer .languages { + float: right; + margin: 0; + } +} + +/* line 1, ../sass/components/homepage/_customers.scss */ +.homepage-customers { + margin: 3em 0; + padding: 0 1em; +} +/* line 5, ../sass/components/homepage/_customers.scss */ +.homepage-customers hr { + margin: 1.5em auto; +} + +/* line 10, ../sass/components/homepage/_customers.scss */ +.homepage-customers__title { + font-weight: normal; + margin: 0; + text-align: center; +} + +/* line 16, ../sass/components/homepage/_customers.scss */ +.homepage-customers__content { + overflow: hidden; + width: 100%; +} + +/* line 21, ../sass/components/homepage/_customers.scss */ +.homepage-customers__items { + float: left; + left: 50%; + position: relative; +} + +/* line 28, ../sass/components/homepage/_customers.scss */ +.homepage-customers__item { + float: left; + position: relative; + right: 50%; +} + +/* line 34, ../sass/components/homepage/_customers.scss */ +.homepage-customers__item__wrapper { + display: table; + width: 100%; +} + +/* line 39, ../sass/components/homepage/_customers.scss */ +.homepage-customers__item__logo { + display: table-cell; + height: 100px; + margin: 0; + max-width: 150px; + padding: 0 1em 1em 1em; + text-align: center; + vertical-align: middle; +} +/* line 48, ../sass/components/homepage/_customers.scss */ +.homepage-customers__item__logo img { + width: 100%; +} + +/* line 1, ../sass/components/homepage/_get-started.scss */ +.homepage-get-started { + background: #f2f2f2; + padding: 3em 1em; +} + +/* line 6, ../sass/components/homepage/_get-started.scss */ +.homepage-get-started__header { + margin-bottom: 3em; + text-align: center; +} +/* line 10, ../sass/components/homepage/_get-started.scss */ +.homepage-get-started__header h1 { + font-weight: normal; + margin: 0; +} + +/* line 16, ../sass/components/homepage/_get-started.scss */ +.homepage-get-started__content { + text-align: center; +} +@media (min-width: 30em) { + /* line 23, ../sass/components/homepage/_get-started.scss */ + .homepage-get-started__content li { + display: inline-block; + padding: 0 0.5em; + width: 18em; + } +} +/* line 30, ../sass/components/homepage/_get-started.scss */ +.homepage-get-started__content li + li { + margin-top: 1em; +} +@media (min-width: 30em) { + /* line 30, ../sass/components/homepage/_get-started.scss */ + .homepage-get-started__content li + li { + margin: 0; + } +} +/* line 39, ../sass/components/homepage/_get-started.scss */ +.homepage-get-started__content a { + width: 100%; +} + +/* line 1, ../sass/components/homepage/_image-header.scss */ +.homepage-image-header { + background: url("../images/photos/homepage-image-header.jpg") no-repeat 50% 50%; + background-size: cover; +} + +/* line 6, ../sass/components/homepage/_image-header.scss */ +.homepage-image-header__content { + margin: 0 auto; + max-width: 68em; + padding: 6em 1em; +} +@media (min-width: 30em) { + /* line 6, ../sass/components/homepage/_image-header.scss */ + .homepage-image-header__content { + padding: 15em 1em; + } +} +/* line 15, ../sass/components/homepage/_image-header.scss */ +.homepage-image-header__content p { + color: #fff; + font-size: 28px; + line-height: 1.2; + margin: 0; + text-align: center; + text-shadow: 0 0 1em rgba(0, 0, 0, 0.4); +} +@media (min-width: 30em) { + /* line 15, ../sass/components/homepage/_image-header.scss */ + .homepage-image-header__content p { + font-size: 56px; + } +} + +/* line 1, ../sass/components/homepage/_products.scss */ +.homepage-products { + background: #00bfe8 url("../images/patterns/mosaic-bright.png") repeat 50% 50%; + color: #fff; + margin: 3em 0; + padding: 3em 1em; + text-align: center; +} + +/* line 9, ../sass/components/homepage/_products.scss */ +.homepage-products__title { + font-weight: normal; + margin: 0; +} + +/* line 14, ../sass/components/homepage/_products.scss */ +.homepage-products__content { + margin-top: 1.5em; +} +/* line 17, ../sass/components/homepage/_products.scss */ +.homepage-products__content p { + font-size: 20px; + line-height: 1.6; + margin: 0 auto; + max-width: 34em; +} +/* line 24, ../sass/components/homepage/_products.scss */ +.homepage-products__content ul { + margin-top: 3em; +} +/* line 30, ../sass/components/homepage/_products.scss */ +.homepage-products__content li { + margin-bottom: 3em; + padding: 0 1em; +} +@media (min-width: 30em) { + /* line 30, ../sass/components/homepage/_products.scss */ + .homepage-products__content li { + float: left; + width: 50%; + } + /* line 38, ../sass/components/homepage/_products.scss */ + .homepage-products__content li:nth-child(odd) { + clear: left; + } +} +@media (min-width: 30em) { + /* line 30, ../sass/components/homepage/_products.scss */ + .homepage-products__content li { + width: 25%; + } + /* line 46, ../sass/components/homepage/_products.scss */ + .homepage-products__content li:nth-child(odd) { + clear: none; + } + /* line 50, ../sass/components/homepage/_products.scss */ + .homepage-products__content li:nth-child(4n+1) { + clear: left; + } +} +/* line 55, ../sass/components/homepage/_products.scss */ +.homepage-products__content li span { + background: #fff no-repeat 50% 50%; + border-radius: 50%; + display: block; + margin: 0 auto 1.5em auto; + height: 124px; + width: 124px; +} +/* line 64, ../sass/components/homepage/_products.scss */ +.homepage-products__content li b { + color: #1b1a19; + font-weight: bold; + line-height: 1.4; + text-transform: uppercase; +} + +/* line 78, ../sass/components/homepage/_products.scss */ +.homepage-products__actions li { + margin-top: 3em; +} +/* line 81, ../sass/components/homepage/_products.scss */ +.homepage-products__actions li:first-child { + margin-top: 0; +} +@media (min-width: 30em) { + /* line 78, ../sass/components/homepage/_products.scss */ + .homepage-products__actions li { + display: inline-block; + margin: 0 1.5em; + } +} +/* line 91, ../sass/components/homepage/_products.scss */ +.homepage-products__actions a { + min-width: 16em; +} +/* line 95, ../sass/components/homepage/_products.scss */ +.homepage-products__actions span { + display: block; + margin-top: 1.5em; +} + +/* line 1, ../sass/components/homepage/_promos.scss */ +.homepage-promos { + background: #f2f2f2; + border-bottom: 1px solid #e6e6e6; +} + +/* line 7, ../sass/components/homepage/_promos.scss */ +.homepage-promos__promo { + padding: 3em 1em; +} +@media (min-width: 50em) { + /* line 7, ../sass/components/homepage/_promos.scss */ + .homepage-promos__promo { + float: left; + width: 50%; + } + /* line 14, ../sass/components/homepage/_promos.scss */ + .homepage-promos__promo:first-child { + border-right: 1px solid #e6e6e6; + padding-right: 3em; + } + /* line 19, ../sass/components/homepage/_promos.scss */ + .homepage-promos__promo + .homepage-promos__promo { + border-left: 1px solid #e6e6e6; + margin-left: -1px; + padding-left: 3em; + } +} +/* line 26, ../sass/components/homepage/_promos.scss */ +.homepage-promos__promo h1 { + font-weight: normal; + line-height: 1.4; + margin: 0; +} +/* line 32, ../sass/components/homepage/_promos.scss */ +.homepage-promos__promo p { + color: #757575; + font-size: 20px; + line-height: 1.6; + margin: 1em 0; +} + +@media (min-width: 58em) { + /* line 1, ../sass/components/navigation/_footer-navigation.scss */ + .footer-navigation { + padding-left: 19em; + } +} + +/* line 9, ../sass/components/navigation/_footer-navigation.scss */ +.footer-navigation__group, .footer-navigation__group--even { + clear: left; + float: left; + margin-bottom: 3em; + padding-right: 1em; + width: 50%; +} + +/* line 17, ../sass/components/navigation/_footer-navigation.scss */ +.footer-navigation__group--even { + clear: right; + float: right; +} + +@media (min-width: 42em) { + /* line 24, ../sass/components/navigation/_footer-navigation.scss */ + .footer-navigation__group, .footer-navigation__group--even, + .footer-navigation__group--even { + clear: none; + float: left; + margin-bottom: 0; + width: 25%; + } +} +/* line 33, ../sass/components/navigation/_footer-navigation.scss */ +.footer-navigation__title { + color: #4a4947; + font-size: 14px; + margin: 0 0 1.5em 0; + text-transform: uppercase; +} + +/* line 44, ../sass/components/navigation/_footer-navigation.scss */ +.footer-navigation__item { + font-size: 14px; + margin-top: 0.75em; +} +/* line 48, ../sass/components/navigation/_footer-navigation.scss */ +.footer-navigation__item a { + color: #848380; + display: inline-block; + font-weight: bold; + margin: -0.25em; + padding: 0.25em; +} +/* line 55, ../sass/components/navigation/_footer-navigation.scss */ +.footer-navigation__item a:focus, .footer-navigation__item a:hover { + text-decoration: underline; +} + +/* line 1, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__toggler { + background: none; + border: 0; + display: block; + font-size: 14px; + font-weight: bold; + margin: -1em; + padding: 1em 2.5em 1em 1em; + position: absolute; + right: 0; + text-transform: uppercase; + top: 0.6em; +} +@media (min-width: 44em) { + /* line 1, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__toggler { + display: none; + } +} +/* line 18, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__toggler:before, .primary-navigation__toggler:after { + background: #000; + content: ""; + display: block; + height: 4px; + margin-top: -4px; + position: absolute; + right: 1em; + top: 50%; + transition: all 100ms linear; + width: 12px; +} +/* line 32, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__toggler:after { + -ms-transform: rotate(90deg); + -webkit-transform: rotate(90deg); + transform: rotate(90deg); +} +/* line 36, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__toggler[aria-pressed="true"] { + color: #ec1e2c; +} +/* line 39, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__toggler[aria-pressed="true"]:before, .primary-navigation__toggler[aria-pressed="true"]:after { + background: #ec1e2c; + -ms-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} +/* line 45, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__toggler[aria-pressed="true"]:after { + -ms-transform: rotate(135deg); + -webkit-transform: rotate(135deg); + transform: rotate(135deg); +} + +/* line 51, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation { + border-top: 1px solid #e6e6e6; + margin: 1em -1em 0 -1em; +} +@media (min-width: 58em) { + /* line 51, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation { + border: 0; + margin: 0; + } +} + +/* line 62, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__toggler + .primary-navigation__wrapper { + clip: rect(0 0 0 0); + height: 0; + overflow: hidden; + position: absolute; + width: 0; +} +/* line 66, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__wrapper[aria-expanded="true"] { + clip: auto; + height: auto; + overflow: visible; + position: static; + width: auto; +} +@media (min-width: 44em) { + /* line 71, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__toggler + .primary-navigation__wrapper { + clip: auto; + height: auto; + overflow: visible; + position: static; + width: auto; + } +} + +/* line 77, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__items { + -moz-column-count: 2; + -webkit-column-count: 2; + column-count: 2; + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + padding: 1em 1em 0 3em; +} +@media (min-width: 34em) { + /* line 77, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__items { + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + } +} +@media (min-width: 44em) { + /* line 77, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__items { + -moz-column-count: auto; + -webkit-column-count: auto; + column-count: auto; + padding: 1.5em 1em; + } +} +@media (min-width: 58em) { + /* line 77, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__items { + float: left; + margin: -0.25em 0 0 2em; + } +} + +/* line 99, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__item { + margin-bottom: 1em; +} +@media (min-width: 44em) { + /* line 99, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__item { + float: left; + margin: 0; + position: relative; + } + /* line 107, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__item + .primary-navigation__item { + margin-left: 2em; + } +} +/* line 112, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__item > a { + color: #000; + display: inline-block; +} +@media (min-width: 44em) { + /* line 112, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__item > a { + margin: -0.5em -0.75em; + padding: 0.5em 0.75em; + } +} +/* line 121, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__item > a:focus, .primary-navigation__item > a:hover { + color: #ec1e2c; +} + +@media (min-width: 44em) { + /* line 130, ../sass/components/navigation/_primary-navigation.scss */ + .has-secondary-navigation:before { + background: #1b1a19; + bottom: 0; + content: ""; + display: none; + left: -1.25em; + position: absolute; + top: -1.25em; + width: 12em; + } + /* line 141, ../sass/components/navigation/_primary-navigation.scss */ + .has-secondary-navigation > a:after { + background: url("../images/icons/nav-arrow.png") no-repeat 0 0; + content: ""; + display: inline-block; + height: 6px; + margin: -2px 0 0 0.5em; + vertical-align: middle; + width: 9px; + } + /* line 151, ../sass/components/navigation/_primary-navigation.scss */ + .has-secondary-navigation:hover { + z-index: 1; + } + /* line 154, ../sass/components/navigation/_primary-navigation.scss */ + .has-secondary-navigation:hover:before { + display: block; + } + /* line 158, ../sass/components/navigation/_primary-navigation.scss */ + .has-secondary-navigation:hover > a { + color: #ec1e2c; + position: relative; + } + /* line 162, ../sass/components/navigation/_primary-navigation.scss */ + .has-secondary-navigation:hover > a:after { + background-image: url("../images/icons/nav-arrow--active.png"); + } + /* line 167, ../sass/components/navigation/_primary-navigation.scss */ + .has-secondary-navigation:hover .secondary-navigation { + display: block; + } +} +/* line 1, ../sass/components/navigation/_secondary-navigation.scss */ +.secondary-navigation { + background: #1b1a19; + display: none; + left: -1.25em; + position: absolute; + top: 100%; + width: 12em; +} + +/* line 10, ../sass/components/navigation/_secondary-navigation.scss */ +.secondary-navigation__items { + padding: 1.25em; +} + +/* line 16, ../sass/components/navigation/_secondary-navigation.scss */ +.secondary-navigation__item + .secondary-navigation__item { + margin-top: 1em; +} +/* line 20, ../sass/components/navigation/_secondary-navigation.scss */ +.secondary-navigation__item a { + color: #fff; + display: inline-block; + margin: -0.25em; + padding: 0.25em; +} +/* line 26, ../sass/components/navigation/_secondary-navigation.scss */ +.secondary-navigation__item a:focus, .secondary-navigation__item a:hover { + color: #ec1e2c; +} + +@media (min-width: 56em) { + /* line 4, ../sass/components/products/_base.scss */ + .page-products, + .page-products-mobile { + height: 100%; + } +} +@media (min-width: 56em) { + /* line 10, ../sass/components/products/_base.scss */ + .page-products body, + .page-products-mobile body { + height: 100%; + } +} + +/* line 19, ../sass/components/products/_base.scss */ +.page-products .global-content, +.page-products-mobile .global-content { + overflow: hidden; +} + +/* line 24, ../sass/components/products/_base.scss */ +.product-section { + position: relative; +} +/* line 27, ../sass/components/products/_base.scss */ +.product-section[data-brkpnt-small='image-bottom'] { + padding-bottom: 250px; +} +/* line 31, ../sass/components/products/_base.scss */ +.product-section[data-brkpnt-small='image-bottom--flush'] { + padding-bottom: 200px; +} +/* line 35, ../sass/components/products/_base.scss */ +.product-section[data-brkpnt-small='image-top'] { + padding-top: 250px; +} +@media (min-width: 56em) { + /* line 24, ../sass/components/products/_base.scss */ + .product-section { + overflow: hidden; + padding: 0 !important; + width: 100%; + } +} + +@media (min-width: 56em) { + /* line 47, ../sass/components/products/_base.scss */ + .page-products .global-content { + height: 800%; + } +} +@media (min-width: 56em) { + /* line 53, ../sass/components/products/_base.scss */ + .page-products .product-section { + height: 12.5%; + } +} + +@media (min-width: 56em) { + /* line 61, ../sass/components/products/_base.scss */ + .page-products-mobile .global-content { + height: 500%; + } +} +@media (min-width: 56em) { + /* line 67, ../sass/components/products/_base.scss */ + .page-products-mobile .product-section { + height: 20%; + } +} + +/* line 1, ../sass/components/products/_button.scss */ +.product-section__button { + border: 2px solid #000; + border-radius: 3px; + color: #000; + display: inline-block; + font-size: 16px; + font-weight: bold; + padding: 12px 36px; + text-decoration: none; + text-transform: uppercase; + transition: all 200ms; +} + +/* line 1, ../sass/components/products/_content.scss */ +.product-section__content { + font-size: 14px; + line-height: 1.4; + text-align: center; + padding: 50px 0; +} +@media (min-width: 30em) { + /* line 1, ../sass/components/products/_content.scss */ + .product-section__content { + font-size: 16px; + } +} +@media (min-width: 56em) { + /* line 1, ../sass/components/products/_content.scss */ + .product-section__content { + font-size: 18px; + } +} +/* line 15, ../sass/components/products/_content.scss */ +.product-section__content h2 { + font-size: 26px; + line-height: 1.2; + margin: 0 0 10px; +} +/* line 20, ../sass/components/products/_content.scss */ +.product-section__content h2 + p { + margin-top: 0; +} +@media (min-width: 30em) { + /* line 15, ../sass/components/products/_content.scss */ + .product-section__content h2 { + font-size: 28px; + } +} +@media (min-width: 56em) { + /* line 15, ../sass/components/products/_content.scss */ + .product-section__content h2 { + font-size: 30px; + margin-left: 20%; + margin-right: 20%; + } +} +/* line 35, ../sass/components/products/_content.scss */ +.product-section__content p { + margin: 15px 5% 0; +} +@media (min-width: 30em) { + /* line 35, ../sass/components/products/_content.scss */ + .product-section__content p { + margin-left: 15%; + margin-right: 15%; + } +} +@media (min-width: 56em) { + /* line 35, ../sass/components/products/_content.scss */ + .product-section__content p { + margin-left: 12%; + margin-right: 12%; + } + /* line 47, ../sass/components/products/_content.scss */ + [data-brkpnt-large='image-bottom'] .product-section__content p { + margin-left: 32%; + margin-right: 32%; + } +} +@media (min-width: 56em) { + /* line 1, ../sass/components/products/_content.scss */ + .product-section__content { + display: table; + padding: 0; + } + /* line 58, ../sass/components/products/_content.scss */ + [data-brkpnt-large='image-bottom'] .product-section__content { + height: 50%; + padding-top: 70px; + width: 100%; + } + /* line 64, ../sass/components/products/_content.scss */ + [data-brkpnt-large='image-left'] .product-section__content, [data-brkpnt-large='image-right'] .product-section__content { + height: 100%; + width: 50%; + } + /* line 70, ../sass/components/products/_content.scss */ + [data-brkpnt-large='image-left'] .product-section__content { + float: right; + padding-right: 5%; + } + /* line 75, ../sass/components/products/_content.scss */ + [data-brkpnt-large='image-right'] .product-section__content { + float: left; + padding-left: 5%; + } +} + +@media (min-width: 56em) { + /* line 82, ../sass/components/products/_content.scss */ + .product-section__content__inner { + display: table-cell; + vertical-align: middle; + } +} + +@media (min-width: 56em) { + /* line 3, ../sass/components/products/_graphic.scss */ + [data-brkpnt-large='image-left'] .product-section__graphic, [data-brkpnt-large='image-right'] .product-section__graphic { + display: table; + height: 100%; + width: 50%; + } + /* line 10, ../sass/components/products/_graphic.scss */ + [data-brkpnt-large='image-left'] .product-section__graphic { + float: left; + padding-left: 5%; + } + /* line 15, ../sass/components/products/_graphic.scss */ + [data-brkpnt-large='image-right'] .product-section__graphic { + float: right; + padding-right: 5%; + } +} + +/* line 22, ../sass/components/products/_graphic.scss */ +.product-section__graphic__inner { + background-position: 50% 100%; + background-repeat: no-repeat; + display: block; + font-size: 0; + height: 200px; + left: 0; + line-height: 0; + overflow: hidden; + position: absolute; + width: 100%; +} +/* line 34, ../sass/components/products/_graphic.scss */ +[data-brkpnt-small='image-bottom'] .product-section__graphic__inner { + bottom: 50px; +} +/* line 38, ../sass/components/products/_graphic.scss */ +[data-brkpnt-small='image-bottom--flush'] .product-section__graphic__inner { + bottom: 0; +} +/* line 42, ../sass/components/products/_graphic.scss */ +[data-brkpnt-small='image-top'] .product-section__graphic__inner { + top: 50px; +} +@media (min-width: 56em) { + /* line 22, ../sass/components/products/_graphic.scss */ + .product-section__graphic__inner { + background-size: contain; + bottom: auto !important; + position: relative; + text-align: center; + top: auto !important; + } + /* line 53, ../sass/components/products/_graphic.scss */ + .product-section__graphic__inner.has-video { + background-image: none !important; + } + /* line 57, ../sass/components/products/_graphic.scss */ + [data-brkpnt-large='image-left'] .product-section__graphic__inner, [data-brkpnt-large='image-right'] .product-section__graphic__inner { + background-position: 50% 50%; + display: table-cell; + vertical-align: middle; + } + /* line 64, ../sass/components/products/_graphic.scss */ + [data-brkpnt-large='image-bottom'] .product-section__graphic__inner { + height: 50%; + width: 100%; + } +} + +/* line 71, ../sass/components/products/_graphic.scss */ +.video__container { + overflow: hidden; + position: absolute; +} +/* line 75, ../sass/components/products/_graphic.scss */ +[data-brkpnt-large='image-bottom'] .video__container { + bottom: -1px !important; + top: auto !important; +} +/* line 80, ../sass/components/products/_graphic.scss */ +.video__container .video { + background-color: transparent; + height: 100%; + left: 0; + opacity: 0; + outline: 0; + position: absolute; + top: -1px; + transition: opacity 500ms 1s; + width: 100%; +} +/* line 91, ../sass/components/products/_graphic.scss */ +.video__container .video.play { + opacity: 1; + transition: opacity 1s; +} + +/* line 4, ../sass/components/products/_nav.scss */ +.product-section__nav { + background-color: #fff; + height: 70px; + left: 0; + padding: 0 1em; + position: fixed; + top: -70px; + transition: top 200ms; + width: 100%; + z-index: 10; +} +/* line 15, ../sass/components/products/_nav.scss */ +.product-section__nav.section-nav--show { + box-shadow: 0 0 3px rgba(0, 0, 0, 0.4); + top: 0; +} + +/* line 21, ../sass/components/products/_nav.scss */ +.product-section__nav__inner { + display: table; +} + +/* line 25, ../sass/components/products/_nav.scss */ +.section-nav__table-cell, .product-section__nav__logo, .product-section__nav__links, .product-section__nav__buttons { + display: table-cell; + height: 70px; + vertical-align: middle; + white-space: nowrap; +} + +/* line 35, ../sass/components/products/_nav.scss */ +.product-section__nav__logo a { + background: url("../images/logo.svg") no-repeat 0 0; + background-size: cover; + content: ''; + display: block; + float: left; + height: 39px; + width: 170px; +} + +/* line 47, ../sass/components/products/_nav.scss */ +.product-section__nav__links { + list-style: none; + margin: 0; + padding: 0; + text-align: center; + width: 100%; +} +/* line 55, ../sass/components/products/_nav.scss */ +.product-section__nav__links li { + display: inline-block; + margin: 0; + padding: 0 0 0 1.4em; +} +/* line 60, ../sass/components/products/_nav.scss */ +.product-section__nav__links li:first-child { + padding-left: 0; +} + +/* line 69, ../sass/components/products/_nav.scss */ +.product-section__nav__buttons a { + margin-left: .625em; + padding: 1em; +} +/* line 73, ../sass/components/products/_nav.scss */ +.product-section__nav__buttons a:first-child { + margin-left: 0; +} + +/* line 79, ../sass/components/products/_nav.scss */ +.product-section__nav__link { + background-color: #282727; + border-radius: 50%; + display: block; + height: 12px; + transition: all 200ms; + width: 12px; +} +/* line 87, ../sass/components/products/_nav.scss */ +.product-section__nav__link span { + clip: rect(0 0 0 0); + height: 0; + overflow: hidden; + position: absolute; + width: 0; +} +/* line 91, ../sass/components/products/_nav.scss */ +.product-section__nav__link[aria-selected='true'] { + background-color: #ec1e2c; +} + +/* @group section color placeholders */ +/* line 3, ../sass/components/products/_sections.scss */ +.section__data-mobility, .section__performance, .section__real-time, .section__native-api-support { + background-color: white; + color: black; +} +/* line 32, ../sass/mixins/_products.scss */ +.safari-colors .section__data-mobility, .safari-colors .section__performance, .safari-colors .section__real-time, .safari-colors .section__native-api-support { + background-color: white; +} +/* line 36, ../sass/mixins/_products.scss */ +.section__data-mobility .product-section__button, .section__performance .product-section__button, .section__real-time .product-section__button, .section__native-api-support .product-section__button { + border-color: black; + color: black; +} +/* line 40, ../sass/mixins/_products.scss */ +.section__data-mobility .product-section__button:focus, .section__performance .product-section__button:focus, .section__real-time .product-section__button:focus, .section__native-api-support .product-section__button:focus, .section__data-mobility .product-section__button:hover, .section__performance .product-section__button:hover, .section__real-time .product-section__button:hover, .section__native-api-support .product-section__button:hover { + background-color: black; + color: white; +} +/* line 45, ../sass/mixins/_products.scss */ +.safari-colors .section__data-mobility .product-section__button:focus, .safari-colors .section__performance .product-section__button:focus, .safari-colors .section__real-time .product-section__button:focus, .safari-colors .section__native-api-support .product-section__button:focus, .safari-colors .section__data-mobility .product-section__button:hover, .safari-colors .section__performance .product-section__button:hover, .safari-colors .section__real-time .product-section__button:hover, .safari-colors .section__native-api-support .product-section__button:hover { + color: white; +} + +/* line 7, ../sass/components/products/_sections.scss */ +.section__always-available, .section__powerful-admin { + background-color: #7bbdcb; + color: white; +} +/* line 32, ../sass/mixins/_products.scss */ +.safari-colors .section__always-available, .safari-colors .section__powerful-admin { + background-color: #8ec5d2; +} +/* line 36, ../sass/mixins/_products.scss */ +.section__always-available .product-section__button, .section__powerful-admin .product-section__button { + border-color: white; + color: white; +} +/* line 40, ../sass/mixins/_products.scss */ +.section__always-available .product-section__button:focus, .section__powerful-admin .product-section__button:focus, .section__always-available .product-section__button:hover, .section__powerful-admin .product-section__button:hover { + background-color: white; + color: #7bbdcb; +} +/* line 45, ../sass/mixins/_products.scss */ +.safari-colors .section__always-available .product-section__button:focus, .safari-colors .section__powerful-admin .product-section__button:focus, .safari-colors .section__always-available .product-section__button:hover, .safari-colors .section__powerful-admin .product-section__button:hover { + color: #8ec5d2; +} + +/* line 11, ../sass/components/products/_sections.scss */ +.section__feature-rich, .section__one-code-many-platforms { + background-color: #17bee7; + color: white; +} +/* line 32, ../sass/mixins/_products.scss */ +.safari-colors .section__feature-rich, .safari-colors .section__one-code-many-platforms { + background-color: #40c7ea; +} +/* line 36, ../sass/mixins/_products.scss */ +.section__feature-rich .product-section__button, .section__one-code-many-platforms .product-section__button { + border-color: white; + color: white; +} +/* line 40, ../sass/mixins/_products.scss */ +.section__feature-rich .product-section__button:focus, .section__one-code-many-platforms .product-section__button:focus, .section__feature-rich .product-section__button:hover, .section__one-code-many-platforms .product-section__button:hover { + background-color: white; + color: #17bee7; +} +/* line 45, ../sass/mixins/_products.scss */ +.safari-colors .section__feature-rich .product-section__button:focus, .safari-colors .section__one-code-many-platforms .product-section__button:focus, .safari-colors .section__feature-rich .product-section__button:hover, .safari-colors .section__one-code-many-platforms .product-section__button:hover { + color: #40c7ea; +} + +/* line 15, ../sass/components/products/_sections.scss */ +.section__dev-power, .section__scalable-sync { + background-color: #efeef0; + color: black; +} +/* line 32, ../sass/mixins/_products.scss */ +.safari-colors .section__dev-power, .safari-colors .section__scalable-sync { + background-color: #f2f2f2; +} +/* line 36, ../sass/mixins/_products.scss */ +.section__dev-power .product-section__button, .section__scalable-sync .product-section__button { + border-color: black; + color: black; +} +/* line 40, ../sass/mixins/_products.scss */ +.section__dev-power .product-section__button:focus, .section__scalable-sync .product-section__button:focus, .section__dev-power .product-section__button:hover, .section__scalable-sync .product-section__button:hover { + background-color: black; + color: #efeef0; +} +/* line 45, ../sass/mixins/_products.scss */ +.safari-colors .section__dev-power .product-section__button:focus, .safari-colors .section__scalable-sync .product-section__button:focus, .safari-colors .section__dev-power .product-section__button:hover, .safari-colors .section__scalable-sync .product-section__button:hover { + color: #f2f2f2; +} + +/* line 19, ../sass/components/products/_sections.scss */ +.section__flexible-map, .section__general-purpose, .section__available-anywhere { + background-color: #282727; + color: white; +} +/* line 32, ../sass/mixins/_products.scss */ +.safari-colors .section__flexible-map, .safari-colors .section__general-purpose, .safari-colors .section__available-anywhere { + background-color: #2c2c2a; +} +/* line 36, ../sass/mixins/_products.scss */ +.section__flexible-map .product-section__button, .section__general-purpose .product-section__button, .section__available-anywhere .product-section__button { + border-color: white; + color: white; +} +/* line 40, ../sass/mixins/_products.scss */ +.section__flexible-map .product-section__button:focus, .section__general-purpose .product-section__button:focus, .section__available-anywhere .product-section__button:focus, .section__flexible-map .product-section__button:hover, .section__general-purpose .product-section__button:hover, .section__available-anywhere .product-section__button:hover { + background-color: white; + color: #282727; +} +/* line 45, ../sass/mixins/_products.scss */ +.safari-colors .section__flexible-map .product-section__button:focus, .safari-colors .section__general-purpose .product-section__button:focus, .safari-colors .section__available-anywhere .product-section__button:focus, .safari-colors .section__flexible-map .product-section__button:hover, .safari-colors .section__general-purpose .product-section__button:hover, .safari-colors .section__available-anywhere .product-section__button:hover { + color: #2c2c2a; +} + +/* @end */ +/* @group product page */ +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__always-available .product-section__graphic__inner, .video-false .section__always-available .product-section__graphic__inner, .section__always-available .product-section__graphic__inner.has-image { + background-image: url("../images/products/always-available--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__always-available .product-section__graphic__inner, .video-false .section__always-available .product-section__graphic__inner, .section__always-available .product-section__graphic__inner.has-image { + background-image: url("../images/products/always-available--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__always-available .product-section__graphic__inner, .video-false .section__always-available .product-section__graphic__inner, .section__always-available .product-section__graphic__inner.has-image { + background-image: url("../images/products/always-available.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__data-mobility .product-section__graphic__inner, .video-false .section__data-mobility .product-section__graphic__inner, .section__data-mobility .product-section__graphic__inner.has-image { + background-image: url("../images/products/data-mobility--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__data-mobility .product-section__graphic__inner, .video-false .section__data-mobility .product-section__graphic__inner, .section__data-mobility .product-section__graphic__inner.has-image { + background-image: url("../images/products/data-mobility--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__data-mobility .product-section__graphic__inner, .video-false .section__data-mobility .product-section__graphic__inner, .section__data-mobility .product-section__graphic__inner.has-image { + background-image: url("../images/products/data-mobility.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__dev-power .product-section__graphic__inner, .video-false .section__dev-power .product-section__graphic__inner, .section__dev-power .product-section__graphic__inner.has-image { + background-image: url("../images/products/dev-power--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__dev-power .product-section__graphic__inner, .video-false .section__dev-power .product-section__graphic__inner, .section__dev-power .product-section__graphic__inner.has-image { + background-image: url("../images/products/dev-power--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__dev-power .product-section__graphic__inner, .video-false .section__dev-power .product-section__graphic__inner, .section__dev-power .product-section__graphic__inner.has-image { + background-image: url("../images/products/dev-power.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__flexible-map .product-section__graphic__inner, .video-false .section__flexible-map .product-section__graphic__inner, .section__flexible-map .product-section__graphic__inner.has-image { + background-image: url("../images/products/flexible-map--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__flexible-map .product-section__graphic__inner, .video-false .section__flexible-map .product-section__graphic__inner, .section__flexible-map .product-section__graphic__inner.has-image { + background-image: url("../images/products/flexible-map--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__flexible-map .product-section__graphic__inner, .video-false .section__flexible-map .product-section__graphic__inner, .section__flexible-map .product-section__graphic__inner.has-image { + background-image: url("../images/products/flexible-map.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__general-purpose .product-section__graphic__inner, .video-false .section__general-purpose .product-section__graphic__inner, .section__general-purpose .product-section__graphic__inner.has-image { + background-image: url("../images/products/general-purpose--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__general-purpose .product-section__graphic__inner, .video-false .section__general-purpose .product-section__graphic__inner, .section__general-purpose .product-section__graphic__inner.has-image { + background-image: url("../images/products/general-purpose--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__general-purpose .product-section__graphic__inner, .video-false .section__general-purpose .product-section__graphic__inner, .section__general-purpose .product-section__graphic__inner.has-image { + background-image: url("../images/products/general-purpose.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__performance .product-section__graphic__inner, .video-false .section__performance .product-section__graphic__inner, .section__performance .product-section__graphic__inner.has-image { + background-image: url("../images/products/performance--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__performance .product-section__graphic__inner, .video-false .section__performance .product-section__graphic__inner, .section__performance .product-section__graphic__inner.has-image { + background-image: url("../images/products/performance--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__performance .product-section__graphic__inner, .video-false .section__performance .product-section__graphic__inner, .section__performance .product-section__graphic__inner.has-image { + background-image: url("../images/products/performance.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__powerful-admin .product-section__graphic__inner, .video-false .section__powerful-admin .product-section__graphic__inner, .section__powerful-admin .product-section__graphic__inner.has-image { + background-image: url("../images/products/powerful-admin--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__powerful-admin .product-section__graphic__inner, .video-false .section__powerful-admin .product-section__graphic__inner, .section__powerful-admin .product-section__graphic__inner.has-image { + background-image: url("../images/products/powerful-admin--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__powerful-admin .product-section__graphic__inner, .video-false .section__powerful-admin .product-section__graphic__inner, .section__powerful-admin .product-section__graphic__inner.has-image { + background-image: url("../images/products/powerful-admin.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__real-time .product-section__graphic__inner, .video-false .section__real-time .product-section__graphic__inner, .section__real-time .product-section__graphic__inner.has-image { + background-image: url("../images/products/real-time--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__real-time .product-section__graphic__inner, .video-false .section__real-time .product-section__graphic__inner, .section__real-time .product-section__graphic__inner.has-image { + background-image: url("../images/products/real-time--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__real-time .product-section__graphic__inner, .video-false .section__real-time .product-section__graphic__inner, .section__real-time .product-section__graphic__inner.has-image { + background-image: url("../images/products/real-time.png"); + } +} + +/* @end */ +/* @group mobile server product page */ +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__available-anywhere .product-section__graphic__inner, .video-false .section__available-anywhere .product-section__graphic__inner, .section__available-anywhere .product-section__graphic__inner.has-image { + background-image: url("../images/products/available-anywhere--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__available-anywhere .product-section__graphic__inner, .video-false .section__available-anywhere .product-section__graphic__inner, .section__available-anywhere .product-section__graphic__inner.has-image { + background-image: url("../images/products/available-anywhere--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__available-anywhere .product-section__graphic__inner, .video-false .section__available-anywhere .product-section__graphic__inner, .section__available-anywhere .product-section__graphic__inner.has-image { + background-image: url("../images/products/available-anywhere.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__feature-rich .product-section__graphic__inner, .video-false .section__feature-rich .product-section__graphic__inner, .section__feature-rich .product-section__graphic__inner.has-image { + background-image: url("../images/products/feature-rich--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__feature-rich .product-section__graphic__inner, .video-false .section__feature-rich .product-section__graphic__inner, .section__feature-rich .product-section__graphic__inner.has-image { + background-image: url("../images/products/feature-rich--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__feature-rich .product-section__graphic__inner, .video-false .section__feature-rich .product-section__graphic__inner, .section__feature-rich .product-section__graphic__inner.has-image { + background-image: url("../images/products/feature-rich.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__native-api-support .product-section__graphic__inner, .video-false .section__native-api-support .product-section__graphic__inner, .section__native-api-support .product-section__graphic__inner.has-image { + background-image: url("../images/products/native-api--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__native-api-support .product-section__graphic__inner, .video-false .section__native-api-support .product-section__graphic__inner, .section__native-api-support .product-section__graphic__inner.has-image { + background-image: url("../images/products/native-api--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__native-api-support .product-section__graphic__inner, .video-false .section__native-api-support .product-section__graphic__inner, .section__native-api-support .product-section__graphic__inner.has-image { + background-image: url("../images/products/native-api.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__one-code-many-platforms .product-section__graphic__inner, .video-false .section__one-code-many-platforms .product-section__graphic__inner, .section__one-code-many-platforms .product-section__graphic__inner.has-image { + background-image: url("../images/products/onecode--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__one-code-many-platforms .product-section__graphic__inner, .video-false .section__one-code-many-platforms .product-section__graphic__inner, .section__one-code-many-platforms .product-section__graphic__inner.has-image { + background-image: url("../images/products/onecode--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__one-code-many-platforms .product-section__graphic__inner, .video-false .section__one-code-many-platforms .product-section__graphic__inner, .section__one-code-many-platforms .product-section__graphic__inner.has-image { + background-image: url("../images/products/onecode.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__scalable-sync .product-section__graphic__inner, .video-false .section__scalable-sync .product-section__graphic__inner, .section__scalable-sync .product-section__graphic__inner.has-image { + background-image: url("../images/products/sync--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__scalable-sync .product-section__graphic__inner, .video-false .section__scalable-sync .product-section__graphic__inner, .section__scalable-sync .product-section__graphic__inner.has-image { + background-image: url("../images/products/sync--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__scalable-sync .product-section__graphic__inner, .video-false .section__scalable-sync .product-section__graphic__inner, .section__scalable-sync .product-section__graphic__inner.has-image { + background-image: url("../images/products/sync.png"); + } +} + +/* @end */ +/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+php+scss */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +/* line 8, ../sass/vendor/_prism.scss */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', monospace; + direction: ltr; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + line-height: 1.5; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +/* line 30, ../sass/vendor/_prism.scss */ +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +/* line 38, ../sass/vendor/_prism.scss */ +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + /* line 47, ../sass/vendor/_prism.scss */ + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} +/* Code blocks */ +/* line 54, ../sass/vendor/_prism.scss */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +/* line 60, ../sass/vendor/_prism.scss */ +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f4f4f4; +} + +/* Inline code */ +/* line 66, ../sass/vendor/_prism.scss */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; +} + +/* line 71, ../sass/vendor/_prism.scss */ +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +/* line 78, ../sass/vendor/_prism.scss */ +.token.punctuation { + color: #999; +} + +/* line 82, ../sass/vendor/_prism.scss */ +.namespace { + opacity: .7; +} + +/* line 86, ../sass/vendor/_prism.scss */ +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +/* line 96, ../sass/vendor/_prism.scss */ +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +/* line 105, ../sass/vendor/_prism.scss */ +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #a67f59; + background: rgba(255, 255, 255, 0.5); +} + +/* line 114, ../sass/vendor/_prism.scss */ +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +/* line 120, ../sass/vendor/_prism.scss */ +.token.function { + color: #DD4A68; +} + +/* line 124, ../sass/vendor/_prism.scss */ +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +/* line 130, ../sass/vendor/_prism.scss */ +.token.important { + font-weight: bold; +} + +/* line 134, ../sass/vendor/_prism.scss */ +.token.entity { + cursor: help; +} diff --git a/preview/assets/stylesheets/docs.css b/preview/assets/stylesheets/docs.css new file mode 100644 index 0000000..34fa2d2 --- /dev/null +++ b/preview/assets/stylesheets/docs.css @@ -0,0 +1,302 @@ +/* DITA overrides */ + +.developer-portal-content__wrapper table th { + background-color: #006784; + border: 0px; + color: #f9f9f9 +} + +.developer-portal-content__wrapper { + position: relative; +} + +.developer-portal-sidebar__navigation__wrapper .sub-sections ul ul span { + padding-left: 5.5em; +} + +.developer-portal-sidebar__navigation__wrapper .sub-sections ul ul ul span { + padding-left: 7.0em; +} + +.product-action { + position: absolute; + top: 0.8em; + right: 12em; + text-align: right; +} + +/* +.related-links { + border-top: 1px solid black; + margin-bottom: 0.5em; +} +*/ + +.olchildlinks:before { + content: "Subtopics:"; + font-weight: bold; + margin-left: -40px; +} + +.linklist { + padding-top: 1em; +} + +.linklist:before { + content: "Related topics:"; + font-weight: bold; +} + +.product-action a { + display: block; +} + +.ghforkme { + position: absolute; + top: 0; + right: 0; + border: 0; +} + +.filepath { + font-weight:bold; +} + +.msgph { + display: inline; + padding: .2em .6em .3em; + font-size: 85%; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; + background-color: #777777; + position: relative; + top: -0.3em; + margin-left: 0.3em; +} +.msgph.current { + background-color: #46A746; +} +.msgph.stable { + background-color: #777777; +} +.msgph.snapshot { + background-color: #C63F3B; +} +.msgph.preview { + background-color: #F0AD4E; +} + +.note { + border: 1px solid #0081a5; + border-radius: 0.4em; + border-left: 0.7em solid #0081a5; + padding: 0.2em 0.4em; + margin: 1em 0px; +} + +.attentiontitle, +.cautiontitle, +.dangertitle, +.fastpathtitle, +.importanttitle, +.notetitle, +.remembertitle, +.restrictiontitle, +.tiptitle, +.warningtitle { + display:block; + font-weight:bold; +} + +pre { + background: #f4f4f4; + font-family: Consolas, Monaco, 'Andale Mono', monospace; +} + +.codeph, +.cmdname, +.apiname { + font-family: Consolas, Monaco, 'Andale Mono', monospace; +} + +.menucascade, .uicontrol { + font-weight: bold; +} + +.tablecap { + font-weight: bold; +} + +.varname { + font-style: italic; +} + +.parmname { + font-style: italic; + font-weight: bold; +} + +wintitle { + font-weight: bold; +} + +h2 { + border-bottom: thin solid; + line-height: 1.2; + margin-botton: 0; +} + +dt { + font-weight: bold; + margin-top: 0.5em; +} + + +/* GCSE Template Overrides */ +div.gsc-control-cse { + padding: 0 !important; + border: 0 !important; +} +input.gsc-search-button { + width: 4em !important; + height: 4em !important; + border: 0 !important; + background: #e6e6e6 url("../images/icons/search.png") no-repeat 50% 50% !important; + background-size: contain !important; + border-radius: 0.25em !important; + overflow: hidden !important; + text-indent: 200% !important; + text-shadow: none !important; + white-space: nowrap !important; +} +input.gsc-search-button:focus, input.gsc-search-button:hover { + background-color: #d9d9d9 !important; +} +.gsc-input input.gsc-input { + border: 0 !important; + font-family: "Kievit OT", sans-serif !important; + font-size: 120% !important; + position: relative !important; + left: 0.5em !important; +} +@media (min-width: 58em) { + .gsc-input input.gsc-input { + left: 0 !important; + } +} +.gsc-search-box { + background: #f2f2f2 !important; +} +@media (min-width: 58em) { + .gsc-search-box { + background: #ffffff !important; + } +} + + +/* Bretts Template Overrides */ +.textblock__content ul { + padding-left: 2.5em; +} +.developer-porta-header__navigation__back { + display: none; +} +@media (min-width: 78em) { + .developer-porta-header__navigation__back { + display: inline-block; + } +} +.developer-portal-content__wrapper { + padding: 1.8em 2.4em; +} +.developer-portal-content__wrapper h1 { + margin: 0em 0em 0.2em 0em; +} +.developer-portal-header__search { + width: 100%; + padding-top: 0; +} +@media (min-width: 58em) { + .developer-portal-header__search { + padding: 1.0em; + width: 40%; + } +} +.developer-portal-global-content { + max-width: initial; +} +.layout-wrapper { + max-width: initial; +} +.developer-portal-sidebar__navigation__wrapper a span { + max-width: initial; +} +.developer-portal-sidebar__navigation__wrapper a.current span { + color: #848380; +} +.developer-portal-footer .legal, +.developer-portal-footer .license, +.developer-portal-footer a { + color: #848380; +} + +/* New Prism Enhancements */ +pre.line-numbers { + position: relative; + padding-left: 3.8em; + counter-reset: linenumber; +} +pre.line-numbers > code { + position: relative; +} +.line-numbers .line-numbers-rows { + position: absolute; + pointer-events: none; + top: 0; + font-size: 100%; + left: -3.8em; + width: 3em; /* works for line-numbers below 1000 lines */ + letter-spacing: -1px; + border-right: 1px solid #999; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + +} +.line-numbers-rows > span { + pointer-events: none; + display: block; + counter-increment: linenumber; +} +.line-numbers-rows > span:before { + content: counter(linenumber); + color: #999; + display: block; + padding-right: 0.8em; + text-align: right; +} +pre[class*='language-'] { + position: relative; +} +pre[class*='language-'] > code[data-language] { + display: block; +} +pre[class*='language-'] > code[data-language]::before { + content: attr(data-language); + color: black; + background-color: #CFCFCF; + display: inline-block; + position: absolute; + top: 0; + right: 0; + font-size: 0.9em; + border-radius: 0 0 0 5px; + padding: 0 0.5em; + text-shadow: none; +} diff --git a/preview/assets/stylesheets/legacy.css b/preview/assets/stylesheets/legacy.css new file mode 100644 index 0000000..949fc99 --- /dev/null +++ b/preview/assets/stylesheets/legacy.css @@ -0,0 +1,24 @@ +/* line 1, ../sass/legacy.scss */ +.global-header__logo a { + background: none; + -ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/logo.png', sizingMethod='scale')"; +} + +/* line 6, ../sass/legacy.scss */ +.global-header-search input[type="search"] { + padding-bottom: 1em; + padding-top: 1em; +} + +/* line 11, ../sass/legacy.scss */ +.carousel__page--current { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + filter: alpha(opacity=100); +} + +/* line 16, ../sass/legacy.scss */ +.carousel__page--previous, +.carousel__page--next { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} diff --git a/preview/contents/CLI/CBcli/cbcli-bucket-compact.html b/preview/contents/CLI/CBcli/cbcli-bucket-compact.html new file mode 100644 index 0000000..db650c7 --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-bucket-compact.html @@ -0,0 +1,59 @@ +バケットのコンパクション
+

バケットのコンパクション

+ + +

バケットはcouchbase-cli bucket-compactコマンドでコンパクションできます。

+ +

説明

+

bucket-compactコマンドはbucket-*コマンドと同じオプションを利用可能です。このセクションではオプションの一部を説明します。

+ + +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
couchbase-cli bucket-compact -c [localhost]:8091 -u [admin] -p [password] 
+    --bucket=[bucket-name]
+    [additional options]
+      
+ +
+ + +

+

バケットのデータとViewをコンパクションするには:

+ + +

+couchbase-cli bucket-compact -c 192.168.0.1:8091 -u Administrator -p password 
+        --bucket=test_bucket
+
+

バケットのデータのみをコンパクションするには:

+ +

+couchbase-cli bucket-compact -c 192.168.0.1:8091 -u Administrator -p password 
+        --bucket=test_bucket \
+        --data-only
+
+

バケットのViewのみをコンパクションするには:

+ +

+couchbase-cli bucket-compact -c 192.168.0.1:8091 -u Administrator -p password 
+        --bucket=test_bucket \
+        --view-only
+
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-bucket-create.html b/preview/contents/CLI/CBcli/cbcli-bucket-create.html new file mode 100644 index 0000000..d79c83f --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-bucket-create.html @@ -0,0 +1,188 @@ +バケットの作成
+

バケットの作成

+ + +

バケットはcouchbase-cli bucket-createコマンドで作成することができます。

+ +

CLIコマンドとパラメータ

+ +

バケットはcouchbase-cli bucket-createコマンドで作成でき、次のオプションが指定できます。bucket-createはクラスタに新しいバケットを追加します。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
パラメータ説明
--bucket=BUCKETNAME操作対象のバケット
--bucket-type=TYPEmemcachedもしくはcouchbaseのバケット種別
--bucket-port=PORTASCIIプロトコル対応、認証なし
--bucket-password=PASSWORDバケットポートではなく、標準ポートを利用
--bucket-ramsize=RAMSIZEMBバケットのRAM割当量(MB)
--bucket-replica=COUNTレプリカの数
--enable-flush=[0 | 1]フラッシュの有効、無効化
--enable-index-replica=[0 | 1]レプリカインデックスの有効、無効化
--waitバケット作成が完了するまで待ちます
--force確認をせずに強制的にコマンドを実行します
--data-onlyデータベースデータのみをコンパクションします
--view-onlyViewデータのみをコンパクションします
+
+ + +
+ + +

シンタックス

+

リクエストシンタックス:

+ +

+couchbase-cli bucket-create -c [localhost]:8091 -u [Administrator] -p [password] 
+       --bucket=[bucket-name]
+       --bucket-type=[type]
+       --bucket-port=[port]
+       --bucket-ramsize=[size]
+       --bucket-replica=[replicas]
+
+ +
+ + +

+

専用ポートのcouchbaseバケットを作成するには:

+ +

+couchbase-cli bucket-create -c 192.168.0.1:8091 -u Administrator -p password 
+       --bucket=test_bucket 
+       --bucket-type=couchbase 
+       --bucket-port=11222 
+       --bucket-ramsize=200 
+       --bucket-replica=1
+
+ + +

couchbaseバケットを作成し、利用可能になるまで待つには:

+ +

+couchbase-cli bucket-create -c 192.168.0.1:8091 -u Administrator -p password 
+       --bucket=test_bucket 
+       --bucket-type=couchbase 
+       --bucket-port=11222 
+       --bucket-ramsize=200 
+       --bucket-replica=1 
+       --wait
+
+ + + +

SASL memcachedバケットを作成するには:

+ +

+couchbase-cli bucket-create -c 192.168.0.1:8091 -u Administrator -p password 
+       --bucket=test_bucket 
+       --bucket-type=memcached 
+       --bucket-password=password 
+       --bucket-ramsize=200 
+       --enable-flush=1 
+       --enable-index-replica=1
+
+ +
+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-bucket-flush.html b/preview/contents/CLI/CBcli/cbcli-bucket-flush.html new file mode 100644 index 0000000..7596a97 --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-bucket-flush.html @@ -0,0 +1,93 @@ +バケットのフラッシュ
+

バケットのフラッシュ

+ + +

バケットはフラッシュオプションを有効にすると、フラッシュを実行できるようになります。

+ +

説明

バケットをフラッシュするには:
    +
  1. バケットのフラッシュオプションを有効にします。
  2. + +
  3. バケットをフラッシュします。
  4. + +
+ +

データバケットをフラッシュする場合、このオプションを有効にしてから、データバケットのフラッシュコマンドを実行します。--enable-flushオプションにはtrueかfalseを指定します。Falseは0で、フラッシュは無効です (デフォルト)。Trueは1で、フラッシュは有効です。

+ +

データバケット作成時、あるいはバケット属性の変更時にこのオプションを有効にできます。

+ +
重要: 明示的にデータバケットのフラッシュを有効化すると、バケットのデータをフラッシュできるようになります。バケットのフラッシュは危険な操作です。フラッシュを利用するクライアントアプリケーションは、リクエストの実行前にエンドユーザに再確認することを推奨します。Couchbase WebコンソールのバケットにあるflushEnabledパラメータを設定し、個々のバケットのフラッシュ可否を制限することができます。
+ +
警告: プロダクション環境のデータバケットでは、このオプションを有効にすることは推奨しません。
+ +
+ + +

CLIコマンドとパラメータ

+

bucket-create もしくは bucket-editコマンドを利用してバケットの作成および変更を実行する際にフラッシュを有効にできます。

+ + +

バケット作成時にフラッシュを有効にするには、--enable-flushパラメータに1を指定します:

+ + +

バケットをフラッシュするには、couchbase-cli bucket-flushコマンドを利用します。

+ + +
+ + + +

シンタックス

+

デフォルトでは、bucket-flushコマンドを実行すると、本当にデータバケットをフラッシュするのかを確認されます。オプションの--forceを指定すると、この確認なしにデータをフラッシュすることができます。

+ +

リクエストシンタックス:

+ +

+couchbase-cli bucket-flush -c [localhost]:8091 -u [admin] -p [password] 
+    --bucket=[bucket-name] 
+    --enable-flush=[0 | 1]
+    [OPTIONS]
+      
+ + +
+ + + +

+

リクエスト例:

+ +

+couchbase-cli bucket-flush -c 192.168.0.1:8091 -u Administrator -p password 
+       --bucket=testBucket
+       --enable-flush=1
+
+
+ + +

レスポンス

+

バケットのフラッシュ実行確認と応答の例です。この確認に対し、YesかNoを回答してください。

+ +
Running this command will totally PURGE database data from disk. Do you really want to do it? (Yes/No)
+ + +

フラッシュを実行しようとしたバケットで、XDCRレプリケーションが設定されている場合、次のエラーが返されます:

+ +

+ERROR: unable to bucket-flush; please check if the bucket exists or not; (503) Service Unavailable
+{u'_': u'Cannot flush buckets with outgoing XDCR'}
+      
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-bucket-metadata-ejection.html b/preview/contents/CLI/CBcli/cbcli-bucket-metadata-ejection.html new file mode 100644 index 0000000..3735d36 --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-bucket-metadata-ejection.html @@ -0,0 +1,82 @@ +メタデータ除去ポリシーの設定
+

メタデータ除去ポリシーの設定

+ + + + +

バケットのメモリ上のデータ除去設定はcouchbase-cliツールから行います。 +

+ +

説明

+ +

+ バケットのメモリ上のデータ除去設定はcouchbase-cliツールから行います。 + bucket-createもしくはbucket-edit実行時に、 + --bucket-eviction-policyパラメータで設定します。 +

+ + +
+ + +

CLIコマンドとパラメータ

+ +

以下のコマンドとパラメータは、メモリ内のメタデータをどのように保持するかを設定します:

+ + +

+couchbase-cli bucket-create --bucket-eviction-policy=[valueOnly | fullEviction] 
+couchbase-cli bucket-edit   --bucket-eviction-policy=[valueOnly | fullEviction] 
+ 
+ +
+ + + +

例: 新規バケットの作成

+ +

新規SASLバケットをvalueOnlyの除去ポリシーで作成するには:

+ + +

+couchbase-cli bucket-create -c 192.168.0.1:8091 -u Administrator -p password 
+  --bucket=test_bucket
+  --bucket-password=password
+  --bucket-ramsize=200
+  --bucket-eviction-policy=valueOnly
+  --enable-flush=1
+
+ +
+ + +

例: バケットの変更

+ +

既存のポート指定バケットをfullEvictionの除去ポリシーに変更するには:

+ + + +

+couchbase-cli bucket-edit -c 192.168.0.1:8091 -u Administrator -p password 
+  --bucket=test_bucket 
+  --bucket-port=11222 	
+  --bucket-ramsize=400 	
+  --bucket-eviction-policy=fullEviction 
+  --enable-flush=1
+  
+ +
+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-buckets.html b/preview/contents/CLI/CBcli/cbcli-buckets.html new file mode 100644 index 0000000..216eb67 --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-buckets.html @@ -0,0 +1,200 @@ +バケット
+

バケット

+ + + +

バケットは、couchbase-cliツールとbucket-*コマンドで管理します。

+ +

説明

+

このセクションではバケットのリスト、作成、変更、フラッシュ、コンパクション実行例を示します。

+ +
+ + +

CLIコマンドとパラメータ

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. bucket-* オプション
パラメータ説明
--bucket=BUCKETNAME操作対象のバケット
--bucket-type=TYPEmemcachedもしくはcouchbaseのバケット種別
--bucket-port=PORTASCIIプロトコル対応、認証なし
--bucket-password=PASSWORDバケットポートではなく、標準ポートを利用
--bucket-ramsize=RAMSIZEMBバケットのRAM割当量(MB)
--bucket-replica=COUNTレプリカの数
--enable-flush=[0 | 1]フラッシュの有効、無効化
--enable-index-replica=[0 | 1]レプリカインデックスの有効、無効化
--waitバケット作成が完了するまで待ちます
--force確認をせずに強制的にコマンドを実行します
--data-onlyデータベースデータのみをコンパクションします
--view-onlyViewデータのみをコンパクションします
+
+ + +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
couchbase-cli bucket-list -c [localhost]:8091 
+        -u [admin] -p [password]
+        [options]
+ +
+ + + +

例: バケットのリスト

クラスタ内のバケット一覧を取得するには:

+ + +

+couchbase-cli bucket-list -c 192.168.0.1:8091 -u Administrator -p password
+
+
+ + + + + +

例: バケットの変更

+ +

専用ポートのバケットを変更するには:

+ +

+couchbase-cli bucket-edit -c 192.168.0.1:8091 -u Administrator -p password \
+       --bucket=test_bucket \
+       --bucket-port=11222 \
+       --bucket-ramsize=400 \
+       --enable-flush=1
+       
+SUCCESS: bucket-create
+
+
+ + +

例: バケットの削除

+

バケットを削除するには:

+ +

+couchbase-cli bucket-delete -c 192.168.0.1:8091 -u Administrator -p password \
+       --bucket=test_bucket
+
+
+ + + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-cluster-rebalance.html b/preview/contents/CLI/CBcli/cbcli-cluster-rebalance.html new file mode 100644 index 0000000..e702cd8 --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-cluster-rebalance.html @@ -0,0 +1,185 @@ +クラスタのリバランス
+

クラスタのリバランス

+ + +

クラスタへノードを追加したり、クラスタからノードを削除する際にクラスタのリバランスを行います。

+ +

説明

+

利用可能なcouchbase-cliリバランスコマンドは:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
コマンド説明
rebalanceクラスタのリバランスを開始。
rebalance-stopクラスタのリバランスを停止。
rebalance-status現在のクラスタリバランス状態を表示。
+
+>
+ + +

CLIコマンドとパラメータ

+

couchbase-cli rebalanceコマンドのオプションは、すべてのserver-addコマンドオプションに加え、いくつか追加のオプションがあります。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
パラメータ説明
--server-add=[host]:[port]追加するサーバ
--server-add-username=[username]追加するサーバの管理者ユーザ名。
--server-add-password=[password]追加するサーバの管理者パスワード。
--server-remove=[host]:[port]削除するサーバ。
--recovery-buckets=BUCKETSカンマ区切りのバケット名リスト。 デフォルトはすべてのバケットを対象。
+
+ + +
+ + +

シンタックス

+

シンタックス:

+ +

+      
+    
+ +
+ + + +

例: ノードを削除してリバランス

+

以下の例では、クラスタからノードを削除し、リバランスを実行します:

+ +
couchbase-cli rebalance -c 192.168.0.1:8091
+    --server-remove=192.168.0.2:8091
+
+ +
+ + + + +

例: ノードを追加してリバランス

+

以下の例では、クラスタにノードを追加して、リバランスします:

+ +
couchbase-cli rebalance -c 192.168.0.1:8091 
+    --server-add=192.168.0.2:8091 
+    --server-add-username=Administrator 
+    --server-add-password=password
+
+ +
+ + + +

例: ノードの削除、ノードの追加、リバランス

+ +

以下の例では、クラスタからノードを削除および追加し、リバランスします:

+ + +
couchbase-cli rebalance -c 192.168.0.1:8091 
+    --server-remove=192.168.0.2 
+    --server-add=192.168.0.4 
+    --server-add-username=Administrator 
+    --server-add-password=password
+
+ +
+ + + +

例: リバランスの停止

+

以下の例は実行中のリバランスを停止します:

+ + +
couchbase-cli rebalance-stop -c 192.168.0.1:8091
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-cluster-wide-info.html b/preview/contents/CLI/CBcli/cbcli-cluster-wide-info.html new file mode 100644 index 0000000..861af66 --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-cluster-wide-info.html @@ -0,0 +1,70 @@ +couchbase-cliによる診断
+

couchbase-cliによる診断

+ + +

couchbase-cliツールを利用して診断結果の収集を開始、停止、ステータスの閲覧ができます。

+ +

ログ収集開始コマンド

+ +

ログ収集開始コマンドはログ収集プロセスを開始します。 すべてのノードか、特定のノードでログを収集するかを指定する必要があります。 Couchbaseへのログアップロードをリクエストすることもできます。 Couchbaseへのアップロードをリクエストする際には、組織名とサポートチケット番号を指定してください。 コマンドのシンタックスは以下の通りです:

+ + + couchbase-cli + collect-logs-start + -c + host:8091 -u + username + -p + password + { + --nodes=node1,node2,... + | + --all-nodes + } [--upload --upload-host=host + --customer=name + [--ticket=ticketNumber ] ] +
+ + +

ログ収集停止コマンド

+ +

ログ収集停止コマンドは各ノード上での収集処理をキャンセルします。 シンタックスは以下の通りです:

+ + + couchbase-cli + collect-logs-stop + -c + host:8091 -u + username + -p + password + +
+ + +

ログ収集ステータスレポートコマンド

+ +

ログ収集ステータスレポートコマンドは各ノードの情報を返します。 シンタックスは以下の通りです:

+ + + couchbase-cli + collect-logs-status + -c + host:8091 + -u + username + -p + password + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-commands.html b/preview/contents/CLI/CBcli/cbcli-commands.html new file mode 100644 index 0000000..618dfba --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-commands.html @@ -0,0 +1,1320 @@ +couchbase-cliコマンド
+

couchbase-cliコマンド

+ + +

couchbase-cliツールで利用可能なコマンドの一覧です。

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. couchbase-cliコマンド
コマンド説明
server-listクラスタ内のすべてのサーバを一覧表示。
server-info単一のサーバの詳細を表示。
server-add一つまたは複数のサーバをクラスタに追加。
server-readdフェイルオーバしたサーバを再追加。
group-manageサーバグループを管理する(エンタープライズエディションのみ)。
rebalanceクラスタのリバランスを開始。
rebalance-stopクラスタのリバランスを停止。
rebalance-status現在のクラスタリバランス状態を表示。
failover一つまたは複数のサーバをフェイルオーバ。 デフォルト: グレイスフルフェイルオーバ +

ハードフェイルオーバは--forceオプションを指定。

+
cluster-initクラスタのユーザ名、パスワード、ポートを設定。
cluster-editクラスタ設定の変更。
node-initノード個別のパラメータを設定。
bucket-listクラスタ内のバケットを一覧表示。
bucket-createクラスタに新規バケットを追加。
bucket-edit既存のバケットを変更。
bucket-delete既存バケットを削除。
bucket-flush指定バケットのすべてのデータをディスクから削除する。
bucket-compactデータベースとインデックスデータをコンパクションする。
setting-compaction自動コンパクションを設定する。
setting-notification通知を設定する。
setting-alerteメール通知設定。
setting-autofailover自動フェイルオーバを設定する。
setting-xdcrXDCRの挙動に関わるXDCR関連の設定を行う。
ssl-manageクラスタのSSL証明書を管理する。
xdcr-setupXDCRレプリケーションを設定する。
xdcr-replicateXDCRでのレプリケーションを作成し実行する。
helpより詳細なシンタックス、利用方法、利用例を表示する。
+
+ +

couchbase-cliコマンドオプション

以下のコマンドは特定のコマンドで利用できるオプションです。

+
+ +

server-list オプション

+
+ + + + + + + + + + + + + + + + + + + + + + +
server-list オプション説明
–-group-name=GROUPNAMEサーバグループ内のすべてのサーバを表示 (エンタープライズエディションのみ)
+
+
+ +

server-add オプション

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
server-add オプション説明
--server-add=HOST[:PORT]クラスタに追加するサーバ
--server-add-username=USERNAME追加するサーバの管理者ユーザ名
--server-add-password=PASSWORD追加するサーバの管理者パスワード
--group-name=GROUPNAMEサーバを追加するサーバグループ (エンタープライズエディションのみ)
+
+
+ +

server-readd オプション

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
server-readd オプション説明
--server-add=HOST[:PORT]クラスタに再追加するサーバ
--server-add-username=USERNAME追加するサーバの管理者ユーザ名
--server-add-password=PASSWORD追加するサーバの管理者パスワード
--group-name=GROUPNAMEサーバを追加するサーバグループ (エンタープライズエディションのみ)
+
+
+ +

group-manage オプション (エンタープライズエディションのみ)

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
group-manage オプション説明
--group-name=GROUPNAMEサーバグループ名
--listサーバグループと各サーバグループに所属するサーバを表示
--createサーバグループの作成
--delete空のサーバグループを削除
--rename=NEWGROUPNAME既存のサーバグループの名前を変更する。
--add-servers="HOST:PORT;HOST:PORT"サーバをグループに追加
--move-servers="HOST:PORT;HOST:PORT"グループからサーバのリストを移動
--from-group=GROUPNAMEグループから一つまたは複数のサーバを移動。
--to-group=GROUPNAME一つまたは複数のサーバをグループへ移動
+
+
+ +

rebalance オプション

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
rebalance オプション説明
--server-add*server-addオプションを参照
--server-remove=[host]:[port]クラスタから削除するサーバ
+
+
+ +

failover オプション

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
failover オプション説明
--server-failover=[host]:[port]フェイルオーバするサーバ。
--forceハードフェイルオーバを強制する。
+
+
+ +

cluster-* オプション

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
cluster-* オプション説明
--cluster-username=USER新しい管理者ユーザ名
--cluster-password=PASSWORD新しい管理者パスワード
--cluster-port=PORT新しいクラスタのREST/httpポート
--cluster-ramsize=RAMSIZEMBノード単位のRAM割当量、MB
+
+
+ +

node-init オプション

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
node-init オプション説明
--node-init-data-path=PATHノードごとのデータ保存パス
--node-init-index-path=PATHノードごとのインデックス保存パス
--node-init-hostname=NAMEノードのホスト名 デフォルト: 127.0.0.1
+
+
+ +

bucket-* オプション

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
bucket-* オプション説明
--bucket=BUCKETNAME対象の名前付きバケット
--bucket-type=TYPEバケット種別、memcachedあるいはcouchbase
--bucket-port=PORTASCIIプロトコルをサポートし、認証を不要とする
--bucket-password=PASSWORD標準ポート、バケットポートとは排他
--bucket-ramsize=RAMSIZEMBバケットのRAM割当量、MB
--bucket-replica=COUNTレプリケーション数
--enable-flush=[0\|1]フラッシュの有効/無効化
--enable-index-replica=[0\|1]インデックスレプリカの有効/無効化
--waitバケットの作成完了を待つ
--force確認を行わずに強制的にコマンドを実行する
--data-onlyデータベースデータのみをコンパクション
--view-onlyViewデータのみをコンパクション
+
+
+ +

setting-compaction オプション

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
setting-compaction オプション説明
--compaction-db-percentage=PERCENTAGEコンパクション実行条件のディスクフラグメント率
--compaction-db-size=SIZE[MB]コンパクション実行条件のディスクフラグメントサイズ
--compaction-view-percentage=PERCENTAGEViewコンパクション実行条件のディスクフラグメント率
--compaction-view-size=SIZE[MB]Viewコンパクション実行条件のディスクフラグメントサイズ
--compaction-period-from=HH:MMコンパクション実行開始時刻
--compaction-period-to=HH:MMコンパクション実行終了時刻
--enable-compaction-abort=[0\|1]時刻を過ぎた際にコンパクションの強制終了を許可する
--enable-compaction-parallel=[0\|1]データベースとViewの並列コンパクションを許可する +
+
+
+ +

setting-alertとnotificationオプション

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
setting-alert オプション説明
--enable-email-alert=[0\|1]eメール通知を許可する
--email-recipients=RECIPIENTeメール受信者のアドレスを , あるいは ; 区切りで指定
--email-sender=SENDER送信者のeメールアドレス
--email-user=USEReメールサーバのユーザ名
--email-password=PWDeメールサーバのパスワード
--email-host=HOSTeメールサーバのホスト名
--email-port=PORTeメールサーバのポート番号
--enable-email-encrypt=[0\|1]eメールの暗号化、デフォルトは0で暗号化しない
--alert-auto-failover-nodeノードが自動フェイルオーバによってフェイルオーバされた
--alert-auto-failover-max-reached最大自動フェイルオーバノード数に達した
--alert-auto-failover-node-down同時に他のノードもダウンしたため、ノードがフェイルオーバされなかった
--alert-auto-failover-cluster-smallクラスタが小さすぎるため、ノードがフェイルオーバされなかった
--alert-ip-changedノードのIPアドレスが予期せず変わった
--alert-disk-space永続化ストレージのディスクスペースが容量の90%に達した
--alert-meta-overheadメタデータオーバヘッドがノードのRAMの50%を超えた
--alert-meta-oomノード上のバケットメモリがすべてメタデータで利用されている
--alert-write-failed特定のバケットにおいてディスクへのデータ書き込みが失敗した
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
setting-notification オプション説明
--enable-notification=[0\|1]通知を許可する
+
+
+ + +

setting-autofailover オプション

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
setting-autofailover オプション説明
--enable-auto-failover=[0\|1]フェイルオーバを有効にする
--auto-failover-timeout=TIMEOUT (>=30)自動フェイルオーバを実行するまでのノードタイムアウト時間を指定 +
+
+
+ + +

setting-xdcr オプション

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
setting-xdcr オプション説明
--max-concurrent-reps=[32]バケット単位の最大並列レプリケーターを指定、8から256。
--checkpoint-interval=[1800]チェックポイント間隔、60から14400秒。
--worker-batch-size=[500]ドキュメントのバッチサイズ、500から10000。
--doc-batch-size=[2048]KBドキュメントのバッチサイズ、10から100000KB
--failure-restart-interval=[30]失敗したXDCRのリスタート間隔、1から300秒
--optimistic-replication-threshold=[256]楽観的レプリケーション実行のドキュメントボディサイズ閾値(bytes)
+
+
+ +

xdcr-setup オプション

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
xdcr-setup オプション説明
--create新しいXDCR設定を作成する。
--edit既存のXDCR設定を変更する。
--delete既存のXDCR設定を削除する。
--listすべてのXDCR設定をリスト表示する。
--xdcr-cluster-name=[clustername]クラスタ名
--xdcr-hostname=[hostname]接続するリモートホスト名。
--xdcr-username=[username]リモートクラスタの管理者ユーザ名。
--xdcr-password=[passwordリモートクラスタの管理者パスワード。
--xdcr-demand-encryption=[0 | 1]SSLによるデータ暗号化の有効/無効化。 Trueが1で、暗号化を有効に。 + Falseが0で、暗号化を無効に。 デフォルト: 0 (エンタープライズエディションのみ)
--xdcr-certificate=[certificate]pemエンコードの証明書を指定。 XDCRデータ暗号化には証明書が必要。 ソースクラスタ上のpemエンコードされた証明書の絶対パスを指定。 (エンタープライズエディションのみ)
+
+
+ +

xdcr-replicate オプション

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
xdcr-replicate オプション説明
--create新しいレプリケーションを作成し開始する。
--deleteレプリケーションを停止しキャンセルする。
--listすべてのXDCRレプリケーションを表示
--pauseレプリケーションを一時停止
--resumeレプリケーションを再開
--settingsレプリケーションの設定を更新
--xdcr-replicator=REPLICATORレプリケーションID
--xdcr-from-bucket=BUCKETレプリケーション元のローカルのバケット名
--xdcr-cluster-name=CLUSTERNAMEレプリケーション先のリモートクラスタ
--xdcr-to-bucket=BUCKETNAMEレプリケーション先のリモートバケット名
--max-concurrent-reps =[ 16 ]バケットごとの最大並列レプリケーション、8から256。 デフォルト: 16
--checkpoint-interval =[ 1800 ]チェックポイント間隔、60から14400秒
--worker-batch-size =[ 500 ]ドキュメントバッチサイズ、500から10000
--doc-batch size =[ 2048 ] KBドキュメントバッチサイズ、10から100000KB
--failure-restart-interval =[ 30 ]失敗したXDCRのリスタート間隔、1から300秒
--optimistic-replication-threshold =[ 256 ]楽観的レプリケーション実行のドキュメントボディサイズ閾値(bytes)
--xdcr-replication-mode=[xmem | capi]レプリケーションプロトコル、capiあるいはxmem、 + xmemはmemcached、capiはRESTプロトコルを意味する.
+
+
+ +

ssl-manage オプション (エンタープライズエディションのみ)

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ssl-manage オプション説明
--regenerate-cert=[certificate]対象のクラスタ上で自己署名の証明書を再生成する。 + pemエンコードの証明書ファイルの絶対パスを指定。例、--regenerate-cert=./new.pem. (エンタープライズエディションのみ)
--retrieve-cert=[certificate]自己署名証明書を宛先クラスタからソースクラスタへと保存する。 pemエンコード証明書のローカル保存先(絶対パス)とファイル名を指定する。例、--retrieve-cert=./newCert.pem (エンタープライズエディションのみ)
+
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-rza.html b/preview/contents/CLI/CBcli/cbcli-rza.html new file mode 100644 index 0000000..565abf1 --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-rza.html @@ -0,0 +1,210 @@ +ラックゾーンアウェアネス
+

ラックゾーンアウェアネス

+ + + + +

ラックゾーンアウェアネスは、各サーバグループがラックやアベイラビリティゾーンに物理的に属しているクラスタ内で、サーバの論理的なグルーピングを可能とします。 エンタープライズエディションでのみ利用できます。

+ +

説明

+

ラックゾーンアウェアネスはアクティブと対応するレプリカのパーティションが、異なるラックやゾーンに属するサーバ上に作成されるように指定できる機能です。 ラックゾーンアウェアネスを有効にするには、クラスタ内のすべてのサーバをアップグレードする必要があります。

+ + + +
注: サーバグループによるラックゾーンアウェアネス機能はエンタープライズエディションでのみ利用できます。
+ +

サーバをグループに設定するには、couchbase-cliツールの、group-manage コマンドを利用します。

+ +
+ + +

CLIコマンドとパラメータ

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. group-manage オプション
オプション説明
  
-c HOST:PORT or --cluster=HOST:PORTクラスタのロケーション
-u USERNAME or --username=USERNAMEクラスタの管理者ユーザ名
-p PASSWORD or --password=PASSWORDクラスタの管理者パスワード
--listサーバグループと各サーバグループに所属するサーバを表示
--create --group-name=groupNameサーバグループの作成。
--delete --group-name=groupName空のサーバグループを削除。
--rename=newGroupName --group-name=oldGroupName既存のサーバグループの名称を変更。
--group-name=groupName --add-servers="HOST:PORT;HOST:PORT"サーバをグループに追加。
--from-group=groupName --to-group=groupName + --move-servers="HOST:PORT;HOST:PORT"グループから一つまたは複数のサーバを他のグループへ移動。
+
+ + +
+ + +

シンタックス

+

group-manageの一般的なシンタックス:

+ + +

+couchbase-cli group-manage -c [localhost]:[port] 
+    -u [admin] -p [password]
+    [options]
+
+ +
+ + +

例: サーバグループの作成

+

以下の例では、サーバグループが作成されます。

+ + + +
注: -create --group-nameコマンドはエクスクラメーション(!)がグループ名で利用されていると失敗します。 +
+ + +

+couchbase-cli group-manage -c 192.168.0.1:8091 
+   -u myAdminName
+   -p myAdminPassword
+   --create --group-name=myGroupName
+
+
+ + +

例: サーバグループへサーバを追加

+ +

以下の例では、二つのサーバをgroup-manageコマンドでサーバグループに追加します。

+ + +

+couchbase-cli group-manage -c 192.168.0.1:8091 
+   -u myAdminName
+   -p myAdminPassword
+   --group-name=myNewGroup
+   --add-servers="10.1.1.1:8091;10.1.1.2:8091"
+
+ + +

以下の例では、server-addコマンドを利用し、サーバをサーバグループに追加します。

+ + + +
注: 複数のサーバをサーバグループに追加するにはcouchbase-cli group-manageコマンドの方を利用してください。
+ + +

server-addコマンドで--group-nameを指定しない場合、サーバはデフォルトグループに追加されます。

+ + +

+couchbase-cli server-add -c 192.168.0.1:8091
+   --server-add=192.168.0.2:8091
+   --server-add-username=Administrator
+   --server-add-password=password
+   --group-name=groupName
+
+
+ + + +

例: サーバグループからサーバを移動する

+ +

以下の例では、group-manageコマンドを利用し、二つのサーバをサーバグループから他のサーバグループへと移動します。

+ + +

+couchbase-cli group-manage -c 192.168.0.1:8091 
+   -u myAdminName
+   -p myAdminPassword
+   --from-group=myFirstGroup
+   --to-group=mySecondGroup
+   --move-servers="10.1.1.1:8091;10.1.1.2:8091"
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-server-add.html b/preview/contents/CLI/CBcli/cbcli-server-add.html new file mode 100644 index 0000000..e00d158 --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-server-add.html @@ -0,0 +1,123 @@ +クラスタへのノード追加
+

クラスタへのノード追加

+ + +

server-addコマンド、またはrebalanceコマンドを利用し、ノードをクラスタに追加できます。

+ +

説明

+

ノードをクラスタに追加するために良く利用されるコマンドはserver-addコマンドですが、rebalanceコマンド実行時にクラスタへノードを追加することもできます。

+ +
+ + +

CLIコマンドとパラメータ

+

以下のパラメータはserver-addおよびrebalanceコマンドで利用できます。

+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
パラメータ説明
--cluster [localhost]:8091サーバを追加するクラスタ。
--server-add=[host]:8091追加するサーバ
--server-add-username=[administrator]追加するサーバの管理者パスワード。
--server-add-password=[password]追加するサーバの管理者パスワード。
+
+ + +
+ + +

シンタックス

+

Request syntax with server-add :

+ +
couchbase-cli server-add 
+    --cluster [localhost]:8091 
+    --server-add=[host]:8091 
+    --server-add-username=[administrator] 
+    --server-add-password=[password]
+
+ + +

Request syntax with rebalance :

+ +
couchbase-cli rebalance
+    -c [localhost]:8091 
+    --server-add=[host]:8091 
+    --server-add-username=[administrator] 
+    --server-add-password=[password]
+
+ +
+ + +

+

以下の例では、ノードをクラスタに追加しますが、リバランスは実行しません:

+ +
couchbase-cli server-add -c 192.168.0.1:8091 
+    --server-add=192.168.0.2:8091 
+    --server-add-username=Administrator 
+    --server-add-password=password
+
+ +

以下の例では、クラスタにノードを追加して、リバランスします:

+ +
couchbase-cli rebalance -c 192.168.0.1:8091 
+    --server-add=192.168.0.2:8091 
+    --server-add-username=Administrator 
+    --server-add-password=password
+
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-servers.html b/preview/contents/CLI/CBcli/cbcli-servers.html new file mode 100644 index 0000000..e79d560 --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-servers.html @@ -0,0 +1,98 @@ +サーバノード
+

サーバノード

+ + +

クラスタ内のサーバノードを管理するには、様々なcouchbase-cliツールコマンドを利用します。

+ +

説明

+

このセクションではクラスタ操作の多様なcouchbase-cliツールコマンドの実行例を紹介します。

+ + + + +

クラスタ内のサーバリストを表示する:

+ +

+couchbase-cli server-list -c 192.168.0.1:8091
+
+ + + +

サーバ情報を取得する:

+ +
couchbase-cli server-info -c 192.168.0.1:8091
+
+
+ + + +

例: クラスタパラメータを設定する

以下の例では、ユーザ名、パスワード、ポート、RAM割当量を設定します:

+ +
couchbase-cli cluster-init -c 192.168.0.1:8091 
+    --cluster-init-username=Administrator 
+    --cluster-init-password=password 
+    --cluster-init-port=8080 
+    --cluster-init-ramsize=300
+
+ + +

以下の例では、クラスタのユーザ名、パスワード、ポート、RAM割当量を変更します:

+ +
couchbase-cli cluster-edit -c 192.168.0.1:8091 
+    --cluster-username=Administrator 
+    --cluster-password=password 
+    --cluster-port=8080 
+    --cluster-ramsize=300
+
+
+ + + +

例: データパスの設定

+

未プロビジョニング状態のクラスタでデータパスを設定するには:

+ +

+couchbase-cli node-init -c 192.168.0.1:8091 
+    --node-init-data-path=/tmp/data 
+    --node-init-index-path=/tmp/index
+
+ + +

未プロビジョニング状態のクラスタでデータパスを変更するには:

+ + +

+couchbse-cli node-init -c 192.168.0.1:8091 
+    --node-init-data-path=/tmp/data 
+    --node-init-index-path=/tmp/index 
+    --node-init-hostname=myhostname 
+    -u Administrator -p password 
+
+ +
+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-ssl.html b/preview/contents/CLI/CBcli/cbcli-ssl.html new file mode 100644 index 0000000..7ccbd56 --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-ssl.html @@ -0,0 +1,127 @@ +SSL証明書の管理
+

SSL証明書の管理

+ + +

Secure Socket Layer (SSL)認証を利用したデータ暗号化では、Couchbaseの自己署名証明書を利用します。

+ +

説明

+ +

XDCRデータ暗号化用のSSL証明書の取得は、sshscpを利用した、セキュアな方法で実行すべきです。 例えば:

+ +
    +
  1. 宛先クラスタのノードにセキュアな方法でログインする。 例: ssh
  2. + +
  3. couchbase-cli ssl-manageコマンドを利用して証明書を取得する。
  4. + +
  5. セキュアな方法を利用して証明書を宛先クラスタからソースクラスタへと転送する。 例: scp
  6. + +
  7. XDCRのSSLデータ暗号化設定へと進む。
  8. + +
+ +
+ +

CLIコマンドとパラメータ

+ +
couchbase-cli ssl-manageコマンドは以下のオプションで証明書の再生成と取得が可能です。 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. ssl-manage コマンドオプション
オプション説明
--retrieve-cert=[certificate]自己署名証明書を宛先クラスタからソースクラスタへと保存する。 pemエンコード証明書のローカル保存先(絶対パス)とファイル名を指定する。例、 + --retrieve-cert=./newCert.pem.
--regenerate-cert=[certificate]対象のクラスタ上で自己署名の証明書を再生成する。 pemエンコードの証明書ファイルの絶対パスを指定。例、 + --regenerate-cert=./newRegen.pem.
+
+
+ +
+ +

シンタックス

+ +

既存の自己署名証明書を取得するには、couchbase-cli ssl-manageコマンドで、--retrieve-certオプションを指定します。

+ +
couchbase-cli ssl-manage -c [localHost]:[port ]
+  -u [Administrator] -p [password] 
+  --retrieve-cert=./[new-certificate]
+
+ +

自己署名証明書を再生成するには、couchbase-cli ssl-manageコマンドで--regenerate-certオプションを指定します。

+ +
couchbase-cli ssl-manage 
+  -c [remoteHost]:[port] 
+  -u [Administrator] -p [password] 
+  --regenerate-cert=[certificate]
+
+ +
+ +

+ +

以下の例は既存の自己署名証明書を取得します:

+ +
couchbase-cli ssl-manage -c 10.3.4.187:8091 
+  -u Administrator -p password 
+  --retrieve-cert=./newCert.pem 
+    
+ +

以下の例は自己署名証明書を再生成します:

+ +
couchbase-cli ssl-manage 
+  -c 10.3.4.187:8091 
+  -u Administrator -p password 
+  --regenerate-cert=./newRegen.pem 
+
+ +
+ +

レスポンス

+ +

証明書の取得が成功すると、以下のレスポンスが返されます。

+ +
SUCCESS: retrieve certificate to './newCert.pem' 
+Certificate matches what seen on GUI 
+
+ +

証明書の再生成が成功すると、以下のレスポンスが返されます。

+ +
SUCCESS: regenerate certificate to './newRegen.pem' 
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-xdcr-manage-encryption.html b/preview/contents/CLI/CBcli/cbcli-xdcr-manage-encryption.html new file mode 100644 index 0000000..772e9e4 --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-xdcr-manage-encryption.html @@ -0,0 +1,112 @@ +XDCRデータの暗号化管理
+

XDCRデータの暗号化管理

+ + +

Secure Socket Layer (SSL)を利用したXDCRデータの暗号化は、couchbase-cliツールのxdcr-setupコマンドで有効化できます。 エンタープライズエディションでのみ利用できます。

+ + +

説明

Couchbase Serverコマンドラインインタフェース(CLI)は、XDCRクラスタ参照を作成、変更する際に、XDCRデータの暗号化(エンタープライズエディションのみ)を有効化できます。

+ + +

XDCRでSSLデータ暗号化を設定するには:

+ +
    +
  1. 宛先クラスタから証明書を取得する。
  2. + +
  3. XDCR設定を作成、あるいは変更し、データ暗号化を有効化するためのSSL証明書を指定する。
  4. + +
  5. レプリケーションを定義する。
  6. + +
+ +
+ + + +

CLIコマンドとパラメータ

+ + +

CLIはcouchbase-cliツールと、xdcr-setupコマンドを提供します。 --xdcr-demand-encryptionオプションでXDCRデータ暗号化を有効/無効化します。 + -xdcr-certificate=CERTIFICATEでデータセキュリティ用のSSL証明書を指定します。

+ + +
+ + +

シンタックス

+

XDCRでSSLデータ暗号化を設定するには、xdcr-setupコマンドを利用します。 + --xdcr-demand-encryptionオプションでデータ暗号化を有効/無効化します。 + 有効化するには、1を指定します。 無効化するには、0を指定します。

+ +
couchbase-cli xdcr-setup -c localHost:port -u [localAdmin] -p [localPassword]
+  --create --xdcr-cluster-name=[remoteClustername] 
+  --xdcr-hostname=[remoteHost]:[port] 
+  --xdcr-username=[remoteAdmin] --xdcr-password=[remotePassword]
+  --xdcr-demand-encryption=[0|1]   // 1 to enable, 0 to disable (default)
+  --xdcr-certificate=[localPath]/[certificateFile].pem
+    
+ +
+ + +

例: データ暗号化を有効化する

+

XDCRのデータ暗号化を有効にするには、couchbase-cli xdcr-setup--xdcr-demand-encryption=1を指定します。

+ +
couchbase-cli xdcr-setup -c 10.3.4.186:8091 -u localAdmin -p localPassword
+  --create --xdcr-cluster-name=Omaha 
+  --xdcr-hostname=10.3.4.187:8091 
+  --xdcr-username=Peyton --xdcr-password=Manning 
+  --xdcr-demand-encryption=1 
+  --xdcr-certificate=./new.pem  
+        
+ +
+ + +

例: データ暗号化を無効化する

+

XDCRのデータ暗号化を無効にするには、couchbase-cli xdcr-setup--xdcr-demand-encryption=0を指定します。

+ + + +
couchbase-cli xdcr-setup -c 10.3.4.186:8091 -u localAdmin -p localPassword
+  --create --xdcr-cluster-name=Omaha 
+  --xdcr-hostname=10.3.4.187:8091 
+  --xdcr-username=Peyton --xdcr-password=Manning 
+  --xdcr-demand-encryption=0 
+
+ +
+ + + + + + + +

レスポンス

+

XDCRの設定が成功すると、以下のレスポンスが返されます。

+ +
SUCCESS: init/edit test 
+<<replication reference created>> 
+
+ + +
+ + + + + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-xdcr-manage-replication.html b/preview/contents/CLI/CBcli/cbcli-xdcr-manage-replication.html new file mode 100644 index 0000000..29ef808 --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-xdcr-manage-replication.html @@ -0,0 +1,206 @@ +XDCRレプリケーションストリームの管理
+

XDCRレプリケーションストリームの管理

+ + +

XDCR CLIは、couchbase-cli xdcr-replicateでXDCRレプリケーションを管理するためのオプションを提供します。

+ +

説明

+

couchbase-cli xdcr-replicateのパラメータを以下に示します。

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. xdcr-replicate オプション
オプション説明
--create新しいレプリケーションを作成し開始する
--deleteレプリケーションを停止しキャンセルする
--listすべてのXDCRレプリケーションを表示
--pauseレプリケーションを一時停止
--resumeレプリケーションを再開
--settingsレプリケーションの設定を更新
--xdcr-replicator=REPLICATORレプリケーションID
--xdcr-from-bucket=BUCKETレプリケーション元のローカルのバケット名
--xdcr-cluster-name=CLUSTERNAMEレプリケーション先のリモートクラスタ
--xdcr-to-bucket=BUCKETNAMEレプリケーション先のリモートバケット名
--max-concurrent-reps =[ 16 ]バケットごとの最大並列レプリケーション、8から256。 Default: 16
--checkpoint-interval =[ 1800 ]チェックポイント間隔、60から14400秒
--worker-batch-size =[ 500 ]ドキュメントバッチサイズ、500から10000
--doc-batch size =[ 2048 ] KBドキュメントのバッチサイズ、10から100000KB
--failure-restart-interval =[ 30 ]失敗したXDCRのリスタート間隔、1から300秒
--optimistic-replication-threshold =[ 256 ]楽観的レプリケーション実行のドキュメントボディサイズ閾値(bytes)
--xdcr-replication-mode=[xmem | capi]レプリケーションプロトコル、capiあるいはxmem
+
+ +
+ + +

シンタックス

+

+couchbase-cli xdcr-replicate -c [host]:[port]
+    [option]
+    -u [administrator] -p [password]         
+
+        
+ + +
+ + +

例: レプリケーションストリームの開始

+

レプリケーションストリームを開始するには:

+ +
couchbase-cli xdcr-replicate -c 192.168.0.1:8091 
+        --create 
+        --xdcr-cluster-name=test 
+        --xdcr-from-bucket=default 
+        --xdcr-to-bucket=default1
+      
+ + +
+ + +

例: レプリケーションストリームの削除

+

レプリケーションストリームを削除するには:

+ +
couchbase-cli xdcr-replicate -c 192.168.0.1:8091 
+        --delete 
+        --xdcr-replicator=f4eb540d74c43fd3ac6d4b7910c8c92f/default/default
+      
+ + +
+ + +

レスポンス

+

レスポンス例:

+ +
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-xdcr-pause-resume.html b/preview/contents/CLI/CBcli/cbcli-xdcr-pause-resume.html new file mode 100644 index 0000000..fbc763e --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-xdcr-pause-resume.html @@ -0,0 +1,223 @@ +XDCRレプリケーションストリームの一時停止
+

XDCRレプリケーションストリームの一時停止

+ + +

XDCR CLIはcouchbase-cli xdcr-replicateでレプリケーションの一時停止および再開するためのオプションを提供します。

+ + +

説明

+

couchbase-cli xdcr-replicateのパラメータを以下に示します。

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. xdcr-replicate オプション
オプション説明
--create新しいレプリケーションを作成し開始する
--deleteレプリケーションを停止しキャンセルする
--listすべてのXDCRレプリケーションを表示
--pauseレプリケーションを一時停止
--resumeレプリケーションを再開
--settingsレプリケーションの設定を更新
--xdcr-replicator=REPLICATORレプリケーションID
--xdcr-from-bucket=BUCKETレプリケーション元のローカルのバケット名
--xdcr-cluster-name=CLUSTERNAMEレプリケーション先のリモートクラスタ
--xdcr-to-bucket=BUCKETNAMEレプリケーション先のリモートバケット名
--max-concurrent-reps =[ 16 ]バケットごとの最大並列レプリケーション、8から256。 デフォルト: 16
--checkpoint-interval =[ 1800 ]チェックポイント間隔、60から14400秒
--worker-batch-size =[ 500 ]ドキュメントバッチサイズ、500から10000
--doc-batch size =[ 2048 ] KBドキュメントバッチサイズ、10から100000KB
--failure-restart-interval =[ 30 ]失敗したXDCRのリスタート間隔、1から300秒
--optimistic-replication-threshold =[ 256 ]楽観的レプリケーション実行のドキュメントボディサイズ閾値(bytes)
--xdcr-replication-mode=[xmem|capi]レプリケーションプロトコル、capiあるいはxmem
+
+ +
+ + +

シンタックス

+

+couchbase-cli xdcr-replicate -c HOST:PORT
+    --pause	
+    --xdcr-replicator=[REPLICATOR_ID]	
+    -u ADMIN -p PASSWORD         
+ 
+couchbase-cli xdcr-replicate -c HOST:PORT
+  --resume	
+  --xdcr-replicator=[REPLICATOR_ID]	
+  -u ADMIN -p PASSWORD
+        
+ + +
+ + + +

例: 実行中のレプリケーションストリームを一時停止する

+

+couchbase-cli xdcr-replicate -c 192.168.0.1:8091 
+    --pause 
+    --xdcr-replicator=f4eb540d74c43fd3ac6d4b7910c8c92f/default/default 
+    -u Administrator -p password
+      
+ +
+ + + + +

例: 一時停止したレプリケーションストリームを再開する

+

+couchbase-cli xdcr-replicate -c 192.168.0.1:8091 
+    --resume	
+    --xdcr-replicator=f4eb540d74c43fd3ac6d4b7910c8c92f/default/default 
+    -u Administrator -p password
+      
+ +
+ + +

例: レプリケーションストリームの設定を更新する

+

+couchbase-cli xdcr-replicate -c 192.168.0.1:8091 
+    --settings 
+    --xdcr-replicator=f4eb540d74c43fd3ac6d4b7910c8c92f/default/default 
+    --max-concurrent-reps=32 
+    --checkpoint-interval=1800 
+    --worker-batch-size=500 
+    --doc-batch-size=2048 
+    --failure-restart-interval=30 
+    --optimistic-replication-threshold=256 
+    -u Administrator -p password        
+      
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBcli/cbcli-xdcr.html b/preview/contents/CLI/CBcli/cbcli-xdcr.html new file mode 100644 index 0000000..5d0a20d --- /dev/null +++ b/preview/contents/CLI/CBcli/cbcli-xdcr.html @@ -0,0 +1,582 @@ +XDCR
+

XDCR

+ + +

couchbase-cliツールでは以下のXDCRコマンドが利用できます。

+ +

説明

+

リモートXDCRレプリケーション、コネクション、オペレーションは以下のXDCRコマンドとオプションで管理します。

+ + +
+ + +

CLIコマンドとパラメータ

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. couchbase-cli xdcr コマンド
コマンド説明
xdcr-setupXDCRレプリケーション設定の管理。
setting-xdcrXDCR関連のレプリケーション設定。
xdcr-replicateXDCRレプリケーションオペレーションの管理。
ssl-manageクラスタのSSL証明書を管理する。
+
+ + + +

couchbase-cli xdcr-setupのオプションを以下に示します。

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 2. xdcr-setup オプション
xdcr-setup オプション説明
--create新しいXDCR設定を作成する。
--edit既存のXDCR設定を変更する。
--delete既存のXDCR設定を削除する。
--listすべてのXDCR設定をリスト表示する。
--xdcr-cluster-name=[clustername]クラスタ名。
--xdcr-hostname=[hostname]接続するリモートホスト名。
--xdcr-username=[username]リモートクラスタの管理者ユーザ名。
--xdcr-password=[passwordリモートクラスタの管理者パスワード。
--xdcr-demand-encryption=[0 | 1]SSLによるデータ暗号化の有効/無効化。 Trueが1で、暗号化を有効に。 Falseが0で、暗号化を無効に。 デフォルト: 0
--xdcr-certificate=[certificate]pemエンコードの証明書を指定。 xdcr-demand-encryptionがTrueの場合、自己署名の証明書を指定する必要があります。
+
+ + + +

couchbase-cli setting-xdcrのオプションを以下に示します。

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 3. setting-xdcr オプション
setting-xdcr オプション説明
--max-concurrent-reps=[32]バケットごとの最大並列レプリケーション、8から256。
--checkpoint-interval=[1800]チェックポイント間隔、60から14400秒。
--worker-batch-size=[500]ドキュメントワーカのバッチサイズ、500から10000
--doc-batch-size=[2049]KBドキュメントバッチサイズ、10から100000KB
--failure-restart-interval=[30]失敗したXDCRのリスタート間隔、1から300秒
--optimistic-replication-threshold=[256]楽観的レプリケーション実行のドキュメントボディサイズ閾値(bytes)
+
+ + + + +

couchbase-cli xdcr-replicateのオプションを以下に示します。

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 4. xdcr-replicate オプション
xdcr-replicate オプション説明
--create新しいレプリケーションを作成し開始する
--deleteレプリケーションを停止しキャンセルする
--listすべてのXDCRレプリケーションを表示
--pauseレプリケーションを一時停止
--resumeレプリケーションを再開
--settingsレプリケーションの設定を更新
--xdcr-replicator=[replicator]レプリケーションID
--xdcr-from-bucket=[bucket-name]レプリケーション元のローカルのバケット名
--xdcr-cluster-name=[remote-cluster]レプリケーション先のリモートクラスタ
--xdcr-to-bucket=[remote-bucket]レプリケーション先のリモートバケット名
--max-concurrent-reps =[ 16 ]バケット単位の最大並列レプリケーションを指定、8から256。 デフォルト: 16
--checkpoint-interval =[ 1800 ]チェックポイント間隔、60から14400秒
--worker-batch-size =[ 500 ]ドキュメントワーカのバッチサイズ、500から10000
--doc-batch size =[ 2048 ] KBドキュメントのバッチサイズ、10から100000KB
--failure-restart-interval =[ 30 ]失敗したXDCRのリスタート間隔、1から300秒
--optimistic-replication-threshold =[ 256 ]楽観的レプリケーション実行のドキュメントボディサイズ閾値(bytes)
--xdcr-replication-mode=[xmem | capi]レプリケーションプロトコル、capiあるいはxmem
+
+ + +

couchbase-cli ssl-manageのオプションを以下に示します。 このオプションはエンタープライズエディションのみ利用可能です。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 5. ssl-manage コマンドオプション
ssl-manage オプション (エンタープライズエディションのみ)説明
--retrieve-cert=[certificate]自己署名証明書を宛先クラスタからソースクラスタへと保存する。 pemエンコード証明書のローカル保存先(絶対パス)とファイル名を指定する。 例、 --retrieve-cert=./newCert.pem
--regenerate-cert=[certificate]対象のクラスタ上で自己署名の証明書を再生成する。 pemエンコードの証明書ファイルの絶対パスを指定。例、 + --regenerate-cert=./newRegen.pem
+
+ + +
+ + + +

例: リモートクラスタの参照を作成する

+

リモートクラスタの参照を作成するには:

+ +
couchbase-cli xdcr-setup -c 10.3.121.121:8091 -u Administrator  -p password 
+    --create 
+    --xdcr-cluster-name=RemoteCluster  
+    --xdcr-hostname=10.3.121.123:8091  
+    --xdcr-username=Administrator  
+    --xdcr-password=password
+
+ + + + + +

成功すると、以下のレスポンスが返却されます:

+ +
SUCCESS: init RemoteCluster
+ + +

その後、デフォルトとしてmemcachedプロトコルでリモートクラスタへのレプリケーションを開始できます。

+ + +
couchbase-cli xdcr-replicate -c 10.3.121.123:8091 -u Administrator -p password 
+        --xdcr-cluster-name RemoteCluster 
+        --xdcr-from-bucket default 
+        --xdcr-to-bucket backup
+      
+ + +

XDCRのレプリケーションで利用するプロトコルは設定可能です。 + 明示的にmemcachedプロトコルを指定するには:

+ + +
couchbase-cli xdcr-replicate -c 10.3.121.123:8091 -u Administrator -p password
+    --xdcr-cluster-name RemoteCluster 
+    --xdcr-from-bucket default 
+    --xdcr-to-bucket backup 
+    --xdcr-replication-mode xmem
+      
+ + +

CAPIプロトコルを指定するには:

+ + +
couchbase-cli xdcr-replicate -c 10.3.121.123:8091 -u Administrator -p password
+    --xdcr-cluster-name=RemoteCluster 
+    --xdcr-from-bucket=default 
+    --xdcr-to-bucket=backup
+    --xdcr-replication-mode=capi
+      
+ + +

既存のXDCRレプリケーションで、XDCRレプリケーションプロトコルを変更するには:

+ + +
    +
  1. レプリケーションを削除する。
  2. + +
  3. 設定を指定してレプリケーションを再作成する。
  4. + +
+ + +

バケットですでにレプリケーションが存在する場合、新しい設定でレプリケーションを開始する際にエラーとなります。

+ +
couchbase-cli xdcr-replicate -c 10.3.121.121:8091 -u Administrator -p password 
+    --xdcr-cluster-name=RemoteCluster 
+    --xdcr-from-bucket=default 
+    --xdcr-to-bucket=backup
+    --xdcr-replication-mode=capi
+      
+ + +

以下のエラーが返されます:

+ +
ERROR: unable to create replication (400) Bad Request
+        {u'errors': {u'_': u'Replication to the same remote cluster and bucket already exists'}}
+ERROR: Replication to the same remote cluster and bucket already exists
+      
+ +
+ + +

例: XDCRリモートクラスタリストの表示

+

以下の例では、ローカルホストからcouchbase-cli xdcr-setupコマンドを実行し、リモートホストをホストに指定します。 + すべてのXDCR設定をリスト表示する:

+ +

+couchbase-cli xdcr-setup 
+  -c 10.5.2.117:8091 
+  -u Administrator -p password 
+  --list        
+      
+ +
+ + +

例: XDCRレプリケーションストリームをリスト表示する

+ +

以下の例では、ローカルホストからcouchbase-cli xdcr-replicateコマンドを実行し、ホスト名にリモートホストを指定します。 + XDCRレプリケーションストリームをリスト表示する

+ +

+couchbase-cli xdcr-replicate 
+  -c 10.5.2.117:8091 
+  -u Administrator -p password 
+  --list        
+      
+ +
+ + +

レスポンス

+

以下はcouchbase-cli xdcr-setup --listコマンドオプションのレスポンス例で、ローカルホスト、UUID、URI、ユーザ名を表示します:

+ +

+cluster name: source1
+      uuid: bfa861d3734c90559522a88b9db81606
+      host name: 10.5.2.54:8091
+      user name: Administrator
+      uri: /pools/default/remoteClusters/source1
+      
+ + + +

以下はcouchbase-cli xdcr-replicate --listコマンドオプションのレスポンス例で、ソースバケットからリモートバケットへのレプリケーションストリームを表示します。

+ +

+stream id: bfa861d3734c90559522a88b9db81606/test2/test
+   status: running
+   source: test2
+   target: /remoteClusters/bfa861d3734c90559522a88b9db81606/buckets/test
+      
+ + + +
+ + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/CLI/CBepctl/cbepctl-accesslog.html b/preview/contents/CLI/CBepctl/cbepctl-accesslog.html new file mode 100644 index 0000000..e4d8dcd --- /dev/null +++ b/preview/contents/CLI/CBepctl/cbepctl-accesslog.html @@ -0,0 +1,81 @@ +アクセスログ設定の変更
+

アクセスログ設定の変更

+ + +

アクセスログ設定はいつ初回のアクセススキャナプロセスを実行するか、またどの程度の頻度で実行するかを決定します。

+ +

説明

+

+ Couchbase Serverはディスクウォームアップを最適化しています。 + Couchbase Serverは事前に最も頻繁にアクセスされたキーをフェッチし、それらのドキュメントをまずフェッチします。 + サーバは定期的にスキャナプロセスを実行し、どのキーが最も頻繁に利用されているかを特定します。 + cbepctl flush_paramコマンドを利用し、この処理の初回実行時刻と実行間隔を変更することができます。 + 例えば、アプリケーションがこれらのキーを高速に利用する必要のあるピーク時間帯を避けるために、初回実行時刻と実行間隔を変更します。 +

+ + +

+ デフォルトでは、スキャナプロセスは2:00 AM UTCを初回実行時刻とし、その後24時間ごとに実行されます。 + これは、新規にCouchbase Serverインスタンスをインストールした後、あるいはサーバを再起動した後に、スキャナが2:00 AM GMT、そして2:00 PM GMTと、24時間ごとに起動するということです。 +

+ +
+ + +

シンタックス

+

基本シンタックス:

+ +

+cbepctl [hostname]:11210 -b [bucket-name] -p [bucket-password] set flush_param alog_sleep_time [value]
+cbepctl [hostname]:11210 -b [bucket-name] -p [bucket-password] set flush_param alog_task_time [value]
+
+ +
+ + +

+

以下の例はアクセススキャナプロセスの実行間隔を20分ごとに変更します。

+ +
cbepctl 10.5.2.117:11210 -b foo-bucket -p foo-password set flush_param alog_sleep_time 20
+
+ +

以下の例はアクセススキャナプロセスの初回実行時刻をデフォルトの2:00 AM UTCから11:00 PM UTCに変更します。

+ +
cbepctl 10.5.2.117:11210 foo-bucket -p foo-password set flush_param alog_task_time 23
+
+ + +
+ + +

レスポンス

+

以下のレスポンス例は実行間隔が20分に変更された様子を示しています。

+ +

+setting param: alog_sleep_time 20
+set alog_sleep_time to 20
+      
+ + + +

以下のレスポンス例はアクセススキャナの初回実行時刻が11:00 PM UTCに変更されたことを示しています。

+ +

+setting param: alog_task_time 23
+set alog_task_time to 23
+      
+ + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBepctl/cbepctl-diskcleanup.html b/preview/contents/CLI/CBepctl/cbepctl-diskcleanup.html new file mode 100644 index 0000000..36e33bd --- /dev/null +++ b/preview/contents/CLI/CBepctl/cbepctl-diskcleanup.html @@ -0,0 +1,63 @@ +ディスククリーンアップ間隔の変更
+

ディスククリーンアップ間隔の変更

+ + +

ディスククリーンアップは期限切れアイテムを削除するメンテナンスプロセスです。

+ +

説明

+

+ cbepctl flush_param exp_pager_stimeコマンドはディスククリーンアップの実行間隔を設定します。 + Couchbase Serverは期限切れアイテムの削除を遅延処理として行い、期限切れアイテムを直ちに削除する代わりに削除フラグを付与します。 + Couchbase Serverにはすべての情報を定期的に走査し、期限切れアイテムを削除するメンテナンスプロセスがあります。 + デフォルトでは、このメンテナンスプロセスは60分ごとに実行されますが、異なる実行間隔に変更することもできます。 +

+ +
+ + +

シンタックス

+

基本シンタックス:

+ +
cbepctl [localhost]:11210 -b [bucket-name] -p [bucket-password] set flush_param exp_pager_stime [value]
+
+ + +
+ + +

+ +

+ 以下の例はクリーンアッププロセスを600秒(10分)ごとに実行するように変更します。 + これはCouchbase Serverがディスクから期限切れアイテムの削除を試みる前の待ち時間です。 +

+ + +
cbepctl 10.5.2.117:11210 set flush_param exp_pager_stime 600
+
+ +
+ + +

レスポンス

+

以下の例はクリーンアッププロセスを600秒に設定した様子を示しています。

+ +

+setting param: exp_pager_stime 600
+set exp_pager_stime to 600
+      
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBepctl/cbepctl-diskwritequeue.html b/preview/contents/CLI/CBepctl/cbepctl-diskwritequeue.html new file mode 100644 index 0000000..0cd0733 --- /dev/null +++ b/preview/contents/CLI/CBepctl/cbepctl-diskwritequeue.html @@ -0,0 +1,141 @@ +ディスク書込みキュー割り当ての変更
+

ディスク書込みキュー割り当ての変更

+ + +

ディスク書込みキュー割り当てはソースノードから宛先ノードへと送信されるデータの度合いに影響します。

+ +

説明

+

+ cbepctl set tap_paramコマンドオプションの最も典型的な利用用途は、ディスク書込みキュー内の最大アイテム数を変更することです。 + これはクラスタ内のソースと宛先ノード間で発生するデータのレプリケーションに影響します。 + あるノードがクライアントアプリケーションとレプリカのアイテムとして受信する両データはディスク書込みキューに配置されます。 + あるノードのディスク書込みキュー内で非常に多くのアイテムが待たされていると、Couchbase Serverはそのノードへのデータ送信頻度を抑えます。 + この処理はバックオフと呼ばれます。 +

+ + +

+ デフォルトでは、ディスク書込みキューが百万アイテムを保持すると、Couchbaseノードはレプリケーション用データの送信頻度を減らします。 + この設定は宛先ノードにおけるアイテムの10%以上、もしくは特定の数に変更することができます。 +

+ + +

tap_paramで利用可能なパラメータ:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. tap_paramのパラメータ
パラメータ説明
tap_keepalive指定のtapコネクションを保持する秒数。
tap_throttle_queue_capTapストリームが一時的に、5秒間停止する際の最大ディスク書込みキューサイズ。
tap_throttle_cap_pcntディスク書込みキュー内の最大アイテム数を、そのノード上の全アイテムに対する割合で指定。 + これに到達すると、tapストリームは一時的に、5秒間停止する。
tap_throttle_thresholdTapストリームが一時的に、5秒間停止する際のメモリ利用率、パーセンテージ。
+
+ +
+ + +

シンタックス

+

基本シンタックス:

+ +

+cbepctl [localhost]:11210 -b [bucket-name] -p [bucket-password] set tap_param [parameter] [value]
+cbepctl [localhost]:11210 -b [bucket-name] -p [bucket-password] set tap_param tap_throttle_queue_cap [value]
+cbepctl [localhost]:11210 -b [bucket-name] -p [bucket-password] set tap_param tap_throttle_cap_pcnt [value]
+				
+ +
+ + +

+ +

以下の例は、レプリカノードが(defaultバケットにおいて)アイテム数が2百万になった時にバックオフのリクエストを送信するように設定を変更します。

+ +
cbepctl 10.5.2.117:11210 set tap_param tap_throttle_queue_cap 2000000
+ + +

+ 以下の例は、(defaultバケットにおいて)レプリケーションストリームの制御に利用されるデフォルトの割合を変更します。 + ディスク書込みキュー内のアイテムがこの割合、もしくは特定のアイテム数を超えると、レプリケーションリクエストは減速します。 +

+ +

+ ここではレプリカノードの全アイテムの15%を設定しています。 + レプリカノード上のディスク書込みキューがこの割合に到達すると、レプリケーションバックオフをリクエストします。 +

+ +
cbepctl 10.5.2.117:11210 set tap_param tap_throttle_cap_pcnt 15
+ + +
+ + +

レスポンス

+

以下のレスポンス例は2百万と15%の閾値を設定した様子を示します:

+ +

+setting param: tap_throttle_queue_cap 2000000
+set tap_throttle_queue_cap to 2000000
+
+setting param: tap_throttle_cap_pcnt 15
+set tap_throttle_cap_pcnt to 15
+			
+ + +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/CLI/CBepctl/cbepctl-threadpool-tuning.html b/preview/contents/CLI/CBepctl/cbepctl-threadpool-tuning.html new file mode 100644 index 0000000..8f59924 --- /dev/null +++ b/preview/contents/CLI/CBepctl/cbepctl-threadpool-tuning.html @@ -0,0 +1,158 @@ +共有スレッドプール設定の変更
+

共有スレッドプール設定の変更

+ + +

動的共有スレッドプールの性能はcbepctl set flush_paramコマンドオプションでチューニングできます。

+ +

説明

+

+ 動的共有スレッドプールの性能は、実行時のep-engineとmemcached内のスレッド種別を変更することでチューニングできます。 + cbepctl set flush_paramコマンドオプションは参照、更新、non-i/o、auxiliary-i/oオペレーションを優先するスレッド数を調整します。 + これらの設定は即座に反映され、バケットの再起動は必要ありません。 +

+ + +
注: + これらの設定は実行環境が十分なCPUコア数を有している場合のみ効果があります。 + 最小CPUコア数は4ですが、更新用スレッドを1つ追加するには3つのコアがさらに必要です。 + 例えば、5つの更新用スレッドを利用するには、少なくとも16コアのハードウェアが必要になります。 +
+ + + +

以下のコマンドオプションパラメータを利用して性能をチューニングします:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. パフォーマンスチューニングパラメータ
パラメータ説明
max_num_readersデフォルトの参照オペレーション用グローバルスレッド数をオーバーライドする。
max_num_writersデフォルトの更新オペレーション用グローバルスレッド数をオーバーライドする。
max_num_auxioデフォルトのauxioオペレーション用グローバルスレッド数をオーバーライドする。
max_num_nonioデフォルトのnonioオペレーション用グローバルスレッド数をオーバーライドする。
+
+ + +
+ + +

シンタックス

+

基本シンタックス:

+ +
cbepctl [localhost]:11210 -b [bucket-name] set flush_param [parameter] [value]
+ + +
+ + +

+

最大更新スレッド数を設定するには、max_num_writersパラメータを利用します。 + 以下の例では、max_num_writersで更新用スレッドを5に設定します。

+ +
cbepctl 10.5.2.117:11210 -b foo_bucket set flush_param max_num_writers 5 
+ + + + +
+ + +

レスポンス

+

次に最大更新用スレッド数を設定した際のレスポンス例を示します。

+ +

+setting param: max_num_writers 5
+set max_num_writers to 5
+      
+ + + +

それぞれのスレッド種別で現在どれだけのスレッドが起動しているかは、cbstats workloadで確認できます。 + 例:

+ +
cbstats [localhost]:11210 -b [bucket-name] workload 
+ + +

+ 例えば、以下のcbstats workloadリクエストとレスポンスの例は、defaultバケットに対して実行しています。 + 変更した設定が、ep_workload:max_writers: 5として、cbstats workloadの結果に表示されます。 +

+ + +

+cbstats 10.5.2.117:11210 workload
+
+ ep_workload:LowPrioQ_AuxIO:InQsize:   2
+ ep_workload:LowPrioQ_AuxIO:OutQsize:  0
+ ep_workload:LowPrioQ_NonIO:InQsize:   18
+ ep_workload:LowPrioQ_NonIO:OutQsize:  0
+ ep_workload:LowPrioQ_Reader:InQsize:  8
+ ep_workload:LowPrioQ_Reader:OutQsize: 0
+ ep_workload:LowPrioQ_Writer:InQsize:  12
+ ep_workload:LowPrioQ_Writer:OutQsize: 0
+ ep_workload:max_auxio:                1
+ ep_workload:max_nonio:                1
+ ep_workload:max_readers:              4
+ ep_workload:max_writers:              5
+ ep_workload:num_auxio:                1
+ ep_workload:num_nonio:                1
+ ep_workload:num_readers:              4
+ ep_workload:num_shards:               4
+ ep_workload:num_sleepers:             10
+ ep_workload:num_writers:              5
+ ep_workload:ready_tasks:              0
+      
+ + +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBepctl/cbepctl-thresholds.html b/preview/contents/CLI/CBepctl/cbepctl-thresholds.html new file mode 100644 index 0000000..ec6f272 --- /dev/null +++ b/preview/contents/CLI/CBepctl/cbepctl-thresholds.html @@ -0,0 +1,117 @@ +アイテム除去閾値の変更
+

アイテム除去閾値の変更

+ + +

RAM領域が枯渇すると、アイテムページャプロセスはRAMからアイテムを除去します。

+ +

説明

+

+ アイテムの除去はRAMからドキュメントを削除しますが、キーとメタデータは残ります。 + アイテムが利用するRAM容量が高水位(上位の閾値)に到達すると、メモリ使用量が低水位(下位の閾値)に到達するまで、アクティブとレプリカデータの両方がメモリから除去されます。 + サーバはnot-recently-used (NRU)の値に基づき、頻繁に利用されていないアイテムを判定します。 +

+ + +

mem_low_watmem_high_watpager_active_vb_pcnt設定を利用してサーバでのアイテム除去閾値を変更できます。

+ + +
警告: Couchbaseサポートから要求されるまでは、除去設定のデフォルト値を変更することは推奨しません。
+ +
+ + +

シンタックス

+

基本シンタックス:

+ +
cbepctl [localhost]:11210 -b [bucket-name] -p [bucket-password] set flush_param [parameter] [value]
+ + +

アイテム除去閾値の変更に利用するパラメータ:

+ +
    +
  • mem_low_wat
  • + +
  • mem_high_wat
  • + +
  • pager_active_vb_pcnt
  • + +
+ + +
+ + +

例: 低水位の設定

+

低水位はノード上の指定したデータバケットの下位閾値を設定します。アイテムページャは低水位に到達するとアイテムの除去を停止します。

+ +

以下の例は、低水位の割合をRAMの70%に設定します。

+ +
cbepctl 10.5.2.117:11210 -b foo-bucket -p foo-password set flush_param mem_low_wat 70
+
+
+ + +

例: 高水位の設定

+

高水位は、頻繁に利用されないアクティブとレプリカのアイテムの除去を開始する際の、アイテムにより利用されるRAM容量を指定します。

+ +

+ 以下の例はノード上の指定したデータバケットで、RAMの80%を高水位として設定します。 + これは、このノード上のRAM内のアイテムは、アイテムページャがアイテムの除去を開始するまで、RAMの80%が利用可能ということです。 +

+ +
cbepctl 10.5.2.117:11210 -b foo-bucket -p foo-password set flush_param mem_high_wat 80
+
+
+ + +

例: 除去アイテムの割合を設定

+

+ NRUアルゴリズムに基づき、サーバはノードからアクティブとレプリカのデータを除去します。 + デフォルトでは、サーバはノード上の40%のアクティブアイテム、60%のレプリカアイテムとして設定されています。 +

+ +

以下の例はノードから除去できるアクティブアイテムの割合を50%に増やします。

+ +
cbepctl 10.5.2.117:11210 -b foo-bucket -p foo-password set flush_param pager_active_vb_pcnt 50
+ + +

+ 除去アイテムの割合を変更する場合は、性能へ影響する可能性があることに留意してください。 + 可能な限り多くのレプリカアイテムを除去し、アクティブデータが除去される量を制限することが理想的です。 + そうすることで、対象のノードへのリクエストを維持しつつ、そのノードのアクティブデータを最大化できます。 + しかしながら、そのサーバがレプリカデータの大部分を除去している状態でノード障害が発生すると、レプリカデータは即座に利用可能にはなりません。 + この場合、リクエストが完了するために、アイテムをディスクから読み出し、RAMに配置します。 +

+ +
+ + +

レスポンス

+

以下のレスポンス例は低水位、高水位、除去アイテムの割合を設定する様子を示しています。

+ +

+setting param: mem_low_wat 70
+set mem_low_wat to 70
+
+setting param: mem_high_wat 80
+set mem_high_wat to 80
+
+setting param: pager_active_vb_pcnt 50
+set pager_active_vb_pcnt to 50
+      
+ + +
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/CLI/CBepctl/cbepctl-timeout.html b/preview/contents/CLI/CBepctl/cbepctl-timeout.html new file mode 100644 index 0000000..273521f --- /dev/null +++ b/preview/contents/CLI/CBepctl/cbepctl-timeout.html @@ -0,0 +1,63 @@ +out-of-memory閾値の変更
+

out-of-memory閾値の変更

+ + +

RAM利用率が閾値の95%を超えると、out-of-memoryエラーメッセージが送信されます。

+ +

説明

+ +

+ デフォルトでは、Couchbase ServerはRAMの95%が消費され、5%のRAMしかオーバヘッドとして残らなくなると、クライアントにout-of-memoryエラーメッセージを送信します。 + cbepctl set flush_param mutation_mem-thresholdコマンドパラメータを利用し、この閾値を変更できます。 +

+ + +
注: + このデフォルト値をより高い値に変更することは推奨しません。 + しかしながら、ディスクキューやサーバデータ構造といったシステムオーバヘッドにより多くのRAMが必要な場合にこの値を減らすことがあります。 +
+ +
+ + +

シンタックス

+

基本シンタックス:

+ +
cbepctl [localhost]:11210 -b [bucket-name] -p [bucket-password] set flush_param mutation_mem_threshold [value]
+
+ +
+ + +

+

この例では、閾値をRAMの65%に減らします。

+ + +
cbepctl 10.5.2.117:11210 -b foo-bucket -p foo-password set flush_param mutation_mem_threshold 65
+
+ + + +
+ + +

レスポンス

+

以下のレスポンス例は、RAM閾値が65%に設定されている様子を示します。

+ +

+setting param: mutation_mem_threshold 65
+set mutation_mem_threshold to 65
+      
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-all.html b/preview/contents/CLI/CBstats/cbstats-all.html new file mode 100644 index 0000000..9c2766e --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-all.html @@ -0,0 +1,339 @@ +All
+

All

+ + +

cbstats allコマンドは統計に利用される情報を一覧表示します。

+ +

CLIコマンドとパラメータ

+
cbstats all
+ +
+ + + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [localhost]:11210 all
+ +
+ + +

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 all
+ + +
+ + +

レスポンス

+

レスポンス例:

+ +

+ accepting_conns:                    1
+ auth_cmds:                          0
+ auth_errors:                        0
+ bucket_active_conns:                1
+ bucket_conns:                       16
+ bytes:                              23716376
+ bytes_read:                         267183940
+ bytes_written:                      44482127693
+ cas_badval:                         0
+ cas_hits:                           0
+ cas_misses:                         0
+ cmd_flush:                          0
+ cmd_get:                            0
+ cmd_set:                            0
+ conn_yields:                        0
+ connection_structures:              5000
+ curr_connections:                   59
+ curr_conns_on_port_11207:           2
+ curr_conns_on_port_11209:           54
+ curr_conns_on_port_11210:           3
+ curr_items:                         0
+ curr_items_tot:                     0
+ curr_temp_items:                    0
+ daemon_connections:                 6
+ decr_hits:                          0
+ decr_misses:                        0
+ delete_hits:                        0
+ delete_misses:                      0
+ ep_access_scanner_enabled:          1
+ ep_access_scanner_last_runtime:     0
+ ep_access_scanner_num_items:        0
+ ep_access_scanner_task_time:        2015-01-16 21:26:19
+ ep_allow_data_loss_during_shutdown: 1
+ ep_alog_block_size:                 4096
+ ep_alog_path:                       /opt/couchbase/var/lib/couchbase/data/default/access.log
+ ep_alog_sleep_time:                 1440
+ ep_alog_task_time:                  10
+ ep_backend:                         couchdb
+ ep_backfill_mem_threshold:          95
+ ep_bg_fetch_delay:                  0
+ ep_bg_fetched:                      0
+ ep_bg_meta_fetched:                 0
+ ep_bg_remaining_jobs:               0
+ ep_blob_num:                        0
+ ep_blob_overhead:                   0
+ ep_bucket_priority:                 LOW
+ ep_chk_max_items:                   500
+ ep_chk_period:                      5
+ ep_chk_persistence_remains:         0
+ ep_chk_persistence_timeout:         10
+ ep_chk_remover_stime:               5
+ ep_commit_num:                      682
+ ep_commit_time:                     0
+ ep_commit_time_total:               0
+ ep_config_file:                     
+ ep_conflict_resolution_type:        seqno
+ ep_couch_bucket:                    default
+ ep_data_traffic_enabled:            0
+ ep_db_data_size:                    121104
+ ep_db_file_size:                    19036812
+ ep_dbname:                          /opt/couchbase/var/lib/couchbase/data/default
+ ep_dcp_conn_buffer_size:            10485760
+ ep_dcp_enable_flow_control:         1
+ ep_dcp_enable_noop:                 1
+ ep_dcp_max_unacked_bytes:           524288
+ ep_dcp_noop_interval:               180
+ ep_degraded_mode:                   0
+ ep_diskqueue_drain:                 0
+ ep_diskqueue_fill:                  0
+ ep_diskqueue_items:                 0
+ ep_diskqueue_memory:                0
+ ep_diskqueue_pending:               0
+ ep_enable_chk_merge:                0
+ ep_exp_pager_stime:                 3600
+ ep_expired_access:                  0
+ ep_expired_pager:                   0
+ ep_failpartialwarmup:               0
+ ep_flush_all:                       false
+ ep_flush_duration_total:            0
+ ep_flushall_enabled:                0
+ ep_flusher_state:                   running
+ ep_flusher_todo:                    0
+ ep_getl_default_timeout:            15
+ ep_getl_max_timeout:                30
+ ep_ht_locks:                        5
+ ep_ht_size:                         3079
+ ep_initfile:                        
+ ep_io_num_read:                     0
+ ep_io_num_write:                    0
+ ep_io_read_bytes:                   0
+ ep_io_write_bytes:                  0
+ ep_item_begin_failed:               0
+ ep_item_commit_failed:              0
+ ep_item_eviction_policy:            value_only
+ ep_item_flush_expired:              0
+ ep_item_flush_failed:               0
+ ep_item_num:                        1364
+ ep_item_num_based_new_chk:          1
+ ep_items_rm_from_checkpoints:       0
+ ep_keep_closed_chks:                0
+ ep_kv_size:                         0
+ ep_max_bg_remaining_jobs:           0
+ ep_max_checkpoints:                 2
+ ep_max_failover_entries:            25
+ ep_max_item_size:                   20971520
+ ep_max_num_auxio:                   0
+ ep_max_num_nonio:                   0
+ ep_max_num_readers:                 0
+ ep_max_num_shards:                  4
+ ep_max_num_workers:                 3
+ ep_max_num_writers:                 0
+ ep_max_size:                        524288000
+ ep_max_threads:                     0
+ ep_max_vbuckets:                    1024
+ ep_mem_high_wat:                    445644800
+ ep_mem_low_wat:                     393216000
+ ep_mem_tracker_enabled:             true
+ ep_meta_data_disk:                  0
+ ep_meta_data_memory:                0
+ ep_mlog_compactor_runs:             0
+ ep_mutation_mem_threshold:          98
+ ep_num_access_scanner_runs:         92
+ ep_num_eject_failures:              0
+ ep_num_expiry_pager_runs:           675
+ ep_num_non_resident:                0
+ ep_num_not_my_vbuckets:             0
+ ep_num_ops_del_meta:                0
+ ep_num_ops_del_meta_res_fail:       0
+ ep_num_ops_del_ret_meta:            0
+ ep_num_ops_get_meta:                0
+ ep_num_ops_get_meta_on_set_meta:    0
+ ep_num_ops_set_meta:                0
+ ep_num_ops_set_meta_res_fail:       0
+ ep_num_ops_set_ret_meta:            0
+ ep_num_pager_runs:                  0
+ ep_num_value_ejects:                0
+ ep_num_workers:                     10
+ ep_oom_errors:                      0
+ ep_overhead:                        18344996
+ ep_pager_active_vb_pcnt:            40
+ ep_pending_compactions:             0
+ ep_pending_ops:                     0
+ ep_pending_ops_max:                 0
+ ep_pending_ops_max_duration:        0
+ ep_pending_ops_total:               0
+ ep_postInitfile:                    
+ ep_queue_size:                      0
+ ep_rollback_count:                  0
+ ep_startup_time:                    1418937974
+ ep_storage_age:                     0
+ ep_storage_age_highwat:             0
+ ep_storedval_num:                   0
+ ep_storedval_overhead:              0
+ ep_storedval_size:                  0
+ ep_tap_ack_grace_period:            300
+ ep_tap_ack_initial_sequence_number: 1
+ ep_tap_ack_interval:                1000
+ ep_tap_ack_window_size:             10
+ ep_tap_backfill_resident:           0.9
+ ep_tap_backlog_limit:               5000
+ ep_tap_backoff_period:              5
+ ep_tap_bg_fetch_requeued:           0
+ ep_tap_bg_fetched:                  0
+ ep_tap_bg_max_pending:              500
+ ep_tap_keepalive:                   300
+ ep_tap_noop_interval:               20
+ ep_tap_requeue_sleep_time:          0.1
+ ep_tap_throttle_cap_pcnt:           10
+ ep_tap_throttle_queue_cap:          1000000
+ ep_tap_throttle_threshold:          90
+ ep_tmp_oom_errors:                  0
+ ep_total_cache_size:                0
+ ep_total_del_items:                 0
+ ep_total_enqueued:                  0
+ ep_total_new_items:                 0
+ ep_total_persisted:                 0
+ ep_uncommitted_items:               0
+ ep_uuid:                            4fec4bc6cd57d1b9a1b509e2b20f4350
+ ep_value_size:                      0
+ ep_vb0:                             0
+ ep_vb_snapshot_total:               33810
+ ep_vb_total:                        682
+ ep_vbucket_del:                     0
+ ep_vbucket_del_fail:                0
+ ep_version:                         2.1.1r-1027-gfb165a6
+ ep_waitforwarmup:                   0
+ ep_warmup:                          1
+ ep_warmup_batch_size:               1000
+ ep_warmup_dups:                     0
+ ep_warmup_min_items_threshold:      100
+ ep_warmup_min_memory_threshold:     100
+ ep_warmup_oom:                      0
+ ep_warmup_thread:                   complete
+ ep_warmup_time:                     4063516
+ ep_workload_pattern:                read_heavy
+ get_hits:                           0
+ get_misses:                         0
+ incr_hits:                          0
+ incr_misses:                        0
+ libevent:                           2.0.11-stable
+ listen_disabled_num:                0
+ max_conns_on_port_11207:            30000
+ max_conns_on_port_11209:            5000
+ max_conns_on_port_11210:            30000
+ mem_used:                           23716376
+ memcached_version:                  be691c3b78a68e441d58c249e02121df7e9f8556
+ pid:                                27483
+ pointer_size:                       64
+ rejected_conns:                     0
+ rusage_system:                      9346.955046
+ rusage_user:                        87110.364211
+ threads:                            4
+ time:                               1421371024
+ total_connections:                  18
+ uptime:                             2433050
+ vb_active_curr_items:               0
+ vb_active_eject:                    0
+ vb_active_expired:                  0
+ vb_active_ht_memory:                8557736
+ vb_active_itm_memory:               0
+ vb_active_meta_data_disk:           0
+ vb_active_meta_data_memory:         0
+ vb_active_num:                      341
+ vb_active_num_non_resident:         0
+ vb_active_ops_create:               0
+ vb_active_ops_delete:               0
+ vb_active_ops_reject:               0
+ vb_active_ops_update:               0
+ vb_active_perc_mem_resident:        100
+ vb_active_queue_age:                0
+ vb_active_queue_drain:              0
+ vb_active_queue_fill:               0
+ vb_active_queue_memory:             0
+ vb_active_queue_pending:            0
+ vb_active_queue_size:               0
+ vb_dead_num:                        0
+ vb_pending_curr_items:              0
+ vb_pending_eject:                   0
+ vb_pending_expired:                 0
+ vb_pending_ht_memory:               0
+ vb_pending_itm_memory:              0
+ vb_pending_meta_data_disk:          0
+ vb_pending_meta_data_memory:        0
+ vb_pending_num:                     0
+ vb_pending_num_non_resident:        0
+ vb_pending_ops_create:              0
+ vb_pending_ops_delete:              0
+ vb_pending_ops_reject:              0
+ vb_pending_ops_update:              0
+ vb_pending_perc_mem_resident:       100
+ vb_pending_queue_age:               0
+ vb_pending_queue_drain:             0
+ vb_pending_queue_fill:              0
+ vb_pending_queue_memory:            0
+ vb_pending_queue_pending:           0
+ vb_pending_queue_size:              0
+ vb_replica_curr_items:              0
+ vb_replica_eject:                   0
+ vb_replica_expired:                 0
+ vb_replica_ht_memory:               8557736
+ vb_replica_itm_memory:              0
+ vb_replica_meta_data_disk:          0
+ vb_replica_meta_data_memory:        0
+ vb_replica_num:                     341
+ vb_replica_num_non_resident:        0
+ vb_replica_ops_create:              0
+ vb_replica_ops_delete:              0
+ vb_replica_ops_reject:              0
+ vb_replica_ops_update:              0
+ vb_replica_perc_mem_resident:       100
+ vb_replica_queue_age:               0
+ vb_replica_queue_drain:             0
+ vb_replica_queue_fill:              0
+ vb_replica_queue_memory:            0
+ vb_replica_queue_pending:           0
+ vb_replica_queue_size:              0
+ version:                            3.0.2-1605-rel
+      
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-allocator.html b/preview/contents/CLI/CBstats/cbstats-allocator.html new file mode 100644 index 0000000..28134b6 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-allocator.html @@ -0,0 +1,140 @@ +Allocator
+

Allocator

+ + +

cbstats allocatorコマンドはメモリ管理の情報を提供します。

+ +

CLIコマンドとパラメータ

+
cbstats allocator
+ + + +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [localhost]:11210 allocator
+ +
+ + +

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 allocator
+ + +
+ + +

レスポンス

+

レスポンス例:

+ +

+------------------------------------------------
+MALLOC:      211296632 (  201.5 MiB) Bytes in use by application
+MALLOC: +     11730944 (   11.2 MiB) Bytes in page heap freelist
+MALLOC: +     10833696 (   10.3 MiB) Bytes in central cache freelist
+MALLOC: +      3404400 (    3.2 MiB) Bytes in transfer cache freelist
+MALLOC: +     18832632 (   18.0 MiB) Bytes in thread cache freelists
+MALLOC: +      1781920 (    1.7 MiB) Bytes in malloc metadata
+MALLOC:   ------------
+MALLOC: =    257880224 (  245.9 MiB) Actual memory used (physical + swap)
+MALLOC: +      1236992 (    1.2 MiB) Bytes released to OS (aka unmapped)
+MALLOC:   ------------
+MALLOC: =    259117216 (  247.1 MiB) Virtual address space used
+MALLOC:
+MALLOC:           8855              Spans in use
+MALLOC:             16              Thread heaps in use
+MALLOC:           8192              Tcmalloc page size
+------------------------------------------------
+Call ReleaseFreeMemory() to release freelist memory to the OS (via madvise()).
+Bytes released to the OS take up virtual address space but no physical memory.
+------------------------------------------------
+Total size of freelists for per-thread caches,
+transfer cache, and central cache, by size class
+------------------------------------------------
+class   1 [        8 bytes ] :     7825 objs;   0.1 MiB;   0.1 cum MiB
+class   2 [       16 bytes ] :     1149 objs;   0.0 MiB;   0.1 cum MiB
+class   3 [       32 bytes ] :    47076 objs;   1.4 MiB;   1.5 cum MiB
+class   4 [       48 bytes ] :    51137 objs;   2.3 MiB;   3.9 cum MiB
+class   5 [       64 bytes ] :     3987 objs;   0.2 MiB;   4.1 cum MiB
+class   6 [       80 bytes ] :     5528 objs;   0.4 MiB;   4.5 cum MiB
+class   7 [       96 bytes ] :    18530 objs;   1.7 MiB;   6.2 cum MiB
+class   8 [      112 bytes ] :    39207 objs;   4.2 MiB;  10.4 cum MiB
+class   9 [      128 bytes ] :    25812 objs;   3.2 MiB;  13.6 cum MiB
+class  10 [      144 bytes ] :      399 objs;   0.1 MiB;  13.6 cum MiB
+class  11 [      160 bytes ] :      321 objs;   0.0 MiB;  13.7 cum MiB
+class  12 [      176 bytes ] :      201 objs;   0.0 MiB;  13.7 cum MiB
+class  13 [      192 bytes ] :      162 objs;   0.0 MiB;  13.7 cum MiB
+class  14 [      208 bytes ] :       70 objs;   0.0 MiB;  13.7 cum MiB
+class  15 [      224 bytes ] :       77 objs;   0.0 MiB;  13.8 cum MiB
+class  16 [      240 bytes ] :       72 objs;   0.0 MiB;  13.8 cum MiB
+class  17 [      256 bytes ] :       81 objs;   0.0 MiB;  13.8 cum MiB
+class  18 [      288 bytes ] :       38 objs;   0.0 MiB;  13.8 cum MiB
+class  19 [      320 bytes ] :       52 objs;   0.0 MiB;  13.8 cum MiB
+class  20 [      352 bytes ] :      112 objs;   0.0 MiB;  13.9 cum MiB
+class  21 [      384 bytes ] :       44 objs;   0.0 MiB;  13.9 cum MiB
+class  22 [      416 bytes ] :       18 objs;   0.0 MiB;  13.9 cum MiB
+class  23 [      448 bytes ] :       60 objs;   0.0 MiB;  13.9 cum MiB
+class  24 [      480 bytes ] :       77 objs;   0.0 MiB;  13.9 cum MiB
+class  25 [      512 bytes ] :     2726 objs;   1.3 MiB;  15.3 cum MiB
+class  26 [      576 bytes ] :      114 objs;   0.1 MiB;  15.3 cum MiB
+class  27 [      640 bytes ] :       84 objs;   0.1 MiB;  15.4 cum MiB
+class  28 [      704 bytes ] :       99 objs;   0.1 MiB;  15.4 cum MiB
+class  29 [      768 bytes ] :      125 objs;   0.1 MiB;  15.5 cum MiB
+class  30 [      832 bytes ] :      124 objs;   0.1 MiB;  15.6 cum MiB
+class  31 [      896 bytes ] :       43 objs;   0.0 MiB;  15.7 cum MiB
+class  32 [      960 bytes ] :       24 objs;   0.0 MiB;  15.7 cum MiB
+class  33 [     1024 bytes ] :       45 objs;   0.0 MiB;  15.7 cum MiB
+class  34 [     1152 bytes ] :       29 objs;   0.0 MiB;  15.8 cum MiB
+class  35 [     1280 bytes ] :       42 objs;   0.1 MiB;  15.8 cum MiB
+class  36 [     1408 bytes ] :       29 objs;   0.0 MiB;  15.9 cum MiB
+class  37 [     1536 bytes ] :       30 objs;   0.0 MiB;  15.9 cum MiB
+class  38 [     1792 bytes ] :      213 objs;   0.4 MiB;  16.3 cum MiB
+class  39 [     2048 bytes ] :      523 objs;   1.0 MiB;  17.3 cum MiB
+class  40 [     2304 bytes ] :       14 objs;   0.0 MiB;  17.3 cum MiB
+class  41 [     2560 bytes ] :        7 objs;   0.0 MiB;  17.3 cum MiB
+class  45 [     4096 bytes ] :       31 objs;   0.1 MiB;  17.5 cum MiB
+class  46 [     4608 bytes ] :        5 objs;   0.0 MiB;  17.5 cum MiB
+class  47 [     5120 bytes ] :        1 objs;   0.0 MiB;  17.5 cum MiB
+class  49 [     6656 bytes ] :        4 objs;   0.0 MiB;  17.5 cum MiB
+class  50 [     8192 bytes ] :       36 objs;   0.3 MiB;  17.8 cum MiB
+class  51 [     9216 bytes ] :       38 objs;   0.3 MiB;  18.1 cum MiB
+class  55 [    16384 bytes ] :       11 objs;   0.2 MiB;  18.3 cum MiB
+class  56 [    20480 bytes ] :        4 objs;   0.1 MiB;  18.4 cum MiB
+class  58 [    26624 bytes ] :        2 objs;   0.1 MiB;  18.4 cum MiB
+class  59 [    32768 bytes ] :        9 objs;   0.3 MiB;  18.7 cum MiB
+class  60 [    40960 bytes ] :        4 objs;   0.2 MiB;  18.9 cum MiB
+class  63 [    65536 bytes ] :        9 objs;   0.6 MiB;  19.4 cum MiB
+class  71 [   131072 bytes ] :        9 objs;   1.1 MiB;  20.6 cum MiB
+class  72 [   139264 bytes ] :        4 objs;   0.5 MiB;  21.1 cum MiB
+class  87 [   262144 bytes ] :        9 objs;   2.2 MiB;  23.3 cum MiB
+------------------------------------------------
+PageHeap: 3 sizes;   11.2 MiB free;    1.2 MiB unmapped
+------------------------------------------------
+     1 pages *     84 spans ~    0.7 MiB;    0.7 MiB cum; unmapped:    0.7 MiB;    0.7 MiB cum
+    14 pages *      1 spans ~    0.1 MiB;    0.8 MiB cum; unmapped:    0.1 MiB;    0.8 MiB cum
+    53 pages *      1 spans ~    0.4 MiB;    1.2 MiB cum; unmapped:    0.4 MiB;    1.2 MiB cum
+>255   large *      1 spans ~   11.2 MiB;   12.4 MiB cum; unmapped:    0.0 MiB;    1.2 MiB cum
+
+
+      
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-checkpoint.html b/preview/contents/CLI/CBstats/cbstats-checkpoint.html new file mode 100644 index 0000000..c0c8d1b --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-checkpoint.html @@ -0,0 +1,211 @@ +Checkpoint
+ +

Checkpoint

+ + +

チェックポイント統計情報はvBucket単位のチェックポイントデータ構造に関する詳細情報を提供します。

+ +

説明

+ + +

ハッシュ統計情報と同様に、これらの統計をリクエストすると性能に多少の影響を与えます。 このため頻繁にサーバから取得しないで下さい。

+ + +

以下のコマンドオプションが利用できます:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オプション説明
-h, --helpヘルプメッセージを表示して終了する。
-aすべてのバケットをイテレートする。 管理者のユーザ名とパスワードが必要。
-b [bucket-name]ステータスを取得するバケット。 デフォルト: default
-p [password]バケットのパスワード、設定されている場合。
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. cbstats checkpoint 統計情報
統計情報説明
cursor_name:cursor_checkpoint_id'cursor_name'の名前のカーソルが指し示すチェックポイントID
open_checkpoint_id現在オープンしているチェックポイントのID
num_tap_cursors参照しているTAPカーソル数
num_checkpoint_itemsチェックポイントデータ構造内のアイテム総数
num_open_checkpoint_itemsオープンチェックポイント内のアイテム数
num_checkpointsチェックポイントデータ構造内のチェックポイント数
num_items_for_persistence永続化待ちのアイテム数
checkpoint_extensionオープンチェックポイントが拡張モードの場合True
stateこのチェックポイントデータの対象となるvBucketのステータス
last_closed_checkpoint_id最後にクローズしたチェックポイント番号
persisted_checkpoint_id最後に永続化したチェックポイント番号
+
+ + +
+ + +

シンタックス

+

リクエストシンタックス:

+ +

+cbstats [host]:11210 checkpoint
+			
+ +
+ + +

+

リクエスト例:

+ +

+cbstats 10.5.2.117:11210 checkpoint
+			
+ +
+ + +

レスポンス

+

レスポンス例:

+ +

+ vb_0:last_closed_checkpoint_id:    1
+ vb_0:num_checkpoint_items:         1
+ vb_0:num_checkpoints:              1
+ vb_0:num_items_for_persistence:    0
+ vb_0:num_open_checkpoint_items:    0
+ vb_0:num_tap_cursors:              0
+ vb_0:open_checkpoint_id:           2
+ vb_0:persisted_checkpoint_id:      1
+ vb_0:state:                        active
+ ...
+ vb_9:last_closed_checkpoint_id:    1
+ vb_9:num_checkpoint_items:         1
+ vb_9:num_checkpoints:              1
+ vb_9:num_items_for_persistence:    0
+ vb_9:num_open_checkpoint_items:    0
+ vb_9:num_tap_cursors:              0
+ vb_9:open_checkpoint_id:           2
+ vb_9:persisted_checkpoint_id:      1
+ vb_9:state:                        active
+			
+ +
+ +
+ + + + + +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-config.html b/preview/contents/CLI/CBstats/cbstats-config.html new file mode 100644 index 0000000..d450586 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-config.html @@ -0,0 +1,125 @@ +Config
+

Config

+ + +

cbstats configコマンドは設定情報の統計を表示します。

+ +

CLIコマンドとパラメータ

+

+ +
cbstats config
+ + +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [localhost]:11210 config
+ +
+ + +

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 config
+ + +
+ + +

レスポンス

+

レスポンス例:

+ +

+ ep_access_scanner_enabled:          1
+ ep_allow_data_loss_during_shutdown: 1
+ ep_alog_block_size:                 4096
+ ep_alog_path:                       /opt/couchbase/var/lib/couchbase/data/default/access.log
+ ep_alog_sleep_time:                 1440
+ ep_alog_task_time:                  10
+ ep_backend:                         couchdb
+ ep_backfill_mem_threshold:          95
+ ep_bg_fetch_delay:                  0
+ ep_chk_max_items:                   500
+ ep_chk_period:                      5
+ ep_chk_remover_stime:               5
+ ep_config_file:                     
+ ep_conflict_resolution_type:        seqno
+ ep_couch_bucket:                    default
+ ep_data_traffic_enabled:            0
+ ep_dbname:                          /opt/couchbase/var/lib/couchbase/data/default
+ ep_dcp_conn_buffer_size:            10485760
+ ep_dcp_enable_flow_control:         1
+ ep_dcp_enable_noop:                 1
+ ep_dcp_max_unacked_bytes:           524288
+ ep_dcp_noop_interval:               180
+ ep_enable_chk_merge:                0
+ ep_exp_pager_stime:                 3600
+ ep_failpartialwarmup:               0
+ ep_flushall_enabled:                0
+ ep_getl_default_timeout:            15
+ ep_getl_max_timeout:                30
+ ep_ht_locks:                        5
+ ep_ht_size:                         3079
+ ep_initfile:                        
+ ep_item_eviction_policy:            value_only
+ ep_item_num_based_new_chk:          1
+ ep_keep_closed_chks:                0
+ ep_max_checkpoints:                 2
+ ep_max_failover_entries:            25
+ ep_max_item_size:                   20971520
+ ep_max_num_auxio:                   0
+ ep_max_num_nonio:                   0
+ ep_max_num_readers:                 0
+ ep_max_num_shards:                  4
+ ep_max_num_workers:                 3
+ ep_max_num_writers:                 0
+ ep_max_size:                        524288000
+ ep_max_threads:                     0
+ ep_max_vbuckets:                    1024
+ ep_mem_high_wat:                    445644800
+ ep_mem_low_wat:                     393216000
+ ep_mutation_mem_threshold:          98
+ ep_pager_active_vb_pcnt:            40
+ ep_postInitfile:                    
+ ep_tap_ack_grace_period:            300
+ ep_tap_ack_initial_sequence_number: 1
+ ep_tap_ack_interval:                1000
+ ep_tap_ack_window_size:             10
+ ep_tap_backfill_resident:           0.9
+ ep_tap_backlog_limit:               5000
+ ep_tap_backoff_period:              5
+ ep_tap_bg_max_pending:              500
+ ep_tap_keepalive:                   300
+ ep_tap_noop_interval:               20
+ ep_tap_requeue_sleep_time:          0.1
+ ep_tap_throttle_cap_pcnt:           10
+ ep_tap_throttle_queue_cap:          1000000
+ ep_tap_throttle_threshold:          90
+ ep_uuid:                            4fec4bc6cd57d1b9a1b509e2b20f4350
+ ep_vb0:                             0
+ ep_waitforwarmup:                   0
+ ep_warmup:                          1
+ ep_warmup_batch_size:               1000
+ ep_warmup_min_items_threshold:      100
+ ep_warmup_min_memory_threshold:     100
+      
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-diskinfo.html b/preview/contents/CLI/CBstats/cbstats-diskinfo.html new file mode 100644 index 0000000..b395df3 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-diskinfo.html @@ -0,0 +1,55 @@ +Diskinfo
+

Diskinfo

+ + +

cbstats diskinfoコマンドはデータとファイルサイズの情報を提供します。

+ +

CLIコマンドとパラメータ

+

+ +
cbstats diskinfo
+ + +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [localhost]:11210 diskinfo
+ +
+ + +

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 diskinfo
+ + +
+ + +

レスポンス

+

レスポンス例:

+ +

+ ep_db_data_size: 121104
+ ep_db_file_size: 19036812
+      
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-dispatcher-job.html b/preview/contents/CLI/CBstats/cbstats-dispatcher-job.html new file mode 100644 index 0000000..cb04c78 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-dispatcher-job.html @@ -0,0 +1,159 @@ +Dispatcher
+

Dispatcher

+ + +

cbstats dispatcherコマンドはreader、writer、auxio、nonioワーカスレッドの統計情報を取得します。

+ +

説明

+

このコマンドはAUXディスパッチャ、non-IOディスパッチャ、そして特定のバケットで稼働するすべてのreader、writerスレッドの統計情報を提供します。 統計情報に加え、各ディスパッチャとワーカスレッドののジョブログも利用可能です。

+ +

ワーカとディスパッチャに関する以下の統計情報が利用できます:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
統計情報説明
cur_time現在のタイムスタンプ。
runtimeジョブ実行時間、ミリ秒。
stateスレッドの現在の状態: running、sleeping、など。
task該当時間にスレッドが実行していたアクティビティ。
waketimeジョブ開始時のタイムスタンプ
+
+ + +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [hostname]:11210 dispatcher
+ +
+ + +

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 dispatcher
+ +
+ + + +

レスポンス

+

レスポンス例:

+ +

+ auxio_worker_8
+     cur_time: 1419384974021911
+     state:    sleeping
+     task:     Not currently running any task
+     waketime: 1419456378037138
+ nonio_worker_9
+     cur_time: 1419384975434145
+     runtime:  9ms
+     state:    running
+     task:     Connection Manager
+     waketime: 1419384975658388
+ reader_worker_0
+     cur_time: 1419384974167627
+     state:    sleeping
+     task:     Not currently running any task
+     waketime: 1419384976167572
+ reader_worker_1
+     cur_time: 1419384974167633
+     state:    sleeping
+     task:     Not currently running any task
+     waketime: 1419384976167572
+ reader_worker_2
+     cur_time: 1419384974167630
+     state:    sleeping
+     task:     Not currently running any task
+     waketime: 1419384976167572
+ reader_worker_3
+     cur_time: 1419384974167623
+     state:    sleeping
+     task:     Not currently running any task
+     waketime: 1419384976167572
+ writer_worker_4
+     cur_time: 1419384975407423
+     runtime:  31ms
+     state:    running
+     task:     Updating stat snapshot on disk
+     waketime: 1419384975667941
+ writer_worker_5
+     cur_time: 1419384975407908
+     state:    sleeping
+     task:     Not currently running any task
+     waketime: 1419384975667941
+ writer_worker_6
+     cur_time: 1419384975407916
+     state:    sleeping
+     task:     Not currently running any task
+     waketime: 1419384975667941
+ writer_worker_7
+     cur_time: 1419384975407964
+     state:    sleeping
+     task:     Not currently running any task
+     waketime: 1419384975667941
+			
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-failovers.html b/preview/contents/CLI/CBstats/cbstats-failovers.html new file mode 100644 index 0000000..10547e2 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-failovers.html @@ -0,0 +1,73 @@ +Failovers
+

Failovers

+ + +

cbstats failoversコマンドはID、sequence、エントリ数の情報を提供します。

+ + +

CLIコマンドとパラメータ

+

+ +
cbstats failovers
+ + +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [localhost]:11210 failovers
+ +
+ + +

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 failovers
+ + +
+ + +

レスポンス

+

レスポンス例:

+ +

+ vb_0:0:id:           81829249447048
+ vb_0:0:seq:          0
+ vb_0:num_entries:    1
+ vb_1000:0:id:        118586517042384
+ vb_1000:0:seq:       0
+ vb_1000:num_entries: 1
+ vb_1001:0:id:        113450262512702
+ vb_1001:0:seq:       0
+ vb_1001:num_entries: 1
+...
+ vb_999:0:id:         138916609758424
+ vb_999:0:seq:        0
+ vb_999:num_entries:  1
+ vb_99:0:id:          2666503649134
+ vb_99:0:seq:         0
+ vb_99:num_entries:   1
+ vb_9:0:id:           71096982888618
+ vb_9:0:seq:          0
+ vb_9:num_entries:    1
+      
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-generalform.html b/preview/contents/CLI/CBstats/cbstats-generalform.html new file mode 100644 index 0000000..b679b36 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-generalform.html @@ -0,0 +1,52 @@ +共通形式
+

共通形式

+ + +

このセクションでは統計情報の共通形式を解説します。

+ +

説明

+

以下のサンプル統計情報は8-16µsかかったdisk_insertが9,488回、16–32µsが290回発生していることを示しています。

+ + +

+STAT disk_insert_8,16 9488
+STAT disk_insert_16,32 290
+STAT disk_insert_32,64 73
+STAT disk_insert_64,128 86
+STAT disk_insert_128,256 48
+STAT disk_insert_256,512 2
+STAT disk_insert_512,1024 12
+STAT disk_insert_1024,2048 1
+      
+ + + + +

同様の統計情報がCLIのcbstatsツールで以下のように表示されます:

+ +

+disk_insert (10008 total)
+8us - 16us : ( 94.80%) 9488 ###########################################
+16us - 32us : ( 97.70%) 290 #
+32us - 64us : ( 98.43%) 73
+64us - 128us : ( 99.29%) 86
+128us - 256us : ( 99.77%) 4
+256us - 512us : ( 99.79%) 2
+512us - 1ms : ( 99.91%) 12
+1ms - 2ms : ( 99.92%) 1
+      
+ + +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-hash.html b/preview/contents/CLI/CBstats/cbstats-hash.html new file mode 100644 index 0000000..69e0b8a --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-hash.html @@ -0,0 +1,267 @@ +Hash
+

Hash

+ + +

cbstats hashコマンドはvBucketハッシュテーブルに関する情報を提供します。

+ +

説明

+

これらの統計情報をリクエストすると性能に影響があるため、頻繁に実行しないでください、しかし、特定の性能問題をデバッグするには有用です。 例えば、ハッシュテーブル内にロードしたデータに対してバケット数が不足している場合、max_depthは肥大化し、パフォーマンスが犠牲になります。

+ + +

'hash detail'を利用し、より詳細なハッシュテーブル統計情報を取得することもできます。 + これはvBucketごとの統計を出力します。 + 各統計情報はvb_に続き、番号、コロン、そして各統計の名称で出力されます。 例えば、vBucket 0のハッシュテーブルのサイズを示す統計は、vb_0:size=となります。

+ + +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [hostname]:11210 hash
+cbstats [hostname]:11210 hash detail
+		
+ +
+ + +

例: hash

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 hash
+
+ + +

例: hash detail

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 hash detail
+
+ + +

レスポンス: hash

+

レスポンス例:

+ +

+ avg_count:    0
+ avg_max:      0
+ avg_min:      0
+ largest_max:  0
+ largest_min:  0
+ max_count:    0
+ min_count:    0
+ total_counts: 0
+			
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
統計情報説明
avg_countvBucketごとの平均アイテム数
avg_maxvBucketハッシュテーブルの平均最大深度
avg_minvBucketハッシュテーブルの平均最小深度
largest_max全vBucketでの最大ハッシュテーブル深度
largest_min全vBucketで最も大きな最小ハッシュテーブル深度
max_count単一vBucket内の最大アイテム数
min_count単一vBucket内の最小アイテム数
total_counts全vBucket内の総アイテム数
+
+ +
+ + + +

レスポンス: hash detail

+

レスポンス例:

+ +

+ avg_count:                0
+ avg_max:                  0
+ avg_min:                  0
+ largest_max:              0
+ largest_min:              0
+ max_count:                0
+ min_count:                0
+ total_counts:             0
+ vb_0:counted:             0
+ vb_0:locks:               5
+ vb_0:max_depth:           0
+ vb_0:mem_size:            0
+ vb_0:mem_size_counted:    0
+ vb_0:min_depth:           0
+ vb_0:reported:            0
+ vb_0:resized:             0
+ vb_0:size:                3079
+ vb_0:state:               replica
+ ...
+			
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
統計情報説明
stateこのvBucketの現在のステータス
sizeハッシュバケット数
locksハッシュテーブル操作をカバーするロックの数
min_depthバケット内で見つかった最小アイテム数
max_depthバケット内で見つかった最大アイテム数
reportedこのハッシュテーブルが保持するとレポートしたアイテム数
countedテーブルを走査する間に見つけたアイテム数
resizedハッシュテーブルがリサイズされた回数
mem_size各アイテムで利用されたメモリの合計
mem_size_countedカウントした各アイテムで利用されたメモリの合計
+
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-keyvkey.html b/preview/contents/CLI/CBstats/cbstats-keyvkey.html new file mode 100644 index 0000000..bfe669c --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-keyvkey.html @@ -0,0 +1,173 @@ +Keyとvkey
+

Keyとvkey

+ + +

cbstats keyと、cbstats vkeyコマンドはキーに関する情報を提供します。

+ + +

説明

+

以下のキー情報が利用可能です。

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
統計情報説明K/V
key_casキーの現在のCAS値KV
key_data_ageそのキーがどれだけバリューの永続化に待っているか (完了していれば0)KV
 value to be persisted (0 if clean)KV
key_exptime有効期限、epochKV
key_flagsキーのフラグKV
key_is_dirtyキーがまだ永続化されていないKV
key_valid下記の説明を参照V
key_vb_stateキーのvBucketステータスKV
+
+ +

key_valid= は以下のレスポンスを返します:

+ +
    +
  • this_is_a_bug - 予期せぬ状態。
  • + +
  • dirty - メモリ内のバリューがまだ永続化されていない。
  • + +
  • length_mismatch - キーのメモリ内サイズがディスク上のサイズと一致しない。
  • + +
  • data_mismatch - メモリ内のデータがディスク上のデータと一致しない。
  • + +
  • flags_mismatch - メモリ内のフラグがディスク上のフラグと一致しない。
  • + +
  • valid - キーはディスクにもメモリにも存在する。
  • + +
  • ram_but_not_disk - バリューがまだディスク上に存在しない。
  • + +
  • item_deleted - アイテムはすでに削除されている。
  • + +
+ + + +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [hostname]:11210 key [keyname] [vbid]
+cbstats [hostname]:11210 vkey [keyname] [vbid]
+			
+ +
+ + +

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 key foo 115
+ + +
+ + +

レスポンス

+

key fooのレスポンス例:

+ +

+ key_cas: 41206791218746
+ key_exptime: 0
+ key_flags: 0
+ key_is_dirty: 0 
+			
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-kv.html b/preview/contents/CLI/CBstats/cbstats-kv.html new file mode 100644 index 0000000..47afb90 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-kv.html @@ -0,0 +1,200 @@ +Kvstore と kvtimings
+

Kvstore と kvtimings

+ + +

cbstats kvstoreと、 kvtimingsコマンドはローレベルの統計情報とタイミングを内部のKVストレージシステムから提供します。

+ +

説明

+

これらのコマンドはストレージシステムの様々な状態を理解するのに役立ちます。

+ +

以下の統計情報がCouchStoreデータベースエンジンで利用可能です:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
統計情報説明
backend_typeバックエンドのデータベースエンジン
closeデータベースのcloseオペレーション数
failure_get失敗したgetオペレーションの数
failure_open失敗したopenオペレーションの数
failure_set失敗したsetオペレーション数
failure_vbset失敗したvBucket setオペレーション数
lastCommDocs最終コミット内のドキュメント数
numLoadedVbメモリにロードされたvBucket数
openデータベースのopenオペレーション数
+
+ +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [hostname]:11210 kvstore
+cbstats [hostname]:11210 kvtimings
+			
+ +
+ + +

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 kvstore
+ + +
+ + +

レスポンス

+

kvstoreのレスポンス例:

+ +

+ ro_0:backend_type:  couchstore
+ ro_0:close:         0
+ ro_0:failure_get:   0
+ ro_0:failure_open:  0
+ ro_0:numLoadedVb:   0
+ ro_0:open:          0
+ ro_1:backend_type:  couchstore
+ ro_1:close:         0
+ ro_1:failure_get:   0
+ ro_1:failure_open:  0
+ ro_1:numLoadedVb:   0
+ ro_1:open:          0
+ ro_2:backend_type:  couchstore
+ ro_2:close:         0
+ ro_2:failure_get:   0
+ ro_2:failure_open:  0
+ ro_2:numLoadedVb:   0
+ ro_2:open:          0
+ ro_3:backend_type:  couchstore
+ ro_3:close:         0
+ ro_3:failure_get:   0
+ ro_3:failure_open:  0
+ ro_3:numLoadedVb:   0
+ ro_3:open:          0
+ rw_0:backend_type:  couchstore
+ rw_0:close:         0
+ rw_0:failure_del:   0
+ rw_0:failure_get:   0
+ rw_0:failure_open:  0
+ rw_0:failure_set:   0
+ rw_0:failure_vbset: 0
+ rw_0:lastCommDocs:  0
+ rw_0:numLoadedVb:   0
+ rw_0:open:          0
+ rw_1:backend_type:  couchstore
+ rw_1:close:         0
+ rw_1:failure_del:   0
+ rw_1:failure_get:   0
+ rw_1:failure_open:  0
+ rw_1:failure_set:   0
+ rw_1:failure_vbset: 0
+ rw_1:lastCommDocs:  0
+ rw_1:numLoadedVb:   0
+ rw_1:open:          0
+ rw_2:backend_type:  couchstore
+ rw_2:close:         0
+ rw_2:failure_del:   0
+ rw_2:failure_get:   0
+ rw_2:failure_open:  0
+ rw_2:failure_set:   0
+ rw_2:failure_vbset: 0
+ rw_2:lastCommDocs:  0
+ rw_2:numLoadedVb:   0
+ rw_2:open:          0
+ rw_3:backend_type:  couchstore
+ rw_3:close:         0
+ rw_3:failure_del:   0
+ rw_3:failure_get:   0
+ rw_3:failure_open:  0
+ rw_3:failure_set:   0
+ rw_3:failure_vbset: 0
+ rw_3:lastCommDocs:  0
+ rw_3:numLoadedVb:   0
+ rw_3:open:          0
+			
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-memory.html b/preview/contents/CLI/CBstats/cbstats-memory.html new file mode 100644 index 0000000..0f59651 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-memory.html @@ -0,0 +1,234 @@ +Memory
+

Memory

+ + +

cbstats memoryコマンドはメモリ関連の統計情報を取得します。

+ +

CLIコマンドとパラメータ

+

このコマンドはtcmallocからの統計情報を含む様々なメモリ関連の統計情報を提供します。

+ + +
cbstats all
+ + +
注: tcmalloc統計情報はtcmallocをサポートしていないオペレーションシステム(Windowsなど)では利用できません。
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
統計情報説明
mem_used (非推奨)エンジンの総利用メモリ
bytesエンジンの総利用メモリ
ep_kv_sizevBucketのステータスに関わらず、アイテムのメタデータ、キーとバリューで利用しているメモリ。
 アイテムのバリューがメモリから除去されている場合、この統計情報はそのアイテムのバリューサイズ分減少する。
ep_value_sizeメモリ内に存在するキーのバリューを保存するために利用しているメモリ
ep_overhead永続化キュー、レプリケーションキュー、チェックポイントなどの一時的なデータに利用されているメモリ
ep_max_sizeメモリ内に保存できる最大データ量
ep_mem_low_watメモリからのアイテム自動除去に利用する低水位
ep_mem_high_watメモリからのアイテム自動除去に利用する高水位
ep_oom_errorsオペレーションの処理中に発生した復帰不能なOOM回数
ep_tmp_oom_errorsオペレーションの処理中に発生した一時的なOOM回数
ep_mem_tracker_enabledスマートメモリトラッキングが有効か否か
tcmalloc_allocated_bytestcmallocでリポートされたエンジンの総利用メモリ
tcmalloc_heap_sizetcmallocで確保されたシステムメモリのバイト数
tcmalloc_free_bytesページヒープ内のページにマップされた空きバイト数
tcmalloc_unmapped_bytesページヒープ内のアンマップされた空きバイト数
 これらはリリースされOSに戻されたバイト数
tcmalloc_max_thread_cache_bytesTCMallocが小さなオブジェクト専用に割り当てるメモリの上限
tcmalloc_current_thread_cache_bytesTCMallocが小さなオブジェクト用に利用しているメモリ
+
+ +
+ + + + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [localhost]:11210 memory
+ +
+ + +

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 memory
+ + +
+ + +

レスポンス

+

レスポンス例:

+ +

+bytes:                               23716184
+ ep_blob_num:                         0
+ ep_blob_overhead:                    0
+ ep_item_num:                         1364
+ ep_kv_size:                          0
+ ep_max_size:                         524288000
+ ep_mem_high_wat:                     445644800
+ ep_mem_low_wat:                      393216000
+ ep_mem_tracker_enabled:              true
+ ep_oom_errors:                       0
+ ep_overhead:                         18344996
+ ep_storedval_num:                    0
+ ep_storedval_overhead:               0
+ ep_storedval_size:                   0
+ ep_tmp_oom_errors:                   0
+ ep_value_size:                       0
+ mem_used:                            23716184
+ tcmalloc_current_thread_cache_bytes: 18642072
+ tcmalloc_max_thread_cache_bytes:     33554432
+ total_allocated_bytes:               211297528
+ total_fragmentation_bytes:           33069832
+ total_free_mapped_bytes:             5283840
+ total_free_unmapped_bytes:           7684096
+ total_heap_bytes:                    257335296
+			
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-pendingvbucket.html b/preview/contents/CLI/CBstats/cbstats-pendingvbucket.html new file mode 100644 index 0000000..a22489c --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-pendingvbucket.html @@ -0,0 +1,169 @@ +ペンディングvBucket統計情報
+

ペンディングvBucket統計情報

+ + +

ペンディングvBucket統計情報について解説します。

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
統計情報説明
vb_pending_numペンディングvBucketの個数
vb_pending_curr_itemsメモリ内のアイテム数
vb_pending_num_non_residentメモリ内に存在しないアイテム数
vb_pending_perc_mem_residentメモリ内に存在するアイテムのパーセンテージ
vb_pending_ejectアイテムのバリューがメモリから除去された回数
vb_pending_expiredアイテムが期限切れとなった回数
vb_pending_ht_memoryハッシュテーブルのメモリオーバヘッド
vb_pending_itm_memory総アイテムメモリ
vb_pending_meta_data_memory総メタデータメモリ
vb_pending_ops_create挿入オペレーション数
vb_pending_ops_update更新オペレーション数
vb_pending_ops_delete削除オペレーション数
vb_pending_ops_rejectリジェクトされたオペレーション数
vb_pending_queue_sizeディスクキュー内の待ちアイテム
vb_pending_queue_memoryディスクキューに利用しているメモリ
vb_pending_queue_ageアイテムがディスクキュー内に存在する時間の合計、ミリ秒
vb_pending_queue_pending書込み待ちの総バイト数
vb_pending_queue_fillキューに登録されたアイテムの総数
vb_pending_queue_drainキューからドレインしたアイテムの総数
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-replicavbucket.html b/preview/contents/CLI/CBstats/cbstats-replicavbucket.html new file mode 100644 index 0000000..11c2d68 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-replicavbucket.html @@ -0,0 +1,170 @@ +レプリカvBucket統計情報
+

レプリカvBucket統計情報

+ + +

レプリカvBucket統計情報について解説します。

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
統計情報説明
vb_replica_numレプリカvBucketの個数
vb_replica_curr_itemsメモリ内のアイテム数
vb_replica_num_non_residentメモリ内に存在しないアイテム数
vb_replica_perc_mem_residentメモリ内に存在するアイテムのパーセンテージ
vb_replica_ejectアイテムのバリューがメモリから除去された回数
vb_replica_expiredアイテムが期限切れとなった回数
vb_replica_ht_memoryハッシュテーブルのメモリオーバヘッド
vb_replica_itm_memory総アイテムメモリ
vb_replica_meta_data_memory総メタデータメモリ
vb_replica_ops_create挿入オペレーション数
vb_replica_ops_update更新オペレーション数
vb_replica_ops_delete削除オペレーション数
vb_replica_ops_rejectリジェクトされたオペレーション数
vb_replica_queue_sizeディスクキュー内のレプリカアイテム
vb_replica_queue_memoryディスクキューに利用しているメモリ
vb_replica_queue_ageアイテムがディスクキュー内に存在する時間の合計、ミリ秒
vb_replica_queue_pending書込み待ちの総バイト数
vb_replica_queue_fillキューに登録されたアイテムの総数
vb_replica_queue_drainキューからドレインしたアイテムの総数
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-reset.html b/preview/contents/CLI/CBstats/cbstats-reset.html new file mode 100644 index 0000000..8dbaf8a --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-reset.html @@ -0,0 +1,360 @@ +Reset
+

Reset

+ + +

cbstats resetコマンドは以下の統計情報と、ヒストグラムをリセットします。

+ +

CLIコマンドとパラメータ

+
cbstats reset
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Reset 統計情報
ep_bg_load
ep_bg_wait
ep_bg_max_load
ep_bg_min_load
ep_bg_max_wait
ep_bg_min_wait
ep_commit_time
ep_flush_duration
ep_flush_duration_highwat
ep_io_num_read
ep_io_num_write
ep_io_read_bytes
ep_io_write_bytes
ep_items_rm_from_checkpoints
ep_num_eject_failures
ep_num_pager_runs
ep_num_not_my_vbuckets
ep_num_value_ejects
ep_pending_ops_max
ep_pending_ops_max_duration
ep_pending_ops_total
ep_storage_age
ep_storage_age_highwat
ep_too_old
ep_too_young
ep_tap_bg_load_avg
ep_tap_bg_max_load
ep_tap_bg_max_wait
ep_tap_bg_min_load
ep_tap_bg_min_wait
ep_tap_bg_wait_avg
ep_tap_throttled
ep_tap_total_fetched
ep_vbucket_del_max_walltime
pending_ops
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. Reset ヒストグラム統計情報
Reset ヒストグラム統計情報
bg_load
bg_wait
bg_tap_load
bg_tap_wait
chk_persistence_cmd
data_age
del_vb_cmd
disk_insert
disk_update
disk_del
disk_vb_del
disk_commit
get_stats_cmd
item_alloc_sizes
get_vb_cmd
notify_io
pending_ops
set_vb_cmd
storage_age
tap_mutation
tap_vb_reset
tap_vb_set
+
+ +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [localhost]:11210 reset
+ +
+ + +

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 reset
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-runtimes.html b/preview/contents/CLI/CBstats/cbstats-runtimes.html new file mode 100644 index 0000000..f4ca96a --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-runtimes.html @@ -0,0 +1,222 @@ +Runtimes
+

Runtimes

+ + +

cbstats runtimesコマンドは実行環境の統計に関わる様々な情報を提供します。

+ +

CLIコマンドとパラメータ

+

+ +
cbstats runtimes
+ + + +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [localhost]:11210 runtimes
+ +
+ + +

+

リクエスト例:

+ +
cbstats 10.5.2.117:11210 runtimes
+ + +
+ + +

レスポンス

+

レスポンス例:

+ +

+ compactor_tasks (1024 total)
+    1ms - 2ms  : (  2.34%)  24 #
+    2ms - 4ms  : ( 82.91%) 825 ##############################################################
+    4ms - 8ms  : ( 99.02%) 165 ############
+    8ms - 16ms : (100.00%)  10 
+    Avg        : (    2ms)
+ statsnap_tasks (40609 total)
+    512us - 1ms : (  0.00%)     1 
+    1ms - 2ms   : ( 36.56%) 14844 ###########################
+    2ms - 4ms   : ( 99.65%) 25620 ###############################################
+    4ms - 8ms   : ( 99.97%)   130 
+    8ms - 16ms  : (100.00%)    13 
+    32ms - 65ms : (100.00%)     1 
+    Avg         : (    1ms)
+ vbucket_persist_low_tasks (40610 total)
+    8us - 16us    : (  0.03%)    14 
+    16us - 32us   : (  0.47%)   175 
+    32us - 64us   : (  2.01%)   626 #
+    64us - 128us  : ( 10.20%)  3328 #####
+    128us - 256us : ( 17.41%)  2929 #####
+    256us - 512us : ( 20.10%)  1090 #
+    512us - 1ms   : ( 64.35%) 17972 ################################
+    1ms - 2ms     : ( 89.10%) 10048 ##################
+    2ms - 4ms     : ( 99.59%)  4261 #######
+    4ms - 8ms     : ( 99.98%)   158 
+    8ms - 16ms    : (100.00%)     9 
+    Avg           : (  734us)
+ access_scanner_tasks (28700 total)
+    1us - 2us    : (  2.58%)   740 #
+    2us - 4us    : ( 75.23%) 20852 #####################################################
+    4us - 8us    : ( 98.33%)  6630 #################
+    8us - 16us   : ( 98.99%)   188 
+    16us - 32us  : ( 99.41%)   121 
+    32us - 64us  : ( 99.49%)    24 
+    64us - 128us : ( 99.51%)     5 
+    512us - 1ms  : ( 99.54%)     8 
+    1ms - 2ms    : ( 99.78%)    68 
+    2ms - 4ms    : ( 99.95%)    49 
+    4ms - 8ms    : (100.00%)    15 
+    Avg          : (   10us)
+ warmup_tasks (15 total)
+    128us - 256us : (  6.67%) 1 #####
+    256us - 512us : ( 13.33%) 1 #####
+    4ms - 8ms     : ( 33.33%) 3 ###############
+    8ms - 16ms    : ( 66.67%) 5 #########################
+    16ms - 32ms   : ( 86.67%) 3 ###############
+    65ms - 131ms  : (100.00%) 2 ##########
+    Avg           : (   15ms)
+ conn_notification_tasks (4865044 total)
+    1us - 2us     : (  0.07%)    3487 
+    2us - 4us     : ( 48.99%) 2379702 ##################################
+    4us - 8us     : ( 97.40%) 2355288 ##################################
+    8us - 16us    : ( 98.83%)   69819 #
+    16us - 32us   : ( 99.96%)   54632 
+    32us - 64us   : ( 99.99%)    1738 
+    64us - 128us  : (100.00%)     289 
+    128us - 256us : (100.00%)      56 
+    256us - 512us : (100.00%)      13 
+    512us - 1ms   : (100.00%)      15 
+    1ms - 2ms     : (100.00%)       5 
+    Avg           : (    3us)
+ hashtable_resize_tasks (40610 total)
+    64us - 128us  : (  0.19%)    79 
+    128us - 256us : ( 20.93%)  8421 ###############
+    256us - 512us : ( 99.91%) 32072 #########################################################
+    512us - 1ms   : ( 99.98%)    28 
+    1ms - 2ms     : ( 99.99%)     6 
+    2ms - 4ms     : (100.00%)     3 
+    4ms - 8ms     : (100.00%)     1 
+    Avg           : (  229us)
+ workload_monitor_tasks (487136 total)
+    0 - 1us       : (  6.87%)  33451 ####
+    1us - 2us     : ( 93.18%) 420459 ##############################################################
+    2us - 4us     : ( 99.42%)  30395 ####
+    4us - 8us     : ( 99.52%)    474 
+    8us - 16us    : ( 99.89%)   1844 
+    16us - 32us   : ( 99.99%)    482 
+    32us - 64us   : (100.00%)     21 
+    64us - 128us  : (100.00%)      8 
+    128us - 256us : (100.00%)      1 
+    256us - 512us : (100.00%)      1 
+    Avg           : (    1us)
+ checkpoint_remover_tasks (499314400 total)
+    0 - 1us       : (  0.00%)         4 
+    1us - 2us     : (  0.42%)   2085472 
+    2us - 4us     : ( 57.63%) 285657133 #######################################
+    4us - 8us     : ( 98.31%) 203153689 ############################
+    8us - 16us    : ( 99.40%)   5439805 
+    16us - 32us   : ( 99.86%)   2256397 
+    32us - 64us   : ( 99.90%)    198406 
+    64us - 128us  : ( 99.90%)     28143 
+    128us - 256us : ( 99.92%)    107902 
+    256us - 512us : (100.00%)    385281 
+    512us - 1ms   : (100.00%)      1334 
+    1ms - 2ms     : (100.00%)       471 
+    2ms - 4ms     : (100.00%)       237 
+    4ms - 8ms     : (100.00%)       108 
+    8ms - 16ms    : (100.00%)        16 
+    16ms - 32ms   : (100.00%)         2 
+    Avg           : (    3us)
+ flusher_tasks (623061259 total)
+    0 - 1us       : (  0.00%)     15542 
+    1us - 2us     : (  4.94%)  30764293 ###
+    2us - 4us     : ( 78.32%) 457174042 ##################################################
+    4us - 8us     : ( 96.09%) 110725574 ############
+    8us - 16us    : ( 99.03%)  18361005 ##
+    16us - 32us   : ( 99.57%)   3354270 
+    32us - 64us   : ( 99.60%)    148155 
+    64us - 128us  : ( 99.60%)     30371 
+    128us - 256us : ( 99.63%)    171603 
+    256us - 512us : ( 99.99%)   2256743 
+    512us - 1ms   : (100.00%)     45813 
+    1ms - 2ms     : (100.00%)     12859 
+    2ms - 4ms     : (100.00%)       723 
+    4ms - 8ms     : (100.00%)       236 
+    8ms - 16ms    : (100.00%)        20 
+    16ms - 32ms   : (100.00%)         8 
+    32ms - 65ms   : (100.00%)         1 
+    65ms - 131ms  : (100.00%)         1 
+    Avg           : (    3us)
+ vbucket_persist_high_tasks (4 total)
+    2s - 4s : (100.00%) 4 ###################################################################################
+    Avg     : (     2s)
+ bg_fetcher_tasks (4868868 total)
+    0 - 1us       : (  1.47%)   71601 #
+    1us - 2us     : ( 56.98%) 2702825 #######################################
+    2us - 4us     : ( 97.52%) 1973911 ############################
+    4us - 8us     : ( 98.48%)   46666 
+    8us - 16us    : ( 99.74%)   60990 
+    16us - 32us   : ( 99.99%)   12394 
+    32us - 64us   : (100.00%)     372 
+    64us - 128us  : (100.00%)      88 
+    128us - 256us : (100.00%)      16 
+    256us - 512us : (100.00%)       1 
+    512us - 1ms   : (100.00%)       4 
+    Avg           : (    1us)
+ conn_manager_tasks (2434268 total)
+    0 - 1us       : (  0.47%)   11350 
+    1us - 2us     : ( 24.03%)  573533 ################
+    2us - 4us     : ( 87.05%) 1534038 ############################################
+    4us - 8us     : ( 98.53%)  279677 ########
+    8us - 16us    : ( 99.50%)   23398 
+    16us - 32us   : ( 99.98%)   11832 
+    32us - 64us   : (100.00%)     348 
+    64us - 128us  : (100.00%)      69 
+    128us - 256us : (100.00%)      14 
+    256us - 512us : (100.00%)       6 
+    512us - 1ms   : (100.00%)       2 
+    1ms - 2ms     : (100.00%)       1 
+    Avg           : (    2us)
+ item_pager_tasks (42764675 total)
+    0 - 1us       : (  0.01%)     5365 
+    1us - 2us     : (  4.03%)  1718020 ##
+    2us - 4us     : ( 89.30%) 36465819 ###########################################################
+    4us - 8us     : ( 99.36%)  4303567 #######
+    8us - 16us    : ( 99.63%)   114111 
+    16us - 32us   : ( 99.97%)   143979 
+    32us - 64us   : ( 99.99%)    10558 
+    64us - 128us  : (100.00%)     1934 
+    128us - 256us : (100.00%)      430 
+    256us - 512us : (100.00%)      749 
+    512us - 1ms   : (100.00%)       79 
+    1ms - 2ms     : (100.00%)       34 
+    2ms - 4ms     : (100.00%)       18 
+    4ms - 8ms     : (100.00%)       11 
+    8ms - 16ms    : (100.00%)        1 
+    Avg           : (    2us)
+
+      
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-scheduler.html b/preview/contents/CLI/CBstats/cbstats-scheduler.html new file mode 100644 index 0000000..43b4b69 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-scheduler.html @@ -0,0 +1,277 @@ +Scheduler
+

Scheduler

+ + +

cbstats schedulerコマンドはスケジューラタスクの統計情報を提供します。

+ +

CLIコマンドとパラメータ

+

+ +
cbstats scheduler
+ +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [localhost]:11210 scheduler
+ +
+ + +

+

リクエスト例:

+ +
cbstats 10.5.2.117:11210 scheduler
+ + +
+ + +

レスポンス

+

レスポンス例:

+ +

+ compactor_tasks (1024 total)
+    8us - 16us    : (  0.10%)   1 
+    16us - 32us   : ( 31.74%) 324 #######################
+    32us - 64us   : ( 81.93%) 514 #####################################
+    64us - 128us  : ( 98.63%) 171 ############
+    128us - 256us : (100.00%)  14 #
+    Avg           : (   33us)
+ statsnap_tasks (40615 total)
+    1us - 2us     : (  0.01%)     4 
+    2us - 4us     : (  0.06%)    19 
+    4us - 8us     : (  0.64%)   235 
+    8us - 16us    : (  1.24%)   245 
+    16us - 32us   : (  2.05%)   330 
+    32us - 64us   : (  3.54%)   606 #
+    64us - 128us  : (  6.37%)  1148 ##
+    128us - 256us : ( 12.22%)  2375 ####
+    256us - 512us : ( 26.39%)  5758 ##########
+    512us - 1ms   : ( 57.09%) 12469 ######################
+    1ms - 2ms     : ( 91.34%) 13910 #########################
+    2ms - 4ms     : ( 99.89%)  3470 ######
+    4ms - 8ms     : ( 99.91%)    10 
+    524ms - 1s    : (100.00%)    35 
+    2s - 4s       : (100.00%)     1 
+    Avg           : (    1ms)
+ conn_notification_tasks (4865734 total)
+    0 - 1us       : (  0.00%)     104 
+    1us - 2us     : (  0.02%)     874 
+    2us - 4us     : (  0.04%)     895 
+    4us - 8us     : (  0.06%)     975 
+    8us - 16us    : (  0.14%)    3770 
+    16us - 32us   : (  0.66%)   25270 
+    32us - 64us   : (  1.37%)   34657 
+    64us - 128us  : (  1.60%)   11433 
+    128us - 256us : (  1.84%)   11359 
+    256us - 512us : (  2.27%)   21020 
+    512us - 1ms   : ( 35.69%) 1626168 #######################
+    1ms - 2ms     : ( 73.72%) 1850543 ###########################
+    2ms - 4ms     : ( 99.65%) 1261584 ##################
+    4ms - 8ms     : ( 99.82%)    8202 
+    8ms - 16ms    : ( 99.83%)     564 
+    16ms - 32ms   : ( 99.83%)      66 
+    32ms - 65ms   : ( 99.83%)       8 
+    65ms - 131ms  : ( 99.83%)      22 
+    524ms - 1s    : (100.00%)    8220 
+    Avg           : (    1ms)
+ access_scanner_tasks (28700 total)
+    16us - 32us   : (  6.78%)  1947 ####
+    32us - 64us   : ( 83.06%) 21890 #######################################################
+    64us - 128us  : ( 99.03%)  4585 ###########
+    128us - 256us : ( 99.25%)    62 
+    256us - 512us : ( 99.32%)    21 
+    512us - 1ms   : ( 99.44%)    35 
+    1ms - 2ms     : ( 99.61%)    47 
+    2ms - 4ms     : ( 99.77%)    46 
+    4ms - 8ms     : ( 99.95%)    52 
+    8ms - 16ms    : (100.00%)    15 
+    Avg           : (   53us)
+ warmup_tasks (15 total)
+    8us - 16us   : ( 13.33%) 2 ##########
+    16us - 32us  : ( 40.00%) 4 ####################
+    32us - 64us  : ( 46.67%) 1 #####
+    64us - 128us : ( 53.33%) 1 #####
+    4ms - 8ms    : ( 66.67%) 2 ##########
+    16ms - 32ms  : ( 86.67%) 3 ###############
+    32ms - 65ms  : (100.00%) 2 ##########
+    Avg          : (    8ms)
+ vbucket_persist_low_tasks (40615 total)
+    2us - 4us     : (  0.08%)    32 
+    4us - 8us     : (  0.27%)    79 
+    8us - 16us    : (  0.53%)   105 
+    16us - 32us   : (  3.50%)  1206 ##
+    32us - 64us   : ( 18.76%)  6197 ###########
+    64us - 128us  : ( 52.68%) 13776 ########################
+    128us - 256us : ( 60.08%)  3005 #####
+    256us - 512us : ( 64.87%)  1948 ###
+    512us - 1ms   : ( 79.81%)  6068 ##########
+    1ms - 2ms     : ( 94.38%)  5917 ##########
+    2ms - 4ms     : ( 99.84%)  2217 ###
+    4ms - 8ms     : ( 99.95%)    44 
+    8ms - 16ms    : ( 99.96%)     3 
+    524ms - 1s    : (100.00%)    18 
+    Avg           : (  623us)
+ hashtable_resize_tasks (40615 total)
+    8us - 16us    : (  0.03%)    13 
+    16us - 32us   : (  0.17%)    55 
+    32us - 64us   : (  0.62%)   185 
+    64us - 128us  : (  1.46%)   342 
+    128us - 256us : (  3.54%)   844 #
+    256us - 512us : ( 11.11%)  3072 #####
+    512us - 1ms   : ( 30.18%)  7746 #############
+    1ms - 2ms     : ( 63.90%) 13696 ########################
+    2ms - 4ms     : ( 99.60%) 14500 ##########################
+    4ms - 8ms     : ( 99.82%)    88 
+    8ms - 16ms    : ( 99.83%)     3 
+    16ms - 32ms   : ( 99.83%)     2 
+    524ms - 1s    : (100.00%)    69 
+    Avg           : (    2ms)
+ workload_monitor_tasks (487205 total)
+    16us - 32us   : (  0.00%)      6 
+    32us - 64us   : (  0.02%)     87 
+    64us - 128us  : (  0.03%)     33 
+    128us - 256us : (  0.15%)    584 
+    256us - 512us : (  2.13%)   9674 #
+    512us - 1ms   : ( 19.41%)  84165 ############
+    1ms - 2ms     : ( 55.24%) 174602 #########################
+    2ms - 4ms     : ( 99.04%) 213375 ###############################
+    4ms - 8ms     : ( 99.78%)   3605 
+    8ms - 16ms    : ( 99.80%)     99 
+    16ms - 32ms   : ( 99.80%)     10 
+    32ms - 65ms   : ( 99.80%)      4 
+    65ms - 131ms  : ( 99.80%)      1 
+    524ms - 1s    : (100.00%)    960 
+    Avg           : (    2ms)
+ checkpoint_remover_tasks (499385125 total)
+    0 - 1us       : (  0.00%)         2 
+    1us - 2us     : (  0.00%)         1 
+    2us - 4us     : (  0.00%)        53 
+    4us - 8us     : (  1.79%)   8951566 #
+    8us - 16us    : (  8.48%)  33397662 ####
+    16us - 32us   : ( 90.25%) 408346556 ########################################################
+    32us - 64us   : ( 99.55%)  46441395 ######
+    64us - 128us  : ( 99.78%)   1174056 
+    128us - 256us : ( 99.81%)    120451 
+    256us - 512us : ( 99.90%)    474751 
+    512us - 1ms   : ( 99.93%)    138179 
+    1ms - 2ms     : ( 99.97%)    168611 
+    2ms - 4ms     : (100.00%)    158685 
+    4ms - 8ms     : (100.00%)      1619 
+    8ms - 16ms    : (100.00%)       255 
+    16ms - 32ms   : (100.00%)       130 
+    32ms - 65ms   : (100.00%)         6 
+    65ms - 131ms  : (100.00%)         1 
+    524ms - 1s    : (100.00%)     11146 
+    Avg           : (   29us)
+ flusher_tasks (623149835 total)
+    0 - 1us       : (  0.00%)        90 
+    1us - 2us     : (  0.00%)       485 
+    2us - 4us     : (  2.98%)  18587044 ##
+    4us - 8us     : ( 58.26%) 344480113 ######################################
+    8us - 16us    : ( 79.47%) 132163829 ##############
+    16us - 32us   : ( 90.63%)  69516454 #######
+    32us - 64us   : ( 97.02%)  39840883 ####
+    64us - 128us  : ( 98.98%)  12218260 #
+    128us - 256us : ( 99.23%)   1521578 
+    256us - 512us : ( 99.68%)   2800791 
+    512us - 1ms   : ( 99.84%)   1013376 
+    1ms - 2ms     : ( 99.97%)    815412 
+    2ms - 4ms     : (100.00%)    178799 
+    4ms - 8ms     : (100.00%)      1306 
+    8ms - 16ms    : (100.00%)       146 
+    16ms - 32ms   : (100.00%)        17 
+    32ms - 65ms   : (100.00%)         6 
+    65ms - 131ms  : (100.00%)        18 
+    524ms - 1s    : (100.00%)     11224 
+    4s - 8s       : (100.00%)         4 
+    Avg           : (   22us)
+ vbucket_persist_high_tasks (4 total)
+    32us - 64us   : ( 25.00%) 1 ###################
+    256us - 512us : ( 50.00%) 1 ###################
+    512us - 1ms   : ( 75.00%) 1 ###################
+    32ms - 65ms   : (100.00%) 1 ###################
+    Avg           : (    8ms)
+ bg_fetcher_tasks (4869560 total)
+    0 - 1us       : (  0.00%)      28 
+    1us - 2us     : (  0.00%)      72 
+    2us - 4us     : (  0.00%)      70 
+    4us - 8us     : (  0.01%)      76 
+    8us - 16us    : (  0.01%)     187 
+    16us - 32us   : (  0.03%)    1078 
+    32us - 64us   : (  0.09%)    2816 
+    64us - 128us  : (  0.20%)    5520 
+    128us - 256us : (  0.42%)   10712 
+    256us - 512us : (  2.86%)  118636 #
+    512us - 1ms   : ( 18.01%)  737654 ##########
+    1ms - 2ms     : ( 63.30%) 2205674 ################################
+    2ms - 4ms     : ( 99.67%) 1771002 #########################
+    4ms - 8ms     : ( 99.81%)    6779 
+    8ms - 16ms    : ( 99.82%)     343 
+    16ms - 32ms   : ( 99.82%)      40 
+    32ms - 65ms   : ( 99.82%)      24 
+    65ms - 131ms  : ( 99.82%)      16 
+    524ms - 1s    : (100.00%)    8833 
+    Avg           : (    2ms)
+ conn_manager_tasks (2434612 total)
+    0 - 1us       : (  0.00%)     38 
+    1us - 2us     : (  0.01%)    131 
+    2us - 4us     : (  0.01%)    189 
+    4us - 8us     : (  0.03%)    308 
+    8us - 16us    : (  0.05%)    673 
+    16us - 32us   : (  0.24%)   4594 
+    32us - 64us   : (  0.74%)  12153 
+    64us - 128us  : (  1.16%)  10082 
+    128us - 256us : (  1.46%)   7329 
+    256us - 512us : (  7.64%) 150549 ####
+    512us - 1ms   : ( 33.94%) 640241 ##################
+    1ms - 2ms     : ( 64.49%) 743906 #####################
+    2ms - 4ms     : ( 97.09%) 793509 #######################
+    4ms - 8ms     : ( 97.93%)  20404 
+    8ms - 16ms    : ( 99.37%)  35190 #
+    16ms - 32ms   : ( 99.79%)  10280 
+    32ms - 65ms   : ( 99.81%)    292 
+    65ms - 131ms  : ( 99.81%)      2 
+    131ms - 262ms : ( 99.81%)      2 
+    524ms - 1s    : (100.00%)   4740 
+    Avg           : (    2ms)
+ item_pager_tasks (42769864 total)
+    2us - 4us     : (  0.00%)        1 
+    4us - 8us     : (  0.36%)   153785 
+    8us - 16us    : (  8.51%)  3486455 #####
+    16us - 32us   : ( 90.87%) 35225766 #########################################################
+    32us - 64us   : ( 98.57%)  3291690 #####
+    64us - 128us  : ( 98.74%)    74074 
+    128us - 256us : ( 98.77%)    10465 
+    256us - 512us : ( 98.88%)    48195 
+    512us - 1ms   : ( 99.08%)    85079 
+    1ms - 2ms     : ( 99.49%)   175130 
+    2ms - 4ms     : ( 99.99%)   213719 
+    4ms - 8ms     : (100.00%)     3635 
+    8ms - 16ms    : (100.00%)       91 
+    16ms - 32ms   : (100.00%)        9 
+    32ms - 65ms   : (100.00%)        4 
+    65ms - 131ms  : (100.00%)        1 
+    524ms - 1s    : (100.00%)     1765 
+    Avg           : (   54us)
+
+      
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-tap.html b/preview/contents/CLI/CBstats/cbstats-tap.html new file mode 100644 index 0000000..bcd419e --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-tap.html @@ -0,0 +1,900 @@ +Tap
+

Tap

+ + +

cbstats tapコマンドはTAPに関連する統計情報の取得に利用し、cbstats tapaggは指定したTAP接続からの統計情報取得に利用します。

+ +

説明

+

TAPはクラスタノード感でデータ変更に関する情報をストリームするためのプロトコルです。 + Couchbase Serverはリバランス中および他のクラスタノードへのレプリケーションにTAPプロトコルを利用します。 + cbstats tapaggは指定したTAPコネクションから、論理的にグループ化され、プリフィクスで集約された統計情報の取得に利用します。

+ + +

例えば、すべてのTAP接続がrebalance_またはreplication_で始まっていれば、cbstats tapagg _を利用し、_をプリフィクスとしてグループ化した統計情報をリクエストできます。 + これにより、rebalancereplicationの統計情報セットを取得できます。

+ + +
+ + +

CLIコマンドとパラメータ

+ +
cbstats tap
+cbstats tap-takeover vb name
+cbstats tapagg
+ +
+ + +

シンタックス

+

リクエストシンタックス:

+ +

+cbstats [host]:11210 tap
+cbstats [host]:11210 tapagg
+cbstats [host]:11210 tap-takeover vb name
+			
+ +
+ + +

例: tap

+

tap統計情報のリクエスト例:

+ +
cbstats [host]:11210 tap
+ + +
+ + +

レスポンス: tap

+

tap統計情報のレスポンス例:

+ +

+ ep_tap_ack_grace_period:        300
+ ep_tap_ack_interval:            1000
+ ep_tap_ack_window_size:         10
+ ep_tap_backoff_period:          5
+ ep_tap_bg_fetch_requeued:       0
+ ep_tap_bg_fetched:              0
+ ep_tap_bg_max_pending:          500
+ ep_tap_count:                   0
+ ep_tap_deletes:                 0
+ ep_tap_fg_fetched:              0
+ ep_tap_noop_interval:           20
+ ep_tap_queue_backfillremaining: 0
+ ep_tap_queue_backoff:           0
+ ep_tap_queue_drain:             0
+ ep_tap_queue_fill:              0
+ ep_tap_queue_itemondisk:        0
+ ep_tap_throttle_queue_cap:      1000000
+ ep_tap_throttle_threshold:      90
+ ep_tap_throttled:               0
+ ep_tap_total_backlog_size:      0
+ ep_tap_total_fetched:           0
+ ep_tap_total_queue:             0
+			
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. tap 統計情報解説
統計情報説明
ep_tap_ack_grace_period切断までにTAPが稼働できる期間
ep_tap_ack_intervalAckのリクエスト前にTAPプロデューサが送信すべきメッセージ数
ep_tap_ack_window_sizeコンシューマがレスポンスackを送信する前に送信可能な、最大ackリクエスト数。 + ウィンドウが飽和するとTAPストリームは一時停止する。
ep_tap_backoff_periodETMPFAILを受信した後にTAPコネクションがバックオフすべき秒数
ep_tap_bg_fetch_requeuedTAPのバックグラウンドフェッチタスクがキューに再登録された回数
ep_tap_bg_fetchedtapディスクフェッチ数
ep_tap_bg_max_pending単一のtapコネクションが保持できるバックグラウンドジョブの最大数
ep_tap_counttapコネクション数
ep_tap_deletesTAPの送信削除メッセージ数
ep_tap_fg_fetchedtapメモリフェッチ数
ep_tap_noop_intervalアイドル接続でnoopが送信される間隔、秒
ep_tap_queue_backfillremainingバックフィルするアイテム数
ep_tap_queue_backoff総バックオフアイテム
ep_tap_queue_drainキューからドレインしたアイテムの総数
ep_tap_queue_fillキューに登録されたアイテムの総数
ep_tap_queue_itemondiskディスク上に残っているアイテム数
ep_tap_throttle_queue_captapストリームを絞る際のディスク書込みキュー上限
ep_tap_throttle_thresholdtapストリームを絞る際に利用するメモリの割合。
ep_tap_throttled絞り込みにより拒否されたtapメッセージ数
ep_tap_total_backlog_sizeレプリケーション待ちのアイテム数
ep_tap_total_fetched送信したtapメッセージの総数
ep_tap_total_queuetapキュー上のtapキューサイズ合計
+
+ +
+ + +

tapクライアント単位の統計情報

+ +

各統計情報はep_tapqで始まり、ユニークなクライアントID/とコロンとなります。 + 例えば、クライアントの名前がslave1のqlenの統計情報はep_tapq:slave1:qlenとなります。

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
統計情報説明P/C
typetapコネクション種別 (producerまたはconsumer)PC
createdtapコネクション作成時間PC
supports_ackコネクションがackを利用する場合TruePC
connectedクライアントが接続している場合TruePC
disconnectsこのクライアントから切断した回数PC
reservedtapストリームが予約されているか否かP
suspendedtapストリームが停止しているか否かP
qlenクライアントIDのキューサイズP
qlen_high_pri優先度高のtapキューアイテムP
qlen_low_pri優先度低のtapキューアイテムP
vb_filtersvBucketフィルタセットコネクションのサイズP
vb_filtervBucketフィルタの内容P
rec_fetchedクライアントに送信されたtapメッセージP
rec_skipped異なるフィルタで再接続したtapによりスキップされたメッセージ数P
idleコネクションがアイドルか否かP
has_queued_itemハッシュテーブルまたはディスクに残アイテムがある場合TrueP
bg_result_size完了したバックグラウンド結果の数P
bg_jobs_issued開始したバックグラウンドジョブ数P
bg_jobs_completed完了したバックグラウンドジョブ数P
flagsクライアントが設定したコネクションのフラグP
pending_disconnectこのクライアントを待っている場合TrueP
pausedこのクライアントがブロックされている場合TrueP
pending_backfillこのコネクションで、キーがまだバックフィル中の場合TrueP
pending_disk_backfillこのコネクションでキーがまだディスクからバックフィル中の場合TrueP
backfill_completedバックフィルからすべてのアイテムがクライアントに正常に転送された場合TrueP
backfill_start_timestampバックフィル開始タイムスタンプP
reconnectsこのクライアントからの再接続回数P
backfill_ageバックフィル開始からの経過時間P
ack_seqno現在のtapのackシーケンス番号P
recv_ack_seqno最後に受信したtapのackシーケンス番号P
ack_log_sizetapのackバックログサイズP
ack_window_fulltapのackウィンドウが飽和しているか否かP
seqno_ack_requestedプロデューサがレスポンスを待っているackメッセージのseqnoP
expiresackバックログ有効期限P
queue_memorytapキューで利用されているメモリP
queue_fillキューに登録されたアイテムの総数P
queue_drainキューからドレインしたアイテムの総数P
queue_backoff総バックオフアイテムP
queue_backfillremaining残バックフィル数P
queue_itemondiskディスク上に残っているアイテム数P
total_backlog_sizeレプリケーション待ちアイテム数P
total_noops送信されたnoopメッセージ数P
num_checkpoint_endチェックポイント終了オペレーション数C
num_checkpoint_end_failed失敗したチェックポイント終了オペレーション数C
num_checkpoint_startチェックポイント開始オペレーション数C
num_checkpoint_start_failed失敗したチェックポイント開始オペレーション数C
num_delete削除オペレーション数C
num_delete_failed失敗した削除オペレーション数C
num_flushフラッシュオペレーション数C
num_flush_failed失敗したフラッシュオペレーション数C
num_mutationデータ変更オペレーション数C
num_mutation_failed失敗したデータ変更オペレーション数C
num_opaqueopaqueオペレーション数C
num_opaque_failed失敗したopaqueオペレーション数C
num_vbucket_setvBucket setオペレーション数C
num_vbucket_set_failed失敗したvBucket setオペレーション数C
num_unknownunkownオペレーション数C
+
+
+ + + +

Tap aggregated stats

+ +

集約されたtap統計情報は任意のtapコネクションを論理的にグループ化し、プリフィクスで集約します。

+ + +

例えば、すべてのTAP接続がrebalance_またはreplication_で始まっていれば、cbstats tapagg _を利用し、_をプリフィクスとしてグループ化した統計情報をリクエストできます。 これはリバンランスやレプリケーションで集約した統計情報を返します。 以下はcbstats tapaggで返される値です:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
統計情報説明
[プリフィクス]:countこのプリフィクスに一致したコネクション数
[プリフィクス]::qlenこのプリフィクスの総キューサイズ
[プリフィクス]:backfill_remainingバックフィルするアイテム数
[プリフィクス]:backoff総バックオフイベント回数
[プリフィクス]:drainキューからドレインしたアイテムの総数
[プリフィクス]:fillキューに登録されたアイテムの総数
[プリフィクス]:itemondiskディスク上に残っているアイテム数
[プリフィクス]:total_backlog_sizeレプリケーション待ちのアイテム数
+
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-timing.html b/preview/contents/CLI/CBstats/cbstats-timing.html new file mode 100644 index 0000000..d006231 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-timing.html @@ -0,0 +1,220 @@ +Timings
+

Timings

+ + +

cbstats timingsコマンドはタイミングの統計情報を提供します。

+ +

説明

+

タイミング統計情報はシステム内の様々なオペレーションにおける高解像度のタイマーからヒストグラムデータを提供します。

+ +
+ + +

シンタックス

+

タイミング統計情報をリクエストするには、以下のシンタックスを利用します:

+ +
cbstats [host]:[dataport] timings
+ +
+ + +

+ +

次の例では、105.2.117のホストとデフォルトの11210ポートを利用しています:

+ +
cbstats 10.5.2.117:11210 timings
+ +
+ + +

レスポンス

+ +

以下はcbstats timingsのサンプル出力です:

+ +

+disk_commit (1024 total)
+    0 - 1s : (100.00%) 1024 ###################################################
+    Avg    : (     1s)
+ get_stats_cmd (30663276 total)
+    0 - 1us       : (  0.05%)    14827 
+    1us - 2us     : (  6.56%)  1995778 ##
+    2us - 4us     : ( 41.79%) 10804626 ##############
+    4us - 8us     : ( 45.20%)  1044043 #
+    8us - 16us    : ( 45.49%)    89929 
+    16us - 32us   : ( 45.90%)   124472 
+    32us - 64us   : ( 46.38%)   148935 
+    64us - 128us  : ( 56.17%)  2999690 ###
+    128us - 256us : ( 68.57%)  3804009 ####
+    256us - 512us : ( 69.91%)   411281 
+    512us - 1ms   : ( 78.77%)  2717402 ###
+    1ms - 2ms     : ( 96.36%)  5391526 #######
+    2ms - 4ms     : ( 99.05%)   826345 #
+    4ms - 8ms     : ( 99.96%)   278727 
+    8ms - 16ms    : (100.00%)    11443 
+    16ms - 32ms   : (100.00%)      217 
+    32ms - 65ms   : (100.00%)       19 
+    65ms - 131ms  : (100.00%)        7 
+    Avg           : (  347us)
+ disk_vbstate_snapshot (93280 total)
+    32us - 64us   : ( 15.34%) 14308 ######
+    64us - 128us  : ( 74.74%) 55413 #########################
+    128us - 256us : ( 91.39%) 15532 #######
+    256us - 512us : ( 95.69%)  4007 #
+    512us - 1ms   : ( 99.49%)  3546 #
+    1ms - 2ms     : ( 99.95%)   423 
+    2ms - 4ms     : ( 99.99%)    43 
+    4ms - 8ms     : (100.00%)     4 
+    2s - 4s       : (100.00%)     4 
+    Avg           : (  190us)
+ notify_io (4 total)
+    4us - 8us   : ( 25.00%) 1 ############
+    16us - 32us : ( 75.00%) 2 ########################
+    32us - 64us : (100.00%) 1 ############
+    Avg         : (   17us)
+
+
+ + +

以下はcbstats timingsが返す値です。 このコマンドが出力した値はデータバケットで実際に何が起きたかに依存します。

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
統計情報説明
bg_loadディスクを待っているバックグラウンドフェッチ
bg_waitディスパッチャキューを待っているバックグラウンドフェッチ
data_ageディスクに書き込まれたデータの存在期間
disk_commitバッチ更新後にコミットを待っている時間
disk_delアイテム削除のディスク待ち
disk_insert新規アイテム保存のディスク待ち
disk_vbstate_snapshotvBucket状態変更の永続化時間
disk_update既存アイテム更新のディスク待ち
get_cmdgetリクエスト処理
get_stats_cmdget_statsリクエスト処理
set_vb_cmdvBucket set statusコマンドの処理
item_alloc_sizesアイテムアロケーションサイズカウンタ (byte)
notify_ioブロックされた接続の起動時間
storage_age保存された最後のオブジェクトが、キューに登録されてからの経過時間
tap_mutationtapデータ変更の処理時間
+
+ + +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-toplevelstats.html b/preview/contents/CLI/CBstats/cbstats-toplevelstats.html new file mode 100644 index 0000000..117f9d1 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-toplevelstats.html @@ -0,0 +1,1066 @@ +トップレベル統計情報
+

トップレベル統計情報

+ + +

トップレベル統計情報について解説します。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
統計情報説明
uuidバケットのユニーク識別子
ep_versionep_engineのバージョン番号
ep_storage_age保存された最後のオブジェクトが、キューに登録されてからの経過秒数
ep_storage_age_highwatep_strage_ageの高水位。
ep_startup_timeシステムが生成したエンジンの起動時刻
ep_data_age最後に保存されたオブジェクトが変更されてからの経過秒数
ep_data_age_highwatep_data_ageの高水位
ep_too_youngオブジェクトが若すぎるために保存されなかった回数
ep_too_oldオブジェクトが長期間ダーティーであった後に保存された回数
ep_total_enqueued永続化のためにキューに登録されたアイテムの総数
ep_total_new_items永続化された新規アイテムの総数
ep_total_del_items削除の永続化総数
ep_total_persisted永続化したアイテムの総数
ep_item_flush_failedストレージエラーでアイテムのフラッシュに失敗した回数
ep_item_commit_failedストレージエラーでトランザクションのコミットに失敗した回数
ep_item_begin_failedストレージエラーでトランザクションの開始に失敗した回数
ep_expired_accessアプリケーションからのアクセスにより有効期限切れとなったアイテム数
ep_expired_pagerEPエンジンアイテムページャにてアイテムを期限切れとした回数
ep_item_flush_expired有効期限切れのため、アイテムをフラッシュしなかった回数
ep_queue_sizeストレージのキューに登録されたアイテム数
ep_flusher_todo現在書き込まれているアイテム数
ep_flusher_stateフラッシャースレッドの現在の状態
ep_commit_num書込みのコミット回数
ep_commit_time直近のコミット時間、ミリ秒
ep_commit_time_total累計コミット時間、ミリ秒
ep_vbucket_delvBucket削除イベント回数
ep_vbucket_del_failvBucket削除イベント失敗回数
ep_vbucket_del_max_walltimevBucket削除の制限時間(µs)
ep_vbucket_del_avg_walltime平均vBucket削除時間(µs)
ep_flush_duration_total累計フラッシュ時間
ep_flush_allディスクのflush_allがスケジュールされている場合True
ep_num_ops_get_metagetMetaオペレーション数
ep_num_ops_set_metasetWithMetaオペレーション数
ep_num_ops_del_metadelWithMetaオペレーション数
ep_num_ops_set_meta_res_failedコンフリクトの解決に失敗したsetWithMetaオペレーション数
ep_num_ops_del_meta_res_failedコンフリクトの解決に失敗したdelWithMetaオペレーション数
ep_num_ops_set_ret_metasetMetaオペレーション数
ep_num_ops_del_ret_metadelMetaオペレーション数
curr_itemsアクティブvBucket内のアイテム数 (temp + live)
curr_temp_itemsアクティブvBucket内のtempアイテム数
curr_items_totアクティブ以外(replica, dead, pending状態)を含む現在のアイテム数
ep_kv_sizevBucketのステータスに関係なく、アイテムメタデータ、キーとバリューの保存に利用されているメモリサイズ。 アイテムのバリューが除去された場合、そのアイテムのバリューサイズ分、この統計は減少する。
ep_value_sizeメモリ内に存在するキーのバリューを保存するために利用しているメモリ
ep_overhead永続化キュー、レプリケーションキュー、チェックポイントなどの一時的なデータに利用されているメモリ
ep_mem_low_watメモリからのアイテム自動除去に利用する低水位
ep_mem_high_watメモリからのアイテム自動除去に利用する高水位
ep_total_cache_size全アイテムの総バイトサイズ、
 vBucketのステータス、アイテムのバリューが除去されているかは関係しない
ep_oom_errorsオペレーションの処理中に発生した復帰不能なOOM回数
ep_tmp_oom_errorsオペレーションの処理中に発生した一時的なOOM回数
ep_mem_tracker_enabledメモリ利用状況トラッカーが有効な場合True
ep_bg_fetchedディスクからのアイテムフェッチ回数
ep_bg_meta_fetchedディスクからのメタアイテムフェッチ回数
ep_bg_remaining_jobsバックグラウドフェッチジョブの残数
ep_max_bg_remaining_jobs現在までにキューに登録されたバックグラウドフェッチジョブの最大残数
ep_tap_bg_fetchedTAPディスクフェッチ数
ep_tap_bg_fetch_requeuedTAPバックグラウドフェッチタスクがキューに再登録された回数
ep_num_pager_runsメモリの空きを作るために実行したページャのループ回数
ep_num_expiry_pager_runs期限切れアイテムをメモリ/ディスクから削除するために実行したページャのループ回数
ep_num_access_scanner_runsワーキングセットのスナップショットを作成するために実行したアクセススキャナの回数
ep_access_scanner_num_items最後に実行したアクセススキャナがアクセスログに書き込んだアイテム数
ep_access_scanner_task_time次回のアクセススキャナタスク実行時刻 (GMT)
ep_access_scanner_last_runtime最後のアクセススキャナが完了するのに経過した秒数
ep_items_rm_from_checkpointsクローズされ参照されなくなったチェックポイントから削除されたアイテム数
ep_num_value_ejectsメモリからディスクへとアイテムバリューを除去した回数
ep_num_eject_failures除去されなかったアイテムの個数
ep_num_not_my_vbuckets実行中にNot My VBucketエラーが発生した回数
ep_tap_keepaliveTAPのkeepalive時間
ep_dbnameDBのパス
ep_io_num_read参照IOオペレーション数
ep_io_num_write更新IOオペレーション数
ep_io_read_bytes参照バイト数 (キー + バリュー)
ep_io_write_bytes更新バイト数 (キー + バリュー)
ep_pending_opsペンディング状態のvBucketを待機している秒間オペレーション数
ep_pending_ops_totalリセット実行後にブロックされたペンディングオペレーション総数
ep_pending_ops_maxペンディング状態のvBucketを待機している最大秒間オペレーション数
ep_pending_ops_max_durationペンディングvBucketの待機に利用した最大時間 (µs)
ep_bg_num_samples平均に含まれるサンプル数
ep_bg_min_waitキュー内の最小待ち時間 (µs)
ep_bg_max_waitキュー内の最大待ち時間 (µs)
ep_bg_wait_avgアイテムがディスパッチャで処理されるまでの平均待ち時間 (µs)
ep_bg_min_load最小ロード時間 (µs)
ep_bg_max_load最大ロード時間 (µs)
ep_bg_load_avgアイテムが永続化層でロードされるまでの平均時間 (µs)
ep_num_non_residentメモリ内に存在しないアイテム数
ep_bg_waitキュー内の待ち総待ち時間
ep_bg_loadアイテムが永続化層にロードされるまでの総経過時間
ep_allow_data_loss_during_shutdownサーバシャットダウン中にデータロスを許容するか否か
ep_alog_block_sizeアクセスログブロックサイズ
ep_alog_pathアクセスログのパス
ep_alog_sleep_timeアクセススキャナ間隔(分)
ep_alog_task_time次回のアクセススキャナタスク実行時刻 (GMT)
ep_backendデータ永続化に利用しているバックエンド
ep_bg_fetch_delayバックグラウドフェッチの実行までの待ち時間
ep_chk_max_items新規チェックポイント作成までにチェックポイントで許容するアイテム数
ep_chk_period新規チェックポイント作成までの最大チェックポイント存続時間
ep_chk_persistence_remainsチェックポイント永続化の残vBucket数
ep_chk_persistence_timeoutvBucketチェックポイント永続化のタイムアウト
ep_chk_remover_stimeメモリからクローズされたチェックポイントを削除する間隔
ep_config_fileep-engine設定ファイルの場所
ep_couch_bucket本バケットの名称
ep_couch_hostCouchDB Viewサーバがリスンしているホスト名
ep_couch_portCouchDB Viewサーバがリスンしているポート番号
ep_couch_reconnect_sleeptimeCouchDBに再接続するまでの待ち時間
ep_couch_response_timeoutCouchDBに再接続するまでのレスポンスタイムアウト時間
ep_data_traffic_enabledこのバケットに対するデータトラフィックが有効か否か
ep_degraded_modeエンジンがウォームアップ中かデータトラフィックが無効な場合True
ep_exp_pager_stimeメモリからの期限切れアイテム削除の実行間隔
ep_failpartialwarmupウォームアップが失敗した場合にバケットをkillする場合True
ep_flushall_enabledこのバケットでflush_allコマンドが有効化されている場合True
ep_getl_default_timeoutデフォルトのgetlロック時間
ep_getl_max_timeout最大getlロック時間
ep_ht_locksvbハッシュテーブル単位のロック数
ep_ht_size各vbハッシュテーブルの初期サイズ
ep_item_num_based_new_chk新規チェックポイント作成に現在のチェックポイント内アイテム数を利用する場合True
ep_keep_closed_chksメモリ利用量が高水位を超えない限り、各vBucketのクローズしたチェックポイントを保持する場合、True
ep_max_checkpointsメモリに保持できるvBucketごとの最大チェックポイント数
ep_max_item_size最大バリューサイズ
ep_max_sizeこのバケットで利用可能な最大メモリ容量
ep_max_vbucketsこのバケット内で利用可能な最大vBucket数
ep_mutation_mem_threshold一時的なOOMやOOMメッセージの送信を開始する利用可能なメモリの割合
ep_pager_active_vb_pcntアクティブvBucketページング割合
ep_tap_ack_grace_period切断までにTAPが稼働できる期間
ep_tap_ack_initial_sequence_numberTAPストリームが作成された際にTAPが稼働する初期シーケンス番号
ep_tap_ack_intervalAckのリクエスト前にTAPプロデューサが送信すべきメッセージ数
ep_tap_ack_window_sizeコンシューマがレスポンスackを送信する前に送信可能な、最大ackリクエスト数。 ウィンドウが飽和するとTAPストリームは一時停止する。
ep_tap_backfill_residentバックフィルの実行方法を決定するためのメモリ内アイテム数割合。 この割合を下回るとフルディスクバックフィルをスケジュールする。 この割合を上回る場合、メモリに存在しないアイテムにバックグラウンドフェッチを実行する。
ep_tap_backlog_limitメモリ内に保持できるTAPコンシューマへの送信待機中の最大バックフィルアイテム数
ep_tap_backoff_periodTAP接続の秒数
ep_tap_bg_fetch_requeuedTAPバックグラウドフェッチタスクがキューに再登録された回数
ep_tap_bg_max_pendingTAP接続が保持できる最大バックグラウンドジョブ数
ep_tap_noop_intervalアイドル接続でnoopが送信される間隔、秒
ep_tap_requeue_sleep_time失敗したTAPアイテムがキューに再登録されるまでの待ち時間
ep_tap_throttle_cap_pcntTAPインプットを絞る際の書込みキュー内総アイテム数の割合
ep_tap_throttle_queue_capTAPインプットを絞る際の最大書込みキューサイズ
ep_tap_throttle_thresholdTAPインプットをNAKしはじめる最大メモリ割合
ep_uncommitted_itemsディスクにまだ書き込まれていないアイテムの割合
ep_vb0vBucket 0がデフォルトで作成されるべきか否か
ep_waitforwarmupトラフィックを受け付けるまでウォームアッププロセスの完了を待機する場合True
ep_warmupウォームアップが有効か否か
ep_warmup_batch_sizeウォームアップ中のバッチロードサイズ
ep_warmup_dupsウォームアップ中に発生した重複アイテム数
ep_warmup_min_items_thresholdトラフィック受付け前にウォームアップされたアイテムの割合
ep_warmup_min_memory_thresholdトラフィックを受付けるまでにウォームアップする最大メモリの割合
ep_warmup_oomウォームアップ中に発生したOOMエラー回数
ep_warmup_threadウォームアップスレッドのステータス
ep_warmup_timeウォームアップ処理時間
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-totalvbucket.html b/preview/contents/CLI/CBstats/cbstats-totalvbucket.html new file mode 100644 index 0000000..cb8ba5a --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-totalvbucket.html @@ -0,0 +1,124 @@ +vBucket 統計情報
+

vBucket 統計情報

+ + +

vBucketの統計情報について解説します。

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
統計情報説明
ep_vb_total総vBucket数
curr_items_tot総アイテム数
curr_itemsメモリ内のアクティブアイテム数
curr_temp_itemsメモリ内のテンポラリアイテム数
vb_dead_numdead状態のvBucket数
ep_diskqueue_itemsディスクキュー内のアイテム数
ep_diskqueue_memoryディスクキューで利用されているメモリ容量
ep_diskqueue_fillディスクキューに登録されたアイテムの総数
ep_diskqueue_drainディスクキューからドレインしたアイテムの総数
ep_diskqueue_pending書込み待ちの総バイト数
ep_vb_snapshot_totalディスクに永続化されたVB状態スナップショットの総数
ep_meta_data_memoryメタデータで利用している総メモリ容量
+
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-uuid.html b/preview/contents/CLI/CBstats/cbstats-uuid.html new file mode 100644 index 0000000..5324c11 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-uuid.html @@ -0,0 +1,51 @@ +UUID
+

UUID

+ + +

cbstats uuidコマンドはサーバノードのUUIDを提供します。

+ +

CLIコマンドとパラメータ

+

+ +
cbstasts uuid
+ +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [localhost]:11210 uuid
+ +
+ + +

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 uuid
+ + +
+ + +

レスポンス

+

レスポンス例:

+ +
uuid: 8a741dd4e271ff88c0b609dd43497d74
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-vbucket.html b/preview/contents/CLI/CBstats/cbstats-vbucket.html new file mode 100644 index 0000000..996d3dc --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-vbucket.html @@ -0,0 +1,121 @@ +vBucket
+

vBucket

+ + +

cbstats vbucketコマンドはvBucketの情報を提供します。

+ +

説明

+

vbucketコマンドはvBucketがアクティブか、レプリカvBucketかを表示します。

+ +
+ + +

CLIコマンドとパラメータ

+

+ +

+cbstats vbucket
+cbstats vbucket-details
+cbstats vbucket-seqno
+      
+ + +
+ + +

シンタックス

+

リクエストシンタックス:

+ +
cbstats [localhost]:11210 vbucket
+cbstats [localhost]:11210 vbucket-details [vbid]
+cbstats [localhost]:11210 vbucket [vbid]
+      
+ +
+ + +

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 vbucket
+ +
cbstats 10.5.2.54:11210 vbucket-details 115
+ +
cbstats 10.5.2.54:11210 vbucket-seqno 115
+ + +
+ + +

レスポンス

+

vbucketのレスポンス例:

+ +

+vb_0:    replica
+ vb_1:    replica
+ vb_10:   replica
+ vb_100:  active
+ vb_1000: replica
+ vb_1001: replica
+ vb_1002: replica
+ vb_1003: replica
+ vb_1004: replica
+ vb_1005: replica
+ ...
+      
+ + +

vbucket-detailsのレスポンス例:

+ +

+ vb_115:                  active
+ vb_115:db_data_size:     174
+ vb_115:db_file_size:     24622
+ vb_115:high_seqno:       0
+ vb_115:ht_cache_size:    0
+ vb_115:ht_item_memory:   0
+ vb_115:ht_memory:        25096
+ vb_115:num_ejects:       0
+ vb_115:num_items:        0
+ vb_115:num_non_resident: 0
+ vb_115:num_temp_items:   0
+ vb_115:ops_create:       0
+ vb_115:ops_delete:       0
+ vb_115:ops_reject:       0
+ vb_115:ops_update:       0
+ vb_115:pending_writes:   0
+ vb_115:purge_seqno:      0
+ vb_115:queue_age:        0
+ vb_115:queue_drain:      0
+ vb_115:queue_fill:       0
+ vb_115:queue_memory:     0
+ vb_115:queue_size:       0
+ vb_115:uuid:             219212055839841
+        
+ + + +

vbucket-seqnoのレスポンス例:

+ +

+ vb_115:abs_high_seqno: 0
+ vb_115:high_seqno:     0
+ vb_115:purge_seqno:    0
+ vb_115:uuid:           219212055839841
+        
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-warmup.html b/preview/contents/CLI/CBstats/cbstats-warmup.html new file mode 100644 index 0000000..d1f8057 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-warmup.html @@ -0,0 +1,293 @@ +Warmup
+

Warmup

+ + + +

cbstats warmupコマンドはウォームアップ処理に関連する統計情報を提供します。

+ +

説明

+

Couchbase Serverノードを初回起動する場合、必要なDBファイルを作成し、データの提供を即座に開始します。 + しかしながら、ディスクにすでにデータがある場合(ノードを再起動したか、サービスが再起動した)、そのノードはこれらすべてのデータをデータ提供を開始する前にディスクから読み込む必要があります。 これをウォームアップと呼びます。 データサイズによっては、時間がかかることがあります。

+

cbstats warmupコマンドはウォームアップのステータス、ウォームアップが有効かどうかを含むサーバウォームアップに関する情報の取得に利用します。 以下にコマンドシンタックスを示します:

+
cbstats [host]:[dataport] -b bucket_name -p bucket_password raw warmup
+
+cbstats [host]:11210 warmup
+
+ +

デフォルトバケットの統計情報をリクエストする場合、バケットを指定する必要はありません。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. cbstats オプション
オプション説明
-aすべてのバケットをイテレートする。 管理者のユーザ名とパスワードが必要。
-pバケットのパスワード、設定されている場合。
-d統計情報を取得するバケット。 デフォルト: default。
+
+ + + + +

以下の統計情報は特にウォームアップをモニタリングする際に重要です。

+
+ +
ep_warmup_thread
+ +
これはウォームアップがまだ実行中かを示します。 + 値: runningまたはcomplete
+ + + +
ep_warmup_state
+ +
これは、現在実行中のウォームアップフェーズを示します。 値: loading keys、loading access log, done。
+ + +
+
    +
  • ep_warmup_stateがloading keysの時、ep_warmup_key_count (現在の数)と、 ep_warmup_estimated_key_count(目標の数)を比較します。
  • + +
  • ep_warmup_stateがloading access logの時、ep_warmup_value_count (現在の数)と、ep_warmup_estimated_value_count (目標の数)を比較します。
  • + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 2. cbstats warmup 統計情報
統計情報説明値の種別
ep_warmupウォームアップが有効か否か文字列: enabledまたはdisabled
ep_warmup_dups重複するキーによる失敗回数整数
ep_warmup_estimated_key_count予測したデータベース内のキー数整数 デフォルト: unkown
ep_warmup_estimate_time予測したウォームアップ時間、ミリ秒整数
ep_warmup_estimated_value_countアクセスログに基づき、予測した読み込むキーデータの数整数 デフォルト: unkown
ep_warmup_item_expired期限切れアイテムの数整数 デフォルト: 0
ep_warmup_keys_countウォームアップしたキーの数整数
ep_warmup_keys_time永続化したキーのロード時間整数
ep_warmup_min_item_thresholdデータトラフィックを有効化するまでにロードするキーデータの割合 traffic after loading this percentage of key + data整数
ep_warmup_min_memory_thresholdデータトラフィックを有効化するまでに読み込むメモリの割合整数(%)
ep_warmup_oomウォームアップ中のOut Of Memory発生回数整数
ep_warmup_state現在のウォームアップスレッドステータス文字列
ep_warmup_threadウォームアップスレッドのステータス文字列: runningまたはcomplete
ep_warmup_timeデータロード(ウォームアップ)時間整数 (ミリ秒)
ep_warmup_value_countウォームアップしたバリューの数整数
+
+
+ + +

+

リクエスト例:

+ +

+cbstats 10.5.2.117:11210 warmup
+			
+ + +
+ + +

レスポンス

+

レスポンス例:

+ +

+ ep_warmup:                       enabled
+ ep_warmup_dups:                  0
+ ep_warmup_estimate_time:         57546
+ ep_warmup_estimated_key_count:   0
+ ep_warmup_estimated_value_count: unknown
+ ep_warmup_item_expired:          0
+ ep_warmup_key_count:             0
+ ep_warmup_keys_time:             529022
+ ep_warmup_min_item_threshold:    100
+ ep_warmup_min_memory_threshold:  100
+ ep_warmup_oom:                   0
+ ep_warmup_state:                 done
+ ep_warmup_thread:                complete
+ ep_warmup_time:                  529192
+ ep_warmup_value_count:           0
+	
+			
+ + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/CBstats/cbstats-workload.html b/preview/contents/CLI/CBstats/cbstats-workload.html new file mode 100644 index 0000000..7ff28c0 --- /dev/null +++ b/preview/contents/CLI/CBstats/cbstats-workload.html @@ -0,0 +1,76 @@ +Workload
+

Workload

+ + +

cbstats workloadコマンドはバケットのスレッドのワークロード状態を提供します。

+ + +

説明

+

このコマンドはどれだけの様々な種別のスレッドが現在稼働しているかを取得するために利用します。

+ +
+ + +

シンタックス

+

基本シンタックス:

+ +
cbstats [hostname]:11210 -b bucket_name workload
+ +
+ + + +

+

リクエスト例:

+ +
cbstats 10.5.2.54:11210 workload
+ +
+ + + +

レスポンス

+ +

この例は、10.5.2.54:11210のクラスタ内のデフォルトバケットの4つのreaderスレッドと、4つのwriterスレッドを表示しています。データバケットのvBucketマップは複数のシャードにグループ化されていて、一つのreadワーカが一つのシャードにアクセスします。 この例では、4つのシャードごとに一つのreaderがあります。

+ +

レスポンス例:

+ + +

+ ep_workload:LowPrioQ_AuxIO:InQsize:   5
+ ep_workload:LowPrioQ_AuxIO:OutQsize:  0
+ ep_workload:LowPrioQ_NonIO:InQsize:   55
+ ep_workload:LowPrioQ_NonIO:OutQsize:  0
+ ep_workload:LowPrioQ_Reader:InQsize:  20
+ ep_workload:LowPrioQ_Reader:OutQsize: 0
+ ep_workload:LowPrioQ_Writer:InQsize:  30
+ ep_workload:LowPrioQ_Writer:OutQsize: 0
+ ep_workload:max_auxio:                1
+ ep_workload:max_nonio:                1
+ ep_workload:max_readers:              4
+ ep_workload:max_writers:              4
+ ep_workload:num_auxio:                1
+ ep_workload:num_nonio:                1
+ ep_workload:num_readers:              4
+ ep_workload:num_shards:               4
+ ep_workload:num_sleepers:             10
+ ep_workload:num_writers:              4
+ ep_workload:ready_tasks:              0
+    
+ + +
+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cbanalyze-core_tool.html b/preview/contents/CLI/cbanalyze-core_tool.html new file mode 100644 index 0000000..70d1896 --- /dev/null +++ b/preview/contents/CLI/cbanalyze-core_tool.html @@ -0,0 +1,114 @@ +cbanalyze-coreツール
+

cbanalyze-coreツール

+ + +

cbanalyze-coreツールはコアダンプデータの解析や分析に使用します。

+ +

説明

+

Couchbaseノードのコアダンプを解析や分析するヘルパースクリプト。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オプション説明
-r [root]ルート内のバイナリを検索します。
-f [reportfile]指定されたファイルを出力するために使用します。
+
+ + + + +

お使いのプラットフォームに応じて、このツールは以下の場所に存在します:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オペレーションシステム場所
Linux/opt/couchbase/bin/tools/
Windowsこのプラットフォームでは利用できません。
Mac OS X/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/tools/
+
+ +
+ + + +

シンタックス

+

基本的なシンタックス:

+ +
cbanalyze-core -r [root] -f [reportfile] [corefile]
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cbbackup-ddocs.html b/preview/contents/CLI/cbbackup-ddocs.html new file mode 100644 index 0000000..c46515f --- /dev/null +++ b/preview/contents/CLI/cbbackup-ddocs.html @@ -0,0 +1,123 @@ +デザインドキュメントのバックアップ
+

デザインドキュメントのバックアップ

+ + +

デザインドキュメントはdesign_doc_only=1というオプションをつけることでバックアップできます。

+ +

説明

+ +

design_doc_only=1をつけるとクラスタやバケットからデザインドキュメントのみバックアップします。cbrestore design_doc_only=1をつけるとデザインドキュメントのみ復元されます。

+ +
+ + +

シンタックス

+

基本シンタックス:

+ +
cbbackup http://[host]:8091 [backup-location] -x design_doc_only=1 -b [bucket-name]
+ +
+ + +

+

次の例では、foo-bucketから全てのデザインドキュメントのバックアップコピーが生成され、~/backup/foo-bucketというディレクトリのdesign.jsonにこれらが格納されます。もしバケットが指定されていない場合、クラスタ内にある全てのバケットのデザインドキュメントがバックアップされます。

+ + +
cbbackup http://10.5.2.117:8091 ~/backup -x design_doc_only=1
+ + + + + +
+ + +

レスポンス

+

次のレスポンス例では、全てのバケットでデザインドキュメントのみがバックアップされていることを示しています。この場合、ソースノードはデフォルトのバケットを含む2つのバケットを持っています。

+ +

+transfer design doc only. bucket msgs will be skipped.
+transfer design doc only. bucket msgs will be skipped.
+done
+        
+ + +

次の出力では、2つのデザインドキュメントがバックアップされました。

+ + +
[
+   {
+      "controllers":{
+         "compact":"/pools/default/buckets/default/ddocs/_design%2Fddoc1/controller/compactView",
+         "setUpdateMinChanges":"/pools/default/buckets/default/ddocs/_design%2Fddoc1/controller/setUpdateMinChanges"
+      },
+      "doc":{
+         "json":{
+            "views":{
+               "view1":{
+                  "map":"function(doc){emit(doc.key,doc.key_num);}"
+               },
+               "view2":{
+                  "map":"function(doc,meta){emit(meta.id,doc.key);}"
+               }
+            }
+         },
+         "meta":{
+            "rev":"1-6f9bfe0a",
+            "id":"_design/ddoc1"
+         }
+      }
+   },
+   {
+      "controllers":{
+         "compact":"/pools/default/buckets/default/ddocs/_design%2Fddoc2/controller/compactView",
+         "setUpdateMinChanges":"/pools/default/buckets/default/ddocs/_design%2Fddoc2/controller/setUpdateMinChanges"
+      },
+      "doc":{
+         "json":{
+            "views":{
+               "dothis":{
+                  "map":"function (doc, meta) {\n  emit(meta.id, null);\n}"
+               }
+            }
+         },
+         "meta":{
+            "rev":"1-4b533871",
+            "id":"_design/ddoc2"
+         }
+      }
+   },
+   {
+      "controllers":{
+         "compact":"/pools/default/buckets/default/ddocs/_design%2Fdev_ddoc2/controller/compactView",
+         "setUpdateMinChanges":"/pools/default/buckets/default/ddocs/_design%2Fdev_ddoc2/controller/setUpdateMinChanges"
+      },
+      "doc":{
+         "json":{
+            "views":{
+               "dothat":{
+                  "map":"function (doc, meta) {\n  emit(meta.id, null);\n}"
+               }
+            }
+         },
+         "meta":{
+            "rev":"1-a8b6f59b",
+            "id":"_design/dev_ddoc2"
+         }
+      }
+   }
+]
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cbbackup_tool.html b/preview/contents/CLI/cbbackup_tool.html new file mode 100644 index 0000000..22dde59 --- /dev/null +++ b/preview/contents/CLI/cbbackup_tool.html @@ -0,0 +1,520 @@ +cbbackupツール
+

cbbackupツール

+ + + +

cbbackupツールは、稼働中の全クラスタ・全バケット・単一ノード・正常稼働中ノード上の単一バケット + のコピーを作成します。

+ +

定義

+

バックアッププロセスは、ディスク上にデータのコピーを書き込みます。 + cbbackupを使用してバックアップを作成するために、ノードもしくはクラスタは、正常な状態で稼働している必要があります。

+ + +

cbbackupツール, cbrestoreツール, cbtransferツール + は、クラスタに所属しないサーバーと外部IPアドレスでは通信しません。 + バックアップ、リストア、転送のオペレーションは、Couchbaseクラスタ内のノード内でデータを扱います。 + クラスタから取得したノードリスト内のノードのみと通信します。 + そのため、CouchbaseServerがデフォルトIPアドレスでインストールされていれば、外部からの接続用ホスト名ではアクセス出来ません。

+ + +

このツールを使うときは、以下のオプションを使うことが出来ます:

+ +
    +
  • クラスタ内の全てのバケットのバックアップを作成
  • + +
  • クラスタ内で、名前を指定したバケットのバックアップを作成
  • + +
  • クラスタ内のあるノードの全バケットのバックアップを作成
  • + +
  • 特定ノードの、名前を指定したバケットのバックアップを作成
  • + +
+ + +
ヒント: cbbackupの結果は、サーバーのローカルファイルシステムに出力することを推奨します。 + 特に、専用パーティションにバックアップするのが良いでしょう。 + 専用パーティションにすることで、バックアップがCouchbaseのデータストアやOS領域を圧迫することを防げます。 +
+ + + +
注意:
cbbackupの結果を、共有リモートファイルシステム(NFS)に出力することは避けましょう。 + cbbackupの出力ファイルは、リモートファイルシステムへの書き込みに問題のあるsqlite formatとsqlite-formatted fileで出来ているからです。 +
+ + +

このツールは以下に存在します:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
OS存在場所
Linux/opt/couchbase/bin/cbbackup
WindowsC:\Program Files\Couchbase\Server\bin\cbbackup
Mac OS X/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/cbbackup
+
+ +
+ + +

CLIコマンドとパラメータ

+ +

cbbackupコマンドのフォーマット:

+ +
cbbackup [options] [source] [backup-dir]
+
+ +

詳細:

+ +
    +
  • [options]

    cbtransferツールと同じオプションが使えます

    +
  • + +
  • [source]

    バックアップするソース元を指定します。 + バックアップ元がシングルノードかクラスタであればノードのURLを、バックアップ元が単一バケットの場合はディレクトリのURLを指定することが出来ます。

    +
  • + +
  • [backup-dir]

    バックアップファイルの保存先ディレクトリを指定します。 + 既に存在する空のディレクトリを指定するか、指定したディレクトリを新規に作ることが出来ます。 + 新規に作る場合は、必ず親ディレクトリは既に存在する必要があります。

    +
  • + +
+ + + +

コマンドのオプション:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. cbrestoreのオプション
パラメータ定義
-h, –helpコマンドラインのヘルプ
-b ソースバケット, --bucket-source=ソースバケットソースクラスタから転送する、名前指定の1つのバケット。 + バックアップディレクトリに1つしかバケットがない場合、自動的にそのバケットが選択されます。
--single-nodeクラスタ全体の全てのノードを使わず、1つのサーバーのみを使います。 + このノードは、ソースURLを指定して定義します。
-m モード, --mode=モード 
-i ID, –id=IDvbucket IDにマッチしたアイテムのみを転送します。
-k KEY, –key=KEY正規表現でマッチしたキーに該当するアイテムのみを転送します。
-n, –dry-run実際の転送は実行しません。パラメータ・ファイル・コネクティビティ・設定のチェックだけを実施します
-u USERNAME, –username=USERNAMEソースクラスタもしくはノードのREST usernameを指定します。
-p PASSWORD, –password=PASSWORDソースクラスタもしくはノードのREST passwordを指定します。
-t スレッド数, –threads=スレッド数転送のためのワーカースレッド数を指定します。
-v, –verboseログレベルを上げます。vの数を増やすことでログレベルが上がります。最大は[-vvv]です。
-x EXTRA, –extra=EXTRA一般的ではない拡張設定パラメータを指定します。カンマ区切りで、key=val(key-val)*形式で指定します。
+
+ +

cbbackup -xのコマンドオプションパラメータは以下のとおりです。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 2. cbbackup -x options
-x options定義
backoff_cap=10リバランス中の最大バックオフ時間です。
batch_max_bytes=400000指定サイズ(bytes)に分割して転送します。
batch_max_size=1000一度の転送では、ここて定義したドキュメント数を最大とします。
cbb_max_mb=100000指定したサイズ(MB)を超えると、宛先クラスタ上のファイルを分割します。
conflict_resolve=1デフォルトでは、コンフリクトの解決は無効となっています。
data_only=01にすれば、ファイルもしくはクラスタからデータのみを転送します。
design_doc_only=01にすれば、ファイルもしくはクラスタから、デザインドキュメントのみを転送します。デフォルトは0です。
max_retry=10転送に失敗した場合、指定した回数までリトライします。
mcd_compatible=10にすれば、標準出力に出力します。
nmv_retry=11にすれば、NOT_MY_VBUCKET messageの後に転送をリトライします。デフォルトは1です。
recv_min_bytes=4096各TCP/IPで転送する場合の容量です。
rehash=01にすると、各アイテムのパーティションIDを作り直します。 + クラスタ間でデータを転送するとき、パーティションの数が異なる場合に必要になります。 + 例えば、MAC OS Xサーバーから、それ以外のサーバーに対して転送するときなどです。 +
report=5コンソールの進捗バーを更新する間隔となるバッチ転送数を指定します。
report_full=2000コンソールの進捗状況を更新する間隔となるバッチ転送数を指定します。
seqno=0デフォルトでは、seqnoは最初から開始します。
try_xwm=11にすると、ドキュメントと一緒にメタデータも転送します。デフォルトは1です。 + 0は、version 1.8.xから1.8.xに転送する場合のみ使えます。 +
uncompress=01にすると、圧縮せずにデータを保存します。
+
+ +
+ + +

シンタックス

+

以下が基本的なシンタックスです:

+ +
cbrestore [options] [backup-dir] [destination]
+ + + +

以下に、フルバックアップ実行後、2度増分バックアップする場合の例を示します。

+ + +

+cbbackup http://HOST:8091 /backup-42
+cbbackup http://HOST:8091 /backup-42
+cbbackup http://HOST:8091 /backup-42
+         
+ + +

以下に、フルバックアップ実行後、2度差分バックアップを実行し、シングルノードに対してaccumulativeバックアップする例を示します。

+ +

+cbbackup couchbase://HOST:8091 /backup-43 [-m full] --single-node
+cbbackup couchbase://HOST:8091 /backup-43 [-m diff] --single-node
+cbbackup couchbase://HOST:8091 /backup-43 [-m diff] --single-node
+cbbackup couchbase://HOST:8091 /backup-43 -m accu --single-node
+         
+ + +
注: バックアップ・リストアした後、忘れずにインデックスをリビルドしてください。
+ + +
+ + + +

例: クラスタのバックアップ

+

クラスタ全体をバックアップできます。 + このバックアップには、全てのノードに保存された全てのバケット・データ、全てのデザインドキュメントが含まれます。 + クラスタ全体と全バケットのバックアップは以下のとおりです。

+ +
cbbackup http://HOST:8091 ~/backups \
+          -u Administrator -p password
+
+ +

~/backupsは、データを保存するディレクトリを指定します。 + この操作がされたとき、N1, N2というノードがあり、my_name, saslというバケットがあった場合、cbbackupは、以下のとおりのディレクトリとファイルを作成します:

+ +
~/backups
+        bucket-my_name
+            N1
+            N2
+        bucket-sasl
+            N1
+            N2
+
+ +

+ bucket-my_namebucket-sasl は、データファイルを含むディレクトリであり、N1,N2はクラスタ内の各ノードの2つのデータセットです。 +

+ + + +
+ + +

例: 1つのバケットのバックアップ

+

クラスタ内の1つのバケットのバックアップ方法は以下です:

+ + +
cbbackup http://HOST:8091 /backups/backup-20120501 \
+  -u Administrator -p password \
+  -b default
+
+ +

このケースでは、クラスタ内のdefaultバケットが指定され、defaultバケットのデータがバックアップされます。 +

+ + +
+ + + +

例: 複数バケットのバックアップ

+

シングルノードの複数のバケットからデータをバックアップする場合:

+ +
> cbbackup http://HOST:8091 /backups/ \
+  -u Administrator -p password \
+  --single-node
+
+ +

シングルノードの1つのバケットからデータをコピーする場合:

+ +
cbbackup http://HOST:8091 /backups \
+  -u Administrator -p password \
+  --single-node \
+  -b bucket_name
+
+ +
+ + +

例: キーのバックアップ

+

- kオプションを使うことで、バックアップするキーを特定することが出来ます。例えば、 + バケット内で‘object’というプレフィックスを持つキーを全てバックアップする場合:

+ + +
> cbbackup http://HOST:8091 /backups/backup-20120501 \
+  -u Administrator -p password \
+  -b bucket_name \
+  -k '^object.*'
+
+ +
+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/CLI/cbcli-intro.html b/preview/contents/CLI/cbcli-intro.html new file mode 100644 index 0000000..1053c9d --- /dev/null +++ b/preview/contents/CLI/cbcli-intro.html @@ -0,0 +1,176 @@ +couchbase-cliツール
+

couchbase-cliツール

+ + +

couchbase-cliツールはクラスタ規模の操作を実行する際に利用します。

+ +

説明

+

couchbase-cliツールはプラットフォームごとに以下のパスに配置されています。 このツールはクラスタ全体に対して、クラスタ内で分散されているバケットに対して、もしくはクラスタ内の単一ノードに対して操作を実行できます。 例えば、このツールを使ってデータバケットを作成すると、クラスタ内のすべてのノードでそのバケットへアクセスできます。

+ + +

このツールはCouchbase Serverクラスタ、ノード、バケットに対する様々な管理操作へのアクセスを提供します。

+ +
注: これらの設定の多くはREST APIを利用して実行できます。
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オペレーティングシステムディレクトリの場所
Linux/opt/couchbase/bin/couchbase-cli
WindowsC:\Program Files\Couchbase\Server\bin\couchbase-cli.exe
Mac OS X/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/couchbase-cli
+
+ + + +
+ + +

couchbase-cliのオプション

+

couchbase-cliツールには以下の共通オプションがあります:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. couchbase-cliコマンドオプション
オプション説明
-u USERNAME, --user=USERNAMEクラスタの管理者ユーザ名
-p PASSWORD, --password=PASSWORDクラスタの管理者ユーザパスワード
-o KIND, --output=KINDドキュメント種別: JSON あるいは standard
-d, --debugデバッグ情報の出力
-h, --helpヘルプ情報
+
+ + +
注: ユーザ名は環境変数のCB_REST_USERNAME、パスワードは環境変数のCB_REST_PASSWORDで指定することもできます。
+ +
+ + +

シンタックス

+

基本となるフォーマット:

+ +
couchbase-cli COMMAND [bucket-name] CLUSTER [OPTIONS]
+		
+ +

ここで:

+ +
    +
  • COMMANDにCLIコマンドを指定します。
  • + +
  • CLUSTERにはクラスタの情報を指定します。 以下の例は短縮系と非短縮系のシンタックスを示しています:
  • + +
+ +
// Short form
+    -c [host]:[port]
+// Long form
+    --cluster=[host]:[port]
+
+ + +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cbcollect_info_tool.html b/preview/contents/CLI/cbcollect_info_tool.html new file mode 100644 index 0000000..5b5001f --- /dev/null +++ b/preview/contents/CLI/cbcollect_info_tool.html @@ -0,0 +1,413 @@ +cbcollect_info ツール
+

cbcollect_info ツール

+ + +

cbcollect_infoツールは特定ノードの詳細な統計情報を提供します。

+ +

説明

+ +

このツールはノード単位のオペレーションです。 + このコマンドは個別のCouchbase Serverノードから情報を収集します。 + クラスタ全体の診断情報を収集するには、クラスタ内の各ノードに対してコマンドを実行します。 + クラスタ内の複数のノードで問題が発生している場合、クラスタ内のすべてのノードでこれを実行する必要があるでしょう。 +

+ +

このコマンドの実行および必要なすべてのサーバ情報を収集するにはrootアカウントが必要です。 + このツールでアクセスする際にroot権限が必要な、内部のサーバファイルやディレクトリがあります。

+ +

このコマンドを利用するには、Couchbase Serverが稼働するマシンにリモート接続し、コマンドにオプションを指定して実行します。 + このコマンドは一般的にCouchbaseのテクニカルサポートの指示のもとに実行し、大きな.zipファイルを生成します。 + このアーカイブは性能の統計情報やサーバログから抽出した情報を保持するファイルを含んでいます。 +

+ + + +
重要: cbcollect_infoはCouchbaseテクニカルサポートによって利用される最も重要な診断ツールの一つです。
+ + +

このツールは以下の場所にあります

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オペレーティングシステムロケーション
Linux/opt/couchbase/bin/cbcollect_info
WindowsC:\Program Files\Couchbase\Server\bin\cbcollect_info
Mac OS X/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/cbcollect_info
+
+ + +

このツールは以下のログファイルを出力ファイル内に作成します:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ログファイル説明
couchbase.logノードに関するOSレベルの情報。
ddocs.logこのノードでのデザインドキュメントとレプリケーションドキュメントの診断情報。
diag.log稼働中のノードに関するあらゆる内部診断結果(プロセスのリストとステータス、ユーザが閲覧可能なログ、インメモリのステータス, etc)。
ini.logcouchdb .ini ファイルのダンプ。
memcached.logmemcachedのログ。
ns_server.babysitter.logbabysitterのログ。
ns_server.couchdb.logノードの永続化層に関する情報。
ns_server.debug.logこのノードのクラスタ管理コンポーネントに関するデベッグ情報。
ns_server.error.logこのノードのクラスタ管理コンポーネントに関するエラー情報。
ns_server.http_access.log8091ポートに対するHTTPリクエストのログ。
ns_server.info.logこのノードのクラスタ管理コンポーネントに関するINFOレベルの情報。
ns_server.mapreduce_errors.logmap/reduce関数のエラーログ。
ns_server.reports.logErlangサービスのクラッシュレポート。
ns_server.ssl_proxy.logSSLプロキシコンポーネント群。
ns_server.stats.logns_serverの統計情報関連コンポーネントのログ。
ns_server.views.logインデクシングに関わる情報、インデクシングにかかった時間、実行されたクエリ、その他のViewに関する統計情報。
ns_server.xdcr_errors.logns_serverのエラーレベルメッセージ。
ns_server.xdcr.logXDCRのログ。
stats.logノードでのcbstatsオプションを複数回実行した結果。
syslog.tar.gzオペレーティングシステムログのアーカイブ。
+
+ +
+ + +

CLIコマンドとパラメータ

+

以下に利用方法を記載します、output-fileに作成およびCouchbaseテクニカルサポートに送信する.zipファイルの名称を指定します。

+ +
cbcollect_info [options] [output-file]
+ + +

cbcollect_infoコマンドはクラスタ内の個々のノードから統計情報を収集します。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. cbcollect_info オプション
パラメータ説明
-h, --helpこのヘルプ情報を表示します。
-r ROOTルートディレクトリ。 デフォルトは/opt/couchbase/bin/..
-v冗長性レベルを増加させます。 指定すると、cbcollect_infoのデバッグ情報が利用中のコンソールにも出力されます。 +
-pプロダクトに関連する情報のみ収集します。
-dcbcollect_infoが必要とするコマンドのリストをダンプします。
--initargs-INITARGサーバのinitargsパス。
--single-node-diagこのノード上でのノード単位の診断結果を収集する。 デフォルトは接続可能なすべてのノード。
--upload-host=UPLOAD_HOSTログのアップロード先となるホストのFQDN(Fully-Qualified Domain Name)。 + ドメイン名のプロトコルプリフィクス、https://が指定可能。 + これはデフォルトで唯一指定できるプロトコル。
--customer=UPLOAD_CUSTOMER + 顧客名。 最大50文字までの文字列、次の文字のみ指定可能: [A-Za-z0-9_.-] + それ以外の文字を含んでいた場合、リクエストはリジェクトされる。 +
--ticket=UPLOAD_TICKETCouchbaseサポートチケット番号。 この値は最大8文字の文字列、0-9の数値のみ。 チケット番号は任意で、--uploadオプションを指定した場合のみ利用される。 +
+
+ + + +
+ + +

+

解析用の.zipファイルを作成するには、ノードにログインし、cbcollect_infoツールを実行する。

+ +

+cbcollect_info collect.zip
+			
+ +
+ + +

レスポンス

+ +

以下の例はcbcollect_infoコマンド実行結果を部分的に表示しています。

+ +

+uname (uname -a) - OK
+time and TZ (date; date -u) - OK
+raw /etc/sysconfig/clock (cat /etc/sysconfig/clock) - OK
+raw /etc/timezone (cat /etc/timezone) - Exit code 1
+System Hardware (lshw -json || lshw) - Exit code 127
+
+...
+
+adding: /tmp/tmpMYbSyD/couchbase.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/couchbase.log
+adding: /tmp/tmpMYbSyD/ns_server.xdcr.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ns_server.xdcr.log
+adding: /tmp/tmpMYbSyD/ns_server.couchdb.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ns_server.couchdb.log
+adding: /tmp/tmpMYbSyD/stats.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/stats.log
+adding: /tmp/tmpMYbSyD/ini.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ini.log
+adding: /tmp/tmpMYbSyD/ns_server.error.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ns_server.error.log
+adding: /tmp/tmpMYbSyD/ns_server.ssl_proxy.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ns_server.ssl_proxy.log
+adding: /tmp/tmpMYbSyD/ns_server.views.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ns_server.views.log
+adding: /tmp/tmpMYbSyD/ns_server.info.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ns_server.info.log
+adding: /tmp/tmpMYbSyD/ns_server.xdcr_errors.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ns_server.xdcr_errors.log
+adding: /tmp/tmpMYbSyD/ns_server.mapreduce_errors.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ns_server.mapreduce_errors.log
+adding: /tmp/tmpMYbSyD/diag.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/diag.log
+adding: /tmp/tmpMYbSyD/ns_server.http_access.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ns_server.http_access.log
+adding: /tmp/tmpMYbSyD/syslog.tar.gz -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/syslog.tar.gz
+adding: /tmp/tmpMYbSyD/ns_server.debug.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ns_server.debug.log
+adding: /tmp/tmpMYbSyD/ddocs.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ddocs.log
+adding: /tmp/tmpMYbSyD/ns_server.reports.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ns_server.reports.log
+adding: /tmp/tmpMYbSyD/memcached.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/memcached.log
+adding: /tmp/tmpMYbSyD/ns_server.babysitter.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ns_server.babysitter.log
+adding: /tmp/tmpMYbSyD/ns_server.stats.log -> cbcollect_info_ns_1@10.5.2.117_20141209-024045/ns_server.stats.log
+			
+ + +
+ + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/CLI/cbdocloader_tool.html b/preview/contents/CLI/cbdocloader_tool.html new file mode 100644 index 0000000..dbf7212 --- /dev/null +++ b/preview/contents/CLI/cbdocloader_tool.html @@ -0,0 +1,189 @@ +cbdocloader ツール
+

cbdocloader ツール

+ + +

cbdocloaderツールは、指定ディレクトリ内、または単一の.zipファイル内のJSONドキュメントをロードするために利用します。

+ + +

説明

+ +

ドキュメントと関連するViewのデザインドキュメントをロードする際には、以下のようなディレクトリ構造を利用します:

+ +

+/design_docs    // which contains all the design docs for views.
+/docs           // which contains all the raw json data files. This can contain other sub directories too.
+
+ +

アップロードするすべてのJSONファイルは正しいフォーマットのJSONでなければなりません。 ファイル名にスペースは利用できません。

+ + +
エラー種別: +
    +
  • ファイルフォーマット不正
  • + +
  • 認証情報が誤っている
  • + +
  • JSONを格納する新規バケットのRAM割当量がCouchbase Serverの割当量に対して大きすぎる
  • + +
+
+ + +
注: JSONドキュメントとデザインドキュメントの両方をアップロードする際は、すべてのJSONドキュメントの後にデザインドキュメントがアップロードされることに注意してください。
+ + +

このツールはプラットフォームごとに、以下の場所にあります:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オペレーティングシステムロケーション
Linux/opt/couchbase/bin/
WindowsC:\Program Files\Couchbase\Server\bin\
Mac OS X/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/
+
+ +
+ + +

CLIコマンドとパラメータ

+ +

cbdocloaderコマンドでは以下のオプションが利用できます:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. cbdocloader オプション
オプション説明
-h --helpこのヘルプメッセージを表示して終了する。
-u [username], --user=[username]クラスタのRESTユーザ名。 REST_USERNAME環境変数で指定することも可能。
-p [password], --password=[password]クラスタのRESTパスワード REST_PASSWORD環境変数で指定することも可能。
-b [bucket-name], --bucket=[bucket-name]バケット名を指定。 デフォルトはdefaultバケット。 存在しない場合、バケットが作成される。
-n [localhost]:[port] --node=[localhost]:[port] ノードのアドレス。 デフォルトポートは8091。
-s [quota]バケットのRAM割当量、MB。 デフォルトは100MB。
+
+ + +
注: cbdocloaderツールは一般的にCouchbase Server初期インストール中に利用します。
+ + + + +
+ + +

シンタックス

+

基本シンタックス:

+ +

+cbdocloader  -n [localhost]:8091 -u [Administrator] -p [password] -b [bucket-name] [source-file]
+			
+ + +
+ + +

+

以下の例は.zipファイルからJSONをアップロードします:

+ +
cbdocloader -n 10.5.2.117:8091 -u Administrator -p password -b mybucket ../samples/gamesim.zip
+
+ + + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cbepctl-intro.html b/preview/contents/CLI/cbepctl-intro.html new file mode 100644 index 0000000..3db0b90 --- /dev/null +++ b/preview/contents/CLI/cbepctl-intro.html @@ -0,0 +1,462 @@ +cbepctlツール
+

cbepctlツール

+ + +

cbepctlツールはvBucketのステータス、設定、メモリとディスク永続化の挙動をコントロールするために利用します。

+ + +

説明

+

このツールはノード単位、バケット単位のオペレーションです。 + すなわち、クラスタ内のノードのIPアドレスと、バケット名を指定する必要があります。 + バケット名を指定しない場合、指定したノード上に存在するdefaultバケットに設定を反映します。 + クラスタ全体にこの操作を実行するには、コマンドをクラスタに存在する全てのノードとバケットの組み合わせに対して実行します。 +

+ + +

例えば、データバケットが二つのノードに分散しているなら、このコマンドをバケット名と、それぞれのホスト名とポートを指定して、二度実行します。 + 同様に、同一ノード上に二つのデータバケットが存在するなら、各データバケットにつき、計二回実行します。 + ノードを指定しない場合、このコマンドはデフォルトバケットに対して実行され、デフォルトバケットが存在しない場合エラーを返します。 +

+ + +
重要: cbepctlを利用して変更したクラスタの設定は永続化されず、クラスタを再起動すると元に戻ります。
+ + +

ツールは以下の場所にあります:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オペレーティングシステムロケーション
Linux/opt/couchbase/bin/cbepctl
WindowsC:\Program Files\Couchbase\Server\bin\cbepctl.exe
Mac OS X/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/cbepctl
+
+ + +
+ + +

CLIコマンドとパラメータ

+

コマンドの基本シンタックス:

+ +
cbepctl [localhost]:11210 -b [bucket_name] -p [bucket-password] start
+cbepctl [localhost]:11210 -b [bucket_name] -p [bucket-password] stop
+cbepctl [localhost[:11210 -b [bucket_name] -p [bucket-password] set [command-type] [parameter] [value]
+		
+ +

+ hostには、Couchbaseクラスタもしくはクラスタ内のノードのIPアドレスです。 + ポートは常にクラスタ全体の統計情報に利用される標準ポートで、11210となります。 + バケット名とパスワードに続き、コマンドオプションを指定します。 +

+ +

以下のコマンドオプションを利用し永続性の制御を行います:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. cbepctlコマンドオプション
コマンドオプション説明
stop永続化を停止
start永続化を開始
drainキューが空になるまで待機
setcheckpoint_paramflush_paramtap_paramコマンド種別を設定。この変更は永続化がいつどのように実行されるのかを変更します。
+
+ + +

setコマンドオプションでは、checkpoint_paramflush_paramtap_paramのコマンド種別を指定し、Couchbase Serverの永続化に関する挙動を変更します。

+ + +
+ + +

cbepctlでcheckpoint_paramを設定する

+

set checkpoint_paramで利用可能なパラメータ:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
パラメータ説明
chk_max_itemsひとつのチェックポイントで許容する最大アイテム数。
chk_periodチェックポイントのタイムバウンド(秒)。
item_num_based_new_chkオープンなチェックポイント中のアイテム数を元に新規のチェックポイントを作成する場合True。
keep_closed_chks現在のメモリ使用量が高水位を下回る場合にクローズしたチェックポイントをメモリ内に保持する場合True。
max_checkpointsvBucket単位の最大チェックポイント数。
enable_chk_mergeチェックポイントをマージする場合True。
+
+ +
+ + + +

cbepctlでflush_paramを設定する

+ +

set flush_paramで利用可能なパラメータ:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
パラメータ説明
alog_sleep_timeアクセススキャナ間隔(分)
alog_task_timeアクセススキャナ次回実行時刻(UTC)
backfile_mem_threshold該当バケットでバックフィルタスクをバックオフするまでのメモリ閾値(%)。
bg_fetch_delayバックグラウンドでのフェッチ実行を遅延する(テスト用途)。
couch_response_timeoutCouchDBからのレスポンス受信のタイムアウト。
exp_pager_stime有効期限切れページャの間隔。Couchbase Serverがディスクから期限切れアイテムのクリーンアップと削除を実行するまで待つ間隔。
flushall_enabled非推奨。フラッシュを有効化。
pager_active_vb_pcntアイテムページャが除去する全てのアイテム中のアクティブvBucket内アイテムの割合。
max_sizeサーバで利用するメモリの最大量。
mem_high_wat高水位をパーセンテージで指定。
mem_low_wat低水位をパーセンテージで指定。
mutation_mem_thresholdクライアントが一時的なメモリ不足メッセージを受信し始めるまでのキャッシュレイヤで利用可能なRAM容量。
timing_log詳細なタイミング統計情報ログの出力先。
warmup_min_memory_thresholdウォームアップにおいてトラフィックを受け付けるまでのメモリ閾値(%)。
warmup_min_item_thresholdウォームアップにおいてトラフィックを受け付けるまでのアイテム数閾値(%)。
max_num_readersデフォルトの参照オペレーション用グローバルスレッド数をオーバーライドする。
max_num_writersデフォルトの更新オペレーション用グローバルスレッド数をオーバーライドする。
max_num_auxioデフォルトのauxioオペレーション用グローバルスレッド数をオーバーライドする。
max_num_nonioデフォルトのnonioオペレーション用グローバルスレッド数をオーバーライドする。
+
+ + +
+ + +

cbepctlでtap_paramを設定する

+

set tap_paramで利用可能なパラメータ:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
パラメータ説明
tap_keepalive指定のtapコネクションを保持する秒数。
tap_throttle_queue_captapストリームを絞るまでの最大ディスク書込みキューサイズ (infiniteは絞り込みなし)。
tap_throttle_cap_pcnttapインプットを絞る際の書込みキュー内総アイテム数の割合。
tap_throttle_thresholdtapストリームを絞る際に利用するメモリの割合。
+
+ + +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/CLI/cbhealthchecker_tool.html b/preview/contents/CLI/cbhealthchecker_tool.html new file mode 100644 index 0000000..6a5c502 --- /dev/null +++ b/preview/contents/CLI/cbhealthchecker_tool.html @@ -0,0 +1,311 @@ +cbhealthcheckerツール
+

cbhealthcheckerツール

+ + +

cbhealthcheckerツールは、 Cluster + Health Check Report という名前のクラスタのヘルスレポートを生成します。

+ +

説明

+

レポートは管理者、開発者、テスターがクラスタが健全な状態かどうか、問題を未然に防ぐために解決されるべき問題があるか、または直ちに解決すべき問題があるかどうかを判断するために有用なデータを提供します。

+ +

このツールはCouchbase Serverモニタリングシステムからデータを取得し、タイムスケールで集約し、閾値に対して統計情報を分析し、レポートを生成します。 cbstatscbtransferなど、TAPプロトコルを利用してモニタリングシステムからデータを取得する他のコマンドラインツールと異なり、cbhealthcheckerはREST APIとmemcachedプロトコルを利用してデータを取得します。

+ +

以下のタイムスケールでレポートを生成できます: minute, hour, day, week, month, year。 このツールはHTMLファイル、テキストファイル、JSONファイルを出力します。 各ファイルは同一の情報を含んでいます - 唯一の違いは情報のフォーマットだけです。 すべてのcbhealthcheckerの出力は、reportsフォルダに保存されます。 このツールはそのフォルダからファイルを削除しません。 + reportsフォルダのサイズが肥大化した場合は、手動でファイルを削除してください。 + 実行が完了すると、出力ファイルのパスが表示されます。

+ +
注: cbhealthcheckerはCouchbase Serverと共に自動的にインストールされます。 + ツールは、プラットフォームに応じて、以下の場所に存在します:
+ +
+ + +

CLIコマンドとパラメータ

+

このツールには以下のオプションがあります:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オプションシンタックス説明
CLUSTER-c HOST[:PORT] + --cluster=HOST[:PORT]クラスタ内ノードのホスト名とポート。 デフォルトポートは8091。
USERNAME-u USERNAME + --user=USERNAMEクラスタの管理者ユーザ名。
PASSWORD-p PASSWORD + --password=PASSWORDクラスタの管理者ユーザパスワード。
OPTIONS-b BUCKETNAME + --bucket=BUCKETNAMEレポートするバケット名。 デフォルトはすべてのバケット。
 -i FILENAME + --input=FILENAMEJSON入力ファイルから分析レポートを生成する。
 -o FILENAME + --output=FILENAMEHTMLレポートのファイル名、デフォルトの出力ファイル名はレポートのタイムスタンプ、例: + 2013-07-26_13-26-23.html.
 -h + --helpヘルプメッセージを表示して終了する。
 -s SCALE + --scale=SCALE統計情報のタイムスパン(スケール): minute, hour, day, week, month, year。 デフォルトのタイムスパンはday。
 -j + --jsononlyデータを収集し、JSONファイルのみを出力する。 このオプションを利用すると、分析レポートは生成されません。
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オペレーティングシステムロケーション
Linux/opt/couchbase/bin/
WindowsC:\Program Files\Couchbase\Server\bin\
Mac OS X/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/
+
+ +
+ + +

シンタックス

+

cbhealthcheckerコマンドのフォーマットは以下の通りです:

+ +
cbhealthchecker CLUSTER USERNAME PASSWORD OPTIONS
+
+ +
+ + + + + +

+

以下のコマンドはクラスタ内のすべてのバケットに対し、過去の日次レポートを実行します:

+ +
cbhealthchecker -c 10.3.1.10:8091 -u Administrator -p password
+
+bucket: default
+  node: 10.3.1.10 11210
+  node: 10.3.1.11 11210
+................................
+
+The run finished successfully.
+Please find html output at '/opt/couchbase/bin/reports/2013-07-23_16-29-02.html'
+and text output at '/opt/couchbase/bin/reports/2013-07-23_16-29-02.txt'.
+
+ +

以下のコマンドはクラスタ内のすべてのバケットに対し、過去の月次レポートを実行します:

+ +
cbhealthchecker -c 10.3.1.10:8091 -u Administrator -p password -s month
+
+The run finished successfully.
+Please find html output at '/opt/couchbase/bin/reports/2013-07-26_13-26-23.html'
+and text output at '/opt/couchbase/bin/reports/2013-07-26_13-26-23.txt'.
+
+ +

以下のコマンドはbeer-sampleバケットのみの過去の年次レポートを実行し、 + HTMLレポートをbeer-health-report.htmlのファイル名で出力します。

+ +
cbhealthchecker -c 10.3.1.10:8091 -u Administrator -p password -o beer-health-report.html \
+      -b beer-sample -s year
+
+The run finished successfully.
+Please find html output at '/opt/couchbase/bin/reports/beer-health-report.html'
+and text output at '/opt/couchbase/bin/reports/2013-07-26_15-57-11.txt'.
+
+ +

以下のコマンドは統計情報のみをJSONファイルに出力します:

+ +
cbhealthchecker -c 10.3.1.10:8091 -u Administrator -p password -j
+
+The run finished successfully.
+Please find collected stats at '/opt/couchbase/bin/reports/2013-07-26_13-30-36.json'.
+
+ +
+ + + + +

HTMLレポート

+

任意のWebブラウザでHTMLレポートを閲覧できます。 レポートを他の場所にコピーする場合、レポートフォルダ内のすべてのファイルをコピーし、ブラウザで正しくレポートが表示されるようにしてください。 フォルダ内に複数のHTMLレポートがある場合、特定のレポートを表示するにはページのトップにあるタブを利用します。 (タブが表示されない場合、FireFoxをお試しください)

+ +

レポートでは、正常なステータスは緑で、警告は黄色で、直ちにアクションが必要な状態は赤でハイライトされます。 + レポートを閲覧する際、各統計情報にマウスを乗せると、その統計情報の計算方法を解説するメッセージを表示できます。

+ +

レポートは統計情報のスケール、レポート実行日時、クラスタ状態の概要を含むヘッダから始まります。 + 以下の図はレポートヘッダを示します:

+ +
+ +
+ + +

レポートのボディは幾つかのセクションに分かれています: Couchbase — Alerts

+ + +

アラートセクションには直ちにアクションが必要な緊急の問題のリストがあります。 + 各問題に対し、レポートは検知された症状、問題の深刻度、推奨する対策を表示します。 + このセクションは緊急の問題が検知された場合のみ表示されます。 + 以下の図はレポートのアラートセクションの一部を表示しています:

+ + +
+ + + +

Couchbase Cluster Overview:

+ + +

クラスタ概要のセクションにはクラスタ全体でのメトリックと、クラスタ内の各バケットと各ノードのメトリックがあります。 + このセクションはすべてのレポートで表示されます。 以下の図はレポートのクラスタ概要セクションの一部を表示しています:

+ + +
+ + + +

Couchbase — Warning Indicators:

+ + +

警告インジケータセクションには注意すべき問題のリストがあります。 各問題に対し、レポートは検知された症状、問題の深刻度、推奨する対策を表示します。 このセクションは警告すべき問題が検知された場合のみ表示されます。 以下の図はレポートの警告インジケータセクションの一部を表示しています:

+ + +
+ +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/CLI/cbreset_password_tool.html b/preview/contents/CLI/cbreset_password_tool.html new file mode 100644 index 0000000..178a58f --- /dev/null +++ b/preview/contents/CLI/cbreset_password_tool.html @@ -0,0 +1,123 @@ +cbreset_password ツール
+

cbreset_password ツール

+ + +

cbreset_passwordツールは管理者または参照専用ユーザのパスワードをリセットするために利用します。

+ +

説明

+

このツールはプラットフォームに応じて以下の場所に存在します:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オペレーティングシステムロケーション
Linux/opt/couchbase/bin/
WindowsC:\Program Files\Couchbase\Server\bin\
Mac OS X/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/
+
+ +
+ + +

シンタックス

+

管理者のパスワードをリセットするには:

+ +
cbreset_password [hostname]:[port]
+ +

結果は以下のように表示されます:

+ +
Please enter the new administrative password (or <Enter> for system generated password):
+
+ +

6文字以上のパスワードを入力するか、システムが生成したパスワードを利用します。 + パスワードを入力するか、生成されたものを受容した後にシステムは確認を求めます:

+ +
Running this command will reset administrative password.
+Do you really want to do it? (yes/no)yes
+
+ +
+ + +

+

以下の例はパスワードをリセットし、成功のレスポンスを表示しています。

+ +

+# cbreset_password 10.5.2.117:8091
+
+Please enter the new administrative password (or <Enter> for system generated password):
+
+Running this command will reset administrative password.
+Do you really want to do it? (yes/no)yes
+Resetting administrative password...
+Password for user Administrator was successfully replaced.
+			
+ +
+ + +

レスポンス

+

以下の例はシステムが生成したパスワードを表示しています。

+ +
Resetting administrative password...
+Password for user Administrator was successfully replaced. New password is Uxye76FJ
+
+ +
+ + +

エラーレスポンス

+

このコマンドではいくつかのエラーが発生する可能性があります:

+ +
{error,<<"The password must be at least six characters.">>}
+
+{error,<<"Failed to reset administrative password. Node is not initialized.">>}
+
+ +

最初のエラーメッセージはパスワードが十分な長さでないことを示しています。 二つ目のエラーメッセージはCouchbase Serverがまだセットアップされて稼働していないことを示しています。

+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cbrestore-ddocs.html b/preview/contents/CLI/cbrestore-ddocs.html new file mode 100644 index 0000000..6d7c434 --- /dev/null +++ b/preview/contents/CLI/cbrestore-ddocs.html @@ -0,0 +1,74 @@ +デザインドキュメントのリストア
+

デザインドキュメントのリストア

+ + +

デザインドキュメントはdesign_doc_only=1オプションを利用してリストアできます。

+ +

説明

+

デザインドキュメントは、design_doc_only=1オプションを指定してサーバノードへとリストアできます。 ドキュメントはバックアップファイルからリストアされます (cbbackupツールで作成)。

+ +
+ + +

シンタックス

+

基本シンタックス:

+ +

+cbrestore [backup-location] http://[localhost]:8091 -x design_doc_only=1 -b [source-bucket] -B [destination-bucket]
+      
+ +
+ + +

+

以下の例はバックアップファイル、~/backup/a_bucket からデザインドキュメントを、クラスタ内のリストア先バケット、my_bucketへとリストアします。

+ +

+cbrestore ~/backup http://10.3.1.10:8091 -x design_doc_only=1 -b a_bucket -B my_bucket
+
+ +
複数のソースバケットがバックアップされている場合、このコマンドは複数回実行する必要があります。 + 以下の例では、二つのバケットを持つクラスタがバックアップされ、次のバックアップファイルがあります: +
    +
  • ~/backup/bucket_one/design.json
  • + +
  • ~/backup/bucket_two/design.json
  • + +
+
+ + +

次のコマンドはクラスタ内のmy_bucket バケットへと、両バックアップファイルのデザインドキュメントをリストアします。

+ + +

+cbrestore ~/backup http://10.3.1.10:8091 -x design_doc_only=1 -b bucket_one -B my_bucket
+
+cbrestore ~/backup http://10.3.1.10:8091 -x design_doc_only=1 -b bucket_two -B my_bucket
+
+ + +
+ + +

レスポンス

+

以下はリストア成功のレスポンス例です。

+ +

+transfer design doc only. bucket msgs will be skipped.
+done
+      
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cbrestore-tween-opsys.html b/preview/contents/CLI/cbrestore-tween-opsys.html new file mode 100644 index 0000000..a2b062e --- /dev/null +++ b/preview/contents/CLI/cbrestore-tween-opsys.html @@ -0,0 +1,50 @@ +異なるオペレーティングシステム間のリストア
+

異なるオペレーティングシステム間のリストア

+ + +

データをバックアップしたオペレーティングシステムと異なるオペレーティングシステムへとリストアするには、cbrestoreツールで restore=1オプションを指定します。

+ +

説明

+

Mac OS Xは、LinuxやWindowsのインストールと異なるvBucket数で設定されています。 このため、LinuxやWindowsのバックアップからMac OS Xへのリストア、またはMac OS XのバックアップからLinux/Windowsへリストアする際には、rehash=1オプションを指定する必要があります。

+ + +

データのバックアップには(いかなるオペレーティングシステムでも)、標準のcbbackupツールとオプションを利用します。

+ + +

例、Mac OS X:

+ +
cbbackup http://[Administrator]:[password]@[mac-hostname]:8091 /macbackup/today
+ + +

例、Linux:

+ +
cbbackup [Administrator]:[password]@[linux-hostname]:8091 /linuxbackup/today
+ +
+ + +

シンタックス

+

異なるオペレーティングシステムのクラスタへとデータをリストアするには、8091ポートに接続し、rehash=1オプションを指定して情報を再ハッシュし、クラスタ内の適切なノードへとデータを分散させます。 rehash=1は各アイテムのパーティションIDを再ハッシュします。 Mac OS XサーバからMac OS X以外のクラスタへのデータ転送など、異なるパーティション数のクラスタ間でデータを転送する場合に必要。

+ +
cbrestore backup 
+  -u [username] -p [password] 
+  -x rehash=1
+  http://[localhost]:8091 
+  --bucket-source [my_bucket] 
+  --bucket-destination [my_bucket]
+ +
注: 複数のバケットをMac OS Xからバックアップし、LinuxやWindowsへとリストアする場合、各バケットは個別にリストアする必要があります。
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cbrestore_tool.html b/preview/contents/CLI/cbrestore_tool.html new file mode 100644 index 0000000..4537dfe --- /dev/null +++ b/preview/contents/CLI/cbrestore_tool.html @@ -0,0 +1,417 @@ +cbrestore ツール
+

cbrestore ツール

+ + +

cbrestoreツールはクラスタ全体、またはクラスタ内の単一のバケットに、ファイルからデータをリストアします。

+ +

説明

+ +

ディスク上のファイルに書き込まれたアイテムはRAMへリストアされます。cbbackupcbrestorecbtransferツールはクラスタ外のサーバノードの外部IPアドレスとは通信できません。 + バックアップ、リストア、転送のオペレーションはCouchbaseクラスタ内のノードのデータに対して実行されます。 + これらはクラスタから取得したノードリスト内のノードとのみ通信します。 + Couchbase ServerがデフォルトIPアドレスを利用してインストールされた場合、外部ホスト名を利用してアクセスすることはできません。

+ +

このツールは以下の場所にあります:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オペレーティングシステムロケーション
Linux/opt/couchbase/bin/cbrestore
WindowsC:\Program Files\Couchbase\Server\bin\cbrestore
Mac OS X/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/cbrestore
+
+ +
+ + +

CLIコマンドとパラメータ

+ +

コマンドの基本シンタックス:

+ +
cbrestore [options] [backup-dir] [destination]
+ + + + +

ここで:

+
    +
  • [options]

    cbrestoreのオプションはcbtransferと同一です。

    +
  • + +
  • [backup-dir]

    リストアするデータが保存されているバックアップディレクトリ。 これはcbbackupでバックアップを実行した際に作成されるディレクトリです。

    +
  • + +
  • [destination]

    情報をリストアする先のバケット。 + 存在するクラスタ内のバケットです。 クラスタ内の単一のノードへデータをリストアする場合、リストアされるノードのホスト名とポートを指定します。 完全なデータバケットをリストアする場合、クラスタ内のいずれかのノードURLを指定します。

    +
  • + +
+ + +
重要: リストア前にリストア先のバケットを作成してください。
+ + +

以下のコマンドオプションが利用できます:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. cbrestore オプション
パラメータ説明
-h, –helpコマンドラインヘルプ。
-a, –addリストア先の既存アイテムを上書きしない。 setの代わりにaddを利用する。
-b BUCKET_SOURCE, --bucket-source=BUCKET_SOURCEバックアップディレクトリから単一のバケットをリストアする。 バックアップディレクトリにバケットが一つしか存在しない場合、そのバケットが自動的に利用されます。
-B BUCKET_DESTINATION, –bucket-destination=BUCKET_DESTINATION--bucket-sourceを指定していた場合、リストア先のバケット名をオーバライドする。 + このため、異なるバケットへのリストアが可能。 デフォルトはbucket-sourceのバケット。
from-date=FROM_DATEyyyy-mm-ddで指定した日付からのデータをリストアする。 デフォルトでは、最初からすべてのデータをリストアする。
to-date=TO_DATEyyyy-mm-ddで指定した日付までのデータをリストアする。 デフォルトでは、バックアップされたすべてのデータがリストアされます。
-i ID, –id=IDvBucket IDに一致したアイテムのみを転送する。
-k KEY, –key=KEY正規表現とマッチするキーのアイテムのみを転送する。
-n, –dry-run転送は実行しない。 パラメータ、ファイル、接続、設定の検証のみ。
-u USERNAME, –username=USERNAMEソースクラスタまたはサーバノードのRESTユーザ名。
-p PASSWORD, –password=PASSWORDクラスタまたはサーバノードのRESTパスワード
-t THREADS, –threads=THREADS転送を実行するワーカスレッドの並列数。
-v, –verbose冗長なロギング。 vの数を増やすとより冗長となる。 最大: -vvv。
-x EXTRA, –extra=EXTRA一般的ではない拡張パラメータを指定する。 カンマ区切りの key=val(key-val)* ペア。
+
+ +

以下に、cbrestore -xパラメータで利用する特別なオプションを記載します。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 2. cbrestore -x オプション
-x オプション説明
backoff_cap=10リバランス中の最大バックオフ時間。
batch_max_bytes=400000指定したバイト数をバッチで転送。
batch_max_size=1000指定したドキュメント数をバッチで転送。
cbb_max_mb=100000指定したMBを越えると、宛先クラスタでのバックアップファイルを分割。
conflict_resolve=1デフォルトでは、コンフリクトの解決は無効。
data_only=01を指定すると、バックアップファイルまたはクラスタからデータのみを転送。
design_doc_only=01を指定すると、バックアップファイルまたはクラスタからデザインドキュメントのみを転送。 デフォルト: 0。
max_retry=10転送失敗時の最大連続リトライ回数。
mcd_compatible=10を指定すると、拡張フィールドを標準出力に出力。
nmv_retry=10または1、1はNOT_MY_VBUCKETメッセージ後にリトライする。 デフォルト: 1。
recv_min_bytes=4096各TCP/IPバッチ転送のバイト数。
rehash=01を指定すると、各アイテムのパーティションIDを再ハッシュ。 + Mac OS XサーバからMac OS X以外のクラスタへのデータ転送など、異なるパーティション数のクラスタ間でデータを転送する場合に必要。
report=5コンソール上の進捗バーを更新するまでに転送するバッチ数。
report_full=2000コンソールに進捗状況を表示するまでに転送するバッチ数。
seqno=0デフォルトは、seqnoの最初から。
try_xwm=1ドキュメントをメタデータ付きで転送。 デフォルト: 1。 0は1.8.xから1.8.xへの転送でのみ利用する。
uncompress=01を指定すると、非圧縮モードでデータをリストアする。
+
+ +
+ + +

シンタックス

+

基本シンタックス:

+ +
cbrestore [options] [backup-dir] [destination]
+ + + +

シンタックス例:

+ + +

+cbrestore /backups/backup-42 http://HOST:8091 \
+  --bucket-source=default --from-date=2014-01-20 --to-date=2014-03-31
+cbrestore /backups/backup-42 couchbase://HOST:8091 \
+  --bucket-source=default
+cbrestore /backups/backup-42 memcached://HOST:11211 \
+  --bucket-source=sessions --bucket-destination=sessions2
+			
+ + + +
+ + + + + + + + + + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/CLI/cbstats-intro.html b/preview/contents/CLI/cbstats-intro.html new file mode 100644 index 0000000..ab0b233 --- /dev/null +++ b/preview/contents/CLI/cbstats-intro.html @@ -0,0 +1,308 @@ +cbstats ツール
+

cbstats ツール

+ + +

cbstatsツールはノード単位、またはクラスタ単位の性能やストレージ内アイテムに関する統計情報を取得するために利用します。

+ + +

説明

+

cbstatsツールはノード、バケット単位のオペレーションです。 + すなわち、クラスタ内のノードのIPアドレスと、バケット名を指定する必要があります。 + バケット名を指定しない場合、指定したノード上に存在するdefaultバケットに設定を反映します。 + クラスタ全体にこの操作を実行するには、コマンドをクラスタに存在する全てのノードとバケットの組み合わせに対して実行します。

+ + +

ツールは以下の場所にあります:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
プラットフォームロケーション
Linux/opt/couchbase/bin/cbstats
WindowsC:\Program Files\Couchbase\Server\bin\cbstats.exe
Mac OS X/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/cbstats
+
+ + + +
+ + +

CLIコマンドとパラメータ

+

このツールはCouchbaseノードの統計情報の取得に利用します。 このコマンドの一般的なフォーマットは:

+ +

+cbstats [host]:11210 [command] -b [bucket-name] -p [bucket-password]
+			
+ + + + + +

利用可能なcommandは以下の通りです。 alltimingsコマンドはクラスタやノードの性能を理解するために利用します。 これらのコマンドの多くは主にCouchbase内部で、カスタマーサポートインシデントの解決に利用されます。

+ + + +

+all
+allocator
+checkpoint [vbid]
+config
+dcp
+dcp-takeover vb name
+dcpagg
+diskinfo [detail]
+dispatcher [logs]
+failovers [vbid]
+hash [detail]
+items (memcached bucket only)
+key keyname vbid
+kvstore
+kvtimings
+memory
+prev-vbucket
+raw argument
+reset
+runtimes
+scheduler
+slabs (memcached bucket only)
+tap [username password]
+tap-takeover vb name
+tapagg
+timings
+vbucket
+vbucket-detail [vbid]
+vbucket-seqno [vbid]
+vkey keyname vbid
+warmup
+workload
+
+ +

以下のコマンドオプションが利用できます:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オプション説明
-h, --helpこのヘルプメッセージを表示して終了する。
-aすべてのバケットをイテレートする。 管理者のユーザ名とパスワードが必要。
-b [bucket-name]ステータスを取得するバケット。 デフォルト: default。
-p [password]バケットのパスワード、設定されている場合。
+
+ + + +
+ + +

シンタックス

+

リクエストシンタックス:

+ +

+cbstats [host]:11210 [command]
+			
+ +
+ + +

例: タイミング

+

10.5.2.117のホストでtimingの統計情報を取得するには:

+ +
cbstats 10.5.2.117:11210 timings
+ + +

レスポンス:

+ +

+ disk_commit (1024 total)
+    0 - 1s : (100.00%) 1024 ###################################################
+    Avg    : (     1s)
+ get_stats_cmd (30663276 total)
+    0 - 1us       : (  0.05%)    14827 
+    1us - 2us     : (  6.56%)  1995778 ##
+    2us - 4us     : ( 41.79%) 10804626 ##############
+    4us - 8us     : ( 45.20%)  1044043 #
+    8us - 16us    : ( 45.49%)    89929 
+    16us - 32us   : ( 45.90%)   124472 
+    32us - 64us   : ( 46.38%)   148935 
+    64us - 128us  : ( 56.17%)  2999690 ###
+    128us - 256us : ( 68.57%)  3804009 ####
+    256us - 512us : ( 69.91%)   411281 
+    512us - 1ms   : ( 78.77%)  2717402 ###
+    1ms - 2ms     : ( 96.36%)  5391526 #######
+    2ms - 4ms     : ( 99.05%)   826345 #
+    4ms - 8ms     : ( 99.96%)   278727 
+    8ms - 16ms    : (100.00%)    11443 
+    16ms - 32ms   : (100.00%)      217 
+    32ms - 65ms   : (100.00%)       19 
+    65ms - 131ms  : (100.00%)        7 
+    Avg           : (  347us)
+ disk_vbstate_snapshot (93280 total)
+    32us - 64us   : ( 15.34%) 14308 ######
+    64us - 128us  : ( 74.74%) 55413 #########################
+    128us - 256us : ( 91.39%) 15532 #######
+    256us - 512us : ( 95.69%)  4007 #
+    512us - 1ms   : ( 99.49%)  3546 #
+    1ms - 2ms     : ( 99.95%)   423 
+    2ms - 4ms     : ( 99.99%)    43 
+    4ms - 8ms     : (100.00%)     4 
+    2s - 4s       : (100.00%)     4 
+    Avg           : (  190us)
+ notify_io (4 total)
+    4us - 8us   : ( 25.00%) 1 ############
+    16us - 32us : ( 75.00%) 2 ########################
+    32us - 64us : (100.00%) 1 ############
+    Avg         : (   17us)
+			
+ + + + +
+ + +

例: 他のCLIツールと利用する

+ +

+ cbstatsの出力は、watchコマンドなど、他のコマンドラインツールと組み合わせ、データのソートやフィルタを実行できます。 +

+ + +
watch --diff "cbstats \
+    ip-10-12-19-81:11210 -b bucket_name -p bucket_password all | egrep 'item|mem|flusher|ep_queue|bg|eje|resi|warm'"
+
+ +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/CLI/cbtransfer_tool.html b/preview/contents/CLI/cbtransfer_tool.html new file mode 100644 index 0000000..0b200cc --- /dev/null +++ b/preview/contents/CLI/cbtransfer_tool.html @@ -0,0 +1,498 @@ +cbtransfer ツール
+

cbtransfer ツール

+ + +

cbtransferツールはクラスタ間やファイルとクラスタ間でデータを転送する際に利用します。

+ +

説明

+ +

クラスタやファイル間でデータを転送することに加え、cbtransferツールは、稼働していないノードからデータをコピーすることもできます。 このツールはcbbackupcbrestoreが内部で利用している共通のデータ転送ツールです。 これは軽量のExtract-Transform-Load (ETL)ツールで、データをソースから宛先へと移動します。 ソースと宛先のパラメータは同様でURLやファイルパスとなります。

+ +
注: このツールの最も重要な利用方法はクラスタではすでに稼働していないCouchbaseノードからデータを転送することです。 + cbbackupcbrestorecbtransferツールはクラスタ外部のサーバノードの外部IPアドレスとは通信しません。 バックアップ、リストア、転送のオペレーションはCouchbaseクラスタ内のノードのデータに対して実行されます。 これらはクラスタから取得したノードリスト内のノードとのみ通信します。 Couchbase ServerがデフォルトIPアドレスを利用してインストールされた場合、外部ホスト名を利用してアクセスすることはできません。
+ +
注: Couchbase Serverはデザインドキュメントを転送しません。 デザインドキュメントをバックアップするには、cbbackupを利用して情報を保存し、cbrestoreでメモリへと読み込みます。
+ +

このツールは以下の場所にあります:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オペレーティングシステムロケーション
Linux/opt/couchbase/bin/
WindowsC:\Program Files\Couchbase\Server\bin\
Mac OS X/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/
+
+ +
+ + +

CLIコマンドとパラメータ

+ +

コマンドの基本シンタックス:

+ +
cbtransfer [options] source destination
+ +

以下のコマンドオプションが利用できます:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. cbtransfer オプション
パラメータ説明
-h, –helpコマンドラインヘルプ。
-b BUCKET_SOURCE転送するソースクラスタのバケット名。
-B BUCKET_DESTINATION, –bucket-destination=BUCKET_DESTINATION転送先クラスタのバケット名。 ソースバケットとは異なる名前のバケットへの転送が可能。 指定しない場合、デフォルトはbucket-sourceのバケット。
-i ID, –id=IDvBucket IDに一致したアイテムのみを転送する。
-k KEY, –key=KEY正規表現とマッチするキーのアイテムのみを転送する。
-n, –dry-runパラメータ、ファイル、接続、設定の検証のみ。
-u USERNAME, –username=USERNAMEソースクラスタまたはサーバノードのRESTユーザ名。
-p PASSWORD, –password=PASSWORDクラスタまたはサーバノードのRESTパスワード
-t THREADS, –threads=THREADS転送を実行するワーカスレッドの並列数。 デフォルト: 4。
-v, –verbose冗長なロギング; より冗長となる。
-x EXTRA, –extra=EXTRA一般的ではない拡張パラメータを指定する。
–single-nodeソースクラスタの単一サーバから転送する。 この単一サーバノードはソースノードのURL。
–source-vbucket-state=SOURCE_VBUCKET_STATE'active' (デフォルト) または 'replica' で、指定したステータスのvBucketからのみ転送する。 Couchbaseクラスタをソースに利用する必要がある。
–destination-vbucket-state=DESTINATION_VBUCKET_STATE'active' (デフォルト) または 'replica' で、指定したステータスのvBucketのみに転送する。 Couchbaseクラスタを宛先に利用する必要がある。
–destination-operation=DESTINATION_OPERATION転送時にこのオペレーションを実施する。 + "set"は既存のドキュメントを上書きし、'add'は上書きしない、'get'はソースクラスタから取得したすべてのキーを宛先のキャッシュ層にロードする。
/path/to/filenameサーバから.csvファイルに出力するか、.csvファイルをサーバにインポートする。 +
+
+ +

以下に、cbtransfer -xパラメータで利用する特別なオプションを記載します。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 2. cbtransfer -x オプション
-x オプション説明
backoff_cap=10リバランス中の最大バックオフ時間。
batch_max_bytes=400000指定したバイト数をバッチで転送。
batch_max_size=1000指定したドキュメント数をバッチで転送。
cbb_max_mb=100000指定したMBを越えると、宛先クラスタでのバックアップファイルを分割。
conflict_resolve=1デフォルトでは、コンフリクトの解決は無効。
data_only=01を指定すると、バックアップファイルまたはクラスタからデータのみを転送。
design_doc_only=01を指定すると、バックアップファイルまたはクラスタからデザインドキュメントのみを転送。 デフォルト: 0。
max_retry=10転送失敗時の最大連続リトライ回数。
mcd_compatible=10を指定すると、拡張フィールドを標準出力に出力。
nmv_retry=10または1、1はNOT_MY_VBUCKETメッセージ後にリトライする。 デフォルト: 1。
recv_min_bytes=4096各TCP/IPバッチ転送のバイト数。
rehash=01を指定すると、各アイテムのパーティションIDを再ハッシュ。 + Mac OS XサーバからMac OS X以外のクラスタへのデータ転送など、異なるパーティション数のクラスタ間でデータを転送する場合に必要。
report=5コンソール上の進捗バーを更新するまでに転送するバッチ数。
report_full=2000コンソールに進捗状況を表示するまでに転送するバッチ数。
seqno=0デフォルトは、seqnoの最初から。
try_xwm=1ドキュメントをメタデータ付きで転送。 デフォルト: 1。 0は1.8.xから1.8.xへの転送でのみ利用する。
uncompress=01を指定すると、非圧縮モードでデータをリストアする。
+
+ +
+ + +

シンタックス

+

基本シンタックス:

+ +
cbtransfer [options] source destination
+ + + +

シンタックス例:

+ + +

+cbtransfer http://SOURCE:8091 /backups/backup-42
+cbtransfer /backups/backup-42 http://DEST:8091
+cbtransfer /backups/backup-42 couchbase://DEST:8091
+cbtransfer http://SOURCE:8091 http://DEST:8091
+cbtransfer file.csv http://DEST:8091
+			
+ + + +
+ + +

例: クラスタへとデータを転送する

+

以下はクラスタで稼働していないノードからデータを転送する例とそのレスポンスです:

+ +

シンタックス

+ +

+cbtransfer
+	couchstore-files://COUCHSTORE_BUCKET_DIR
+	couchbase://HOST:PORT
+	--bucket-destination=DESTINATION_BUCKET
+			
+ + + +
cbtransfer
+	couchstore-files:///opt/couchbase/var/lib/couchbase/data/default
+	couchbase://10.5.3.121:8091
+	--bucket-destination=foo
+
+ + +

レスポンスは計10000のドキュメントが、1088ドキュメントずつのバッチで転送されたことを示しています。

+ +
[####################] 100.0% (10000/10000 msgs)
+bucket: bucket_name, msgs transferred...
+      : total | last | per sec
+batch : 1088 | 1088 | 554.8
+byte : 5783385 | 5783385 | 3502156.4
+msg : 10000 | 10000 | 5230.9
+done
+
+ +
+ + +

例: 標準出力へデータを転送する

+

以下はノードからすべてのデータを標準出力に転送する例とレスポンスです:

+ +
cbtransfer http://10.5.2.37:8091/ stdout:
+
+set pymc40 0 0 10
+0000000000
+set pymc16 0 0 10
+0000000000
+set pymc9 0 0 10
+0000000000
+set pymc53 0 0 10
+0000000000
+set pymc34 0 0 10
+0000000000
+
+ + +
+ + + +

例: CSVファイルのエクスポートとインポート

+

cbtransfercsvファイルのインポートとエクスポートも可能です。 データはドキュメントとしてCouchbase Serverにインポートされ、サーバからエクスポートしたドキュメントはカンマ区切りの値となります。 バケットに関連するデザインドキュメントは含まれません。

+ +

以下の例では、ドキュメントIDがre-fdeea652a89ec3e9、フラグが0、有効期限が0、CASが4271152681275955のレコードがデフォルトバケットにあるとします。 実際の値は"{""key"".......で始まるハッシュです

+ +
re-fdeea652a89ec3e9,
+0,
+0,
+4271152681275955,
+"{""key"":""re-fdeea652a89ec3e9"",
+ ""key_num"":4112,
+ ""name"":""fdee c3e"",
+ ""email"":""fdee@ea.com"",
+ ""city"":""a65"",
+ ""country"":""2a"",
+ ""realm"":""89"",
+ ""coins"":650.06,
+ ""category"":1,
+ ""achievements"":[77, 149, 239, 37, 76],""body"":""xc4ca4238a0b923820d
+ .......
+""}"
+......
+
+ +

この例ではこれらのアイテムを.csvファイルへとエクスポートします。 http://localhost:8091のノード上の、-b defaultデフォルトバケットからすべてのアイテムを、/data.csvファイルに保存します。 別のバケットを-bオプションで指定すると、そのバケットからすべてのアイテムがエクスポートされます。 クラスタ内のバケットからアイテムをエクスポートする場合、クラスタの認証情報が必要です。

+ +
cbtransfer http://[localhost]:8091 csv:./data.csv -b default -u Administrator -p password
+
+ + +

以下は他のcbtransferシナリオと同様のレスポンス例です:

+ +
[####################] 100.0% (10000/10000 msgs)
+bucket: default, msgs transferred...
+       : total | last | per sec
+ batch : 1053 | 1053 | 550.8
+ byte : 4783385 | 4783385 | 2502156.4
+ msg : 10000 | 10000 | 5230.9
+2013-05-08 23:26:45,107: mt warning: cannot save bucket design on a CSV destination
+done
+
+ +

以下の例は1053のデータをバッチ形式で、秒間550.8バッチ転送していることを示しています。 ツールはデザインドキュメントがエクスポートされないことを示す “cannot save bucket design….” を出力します。 .csvファイルからクラスタ内の任意のバケットへと情報をインポートするには:

+ +
cbtransfer /data.csv http://[hostname]:[port] -B bucket_name -u Administrator -p password
+
+ +

.csvファイルのフォーマットが不正な場合、インポート中に以下のエラーが表示されます:

+ +
w0 error: fails to read from csv file, .....
+
+ + +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cbworkloadgen_tool.html b/preview/contents/CLI/cbworkloadgen_tool.html new file mode 100644 index 0000000..956d9a4 --- /dev/null +++ b/preview/contents/CLI/cbworkloadgen_tool.html @@ -0,0 +1,216 @@ +cbworkloadgen ツール
+

cbworkloadgen ツール

+ + +

cbworkloadgenツールはランダムデータを生成し、参照/更新を実行するために利用します。

+ +

説明

+

cbworkloadgenツールはCouchbase Serverクラスタのテストに便利です。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オプション説明
-h, --helpこのヘルプメッセージを表示して終了する。
-r [number], --ratio-sets=[number]更新ワークロードのパーセンテージ; 残りが参照となる。
-n [localhost]:8091, --node=[localhost]:8091ノードのns_serverのip:port。
-b [bucket-name], --bucket=[bucket-name]デフォルトバケット以外にデータを挿入する場合に指定。
-i [number], --max-items=[number]インサートされるアイテム数。
-s [number], --size=[number]最大バリューサイズ。
--prefix=pymcmemcachedキーまたはJSONのIDに利用するプリフィクス。
-j, --jsonJSONデータを挿入する。
-l, --loopユーザが中断するまで永遠にループする。
-u [username], --username=[username]クラスタまたはサーバのRESTユーザ名。
-p [password], --password=[password]クラスタまたはサーバノードのRESTパスワード。
-t [number], --threads=[number]同時並列スレッド数。
-v, --verbose冗長なロギング; vの数を増やすとより冗長となる。
+
+ + + +

このツールは以下の場所にあります:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オペレーティングシステムLocation
Linux/opt/couchbase/bin/
WindowsC:\Program Files\Couchbase\Server\bin\
Mac OS X/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/
+
+ +
+ + +

シンタックス

+

コマンドの基本シンタックス:

+ +
cbworkloadgen -n [localhost]:8091 -u [username] -p [password] [option]	
+ +
+ + + +

+

例えば、任意のCouchbaseノードのポートに対し負荷をかける場合:

+ +

+cbworkloadgen -n 10.5.2.54:8091
+	-r .9 -i 100000
+	-s 100
+	-b my-other-bucket
+	-t 10
+		
+ +
+ + +

レスポンス

+

成功すると、以下のような結果を返します:

+ +

+  [####################] 100.0% (1111110/estimated 1111110 msgs)
+bucket: default, msgs transferred...
+       :                total |       last |    per sec
+ byte  :            111111000 |  111111000 |   636622.5
+done
+
+ + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cli-cbstats-dcp.html b/preview/contents/CLI/cli-cbstats-dcp.html new file mode 100644 index 0000000..90c9b77 --- /dev/null +++ b/preview/contents/CLI/cli-cbstats-dcp.html @@ -0,0 +1,694 @@ +DCP
+

DCP

+ + + + +
+ データベース変更プロトコル(DCP)に関する統計情報はcbstatsCLIツールから取得可能です。 + 以下の表はcbstatsツールでDCP統計情報取得に利用可能なコマンドの一覧です: + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. DCP統計情報
コマンド説明
dcp個別の接続ごとの統計情報を取得します。
dcpaggプレフィックスにより論理的にグループ化され、集約した統計情報を取得します。
failoversvBucketフェイルオーバログを取得します。
+
+ + + + +

シンタックス

+

DCPに関連するcbstatsリクエストには、以下のコマンドシンタックスを利用してください:

+ +

+cbstats HOST:11210 dcp
+cbstats HOST:11210 dcpagg
+cbstats HOST:11210 failovers
+
+ +
+ + +

例: すべてのDCP統計情報を取得する

+

以下の例ではDCPに関連するすべての統計情報に対するcbstatsのリクエストを示しています。

+ +

+# ./cbstats 10.5.2.54:11210 dcp
+
+ +

コマンドの実行結果は次のようになります。出力結果は非常に長いため、ここでは一部省略しています。

+ +

+ ep_dcp_count:                                                                               6
+ ep_dcp_items_remaining:                                                                     0
+ ep_dcp_items_sent:                                                                          0
+ ep_dcp_producer_count:                                                                      3
+ ep_dcp_queue_backfillremaining:                                                             0
+ ep_dcp_queue_fill:                                                                          0
+ ep_dcp_total_bytes:                                                                         6630
+ ep_dcp_total_queue:                                                                         0
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:connected:                      true
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:created:                        1168
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:pending_disconnect:             false
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:reserved:                       true
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:stream_100_buffer_bytes:        0
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:stream_100_buffer_items:        0
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:stream_100_cur_snapshot_type:   none
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:stream_100_end_seqno:           18446744073709551615
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:stream_100_flags:               0
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:stream_100_items_ready:         false
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:stream_100_last_received_seqno: 0
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:stream_100_opaque:              73
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:stream_100_snap_end_seqno:      0
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:stream_100_snap_start_seqno:    0
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:stream_100_start_seqno:         0
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:stream_100_state:               reading
+ eq_dcpq:replication:ns_1@10.5.2.117->ns_1@10.5.2.54:default:stream_100_vb_uuid:             122364695596024
+ ...
+
+ +
+ + + +

例: 集約したDCP統計情報

+

以下の例では集約したDCP統計情報に対するcbstatsのリクエストを示しています。

+ +

+# ./cbstats 10.5.2.54:11210 dcpagg
+
+ +

コマンドの出力例です:

+ +

+ :total:backoff:                 0
+ :total:count:                   6
+ :total:items_remaining:         0
+ :total:items_sent:              0
+ :total:producer_count:          3
+ :total:total_backlog_size:      0
+ :total:total_bytes:             6630
+ replication:backoff:            0
+ replication:count:              6
+ replication:items_remaining:    0
+ replication:items_sent:         0
+ replication:producer_count:     3
+ replication:total_backlog_size: 0
+ replication:total_bytes:        6630
+
+ +
+ + +

例: フェイルオーバログ

+

以下の例はフェイルオーバログに対するcbstatsリクエストです。実行結果は長いため、一部省略しています。 +

+ +

+# cbstats 10.5.2.54:11210 failovers
+
+ +

コマンド出力結果例の一部です。

+ +

+ vb_1000:0:id:        101754288503529
+ vb_1000:0:seq:       0
+ vb_1000:num_entries: 1
+ ...
+
+ +
+ + +

接続種別によるDCP統計情報

+ +

+ DCPにはconsumer, producer, notifierの接続種別があります。 + 以下の表はconsumer, producer, notifierで利用可能な接続統計情報を示しています。 + 各接続種別にはすべての接続種別で有効な統計情報のグループと、 + 接続内の個別のストリームでのみ有効な統計情報のグループがあります。 +

+ +

+ 各DCP統計情報識別子はep_dcpq:で始まり、一意となるclient_idとコロンが続きます。 + 例えば、クライアントがslave1という名前の場合、createdのDCP統計情報識別子は + ep_dcpq:slave1:createdとなります。 +

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 2. Consumer接続統計情報
名称説明
connectedクライアントが接続済みの場合Trueになります
createdDCP接続の生成時刻です
pending_disconnectクライアントを切断中の場合Trueになります
reservedDCPストリームが予約されている場合Trueになります
supports_ack接続がフロー制御を利用している場合Trueになります
total_acked_bytesconsumerがackした総バイト数です
type接続種別です(producer, consumer, notifier)
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 3. ストリーム単位のConsumer接続統計情報
名称説明
buffer_bytes滞留中のバイト数です
buffer_items滞留中のアイテム数です
end_seqnoこのストリームが終了すべきシーケンス番号です
flagsこのストリーム作成時に指定されたフラグです
items_readyストリームがメッセージを送信する準備ができているかを示します
opaqueストリームの一意な識別子です
snap_end_seqno最後のスナップショット受信時の、開始シーケンス番号です
snap_start_seqno最後のスナップショット受信時の、終了シーケンス番号です
start_seqnoこのストリーム作成時に利用した開始シーケンス番号です
stateストリームの状態です(pending, reading, dead)
vb_uuidこのストリーム作成時に利用したvBucket UUIDです
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 4. Producer, Notifier接続統計情報
名称説明
bytes_sentconsumerに送信されたunack状態の総バイト数です
connectedクライアントが接続済みの場合Trueになります
createdDCPコネクション接続生成時刻です
flow_control接続がフロー制御を利用している場合Trueになります
items_remaining送信待ち状態のアイテム数です
items_sentconsumerに送信済みのアイテム数です
last_sent_time + consumerからのackを受診せずに送信可能な最大バイト数です +
noop_enabledこの接続がnoopを送信するかを示します
noop_waitこの接続がnoopのレスポンスをconsumerから待っているかどうかを示します
pending_disconnectクライアントを切断中の場合Trueになります
reservedDCPストリームが予約されている場合Trueになります
supports_ack接続がフロー制御を利用している場合Trueになります
total_acked_bytes + フロー制御が有効な場合の、consumerからackされたバイトの総数です +
total_bytes_sentconsumerに送信済みのバイト数です
type接続種別です(producer, consumer, notifier)
unacked_bytesconsumerがまだackしていないバイト数です
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 5. Producer and notifier connection per-stream statistics
名称説明
backfilledディスクから送信されたアイテム数です
cur_snapshot_end現在受信中のスナップショットの終了シーケンス番号です
cur_snapshot_start現在受信中のスナップショットの開始シーケンス番号です
cur_snapshot_type現在受信中のスナップショット種別です
end_seqno最終送信データ変化のシーケンス番号です
flagsストリームリクエストで指定されたフラグです
items_readyストリームが送信可能なアイテムを保持しているかを示します
last_sent_seqnoこのストリームから送信された最終シーケンス番号です
memoryメモリから送信されたアイテム数です
opaqueストリームのユニークな識別子です
snap_end_seqno + 最終スナップショット終了シーケンス番号です(consumerがストリームを再開する場合利用されます) +
snap_start_seqno + 最終スナップショット開始シーケンス番号です(consumerがストリームを再開する場合利用されます) +
start_seqnoデータの変化送信を開始するためのシーケンス番号です
stateストリームの状態です(pending, backfilling, in-memory, takeover-send, + takeover-wait, dead)
vb_uuidストリームリクエストで指定されたvBucket UUIDです
+
+ +
+ + +

DCP集約統計情報

+ +

+ DCPは統計情報をプレフィックスで論理的なグループに集約した統計情報を提供します。 + 例えばすべてのDCP接続をxdcr:replication:といった文字列でプレフィックスした場合、 + cbstats dcpagg :コマンドを利用して最初のコロンより前の文字列でグループ化した統計情報をリクエストでき、 + xdcr:replication:で始まる統計情報のセットを集約することができます。 +

+ + +

以下のテーブルはDCP集約統計情報の説明です。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 6. DCP集約統計情報
名称説明
[prefix]:countこのプレフィックスに一致する接続の数です
[prefix]:producer_countプレフィックス単位の総producer接続数です
[prefix]:items_sentプレフィックス単位の総送信済みアイテム数です
[prefix]:items_remainingプレフィックス単位の送信待ちアイテム数です
[prefix]:total_bytesプレフィックス単位の送信済みバイト数です
[prefix]:total_backlog_size + プレフィックス単位の総未送信backfillアイテム数です +
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cli-cluster-wide-info.html b/preview/contents/CLI/cli-cluster-wide-info.html new file mode 100644 index 0000000..e95585c --- /dev/null +++ b/preview/contents/CLI/cli-cluster-wide-info.html @@ -0,0 +1,17 @@ +診断結果の管理
+

診断結果の管理

+ + +

コマンドラインインタフェースはログコレクションの開始、停止、ステータスレポートを実行するコマンドを提供します。

+ +

couchbase-cliツール、もしくは、cbcollect_infoツールを利用してコマンドラインインタフェース経由で診断結果を収集できます。

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cli-failover.html b/preview/contents/CLI/cli-failover.html new file mode 100644 index 0000000..dc23c0d --- /dev/null +++ b/preview/contents/CLI/cli-failover.html @@ -0,0 +1,97 @@ +ノードのフェイルオーバ
+

ノードのフェイルオーバ

+ + +

グレイスフルフェイルオーバまたはハードフェイルオーバ操作によりノードをフェイルオーバできます。 + グレイスフルフェイルオーバがデフォルトです。

+ + +

説明

+
以下のいずれかの方法でノードをフェイルオーバします: +
    +
  • グレイスフルフェイルオーバ
  • + +
  • ハードフェイルオーバ
  • + +
+
+ + +

グレイスフルフェイルオーバは、フェイルオーバ操作の実行前に、受信中のオペレーションの完了を待ち、安全にノードをクラスタからフェイルオーバします。 + グレイスフルフェイルオーバはcouchbase-cli failoverオペレーションのデフォルトの動作です。

+ + +

ハードフェイルオーバは即座にクラスタからノードをフェイルオーバします。 + ハードフェイルオーバを実行するには、--forceオプションを利用します。 + ハードフェイルオーバは一般的に、ノードが不正な状態で利用します。 + 自動フェイルオーバはハードフェイルオーバです。

+ + +
注: フェイルオーバを実行するすべてのスクリプトを更新するように注意してください。
+ +
+ + +

シンタックス

+
couchbase-cli failover
+    --cluster=HOST:PORT
+    --server-failover=HOST:PORT
+    --user=ADMIN 
+    --password=PASSWORD 
+ + +
+ + + +

例: フェイルオーバの設定、再追加、リカバリ、リバランス操作の実行

+

以下の例は、クラスタ内のノードをグレイスフルにフェイルオーバし、ノードをクラスタへ再追加し、ノードのデルタリカバリを実行し、クラスタでリバランスを実行する、フェイルオーバ、再追加、リカバリ、リバランスの一連の操作例を示します。

+ + +

+couchbase-cli failover -c 192.168.0.1:8091 \\	
+    --server-failover=192.168.0.2 \\	
+    -u Administrator -p password	
+				
+couchbase-cli server-readd -c 192.168.0.1:8091 \\	
+    --server-add=192.168.0.2 \\	
+    -u Administrator -p password	
+			
+couchbase-cli recovery -c 192.168.0.1:8091 \\	
+    --server-recovery=192.168.0.2 \\	
+    --recovery-type=delta \\	
+    -u Administrator -p password	
+				
+couchbase-cli rebalance -c 192.168.0.1:8091 \\	
+    -u Administrator -p password          
+      
+ +
+ + +

例: 即座にノードをフェイルオーバする

+

以下の例は、グレイスフルフェイルオーバではなく、ハードフェイルオーバを利用し、即座にノードをフェイルオーバする例です。

+ +

+couchbase-cli failover -c 192.168.0.1:8091 \\	
+    --server-failover=192.168.0.2 \\	
+    --force  \\
+    -u Administrator -p password             
+      
+ +
+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cli-increment-backup.html b/preview/contents/CLI/cli-increment-backup.html new file mode 100644 index 0000000..55b6645 --- /dev/null +++ b/preview/contents/CLI/cli-increment-backup.html @@ -0,0 +1,123 @@ +差分バックアップ
+

差分バックアップ

+ + + +

cbbackupコマンドラインツールを利用して差分バックアップを実行できます。

+ +

説明

+ +
cbbackupコマンドの一般的なフォーマットは: +
cbbackup [options] source backup_dir 
+
+ +

最新のcbbackupツールは差分バックアップをサポートする新しいオプションが追加されました。 ツールは既存のオプションもサポートしています。

+ +

以下の表で、新しいバックアップモードのオプションを解説します:

+ + + +
+ + + + + + + + + + + + + + + + + + + + +
オプション説明
-m MODE, --mode=MODEバックアップモード。 モードオプションは以下のいずれかを指定できます:
+ +
full
+ +
フルバックアップを実行します
+ + + +
diff
+ +
最後に取得したフルあるいは差分バックアップからの変更のみをバックアップする、変更差分バックアップを実行します。
+ + + +
accu
+ +
最終フルバックアップからの変更をすべてバックアップする、累積差分バックアップを実行します。
+ + +
+
+
+ +
+ + +

シンタックス

+

基本シンタックス:

+ +
cbbackup -m [backup-mode] http://[host]:8091 [backup-location]
+ + + +

単一ノードに対する、フルバックアップ、そして、二つの変更差分、一つの累積差分バックアップのシンタックス例。

+ + +

+	cbbackup couchbase://HOST:8091 /backup-43 [-m full] --single-node
+	cbbackup couchbase://HOST:8091 /backup-43 [-m diff] --single-node
+	cbbackup couchbase://HOST:8091 /backup-43 [-m diff] --single-node
+	cbbackup couchbase://HOST:8091 /backup-43 -m accu --single-node
+			
+ + +
注: 新規のシンクロケーションに対してはバックアップモードの指定に関わらず、常にフルバックアップが実行されます。
+ +
+ + +

+ +

以下は指定したクラスタ上のすべてのデータのフルバックアップをリクエストする例です。

+ +
cbbackup -m full http://example.com:8091 /backups/backup-1
+ + + +

初回のフルバックアップを実行後、差分バックアップを実行可能となります。 + 以下は指定したクラスタ上のすべてのデータに対し変更差分バックアップをリクエストする例です:

+ +
cbbackup -m diff http://example.com:8091 /backups/backup-1
+ + +

以下は指定したクラスタ上のすべてのデータに対し累積差分バックアップをリクエストする例です:

+ +
cbbackup -m accu http://example.com:8091 /backups/backup-1
+ +
+ + + +
+ + + +
\ No newline at end of file diff --git a/preview/contents/CLI/cli-incremental-restore.html b/preview/contents/CLI/cli-incremental-restore.html new file mode 100644 index 0000000..863078d --- /dev/null +++ b/preview/contents/CLI/cli-incremental-restore.html @@ -0,0 +1,105 @@ +差分リストア
+

差分リストア

+ + + +

差分リストアオペレーションは、cbrestoreツールを利用して実行します。

+ +

説明

+ +

最新のツールは部分的なリストアオペレーションをサポートするオプションを追加しています。 ツールは完全なリストア用の既存のオプションもサポートしています。

+ +

以下の表で、新しい差分リストアオプションを解説します:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
オプション説明
--from-date=DATE指定した日付からのデータをリストアする。 この日付以前のデータはリストアされない。
--to-date=DATE指定日付までのデータをリストアする。 この日付以降のデータはリストアされない。
+
+ + +
+ 指定するDATEフォーマットは、YYYY-MM-DD:
+ +
YYYY
+ +
4桁数値の年 MM
+ + + +
MM
+ +
2桁数値の月 DD
+ + + +
DD
+ +
2桁数値の日
+ + +
+ +
+ +
+ + +

シンタックス

+

cbrestoreコマンドの一般的なフォーマットは:

+ +
cbrestore [options] [backup_dir] [destination]
+ +
+ + +

+ +

以下の例は、2014年8月1日から2014年8月3日までのデータをリストアします。 ‑b オプションはバックアップファイルからリストアするバケットの名前を指定し、 ‑B オプションはクラスタ内のレストア先のバケット名を指定します。

+ + +
cbrestore -b source-bucket -B destination-bucket --from-date=2014-08-01 --to-date=2014-08-03 /backups/backup-1 http://example.com:8091
+ + +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cli-node-recovery-incremental.html b/preview/contents/CLI/cli-node-recovery-incremental.html new file mode 100644 index 0000000..435ced3 --- /dev/null +++ b/preview/contents/CLI/cli-node-recovery-incremental.html @@ -0,0 +1,113 @@ +ノードのリカバリ
+

ノードのリカバリ

+ + +

ノードをクラスタへ再追加するには、couchbase-cliツールのrecoveryコマンドを--recovery-typeパラメータを指定して実行します。

+ +

説明

+

リカバリオプションにはdeltaまたはfullを指定します。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. リカバリタイプ
オプション説明
--server-recovery=[host]:[port]リカバリするサーバ
--recovery-type=[delta | full]ノードのリカバリで利用する種別 deltaまたはfull。
+
+ + +
+ + +

シンタックス

+
couchbase-cli failover
+    --cluster=HOST:PORT
+    --server-recovery=HOST:PORT
+    --recovery-type=[delta|full]
+    --user=ADMIN 
+    --password=PASSWORD          
+ + + +
+ + + + + +

例: リカバリタイプの設定

+ +

サーバのリカバリにインクリメンタルノードリカバリを設定するには:

+ +
       
+couchbase-cli recovery -c 192.168.0.1:8091	
+    --server-recovery=192.168.0.2	
+    --recovery-type=delta	
+    -u Administrator -p password
+      
+ +
+ + + +

例: フェイルオーバの設定、再追加、リカバリ、リバランス操作の実行

+

以下の例は、クラスタ内のノードをグレイスフルにフェイルオーバし、ノードをクラスタへ再追加し、ノードのデルタリカバリを実行し、クラスタでリバランスを実行する、フェイルオーバ、再追加、リカバリ、リバランスの一連の操作例を示します:

+ + +

+couchbase-cli failover -c 192.168.0.1:8091	
+    --server-failover=192.168.0.2 	
+    -u Administrator -p password	
+				
+couchbase-cli server-readd -c 192.168.0.1:8091 	
+    --server-add=192.168.0.2 	
+    -u Administrator -p password	
+			
+couchbase-cli recovery -c 192.168.0.1:8091 	
+    --server-recovery=192.168.0.2	
+    --recovery-type=delta 	
+    -u Administrator -p password	
+				
+couchbase-cli rebalance -c 192.168.0.1:8091 	
+    -u Administrator -p password          
+      
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/CLI/cli-overview.html b/preview/contents/CLI/cli-overview.html new file mode 100644 index 0000000..216a948 --- /dev/null +++ b/preview/contents/CLI/cli-overview.html @@ -0,0 +1,82 @@ +CLI概要
+

CLI概要

+ + +

コマンドラインツールは様々な機能や操作を実行でき、これらのCLIツールを個別に説明しています。

+ +

説明

+ +

ツールは色々なディレクトリに存在し、対象のツールによって異なります。

+ + +

デフォルトでは、コマンドラインツールは各プラットフォームで以下の場所にインストールされています:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
オペレーティングシステムディレクトリの場所
Linux/opt/couchbase/bin, /opt/couchbase/bin/install, + /opt/couchbase/bin/tools
WindowsC:\Program Files\couchbase\server\bin, + C:\Program Files\couchbase\server\bin\install, + C:\Program Files\couchbase\server\bin\tools
Mac OS X/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin +
+
+
+ + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/CLI/cli-set-disk-priority.html b/preview/contents/CLI/cli-set-disk-priority.html new file mode 100644 index 0000000..82da485 --- /dev/null +++ b/preview/contents/CLI/cli-set-disk-priority.html @@ -0,0 +1,92 @@ +バケット優先度の設定
+

バケット優先度の設定

+ + +

バケットのディスクI/O優先度は + low あるいは high が選択できます。

+ + +

説明

+

バケットのディスクI/O優先度を設定するには、couchbase-cli ツールのbucket-createbucket-editコマンドで、--bucket-priority=[low | high]オプションを指定します。

+ +
+ + +

CLIコマンドとパラメータ

+

ディスクI/O優先度はバケットの作成および変更時に設定できます。bucket-createbucket-editコマンドで、--bucket-priorityパラメータを指定します。

+ + +
+ + + +

シンタックス

+

基本シンタックス:

+ +

バケットの作成時にバケット優先度を設定するには、--enable-priorityパラメータを指定します。

+ + +
couchbase-cli bucket-create -c [localhost]:8091 -u [admin] -p [password] 
+    --bucket=[bucket-name]
+    --enable-priority=[low | high]
+    [options]
+      
+ + +

バケット属性の変更時にバケット優先度を変更するには:

+ +
couchbase-cli bucket-edit -c [localhost]:8091 -u [admin] -p [password] 
+    --bucket=[bucket-name]
+    --enable-priority=[low | high]
+    [options]
+      
+ + +
+ + + +

例: バケットを優先度高で作成する

+

couchbaseバケットを優先度高で作成する

+ +

+couchbase-cli bucket-create -c 192.168.0.1:8091 -u Administrator -p password
+    --bucket=test_bucket 	
+    --bucket-type=couchbase 
+    --bucket-port=11222 
+    --bucket-ramsize=200 
+    --bucket-replica=1 
+    --bucket-priority=high
+   
+ +
+ + +

例: 優先度高を設定する

+ +

バケットを優先度高に変更する

+ +

+couchbase-cli bucket-edit -c 192.168.0.1:8091 -u Administrator -p password
+    --bucket=test_bucket 
+    --bucket-priority=high
+   
+ + +
+ + + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Concepts/bp-cloudDeployment.html b/preview/contents/Concepts/bp-cloudDeployment.html new file mode 100644 index 0000000..7df645a --- /dev/null +++ b/preview/contents/Concepts/bp-cloudDeployment.html @@ -0,0 +1,369 @@ +クラウドでCouchbaseを利用する
+

クラウドでCouchbaseを利用する

+ + + +

Couchbase Serverは、非常に簡単にクラウド上にデプロイすることが出来ます。

+ +

ソフトウェアの観点からすると、インストールする先がベアメタルでも仮想OSでも違いはありません。 + 一方、クラウド上での管理、デプロイの観点では、Couchbase Serverを使う最適な方法の検討が必要です。

+ +

この検討では、クラウドベースの環境として、最も一般的であるAmazonのEC2環境を例として取り上げます。 + しかし、(例えば組織独自のプライベートクラウドなど)EC2以外の環境でも同様の考慮が必要になります。 + ソフトウェア自身の観点では、EC2上で多方面に渡るテストを終えており、 + クラウド環境特有の予測できない性質にも直面し解決しました。

+ + +

RightScaleではAmazon上へのデプロイを簡潔にするためテンプレートがたくさん用意されており、 + 無料のRightScaleアカウントをサインアップすることで試すことが出来ます。 + これらのテンプレートは、EC2上での動作を成功させるために必要な特殊な設定項目のほぼ全部を含んでいます。 + RightScaleを使って構築すると、オートスケールのやパッケージ化されたデプロイを容易に成功させることが出来ます。

+ +

EC2ではRightScaleとは独立したAMIを用いることも出来ます。 + しかしながら、AMIを使う場合は、自分自身で解決すべき問題も増えます。 + このAMIは、EC2のポータルから"couchbase"と検索することで見つかります。

+ +

クラウド上へのデプロイ時は、以下の項目に考慮する必要があります:

+ +
    +
  • エフェメラルなローカルストレージ
  • + +
  • サーバーのIPアドレスが稼働時間中に変わること
  • + +
  • セキュリティグループとファイアウォールの設定
  • + + +
+ +

クラウド上におけるインスタンスリブートの対策

+

多くのクラウド事業者が、メンテナンスのためインスタンスをリブートする可能性があることをユーザーに警告していいます。 + Couchbase Serverはこれらのリブートにより、アプリケーションが停止しないことを保証しています。 + その場合には、以下のステップを踏んでください:

+ +
    +
  1. 新しいノードにCouchbase Serverをインストールします。
  2. + +
  3. Couchbase Web Consoleから、新しいノードをクラスタに追加します。
  4. + +
  5. Couchbase Web Consoleから、リブートしたいノードを削除します。
  6. + +
  7. クラスタをリバランスします。
  8. + +
  9. インスタンスをシャットダウンします。
  10. + +
+ +
+ + +

ローカルストレージ

ローカルストレージを扱うことは、データセンターへのデプロイと大きな違いはありません。 + しかしながら、EC2ではEBSストレージを使うことで、インスタンスがダウンした際にもデータを失わないというソリューションがあります。 + Couchbaseのデータと設定をEBSに保存することで、信頼できるストレージ構築できます。 + RightScaleでは、EBSを使う設定をサポートしています。

+ +

EBSを使うことは必須ではないですが、バックアップをベストプラクティスにそって実施するようにしてください。

+ +

外部ボリュームをマウントポイントをCouchbase Serverで設定する際に、 + ノードごとのディスクのパスを更新することを忘れないようにしましょう。

+
+ + +

IPアドレス変更への対処

+

クラウド上でCouchbase Serverを使う場合、サーバーのノードは、private/public IPアドレスのどちらでも使うことが出来ます。 + クラウド上でのIPアドレスは頻繁に変わる可能性があるため、IPアドレスの代わりにhost名を用いて設定することも出来ます。

+ +

Amazon EC2を使う場合、Amazonが自動的に生成するhost名は、private/pulic IPアドレス両方の名前解決が出来るため、これを使うことをおすすめします。

+ + +

デフォルトでは、Couchbase Serverはノードの識別にIPアドレスを用います。 + IPアドレスが変わった場合、個別のノードは自身のアドレスを特定することができなくなり、また同一クラスタ内の他のサーバーもアクセスすることができなくなります。 + クラウド上のCouchbase Serverをhost名を用いて設定するには、このセクションの後半の手順を実行してください。 + Couchbaseによって提供されているRightScaleサーバーテンプレートでは、自動的にhost名でノードが設定できます。 +

+ +

host名は常にノードのIPアドレスに名前解決できるようにしてください。 + IPアドレスの変更時に自動的にhost名がアップデートされるDNSMadeEasyのような動的DNSサービスを使うことで実現できます。 +

+ +

以下のステップはノード上のデータも設定も完全に破壊するため、Couchbaseの新規インストール時に行ってください。 + 既に稼働中のクラスタがあれば、対象ノードをクラスタから削除し、リバランス後、変更を加え、クラスタに戻してリバランスします。 +

+ +

クラスタ内に、IPとhost名を利用したノードを混在させることも出来ます。 + この方法でIPアドレスを設定するとき、localhostもしくは127.0.0.1 としてアドレスを設定すべきではありません。 + クラスタ内の複数ノードを特定することが出来なくなるからです。 + 代わりに、ホストごとに正しいIPアドレスを使いましょう。 +

+ +

Couchbase Server 2.1以降 Linux、Windows

+ +

ルールとして、クラスタにノードを追加する前に、host名を設定すべきです。 + Couchbase Serverをインストールしたときや、ノードがクラスタに追加する前にREST APIをコールしたときにもhost名を設定可能です。 + オンラインアップデートで、既存クラスタにhost名を追加することも出来ます。 + 再起動する場合は、これらの方法のいずれかで設定したhost名を使います。 +

+ + +

Couchbase Server 2.0.1以前 Linux and Windows

+ +

Couchbase Server 2.0.1以前では、クラウド上でCouchbaseを使う場合、各ノードの設定ファイルを自分自身で設定する必要があります。 +

+
+ + +

セキュリティグループ/ファイアウォールの設定

+

Couhbaseのデプロイにあたり、適切なポートを許可/拒否することは非常に大切です。 + ノードは様々なポートを使って通信しており、外部, 内部の両方で、許可された通信のみに制限することが大切です。 + 典型的なデータセンタでのデプロイと違い、クラウドシステムはデフォルトで世界に対してオープンされており、アクセスを制限するステップは必須です。

+
+ + +

RightScaleでのCouchbaseの利用

+

CouchbaseはRightScaleと恊働し、複数台のサーバをクラスタとして動かすことの出来る、RightScaleのサーバテンプレートを公開しています。 + RightScaleのサーバテンプレートによって、Amazon Web Services内のAmazon Elastic Compute Cloud (Amazon EC2)サーバ上にCouchbaseサーバを容易にセットアップすることが出来ます。

+ +

テンプレートは、Amazon Elastic Block Store(Amazon EBS)のスタンダードボリュームと、プロビジョンドIOPSボリューム両方をサポートします。 + (IOPSとは、Input/output Operations Per Secondの略称です) + AmazonEBSボリュームとその性能や制限についての詳細情報は、Amazon EBS Volume Typesを御覧ください。

+ +

RightScale サーバーテンプレートはChefをベースとしています。既存システムとの互換性を保つため、Chefを利用しないテンプレート(non-Chef)も提供されています。

+ + +
注: Couchbase Server2.2をnon-Chefテンプレートから始めることは非推奨です。 + 新規にインストールする場合は、non-Chefテンプレートを選ばないでください。 +
+ + +

RighatScaleのCouchbase Serverをセットアップする前に、RightScaleアカウントと、RightScaleアカウントと連携したAWSアカウントが必要です。

+ +

CouchbaseのRightScaleサーバテンプレートを利用するには、最低限、actor, designer, library, observer, and server_loginの権限がRightScaleユーザーロールとして必要となります。 + 権限を追加するには、RighatScaleメニューバーから、Settings > Account Settings > + Users をクリックし、permission listを修正します。

+ + +

RightScaleでCouchbase Serverをセットアップするには、Serverテンプレートをインポートしカスタマイズする必要があります。 + テンプレートをカスタマイズすると、サーバとクラスタのインスタンスを起動することが出来ます。 + 以下はワークフローのイメージ図です。

+ +

+ + +

以下の手順では、RightScaleのサーバーテンプレートで指定できるパラメータの全ては説明していません。 + パラメータについての詳しい情報が必要なときは、パラメータ名のそばのinfoボタンをクリックしてください。

+ +

Couchbase Server RightScaleテンプレートをインポートする:

+ +
    +
  1. RightScaleメニューバーから、 Design > MultiCloud Marketplace >ServerTemplatesを選択します。
  2. + +
  3. Searchの左下にあるKeywords boxの中に, couchbaseと入力し, Goをクリックします。
  4. + +
  5. 検索結果リストの中から、Couchbase Serverのサーバーテンプレートの最新バージョンをクリックします。 +

    各Couchbase Serverテンプレート名には、Couchbase Serverのバージョンが含まれています。

    + +
  6. + +
  7. Importをクリック。
  8. + +
  9. エンドユーザライセンス利用許諾書を確認し、同意する場合はFinish をクリックします。
  10. + +
+ + +

新しいDeploymentを作成する:

+
    +
  1. RightScaleのメニューバーからManage > Deployments > Newを選択します。
  2. + +
  3. 新しいdeploymentに対して、ニックネームとディスクリプションを入力します。
  4. + +
  5. Saveをクリックします。
  6. + +
+

deploymentにサーバとクラスタを追加する:

+
    +
  1. RightScaleのメニューバーからManage > Deploymentsを選択します。
  2. + +
  3. 対象のサーバもしくはクラスタのニックネームをクリックします。
  4. + +
  5. deploymentページのメニューバーから、サーバーもしくはクラスタを追加します:
      +
    • サーバーを追加するにはAdd Serverをクリックします。
    • + +
    • クラスタを追加するにはAdd Arrayをクリックします。
    • + +
    +
  6. + +
  7. Add to Deploymentウインドウで、cloudを選択しContinueをクリックします。
  8. + +
  9. サーバテンプレートページで、リストからテンプレートを選択します。 +

    アカウント内で複数のテンプレートを持っていた場合、フィルターオプション下でテンプレート名ボックスにキーワードを入力することでリストに表示される数を減らすことが出来ます。

    + +
  10. + +
  11. Server Detailsをクリックします。
  12. + +
  13. Server Detailsページで、ハードウェアの設定を選びます。 +

    Server Name もしくはArray Nameに新しいサーバーもしくはクラスタの名前を入力します。

    + +

    Instance Type—デフォルトはextra largeです。テンプレートはlargeとextra largeのみをサポートし、最低4コアを必要とします。

    + +

    EBS Optimized—Provisioned IOPSのためにEBS-optimized volumesを有効化するには、チェックボックスをクリックします。

    +
  14. + +
  15. ネットワーク設定を選択します。
      +
    • +

      SSH Key—SSH keyを選択します。

      + +
    • + +
    • +

      Security Groups—1つ以上のセキュリティグループを選択します。

      + +
    • + +
    +
  16. + +
  17. クラスタを追加する場合は、Array Detailsをクリックし、オートスケーリングポリシーとArrayTypeDetailのための設定を選択します。 +

    Autoscaling Policy配下で、 Min CountMax Countパラメータを修正することで、クラスタ内のアクティブなサーバーの最小/最大数を設定できます。サーバー数を特定の数にするには、これら2つの値を同じにします。

    + +
  18. + +
  19. Finishをクリックします。
  20. + +
+

サーバもしくはクラスタのテンプレートをカスタマイズする:

+
    +
  1. RightScaleメニューバーから、Manage > Deploymentsを選択します。
  2. + +
  3. サーバーもしくはクラスタが所属するdeploymentのニックネームをクリックします。
  4. + +
  5. サーバーもしくはクラスタのニックネームをクリックします。
  6. + +
  7. サーバーもしくはサーバアレイページで、Inputs タブをクリックし、editをクリックします。
  8. + +
  9. BLOCK_DEVICEを展開し、必要に応じてインプットも修正します。 +

    BLOCK_DEVICEカテゴリはストレージを特定するためのインプットパラメータも含んでいます。 + 以下に、修正可能なインプットを挙げます:

    +
      +
    • I/O Operations per Second—そのボリュームがサポートする秒間のinput/outputオペレーション数(IOPS)
    • + +
    • Volume Type—ストレージデバイスタイプ
    • + +
    +
  10. + +
  11. DB_COUCHBASEカテゴリを展開し、必要に応じてインプットも修正します。 +

    DB_COUCHBASEカテゴリはCouchbase Server特有のインプットパラメータを含んでいます。 + 一般的に、デフォルト値は1台のサーバの最適値になっています。 + クラスタを作成する場合、インプットパラメータを変える必要があります。 + 以下に修正可能なインプットを挙げます:

    +
      +
    • +

      Bucket Name—バケット名。デフォルトは default

      + +
    • + +
    • +

      Bucket Password—バケットのパスワード。

      + +
    • + +
    • +

      Bucket RAM Quota—バケットのRAM割当量(MB)。

      + +
    • + +
    • +

      Bucket Replica Count—バケットのレプリカ数。

      + +
    • + +
    • +

      Cluster REST/Web Password—管理者アカウントのパスワード。 + デフォルトはpassword

      + +
    • + +
    • +

      Cluster REST/Web Username—RESTもしくはwebでクラスタへアクセスするときの管理者アカウントユーザー名。デフォルトは Administrator

      + +
    • + +
    • +

      Cluster Tag—自動的にジョインするクラスタ内でのノードのタグ。

      + +
    • + +
    • +

      Couchbase Server Edition—Couchbase Serverのエディション。 + デフォルトはenterprise

      + +
    • + +
    • +

      Rebalance Count—リバランス前に起動するサーバ数。 + クラスタに追加する予定の対象サーバの合計数をセットしてください。 + 0にした場合、Couchbase Serverは各サーバがクラスタに参加する度にリバランスします。

      + +
    • + +
    +
  12. + +
  13. Saveをクリックします。
  14. + +
  15. サーバもしくはクラスタを起動する準備ができればLaunchをクリックします。
  16. + +
+ + +

サーバもしくはクラスタを起動する:

+
    +
  1. RightScaleメニューバーからManage > Deploymentsを選択します。
  2. + +
  3. サーバもしくはクラスタが含まれるdeploymentのニックネームをクリックします。
  4. + +
  5. サーバーもしくはクラスタのニックネームをクリックします。
  6. + +
  7. Server or Server ArrayページでLaunchをクリックします。
  8. + +
+ + +

Couchbase Web Consoleにログインする:

+ +

パブリックIPの8091ポートにブラウザから接続することで、Couchbase ServerのWeb Consoleにログインすることが出来ます。 + 一般的なフォーマットはhttp://<server:port>となります。 + 例えば、パブリックIPアドレスが192.236.176.4である場合、 http://192.236.176.4:8091/ とブラウザで入力してください。

+
+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/bp-clusterDesign.html b/preview/contents/Concepts/bp-clusterDesign.html new file mode 100644 index 0000000..6217975 --- /dev/null +++ b/preview/contents/Concepts/bp-clusterDesign.html @@ -0,0 +1,99 @@ +クラスタ設計の考慮事項
+

クラスタ設計の考慮事項

+ + +

クラスタ設計はRAM、ノード数、コア数クライアントサイドおよびサーバサイドのmoxiなどを検討する必要があります

+ + +
+ +
RAM
+ +
メモリはクラスタのスムーズな動作に係る重要な要素のひとつです。Couchbase Serverはアクティブなデータセットのほとんどをメモリ上に配するようなアプリケーションに最適です。頻繁に利用されるデータ(ワーキングセット)が全て収まるように十分なメモリを割り当てることが非常に重要です。十分な空きメモリがない場合、一部のドキュメントがメモリから排出され、ディスク上にのみ存在するようになります。ディスクへのアクセスはメモリ内のデータに比べはるかに遅くなります。その結果、排出されたデータが頻繁にアクセスされる場合、クラスタのパフォーマンスが低下します。設定を確認し、パフォーマンスを最適化し、このような状況を回避するためにサイジングガイドラインで提供されている式を使用してください。
+ + +
+ + +
+ +
ノード数
+ +
必要なメモリサイズが分かったら、次に少数の大きなノードか、多数の小さなノードにするかを決める必要があります。
    +
  • 多数の小さなノード: I/O アクセスを複数のマシンに分散できますが、(クラスタ全体において)ノードが故障する可能性も高くなります。
  • + +
  • 少数の大きなノード: ノード故障が発生した場合、アプリケーションへの影響は大きくなります。
  • + +
  • この選択は信頼性と効率のトレードオフです。
  • + +
+
+ + +
+ + +
+ +
クライアントサイドもしくはサーバサイドのmoxi
+ +
Couchbase Serverはクライアントサイドのmoxi(もしくはスマートクライアント)の方がサーバサイドのmoxiよりも効率的です。しかし、開発環境やより早く、容易なデプロイのために、サーバサイドのmoxiを利用することが出来ます。クライアントの要求を受信し、要求されたデータがない場合、余計なホップが生成されるためサーバサイドのmoxiは推奨されません。
+ + +
+ + +
+ +
コア数
+ +
Couchbase ServerはCPU性能より、メモリやI/O性能に影響されます。しかし、少なくとも2つのコアを持つマシンで利用するのが効率的です。
+ + +
+ + + +
+ +
ストレージの種類
+ +
データ格納先として、SSD(ソリッドステートドライブ)か回転式ディスクドライブが選択できます。SSDは回転式メディアよりも高速ですが、現在は高コストです。SSDの場合、I/Oのキューバッファがより小さくなるため、Couchbase Serverで必要となるメモリも少なくなります。
+ + +
+ + +
+ +
WANデプロイメント
+ +
Couchbase Serverはクラスタやクライアントが複数のデータセンターにまたがるようには設計されていません。クラスタ内(サーバ間)だけでなく、クラスタとCouchbaseクライアント間のレイテンシも非常に低い必要があります。もし1箇所以上のデータセンターをまたぐ必要がある場合は、クロスデータセンターレプリケーション(XDCR)を参照してください。
+ + +
+ + +
+ +
共有ストレージ
+ +
SANやNASのようなバックエンドの共有ストレージシステムは使用しないことを強く推奨します。それらはよいパフォーマンスを提供しますが、Couchbaseの分散性を制限し、単一のボトルネックや障害原因となります。
+ + +
+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/bp-deployment-considerations.html b/preview/contents/Concepts/bp-deployment-considerations.html new file mode 100644 index 0000000..76cff69 --- /dev/null +++ b/preview/contents/Concepts/bp-deployment-considerations.html @@ -0,0 +1,96 @@ +デプロイ構成の考慮事項
+

デプロイ構成の考慮事項

+ + +

アクセス制限、ノード間通信、スワップの設定、接続タイムアウトなどの考慮事項について説明します。

+ +

Couchbase Serverのデプロイ構成では、以下の項目に注意してください:

+ + +
+ +
Moxiポートへのアクセスを制限
+ +
信頼できるマシン(クラスタ内の他のノードを含む)からのみMoxiが利用するポートへアクセスできるようにしてください。
+ + +
+ +
+ +
Webコンソール(8091ポート)へのアクセスを制限
+ +
Webコンソールはパスワードで守られています。 しかしながら、8091ポートへのアクセスを制限することを推奨します; 悪意のあるユーザによってWebコンソールから不正なオペレーション(ノードの削除など)を実行される可能性があります。
+ + +
+ +
+ +
ノード間の通信ポート
+ +
クラスタ内のすべてのノードは互いに11210と8091ポートで通信できる必要があります。
+ + +
+ +
+ +
Swapの設定
+ +
Couchbase Server上でswapを設定してください。 これはシステムRAMを使い果たしてしまった場合に、オペレーティングシステムがCouchbase Serverをkillすることを防ぐことができます。 swapを用意しておくことは、このような状況への対処により多くの選択肢をもたらします。
+
Linuxでのswap領域設定の推奨設定については、Swap領域を参照してください。
+ + +
+ +
+ +
アイドルコネクションタイムアウト
+ +
いくつかのファイヤウォールやプロキシソフトウェアは一定期間アイドル状態のTCPコネクションを切断します (例、 20分)。 これらのソフトウェアでタイムアウトを変更できない場合、クライアントから定期的にコマンドを送信し、コネクションを維持します。
+ + +
+ +
+ +
Windowsでのポート枯渇
+ +
WindowsでのTCP/IPポート割り当ては、デフォルトでクライアント通信で利用可能なポート数を制限しています。
+ + +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/bp-deployment-strategies.html b/preview/contents/Concepts/bp-deployment-strategies.html new file mode 100644 index 0000000..028a4e4 --- /dev/null +++ b/preview/contents/Concepts/bp-deployment-strategies.html @@ -0,0 +1,52 @@ +デプロイ戦略
+

デプロイ戦略

+ +
+

利用可能なデプロイ戦略がいくつかあります。 お使いの言語や開発環境がスマートクライアントライブラリをサポートしている場合、スマートクライアントがお勧めのデプロイ選択肢になります。 そうでない場合、最大のパフォーマンスと機能性を得るためには、クライアントサイドにMoxiを設定します。

+ +

スマート(vBucket対応)クライアント

スマートクライアントを利用する場合、クライアントライブラリがクラスタへのインタフェースを提供し、vBucketメカニズムによるサーバの選択を直接実行します。 クライアントは独自のCouchbaseプロトコルを利用しクラスタと通信します。 これは、クライアントがvBucketマップを共有し、必要なvBucketを保持するサーバを特定し、情報をそのサーバから参照および更新することを可能にします。

+ + +

Couchbase Server 2.5以前のリリースでは、開発者の方が利用しているクライアントライブラリによって、初回のトポロジ設定リクエストを送信するホストをランダムに選択していました。 初回のブートストラップ以降に発生したクラスタマップの変更はサーバからのNOT_MY_VBUCKETレスポンスに基づき処理されます。 このコネクションは8091ポートで行われ、HTTPコネクションを利用しています。

+

Couchbase Server 2.5以降は、クライアントライブラリがバケットの初期トポロジ設定をクラスタ内のノードから取得します。 これは以前のリリースと同様です。 しかし、この情報は11210ポートでmemcachedプロトコルを利用して転送されます(8091ポートへの永続するコネクションではない)。 + これはコネクションのスケーラビリティを大きく向上させます。

+ +
注: この変更はCouchbaseバケットタイプでのみ有効です(memcachedバケットでは不可)。 8091ポートに設定リクエストが送信されると、エラーを返します。 +
+
+ +

クライアントサイド (スタンドアロン) プロキシ

+

お使いのプラットフォームでスマートクライアントが利用できない場合、スタンドアロンプロキシをデプロイします。 これはmemcached互換のインタフェースをローカル環境で提供し、スマートクライアントと同様の機能を提供します。 クライアント側にデプロイしたスタンドアロンプロキシは、コネクションプーリングなどの有意義なサービスを提供することもできます。 以下の図はアプリケーションサーバにインストールしたスタンドアロンプロキシを利用した流れを示しています。

+ + +

memcachedクライアントのサーバリストには一つのサーバのみ(localhost)を設定し、すべてのオペレーションはlocalhost:11211に送信されます — プロキシがリスンするポートです。 プロキシはドキュメントIDをvBucketにハッシュし、vBucketテーブルからホストサーバを探し、適切なCouchbase Serverの11210ポートへとオペレーションを送信します。

+

Moxiは、Moxi 1.8シリーズをご利用ください。

+ +
+ + +

サーバサイド (Couchbase組み込み) プロキシの利用

+
重要: サーバサイドプロキシ設定のプロダクションでの利用は 推奨されません 。 お使いのプラットフォームや環境で、スマートクライアントまたはクライアントサイドプロキシ構成が使用できるのであれば、それらを使用してください。
+

サーバサイド (組み込み) プロキシはCouchbase Server内に存在し、11211ポートを利用しています。 memcachedプロトコルをサポートし、既存のアプリケーションから、別途プロキシソフトウェアをインストールすることなく、Couchbaseクラスタと通信することができます。 このアプローチの問題点はパフォーマンスです。

+

このデプロイ構成は典型的なmemcachedデプロイ構成と比べ、最悪のシナリオでは、サーバマッピングが2回発生し(Ketamaハッシュをクライアント側のサーバリストで利用し、プロキシ側でvBucketのハッシュをサーバマッピングで利用する)、余分なネットワークラウンドトリップホップが発生します。

+ + +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/bp-disk-throughput.html b/preview/contents/Concepts/bp-disk-throughput.html new file mode 100644 index 0000000..c3affe2 --- /dev/null +++ b/preview/contents/Concepts/bp-disk-throughput.html @@ -0,0 +1,50 @@ +ディスクのスループットとサイジング
+

ディスクのスループットとサイジング

+ +

Couchbase ServerはRAMをI/O層から分離することで高いスケーラビリティを提供します。

+ + +

分離することで、クライアントアプリケーション性能に影響を与えることなく、一貫して非常に低いレイテンシを可能とし、非常に高い更新負荷に対応します。

+ + +

Couchbase Serverは追記のみのフォーマットと、ビルトインの自動コンパクション処理を実装しています。 + ディスクサブシステムの要件はサイズとI/Oの二つに分類できます。

+ +

ディスクサイズ要件

+ +

ディスクサイズ要件は、追記型のCouchbaseファイル書き込みフォーマット、ビルトインの自動コンパクション処理が影響します。 追記型のフォーマットでは各更新(insert/update/delete)がファイルに新しいエントリを作成します。

+ +

更新や削除のワークロードで必要なディスクサイズは増加し、自動コンパクション処理を実行することで減少します。 実データサイズ以上にデータが拡張されるため、より多くのディスク領域を使用します。 + 頻繁に挿入や参照を行うワークロードよりも、頻繁な更新や削除のワークロードは、劇的にサイズを増加させます。

+ +

推奨サイズはキーバリューデータでのみ有効です。 + Viewとインデックス、またはXDCRを利用する場合、Couchbaseサポートに推奨構成を問い合わせてください。

+ +

ワークロードに応じて、必要なディスクサイズは 全データセットサイズの2倍から3倍になります (アクティブとレプリカデータを合計)。

+ +
重要: 全データセットサイズの2倍から3倍というディスクサイズ要件はキーバリューのデータのみに当てはまり、その他のデータフォーマットやViewインデックスまたはXDCRの利用は考慮していません。
+ +
+ + +

I/O要件

+

I/Oは維持すべき書き込み頻度、データベースファイルのコンパクション要件、そしてその他の必要なディスクアクセスの組み合わせとなります。 + Couchbase Serverは自動的にデータベースへの書き込みをメモリにバッファし、結果的にそれらをディスクへ永続化します。 + このため、ソフトウェアはディスクが処理できるよりも高い書き込み頻度を実現できます。 しかしながら、このような書き込みを維持するには、結果的にすべてをディスクに保存できる十分なI/Oが必要になります。

+ +

I/Oを管理するには、コンパクション処理の起動(もしくは起動させない)を決定する閾値とスケジュールを設定し、ディスクサイズを抑えるためにコンパクションが正常に完了することが非常に重要であることを意識する必要があります。 Viewとインデックス、クロスデータセンタレプリケーション(XDCR)を利用する際に、ディスクサイズとディスクI/Oを正しく設定することは非常に重要となります。 バックアップなどCouchbase Server外で行うその他のオペレーションで利用する容量やディスクアクセスも重要になります。

+ + + +
ヒント: データファイル、インデックス、インストール/設定ディレクトリを個別のドライブやデバイスに設定するオプションを利用し、I/Oとディスク領域を効率的に割り当ててください。
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Concepts/bp-firewall.html b/preview/contents/Concepts/bp-firewall.html new file mode 100644 index 0000000..3780705 --- /dev/null +++ b/preview/contents/Concepts/bp-firewall.html @@ -0,0 +1,23 @@ +Couchbaseと二次ファイアウォール
+

Couchbaseと二次ファイアウォール

+ + +

+ +

二次ファイアウォールの内部にCouchbaseをデプロイしている場合は、Couchbaseで利用するネットワークポートがオープンされていることを確認してください。

+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/bp-maintenance.html b/preview/contents/Concepts/bp-maintenance.html new file mode 100644 index 0000000..009e10a --- /dev/null +++ b/preview/contents/Concepts/bp-maintenance.html @@ -0,0 +1,71 @@ +継続的な監視とメンテナンス
+

継続的な監視とメンテナンス

+ + +

クラスタの監視や診断、問題を特定するために利用できる様々な統計情報があります。

+ +

クラスタの稼働状況や、効率的に動作しているかを理解するには、以下の統計情報を利用します:

+ +
    +
  • 利用メモリ量 (mem_used) - 現在利用されているメモリ容量です。 mem_usedがRAM割当量に到達すると、OOM_ERRORが発生します。 + mem_usedは、データがメモリから除去される点となる、ep_mem_high_wat以下に抑えるべきです。
  • + +
  • ディスク書き込みキューサイズ (ep_queue_size) - ディスクへの書込み待ちデータの数です。
  • + +
  • キャッシュヒット (get_hits) - 目安として、この数値は少なくとも全リクエストの90%以上であるべきです。
  • + +
  • キャッシュミス (ep_bg_fetched) - 理想的にはこの数値は低く、get_hitsよりも確実に低くあるべきです。 この値が増加傾向にある、もしくは高い値の場合、アプリケーションが格納されることを想定しているデータがメモリ内にないことを意味しています。
  • + +
  • ドキュメントが存在しない (get_misses) - Couchbase Serverにそのドキュメントが存在しません。
  • + +
+ +

その他のクラスタパフォーマンス監視対象となる主要な統計情報として、 ウォータマークがあり、これはメモリの解放を開始する必要があるかを判断するために利用されます。 ウォータマークに関連する2つの重要な統計情報があります:

+ +
    +
  • 高水位 (ep_mem_high_wat) - システムはこの水位に到達すると、メモリからのデータ除去を開始します。 除去された値はクライアントに返される前にディスクからフェッチしなくてはなりません。
  • + +
  • 低水位 (ep_mem_low_wat) - 低水位に達すると、メモリ利用量が深刻な状況へ向かっていて、高水位に達する前にシステム管理操作が実施されるべきであるということを示しています。
  • + +
+ + +
ヒント: 以下のコマンドを使用して統計情報を取得します:
shell> cbstats IP:11210 all | \
+    egrep "todo|ep_queue_size|_eject|mem|max_data|hits|misses"
+
+ +

次のように出力されます:

+ +
ep_flusher_todo:
+ep_max_data_size:
+ep_mem_high_wat:
+ep_mem_low_wat:
+ep_num_eject_failures:
+ep_num_value_ejects:
+ep_queue_size:
+mem_used:
+ep_bg_fetched:
+get_hits:
+
+ +
+ + +
ヒント: 標準的な監視ツールを使用して、ディスク容量、CPU使用率と、スワップをすべてのノード上で監視してください。
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/bp-sizingGuidelines.html b/preview/contents/Concepts/bp-sizingGuidelines.html new file mode 100644 index 0000000..d46d6cc --- /dev/null +++ b/preview/contents/Concepts/bp-sizingGuidelines.html @@ -0,0 +1,581 @@ +サイジングガイドライン
+

サイジングガイドライン

+ + +

Couchbase Serverクラスタのサイジングで最も考慮すべき点は、ノード数とノードスペックです。

+ +

Couchbase Serverクラスタのサイジングを行う際は、以下の設問を利用します:

+ +
    +
  • 何台のノードが必要か?
  • + +
  • これらのノードはどの程度のスペック(RAM、CPU、ディスク容量)であるべきか?
  • + +
+ +

クラスタで必要なノード数を決定するには、以下を考慮してください:

+ +
    +
  • RAM
  • + +
  • ディスクスループットとサイジング
  • + +
  • ネットワーク帯域
  • + +
  • データ分散と安全性
  • + +
+ +

Couchbase Serverのインメモリな性質として、RAMは通常サイジングを決定する要素になります。 + しかしながら、主なサイジング要素は実際のデータセットと保存される情報に依存します。 例えば:

+ +
    +
  • 非常に小さなデータセットに対し、非常に頻繁にアクセスする場合、RAMよりもネットワーク帯域をベースにサイジングを計算すべきです。
  • + +
  • 非常に高いデータ更新頻度の場合、より多くのノードで、すべてのデータを永続化するために必要なディスクスループットをサポートする必要があるでしょう (加えて更新リクエストのバッファ用により多くのRAMも必要になります)。
  • + +
  • 非常に小さなデータセットで、アクセス頻度も低い場合でも、分散と安全性を担保するために、3台のノードが必要でしょう。
  • + +
+ +

Couchbase Serverでは、クラスタ内のノード台数を増やすことでクラスタのキャパシティ(RAM、ディスク、CPU、ネットワーク)を拡張できます。それぞれの上限がクラスタサイズを増やすことでリニアに増加します。

+ + +
+ +
RAMサイジング
+ +
RAMは通常最もクリティカルなサイジングパラメータです。 また、性能や安定性に最も影響を与えます。
+ + +
+ +
+ +
ワーキングセット
+ +
ワーキングセットはクライアントアプリケーションがアクティブに利用するデータです。 + ワーキングセットがメモリ内に常駐するのが理想的で、これは必要なメモリ容量に影響します。
+ + +
+ +
+ +
メモリ割当量
+ +
予定しているワーキングセットサイズと、全データサイズに応じてCouchbaseクラスタをサイジングすることは非常に重要です。 サイジングのゴールはすべてのドキュメントID、ドキュメントIDメタデータ、そしてワーキングセットのバリューが収まるRAMをサイジングすることです。 + Couchbase ServerがRAMからディスクへとバリューの除去を開始するポイント(高水位)よりも、メモリ利用が下回る必要があります。
+ + +
+ + + +
重要: Couchbase Serverノードにマシンの全RAMを割り当てることはできません(per_node_ram_quota)、他のプログラムもマシン上で稼働するためです。
+ + +

ノードごとにどの程度メモリやディスク領域が必要になるかはいくつかの様々な要素に依存します。

+ + + +

以下はバケット単位の計算方法で、複数のバケットすべてで合計する必要があります。 すべてのバケットが同一の設定であれば、全体のデータを単一バケットとして扱うこともできます。 + バケット単位のオーバヘッドは考慮する必要はありません。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
変数説明
documents_numワーキングセットのドキュメント総数
ID_sizeドキュメントIDの平均サイズ
value_sizeバリューの平均サイズ
number_of_replicasオリジナルデータのコピーをいくつ保持するか
working_set_percentageメモリ内に保持するデータのパーセンテージ
per_node_ram_quotaCouchbaseに割り当てられるメモリ容量
+
+ + +

必要なメモリ容量の計算には以下の項目を利用します:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
定数説明
ドキュメント単位のメタデータ (metadata_per_document)これはCouchbaseがドキュメントごとのメタデータを保持するために必要なメモリ容量です。 メタデータは56 byte利用します。 ノードが稼働中でデータをサービスしている間、すべてのメタデータはメモリ内に保持しなくてはなりません。
SSDまたは回転式ディスクSSDはより良いI/O性能を提供します。
headroomクラスタはメタデータ保存用に追加のオーバヘッドを必要とします。 この領域をheadroomと呼びます。 データセット自体が必要とするRAMに対し、およそ25-30%余分に領域が必要です。 SSDは回転式ハードディスク(伝統的)よりも高速なため、SSDでは25%、回転式ハードディスクでは30%のメモリとします。
高水位 (high_water_mark)デフォルトではノードのRAMの高水位は85%に設定されます。 +
+
+

以下はクラスタサイジングガイドラインの概要です:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
変数計算式
no_of_copies1 + number_of_replicas
total_metadata. 全ドキュメントのメタデータがメモリに保持される必要があります。(documents_num) * (metadata_per_document + ID_size) * + (no_of_copies)
total_dataset(documents_num) * (value_size) * + (no_of_copies)
working_settotal_dataset * (working_set_percentage)
クラスタで必要なRAM容量(total_metadata + working_set) * (1 + headroom) / + (high_water_mark)
必要なノード台数クラスタで必要なRAM容量 / per_node_ram_quota +
+
+ + +
重要: データサイズに関わらず、少なくともレプリカ数 + 1台のノードが必要です。
+ +

以下はサイジング計算のサンプルです:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
変数
documents_num1,000,000
ID_size100
value_size10,000
number_of_replicas1
working_set_percentage20%
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
定数
ストレージの種類SSD
overhead_percentage25%
metadata_per_document2.1 以降は56、 2.0.x は64
high_water_mark85%
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
変数計算式
no_of_copies= オリジナルに1、レプリカに1
total_metadata= 1,000,000 * (100 + 56) * (2) = 312,000,000
total_dataset= 1,000,000 * (10,000) * (2) = 20,000,000,000
working_set= 20,000,000,000 * (0.2) = 4,000,000,000
クラスタで必要なRAM容量= (440,000,000 + 4,000,000,000) * (1+0.25)/(0.7) = + 7,928,000,000
+
+ + +

例えば、8GBのマシンで6GBをCouchbaseに割り当てる場合...

+ + +
number of nodes =
+    Cluster RAM quota required/per_node_ram_quota =
+    7.9 GB/6GB = 1.3 or 2 nodes
+
+ + + + + + +

ネットワーク帯域

+

ネットワーク帯域は通常クラスタのサイジングで重要な要素にはなりません。 しかしながら、クライアントがクラスタ内の情報にアクセスするにはネットワーク帯域が必要です。 ノード間で情報をやり取りするためにもネットワーク帯域が必要です。

+ + +

一般的に、ネットワーク帯域要件の計算には、以下の式を利用します:

+ + +
Bandwidth = (operations per second * item size) + overhead for rebalancing 
+ + +

秒間オペレーション数を以下の式で計算します:

+ + +
Operations per second = Application reads + (Application writes * Replica copies) 
+ +
+ + +

データの安全性

+

データを安全に保持するためには、クラスタ内で十分なノード台数(そして正しい設定)が必要です。 ノード間での情報の分散と、クラスタ内で保存される情報のレプリカ数という2つの考慮すべき側面があります。

+ +
+ + +

データの分散

+

基本的には、より多くのノードの方が、より少ないノードよりも良いです。 2台しかノードがない場合、データは50%ずつ、2台のノードに分散されます。 + これは、1台がダウンした影響がデータセットの半分におよぶことを意味します。 + 一方で、10台ノードがあれば、データセットの10%だけが1台のノードがダウンした場合に影響を受けます。 + 自動フェイルオーバを利用していても、ノードがダウンした時にデータが利用できない期間が発生します。 + これはより多くのノードを利用することで軽減できます。

+ + +

フェイルオーバ後にクラスタが受け付ける負荷についても考慮する必要があります。 + どれだけ負荷が増加し、それに準備できているか検討が必要です。2台しかなければ、それぞれは1台で全アクセスを処理できる準備ができている必要があります。 + 10ノードでは、1台のノードが故障した場合、全ワークロードの10分の1を余計に処理できるようにすれば良いのです。

+ + +

2ノードでも最低限の冗長性を提供できますが、常に最小でも3ノードを利用することをお勧めします。

+ +
+ + +

レプリケーション

+

Couchbase Serverではレプリカ数を3つまで設定できます(データセットのコピーを4つ生成します)。 + 障害が発生した場合、レプリカ数と同じノード数しか"フェイルオーバ"できません(手動でも自動でも)。 + 例:

+ +
    +
  • 5台のクラスタでレプリカを1とした場合、1つのノードがダウンすると、それをフェイルオーバできます。 2つ目のノードがダウンすると、フェイルオーバするために十分なレプリカのコピーがないため、より時間のかかる復旧処理を実施しなくてはなりません。
  • + +
  • 5ノードのクラスタでレプリカを2つ設定していると、1つのノードがダウンしたら、それをフェイルオーバできます。 2つ目のノードがダウンしても、それをフェイルオーバできます。 3つ目のノードがダウンした場合、フェイルオーバに必要なレプリカが十分に存在しない状態になります。
  • + +
+ +

ノードがダウンし、フェイルオーバした後は、可能な限り早くそのノードを交換し、リバランスするようにしてください。 リバランスによりレプリカコピーが再作成されます(レプリカ数に十分なノード数がある場合)。

+ + +
ヒント: 目安として、以下の設定を推奨します: +
    +
  • 5ノードまではレプリカ数1
  • + +
  • 5から10ノードはレプリカ数1または2
  • + +
  • 10ノードより大きなクラスタではレプリカ数1、2あるいは3
  • + +
+ + これには多くのバリエーションがありますが、小規模のクラスタ内で多くのレプリカを持ってもそれほど効果がありません。 +
+ + +
+ + +

ハードウェア要件

+

一般的にCouchbase Serverのハードウェア要件は非常に低く、コモディティハードウェア、あるいは仮想化システム上で動作するように設計されています。 + とはいえ、サーバーの主な考慮事項のおおよその目安として: +

+ +
    +
  • RAM: 最も重要です。 アクティブなアイテムを保持し、Couchbase Serverが低いレイテンシを提供する主な理由であるためです。
  • + +
  • CPU: Couchbase ServerのCPU要件は非常に低いものです。 サーバはマルチスレッドであるためマルチコアシステムの恩恵を受けます。 少なくとも4つまたは8つの物理コアを搭載したマシンを推奨します。
  • + +
  • ディクス: RAMをIO層から切り離すことで、Couchbase Serverは他のデータベースに比べ、低速なディスクであっても効率的に扱うことができます。 + ベストプラクティスとして、サーバインストール、データディレクトリ、インデックスディレクトリにはそれぞれ個別のデバイスを利用します。
  • + +
  • ネットワーク: ギガビットイーサインタフェースを利用したほとんどの構成で動作します。 10GBitやInfinibandのようにさらに高速なソリューションを利用することもできます。
  • + +
+ +

SAN、SAS、SATA、SSDおよびEBSで動作が確認され、次の構成が推奨されます:

+ + +
    +
  • SSDは書き込みキューを処理する点でも、データをリストアする点(コールドブート及びリバランシング用途)でも優れた性能を発揮することができます。
  • + +
  • RAIDは、一般的にスループットと信頼性の向上を提供します。
  • + +
  • (Amazon EC2の)EBSボリュームでストライピングすると、スループットを高めることができます。
  • + +
+ + +
+ + +

クラウド環境に関する考慮事項(例えばAmazon EC2)

+

クラウド環境においては、信頼性や一貫したIO性能が確保できないため、ノード単位のRAMフットプリントを縮小し、ノード数を増やすことをお勧めしています。 これにより、より良いディスクスループットに加え、各ノードが保持するデータが(そして転送するデータも)少なくなるため、リバランスも容易になります。 さらにデータを分散することで、単一のノードが故障した際(一般に起こりえます)に受ける影響も軽減することができます。

+ +
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/bucket-eviction.html b/preview/contents/Concepts/bucket-eviction.html new file mode 100644 index 0000000..51dbfd7 --- /dev/null +++ b/preview/contents/Concepts/bucket-eviction.html @@ -0,0 +1,75 @@ +チューナブルメモリ
+

チューナブルメモリ

+ + +

チューナブルメモリにより、メモリからバリューのみの除去と、完全なメタデータとバリューの除去を選択可能です。

+ + + +

キャッシュ管理のアイテム除去方法はバリューのみと完全なメタデータの除去が実装されています:

+ +
    +
  • バリューのみの除去(デフォルト)はデータをキャッシュから削除しますが、メモリから除去したアイテムを含め、すべてのキーとメタデータフィールドは保持します。 + バケットでバリューの除去が発生すると、アイテムのバリューはリセットされます。
  • + +
  • 完全なメタデータの除去はキー、メタデータ、そしてキーバリューをキャッシュから完全に削除します。 + 完全なメタデータの除去はサイズの大きなバケットのメモリ要件を削減できます。
  • + +
+ + +

+ 完全なメタデータの除去は、メモリ内のワーキングセットを小さくすることで、 + 大量データ(より大量のデータセット、もしくはより大きなアイテム/キー)をサポートします。 + 小さなワーキングセットはキャッシュ管理を効率化し、ウォームアップ時間を短縮します。 + メタデータの除去はバケット単位に指定可能です。 +

+ +

+ 例えば、非常に大量のデータを保存する必要がある場合に、対象のバケットで完全なメタデータの除去を有効にすることができます(テラバイトやペタバイトなど)。 +

+ + + + + + + +

+ メモリからのメタデータ除去方法については、Couchbase Webコンソール、CLI、REST APIセクションを参照してください。 +

+ + + + + +

後方互換性

+

完全なメタデータの除去では、アイテムのキーとメタデータはバリューとともに除去されます。 + 以前のバージョンでは、アイテムのキーと他データはキャッシュに残り、バリューのみがキャッシュから除去されます。 +

+ + +
+ + + + + +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Concepts/bucket-priority.html b/preview/contents/Concepts/bucket-priority.html new file mode 100644 index 0000000..f83b21c --- /dev/null +++ b/preview/contents/Concepts/bucket-priority.html @@ -0,0 +1,59 @@ +ディスクI/O優先度
+

ディスクI/O優先度

+ + + + +

ディスクI/O優先度はワークロードの優先度をバケット単位に指定できます。

+ + +

バケットの優先度はバケット単位で設定します。バケットのディスクI/O優先度は high もしくは low を選択でき、デフォルトは low です。バケット優先度の設定はバケットのI/Oタスクが優先低、高のいずれかのタスクキューに登録されるかを決定します。グローバルプールにあるスレッドは優先度高のタスクキューを、優先度低のタスクキューよりも頻繁にポールします。バケットのレイテンシとI/O操作はこの設定値に影響されます。優先度高に設定されたバケットのI/Oタスクはより頻繁に選択されるため、優先度の低いバケットのタスクよりも高速に処理されます。

+ + + +

デフォルトバケットの設定は初期セットアップ時と、セットアップ後の変更で指定できます。しかし、バケット優先度の設定をセットアップ後に変更すると、バケットが再起動され、クライアントの接続がリセットされます。

+ +
+ + + + + + + +

後方互換性

+

バージョン2.xから3.xにアップグレードする際、Couchbaseは既存のスレッド設定値を次のように low または high に変換します: +

+ + +
    +
  • 6-8のスレッドが設定されているバケットは、優先度高となります。
  • + +
  • 3-5のスレッドが設定されているバケットは、優先度低となります。
  • + +
+ +
+ + + + + +
+ + + + +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-cacheLayer.html b/preview/contents/Concepts/concept-cacheLayer.html new file mode 100644 index 0000000..faff418 --- /dev/null +++ b/preview/contents/Concepts/concept-cacheLayer.html @@ -0,0 +1,50 @@ +キャッシュレイヤー
+

キャッシュレイヤー

+ + +

Couchbase Serverは、非常に高速なデータの読み書きを提供する為に、 + サーバーの中心的な役割としてキャッシュ層を持っています。

+ + +

Couchbase Serverは、自動的にキャッシュ層を管理し、パフォーマンスを確保するために必要なキャッシュスペースを + 確保します。 + キャッシュ層に置かれたアイテムは、ディスクに書くために自動的にディスクキューに入ります。 + キャッシュに乗ったアイテムへのアクセス頻度が低いと判断されると、そのアイテムはRAM上から削除され、他のアイテムのためにスペースを確保します。 + 同様に、アクセス頻度の低いアイテムをディスクから取得した場合は、リクエストされたときにキャッシュ層に保存します。 + よりアクセス頻度の高いデータを高いパフォーマンスで提供するために、全体の情報のworking setを管理します。 + working setは、頻繁にアクセスされるデータで、パフォーマンス向上のためRAM上に保存されます。

+ + +

アクセス頻度が高いものをRAM上に、低いものをディスク上に保存するため、CouchbaseはRAMからディスクにデータを非同期で移動させます。 + この処理は、自動的に、バックグラウンドで非同期に行われます。 + Couchbaseは継続的にクライアントからのアクセス情報を監視し、アクティブなデータをキャッシュ層に残すように判断します。 + サーバーはリクエストに応え続けながら、メモリ上からディスクへとデータを移動します。 + 高頻度でのライト中は、サーバーがメモリからディスクへ十分なアイテムを書き出すまで、クライアントは一時的なOut Of Memoryの通知を受けます。 + 非同期である性質と、この方法でキューを使うことで、非常に高速なリード/ライトのパフォーマンスを実現しています。 + そうすることで、従来のRDBMSが不安定なパフォーマンスであることの典型的な要因である、ロードやパフォーマンスのスパイクを排除しています。 +

+ + +

サーバーがディスクにデータを書き込むとき、またクライアントがデータをリクエストするときに、個別のドキュメントIDが送られ、 + サーバーは情報が存在するかどうかを判断します。 + CouchbaseServerは、メタデータの構造をもとに、この動作をします。 + メタデータは、データベース内の各ドキュメントの情報であり、RAM上に保存されています。 + したがって、サーバーは、無効なドキュメントIDに対しては"document ID not found"を返し、RAM上にあればRAMからデータを返し、RAM上にない場合は、ディスクから取得したデータをクライアントに返します。

+ + +
注: 常にディスクにリード/ライトするデータベースソリューションは、非常に低速なパフォーマンスとなります。 + 他のデータベースソリューションで利用されるアプローチには、データベースと強調して動かす別コンポーネントとしてキャッシュ層をインストールし管理する方法が有ります。 + しかし、このアプローチの欠点は、膨大な量のカスタムコードにより、キャッシュ層の管理やデータベースとキャッシュ層とのデータ転送を自身で管理する必要があることです。
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-client-interface.html b/preview/contents/Concepts/concept-client-interface.html new file mode 100644 index 0000000..b9e8dcb --- /dev/null +++ b/preview/contents/Concepts/concept-client-interface.html @@ -0,0 +1,85 @@ +クライアントインタフェース
+

クライアントインタフェース

+ + +

+ + +

+ Couchbase Serverでは、データベースから情報を取得、あるいは格納する際に、アクセスするデータのレベルや量に応じて、異なる技術やシステムを利用します。 + それぞれの方法は、作成・取得・更新・削除という基本的なオペレーションに分類することが出来ます。

+ + +

作成

+

情報は、特定のkeyに対応するvalueとして、memcachedプロトコルインターフェースを利用して、データベースに保存されます。 + バルクオペレーションを用いることで、同時に大量のドキュメントのkey/valueをセットすることが出来ます。 + これは、小さなリクエストを何度もすることに比べ、より効果的です。

+ +

valueは、構造化された、あるいは非構造な文字列、ネイティブクライアントによってシリアライズされたオブジェクト、 + また、ネイティブなバイナリデータ(画像や音声など)、全てのバイナリバリューを取ることが出来ます。 + ただし、Couchbase ServerのViewエンジンを使うためには、情報はネストされたフィールド・配列・スカラーデータで構成されている + JavaScript Object Nation(JSON)フォーマットで保存されている必要があります。 +

+
+ + +

取得

+ +

データベースから情報を取り出すには、「Keyで取得」もしくは「Viewで取得」の二つの方法が利用できます。

+ +
    +
  • Keyで取得

    特定のValueに対応するKeyが分かるのなら、memcachedプロトコル(もしくは、memcached互換のクライアントライブラリ)を用いて + 特定のKeyからValueを取得すればいいでしょう。 + 同じ方法で、バルクオペレーションも利用できます。 +

    +
  • + +
  • Viewで取得

    Keyが分からなければ、必要な情報を取得するためのViewを書くことで、Viewシステムを使うことも出来ます。 + Viewはデータベースに保存された各JSONオブジェクトから、一つ以上の行を生成します。 + Viewの定義は、(特定の情報もしくは、情報のレンジを選択するための)keyとvalueを含みます。 + 例えば、連絡先名に対して連絡先アドレスをvalueにもつ、連絡先情報のビューを作ったとします。 + 各Viewは、オリジナルのオブジェクトの保存に使われるキーも出力します。 + Viewが必要な情報を含んでいなかった場合でも、Viewが返すkeyとmemcachedプロトコルを用いて、完全なレコードを取得することができます。 +

    + +
  • + +
+ +
+ + +

更新

+ +

データベースの情報をアップデートするためにはmemcachedプロトコルのインターフェースを使う必要があります。 + memchacedプロトコルは、すべてのコンテンツを直接アップデートするだけでなく、 + 既存レコードに情報を付加したりintegerで保存されているvalueをインクリメントしたりデクリメントすることも出来ます。

+ +
+ + +

削除

+

Couchbase Serverから情報を削除するには、memchachedプロトコルを利用して、 + key/valueのペアを削除する明確なdeleteコマンドを使用する必要があります。 +

+ +

しかしながら、Couchbase Serverは情報に有効期限(expiry value)をつけてデータベースに保存することも出来ます。 + expirity valueは、そのkey/valueペアが、いつ自動的にデータベース全体から削除されるべきかを示すデータで、 + 相対時間(例:60秒間)もしくは絶対時間(例:2012年12月31日)という形式で指定します。 +

+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-clusterMgr.html b/preview/contents/Concepts/concept-clusterMgr.html new file mode 100644 index 0000000..df2e2b6 --- /dev/null +++ b/preview/contents/Concepts/concept-clusterMgr.html @@ -0,0 +1,55 @@ +クラスタマネージャ
+

クラスタマネージャ

+ + +

クラスタマネージャはノードとクラスタの管理を担当します。Couchbaseクラスタ内のすべてのノードはクラスタマネージャコンポーネントを有しています。

+ +

クラスタマネージャはクラスタ内の以下の事項を管理します:

+ +
    +
  • クラスタの管理

    +
  • + +
  • ノードの管理

    +
  • + +
  • ノードの監視

    +
  • + +
  • 統計情報の収集と集約

    +
  • + +
  • ランタイムロギング

    +
  • + +
  • マルチテナント

    +
  • + +
  • 管理用あるいはクライアントからのアクセスに対するセキュリティ

    +
  • + +
  • リクエストをリダイレクトするクライアントプロキシサービス

    +
  • + +
+ +

クラスタマネージャへのアクセスは、専用のネットワークポートによる管理用インタフェース、もしくはクライアントアクセス用の専用ネットワークポートを経由して提供されます。加えて、ノード間のコミュニケーション用に幾つかのポートを利用します。 +

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-dataStorage.html b/preview/contents/Concepts/concept-dataStorage.html new file mode 100644 index 0000000..ab8c615 --- /dev/null +++ b/preview/contents/Concepts/concept-dataStorage.html @@ -0,0 +1,339 @@ +データストレージ
+

データストレージ

+ + + +

+Couchbase Serverはバケットを利用してデータ管理サービスを提供します。 +バケットは分離された仮想のデータコンテナです。 +ひとつのバケットはCouchbase Serverクラスタ内にある複数の物理的なリソースの論理的グループです。 +

+ +

+バケットはデータストレージリソースを組織し、管理し、分析するセキュアなメカニズムを提供します。 +データバケットにはmemcachedCouchbaseの二種類があり、インメモリのみ、もしくはインメモリとディスクの両方(信頼性を高める)から選ぶことができます。 +Couchbase Serverの設定時に、利用用途に応じて適切なバケットタイプを選択してください。 +

+ + +
注: バケットはクラスタ全体で複数のクライアントアプリケーションから利用することができます。
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
バケットタイプ説明
Couchbase +永続化とレプリケーションにより可用性の高い、動的に変更可能な分散データストレージです。 +Couchbaseバケットはオープンソース分散キーバリューキャッシュであるmemcachedをベースにしており、memcachedプロトコルと100%互換性があります。 +
memcached +直接アドレス指定型の、分散(スケールアウト) インメモリ キーバリューキャッシュです。 +memcachedバケットはリレーショナルデータベーステクノロジと併用して使用するように設計されており、 +Webアプリケーションを提供するWebサーバ群からの、データベースクエリ回数を削減できます。 +
+
+ +

+バケットタイプにより特性が異なります。 +

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
特性memcachedバケットCouchbaseバケット
アイテムサイズ上限1 MB20 MB
永続化不可可能
レプリケーション不可可能
リバランス不可可能
統計情報インメモリ統計情報のみ全て
クライアントサポートmemcachedクライアント、Ketamaコンシステントハッシュの利用が必要スマートクライアント
XDCR不可可能
バックアップ不可可能
Tap/DCP不可可能
データアクセス暗号化不可可能
+
+ + +

+Couchbaseバケットタイプはノード障害に対応する高い可用性を持ち、リクエストを受け付けている間でも、 +クラスタを動的に再設定が可能な分散データストアを提供します。 +Couchbaseバケットタイプには次の特性があります:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Couchbaseバケットの特性説明
キャッシュ +Couchbaseバケットに対するオペレーションはRAMを経由して行われます。 +データはRAM上に保持され、ディスクに永続化されます。 +設定されたRAM容量が不足するまで、データはRAM上にキャッシュされ、RAMが枯渇するとデータはRAMから除去されます。 +リクエストされたデータがRAM上に存在しない場合、データを自動的にディスクからロードします。 +
永続化 +データオブジェクトはサーバの再起動や障害からデータを保護するため、非同期にメモリからハードディスクリソースへと永続化されます。 +永続化の設定はバケット単位に行います。 +
レプリケーション +Couchbaseバケット内の全データオブジェクトのコピーを受信するレプリカサーバの台数を設定可能です。 +ホストマシンに障害が発生した場合、フェイルオーバを行い、レプリカサーバをホストサーバへと昇格することで、 +高い可用性を持つクラスタを提供することができます。 +レプリケーションはバケット単位に設定します。 +
リバランス +リバランスは複数のリソース間で負荷を分散させることができ、動的にクラスタ内のバケットやサーバの追加および削除を行うことができます。 +
+
+ + +

+memcachedバケットもCouchbaseバケットも、SASLによる認証を設定可能です。認証をしない設定も可能です。 +

+ +

バケットの認証設定には次の種別があります:

+ +
+ +
デフォルトバケット
+ +
+デフォルトバケットは必ずポート11211でリスンするCouchbaseバケットです。 +SASL認証を適用することはできません。 +Couchbase Serverを初めてインストールする場合、インストールの途中でデフォルトバケットは自動的にセットアップされます。 + +インストール終了後にデフォルトバケットの削除すること、その後再作成することもできます。 +defaultという名前のバケットを作成する場合、 +11211ポートを設定する必要があり、SASL認証は利用できません。 + +default以外の名前で非SASLのバケットを作成する場合、 +11211ポートを設定することはできません。 +defaultバケットはvBucket対応のスマートクライアント、ASCIIクライアント、SASL認証を利用しないバイナリクライアントから接続することができます。 +
+ + + +
非SASLバケット
+ +
+非SASLバケットは、default以外の名前の場合、 +11211を除く任意の空きポートを設定できます。 +個別のポートを設定できるのは、非SASLバケットだけです。 +非SASLバケットはvBucket対応のスマートクライアント、ASCIIクライアント、SASL認証を利用しないバイナリクライアントから接続することができます。 +
+ + + +
SASLバケット
+ +
+SASL認証を利用するCouchbaseバケットは11211ポートのみ設定できます。 +そして各バケットはバケット名とパスワードで識別されます。 +SASLバケットは11211ポート以外に配置することはできません。 +vBucket対応のスマートクライアント、SASL対応のバイナリクライアントから接続できます。 +ASCIIクライアントからはSASLバケットには接続できません。 +

+スマートクライアントはCouchbase管理用REST APIを利用して、クラスタ内の変更を検知します。 +複数のSASLバケットを利用して各アプリケーションを分離し、マルチテナントとして利用可能です。 +あるいはキャッシュ内のデータタイプを分離し、パフォーマンスと閲覧性を向上することができます。 +Couchbase Serverはまた、バケット毎に異なるポートを設定することができ、 +SASL認証を利用したバイナリプロトコル、もしくは認証なしのASCIIプロトコルで、分離したバケットにアクセスするか選択できます。 +

+ +

+Couchbase ServerはCouchbaseとmemcachedといった異なる種別のバケットを同一の環境で混在させることができます。 +異なるバケット種別であっても、同じリソースプールとクラスタリソースを共有します。 +

+ +

+RAM割当量やディスク利用はバケット単位に設定可能で、クラスタ全体でのリソース利用を管理できます。 +稼働中のクラスタに対して割当量の変更ができ、利用方法や優先度が変わるにつれ、管理者はリソースを再割り当て可能です。 +

+ +
+ + +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-diskStorage.html b/preview/contents/Concepts/concept-diskStorage.html new file mode 100644 index 0000000..7b1119f --- /dev/null +++ b/preview/contents/Concepts/concept-diskStorage.html @@ -0,0 +1,45 @@ +ディスクストレージ
+

ディスクストレージ

+ + +

Couchbase Serverでは、クライアントからの情報の保存や取得に対しRAMを主に利用します。 + 同時に、Couchbase Serverは、より高い信頼性を持たせるため、全てのデータをディスク上に保存し永続化します。 +

+ +

キャッシュ層にデータを書き出し、ディスクに永続化するためのディスク書込みキューにデータを追加します。 + ディスクへの永続化により、バックアップ及びリストアが可能となり、またキャッシュ層よりも大きなデータセットを扱うことが出来ます。 + このディスクストレージプロセスはeventual persistenceと呼ばれ、ディスクに書き込んでいる間にクライアントの操作がブロックされることはありません。 +

+ +

+ もしノードがダウンし、キャッシュ層の全データを失っても、それらのアイテムはディスクから復旧されます。 + サーバーが、アイテムがアクティブなメモリ上に無く、ディスクから読み込む必要があると特定すると、 + その処理は読込みキューを利用し、ディスクからメモリへと情報を読み込むバックグラウンドプロセスによって処理されます。 + クライアントは、データがメモリ上に読み込まれた後に、情報を取得することが出来ます。 +

+ +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-doc-delete.html b/preview/contents/Concepts/concept-doc-delete.html new file mode 100644 index 0000000..6137a93 --- /dev/null +++ b/preview/contents/Concepts/concept-doc-delete.html @@ -0,0 +1,34 @@ +ドキュメントの削除
+

ドキュメントの削除

+ + +

Couchbase Serverは、クライアントが明示的にアイテムの削除を実行した場合、 + もしくはアイテムのexpiration valueが期限に達した場合、以外ではディスクからアイテムが削除されることはありません。 +

+ +

排出メカニズムは、RAMからアイテムを削除しますが、keyのコピーとドキュメントのメタデータは引き続きRAM上に保存され、 + またドキュメントのコピーはディスク上に保持されます。 +

+ +
重要: + Couchbase Serverでmemchacedバケットのみを使用している場合、キャッシュ層のみをストレージとして使用し、ディスクへの永続化はされません。 + その場合、RAMのスペースがなくなると、アイテムはleast recently used basis(LRU)のルールに従い、RAMから削除されます。 + これは、key, メタデータ, その他全てのそのアイテムに関するデータをRAMから削除することを意味します。 + 削除後に、そのアイテムを復元することは出来ません。 +
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-docExpiration.html b/preview/contents/Concepts/concept-docExpiration.html new file mode 100644 index 0000000..ae31eb2 --- /dev/null +++ b/preview/contents/Concepts/concept-docExpiration.html @@ -0,0 +1,41 @@ +アイテムの有効期限
+

アイテムの有効期限

+ + +

+ データベースに保存された各ドキュメントは、自動的にアイテムを削除するために、オプションで有効期限(TTL、Time to Live)を設定することができます。 +

+ +

有効期限の設定は生存期間の限定されたデータなど、自動的に削除するデータに利用できます。  +

+ +

+ 有効期限はオブジェクトをCouchbase SDKを利用して生成、更新、変更する際に、ドキュメント単位にユーザが指定可能です。 + もし30日未満でオブジェクトを削除したい場合、TTLを秒、もしくはUnixエポックタイムで指定します。 + もし30日より後に有効期限を設定したい場合、TTLをUnixエポックタイムで指定する必要があります。 + 例えば、1 095 379 198のように、1970年からの秒数となります。 +

+ + +

+ デフォルトでは有効期限は設定されません、すなわち、情報は永久に保持されます。 + 典型的な利用例としては、ユーザのセッションデータを保存し、ユーザのアクティビティが停止した際にシステムから情報を削除する場合などです。 + 有効期限を利用すると、データは期限切れとなり、明示的に削除しなくてもシステムから削除されます。 + これによりRAMとディスクを他のアクティブなデータに利用できます。 +

+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-intro.html b/preview/contents/Concepts/concept-intro.html new file mode 100644 index 0000000..653b326 --- /dev/null +++ b/preview/contents/Concepts/concept-intro.html @@ -0,0 +1,50 @@ +アーキテクチャと概念

アーキテクチャと概念

+ + +

単一のCouchbase ServerインスタンスやCouchbaseクラスタを構成する、さまざまなコンポーネントやシステム、そしてCouchbase Serverデータベースの高速でエラスティックな性質、高可用性、高性能について理解するために必要となる情報や概念を含んでいます。

+

+
+
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-nodeFailover.html b/preview/contents/Concepts/concept-nodeFailover.html new file mode 100644 index 0000000..1c72198 --- /dev/null +++ b/preview/contents/Concepts/concept-nodeFailover.html @@ -0,0 +1,39 @@ +ノードのフェイルオーバ
+

ノードのフェイルオーバ

+ + +

フェイルオーバはクラスタ内のノードを利用不可と宣言し、レプリカvBucketを有効にする処理です。

+ +

情報は レプリカを利用してクラスタ内で分散されています、これはバケット内に保存されているデータの完全なコピーで、Couchbase Serverクラスタ内に保持されています。 Couchbaseバケットでは、レプリカ数を設定できます。

+ +

サーバ内で障害が発生した場合 (予期せぬ障害、あるいは管理目的で)、 フェイルオーバ という処理を実行し、クラスタ内の特定のノードが利用不可となり、フェイルオーバしたノードのレプリカvBucketを有効にします。

+ +

フェイルオーバ処理はレプリカとして稼働している各サーバに問い合わせ、クライアントからのドキュメントへのリクエストをCouchbase Serverにマッピングする内部のテーブルを更新します。

+ +

フェイルオーバは手動で、またはビルトインの自動フェイルオーバ処理を利用して自動的に実行することができます。 自動フェイルオーバはクラスタ内のノードが利用不可となった時、事前に設定した時間を経過した後に実行されます。

+ + +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-nodesCluster.html b/preview/contents/Concepts/concept-nodesCluster.html new file mode 100644 index 0000000..398cbb1 --- /dev/null +++ b/preview/contents/Concepts/concept-nodesCluster.html @@ -0,0 +1,43 @@ +ノードとクラスタ
+

ノードとクラスタ

+ + + +

Couchbase Serverはスタンドアロンでも、クラスタ構成でも利用できます。クラスタとは複数のCouchbase Serverが相互に接続することにより一つの分散データストアを構成することです。

+ + +
+ +
Couchbase Serverもしくはノード
+ +
EC2インスタンスやその他の環境の(物理または仮想)マシン上で稼働するCouchbase Serverインスタンスを指します。 +

すべてのインスタンスは等しく、同一の機能、インタフェース、システムを提供し、同一のコンポーネントで形成されています。

+
+ + + +
クラスタ
+ +
クラスタとは論理的に一つのクラスタとして構成された、一つ以上のCouchbase Serverインスタンスの集合です。クラスタ内のすべてのノードは等しく、同一の機能を提供します。 +すべてのノードはクラスタを管理することができ、またすべてのノードがクラスタに関する集約された統計情報や運用情報を提供することができます。 +ユーザデータはvBucketシステムによってクラスタ全体にわたって保存されます。 +

+クラスタは完全な水平分散として動作します。クラスタのサイズを拡張するには、ノードを追加します。 +特別な親子関係や階層構造は存在しません。これはCouchbase Serverがストレージ容量についても、パフォーマンスやスケーラビリティについても、リニアにスケールすることを意味しています。 +

+ +
+ + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-rack-awareness.html b/preview/contents/Concepts/concept-rack-awareness.html new file mode 100644 index 0000000..0cc0ffb --- /dev/null +++ b/preview/contents/Concepts/concept-rack-awareness.html @@ -0,0 +1,137 @@ +ラックアウェアネス
+

ラックアウェアネス

+ + + +

ラックアウェアネス機能は、ラックやアベイラビリティゾーンにそれぞれのサーバグループが物理的に属しているクラスタにおける、論理的グループを可能にします。

+ +
Attention: この機能はエンタープライズエディションのみで利用可能です。
+ +

ラックアウェアネスはアクティブなパーティションと対になるレプリカのパーチションが、異なるラックあるいはゾーンに所属するサーバ上に生成されるように指示することができます。 +ラックアウェアネスを有効化して利用するには、クラスタ内のすべてのサーバをCouchbase Serverエンタープライズエディションのバージョン2.5移行にアプグレードする必要があります。 +設計上、Couchbase Serverはクラスタの性能と冗長性を目的として、アクティブとレプリカのvBucketデータをクラスタ内で均一に分散します。 +ラックアウェアネスを利用すると、一つ目のサーバグループに所属するサーバのレプリカパーティションが、二つ目のグループに分散されるよう、サーバパーティションを配置します。逆もまた然りで、二つ目のグループのレプリカを一つ目のグループに配置します。 +もしサーバのひとつが利用不可となるか、あるいはラック全体がダウンしてしまっても、レプリカは二つ目のサーバグループで利用可能であるため、データは保持されます。 +

+ +

レプリカvBucketは冗長性とデータの可用性を高めるため、一つ目のサーバグループからもう一方のサーバグループへと等しく分散されます。 +リバランス操作もまた、レプリカvBucketを一つ目のサーバグループからクラスタ内のもう一方のサーバグループへと均一に分散します。 +もしあるサーバグループ内のサーバ台数が異なり、不均等な状態となると、リバランス操作は「ベストエフォート」としてレプリカvBucketがクラスタ内で均等に分散されるように処理します。 +

+ +

vBucketの分散とレプリカvBucket

+ +

以下の例では、ラックアウェアネスがどのように機能し、レプリカvBucketにより冗長性を実装しているのかを示しています。 +この例では、クラスタ内に二つのサーバグループが存在し、4つのサーバがそれぞれのサーバグループに存在します。 +各サーバグループ内のサーバ台数が等しいので、クラスタはバランスがとれており、片方のサーバグループのレプリカvBucketがもう一方のサーバグループ上にあることを保証します。

+ +

以下の図はラック#1とラック#2の二つのラックに、それぞれ4台ずつのサーバを配置したクラスタを示しています。 +

+ +
    +
  • グループ1にはサーバ1、2、3、4。
  • + +
  • グループ1は自身のアクティブvBucketと、グループ2のレプリカvBucketを保持。
  • + +
  • グループ2にはサーバ5、6、7、8。
  • + +
  • グループ2は自身のアクティブvBucketと、グループ1のレプリカvBucketを保持。
  • + +
+ + +
Figure 1. ラックアウェアネス +
+ +
+ + +

サーバ追加による分散

+ +

以下のシナリオはラックアウェアネスが、ひとつのサーバグループにサーバを追加することで不均等な状態になった際に、どのようにレプリカvBucketを実装しているかを示しています。 +この例では、サーバグループ1にサーバ9を追加しています。 +あるサーバグループが他のサーバグループよりも多くのサーバを所持しているため、不均等な状態となります。 +この場合、リバランス操作は「ベストエフォート」として、追加されたサーバのレプリカvBucketをクラスタ内のすべてのラックに属するノードに均等に分散するよう動作します。 +

+ +

以下の図はラック#1とラック#2の二つのラックで、ひとつのラックには5台のサーバ、もう一方には4台のサーバを配置したクラスタを示しています。 +

+ +
    +
  • グループ1にはサーバ1、2、3、4、そして9。
  • + +
  • グループ1は自身のアクティブvBucketと、グループ2のレプリカvBucketを保持。
  • + +
  • グループ1のサーバ1-4は、サーバ9のレプリカvBucketも保持する
  • + +
  • グループ2にはサーバ5、6、7、8。
  • + +
  • グループ2のサーバは自身のアクティブvBucketと、サーバ9を含むグループ1のvBucketを保持。 +
  • + +
+ + +
Figure 2. サーバ追加時のラックアウェアネス +
+ +
+ + +

サーバ障害と分散

+ +

以下のシナリオでは、ラックアウェアネスが、あるサーバグループのサーバが削除される、あるいは利用不可となった場合に、どのようにレプリカを実装しているのかを示しています。 +この例では、グループ1に属するサーバ2が利用不可となっています。 +あるサーバグループが他のサーバグループよりも少ないサーバ数であるため、不均等な状態が起きています。 +この場合、リバランス操作を行うと、「ベストエフォート」として、レプリカvBucketをクラスタ全体で均等に分散するように動作します。 +

+ + +
Note: +クラスタが不均等になった場合、サーバを追加しクラスタのバランスをとってください。ラックアウェアネスが最適に動作するために、バランスのとれたクラスタを推奨します。サーバが1台しかない、もしくはサーバグループがひとつしかない場合、ラックアウェアネスを利用しないデフォルトの動作となります。 +
+ + +

以下の図はサーバの消失によって不均等となった様子を示しています。 +この例では、サーバ2(グループ1、ラック#1)が利用不可となっています。 +ラック#2のグループ2にあるサーバ2のレプリカvBucketが有効化され、クラスタは不均等な状態になります。 +

+ +
    +
  • グループ1にはサーバ1、2、3、4。
  • + +
  • グループ1のサーバは自身のアクティブvBucketとグループ2のレプリカvBucketを保持。 +
  • + +
  • グループ1のサーバ2が利用不可に。
  • + +
  • グループ2にはサーバ5、6、7、8。
  • + +
  • グループ2のサーバは自身のアクティブvBucketとグループ1のレプリカvBucketを保持。 +
  • + +
  • グループ2のサーバは、グループ1、サーバ2のレプリカvBucketをアクティブ化。
  • + +
+ + +
Figure 3. サーバ障害とラックアウェアネス +
+ +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-ramQuota.html b/preview/contents/Concepts/concept-ramQuota.html new file mode 100644 index 0000000..479b8f6 --- /dev/null +++ b/preview/contents/Concepts/concept-ramQuota.html @@ -0,0 +1,73 @@ +RAM割当量
+

RAM割当量

+ + + +

+RAMはCouchbase Serverに次の割当量として設定されます: + サーバ割当量バケット割当量

+ + +
+
Server割当量
+ +
+サーバ割当量は、Couchbase Serverをインストール時に、サーバに割り当てるRAMです。 +これはCouchbaseが全バケットのキャッシュデータ用に利用する、ノード単位のRAM容量上限となります。 +サーバ割当量はクラスタ内の1台目のサーバ設定時に設定し、すべてのノードで割当量は同じになります。 +例えば、10ノードで16GBのサーバ割当量とした場合、160GBのRAMがクラスタ全体で利用可能となります。 +その後クラスタに二台のノードを追加すると、新しいノードは16GBの空きRAMが必要となり、 +クラスタ全体の利用可能なRAM容量は192GBになります。 +
+ + + +
バケット割当量
+ +
+バケット割当量は個別のバケットに対して、キャッシュデータ用に割り当てるRAM容量です。 +バケット割当量はノード単位の設定であり、サーバ割当量で指定したRAMから割り当てられます。 +例えば、1GBのバケット割当量で新規にバケットを作成する場合、 +10ノードのクラスタでは、クラスタ全体で合計10GBのバケット割当量となります。 +その後2台のノードをクラスタに追加すると、合計のバケット割当量は12GBとなります。 +
+ + +
+ + +

+次の図は新しいノードを追加することで、クラスタ全体のRAM割当量とバケット割当量を拡張し、RAMに保存可能な情報量を増加している様子を表しています。 +

+ + + + +

+バケット割当量はいつメモリからデータを除去するべきかシステムが判断するために利用します。 +バケット割当量はサーバ割当量の上限以内であれば、動的に変更可能で、 +バケット単位にメモリにキャッシュされる情報を制御することができます。 +よって、キャッシュ用のRAM割当量要件に応じてバケットを設定が可能となります。 +

+ + +
注: +サーバ割当量も動的に変更可能ですが、指定したRAM割当量をクラスタ内のノードで利用可能である必要があります。 +
+ +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-readerWriter.html b/preview/contents/Concepts/concept-readerWriter.html new file mode 100644 index 0000000..1b99bbf --- /dev/null +++ b/preview/contents/Concepts/concept-readerWriter.html @@ -0,0 +1,49 @@ +複数のreaderとwriter
+

複数のreaderとwriter

+ + + +

マルチスレッドのreaderとwriterは複数のプロセスが同時並列でディスク上のデータを読み書きできるようにします。 同時並列の読み書きはディスクスピードを向上し、ディスクからの参照レートを向上します。

+ + +

複数のreader、writerはディスクに永続化されたデータに対応しています。 以前のCouchbaseサーバは、各サーバインスタンスで単一のディスクreader、writerスレッドのみを利用していました。

+ +

単一のread/writeスレッドがディスクハードウェアのスピードに追いつかない場合、ディスクスピードを増加できます。 単一のread/writeスレッドが引き起こすもう一つの問題は、RAMではなくディスク上に大部分のデータがある場合、これらのデータをリクエストした時により多くのキャッシュミスによる影響が発生する点です。

+ + + + +
注: Couchbase Serverクラスタでは、以前のバージョンのCouchbase Serverと、新しいバージョンのCouchbase Serverを同居させることができます。 2.1以前のノードはデータバケットに対し、単一のreader/writerを利用し続けます。 + 2.1以降のノードは複数のreader、writerを利用します。
+ + +

+ サーバノードをアップグレードすると、バケットの再起動とウォームアップにより複数のreaderとwriter設定が有効となります。 この場合、新規ノードをインストールし、クラスタに追加し、既存バケットの設定でreaderとwriterを変更します。

+ +

クラスタをリバランスすると、新規ノードが複数のreaderとwriterを利用して読み書きを実行し、データバケットは再起動またはウォームアップを必要としません。 すべての既存の2.1以前のノードはデータバケットに対し、単一のreader/writerを利用し続けます。 2.1以前のノードをアップグレードし、クラスタに追加すると、これらの新規ノードは自動的にバケットに対する複数のreaderとwriterの設定を反映します。

+ + + + +

マルチスレッドのエンジンは、競合を避けるために、同一のデータキャッシュにアクセスする複数のスレッド間での同期を追加しています。 データへの競合を回避しつつ、パフォーマンスを維持するために、Couchbase Serverはスレッド間でロックを利用し、静的なパーティションによるvBucket間でスレッドの割り当てを行っています。

+ +

Couchbase Serverが複数のreader、writerスレッドを作成する際、サーバは各スレッドでのvBucket範囲を算定し、各スレッドを特定のvBucketに排他的にアサインします。 + この静的なスレッド割り当てにより、サーバは常に単一のreaderと単一のwriterスレッドのみが、同一のvBucketにアクセスするようにしています。 + このイメージは6つの事前に割り当てられたスレッドと2つのデータバケットを示しています。 + 各スレッドは参照、更新アクセス用に、静的に分割されたvBucketの範囲を保持しています。

+ + + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-rebalancing.html b/preview/contents/Concepts/concept-rebalancing.html new file mode 100644 index 0000000..70c326d --- /dev/null +++ b/preview/contents/Concepts/concept-rebalancing.html @@ -0,0 +1,68 @@ +リバランス操作
+

リバランス操作

+ + + +

リバランス操作はクラスタサイズを拡張または縮小、フェイルオーバへの対処、様々なアップグレードのために一時的にノードを削除するために実行します。

+ +
リバランス操作中は: +
    +
  • 新しいCouchbase Serverクラスタ構成を利用し、各ノード上のvBucketのデータを古い構成から移動します。 この処理はクラスタ内の各ノード上のvBucket内にあるデータを交換します。 このため、二つの影響を与えます:

    + +
      +
    • クラスタから削除されたマシンのデータを削除する。 これらのマシン上のデータストレージを完全に削除することで、削除されたノードを、クラスタ操作に影響を与えることなく、クラスタから削除できるようになります。

      +
    • + +
    • クライアントからの情報をサービスできるように、データを追加し、新規ノードを有効にします。 アクティブデータを新規ノードに移動することで、これらのノードは移動されたvBucketを担当することになり、クライアントリクエストを処理します。

      +
    • + +
    +
  • + +
  • リバランスはRAM内に保存されたデータ、ディスク内に保存されたデータの両方を移動します。 これをクラスタ内のすべてのノード、すべてのバケットで実行します。 移動にかかる時間はクラスタ活動の度合い、保存された情報量に依存します。

    +
  • + +
  • リバランス中でもクラスタは稼働し、継続してクライアントリクエストを処理します。 + データ移行処理の最中に保存されたデータが更新または変更されても、それらはリバランスがリクエストされた時点で存在したデータとともに更新され、移行されます。

    +
  • + +
  • クラスタ内のどのノードがクライアントリクエストの処理を担当するかを特定する現在のvBucketマップは、各vBucketが移動するとインクリメンタルに更新されます。 更新されたvBucketマップはCouchbaseクライアントライブラリやスマートクライアントとして稼働するサービス(Moxiなど)に転送され、リバランスが進むにつれて、クライアントが更新された構成を利用できるようにします。 このため、新しい構成が即座に利用されることを保証し、リバランス操作中の負荷を均等に拡散することを可能としています。

    +
  • + +
+
+ +

クラスタはリバランス処理中でもアクティブに稼働しているので、クライアントは情報の保存や取得を継続することができ、リバランス操作が実行されていることを気にする必要はありません。

+ +

リバランス操作を実行する4つの主な理由があります:

+ +
    +
  • クラスタのサイズを拡張するためにノードを追加する。

    +
  • + +
  • クラスタのサイズを縮小するためにノードを削除する。

    +
  • + +
  • フェイルオーバ発生後の対応として、クラスタを健全な状態に復元する。

    +
  • + +
  • 一時的に一つ以上のノードを削除し、ソフトウェア、オペレーティングシステム、またはハードウェアのアップグレードを行う。

    +
  • + +
+ +

直接的な理由に関わらず、リバランスの目的は、設定されたノード、バケット、レプリカへと現在のクラスタの状態を一致させ、クラスタを健全な状態に遷移させることです。

+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-replication.html b/preview/contents/Concepts/concept-replication.html new file mode 100644 index 0000000..2965ca7 --- /dev/null +++ b/preview/contents/Concepts/concept-replication.html @@ -0,0 +1,34 @@ +レプリカとレプリケーション
+

レプリカとレプリケーション

+ + + +

レプリカはクラスタ内の他のノード上に作成されるデータのコピーです。

+ +

クラスタ内で情報を均等に分散させ、性能を向上させることに加え、同一のクラスタ内でレプリカvBucketを作成することができます。

+ +

ソースとなるノードから他のノードへとコピーされたバケットのデータのコピーをレプリカ、またはレプリカvBucketと呼びます。レプリカvBucketを保持するノードを、レプリカノードと呼びます。レプリケートされるオリジナルデータを保持するノードをソースノードと呼びます。レプリカデータの分散はソースノードにおけるデータの分散と同様に処理されます。レプリカデータの一部分がクラスタ内で分散され、単一障害点を回避します。

+ +

Couchbaseがレプリカデータを宛先のノードに保存すると、そのデータは宛先ノード上のディスクに永続化するために、宛先ノードのキューに追加されます。

+ +

二つのCouchbaseクラスタ間でレプリケーションを実行することを、クロスデータセンタレプリケーション (XDCR) と呼びます。 + XDCRはデータをよりユーザに近いクラスタにコピーしたり、ディザスタリカバリ用途としてのバックアップに利用できます。

+ +
+ + + + +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-serverWarmup.html b/preview/contents/Concepts/concept-serverWarmup.html new file mode 100644 index 0000000..f8949e1 --- /dev/null +++ b/preview/contents/Concepts/concept-serverWarmup.html @@ -0,0 +1,112 @@ +サーバウォームアップ
+

サーバウォームアップ

+ + +

Couchbase Serverを再起動、またはサーバインスタンスにデータをリストアすると、サーバはデータリクエストを受け付ける前にウォームアップ処理を実行します。

+ +

ウォームアップ中、Couchbase Serverはディスクに永続化されたデータをRAMにロードします。

+ +

Couchbase ServerはディスクからRAMへとシーケンシャルにデータをロードする最適化されたウォームアッププロセスを提供します。 + ロードするデータを分割し、複数のフェーズで処理します。 ウォームアッププロセスが完了すると、クライアントからデータの読み書きが可能になります。 システムサイズ、システム設定、システムに永続化されたデータ量に応じて、サーバウォームアップに必要な時間は異なります。

+ +
注: Couchbase ServerはvBucketからすべてのキーとデータをロードする前にデータ提供を開始することもできます。
+ +

Couchbase Serverは頻繁に利用されるアイテムを特定し、それらを優先的に、他のデータをシーケンシャルにロードするよりも前にロードします。 頻繁に利用されるアイテムはアクセスログ内で優先されています。 + サーバは最も頻繁にアクセスされるキーのリストを事前に読み込み、それらのドキュメントを他のアイテムより先にディスクからフェッチします。

+ +

サーバは設定可能なスキャナプロセスでどのキーが最も頻繁に利用されているかを判定します。 + スキャナプロセスは事前に設定されていますが、変更も可能です。 コマンドラインツールの、cbepctl flush_param を利用すると、スキャナプロセスの初回実行時刻と、実行間隔を変更できます。 + 例えば、特定のキーをより早く利用可能とするために、スキャナプロセスが特定の時間帯に稼働させることができます。

+ +

サーバはすべてのキーに対するドキュメントをRAMにロードする前にアクセス可能な状態に遷移することもできます。 + 保存されたすべてのアイテムをロードする前にデータの提供を開始できます。 + アクセス可能状態への遷移は変更可能な設定で、サーバのウォームアップ時間を調整できます。

+ +

ウォームアップの初期フェーズでは、Couchbase Serverは全てのキーとメタデータをディスクからフェッチし始めます。 その後、サーバはログ情報にアクセスし、最も利用されるキーを取得する:

+ + +
+ +
1. 初期化
+ +
このフェーズ中はまだ、Couchbase Serverは提供するデータを一切持っていません。 記録された各vBucketの初期ステータスをロードし、ディスクに保存された全てのvBucketのリストを作成します。
+ + +
+ +
+ +
2. キーダンプ
+ +
Couchbase ServerはvBucketリスト内のアイテムをベースに、ディスクから全てのキーとメタデータを事前にフェッチします。
+ + +
+ +
+ +
3. アクセスログのチェック
+ +
Couchbase Serverはどのキーが頻繁にアクセスされたかを示す、単一のキャッシュされたアクセスログを読み込みます。 + サーバは定期的にこのログをメンテナンスしています。スケジュールは変更可能です。 + このログが存在する場合、サーバはまず、ログをに記載のアイテムを他のアイテムより先にロードします。
+ + +
+ + +

Couchbase Serverがキーに関する情報を得て、アクセスログの情報を読み込むと、続いて以下の条件でドキュメントをロードします:

+ +
+ +
アクセスログに基づきロードする
+ +
Couchbase Serverはアクセスログで特定された頻繁に利用されるアイテムに基づき、ドキュメントをメモリへとロードします。
+ + +
+ +
+ +
データのロード
+ +
アクセスログが空か無効な場合、Couchbase ServerはシーケンシャルにvBucketリスト上の各キーのドキュメントをロードします。
+ + +
+ +

Couchbase Serverは以下のウォームアップ中に以下の条件のいずれかを満たす時、RAMからの情報の提供を開始できます:

+ +
    +
  • サーバがアクセスログに記載の全てのキーに対するドキュメントのロードを完了したとき。
  • + +
  • サーバが全てのvBucketで保存された各キーのドキュメントのロードを完了したとき。
  • + +
  • メモリへのロード済みドキュメントの割合が、cbepctl ep_warmup_min_items_thresholdパラメータ設定以上となったとき。
  • + +
  • ドキュメントで利用された総RAM容量に対する割合が、cbepctl ep_warmup_min_memory_thresholdパラメータ設定以上となったとき。
  • + +
  • ノードのRAM利用量がmem_low_wat設定以上となったとき。
  • + +
+ +

Couchbase Serverがいずれかの状態に達すると、 run levelとなり、残りのキーのドキュメントのロードは停止し、残りのドキュメントはバックグラウンドフェッチでディスクからRAMへとロードされます。

+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-tombstone.html b/preview/contents/Concepts/concept-tombstone.html new file mode 100644 index 0000000..538d35f --- /dev/null +++ b/preview/contents/Concepts/concept-tombstone.html @@ -0,0 +1,27 @@ +墓石(tombstone)の削除
+

墓石(tombstone)の削除

+ + +

墓石は、削除された、または期限切れとなったアイテムのキーとメタデータを保持するレコードです。

+ +

Couchbase Serverやその他の分散データベースは、ノード間やクラスタ間で結果整合性を提供するために、墓石を維持します。 墓石は、削除された、または期限切れとなったアイテムのキーとメタデータを保持するレコードです。 Couchbase Serverはキーと、数バイトのメタデータを削除されたアイテムごとに二つの構造でノード単位に保存します。 数百万のデータ変更では、墓石によって消費されるデータ領域が高速に増加します。 これは特に大量の削除や期限切れドキュメントが存在する場合に顕著に現れます。

+ + +

メタデータ削除間隔は、ノードが削除または期限切れとなったアイテムのメタデータを完全に削除する頻度を設定します。 メタデータ削除間隔の設定は、自動コンパクションの一部として実行されます。 これにより以前と比べストレージ要件がおよそ3分の1に削減され、ディスク領域の解放も高速になりました。

+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-vBucket.html b/preview/contents/Concepts/concept-vBucket.html new file mode 100644 index 0000000..bc925d4 --- /dev/null +++ b/preview/contents/Concepts/concept-vBucket.html @@ -0,0 +1,105 @@ +vBuckets
+

vBuckets

+ + +

+ vBucketはCouchbaseクラスタにおけるキー空間のサブセットの所有者を定義します。 + vBucketはクラスタ内で効率的に情報を分散するために利用されます。 +

+ +

+ vBucketシステムは、1つ以上のノードによるデータの分散と、レプリカ(バケットデータのコピー)を実現するために利用されます。 + vBucketはユーザがアクセス可能なコンポーネントではありませんが、Couchbase Serverの重要なコンポーネントであり、 + 可用性と伸縮性のために非常に重要です。 +

+ +

+ クライアントはvBucketを担当するノードに直接接続して、バケットに保存された情報にアクセスします。 + プロキシや再配布のアーキテクチャを利用せず、データを保持するノードに直接接続します。 + 結果として、物理的なトポロジを、論理的なデータパーティションから分離します。 + このアーキテクチャが、Couchbase Serverに伸縮性と柔軟性をもたらしています。 +

+ +

+ すべてのドキュメントIDはvBucketに属しています。マッピング関数によって、ドキュメントがどのvBucketに属するのかを計算できます。 + Couchbase Serverではこのマッピング関数はハッシュ関数であり、ドキュメントIDを入力としてvBucketのIDを出力します。 + vBucketのIDを計算したあと、そのvBucketを"ホスト"するサーバを、テーブルから参照します。 + このテーブルはvBucketごとに行があり、vBucketとそのホストサーバを関連付けています。 + このテーブル内で定義されている各サーバは通常、複数のvBucketを担当します。 +

+ + +

以下の図はキーがサーバにマッピングされている様子(vBucketマップ)を示しています。

+ + +

+ このシナリオでは、クラスタ内に3台のサーバがあり、クライアントがKEYのバリューをGET操作により参照しようとしています。 +

+ + +
    +
  1. + クライアントはまず、キーをハッシュ化して、KEYが所属するvBucketを計算します。 + この例では、ハッシュの結果、vBucket 8(vB8)となります。 +
  2. + +
  3. + vBucketマップを参照し、クライアントはサーバCがvB8をホストしていることを知ります。 +
  4. + +
  5. + クライアントはGET操作を直接サーバCに送信します。 +
  6. + +
+ + + + +

+ 次のシナリオでは、3台のクラスタに新しくサーバを追加しています。 + 新規のサーバDがクラスタに参加すると、リバランス操作によって、vBucketマップが更新されます。 + 更新されたマップは、クラスタ内のその他のノード、すべての接続中の"スマート"クライアント、Moxiプロキシサーバといった、 + クラスタに接続するすべてのオブジェクトに送信されます。 +

+ + +

4台のクラスタとなったあと、クライアントが再度KEYのバリューをGET操作により取得すると:

+ +
    +
  • ハッシュアルゴリズムは依然としてvBucket 8(vB8)を出力します。
  • + +
  • 更新されたvBucketマップはvBucket 8をサーバDにマッピングしています。
  • + +
  • クライアントはGET操作を直接サーバDに送信します。
  • + +
+ + + + +
注: + このアーキテクチャによりCouchbase Serverは、典型的なRDBMSのシャーディング方式を利用せず変化に対応できます。 + また、memcachedが採用している、クライアント側でキーをハッシュし、定義されたリストからサーバを特定する方式とも異なります。 + memcachedの方式は、トポロジの変化に対応するために、サーバリストの継続的管理が必要であり、Ketamaなどの特定のハッシュアルゴリズムが必要になります。 +
+ + + + +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Concepts/concept-workingset-mgmt.html b/preview/contents/Concepts/concept-workingset-mgmt.html new file mode 100644 index 0000000..2586dc8 --- /dev/null +++ b/preview/contents/Concepts/concept-workingset-mgmt.html @@ -0,0 +1,251 @@ +ワーキングセットの管理とデータ除去
+

ワーキングセットの管理とデータ除去

+ + +

ワーキングセット管理は空き容量を解放し、最も利用されるアイテムがRAMに保持されるようにする処理です。 データ除去はデータをRAMから除去し、頻繁に利用されるアイテム用の空きを作る処理です。

+ +

Couchbase ServerがRAM内の容量を解放する処理、そして最も利用されるアイテムをRAM内に残す処理をワーキングセット管理と呼んでいます。 データ除去はデータをRAMから除去し、頻繁に利用されるアイテム用の空きを作る処理です。 データ除去はCouchbase Serverにより自動的に実行されます。 Couchbase Serverが情報を除去するとき、ディスク永続化システムと連携しRAM内のデータがすでにディスクへ永続化され、アイテムがリクエストされた場合はディスクから安全にRAMへと復元できるようにしています。

+ +

キャッシュ層のメモリ割当量に加え、エンジンがより多くのデータをディスクに永続化すべきかを判断するために利用する二つのウォータマークがあります。 それは、mem_low_watmem_high_watです。

+ +

キャッシュ層がデータで満たされると、結果的にmem_low_watを超えます。 この時点では何も起きません。 データが増加を続けると、結果的にmem_high_watに到達します。 この時点で、バックグラウンドジョブがスケジュールされ、アイテムがディスクに書き込まれたことを確認し、他のCouchbase Serverアイテム用にメモリを利用できるようにします。 このジョブはメモリがmem_low_watに到達するまで継続します。 + アイテムの更新頻度がディスクへの書込みよりも早い場合、システムは容量不足を示すエラーを返すことがあります。 これはメモリが利用可能になるまで続きます。 + アクティブに利用される情報のためにキャッシュからデータを削除する処理はデータの除去(ejection)と呼ばれ、Couchbase Serverクラスタの各バケットで設定された閾値を元に自動的に制御されます。

+ + +

ワーキングセット管理プロセス

+ +

Couchbase Serverはアクティブにキャッシュ層に保存されたデータの管理を行います; これはクライアントによりどのデータが頻繁にアクセスされ、どのデータを高速な参照や更新のために保持すべきかの情報を利用します。 + RAM内のアイテムが増えすぎると、Couchbase Serverは特定のデータを除去し、システム性能を維持するために空き容量を作成します。 このプロセスは"ワーキングセット管理"と呼ばれ、RAM内のデータセットを"ワーキングセット"と呼びます。

+ +

一般的にはワーキングセットはすべてのキー、メタデータ、そして頻繁に利用され高速なアクセスが必要なドキュメントで構成されます。 サーバがRAMからデータを除去する処理はejectionと呼ばれます。 サーバがこのプロセスを実行すると、ドキュメントを除去しますが、アイテムのキーとメタデータは除去しません。 キーとメタデータをRAMに保持することにはシステムで3つの重要な目的があります:

+ +
    +
  • +

    Couchbase ServerはRAM内に残っているキーとメタデータをクライアントからリクエストされたキーに利用します。 + リクエストを受信すると、サーバはディスクからRAMへとアイテムのフェッチを試みます。

    + +
  • + +
  • +

    サーバはまた、RAM内のキーとメタデータを"ミスアクセス"に利用します。 + アイテムが存在しないことを高速に判断し、存在しない場合にアイテムを挿入するなど特定のアクションを実施します。

    + +
  • + +
  • +

    最後に、Couchbase Server内の期限切れアイテム削除処理でRAM内のメタデータを利用し、高速に期限切れアイテムをスキャンし、後にディスクから削除します。 このプロセスは"expiry pager"と呼ばれ、デフォルトでは60分毎に起動します。

    + +
  • + +
+ +
+ +

頻繁に参照されないアイテム

+ +

サーバ内のすべてのアイテムはそのアイテムが最近アクセスされたかどうかを示すメタデータを持っています。 このメタデータはNRU(Not-Recently-Used)と呼ばれます。 アイテムが最近利用されていないと、そのアイテムは高水位を超えた際のデータ除去の候補となります。 高水位を越えると、サーバはアイテムをRAMから除去します。

+ +

Couchbase Serverはアイテムごとに二つのNRUビットを利用しており、レプリケーションプロトコルで頻繁に参照されるが、あまり更新されないアイテムを転送する機能も実装しています。

+ +

以前のバージョンでは、Couchbase ServerはNRUに単一のビットを利用し、別のレプリケーションプロトコルを利用していましたが、二つの問題を引き起こしました: メタデータがアイテムの参照頻度や更新されたかどうかを反映できず、レプリケーションプロトコルではアクティブなvBucketからレプリカvBucketへ更新されたアイテムのNRUしか転送されませんでした。 二つ目の挙動はアクティブvBucket上のワーキングセットがレプリカvBucketのそれと著しく異なる可能性があることを意味します。 レプリケーションプロトコルを変更することで、レプリカvBucket内のワーキングセットがアクティブvBucket内のワーキングセットと同様になりました。

+ +

NRUはサーバプロセスによって増加、減少され、アイテムがより頻繁に利用されているかどうかを示します。 より低いビットを持つアイテムはより低いスコアとなり、より頻繁に参照されていると判定されます。 ビットの値と関連するスコア、ステータスは以下の通りです:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
バイナリNRUスコアアクセスパターン説明
000更新アクセスで00に設定される。 参照アクセス、アクセスなしで減少。最も頻繁に利用されるアイテム。
011参照アクセスで減少。頻繁に参照されるアイテム。
102初期値、参照アクセスで減少。新規アイテムのデフォルト値。
113データ除去のアイテムページャで増加される。あまり頻繁に利用されないアイテム。
+
+ +

アイテムのNRUを変更するプロセスは二つあります:

+ +
    +
  • クライアントがアイテムを読み書きすると、サーバはNRUを減らし、アイテムのスコアを低くします。
  • + +
  • RAM内の頻繁に参照されるアイテムのリストを作成する日次の処理があります。 この処理が実行されると、サーバはNRUビットの一つを増加させます。
  • + +
+ +

この二つのプロセスはNRUを変更するため、これらはどのアイテムがデータ除去の候補になるかにも影響します。

+ +

Couchbase Server設定でデータ除去の挙動を調整できます。 + 例えば、アイテムの除去を開始する際のRAM使用量パーセンテージを指定したり、オリジナルデータよりレプリカデータでより頻繁にデータ除去を行うように指定したりできます。 Couchbaseはデフォルトの設定を使用することを推奨します。

+ +
+ +

アイテムページャを理解する

+ +

アイテムページャプロセスは定期的に実行され、RAMからドキュメントを削除し、アイテムのキーとメタデータは残します。 + アイテムで利用されたRAM容量が高水位を越えると(上方閾値)、メモリ利用量が低水位(下方閾値)に達するまで、アクティブとレプリカの両データが除去されます。 + アクティブとレプリカデータの除去は、40%(アクティブ)と60%(レプリカ)の割合で、メモリ利用量が低水位に達するまで継続します。 + 高水位と低水位は両方ともRAM容量のパーセンテージで表現されます、80%など。

+ +

ノードのRAM容量に対するパーセンテージを指定することで、高水位、低水位の変更が可能です、例: 80%。 + Couchbaseは以下のデフォルト設定を利用することを推奨します:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
バージョン高水位低水位
2.075%60%
2.0.1 and higher85%75%
+
+ +

アイテムページャは二つのフェーズでRAMからアイテムを除去します:

+ +
    +
  • +

    フェーズ1: NRUを元に除去。 アイテムのNRUをスキャンし、スコアが3の全てのアイテムのリストを作成します。 NRUスコアが3のアイテムすべてを除去します。 RAM使用量をチェックし、低水位をまだ上回っている場合この処理を繰り返します。

    + +
  • + +
  • +

    フェーズ2: アルゴリズムに基づく除去。 全てのアイテムのNRUを1ずつインクリメントします。 NRUが3になったら、ランダムな数値を生成し、その数値が指定した確率よりも大きければそのアイテムを除去します。 確率は現在のメモリ利用量、低水位、そしてvBucketがアクティブかレプリカかどうかで決まる。 データ除去の確率は、vBucketがアクティブであれば、レプリカのvBucketよりも低くなります。 アクティブ、レプリカvBucketのデフォルトの確率は以下の通りです:

    + +
  • + +
+ +

データ除去の確率はアクティブか レプリカvBucketかにより以下のようになります:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + +
アクティブvBucketレプリカvBucket
60%40%
+
+ +
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/concepts-TAP.html b/preview/contents/Concepts/concepts-TAP.html new file mode 100644 index 0000000..2ddfda1 --- /dev/null +++ b/preview/contents/Concepts/concepts-TAP.html @@ -0,0 +1,22 @@ +TAP
+

TAP

+ + +

TAPプロトコルはCouchbase Serverシステム内部で利用される、システム内でデータを転送するためのプロトコルです。

+ +

TAPはシステム内で発生しているデータ変更のストリームを提供します。TAPはレプリカを作成するために、vBucket間のデータコピーに利用されます。また、リバランス中にvBucket間でデータを移動し、システム内の情報を再分散するためにも使われます。

+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Concepts/concepts-statsMonitor.html b/preview/contents/Concepts/concepts-statsMonitor.html new file mode 100644 index 0000000..6f7ef04 --- /dev/null +++ b/preview/contents/Concepts/concepts-statsMonitor.html @@ -0,0 +1,99 @@ +統計情報とモニタリング
+

統計情報とモニタリング

+ + +

+ すべての統計情報とモニタリング情報のセットはCouchbase Webコンソール、CLI、REST APIから利用可能です。 +

+ +

+ クラスタがどのように動作しているか、どの程度の性能が出ているかを理解するために、 + Couchbase Serverでは完全な統計およびモニタリング情報が利用できます。統計情報はすべての管理用インタフェースで取得できます。 + Couchbase Webコンソールでは、ビルトインのリアルタイムグラフとパフォーマンスデータを含むさまざまな統計情報が閲覧できます。 +

+ +

+ 統計情報はいくつかのグループに分けられており、さまざまなステータスや性能に関する情報を確認することができます。 +

+ + +
+ +
ノード単位
+ +
+ ノードの統計情報は各サーバごと、およびクラスタ全体の、CPU、RAM、I/O発生数を表示します。 + この情報は単一のサーバでの性能や負荷の問題を特定するために利用できます。 +
+ + +
+ + +
+ +
vBucket単位
+ +
+ vBucketの統計情報は、vBucketの利用と性能に関する数値を示し、 + バケットを再設定する必要があるかどうか、性能を向上するためにサーバを追加する必要があるかどうかなどの判断に便利です。 +
+ + +
+ + +
+ +
View単位
+ +
+ Viewの統計情報は、CPU利用率とディスク容量を含むシステム内の個別のViewに関する情報を示し、 + Couchbaseノード上にViewを作成する影響を監視することができます。 + この情報はViewを変更、最適化、複数のデザインドキュメントに分割する必要があるかなどを示唆します。 +
+ + +
+ +
+ +
ディスクキュー単位
+ +
+ これらの統計情報は情報をディスクへの読み書き、レプリケーションの転送に利用するキューをモニタリングしたものです。 + この情報はディスクの負荷を軽減するために、クラスタを拡張する必要があるかどうかを判断するために役立ちます。 +
+ + +
+ +
+ +
TAPキュー単位
+ +
+ TAPインタフェースはデータベースへの変更や更新を監視するために利用されます。 + TAPはCouchbase Serverがノード間のレプリケーションを実現するために内部的に利用していますが、 + 変更通知を受信するクライアントからも利用することができます。 +
+ + +
+ +

+ 取得されたほぼすべての統計情報は、特定のバケットにおける、クラスタの全体的なRAMやディスクの利用を監視するためにクラスタ単位、 + また、単一マシン内の問題を特定するために個別のサーバ単位で閲覧することができます。 +

+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Concepts/dcp.html b/preview/contents/Concepts/dcp.html new file mode 100644 index 0000000..dfbd323 --- /dev/null +++ b/preview/contents/Concepts/dcp.html @@ -0,0 +1,189 @@ +データベース変更プロトコル(DCP)
+

データベース変更プロトコル(DCP)

+ + + +

データベース変更プロトコル(Database Change Protocol, DCP)はバケットのデータ更新をストリームするためのプロトコロルです。

+ +

The Database Change Protocol (DCP)はView更新のレイテンシを大幅に縮めることができるストリーミングプロトコルです。 +DCPにより、メモリ上のドキュメントに対する変更はディスクに書き込まれる前に即座にストリームされ、インデクシングされます。 +このため、より高速にViewの一貫性を提供し、最新のデータを返却することができます。 +DCPはまた、クロスデータセンタレプリケーション(XDCR)のレイテンシも小さくします。 +データは、ソースクラスタのディスクに書き込まれる前に、ソースクラスタのメモリから宛先クラスタのメモリへとレプリケートされます。 +

+ + +

DCPを利用するには、以下のコンセプト(アルファベット順)を理解する必要があります。

+ + +
+ +
アプリケーションクライアント
+ +
サーバクラスタに参照、書込み、更新、削除、クエリのリクエストを送信する通常のクライアントです。一般的にはインタラクティブなWebアプリケーションです。
+ + + + +
DCPクライアント
+ +
+ひとつ以上のCouchbase Serverノードからデータをストリーミング受信する特別なクライアントです。 +クラスタ内レプリケーション(マスタサーバがダウンした際にバックアップとなる)、インデクシング(クラスタ全体のデータを集約してクエリに応答するため)、 +XDCR(あるクラスタから別のクラスタへとデータをレプリケートするため、通常は別のデータセンタに設置されたクラスタ)、 +差分バックアップ、そしてCouchbaseのデータを準リアルタイムもしくはスケジュール起動のバッチモードで、 +インデクシング、モニタリング、あるいは分析を行うサードパーティのコンポーネントが該当します。 +
+ + + + +
フェイルオーバログ
+ +
+あるvBucketにおける、以前に接続したことのあるvBucketのバージョンのリストです。 +もしクライアントがサーバに接続し、サーバ上の現在のvBucketのバージョンが、以前に接続したものと異なっている場合、 +フェイルオーバログを利用してロールバックポイントを探します。 +
+ + + + +
ヒストリブランチ
+ +
+あるノードがフェイルオーバや、不正なシャットダウンおよび再起動により、特定のvBucketのマスタとなったとき、 +もしそのノードが、そのvBucketで発生しているイベントを受信しているすべてのプロセスにおいて、 +最新の状態となっていないまま データ更新を引き継いだ場合、 +他のプロセスがすでにこのvBucketで受信済みのシーケンス番号を使い回す可能性があります。 +これは、ヒストリブランチとなり、新しいマスタは、分散システム内のDCPクライアントが +新しいマスタよりも先に進んでいて、このストリームにおいてマスタ切り替えが発生した時点にロールバックが必要だと +認識できるように、vBucketを新しいvBucketのバージョンにアサインしなくてはなりません。 + +適切に制御されて旧マスタから新マスタへ引き継がれた場合、 +シーケンスのヒストリにブランチはできません。 +引き継がれるvBucketに新しいバージョンを割り当てる必要はないからです。 +クラスタ伸縮時のリバランス(ノードの追加や削除)、アップグレード時のスワップリバランス(新しいCouchbase Serverバージョンのノードをクラスタへ追加し、古いバージョンのノードを削除)した場合は、正しく引き継ぎを制御することができます。 +
+ + + + +
データの変化(Mutation)
+ +
+データの変化とはキーを削除したり、キーと対になるバリューを変更するイベントのことです。 +データの生成、更新、削除、期限切れなどの更新処理が実行されると発生します。 +
+ + + + +
ロールバックポイント
+ +
+サーバはフェイルオーバログを利用して、 +クライアントがデータの変化を最後に受信した時から現在までの間で利用可能な、直近のヒストリブランチを探します。 +そのヒストリブランチのシーケンス番号が、クライアントに送信されるロールバックポイントとなります。 +
+ + + + +
シーケンス番号
+ +
+あるvBucketで発生した各データの変化には番号が割り当てられます。 +これはイベントに番号を付与するたびに厳密に増加するものです(番号をスキップしても問題ありませんが、増加する必要があります)。 +同一のvBucketにおけるデータの変化イベントのソートに利用します。 +これはクラスタ全体でのイベント順序を保証するものではありませんが、 +特定のvBucketで発生するイベントを監視するプロセスで、切断したところからの再開を可能にします。 +
+ + + + +
サーバ
+ +
+クラスタのネットワークストレージコンポーネントとして動作するマスタおよびレプリカノードです。 +ひとつのパーティションにつき、クラスタ内で一台のノードだけがマスタになることができます。 +マスタがダウンもしくは利用不可となると、クラスタは新しいマスタとなるレプリカノードを選出します。 +
+ + + + +
スナップショット
+ +
+クライアントに一貫したデータ像を送信するため、 +クライアントの現在のリクエストを満たす最適な場所を考慮し、 +サーバはディスク書込みキュー状態もしくはストレージ状態のスナップショットを取得します。 + +このスナップショットは、取得時に含まれるデータの変化の完全な状態を表します。 +スナップショットを利用して、サーバはスナップショット取得時点で存在したアイテムのみを送信することができます。 + +スナップショットの作成にはすべてをロックして別の構造にコピーする必要はありません。 +原稿のCouchbaseストレージサブシステムでは、 +本質的に、スナップショットの取得にはコストがかかりません。 +唯一のコストは不要なデータとスペースを除去するためのコンパクションでファイルがコピーされる際に、すべてのスナップショットホルダがコンパクション前のファイルをリリースするのを待つ必要があることです。 + +もしスナップショットホルダがスナップショットの取得に時間がかかり過ぎているとシステムが判断した場合、スナップショットホルダを強制的に停止することができます。 +このとき、切断されたDCPクライアントは再接続し、新規のスナップショットが取得され、切断した箇所からリスタートすることができます。 +
+ + + + +
vBucket
+ +
+Couchbaseはキー空間を固定数のvBucketに分割します、通常は1024です。 +キーは決まった方法でvBucketに割り当てられ、vBucketはクラスタ内で不可がバランスされるようにノードに割り当てられます。 +
+ + + + +
vBucketストリーム
+ +
+特定のvBucketにおけるデータ変化の受信に関連するメッセージのグループです。 +データの変化、削除、期限切れのメッセージ、およびスナップショットマーカのメッセージを含みます。 +転送レイヤは複数の異なるvBucketの情報ストリームを複合化したり、分離する手順を提供します。 +スナップショットマーカ間のすべてのメッセージは単一のスナップショットとして扱われます。 +スナップショットは、各キーについて、取得間隔内で最新の変更しか保持しません。 +ドキュメントの最新バージョンを得るには、いくつかの完全なスナップショットが必要になることがあります。 +
+ + + + +
vBucketのバージョン
+ +
+vBucketに関連する、普遍的に一意となる識別子(UUID)とシーケンス番号のペアです。 +ヒストリブランチが存在する可能性がある場合に、新しいマスタノードによって、新しいバージョンがvBucketに割り当てられます。 +UUIDはランダムに生成された数値で、シーケンス番号はそのバージョンが作成されたときにvBucketが最後に処理したものです。 +
+ + + +
+ + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Concepts/delta-node-recovery.html b/preview/contents/Concepts/delta-node-recovery.html new file mode 100644 index 0000000..e7fb18a --- /dev/null +++ b/preview/contents/Concepts/delta-node-recovery.html @@ -0,0 +1,227 @@ +デルタノードリカバリ
+

デルタノードリカバリ

+ + + +

+ デルタノードリカバリを使うと、ノードをクラスタに再追加後に、変更されたデータの差分を反映させることができます。 +

+ + +

+ デルタノードリカバリは、フェイルオーバしたノードのディスク上にあるデータを再利用し、差分の変更を反映し再同期させることで、リカバリが可能です。 + フェイルオーバしたノードはどの時点でデータの変化が停止したのかを特定するためにチェックされ、その時点から再同期を開始します。 + サーバノードは保持するvBucketのデータ変化を反映した後、データの提供を開始します。 + 元々のデータとバケットを再利用することで、最小のダウンタイムでクラスタの利用を開始できます。 + この操作により、リカバリ時間とネットワークリソース利用が向上します。 +

+ + +

+ サーバノードは様々な場面でクラスタから削除されます。 + 以下の例は、サーバノードをクラスタからフェイルオーバした後に再追加する場面の一部を示しています(この他にも多くあります)。 +

+ + +
    +
  • ノードが少しの間ダウンした
  • + +
  • 計画的定期メンテナンス
  • + +
  • ネットワーク接続が少しの間切断した
  • + +
+ + +

+ ノードがフェイルオーバされても、データファイルは保持されます。 + データファイルはCouchbaseサポートにも、データの復旧にも、デルタノードリカバリにも利用できます。 +

+ + +

+ ノードをフェイルオーバし、メンテナンスを行い、ノードをクラスタへ再追加して、リバランスを実行する処理において、 + フルリカバリモードかデルタリカバリモードでデータを復旧することができます。 + デルタリカバリモードでは、Couchbaseが(DCPを利用し)、どのデータファイルが最新で、どのデータファイルが古くなっているかを検知し、 + リバランス時に、フェイルオーバしたサーバノード上の既存のデータファイルを再利用し、古くなったファイルを更新します。 +

+ + +

+ サーバノードをフェイルオーバすると、Webコンソールに、Delta RecoveryとFull Recoveryの選択肢が表示されます。 + いずれの復旧方法もサーバをクラスタに再追加するためにリバランスが必要ですが、 + フルリカバリの場合、リバランス前にノードが持つ既存データを削除するのに対し、デルタリカバリではノードが持つ既存データを再利用します。 +

+ + + + +

デルタリカバリの条件:

+ +
    +
  • ノードとクラスタが健全な状態である必要があります。
  • + +
  • + フェイルオーバしたサーバノードが必要です。 + デルタリカバリはサーバ追加時のリバランス、およびサーバ削除時のリバランスでは利用できません。 +
  • + +
  • + すべてのバケットでデルタリカバリが実行できる必要があります。 + 例えば、いくつかのバケットがデルタリカバリ可能でも、それ以外のバケットが不可能であった場合、 + Couchbaseクラスタはリバランス操作を許可しません。 +
  • + +
  • + なぜなら、デルタリカバリはフェイルオーバしたサーバノードのディスク上にある既存のデータファイルに依存しており、 + それと完全に同じセットのバケットを、フェイルオーバしたサーバノードに転送する必要があるからです。 +
  • + +
+ + +

デルタリカバリの性質:

+ +
    +
  • + データファイルはメモリ上に"ウォームアップ"されます。 + メモリへのウォームアップとはデータをメモリ上にロードすることです。 + どのメタデータが保持されるかによって、必要最小のすべてのデータファイルキーがリバランス操作の前にディスクからロードされます。 +
  • + +
  • インデックスは再追加するサーバノード上で必ず再構築されます。
  • + +
  • + データサイズがRAMサイズよりもはるかに大きく、バケットでfull eviction(メタデータをメモリに保持しない)を設定していて、 + インデックスを定義していない環境で利用してください。 +
  • + +
+ + + +
ヒント: + 非常に大きなデータ量を保持する環境で、フェイルオーバしたサーバノードを再追加する場合に利用できます。 +
+ + + + + +

デルタノードリカバリが利用できないシナリオ

+ +

+ 以下の条件は、デルタノードリカバリが利用できず、フルリカバリとなる条件です: +

+ +
    +
  • + ノードがデルタリカバリ待ちの間にトポロジが変わった場合、デルタノードリカバリに影響します。 + 例えば、他のノードを追加したり、ノードを削除したり、ノードをスワップするなどです。 +
  • + +
  • ダウンしたノードがハードフェイルオーバされ、削除待ちの場合。
  • + +
  • + リバランスにより異なる数のノード追加、削除が実行された場合(スワップリバランスは実行可能です)。 +
  • + +
  • + ノードがデルタリカバリ待ちの間に、デルタノードリカバリに影響するバケット操作を行った場合。 + 例えば、新規のバケットを追加したり、バケットのレプリカ設定を変更したり、バケットをフラッシュするなどです。 +
  • + +
+ + + +

+ 以下は、デルタノードリカバリが利用できず、フルリカバリとなるシナリオです: +

+ + +

Node 1をデルタリカバリ中にアクティブなサーバノードのNode 2がクラッシュ。

+ +
    +
  1. Node 1のフェイルオーバ後、デルタリカバリを指定。Node 1はデルタリカバリ待ちの状態。
  2. + +
  3. そこでアクティブサーバのNode 2がダウン。
    注: リバランスを実行することはできません。
    +
  4. + +
  5. Node 2をフェイルオーバ。
  6. + +
  7. ペンディング中のデルタリカバリをキャンセルし、フルリカバリを指定してリバランス。
  8. + +
  9. Node 2を修復し、クラスタに追加してリバランス。
  10. + +
+ + +

Node 1をデルタリカバリし、リバランス中にNode 1がクラッシュ。

+ + +
    +
  1. Node 1のフェイルオーバ後、デルタリカバリを指定し、リバランスを開始。
  2. + +
  3. Node 1がクラッシュし、リバランスが失敗。
  4. + +
  5. Node 1を修復、サーバノードを再起動し、リバランス。Node 1をフルリカバリにより再追加。 +
  6. + +
+ + +

Node 1のデルタリカバリ時にバケットに対して操作を実行。

+ +

リバランスの失敗するバケットの操作は、バケットの追加、レプリカ設定の変更、バケットのフラッシュです。

+ +
    +
  1. Node 1のフェイルオーバ後、デルタリカバリを指定、その後バケットに上記操作が行われた。
  2. + +
  3. リバランスを実行すると失敗。

    +
  4. + +
  5. ペンディング中のデルタリカバリをキャンセルし、フルリカバリを指定、リバランス。
  6. + +
+ +
注: バケットの削除はデルタリカバリを継続できます。
+ + + +

Node 1とNode 2をデルタリカバリ中にNode 2がクラッシュ。

+ +
    +
  1. Node1とNode 2いずれもフェイルオーバ後、デルタリカバリを指定。
  2. + +
  3. Node 2がクラッシュ。
  4. + +
  5. リバランスを実行すると失敗。

    +
  6. + +
+ + + +
+ + + + +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Concepts/global-thread-pool.html b/preview/contents/Concepts/global-thread-pool.html new file mode 100644 index 0000000..034fa23 --- /dev/null +++ b/preview/contents/Concepts/global-thread-pool.html @@ -0,0 +1,140 @@ +共有スレッドプール
+ +

共有スレッドプール

+ + + +

+共有スレッドプールは複数のバケット間で共有されるスレッドの集合です。 +

+ +

+スレッドプールは似たようなジョブを実行するために利用されるスレッドの集合です。 +各サーバノードには複数のバケット間で共有するスレッドプールがあります。 +共有スレッドプールはバケットとスレッドの割り当てを切り離すことで、タスクの起動を最適化します。 +

+ + +

+スレッドはサーバノードの起動時に生成されます。スレッド数はCPUコア数が基準になります。 +

+ + +

+共有スレッドプールは各ノードと関連しており、バケットとは切り離されています。 +特定のバケットからスレッドを切り離すことで、スレッドはいかなるバケットのタスクも実行できます。 +グローバルスレッドプールはバケットの優先度をサポートしているので、各優先度において、独立したI/Oキューがreaderとwriterのワーカから利用できます。 +これにより、タスクのキューイングが向上します。 +例えば、あるスレッドがI/Oキューからのタスクの実行を割り当てられているときに、二つ目のタスクがリクエストされると、他のスレッドが二つ目のタスクを担当するように割り当てられます。 +

+ + +

+共有スレッドプールは以下を改善します: +Shared thread pool management promotes:

+ +
    +
  • より効率的にI/Oリソースを管理することで、スレッドワーカに高い並列実行性を与えます。
  • + +
  • より多くのバケットをより少ないワーカスレッドで実行できるため、よりスケーラブルなシステムとなります。
  • + +
  • ディスクバケットI/O優先度設定を利用すると、タスクの優先度を指定可能です。 +
  • + +
+ + +

+次の事項はどのようにスレッドがタスクを実行するためにスケジュールされるかを説明しています: +

+ +
    + +
  • +すべてのバケットが同一の優先度である場合(デフォルトの設定)、各スレッドはそれらのバケットのすべてのタスクキューにラウンドロビンで均等に割り当てられます。 +
  • + + +
  • +バケットが異なる優先度で設定されている場合、スレッドは適切に実行時間の一部分ずつ(スケジューリング頻度)をバケットのキューからのタスク実行に費やします。 +
  • + + +
  • +バケットがコンパクション中の場合、スレッドはそのバケットのタスク実行に割り当てられることはありません。 +
  • + +
  • +すべてのバケットが空であるか、他のスレッドによって処理されている場合、スレッドはスリープします。 +
  • + +
+ + + + + + + + + + +

スレッドステータスの確認

+

cbstats raw workloadを使って、スレッドのステータスを確認できます。 +以下はコード例と実行結果です。

+ + +

+# cbstats 10.5.2.54:11210 -b default raw workload
+
+ ep_workload:LowPrioQ_AuxIO:InQsize:   3
+ ep_workload:LowPrioQ_AuxIO:OutQsize:  0
+ ep_workload:LowPrioQ_NonIO:InQsize:   33
+ ep_workload:LowPrioQ_NonIO:OutQsize:  0
+ ep_workload:LowPrioQ_Reader:InQsize:  12
+ ep_workload:LowPrioQ_Reader:OutQsize: 0
+ ep_workload:LowPrioQ_Writer:InQsize:  15
+ ep_workload:LowPrioQ_Writer:OutQsize: 0
+ ep_workload:num_auxio:                1
+ ep_workload:num_nonio:                1
+ ep_workload:num_readers:              1
+ ep_workload:num_shards:               4
+ ep_workload:num_sleepers:             4
+ ep_workload:num_writers:              1
+ ep_workload:ready_tasks:              0
+ ep_workload:shard0_locked:            false
+ ep_workload:shard0_pendingTasks:      0
+ ep_workload:shard1_locked:            false
+ ep_workload:shard1_pendingTasks:      0
+ ep_workload:shard2_locked:            false
+ ep_workload:shard2_pendingTasks:      0
+ ep_workload:shard3_locked:            false
+ ep_workload:shard3_pendingTasks:      0       
+   
+ + +
+ + + +
+ + + + + +
\ No newline at end of file diff --git a/preview/contents/Concepts/graceful-failover.html b/preview/contents/Concepts/graceful-failover.html new file mode 100644 index 0000000..228373c --- /dev/null +++ b/preview/contents/Concepts/graceful-failover.html @@ -0,0 +1,102 @@ +グレイスフルフェイルオーバ
+

グレイスフルフェイルオーバ

+ + + + +

+ グレイスフルフェイルオーバは、実行中の操作が完了した後に、データを失うことなく、管理者が安全にノードをクラスタからフェイルオーバする方法を提供します。 +

+ + +

+ グレイスフルフェイルオーバを利用すると、すべての実行中の操作が完了するまで待ちます。 + 例えば、データをノードに書き込むプロセスや、データをレプリカvBucketに転送するプロセスの完了です。 + レプリカvBucketはアクティブvBucketに昇格し、フェイルオーバしたノード上のアクティブvBucketは、レプリカvBucketになります。 + これは、レプリカvBucketがアクティブvBucketと同期された後にフェイルオーバを実行するためで、 + グレイスフルフェイルオーバはノードをフェイルオーバするのに、より時間がかかることがあります。 +

+ + +

+ サーバノードがグレイスフルフェイルオーバされている間(実行中の操作が完了するまで)、 + フェイルオーバを停止することが可能です。その後、グレイスフルフェイルオーバを再開することができます。 + ノードをフェイルオーバした後、デルタもしくは、フルリカバリによってノードをクラスタに再追加することができます。 +

+ + + +
注: + ハードフェイルオーバは即座にノードをクラスタからフェイルオーバするため、データロスが発生することがあります。 + ハードフェイルオーバは一般的にノードに障害が起きた場合に利用します。自動フェイルオーバはハードフェイルオーバです。 +
+ + +

+ グレイスフルフェイルオーバの実行には、以下の条件に一致する必要があります、一致しない場合、ハードフェイルオーバとなります。 +

+ + +
    +
  • サーバノードが健全な状態である必要があります。
  • + +
  • フェイルオーバするサーバノードが保持するすべてのアクティブvBucketに対応するレプリカvBucketが必要です。
  • + +
  • 少なくとも一つのレプリカvBucketが必ず必要です。
  • + +
+ + +

例えば:

+ +
    +
  • 7ノードのクラスタでバケットのレプリカ数が1の場合、1台のノードのみ、グレイスフルフェイルオーバできます。
  • + +
  • 7ノードのクラスタでバケットのレプリカ数が2の場合、2台のノードのみ、グレイスフルフェイルオーバできます。
  • + +
  • 7ノードのクラスタでバケットのレプリカ数が3の場合、3台のノードのみ、グレイスフルフェイルオーバできます。
  • + +
+ + +

+ グレイスフルフェイルオーバでは、(ハードフェイルオーバと違って)アクティブvBucketの数が変化しません。 + しかし、レプリカvBucketの数は減少し、不均一に分散された状態になります。 +

+ + + + + + + + + + + + + + + + + + + + + +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Concepts/swap-space.html b/preview/contents/Concepts/swap-space.html new file mode 100644 index 0000000..ca37a47 --- /dev/null +++ b/preview/contents/Concepts/swap-space.html @@ -0,0 +1,40 @@ +Swap領域
+

Swap領域

+ +

Linuxでは、物理メモリ(RAM)の空きがなくなると、swap領域を利用します。

+ +

RAMの空きがなく、システムがそれ以上のメモリリソースを必要とする場合、メモリ内のアクティブでないページがswap領域へと移動します。 Swappiness RAM利用状況に応じて、どの程度頻繁にシステムがswap領域を利用するのかを示します。 swappinessは0から100の範囲で指定でき、デフォルトでは、多くのLinuxプラットホームでswappinessが60に設定されています。

+ + +

Couchbase Serverのオペレーションに最適化するために、swappinessを 0 に設定してください。

+ +

swap設定の変更方法:

+
    +
  1. 次のコマンド、 cat /proc/sys/vm/swappiness を各ノード上で実行し、現在のswap利用設定を確認します。
  2. + +
  3. 次のコマンド、 + sudo sysctl vm.swappiness=0 を実行し、直ちにswap設定を変更してから、サーバを再起動してもこの変更が永続化されるようにします。
  4. + +
  5. sudorootユーザ権限を利用して、/etc/sysctl.confのカーネルパラメータ設定ファイルを編集し、この変更が常に有効となるようにします。
  6. + +
  7. vm.swappiness = 0をファイルに追記します。
  8. + +
  9. システムを再起動します。
  10. + +
+ + +
注: 次のコマンド、 sudo sysctl vm.swappiness=0 を実行すると、メモリが完全に枯渇するまで、オペレーティングシステムがswapを利用しなくなります。 カーネルパラメータ設定ファイル、sysctl.confを更新することで、ノードを再起動したとしても、Couchbaseが推奨する方法で常にオペレーティングシステムがswapを利用するようにできます。
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Couchbase-intro.html b/preview/contents/Couchbase-intro.html new file mode 100644 index 0000000..8b0b018 --- /dev/null +++ b/preview/contents/Couchbase-intro.html @@ -0,0 +1,116 @@ +はじめに
+

はじめに

+ + +

+ Couchbase ServerはインタラクティブWebアプリケーション向けのNoSQLドキュメントデータベースです。 + 柔軟なデータモデルをもち、容易スケールし、一貫した高性能を提供し、アプリケーションデータを24時間365日サービスできる"always-on"なデータベースです。 +

+ + +

Couchbaseの利点

+ Couchbase Serverでは、アプリケーションオブジェクトやオブジェクト間の関連をJSONドキュメントにより表現します。 + このドキュエントモデルは非常に柔軟で、アプリケーションオブジェクトをデータベースのスキーマ移行なしに変更することができ、 + 影響の大きなアプリケーションダウンタイムを計画する必要もありません。 + アプリケーション内の同一のオブジェクトタイプですら、異なるデータ構造を持つことができます。 + 例えば、はじめはユーザ名を単一の項目としたJSONドキュメントで表現していたとします。 + その後、ユーザドキュメントで姓と名を別々の項目として、JSONドキュメントを表現することもできます、 + この際、ダウンタイムは発生しませんし、システム内のすべてのユーザドキュメントを更新する必要もありません。 +

+ +
    +
  • 柔軟なデータモデル

    + 柔軟なドキュメントベースのデータモデルのその他の利点として、 + 現実世界の事象を表現するのに適しているということがあります。 + JSONドキュメントは入れ子構造を利用でき、アプリケーション内のアイテム間の関連を、フィールドにより表現することもできます。 +

    + +
  • + +
  • 容易にスケール

    + Couchbase Serverを利用すると、クラスタ内の複数台のサーバ、 + または複数のデータセンタで稼働する複数のクラスタを利用して、アプリケーションを簡単にスケールすることができます。 + ユーザ数やアプリケーションデータの増加に対応するために、アプリケーションコードの変更やアプリケーションの停止なしに、 + Couchbase Serverのインスタンスを追加できます。 + ボタンを数回クリックするだけで、迅速にCouchbase Serverクラスタを拡張し、負荷の増加に対応し、データを均等に分散し続けることができます。 +

    +

    + Couchbase Serverはデータの自動シャーディングと、実行中のデータの再配置を提供します。 + これにより、サーバクラスタをオンデマンドでリサイズすることが可能となります。 + クロスデータセンタレプリケーションは、ユーザにより近いデータセンタへとデータを移動することができます。 +

    + +
  • + +
  • 一貫した高性能

    + Couchbase Sererは膨大な数の同時接続データアクセスと、一貫した高スループット用にデザインされています。 + 一貫して1ミリ秒未満の応答時間を提供し、アプリケーションのユーザに快適なユーザ体験を実現します。 + 一貫して高いデータスループットを提供することで、Couchbase Serverを利用すると、 + より少ないサーバでより多くのユーザをサポートできます。 + サーバはまた、自動的にワークロードをすべてのサーバに分散し、安定した性能を保持し、クラスタ内のサーバ単位のボトルネックを軽減します。 +

    + +
  • + +
  • "常にオンライン"

    + Couchbase Serverは一貫した1ミリ秒未満の応答時間を提供し、アプリケーションのユーザに快適なユーザ体験を実現します。 + Couchbase Serverを利用すると、より少ないサーバでより多くのユーザをサポートできます。 + サーバはまた、自動的にワークロードをすべてのサーバに分散し、安定した性能を保持し、クラスタ内のサーバ単位のボトルネックを軽減します。 +

    +

    + クロスデータセンタレプリケーション、フェイルオーバ、バックアップ、リストアなどの機能を利用して、 + サーバやデータセンタ単位の障害から、データの可用性を確保することができます。 +

    + +
  • + +
+ +

+ これらすべてのCouchbase Serverが、エンドユーザのアクセスに対し、 + 低レイテンシかつ高スループットが求められるWebアプリケーション開発を可能とします。 + Webアプリケーションは即座にCouchbaseクラスタ内の正しい情報にアクセスでき、 + 開発者はサーバの追加により、迅速にWebアプリケーションをスケールアウトすることができます。 +

+ +
+ + +

Couchbase ServerとNoSQL

+

+ NoSQLデータベースは、データベーススキーマを事前に定義する必要なく、データの保存が可能な点が特徴的です。 + Couchbase Serverでは、データをKey-Valueのペアや、JSONドキュメントとして保存できます。 + データはデータベース管理システム側の観点による、決まりきった、事前に定義されたスキーマに一致する必要はありません。 + このスキーマレスな性質により、Couchbase Serverは成長に応じて、クラスタにサーバをさらに追加することで、 + データ容量とI/Oのキャパシティを増加しスケールアウトするアプローチを可能としています。 + この際、アプリケーションの変更は全く必要ありません。 + 一方、リレーショナルデータベース管理システムは成長に対応するために、 + CPU、メモリ、ディスクなどのキャパシティを追加することでスケールアップします。 +

+ +

+ リレーショナルデータベースは情報を関連として保存しますが、これはデータを保存する前に定義または変更する必要があります。 + 関連とは単純にテーブル内の行であり、ある関連内の各行は、決められた列の集合を保持します。 + これらの列は関連内のすべての行で一貫して同一となります。 + テーブルはまた、テーブル間の参照を利用して結合することができます。 + 一つのテーブルがある都市に住むすべての市民を行として保持する例を見てみましょう。 + もう一つのテーブルで、親、子、関連のフィールドで構成される行を保持するとします。 + この親、子の二つのフィールドは市民テーブルの行への参照として利用し、三つ目のフィールドは、 + 父や母といった、最初の二つのフィールドに保存された市民間の親子関係を表すことに利用できます。 +

+ +
+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/Mac-install.html b/preview/contents/Install/Mac-install.html new file mode 100644 index 0000000..099add7 --- /dev/null +++ b/preview/contents/Install/Mac-install.html @@ -0,0 +1,109 @@ +Mac OS X へのインストール
+

Mac OS X へのインストール

+ + +

Mac OS 10.7と10.8での利用については、開発目的に限りサポートされています。

+ + +

インストールを行う前に、サポートプラットフォームをあらかじめ確認してください。

+ +

Mac OS Xへのインストールは、Applications フォルダ、または任意の場所へコピーすることができるスタンドアロンのアプリケーションを含むZipファイルを使用します。インストール場所はCouchbaseのデータファイルの場所には影響しません。

+ + +

Couchbase Serverは以下のMacオペレーティングシステムをサポートしています:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
プラットフォームバージョン32 / 64 bitサポート推奨バージョン
Mac OS10.764 bit開発目的のみMac OS 10.7
Mac OS10.864 bit開発目的のみMac OS 10.8
+
+ + +

Couchbase Serverディストリビューションを解凍するには、Mac OS Xのデフォルトアーカイブハンドラであるアーカイブユーティリティーを使用してください。他のサードパーティ製のアーカイブ解凍ツールを使用して解凍した場合、インストール時の不具合やダメージを受けたときの原因診断がより困難になります。

+ + +
警告: Mac OS Xオペレーティングシステムの制限により、Mac OS Xの実装は、他のオペレーティングシステムと互換性がありません。同じクラスタ内にオペレーティングシステムを混在させたり、Mac OS XとWindowsやLinuxクラスタとのXDCRを構成することはできません。 +Mac OS Xクラスタと、別のプラットフォームで構成されたクラスタ間でデータを移動させる必要がある場合は、cbbackupcbrestore コマンドを使用して下さい。詳細については、Backing up and restoring between platformsを参照して下さい。
+ + +

インストールの実施にあたってはMac OSXインストール手順に記述された手順に従ってください。

+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Install/RHEL-install-intro.html b/preview/contents/Install/RHEL-install-intro.html new file mode 100644 index 0000000..db88a6f --- /dev/null +++ b/preview/contents/Install/RHEL-install-intro.html @@ -0,0 +1,136 @@ +Red Hat/CentOS へのインストール
+

Red Hat/CentOS へのインストール

+ + +

Couchbase Serverは、Red Hat (RHEL) およびCentOSなどのRed Hatをベースとしたオペレーティングシステムをサポートしています。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
プラットフォームバージョン32 / 64 bitサポート推奨バージョン
Red Hat Enterprise Linux564 bit開発用、プロダクション用RHEL 5.8
Red Hat Enterprise Linux664 bit開発用、プロダクション用RHEL 6.3
CentOS564 bit開発用、プロダクション用CentOS 5.8
CentOS664 bit開発用、プロダクション用CentOS 6.3
Amazon Linux2013.0364 bit開発用、プロダクション用 
+
+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Install/Ubuntu-install.html b/preview/contents/Install/Ubuntu-install.html new file mode 100644 index 0000000..b3f5086 --- /dev/null +++ b/preview/contents/Install/Ubuntu-install.html @@ -0,0 +1,162 @@ +UbuntuまたはDebianへのインストール方法
+

UbuntuまたはDebianへのインストール方法

+ + +

このインストールに関する情報はUbuntuとDebianプラットフォームの両方に適用されます。

+ + +

次のUbuntuとDebianプラットフォームのようなUbuntuベースのをサポートしています:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
プラットフォームバージョン32 / 64 bitサポート推奨バージョン
Ubuntu Linux10.0464 bit開発目的、商用目的 
Ubuntu Linux12.0464 bit開発目的、商用目的Ubuntu 12.04
Debian Linux764 bit開発目的、商用目的Debian 7.0
+
+ + + +

UbuntuまたはDebian上でのインストール方法

インストールするには:

+
    +
  1. Ubuntu version 12.04 と Debian 7の場合、特定のOpenSSLと依存関係のあるものを実行するためにOpenSSL 1.x.をインストールする必要があります。: +

    root-> apt-get install libssl<version>

    + +
  2. + +
  3. UbuntuのCouchbaseのインストールではDEBパッケージを使用します。インストールするには、ダウンロードしたDEBファイルを用いてdpkgコマンドラインツールを使用します。次の例ではインストールを許可するためにルートアクセスを必要とするのでsudoを使用します: +
    dpkg -i couchbase-server version.deb
    + +

    versionにはダウンロードしたパッケージのバージョンナンバーが記載されています。

    + +

    dpkgコマンド実行後にCouchbase Serverは自動的に起動し、ブート時にランレベルが2、3、4、5で起動するように自動的に設定されます。Debianパッケージマネージャを使用したパッケージのインストールに関する詳細については、Ubuntuドキュメントを参照してください。

    + +

    インストール完了後、インストールプロセスは次のようなメッセージを表示します:

    + +
    
    +Selecting previously deselected package couchbase-server. 
    +(Reading database … 73755 files and directories currently installed.)
    +Unpacking couchbase-server (from couchbase-server_x86_64_2.1.0-xxx-rel.deb) … 
    +libssl0.9.8 is installed. Continue installing 
    +Minimum RAM required : 4 GB 
    +System RAM configured : 4058708 KB
    +      
    +      
    +Minimum number of processors required : 4 cores 
    +Number of processors on the system : 4 cores
    +Setting up couchbase-server  … 
    +
    +Starting couchbase-server[  OK  ]
    +
    +You have successfully installed Couchbase Server.
    +Browse to http://cen-1733:8091/ to configure your server.
    +Refer to http://couchbase.com for additional resources.
    +
    +Update your firewall configuration to
    +allow connections to the following ports: 11211, 11210, 11209, 4369,
    +8091, 8092, 18091, 18092, 11214, 11215 and from 21100 to 21299.
    +
    +By using this software you agree to the End User License Agreement.
    +See /opt/couchbase/LICENSE.txt.
    +
    +      
    +
  4. + +
+ + +

インストール成功後、現在のステータス確認を含むCouchbase Serverサービスの管理のためserviceコマンドを使用します。手順についてはUbuntuドキュメントを参照してください。

+ +

Couchbaseの初期セットアップを行うには、Webブラウザを開きCouchbase Webコンソールにアクセスします。

+ +
+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Install/Windows-install.html b/preview/contents/Install/Windows-install.html new file mode 100644 index 0000000..a22d05b --- /dev/null +++ b/preview/contents/Install/Windows-install.html @@ -0,0 +1,151 @@ +Microsoft Windows へのインストール
+

Microsoft Windows へのインストール

+ + +

Couchbase ServerはWindowsオペレーションシステムが動いているマシンにインストールすることが出来ます。

+ + +

Couchbase Serverは次のWindowsオペレーションシステムをサポートしています。

+ +
注: インストールする前にサポートされているオペレーションシステムを確認してください。
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
プラットフォームバージョン32 / 64 bitサポート推奨バージョン
Windows 2012R2 SP164 bit開発目的、商用目的 
Windows 2008R2 with SP164 bit開発目的、商用目的Windows 2008
Windows 8 32 and 64 bit開発目的のみ 
Windows 7 32 and 64 bit開発目的のみ 
+
+ + +

Windows上でCouchbase Serverをインストールするには、最初にWindows実行ファイルとして提供されているWindowsインストーラパッケージをダウンロードします。

+ +

このパッケージはウィザードを使用するか、無人インストールプロセスを実行することでインストールできます。

+ +

どちらの場合でも、インストールプロセスを実行する前にマシン上でアンチウイルスソフトウェアが動いていないことを確認して下さい。インストールを実行するマシン上で管理者権限を持っていることも確認して下さい。

+ + + +

デフォルトではWindowsのTCP/IP ポートの割り当てがクライアント通信に使用できるポートも制限されている番号に含まれています。設定を調整し、使用可能はポートの数を増やす方法を含むこの問題に関する詳細については、 MSDN: Avoiding TCP/IP Port Exhaustionをご覧ください。 +

+ + + +
重要: + Couchbase ServerはMicrosoft C++ 再頒布可能パッケージをインストール中に自動でダウンロードして使用します。けれども、もしマシン上で他のアプリケーションが既にそのパッケージを使用している場合、インストールプロセスは失敗します。インストレーションプロセスの正常完了を確実にするには、インストール中に他で実行中の全てのアプリケーションをシャットダウンします。 + Windows 2008の場合、Couchbase Serverを起動する前にService Pack 1と一緒にWindows Server 2008 R2のインストールを行い、アップグレードしなければいけません。Service Pack 1はMicrosoft TechNetから取得できます。 +
+ + +

+ 通常のMicrosoft ServerインストールではCouchbaseクラスタに十分な数のエフェメラルポートを提供されません。 + 正しい数のエフェメラルポートがなければ、リバランス中にエラーが発生したり、クライアントのタイムアウトが起きたり、バックアップに失敗する可能性があります。 + Couchbase Serverのインストーラは現在のポート設定のチェックや必要に応じて調整を行います。 + Microsoft KB-196271を参照してください。 +

+ + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Install/hostnames.html b/preview/contents/Install/hostnames.html new file mode 100644 index 0000000..597b1de --- /dev/null +++ b/preview/contents/Install/hostnames.html @@ -0,0 +1,105 @@ +ホスト名の利用
+

ホスト名の利用

+ +

各Couchbase Serverのインスタンスはそのホスト名を利用できます。

+ +

+ 初めてCouchbase Serverをインストールする際、デフォルトIPアドレスを利用してアクセスできます。 + しかし各サーバインスタンスのホスト名を指定したい場合もあります。 + 各ホスト名を指定する場合、有効で、IPアドレスを解決できるものである必要があります。 + ノードをリスタートすると、ホスト名を再度使用します。 + クラスタからノードをフェイルオーバもしくは削除する場合、そのノードは再度ホスト名を指定して設定する必要があります。 +

+ + +

+ ホスト名を指定する方法はいくつかあります: Couchbase Serverをマシンにインストールするとき、 + オンラインアップグレードとしてノードを既存クラスタに追加するとき、 + もしくはREST APIを利用する場合です。 + Couchbase Serverはホスト名をディスク上の設定ファイルに保存します。 +

+ +

初期セットアップ時にホスト名を指定する

+ + 最初の画面で、ホスト名かIPアドレスをServer Hostnameで指定します。 + 指定したホスト名はノードを再起動しても有効です。 +
+ + + +
+ +

ノード追加時にホスト名を指定する

+ + 既存の2.0.1以降のCouchbaseクラスタにノードを追加する際、 + まず、セットアップウィザートから新規ノードのホスト名を設定します。 + Add Server > Server IP Addressから、 + ホスト名またはIPアドレスを指定して、クラスタに新規ノードを追加します。 +
+ + +
+ +

REST APIでホスト名を指定する

+ + /node/controller/rename endpointに対してRESTリクエストを送信し、ノードのホスト名を指定します。 +
+ この方法を利用する場合、ノードをクラスタに追加する前にホスト名を指定する必要があります。 + もしすでにCouchbaseクラスタの一部であるノードにホスト名を指定した場合、 + サーバはリクエストを拒否し、 +
error 400 reason: unknown ["Renaming is disallowed for nodes that are already part of a cluster"]
+ + を返します。 +
curl -v -X POST -u Administrator:asdasd \
+http://127.0.0.1:8091/node/controller/rename -d hostname=shz.localdomain
+
+ +
+ + +

ホスト名のエラー

+

+ ノードのIPアドレスとポート、クラスタの管理者の認証情報を指定します。 + hostnameで指定する値は、そのノードの有効なホスト名でなければなりません。 + 以下のエラーが発生する可能性があります: +

+ +
    +
  • Could not resolve the host name. The host name you provide as a parameter does not + resolve to a IP address.
  • + +
  • Could not listen. The host name resolves to an IP address, but no network connection + exists for the address.
  • + +
  • Could not rename the node because name was fixed at server start-up.
  • + +
  • Could not save address after rename.
  • + +
  • Requested name host name is not allowed. Invalid host name provided.
  • + +
  • Renaming is disallowed for nodes that are already part of a cluster.
  • + +
+ +
+ + + + + +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Install/init-setup.html b/preview/contents/Install/init-setup.html new file mode 100644 index 0000000..6eeac5e --- /dev/null +++ b/preview/contents/Install/init-setup.html @@ -0,0 +1,179 @@ +サーバの初期セットアップ
+

サーバの初期セットアップ

+ +

+ インストール完了後に、Couchbase Serverをセットアップする必要があります。 +

+ + +
    +
  1. Couchbase Webコンソールを開きます。
  2. + +
  3. ディスクストレージとクラスタ設定をセットアップします。 +
      +
    • Configure Disk Storageオプションは、Couchbase Serverが利用する永続化ストレージの場所を指定します。 + この設定は、このノードのみに影響し、ディスク上に保存されるすべてのデータのディレクトリを設定します。 + また、Viewにより生成されるインデックスの保存場所も指定します。 +

      + Viewを利用してインデックスを生成しない場合、デフォルトの設定のまま利用することも可能です。 + 最大のパフォーマンスを得るには、ドキュメントとインデックスデータをサーバ上の異なるディスクに設定してください。 +

      +
    • + +
    • Configure Server Memoryセクションは、Couchbase Serverストレージに割り当てる物理RAMの容量を指定します。 +

      + 新規のクラスタを作成する場合、このメモリ容量はCouchbaseクラスタ内の各ノード上で割り当てられる容量となります。 + 同一の容量がクラスタ内の各ノード上で割り当てられます。 + クラスタ全体で同一の設定が有効となるため、すべてのノードで利用可能な値を設定してください。 + デフォルトでは、Viewを利用しアクセスする際のオペレーティングシステムのキャッシュ層に提供するためのRAM容量を加味し、 + 総空きRAMの60%が設定されています。 +

      +
    • +
    +
  4. + +
  5. Configure Server Hostnameで、ノードのIPアドレスもしくはホスト名を指定します。 +
    + +
  6. + +
  7. + 既存ノードのIPアドレスもしくはホスト名と、既存クラスタの管理者の認証情報を指定してください。 +
  8. + +
  9. + 既存クラスタに参加するには、Join a cluster nowラジオボタンをチェックします。 +
  10. + +
  11. + Nextをクリックします。 +

    Sample Bucketsパネルが表示され、ロードするサンプルデータバケットを選択できます。

    +
  12. + +
  13. + Couchbase Serverにロードするサンプルバケットの名前をクリックします。 + これらのデータセットはCouchbase Serverの機能をデモンストレーションし、 + Viewの利用方法を理解し、開発に役立てることができます。 + サンプルデータをインストールすると、インストーラは選択したサンプルデータセットごとにCouchbaseバケットを作成します。 +
    + +
    + +

    + サンプルデータバケットを作成した後、Create Bucketパネルが表示され新しいデータバケットを作成できます。 +

    +
  14. + +
  15. + Couchbase Serverにテスト用のバケットを作成します。 + セットアップ後にバケット名の変更を除く、すべてのバケットの設定変更が可能です。 +

    + バケット名にdefaultを入力し、パネル内のその他項目はすべてデフォルト設定とします。 +

    + +

    + Couchbase Serverはdefaultという名前の新しいデータバケットを作成します。 + このテスト用バケットをテスト環境で、Couchbase Serverを理解し利用するために利用してください。 +

    +
  16. + +
  17. + Update Notificationsを選択します。 + Couchbase WebコンソールはCouchbaseノードと通信し、各ノードのバージョン番号を確認します。 +

    + インターネットアクセスが利用可能である間、Couchbase社にこの情報が匿名情報として送信され、 + アップデートの通知とCouchbase Serverと関連する製品の工場に役立てるためだけに利用されます。 + Eメールアドレスを入力すると、Couchbaseコミュニティメーリングリストに登録され、 + Couchbaseや関連製品のニュースやアップデート情報を受信できます。 + メーリングリストは各ニュースレター内のUnsubscribeリンクから、いつでも購読の解除が可能です。 +

    + +

    + Couchbase Webコンソールは次の情報を送信します: +

    +
      +
    • + 現在のバージョン。新しいバージョンのCouchbase Serverが存在する場合、 + 新バージョンのダウンロード先を知ることができます。 +
    • + +
    • + お使いのCouchbaseクラスタのサイズと設定をCouchbase社に送信します。 + この情報はデプロイの優先度を決定するために利用されます。 +
    • + +
    +
  18. + +
  19. + ユーザ名とパスワードを入力します。ユーザ名は24文字まで、パスワードは6文字から24文字までです。 + クラスタに新しいサーバを追加する際は、この認証情報を利用します。 + Couchbase REST APIでも同じ認証情報を利用します。 +
  20. + + +
  21. + このセットアップが完了すると、Couchbase WebコンソールにCluster + Overviewページが表示されます: +
    + +
    + +

    + Couchbase Serverを利用する準備が整いました。 +

    + +

    + インストールが完了し、初期サーバのセットアップが完了すると、 + ポートやRAMなどのその他の設定が次の方法を利用し、任意に設定可能となります: +

    +
  22. +
+ + +
+ +
コマンドラインツール
+ +
+ Couchbase Serverのインストールには、REST APIをラップし、Couchbase Serverの主要な機能にアクセスできる、 + couchbase-cliなどのコマンドラインツールが含まれています。 +
+ + +
+ +
+ +
REST API
+ +
+ Couchbase Serverは、コマンドラインツールとCouchbase ServerのWebインタフェースがベースとしている、 + REST APIを利用して設定や制御が可能です。 +
+ + +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Install/install-browsers.html b/preview/contents/Install/install-browsers.html new file mode 100644 index 0000000..d1ad0a9 --- /dev/null +++ b/preview/contents/Install/install-browsers.html @@ -0,0 +1,70 @@ +サポート対象のWebブラウザ
+

サポート対象のWebブラウザ

+ + +

+ サポートされるブラウザは、Mozilla Firefox、Apple Safari、Google Chrome、そしてMicrosoft Internet Explorerです。 +

+ +

Couchbase Webコンソールは以下のWebブラウザとバージョンでJavaScriptを有効にした状態で動作します:

+ + +
+ +
Mozilla Firefox 3.6 以降
+ +
JavaScriptを有効にするには、アプリケーション設定から + ContentパネルのEnable JavaScriptを選択してください。 +
+ + +
+ + +
+ +
Apple Safari 5以降
+ +
+ JavaScriptを有効にするには、アプリケーション設定のセキュリティタブのチェックボックスを利用してください。 +
+ + +
+ + +
+ +
Google Chrome 11以降
+ +
+ JavaScriptを有効にするには、Chromeのメニューから、Preferencesを選択してください。 + Advanced Settings > Privacy + のContent Settingsをクリックします。 + JavaScriptセクションにある、Allow all sites to run JavaScript (recommended)ラジオボタンを選択します。
+ + +
+ + +
+ +
Microsoft Internet Explorer 8以降
+ +
JavaScriptを有効にするには、 + Tools > Internet Options > Security > Custom Level > Active Scriptingを選択してください。
+ + +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/install-networkPorts.html b/preview/contents/Install/install-networkPorts.html new file mode 100644 index 0000000..73aaf63 --- /dev/null +++ b/preview/contents/Install/install-networkPorts.html @@ -0,0 +1,393 @@ +ネットワークポート
+

ネットワークポート

+ + +

+ Couchbase Serverはサーバコンポーネント間、およびCouchbaseクラスタに保存されたデータにアクセスするクライアントとの間で、 + 特定のネットワークポートを利用します。 +

+ +

+ 以下の表に示すポートはCouchbase Serverを稼働し、正常に動作するために、ホスト上で利用可能とする必要があります。 + Couchbase Serverはこれらのポートを自動的に利用するので、各利用種別において、 + ファイヤウォールとiptablesの設定が、特定のポートで通信を許可するように設定されているかご確認ください。 + Linuxの場合、インストーラがこれらのポートをオープンするように通知します。 +

+ +

+ 以下の表はさまざまな通信種別にCouchbase Serverが利用するポートの一覧です: +

+ +
+ +
ノード間
+ +
+ これらのポートはCouchbase Serverがクラスタ内のすべてのノード間で通信するために利用します。 + これらのポートは各ノード間で通信を可能とするためにオープンされている必要があります。 +
+ + + + +
ノードとクライアント
+ +
+ これらのポートはクラスタ内のすべてのノードと、クライアントが通信するためにCouchbase Serverが利用します。 + これらのポートは各ノードがクライアントと通信できるようにオープンされている必要があります。 +
+ + +
+ +
+ +
クラスタ管理用
+ +
+ これらのポートはREST API、コマンドラインクライアント、WebブラウザといったCouchbaseの運用管理に利用します。 +
+ + + +
XDCR
+ +
+ これらのポートはXDCR(クロスデータセンタレプリケーション)でソースクラスタと宛先クラスタ内のすべてのノード間で通信するために利用します。 +
+ + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ポート説明ノード間ノードとクライアント間クラスタ管理用XDCR v1XDCR v2
8091Web管理用ポートYesYesYesYesYes
8092Couchbase APIポートYesYesNoYesYes
11207内部/外部用SSLバケットポートNoYesNoNoNo
11209内部バケットポートYesNoNoNoNo
11210内部/外部用バケットポートYesYesNoNoYes
11211クライアントインタフェース(プロキシ)NoYesNoNoNo
11214SSLプロキシ受信用NoNoNoNoYes
11215内部SSLプロキシ送信用NoNoNoNoYes
18091内部REST HTTPS、SSL用NoYesYesNoYes
18092内部CAPI HTTPS、SSL用NoYesNoNoYes
4369Erlang Port Mapper ( epmd )YesNoNoNoNo
21100 から 21299 までノード間データ転送YesNoNoNoNo
+
+ + +
+ +
ポート8091
+ +
Couchbase WebコンソールのREST/HTTPトラフィックに利用。
+ + + + + +
ポート8092
+ +
Viewへのアクセス、クエリの実行、デザインドキュメントの更新に利用。
+ + + + +
ポート11207
+ +
スマートクライアントライブラリからSSLでのデータノードアクセスに利用。
+ + + + + +
ポート11210
+ +
スマートクライアントおよびMoxiからデータノードへ直接アクセスする場合に利用。
+ + + + + +
ポート11211
+ +
既存のCouchbaseとmemcached(スマートではない)クライアントライブラリから利用。
+ + + + + +
ポート11214、11215
+ +
SSLを利用したXDCRのデータ暗号化で利用。
+ + + +
ポート18091
+ +
Couchbase WebコンソールのREST/HTTP SSLトラフィックで利用。
+ + + +
ポート18092
+ +
SSLを利用した、Viewアクセス、クエリの実行、デザインドキュメントの更新に利用。
+ + + + + +
上記以外のポート
+ +
その他のCouchbase Server通信に利用。
+ + + +
+ + +
注: + ポート11213は、memcachedとコンパクション用にローカルホスト上で内部的に利用されるポートです。 + クラスタ内のノード間で通信を行うためには利用しません。 + ファイヤウォールの設定では、11213ポートを意識する必要はありません。 + しかしながら、他のサービスがこのポートでリスンしている場合、Couchbase Serverは正常に起動しません。 +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/install-platforms.html b/preview/contents/Install/install-platforms.html new file mode 100644 index 0000000..3424ba3 --- /dev/null +++ b/preview/contents/Install/install-platforms.html @@ -0,0 +1,255 @@ +サポート対象のプラットフォーム
+

サポート対象のプラットフォーム

+ + +

サポート対象のプラットフォームシステム要件。

+ + +

+ Couchbase ServerはWindows 2012と、Ubuntu 12.04、CentOS 6用の独立したパッケージをサポートします。 +

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
プラットフォームバージョン32 / 64 bitサポート対象推奨バージョン
Red Hat Enterprise Linux564 bit開発用、プロダクション用RHEL 5.8
Red Hat Enterprise Linux664 bit開発用、プロダクション用RHEL 6.3
CentOS564 bit開発用、プロダクション用CentOS 5.8
CentOS664 bit開発用、プロダクション用CentOS 6.3
Amazon Linux2013.0364 bit開発用、プロダクション用 
Ubuntu Linux10.0464 bit開発用、プロダクション用 
Ubuntu Linux12.0464 bit開発用、プロダクション用Ubuntu 12.04
Debian Linux764 bit開発用、プロダクション用Debian 7.0
Windows 2012SP1適用済みのR264 bit開発用、プロダクション用 
Windows 2008SP1適用済みのR264 bit開発用、プロダクション用Windows 2008
Windows 8 32 and 64 bit開発用のみ 
Windows 7 32 and 64 bit開発用のみ 
Mac OS10.764 bit開発用のみ 
Mac OS10.864 bit開発用のみMac OS 10.8
+
+ + +
重要: + 異なるプラットフォームを混在したCouchbaseクラスタはサポートされません。 + 特に、他のプラットフォームでは1024個のvBucketを利用していますが、Mac OS Xは64個のvBucketを利用しています。 + このような違いがあるため、Mac OS Xのクラスタと、他のプラットフォームでホストしているクラスタの間でデータを移動する必要がある場合は、 + cbbackupと、cbrestoreを利用してください。 +
+ +
重要: + AWS (Amazon Web Services): + RightScaleを利用しない直接的なCouchbase Server AMI (Amazon Machine Images)の利用を希望される場合、 + インストール手順の説明として、ホワイトペーパー"NoSQL Database in the Cloud: Couchbase Server 2.0 on AWS"をご参照ください。 +

AWS AMIでのインストール +

+ +
+ + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Install/install-resourceReqs.html b/preview/contents/Install/install-resourceReqs.html new file mode 100644 index 0000000..6b16032 --- /dev/null +++ b/preview/contents/Install/install-resourceReqs.html @@ -0,0 +1,87 @@ +リソース要件
+

リソース要件

+ +

Couchbase Serverインストールのリソース要件。

+ +

推奨スペック

+

Couchbase Serverのインストールには、次のガイドラインに従ってください:

+ +
    +
  • Key-Valueストア用に、クアッドコア、64bit 3GHzのCPU。

    +
  • + +
  • XDCR(クロスデータセンタレプリケーション)とViewを利用する場合、6コア。

    +
  • + +
  • 16GBのRAM (物理)。

    +
  • + +
  • ブロックベースのストレージデバイス(ハードディスク、SSD、EBS、iSCSI)。CIFSやNFSなどのネットワークファイルシステムはサポートされません。

    +
  • + +
+
+ +

最小構成

+

最小構成のマシンは以下を満たす必要があります:

+ +
    +
  • Key-Valueストア用にデュアルコア 2GHzのCPU。
  • + +
  • 4GBのRAM (物理)。
  • + +
+ +
注: + 開発やテスト用途には、CPUとRAMのリソースを最小推奨よりも少ないものにすることもできます。 + この場合、オペレーティングシステムが利用する領域を除いた、1GBの空きRAM、シングルCPUコアでも動作します。 + プロダクション環境では、必ず最小構成以上としてください。 +
+ +
注: + 推奨構成よりも低いスペックで構成されるマシンでのパフォーマンスは著しく劣化し、 + プロダクション環境のマシンでの性能を測定することはできません。 + CPUが2つより少ないマシンでは、Viewのパフォーマンスも著しく劣化します。 +
+
+ +

メモリ要件

+ +

+ お使いのマシンではオペレーティングシステムとCouchbase Serverを動作させるための、十分なメモリを搭載する必要があります。 + 例えば、Couchbase Serverに8GBのRAMを割り当てる場合、それ以外にオペレーティングシステム用に十分なRAMも必要になります。 + もし、これ以外のアプリケーションやサーバを稼働させる場合、追加のRAMが必要になります。 + 16GB未満の小規模のシステムでは、少なくともRAMの40%をオペレーティングシステムに割り当ててください。 +

+ +

ストレージ要件

+

以下のストレージ容量が必要です:

+ +
    +
  • アプリケーションログ用に、1GB。
  • + +
  • データの永続化用に、少なくとも物理RAMの2倍のディスク容量。
  • + +
+ +
+ +

CLIユーティリティ要件

+ Couchbaseコマンドラインユーティリティが正しく動作するためには、バージョン2.6以降のPythonがシステムにインストールされている必要があります。 +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Install/linux-startup-shutdown.html b/preview/contents/Install/linux-startup-shutdown.html new file mode 100644 index 0000000..327c62b --- /dev/null +++ b/preview/contents/Install/linux-startup-shutdown.html @@ -0,0 +1,38 @@ +Linuxでの起動と停止
+

Linuxでの起動と停止

+ + +

起動と停止用のスクリプトは手動でCouchbase Serverを起動もしくは停止するために使用します。

+ +

+ Couchbase Serverは起動時に標準的な制御スクリプトを使用することによりバックグラウンド(デーモン)プロセスとして起動することができる、独立したアプリケーションとしてインストールされます。 このスクリプトは /etc/init.d/couchbase-serverにあります。 +

+ +

+ 起動スクリプトはLinuxパッケージリリース(Debian/Ubuntu または Red Hat/CentOS)のいずれかをインストールすると、自動的にインストールされます。 + デフォルトでは、Couchbase Serverは自動起動が起動レベル2、3、4、5で設定され、明示的な停止が0、1、6で設定されます。 +

+ + +

手動でCouchbase Serverを起動するには起動・停止用のスクリプトを使用します:

+ + +
>> sudo /etc/init.d/couchbase-server start
+ + +

手動でCouchbase Serverを停止するには起動・停止用のスクリプトを使用します:

+ + +
> sudo /etc/init.d/couchbase-server stop
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/mac-install-osx.html b/preview/contents/Install/mac-install-osx.html new file mode 100644 index 0000000..d298544 --- /dev/null +++ b/preview/contents/Install/mac-install-osx.html @@ -0,0 +1,43 @@ +Mac OSX へのインストール
+

Mac OSX へのインストール

+ + +

GUIもしくはコマンドラインを使用して、Mac OSX上にCouchbase Serverをインストールします。

+ +
+
    +
  1. 以前にインストールされたCouchbase Serverがある場合は削除します。コマンドラインを使用するか、アイコンをゴミ箱にドラッグ・アンド・ドロップして削除してください。
  2. + +
  3. 同様に(ライブラリの)残留ファイルも削除します。: + +
    > rm -rf ~/Library/Application Support/Couchbase
    +> rm -rf ~/Library/Application Support/Membase
    +
  4. + +
  5. Mac OS X用の(Couchbase Serverインストレーション)zipファイルをダウンロードします。
  6. + +
  7. ダウンロードしたzipファイルをダブルクリックして解凍します。フォルダが作成され、Couchbase Server.app アプリケーションが作成されます。
  8. + +
  9. Couchbase Server.appApplications フォルダなどの、所定のインストール先にドラグ・アンド・ドロップします。
  10. + +
+

インストールが完了したら、 Couchbase Server.app をダブルクリックして、Couchbase Serverを起動します。(このとき)Couchbase Server アイコンが、メニューバーの右側に現れます。(この段階では)Couchbase Serverの設定がされていない初期状態ですので、Couchbase Webコンソールからセットアッププロセスに進みます。

+ +

Couchbase Serverは、バックグランドアプリケーションとして実行されます。 メニューバーのアイコンをクリックすると、実行可能なオペレーションがリストされます。

+ +

コマンドライン・インタフェース(CLI)ツールは、Couchbase Serverのアプリケーションディレクトリ内に含まれています。ターミナルから、これらCLIにアクセスできます。 コマンド実行には、Couchbase Serverインストレーションフォルダへのフルパスを指定してください。デフォルトでは、 + /Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/です。

+ + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/mac-non-root-sudo.html b/preview/contents/Install/mac-non-root-sudo.html new file mode 100644 index 0000000..dd0aa75 --- /dev/null +++ b/preview/contents/Install/mac-non-root-sudo.html @@ -0,0 +1,42 @@ +非ルート権限によるインストール
+

非ルート権限によるインストール

+ + +

Mac OS X環境上で非ルート権限ユーザ(非root、非sudo)によるインストールを行う場合は、開発を目的とした場合にのみ使用してください。

+ + +

非root、非sudoによるインストールを実施する場合でも、Couchbase Serverを実行させることができ、またCouchbaseコマンドラインツールをすべて使用することができます。

+ +

非root、非sudoによるインストールを行うには:

+ +
    +
  1. Couchbase Serverをダウンロードした後、ターミナルを起動してDownloadsディレクトリに移動します:
    cd ~/Downloads/
    +
  2. + +
  3. ダウンロードしたパッケージファイルをUnzipします:
    open couchbase-server-enterprise_x86_64_2.1.0.zip
    +
  4. + +
  5. Couchbase Appを /Applications フォルダに移動します: +
    mv couchbase-server-enterprise_x86_64_2.1.0/Couchbase\ Server.app /Applications/
    +
  6. + +
  7. Couchbase Serverをターミナルからスタートさせます:
    open /Applications/Couchbase\ Server.app
    + + これでCouchbase Serverを非rootユーザ、非sudoにより実行することができます:
  8. + +
  9. Couchbase Serverを停止するには、メニューバーのアイコンメニューをクリックし、Quit + Couchbase Serverを選択してください。
  10. + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/mac-startup-shutdown.html b/preview/contents/Install/mac-startup-shutdown.html new file mode 100644 index 0000000..d4bc86f --- /dev/null +++ b/preview/contents/Install/mac-startup-shutdown.html @@ -0,0 +1,106 @@ +Mac OS X上での起動とシャットダウン
+

Mac OS X上での起動とシャットダウン

+ +

起動スクリプトとシャットダウンスクリプトは、Couchbase Serverを手動により起動もしくはシャッドダウンするために使用します。

+ +

Mac OS XではCouchbase Serverは、バックグラウンドで実行され、メニューバーにインストールされたアイコンにより制御することのできる、標準アプリケーションとして提供されます。 +

+ + +
+ + +

それぞれのメニューオプションは下記アクションを実行します:

+ + +
+ +
About Couchbase Server
+ +
インストールされたCouchbase Serverについてのライセンスとバージョン情報を含む標準ダイアログを開きます。
+ + +
+ +
+ +
Open Admin Console
+ +
デフォルトブラウザから、Web Administration Consoleをオープンします。
+ + +
+ +
+ +
Visit Support Forum
+ +
デフォルトブラウザから、CouchbaseウェブサイトのCouchbase Serverサポートフォーラムをオープンします。このフォーラムでは、他のユーザやCouchbase開発者に質問を投稿することができます。
+ + +
+ +
+ +
Check for Updates
+ +
Couchbase Serverの最新バージョンをチェックします。これは現在インストールされているバージョンに対して利用可能な + 最新バージョンをチェックし、ダウンロードと、新しいバージョンのインストールを促します。 +

もしも新しいバージョンが利用可能である場合、新しいリリースに関するインフォメーションを含むダイアログが表示されます。 + この場合、ユーザはアップデートをスキップするか、後日通知を受けるようにするか、新しいバージョンを自動的にアップデートするようにするか、いずれかを選択することができます。 +

+

自動アップデートを選択した場合、Couchbase Serverの最新の利用可能なバージョンが(自動的に)このマシーンにダウンロードされ、アップデート可能な最新のインストレーションが + 利用可能になったことを表示します。インストレーションは、現在のサーバプロセスをシャットダウンし、アップデートをインストールし、インストレーションが完了後、サーバを再起動します。 + ユーザは、Couchbase Serverを今後自動的にアップデートするかどうかについて質問されます。 +

+

アップデートサービスを使用すると、ユーザの組織において使用されるCouchbaseの現在のバージョンとクラスタについての利用データを匿名で送信されることもまた行われます。 + この情報は、サービス向上のために使用されます。

+

ユーザは、Automatically download and install updates in the + future チェックボックスを選択することにより、自動更新を有効にすることができます。

+
+ + +
+ + +
+ +
Launch Admin Console at Start
+ +
このメニューアイテムをチェックされていると、Couchbase Serverがスタートしたときにはいつでも、Couchbase Web Consoleがオープンされます。
+ +
+ + +
+ +
Automatically Start at Login
+ +
このメニューアイテムがチェックされていると、Couchbase ServerはMac OS Xマシンの起動時に自動的にスタートします。
+ + +
+ + +
+ +
Quit Couchbase Server
+ +
このメニューオプションの選択により、Couchbase Serverをシャットダウンします。この時にメニューインタフェースもまたクローズします。 + リスタートするには、インストレーションフォルダからCouchbase Serverアプリケーションをオープン(訳注:通常はアプリケーションフォルダかLaunchpadからCouchbase Serverアイコンをクリック)しなければなりません。
+ + +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/mac-uninstall.html b/preview/contents/Install/mac-uninstall.html new file mode 100644 index 0000000..bdc16e9 --- /dev/null +++ b/preview/contents/Install/mac-uninstall.html @@ -0,0 +1,50 @@ +Mac OS X からのアンインストール
+

Mac OS X からのアンインストール

+ + +

Couchbase Serverをアンインストールするには以下の手順を実行します。

+ + +

Couchbase Serverを削除する前に

+
    +
  1. Couchbase Serverをシャットダウンします。
  2. + +
  3. もしもあなたのマシーンが(Couchbase)クラスタの一部である場合は、これを(クラスタ)から外しリバランスを実行します。
  4. + +
  5. Couchbase Serverクラスタ内のノードに正しく接続できるようクライアントを更新します。
  6. + +
+
+ + +

Couchbase Serverのアンインストール

+ +
    +
  1. Applicationsフォルダを開き、Couchbase + Serverをドラッグしてゴミ箱に入れます。 + この操作の代わりに、コマンドラインから削除することもできます。 + 管理者権限が要求される場合には適切に認証を行って削除処理を完了させてください。
  2. + +
  3. Couchbase Serverを稼働させていたユーザのCouchbaseフォルダ及びMembaseフォルダを + ~/Library/Application Supportフォルダから削除します。 + このオペレーションは、アプリケーションデータを削除します。 +
    > rm -rf ~/Library/Application\ Support/Couchbase
    +> rm -rf ~/Library/Application\ Support/Membase
    + +
  4. + +
+
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/migrate-couchdb.html b/preview/contents/Install/migrate-couchdb.html new file mode 100644 index 0000000..4968d8c --- /dev/null +++ b/preview/contents/Install/migrate-couchdb.html @@ -0,0 +1,114 @@ +Migrating from CouchDB
+

Migrating from CouchDB

+ +

Migration guidelines for CouchDB users

+ +

Although Couchbase Server incorporates the + view engine functionality built into CouchDB, most of the remaining functionality is + supported through the components and systems of Membase Server.

+

This change introduces + a number of significant differences for CouchDB users who want to use Couchbase Server, + particularly when migrating existing applications. However, they also gain the scalability + and performance advantages of the Membase Server components.

+ + +

Differences in terms and concepts

CouchDB stores + information using the concept of a document ID (either + explicit or automatically generated), against which the document (JSON) is stored. Within + Couchbase there is no document ID, and information is stored in the form of a + key-value pair instead. The key is equivalent to the document ID, the value is + equivalent to the document, and the format of the data is the same.

+ +

Almost all of the + HTTP REST API that makes up the interface for communicating with CouchDB does not exist + within Couchbase Server. The basic document operations for creating, retrieving, updating + and deleting information are entirely supported by the memcached protocol.

+ +

Also, + beyond views, many of the other operations are unsupported at the client level within + CouchDB. For example, you cannot create a new database as a client, store attachments, or + perform administration-style functions, such as view compaction.

+ +

Couchbase Server + does not support the notion of databases. Instead, information is stored within logical + containers called Buckets. These are logically equivalent and can be used to + compartmentalize information according to projects or needs. With Buckets you get the + additional capability to determine the number of replicas of the information, and the port + and authentication required to access the information.

+
+ + +

Consistent functionality

The operation and interface + for querying and creating view definitions in Couchbase Server are mostly identical. Views + are still based on the combination of map/reduce functions, and you can + port your map/reduce definitions to Couchbase Server without any issues. The main + difference is that the view does not output the document ID. Instead, it + outputs the key against which the key-value was stored into the database.

+ +

Querying + views is also the same, and you can use the same arguments to perform a query, such as a start and + end docIDs, returned row counts and query value specification, including the requirement + to express your key in the form of a JSON value if you are using compound (array or hash) + types in your view key specification. Stale views are also supported, and just as with + CouchDB, accessing a stale view prevents Couchbase Server from updating the + index.

+
+ + +

Changed functionality

There are many changes in the + functionality and operation of Couchbase Server compared to CouchDB:

+ +
* Basic data storage operations must use the memcached API.
+
+* Explicit replication is unsupported. Replication between nodes within a cluster
+  is automatically configured and enabled and is used to help distribute
+  information around the cluster.
+
+* You cannot replicate between a CouchDB database and Couchbase Server.
+
+* Explicit attachments are unsupported, but you can store additional files as new
+  key-value pairs into the database.
+
+* CouchApps are unsupported.
+
+* Update handlers, document validation functions, and filters are not supported.
+
+* Futon does not exist, instead there is an entire Web Administration Console
+  built into Couchbase Server that provides cluster configuration, monitoring and
+  view/document update functionality.
+
+ +
+ + +

Operational and deployment differences

The major differences between CouchDB and Couchbase Server are in options + for clustering and distribution of information. With CouchDB, + you need to handle the replication of information between multiple nodes and then + use a proxy service to distribute the load from clients over multiple machines.

+

With + Couchbase Server, the distribution of information is automatic within the cluster, and any + Couchbase Server client library will automatically handle and redirect queries to the + server that holds the information as it is distributed around the cluster.

+
+ + +

Client and application changes

As your CouchDB based + application already uses JSON for the document information and a document ID to identify + each document, the bulk of your application logic and view support remain identical. + However, the HTTP REST API for basic CRUD operations must be updated to use the memcached + protocol.

+

Additionally, because CouchApps are unsupported, you need to develop a + client side application to support any application logic.

+
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/migrate-membase.html b/preview/contents/Install/migrate-membase.html new file mode 100644 index 0000000..45529f3 --- /dev/null +++ b/preview/contents/Install/migrate-membase.html @@ -0,0 +1,119 @@ +Migrating from Membase
+

Migrating from Membase

+ +

Migration guidelines for Membase users.

+ + +

For an existing Membase user, the primary methods for creating, adding, manipulating, and + retrieving data remain the same. In addition, the background operational elements of the + Couchbase Server deployment will not differ from the basic running of a Membase cluster.

+ + +

Term and concept differences

The following terms are new or updated in + Couchbase Server:
+ +
Views
+ +
Views and the associated terms of the map and reduce + functions used to define views. Views provide an alternative method for accessing and + querying information stored in key-value pairs within the Couchbase Server. Views allow + you to query and retrieve information based on the values of the contents of a key-value + pair, provided the information has been stored in a JSON format.
+ + +
+
+ +
JSON
+ +
JSON (JavaScript Object Notation) is a data representation format that is required to + store the information in a format that can be parsed by the View system.
+ + +
+
+ +
Membase Server
+ +
This is now the Couchbase Server.
+ + +
+
+ +
Membase buckets
+ +
These are now the Couchbase buckets
+ + +
+
+ + +

Consistent functionality

+

The core functionality of + Membase, including the methods for basic creation, updating, and retrieval of information + all remain identical within Couchbase Server. You can continue to use the same client + protocols for setting and retrieving information.

+

The administration, deployment, + and core of the Couchbase Web Console and administration interfaces are also identical. There are + updates and improvements to support additional functionality which is included in existing + tools. These include views-related statistics, and an update to the Web Administration + Console for building and defining views.

+
+ + +

Changed functionality

+

The main difference available in the Couchbase Server is that, in addition to the key-value + data store nature of the database, you can also use views to convert the information from + individual objects in your database into lists or tables of records and information. Through + the view system, you can also query data from the database based on the value (or fragment + of a value) of the information that you have stored against a key.

+

This fundamental + differences means that applications no longer need to manually manage the concept of lists + or sets of data by using other keys as a lookup or compounding + values.

+
+ + +

Operational and deployment differences

+

The main components of the operation and deployment of your Couchbase Server remain the + same as with the Membase Server. You can add new nodes, fail over, rebalance and otherwise + manage your nodes.

+

However, the introduction of views means that you need to + monitor and control the design documents and views that are created alongside your bucket + configurations. Indexes are generated for each design document (that is multiple views), and + for optimum reliability you might want to back up the generated index information to reduce + the time to bring up a node in the event of a failure, as building a view from raw data on + large datasets can take a significant amount of time.

+

In addition, you need to + understand how to recreate and rebuild view data, and how to compact and clean up view + information to help reduce disk space consumption and response + times.

+
+ + +

Client and application changes

+

Clients can continue to communicate with the Couchbase Server using the existing memcached + protocol interface for the basic create, retrieve, update and delete operations for + key-value pairs. However, to access the view functionality you must use a client library + that supports the view API (which uses HTTP REST).

+ +

To build views that can output and query your stored data, your objects must be stored in + the database in the JSON format. If you have been using the native serialization of your + client library to convert a language specific object so that it can be stored into the + Membase Server, you might need to structure your data and use a native to JSON serialization + solution, or reformat your data so that it can be formatted as JSON.

+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/migrating.html b/preview/contents/Install/migrating.html new file mode 100644 index 0000000..6956edd --- /dev/null +++ b/preview/contents/Install/migrating.html @@ -0,0 +1,31 @@ +移行
+

移行

+ + +

このセクションではMembaseまたはCouchDBからCouchbase Serverへの移行について説明します。

+ + +

Couchbase ServerはMembase ServerとCouchDB両方のコンポーネントをベースにしています。

+ +

これらのデータベースシステムのユーザもしくはこれらからCouchbase Serverへ移行する場合、次の情報は主要な概念や用語を理解するために変換するのに役立ちます。

+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/post-install.html b/preview/contents/Install/post-install.html new file mode 100644 index 0000000..2795f61 --- /dev/null +++ b/preview/contents/Install/post-install.html @@ -0,0 +1,47 @@ +インストール後の設定
+

インストール後の設定

+ + +

+ 初期サーバのセットアップとサーバ接続のテストなどのインストール後の設定について解説します。 +

+ +
ヒント: + セットアップ手順を開始する前にブラウザのキャッシュをクリアしてください。 + さまざまなブラウザやプラットフォームでキャッシュをクリアする方法はwww.wikihow.comで確認できます。 +
+ + +

+ すべてのプラットフォームから、8091ポートでリスンしているWebサーバに接続することで、Couchbase Webコンソールにアクセスできます。 + 例えば、serveraでサーバが特定できる場合、Couchbase Webコンソールにはhttp://servera:8091/でアクセスできます。 + IPアドレスを指定するか、もしくは同一のマシン上からはhttp://localhost:8091/でもアクセスできます。 + Couchbase Serverを8091ポート以外で設定している場合、そのポートを指定してください。 +

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/pre-install.html b/preview/contents/Install/pre-install.html new file mode 100644 index 0000000..432125a --- /dev/null +++ b/preview/contents/Install/pre-install.html @@ -0,0 +1,32 @@ +インストール要件
+

インストール要件

+ + +

+ インストール要件では、システム要件、サポートされる設定、 + Couchbase Serverインストールの前に考慮すべき、予約事項、もしくは制限事項について説明します。 +

+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/rhel-installing.html b/preview/contents/Install/rhel-installing.html new file mode 100644 index 0000000..50cf1d3 --- /dev/null +++ b/preview/contents/Install/rhel-installing.html @@ -0,0 +1,63 @@ +Red Hatへのインストール
+

Red Hatへのインストール

+ +

Red HatへのCouchbase Serverのインストールは、ダウンロードしたRPMパッケージに対してrpm コマンドラインツールを使用して行います。

+ +
重要: 物理ハードウェアで稼働している、RHEL6以降のLinuxディストリビューションについては、transparent + huge pages 機能が有効になっていることが知られています。 +このオプションが、ある程度のパフォーマンスの向上を提供してくれる一方で、いくつかの条件下ではCouchbase Serverについて、 +ページアロケーション中に深刻な遅延を引き起こす原因になる可能性があることが知られています。 +このためCouchbase Serverをインストールする際には、transparent huge pages(THP)機能を無効にすることを強く推奨します。
+ +

インストールを完了させるため、rootユーザ (superuser)としてログインしてください:

+ +

+root-> rpm --install couchbase-server-version.rpm 
+     
+ +

上記versionにはダウンロードパッケージ上のバージョン番号を指定します。

+ +

rpmコマンドが完了するとCouchbase Serverは自動的に起動します。 (Couchbase Serverは)2, 3, 4,及び5のランレベルの下でブートしている場合、自動的に起動するようにコンフィギュレーションされています。 +RPMを使用したパッケージインストールに関する詳細については、the Red Hat RPM documentationを参照してください。

+ +

インストールが完了すると、インストレーションプロセスは、以下のようなメッセージを表示します:

+ +

+Minimum RAM required : 4 GB 
+    System RAM configured : 8174464 KB
+    Minimum number of processors required :  4 cores 
+    Number of processors on the system : 4 cores
+    
+    
+Starting couchbase-server[ OK ]
+
+You have successfully installed Couchbase Server. 
+    Browse to http://host_name:8091/ to configure your server. 
+   Refer to http://couchbase.com for additional resources.
+
+   Update your firewall configuration 
+    to allow connections to the following ports: 
+   
+    11211, 11210, 11209, 4369, 8091, 8092 and from 21100 to 21299.
+
+
+By using this software you agree to the End User License Agreement. 
+See /opt/couchbase/LICENSE.txt.
+     
+ + + +

インストレーションが完了したら、Red Hat chkconfigコマンドを使用して、現在のステータスや、自動スタートアップのオン・オフのためのリンクの生成が正しく行われたたかチェックします。(その後)Couchbase Serverの初期セットアップのため、Webブラウザを開きCouchbase Web Consoleにアクセスしてください。

+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/rhel-multiple-instances.html b/preview/contents/Install/rhel-multiple-instances.html new file mode 100644 index 0000000..9c8f19c --- /dev/null +++ b/preview/contents/Install/rhel-multiple-instances.html @@ -0,0 +1,123 @@ +複数インスタンスのインストール
+

複数インスタンスのインストール

+ + +

Linuxオペレーティングシステムでは、複数のCouchbase Serverインスタンスを1つの物理マシンにインストールさせることができます。 + (インストール可能な)インスタンスの個数は、物理マシンの処理能力に依存します。

+ +
重要: 1つのマシン上に複数のインスタンスをインストールすることは、開発目的に限り利用可能です。
+ + +

インストール要件

+ 各Couchbase Serverインスタンスごとに、最小構成である4GB RAMと8コアのCPUが利用可能かどうか確認してください。 + 物理マシンに複数インスタンスをインストールするとき、以下の2つのうちいずれかのユーザ権限でインストールします。: +
    +
  • sudoユーザ
  • + +
  • 非root, 非sudoユーザ
  • + +
+ + +
注: 新たにユーザ定義のポート番号を作る前に、予約されているCouchbase Serverネットワークポート番号のリストと(既に)ユーザ定義されたポート番号をチェックしてください。
+ +
+ + +

推奨事項

+ 障害が発生した場合にデータをリカバリできるように、各クラスタのインスタンスは異なる物理マシンにインストールしてください。 +
注: + インストール可能なCouchbase Serverの個数は、物理マシンのメモリ容量とCPU処理能力に依存します。
+ + +

以下の図は、物理マシン上に複数のCouchbase Serverクラスタを配置した構成例を示しています。 + このようにすると、1つのクラスタは3つのCouchbase Serverで構成され、各Couchbase Serverはそれぞれ異なる物理マシンにインストールされることになり、 + ハードウェア障害によるデータロスのリスクが減少します。

+ + +
+ + +

複数インスタンスのセットアップ

+

物理マシンに複数のインスタンスをセットアップする手順:

+ + +
    +
  1. Couchbase Serverをsudoユーザまたは非rootや非sudoユーザとしてインストールします。 + 非rootや非sudoとしてインストールする方法については非ルート権限によるインストールを参照してください。
  2. + +
  3. ポート番号をユーザ定義(で変更)する場合は、/opt/couchbase/etc/couchbase/static_configに定義してください。
  4. + +
  5. /etc/security/limits.confファイルの、ハード及びソフトに関する上限設定を確認してください。 + nofileパラメータが、10240よりも大きい値が設定されていることを確認してください。
  6. + +
  7. 各インスタンスを識別する short_nameパラメータ(デフォルト値: ns_1)を変更して + /opt/couchbase/etc/couchbase/static_configファイルの、short_nameを異なるものにしてください。
      +
    • 同一の物理サーバ内に配置されている各インスタンスのshort_nameの値は、互いに異なっていなければなりません。
    • + +
    +
  8. + +
  9. /opt/couchbase/bin/couchbase-serverファイル内に2箇所存在するshort_nameを変更してください。 + 以下の例のように、sedユーティリティーを使用して変更することができます。
      +
    • +
       sed -i ‘s/ns_1/ns_inst1/g’ bin/couchbase-server
      +
    • + +
    +
  10. + +
  11. Couchbase Serverインスタンスを起動します。
  12. + +
  13. 各インスタンスについて同様のステップを繰り返します。
  14. + +
+ + +
重要: クラスタを生成している間は、当該マシンにインストールされるインスタンスの数に応じてperServer RAM quotaが計算されていることを + 確認してください。 + クラスタインスタンスを構成する際、Couchbase Serverは、 + perServer RAM quotaにデフォルト値を設定します。このデフォルト値は、物理マシンに搭載されている利用可能なRAM quotaに基づいています。 + 必要に応じてこの値を変更してください。 +
+ +
+ + +

トラブルシューティング

クラスタがペンディング状態のままでバケットを生成した場合や、リバランスが
not_all_nodes_are_ready_yet
+エラーとともに失敗した場合は、 + 以下のファイルのshort_nameの設定値が一致していない可能性があります。:
+ +

+/opt/couchbase/bin/couchbase-server
+/opt/couchbase/etc/couchbase/static_config
+ +
+ +

制限事項

+
    +
  • Cbrecoveryは、ユーザによりポート番号がカスタマイズされている場合には利用できません。
  • + +
  • Cbworkloadgenは利用できません。
  • + +
  • オフラインの状態でアップグレードをすることはできません。
  • + +
  • バケットが専用ポートを指定して生成されている場合、いくつかのオペレーションでは + could not listen on port xxxというエラーが返却されることがあります。 + オペレーションが結果的に成功したとしても、このエラー(メッセージ自体)は、このポートが使用されているかどうかに関わりなくログとして出力されます。
  • + +
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/rhel-non-root-sudo.html b/preview/contents/Install/rhel-non-root-sudo.html new file mode 100644 index 0000000..f4db89a --- /dev/null +++ b/preview/contents/Install/rhel-non-root-sudo.html @@ -0,0 +1,64 @@ +非ルート権限によるインストール
+

非ルート権限によるインストール

+ + +

Red Hat環境上で非ルート権限(非root,非sudo)によるインストールを行う場合は、開発を目的とした場合にのみ使用してください。

+ +
重要: このインストール方法は、開発目的にのみ使用されます。
+ +

Couchbase Serverを、非root、非sudoによりインストールしたい場合があります。 + 非root、非sudoによるインストールを実施する場合でも、Couchbase Serverを実行させることができ、また Couchbaseコマンドラインツールをすべて使用することができます。

+ + +
    +
  1. Couchbase RPMをダウンロードした後、ダウンロード先のディレクトリに直接移動し、これを展開します。:
    
    +rpm2cpio couchbase-server-community_x86_64_2.0.0-1767-rel.rpm | cpio --extract --make-directories \
    +--no-absolute-filenames
    +
    + + 展開したディレクトから、 opt ディレクトリと、 etc ディレクトリを利用します。 +
  2. + +
  3. openssl098eを別途導入する必要がある場合は、中身(のファイル)を + opt/couchbase/lib ディレクトリに直接移動させます。: +
      +
    1. openssl098e–0.9.8e–17.el6.centos.2.x86_64.rpmをダウンロードします。
    2. + +
    3. Couchbase Serverを展開したディレクトリに移動します。: cd opt/couchbase.
    4. + +
    5. openssl098e RPMを展開します。: +
      rpm2cpio
      +openssl098e-0.9.8e-17.el6.centos.2.x86_64.rpm | cpio --extract
      +--make-directories --no-absolute-filenames
      +
    6. + +
    7. 展開されたファイルを/libディレクトリに移動します。: + mv usr/lib64/* lib/
    8. + +
    +
  4. + +
  5. Couchbase Server インストレーションファイルを展開後、サブディレクトリに移動します。 cd opt/couchbase
  6. + +
  7. 以下のパスワードの影響を受けるスクリプトを実行します。: ./bin/install/reloc.sh \`pwd` + これで、インストールを、非root、非sudoで実行することを可能にします。
  8. + +
  9. サーバを実行するには、 + ./bin/couchbase-server \-- -noinput -detachedを使用してください。
  10. + +
  11. サーバを停止するには、 ./bin/couchbase-server -kを実行してください。
  12. + +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/rhel-prerequisites.html b/preview/contents/Install/rhel-prerequisites.html new file mode 100644 index 0000000..45f0c74 --- /dev/null +++ b/preview/contents/Install/rhel-prerequisites.html @@ -0,0 +1,63 @@ +インストール要件
+

インストール要件

+ +

インストールする前に、サポート対象のプラットフォームをあらかじめ確認してください。

+ +

Red Hatへのインストールには、RPMパッケージを使用します。

+ + +

OpenSSL依存関係のチェック

+

Red Hat Enterprise Linux version 6.0に(インストールする場合)には、pkg-configオプションを指定して、Couchbase Server RPMパッケージのOpenSSL依存性チェックを行ってください。利用可能なファイルを確認し、必要に応じてインストールを行ってください。:

+ +

+root-> sudo yum install -y pkgconfig 
+ +

インストールが成功すると、以下のような出力結果が表示されます。:

+ +
Loaded plugins .... Installed: pkgconfig.x86_64 1:0.21-2.el5 Complete!
+      
+ +
+ + +

OpenSSL 098eのインストール

+ +

Red Hat Enterprise Linux version 6.0以降では、対応するOpenSSL互換パッケージをインストールしてください:

+ +

+root-> yum install openssl098e
+ +

管理者権限が無いとopenssl098eをインストールできない場合があります。このような場合は、 + lib64ディレクトリの内容をopt/couchbase/libディレクトリに直接移してください。:

+ + +
    +
  1. openssl098e–0.9.8e–17.el6.centos.2.x86_64.rpmをダウンロードします。
  2. + +
  3. Couchbase Serverを展開したディレクトリに移動します。: cd + opt/couchbase
  4. + +
  5. openssl098e RPMを展開します: +
    rpm2cpio
    +openssl098e-0.9.8e-17.el6.centos.2.x86_64.rpm | cpio --extract
    +--make-directories --no-absolute-filenames
    + +
  6. + +
  7. 展開されたファイルをCouchbase Serverの/lib ディレクトリに移動します。: + mv usr/lib64/* lib/
  8. + +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/rhel-uninstall.html b/preview/contents/Install/rhel-uninstall.html new file mode 100644 index 0000000..2628cf5 --- /dev/null +++ b/preview/contents/Install/rhel-uninstall.html @@ -0,0 +1,40 @@ +Red Hatからのアンインストール
+

Red Hatからのアンインストール

+ + +

RPMを使用したパッケージのアンインストールについての詳細については Red Hat RPMドキュメントを参照してください。

+ + +
Couchbase Serverを削除する前に: +
    +
  • Couchbase Serverをシャットダウンします。
  • + +
  • もしマシンがCouchbaseクラスタの一部である場合は、これをクラスタから外しリバランスを実行します。
  • + +
  • Couchbase Serverクラスタ内のノードに正しく接続できるようクライアントを更新します。
  • + +
+
+ +

以下のコマンドを実行してください:

+ + +
 > sudo rpm -e couchbase-server
+ + +

(Couchbase Serverに)関連付けられたデータファイルを削除する必要があるかもしれません。 + デフォルトのインストール場所は /opt です。 + デフォルト以外の場所にデータファイルを格納していた場合は、これらのデータディレクトリを個別にシステムから削除する必要があります。

+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/setup-overview.html b/preview/contents/Install/setup-overview.html new file mode 100644 index 0000000..0f19569 --- /dev/null +++ b/preview/contents/Install/setup-overview.html @@ -0,0 +1,135 @@ +Couchbaseセットアップの概要
+

Couchbaseセットアップの概要

+ + +

セットアップ手順の概要です。

+ +
    +
  1. + お使いのマシンがシステム要件に合致しているか確認してください。 +
  2. + +
  3. + Couchbase Serverのインストール。 +

    + Couchbase Serverをインストールするには、お使いのプラットフォーム用の適切なパッケージをダウンロードし、 + プラットフォームごとの手順に従ってください。 +

    +
      +
    • + アップグレードではなく、以前のCouchbase Serverインストールを上書きし、新規にインストールするには、 + Couchbase Serverとすべての関連するデータをインストール前にマシンから削除してください。 +
    • + +
    • + 以前のCouchbase Serverインストールで利用していたデータセットを保持するには、 + アップグレードの手順を実行してください。 +
    • + +
    +
  4. + +
  5. + インストール後に、ネイティブなmemcachedプロトコルで接続し、いくつかのデータを保存してテストしてください。 +
  6. + +
  7. + Webベースのセットアップ手順を行い、新規のCouchbase Serverシステムをセットアップしてください。 +
  8. + +
+ +
警告: + クラスタ内のすべてのマシンで、同一のオペレーティングシステムを利用してください。 + XDCR(クロスデータセンタレプリケーション)を利用する場合、ソースクラスタと同様のオペレーティングシステムをターゲットクラスタでも利用してください。 + 異なるオペレーティングシステムを混在させたXDCR環境は、プラットフォーム間のシャード数不一致により互換性がない場合があるため、サポートされません。 +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. デプロイ例
シナリオ構成互換性
スタンドアロンクラスタ4ノード全てLinux、もしくは4ノード全てWindowsのクラスタAあり
スタンドアロンクラスタ2ノードがLinuxで、2ノードがWindowsのクラスタAなし
独立した個別のクラスタクラスタA = Linux、クラスタB = Windowsあり
レプリケーションを行うクラスタクラスタA = Linuxから、クラスタB = LinuxへXDCRあり
レプリケーションを行うクラスタクラスタA = Windowsから、クラスタB = LinuxへXDCRなし
+
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Install/supported_upgrade-paths.html b/preview/contents/Install/supported_upgrade-paths.html new file mode 100644 index 0000000..e9d5a37 --- /dev/null +++ b/preview/contents/Install/supported_upgrade-paths.html @@ -0,0 +1,191 @@ +Supported upgrade paths
+

Supported upgrade paths

+ +

The supplied supported paths apply both to online and offline upgrades.

+ +

There are two basic upgrade paths for the Couchbase Server:

+ +
    +
  • Couchbase 2.x to a later version of Couchbase 2.x.
  • + +
  • Couchbase 2.x to Couchbase 3.0.
  • + +
+ +

You must upgrade to the latest available production version before upgrading to Couchbase + Server 3.0.x.

+ +

For Enterprise Edition customers, that version is Couchbase Server 2.5.1. For Community + Edition users, that version is Couchbase Server 2.2.0.

+ +

Prior to upgrade, back up the files.

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PlatformLocation
Linux/opt/couchbase/var/lib/couchbase/config/config.dat
WindowsC:\Program Files\Couchbase\Server\Config\var\lib\couchbase\config\config.dat
+
+ + + +

Upgrading from Community Edition to Enterprise Edition

+
Note: Use the same + Couchbase Server version number when upgrading to the Enterprise Edition. Version + differences can result in a failed upgrade.
+ + +
+ + +

Upgrading to 3.0.x

+ + +

With encryption access, the following port is reserved for client access to data nodes using + SSL.

+ +
+ + + + + + + + + + + + + + + + + + + + + + +
PortDescription
11207Internal/External Bucket Port for SSL
+
+ + + +

Upgrading to 2.5.x

+ +

Before upgrading to 2.5.x:

+ + +

If buckets are using any of + the following reserved ports, change the port for the bucket. Otherwise, XDCR data + encryption won't be available. (This applies both to offline and online upgrades.) +

+ +
Important: Verify that the Secure Socket Layer (SSL) reserved ports are + available prior to using XDCR data encryption.
+ + +

With XDCR data encryption, the + following ports are reserved:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PortDescription
11214Incoming SSL proxy
11215Internal outgoing SSL proxy
18091Internal REST HTTPS for SSL
18092Internal CAPI HTTPS for SSL
+
+ + +
Note: If Couchbase Server 2.5 has more than two (2) replicas, the first swap rebalance takes additional time. + This behavior is expected.
+ + +
Restriction: The RPM package manager does not support the + --relocate option because it cannot correctly detect which release must be kept and which must be replaced. + As result, all binary files and their wrapper scripts cannot be correctly installed into the relocated bin directory + during upgrade. +
+ +
+ +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Install/testing-cbworkloadgen.html b/preview/contents/Install/testing-cbworkloadgen.html new file mode 100644 index 0000000..53180f3 --- /dev/null +++ b/preview/contents/Install/testing-cbworkloadgen.html @@ -0,0 +1,40 @@ +cbworkloadgenを使用したテスト
+

cbworkloadgenを使用したテスト

+ + +

+ cbworkloadgenコマンドはCouchbase Serverクラスタの可用性や接続性を確認するための基本的なツールです。 +

+ + +

+ cbworkloadgenコマンドは、Couchbase Serverの機能性の基本的なテストを実施するための、様々なオペレーションを実行します。 + パフォーマンスやワークロードのテストは含まれていません。 +

+ + +

+ cbworkloadgenを使用してCouchbase Serverのインストールのテストをするには、稼働中のノードのIPアドレスを渡してコマンドを実行します: +

+ +
>> cbworkloadgen -n localhost:8091
+Thread 0 - average set time : 0.0257480939229 seconds , min : 0.00325512886047 seconds , max : 0.0705931186676 seconds , operation timeouts 0
+ +

+ ツールの進行状況や稼動状態はCouchbase Webコンソール内でも監視することが出来ます。 +

+ +

より長いテストを行うためにイテレーションの回数を増やすことが出来ます:

+ +
> cbworkloadgen -n localhost:8091 --max-items=100000
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/testing-telnet.html b/preview/contents/Install/testing-telnet.html new file mode 100644 index 0000000..2b17810 --- /dev/null +++ b/preview/contents/Install/testing-telnet.html @@ -0,0 +1,73 @@ +Testing with telnet
+

Testing with telnet

+ + +

The simplest method to determine whether Couchbase Server is running is to use + Telnet to connect to the server with the memcached text + protocol.

+ + + +

Telnet must be installed on your server to connect to Couchbase Server + using this method. It is supplied as standard on most platforms, or can be obtained as a + separate package and installed via your operating system's standard package manager.

+ + +
Note: You do not need to use the Telnet method for communicating + with your server within your application. Instead, use one of the Couchbase SDKs.
+ + +

Connect to the server (connecting to the legacy memcached protocol using Moxi):

+ +
> telnet localhost1 11211
+Trying 127.0.0.1...
+Connected to localhost.localdomain (127.0.0.1).
+Escape character is '^]'.
+ +

Make sure it is responding (stats is a great way to check basic health):

+ +
stats
+STAT delete_misses 0
+STAT ep_io_num_write 0
+STAT rejected_conns 0
+...
+STAT time 1286678223
+...
+STAT curr_items_tot 0
+...
+STAT threads 4
+STAT pid 23871
+...
+END
+ +

Put a key in:

+ +
set test_key 0 0 1
+a
+STORED
+ +

Retrieve the key:

+ +
get test_key
+VALUE test_key 0 1
+a
+END
+ +

Disconnect:

+ +
quit
+Connection closed by foreign host.
+>
+ +

All of the memcached protocols commands will work through Telnet.

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/testing.html b/preview/contents/Install/testing.html new file mode 100644 index 0000000..87e8bf2 --- /dev/null +++ b/preview/contents/Install/testing.html @@ -0,0 +1,44 @@ +Testing Couchbase Server
+

Testing Couchbase Server

+ +

Testing the connection to the Couchbase Server can be performed in a number of different + ways.

+ +

Connecting to the node using a web client to connect to Couchbase Web Console + provides basic confirmation that your node is available. Using the + couchbase-cli command to query your Couchbase Server node will confirm that + the node is available.

+ + +
Note: Couchbase Web Console uses the same port number as clients use when communicated + with Couchbase Server. If you can connect to the Couchbase Web Console, administration and + database clients can connect to the core cluster port and perform operations. + Couchbase Web Console will also warn if the console loses connectivity to the node.
+ +

To verify that your installation works for clients, you can use either the + cbworkloadgen command, or telnet.

+ +

The + cbworkloadgen command uses the Python Client SDK to communicate with the + cluster, checking both the cluster administration port and data update ports.

+ +

Using telnet only checks the memcached compatibility ports and the memcached + text-only protocol.

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/ubuntu-non-root-sudo.html b/preview/contents/Install/ubuntu-non-root-sudo.html new file mode 100644 index 0000000..c9435c6 --- /dev/null +++ b/preview/contents/Install/ubuntu-non-root-sudo.html @@ -0,0 +1,56 @@ +非ルート、非sudoでのインストール
+

非ルート、非sudoでのインストール

+ + +

root権限のないもしくはsudoが使えないユーザを使ったUbuntuでのインストールは開発目的でのみ利用できます。

+ +

+ 非ルート、非sudoでのインストールを実行した場合でも、Couchbase ServerとすべてのCouchbaseコマンドラインツールを実行できます。 +

+ +
    +
  1. + Couchbase DEBパッケージをダウンロード後、パッケージのあるディレクトリに移動し、展開してください: +
    +
     > dpkg-deb -x couchbase-server-community_x86_64_2.0.0-1767-rel.deb $HOME
    + +
    + +

    + ファイルを展開したディレクトリ内で、/opt/etcサブディレクトリを見つけてください。 +

    + +
  2. + +
  3. Couchbase Serverインストールファイルを展開したあと、サブディレクトリに移動してください: +
      cd opt/couchbase
    +
  4. + +
  5. このパスワード関連スクリプトを実行します: +
    +
    ./bin/install/reloc.sh `pwd`
    + +
    + +

    これでroot権限のないもしくはsudoが使えないユーザでのインストールを続ける事ができます。

    + +
  6. + +
  7. サーバを起動するには
    ./bin/couchbase-server -- -noinput -detached
    + を使用します
  8. + +
  9. サーバを停止するには
    ./bin/couchbase-server -k
    + を使用します
  10. + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/ubuntu-uninstall.html b/preview/contents/Install/ubuntu-uninstall.html new file mode 100644 index 0000000..678da0d --- /dev/null +++ b/preview/contents/Install/ubuntu-uninstall.html @@ -0,0 +1,43 @@ +Ubuntu Linux からのアンインストール
+

Ubuntu Linux からのアンインストール

+ + +

dpkg コマンドを使用してUbuntuもしくはDebianからのCouchbase Serverのアンインストールを実行します。

+ + + +
Couchbase Serverを削除する前に: +
    +
  • Couchbase Serverをシャットダウンします。
  • + +
  • もしマシンがアクティブなクラスタの一部である場合は、設定からノードを除外するためにクラスタのリバランスを実行します。
  • + +
  • Couchbase Serverクラスタ内のノードに正しく接続できるようクライアントを更新します。
  • + +
+
+ + +

Couchbase ServerをUbuntu Linuxからアンインストールするには以下の手順を実行します:

+ + +
> sudo dpkg -r couchbase-server
+ + +

dpkgを使用したパッケージのアンインストールに関しての詳細は Ubuntu ドキュメントを参照してください。

+ +

インストールに関連したデータファイルを自分で削除する必要がある場合があります。デフォルトのインストール場所は /opt です。

+ +

もしデータファイルを別の場所に設置した場合は、システムの各ディレクトリからそれぞれ削除します。

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/uninstall-windows.html b/preview/contents/Install/uninstall-windows.html new file mode 100644 index 0000000..f8a2986 --- /dev/null +++ b/preview/contents/Install/uninstall-windows.html @@ -0,0 +1,30 @@ +Uninstalling on Windows
+

Uninstalling on Windows

+ + +

WindowsシステムからCouchbase Serverをアンインストールするには、管理者権限かパワーユーザー権限を持っていなければいけません。

+ +
Couchbase Serverのアンインストール: +
    +
  1. スタート > 設定 > コントロールパネルと選択していきます。
  2. + +
  3. プログラムの追加と削除を選択します。
  4. + +
  5. Couchbase Server ソフトウェアを削除します。
  6. + +
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/upgrade-individual-nodes.html b/preview/contents/Install/upgrade-individual-nodes.html new file mode 100644 index 0000000..75a4973 --- /dev/null +++ b/preview/contents/Install/upgrade-individual-nodes.html @@ -0,0 +1,51 @@ +Upgrading one node
+

Upgrading one node

+ + +

To upgrade a single Couchbase Server node, first back it up and then install the + software.

+ +

Steps for upgrading a Couchbase Server node explained in this section are identical for an + online upgrade (for a node that has been removed from the cluster) or an offline upgrade (for + a node that has not yet been added to the cluster).

+ + + +
    +
  1. Download Couchbase Server software.
  2. + +
  3. Back up data for that server. To back up an existing Couchbase Server installation, use + cbbackup.
  4. + +
  5. Back up the server-specific configuration files. While the upgrade scripts perform a + backup of the configuration and data files, make your own + backup of these files as the best practices rule.
  6. + +
  7. Stop Couchbase Server instance.
  8. + +
  9. Check your host name configuration. If you have deployed Couchbase Server in a cloud + service, or if you are using hostnames rather than IP addresses, you must verify that the + hostname has been configured correctly before performing the upgrade.
  10. + +
  11. Check for required components and, if needed, install them. This ensures that Couchbase + Server can be upgraded and migrates the existing data files.
  12. + +
  13. Perform the installation upgrade for your platform.
  14. + +
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Install/upgrade-mac.html b/preview/contents/Install/upgrade-mac.html new file mode 100644 index 0000000..7201d38 --- /dev/null +++ b/preview/contents/Install/upgrade-mac.html @@ -0,0 +1,25 @@ +Mac OS Xでのアップグレード
+

Mac OS Xでのアップグレード

+ +

Mac OS Xのためのアップグレードインストーラは、現時点ではサポートされていません。

+ +

OS X上でCouchbase Serverの(新しいバージョンへの)マイグレーションを行う場合は、 + cbbackupを使用してデータファイルをバックアップし、最新バージョンのインストールを行った後に、 + cbrestoreを使用してバックアップのリストアを行ってください。

+ +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Install/upgrade-offline.html b/preview/contents/Install/upgrade-offline.html new file mode 100644 index 0000000..0b136de --- /dev/null +++ b/preview/contents/Install/upgrade-offline.html @@ -0,0 +1,94 @@ +Offline upgrade
+

Offline upgrade

+ + + +

During an offline upgrade, the cluster must be shut down and all applications built on it will not be + available during that time.

+ + + + + +
Note: If you are upgrading from Couchbase + Server 1.8 to Couchbase Server 2.0 or later, there are more steps for the upgrade because + you must first upgrade to Couchbase 1.8.1 for data compatibility.
+ + +
Tip: Check that the disk write queue is completely drained to make sure that + all data has been persisted to disk and will be available after the upgrade. It is + recommended that you turn off your application and allow the queue to drain before upgrading. + Back up all data before upgrading.
+ + +

To perform an offline upgrade:

+ +
    +
  1. Under Settings > Auto-Failover, disable auto-failover for all nodes in the cluster. If you leave + this option enabled, the first node that you shut down will be auto-failed over.
  2. + +
  3. Shut down your application so that no more requests are forwarded to Couchbase Cluster. +

    You can monitor the activity of your cluster by using the Couchbase Web Console. The + cluster needs to finish writing all information to disk. This will make sure that when you + restart your cluster, all of your data can be brought back into the caching layer from + disk. You can do this by monitoring the Disk Write Queue for every bucket in your + cluster. When the queue reaches zero, no more data remains to be + written to disk.

    +
  4. + +
  5. Open the Couchbase Web Console at a node in your cluster.
  6. + +
  7. Click Data Buckets |your_bucket. + In the Summary section, check that + Disk write queue reads 0. If you have more than one data bucket in + your cluster, repeat this step to verify that each bucket has a disk write queue of 0. +
    +
  8. + +
  9. Create a backup of your cluster data using cbbackup.
  10. + +
  11. Shut down Couchbase Server on each machine in your cluster.
  12. + +
  13. After you shut down the nodes, perform a standard node upgrade to the new version of + Couchbase Server as explained in Upgrading one node. +

    Couchbase Server starts automatically on each node after you perform the node + upgrade.

    +
  14. + +
  15. As the cluster warms up, you can monitor the status of the warmup process to + determine when you can switch on your application.
  16. + +
+ +

After the cluster finishes warmup, you can restart your application on the upgraded + cluster.

+ + + +

Offline upgrade to Enterprise Edition

Shut down the + entire cluster and uninstall Couchbase Server Community Edition from each machine. Then + install Couchbase Server Enterprise Edition on these machines. The data files will be retained, and the + cluster can be restarted.

+
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Install/upgrade-online.html b/preview/contents/Install/upgrade-online.html new file mode 100644 index 0000000..057ebe1 --- /dev/null +++ b/preview/contents/Install/upgrade-online.html @@ -0,0 +1,78 @@ +Online upgrade with swap rebalance
+

Online upgrade with swap rebalance

+ + + +

Online upgrade with swap rebalance is the preferred upgrade method because cluster capacity is always maintained + throughout the upgrade.

+ +

You can perform a swap rebalance to upgrade your nodes to Couchbase Server without reducing + the performance of your cluster. If you are unable to perform an upgrade via swap rebalance, + perform a standard online upgrade as explained in Upgrading.

+ +

You will need at least one extra node to perform a swap rebalance:

+ +
    +
  1. Install Couchbase Server on one extra machine that is not yet in the cluster. For instructions see Upgrading one node.
  2. + +
  3. Create a backup of your cluster data using cbbackup. See cbbackup tool.
  4. + +
  5. Open the Couchbase web console at an existing node in the cluster.
  6. + +
  7. Go to Manage > Server Nodes.
    In the Server panel you can view and managing servers in the cluster: +
    + + +
    +
  8. + +
  9. Click Add Server.
  10. + +
  11. In the Add Server dialog, provide either a host name or IP address for the new node (At this point, you can provide a hostname for the node you add). + Enter your username and password. +
    +
  12. + +
  13. Remove one of your existing old nodes from the cluster. +

    Under Server Nodes > Server panel, click Remove Server for the node you want to remove. This will flag this server for removal.

    +
  14. + + +
  15. In the Server panel, click Rebalance. +

    This automatically takes all data from the node flagged for removal and moves it to your new node.

    +
  16. + + + +
+ +

Repeat these steps for all the remaining old nodes in the cluster. You can add and remove multiple nodes from a cluster. + However, always add the same number of nodes from the cluster as you remove. + For example, if you add one node, remove one node and if you add two nodes, you can remove two.

+ +

Until all nodes in a cluster are upgraded from 1.8.1 or earlier, features in the new Couchbase Server release are disabled. + This means views or XDCR do not function until all nodes in your cluster are migrated. + After all nodes are upgraded, the features are enabled.

+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Install/upgrade-rhel.html b/preview/contents/Install/upgrade-rhel.html new file mode 100644 index 0000000..07c5ac1 --- /dev/null +++ b/preview/contents/Install/upgrade-rhel.html @@ -0,0 +1,22 @@ +Red Hatでのアップグレード
+

Red Hatでのアップグレード

+ +

Red HatやCentoOSでは、RPMパッケージを使用してアップグレードを実施するこができます。

+ +

以下のコマンドを使用すると、データと既存の設定をそのまま保持したまま(アップグレードを)行います。

+ + +
rpm -U couchbase-server-architecture___meta_current_version__.rpm
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/upgrade-ubuntu.html b/preview/contents/Install/upgrade-ubuntu.html new file mode 100644 index 0000000..c15e5cc --- /dev/null +++ b/preview/contents/Install/upgrade-ubuntu.html @@ -0,0 +1,24 @@ +Ubuntu Linuxでのアップグレード
+

Ubuntu Linuxでのアップグレード

+ + +

Ubuntu(Debian) Linuxのアップグレードはアップデートした.pkgパッケージをインストールすることで実行します。

+ +

コマンドを実行する:

+ + +

+	  > sudo dpkg -i couchbase-server-architecture___meta_current_release.deb
+    
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/upgrade-windows.html b/preview/contents/Install/upgrade-windows.html new file mode 100644 index 0000000..6db0f10 --- /dev/null +++ b/preview/contents/Install/upgrade-windows.html @@ -0,0 +1,26 @@ +Windowsでのアップグレード
+

Windowsでのアップグレード

+ + +

インストールウィザードはサーバをインストールした場所と同じ場所を利用してアップグレードします。

+ + +

+ もしデフォルトの C:\Program Files\Couchbase\Server にCouchbase Serverをインストールした場合、インストーラは同じ場所に最新バージョンを配置します。 +

+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Install/upgrading.html b/preview/contents/Install/upgrading.html new file mode 100644 index 0000000..e09cba6 --- /dev/null +++ b/preview/contents/Install/upgrading.html @@ -0,0 +1,177 @@ +Upgrading
+

Upgrading

+ +

The Couchbase Server can be upgraded online (using swap rebalance or the standard online + upgrade), offline, or using XDCR.

+ + +
Remember: Before performing an upgrade, whether it is online or offline, back up your data.
+
+ + +

Install the latest version of the Couchbase Server. The installer will automatically detect + the files from the earlier installation and convert them to the correct format, if needed.

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FeatureOnline upgradesOffline upgrades
Applications remain availableYesNo
Cluster stays in operationYesNo
Cluster must be shut downNoYes
Time requiredRequires rebalance, upgrade, rebalance per nodeAll nodes in cluster upgraded at once
+
+ + +
CAUTION:
Replication of certain per-node keys is broken after a node is first + upgraded offline from 2.x to 3.0 and then added back to the formerly 2.x cluster that is now + upgraded to 3.0. When performing an online upgrade from the Couchbase Server 2.x to 3.x, + always fully delete the 2.x package (including the config files) before installing the 3.x + package.
+ +

Online upgrades

+ +

When you perform an online upgrade, there is no need to take + the cluster down and application keeps running during the upgrade process.

+ + +
You can upgrade the Couchbase Server using a standard online upgrade, or an online upgrade + with swap rebalance.
Note: Swap rebalance is recommended because it always maintains cluster + capacity. Use the standard online upgrade only if upgrade with swap rebalance is not + possible.
+
+ + +
+ +
Online upgrade with swap rebalance
+ +
For swap rebalance, first add a node to the cluster and then perform a swap rebalance to + shift data from an old node to the new one. This is a preferred upgrade method when there + is not enough cluster capacity to handle data when an old node is removed. It is also much + faster from the standard online upgrade because you only need to rebalance each upgraded + node once.

To perform an online upgrade with swap rebalance, see Online upgrade with swap rebalance.

+
+ + +
+ +
+ +
Standard online upgrade
+ +
For standard online upgrade, take down one or two nodes from a + cluster and rebalance so that remaining nodes handle incoming requests. You can use this upgrade option + only if you have enough remaining cluster capacity to handle the nodes you remove and + upgrade. You need to perform rebalance twice for every node you upgrade: first + to move data to remaining nodes, and then to move data to the new nodes.

Standard online upgrades can take a while because each node must be taken out of the + cluster, upgraded to a current version, brought back into the cluster, and then rebalanced.

+
+ + +
+ + +

Offline upgrades

+ +

Offline upgrades can take less time than online upgrades + because all nodes in the cluster can be upgraded at once.

+ +

An offline upgrade must be well-planned and scheduled. First, shut down your application so + that no more incoming data arrives. Second, verify that the disk write queue is 0 and then + shut down each node. This way you know that the Couchbase Server has stored all items onto + disk during shutdown. After shutting down applications and nodes, perform the upgrade on + each machine and then bring the cluster and applications back again.

+ +

To perform an offline upgrade, see Offline upgrade.

+ + +
+ + +

Upgrading with XDCR

This upgrade has to be taken cautiously and only in + specific situations. Be sure that you are familiar with all requirements before deciding to + use this process.
+ + + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Install/user-defined-ports.html b/preview/contents/Install/user-defined-ports.html new file mode 100644 index 0000000..a0f877b --- /dev/null +++ b/preview/contents/Install/user-defined-ports.html @@ -0,0 +1,103 @@ +ユーザによる使用ポートの設定方法
+

ユーザによる使用ポートの設定方法

+ + +

Couchbase Serverをデフォルト設定のポートから、ユーザ定義のポートに(設定変更して)インストール&実行させることができます。

+ +

ユーザ定義のポートでCouchbase serverを実行させるため、Couchbaseインスタンスのための、利用可能な最小RAMとCPUを確認してください。

+ +
注: ユーザ定義のポートを生成する前に、ネットワークポートリストを参照してください。
+ + +

ユーザ定義のポートによるCouchbase Serverのセットアップ

+
    +
  1. Couchbase Serverをインストールする +
      +
    • Couchbase Serverが既にインストールされ、実行している場合は、停止させてください。
    • + +
    +
  2. + +
  3. 新しいユーザ定義ポートを /opt/couchbase/etc/couchbase/static_config + ファイルに追加します。
      +
    • /opt/couchbase/etc/couchbase/static_config は、 + Couchbase Serverが設定パラメータを取得する場所です。
    • + +
    • ポート番号が指定されていない場合は、デフォルトポートが使用されます。
    • + +
    • デフォルトポート定義の一部もしくは全てを上書きするために、ユーザ定義ポートをこのファイルに追加します。
    • + +
    +
  4. + +
  5. (オプション) CAPI ポート (デフォルトは 8092) を、8092番ポートから新しいポートにリプレースする場合は、 + /opt/couchbase/etc/couchdb/default.d/capi.ini ファイルを編集します。
  6. + +
  7. Couchbase Serverが既に設定変更されていた場合、 + opt/couchbase/var/lib/couchbase/config/config.dat ファイルを削除し、古い設定を削除します。
  8. + +
  9. Couchbase Serverをスタートします。
  10. + +
+ +
+ + +

変更可能なポート

+ +

以下のポートは、追加・変更可能なユーザ定義ポートです。 + /opt/couchbase/etc/couchbase/static_config ファイルに追加します。

+ +

+{rest_port, 9000}.                                   
+{mccouch_port, 8999}.                         
+{memcached_port, 12000}.
+{memcached_dedicated_port, 11999}.
+{moxi_port, 12001}.
+{short_name, "ns_1"}.
+{ssl_rest_port,11000}.                       
+{ssl_capi_port,11001}.
+{ssl_proxy_downstream_port,11002}.
+{ssl_proxy_upstream_port,11003}.
+
+ + +
注: 新たに設定したポートが、他のアプリケーションにより既に使用しているポートと重複した場合は、 + Couchbase Serverはスタートに失敗します。また、新たに設定したポートが、 + Couchbaseバケットで既に使用しているポートと重複した場合は、Erlangのクラッシュ通知が、ログファイルで確認できます。
+ +
注: 一台のマシンに複数ノードをセットアップするためには、これらのポートを各ノード毎にユニークなポート番号として割り当てる必要があります。
+ +
+ +

ユーザ定義ポートとデフォルトポートの対応

ここでは、 + あるユーザ定義ポート(例)とデフォルトポートの対応チャートを示します。:

+{rest_port, 9000}                    8091 Web管理ポート                                   
+{mccouch_port, 8999}                 11213 mccouchのデフォルトポート                         
+{memcached_port, 12000}              11211 クライアントインタフェース(proxy)
+{memcached_dedicated_port, 11999}    11211 クライアントインタフェース(proxy)
+{moxi_port, 12001}                   11210 内部/外部バケットポート
+{ssl_rest_port,11000}                18091 SSL用 内部REST HTTPSポート                                      
+{ssl_capi_port,11001}                18092 SSL用 内部CAPI HTTPSポート
+{ssl_proxy_downstream_port,11002}    11214 SSL proxyポート(ダウンストリーム)
+{ssl_proxy_upstream_port,11003}      11215 SSL proxyポート(アップストリーム)
+
+ +
重要:
+ 全てのデフォルトポートは、予約されているため、他の目的に使用することはできません。
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Install/windows-install-unattended.html b/preview/contents/Install/windows-install-unattended.html new file mode 100644 index 0000000..f2a72d0 --- /dev/null +++ b/preview/contents/Install/windows-install-unattended.html @@ -0,0 +1,54 @@ +Windowsの無人インストール
+

Windowsの無人インストール

+ + +

無人インストールは、Couchbase Serverをインストールするためのスクリプトを使用します。

+ + +

無人インストールプロセスを使用するには:

+ +
    +
  1. + ウィザードのインストールで、インストールの設定を記録します。これらの設定はファイルに保存され、同じバージョンの他のノードを無人インストールするために使用できます。 +
      +
    1. + コマンドターミナル、またはPowerShellを開き、/rコマンドラインオプションを使用して、インストール実行ファイルを起動します: +
      > couchbase_server_version.exe /r /f1your_file_name.iss
      + +
    2. + +
    3. + プロンプトが表示されるので、インストールオプションを指定します。ウィザードでサーバのインストールを完了すると、記録オプションで指定したC:\Windows\your_file_name.issファイルが作成されます。 +
      注: MaxUserPortで増加させてください。(推奨)
      + +
    4. + +
    + +
  2. + +
  3. + your_file_name.issをインストール実行ファイルと同じディレクトリにコピーしてください。 + コマンドラインから/sを使用してインストーラを実行します: +
    > couchbase_server_version.exe /s -f1your_file_name.iss
    + +
  4. + +
  5. + 各マシンにインストールパッケージとyour_file_name.issファイルをコピーします。このプロセスを複数のマシンで繰り返します。 +
  6. + +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/windows-install-wizard.html b/preview/contents/Install/windows-install-wizard.html new file mode 100644 index 0000000..716e3de --- /dev/null +++ b/preview/contents/Install/windows-install-wizard.html @@ -0,0 +1,82 @@ +ウィザードを使用したWindowsへのインストール
+

ウィザードを使用したWindowsへのインストール

+ + +

このインストールでは、ウィザードで定義されている手順を実行する必要があります。

+ +
+ +
    +
  1. + ダウンロードした実行ファイルをダブルクリックします。 +

    + Couchbase Serverに含まれる再頒布可能パッケージをインストールする必要がある場合、Windows用のインストーラが検出します。 + もしこれらのパッケージがシステム上にまだ存在していない場合、Couchbase Serverと一緒に自動的にインストールされます。 +

    + +
  2. + +
  3. + Installation Location画面が表示されます。 + Couchbase Serverアプリケーションを配置するときにサーバ構成を変更することが出来ます。これはサーバの永続データの格納場所ではありません。 +

    + インストーラはシステムに必要なファイルをコピーします。 + インストール処理中に、デフォルトの管理用ポートが他のアプリケーションにすでに使用していないことの確認も行います。 + デフォルトのポートが使用できない場合、インストーラはCouchbase Serverの管理するためのポートを別に表示します。 + インストーラはノードの利用可能な十分なポートを設定するように求めます。 + デフォルトでは、マイクロソフトのサーバーは十分な数のエフェメラルポートを提供していません。 + Microsoft Knowledge Base Article 196271を参照してください。 +

    + + +
  4. + +
  5. Yesをクリックします。 +

    + エフェメラルポートが十分な数がないと、Couchbaseのクラスタのりバランスやバックアップの最中に失敗します。 + その他クライアントのリクエストのような操作ではタイムアウトします。 + すでにこれらの設定を変更済みの場合、Noをクリックすることが出来ます。 + インストーラは更新を確認するためこのパネルを表示します: +

    + + +
  6. + +
  7. ポートの変更を適用するためにCouchbase Serverを再起動します。
  8. + +
  9. インストール後、サーバーのセットアップ手順に従ってください。
  10. + +
+ + +
重要: + WindowsインストーラがComputing Space Requirements画面で固まった場合、セットアップや他の稼働中のアプリケーションなどインストール環境に問題があります。 +
+ + +

インストールを完了するためにこの回避策を実行することが出来ます:

+ + +
    +
  1. Couchbase Serverのインストールをするときに稼働中の他のブラウザやアプリケーションを停止します。
  2. + +
  3. インストールプロセスを停止して、失敗したセットアップをアンインストールします。
  4. + +
  5. C:\Users\[logonuser]\AppData\Temp配下の一時保存先を削除するかリネームします。
  6. + +
  7. 再起動して再実行します。
  8. + +
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Install/windows-startup-shutdown.html b/preview/contents/Install/windows-startup-shutdown.html new file mode 100644 index 0000000..33d1921 --- /dev/null +++ b/preview/contents/Install/windows-startup-shutdown.html @@ -0,0 +1,80 @@ +Windows上での開始と停止
+

Windows上での開始と停止

+ + +

開始と停止用のスクリプトはCouchbase Serverを手動で開始したり停止するために使用されます。

+ +

Windows上では、Couchbase ServerはWindowsサービスとしてインストールされます。 + WindowsタスクマネージャにあるサービスタブからCouchbase Serverの開始や停止を行うことが出来ます。

+ + +

+ Couchbase Serverを起動したり停止したりするために、パワーユーザ権限か管理者権限があるか、サービスを管理する権限を個別に付与することになります。 + デフォルトでは、サービスはマシンの起動時に自動的にサービスが開始されます。 +

+ + +

+ Couchbase ServerはWindowsタスクマネージャを使うか、Windowsのnetコマンドを使うか、Couchbaseから提供された.batスクリプト使用することで起動、停止を行うことが出来ます。 +

+ + +

Windowsタスクマネージャを使用したCouchbase Serverの起動と停止

+ +
手動でWindowsインターフェイスからサービスを開始するには:
    +
  1. Open the Windowsタスクマネージャを開き、サービスタブを選択し、サービス管理コンソールを開きます。 +

    あるいは、スタートを選択し、起動を選択、Services.mscと打ってサービス管理コンソールを開きます。

    + +
  2. + +
  3. Couchbase Serverサービスを見つけて右クリックします。
  4. + +
  5. 開始もしくは停止の適切な方を選択します。
  6. + +
+
注: 設定を変更することでマシンの起動中に自動でサービスが起動しないようにすることが出来ます。
+
+ +
+ + +

Windowsの net コマンドを使用したCouchbase Serverの起動と停止

+ +

Couchbase Serverの起動と停止にはnetを使用します:

+ +
net start CouchbaseServer
+ +
net stop CouchbaseServer
+ + +
+ + + +

Couchbaseが提供する.batスクリプトを使用したCouchbase Serverの起動と停止

+ +

The Couchbaseする起動と停止のためのスクリプトは標準インストールではbinディレクトリに設置されます。

+ +

Couchbase Serverの起動と停止を行うには以下のスクリプトを見つけて使用してください:

+ + +

C:\Program Files\Couchbase\Server\bin\service_start.bat

+ +

C:\Program Files\Couchbase\Server\bin\service_stop.bat

+ + +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-beam-smp-issue.html b/preview/contents/Misc/Trbl-beam-smp-issue.html new file mode 100644 index 0000000..3341f03 --- /dev/null +++ b/preview/contents/Misc/Trbl-beam-smp-issue.html @@ -0,0 +1,20 @@ +Beam.smp
+

Beam.smp

+ + +

Beam.smp uses excessive memory on Linux

+ +

On Linux, if XDCR Max Replications per Bucket are set to a value in the higher limit (such as + 128), then beam.sm uses excessive memory. Solution: Reset to 32 or lower.

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-blockedIndexer.html b/preview/contents/Misc/Trbl-blockedIndexer.html new file mode 100644 index 0000000..ac63b92 --- /dev/null +++ b/preview/contents/Misc/Trbl-blockedIndexer.html @@ -0,0 +1,181 @@ +Blocked indexer
+

Blocked indexer

+ + +

Indexer shows no progress for long periods of time.

+ +

Each design document maps to one indexer, so when the indexer runs it updates all views + defined in the corresponding design document. Indexing takes resources (CPU, disk IO, + memory), therefore Couchbase Server limits the maximum number of indexers that can run in + parallel. There are 2 configuration parameters to specify the limit, one for regular + (main/active) indexers and other for replica indexers (more on this in a later section). + The default for the former is 4 and for the later is 2. They can be queried like this:

+ +
> curl -s 'http://Administrator:asdasd@localhost:8091/settings/maxParallelIndexers'
+{"globalValue":4,"nodes":{"n_0@192.168.1.80":4}}
+
+ +

maxParallelIndexers is for main indexes and + maxParallelReplicaIndexers is for replica indexes. When there are more + design documents (indexers) than maxParallelIndexers, some indexers are blocked until + there’s a free slot, and the rule is simple as first-come-first-served. These slots are + controlled by 2 barriers processes, one for main indexes, and the other for replica + indexes. Their current state can be seen from _active_tasks (per node), + for example when there’s no indexing happening:

+ +
> curl -s 'http://localhost:9500/_active_tasks' | json_xs
+[
+ {
+     "waiting" : 0,
+         "started_on" : 1345642656,
+         "pid" : "<0.234.0>",
+         "type" : "couch_main_index_barrier",
+         "running" : 0,
+         "limit" : 4,
+         "updated_on" : 1345642656
+         },
+ {
+     "waiting" : 0,
+         "started_on" : 1345642656,
+         "pid" : "<0.235.0>",
+         "type" : "couch_replica_index_barrier",
+         "running" : 0,
+         "limit" : 2,
+         "updated_on" : 1345642656
+         }
+ ]
+
+ +

The waiting fields tells us how many indexers are blocked, waiting for + their turn to run. Queries with stale=false have to wait for the indexer + to be started (if not already), unblocked and to finish, which can lead to a long time when + there are many design documents in the system. Also take into account that the indexer for + a particular design document might be running for one node but it might be blocked in + another node - when it’s blocked it’s not necessarily blocked in all nodes of the cluster + nor when it’s running is necessarily running in all nodes of the cluster - you verify this + by querying _active_tasks for each node (this API is not meant for direct user consumption, + just for developers and debugging/troubleshooting).

+ +

Through _active_tasks (remember, it’s per node, so check it for every node + in the cluster), you can see which indexers are running and which are blocked. Here follows + an example where we have 5 design documents (indexers) and + >maxParallelIndexers is 4:

+ +
> curl -s 'http://localhost:9500/_active_tasks' | json_xs
+[
+   {
+      "waiting" : 1,
+      "started_on" : 1345644651,
+      "pid" :  "<0.234.0>",
+      "type" :  "couch_main_index_barrier",
+      "running" : 4,
+      "limit" : 4,
+      "updated_on" : 1345644923
+   },
+   {
+      "waiting" : 0,
+      "started_on" : 1345644651,
+      "pid" :  "<0.235.0>",
+      "type" :  "couch_replica_index_barrier",
+      "running" : 0,
+      "limit" : 2,
+      "updated_on" : 1345644651
+   },
+   {
+      "indexer_type" : "main",
+      "started_on" : 1345644923,
+      "updated_on" : 1345644923,
+      "design_documents" : [
+         "_design/test"
+      ],
+      "pid" :  "<0.4706.0>",
+      "signature" : "4995c136d926bdaf94fbe183dbf5d5aa",
+      "type" :  "blocked_indexer",
+      "set" :  "default"
+   },
+   {
+      "indexer_type" : "main",
+      "started_on" : 1345644923,
+      "progress" : 0,
+      "initial_build" : true,
+      "updated_on" : 1345644923,
+      "total_changes" : 250000,
+      "design_documents" : [
+         "_design/test4"
+      ],
+      "pid" :  "<0.4715.0>",
+      "changes_done" : 0,
+      "signature" : "15e1f576bc85e3e321e28dc883c90077",
+      "type" :  "indexer",
+      "set" :  "default"
+   },
+   {
+      "indexer_type" : "main",
+      "started_on" : 1345644923,
+      "progress" : 0,
+      "initial_build" : true,
+      "updated_on" : 1345644923,
+      "total_changes" : 250000,
+      "design_documents" : [
+         "_design/test3"
+      ],
+      "pid" :  "<0.4719.0>",
+      "changes_done" : 0,
+      "signature" : "018b83ca22e53e14d723ea858ba97168",
+      "type" :  "indexer",
+      "set" :  "default"
+   },
+   {
+      "indexer_type" : "main",
+      "started_on" : 1345644923,
+      "progress" : 0,
+      "initial_build" : true,
+      "updated_on" : 1345644923,
+      "total_changes" : 250000,
+      "design_documents" : [
+         "_design/test2"
+      ],
+      "pid" :  "<0.4722.0>",
+      "changes_done" : 0,
+      "signature" : "440b0b3ded9d68abb559d58b9fda3e0a",
+      "type" :  "indexer",
+      "set" : "default"
+   },
+   {
+      "indexer_type" : "main",
+      "started_on" : 1345644923,
+      "progress" : 0,
+      "initial_build" : true,
+      "updated_on" : 1345644923,
+      "total_changes" : 250000,
+      "design_documents" : [
+         "_design/test7"
+      ],
+      "pid" :  "<0.4725.0>",
+      "changes_done" : 0,
+      "signature" : "fd2bdf6191e61af6e801e3137e2f1102",
+      "type" :  "indexer",
+      "set" :  "default"
+   }
+]
+
+ +

The indexer for design document _design/test is represented by a task with a + type field of blocked_indexer, while other indexers + have a task with type indexer, meaning they’re running. The task with type + couch_main_index_barrier confirms this by telling us there are + currently 4 indexers running and 1 waiting for its turn. When an indexer is allowed to + execute, its active task with type blocked_indexer is replaced by a new + one with type indexer.

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-common.html b/preview/contents/Misc/Trbl-common.html new file mode 100644 index 0000000..2fb2ec7 --- /dev/null +++ b/preview/contents/Misc/Trbl-common.html @@ -0,0 +1,135 @@ +Server issues
+

Server issues

+ + +

Troubleshooting Couchbase Server represents a basic action associated with critical + and informational issues.

+ +

The following table outlines some specific areas to check when experiencing different + problems:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SeverityIssueSuggested Action(s)
CriticalCouchbase Server does not start up.Check that the service is running.
  Check error logs.
  Try restarting the service.
CriticalA server is not responding.Check that the service is running.
  Check error logs.
  Try restarting the service.
CriticalA server is down.Try restarting the server.
  Use the command-line interface to check connectivity.
InformationalBucket authentication failure.Check the properties of the bucket that you are attempting to connect + to.
+
+ +

The primary source for run-time logging information is Couchbase Server Web Console. + Run-time logs are automatically set up and started during the installation process. + However, Couchbase Server gives you access to lower-level logging details if needed + for diagnostic and troubleshooting purposes.

+ +

Log files are stored in a binary format in the logs directory under the Couchbase + installation directory. You must use browse_logs to extract the log + contents from the binary format to a text file.

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-commonErrors.html b/preview/contents/Misc/Trbl-commonErrors.html new file mode 100644 index 0000000..9c1aa71 --- /dev/null +++ b/preview/contents/Misc/Trbl-commonErrors.html @@ -0,0 +1,61 @@ +Common errors
+

Common errors

+ + +

Common errors encountered include issues when starting Couchbase server for the first time.

+ +

This page will attempt to describe and resolve some common errors that are encountered when + using Couchbase. It will be a living document as new problems and resolutions are + discovered.

+ + +

Problems Starting Couchbase Server for the first time

+ +

If you are having problems starting Couchbase Server on Linux for the first time, there are + two very common causes of this that are actually quite related. When the + /etc/init.d/couchbase-server script runs, it tries to set the file + descriptor limit and core file size limit:

+ +

+> ulimit -n 10240 ulimit -c unlimited
+
+
+ +

Depending on the defaults of your system, this may or may not be allowed. If Couchbase Server + is failing to start, you can look through the logs and pick out one or both of these + messages:

+ +

+ns_log: logging ns_port_server:0:Port server memcached on node 'ns_1@127.0.0.1' exited with status 71. »
+Restarting. Messages: failed to set rlimit for open files. »
+Try running as root or requesting smaller maxconns value.
+
+ +

Alternatively, you may additionally see or optionally see:

+ +

+ns_port_server:0:info:message - Port server memcached on node 'ns_1@127.0.0.1' exited with status 71. »
+Restarting. Messages: failed to ensure corefile creation
+
+
+ +

The resolution to these is to edit the /etc/security/limits.conf file and add these + entries:

+ +

+couchbase hard nofile 10240
+couchbase hard core unlimited
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-datamissing-server.html b/preview/contents/Misc/Trbl-datamissing-server.html new file mode 100644 index 0000000..d924bad --- /dev/null +++ b/preview/contents/Misc/Trbl-datamissing-server.html @@ -0,0 +1,757 @@ +Incorrect or missing data (server issue)
+

Incorrect or missing data (server issue)

+ + +

Data missing in query response or it’s wrong (potentially due to server issues)

+ +

Sometimes, especially between releases for development builds, it’s possible results are + missing due to issues in some component of Couchbase Server. This section describes how to + do some debugging to identify which components, or at least to identify which components + are not at fault.

+ +

Before proceeding, it needs to be mentioned that each vbucket is physically represented by + a CouchDB database (generated by couchstore component) which corresponds to exactly 1 file + in the filesystem, example from a development environment using 16 vbuckets only (for + example simplicity), 4 nodes and without replicas enabled:

+ +
> tree ns_server/couch/0/
+ns_server/couch/0/
+ ???
+_replicator.couch.1
+ ???
+_users.couch.1
+ ??? default
+     ??? 0.couch.1
+     ??? 1.couch.1
+     ??? 2.couch.1
+     ??? 3.couch.1
+     ??? master.couch.1
+     ??? stats.json
+
+ 1 directory, 8 files
+
+> tree ns_server/couch/1/
+ns_server/couch/1/
+ ???
+_replicator.couch.1
+ ???
+_users.couch.1
+ ??? default
+     ??? 4.couch.1
+     ??? 5.couch.1
+     ??? 6.couch.1
+     ??? 7.couch.1
+     ??? master.couch.1
+     ??? stats.json
+     ??? stats.json.old
+
+ 1 directory, 9 files
+
+> tree ns_server/couch/2/
+ns_server/couch/2/
+ ???
+_replicator.couch.1
+ ???
+_users.couch.1
+ ??? default
+     ??? 10.couch.1
+     ??? 11.couch.1
+     ??? 8.couch.1
+     ??? 9.couch.1
+     ??? master.couch.1
+     ??? stats.json
+     ??? stats.json.old
+
+ 1 directory, 9 files
+
+> tree ns_server/couch/3/
+ns_server/couch/3/
+ ???
+_replicator.couch.1
+ ???
+_users.couch.1
+ ??? default
+     ??? 12.couch.1
+     ??? 13.couch.1
+     ??? 14.couch.1
+     ??? 15.couch.1
+     ??? master.couch.1
+     ??? stats.json
+     ??? stats.json.old
+
+ 1 directory, 9 files
+
+ +

For this particular example, because there are no replicas enabled (ran + ./cluster_connect -n 4 -r 0 ), each node only has database files for + the vbuckets it’s responsible for (active vbuckets). The numeric suffix in each database + filename, starts at 1 when the database file is created and it gets incremented, by 1, + every time the vbucket is compacted. If replication is enabled, for example you ran + ./cluster_connect -n 4 -r 1, then each node will have vbucket database + files for the vbuckets it’s responsible for (active vbuckets) and for some replica + vbuckets, example:

+ +
> tree ns_server/couch/0/
+
+ns_server/couch/0/
+ ???
+_replicator.couch.1
+ ???
+_users.couch.1
+ ??? default
+     ??? 0.couch.1
+     ??? 1.couch.1
+     ??? 12.couch.1
+     ??? 2.couch.1
+     ??? 3.couch.1
+     ??? 4.couch.1
+     ??? 5.couch.1
+     ??? 8.couch.1
+     ??? master.couch.1
+     ??? stats.json
+
+ 1 directory, 12 files
+
+> tree ns_server/couch/1/
+
+ns_server/couch/1/
+ ???
+_replicator.couch.1
+ ???
+_users.couch.1
+ ??? default
+     ??? 0.couch.1
+     ??? 1.couch.1
+     ??? 13.couch.1
+     ??? 4.couch.1
+     ??? 5.couch.1
+     ??? 6.couch.1
+     ??? 7.couch.1
+     ??? 9.couch.1
+     ??? master.couch.1
+     ??? stats.json
+
+ 1 directory, 12 files
+
+> tree ns_server/couch/2/
+
+ns_server/couch/2/
+ ???
+_replicator.couch.1
+ ???
+_users.couch.1
+ ??? default
+     ??? 10.couch.1
+     ??? 11.couch.1
+     ??? 14.couch.1
+     ??? 15.couch.1
+     ??? 2.couch.1
+     ??? 6.couch.1
+     ??? 8.couch.1
+     ??? 9.couch.1
+     ??? master.couch.1
+     ??? stats.json
+
+ 1 directory, 12 files
+
+> tree ns_server/couch/3/
+ns_server/couch/3/
+ ???
+_replicator.couch.1
+ ???
+_users.couch.1
+ ??? default
+     ??? 10.couch.1
+     ??? 11.couch.1
+     ??? 12.couch.1
+     ??? 13.couch.1
+     ??? 14.couch.1
+     ??? 15.couch.1
+     ??? 3.couch.1
+     ??? 7.couch.1
+     ??? master.couch.1
+     ??? stats.json
+
+ 1 directory, 12 files
+
+ +

You can figure out which vbucket are active in each node, by querying the following + URL:

+ +
> curl -s http://localhost:8091/pools/default/buckets |
+  json_xs
+ [
+    {
+       "quota" :
+{
+          "rawRAM" : 268435456,
+          "ram"
+: 1073741824
+       },
+       "localRandomKeyUri" : "/pools/default/buckets/default/localRandomKey",
+       "bucketCapabilitiesVer" : "",
+       "authType"
+: "sasl",
+       "uuid" :
+  "89dd5c64504f4a9414a2d3bcf9630d15",
+       "replicaNumber" : 1,
+       "vBucketServerMap" : {
+          "vBucketMap" : [
+             [
+                0,
+                1
+             ],
+             [
+                0,
+                1
+             ],
+             [
+                0,
+                2
+             ],
+             [
+                0,
+                3
+             ],
+             [
+                1,
+                0
+             ],
+             [
+                1,
+                0
+             ],
+             [
+                1,
+                2
+             ],
+             [
+                1,
+                3
+             ],
+             [
+                2,
+                0
+             ],
+             [
+                2,
+                1
+             ],
+             [
+                2,
+                3
+             ],
+             [
+                2,
+                3
+             ],
+             [
+                3,
+                0
+             ],
+             [
+                3,
+                1
+             ],
+             [
+                3,
+                2
+             ],
+             [
+                3,
+                2
+             ]
+          ],
+          "numReplicas" : 1,
+          "hashAlgorithm" : "CRC",
+          "serverList" : [
+             "192.168.1.81:12000",
+             "192.168.1.82:12002",
+             "192.168.1.83:12004",
+             "192.168.1.84:12006"
+          ]
+       },
+
+(....)
+ ]
+
+ +

The field to look at is named vBucketServerMap, and it contains two + important sub-fields, named vBucketMap and serverList, + which we use to find out which nodes are responsible for which vbuckets (active + vbuckets).

+ +

Looking at these 2 fields, we can do the following active and replica vbucket to node + mapping:

+ +
    +
  • vbuckets 0, 1, 2 and 3 are active at node 192.168.1.81:12000, and vbuckets 4, 5, 8 + and 12 are replicas at that same node

    +
  • + +
  • vbuckets 4, 5, 6 and 7 are active at node 192.168.1.82:12002, and vbuckets 0, 1, 9 + and 13 are replicas at that same node

    +
  • + +
  • vbuckets 8, 9, 10 and 11 are active at node 192.168.1.83:12004, and vbuckets 2, 6, + 14 and 15 are replicas at that same node

    +
  • + +
  • vbuckets 12, 13, 14 and 15 are active at node 192.168.1.84:12006, and vbucket 3, 7, + 11 and 10

    +
  • + +
+ +

the value of vBucketMap is an array of arrays of 2 elements. Each + sub-array corresponds to a vbucket, so the first one is related to vbucket 0, second one to + vbucket 1, etc, and the last one to vbucket 15. Each sub-array element is an index + (starting at 0) into the serverList array. First element of each sub-array + tells us which node (server) has the corresponding vbucket marked as active, while the + second element tells us which server has this vbucket marked as replica.

+ +

If the replication factor is greater than 1 (N > 1), then each sub-array will have N + 1 + elements, where first one is always index of server/node that has that vbucket active and + the remaining elements are the indexes of the servers having the first, second, third, etc + replicas of that vbucket.

+ +

After knowing which vbuckets are active in each node, we can use some tools such as + couch_dbinfo and couch_dbdump to analyze active + vbucket database files. Before looking at those tools, lets first know what database + sequence numbers are.

+ +

When a CouchDB database (remember, each corresponds to a vbucket) is created, its + update_seq (update sequence number) is 0. When a document is created, updated or deleted, + its current sequence number is incremented by 1. So all the following sequence of actions + result in the final sequence number of 5:

+ +
    +
  1. Create document doc1, create document doc2, create document doc3, create document + doc4, create document doc5

    +
  2. + +
  3. Create document doc1, update document doc1, update document doc1, update document + doc1, delete document doc1

    +
  4. + +
  5. Create document doc1, delete document doc1, create document doc2, update document + doc2, update document doc2

    +
  6. + +
  7. Create document doc1, create document doc2, create document doc3, create document + doc4, update document doc2

    +
  8. + +
  9. etc…

    +
  10. + +
+ +

You can see the current update_seq of a vbucket database file, amongst other information, + with the couch_dbinfo command line tool, example with vbucket 0, active in + the first node:

+ +
> ./install/bin/couch_dbinfo ns_server/couch/0/default/0.couch.1
+ DB Info
+  (ns_server/couch/0/default/0.couch.1)
+    file format version: 10
+    update_seq: 31250
+    doc count: 31250
+    deleted doc count: 0
+    data size: 3.76 MB
+    B-tree size: 1.66 MB
+    total disk size: 5.48 MB
+
+ +

After updating all the documents in that vbucket database, the update_seq doubled:

+ +
> ./install/bin/couch_dbinfo ns_server/couch/0/default/0.couch.1
+DB Info
+ (ns_server/couch/0/default/0.couch.1)
+   file format version: 10
+   update_seq:00
+   doc count: 31250
+   deleted doc count: 0
+   data size: 3.76 MB
+   B-tree size: 1.75 MB
+   total disk size: 10.50 MB
+
+ +

An important detail, if not obvious, is that with each vbucket database sequence number one + and only one document ID is associated to it. At any time, there’s only one update sequence + number associated with a document ID, and it’s always the most recent. We can verify this + with the couch_dbdump command line tool. Take the following example, where + we only have 2 documents, document with ID doc1 and document with ID doc2:

+ +
> ./install/bin/couch_dbdump ns_server/couch/0/default/0.couch.1
+Doc seq: 1
+     id: doc1
+     rev: 1
+     content_meta: 0
+     cas: 130763975746, expiry: 0, flags: 0
+     data: {"value": 1}
+Total docs: 1
+
+ +

On an empty vbucket 0 database, we created document with ID doc1, which + has a JSON value of {"value": 1}. This document is now associated with + update sequence number 1. Next we create another document, with ID *doc2* and JSON value + {"value": 2}, and the output of couch_dbdump is:

+ +
> ./install/bin/couch_dbdump ns_server/couch/0/default/0.couch.1
+Doc seq: 1
+     id: doc1
+     rev: 1
+     content_meta: 0
+     cas: 130763975746, expiry: 0, flags: 0
+     data: {"value": 1}
+Doc seq: 2
+     id: doc2
+     rev: 1
+     content_meta: 0
+     cas: 176314689876, expiry: 0, flags: 0
+     data: {"value": 2}
+Total docs: 2
+
+ +

Document doc2 got associated to vbucket 0 database update sequence number + 2. Next, we update document doc1 with a new JSON value of + {"value": 1111}, and couch_dbdump tells us:

+ +
> ./install/bin/couch_dbdump ns_server/couch/0/default/0.couch.1
+Doc seq: 2
+     id: doc2
+     rev: 1
+     content_meta: 0
+     cas: 176314689876, expiry: 0, flags: 0
+     data: {"value": 2}
+Doc seq: 3
+     id: doc1
+     rev: 2
+     content_meta: 0
+     cas: 201537725466, expiry: 0, flags: 0
+     data: {"value": 1111}
+
+Total docs: 2
+
+ +

So, document doc1 is now associated with update sequence number 3. Note + that it’s no longer associated with sequence number 1, because the update was the most + recent operation against that document (remember, only 3 operations are possible: create, + update or delete). The database no longer has a record for sequence number 1 as well. After + this, we update document doc2 with JSON value {"value": + 2222}, and we get the following output from couch_dbdump :

+ +
> ./install/bin/couch_dbdump ns_server/couch/0/default/0.couch.1
+Doc seq: 3
+     id: doc1
+     rev: 2
+     content_meta: 0
+     cas: 201537725466, expiry: 0, flags: 0
+     data: {"value": 1111}
+Doc seq: 4
+     id: doc2
+     rev: 2
+     content_meta: 0
+     cas: 213993873979, expiry: 0, flags:   0
+     data: {"value": 2222}
+
+Total docs: 2
+
+ +

Document doc2 is now associated with sequence number 4, and sequence + number 2 no longer has a record in the database file. Finally we deleted document + doc1, and then we get:

+ +
> ./install/bin/couch_dbdump ns_server/couch/0/default/0.couch.1
+Doc seq: 4
+     id: doc2
+     rev: 2
+     content_meta: 0
+     cas: 213993873979, expiry: 0, flags: 0
+     data: {"value": 2222}
+Doc seq: 5
+     id: doc1
+     rev: 3
+     content_meta: 3
+     cas: 201537725467, expiry: 0, flags: 0
+     doc deleted
+     could not read document body: document not found
+
+Total docs: 2
+
+ +

Note that document deletes don’t really delete documents from the database files, instead + they flag the document has deleted and remove its JSON (or binary) value. Document + doc1 is now associated with sequence number 5 and the record for its + previously associated sequence number 3, is removed from the vbucket 0 database file. + This tells to delete all key-value pairs previously emitted by a map function for the deleted + document. Without the update sequence numbers associated with the delete operation, there is + no wayu to know if these documents have been deleted. +

+ +

These details of sequence numbers and document operations are what allow indexes to be + updated incrementally in Couchbase Server (and Apache CouchDB as well).

+ +

In Couchbase Server, indexes store in their header (state) the last update_seq seen for + each vbucket database. Put it simply, whenever an index build/update finishes, it stores in + its header the last update_seq processed for each vbucket database. Vbucket databases have + states too in indexes, and these states do not necessarily match the vbucket states in the + server. For the goals of this wiki page, it only matters to mention that view requests with + stale=false will be blocked only if the currently stored update_seq of + any active vbucket in the index header is smaller than the current update_seq of the + corresponding vbucket database - if this is true for at least one active vbucket, an index + update is scheduled immediately (if not already running) and when it finishes it will + unblock the request. Requests with stale=false will not be blocked if the + update_seq of vbuckets in the index with other states (passive, cleanup, replica) are + smaller than the current update_seq of the corresponding vbucket databases - the reason for + this is that queries only see rows produced for documents that live in the active + vbuckets.

+ +

We can see that states of vbuckets in the index, and the update_seqs in the index, by + querying the following URL (example for 16 vbuckets only, for the sake of simplicity):

+ +
> curl -s 'http://localhost:9500/_set_view/default/_design/dev_test2/_info' | json_xs
+{
+   "unindexable_partitions" : {},
+   "passive_partitions" : [],
+   "compact_running" : false,
+   "cleanup_partitions" : [],
+   "replica_group_info" : {
+      "unindexable_partitions" : {},
+      "passive_partitions" : [
+         4,
+         5,
+         8,
+         12
+      ],
+      "compact_running" : false,
+      "cleanup_partitions" : [],
+      "active_partitions" : [],
+      "pending_transition" : null,
+      "db_set_message_queue_len" : 0,
+      "out_of_sync_db_set_partitions" : false,
+      "expected_partition_seqs" : {
+         "8" :00,
+         "4" :00,
+         "12" :00,
+         "5" :00
+      },
+      "updater_running" : false,
+      "partition_seqs" : {
+         "8" :00,
+         "4" :00,
+         "12" :00,
+         "5" :00
+      },
+      "stats" : {
+         "update_history" : [
+            {
+               "deleted_ids" : 0,
+               "inserted_kvs" : 38382,
+               "inserted_ids" : 12794,
+               "deleted_kvs" : 38382,
+               "cleanup_kv_count" : 0,
+               "blocked_time" : 1.5e-05,
+               "indexing_time" : 3.861918
+            }
+         ],
+         "updater_cleanups" : 0,
+         "compaction_history" : [
+            {
+               "cleanup_kv_count" : 0,
+               "duration" : 1.955801
+            },
+            {
+               "cleanup_kv_count" : 0,
+               "duration" : 2.443478
+            },
+            {
+               "cleanup_kv_count" : 0,
+               "duration" : 4.956397
+            },
+            {
+               "cleanup_kv_count" : 0,
+               "duration" : 9.522231
+            }
+         ],
+         "full_updates" : 1,
+         "waiting_clients" : 0,
+         "compactions" : 4,
+         "cleanups" : 0,
+         "partial_updates" : 0,
+         "stopped_updates" : 0,
+         "cleanup_history" : [],
+         "cleanup_interruptions" : 0
+      },
+      "initial_build" : false,
+      "update_seqs" : {
+         "8" :00,
+         "4" :00,
+         "12" :00,
+         "5" :00
+      },
+      "partition_seqs_up_to_date" : true,
+      "updater_state" : "not_running",
+      "data_size" : 5740951,
+      "cleanup_running" : false,
+      "signature" : "440b0b3ded9d68abb559d58b9fda3e0a",
+      "max_number_partitions" : 16,
+      "disk_size" : 5742779
+   },
+   "active_partitions" : [
+      0,
+      1,
+      2,
+      3
+   ],
+   "pending_transition" : null,
+   "db_set_message_queue_len" : 0,
+   "out_of_sync_db_set_partitions" : false,
+   "replicas_on_transfer" : [],
+   "expected_partition_seqs" : {
+      "1" :00,
+      "3" :00,
+      "0" :00,
+      "2" :00
+   },
+   "updater_running" : false,
+   "partition_seqs" : {
+      "1" :00,
+      "3" :00,
+      "0" :00,
+      "2" :00
+   },
+   "stats" : {
+      "update_history" : [],
+      "updater_cleanups" : 0,
+      "compaction_history" : [],
+      "full_updates" : 0,
+      "waiting_clients" : 0,
+      "compactions" : 0,
+      "cleanups" : 0,
+      "partial_updates" : 0,
+      "stopped_updates" : 0,
+      "cleanup_history" : [],
+      "cleanup_interruptions" : 0
+   },
+   "initial_build" :   false,
+   "replica_partitions" : [
+      4,
+      5,
+      8,
+      12
+   ],
+   "update_seqs" : {
+      "1" : 31250,
+      "3" : 31250,
+      "0" : 31250,
+      "2" : 31250
+   },
+   "partition_seqs_up_to_date" : true,
+   "updater_state" :   "not_running",
+   "data_size" : 5717080,
+   "cleanup_running" : false,
+   "signature" :   "440b0b3ded9d68abb559d58b9fda3e0a",
+   "max_number_partitions" : 16,
+   "disk_size" : 5726395
+}
+
+ +

The output gives us several fields useful to diagnose issues in the server. The field + replica_group_info can be ignored for the goals of this wiki (would + only be useful during a failover), the information it contains is similar to the top level + information, which is the one for the main/principal index, which is the one we care about + during steady state and during rebalance.

+ +

Some of the top level fields and their meaning:

+ +
    +
  • active_partitions - this is a list with the ID of all the vbuckets + marked as active in the index.

    +
  • + +
  • passive_partitions - this is a list with the ID of all vbuckets + marked as passive in the index.

    +
  • + +
  • cleanup_partitions - this is a list with the ID of all vBuckets + marked as cleanup in the index.

    +
  • + +
  • compact_running - true if index compaction is ongoing, false + otherwise.

    +
  • + +
  • updater_running - true if index build/update is ongoing, false + otherwise.

    +
  • + +
  • update_seqs - this tells us what up to which vbucket database + update_seqs the index reflects data, keys are vbucket IDs and values are update_seqs. + The update_seqs here are always smaller or equal then the values in + partition_seqs and expected_partition_seqs. If + the value of any update_seq here is smaller than the corresponding value in + partition_seqs or expected_partition_seqs, than + it means the index is not up to date (it’s stale), and a subsequent query with + stale=false will be blocked and spawn an index update (if not + already running).

    +
  • + +
  • partition_seqs - this tells us what are the current update_seqs for + each vbucket database. If any update_seq value here is greater than the corresponding + value in update_seqs, we can say the index is not up to date (it’s + stale). See the description above for update_seqs.

    +
  • + +
  • expected_partition_seqs - this should normally tells us exactly the + same as partition_seqs (see above). Index processes have an + optimization where they monitor vbucket database updates and track their current + update_seqs, so that when the index needs to know them, it doesn’t need to consult + them from the databases (expensive, from a performance perspective). The update_seqs + in this field are obtained by consulting each database file. If they don’t match the + corresponding values in partition_seqs, then we can say there’s an + issue in the view-engine.

    +
  • + +
  • unindexable_partitions - this field should be non-empty only during + rebalance. Vbuckets that are in this meta state “unindexable” means that index + updates will ignore these vbuckets. Transitions to and from this state are used by + ns_server for consistent views during rebalance. When not in rebalance, this field + should always be empty, if not, then there’s a issue somewhere. The value for this + field, when non-empty, is an object whose keys are vbucket IDs and values are + update_seqs.

    +
  • + +
+ +

Using the information given by this URL (remember, it’s on a per node basis), to check the + vbucket states and indexed update_seqs, together with the tools + couch_dbinfo and couch_dbdump (against all active + vbucket database files), one can debug where (which component) a problem is. For example, + it’s useful to find if it’s the indexes that are not indexing latest + data/updates/processing deletes, or if the memcached/ep-engine layer is not persisting + data/updates to disk or if there’s some issue in couchstore (component which writes to + database files) that causes it to not write data or write incorrect data to the database + file.

+ +

An example where using these tools and the information from the URL + /_set_view/bucketname/_design/ddocid/_info was very important to find which component was + misbehaving. In + this case Tommie was able to identify that the problem was in ep-engine.

+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-datamissing-user.html b/preview/contents/Misc/Trbl-datamissing-user.html new file mode 100644 index 0000000..225b384 --- /dev/null +++ b/preview/contents/Misc/Trbl-datamissing-user.html @@ -0,0 +1,99 @@ +Incorrect or missing data (user issue)
+

Incorrect or missing data (user issue)

+ + +

Data missing in query response or it’s wrong (user issue)

+ +

For example, you defined a view with a _stats reduce function. You query + your view, and keep getting empty results all the time, for example:

+ +
> curl -s 'http://localhost:9500/default/_design/dev_test3/_view/view1?full_set=true'
+{"rows":[
+]
+}
+
+ +

You repeat this query over and over for several minutes or even hours, and you always get + an empty result set.

+ +

Try to query the view with stale=false, and you get:

+ +
> curl -s 'http://localhost:9500/default/_design/dev_test3/_view/view1?full_set=true&stale=false'
+{"rows":[
+],
+"errors":[
+{"from":"local","reason":"Builtin _stats function
+ requires map values to be numbers"},
+{"from":"http://192.168.1.80:9502/_view_merge/?stale=false","reason":"Builtin _stats function requires map values to be
+ numbers"},
+{"from":"http://192.168.1.80:9501/_view_merge/?stale=false","reason":"Builtin _stats function requires map values to be
+ numbers"},
+{"from":"http://192.168.1.80:9503/_view_merge/?stale=false","reason":"Builtin _stats function requires map values to be
+ numbers"}
+]
+}
+
+ +

Then looking at the design document, you see it could never work, as values are not + numbers:

+ +
{
+   "views":
+   {
+       "view1": {
+           "map": "function(doc, meta) { emit(meta.id, meta.id); }",
+           "reduce": "_stats"
+       }
+   }
+}
+
+ +

One important question to answer is, why do you see the errors when querying with + stale=false but do not see them when querying with + stale=update_after (default) or stale=ok ? The + answer is simple:

+ +
    +
  1. stale=false means: trigger an index update/build, and wait until + it that update/build finishes, then start streaming the view results. For this + example, index build/update failed, so the client gets an error, describing why + it failed, from all nodes where it failed.

    +
  2. + +
  3. stale=update_after means start streaming the index contents + immediately and after trigger an index update (if index is not up to date + already), so query responses won’t see indexing errors as they do for the + stale=false scenario. For this particular example, the + error happened during the initial index build, so the index was empty when the + view queries arrived in the system, whence the empty result set.

    +
  4. + +
  5. stale=ok is very similar to (2), except it doesn’t trigger index + updates.

    +
  6. + +
+ +

Finally, index build/update errors, related to user Map/Reduce functions, can be found in + a dedicated log file that exists per node and has a file name matching + mapreduce_errors.#. For example, from node 1, the file + *mapreduce_errors.1 contained:

+ +
[mapreduce_errors:error,2012-08-20T16:18:36.250,n_0@192.168.1.80:<0.2096.1>] Bucket `default`, main group `_design/dev_test3`,
+ error executing reduce
+function for view `view1'
+   reason:                Builtin _stats function requires map values to be
+numbers
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-designdocs.html b/preview/contents/Misc/Trbl-designdocs.html new file mode 100644 index 0000000..22fca17 --- /dev/null +++ b/preview/contents/Misc/Trbl-designdocs.html @@ -0,0 +1,145 @@ +Design document aliases
+

Design document aliases

+ +
+

When two (2) or more design documents have exactly the same map and reduce functions (but + different IDs), they get the same signature. This means that both point to the + same index files, which enables publishing of development design + documents into production. In production, a copy of the development design + document is created (ID matches _design/dev_foobar) with an ID not containing the + dev_ prefix, and then the original development document is deleted + making suire that the index files are preserved after deleting the development design document. It’s + also possible to have multiple “production” aliases for the same production design + document. The view engine itself has no notion of development and production design + documents, this is a notion only at the UI and cluster layers, which exploits the design + document signatures/aliases feature.

+ +

The following example shows this property.

+ +

We create two (2) identical design documents, only their IDs differ:

+ +
> curl -H 'Content-Type: application/json' \
+    -X PUT 'http://localhost:9500/default/_design/ddoc1' \
+    -d '{ "views": {"view1": {"map": "function(doc, meta) { emit(doc.level, meta.id); }"}}}'
+{"ok":true,"id":"_design/ddoc1"}
+
+> curl -H 'Content-Type: application/json' \
+    -X PUT 'http://localhost:9500/default/_design/ddoc2'
+    -d '{ "views": {"view1": {"map": "function(doc, meta) { emit(doc.level, meta.id); }"}}}'
+{"ok":true,"id":"_design/ddoc2"}
+
+ +

Next we query view1 from _design/ddoc1 with stale=false, and get:

+ +
> curl -s 'http://localhost:9500/default/_design/ddoc1/_view/view1?limit=10&stale=false'
+{"total_rows":1000000,"rows":[
+{"id":"0000025","key":1,"value":"0000025"},
+{"id":"0000136","key":1,"value":"0000136"},
+{"id":"0000158","key":1,"value":"0000158"},
+{"id":"0000205","key":1,"value":"0000205"},
+{"id":"0000208","key":1,"value":"0000208"},
+{"id":"0000404","key":1,"value":"0000404"},
+{"id":"0000464","key":1,"value":"0000464"},
+{"id":"0000496","key":1,"value":"0000496"},
+{"id":"0000604","key":1,"value":"0000604"},
+{"id":"0000626","key":1,"value":"0000626"}
+]
+}
+
+ +

If immediately after you query view1 from _design/ddoc2 with stale=ok, + you’ll get exactly the same results, because both design documents are aliases, they share + the same signature:

+ +
> curl -s 'http://localhost:9500/default/_design/ddoc2/_view/view1?limit=10&stale=ok'
+{"total_rows":1000000,"rows":[
+{"id":"0000025","key":1,"value":"0000025"},
+{"id":"0000136","key":1,"value":"0000136"},
+{"id":"0000158","key":1,"value":"0000158"},
+{"id":"0000205","key":1,"value":"0000205"},
+{"id":"0000208","key":1,"value":"0000208"},
+{"id":"0000404","key":1,"value":"0000404"},
+{"id":"0000464","key":1,"value":"0000464"},
+{"id":"0000496","key":1,"value":"0000496"},
+{"id":"0000604","key":1,"value":"0000604"},
+{"id":"0000626","key":1,"value":"0000626"}
+]
+}
+
+ +

If you look into the data directory, there’s only one main index file and one replica index + file:

+ +
> tree couch/0/\@indexes
+couch/0/@indexes
+ ??? default
+     ???
+main_1909e1541626269ef88c7107f5123feb.view.1
+     ???
+replica_1909e1541626269ef88c7107f5123feb.view.1
+     ???
+tmp_1909e1541626269ef88c7107f5123feb_main
+
+ 2 directories, 2 files
+
+ +

Also, while the indexer is running, if you query _active_tasks for a node, + you’ll see one single indexer task, which lists both design documents in the + design_documents array field:

+ +

+> curl -s http://localhost:9500/_active_tasks | json_xs
+[
+   {
+      "waiting" : 0,
+      "started_on" : 1345662986,
+      "pid" :   "<0.234.0>",
+      "type" :   "couch_main_index_barrier",
+      "running" : 1,
+      "limit" : 4,
+      "updated_on" : 1345663590
+   },
+   {
+      "waiting" : 0,
+      "started_on" : 1345662986,
+      "pid" : "<0.235.0>",
+      "type" :   "couch_replica_index_barrier",
+      "running" : 0,
+      "limit" : 2,
+      "updated_on" : 1345662986
+   },
+   {
+      "indexer_type" : "main",
+      "started_on" : 1345663590,
+      "progress" : 75,
+      "initial_build" : true,
+      "updated_on" : 1345663634,
+      "total_changes" : 250000,
+      "design_documents" : [
+         "_design/ddoc1",
+         "_design/ddoc2"
+      ],
+      "pid" :   "<0.6567.0>",
+      "changes_done" : 189635,
+      "signature" : "1909e1541626269ef88c7107f5123feb",
+      "type" :   "indexer",
+      "set" :   "default"
+   }
+]
+
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-expireddocs.html b/preview/contents/Misc/Trbl-expireddocs.html new file mode 100644 index 0000000..e468e7b --- /dev/null +++ b/preview/contents/Misc/Trbl-expireddocs.html @@ -0,0 +1,24 @@ +Expired documents issue
+

Expired documents issue

+ + +

Expired documents have their associated key-value pairs returned in queries with + stale=false.

+ +

See Couchbase issuee MB-6219.

+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-generalTips.html b/preview/contents/Misc/Trbl-generalTips.html new file mode 100644 index 0000000..91de1f7 --- /dev/null +++ b/preview/contents/Misc/Trbl-generalTips.html @@ -0,0 +1,79 @@ +General tips
+

General tips

+ + +

General tips include various initial diagnostics activities.

+ +

The following are some general tips that may be useful before performing any more detailed + investigations:

+ +
    +
  • Try pinging the node.

    +
  • + +
  • Try connecting to Couchbase Server Web Console on the node.

    +
  • + +
  • Try to use telnet to connect to the + various ports that Couchbase Server uses.

    +
  • + +
  • Try reloading the web page.

    +
  • + +
  • Check firewall settings (if any) on the node. Make sure there isn’t a firewall between you + and the node. On a Windows system, for example, the Windows firewall might be blocking the + ports (Control Panel > Windows Firewall).

    +
  • + +
  • Make sure that the documented ports are open between nodes and make sure the data + operation ports are available to clients.

    +
  • + +
  • Check your browser’s security settings.

    +
  • + +
  • Check any other security software installed on your system, such as antivirus + programs.

    +
  • + +
  • Generate a Diagnostic Report for use by Couchbase Technical Support to help determine what + the problem is. There are two ways of collecting this information:

    + +
      +
    • Click Generate Diagnostic Report on the Log page to obtain a snapshot + of your system’s configuration and log information for deeper analysis. You must send this + file to Couchbase.

      +
    • + +
    • Run the cbcollect_info on each node within your cluster. To run, you + must specify the name of the file to be generated:

      +
    • + +
    + +

    > cbcollect_info nodename.zip

    + +

    This will create a Zip file with the specified name. You must run each command individually + on each node within the cluster. You can then send each file to Couchbase for analysis.

    + +
  • + +
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-indexFileSystem.html b/preview/contents/Misc/Trbl-indexFileSystem.html new file mode 100644 index 0000000..8375a3e --- /dev/null +++ b/preview/contents/Misc/Trbl-indexFileSystem.html @@ -0,0 +1,109 @@ +Index filesystem structure
+

Index filesystem structure

+ + +

A description of the index filesystem struction.

+ +

All index files live within a subdirectory of the data directory named + @indexes. Within this subdirectory, there’s a subdirectory for + each bucket (which matches exactly the bucket name).

+ +

Any index file has the form + <type>_<hexadecimal_signature>.view.N Each + component’s meaning is:

+ +
    +
  • type - the index type, can be main (active vbuckets data) or + replica (replica vbuckets data)

    +
  • + +
  • hexadecimal_signature - this is the hexadecimal form of an + MD5 hash computed over the map/reduce functions of a design document, when + these functions change, a new index is created. It’s possible to have + multiple versions of the same design document alive (different signatures). + This happens for a short period, for example a client does a + stale=false request to an index (1 index == 1 design + document), which triggers an index build/update and before this + update/build finishes, the design document is updated (with different + map/reduce functions). The initial version of the index will remain alive + until all currently blocked clients on it are served. In the meanwhile new + query requests are redirected to the latest (second) version of the index, + always. This is what makes it possible to have multiple versions of the + same design document index files at any point in time (however for short + periods).

    +
  • + +
  • N - when an index file is created N is 1, always. Every time + the index file is compacted, N is incremented by 1. This is similar to what + happens for vbucket database files Data missing in query response or it’s wrong + (potentially due to server issues)).

    +
  • + +
+ +

For each design document, there’s also a subdirectory named like + tmp_<hexadecimal_signature>_<type>. This is a + directory containing temporary files used for the initial index build (and soon for + incremental optimizations). Files within this directory have a name formed by the + design document signature and a generated UUID. These files are periodically deleted + when they’re not useful anymore.

+ +

All views defined within a design document are backed by a btree data structure, and + they all live inside the same index file. Therefore for each design document, + independently of the number of views it defines, there’s 2 files, one for main data + and the other for replica data.

+ +

Example:

+ +
> tree couch/0/\@indexes/
+couch/0/@indexes/
+ ??? default
+     ???
+main_018b83ca22e53e14d723ea858ba97168.view.1
+     ???
+main_15e1f576bc85e3e321e28dc883c90077.view.1
+     ???
+main_440b0b3ded9d68abb559d58b9fda3e0a.view.1
+     ???
+main_4995c136d926bdaf94fbe183dbf5d5aa.view.1
+     ???
+main_fd2bdf6191e61af6e801e3137e2f1102.view.1
+     ???
+replica_018b83ca22e53e14d723ea858ba97168.view.1
+     ???
+replica_15e1f576bc85e3e321e28dc883c90077.view.1
+     ???
+replica_440b0b3ded9d68abb559d58b9fda3e0a.view.1
+     ???
+replica_4995c136d926bdaf94fbe183dbf5d5aa.view.1
+     ???
+replica_fd2bdf6191e61af6e801e3137e2f1102.view.1
+     ???
+tmp_018b83ca22e53e14d723ea858ba97168_main
+     ???
+tmp_15e1f576bc85e3e321e28dc883c90077_main
+     ???
+tmp_440b0b3ded9d68abb559d58b9fda3e0a_main
+     ???
+tmp_4995c136d926bdaf94fbe183dbf5d5aa_main
+     ???
+tmp_fd2bdf6191e61af6e801e3137e2f1102_main
+
+ 6 directories, 10 files
+
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-intro.html b/preview/contents/Misc/Trbl-intro.html new file mode 100644 index 0000000..acf544c --- /dev/null +++ b/preview/contents/Misc/Trbl-intro.html @@ -0,0 +1,57 @@ +トラブルシューティング
+

トラブルシューティング

+ + +

トラブルシューティングの一般的なヒント、一般的なエラー、ログ情報、およびその他の問題について説明します。

+ +

When troubleshooting your Couchbase Server deployment there are a number of different + approaches available to you.

+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-issuesReport.html b/preview/contents/Misc/Trbl-issuesReport.html new file mode 100644 index 0000000..23bddc2 --- /dev/null +++ b/preview/contents/Misc/Trbl-issuesReport.html @@ -0,0 +1,138 @@ +Reporting issues
+

Reporting issues

+ + +

A description on information to include when reporting an issue (JIRA).

+ +

When reporting issues to Couchbase, add the following information to JIRA issues:

+ +
    +
  • Provide a description of your environment (for example, package installation, + cluster_run, build number, operating system, and so on).
  • + +
  • Show all the steps necessary to reproduce the issue (if applicable).
  • + +
  • Show the full content of all the design documents.
  • + +
  • Describe how your documents are structured (for example, if they are all same structure + or if they have different structures).
  • + +
  • If you generated the data with a tool, identify the tool name and all the parameters + given to it (full command line).
  • + +
  • Show the queries you were performing (include all query parameters and the full URL). For + example, if you are using curl, use the verbose option (-v) and show the full + output.

    +
  • + +
+ +

The following request uses curl with the -v option with test as the bucket, dev_zlat as the + design document, and Python (installed separately) as the tool used to format the + output.

+ +
curl -v http://10.5.2.54:8092/test/_design/dev_zlat | python -m json.tool
+
+* About to connect() to 10.5.2.54 port 8092 (#0)
+*   Trying 10.5.2.54...   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0connected
+* Connected to 10.5.2.54 (10.5.2.54) port 8092 (#0)
+  GET /test/_design/dev_zlat HTTP/1.1
+  User-Agent: curl/7.21.4 (x86_64-unknown-linux-gnu) libcurl/7.21.4 OpenSSL/0.9.8b zlib/1.2.3
+  Host: 10.5.2.54:8092
+  Accept: */*
+  
+  HTTP/1.1 200 OK
+  X-Couchbase-Meta: {"id":"_design/dev_zlat","rev":"1-08738b26","type":"json"}
+  Server: MochiWeb/1.0 (Any of you quaids got a smint?)
+  Date: Mon, 24 Nov 2014 21:17:13 GMT
+  Content-Type: application/json
+  Content-Length: 159
+  Cache-Control: must-revalidate
+  
+{ [data not shown]
+100   159  100   159    0     0  36780      0 --:--:-- --:--:-- --:--:-- 79500* Connection #0 to host 10.5.2.54 left intact
+
+* Closing connection #0
+{
+    "views": {
+        "byloc": {
+            "map": "function (doc, meta) {\n  
+            if (meta.type == \"json\") {\n    emit(doc.city, doc.sales);\n  } 
+            else {\n    emit([\"blob\"]);\n  }\n}"
+        }
+    }
+}
+
+      
+ +
    +
  • Repeat the query with different values for the stale parameter and show the + output
  • + +
  • Attach logs from all nodes in the cluster
  • + +
  • Try all view related operations, including creating, updating, and deleting design + documents from the command line. The goal is to isolate UI problems from the view + engine.
  • + +
  • If you suspect the indexer is stuck or blocked, use curl against the + _active_tasks API to isolate UI issues from view-engine issues. For example: +
    curl -s http://10.5.2.54:8092/_active_tasks
    +[
    +    {
    +        "limit": 16, 
    +        "pid": "<0.1006.0>", 
    +        "running": 0, 
    +        "started_on": 1407799619, 
    +        "type": "couch_main_index_barrier", 
    +        "updated_on": 1410294790, 
    +        "waiting": 0
    +    }, 
    +    {
    +        "limit": 2, 
    +        "pid": "<0.1007.0>", 
    +        "running": 0, 
    +        "started_on": 1407799619, 
    +        "type": "couch_replica_index_barrier", 
    +        "updated_on": 1407799619, 
    +        "waiting": 0
    +    }, 
    +    {
    +        "limit": 4, 
    +        "pid": "<0.1008.0>", 
    +        "running": 0, 
    +        "started_on": 1407799619, 
    +        "type": "couch_spatial_index_barrier", 
    +        "updated_on": 1407799619, 
    +        "waiting": 0
    +    }
    +]
    +
    +
  • + +
+ +
Note: The started_on and update_on fields are + UNIX timestamps. There are tools (even online) and programming language APIs (Perl, Python, + etc) to convert them into human readable form, including date and time. The + _active_tasks API contains information on the specific nodes, so query + _active_tasks on every node in the cluster to verify whether progress + is stuck.
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-logs.html b/preview/contents/Misc/Trbl-logs.html new file mode 100644 index 0000000..258ea51 --- /dev/null +++ b/preview/contents/Misc/Trbl-logs.html @@ -0,0 +1,329 @@ +Logs and logging
+

Logs and logging

+ + +

Couchbase Server creates a number of different log files depending on the component of + the system that produce the error, and the level and severity of the problem being + reported.

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PlatformLocation
Linux/opt/couchbase/var/lib/couchbase/logs
WindowsC:\Program + Files\Couchbase\Server\var\lib\couchbase\logs Assumes + default installation location
Mac OS X/Users/couchbase/Library/Application + Support/Couchbase/var/lib/couchbase/logs +
+
+ +

Individual log files are automatically numbered, with the number suffix incremented for + each new log, with a maximum of 20 files per log. Individual log file sizes are limited + to 10MB by default.

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileLog Contents
couchdbErrors relating to the couchdb subsystem that supports views, indexes + and related REST API issues
debugDebug level error messages related to the core server management + subsystem, excluding information included in the + couchdb, xdcr and + stats logs.
infoInformation level error messages related to the core server + management subsystem, excluding information included in the + couchdb, xdcr and + stats logs.
http_access.logThe admin access log records server requests (including admin logins) + coming through the REST or Couchbase web console. + It is output in common log format and contains several important fields such as remote client IP, + timestamp, GET/POST request and resource requested, HTTP status code, and so on.
errorError level messages for all subsystems excluding + xdcr.
xcdr_errorXDCR error messages.
xdcrXDCR information messages.
mapreduce_errorsJavaScript and other view-processing errors are reported in this + file.
viewsErrors relating to the integration between the view system and the + core server subsystem.
statsContains periodic reports of the core statistics.
memcached.logContains information relating to the core memcache component, + including vBucket and replica and rebalance data streams requests. +
reports.logContains only progress report and crash reports for the Erlang process. +
+
+ +

Each log file group will also include a .idx and .siz + file which holds meta information about the log file group. These files are + automatically updated by the logging system.

+ + + +

Changing log file location

+

The default file log location is + /opt/couchbase/var/lib/couchbase/logs, however, if you want to change the default + log location to a different directory, change the log file configuration option. +

+

Note

+

To implement a log file location change (from the default), you + must be log in as either root or sudo and the Couchbase service must be + restarted.

+

To change the log file configuration:

+
    +
  1. Log in as root or sudo and navigate to the directory where you installed + Couchbase. For example: + /opt/couchbase/etc/couchbase/static_config
  2. + +
  3. Edit the static_config file and change the error_logger_mf_dir + variable to a different directory. For example: {error_logger_mf_dir, + "/home/user/cb/opt/couchbase/var/lib/couchbase/logs"}
  4. + +
  5. Restart the Couchbase service. After restarting the Couchbase service, all + subsequent logs will be in the new directory.
  6. + +
+
+ + + +

Changing logging levels

+ +

The default logging level for all log + files are set to debug except for couchdb, which is set to info. If you want to + change the default logging level, modify the logging level configuration options. +

+

The configuration change can be performed in one of the following ways:

+
    +
  • persistent
  • + +
  • dynamic (on the fly, without restarting).
  • + +
+
+ + + +

Changing logging levels to be persistent

+

Logging + levels can be changed so that the changes are persistent, that is, the changes + continue to be implemented should a Couchbase Server reboot + occur.

+ + +
Note: To implement logging level changes, the Couchbase + service must be restarted.
+ + +

To change logging levels to be persistent:

+ + +
    +
  1. Log in as root or sudo and navigate to the directory where you installed + Couchbase. For example: + /opt/couchbase/etc/couchbase/static_config
  2. + +
  3. Edit the static_config file and change the desired log component. For + example, parameters with the loglevel_ prefix set the + logging level.
  4. + +
  5. Restart the Couchbase service.
  6. + +
+ + +

After restarting the Couchbase service, logging levels for that component + will be changed.

+
+ + + +

Changing logging levels dynamically

+ +

If logging + levels are changed dynamically and if a Couchbase server reboot occurs, then the + changed logging levels revert to the default.

+

To change logging levels + dynamically, execute a curl POST command using the following syntax:

+ + +

+curl -X POST -u adminName:adminPassword
+  HOST:PORT/diag/eval 
+  –d ‘ale:set_loglevel(<log_component>,<logging_level>).’
+
+ + +

Where:

+ +
+ +
Log_component
+ +
The default log level (except couchdb) is debug; for + example ns_server. The available loggers are + ns_server, couchdb, + user, Menelaus, + ns_doctor, stats, + rebalance, cluster, views, + mapreduce_errors , xdcr and + error_logger.
+ + + + + +
Logging_level
+ +
The available log levels are debug, info, + warning, and error.
+ + +
+ +
+ + +
+

+curl -X POST -u Administrator:password 
+	http://127.0.0.1:8091/diag/eval 
+	-d 'ale:set_loglevel(ns_server,error).
+
+
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-queryResults.html b/preview/contents/Misc/Trbl-queryResults.html new file mode 100644 index 0000000..c1312b1 --- /dev/null +++ b/preview/contents/Misc/Trbl-queryResults.html @@ -0,0 +1,41 @@ +Index results for a single node
+

Index results for a single node

+ + +

A specific URI is used to get index results for a single node.

+ +

There’s a special URI which accepts index results only from the targeted node. It is + used only for development and debugging, not meant to be public. The following is an example + where two different nodes are queried from a four node cluster.

+ +
> curl -s 'http://192.168.1.80:9500/_set_view/default/_design/ddoc2/_view/view1?limit=4'
+{"total_rows":250000,"offset":0,"rows":[
+{"id":"0000136","key":1,"value":"0000136"},
+{"id":"0000205","key":1,"value":"0000205"},
+{"id":"0000716","key":1,"value":"0000716"},
+{"id":"0000719","key":1,"value":"0000719"}
+]}
+> curl -s 'http://192.168.1.80:9500/_set_view/default/_design/ddoc2/_view/view1?limit=4'
+{"total_rows":250000,"offset":0,"rows":[
+{"id":"0000025","key":1,"value":"0000025"},
+{"id":"0000158","key":1,"value":"0000158"},
+{"id":"0000208","key":1,"value":"0000208"},
+{"id":"0000404","key":1,"value":"0000404"}
+]}
+
+ +
Note: For this special API, the default value of the stale parameter is + stale=false, while for the public, documented API the default is + stale=update_after.
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-replicaIndex.html b/preview/contents/Misc/Trbl-replicaIndex.html new file mode 100644 index 0000000..3b1038c --- /dev/null +++ b/preview/contents/Misc/Trbl-replicaIndex.html @@ -0,0 +1,97 @@ +Debugging replica index
+

Debugging replica index

+ + +

Description of how to test and verify that the replica index is working.

+ +

It’s not easy to test/verify from the outside that the replica index is working. Remember, + replica index is optional, and it’s just an optimization for faster + stale=false queries after rebalance - it doesn’t cope with correctness of + the results.

+ +

There’s a non-public query parameter named _type used only for debugging and + testing. Its default value is main, and the other possible value is + replica. Here follows an example of querying the main (default) and replica + indexes on a 2 nodes cluster (for sake of simplicity), querying the main (normal) index + gives:

+ +
> curl -s 'http://localhost:9500/default/_design/test/_view/view1?limit=20&stale=false&debug=true'
+{"total_rows":20000,"rows":[
+{"id":"0017131","key":2,"partition":43,"node":"http://192.168.1.80:9501/_view_merge/","value":"0017131"},
+{"id":"0000225","key":10,"partition":33,"node":"http://192.168.1.80:9501/_view_merge/","value":"0000225"},
+{"id":"0005986","key":15,"partition":34,"node":"http://192.168.1.80:9501/_view_merge/","value":"0005986"},
+{"id":"0015579","key":17,"partition":27,"node":"local","value":"0015579"},
+{"id":"0018530","key":17,"partition":34,"node":"http://192.168.1.80:9501/_view_merge/","value":"0018530"},
+{"id":"0006210","key":23,"partition":2,"node":"local","value":"0006210"},
+{"id":"0006866","key":25,"partition":18,"node":"local","value":"0006866"},
+{"id":"0019349","key":29,"partition":21,"node":"local","value":"0019349"},
+{"id":"0004415","key":39,"partition":63,"node":"http://192.168.1.80:9501/_view_merge/","value":"0004415"},
+{"id":"0018181","key":48,"partition":5,"node":"local","value":"0018181"},
+{"id":"0004737","key":49,"partition":1,"node":"local","value":"0004737"},
+{"id":"0014722","key":51,"partition":2,"node":"local","value":"0014722"},
+{"id":"0003686","key":54,"partition":38,"node":"http://192.168.1.80:9501/_view_merge/","value":"0003686"},
+{"id":"0004656","key":65,"partition":48,"node":"http://192.168.1.80:9501/_view_merge/","value":"0004656"},
+{"id":"0012234","key":65,"partition":10,"node":"local","value":"0012234"},
+{"id":"0001610","key":71,"partition":10,"node":"local","value":"0001610"},
+{"id":"0015940","key":83,"partition":4,"node":"local","value":"0015940"},
+{"id":"0010662","key":87,"partition":38,"node":"http://192.168.1.80:9501/_view_merge/","value":"0010662"},
+{"id":"0015913","key":88,"partition":41,"node":"http://192.168.1.80:9501/_view_merge/","value":"0015913"},
+{"id":"0019606","key":90,"partition":22,"node":"local","value":"0019606"}
+],
+
+ +

Note that the debug=true parameter, for map views, add 2 row fields, + partition which is the vbucket ID where the document that produced this row + (emitted by the map function) lives, and node which tells from which node in + the cluster the row came (value “local” for the node which received the query, an URL + otherwise).

+ +

Now, doing the same query but against the replica index ( _type=replica ) + gives:

+ +
> curl -s 'http://localhost:9500/default/_design/test/_view/view1?limit=20&stale=false&_type=replica&debug=true'
+{"total_rows":20000,"rows":[
+{"id":"0017131","key":2,"partition":43,"node":"local","value":"0017131"},
+{"id":"0000225","key":10,"partition":33,"node":"local","value":"0000225"},
+{"id":"0005986","key":15,"partition":34,"node":"local","value":"0005986"},
+{"id":"0015579","key":17,"partition":27,"node":"http://192.168.1.80:9501/_view_merge/","value":"0015579"},
+{"id":"0018530","key":17,"partition":34,"node":"local","value":"0018530"},
+{"id":"0006210","key":23,"partition":2,"node":"http://192.168.1.80:9501/_view_merge/","value":"0006210"},
+{"id":"0006866","key":25,"partition":18,"node":"http://192.168.1.80:9501/_view_merge/","value":"0006866"},
+{"id":"0019349","key":29,"partition":21,"node":"http://192.168.1.80:9501/_view_merge/","value":"0019349"},
+{"id":"0004415","key":39,"partition":63,"node":"local","value":"0004415"},
+{"id":"0018181","key":48,"partition":5,"node":"http://192.168.1.80:9501/_view_merge/","value":"0018181"},
+{"id":"0004737","key":49,"partition":1,"node":"http://192.168.1.80:9501/_view_merge/","value":"0004737"},
+{"id":"0014722","key":51,"partition":2,"node":"http://192.168.1.80:9501/_view_merge/","value":"0014722"},
+{"id":"0003686","key":54,"partition":38,"node":"local","value":"0003686"},
+{"id":"0004656","key":65,"partition":48,"node":"local","value":"0004656"},
+{"id":"0012234","key":65,"partition":10,"node":"http://192.168.1.80:9501/_view_merge/","value":"0012234"},
+{"id":"0001610","key":71,"partition":10,"node":"http://192.168.1.80:9501/_view_merge/","value":"0001610"},
+{"id":"0015940","key":83,"partition":4,"node":"http://192.168.1.80:9501/_view_merge/","value":"0015940"},
+{"id":"0010662","key":87,"partition":38,"node":"local","value":"0010662"},
+{"id":"0015913","key":88,"partition":41,"node":"local","value":"0015913"},
+{"id":"0019606","key":90,"partition":22,"node":"http://192.168.1.80:9501/_view_merge/","value":"0019606"}
+],
+
+ +

Note that you get exactly the same results (id, key and value for each row). Looking at the + row field node, you can see there’s a duality when compared to the results we + got from the main index, which is very easy to understand for the simple case of a 2 nodes + cluster.

+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-staleFalse-debug.html b/preview/contents/Misc/Trbl-staleFalse-debug.html new file mode 100644 index 0000000..c0acee9 --- /dev/null +++ b/preview/contents/Misc/Trbl-staleFalse-debug.html @@ -0,0 +1,324 @@ +Debugging stale=false queries
+

Debugging stale=false queries

+ + +

Debugging stale=false queries for missing/unexpected data

+ +

The query parameter debug=true can be used to debug queries with + stale=false that are not returning all expected data or return + unexpected data. This is particularly useful when clients issue a + stale=false query right after being unblocked by a memcached OBSERVE + command. .

+ +

Here follows an example of how to debug this sort of issues on a simple scenario where + there’s only 16 vbuckets (instead of 1024) and 2 nodes. The tools + couchdb_dump and couchdb_info (from the couchstore git + project) are used to help analyze this type of issues (available under + install/bin directory).

+ +

Querying a view with debug=true will add an extra field, named + debug_info in the view response. This field has one entry per node in + the cluster (if no errors happened, like down/timed out nodes for example). Example:

+ +
> curl -s 'http://localhost:9500/default/_design/test/_view/view1?stale=false&limit=5&debug=true' | json_xs
+ {
+    "debug_info" : {
+       "local" : {
+          "main_group" : {
+             "passive_partitions" : [],
+             "wanted_partitions" : [
+                0,
+                1,
+                2,
+                3,
+                4,
+                5,
+                6,
+                7
+             ],
+             "wanted_seqs" : {
+                "0002" :00,
+                "0001" :00,
+                "0006" :00,
+                "0005" :00,
+                "0004" :00,
+                "0000" :00,
+                "0007" :00,
+                "0003" :00
+             },
+             "indexable_seqs" : {
+                "0002" :00,
+                "0001" :00,
+                "0006" :00,
+                "0005" :00,
+                "0004" :00,
+                "0000" :00,
+                "0007" :00,
+                "0003" :00
+             },
+             "cleanup_partitions" : [],
+             "stats" : {
+                "update_history" : [
+                   {
+                      "deleted_ids" : 0,
+                      "inserted_kvs" :00,
+                      "inserted_ids" :00,
+                      "deleted_kvs" : 0,
+                      "cleanup_kv_count" : 0,
+                      "blocked_time" : 0.000258,
+                      "indexing_time" : 103.222201
+                   }
+                ],
+                "updater_cleanups" : 0,
+                "compaction_history" : [],
+                "full_updates" : 1,
+                "accesses" : 1,
+                "cleanups" : 0,
+                "compactions" : 0,
+                "partial_updates" : 0,
+                "stopped_updates" : 0,
+                "cleanup_history" : [],
+                "update_errors" : 0,
+                "cleanup_stops" : 0
+             },
+             "active_partitions" : [
+                0,
+                1,
+                2,
+                3,
+                4,
+                5,
+                6,
+                7
+             ],
+             "pending_transition" : null,
+             "unindexeable_seqs" : {},
+             "replica_partitions" : [
+                8,
+                9,
+                10,
+                11,
+                12,
+                13,
+                14,
+                15
+             ],
+             "original_active_partitions" : [
+                0,
+                1,
+                2,
+                3,
+                4,
+                5,
+                6,
+                7
+             ],
+             "original_passive_partitions" : [],
+             "replicas_on_transfer" : []
+          }
+       },
+       "http://10.17.30.98:9501/_view_merge/" :   {
+          "main_group" : {
+             "passive_partitions" : [],
+             "wanted_partitions" : [
+                8,
+                9,
+                10,
+                11,
+                12,
+                13,
+                14,
+                15
+             ],
+             "wanted_seqs" : {
+                "0008" :00,
+                "0009" :00,
+                "0011" :00,
+                "0012" :00,
+                "0015" :00,
+                "0013" :00,
+                "0014" :00,
+                "0010" :00
+             },
+             "indexable_seqs" : {
+                "0008" :00,
+                "0009" :00,
+                "0011" :00,
+                "0012" :00,
+                "0015" :00,
+                "0013" :00,
+                "0014" :00,
+                "0010" :00
+             },
+             "cleanup_partitions" : [],
+             "stats" : {
+                "update_history" : [
+                   {
+                      "deleted_ids" : 0,
+                      "inserted_kvs" :00,
+                      "inserted_ids" :00,
+                      "deleted_kvs" : 0,
+                      "cleanup_kv_count" : 0,
+                      "blocked_time" : 0.000356,
+                      "indexing_time" : 103.651148
+                   }
+                ],
+                "updater_cleanups" : 0,
+                "compaction_history" : [],
+                "full_updates" : 1,
+                "accesses" : 1,
+                "cleanups" : 0,
+                "compactions" : 0,
+                "partial_updates" : 0,
+                "stopped_updates" : 0,
+                "cleanup_history" : [],
+                "update_errors" : 0,
+                "cleanup_stops" : 0
+             },
+             "active_partitions" : [
+                8,
+                9,
+                10,
+                11,
+                12,
+                13,
+                14,
+                15
+             ],
+             "pending_transition" : null,
+             "unindexeable_seqs" : {},
+             "replica_partitions" : [
+                0,
+                1,
+                2,
+                3,
+                4,
+                5,
+                6,
+                7
+             ],
+             "original_active_partitions" : [
+                8,
+                9,
+                10,
+                11,
+                12,
+                13,
+                14,
+                15
+             ],
+             "original_passive_partitions" : [],
+             "replicas_on_transfer" : []
+          }
+       }
+    },
+    "total_rows" : 1000000,
+    "rows" : [
+       {
+          "value" : {
+             "ratio" : 1.8,
+             "type" : "warrior",
+             "category" : "orc"
+          },
+          "id" : "0000014",
+          "node" : "http://10.17.30.98:9501/_view_merge/",
+          "partition" : 14,
+          "key" : 1
+       },
+       {
+          "value" : {
+             "ratio" : 1.8,
+             "type" : "warrior",
+             "category" : "orc"
+          },
+          "id" : "0000017",
+          "node" : "local",
+          "partition" : 1,
+          "key" : 1
+       },
+       {
+          "value" : {
+             "ratio" : 1.8,
+             "type" : "priest",
+             "category" : "human"
+          },
+          "id" : "0000053",
+          "node" : "local",
+          "partition" : 5,
+          "key" : 1
+       },
+       {
+          "value" : {
+             "ratio" : 1.8,
+             "type" : "priest",
+             "category" : "orc"
+          },
+          "id" : "0000095",
+          "node" : "http://10.17.30.98:9501/_view_merge/",
+          "partition" : 15,
+          "key" : 1
+       },
+       {
+          "value" : {
+             "ratio" : 1.8,
+             "type" : "warrior",
+             "category" : "elf"
+          },
+          "id" : "0000151",
+          "node" : "local",
+          "partition" : 7,
+          "key" : 1
+       }
+    ]
+ }
+
+ +

For each node, there are 2 particular fields of interest when debugging + stale=false queries that apparently miss some data:

+ +
    +
  • wanted_seqs - This field has an object (dictionary) value where + keys are vbucket IDs and values are vbucket database sequence numbers for an + explanation of sequence numbers). This field tells us the sequence number of each + vbucket database file (at the corresponding node) at the moment the query arrived at + the server (all these vbuckets are active vbuckets ).

    +
  • + +
  • indexable_seqs - This field has an object (dictionary) value where + keys are vbucket IDs and values are vbucket database sequence numbers. This field + tells us, for each active vbucket database, up to which sequence the index has + processed/indexed documents (remember, each vbucket database sequence number is + associated with 1, and only 1, document).

    +
  • + +
+ +

For queries with stale=false, all the sequences in + indexable_seqs must be greater or equal then the sequences in + wanted_seqs - otherwise the stale=false option can be + considered broken. What happens behind the scenes is, at each node, when the query request + arrives, the value for wanted_seqs is computed (by asking each active + vbucket database for its current sequence number), and if any sequence is greater than the + corresponding entry in indexable_seqs (stored in the index), the client is + blocked, the indexer is started to update the index, the client is unblocked when the + indexer finishes updating the index, and finally the server starts streaming rows to the + client - note that at this point, all sequences in indexable_seqs are + necessarily greater or equal then the corresponding sequences in + wanted_sequences, otherwise the stale=false + implementation is broken.

+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-timeoutErrors.html b/preview/contents/Misc/Trbl-timeoutErrors.html new file mode 100644 index 0000000..a562f1c --- /dev/null +++ b/preview/contents/Misc/Trbl-timeoutErrors.html @@ -0,0 +1,134 @@ +Timeout errors
+

Timeout errors

+ + +

Timeout errors when querying a view with stale=false.

+ +

When querying a view with stale=false, you get often timeout errors for one + or more nodes. These nodes are nodes that did not receive the original query request, for + example you query node 1, and you get timeout errors for nodes 2, 3 and 4 as in the example + below (view with reduce function _count):

+ +
> curl -s 'http://localhost:9500/default/_design/dev_test2/_view/view2?full_set=true&stale=false'
+{"rows":[
+  {"key":null,"value":125184}
+],
+"errors":[
+  {"from":"http://192.168.1.80:9503/_view_merge/?stale=false","reason":"timeout"},
+  {"from":"http://192.168.1.80:9501/_view_merge/?stale=false","reason":"timeout"},
+  {"from":"http://192.168.1.80:9502/_view_merge/?stale=false","reason":"timeout"}
+]
+}
+
+ +

The problem here is that by default, for queries with stale=false (full + consistency), the view merging node (node which receive the query request, node 1 in this + example) waits up to 60000 milliseconds (1 minute) to receive partial view results from each + other node in the cluster. If it waits for more than 1 minute for results from a remote node, + it stops waiting for results from that node and a timeout error entry is added to the final + response. A stale=false request blocks a client, or the view merger node as + in this example, until the index is up to date, so these timeouts can happen frequently.

+ +

If you look at the logs from those nodes you got a timeout error, you’ll see the index + build/update took more than 60 seconds, example from node 2:

+ +
[couchdb:info,2012-08-20T15:21:13.150,n_1@192.168.1.80:<0.6234.0>:couch_log:info:39] Set view
+  `default`, main group `_design/dev_test2`, updater finished
+ Indexing time: 93.734 seconds
+ Blocked time:  10.040 seconds
+ Inserted IDs:  124960
+ Deleted IDs:   0
+ Inserted KVs:  374880
+ Deleted KVs:   0
+ Cleaned KVs:   0
+
+ +

In this case, node 2 took 103.774 seconds to update the index.

+ +

In order to avoid those timeouts, you can pass a large connection_timeout in the view query + URL, example:

+ +
> time curl -s
+ 'http://localhost:9500/default/_design/dev_test2/_view/view2?full_set=true&stale=false&connection_timeout=999999999'
+{"rows":[
+{"key":null,"value":2000000}
+]
+}
+real  2m44.867s
+user   0m0.007s
+sys    0m0.007s
+
+ +

And in the logs of nodes 1, 2, 3 and 4, respectively you’ll see something like this:

+ +

node 1, view merger node

+ +
[couchdb:info,2012-08-20T16:10:02.887,n_0@192.168.1.80:<0.27674.0>:couch_log:info:39] Set view
+  `default`, main group `_design/dev_test2`, updater
+finished
+ Indexing time: 155.549
+seconds
+ Blocked time:  0.000 seconds
+ Inserted IDs:96
+ Deleted IDs:   0
+ Inserted KVs:  1500288
+ Deleted KVs:   0
+ Cleaned KVs:   0
+
+ +

node 2

+ +
[couchdb:info,2012-08-20T16:10:28.457,n_1@192.168.1.80:<0.6071.0>:couch_log:info:39] Set view
+  `default`, main group `_design/dev_test2`, updater
+finished
+ Indexing time: 163.555
+seconds
+ Blocked time:  0.000 seconds
+ Inserted IDs:  499968
+ Deleted IDs:   0
+ Inserted KVs:  1499904
+ Deleted KVs:   0
+ Cleaned KVs:   0
+
+ +

node 3

+ +
[couchdb:info,2012-08-20T16:10:29.710,n_2@192.168.1.80:<0.6063.0>:couch_log:info:39] Set view
+  `default`, main group `_design/dev_test2`, updater
+finished
+ Indexing time: 164.808
+seconds
+ Blocked time:  0.000 seconds
+ Inserted IDs:  499968
+ Deleted IDs:   0
+ Inserted KVs:  1499904
+ Deleted KVs:   0
+ Cleaned KVs:   0
+
+ +

node 4

+ +
[couchdb:info,2012-08-20T16:10:26.686,n_3@192.168.1.80:<0.6063.0>:couch_log:info:39] Set view
+  `default`, main group `_design/dev_test2`, updater
+finished
+ Indexing time: 161.786
+seconds
+ Blocked time:  0.000 seconds
+ Inserted IDs:  499968
+ Deleted IDs:   0
+ Inserted KVs:  1499904
+ Deleted KVs:   0
+ Cleaned KVs:   0
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/Trbl-total_row-debug.html b/preview/contents/Misc/Trbl-total_row-debug.html new file mode 100644 index 0000000..54fb5ff --- /dev/null +++ b/preview/contents/Misc/Trbl-total_row-debug.html @@ -0,0 +1,61 @@ +total_rows values are too high
+

total_rows values are too high

+ + +

There are cases where the total_rows value is higher than expected.

+ +

In some scenarios, it’s expected to see queries returning a total_rows field + with a value higher than the maximum rows they can return (map view queries without an + explicit limit, skip, startkey or + endkey ).

+ +

The expected scenarios are during rebalance, and immediately after a failover for a finite + period of time.

+ +

This happens because in these scenarios some vbuckets are marked for cleanup in the indexes, + temporarily marked as passive, or data is being transferred from the replica index to the main + index (after a failover). While the rows originated from those vbuckets are never returned to + queries, they contribute to the reduction value of every view btree, and this value is what is + used for the total_rows field in map view query responses (it’s simply a + counter with total number of Key-Value pairs per view).

+ +

Ensuring that total_rows always reflected the number of rows originated from + documents in active vbuckets would be very expensive, severely impacting performance. For + example, we would need to maintain a different value in the btree reductions which would map + vbucket IDs to row counts:

+ +
{"0":56, "1": 2452435, ..., "1023": 432236}
+
+ +

This would significantly reduce the btrees branching factor, making them much more deep, + using more disk space and taking more time to compute reductions on + inserts/updates/deletes.

+ +

To know if there are vbuckets under cleanup, vbuckets in passive state or vbuckets being + transferred from the replica index to main index (on failover), one can query the following + URL:

+ +
> curl -s 'http://localhost:9500/_set_view/default/_design/dev_test2/_info' | json_xs
+{
+   "passive_partitions" : [1, 2, 3],
+   "cleanup_partitions" : [],
+   "replicas_on_transfer" : [1, 2, 3],
+   (....)
+}
+
+ +

Note that the example above intentionally hides all non-relevant fields. If any of the fields + above is a non-empty list, than total_rows for a view may be higher than + expected, that is, we’re under one of those expected scenarios mentioned above. In steady + state all of the above fields are empty lists.

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/admin-basics.html b/preview/contents/Misc/admin-basics.html new file mode 100644 index 0000000..fe5d375 --- /dev/null +++ b/preview/contents/Misc/admin-basics.html @@ -0,0 +1,92 @@ +Couchbase Server管理の基本
+

Couchbase Server管理の基本

+ + + +

Couchbase Serverで使用する管理ツール、CouchbaseのWebコンソール、コマンドラインインターフェイス(CLI)およびREST APIについての説明です。

+ + +

Couchbase Serverは管理や監視用に様々なソリューションを提供しています:

+ + +
+ +
Couchbase Webコンソール
+ +
これはビルトインのWeb管理コンソールで、インストールされたCouchbase Serverの設定、管理、モニタリングに対する完全なインタフェースを提供します。
+ + +
+ + +
+ +
コマンドラインインタフェース (CLI)
+ +
これはコマンドラインツールのセットで、Couchbase Serverやクラスタの情報や制御を実行できます。 CLIツールはREST APIを利用しています。組み合わせることで、自動ファイルオーバやバックアップなどの管理手続きを実行する仕組みをスクリプトを開発できます。
+ + +
+ + +
+ +
REST API
+ +
Couchbase Web Consoleに加え、Couchbase Serverは標準的なHTTP RESTプロトコルで管理インタフェースを公開しています。 このRESTインタフェースを利用して、様々なオペレーションを実行する運用管理スクリプトを開発することができます。
+ + +
+ + + +

Couchbase Serverにアクセスする

+

Couchbase Server、CLIやREST APIに直接アクセスするには、サーバに直接ログインします (オペレーティングシステムにより操作方法は異なる)。

+ +

Couchbase ServerにアクセスしてCouchbase Webコンソールを利用するには、Firefox、Chrome、Safari、Internet Explorerなどのブラウザからサーバにログインします。

+ +
+ + + +

クライアントからCouchbase Serverにアクセスする

+

すでにmemcachedプロトコルを利用するアプリケーションをお持ちの場合、Couchbase Serverの利用をすぐに開始できます。 その場合、単純にそのアプリケーションをmemcachedサーバに対して行うのと同様に、このサーバに接続するように設定します。 コード変更や特別なライブラリは必要なく、アプリケーションは標準のmemcachedサーバに対する場合と同様に動作します。 クライアントが意識することなく、データはレプリケートされ、永続化され、クラスタを透過的に拡張できます。

+ +

アプリケーションをこれから開発する場合、Couchbaseクライアントライブラリ経由でサーバに接続し、情報の保存や参照を開始してください。

+ +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Misc/admin-datafiles.html b/preview/contents/Misc/admin-datafiles.html new file mode 100644 index 0000000..17803b7 --- /dev/null +++ b/preview/contents/Misc/admin-datafiles.html @@ -0,0 +1,121 @@ +データファイルの場所
+

データファイルの場所

+ + +

Couchbase Serverはデータファイル (データベースとインデックス)をvar > lib > couchbase > dataに保存します。

+ +

データベースとインデックスファイルの保存場所はサーバノードの初期セットアップ時に指定できます。 + 一般的にデフォルトのディスクパスは開発用途のみに利用します。 + プロダクション環境では、異なるディスクパスを設定します。

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
プラットフォームデフォルトディレクトリ
Linux/opt/couchbase/var/lib/couchbase/data
WindowsC:\Program Files\couchbase\server\var\lib\couchbase\data
Mac OS X~/Library/Application Support/Couchbase/var/lib/couchbase/data
+
+ + +
重要: データパスにはその他のファイル、特にCouchbase Serverのバックアップを保存しないでください。 + このディレクトリのデータはCouchbase Serverが特定の条件で削除することがあります。
+ + +

データファイルパスの変更

データやインデックスファイルが保存されるディスクパスは稼働中のサーバで変更できません。 ディスクパスを変更するには、そのノードをクラスタから削除し、パスを変更後、クラスタに戻す必要があります。 + データファイルパスは各ノードのセットアップ時に、Couchbase Webコンソール、REST API、またはCLIから変更することができます。 ノードやクラスタをセットアップしデータの保存を開始すると、クラスタの一部となったノードのパスは変更できません。 +

最も高速で簡単な方法は、新規ノードを正しいディスクパスで設定し、スワップリバランスを利用して新規ノードを追加すると同時に、既存ノードをクラスタから削除することです。 これはクラスタのパフォーマンスに影響を与えません。

+ +

ノードを置換してディスクパスを変更する(スワップリバランス):

+
    +
  1. 新規ノードのディスクパスを変更する。
  2. + +
  3. 既存ノードと新規ノードをスワップリバランスする。
  4. + +
  5. クラスタ内の各ノードでこの処理を繰り返す。
  6. + +
+

既存ノードのディスクパスを変更する(スワップリバランスを利用しない):

+
    +
  1. クラスタからノードを削除しリバランスする。
  2. + +
  3. そのノードのパスをREST APIまたはCouchbase CLIで変更する。
  4. + +
  5. クラスタにノードを再追加しリバランスする。
  6. + +
+ 複数ノードのディスクパスを変更するには、各ノードをスワップアウトし、個々のディスクパスを変更します。
重要: すでにクラスタの一部であったノードのデータパスを変更すると、保存されていたデータは完全に削除されます。
+ +
ヒント: CLIを利用する場合、データファイルとインデックスファイルのパスは個別に変更することはできません。 個別に設定を変更する場合、REST APIを利用します。
+ +
+ + + +

CLI実行例

+

+couchbase-cli node-init -c 10.5.2.54:8091 \
+	--node-init-data-path=new_path \
+	-u user -p password
+		
+ +
+ + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Misc/cluster-wide-info-intro.html b/preview/contents/Misc/cluster-wide-info-intro.html new file mode 100644 index 0000000..6da1958 --- /dev/null +++ b/preview/contents/Misc/cluster-wide-info-intro.html @@ -0,0 +1,31 @@ +クラスタの診断
+

クラスタの診断

+ + +

Couchbaseサポートチームはログやその他のシステム診断結果を利用し、お客様の問題を解析します。

+ +

Couchbaseカスタマーサポートに問い合わせると、クラスタから診断結果の収集を求められることがあります。 Couchbase Serverには効率的にクラスタ全体から診断結果を収集するいくつかの方法があります。

+ +

診断結果情報を収集するには、Couchbase Webコンソール、CLI、REST APIのいずれかを利用します。

+ + +
    +
  • Couchbase Webコンソールを利用して収集し、診断結果の情報を閲覧するには、Managing diagnosticsを参照してください。
  • + +
  • CLIのcouchbase-cliツールを利用して情報を収集するには、couchbase-cliによる診断を参照してください。
  • + +
  • CLIのcbcollectツールを利用して情報を収集するには、cbcollect_info ツールを参照してください。
  • + +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/deprecated.html b/preview/contents/Misc/deprecated.html new file mode 100644 index 0000000..271c6da --- /dev/null +++ b/preview/contents/Misc/deprecated.html @@ -0,0 +1,741 @@ +Deprecated items
+

Deprecated items

+ +
+

The following software versions are deprecated, will be deprecated, or are unsupported.

+ + +

Platforms

+

The following operating systems have been or will be deprecated.

+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Deprecated operating systems
Operating systemDescriptionDeprecated versionUnsupported version
Linux32-bit operating systems (CentOS, Ubuntu, RHEL) will not be supported.2.5.x3.0.0
Windows32-bit operating systems will only be supported for development purposes. 32-bit + production systems will not be supported.2.5.x3.0.0
CentOS 5CentOS 5 will not be supported after Couchbase Server version 3.0.3.0.x3.x
Ubuntu 10.04Ubuntu 10.04 will not be supported after Couchbase Server version 3.0.3.0.x3.x
RHEL 5RHEL 5 will not be supported after Couchbase Server version 3.0.3.0.x3.x
+
+ + + +

REST API

+

The following REST API URI items have been or will be deprecated.

+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Deprecated REST API URIs or parameters
REST APIURIDescriptionDeprecated versionUnsupported version
Server nodes/pools/nodesURI for obtaining information about nodes in a Couchbase cluster. To obtain + information about nodes in a Couchbase cluster, use the + /pools/default/buckets/default URI.3.0.03.0.x
XDCR/internalSettingsThe following internal parameters associated with XDCR replication have been + deprecated. +
xdcrMaxConcurrentReps
+xdcrCheckpointInterval,
+xdcrWorkerBatchSize
+xdcrDocBatchSizeKb
+xdcrFailureRestartInterval
+xdcrOptimisticReplicationThreshold
+
3.0.03.x
+
+ + + + + + +

CLI tools and parameters

The following tools parameters have been + deprecated, removed, or are not supported. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3. Deprecated tools
ToolDescriptionDeprecated versionUnsupported version
cbadm-online-restoreRemoved2.02.0
cbadm-online-updateRemoved2.02.0
cbadm_tap-registrationRemoved2.02.0
cbbackup-incrementalRemoved2.02.0
cbbackup-merge-incrementalRemoved2.02.0
cbdbconvertRemoved2.02.0
cbdbmaintRemoved2.02.0
cbdbupgradeRemoved2.02.0
cbflushctlReplaced by cbepctl2.02.0
tap.py 1.81.8
cbclusterstatsReplaced by cbstats1.81.8.1
membaseReplaced by couchbase-cli1.81.8.1
mbadm-online-restoreReplaced by cbadm-online-restore1.81.8.1
mbadm-online-updateReplaced by cbadm-online-update1.81.8.1
mbadm-tap-registrationReplaced by cbadm_tap-registration1.81.8.1
mbbackup-incrementalReplaced by cbbackup-incremental1.81.8.1
mbbackup-merge-incrementalReplaced by cbbackup-merge-incremental1.81.8.1
mbbackupReplaced by cbbackup1.81.8.1
mbbrowse_logsReplaced by cbbrowse_logs1.81.8.1
mbcollect_infoReplaced by cbcollect_info1.81.8.1
mbdbconvertReplaced by cbdbconvert1.81.8.1
mbdbmaintReplaced by cbdbmaint1.81.8.1
mbdbupgradeReplaced by cbdbupgrade1.81.8.1
mbdumpconfig.escriptReplaced by cbdumpconfig.escript1.81.8.1
mbenable_core_dumps.shReplaced by cbenable_core_dumps.sh1.81.8.1
mbflushctlReplaced by cbflushctl1.81.8.1
mbrestoreReplaced by cbrestore1.81.8.1
mbstatsReplaced by cbstats1.81.8.1
mbupgradeReplaced by cbupgrade1.81.8.1
mbvbucketctlReplaced by cbbucketctl1.81.8.1
+
+ +

The following CLI parameters are deprecated.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 4. Deprecated CLI parameters
ToolParameter and optionDescriptionDeprecated versionUnsupported version
cbepctlflush_param flushall_enabledThe flushall_enabled parameter is deprecated.2.23.x
cbepctlflush_param klog_compactor_queue_capThe klog_compactor_queue_cap parameter is removed and unsupported.3.03.0
cbepctlflush_param klog_max_log_sizeThe klog_max_log_size parameter is removed and unsupported.3.03.0
cbepctlflush_param klog_max_entry_ratioThe klog_max_entry_ratio parameter is removed and unsupported.3.03.0
cbepctlflush_param max_txn_sizeThe max_txn_size parameter is removed and unsupported.3.03.0
cbepctlflush_param min_data_ageThe min_data_age parameter is removed and unsupported.3.03.0
cbepctlflush_param pager_unbiased_periodThe pager_unbiased_period parameter is removed and unsupported.3.03.0
cbepctlflush_param queue_age_capThe queue_age_cap parameter is removed and unsupported.3.03.0
cbstatsep_max_txn_sizeThe ep_max_txn_size parameter is deprecated.3.03.x
+
+ +
+ +

The following CLI tools are visible but not supported by Couchbase Technical Support. These + tools are for Couchbase internal use only.

+ +
    +
  • cbbrowse_logs
  • + +
  • cbdump-config
  • + +
  • cbenable_core_dumps.sh
  • + +
  • couch_compact
  • + +
  • couch_dbdump
  • + +
  • couch_dbinfo
  • + +
+ +
+ + + +

Miscellaneous

+

The following items are deprecated or not supported.

+ +
    +
  • The ep_expiry_window statistic is removed since it is no longer applicable.
  • + +
  • The _all_docs view is not supported. To recreate the features provided + by _all_docs, use the default view. For more information, see the Views + section.
  • + +
  • The include_docs parameter is not supported for Couchbase Server 3.0, + however, it being used in the Couchbase SDKs.
  • + +
  • RightScale Server non-Chef templates are deprecated as of Couchbase Server 2.2. + Couchbase provides RightScale Server templates based on Chef.
  • + +
  • The undocumented facility for enabling legacy memcached detailed stats through "stats + detail on" and "stats detail dump" is deprecated.
  • + +
+ + +
+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/faq.html b/preview/contents/Misc/faq.html new file mode 100644 index 0000000..0067881 --- /dev/null +++ b/preview/contents/Misc/faq.html @@ -0,0 +1,144 @@ +FAQ
+

FAQ

+ + +

よくある質問をまとめています。

+ + +
+ +
What clients do I use with Couchbase?
+ +
Couchbase Server is compatible with existing memcached clients. + If a memcached client already exists, just point it at couchbase. + Regular testing is done with spymemcached (Java client), libmemcached, and fauna (Ruby client).
+ + + +
What is a vBucket?
+ +
A vBucket is conceptually a computed subset of all possible mapping keys. vBuckets are + mapped to servers statically and have a consistent key through vBucket computations. The + number of vBuckets in a cluster remains constant regardless of server topology which means + that a key always maps to the same vBucket given the same hash.
+ + + +
What is a TAP stream?
+ +
A TAP stream is a when a client requests a stream of item updates from the + server. That is, as other clients are requesting item mutations (for example, + SET's and DELETE's), a TAP stream client can "wire-tap" the server to receive a + stream of item change notifications. + + When a TAP stream client starts its connection, it may also optionally request a + stream of all items stored in the server, even if no other clients are making + any item changes. On the TAP stream connection setup options, a TAP stream + client may request to receive just current items stored in the server (all items + until "now"), or all item changes from now onward into in the future, or both.
+ + + +
Which ports does Couchbase Server need?
+ +
See the Network ports section for up to date information.
+ + + +
What hardware and platforms does Couchbase Server support?
+ +
See the Supported platforms section for up to date information.
+ + + +
How can I get Couchbase on a different OS?
+ +
The Couchbase source code is quite portable and is known to have been built on + several other UNIX and Linux based OSs.
+ + + +
Can I query Couchbase by something other than the key name?
+ +
Not directly. It's possible to build these kinds of solutions atop TAP. For + instance, it is possible to stream out the data, process it with Cascading, then create + indexes in Elasticsearch. +
+ + + +
What is the maximum item size in Couchbase>
+ +
The default item size for Couchbase buckets is 20 MBytes. + The default item size for memcached buckets is 1 MByte.
+ + + +
How do I the change password?
+ +
With the command-line tool (CLI), use couchbase-cli cluster-init: +

+couchbase-cli cluster-init -c cluster_IP:8091
+  -u current_username-p current password
+  --cluster-init-username=new_username
+  --cluster-init-password=new_password         
+        
+ +
+ + + +
How do I change the per-node RAM quota?
+ +
With the command-line tool (CLI), use couchbase-cli: +

+couchbase-cli cluster-init -c cluster_IP:8091 
+  -u username-p password
+  --cluster-init-ramsize=RAM_in_M          
+        
+ +
+ + + +
How do I change the disk path? +
+ +
With the command-line tool (CLI), use node-init: +

+couchbase-cli node-init -c cluster_IP:8091 
+  -u username-p password--node-init-data-path=/tmp
+        
+ +
+ + + +
Why are some clients getting different results than others for the same + requests?
+ +
This should never happen in a correctly configured Couchbase cluster, since + Couchbase ensures a consistent view of all data in a cluster. + However, if some clients can't reach all the nodes in a cluster (due to firewall or routing + rules, for example), it is possible for the same key to end up on more than one + cluster node, resulting in inconsistent duplication. + Always ensure that all cluster nodes are reachable from every smart client or client-side moxi host.
+ + +
+ +
+ + + + + +
\ No newline at end of file diff --git a/preview/contents/Misc/install-location.html b/preview/contents/Misc/install-location.html new file mode 100644 index 0000000..587de64 --- /dev/null +++ b/preview/contents/Misc/install-location.html @@ -0,0 +1,60 @@ +インストールの場所
+

インストールの場所

+ + +

Couchbase Serverのデフォルトインストール先はオペレーティングシステムによって異なります。

+ +

デフォルトではCouchbase Serverは以下の場所にインストールされます:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
プラットフォームディレクトリ
Linux/opt/couchbase
WindowsC:\Program Files\Couchbase Server\
Mac OS X/Applications/Couchbase Server.app/Contents/Resources/couchbase-core/bin/
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/limits.html b/preview/contents/Misc/limits.html new file mode 100644 index 0000000..9134c9c --- /dev/null +++ b/preview/contents/Misc/limits.html @@ -0,0 +1,59 @@ +制限
+

制限

+ + + +

Couchbase Serverではサーバの利用や実装に影響のある制限がいくつかあります。

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
制限
最大データ長250 bytes
最大バリューサイズ20 MB
最大バケットサイズ無制限
クラスタあたりの最大バケット数 (デフォルト)10*
最大Viewキーサイズ4096 bytes
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Misc/sample-bucket-beer.html b/preview/contents/Misc/sample-bucket-beer.html new file mode 100644 index 0000000..8ec467b --- /dev/null +++ b/preview/contents/Misc/sample-bucket-beer.html @@ -0,0 +1,245 @@ +Beer sample bucket
+

Beer sample bucket

+ + +

The beer sample data shows a combination of document structure and sample views.

+ +

The beer sample data demonstrates a combination of the document structure used to describe + different items, including references between objects, and a number of sample + views that show the view structure and layout.

+ +

The primary document type is the ‘beer’ document:

+ +
{
+   "name": "Piranha Pale Ale",
+   "abv": 5.7,
+   "ibu": 0,
+   "srm": 0,
+   "upc": 0,
+   "type": "beer",
+   "brewery_id": "110f04166d",
+   "updated": "2010-07-22 20:00:20",
+   "description": "",
+   "style": "American-Style Pale Ale",
+   "category": "North American Ale"
+}
+
+ +

Beer documents contain core information about different beers, including the name, alcohol + by volume ( abv ) and categorization data.

+ +

Individual beer documents are related to brewery documents using the + brewery_id field, which holds the information about a specific brewery + for the beer:

+ +
{
+   "name": "Commonwealth Brewing #1",
+   "city": "Boston",
+   "state": "Massachusetts",
+   "code": "",
+   "country": "United States",
+   "phone": "",
+   "website": "",
+   "type": "brewery",
+   "updated": "2010-07-22 20:00:20",
+   "description": "",
+   "address": [
+   ],
+   "geo": {
+       "accuracy": "APPROXIMATE",
+       "lat": 42.3584,
+       "lng": -71.0598
+   }
+}
+
+ +

The brewery record includes basic contact and address information for the brewery, and + contains a spatial record consisting of the latitude and longitude of the brewery + location.

+ +

To demonstrate the view functionality in Couchbase Server, three views are defined.

+ +

brewery_beers view

The brewery_beers view outputs a + composite list of breweries and beers they brew by using the view output format to + create a ‘fake’ join. This outputs the brewery ID for brewery document types, and the brewery + ID and beer ID for beer document + types:

+
function(doc, meta) {
+  switch(doc.type) {
+  case "brewery":
+    emit([meta.id]);
+    break;
+  case "beer":
+    if (doc.brewery_id) {
+      emit([doc.brewery_id, meta.id]);
+    }
+    break;
+  }
+}
+
+

The + raw JSON output from the + view:

+
{
+   "total_rows" : 7315,
+   "rows" : [
+      {
+         "value" : null,
+         "id" : "110f0013c9",
+         "key" : [
+            "110f0013c9"
+         ]
+      },
+      {
+         "value" : null,
+         "id" : "110fdd305e",
+         "key" : [
+            "110f0013c9",
+            "110fdd305e"
+         ]
+      },
+      {
+         "value" : null,
+         "id" : "110fdd3d0b",
+         "key" : [
+            "110f0013c9",
+            "110fdd3d0b"
+         ]
+      },
+…
+      {
+         "value" : null,
+         "id" : "110fdd56ff",
+         "key" : [
+            "110f0013c9",
+            "110fdd56ff"
+         ]
+      },
+      {
+         "value" : null,
+         "id" : "110fe0aaa7",
+         "key" : [
+            "110f0013c9",
+            "110fe0aaa7"
+         ]
+      },
+      {
+         "value" : null,
+         "id" : "110f001bbe",
+         "key" : [
+            "110f001bbe"
+         ]
+      }
+   ]
+}
+
+

The + output could be combined with the corresponding brewery and beer data to provide a list + of the beers at each brewery.

+
+ +

by_location view

Outputs the brewery location, accounting for + missing fields in the source data. The output creates information either by country, by + country and state, or by country, state and + city.

+
function (doc, meta) {
+  if (doc.country, doc.state, doc.city) {
+    emit([doc.country, doc.state, doc.city], 1);
+  } else if (doc.country, doc.state) {
+    emit([doc.country, doc.state], 1);
+  } else if (doc.country) {
+    emit([doc.country], 1);
+  }
+}
+
+

The + view also includes the built-in _count function for the reduce portion + of the view. Without using the reduce, the information outputs the raw location + information:

+
{
+   "total_rows" : 1413,
+   "rows" : [
+      {
+         "value" : 1,
+         "id" : "110f0b267e",
+         "key" : [
+            "Argentina",
+            "",
+            "Mendoza"
+         ]
+      },
+      {
+         "value" : 1,
+         "id" : "110f035200",
+         "key" : [
+            "Argentina",
+            "Buenos Aires",
+            "San Martin"
+         ]
+      },
+…
+      {
+         "value" : 1,
+         "id" : "110f2701b3",
+         "key" : [
+            "Australia",
+            "New South Wales",
+            "Sydney"
+         ]
+      },
+      {
+         "value" : 1,
+         "id" : "110f21eea3",
+         "key" : [
+            "Australia",
+            "NSW",
+            "Picton"
+         ]
+      },
+      {
+         "value" : 1,
+         "id" : "110f117f97",
+         "key" : [
+            "Australia",
+            "Queensland",
+            "Sanctuary Cove"
+         ]
+      }
+   ]
+}
+
+

With + the reduce() enabled, grouping can be used to report the number of + breweries by the country, state, or city. For example, using a grouping level of two, + the information outputs the country and state + counts:

+
{"rows":[
+{"key":["Argentina",""],"value":1},
+{"key":["Argentina","Buenos Aires"],"value":1},
+{"key":["Aruba"],"value":1},
+{"key":["Australia"],"value":1},
+{"key":["Australia","New South Wales"],"value":4},
+{"key":["Australia","NSW"],"value":1},
+{"key":["Australia","Queensland"],"value":1},
+{"key":["Australia","South Australia"],"value":2},
+{"key":["Australia","Victoria"],"value":2},
+{"key":["Australia","WA"],"value":1}
+]
+}
+
+
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Misc/sample-bucket-game.html b/preview/contents/Misc/sample-bucket-game.html new file mode 100644 index 0000000..60008f9 --- /dev/null +++ b/preview/contents/Misc/sample-bucket-game.html @@ -0,0 +1,186 @@ +Game Simulation sample bucket
+

Game Simulation sample bucket

+ + +

The Game Simulation sample bucket shows a gaming application.

+ +

The Game Simulation sample bucket is designed to showcase a typical gaming application that + combines records showing individual gamers, game objects and how this information can be + merged together and then reported on using views.

+ +

For example, a typical game player record looks like the one below:

+ +
{
+    "experience": 14248,
+    "hitpoints": 23832,
+    "jsonType": "player",
+    "level": 141,
+    "loggedIn": true,
+    "name": "Aaron1",
+    "uuid": "78edf902-7dd2-49a4-99b4-1c94ee286a33"
+}
+
+ +

A game object, in this case an Axe, is shown below:

+ +
{
+   "jsonType" : "item",
+   "name" : "Axe_14e3ad7b-8469-444e-8057-ac5aefcdf89e",
+   "ownerId" : "Benjamin2",
+   "uuid" : "14e3ad7b-8469-444e-8057-ac5aefcdf89e"
+}
+
+ +

In this example, you can see how the game object has been connected to an individual user + through the ownerId field of the item JSON.

+ +

Monsters within the game are similarly defined through another JSON object type:

+ +
{
+    "experienceWhenKilled": 91,
+    "hitpoints": 3990,
+    "itemProbability": 0.19239324085462631,
+    "jsonType": "monster",
+    "name": "Wild-man9",
+    "uuid": "f72b98c2-e84b-4b17-9e2a-bcec52b0ce1c"
+}
+
+ +

For each of the three records, the jsonType field is used to define the + type of the object being stored.

+ +

leaderboard view

The leaderboard view is designed + to generate a list of the players and their current + score:

+
function (doc) {
+  if (doc.jsonType == "player") {
+  emit(doc.experience, null);
+  }
+}
+
+

The + view looks for records with a jsonType of “player”, and then outputs + the experience field of each player record. Because the output from + views is naturally sorted by the key value, the output of the view will be a sorted list + of the players by their score. For + example:

+
{
+   "total_rows" : 81,
+   "rows" : [
+      {
+         "value" : null,
+         "id" : "Bob0",
+         "key" : 1
+      },
+      {
+         "value" : null,
+         "id" : "Dustin2",
+         "key" : 1
+      },
+…
+      {
+         "value" : null,
+         "id" : "Frank0",
+         "key" : 26
+      }
+   ]
+}
+
+

To + get the top 10 highest scores (and ergo players), you can send a request that reverses + the sort order (by using descending=true, for + example:

+
http://127.0.0.1:8092/gamesim-sample/_design/dev_players/_view/leaderboard?descending=true&connection_timeout=60000&limit=10&skip=0
+
+

Which + generates the + following:

+
{
+   "total_rows" : 81,
+   "rows" : [
+      {
+         "value" : null,
+         "id" : "Tony0",
+         "key" : 23308
+      },
+      {
+         "value" : null,
+         "id" : "Sharon0",
+         "key" : 20241
+      },
+      {
+         "value" : null,
+         "id" : "Damien0",
+         "key" : 20190
+      },
+…
+      {
+         "value" : null,
+         "id" : "Srini0",
+         "key" :9
+      },
+      {
+         "value" : null,
+         "id" : "Aliaksey1",
+         "key" : 17263
+      }
+   ]
+}
+
+
+ +

playerlist view

The playerlist view creates a list + of all the players by using a map function that looks for “player” + records.

+
function (doc, meta) {
+  if (doc.jsonType == "player") {
+    emit(meta.id, null);
+  }
+}
+
+

This + outputs a list of players in the + format:

+
{
+   "total_rows" : 81,
+   "rows" : [
+      {
+         "value" : null,
+         "id" : "Aaron0",
+         "key" : "Aaron0"
+      },
+      {
+         "value" : null,
+         "id" : "Aaron1",
+         "key" : "Aaron1"
+      },
+      {
+         "value" : null,
+         "id" : "Aaron2",
+         "key" : "Aaron2"
+      },
+      {
+         "value" : null,
+         "id" : "Aliaksey0",
+         "key" : "Aliaksey0"
+      },
+      {
+         "value" : null,
+         "id" : "Aliaksey1",
+         "key" : "Aliaksey1"
+      }
+   ]
+}
+
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/sample-bucket-intro.html b/preview/contents/Misc/sample-bucket-intro.html new file mode 100644 index 0000000..1356dd3 --- /dev/null +++ b/preview/contents/Misc/sample-bucket-intro.html @@ -0,0 +1,25 @@ +Sample buckets
+

Sample buckets

+ + +

Couchbase provides sample buckets in order to become familiar with the Couchbase Server.

+ +

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Misc/start-stop-couchbase.html b/preview/contents/Misc/start-stop-couchbase.html new file mode 100644 index 0000000..828007a --- /dev/null +++ b/preview/contents/Misc/start-stop-couchbase.html @@ -0,0 +1,118 @@ +Couchbase Serverの起動と停止
+

Couchbase Serverの起動と停止

+ + +

Couchbase ServerをLinux(RHELとUbuntu)、Windows、Macで起動および停止するコマンドの一覧です。

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Couchbase Serverの起動と停止
OS(Operating System)起動停止
Linux +
sudo /etc/init.d/couchbase-server start
+ +
+
sudo /etc/init.d/couchbase-server stop
+ +
Windows +
net start CouchbaseServer
+ +
+
net stop CouchbaseServer
+ +
  +
C:\Program Files\Couchbase\Server\bin\service_start.bat
+ +
+
C:\Program Files\Couchbase\Server\bin\service_stop.bat
+ +
 Windows Task Manager > Services > CouchbaseServer service + (right-click) > Start Windows Task Manager > Services > CouchbaseServer service + (right-click) > Stop
 Start > Run > type Services.msc > CouchbaseServer service + (right-click) > StartStart > Run > type Services.msc > CouchbaseServer service + (right-click) > Stop
MacCouchbaseアプリケーションをダブルクリックCouchbaseアプリケーションからQuit Couchbase Serverを選択
+
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Monitoring/monitor-diskqueue.html b/preview/contents/Monitoring/monitor-diskqueue.html new file mode 100644 index 0000000..8c43999 --- /dev/null +++ b/preview/contents/Monitoring/monitor-diskqueue.html @@ -0,0 +1,64 @@ +Disk write queue
+

Disk write queue

+ + +

Disk writing is implemented as a 2-queue system: commit to DRAM and then queued to be written to disk

+ +

Couchbase Server is a persistent database which means that part of monitoring the system is + understanding how we interact with the disk subsystem.

+ +

Since Couchbase Server is an asynchronous system, any mutation operation is committed first + to DRAM and then queued to be written to disk. The client is returned an acknowledgment almost + immediately so that it can continue working. There is replication involved here too, but we’re + ignoring it for the purposes of this discussion.

+ +

Disk writing is implemented as a 2-queue system and are tracked by the stats. The + first queue is where mutations are immediately placed. Whenever there are items in that queue, + our “flusher” (disk writer) comes along and takes all the items off of that queue, places them + into the other one and begins writing to disk. Since disk performance is so dramatically + different from RAM, new writes can be continuously accepted while the system is (possibly + slowly) writing new ones to the disk.

+ +

The flusher will process 250k items at a time, then perform a disk commit and continue this + cycle until its queue is drained. When it has completed everything in its queue, it will + either grab the next group from the first queue or essentially sleep until there are more + items to write.

+ + +

Monitoring the disk write queue

+

There are basically two ways to + monitor the disk queue, at a high-level from the Web UI or at a low-level from the + individual node statistics.

+ +
    +
  1. From the Web UI, click on Monitor Data Buckets and select the particular bucket that you + want to monitor.
  2. + +
  3. Click “Configure View” in the top right corner and select the “Disk Write Queue” + statistic. Closing this window shows that there is a new mini-graph.
  4. + +
+ +

This graph is showing the Disk Write Queue for all nodes in the cluster. + To get a deeper view into this statistic, monitor each node individually using the ‘stats’ output. + The statistics to watch are ep_queue_size (where new mutations are placed) and flusher_todo + (the queue of items currently being written to disk).

+
+ +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Monitoring/monitor-intro.html b/preview/contents/Monitoring/monitor-intro.html new file mode 100644 index 0000000..172940a --- /dev/null +++ b/preview/contents/Monitoring/monitor-intro.html @@ -0,0 +1,36 @@ +モニタリング
+

モニタリング

+ + + +

プロセス、ポート、キューなど、Couchbase Serverをモニタリングするためのさまざまな方法があります。

+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Monitoring/monitor-moxi-statistics.html b/preview/contents/Monitoring/monitor-moxi-statistics.html new file mode 100644 index 0000000..820e20a --- /dev/null +++ b/preview/contents/Monitoring/monitor-moxi-statistics.html @@ -0,0 +1,88 @@ +Couchbase Server Moxi statistics
+

Couchbase Server Moxi statistics

+ + +

Regular memcached clients can request statistics through the memcached stats command.

+ +

Moxi, as part of it’s support of memcached protocol, has support for the memcached + stats command. The stats command accepts optional arguments, and in the case of + Moxi, there is a stats proxy sub-command. A detailed description of statistics available + through Moxi can be found in the Moxi 1.8 Manual.

+ +

For example, one simple client one may use is the commonly available netcat (output elided + with ellipses):

+ +
$ echo "stats proxy" | nc localhost 11211
+STAT basic:version 1.6.0
+STAT basic:nthreads 5
+…
+STAT proxy_main:conf_type dynamic
+STAT proxy_main:behavior:cycle 0
+STAT proxy_main:behavior:downstream_max 4
+STAT proxy_main:behavior:downstream_conn_max 0
+STAT proxy_main:behavior:downstream_weight 0
+…
+STAT proxy_main:stats:stat_configs 1
+STAT proxy_main:stats:stat_config_fails 0
+STAT proxy_main:stats:stat_proxy_starts 2
+STAT proxy_main:stats:stat_proxy_start_fails 0
+STAT proxy_main:stats:stat_proxy_existings 0
+STAT proxy_main:stats:stat_proxy_shutdowns 0
+STAT 11211:default:info:port 11211
+STAT 11211:default:info:name default
+…
+STAT 11211:default:behavior:downstream_protocol 8
+STAT 11211:default:behavior:downstream_timeout 0
+STAT 11211:default:behavior:wait_queue_timeout 0
+STAT 11211:default:behavior:time_stats 0
+STAT 11211:default:behavior:connect_max_errors 0
+STAT 11211:default:behavior:connect_retry_interval 0
+STAT 11211:default:behavior:front_cache_max 200
+STAT 11211:default:behavior:front_cache_lifespan 0
+STAT 11211:default:behavior:front_cache_spec
+STAT 11211:default:behavior:front_cache_unspec
+STAT 11211:default:behavior:key_stats_max
+STAT 11211:default:behavior:key_stats_lifespan 0
+STAT 11211:default:behavior:key_stats_spec
+STAT 11211:default:behavior:key_stats_unspec
+STAT 11211:default:behavior:optimize_set
+STAT 11211:default:behavior:usr default
+…
+STAT 11211:default:pstd_stats:num_upstream 1
+STAT 11211:default:pstd_stats:tot_upstream 2
+STAT 11211:default:pstd_stats:num_downstream_conn 1
+STAT 11211:default:pstd_stats:tot_downstream_conn 1
+STAT 11211:default:pstd_stats:tot_downstream_conn_acquired 1
+STAT 11211:default:pstd_stats:tot_downstream_conn_released 1
+STAT 11211:default:pstd_stats:tot_downstream_released 2
+STAT 11211:default:pstd_stats:tot_downstream_reserved 1
+STAT 11211:default:pstd_stats:tot_downstream_reserved_time 0
+STAT 11211:default:pstd_stats:max_downstream_reserved_time 0
+STAT 11211:default:pstd_stats:tot_downstream_freed 0
+STAT 11211:default:pstd_stats:tot_downstream_quit_server 0
+STAT 11211:default:pstd_stats:tot_downstream_max_reached 0
+STAT 11211:default:pstd_stats:tot_downstream_create_failed 0
+STAT 11211:default:pstd_stats:tot_downstream_connect 1
+STAT 11211:default:pstd_stats:tot_downstream_connect_failed 0
+STAT 11211:default:pstd_stats:tot_downstream_connect_timeout 0
+STAT 11211:default:pstd_stats:tot_downstream_connect_interval 0
+STAT 11211:default:pstd_stats:tot_downstream_connect_max_reached 0
+…
+END
+
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Monitoring/monitor-port-access.html b/preview/contents/Monitoring/monitor-port-access.html new file mode 100644 index 0000000..6c091d5 --- /dev/null +++ b/preview/contents/Monitoring/monitor-port-access.html @@ -0,0 +1,40 @@ +Port numbers and accessing different buckets
+

Port numbers and accessing different buckets

+ +
+

In a Couchbase Server cluster, any communication (stats or data) to a port other than + 11210 will result in the request going through a Moxi process. This means that any stats + request will be aggregated across the cluster (and may produce some inconsistencies or + confusion when looking at stats that are not “aggregatable”).

+ +

In general, it is best to run all your stat commands against port 11210 which will always + give you the information for the specific node that you are sending the request to. It is a + best practice to then aggregate the relevant data across nodes at a higher level (in your own + script or monitoring system).

+ +

When you run the below commands (and all stats commands) without supplying a bucket name + and/or password, they will return results for the default bucket and produce an error if one + does not exist.

+ +

To access a bucket other than the default, you will need to supply the bucket name and + password on the end of the command. Any bucket created on a dedicated port does not require a + password.

+ +

The TCP/IP port allocation on Windows by default includes a restricted number of ports + available for client communication.

+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Monitoring/monitor-rebalance.html b/preview/contents/Monitoring/monitor-rebalance.html new file mode 100644 index 0000000..52e490e --- /dev/null +++ b/preview/contents/Monitoring/monitor-rebalance.html @@ -0,0 +1,105 @@ +Monitoring a rebalance operation
+

Monitoring a rebalance operation

+ + +

Monitoring of the system during and + immediately after rebalancing is needed until replication is completed + successfully.

+ +

As Couchbase Server + moves vBuckets within the cluster, Couchbase Web Console provides a detailed rebalancing report. You can view the same + statistics via a REST API call. If you click on the drop-down list next to each node, you can view the + detailed rebalance status:

+ + +
+ + + +

The section Data being transferred out shows that a + node sends data to other nodes during rebalance.

+ +

The section Data being transferred in shows that a node receives data from other nodes during rebalance.

+ +

A node can be a source, a destination, or both the source and the destination for data. The progress report + displays the following information:

+ + +
    +
  • Bucket: Name of bucket undergoing rebalance. Number of buckets transferred during + rebalancing out of total buckets in a cluster.
  • + +
  • Total number of keys: Total number of keys to be transferred during + rebalancing.
  • + +
  • Estimated number of keys: Number of keys transferred during rebalancing.
  • + +
  • Number of Active# vBuckets and Replica# vBuckets: Number of active vBuckets and + replica vBuckets to be transferred as part of rebalancing.
  • + +
+ + +

You can also use cbstats to see underlying rebalance statistics.

+ + +

Backfilling

+

The first stage of replication reads all data for a given active vBucket and sends it to + the server that is responsible for the replica. This can put increased load on the disk as + well as network bandwidth, but it is not designed to impact any client activity. You can + monitor the progress of this task by watching for ongoing TAP disk fetches. You can also + watch cbstats tap, for example:

+ + +
cbstats <node_IP>:11210 -b bucket_name -p bucket_password tap | grep backfill
+ + +

This returns a list of TAP backfill processes and whether they are still running (true) or done + (false). During the backfill process for a particular TAP stream, the output is as + follows:

+
eq_tapq:replication_building_485_'n_1@127.0.0.1':backfill_completed: false
+ eq_tapq:replication_building_485_'n_1@127.0.0.1':backfill_start_timestamp: 1371675343
+ eq_tapq:replication_building_485_'n_1@127.0.0.1':flags: 85 (ack,backfill,vblist,checkpoints)
+ eq_tapq:replication_building_485_'n_1@127.0.0.1':pending_backfill: true
+ eq_tapq:replication_building_485_'n_1@127.0.0.1':pending_disk_backfill: true
+ eq_tapq:replication_building_485_'n_1@127.0.0.1':queue_backfillremaining: 202
+

When + all have completed, you should see the Total Item count ( curr_items_tot ) be + equal to the number of active items multiplied by replica count. The output you see for a TAP + stream after backfill completes is as + follows:

+
eq_tapq:replication_building_485_'n_1@127.0.0.1':backfill_completed: true
+ eq_tapq:replication_building_485_'n_1@127.0.0.1':backfill_start_timestamp: 1371675343
+ eq_tapq:replication_building_485_'n_1@127.0.0.1':flags: 85 (ack,backfill,vblist,checkpoints)
+ eq_tapq:replication_building_485_'n_1@127.0.0.1':pending_backfill: false
+ eq_tapq:replication_building_485_'n_1@127.0.0.1':pending_disk_backfill: false
+ eq_tapq:replication_building_485_'n_1@127.0.0.1':queue_backfillremaining: 0
+

If + you are continuously adding data to the system, these values may not correspond exactly at a + given instant in time. However you should be able to determine whether there is a significant + difference between the two figures.

+
+ + +

Draining

After the backfill process is complete, all nodes that had replicas materialized on them + have to persist these items to disk. It is important to continue monitoring the disk + write queue and memory usage until the rebalancing operation has been completed, to ensure that + the cluster is able to keep up with the write load and required disk I/O.

+
+ + +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Monitoring/monitor-statistics.html b/preview/contents/Monitoring/monitor-statistics.html new file mode 100644 index 0000000..91b42cf --- /dev/null +++ b/preview/contents/Monitoring/monitor-statistics.html @@ -0,0 +1,152 @@ +Couchbase Server statistics
+

Couchbase Server statistics

+ + +

Couchbase Server provides statistics at multiple levels throughout the cluster.

+ +

The statistics + used for regular monitoring, capacity planning and to identify the performance characteristics + of your cluster deployment. The most visible statistics are those in the Web UI, but + components such as the REST interface, the proxy and individual nodes have directly accessible + statistics interfaces.

+ +

REST interface statistics

To interact with statistics provided by + REST, use the Couchbase web console. + This GUI gathers statistics via REST and displays them to your browser. + The REST interface has a set of resources that provide access to the current and historic + statistics the cluster gathers and stores.

+
+ + +

Couchbase Server node statistics

Detailed stats documentation can be found in the + repository.

+

Along with stats at the REST and UI level, individual nodes can also be + queried for statistics either through a client which uses binary protocol or through the + cbstats utility.

+

For + example:

+
> cbstats localhost:11210 all
+ auth_cmds:                   9
+ auth_errors:                 0
+ bucket_conns:                10
+ bytes_read:                  246378222
+ bytes_written:               289715944
+ cas_badval:                  0
+ cas_hits:                    0
+ cas_misses:                  0
+ cmd_flush:                   0
+ cmd_get:                     134250
+ cmd_set:                     115750
+…
+
+

The + most commonly needed statistics are surfaced through the Web Console and have descriptions + there and in the associated documentation. Software developers and system administrators + wanting lower level information have it available through the stats interface.

+

There + are seven commands available through the stats interface:

+
    +
  • stats (referred to as ‘all’)

    +
  • + +
  • dispatcher

    +
  • + +
  • hash

    +
  • + +
  • tap

    +
  • + +
  • timings

    +
  • + +
  • vkey

    +
  • + +
  • reset

    +
  • + +
+
+ +

stats command

This displays a large list of statistics related to the + Couchbase process including the underlying engine (ep_* stats).

+
+ +

dispatcher command

This statistic shows what the dispatcher is + currently + doing:

+
dispatcher
+     runtime: 45ms
+       state: dispatcher_running
+      status: running
+        task: Running a flusher loop.
+nio_dispatcher
+       state: dispatcher_running
+      status: idle
+
+

The + first entry, dispatcher, monitors the process responsible for disk access. The second entry + is a non-IO (non disk) dispatcher. There may also be a ro_dispatcher present if + the engine is allowing concurrent reads and writes. When a task is actually running on a + given dispatcher, the “runtime” tells you how long the current task has been running. Newer + versions will show you a log of recently run dispatcher jobs so you can see what’s been + happening.

+
+ + +

Changing statistics collection

+

The default Couchbase Server statistics + collection is set to collect every second. The tuning that is available for statistic + collection is by collecting statistics less frequently.

+ +
Note: If statistic + collection is changed from the default, the Couchbase service must be restarted.
+ + +

To change statistic collection:

+
    +
  1. Log in as root or sudo and navigate to the directory where Couchbase is installed. For + example: /opt/couchbase/etc/couchbase/static_config
  2. + +
  3. Edit the static_config file.
  4. + +
  5. Add the following parameter: grab_stats_every_n_ticks, 10, where 10 is the number of + ticks. In the Couchbase environment one tick is one second (default). It is recommended + that the statistics collection be more frequent (and accurate). However, assign an + appropriate tick value for you environment.
  6. + +
  7. Restart the Couchbase service.
  8. + +
+

After restarting the Couchbase service, the statistics collection rate is changed.

+
+ + +

Changing the stats file location

The default stats + file location is /opt/couchbase/var/lib/couchbase/stats, however, if you + want to change the default stats file location, create a symlink location to the new + directory.

+ +
Note: When creating a symlink, stop and restart the Couchbase + service.
+
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Monitoring/monitor-underlying-processes.html b/preview/contents/Monitoring/monitor-underlying-processes.html new file mode 100644 index 0000000..aa3f062 --- /dev/null +++ b/preview/contents/Monitoring/monitor-underlying-processes.html @@ -0,0 +1,56 @@ +Underlying server processes
+

Underlying server processes

+ + +

There are several server processes that constantly run in Couchbase Server.

+ +

These processes occur whether + or not the server is actively handling reads/writes or handling other operations from a client + application. Right after you start up a node, you may notice a spike in CPU utilization, and + the utilization rate will plateau at some level greater than zero. The following describes the + ongoing processes that are running on your node:

+ +
    +
  • beam.smp on Linux: erl.exe on Windows
  • + +
+ +

These processes are responsible for monitoring and managing all other underlying server + processes such as ongoing XDCR replications, cluster operations, and views.

+ +

There is a separate monitoring/babysitting process running on each node. The process is small + and simple and therefore unlikely to crash due to lack of memory. It is responsible for + spawning and monitoring the second, larger process for cluster management, XDCR and views. It + also spawns and monitors the processes for Moxi and memcached. If any of these three processes + fail, the monitoring process will re-spawn them.

+ +

The main benefit of this approach is that an Erlang VM crash will not cause the Moxi and + memcached processes to also crash. You will also see two beam.smp or + erl.exe processes running on Linux or Windows respectively.

+ +

The set of log files for this monitoring process is ns_server.babysitter.log + which you can collect with cbcollect_info.

+ +
    +
  • memcached : This process is responsible for caching items in RAM and persisting + them to disk.
  • + +
  • moxi : This process enables third-party memcached clients to connect to the + server.
  • + +
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Monitoring/monitor-warmup.html b/preview/contents/Monitoring/monitor-warmup.html new file mode 100644 index 0000000..d9ad211 --- /dev/null +++ b/preview/contents/Monitoring/monitor-warmup.html @@ -0,0 +1,63 @@ +Monitoring startup (warmup)
+

Monitoring startup (warmup)

+ +
+

If a Couchbase Server node is starting up for the first time, it creates whatever DB + files necessary and begin serving data immediately. However, if there is already data on + disk (likely because the node rebooted or the service restarted) the node needs to read + all of this data off of disk before it can begin serving data. This is called “warmup”. + Depending on the size of data, this can take some time.

+ +

When starting up a node, there are a few statistics to monitor. Use the + cbstats command to watch the warmup stats:

+ +
cbstats localhost:11210 warmup
+ +

The following statistics are of particular interest when monitoring the warmup.

+ +
+ +
ep_warmup_thread
+ +
This is the overall indication of whether or not warmup is still running. Look for values: running and complete.
+ + + +
ep_warmup_state
+ +
This describes which phase of warmup is currently running. Look for values: loading keys, + loading access log, and done. +
+ + +
+ + +
    +
  • When ep_warmup_state is loading keys, compare + ep_warmup_key_count (current number) with + ep_warmup_estimated_key_count (target number).
  • + +
  • When ep_warmup_state is loading access log, compare + ep_warmup_value_count (current number) with + ep_warmup_estimated_value_count (target + number).
  • + +
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/REST/compaction-rest-api.html b/preview/contents/REST/compaction-rest-api.html new file mode 100644 index 0000000..b09e008 --- /dev/null +++ b/preview/contents/REST/compaction-rest-api.html @@ -0,0 +1,309 @@ +Compaction API
+

Compaction API

+ + +

Compaction is used to reclaim disk space and reduce disk fragmentation.

+ + +

Description

+

Couchbase Server writes all data that you append, update and delete as files on disk. The + compaction process can eventually lead to gaps in the data file, particularly when + you delete data. Be aware the server also writes index files in a sequential format + based on appending new results in the index. You can reclaim the empty gaps in all + data files by performing a process called compaction. For both data files and index + files, perform frequent compaction of the files on disk to help reclaim disk space + and reduce disk fragmentation.

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Compaction endpoints
HTTP methodURI pathDescription
POST /pools/default/buckets/[bucket_name]/controller/compactBucketCompacts bucket data and indexes.
POST/pools/default/buckets/[bucket_name]/controller/cancelBucketCompactionCancels compaction for the specified bucket.
POST/[bucket_name]/_design/[ddoc_name]/_spatial/_compactCompacts a spatial view.
+
+ + +
+ + + + + + + +

Auto-compaction description

Auto-compaction parameters are configured to trigger data and view compaction. These parameters + can be specified for an entire cluster (cluster-wide) or for a specific bucket in a cluster.

+ + +
Note: Administrative credentials are required to change these settings.
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Auto-compaction endpoints
HTTP methodURI pathDescription
POST /controller/setAutoCompactionSets cluster-wide auto-compaction intervals and + thresholds
GET /settings/autoCompactionRetrieves cluster-wide settings for auto-compaction
GET /pools/default/buckets/[bucket_name]Retrieves auto-compaction settings for named bucket
POST/pools/default/buckets/[bucket_name]Sets auto-compaction interval or thresholds for named + bucket
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3. Auto-compaction parameters
ParameterValueNotes
databaseFragmentationThreshold: percentageInteger between 2 and 100Percentage disk fragmentation for data
databaseFragmentationThreshold: sizeInteger greater than 1Bytes of disk fragmentation for data
viewFragmentationThreshold: percentageInteger between 2 and 100Percentage disk fragmentation for index
viewFragmentationThreshold: sizeInteger greater than 1Bytes of disk fragmentation for index
parallelDBAndViewCompactionTrue or false. Run index and data compaction in parallel. Global setting only.
allowedTimePeriod: abortOutsideTrue or falseTerminate compaction if the process takes longer than the allowed time
allowedTimePeriod: fromHourInteger between 0 and 23Compaction can occur from this hour onward
allowedTimePeriod: fromMinuteInteger between 0 and 59Compaction can occur from this minute onward
allowedTimePeriod: toHourInteger between 0 and 23Compaction can occur up to this hour
allowedTimePeriod: toMinuteInteger between 0 and 59Compaction can occur up to this minute
purgeIntervalInteger between 1 and 60Number of days a item is deleted or expired. The key and metadata for that item is + purged by auto-compaction
+
+ + +
Note: The purge interval parameter removes the key and metadata for items that have been deleted or are expired. + This is known as tombstone purging.
+ + + + +
+ + + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/REST/logs-rest-api.html b/preview/contents/REST/logs-rest-api.html new file mode 100644 index 0000000..810b39f --- /dev/null +++ b/preview/contents/REST/logs-rest-api.html @@ -0,0 +1,131 @@ +Logs API
+

Logs API

+ + +

+ Logs REST APIはログや診断情報を取得するためのREST APIのエンドポイントを提供し、SDKからログにエントリをすることもできます。 +

+ +

説明

+ + +

+ Couchbase Server様々なメッセージをログに残します。それらはREST APIを介して利用できます。 + これらのログメッセージは必要に応じてモジュールによって分類されています。 + 一般的なログ項目の一覧もしくは特定カテゴリのログ項目を取得することが出来ます。 +

+ + +
注: + システムが保護されている場合、管理者権限でログへアクセス出来る必要があります。 +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. Log エンドポイント
HTTPメソッドURIパス説明
GET/diagログに加え、サーバの診断状況を取得します。
GET/sasl_logs一般的なログ情報の一覧を取得します。
GET/sasl_logs/[log_name]特定のログカテゴリから情報を取得します。log_nameは下記のログタイプからひとつ選択します:
    +
  • babysitter
  • + +
  • couchdb
  • + +
  • debug
  • + +
  • error
  • + +
  • info
  • + +
  • mapreduce_errors
  • + +
  • ssl_proxy
  • + +
  • stats
  • + +
  • view
  • + +
  • xdcr
  • + +
  • xdcr_errors
  • + +
+
POST/logClientErrorカスタムCouchbase SDKからセントラルログに追記します。
+
+ + + + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/overview-rest-api.html b/preview/contents/REST/overview-rest-api.html new file mode 100644 index 0000000..60417dd --- /dev/null +++ b/preview/contents/REST/overview-rest-api.html @@ -0,0 +1,399 @@ +REST API overview
+

REST API overview

+ + +

Use the REST API to manage clusters, server nodes, and buckets, and to retrieve run-time + statistics within a Couchbase Server deployment.

+ + +

Description

+ +

The REST API conforms to Representational State Transfer (REST) constraints, in other + words, the REST API follows a RESTful architecture. When developing a + Couchbase-compatible SDK, the REST API is used within your library to handle views. + Views enable you to index and query data based on functions that you define.

+ +
Tip: The REST API should not be used to read or write data to the + server. Data operations, such as set and get are + handled by Couchbase SDKs.
+ +

In addition, the Couchbase web console uses many of the same REST API endpoints that + are used for a REST API request. In particular, for administrative tasks such as + creating a new bucket, adding a node to a cluster, or changing cluster settings.

+ +

Please provide RESTful requests; you will not receive any handling instructions, + resource descriptions, nor should you presume any conventions for URI structure for + resources represented. The URIs in the REST API may have a specific URI or may even + appear as RPC or some other architectural style using HTTP operations and + semantics.

+ +

In other words, build your request starting from Couchbase cluster URIs. Be aware + that URIs for resources may change from version to version. The URI hierarchies + facilitate reuse of requests because they follow a similar pattern for accessing + different parts of the system.

+ +
+ + + +

Basic principles

+

The Couchbase Server REST API is built on the following basic principles:

+ +
    +
  • JSON Responses +

    The Couchbase Management REST API returns many responses as JavaScript Object Notation + (JSON). On that note, you may find it convenient to read responses in a JSON reader. + Some responses may have an empty body, but indicate the response with standard HTTP + codes. For more information, see RFC 4627 at www.json.org.

    +
  • + +
  • HTTP Basic Access Authentication +

    The Couchbase Management REST API uses HTTP basic authentication. + The browser-based Web Console and Command-line Interface also use HTTP basic authentication.

    +
  • + +
  • Versatile Server Nodes +

    All server nodes in a cluster share the same properties and can handle any requests made + via the REST API.; you can make a REST API request on any node in a cluster you want to + access. If the server node cannot service a request directly, due to lack of access to + state or some other information, it will forward the request to the appropriate server + node, retrieve the results, and send the results back to the client.

    +
  • + +
+ +
+ + + + +

Types of resources

+ +

There are a number of different resources + within the Couchbase Server and these resources require a different + URI/RESTful-endpoint in order to perform an operations:

+ + +
    +
  • Server nodes

    A Couchbase Server instance, also known as a server or server node, is a + physical or virtual machine running Couchbase Server. Each server node is as + a member of a cluster.

    +
  • + +
  • Cluster/Pool

    A cluster is a group of one or more servers and is a collection of physical + resources that are grouped together and provide services and a management + interface. A single default cluster exists for every deployment of Couchbase + Server. A server node, or instance of Couchbase Server, is a member of a + cluster. Couchbase Server collects run-time statistics for clusters, + maintaining an overall pool-level data view of counters and periodic metrics + of the overall system. The Couchbase Management REST API can be used to + retrieve historic statistics for a cluster.

    +
  • + +
  • Buckets

    A bucket is a logical grouping of data within a cluster. It provides a name space + for all the related data in an application; therefore you can use the same + key in two different buckets and they are treated as unique items by + Couchbase Server.

    +

    Couchbase Server collects run-time statistics for + buckets, maintaining an overall bucket-level data view of counters and + periodic metrics of the overall system. Buckets are categorized by storage + type. Memcached buckets are for in-memory, RAM-based information. Couchbase + buckets are for persisted data.

    +
  • + +
  • Views

    Views enable you to index and query data + based on logic you specify. You can also use views to perform calculations and + aggregations, such as statistics, for items in Couchbase Server.

    +
  • + +
  • Cross datacenter replication (XDCR)

    Cross Datacenter Replication (XDCR) enables automatic + replicate of data between clusters and between data buckets. The major + benefits include the ability to restore data from one Couchbase cluster to + another cluster after system failure and the ability to provide copies of + data on clusters that are physically closer to end users.

    +
  • + +
+ +
+ + + + + +

HTTP request headers

+

The following HTTP request headers are used to create requests:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HeaderSupported ValuesDescription of UseRequired
AcceptComma-delimited list of media types or media type + patterns.Indicates to the server what media type(s) this client is + prepared to accept.Recommended
AuthorizationBasic plus username and password (per RFC + 2617).Identifies the authorized user making this request.No, unless secured
Content-LengthBody Length (in bytes)Describes the size of the message body.Yes, on requests that contain a message body.
Content-TypeContent typeDescribes the representation and syntax of the request message + body.Yes, on requests that contain a message body.
HostOrigin host nameRequired to allow support of multiple origin hosts at a single IP + address.All requests
X-YYYYY-Client-Specification-VersionStringDeclares the specification version of the YYYYY API that this + client was programmed against.No
+
+ + +
+ + + +

HTTP response codes

+

The Couchbase Server returns one of the following HTTP status codes in response to REST API + requests:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HTTP responseDescription
200 OKSuccessful request and an HTTP response body returns. If this + creates a new resource with a URI, the 200 status will also have a + location header containing the canonical URI for the newly created + resource.
201 CreatedRequest to create a new resource is successful, but no HTTP + response body returns. The URI for the newly created resource + returns with the status code.
202 AcceptedThe request is accepted for processing, but processing is not + complete. Per HTTP/1.1, the response, if any, SHOULD include an + indication of the request’s current status, and either a pointer to + a status monitor or some estimate of when the request will be + fulfilled.
204 No ContentThe server fulfilled the request, but does not need to return a + response body.
400 Bad RequestThe request could not be processed because it contains missing or + invalid information, such as validation error on an input field, a + missing required value, and so on.
401 UnauthorizedThe credentials provided with this request are missing or + invalid.
403 ForbiddenThe server recognized the given credentials, but you do not + possess proper access to perform this request.
404 Not FoundURI provided in a request does not exist.
405 Method Not AllowedThe HTTP verb specified in the request (DELETE, GET, HEAD, POST, + PUT) is not supported for this URI.
406 Not AcceptableThe resource identified by this request cannot create a response + corresponding to one of the media types in the Accept header of the + request.
409 ConflictA create or update request could not be completed, because it + would cause a conflict in the current state of the resources + supported by the server. For example, an attempt to create a new + resource with a unique identifier already assigned to some existing + resource.
500 Internal Server ErrorThe server encountered an unexpected condition which prevented it + from fulfilling the request.
501 Not ImplementedThe server does not currently support the functionality required + to fulfill the request.
503 Service UnavailableThe server is currently unable to handle the request due to + temporary overloading or maintenance of the server.
+
+ +
+ +
+ + + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-autocompact-get.html b/preview/contents/REST/rest-autocompact-get.html new file mode 100644 index 0000000..2164fb2 --- /dev/null +++ b/preview/contents/REST/rest-autocompact-get.html @@ -0,0 +1,176 @@ +Getting auto-compaction settings
+

Getting auto-compaction settings

+ + +

Auto-compaction settings can be retrieved on a cluster-wide level or bucket level.

+ + + +

HTTP method and URI

+

Auto-compaction settings can be configured for all buckets on a cluster-wide basis or for a specific bucket on the bucket-level

+ + +

+// Cluster-wide
+GET /settings/autoCompaction
+
+// Bucket-level
+GET /pools/default/buckets/[bucket-name]
+      
+ +
+ + +

Cluster-wide syntax

+ +

To retrieve current auto-compaction settings for a cluster:

+ + +
curl -u [admin]:[password] http://[localhost]:8091/settings/autoCompaction
+
+

Replace + the admin, password, and localhost values in the above + example with your actual values.

+

This results in a JSON response as follows:

+ + +
+ + +

Cluster-wide example

+

The following example requests auto-compaction information on a cluster-wide level. + GET is not specified because it is the default HTTP method.

+ + +

+curl -u Administrator:password 
+  http://127.0.0.1:8091/settings/autoCompaction        
+      
+ + + + +
+ + +

Cluster-wide response

+ +

This example response shows a purgeInterval of three days and no current + thresholds set for data or index compaction. The field + parallelDBAndViewCompaction: false indicates that the cluster + will not perform data and index compaction in parallel.

+ + +

+{
+    "autoCompactionSettings": {
+        "databaseFragmentationThreshold": {
+            "percentage": undefined, 
+            "size": "undefined"
+        }, 
+        "parallelDBAndViewCompaction": false, 
+        "viewFragmentationThreshold": {
+            "percentage": undefined, 
+            "size": "undefined"
+        }
+    }, 
+    "purgeInterval": 3
+}
+
+ + + + +
+ + +

Bucket-level syntax

+ +

To see auto-compaction settings for a single bucket, use this request:

+ +
curl -u admin:password http://[localhost]:8091/pools/default/buckets/[bucket_name]
+
+ + +

Replace + the admin, password, localhost, and bucket_name + values in the above example with your actual values.

+ + +
+ + +

Bucket-level example

+ +

The following example requests auto-compaction information for the bucket, test2. + GET is not specified because it is the default HTTP method.

+ + + +

+curl -u Administrator:password 
+  http://10.5.2.117:8091/pools/default/buckets/test2
+      
+ + + +
+ + +

Bucket-level response

+ +
This example response shows the following: +
    +
  • A time interval set (from 1:00 am to 2:00 am) for when compaction can run.
  • + +
  • Abort enabled (true) if the run time exceeds the set time interval.
  • + +
  • Database and view fragmentation threshold set at 30%.
  • + +
  • A tombstone purge interval set to two (2) days>. + This means items can be expired for two days or + deleted two days ago and their tombstones will be purged during the next cluster-wide auto-compaction run.
  • + +
+
+ + +
 ...
+    "autoCompactionSettings": {
+        "allowedTimePeriod": {
+            "abortOutside": true, 
+            "fromHour": 1, 
+            "fromMinute": 0, 
+            "toHour": 2, 
+            "toMinute": 0
+        }, 
+        "databaseFragmentationThreshold": {
+            "percentage": 30, 
+            "size": "undefined"
+        }, 
+        "parallelDBAndViewCompaction": true, 
+        "viewFragmentationThreshold": {
+            "percentage": 30, 
+            "size": "undefined"
+        }
+    },  
+    ...    
+    "purgeInterval": 2,
+...
+ + + + +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-bucket-auth.html b/preview/contents/REST/rest-bucket-auth.html new file mode 100644 index 0000000..9ae5f63 --- /dev/null +++ b/preview/contents/REST/rest-bucket-auth.html @@ -0,0 +1,71 @@ +Changing bucket authentication
+

Changing bucket authentication

+ + +

To change bucket authentication use the POST + /pools/default/buckets/acache HTTP method and URI with the authType + parameter.

+ + +

Description

+

Changing a bucket from port-based authentication to SASL authentication is achieved by + changing the active bucket configuration.

+ +
Important: When changing the active bucket configuration, specify the existing + configuration parameters and the changed authentication parameters.
+ +
+ + +

HTTP method and URI

+
POST /pools/default/buckets/acache
+ + +

Parameter:

+ +
    +
  • authType - Values type includes sasl or none. Default: none
  • + +
+ +
+ + + +

Syntax

+

Curl request syntax:

+ +
curl -X POST -u [admin]:[password] 
+  -d authType=[none | sasl]
+  -d saslPassword=[password]
+  -d ramQuotaMB=[value]
+  http://[localhost]:8091/pools/default/buckets/acache
+ +
+ + + +

Example

+

Curl request example:

+ +
curl -X POST -u admin:password 
+  -d authType=sasl
+  -d saslPassword=letmein
+  -d ramQuotaMB=130 
+  http://10.5.2.54:8091/pools/default/buckets/acache
+      
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-bucket-create.html b/preview/contents/REST/rest-bucket-create.html new file mode 100644 index 0000000..26757fc --- /dev/null +++ b/preview/contents/REST/rest-bucket-create.html @@ -0,0 +1,327 @@ +Creating and editing buckets
+

Creating and editing buckets

+ + +

To create and edit buckets, use the POST operation with the + /pools/default/bucket URI. +

+ +

Description

+

Buckets are created and edited with a POST sent to the REST URI endpoint for buckets + in a cluster. This can be used to create either a Couchbase or a Memcached type bucket. + Bucket names cannot have a leading underscore.

+ + +

This endpoint is also used to get a list of buckets that exist for a cluster.

+ +
Important: When editing bucket properties, be sure to specify all bucket properties. + If a bucket property is not specified (whether or not you are changing the existing + value), Couchbase Server may reset the property to the default. Even if you do not + intend to change a certain property, re-specify the existing value to avoid this + behavior.
+ +

The REST API returns a successful response when preliminary files for a data bucket are created + on one node. However, if a multi-node cluster is implemented, bucket creation may not + have completed for all nodes when a response is sent. Therefore, it is possible that the + bucket is not available for operations immediately after this REST call successful + returns.

+ +

To verify that a bucket is available, try to read a key from the bucket. If a ‘key not found’ + error is received or the document for the key is returned, then the bucket exists and is + available to all nodes in a cluster. Key requests can be issued via a Couchbase SDK with + any node in the cluster. See the Couchbase Developer Guide for more + information.

+ +
+ + +

HTTP method and URI

+
POST /pools/default/buckets
+ + +
    +
  • Request data - List of payload parameters for the new bucket
  • + +
  • Response data - JSON of the bucket confirmation or an error condition
  • + +
  • Authentication required - Yes
  • + +
+ + + +

Parameters for creating buckets:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Create bucket parameters
Payload ArgumentsDescription
authTypeRequired parameter. Type of authorization to be enabled for the new + bucket as a string. Defaults to blank password if not specified. “sasl” + enables authentication. “none” disables authentication.
bucketTypeRequired parameter. Type of bucket to be created. String value. + “memcached” configures as Memcached bucket. “couchbase” configures as + Couchbase bucket
flushEnabledOptional parameter. Enables the ‘flush all’ functionality on the + specified bucket. Boolean. 1 enables flush all support, 0 disables flush + all support. Defaults to 0.
nameRequired parameter. Name for new bucket.
parallelDBAndViewCompactionOptional parameter. String value. Indicates whether database and view + files on disk can be compacted simultaneously. Defaults to + “false.”
proxyPortRequired parameter. Numeric. Proxy port on which the bucket + communicates. Must be a valid network port which is not already in use. + You must provide a valid port number if the authorization type is not + SASL.
ramQuotaMBRequired parameter. RAM Quota for new bucket in MB. Numeric. The + minimum you can specify is 100, and the maximum can only be as great as + the memory quota established for the node. If other buckets are + associated with a node, RAM Quota can only be as large as the amount + memory remaining for the node, accounting for the other bucket memory + quota.
replicaIndexOptional parameter. Boolean. 1 enable replica indexes for replica + bucket data while 0 disables. Default of 1.
replicaNumberOptional parameter. Numeric. Number of replicas to be configured for + this bucket. Required parameter when creating a Couchbase bucket. + Default 1, minimum 0, maximum 3.
saslPasswordOptional Parameter. String. Password for SASL authentication. + Required if SASL authentication has been enabled.
threadsNumberOptional Parameter. Integer from 2 to 8. Change the number of concurrent readers and + writers for the data bucket.
+
+ + +

When creating a bucket, the authType parameter must be provided:

+ +
    +
  • If authType is set to none, then a proxyPort number must be specified.

    +
  • + +
  • If authType is set to sasl, then the saslPassword parameter may optionally be specified.

    +
  • + +
+ +

The ramQuotaMB parameter specifies how much memory, in megabytes, is + allocate to each node for the bucket. The minimum supported value is 100MB.

+ +
    +
  • If the items stored in a memcached bucket take space beyond the + ramQuotaMB, Couchbase Sever typically evicts items on a + least-requested-item basis. Couchbase Server might evict other infrequently used + items depending on object size or on whether or not an item is being referenced.

    +
  • + +
  • In the case of Couchbase buckets, the system might return temporary failures if the + ramQuotaMB is reached. The system tries to keep 25% of + the available ramQuotaMB free for new items by ejecting old items from occupying + memory. In the event these items are later requested, they are retrieved + from disk.

    +
  • + +
+ +
+ + +

Syntax

+

Curl request syntax:

+ +
curl -X POST -u [admin]:[password] 
+	-d name=[new-bucket-name] -d ramQuotaMB=[value] -d authType=[none | sasl] \
+	-d replicaNumber=[value] -d proxyPort=[proxy-port] 
+	http://[localhost]:8091/pools/default/buckets
+			
+ + +
+ + +

Example

+ +

Curl request example:

+ +
curl -X POST -u admin:password 
+	-d name=newbucket -d ramQuotaMB=200 -d authType=none \
+	-d replicaNumber=2 -d proxyPort=11215 
+	http://10.5.2.54:8091/pools/default/buckets
+
+ +

Raw HTTP request example:

+ +

The parameters for configuring the bucket are provided as payload data. Each + parameter and value are provided as a key/value pair where each pair is separated by + an ampersand. Include the parameters setting in the payload of the HTTP + POST request.

+ +
POST /pools/default/buckets
+HTTP/1.1
+Host: 10.5.2.54:8091
+Content-Type: application/x-www-form-urlencoded; charset=UTF-8
+Authorization: Basic YWRtaW46YWRtaW4=
+Content-Length: xx
+name=newbucket&ramQuotaMB=20&authType=none&replicaNumber=2&proxyPort=11215
+
+ +
+ + +

Response

+

If the bucket creation was successful, HTTP response 202 (Accepted) is returned with + empty content.

+ +
202 Accepted
+ +
+ + +

Response codes

+ +

If the bucket could not be created, because the parameter was missing or incorrect, HTTP + response 400 returns, with a JSON payload containing the error reason.

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Create bucket error codes
Error codesDescription
202Accepted
204Bad Request JSON with errors in the form of {“errors”: {…. }} + name: Bucket with given name already exists ramQuotaMB: RAM Quota is + too large or too small replicaNumber: Must be specified and must be + a non-negative integer proxyPort: port is invalid, port is already + in use
404Object Not Found
+
+ + +
+ +
+ + + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-bucket-delete.html b/preview/contents/REST/rest-bucket-delete.html new file mode 100644 index 0000000..4a1bfd6 --- /dev/null +++ b/preview/contents/REST/rest-bucket-delete.html @@ -0,0 +1,185 @@ +Deleting buckets
+

Deleting buckets

+ + + +

To delete buckets, use the DELETE /pools/default/buckets/[bucket-name] + HTTP method and URI.

+ + +

Description

+

Bucket deletion is a synchronous operation. When a cluster has multiple servers, some servers + might not be able to delete the bucket within the standard 30 second timeout period.

+ +
    +
  • If the bucket is deleted on all servers within the standard timeout of 30 seconds, + a 200 response code is returned.
  • + +
  • If the bucket is not deleted on all servers within the 30 second timeout, + a 500 error code is returned.
  • + +
  • If the bucket is not deleted on all servers and another request is made to delete the bucket, + a 404 error code is returned.
  • + +
  • If the bucket is not deleted on all servers and a request is made to crate a new bucket with the same name, + an error might be returned indicating that the bucket is still being deleted.
  • + +
+ + +
Warning: This operation is data destructive. + The service makes no attempt to double check with the user. + It simply moves forward. + Clients applications performing the delete operation are advised to double + check with the end user before sending the request.
+ +
+ + +

HTTP method and URI

+ +
DELETE /pools/default/buckets/[bucket-name]
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Request dataNone
Response dataNone
Authentication requiredYes
+
+ + + + +
+ + +

Syntax

+

Curl request syntax:

+ +
curl -u [admin]:[password]
+http://[localhost]:8091//pools/default/buckets/[bucket-name]
+ + +

Raw HTTP request syntax:

+ +
DELETE /pools/default/buckets/[bucket-name]
+Host: [localhost]:8091
+Authorization: Basic xxxxxxxxxxxxxxxxxxx
+
+ +
+ + +

Example

+

Curl request example to delete the bucket named myTestBucket:

+ +
curl -u Administrator:password
+http://10.5.2.54:8091/pools/default/buckets/myTestBucket
+ + +

Raw HTTP request example to delete the bucket named myTestBucket:

+ +
DELETE /pools/default/buckets/myTestBucket
+Host: 10.5.2.54:8091
+Authorization: Basic xxxxxxxxxxxxxxxxxxx
+
+ +
+ + + + +

Response codes

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Response codesDescription
200OK Bucket Deleted on all nodes
401Unauthorized
404Object Not Found
500Bucket could not be deleted on all nodes
503Buckets cannot be deleted during a rebalance
+
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-bucket-flush.html b/preview/contents/REST/rest-bucket-flush.html new file mode 100644 index 0000000..1731473 --- /dev/null +++ b/preview/contents/REST/rest-bucket-flush.html @@ -0,0 +1,112 @@ +Flushing buckets
+

Flushing buckets

+ + + +

To flush all buckets, use the POST + /pools/default/buckets/default/controller/doFlush HTTP method and URI.

+ +

Description

+ +

The doFlush operation empties the contents of the specified bucket, deleting + all stored data. The operation only succeeds if flush is enabled on configured bucket.

+ + +
Warning: This operation is data destructive. The service makes no attempt to confirm or double check + the request. Client applications using this are advised to double check with the end user + before sending such a request. You can control and limit the ability to flush individual + buckets by setting the flushEnabled parameter on a bucket in Couchbase Web Console or via + cbepctl flush_param.
+ + +

Parameters and payload data are ignored, but the request must including the authorization + header if the system has been secured.

+ + +
Important: The flush request may lead to significant disk activity as the data in the bucket is deleted + from the database. The high disk utilization may affect the performance of your server until + the data has been successfully deleted.
+ + +
Note: The flush request is not transmitted over XDCR replication configurations;. + The remote bucket is not flushed.
+ +

Couchbase Server returns a HTTP 404 response if the URI is invalid or if it does not + correspond to an active bucket in the system.

+ +
+ + + +

HTTP method and URI

+
POST /pools/default/buckets/default/controller/doFlush
+ +
+ + +

Syntax

+

Curl request syntax:

+ +
curl -X POST -u [admin]:[password]
+  http://[localhost]:8091/pools/default/buckets/default/controller/doFlush
+      
+ + +

Raw HTTP request syntax:

+ +
POST /pools/default/buckets/default/controller/doFlush
+Host: localhost:8091
+Authorization: Basic xxxxxxxxxxxxxxxxxxx
+      
+ +
+ + +

Example

+

Curl request example:

+ +

+curl -X POST 'http://admin:password@localhost:8091/pools/default/buckets/default/controller/doFlush'
+  
+ + +

Raw HTTP request example:

+ +
POST /pools/default/buckets/default/controller/doFlush
+Host: 10.5.2.54:8091
+Authorization: Basic xxxxxxxxxxxxxxxxxxx
+      
+ +
+ + + +

Response codes

+

If the flush is successful, the HTTP response code is 200 is returned.

+ +
HTTP/1.1 200 OK
+ + +

If flushing is disable for the specified bucket, a 400 response code is returned with the + bucket status. For example:

+ +
{"_":"Flush is disabled for the bucket"}
+ + +

If the bucket does not exist, a 404 response code is returned.

+ +
404 Not Found
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-bucket-info.html b/preview/contents/REST/rest-bucket-info.html new file mode 100644 index 0000000..b306883 --- /dev/null +++ b/preview/contents/REST/rest-bucket-info.html @@ -0,0 +1,206 @@ +単一のbucket情報取得
+

単一のbucket情報取得

+ + +

+ GETオペレーションと/pools/default/buckets/[bucket-name]URIを使用して、既存のbucketやデフォルトのbucketの情報を取得します。 +

+ + +

HTTPメソッドとURI

+ +

特定のbucketの名前を渡して、クラスタに関連する単一のbucketの情報を取得します。

+ +
GET /pools/default/buckets/[bucket-name]
+ + +

+ 主なREST API bucket エンドポイント(/pools/default/buckets/[bucket-name])はbucket名で終わります。 + クライアントは接続に適するサーバを指示するためにプールではなくbucketからサーバ一覧を使用しなければいけません。 +

+ +
+ + + +

シンタックス

+ +

Curlリクエストシンタックス:

+ +

+curl -u [admin]:[password] 
+    http://[localhost]:8091/pools/default/buckets/[bucket-name]
+ + +

デフォルトbucketの情報を取得し、[bucket-name]の情報をdefaultの情報で置き換えます:

+ +

+curl -u [admin]:[password] 
+    http://[localhost]:8091/pools/default/buckets/default
+ +
+ + +

+

Curlリクエスト例:

+ +
curl -u Administrator:password 
+    http://10.5.2.117:8091/pools/default/buckets/test2
+ +
+ + +

レスポンス

+

Couchbase Serverはbucket情報を含む大きなJSONドキュメントを返します。

+ +
{
+    "authType": "sasl", 
+    "autoCompactionSettings": {
+        "allowedTimePeriod": {
+            "abortOutside": true, 
+            "fromHour": 1, 
+            "fromMinute": 0, 
+            "toHour": 2, 
+            "toMinute": 0
+        }, 
+        "databaseFragmentationThreshold": {
+            "percentage": 30, 
+            "size": "undefined"
+        }, 
+        "parallelDBAndViewCompaction": true, 
+        "viewFragmentationThreshold": {
+            "percentage": 30, 
+            "size": "undefined"
+        }
+    }, 
+    "basicStats": {
+        "dataUsed": 16824320, 
+        "diskFetches": 0, 
+        "diskUsed": 18068198, 
+        "itemCount": 0, 
+        "memUsed": 33948168, 
+        "opsPerSec": 0, 
+        "quotaPercentUsed": 12.64667809009552
+    }, 
+    "bucketCapabilities": [
+        "cbhello", 
+        "touch", 
+        "couchapi", 
+        "cccp", 
+        "xdcrCheckpointing", 
+        "nodesExt"
+    ], 
+    "bucketCapabilitiesVer": "", 
+    "bucketType": "membase", 
+    "controllers": {
+        "compactAll": "/pools/default/buckets/test2/controller/compactBucket", 
+        "compactDB": "/pools/default/buckets/default/controller/compactDatabases", 
+        "purgeDeletes": "/pools/default/buckets/test2/controller/unsafePurgeBucket", 
+        "startRecovery": "/pools/default/buckets/test2/controller/startRecovery"
+    }, 
+    "ddocs": {
+        "uri": "/pools/default/buckets/test2/ddocs"
+    }, 
+    "evictionPolicy": "valueOnly", 
+    "fastWarmupSettings": false, 
+    "localRandomKeyUri": "/pools/default/buckets/test2/localRandomKey", 
+    "name": "test2", 
+    "nodeLocator": "vbucket", 
+    "nodes": [
+        {
+            "clusterCompatibility": 196608, 
+            "clusterMembership": "active", 
+            "couchApiBase": "http://10.5.2.117:8092/test2%2B19e3c64824c22f9ad5604a15f856999d", 
+            "couchApiBaseHTTPS": "https://10.5.2.117:18092/test2%2B19e3c64824c22f9ad5604a15f856999d", 
+            "hostname": "10.5.2.117:8091", 
+            "interestingStats": {
+                "cmd_get": 0, 
+                "couch_docs_actual_disk_size": 34907800, 
+                "couch_docs_data_size": 33648640, 
+                "couch_views_actual_disk_size": 0, 
+                "couch_views_data_size": 0, 
+                "curr_items": 0, 
+                "curr_items_tot": 0, 
+                "ep_bg_fetched": 0, 
+                "get_hits": 0, 
+                "mem_used": 66961824, 
+                "ops": 0, 
+                "vb_replica_curr_items": 0
+            }, 
+            "mcdMemoryAllocated": 3159, 
+            "mcdMemoryReserved": 3159, 
+            "memoryFree": 2912423936, 
+            "memoryTotal": 4140740608, 
+            "os": "x86_64-unknown-linux-gnu", 
+            "otpNode": "ns_1@10.5.2.117", 
+            "ports": {
+                "direct": 11210, 
+                "httpsCAPI": 18092, 
+                "httpsMgmt": 18091, 
+                "proxy": 11211, 
+                "sslProxy": 11214
+            }, 
+            "recoveryType": "none", 
+            "replication": 0, 
+            "status": "healthy", 
+            "systemStats": {
+                "cpu_utilization_rate": 1, 
+                "mem_free": 2912423936, 
+                "mem_total": 4140740608, 
+                "swap_total": 6140452864, 
+                "swap_used": 0
+            }, 
+            "thisNode": true, 
+            "uptime": "2680754", 
+            "version": "3.0.0-1209-rel-enterprise"
+        }
+    ], 
+    "proxyPort": 0, 
+    "purgeInterval": 2, 
+    "quota": {
+        "ram": 268435456, 
+        "rawRAM": 268435456
+    }, 
+    "replicaIndex": false, 
+    "replicaNumber": 1, 
+    "saslPassword": "", 
+    "stats": {
+        "directoryURI": "/pools/default/buckets/test2/statsDirectory", 
+        "nodeStatsListURI": "/pools/default/buckets/test2/nodes", 
+        "uri": "/pools/default/buckets/test2/stats"
+    }, 
+    "streamingUri": "/pools/default/bucketsStreaming/test2?bucket_uuid=19e3c64824c22f9ad5604a15f856999d", 
+    "threadsNumber": 3, 
+    "uri": "/pools/default/buckets/test2?bucket_uuid=19e3c64824c22f9ad5604a15f856999d", 
+    "uuid": "19e3c64824c22f9ad5604a15f856999d", 
+    "vBucketServerMap": {
+        "hashAlgorithm": "CRC", 
+        "numReplicas": 1, 
+        "serverList": [
+            "10.5.2.117:11210"
+        ], 
+        "vBucketMap": [
+
+
+ +
+ + + + +

レスポンスコード

+
HTTP/1.1 200 OK
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-bucket-intro.html b/preview/contents/REST/rest-bucket-intro.html new file mode 100644 index 0000000..5c51213 --- /dev/null +++ b/preview/contents/REST/rest-bucket-intro.html @@ -0,0 +1,131 @@ +Buckets API
+

Buckets API

+ + + +

Buckets REST APIはbucketとbucket操作についての情報の作成、削除、フラッシュ、取得を行います。

+ +

説明

+ +

bucket管理・構成REST APIエンドポイントはクラスタ内の個々のbucketの細かいレベルでの制御、それらの構成、操作を提供します。

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. Bucketエンドポイント
HTTPメソッドURIパス説明
GET/pools/default/buckets全てのbucketやbucket操作の情報をクラスタから取得します。
GET/pools/default/buckets/defaultクラスタに関連したひとつのbucketの情報を取得します。
GET/pools/default/buckets/[bucket_name]/stats特定のbucketの統計情報を取得します。
POST/pools/default/buckets新しいCouchbase bucketを作成します。
DELETE/pools/default/buckets/[bucket_name]特定のbucketを削除します。
POST/pools/default/buckets/default/controller/doFlush特定のbucketをフラッシュします。
+
+ + +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-bucket-memory-quota.html b/preview/contents/REST/rest-bucket-memory-quota.html new file mode 100644 index 0000000..43e702a --- /dev/null +++ b/preview/contents/REST/rest-bucket-memory-quota.html @@ -0,0 +1,110 @@ +Changing bucket memory quota
+

Changing bucket memory quota

+ + + +

To increase or decrease bucket memory quota, use the POST + /pools/default/buckets/newBucket HTTP method and URI and the + ramQuotaMB option.

+ + +

Description

+

A bucket’s ramQuotaMB can be increased and decreased from its current level. However, while + increasing will do no harm, decreasing should be done with proper sizing. Decreasing the + bucket’s ramQuotaMB lowers the watermark, and some items may be unexpectedly ejected if the + ramQuotaMB is set too low.

+ + +
Note: There are some known issues with changing the ramQuotaMB for memcached bucket types.
+ +
Important: When changing the active bucket configuration, specify the existing + configuration parameters and the changed authentication parameters.
+ +
+ + + +

Syntax

+

Curl request syntax:

+ +
curl -X POST -u [admin]:[password] 
+  -d ramQuotaMB=[value] -d authType=[none | sasl]
+  -d proxyPort=[port] 
+  http://[localhost]:8091/pools/default/buckets/[bucket-name]
+ +
+ + +

Example

+

Curl request example:

+ +
curl -X POST -u Administrator:password 
+  -d ramQuotaMB=130 
+  -d authType=none
+  -d proxyPort=11215 
+  http://10.5.2.117:8091/pools/default/buckets/newBucket
+ +
+ + + +

Response

+

A 202 response indicates that the quota will be changed asynchronously throughout the + servers in the cluster.

+ +
HTTP/1.1 202 OK
+Server: Couchbase Server 1.6.0
+Pragma: no-cache
+Date: Wed, 29 Sep 2010 20:01:37 GMT
+Content-Length: 0
+Cache-Control: no-cache no-store max-age=0
+
+ + +

If the ram quota is too low, an error and usage summary is returned:

+ +
{
+    "errors": {
+        "ramQuotaMB": "RAM quota cannot be less than 100 MB"
+    }, 
+    "summaries": {
+        "hddSummary": {
+            "free": 46214973056, 
+            "otherBuckets": 16839602, 
+            "otherData": 10095646158, 
+            "thisUsed": 26456826, 
+            "total": 56327458816
+        }, 
+        "ramSummary": {
+            "free": 242221056, 
+            "nodesCount": 1, 
+            "otherBuckets": 268435456, 
+            "perNodeMegs": 25, 
+            "thisAlloc": 26214400, 
+            "thisUsed": 33911144, 
+            "total": 536870912
+        }
+    }
+}
+ +
+ + + +

Response codes

+
202 OK
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-bucket-metadata-ejection.html b/preview/contents/REST/rest-bucket-metadata-ejection.html new file mode 100644 index 0000000..cc7ee02 --- /dev/null +++ b/preview/contents/REST/rest-bucket-metadata-ejection.html @@ -0,0 +1,75 @@ +メタデータ除去設定
+

メタデータ除去設定

+ + +

メモリからのバケットメタデータ除去設定はPOST + /pools/default/buckets/defaultで行います。

+ +

HTTPメソッドとURI

+

+ メモリからのバケットメタデータ除去設定は、evictionPolicyオプションで指定します。デフォルトはvalueOnlyです。 +

+ +
POST /pools/default/buckets/default
+ + + +

+ バリューのみの除去(デフォルト)はデータをキャッシュから削除しますが、メモリから除去したアイテムを含め、 + すべてのキーとメタデータフィールドは保持します。 バケットでバリューの除去が発生すると、アイテムのバリューはリセットされます + 完全なメタデータの除去はキー、メタデータ、そしてキーバリューをキャッシュから完全に削除します。 + 完全なメタデータの除去はサイズの大きなバケットのメモリ要件を削減できます。 +

+ + +
重要: + バケットの属性を変更する際は、すべてのバケット属性を指定するようにしてください。 + バケットの属性が指定されないと(変更するしないに関わらず)、 + Couchbase Serverはその属性値をデフォルト値にリセットすることがあります。 + これを回避するために、変更する必要がない属性であっても、既存の値を再指定してください。 +
+ +
+ + +

シンタックス

+

Curlリクエストシンタックス:

+ +
curl -u [admin]:[password] -X POST
+  http://[localhost]/pools/default/buckets/default 
+  -d evictionPolicy=[valueOnly | fullEviction]
+
+ + +

+

Curlリクエスト例:

+ +
curl -u admin:password -X POST
+  http://10.5.2.54/pools/default/buckets/default 
+  -d evictionPolicy=fullEviction
+ + +
+ + +

レスポンスコード

+

+"errors": {
+        "evictionPolicy": "Eviction policy must be either 'valueOnly' or 'fullEviction'"
+    
+ + + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-bucket-parameters.html b/preview/contents/REST/rest-bucket-parameters.html new file mode 100644 index 0000000..e9ef8ad --- /dev/null +++ b/preview/contents/REST/rest-bucket-parameters.html @@ -0,0 +1,114 @@ +Changing bucket parameters
+

Changing bucket parameters

+ + +

To modify bucket parameters, use the POST + /pools/default/buckets/[bucket-name] HTTP method and URI with the bucket name being + the REST API endpoint.

+ +

Description

+

You can modify existing bucket parameters by posting the updated parameters used to create + the bucket to the bucket’s URI. Do not omit a parameter in your request since this is + equivalent to not setting it in many cases. We recommend you do a request to get current + bucket settings, make modifications as needed and then make your POST request to the bucket + URI.

+ + +
Note: + The bucket name cannot be changed via the REST API.
+ + +
Important: When changing the active bucket configuration, specify the existing + configuration parameters and the changed authentication parameters.
+ +
+ + +

Syntax

+

Curl request syntax:

+ +
curl -v -X POST -u [admin]:[password] 
+  -d name=[customer] 
+  -d flushEnabled=[0 | 1] 
+  -d replicaNumber=[value from 0 to 3] 
+  -d authType=[none | sasl]
+  -d ramQuotaMB=[value] 
+  -d proxyPort=[port]
+  http://[localhost]:8091/pools/default/buckets/[bucket-name]
+      
+ +
+ + +

Example

+

Curl request example:

+ +

To edit the bucket customer on server node 10.5.2.54:

+ +
curl -v -X POST -u admin:password 
+  -d name=customer 
+  -d flushEnabled=0 
+  -d replicaNumber=1 
+  -d authType=none 
+  -d ramQuotaMB=200 
+  -d proxyPort=11212 
+  http://10.5.2.117:8091/pools/default/buckets/customer
+      
+ +
+ + +

Response

+

If the request is successful, HTTP response 200 is returned with an empty data content.

+ +
202 OK
+ +
+ + +

Response codes

+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
Response codesDescription
200OK
+
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-bucket-set-priority.html b/preview/contents/REST/rest-bucket-set-priority.html new file mode 100644 index 0000000..32ee559 --- /dev/null +++ b/preview/contents/REST/rest-bucket-set-priority.html @@ -0,0 +1,64 @@ +Setting disk I/O priority
+

Setting disk I/O priority

+ + +

The disk I/O priority for a bucket is set with the + /pools/default/buckets/[bucket-name] URI and the threadNumber + setting.

+ +

HTTP method and URI

+ +

To set the maximum of thread workers, use the threadsNumber option. To + specify high priority, assign eight (8) threads. To specify low priority, assign three (3) + threads. Default: threadsNumber=3. Only high or low priority are + allowed.

+ +
POST /pools/default/buckets/[bucket_name]
+ +

The threadNumberparameter is used to specify disk I/O priority for a + bucket.

+ +
Important: When editing bucket properties, be sure to specify all bucket properties. + If a bucket property is not specified (whether or not you are changing the existing value), + Couchbase Server may reset the property to the default. Even if you do not intend to change a + certain property, re-specify the existing value to avoid this behavior.
+ +
+ + + +

Syntax

+

Curl request syntax:

+ +

+curl -v -X POST -u [admin]:[password] \
+  http://[localhost]:8091/pools/default/buckets/[bucket-name] \
+  -d threadsNumber=[3 | 8] 
+        
+ +
+ + +

Example

+

The following example sets the threadsNumber for the default bucket to + eight (8), which is high priority, from the default of three (3), which is low priority.

+ +

+curl -v -X POST -u Administrator:password \
+  http://10.5.2.54:8091/pools/default/buckets/default \
+  -d threadsNumber=8        
+  
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-bucket-stats.html b/preview/contents/REST/rest-bucket-stats.html new file mode 100644 index 0000000..2b2d067 --- /dev/null +++ b/preview/contents/REST/rest-bucket-stats.html @@ -0,0 +1,388 @@ +Getting bucket statistics
+

Getting bucket statistics

+ + + +

To retrieve bucket statistics, use the GET operation with the + /pools/default/buckets/bucket_name/stats URI.

+ + +

HTTP method and URI

+ +

Statistics can be retrieved at the bucket level. + The request URL should be taken from stats.uri property of a bucket response. + By default, this request returns stats for the last minute and for heavily used keys. + Query parameters provide a more detailed level of information.

+ + +
GET /pools/default/buckets/[bucket-name]/stats
+ + +

Parameters:

+ +
+ +
zoom
+ +
Provides a statistical sampling for that bucket stats at a particular interval + (minute | hour | day | week | month | year). For example, a zoom level of + minute provides bucket statistics from the past minute, a zoom level of day + provides bucket statistics for the past day, and so on. If no zoom level is + provided, the server returns statistics from the past minute.
+ + + +
haveTStamp
+ +
Requests statistics from this timestamp until now. + The timestamp is specified as UNIX epoch time. + To get a timestamp for a timeframe, + make a REST request to the endpoint with a zoom level.
+ + +
+ + +
+ + +

Syntax

+

Curl request syntax:

+ +
curl -u [admin]:[password] http://[localhost]:8091/pools/default/buckets/[bucket-name]/stats
+ + +

Raw HTTP request syntax:

+ +

+GET /pools/default/buckets/[bucket-name]/stats
+Host: [localhost]:8091
+Authorization: Basic xxxxxxxxxxxxxxxxxxx
+Accept: application/json X-memcachekv-Store-Client-Specification-Version: 0.1
+ +
+ + +

Example

+ +

Curl request example with no parameters:

+ + +

+curl -u Administrator:password http://10.5.2.54:8091/pools/default/buckets/test-bucket/stats
+
+ + +
+ + +

Response

+

+HTTP/1.1 200 OK
+Content-Type: application/json
+Content-Length: nnn
+{
+    "op": {
+        "samples": {
+            "hit_ratio": [
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+            ],
+            "ep_cache_miss_rate": [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                                    0 ],
+
+
+                .....
+
+
+            "samplesCount": 60,
+            "isPersistent": true,
+            "lastTStamp":513777166.0,
+            "interval": 1000
+        },
+        "hot_keys": [
+            {
+                "name": "48697",
+                "ops": 0.0009276437847866419
+            },
+            {
+                "name": "8487",
+                "ops": 0.0009276437847866419
+            },
+            {
+                "name": "77262",
+                "ops": 0.0009276437847866419
+            },
+            {
+                "name": "58495",
+                "ops": 0.0009276437847866419
+            },
+            {
+                "name": "21003",
+                "ops": 0.0009276437847866419
+            },
+            {
+                "name": "26850",
+                "ops": 0.0009276437847866419
+            },
+            {
+                "name": "73717",
+                "ops": 0.0009276437847866419
+            },
+            {
+                "name": "86218",
+                "ops": 0.0009276437847866419
+            },
+            {
+                "name": "80344",
+                "ops": 0.0009276437847866419
+            },
+            {
+                "name": "83457",
+                "ops": 0.0009276437847866419
+            }
+        ]
+    }
+}
+
+ +
+ + +

Example

+

The following are sample requests at this endpoint with optional parameters.

+ +

The following example retrieves sample statistics from a bucket for the last + minute.

+ +
          
+curl -X GET -u admin:password -d zoom=minute http://localhost:8091/pools/default/buckets/bucket-name/stats
+        
+ + +

The following example retrieves sample statistics from a bucket for the past day.

+ +

+curl -X GET -u admin:password -d zoom=day http://localhost:8091/pools/default/buckets/bucket-name/stats
+
+ + +

The following example retrieves sample statistics from a bucket for the last month.

+ +

+curl -X GET -u admin:password -d zoom=month http://localhost:8091/pools/default/buckets/bucket-name/stats
+    
+ + +

The following example retrieves statistics from a bucket from the timestamp until the + server receives the REST request.

+ +

+curl -X GET -u admin:password -d zoom=hour -d haveTStamp=1376963720000 http://localhost:8091/pools/default/buckets/bucket-name/stats
+
+ + +
+ + +

Response

+

Sample output for each of these requests appears in the same format and with the + same fields. Depending on the level of bucket activity, there may be more detail for + each field or less. In this sample output, results for each category are omitted.

+ + +
{
+  "hot_keys": [],
+  "op": {
+    "interval": 1000,
+    "lastTStamp": 1376963580000,
+    "isPersistent": true,
+    "samplesCount": 1440,
+    "samples": {
+      "timestamp": [1376955060000, 1376955120000, 1376955180000, 1376955240000, ... ],
+      "xdc_ops": [0, 0, 0, 0, ... ],
+      "vb_total_queue_age": [0, 0, 0, 0, ... ],
+      "vb_replica_queue_size": [0, 0, 0, 0, ... ],
+      "vb_replica_queue_fill": [0, 0, 0, 0, ... ],
+      "vb_replica_queue_drain": [0, 0, 0, 0, ... ],
+      "vb_replica_queue_age": [0, 0, 0, 0, ... ],
+      "vb_replica_ops_update": [0, 0, 0, 0, ... ],
+      "vb_replica_ops_create": [0, 0, 0, 0, ... ],
+      "vb_replica_num_non_resident": [0, 0, 0, 0, ... ],
+      "vb_replica_num": [0, 0, 0, 0, ... ],
+      "vb_replica_meta_data_memory": [0, 0, 0, 0, ... ],
+      "vb_replica_itm_memory": [0, 0, 0, 0, ... ],
+      "vb_replica_eject": [0, 0, 0, 0, ... ],
+      "vb_replica_curr_items": [0, 0, 0, 0, ... ],
+      "vb_pending_queue_size": [0, 0, 0, 0, ... ],
+      "vb_pending_queue_fill": [0, 0, 0, 0, ... ],
+      "vb_pending_queue_drain": [0, 0, 0, 0, ... ],
+      "vb_pending_queue_age": [0, 0, 0, 0, ... ],
+      "vb_pending_ops_update": [0, 0, 0, 0, ... ],
+      "vb_pending_ops_create": [0, 0, 0, 0, ... ],
+      "vb_pending_num_non_resident": [0, 0, 0, 0, ... ],
+      "vb_pending_num": [0, 0, 0, 0, ... ],
+      "vb_pending_meta_data_memory": [0, 0, 0, 0, ... ],
+      "vb_pending_itm_memory": [0, 0, 0, 0, ... ],
+      "vb_pending_eject": [0, 0, 0, 0, ... ],
+      "vb_pending_curr_items": [0, 0, 0, 0, ... ],
+      "vb_active_queue_size": [0, 0, 0, 0, ... ],
+      "vb_active_queue_fill": [0, 0, 0, 0, ... ],
+      "vb_active_queue_drain": [0, 0, 0, 0, ... ],
+      "vb_active_queue_age": [0, 0, 0, 0, ... ],
+      "vb_active_ops_update": [0, 0, 0, 0, ... ],
+      "vb_active_ops_create": [0, 0, 0, 0, ... ],
+      "vb_active_num_non_resident": [0, 0, 0, 0, ... ],
+      "vb_active_num": [1024, 1024, 1024, 1024, ... ],
+      "vb_active_meta_data_memory": [0, 0, 0, 0, ... ],
+      "vb_active_itm_memory": [0, 0, 0, 0, ... ],
+      "vb_active_eject": [0, 0, 0, 0, ... ],
+      "ep_ops_create": [0, 0, 0, 0, ... ],
+      "ep_oom_errors": [0, 0, 0, 0, ... ],
+      "ep_num_value_ejects": [0, 0, 0, 0, ... ],
+      "ep_num_ops_set_ret_meta": [0, 0, 0, 0, ... ],
+      "ep_num_ops_set_meta": [0, 0, 0, 0, ... ],
+      "ep_num_ops_get_meta": [0, 0, 0, 0, ... ],
+      "ep_num_ops_del_ret_meta": [0, 0, 0, 0, ... ],
+      "ep_num_ops_del_meta": [0, 0, 0, 0, ... ],
+      "ep_num_non_resident": [0, 0, 0, 0, ... ],
+      "ep_meta_data_memory": [0, 0, 0, 0, ... ],
+      "ep_mem_low_wat": [402653184, 402653184, 402653184, 402653184, ... ],
+      "ep_mem_high_wat": [456340275, 456340275, 456340275, 456340275, ... ],
+      "ep_max_data_size": [536870912, 536870912, 536870912, 536870912, ... ],
+      "ep_kv_size": [0, 0, 0, 0, ... ],
+      "ep_item_commit_failed": [0, 0, 0, 0, ... ],
+      "ep_flusher_todo": [0, 0, 0, 0, ... ],
+      "ep_diskqueue_items": [0, 0, 0, 0, ... ],
+      "ep_diskqueue_fill": [0, 0, 0, 0, ... ],
+      "ep_diskqueue_drain": [0, 0, 0, 0, ... ],
+      "ep_bg_fetched": [0, 0, 0, 0, ... ],
+      "disk_write_queue": [0, 0, 0, 0, ... ],
+      "disk_update_total": [0, 0, 0, 0, ... ],
+      "disk_update_count": [0, 0, 0, 0, ... ],
+      "disk_commit_total": [0, 0, 0, 0, ... ],
+      "disk_commit_count": [0, 0, 0, 0, ... ],
+      "delete_misses": [0, 0, 0, 0, ... ],
+      "delete_hits": [0, 0, 0, 0, ... ],
+      "decr_misses": [0, 0, 0, 0, ... ],
+      "decr_hits": [0, 0, 0, 0, ... ],
+      "curr_items_tot": [0, 0, 0, 0, ... ],
+      "curr_items": [0, 0, 0, 0, ... ],
+      "curr_connections": [9, 9, 9, 9, ... ],
+      "avg_bg_wait_time": [0, 0, 0, 0, ... ],
+      "avg_disk_commit_time": [0, 0, 0, 0, ... ],
+      "avg_disk_update_time": [0, 0, 0, 0, ... ],
+      "vb_pending_resident_items_ratio": [0, 0, 0, 0, ... ],
+      "vb_replica_resident_items_ratio": [0, 0, 0, 0, ... ],
+      "vb_active_resident_items_ratio": [0, 0, 0, 0, ... ],
+      "vb_avg_total_queue_age": [0, 0, 0, 0, ... ],
+      "vb_avg_pending_queue_age": [0, 0, 0, 0, ... ],
+      "couch_total_disk_size": [8442535, 8449358, 8449392, 8449392, ... ],
+      "couch_docs_fragmentation": [0, 0, 0, 0, ... ],
+      "couch_views_fragmentation": [0, 0, 0, 0, ... ],
+      "hit_ratio": [0, 0, 0, 0, ... ],
+      "ep_cache_miss_rate": [0, 0, 0, 0, ... ],
+      "ep_resident_items_rate": [100, 100, 100, 100, ... ],
+      "vb_avg_active_queue_age": [0, 0, 0, 0, ... ],
+      "vb_avg_replica_queue_age": [0, 0, 0, 0, ... ],
+      "bg_wait_count": [0, 0, 0, 0, ... ],
+      "bg_wait_total": [0, 0, 0, 0, ... ],
+      "bytes_read": [103.5379762658911, 103.53627151841438, 103.53627262555834, 103.53739884434893, ... ],
+      "bytes_written": [20793.105529503482, 20800.99759272974, 20802.109356966503, 20803.59949917707, ... ],
+      "cas_badval": [0, 0, 0, 0, ... ],
+      "cas_hits": [0, 0, 0, 0, ... ],
+      "cas_misses": [0, 0, 0, 0, ... ],
+      "cmd_get": [0, 0, 0, 0, ... ],
+      "cmd_set": [0, 0, 0, 0, ... ],
+      "couch_docs_actual_disk_size": [8442535, 8449358, 8449392, 8449392, ... ],
+      "couch_docs_data_size": [8435712, 8435712, 8435712, 8435712, ... ],
+      "couch_docs_disk_size": [8435712, 8435712, 8435712, 8435712, ... ],
+      "couch_views_actual_disk_size": [0, 0, 0, 0, ... ],
+      "couch_views_data_size": [0, 0, 0, 0, ... ],
+      "couch_views_disk_size": [0, 0, 0, 0, ... ],
+      "couch_views_ops": [0, 0, 0, 0, ... ],
+      "ep_ops_update": [0, 0, 0, 0, ... ],
+      "ep_overhead": [27347928, 27347928, 27347928, 27347928, ... ],
+      "ep_queue_size": [0, 0, 0, 0, ... ],
+      "ep_tap_rebalance_count": [0, 0, 0, 0, ... ],
+      "ep_tap_rebalance_qlen": [0, 0, 0, 0, ... ],
+      "ep_tap_rebalance_queue_backfillremaining": [0, 0, 0, 0, ... ],
+      "ep_tap_rebalance_queue_backoff": [0, 0, 0, 0, ... ],
+      "ep_tap_rebalance_queue_drain": [0, 0, 0, 0, ... ],
+      "ep_tap_rebalance_queue_fill": [0, 0, 0, 0, ... ],
+      "ep_tap_rebalance_queue_itemondisk": [0, 0, 0, 0, ... ],
+      "ep_tap_rebalance_total_backlog_size": [0, 0, 0, 0, ... ],
+      "ep_tap_replica_count": [0, 0, 0, 0, ... ],
+      "ep_tap_replica_qlen": [0, 0, 0, 0, ... ],
+      "ep_tap_replica_queue_backfillremaining": [0, 0, 0, 0, ... ],
+      "ep_tap_replica_queue_backoff": [0, 0, 0, 0, ... ],
+      "ep_tap_replica_queue_drain": [0, 0, 0, 0, ... ],
+      "ep_tap_replica_queue_fill": [0, 0, 0, 0, ... ],
+      "ep_tap_replica_queue_itemondisk": [0, 0, 0, 0, ... ],
+      "ep_tap_replica_total_backlog_size": [0, 0, 0, 0, ... ],
+      "ep_tap_total_count": [0, 0, 0, 0, ... ],
+      "ep_tap_total_qlen": [0, 0, 0, 0, ... ],
+      "ep_tap_total_queue_backfillremaining": [0, 0, 0, 0, ... ],
+      "ep_tap_total_queue_backoff": [0, 0, 0, 0, ... ],
+      "ep_tap_total_queue_drain": [0, 0, 0, 0, ... ],
+      "ep_tap_total_queue_fill": [0, 0, 0, 0, ... ],
+      "ep_tap_total_queue_itemondisk": [0, 0, 0, 0, ... ],
+      "ep_tap_total_total_backlog_size": [0, 0, 0, 0, ... ],
+      "ep_tap_user_count": [0, 0, 0, 0, ... ],
+      "ep_tap_user_qlen": [0, 0, 0, 0, ... ],
+      "ep_tap_user_queue_backfillremaining": [0, 0, 0, 0, ... ],
+      "ep_tap_user_queue_backoff": [0, 0, 0, 0, ... ],
+      "ep_tap_user_queue_drain": [0, 0, 0, 0, ... ],
+      "ep_tap_user_queue_fill": [0, 0, 0, 0, ... ],
+      "ep_tap_user_queue_itemondisk": [0, 0, 0, 0, ... ],
+      "ep_tap_user_total_backlog_size": [0, 0, 0, 0, ... ],
+      "ep_tmp_oom_errors": [0, 0, 0, 0, ... ],
+      "ep_vb_total": [1024, 1024, 1024, 1024, ... ],
+      "evictions": [0, 0, 0, 0, ... ],
+      "get_hits": [0, 0, 0, 0, ... ],
+      "get_misses": [0, 0, 0, 0, ... ],
+      "incr_hits": [0, 0, 0, 0, ... ],
+      "incr_misses": [0, 0, 0, 0, ... ],
+      "mem_used": [27347928, 27347928, 27347928, 27347928, ... ],
+      "misses": [0, 0, 0, 0, ... ],
+      "ops": [0, 0, 0, 0, ... ],
+      "replication_active_vbreps": [0, 0, 0, 0, ... ],
+      "replication_bandwidth_usage": [0, 0, 0, 0, ... ],
+      "replication_changes_left": [0, 0, 0, 0, ... ],
+      "replication_commit_time": [0, 0, 0, 0, ... ],
+      "replication_data_replicated": [0, 0, 0, 0, ... ],
+      "replication_docs_checked": [0, 0, 0, 0, ... ],
+      "replication_docs_latency_aggr": [0, 0, 0, 0, ... ],
+      "replication_docs_latency_wt": [0, 0, 0, 0, ... ],
+      "replication_docs_rep_queue": [0, 0, 0, 0, ... ],
+      "replication_docs_written": [0, 0, 0, 0, ... ],
+      "replication_meta_latency_aggr": [0, 0, 0, 0, ... ],
+      "replication_meta_latency_wt": [0, 0, 0, 0, ... ],
+      "replication_num_checkpoints": [0, 0, 0, 0, ... ],
+      "replication_num_failedckpts": [0, 0, 0, 0, ... ],
+      "replication_rate_replication": [0, 0, 0, 0, ... ],
+      "replication_size_rep_queue": [0, 0, 0, 0, ... ],
+      "replication_waiting_vbreps": [0, 0, 0, 0, ... ],
+      "replication_work_time": [0, 0, 0, 0, ... ]
+    }
+  }
+}
+
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-buckets-streamingURI.html b/preview/contents/REST/rest-buckets-streamingURI.html new file mode 100644 index 0000000..61e946a --- /dev/null +++ b/preview/contents/REST/rest-buckets-streamingURI.html @@ -0,0 +1,199 @@ +Getting bucket streaming URI
+

Getting bucket streaming URI

+ + + +

To retrieve the streaming URI, use GET /pools/default/buckets/default + HTTP method and URI.

+ +

HTTP method and URI

+
GET /pools/default/buckets/default
+ + +

The individual bucket request is exactly the same as what would be obtained from the item + in the array for the entire buckets list. The streamingUri is exactly the same except it + streams HTTP chunks using chunked encoding. A response of “\n\n\n\n” delimits chunks which + may be converted to a “zero chunk” in a future release. The behavior of the streamingUri + should be considered evolving.

+ + +
+ + +

Syntax

+

Curl request syntax:

+ +

+curl -u [admin]:[password] -X GET 
+  http://[localhost]:8091/pools/default/buckets/default
+      
+ + +

Raw HTTP request syntax:

+ + +

+GET /pools/default/buckets/default
+Host: localhost:8091
+Authorization: Basic xxxxxxxxxxxxxxxxxxx
+Accept: application/json
+X-memcachekv-Store-Client-Specification-Version: 0.1
+
+ +
+ + +

Example

+

Curl request example

+ +

+curl -u Administrator:password -X GET 
+  http://10.5.2.117:8091/pools/default/buckets/default
+      
+ + + +

Raw HTTP request example:

+ +

+GET /pools/default/buckets/default
+Host: 10.5.2.117:8091
+Authorization: Basic xxxxxxxxxxxxxxxxxxx
+Accept: application/json
+X-memcachekv-Store-Client-Specification-Version: 0.1
+
+ +
+ + +

Response

+ +

+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  9761  100  9761    0     0  20946      0 --:--:-- --:--:-- --:--:-- 20946
+{
+    "authType": "sasl", 
+    "autoCompactionSettings": false, 
+    "basicStats": {
+        "dataUsed": 4241408, 
+        "diskFetches": 0, 
+        "diskUsed": 4256498, 
+        "itemCount": 0, 
+        "memUsed": 33019120, 
+        "opsPerSec": 0, 
+        "quotaPercentUsed": 12.300580739974979
+    }, 
+    "bucketCapabilities": [
+        "cbhello", 
+        "touch", 
+        "couchapi", 
+        "cccp", 
+        "xdcrCheckpointing", 
+        "nodesExt"
+    ], 
+    "bucketCapabilitiesVer": "", 
+    "bucketType": "membase", 
+    "controllers": {
+        "compactAll": "/pools/default/buckets/default/controller/compactBucket", 
+        "compactDB": "/pools/default/buckets/default/controller/compactDatabases", 
+        "purgeDeletes": "/pools/default/buckets/default/controller/unsafePurgeBucket", 
+        "startRecovery": "/pools/default/buckets/default/controller/startRecovery"
+    }, 
+    "ddocs": {
+        "uri": "/pools/default/buckets/default/ddocs"
+    }, 
+    "evictionPolicy": "valueOnly", 
+    "fastWarmupSettings": false, 
+    "localRandomKeyUri": "/pools/default/buckets/default/localRandomKey", 
+    "name": "default", 
+    "nodeLocator": "vbucket", 
+    "nodes": [
+        {
+            "clusterCompatibility": 196608, 
+            "clusterMembership": "active", 
+            "couchApiBase": "http://10.5.2.117:8092/default%2B8a741dd4e271ff88c0b609dd43497d74", 
+            "couchApiBaseHTTPS": "https://10.5.2.117:18092/default%2B8a741dd4e271ff88c0b609dd43497d74", 
+            "hostname": "10.5.2.117:8091", 
+            "interestingStats": {
+                "cmd_get": 0, 
+                "couch_docs_actual_disk_size": 34914201, 
+                "couch_docs_data_size": 33648640, 
+                "couch_views_actual_disk_size": 18178, 
+                "couch_views_data_size": 18178, 
+                "curr_items": 0, 
+                "curr_items_tot": 0, 
+                "ep_bg_fetched": 0, 
+                "get_hits": 0, 
+                "mem_used": 66973496, 
+                "ops": 0, 
+                "vb_replica_curr_items": 0
+            }, 
+            "mcdMemoryAllocated": 3159, 
+            "mcdMemoryReserved": 3159, 
+            "memoryFree": 2577612800, 
+            "memoryTotal": 4140740608, 
+            "os": "x86_64-unknown-linux-gnu", 
+            "otpNode": "ns_1@10.5.2.117", 
+            "ports": {
+                "direct": 11210, 
+                "httpsCAPI": 18092, 
+                "httpsMgmt": 18091, 
+                "proxy": 11211, 
+                "sslProxy": 11214
+            }, 
+            "recoveryType": "none", 
+            "replication": 0, 
+            "status": "healthy", 
+            "systemStats": {
+                "cpu_utilization_rate": 23, 
+                "mem_free": 2577612800, 
+                "mem_total": 4140740608, 
+                "swap_total": 6140452864, 
+                "swap_used": 16384
+            }, 
+            "thisNode": true, 
+            "uptime": "696790", 
+            "version": "3.0.2-1605-rel-enterprise"
+        }
+    ], 
+    "proxyPort": 0, 
+    "quota": {
+        "ram": 268435456, 
+        "rawRAM": 268435456
+    }, 
+    "replicaIndex": false, 
+    "replicaNumber": 1, 
+    "saslPassword": "", 
+    "stats": {
+        "directoryURI": "/pools/default/buckets/default/statsDirectory", 
+        "nodeStatsListURI": "/pools/default/buckets/default/nodes", 
+        "uri": "/pools/default/buckets/default/stats"
+    }, 
+    "streamingUri": "/pools/default/bucketsStreaming/default?bucket_uuid=8a741dd4e271ff88c0b609dd43497d74", 
+    "threadsNumber": 3, 
+    "uri": "/pools/default/buckets/default?bucket_uuid=8a741dd4e271ff88c0b609dd43497d74", 
+    "uuid": "8a741dd4e271ff88c0b609dd43497d74", 
+    "vBucketServerMap": {
+        "hashAlgorithm": "CRC", 
+        "numReplicas": 1, 
+        "serverList": [
+            "10.5.2.117:11210"
+        ], 
+        "vBucketMap": [ ... ]
+
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-buckets-summary.html b/preview/contents/REST/rest-buckets-summary.html new file mode 100644 index 0000000..56986dc --- /dev/null +++ b/preview/contents/REST/rest-buckets-summary.html @@ -0,0 +1,203 @@ +Getting all bucket information
+

Getting all bucket information

+ + +

To retrieve all bucket information for a cluster use the GET + /pools/default/buckets HTTP method and URI.

+ +

Description

+
To create an SDK for Couchbase, use either the proxy path or the direct path to + connect to Couchbase Server. If the SDK uses the direct path, the SDK is not + insulated from most reconfiguration changes to the bucket. This means that the SDK + needs to either poll the bucket’s URI or connect to the streaming URI to receive + updates when the bucket configuration changes. Bucket configuration changes occur + under the follow circumstances:
    +
  • Nodes are added.
  • + +
  • Nodes are removed.
  • + +
  • Nodes fail.
  • + +
+
+ +
+ + +

HTTP method and URI

+

+GET /pools/default/buckets
+            
+ + +
+ + +

Syntax

+

Curl request syntax to retrieve information for all buckets in a cluster:

+ +
curl -u [admin]:[password] 
+    http://[localhost]:8091/pools/default/buckets
+ + +

Raw HTTP request syntax:

+ +
GET /pools/default/buckets
+Host: localhost:8091
+Authorization: Basic xxxxxxxxxxxxxxxxxxx
+Accept: application/json
+X-memcachekv-Store-Client-Specification-Version: 0.1
+
+ +
+ + +

Example

+

Curl request example:

+ +
curl -u admin:password 
+    http://10.5.2.54:8091/pools/default/buckets
+ + +

Raw HTTP request example:

+ +
GET /pools/default/buckets
+Host: 10.5.2.54:8091
+Authorization: Basic xxxxxxxxxxxxxxxxxxx
+Accept: application/json
+X-memcachekv-Store-Client-Specification-Version: 0.1
+
+ +
+ + +

Response

+

+Host: localhost:8091
+Authorization: Basic xxxxxxxxxxxxxxxxxxx
+Accept: application/json
+X-memcachekv-Store-Client-Specification-Version: 0.1
+
+ + +
HTTP/1.1 200 OK
+Server: Couchbase Server 1.6.0
+Pragma: no-cache
+Date: Wed, 03 Nov 2010 18:12:19 GMT
+Content-Type: application/json
+Content-Length: nnn
+Cache-Control: no-cache no-store max-age=0
+[
+    {
+        "name": "default",
+        "bucketType": "couchbase",
+        "authType": "sasl",
+        "saslPassword": "",
+        "proxyPort": 0,
+        "uri": "/pools/default/buckets/default",
+        "streamingUri": "/pools/default/bucketsStreaming/default",
+        "flushCacheUri": "/pools/default/buckets/default/controller/doFlush",
+        "nodes": [
+            {
+                "uptime": "784657",
+                "memoryTotal": 8453197824.0,
+                "memoryFree": 1191157760,
+                "mcdMemoryReserved": 6449,
+                "mcdMemoryAllocated": 6449,
+                "clusterMembership": "active",
+                "status": "unhealthy",
+                "hostname": "10.1.15.148:8091",
+                "version": "1.6.0",
+                "os": "windows",
+                "ports": {
+                    "proxy": 11211,
+                    "direct": 11210
+                }
+            }
+        ],
+        "stats": {
+            "uri": "/pools/default/buckets/default/stats"
+        },
+        "nodeLocator": "vbucket",
+        "vBucketServerMap": {
+            "hashAlgorithm": "CRC",
+            "numReplicas": 1,
+            "serverList": [
+                "192.168.1.2:11210"
+            ],
+      "vBucketMap": [ [ 0, -1 ], [ 0, -1 ], [ 0, -1 ], [ 0, -1 ], [ 0, -1 ], [ 0, -1 ]]
+  },
+        "replicaNumber": 1,
+        "quota": {
+            "ram": 104857600,
+            "rawRAM": 104857600
+        },
+        "basicStats": {
+            "quotaPercentUsed": 24.360397338867188,
+            "opsPerSec": 0,
+            "diskFetches": 0,
+            "itemCount": 0,
+            "diskUsed": 0,
+            "memUsed": 25543728
+        }
+    },
+    {
+        "name": "test-application",
+        "bucketType": "memcached",
+        "authType": "sasl",
+        "saslPassword": "",
+        "proxyPort": 0,
+        "uri": "/pools/default/buckets/test-application",
+        "streamingUri": "/pools/default/bucketsStreaming/test-application",
+        "flushCacheUri": "/pools/default/buckets/test-application/controller/doFlush",
+        "nodes": [
+            {
+                "uptime": "784657",
+                "memoryTotal": 8453197824.0,
+                "memoryFree": 1191157760,
+                "mcdMemoryReserved": 6449,
+                "mcdMemoryAllocated": 6449,
+                "clusterMembership": "active",
+                "status": "healthy",
+                "hostname": "192.168.1.2:8091",
+                "version": "1.6.0",
+                "os": "windows",
+                "ports": {
+                    "proxy": 11211,
+                    "direct": 11210
+                }
+            }
+        ],
+        "stats": {
+            "uri": "/pools/default/buckets/test-application/stats"
+        },
+        "nodeLocator": "ketama",
+        "replicaNumber": 0,
+        "quota": {
+            "ram": 67108864,
+            "rawRAM": 67108864
+        },
+        "basicStats": {
+            "quotaPercentUsed": 4.064150154590607,
+            "opsPerSec": 0,
+            "hitRatio": 0,
+            "itemCount": 1385,
+            "diskUsed": 0,
+            "memUsed": 2727405
+        }
+    }
+]
+        
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-client-logs.html b/preview/contents/REST/rest-client-logs.html new file mode 100644 index 0000000..018d10f --- /dev/null +++ b/preview/contents/REST/rest-client-logs.html @@ -0,0 +1,63 @@ +Creating client logs
+

Creating client logs

+ + + +

Client logs refers to entries that are added to the central log from a SDK.

+ +

Description

+

Entries can be added to the central log from a custom Couchbase SDK. These entries are + typically responses to exceptions such as difficulty handling a server response. For + example, the web console uses this functionality to log client error conditions.

+ +
+ + +

HTTP method and URI

+ +
POST /logClientError
+ +
+ + +

Syntax

+ +

To add entries, provide a REST request similar to the following:

+ + +
POST /logClientError
+Host: [localhost]:8091
+Authorization: Basic xxxxxxxxxxxxxxxxxxx
+Accept: application/json
+X-memcachekv-Store-Client-Specification-Version: 0.1
+
+ +
+ + +

Example

+

Curl request example:

+ +
curl -u Administrator:password -X POST http://10.5.2.117:8091/logClientError
+ +
+ + +

Response codes

+
200 - OK
+"Unexpected server error, request logged."
+      
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-cluster-addnodes.html b/preview/contents/REST/rest-cluster-addnodes.html new file mode 100644 index 0000000..1c4c611 --- /dev/null +++ b/preview/contents/REST/rest-cluster-addnodes.html @@ -0,0 +1,67 @@ +Adding nodes to clusters
+

Adding nodes to clusters

+ + +

Nodes are added to clusters with the POST /controller/addNode HTTP method and URI.

+ + +

HTTP method and URI

+

+POST /controller/addNode
+      
+ +
+ + +

Syntax

+

This is a REST request made to a Couchbase cluster to add a server node to the cluster. A new + node is add with the RESTful endpoint server_ip:port/controller/addNode. + The administrative username and password parameters are required.

+ + +

+curl -u [admin]:[password]
+  [localhost]:8091/controller/addNode 
+  -d "hostname=[IPaddress]&user=[admin]&password=[password]"
+      
+ +
+ + +

Example

+

The following example request adds a server node, 10.2.2.64, to the cluster at + 10.2.2.60:8091. The POST method, controller/addNode, IP address for the + new server, and administrative credentials are provided. Since the POST method is the + default, it is not required in the request.

+ + +
curl -u admin:password \
+  10.2.2.60:8091/controller/addNode \
+  -d "hostname=10.2.2.64&user=admin&password=password"
+
+ +
+ + +

Response

+ + +

If successful, Couchbase Server responds:

+ +
HTTP/1.1 200 OK
+{"otpNode":"ns_1@10.4.2.6"}
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-cluster-autofailover-enable.html b/preview/contents/REST/rest-cluster-autofailover-enable.html new file mode 100644 index 0000000..dfea939 --- /dev/null +++ b/preview/contents/REST/rest-cluster-autofailover-enable.html @@ -0,0 +1,91 @@ +Enabling and disabling auto-failover
+

Enabling and disabling auto-failover

+ + +

Auto-failover is enabled and disabled the POST /settings/autoFailover HTTP method and URI.

+ +

HTTP method and URI

+

This is a global setting that applies to all clusters. Authentication is required to change this value.

+ +
POST /settings/autoFailover
+ + +

Parameters include:

+ +
    +
  • enabled: Value is true or false. Indicates whether Couchbase Server + performs auto-failover for the cluster or not.
  • + +
  • timeout: Positive integer between 30 and 3600. The number of seconds a + node must be down before Couchbase Server performs auto-failover on the node. Required if + enabled=true; optional when enabled=false.
  • + +
+ +
+ + +

Syntax

+

Curl request syntax:

+ +
curl -u [admin]:[password] http://[localhost]:8091/settings/autoFailover -d [parameter]
+ + +
+ + + +

Example

+

Curl request example:

+ +
curl -i -u admin:password 
+  http://10.5.2.54:8091/settings/autoFailover \
+  -d 'enabled=true&timeout=600'
+
+ + +

Raw HTTP request example:

+ +
POST /settings/autoFailover HTTP/1.1
+Host: 10.5.2.54:8091
+Content-Type: application/x-www-form-urlencoded
+Authorization: Basic YWRtaW46YWRtaW4=
+Content-Length: 14
+enabled=true&timeout=600
+
+ + +
+ + + +

Response codes

+
HTTP/1.1 200 OK
+Server: Couchbase Server
+Pragma: no-cache
+Date: Sat, 18 Oct 2014 00:26:28 GMT
+Content-Length: 0
+Cache-Control: no-cache
+ +

The possible errors include:

+ +
400 Bad Request, The value of "enabled" must be true or false.
+400 Bad Request, The value of "timeout" must be a positive integer bigger or equal to 30.
+401 Unauthorized
+This endpoint isn't available yet.
+
+ + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-cluster-autofailover-intro.html b/preview/contents/REST/rest-cluster-autofailover-intro.html new file mode 100644 index 0000000..e4f63ba --- /dev/null +++ b/preview/contents/REST/rest-cluster-autofailover-intro.html @@ -0,0 +1,94 @@ +Managing auto-failover
+

Managing auto-failover

+ + +

Auto-failover is managed with with the GET /settings/autoFailover HTTP method and URI.

+ + +

Description

+

This section provides information about retrieving, enabling, disabling and resetting + auto-failover.

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Auto-failover endpoints
HTTP methodURI pathDescription
GET/settings/autoFailoverRetrieves automatic failover settings. Parameters include: +
    +
  • Enabled=[true |falue] : True to enable failover; false to disable failover.
  • + +
  • timeout=[value] : Integer between 30 and 3600. Specifies the amount of time (in seconds) that a node is down before failover in initiated.
  • + +
  • count=[0 | 1] : Number of times any node in a cluster can be automatically failed-over.
  • + +
+
POST/settings/autoFailoverEnables and disables automatic failover. To enable or disable failover, use the enabled=[true | false] parameter. + To specify the number of seconds that a node must be down before initiating failover, use the timeout parameter.
POST/settings/autoFailover/resetCountResets automatic failover count to 0.
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-cluster-autofailover-reset.html b/preview/contents/REST/rest-cluster-autofailover-reset.html new file mode 100644 index 0000000..a975e9e --- /dev/null +++ b/preview/contents/REST/rest-cluster-autofailover-reset.html @@ -0,0 +1,71 @@ +Resetting auto-failover
+

Resetting auto-failover

+ + +

Auto-failover is reset with the POST /settings/autoFailover/resetCount HTTP method and URI.

+ +

HTTP method and URI

+

Resets the number of nodes that Couchbase Server has automatically failed over. A request + can be sent to reset the auto-failover number to 0. This is a global setting for all + clusters. Authenticated is required to change this value. No parameters are required.

+ + +

+POST /settings/autoFailover/resetCount
+      
+ + +
+ + +

Syntax

+

+curl -X POST -i -u [admin]:[password] \
+  http://localhost:8091/settings/autoFailover/resetCount
+    
+ +
+ + +

Example

+

Curl request example:

+ + +
curl -X POST -i -u admin:password \
+    http://10.5.2.54:8091/settings/autoFailover/resetCount
+
+ + +

Raw HTTP request example:

+ + +
POST /settings/autoFailover/resetCount HTTP/1.1
+Host: localhost:8091
+Content-Type: application/x-www-form-urlencoded
+Authorization: Basic YWRtaW46YWRtaW4=
+
+ +
+ + +

Response codes

+
HTTP/1.1 200 OK
+ +

Possible errors include:

+ +
This endpoint isn't available yet.
+401 Unauthorized
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-cluster-autofailover-settings.html b/preview/contents/REST/rest-cluster-autofailover-settings.html new file mode 100644 index 0000000..34d2995 --- /dev/null +++ b/preview/contents/REST/rest-cluster-autofailover-settings.html @@ -0,0 +1,98 @@ +Retrieving auto-failover settings
+

Retrieving auto-failover settings

+ + +

Auto-failover setting are retrieved with the GET /settins/autoFailover HTTP method and URI.

+ + +

HTTP method and URI

+

Use this request to retrieve any auto-failover settings for a cluster. Auto-failover is a + global setting for all clusters. Authenticated is required to read this value.

+ +
GET /settings/autoFailover
+ + +

Parameters include:

+ +
    +
  • enabled: Value is true or false. True if auto-failover is enabled; + False if it is not.
  • + +
  • timeout: Seconds that must elapse before auto-failover executes on a + cluster.
  • + +
  • count: Value is 0 or 1. Number of times any node in a cluster can be + automatically failed-over. After one auto-failover occurs, the count is set to 1 and + Couchbase server does not perform auto-failover for the cluster again unless the count is + reset to 0. To failover more than one node at a time in a cluster, perform a manual + failover.
  • + +
+ + +
+ + +

Syntax

+

Curl request syntax:

+ +
curl -u [admin]:[password] http://[localhost]:8091/settings/autoFailover
+ + +
+ + +

Example

+

Curl request example

+ +
curl -u admin:password http://10.5.2.54:8091/settings/autoFailover
+
+ +
+ + +

Response

+

If successful Couchbase Server returns any auto-failover settings for the cluster:

+ +
{
+    "count": 0, 
+    "enabled": false, 
+    "timeout": 120
+}
+ + +
+ + + +

Response codes

+

Possible errors include:

+ +
HTTP/1.1 401 Unauthorized
+This endpoint isn't available yet.
+
+ +
GET /settings/autoFailover HTTP/1.1
+Host: localhost:8091
+Authorization: Basic YWRtaW46YWRtaW4=
+Accept: */*
+
+ +
HTTP/1.1 200 OK
+Content-Type: application/json
+Content-Length: nnn
+{ "enabled": false, "timeout": 30, "count": 0 }
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-cluster-details.html b/preview/contents/REST/rest-cluster-details.html new file mode 100644 index 0000000..3a5a853 --- /dev/null +++ b/preview/contents/REST/rest-cluster-details.html @@ -0,0 +1,311 @@ +Viewing cluster details
+

Viewing cluster details

+ + +

Cluster details are retrieved with GET /pools/default HTTP method and URI.

+ +

Description

+

At the highest level, the response for this request describes a cluster, as mentioned + previously. The response contains a number of properties which define attributes of the + cluster and controllers which enable you to make certain requests of the + cluster.

+ + +
Warning: Since buckets could be renamed and there is no way to determine the name for the default + bucket for a cluster, the system attempts to connect non-SASL, non-proxied to a bucket + named "default". If it does not exist, Couchbase Server drops the connection.
+ +

Do not rely on the server list returned by this request to connect to a Couchbase Server. + Instead, issue an HTTP GET call to the bucket to get the node list for that specific + bucket.

+ +
+ + +

HTTP method and URI

+
GET /pools/default
+ + +

The controllers in the server list all accept parameters as + x-www-form-urlencoded, and perform the following functions:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Controller parameters
FunctionDescription
ejectNodeEject a node from the cluster. Required parameter: “otpNode”, the + node to be ejected.
addNodeAdd a node to this cluster. Required parameters: “hostname”, + “user” and “password”. Username and password are for the + Administrator for this node.
rebalanceRebalance the existing cluster. This controller requires both + “knownNodes” and “ejectedNodes”. This enables a client to state the + existing known nodes and designate which nodes should be removed from the + cluster in a single operation. To ensure no cluster state changes + have occurred since a client last got a list of nodes, both the + known nodes and the node to be ejected must be supplied. If the list + does not match the set of nodes, the request will fail with an HTTP + 400 indicating a mismatch. Note rebalance progress is available via + the rebalanceProgress uri.
failoverFailover the vBuckets from a given node to the nodes which have + replicas of data for those vBuckets. The “otpNode” parameter is + required and specifies the node to be failed over.
reAddNodeThe “otpNode” parameter is required and specifies the node to be + re-added.
stopRebalanceStop any rebalance operation currently running. This takes no + parameters.
+
+ +
+ + +

Syntax

+

Curl request syntax:

+ +
curl -u [admin]:[password] http://[localhost]:8091/pools/default
+ + +

HTTP request syntax:

+ +
GET /pools/default
+Host: localhost:8091
+Authorization: Basic xxxxxxxxxxxxxxxxxxx
+Accept: application/json
+X-memcachekv-Store-Client-Specification-Version: 0.1
+
+ +
+ + +

Example

+

To send a request using curl:

+ +

+curl -u Administrator:password http://10.5.2.117:8091/pools/default
+            
+ +
+ + +

Response

+

+
+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  3784  100  3784    0     0   501k      0 --:--:-- --:--:-- --:--:--  527k
+{
+    "alerts": [], 
+    "alertsSilenceURL": "/controller/resetAlerts?token=0&uuid=995618a6a6cc9ac79731bd13240e19b5", 
+    "autoCompactionSettings": {
+        "databaseFragmentationThreshold": {
+            "percentage": 30, 
+            "size": "undefined"
+        }, 
+        "parallelDBAndViewCompaction": false, 
+        "viewFragmentationThreshold": {
+            "percentage": 30, 
+            "size": "undefined"
+        }
+    }, 
+    "buckets": {
+        "terseBucketsBase": "/pools/default/b/", 
+        "terseStreamingBucketsBase": "/pools/default/bs/", 
+        "uri": "/pools/default/buckets?v=109484346&uuid=995618a6a6cc9ac79731bd13240e19b5"
+    }, 
+    "controllers": {
+        "addNode": {
+            "uri": "/controller/addNode?uuid=995618a6a6cc9ac79731bd13240e19b5"
+        }, 
+        "clusterLogsCollection": {
+            "cancelURI": "/controller/cancelLogsCollection?uuid=995618a6a6cc9ac79731bd13240e19b5", 
+            "startURI": "/controller/startLogsCollection?uuid=995618a6a6cc9ac79731bd13240e19b5"
+        }, 
+        "ejectNode": {
+            "uri": "/controller/ejectNode?uuid=995618a6a6cc9ac79731bd13240e19b5"
+        }, 
+        "failOver": {
+            "uri": "/controller/failOver?uuid=995618a6a6cc9ac79731bd13240e19b5"
+        }, 
+        "reAddNode": {
+            "uri": "/controller/reAddNode?uuid=995618a6a6cc9ac79731bd13240e19b5"
+        }, 
+        "reFailOver": {
+            "uri": "/controller/reFailOver?uuid=995618a6a6cc9ac79731bd13240e19b5"
+        }, 
+        "rebalance": {
+            "uri": "/controller/rebalance?uuid=995618a6a6cc9ac79731bd13240e19b5"
+        }, 
+        "replication": {
+            "createURI": "/controller/createReplication?uuid=995618a6a6cc9ac79731bd13240e19b5", 
+            "validateURI": "/controller/createReplication?just_validate=1"
+        }, 
+        "setAutoCompaction": {
+            "uri": "/controller/setAutoCompaction?uuid=995618a6a6cc9ac79731bd13240e19b5", 
+            "validateURI": "/controller/setAutoCompaction?just_validate=1"
+        }, 
+        "setFastWarmup": {
+            "uri": "/controller/setFastWarmup?uuid=995618a6a6cc9ac79731bd13240e19b5", 
+            "validateURI": "/controller/setFastWarmup?just_validate=1"
+        }, 
+        "setRecoveryType": {
+            "uri": "/controller/setRecoveryType?uuid=995618a6a6cc9ac79731bd13240e19b5"
+        }, 
+        "startGracefulFailover": {
+            "uri": "/controller/startGracefulFailover?uuid=995618a6a6cc9ac79731bd13240e19b5"
+        }
+    }, 
+    "counters": {}, 
+    "fastWarmupSettings": {
+        "fastWarmupEnabled": true, 
+        "minItemsThreshold": 10, 
+        "minMemoryThreshold": 10
+    }, 
+    "maxBucketCount": 10, 
+    "name": "default", 
+    "nodeStatusesUri": "/nodeStatuses", 
+    "nodes": [
+        {
+            "clusterCompatibility": 196608, 
+            "clusterMembership": "active", 
+            "couchApiBase": "http://10.5.2.117:8092/", 
+            "hostname": "10.5.2.117:8091", 
+            "interestingStats": {
+                "cmd_get": 0, 
+                "couch_docs_actual_disk_size": 34907796, 
+                "couch_docs_data_size": 33648640, 
+                "couch_views_actual_disk_size": 0, 
+                "couch_views_data_size": 0, 
+                "curr_items": 0, 
+                "curr_items_tot": 0, 
+                "ep_bg_fetched": 0, 
+                "get_hits": 0, 
+                "mem_used": 66961824, 
+                "ops": 0, 
+                "vb_replica_curr_items": 0
+            }, 
+            "mcdMemoryAllocated": 3159, 
+            "mcdMemoryReserved": 3159, 
+            "memoryFree": 2939863040, 
+            "memoryTotal": 4140740608, 
+            "os": "x86_64-unknown-linux-gnu", 
+            "otpCookie": "cjcmfayctwcdgpbk", 
+            "otpNode": "ns_1@10.5.2.117", 
+            "ports": {
+                "direct": 11210, 
+                "httpsCAPI": 18092, 
+                "httpsMgmt": 18091, 
+                "proxy": 11211, 
+                "sslProxy": 11214
+            }, 
+            "recoveryType": "none", 
+            "status": "healthy", 
+            "systemStats": {
+                "cpu_utilization_rate": 1.256281407035176, 
+                "mem_free": 2939863040, 
+                "mem_total": 4140740608, 
+                "swap_total": 6140452864, 
+                "swap_used": 0
+            }, 
+            "thisNode": true, 
+            "uptime": "1815879", 
+            "version": "3.0.0-1209-rel-enterprise"
+        }
+    ], 
+    "rebalanceProgressUri": "/pools/default/rebalanceProgress", 
+    "rebalanceStatus": "none", 
+    "remoteClusters": {
+        "uri": "/pools/default/remoteClusters?uuid=995618a6a6cc9ac79731bd13240e19b5", 
+        "validateURI": "/pools/default/remoteClusters?just_validate=1"
+    }, 
+    "serverGroupsUri": "/pools/default/serverGroups?v=122320066", 
+    "stopRebalanceUri": "/controller/stopRebalance?uuid=995618a6a6cc9ac79731bd13240e19b5", 
+    "storageTotals": {
+        "hdd": {
+            "free": 46188516230, 
+            "quotaTotal": 56327458816, 
+            "total": 56327458816, 
+            "used": 10138942586, 
+            "usedByData": 34907796
+        }, 
+        "ram": {
+            "quotaTotal": 536870912, 
+            "quotaTotalPerNode": 536870912, 
+            "quotaUsed": 536870912, 
+            "quotaUsedPerNode": 536870912, 
+            "total": 4140740608, 
+            "used": 3895349248, 
+            "usedByData": 66961824
+        }
+    }, 
+    "tasks": {
+        "uri": "/pools/default/tasks?v=67144358"
+    }, 
+    "visualSettingsUri": "/internalSettings/visual?v=7111573"
+}
+
+
+ + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-cluster-disable-query.html b/preview/contents/REST/rest-cluster-disable-query.html new file mode 100644 index 0000000..d48f6bd --- /dev/null +++ b/preview/contents/REST/rest-cluster-disable-query.html @@ -0,0 +1,76 @@ +Disabling consistent query results on rebalance
+

Disabling consistent query results on rebalance

+ + +

Ensuring query results consistency is performed with the POST /internalSettings -d indexAwareRebalanceDisabled HTTP method, URI, and parameter.

+ + +

Description

+ +

If queries are performed during rebalance, this setting ensures that query results are + consistent with the original bucket and data organization prior to rebalancing. In other + words, the query results reflect the data on an original node prior to rebalance rather than + data on a node after rebalance started. By default, this functionality is enabled.

+ +
Note: Be aware that rebalance may take significantly more time if you implemented + views for indexing and querying. If rebalance time becomes a critical factor for your + application, this feature can be disabled, however, it is not recommend. Do not disable this + functionality for production applications without thorough testing. To do so may lead to + unpredictable query results during rebalance.
+ +
+ + +

HTTP method and URI

+
POST /internalSettings -d indexAwareRebalanceDisabled
+ + + +
+ + + +

Syntax

+

Curl request syntax:

+ +
curl -v -u [admin]:[password] -X POST
+  http://[localhost]:8091/internalSettings
+  -d indexAwareRebalanceDisabled=[true | false]
+      
+ +
+ + +

Example

+

Curl request example to disable this feature:

+ +
curl -v -u admin:password -X POST
+  http://10.5.2.54:8091/internalSettings
+  -d indexAwareRebalanceDisabled=true
+      
+ +
+ + +

Response

+
HTTP/1.1 200 OK
+Content-Type: application/json
+ +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-cluster-email-notifications.html b/preview/contents/REST/rest-cluster-email-notifications.html new file mode 100644 index 0000000..c800813 --- /dev/null +++ b/preview/contents/REST/rest-cluster-email-notifications.html @@ -0,0 +1,317 @@ +Setting email notifications
+

Setting email notifications

+ +

Alert settings specify whether email alerts are sent and the events that + trigger emails. This is a global setting for all clusters. Authentication is required to + read this value.

+ + +
+

Getting alert settings

+ +
+

HTTP method and URI

+
GET /settings/alerts
+ +
+ + +

Syntax

+ +

Curl request syntax:

+ +
curl -u [admin]:[password ]
+    http://[localhost]:8091/settings/alerts
+
+ +

Raw HTTP request syntax:

+ +
GET /settings/alerts HTTP/1.1
+Host: [localhost]:8091
+Authorization: Basic YWRtaW46YWRtaW4= Accept: */*
+
+ +
+ + + +

Example

+

Curl request example:

+ +
curl -u admin:password 
+    http://10.5.2.54:8091/settings/alerts
+ + +

Raw HTTP request example:

+ +
GET /settings/alerts HTTP/1.1
+Host: 10.5.2.54:8091
+Authorization: Basic YWRtaW46YWRtaW4= Accept: */*
+
+ +
+ + +

Response

+ +
{
+    "alerts": [
+        "auto_failover_node", 
+        "auto_failover_maximum_reached", 
+        "auto_failover_other_nodes_down", 
+        "auto_failover_cluster_too_small", 
+        "ip", 
+        "disk", 
+        "overhead", 
+        "ep_oom_errors", 
+        "ep_item_commit_failed"
+    ], 
+    "emailServer": {
+        "encrypt": false, 
+        "host": "localhost", 
+        "pass": "", 
+        "port": 25, 
+        "user": ""
+    }, 
+    "enabled": false, 
+    "recipients": [
+        "root@localhost"
+    ], 
+    "sender": "couchbase@localhost"
+}
+ +
+ + +

Response codes

+

Possible errors include:

+ +
This endpoint isn't available yet.
+
+ +
+ +
+ +
+ + +
+

Enabling and disabling email notifications

+ +
+

HTTP method and URI

+ +

This is a global setting for all clusters. Authentication is required to change this + value. If this is enabled, Couchbase Server sends an email when certain events + occur. Only events related to auto-failover trigger notification.

+ + +
POST /settings/alerts
+ +

Possible parameters include:

+ +
    +
  • alerts (string) (optional, default: auto_failover_node, + auto_failover_maximum_reached, auto_failover_other_nodes_down, + auto_failover_cluster_too_small). Comma separated list of alerts that should + cause an email to be sent. Possible values are: auto_failover_node, + auto_failover_maximum_reached, auto_failover_other_nodes_down, + auto_failover_cluster_too_small.
  • + +
  • enabled : (true | false) (required). Whether to enable or + disable email notifications
  • + +
  • sender (string) (optional, default: couchbase@localhost). + Email address of the sender.
  • + +
  • recipients (string) (required). A comma separated list of + recipients of the of the emails.
  • + +
  • emailServer host (string) (optional, default: + localhost). Host address of the SMTP server
  • + +
  • emailServer port (integer) (optional, default: 25). + Port of the SMTP server
  • + +
  • emailServer encrypt (true | false) (optional, default: + false). Whether you want to use TLS or not
  • + +
  • emailServer user (string) (optional, default: ""): + Username for the SMTP server
  • + +
  • emailServer pass (string) (optional, default: ""): + Password for the SMTP server
  • + +
+ +
+ + +

Syntax

+ +

Curl request syntax:

+ +
curl -i -u [admin]:[password]
+    http://[localhost]:8091/settings/alerts
+    -d [parameter]
+            
+ +
+ + + +

Example

+

Curl request example:

+ +
curl -i -u admin:password \
+    http://10.5.2.54:8091/settings/alerts
+    -d 'enabled=true&sender=couchbase@10.5.2.54&recipients=admin@10.5.2.54,membi@10.5.2.54&emailHost=10.5.2.54&emailPort=25&emailEncrypt=false' 
+            
+ + +

Raw request example:

+ + +
POST /settings/alerts HTTP/1.1
+Host: 10.5.2.54:8091
+Content-Type: application/x-www-form-urlencoded
+Authorization: Basic YWRtaW46YWRtaW4=
+Content-Length: 14 enabled=true&sender=couchbase@10.5.2.54&recipients=admin@10.5.2.54,membi@localhost&emailHost=10.5.2.54&emailPort=25&emailEncrypt=false�
+
+ +
+ + +

Response codes

+ +
HTTP/1.1 200 OK
+
+ + +

Possible HTTP errors include:

+ + +
400 Bad Request
+401 Unauthorized
+JSON object ({"errors": {"key": "error"}}) with errors.
+
+ + +

Possible errors returned in a JSON document include:

+ + +
    +
  • alerts: alerts contained invalid keys. Valid keys are: + [list_of_keys].
  • + +
  • email_encrypt: emailEncrypt must be either true or false.
  • + +
  • email_port: emailPort must be a positive integer less than 65536.
  • + +
  • enabled: enabled must be either true or false.
  • + +
  • recipients: recipients must be a comma separated list of valid email + addresses.
  • + +
  • sender: sender must be a valid email address.
  • + +
  • general: No valid parameters given.
  • + +
+
+ +
+ +
+ + +
+

Sending test emails

+ + +
This is a global setting for all clusters. Authenticated is required to change this + value. In response to this request, Couchbase Server sends a test email with the + current configurations. This request uses the same parameters used in setting alerts + and additionally an email subject and body.
+ + + +

HTTP method and URI

+ +
POST /settings/alerts/sendTestEmail
+ +
+ + +

Syntax

+

Curl request syntax:

+ + +
curl -i -u admin:password 
+    http://localhost:8091/settings/alerts/testEmail \
+    -d [parameter]
+
+ +

Raw HTTP request syntax

+ + +
POST /settings/alerts/sendTestEmail HTTP/1.1
+Host: [localhost]:8091
+Content-Type: application/x-www-form-urlencoded
+Authorization: Basic YWRtaW46YWRtaW4=
+
+ +
+ + + +

Example

+

Curl request example:

+ +
curl -i -u admin:password 
+    http://10.5.2.54:8091/settings/alerts/testEmail \
+    -d 'subject=Test+email+from+Couchbase& \
+    body=This+email+was+sent+to+you+to+test+the+email+alert+email+server+settings.&enabled=true& \
+    recipients=vmx%4010.5.2.54&sender=couchbase%4010.5.2.54& \
+    emailUser=&emailPass=&emailHost=10.5.2.54&emailPort=25&emailEncrypt=false& \
+    alerts=auto_failover_node%2Cauto_failover_maximum_reached%2Cauto_failover_other_nodes_down%2Cauto_failover_cluster_too_small'
+
+ + + +

Raw HTTP request example:

+ +
POST /settings/alerts/sendTestEmail HTTP/1.1
+Host: 10.5.2.54:8091
+Content-Type: application/x-www-form-urlencoded
+Authorization: Basic YWRtaW46YWRtaW4=
+
+ + +
+ + +

Response codes

+

Possible response code include:

+ +

+200 OK                        
+400 Bad Request: Unknown macro: {"error"} 401 Unauthorized
+This endpoint isn't available yet.
+                    
+ +
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-cluster-get.html b/preview/contents/REST/rest-cluster-get.html new file mode 100644 index 0000000..8810bc4 --- /dev/null +++ b/preview/contents/REST/rest-cluster-get.html @@ -0,0 +1,138 @@ +Retrieving cluster information
+

Retrieving cluster information

+ + +

Cluster information is retrieved with GET /pools HTTP method and URI.

+ + +

HTTP method and URI

+ +

One of the first ways to discover the URI endpoints for the REST API is to find the available + clusters. To find the available clusters, provide the Couchbase Server IP address, port + number, and append /pools.

+ + +

+GET /pools     
+      
+ + +
+ + +

Syntax

+

Curl request syntax:

+ + +
curl -u [admin]:[password] http://[localhost]:8091/pools
+
+ + +

HTTP request syntax:

+ +
GET /pools
+Host: localhost:8091
+Authorization: Basic xxxxxxxxxxxxxxxxxxx
+Accept: application/json
+X-memcachekv-Store-Client-Specification-Version: 0.1
+
+ + +

While the specified server is a member of one cluster, a server can also be aware of other + pools. The Client-Specification-Version is optional in the request, but advised. It enables + implementations to adjust representation and state transitions to the client, if backward + compatibility is desirable.

+ + +
+ + +

Example

+ +

To send a request for cluster information using curl:

+ + +

+curl -u Administrator:password http://10.5.2.117:8091/pools        
+      
+ +
+ + +

Response

+ +

Couchbase Server returns only one cluster per group of systems and the cluster typically + has a default name. Couchbase Server returns the build number for the server in + implementationVersion and the specifications supported are in + componentsVersion.

+ + +

The corresponding HTTP response contains a JSON document describing the cluster + configuration.

+ + +

+  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+                                 Dload  Upload   Total   Spent    Left  Speed
+100  1037  100  1037    0     0  64294      0 --:--:-- --:--:-- --:--:-- 69133
+{
+    "componentsVersion": {
+        "ale": "3.0.0-1209-rel-enterprise", 
+        "asn1": "2.0.4", 
+        "compiler": "4.9.4", 
+        "couch": "2.1.1r-432-gc2af28d", 
+        "couch_index_merger": "2.1.1r-432-gc2af28d", 
+        "couch_set_view": "2.1.1r-432-gc2af28d", 
+        "couch_view_parser": "1.0.0", 
+        "crypto": "3.2", 
+        "inets": "5.9.8", 
+        "kernel": "2.16.4", 
+        "lhttpc": "1.3.0", 
+        "mapreduce": "1.0.0", 
+        "mochiweb": "2.4.2", 
+        "ns_server": "3.0.0-1209-rel-enterprise", 
+        "oauth": "7d85d3ef", 
+        "os_mon": "2.2.14", 
+        "public_key": "0.21", 
+        "sasl": "2.3.4", 
+        "ssl": "5.3.3", 
+        "stdlib": "1.19.4", 
+        "syntax_tools": "1.6.13", 
+        "xmerl": "1.3.6"
+    }, 
+    "implementationVersion": "3.0.0-1209-rel-enterprise", 
+    "isAdminCreds": true, 
+    "isEnterprise": true, 
+    "isROAdminCreds": false, 
+    "pools": [
+        {
+            "name": "default", 
+            "streamingUri": "/poolsStreaming/default?uuid=995618a6a6cc9ac79731bd13240e19b5", 
+            "uri": "/pools/default?uuid=995618a6a6cc9ac79731bd13240e19b5"
+        }
+    ], 
+    "settings": {
+        "maxParallelIndexers": "/settings/maxParallelIndexers?uuid=995618a6a6cc9ac79731bd13240e19b5", 
+        "viewUpdateDaemon": "/settings/viewUpdateDaemon?uuid=995618a6a6cc9ac79731bd13240e19b5"
+    }, 
+    "uuid": "995618a6a6cc9ac79731bd13240e19b5"
+}
+
+ + + +
+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-cluster-intro.html b/preview/contents/REST/rest-cluster-intro.html new file mode 100644 index 0000000..d1749a2 --- /dev/null +++ b/preview/contents/REST/rest-cluster-intro.html @@ -0,0 +1,201 @@ +Cluster API
+

Cluster API

+ + +

The Cluster REST API manages cluster operations.

+ +

Description

+

Cluster operations include managing server nodes, viewing cluster details, viewing cluster + information, and managing auto-failover.

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Cluster endpoints
HTTP methodURI pathDescription
GET/poolsRetrieves cluster information.
GET/pools/defaultRetrieves cluster details.
POST/controller/addNodeAdds nodes to clusters.
POST/node/controller/doJoinClusterJoins nodes into clusters
POST/controller/ejectNodeentryRemoves nodes from clusters.
GET, POST, PUT, DELETE/pools/default/serverGroupsManages rack zone awareness (server groups).
POST/controller/rebalanceRebalances nodes in a cluster.
GET, POST/internalSettingsManages internal settings. Couchbase Server use only.
GET, POST/settings/maxParallelIndexersManages parallel indexer configuration. Couchbase Server use only.
GET, POST/settings/autoFailoverManages automatic failover for clusters.
GET, POST/settings/autoFailover/resetCountResets automatic failover for clusters.
GET, POST/settings/alertsManages alerts for email notifications.
POST/settings/alerts/testEmailCreates test email for email notifications.
POST/settings/alerts/sendTestEmailSends test email for email notifications.
+
+ + + + + +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-cluster-joinnode.html b/preview/contents/REST/rest-cluster-joinnode.html new file mode 100644 index 0000000..8af8eae --- /dev/null +++ b/preview/contents/REST/rest-cluster-joinnode.html @@ -0,0 +1,143 @@ +Joining nodes into clusters
+

Joining nodes into clusters

+ + +

Nodes can be added to clusters with the POST /node/controller/doJoinCluster HTTP method and URI.

+ +

Description

+

This REST request adds an individual server node to a cluster. + Two clusters can not be merged together into a single cluster, however, a single node + can be added to an existing cluster. The clusterMemberHostIp and + clusterMemberPort parameters must be specified to add a node to a + cluster.

+ +
+ + +

HTTP method and URI

+

+POST /node/controller/doJoinCluster
+			
+ + + +

The following parameters are required:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. /node/controller/doJoinCluster parameters
ArgumentDescription
clusterMemberHostIpHostname or IP address of a member of the cluster that the node receiving the POST is + joining.
clusterMemberPortPort number for the RESTful interface to the system. If the cluster + requires credentials, provide the administrator username and + password.
+
+ +
+ + + +

Syntax

+ +

HTTP request syntax:

+ +
POST /node/controller/doJoinCluster
+Host: localhost:8091
+Authorization: Basic xxxxxxxxxxxx
+Accept: */*
+Content-Length: xxxxxxxxxx
+Content-Type: application/x-www-form-urlencoded
+clusterMemberHostIp=[ip-address]&clusterMemberPort=[port]&user=[admin]&password=[password]
+
+ + +

Curl request syntax:

+ +
curl -u [admin]:[password] -d clusterMemberHostIp=[ip-address] \
+	-d clusterMemberPort=[port] \
+	-d user=[admin] -d password=[password]
+	http://[localhost]:8091/node/controller/doJoinCluster
+
+ +
+ + + +

Example

+ +

HTTP request example:

+ +
POST /node/controller/doJoinCluster
+Host: 10.5.2.54:8091
+Authorization: Basic xxxxxxxxxxxx
+Accept: */*
+Content-Length: xxxxxxxxxx
+Content-Type: application/x-www-form-urlencoded
+clusterMemberHostIp=192.168.0.1&clusterMemberPort=8091&user=admin&password=admin123
+
+ + +

Curl request example:

+ + +
curl -u admin:password -d clusterMemberHostIp=192.168.0.1 \
+	-d clusterMemberPort=8091 \
+	-d user=admin -d password=password
+	http://10.5.2.54:8091/node/controller/doJoinCluster
+
+ + +
+ + + + +

Response codes

+ +
200 OK with Location header pointing to pool details of pool just joined - successful join
+400 Bad Request - missing parameters, etc.
+401 Unauthorized - credentials required, but not supplied
+403 Forbidden bad credentials - invalid credentials
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-cluster-rebalance.html b/preview/contents/REST/rest-cluster-rebalance.html new file mode 100644 index 0000000..1fc3948 --- /dev/null +++ b/preview/contents/REST/rest-cluster-rebalance.html @@ -0,0 +1,333 @@ +Rebalancing nodes
+

Rebalancing nodes

+ +

Nodes are rebalanced with the POST /controller/rebalance HTTP method and URI.

+ + +
+

Description

+ +
+
+

To start a rebalance process, provide the ejectedNodes and + knownNodes parameters. These parameters contain the list of nodes that + have been marked to be ejected and the list of nodes that are known within the cluster.

+ + +

Retrieve information about ejected and known + nodes by getting the current node configuration. This ensures that the client making the + REST API request is aware of the current cluster configuration. Nodes should have been + previously added or marked for removal as appropriate.

+ + +
+ + +

HTTP method and URI

+ +

The information must be + supplied via the ejectedNodes and knownNodes parameters as + a POST operation to the /controller/rebalance endpoint.

+ + +

+POST /controller/rebalance
+      
+ +
+ + +

Syntax

+

+curl -v -X -u [admin]:[password] POST
+  http://[localhost]:8091/controller/rebalance
+  -d ejectedNodes
+  -d knownNodes
+        
+      
+ +
+ + +

Example

+

Curl request example:

+ +
curl -v -X -u admin:password POST 'http://192.168.0.77:8091/controller/rebalance' \
+  -d 'ejectedNodes=&knownNodes=ns_1%40192.168.0.77%2Cns_1%40192.168.0.56'
+
+ + +

Raw HTTP request example:

+ +
POST /controller/rebalance HTTP/1.1
+Authorization: Basic QWRtaW5pc3RyYXRvcjpUYW1zaW4=
+User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
+Host: 192.168.0.77:8091
+Accept: */*
+Content-Length: 63
+Content-Type: application/x-www-form-urlencoded
+
+ +
+ + +

Response codes

+

The + response is 200 (OK) if the operation was successfully submitted.

+

If the wrong node + information has been submitted, JSON with the mismatch error is + returned:

+ +
{"mismatch":1}
+ +
+ +
+ +
+ + +
+

Getting rebalance progress

+ +
+ + +

HTTP method and URI

+ +

There are two endpoints for rebalance + progress. One is a general request which outputs high-level percentage completion at + /pools/default/rebalanceProgress. The second possible endpoint is one + corresponds to the detailed rebalance report available in the web console.

+ + +

+GET /pools/default/rebalanceProgress
+      
+ +
+ + +

Syntax

+
curl -u [admin]:[password] 
+'[localhost]:8091/pools/default/rebalanceProgress'
+        
+ +
+ + +

Example

+ +

Curl request example that returns a JSON structure containing the current progress information:

+ + +
curl -u admin:password 
+'192.168.0.77:8091/pools/default/rebalanceProgress'
+        
+ + +

Raw HTTP request example:

+ + +
GET /pools/default/rebalanceProgress HTTP/1.1
+Authorization: Basic QWRtaW5pc3RyYXRvcjpUYW1zaW4=
+User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
+Host: 192.168.0.77:8091
+Accept: */*
+
+ +
+ + +

Response

+ +

The + response data packet contains a JSON structure showing the rebalance progress for each node. + The progress figure is provided as a percentage (shown as a floating point value between 0 + and + 1).

+ + +
{
+    "status":"running",
+    "ns_1@192.168.0.56":{"progress":0.2734375},
+    "ns_1@192.168.0.77":{"progress":0.09114583333333337}
+}
+
+ +
+ + +

Example: detailed

+ +

Curl request example with more details about the rebalance:

+ + +
curl -u admin:password
+  'http://192.168.0.77:8091/pools/default/tasks'
+        
+ + +

Raw HTTP request example:

+ + +
GET /pools/default/rebalanceProgress HTTP/1.1
+Authorization: Basic QWRtaW5pc3RyYXRvcjpUYW1zaW4=
+User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
+Host: 192.168.0.77:8091
+Accept: */*
+        
+ +
+ + +

Response: detailed

+

The response data packet contains a JSON structure showing detailed + progress:

+ + +

+{
+  type: "rebalance",
+  recommendedRefreshPeriod: 0.25,
+  status: "running",
+  progress: 9.049479166666668,
+  perNode: {
+    ns_1@10.3.3.61: {
+      progress: 13.4765625
+    },
+    ns_1@10.3.2.55: {
+      progress: 4.6223958333333375
+    }
+  },
+  detailedProgress: {
+    bucket: "default",
+    bucketNumber: 1,
+    bucketsCount: 1,
+    perNode: {
+      ns_1@10.3.3.61: {
+        ingoing: {
+          docsTotal: 0,
+          docsTransferred: 0,
+          activeVBucketsLeft: 0,
+          replicaVBucketsLeft: 0
+        },
+        outgoing: {
+          docsTotal: 512,
+          docsTransferred: 69,
+          activeVBucketsLeft: 443,
+          replicaVBucketsLeft: 511
+        }
+      },
+      ns_1@10.3.2.55: {
+        ingoing: {
+          docsTotal: 512,
+          docsTransferred: 69,
+          activeVBucketsLeft: 443,
+          replicaVBucketsLeft: 0
+        },
+        outgoing: {
+          docsTotal: 0,
+          docsTransferred: 0,
+          activeVBucketsLeft: 0,
+          replicaVBucketsLeft: 443
+        }
+      }
+    }
+  }
+}
+
+ + +

This reponse shows percentage complete for each individual node undergoing rebalance. For each specific + node, it provides the current number of docs transferred and other items. For details and + definitions of these items.

+

If rebalance fails, the following response error occurs:

+ + +
[
+  {
+    "type": "rebalance",
+    "status": "notRunning",
+    "errorMessage": "Rebalance failed. See logs for detailed reason. You can try rebalance again."
+  }
+]
+        
+ +
+ +
+ +
+ + +
+

Adjusting rebalance during compaction

+ +
+ +

Description

+ +

If a rebalance is performed + while a node is undergoing index compaction, rebalance delays may be experienced. The + parameter, rebalanceMovesBeforeCompaction, is used to improve rebalance + performance. If this selection is made, index compaction performance is reduced which can + result in larger index file size.

+ + +

This needs to be made as POST request to the /internalSettings endpoint. + By default, this setting is 64 which specifies the number of vBuckets which are moved per + node until all vBucket movements pauses. After this pause, the system triggers index + compaction. Index compaction is not performed while vBuckets are being moved, + so if a larger value is specified, it means that the server spends less time compacting the index, + which results in larger index files that take up more disk space.

+ +
+ + +

HTTP method and URI

+ +

+POST /internalSettings rebalanceMovesBeforeCompaction
+        
+
+ + +

Syntax

+

Curl request syntax:

+ +
curl -X POST -u admin:password 'http://[localhost]:8091/internalSettings' 
+    -d 'rebalanceMovesBeforeCompaction=[value]'
+
+ + +
+ + +

Example

+

Curl request example:

+ +
curl -X POST -u admin:password 'http://10.5.2.54:8091/internalSettings' 
+    -d 'rebalanceMovesBeforeCompaction=256'
+
+ + + +
+ +
+ +
+ + + + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-cluster-removenode.html b/preview/contents/REST/rest-cluster-removenode.html new file mode 100644 index 0000000..53bc51a --- /dev/null +++ b/preview/contents/REST/rest-cluster-removenode.html @@ -0,0 +1,85 @@ +Removing nodes from clusters
+

Removing nodes from clusters

+ + +

Nodes are removed from clusters with the POST /controller/ejectNode HTTP method and URI.

+ + +

HTTP method and URI

+

Server nodes are typically removed from a cluster when the node is temporarily or permanently + down.

+ + +

+POST /controller/ejectNode        
+      
+ +
+ + +

Syntax

+ +

HTTP request syntax:

+ +
POST /controller/ejectNode
+Host: [localhost]:8091
+Authorization: Basic xxxxxxxxxxxx
+Accept: */*
+Content-Length: xxxxxxxxxx
+Content-Type: application/x-www-form-urlencoded
+otpNode=[node@hostname]
+
+ + +

Curl request syntax:

+ +
curl -u admin:password -d otpNode=[node@hostname] \
+  http://[localhost]:8091/controller/ejectNode
+
+ +
+ + + +

Example

+

HTTP request example:

+ +
POST /controller/ejectNode
+Host: 192.168.0.106:8091
+Authorization: Basic xxxxxxxxxxxx
+Accept: */*
+Content-Length: xxxxxxxxxx
+Content-Type: application/x-www-form-urlencoded
+otpNode=ns_1@192.168.0.107
+
+ + +

Curl request example:

+ +
curl -u admin:password -d otpNode=ns_1@192.168.0.107 \
+  http://192.168.0.106:8091/controller/ejectNode
+
+ +
+ + +

Response codes

+
200 OK - node ejected
+400 Error, the node to be ejected does not exist
+401 Unauthorized - Credentials were not supplied and are required
+403 Forbidden - Credentials were supplied and are incorrect
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-compact-post.html b/preview/contents/REST/rest-compact-post.html new file mode 100644 index 0000000..aef7588 --- /dev/null +++ b/preview/contents/REST/rest-compact-post.html @@ -0,0 +1,71 @@ +Compacting buckets
+

Compacting buckets

+ + +

Bucket compaction is initiated with the POST /pools/default/buckets/[bucket-name]/controller/compactBucket HTTP method and URI

+ +

HTTP method and URI

+

The following URI paths are for compacting buckets data and indexes and for cancelling bucket compaction.

+ + +

+// Compacting
+POST /pools/default/buckets/[bucket-name]/controller/compactBucket
+
+
+// Cancelling compaction
+POST /pools/default/buckets/[bucket-name]/controller/compactBucket
+      
+ + +
Note: Administrative credentials must be provided for the node in the cluster.
+ + +
+ + +

Syntax for compaction

+

To compact data files and indexes associated with a specific bucket, use the following curl request syntax:

+ +
curl -i -v -X POST -u [admin]:[password] 
+  http://[localhost]:8091/pools/default/buckets/[bucket-name]/controller/compactBucket
+
+ + +
+ + +

Syntax for cancelling compaction

+ +

To stop bucket compaction, use the following curl request syntax:

+ + +
curl -i -v -X POST -u [admin]:[password] 
+  http://[localhost]:8091/pools/default/buckets/[bucket-name]/controller/cancelBucketCompaction
+
+ + + +
+ + +

Example

+

Curl example for compacting the default bucket:

+ +
curl -i -v -X POST -u Administrator:password
+  http://10.5.2.54:8091/pools/default/buckets/default/controller/compactBucket
+        
+      
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-compact-spatialviews.html b/preview/contents/REST/rest-compact-spatialviews.html new file mode 100644 index 0000000..b24a542 --- /dev/null +++ b/preview/contents/REST/rest-compact-spatialviews.html @@ -0,0 +1,77 @@ +Compacting spatial views
+

Compacting spatial views

+ + +

Spatial views are compacted with the POST /[bucket-name]/_design/[ddoc-name]/_spatial/_compact HTTP method and URI

+ +

Description

+

Spatial views are not automatically compacted with data and indexes. Instead, each spatial + view must be manually compacted.

+ +
+ + +

HTTP method and URI

+ +

+POST /[bucket-name]/_design/[ddoc-name]/_spatial/_compact        
+        
+ +
+ + +

Syntax

+ +

To compact each spatial view, specify the compaction for the spatial view:

+ + +
http://[localhost]:9500/[bucket-name]/_design/[ddoc-name]/_spatial/_compact
+
+ + + +
This URL contains the following information:
    +
  • [localhost]:9500

    localhost is the IP address for the local host. + The port number, 9500, is unique to the spatial indexing system.

    +
  • + +
  • bucket_name

    The name of the bucket where the design + document is configured.

    +
  • + +
  • ddoc_name +

    The name of the design document that contains the spatial index or + indexes that you want to compact.

    +
  • + +
+
+ + +
+ + +

Example

+ +

To send a request using curl:

+ + +
curl -u admin:password -X POST
+  http://127.0.0.1:9500/default/_design/dev_test_spatial_compaction/_spatial/_compact
+  -H 'Content-type: application/json'
+
+ + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-ddocs-create.html b/preview/contents/REST/rest-ddocs-create.html new file mode 100644 index 0000000..f30694c --- /dev/null +++ b/preview/contents/REST/rest-ddocs-create.html @@ -0,0 +1,221 @@ +Creating design documents
+

Creating design documents

+ + + +

To create a new design document, use the PUT + /bucket/_design/[ddoc-name] HTTP method and URI on the 8092 + port.

+ + +

Description

+

Design documents are used to store one or more view definitions. Views can be defined + within a design document and uploaded to the server.

+ +

Design documents are validated before being created or updated in the system. The validation + checks for valid JavaScript and for the use of valid built-in reduce functions. Any + validation failure is reported as an error.

+ +

The format of the design document should include all the views defined in the design document, + incorporating both the map and reduce functions for each named view.

+ +
Note: When creating a design document, it is recommend that you create a dev design + document and views first and then check the output of the configured views in your + design document. To create a development view, you must explicitly use the + dev_ prefix for the design document name.
+ +
+ + +

HTTP method and URI

+
PUT /bucket/_design/[ddoc-name]
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Request dataDesign document definition (JSON)
Response dataSuccess and stored design document ID
Authentication requiredOptional
+
+ +
+ + +

Syntax

+

Curl request syntax:

+ +
curl -X PUT
+	-u [admin]:[password]
+	-H 'Content-Type: application/json'
+	http://[localhost]:8092/[bucket-name/_design/[ddoc-name]
+			
+ +
+ + + +

Example

+

A design document, byfield can be + created using a text file (byfield.ddoc ) with design document content. + In this example, the view is a development view. + Development view names must have the dev_.

+ + +

Curl request example:

+ + +
curl -X PUT
+	-H 'Content-Type: application/json'
+	http://user:password@10.5.2.117:8092/sales/_design/dev_byfield
+	-d @byfield.ddoc
+
+ +

As a PUT command, the URL is also significant, in that the location designates the name of the design document. + In the example, the URL includes the name of the bucket ( sales ) and the + name of the design document being created is dev_byfield.

+ + +

In the above example:

+ +
    +
  • -X PUT +

    Indicates that an HTTP PUT operation is requested.

    +
  • + +
  • -H 'Content-Type: application/json' +

    Specifies the HTTP header information. Couchbase Server requires the information + to be sent and identified as the application/json datatype. + Information not supplied with the content-type set in this manner is rejected.

    +
  • + +
  • http://user:password@10.5.2.117:8092/sales/_design/dev_byfield +

    The URL, including authentication information, of the bucket where you want the + design document uploaded. The user and password + are either the administration privileges or the bucket name and bucket password for SASL protected buckets. + If the bucket does not have a password, then authentication information is not required.

    +
  • + +
  • -d @byfield.ddoc +

    Specifies that the data payload should be loaded from the file byfield.ddoc.

    +
  • + +
+ +
+ + + + +

Response

+

If successful, the HTTP response code is 201 OK (created) and the returned JSON fields are + ok and ID.

+ +
{
+    "ok":true,
+    "id":"_design/dev_byfield"
+}
+
+ + +

The top-level views field lists one or more view definitions (the + byloc view in this example), and for each view, a corresponding + map() function. For example:

+ + +
{
+   "views" : {
+      "byloc" : {
+         "map" : "function (doc, meta) {\n  if (meta.type == \"json\") 
+         	{\n    emit(doc.city, doc.sales);\n  } else 
+         	{\n    emit([\"blob\"]);\n  }\n}"
+      }
+   }
+}
+
+ + +
+ + +

Response codes

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Response codesDescription
201Document created successfully.
401The item requested not available using the supplied authorization + or authorization not supplied.
+
+ + +

In the event of an error, the returned JSON includes the field error with a short + description and the field reason with a longer description of the + problem.

+ +
+ + + + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-ddocs-delete.html b/preview/contents/REST/rest-ddocs-delete.html new file mode 100644 index 0000000..34b4168 --- /dev/null +++ b/preview/contents/REST/rest-ddocs-delete.html @@ -0,0 +1,157 @@ +Deleting design documents
+

Deleting design documents

+ + +

To delete a design document, use the + DELETE /buckets/_design/[ddocs-name] HTTP request and URI on the 8092 port.

+ +

Description

+

Deleting a design document immediately invalidates the design document and + all views and indexes associated with it. The indexes and stored data on disk are + removed in the background.

+ +
+ + +

HTTP method and URI

+

The design document name follows the /bucket/_design URI.

+ +
DELETE /bucket/_design/[ddoc-name]
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Request DataDesign document definition (JSON)
Response DataSuccess and confirmed design document ID
Authentication RequiredOptional
+
+ + +
+ + + +

Syntax

+

Curl request syntax:

+ +
curl -v -X DELETE 
+  -H 'Content-Type: application/json'
+  -u [admin]:[password]
+  http://[localhost]:8092/default/_design/[ddoc-name]
+
+ + +
Important: The request is issued on the 8092 port.
+ + + +
+ + +

Example

+

Curl request example:

+ +
curl -v -X DELETE
+  http://Administrator:Password@192.168.0.77:8092/default/_design/dev_byfield
+
+ +
+ + +

Response

+

When the design document has been successfully removed, the JSON returned indicates + successful completion and confirmation of the remova.

+ + +
{
+        "ok":true,
+        "id":"_design/dev_byfield"
+}
+
+

Error conditions are returned if the authorization is incorrect or the specified design document + cannot be found.

+ +
+ + +

Response codes

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Response codesDescription
200Request completed successfully.
401The item requested was not available using the supplied + authorization, or authorization was not supplied.
404The requested content could not be found. + The returned content includes further information, as a JSON object, if available.
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-ddocs-get.html b/preview/contents/REST/rest-ddocs-get.html new file mode 100644 index 0000000..34bd107 --- /dev/null +++ b/preview/contents/REST/rest-ddocs-get.html @@ -0,0 +1,268 @@ +Getting design doc information
+

Getting design doc information

+ + +

To retrieve a design document, use the GET /bucket/_design/[ddoc-name] + HTTP method and URI on the 8092 port.

+ +

Description

+

To obtain an existing design document from a bucket, + use the 8092 port and GET /bucket/_design/[ddoc-name] HTTP method + URI ending with the design document name.

+ + +

To retrieve all design documents in a cluster use the 8091 port with the + /pools/default/buckets/[bucket-name]/ddocs URI.

+ + + + +
+ + +

HTTP method and URI

+

To retrieve all the design documents with views defined on a bucket:

+ +
GET /bucket/_design/[ddoc-name]
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Request DataDesign document definition (JSON)
Response DataSuccess and stored design document ID
Authentication Requiredoptional
+
+ + + + +

Parameters:

+ +
+ + +

Syntax

+

Curl request syntax:

+ +
curl -u [admin]:[password] -X GET 
+  http://[localhost]:8092/[bucket-name]/_design/[ddoc-name]
+ + +
Note: HTTP response header includes a JSON document containing the metadata about the + design document being accessed. The information is returned within the + X-Couchbase-Meta header of the returned data. + This information is retrieved by using the -v option to the + curl command.
+ + +

To get design document information from the cluster, the following request is made on the + 8091 port.

+ +
curl -u [admin]:[password] -X GET 
+  http://[localhost]:8091/pools/default/buckets/[bucket-name]/ddocs
+ + + +
+ + +

Examples

+

Curl request example:

+ +
Important: To retrieve design doc information, the request must be made on the 8092 port.
+ + +

To get the existing design document from the bucket test2 + for the development design document ruth and the view ruthView

+ + +
curl -u Administrator:password -X GET 
+  http://10.5.2.117:8092/test2/_design/dev_ruth
+ + +

To get design document information from the cluster, the request must be made on the 8091 port.

+ +
curl -u Administrator:password -X GET 
+  http://10.5.2.117:8091/pools/default/buckets/test2/ddocs
+ + + + + + + +
+ + +

Response

+

Response for the following response on the bucket test2 and the development design doc dev_ruth. + The design document is empty because no data was added.

+ +
curl -u Administrator:password -X GET 
+  http://10.5.2.117:8092/test2/_design/dev_ruth
+ +
{
+    "views": {
+        "ruthView": {
+            "map": "function (doc, meta) {\n  emit(meta.id, null);\n}"
+        }
+    }
+}
+ + +

Response for the following request on the bucket test2.

+ +
curl -u Administrator:password -X GET 
+  http://10.5.2.117:8091/pools/default/buckets/test2/ddocs
+ +
{
+    "rows": [
+        {
+            "controllers": {
+                "compact": "/pools/default/buckets/test2/ddocs/_design%2Fdev_ruth/controller/compactView", 
+                "setUpdateMinChanges": "/pools/default/buckets/test2/ddocs/_design%2Fdev_ruth/controller/setUpdateMinChanges"
+            }, 
+            "doc": {
+                "json": {
+                    "views": {
+                        "ruthView": {
+                            "map": "function (doc, meta) {\n  emit(meta.id, null);\n}"
+                        }
+                    }
+                }, 
+                "meta": {
+                    "id": "_design/dev_ruth", 
+                    "rev": "1-9bdf8353"
+                }
+            }
+        }
+    ]
+}
+      
+ + +

The following response shows that the metadata matches the corresponding metadata for a data document.

+ +

+      * About to connect() to 192.168.0.77 port 8092 (#0)
+      *   Trying 192.168.0.77...
+      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
+      Dload  Upload   Total   Spent    Left  Speed
+      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* connected
+      * Connected to 192.168.0.77 (192.168.0.77) port 8092 (#0)
+      * Server auth using Basic with user 'Administrator'
+      > GET /sales/_design/something HTTP/1.1
+      > Authorization: Basic QWRtaW5pc3RyYXRvcjpUYW1zaW4=
+      > User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
+      > Host: 192.168.0.77:8092
+      > Accept: */*
+      > Content-Type: application/json
+      >
+      < HTTP/1.1 200 OK
+      < X-Couchbase-Meta: {"id":"_design/dev_sample","rev":"5-2785ea87","type":"json"}
+      < Server: MochiWeb/1.0 (Any of you quaids got a smint?)
+      < Date: Mon, 13 Aug 2012 10:45:46 GMT
+      < Content-Type: application/json
+      < Content-Length: 159
+      < Cache-Control: must-revalidate
+      <
+      { [data not shown]
+      100   159  100   159    0     0  41930      0 --:--:-- --:--:-- --:--:-- 53000
+      * Connection #0 to host 192.168.0.77 left intact
+      * Closing connection #0
+      
+ + +

If the view does not exist, the following error is returned:

+ +
{
+   "error":"not_found",
+   "reason":"missing"
+}
+
+ +
+ + +

Response codes

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Response codesDescription
200Request completed successfully.
401The item requested was not available using the supplied + authorization, or authorization was not supplied.
404The requested content could not be found. The returned content + includes further information, as a JSON object, if available.
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-failover-graceful.html b/preview/contents/REST/rest-failover-graceful.html new file mode 100644 index 0000000..eb9c376 --- /dev/null +++ b/preview/contents/REST/rest-failover-graceful.html @@ -0,0 +1,60 @@ +Setting graceful failover
+

Setting graceful failover

+ + +

Graceful failover is initiated via the POST /controller/startGracefulFailover HTTP method and URI.

+ + + +

HTTP method and URI

+

Initiates graceful failover for a specific server node. The server node is + specified with the otpNode=[node@hostname] parameter.

+ +

+POST /controller/startGracefulFailover
+      
+ +
Note: The failover progress can be tracked just like rebalance. After the data is + persisted to disk and replicas are up-to-date, the node is put into the failed over + state.
+ + +
+ + +

Syntax

+ +

+POST /controller/startGracefulFailover
+    otpNode=[node@hostname]
+      
+ + + +
Note: Be sure to update any scripts that implement failover.
+ +
+ + +

Example

+

Curl request example:

+ +

+curl -u Administrator:password -d otpNode=ns_1@10.5.2.118 http://10.5.2.54:8091/controller/startGracefulFailover 
+        
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-get-internal-setting.html b/preview/contents/REST/rest-get-internal-setting.html new file mode 100644 index 0000000..c75f2e4 --- /dev/null +++ b/preview/contents/REST/rest-get-internal-setting.html @@ -0,0 +1,325 @@ +内部設定の表示
+

内部設定の表示

+ +

内部設定でクラスタの挙動を変更します。内部設定はCouchbaseにだけ使用されます。

+ + +
+

説明

+ +
+
+

内部設定はクラスタの挙動やパフォーマンスおよびタイミングを変更し、REST APIでのみアクセスできます。/internalSettings パラメータはサーバレベルで実装されています。

+ + +
警告: これらの設定はCouchbase内でのみ使用され、その他の目的で利用することを考慮していません。
+ + +
注: 最大並列インデクサの設定は、/settings/maxParallelIndexers globalValueを使用してグローバルレベルで実装することも出来ます。
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HTTPURI概要
GET/internalSettingsCouchbaseの内部設定を取得します。
GET/settings/maxParallelIndexersグローバルおよびノード固有の並列インデクサ設定を取得します。
POST/settings/maxParallelIndexers globalValue新しいグローバルおよびノード固有の並列インデクサを設定し取得します。設定範囲: 1〜1024。 デフォルト値: 4
+
+ +
+ + +

レスポンスコード

+ +

+HTTP/1.1 200 OK
+HTTP/1.1 500 Internal Server Error
+      
+ + +
+ +
+ +
+ + + +

内部設定を取得

+ + + +

Couchbaseの内部設定は次のHTTPメソッドとURIで取得できます。GET /internalSettings

+ + + +

HTTPメソッドとURI

+ +
GET /internalSettings
+ +
+ + +

シンタックス

+ +
curl --username=ADMIN --password=PASSWORD HOST:PORT/internalSettings
+ +
+ +

+ +
curl -u admin:password1 http://10.4.2.4:8091/internalSettings
+ +
+ + +

レスポンス

+ +

+{
+    "capiRequestLimit": "", 
+    "dropRequestMemoryThresholdMiB": "", 
+    "indexAwareRebalanceDisabled": false, 
+    "maxBucketCount": 10, 
+    "maxParallelIndexers": 4, 
+    "maxParallelReplicaIndexers": 2, 
+    "rebalanceIgnoreViewCompactions": false, 
+    "rebalanceIndexPausingDisabled": false, 
+    "rebalanceIndexWaitingDisabled": false, 
+    "rebalanceMovesBeforeCompaction": 64, 
+    "rebalanceMovesPerNode": 1, 
+    "restRequestLimit": "", 
+    "xdcrAnticipatoryDelay": 0, 
+    "xdcrCheckpointInterval": 1800, 
+    "xdcrDocBatchSizeKb": 2048, 
+    "xdcrFailureRestartInterval": 30, 
+    "xdcrMaxConcurrentReps": 16, 
+    "xdcrOptimisticReplicationThreshold": 256, 
+    "xdcrWorkerBatchSize": 500
+}    
+ + +
注: 以下の内部パラメータは推奨されません。代わりに/settings/replicationsで同等のパラメータを使います。
xdcrCheckpointInterval
+xdcrDocBatchSizeKb
+xdcrFailureRestartInterval
+xdcrMaxConcurrentReps
+xdcrOptimisticReplicationThreshold
+xdcrWorkerBatchSize      
+
+ + +
+ + +
+ +
+ + +
+

内部設定の変更

+ + +

Couchbaseの内部設定は次のHTTPメソッドとURIで変更できます。POST /internalSettings

+ +

HTTPメソッドとURI

+
POST /internalSettings
+ +
+ +

シンタックス

+

+curl -v -X POST 
+  http://[admin]:[password]@[localhost]:8091/internalSettings -d [parameter]          
+        
+ +
+ + +

+

例えば、バケットの最大数を更新する場合:

+ + +

+curl -v -X POST http://Administrator:password@10.5.2.117:8091/internalSettings -d maxBucketCount=15
+    
+ +
+ + +

レスポンス

+

+* About to connect() to 10.5.2.117 port 8091 (#0)
+*   Trying 10.5.2.117... connected
+* Connected to 10.5.2.117 (10.5.2.117) port 8091 (#0)
+* Server auth using Basic with user 'Administrator'
+> POST /internalSettings HTTP/1.1
+> Authorization: Basic QWRtaW5pc3RyYXRvcjpwYXNzd29yZA==
+> User-Agent: curl/7.21.4 (x86_64-unknown-linux-gnu) libcurl/7.21.4 OpenSSL/0.9.8b zlib/1.2.3
+> Host: 10.5.2.117:8091
+> Accept: */*
+> Content-Length: 17
+> Content-Type: application/x-www-form-urlencoded 
+
+  HTTP/1.1 200 OK
+  Server: Couchbase Server
+  Pragma: no-cache
+  Date: Tue, 09 Sep 2014 01:01:57 GMT
+  Content-Type: application/json
+  Content-Length: 2
+  Cache-Control: no-cache
+  
+* Connection #0 to host 10.5.2.117 left intact
+* Closing connection #0
+ +
+ +
+ +
+ + +
+

最大並列インデクサの設定

+ + +

Couchbaseの内部設定の最大並列インデクサはGETPOSTメソッドと/settings/maxParallelIndexersというURIで取得および設定できます。

+ + +

HTTPメソッドとURI

+

最大並列インデクサのパラメータをグローバルレベルで設定するとき、/settings/maxParallelIndexersというURIとglobalValueパラメータを使用します。この設定値は1〜1024の範囲で、デフォルト値は4です。結果はグローバルおよびノード固有の並列インデクサ設定に反映されます。

+ + +

+GET /settings/maxParallelIndexers
+POST /settings/maxParallelIndexers globalValue
+      
+ + +
+ + +

シンタックス

+ +

+// Example via browser
+http://[localhost]:8091/settings/maxParallelIndexers
+
+// Example via curl
+curl -u [admin]:[password] http://[localhost]:8091/settings/maxParallelIndexers
+        
+ +
+ + +

例: GETの場合

+ + +

現在の設定の閲覧:

+ + +

+curl -u Administrator:password http://10.5.2.117:8091/settings/maxParallelIndexers
+      
+ +
+ + +

レスポンス

+

+{
+    "globalValue": 4, 
+    "nodes": {
+        "ns_1@10.5.2.117": 4
+    }
+}
+      
+ +
+ + +

例: POSTの場合

+ + +

POSTメソッドで/settings/maxParallelIndexersというURIとglobalValueパラメータを使用して設定を変更します。 設定範囲: 1〜1024。 デフォルト値: 4

+ + +

+curl  -X POST -u Administrator:password http://10.5.2.117:8091/settings/maxParallelIndexers -d globalValue=8
+
+ +
+ + +

レスポンス

+ +

+{
+    "globalValue": 8, 
+    "nodes": {
+        "ns_1@10.5.2.117": 8
+    }
+} 
+      
+ + +
+ + +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-logs-get.html b/preview/contents/REST/rest-logs-get.html new file mode 100644 index 0000000..18bf3b0 --- /dev/null +++ b/preview/contents/REST/rest-logs-get.html @@ -0,0 +1,213 @@ +ログ情報の取得
+

ログ情報の取得

+ +

ログ情報は/diag/sasl_logsRESTエンドポイントを介して取得します。

+ + +
+

ログとサーバ情報の取得

+ +
+ +

HTTPメソッドとURI

+ +

GETメソッドで/diagエンドポイントを実行し、ログとサーバの診断情報を取得します。

+ + +
GET /diag
+ +
+ + + +

シンタックス

+

Curlリクエストシンタックス:

+ +
curl -v -X GET -u [administrator]:[password] http://[hostname]:8091/diag
+ +
+ + + +

+

Curlリクエスト例:

+ +

+curl -v -X GET -u Administrator:password
+  http://127.0.0.1:8091/diag
+      
+ +
+ +
+ +
+ + +
+

一般的なログの取得

+ +
+ +

HTTPメソッドとURI

+ +

GETメソッドで/sasl_logsエンドポイントを実行し、一般的なログの一覧を取得します。

+ +
GET /sasl_logs
+ +
+ + + +

シンタックス

+ +

Curlリクエストシンタックス:

+ +
curl -v -X GET -u [administrator]:[password] 
+  http://[hostname]:8091/sasl_logs
+        
+ +
+ + +

+

Curlリクエスト例:

+ + +

+curl -v -X GET -u Administrator:password 
+  http://127.0.0.1:8091/sasl_logs
+        
+ +
+ +
+ +
+ + + + +
+

特定のログ情報を取得

+ +
+ +

HTTPメソッドとURI

+ +

+ GETメソッドで/sasl_logsエンドポイントに特定のログカテゴリを渡して実行し、特定のログ情報を取得します。 +

+ + +
GET /sasl_logs/[log_name]
+ +
+ + +

シンタックス

+

Curlリクエストシンタックス:

+ + +

+curl -v -X GET -u [administrator]:[password] 
+  http://[hostname]:8091/sasl_logs/[log_name]
+      
+ + +

+ logNameには次のログタイプの中から1つ選択してください:

+ +
    +
  • babysitter
  • + +
  • couchdb
  • + +
  • debug
  • + +
  • error
  • + +
  • info
  • + +
  • mapreduce_errors
  • + +
  • ssl_proxy
  • + +
  • stats
  • + +
  • view
  • + +
  • xdcr
  • + +
  • xdcr_errors
  • + +
+ +
+ + +

+ +

SSLプロキシログ情報を取得するときのCurlリクエスト例:

+ + +

+curl -v -X GET -u Administrator:password
+  http://10.5.2.118:8091/sasl_logs/ssl_proxy
+
+ +
+ + +

レスポンス

+ +

次のような情報が返ってきます:

+ + +
* About to connect() to 10.5.2.118 port 8091 (#0)
+*   Trying 10.5.2.118... connected
+* Connected to 10.5.2.118 (10.5.2.118) port 8091 (#0)
+* Server auth using Basic with user 'Administrator'
+> GET /sasl_logs/ssl_proxy HTTP/1.1
+> Authorization: Basic QWRtaW5pc3RyYXRvcjpwYXNzd29yZA==
+> User-Agent: curl/7.21.4 (x86_64-unknown-linux-gnu) libcurl/7.21.4 OpenSSL/0.9.8b zlib/1.2.3
+> Host: 10.5.2.118:8091
+> Accept: */*
+> 
+< HTTP/1.1 200 OK
+< Transfer-Encoding: chunked
+< Server: Couchbase Server
+< Pragma: no-cache
+< Date: Thu, 06 Feb 2014 22:50:12 GMT
+< Content-Type: text/plain; charset=utf-8
+< Cache-Control: no-cache
+< 
+logs_node (ssl_proxy):
+-------------------------------
+[ns_server:info,2014-01-24T11:25:18.066,nonode@nohost:<0.30.0>:ns_ssl_proxy:init_logging:84]Brought up ns_ssl_proxy logging
+[error_logger:info,2014-01-24T11:25:18.082,nonode@nohost:error_logger<0.5.0>:ale_error_logger_handler:log_report:72]
+=========================PROGRESS REPORT=========================
+          supervisor: {local,ns_ssl_proxy_sup}
+             started: [{pid,<0.64.0>},
+                       {name,ns_ssl_proxy_server_sup},
+                       {mfargs,{ns_ssl_proxy_server_sup,start_link,[]}},
+                       {restart_type,permanent},
+                       {shutdown,infinity},
+                       {child_type,supervisor}]
+
+
+ + +
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-node-failover.html b/preview/contents/REST/rest-node-failover.html new file mode 100644 index 0000000..a63d8e5 --- /dev/null +++ b/preview/contents/REST/rest-node-failover.html @@ -0,0 +1,121 @@ +Failing over nodes
+

Failing over nodes

+ + + + +

Nodes are failed over via hard failover via the POST /controller/failOver HTTP method and URI.

+ +

HTTP method and URI

+ +

Failing over a node indicates that the node is no longer available in a cluster and + replicated data on another node should be made available to clients. + This endpoint along with the otpNode parameter (internal node name) fails + over a specific node.

+ +
POST /controller/failOver
+ +
+ + +

Syntax

+ +

HTTP request syntax:

+ +
POST /controller/failOver HTTP/1.1
+Authorization: Basic
+ + +

Curl request syntax:

+ +
curl -v -X POST 
+        -u admin:password http://localhost:port/controller/failOver -d otpNode=[node@hostname]
+
+ +
+ + +

Example

+ + + +

The following examples fails over server node 10.3.3.63 from a cluster + with the local host, 10.5.2.54.

+ + +
curl -v -X POST 
+        -u admin:password http://10.5.2.54:8091/controller/failOver -d otpNode=ns_2@10.3.3.63
+
+ +
+ + + + +

Response codes

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Response codesDescription
200OK
400Bad Request JSON: The RAM Quota value is too small.
401Unauthorized
+
+ +

The following example is a successful response:

+ +
HTTP/1.1 200 OK
+ + +

The following example is an unsuccessful response, for example, if the node does not exist + in the cluster.

+ +
HTTP/1.1 400
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-node-get-info.html b/preview/contents/REST/rest-node-get-info.html new file mode 100644 index 0000000..c11dc19 --- /dev/null +++ b/preview/contents/REST/rest-node-get-info.html @@ -0,0 +1,122 @@ +Getting server node information
+

Getting server node information

+ + +

Server node information is retrieved with the GET /pools/nodes HTTP method and URI.

+ +

HTTP method and URI

+
GET /pools/nodes
+ + +
+ + + +

Syntax

+

Curl request syntax:

+ +
curl -u [admin_name]:[password] http://[localhost]:[port]/pools/nodes
+ + +
+ + +

Example

+

Curl request example for viewing information about nodes that exist in a cluster:

+ + +
curl -u admin:password http://10.5.2.118:8091/pools/nodes
+ + +
+ + + +

Response

+

Couchbase server returns this response in JSON:

+ + +

+      {"storageTotals":
+                    {
+                    "ram":
+                    {
+                    "quotaUsed":10246684672.0,
+                    "usedByData":68584936,
+                    "total":12396216320.0,
+                    "quotaTotal":10246684672.0,
+                    "used":4347842560.0},
+                    "hdd":
+                          {"usedByData":2560504,
+                          "total":112654917632.0,
+                          "quotaTotal":112654917632.0,
+                          "used":10138942586.0,
+                          "free":102515975046.0}
+                     },
+                     "name":"nodes",
+                     "alerts":[],
+                     "alertsSilenceURL":"/controller/resetAlerts?token=0",
+                     "nodes":
+                            [{"systemStats":
+                                      {
+                                      "cpu_utilization_rate":2.5,
+                                      "swap_total":6140452864.0,
+                                      "swap_used":0
+                                      },
+                             "interestingStats":
+                                      {
+                                      "curr_items":0,
+                                      "curr_items_tot":0,
+                                      "vb_replica_curr_items":0
+                                      },
+                              "uptime":"5782",
+                              "memoryTotal":6198108160.0,
+                              "memoryFree":3777110016.0,
+                              "mcdMemoryReserved":4728,
+                              "mcdMemoryAllocated":4728,
+                              "clusterMembership":"active",
+                              "status":"healthy",
+                              "hostname":"10.4.2.5:8091",
+                              "clusterCompatibility":1,
+                              "version":"1.8.1-937-rel-community",
+                              "os":"x86_64-unknown-linux-gnu",
+                              "ports":
+                                      {
+                                      "proxy":11211,
+                                      "direct":11210
+                                      }
+                            .......
+
+                                  }],
+                       "buckets":
+                                {"uri":"/pools/nodes/buckets?v=80502896" },
+                                "controllers":{"addNode":{"uri":"/controller/addNode"},
+                                "rebalance":{"uri":"/controller/rebalance"},
+                                "failOver":{"uri":"/controller/failOver"},
+                                "reAddNode":{"uri":"/controller/reAddNode"},
+                                "ejectNode":{"uri":"/controller/ejectNode"},
+                                "testWorkload":{"uri":"/pools/nodes/controller/testWorkload"}},
+                                "balanced":true,
+                                "failoverWarnings":["failoverNeeded","softNodesNeeded"],
+                                "rebalanceStatus":"none",
+                                "rebalanceProgressUri":"/pools/nodes/rebalanceProgress",
+                                "stopRebalanceUri":"/controller/stopRebalance",
+                                "nodeStatusesUri":"/nodeStatuses",
+                                "stats":{"uri":"/pools/nodes/stats"},
+                                "counters":{"rebalance_success":1,"rebalance_start":1},
+                                "stopRebalanceIsSafe":true}
+
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-node-hostname.html b/preview/contents/REST/rest-node-hostname.html new file mode 100644 index 0000000..511db09 --- /dev/null +++ b/preview/contents/REST/rest-node-hostname.html @@ -0,0 +1,50 @@ +Setting host names
+

Setting host names

+ + +

Host names are set during setup of the server.

+ + +

Description

+ +

Host names are provided when you install a Couchbase Server node, when you add it to an + existing cluster for online upgrade, or via a REST API call. If a node restarts, any host + name that you established is used. A host name cannot be provided for a node that is already + part of a Couchbase cluster.

+ + +
Important: Host names must be specified prior to being added to a cluster.
+ + +
+ + + +

Response

+ +

If you attempt to specify a host name once the node is in the cluster, the server rejects + the request and returns the following:

+ + +
error 400 reason: unknown ["Renaming is disallowed
+        for nodes that are already part of a cluster"]
+ + +
+ + + + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-node-index-path.html b/preview/contents/REST/rest-node-index-path.html new file mode 100644 index 0000000..ac9da37 --- /dev/null +++ b/preview/contents/REST/rest-node-index-path.html @@ -0,0 +1,93 @@ +Setting index paths
+

Setting index paths

+ + +

The path for the index files can be configured with POST /nodes/self/controller/settings.

+ + +

HTTP method and URI

+

The path for the index files is configured with the index_path + parameter.

+ +

+POST /nodes/self/controller/settings
+      
+ +
+ + +

Syntax

+

Curl request syntax:

+ +
curl -X POST -u [admin]:[password]
+    -d index_path=[index file and path]
+    http://[localhost]:8091/nodes/self/controller/settings     
+    
+
+ + + +

Example

+ +

Raw HTTP request:

+ + +
POST /nodes/self/controller/settings HTTP/1.1
+Host: localhost:8091
+Content-Type: application/x-www-form-urlencoded; charset=UTF-8
+Authorization: Basic YWRtaW46YWRtaW4=
+Content-Length: xx path=/var/tmp/test_indexpath
+
+ + +

Curl request example

+ +
curl -X POST -u admin:password \
+    -d index_path=/var/tmp/test_indexpath \
+    http://127.0.0.1:8091/nodes/self/controller/settings
+
+ + +
+ + +

Response codes

+ + +

The HTTP response contains the response code and optional error message:

+ + +
HTTP/1.1 200 OK
+Content-Type: application/json
+Content-Length: 0
+
+ + +
Note: If you try to set the data path at this endpoint, the following error + displays: +

+ERROR: unable to init 10.3.4.23 (400) Bad Request
+{u'error': u'Changing data of nodes that are part of provisioned cluster is not supported'}
+
+ +
+ +
+ + + + + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-node-memory-quota.html b/preview/contents/REST/rest-node-memory-quota.html new file mode 100644 index 0000000..ad57b45 --- /dev/null +++ b/preview/contents/REST/rest-node-memory-quota.html @@ -0,0 +1,183 @@ +Setting memory quota
+

Setting memory quota

+ + +

Memory quota is set with the POST /pools/default HTTP method and URI.

+ + +

HTTP method and URI

+

The memory quota configures how much RAM to be allocated to Couchbase for every node + within the cluster.

+ +
POST /pools/default
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Memory quotaDescription
MethodPOST /pools/default
Request DataPayload with memory quota setting
Response DataEmpty
Authentication Requiredyes
+
+ +
+ + +

Syntax

+ +

Raw HTTP request syntax:

+ + +
POST /pools/default HTTP/1.1
+Host: localhost:8091
+Content-Type: application/x-www-form-urlencoded; charset=UTF-8
+Authorization: Basic YWRtaW46YWRtaW4=
+Content-Length: xx
+memoryQuota=[quotaNumber]   
+ + +

Curl request syntax:

+ +
curl -X POST -u [admin]:[password] -d memoryQuota=[quotaNumber]
+      http://localhost:port/pools/default
+    
+ + + +
+ + +

Example

+ +

Raw HTTP request that sets the memory quota for a cluster at 400MB:

+ + +
POST /pools/default HTTP/1.1
+Host: 127.0.0.1:8091
+Content-Type: application/x-www-form-urlencoded; charset=UTF-8
+Authorization: Basic YWRtaW46YWRtaW4=
+Content-Length: xx
+memoryQuota=400    
+ + + +

Curl request example that sets the memory quota for a cluster at 400MB:

+ + +
curl -X POST -u admin:password -d memoryQuota=400 http://127.0.0.1:8091/pools/default
+
+ +
+ + + +

Response codes

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Response codesDescription
200OK
400Bad Request JSON: The RAM Quota value is too small.
401Unauthorized
+
+ + +

The following is an example HTTP response code:

+ + +
HTTP/1.1 200 OK
+Content-Type: application/json
+Content-Length: 0
+
+ +
+ + + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-node-provisioning.html b/preview/contents/REST/rest-node-provisioning.html new file mode 100644 index 0000000..fcdf371 --- /dev/null +++ b/preview/contents/REST/rest-node-provisioning.html @@ -0,0 +1,45 @@ +Provisioning nodes
+

Provisioning nodes

+ + +

Provisioning refers to creating a new cluster or adding a node to a cluster.

+ + +

Description

+

To provision a node:

+ +
    +
  • Create a new node by installing a new Couchbase Server.
  • + +
  • Configure disk path for the node.
  • + +
  • Optionally configure memory quota for each node within the cluster. +

    Any nodes you add + to a cluster will inherit the configured memory quota. The default memory quota for the + first node in a cluster is 60% of the physical RAM.

    +
  • + +
  • Add the node to your existing cluster.
  • + +
+ + +

Whether you are adding a node to an existing cluster or starting a new cluster, the node’s + disk path must be configured. Your next steps depends on whether you create a new cluster or + add a node to an existing cluster. If you create a new cluster, secure it by providing an + administrative username and password. If you add a node to an existing cluster, obtain the + URI and credentials to use the REST API with that cluster.

+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-node-recovery-incremental.html b/preview/contents/REST/rest-node-recovery-incremental.html new file mode 100644 index 0000000..54fcb3e --- /dev/null +++ b/preview/contents/REST/rest-node-recovery-incremental.html @@ -0,0 +1,75 @@ +Setting recovery type
+

Setting recovery type

+ + +

Node recover type is set with the POST /controller/setRecoverType HTTP method and URI.

+ + +

HTTP method and URI

+

Sets the recovery type to be performed for a node. Recovery options are delta node recovery + or full recovery. The recovery type for a node is set after the node is failed over and before rebalance. + Rebalance is required to apply the recovery.

+ + +

+POST /controller/setRecoveryType
+      
+ +

The progress of setting recovery type can be tracked just like rebalance. After the data is + persisted to disk and replicas are up-to-date, the node is put into the failed over state.

+ +
+ + + +

Syntax

+ +
POST /controller/setRecoveryType
+    otpNode=[node@hostname]
+    recoveryType=[full|delta]
+      
+ +
+ + +

Example

+

The following Curl request example sets delta node recovery.

+ +

+curl -u Administrator:password -d otpNode=ns_1@10.5.2.118 -d recoveryType=delta http://10.5.2.54:8091/controller/setRecoveryType 
+      
+ +
+ + + +

Response codes

+ +

+200       // Request succeeded
+400       // recoveryType and/or otpNode could not be understood by the server
+404       // The cluster is running in a pre-3.0 compatibility mode and thus 
+             cannot satisfy the request
+       
+ +
+ + + + + + + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-node-retrieve-stats.html b/preview/contents/REST/rest-node-retrieve-stats.html new file mode 100644 index 0000000..9569092 --- /dev/null +++ b/preview/contents/REST/rest-node-retrieve-stats.html @@ -0,0 +1,121 @@ +Retrieving statistics
+

Retrieving statistics

+ + +

To retrieve statistics for a node, first retrieve a list of nodes

+ +

HTTP method and URI

+ +

+GET /pools/default/buckets/default/nodes/[host]:[port]/stats
+
+ + +
To obtain statistics for a node: +
    +
  1. Retrieve a list of nodes in a cluster.
  2. + +
  3. Send the statistics request using the IP address and port for a node in the cluster.
  4. + +
+ +
+ +
+ + + +

Syntax

+

Curl request syntax to retrieve a list of nodes:

+ +
curl -u [admin]:[password] http://[localhost]:[port]/pools/default/buckets/default/nodes
+
+ +

Curl request syntax to retrieve statistics about a node:

+ +
curl -u a[admin]:[password] http://[localhost]:[port]/pools/default/buckets/default/nodes/[localhost]%3A[port]/stats
+ +
+ + +

Example

+

Curl request example that retrieves a list of nodes from a cluster:

+ + +
curl -u admin:password http://10.5.2.118:8091/pools/default/buckets/default/nodes
+
+ + +

The curl request for a node list sends the following HTTP request:

+ + +
GET /pools/default/buckets/default/nodes HTTP/1.1
+User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
+Host: 10.5.2.118:8091
+Accept: */*
+
+ + + + + +

If Couchbase Server successfully handles the request, a response similar to the following + displays:

+ + +
{"servers":[
+  {"hostname":"10.5.2.118:8091",
+  "uri":"/pools/default/buckets/default/nodes/10.5.2.118%3A8091",
+  "stats":
+      {"uri":"/pools/default/buckets/default/nodes/10.5.2.118%3A8091/stats"}}
+    ....
+
+ + +

Curl request example to retrieve statistics for a specific server node. Use the node's IP + address and port shown in the response and add /stats as the endpoint:

+ + +
curl -u admin:password http://10.5.2.118:8091/pools/default/buckets/default/nodes/10.5.2.118%3A8091/stats
+
+ + +

The curl request for a node's statistics sends the following HTTP request:

+ + +
GET /pools/default/buckets/default/nodes/10.4.2.4%3A8091/stats HTTP/1.1
+User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
+Host: 10.4.2.4:8091
+Accept: */*
+
+ + + +
+ + +

Response

+ +

The following statistics returned are for the individual bucket associated with that node + in the previous example.

+ + +
{"hostname":"10.5.2.118:8091","hot_keys":[{"name":"[2012-11-05::3:47:01]"
+....
+"samplesCount":60,"isPersistent":true,"lastTStamp":1352922180718,"interval":1000}}
+
+ + + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-node-set-username.html b/preview/contents/REST/rest-node-set-username.html new file mode 100644 index 0000000..8e5719b --- /dev/null +++ b/preview/contents/REST/rest-node-set-username.html @@ -0,0 +1,106 @@ +Setting usernames and passwords
+

Setting usernames and passwords

+ + +

User names and password are specified with the POST /settings/web HTTP method and URI.

+ + +

HTTP method and URI

+

Usernames and passwords can be set at any time, however, it is typically the last step when + adding a node into a new cluster. Clients generally send a new request for cluster + information based on this response.

+ + +
POST /settings/web
+ +
+ + +

Syntax

+

Raw HTTP request syntax:

+ + +
POST /settings/web HTTP/1.1
+Host: [localhost]:8091
+Content-Type: application/x-www-form-urlencoded; charset=UTF-8
+Authorization: Basic YWRtaW46YWRtaW4=
+Content-Length: xx
+username=[admin]&password=[password]&port=8091
+
+ + +

Curl request syntax:

+ +
curl -u [admin]:[password] -d username=[new_admin] \
+-d password=[new_password] \
+-d port=8091 \
+http://[localhost]:8091/settings/web
+
+ +
+ + + +

Example

+

Raw HTTP request example:

+ + +
POST /settings/web HTTP/1.1
+Host: 127.0.0.1:8091
+Content-Type: application/x-www-form-urlencoded; charset=UTF-8
+Authorization: Basic YWRtaW46YWRtaW4=
+Content-Length: xx
+username=Administrator&password=letmein&port=8091
+
+ + + +

Curl request example:

+ + +
curl -u admin:password -d username=Administrator \
+-d password=letmein \
+-d port=8091 \
+http://127.0.0.1:8091/settings/web
+
+ +
+ + +

Response

+

If the parameters are valid, the corresponding HTTP response data indicates the new base + URI.

+ + +
HTTP/1.1 200 OK
+Content-Type: application/json
+Server: Couchbase Server 2.0
+Pragma: no-cache
+Date: Mon, 09 Aug 2010 18:50:00 GMT
+Content-Type: application/json
+Content-Length: 39
+Cache-Control: no-cache no-store max-age=0
+{"newBaseUri":"http://127.0.0.1:8091/"}
+
+ + +
Note: The port number must be specified when username/password is updated. +
+ +
+ + + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-rza.html b/preview/contents/REST/rest-rza.html new file mode 100644 index 0000000..e0b5f56 --- /dev/null +++ b/preview/contents/REST/rest-rza.html @@ -0,0 +1,135 @@ +Server groups API
+

Server groups API

+ + + + +

The server groups REST API refers to the Rack Zone Awareness feature, which enables logical groupings + of servers on a cluster where each + server group physically belongs to a rack or availability zone.

+ +

Description

+

This feature provides the ability to specify that active and corresponding replica partitions + be created on servers that are part of a separate rack or zone. For purposes of the server + group REST API, racks or availability zones are represented as flat space of server groups + with group names. To enable Rack Awareness, all servers in a cluster must be upgraded to use + the Rack Awareness feature.

+ + +
Note: The Rack Awareness feature with its server group capability is an Enterprise + Edition feature.
+ +

The Server groups REST API provides the following capability:

+ +
    +
  • Create server groups
  • + +
  • Edit server groups
  • + +
  • Delete server groups
  • + +
  • Assign servers to server groups.
  • + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Server group endpoints
HTTP methodURI pathDescription
GET/pools/default/serverGroupsRetrieves information about a server group.
POST/pools/default/serverGroupsCreates a server group with a specific name.
PUT/pools/default/serverGroups/<:uuid>Updates the server group information.
PUT/pools/default/serverGroups?rev=<:number>Updates a server’s group memberships.
DELETE/pools/default/serverGroups/<:uuid>Deletes a specific server group.
+
+
+ + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-server-nodes.html b/preview/contents/REST/rest-server-nodes.html new file mode 100644 index 0000000..1eb560e --- /dev/null +++ b/preview/contents/REST/rest-server-nodes.html @@ -0,0 +1,152 @@ +Server nodes API
+

Server nodes API

+ + +

The Server Nodes REST API manages nodes in a cluster.

+ + +

Description

+

A Couchbase Server instance, known as server node, + is a physical or virtual machine running Couchbase Server. Each node is as a member of a cluster.

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Server node endpoints
HTTP methodURI pathDescription
GET/pools/nodesRetrieves information about nodes in a cluster.
POST/controller/setRecoveryTypeSets the recovery type to be performed for a node. Options are delta or + full.
POST/controller/failOverFails over nodes.
POST/controller/startGracefulFailoverSets graceful failover for a specific server node. The server node is specified + with the otpNode=[node_name] parameter.
POST/settings/webSets user names and passwords.
POST/pools/default memoryQuotaThe memoryQuota parameter sets the memory quota.
POST/nodes/self/controller/settingsSets the path for index files.
GET/pools/default/buckets/default/nodes/[host]:[port]/statsRetrieves statistics for a node.
+
+ +
+ + +
+ + + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-servergroup-delete.html b/preview/contents/REST/rest-servergroup-delete.html new file mode 100644 index 0000000..88bc9bc --- /dev/null +++ b/preview/contents/REST/rest-servergroup-delete.html @@ -0,0 +1,40 @@ +Deleting server groups
+

Deleting server groups

+ + +

Server groups are deleted with the DELETE /pools/default/serverGroups/<:uuid> HTTP method and URI.

+ +

HTTP method and URI

DELETE /pools/default/serverGroups/<:uuid> deletes a specific server group. The + server group must be empty for a successful request.

+ +
DELETE /pools/default/serverGroups/<:uuid>
+ +
+ + +

Syntax

+
curl -X DELETE -u <administrator>:<password> 
+  http://<host>:<port>/pools/default/serverGroups/<uuid>
+
+ +
+ + +

Example

+

In the following example, the UUID is the same UUID used in the renaming example.

+ +
curl -X DELETE -u Admin:myPassword 
+  http://192.168.0.1:8091/pools/default/serverGroups/246b5de857e100dbfd8b6dee0406420a
+
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-servergroup-get.html b/preview/contents/REST/rest-servergroup-get.html new file mode 100644 index 0000000..cf524f4 --- /dev/null +++ b/preview/contents/REST/rest-servergroup-get.html @@ -0,0 +1,128 @@ +Getting server group information
+

Getting server group information

+ + +

Server group information is retrieved with the GET /pools/default/serverGroups HTTP method and URI.

+ +

HTTP method and URI

+ +

GET /pools/default/serverGroups retrieves information about server groups. Provides + group information, "groups": [(<groupInfo>)+], where each server + group has unique URIs and UUIDs.

+ + +

+GET /pools/default/serverGroups       
+      
+ +
+ + +

Syntax

+
curl -X GET -u <administrator>:<password> 
+   http://<host>:<port>/pools/default/serverGroups
+
+ +
+ + +

Example

+
curl -X GET -u Admin:myPassword 
+   http://192.168.0.1:8091/pools/default/serverGroups
+
+ +
+ + + + +

Response

+
{"groups":
+   [
+      {
+      "name":"<groupName>", 
+      "uri": "/pools/default/serverGroups?rev=<integer>",
+      "addNodeURI":"/pools/default/serverGroups/0",
+      "nodes":[(<nodeInfo>)+]
+      }
+    ]
+}
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Group argumentsDescription
"groups": [(<groupInfo>)+]Information about server groups.
"name":"<groupName>"Specifies the name of the group. If the group name has a space, for example, + Group A, use double quotes (for example, "Group A"). If the name + does not have spaces (for example, GroupA) double quotes are not required.
"uri":"/pools/default/serverGroups?rev=<integer>"Specifies the URI path and revision integer.
"uri":"/pools/default/serverGroups/<:uuid>"Specifies the URI path and UUID string.
"addNodeURI":"/pools/default/serverGroups/<:uuid>/addNodeSpecifies the URI path and UUID string for adding servers to a server + group.
"nodes": [(<nodeInfo>+)]Information about the servers.
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-servergroup-post-add.html b/preview/contents/REST/rest-servergroup-post-add.html new file mode 100644 index 0000000..817f800 --- /dev/null +++ b/preview/contents/REST/rest-servergroup-post-add.html @@ -0,0 +1,51 @@ +Adding servers to server groups
+

Adding servers to server groups

+ + +

Servers are added to server groups with the POST /pools/default/serverGroups/<:uuid>/addNode HTTP method and URI.

+ +

HTTP method and URI

+

POST /pools/default/serverGroups/<:uuid>/addNode adds a server to a cluster and + assigns it to the specified server group. +

+ +
POST /pools/default/serverGroups/<:uuid>/addNode
+ +
+ + +

Syntax

+
curl -X POST -dhostname=<host>:<port> 
+  -u <administrator>:<password> 
+  http://<host>:<port>/pools/default/serverGroups/<uuid>/addNode
+
+ +
+ + +

Example

+
curl -X POST -dhostname=192.168.0.2:8091 
+  -u Admin:myPassword 
+  http://192.168.0.1:8091/pools/default/serverGroups/246b5de857e100dbfd8b6dee0406420a/addNode
+
+ + +

The server group’s UUID is in the group information

+ +
"name":"Group 2",
+"uri":"/pools/default/serverGroups/d55339548767ceb51b241c61e3b9f036",
+"addNodeURI":"/pools/default/serverGroups/d55339548767ceb51b241c61e3b9f036/addNode",
+
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-servergroup-post-create.html b/preview/contents/REST/rest-servergroup-post-create.html new file mode 100644 index 0000000..b9c2681 --- /dev/null +++ b/preview/contents/REST/rest-servergroup-post-create.html @@ -0,0 +1,45 @@ +Creating server groups
+

Creating server groups

+ + +

Server groups are created with the POST /pools/default/serverGroups HTTP method and URI.

+ +

HTTP method and URI

+

POST /pools/default/serverGroups creates a server group with a specific name. In the + following example, Group A is created. If the group name has a space, for example, Group A, + use double quotes; for example, "Group A".

+ +

+POST /pools/default/serverGroups
+      
+ +
+ + +

Syntax

+
curl -X POST -u <administrator>:<password> 
+  http://<host>:<port>/pools/default/serverGroups 
+  -d name="<groupName>"
+
+ +
+ + +

Example

+
curl -X POST -u Admin:myPassword 
+  http://192.168.0.1:8091/pools/default/serverGroups 
+  -d name="Group A"
+
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-servergroup-put-membership.html b/preview/contents/REST/rest-servergroup-put-membership.html new file mode 100644 index 0000000..27ef29f --- /dev/null +++ b/preview/contents/REST/rest-servergroup-put-membership.html @@ -0,0 +1,91 @@ +Updating server group memberships
+

Updating server group memberships

+ + +

To change server group membership, use the PUT /pools/default/serverGroups HTTP method and URI.

+ +

HTTP method and URI

+ +
PUT /pools/default/serverGroups?rev=<:number>
+ + +

PUT /pools/default/serverGroups?rev=<:number> updates the server’s group + memberships. In the following examples, the group name is optional. If the group name is + provided, it must match the current group name. All servers must be mentioned and + all groups must be mentioned. The URI is used to identify the group.

+ + +

This request moves servers from one server group to another. This request does not permit + server group renaming or removal. In this example, the servers for Group 2 are moved to + Group 1.

+ + +

The following is the group information that is needed to update the server and server + group memberships:

+ + +
{
+   "groups": [( { ("name": <groupName:string>,)? 
+   "uri": "/pools/default/serverGroups/"<uuid>,
+   "nodes": [(<otpNode>)*]
+}
+
+ + +
Note: The PUT request is transactional. The request either succeeds completely or + fails without impact. If all nodes or groups are not passed, a generic error message: "Bad + input" occurs and the server group is removed.
+ + +
+ + +

Syntax

+
curl -d @<inputFile> -X PUT 
+  -u <administrator>:<password> 
+  http://<host>:<port>/pools/default/serverGroups?rev=<number>
+
+ +
+ + +

Example

+

In this example, a JSON file is used.

+ +
curl -d@file.json -X PUT 
+  http://Administrator:asdasd@192.168.0.1:8091/pools/default/serverGroups?rev=120137811
+
+ + +

In this example, the JSON data is provided on the command line.

+ +

+curl -v -X PUT 
+  -u Administrator:password 
+  http://192.168.171.144:8091/pools/default/serverGroups?rev=28418649 
+  -d '{"groups":
+      [{"nodes": [{"otpNode": "ns_1@192.168.171.144"},
+                  {"otpNode": "ns_1@192.168.171.145"}], 
+        "name": "Group 1", 
+        "uri": "/pools/default/serverGroups/0"}, 
+       {"nodes": [], 
+        "name": "Group 2", 
+        "uri": "/pools/default/serverGroups/3ca074a8456e1d4940cfa3b7badc1e22"}] }'
+
+ + +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-servergroup-put.html b/preview/contents/REST/rest-servergroup-put.html new file mode 100644 index 0000000..1b6dd07 --- /dev/null +++ b/preview/contents/REST/rest-servergroup-put.html @@ -0,0 +1,59 @@ +Renaming server groups
+

Renaming server groups

+ + +

Server groups are renamed with the PUT /pools/default/serverGroups/<:uuid> HTTP method and URI.

+ +

HTTP method and URI

+

+PUT /pools/default/serverGroups/<:uuid>
+      
+ + +

PUT /pools/default/serverGroups/<:uuid> renames the server group. Find the UUID + for the server group by using GET, add the UUID to the URI path, and specify a new group + name. In this example, Group A is renamed to Group B. The UUID for the server group is + located in the full URI information for that server group. The UUID remains the same for the + server group after changing the name.

+ + +

For example, the UUID for Group A is located in + the following group information:

+ + +
"name":"Group A",
+"uri":"/pools/default/serverGroups/246b5de857e100dbfd8b6dee0406420a"
+
+ +
+ + + +

Syntax

+
curl -X PUT -u <administrator>:<password> 
+  http://<host>:<port>/pools/default/serverGroups/<uuid> 
+  -d name="<newGroupName>"
+
+ +
+ + +

Example

+
curl -X PUT -u Admin:myPassword 
+  http://192.168.0.1:8091/pools/default/serverGroups/246b5de857e100dbfd8b6dee0406420a 
+  -d name="Group B"
+      
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-user-create.html b/preview/contents/REST/rest-user-create.html new file mode 100644 index 0000000..2a983f2 --- /dev/null +++ b/preview/contents/REST/rest-user-create.html @@ -0,0 +1,113 @@ +参照専用ユーザの作成
+

参照専用ユーザの作成

+ + +

+ 参照専用ユーザはPOST /settings/readOnlyUserのHTTPメソッドとURIで作成できます。 +

+ + +

説明

+

+ 参照専用ユーザを作成するには、ユーザ名とパスワードを指定します。 + 参照専用ユーザを作成するには、管理者権限が必要です。 +

+ + +
注: + usernameはUTF-8の文字列で、スペース、制御文字、あるいは次の文字、 + ()<>@,;:\"/[]?={} を含めることはできません。 + パスワードは制御文字を含まない、6文字以上のUTF-8文字列です。 +
+ +
+ + + +

HTTPメソッドとURI

+

+ 参照専用ユーザはusernamepasswordパラメータを指定して作成します(必須)。 + just_validate=1パラメータは参照専用ユーザのユーザ名とパスワードの検証のみ行います。 +

+ + +
POST /settings/readOnlyUser
+ + +

パラメータ:

+ +
    +
  • username
  • + +
  • password
  • + +
  • just_validate (任意)
  • + +
+ + +

+ このエンドポイントには、もう一つの任意項目、just_validate=1があります。 + just_validate=1パラメータを指定した場合、サーバはユーザの作成を行いません。 + 代わりに、参照専用ユーザのユーザ名とパスワードを検証します。 +

+ +
+ + +

シンタックス

+

基本シンタックス:

+ +
POST /settings/readOnlyUser 
+	-d username=[username] 
+	-d password=[password] 
+ + +

Curlリクエストシンタックス:

+ +
curl -X POST -u [admin]:[password] 
+  http://[localhost]:8091/settings/readOnlyUser 
+  -d username=[username] 
+  -d password=[password] 
+
+ +
+ + +

+

Curlリクエスト例:

+ +
curl -X POST -u Administrator:password 
+  http://10.5.2.117:8091/settings/readOnlyUser 
+  -d username=a_user 
+  -d password=password1 
+
+ + +
+ + +

レスポンス

+

成功した場合、何も結果は表示されません:

+ +
[]
+ + +

+ 参照専用ユーザが作成されたか確認するには、GET /settings/readOnlyAdminNameのHTTPメソッドとURIを利用してください。 +

+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-user-delete.html b/preview/contents/REST/rest-user-delete.html new file mode 100644 index 0000000..05df060 --- /dev/null +++ b/preview/contents/REST/rest-user-delete.html @@ -0,0 +1,61 @@ +参照専用ユーザの削除
+

参照専用ユーザの削除

+ + +

+ 参照専用ユーザはDELETE /settings/readOnlyUserのHTTPメソッドとURIで削除できます。 +

+ +

HTTPメソッドとURI

+ +

ユーザを削除するには、URIを指定します:

+ +
DELETE /settings/readOnlyUser
+ + +
+ + +

シンタックス

+ +

Curlリクエストシンタックス:

+ +
curl -X DELETE -u [admin]:[password] 
+  http://[localhost]:8091/settings/readOnlyUser 
+
+ + +
+ + +

+ +

Curlリクエスト例:

+ +
curl -X DELETE -u Administrator:password 
+  http://10.5.2.117:8091/settings/readOnlyUser 
+
+ + +
+ + +

レスポンス

+

成功した場合、何も結果は表示されません:

+ +
[]
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-user-getname.html b/preview/contents/REST/rest-user-getname.html new file mode 100644 index 0000000..e210a0a --- /dev/null +++ b/preview/contents/REST/rest-user-getname.html @@ -0,0 +1,65 @@ +参照専用ユーザ名の取得
+

参照専用ユーザ名の取得

+ + +

参照専用ユーザの名前はGET /settings/readOnlyAdminNameのHTTPメソッドとURIで取得できます。

+ + +

HTTPメソッドとURI

+

参照専用ユーザ名の取得には、管理者もしくは参照専用の権限が必要です:

+ +
GET /settings/readOnlyAdminName
+ +
+ + + + +

シンタックス

+

Curlリクエストシンタックス:

+ +
curl -u [admin]:[password] 
+  http://[localhost]:8091/settings/readOnlyAdminName
+
+ +
+ + + +

+

Curlリクエスト例

+ +
curl -u Administrator:password
+  http://10.5.2.117:8091/settings/readOnlyAdminName
+
+ +
+ + + +

レスポンス

+

成功すると、参照専用ユーザの名前がペイロードとして返却されます:

+ +
"a_user"
+ + + +

参照専用ユーザが存在しない場合、以下のエラーが返却されます:

+ +
Requested resource not found.
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-user-password-put.html b/preview/contents/REST/rest-user-password-put.html new file mode 100644 index 0000000..d20b774 --- /dev/null +++ b/preview/contents/REST/rest-user-password-put.html @@ -0,0 +1,80 @@ +ユーザパスワードの変更
+

ユーザパスワードの変更

+ + +

+ ユーザパスワードはPUT /settings/readOnlyUserのHTTPメソッドとURIで変更できます。 +

+ + + +

HTTPメソッドとURI

+

参照専用ユーザのパスワードを変更するには、ユーザ名と新しいパスワードを指定します。

+ +
PUT /settings/readOnlyUser
+ + + +

パラメータ:

+ +
    +
  • password
  • + +
+ +
+ + +

シンタックス

+

基本シンタックス:

+ +
PUT /settings/readOnlyUser
+	-d username=[a_name] 
+	-d password=[new_password]
+ + + +

Curlリクエストシンタックス:

+ +
curl -X PUT -u [admin]:[password] 
+  http://[localhost]:8091/settings/readOnlyUser 
+  -d password=[new-password] 
+
+ +
+ + + +

+

Curlリクエスト例:

+ +
curl -X PUT -u Administrator:password 
+  http://10.5.2.117:8091/settings/readOnlyUser 
+  -d password=password2
+
+ +
+ + + + +

レスポンス

+

成功した場合、何も結果は表示されません:

+ +
[]
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-users.html b/preview/contents/REST/rest-users.html new file mode 100644 index 0000000..e10c2f3 --- /dev/null +++ b/preview/contents/REST/rest-users.html @@ -0,0 +1,109 @@ +ユーザAPI
+

ユーザAPI

+ + +

+ 参照専用ユーザは/settings/readOnlyUserのURIエンドポイントで作成できます。 + 参照専用ユーザはひとつしか作成できません。 +

+ + +

説明

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. ユーザエンドポイント
HTTPメソッドURIパス説明パラメータ
POST /settings/readOnlyUser参照専用ユーザの作成username, password, just_validate
PUT /settings/readOnlyUser参照専用ユーザのパスワード変更password
DELETE /settings/readOnlyUser参照専用ユーザの削除なし
GET /settings/readOnlyAdminName参照専用ユーザ名の取得なし
+
+ + +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-views-get.html b/preview/contents/REST/rest-views-get.html new file mode 100644 index 0000000..a2f8416 --- /dev/null +++ b/preview/contents/REST/rest-views-get.html @@ -0,0 +1,381 @@ +Getting views information
+

Getting views information

+ + +

To retrieve views information, access any server node in a cluster on port + 8092.

+ + +

HTTP method and + URI

GET /[bucket-name]/_design/[ddoc-name]/_view/[view-name]
+

Where:

+
    +
  • bucket-name is the name of the bucket.
  • + +
  • ddoc-name is the name of the design document that contains the view.
  • + +
  • view-name is the name of the corresponding view within the design document.
  • + +
+

Development view, the ddoc-name is prefixed with + dev_. For example, the design document beer is + accessible as a development view using dev_beer.

+

Production + views are accessible using their name only.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Request dataNone
Response dataJSON of the rows returned by the view
Authentication requiredNo
+
+ + +

Parameters (optional):

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Views parameters
ParametersTypeDescription
descendingbooleanReturn the documents in descending by key order.
endkeystringStop returning records when the specified key is reached. Key + must be specified as a JSON value.
endkey_docidstringStop returning records when the specified document ID is + reached.
full_setbooleanUse the full cluster data set (development views only).
groupbooleanGroup the results using the reduce function to a group or single row. Note: Do not use + group with group_level because they are not compatible.
group_levelnumericSpecify the group level to be used. Note: Do not use + group_level with group because they are not compatible.
inclusive_endbooleanSpecifies whether the specified end key is included in the result. + Note: Do not use inclusive_end with key + or keys.
keystringReturn only documents that match the specified key. Key must be + specified as a JSON value.
keysarrayReturn only documents that match each of keys specified within + the given array. Key must be specified as a JSON value. Sorting is + not applied when using this option.
limitnumericLimit the number of the returned documents to the specified + number.
on_errorstringSets the response in the event of an error.
Supported values:
    +
  • continue : Continue to generate view + information in the event of an error, including the + error information in the view response stream.
  • + +
  • stop : Stop immediately when an error + condition occurs. No further view information is + returned.
  • + +
+
+ +
reducebooleanUse the reduction function.
skipnumericSkip this number of records before starting to return the + results.
stalestringAllow the results from a stale view to be used.
Supported + values:
    +
  • false : Force a view update before + returning data.
  • + +
  • ok : Allow stale views.
  • + +
  • update_after : Allow stale view, update + view after it has been accessed.
  • + +
+
+
startkeystringReturn records with a value equal to or greater than the + specified key. Key must be specified as a JSON value.
startkey_docidstringReturn records starting with the specified document ID.
+
+
+ + +

Syntax

+

Curl request syntax:

+ +
GET http://[localhost]:8092/[bucket-name]/_design/[ddoc-name]/_view/[view-name]
+ + +

To access a view stored within an SASL password-protected bucket, include the bucket name and + bucket password within the URL of the request:

+ +
GET http://[bucket-name]:[password]@[localhost]:8092/[bucket-name]/_design/[ddoc-name]/_view/[view-name]
+
+ +
Note: Additional arguments to the URL request can be used to select information from the view, + and provide limit, sorting and other options.
+ + +

To output only ten items:

+ +
GET http://[localhost]:8092/[bucket-name]/_design/[ddoc-name]/_view/[view-name]?limit=10
+
+ +
Important: The formatting of the URL follows the HTTP specification. The first argument is + separated from the base URL using a question mark ( ? ). Additional + arguments are separated using an ampersand ( & ). Special + characters are quoted or escaped according to the HTTP standard rules.
+ + + +
+ + +

Example

+

Curl request example:

+ +

In the following example, an empty development view is created with a view name, + ruthView, and a design document name, _design/dev_ruth in the bucket, test2.

+ + +
curl -u Administrator:password -X GET 
+	http://10.5.2.117:8092/test2/_design/dev_ruth/_view/ruthView
+			
+ + + +
+ + +

Response

+

View responses are JSON structures containing information about + the number of rows in the view and the individual view information.

+ + +

The following shows an empty View result from the previous example.

+ + +
{
+    "rows": [], 
+    "total_rows": 0
+}
+ +

The following shows a populated View result:

+ + +
{
+  "total_rows": 576,
+  "rows" : [
+      {"value" : 13000, "id" : "James", "key" : ["James", "Paris"] },
+      {"value" : 20000, "id" : "James", "key" : ["James", "Tokyo"] },
+      {"value" : 5000,  "id" : "James", "key" : ["James", "Paris"] },
+…
+    ]
+}
+
+

The + JSON response returns the following fields:

+
    +
  • total_rows

    A count of the number of rows of information within the stored + View. This shows the number of rows in the full View index, not the number + of rows in the returned data set.

    +
  • + +
  • rows

    An array, with each element of the array containing the returned view data, + consisting of the value, document ID that generated the row, and the + key.

    +
  • + +
+

In the event of an error or incorrect parameters, the HTTP response is a JSON + structure with a basic error field and a more detailed + reason field. For + example:

+
{
+  "error":"bad_request",
+  "reason":"invalid UTF-8 JSON: {{error,{1,\"lexical error: invalid char in json text.\\n\"}},\n\"Paris\"}"
+}
+
+
Note: With client libraries, error response behavior might differ between + client SDKs, but in all cases, an invalid query triggers an error or + exception.
+
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-views-intro.html b/preview/contents/REST/rest-views-intro.html new file mode 100644 index 0000000..188e136 --- /dev/null +++ b/preview/contents/REST/rest-views-intro.html @@ -0,0 +1,115 @@ +Views API
+

Views API

+ + +

The Views REST API is used to index and query JSON documents.

+ +

Description

+

Views are + functions written in JavaScript that can serve several purposes in your + application. You can use them to: find all the documents in your database, + create a copy of data in a document and present it in a specific order, create + an index to efficiently find documents by a particular value or by a particular + structure in the document, represent relationships between documents, and + perform calculations on data contained in documents.

+ + +
Note: View functions are stored in a design document as JSON. You can use the REST API + to manage your design documents.
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Views endpoints
HTTP methodURI pathDescription
GET/[bucket_name]/_design/[ddoc-name]Retrieves design documents.
PUT/[bucket_name]/_design/[ddoc-name]Creates a news design document with one or more views.
DELETE/[bucket_name]/_design/[ddoc-name]Deletes design documents.
GET/[bucket_name]/_design/[ddoc-name]/_view/[view-name]Retrieves views.
POST/internalSettingsChanges the number of simultaneous requests each node can accept.
+
+ + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-views-requests.html b/preview/contents/REST/rest-views-requests.html new file mode 100644 index 0000000..66b48eb --- /dev/null +++ b/preview/contents/REST/rest-views-requests.html @@ -0,0 +1,143 @@ +Limiting views requests
+

Limiting views requests

+ + +

To limit the number of simultaneous view request on a server node, use the >POST /internalSettings HTTP method and URI + and a port-related request parameter.

+ + +

Description

+

Couchbase Server provides limits to incoming connections on a server node. + The limits are to prevent the server from becoming overwhelmed. + When a limit is exceeded, the server rejects the incoming connection, + responds with a 503 HTTP status code, and sets the HTTP Retry-After header.

+ +
    +
  • If the request is made to a REST port, the response body provides the + reason for the rejection.
  • + +
  • If the request is made on a CAPI port, such as a views + request, the server responds with a JSON object with error and reason fields.
  • + +
+ +
+ + +

HTTP method and URI

+
POST /internalSettings
+ + + +

Parameters:

+ +

The following are port-related request parameters:

+ +

By default, these settings do not have a limit.

+ +
    +
  • restRequestLimit +

    Maximum number of simultaneous connections each server node accepts on a REST port. + Diagnostic-related requests and /internalSettings requests are not counted in this limit.

    +
  • + +
  • capiRequestLimit +

    Maximum number of simultaneous connections each server node accepts on a CAPI port. + This port is used for XDCR and views connections.

    +
  • + +
  • dropRequestMemoryThresholdMiB +

    Value in MB. The maximum amount of memory that is used by Erlang VM. + If the amount is exceeded, the server starts dropping incoming connections.

    +
  • + +
+ + +
Important: Keep the default setting unless you experience issues with too many requests impacting a node. + If these thresholds are set too low, too many requests are rejected by the server, + including requests from the Couchbase web console.
+ +
+ + +

Syntax

+

Curl request syntax:

+ +
curl -X POST -u [admin]:[password]
+  http://[localhost]:8091/internalSettings 
+  -d capiRequestLimit=[value]
+
+ + +
+ + +

Example

+

Curl request example:

+ +

The following example limits the number of simultaneous views requests and internal XDCR requests which can be made on a port.

+ +
curl -X POST -u Administrator:password 
+  http://10.5.2.117:8091/internalSettings 
+  -d capiRequestLimit=50
+  -d restRequestLimit=50
+
+ + +
+ + +

Response

+

No response is returned with a curl request changing the rest or capi request limit. + Retrieve the internal settings to see changes.

+ + +

The following example retrieves and shows the internal settings with the rest and capi request limits set to 50:

+ +
curl -u Administrator:password http://10.5.2.117:8091/internalSettings
+        
+        
+{
+    "capiRequestLimit": 50, 
+    "dropRequestMemoryThresholdMiB": "", 
+    "indexAwareRebalanceDisabled": false, 
+    "maxBucketCount": 10, 
+    "maxParallelIndexers": 6, 
+    "maxParallelReplicaIndexers": 2, 
+    "rebalanceIgnoreViewCompactions": false, 
+    "rebalanceIndexPausingDisabled": false, 
+    "rebalanceIndexWaitingDisabled": false, 
+    "rebalanceMovesBeforeCompaction": 64, 
+    "rebalanceMovesPerNode": 1, 
+    "restRequestLimit": 50, 
+    "xdcrAnticipatoryDelay": 0, 
+    "xdcrCheckpointInterval": 1800, 
+    "xdcrDocBatchSizeKb": 2048, 
+    "xdcrFailureRestartInterval": 30, 
+    "xdcrMaxConcurrentReps": 32, 
+    "xdcrOptimisticReplicationThreshold": 256, 
+    "xdcrWorkerBatchSize": 500
+}
+      
+ +
+ + + +
+ + + + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-xdcr-adv-settings.html b/preview/contents/REST/rest-xdcr-adv-settings.html new file mode 100644 index 0000000..0bc7789 --- /dev/null +++ b/preview/contents/REST/rest-xdcr-adv-settings.html @@ -0,0 +1,278 @@ +Managing advanced XDCR settings
+

Managing advanced XDCR settings

+ + +

The XDCR advanced settings change replication behavior, performance, and timing.

+ +

HTTP method and URI

+

The URI endpoints are available to change global settings for cluster replications + and to change settings for a specific replication ID.

+ + +

+POST /settings/replications/
+POST /settings/replications/[replication_id]
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. XDCR URI paths for settings
URI pathDescription
/settings/replications/Global setting supplied to all replications for a cluster.
/settings/replications/[replication-id]Settings for a specific replication for a bucket.
+
+ +
+ + +

Syntax

+

Curl request + syntax:

+

+curl -u [admin]:[password] -X GET http://[localhost]:8091/settings/replication
+curl -u [admin]:[password] -X GET http://[localhost]:8091/settings/replication/[replication-id]
+			
+
+ + +

Example

+

The following example retrieves all replication settings:

+ +
GET /settings/replications
+ + +

+// Curl example
+curl -u Administrator:password 10.5.2.54:8091/settings/replications
+
+// Results
+{
+    "checkpointInterval": 1800, 
+    "connectionTimeout": 180, 
+    "docBatchSizeKb": 2048, 
+    "failureRestartInterval": 30, 
+    "httpConnections": 20, 
+    "maxConcurrentReps": 16, 
+    "optimisticReplicationThreshold": 256, 
+    "pauseRequested": false, 
+    "retriesPerRequest": 2, 
+    "socketOptions": {
+        "keepalive": true, 
+        "nodelay": false
+    }, 
+    "supervisorMaxR": 25, 
+    "supervisorMaxT": 5, 
+    "workerBatchSize": 500, 
+    "workerProcesses": 4
+}
+				
+ + +
+ + +

XDCR advanced settings

+ +

The following parameters are used for setting all replications globally or setting a specific replication ID.

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. XDCR advanced settings
ParameterValueDescription
checkpointIntervalInteger (10 to 14400).Default: 1800. Web console equivalent: XDCR Checkpoint + Interval.
connectionTimeoutInteger (10 to 10000)Default: 180.
docBatchSizeKbInteger (10 to 10000)Default: 2048. Web console equivalent: XDCR Batch Size (KB).
failureRestartIntervalInteger (1 to 300)Default: 30. Web console equivalent: XDCR Failure Retry + Interval.
httpConnectionsInteger (1 to 100)Default: 20. Number of maximum simultaneous HTTP connections + used.
maxConcurrentRepsInteger (2 to 256)Default: 16. Web console equivalent: XDCR Max Replications per + Bucket.
optimisticReplicationThresholdInteger (0 to (20*1024*1024))Default: 256. Web console equivalent: XDCR Optimistic Replication + Threshold.
pauseRequestedBoolean (true or false)Initially set at false. Web console via XDCR > Ongoing + replications > Status. Pauses the XDCR replication + stream. Enterprise Edition only.
retriesPerRequestInteger (1 to 100)Default: 2
socketOptionsTerm. Additional parameters are keepalive (true or false) and nodelay + (false or true).
supervisorMaxRInteger (1 to 1000)Default: 25
supervisorMaxTInteger (1 to 1000)Default: 5
workerProcessesInteger (1 to 128)Default: 4. Web console equivalent: XDCR Workers per Replication. The + number of worker processes for each vbucket replicator in XDCR. This + setting is available with memcached or REST.
workerBatchSizeInteger (500 to 10000)Default: 500. Web console equivalent: XDCR Batch Count.
+
+ +
+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-xdcr-create-ref.html b/preview/contents/REST/rest-xdcr-create-ref.html new file mode 100644 index 0000000..9b5e128 --- /dev/null +++ b/preview/contents/REST/rest-xdcr-create-ref.html @@ -0,0 +1,125 @@ +Creating a destination cluster reference
+

Creating a destination cluster reference

+ + +

To create an XDCR reference to a destination cluster, use the POST /pools/default/remoteClusters HTTP method and URI.

+ + +

Description

+

To use XDCR, source and destination clusters must be established. + A source cluster is the cluster where the original data is stored. A destination cluster is the cluster + where the replica data is stored. Data is copied from the source cluster to the destination cluster.

+ +
+ + + +

HTTP method and URI

+
POST /pools/default/remoteClusters
+ +
+ + + +

Syntax

+

Curl request syntax:

+ +
curl -v -u [admin]:[password] 
+  http://[localhost]:[port]/pools/default/remoteClusters
+  -d uuid=[destination-cluster-uuid]
+  -d name=[destination-cluster-name]
+  -d hostname=[remote-host]:[port]
+  -d username=[admin] 
+  -d password=[password]
+    
+ +
+ + + +

Example

+

Credentials are provided for the source cluster and information, including credentials and + UUID for the destination cluster.

+ +

Curl request example:

+ +
curl -v -u admin:password1 
+  http://10.4.2.4:8091/pools/default/remoteClusters
+  -d uuid=9eee38236f3bf28406920213d93981a3
+  -d name=remote1
+  -d hostname=10.4.2.6:8091
+  -d username=admin 
+  -d password=password2
+    
+ + +

Raw HTTP request example:

+ +
POST /pools/default/remoteClusters HTTP/1.1
+Authorization: Basic QWRtaW5pc3RyYXRvcjpwYXNzd29yZA==
+User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
+Host: 10.4.2.4:8091
+Accept: */*
+Content-Length: 114
+Content-Type: application/x-www-form-urlencoded
+    
+ +
+ + + +

Response

+

If successful, Couchbase Server responds with a JSON response similar to the following:

+ +
{"name":"remote1","uri":"/pools/default/remoteClusters/remote1",
+"validateURI":"/pools/default/remoteClusters/remote1?just_validate=1",
+"hostname":"10.4.2.6:8091",
+"username":"Administrator",
+"uuid":"9eee38236f3bf28406920213d93981a3",
+"deleted":false}
+      
+ +

The following describes the response elements:

+ +
    +
  • (String) name: Name of the destination cluster referenced for XDCR.
  • + +
  • (String) validateURI: URI to validate details of cluster reference.
  • + +
  • (String) hostname: Hostname/IP (and :port) of the remote cluster.
  • + +
  • (String) username: Username for the destination cluster administrator.
  • + +
  • (String) uuid: UUID of the remote cluster reference.
  • + +
  • (Boolean) deleted: Indicates whether the reference to the destination cluster has been + deleted or not.
  • + +
+ +
+ + + + + + + + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-xdcr-create-replication.html b/preview/contents/REST/rest-xdcr-create-replication.html new file mode 100644 index 0000000..aa09498 --- /dev/null +++ b/preview/contents/REST/rest-xdcr-create-replication.html @@ -0,0 +1,104 @@ +Creating XDCR replications
+

Creating XDCR replications

+ + +

To create an XDCR replication, use the POST /controller/createReplication HTTP method and URI.

+ + +

Description

+

Data replication occurs from a source cluster to a destination cluster. + Once a replication is created, data replication between clusters automatically begins.

+ +
+ + +

HTTP method and URI

+ +
POST /controller/createReplication
+ +
+ + +

Syntax

+

Curl request syntax:

+ +
curl -v -X POST -u [admin]:[password] 
+  http://[localhost]:[port]/controller/createReplication
+  -d fromBucket=[bucket-name]
+  -d toCluster=[cluster-name]
+  -d toBucket=[bucket-name]
+  -d replicationType=continuous
+  -d type=[capi | xmem]
+      
+ + +
Note: The type values, capi and xmem, are represented by version1 + and version2 in the web console. Default: xmem. + Because xmem is the default for Type, + this parameter is not required when creating xmem replications. + The replicationType value is always continuous.
+ +
+ + +

Example

+

Curl request example:

+ +
curl -v -X POST -u admin:password1 
+  http://10.4.2.4:8091/controller/createReplication
+  -d fromBucket=beer-sample
+  -d toCluster=remote1
+  -d toBucket=remote_beer
+  -d replicationType=continuous
+  --d type=capi
+      
+ + +

Raw HTTP request:

+ +
POST / HTTP/1.1
+Authorization: Basic QWRtaW5pc3RyYXRvcjpwYXNzd29yZDE=
+User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
+Host: 10.4.2.4:8091
+Accept: */*
+Content-Length: 126
+Content-Type: application/x-www-form-urlencoded
+
+ + +
+ + + +

Response

+ +

If the replication is created, data replication immediately begins replicating data from + the source to destination cluster and a response similar to the following is returned.

+ +
{
+  "id": "9eee38236f3bf28406920213d93981a3/beer-sample/remote_beer",
+  "database": "http://10.4.2.4:8092/_replicator"
+}
+
+ +

The unique document ID returned in the JSON is a reference that is used to delete the replication.

+ +
+ + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-xdcr-data-encrypt.html b/preview/contents/REST/rest-xdcr-data-encrypt.html new file mode 100644 index 0000000..1164da6 --- /dev/null +++ b/preview/contents/REST/rest-xdcr-data-encrypt.html @@ -0,0 +1,195 @@ +Managing XDCR data encryption
+

Managing XDCR data encryption

+ + +

XDCR data encryption provides SSL encryption for data replication. Enterprise Edition only.

+ +

Description

+

The process for configuring XDCR with data encryption involves + configuring the XDCR cluster reference with data encryption enabled, providing the SSL + certificate, and configuring replication.

+
+ + +

HTTP method and URI

+

The following summarizes the HTTP methods used for defining XDCR data encryption:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HTTP methodURI pathDescription
GET/pools/default/remoteClustersGets the destination cluster reference
POST/pools/default/remoteClustersCreates a reference to the destination cluster
PUT/pools/default/remoteClusters/UUIDModifies the destination cluster reference
DELETE/pools/default/remoteClusters/UUIDDeletes the reference to the destination cluster.
+
+ +
+ + + +

Retrieving certificates

+

To retrieve the SSL certificate from the destination cluster to the source cluster use the + following HTTP method and URI:

+ +

HTTP method and URI

+ + +
GET /pools/default/certificate
+ + +

Syntax

+ +
curl http://[remoteHost]:[port]/pools/default/certificate
+ + +

Example

+ +
curl http://remoteHost:8091/pools/default/certificate > ./remoteCert.pem
+ +
+ + + +

Regenerating certificates

+

To regenerate a certificate on a destination cluster, use the following HTTP method and URI:

+ +

HTTP method and URI

+ +
POST /controller/regenerateCertificate
+ + +

Example

+ +
curl -X POST http://Administrator:asdasd@remoteHost:8091/controller/regenerateCertificate
+ +
+ + + +

Configuring XDCR with data encryption

+

A POST to /pools/default/remoteClusters creates the XDCR cluster reference from the + source cluster to the destination cluster. Setting the demandEncryption parameter to + one (1) and providing the certificate name and location enables data encryption.

+ + +

HTTP method and URI

+ +

The following HTTP method and URI modifies the destination cluster reference.

+ +
PUT /pools/default/remoteClusters
+ + + +

Syntax

+ + +
curl –X POST  -u Admin:myPassword
+  http://localHost:port/pools/default/remoteClusters 
+  -d name=<clusterName>             // Remote cluster name
+  -d hostname=<host>:<port>       // FQDN of the remote host.
+  -d username=<adminName>           // Remote cluster Admin name
+  -d password=<adminPassword>       // Remote cluster Admin password
+  -d demandEncryption=[0|1] --data-urlencode "certificate=$(cat remoteCert.pem)"
+
+ + +

Example

+ + +
curl –X POST 
+-d name=remoteName  
+-d hostname=10.3.4.187:8091
+-d username=remoteAdmin –d password=remotePassword
+-d demandEncryption=1 --data-urlencode "certificate=$(cat remoteCert.pem)"
+http://Administrator:asdasd@192.168.0.1:8091/pools/default/remoteClusters/
+
+
+ + + +

Disabling data encryption

+ +

To modify the XDCR configuration so that SSL + data encryption is disabled, execute a PUT from the source cluster to the destination + cluster with demandEncryption=0.

+ + +

HTTP method and URI

+ +
PUT /pools/default/remoteClusters
+ + +

Example

+ +
curl –X PUT  -u Admin:myPassword
+  http://192.168.0.1:8091/pools/default/remoteClusters/
+  -d name=remoteName 
+  -d hostname=10.3.4.187:8091
+  -d username=remoteAdmin –d password=remotePassword
+  -d demandEncryption=0
+
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-xdcr-delete-ref.html b/preview/contents/REST/rest-xdcr-delete-ref.html new file mode 100644 index 0000000..8dde3b3 --- /dev/null +++ b/preview/contents/REST/rest-xdcr-delete-ref.html @@ -0,0 +1,81 @@ +Deleting a destination cluster reference
+

Deleting a destination cluster reference

+ + +

To delete an XDCR reference to a destination cluster, use the DELETE /pools/default/remoteClusters/[destination-cluster-name] HTTP method and URI.

+ + +

Description

+

Once an XDCR reference to a destination cluster is deleted, it is no longer available for replication using XDCR.

+ +
+ + +

HTTP method and URI

+
DELETE /pools/default/remoteClusters/[destination-cluster-name]
+ +
+ + + +

Syntax

+

Curl request syntax:

+ +
curl -v -X DELETE -u [admin]:[password] 
+  http://[localhost]:8091/pools/default/remoteClusters/[destination-cluster-name]
+ + +
+ + +

Example

+

Curl request example:

+ +
curl -v -X DELETE -u admin:password1 
+  http://10.4.2.4:8091/pools/default/remoteClusters/remote1
+ + +

Raw HTTP request example:

+ +
DELETE /pools/default/remoteClusters/remote1 HTTP/1.1
+Authorization: Basic QWRtaW5pc3RyYXRvcjpwYXNzd29yZDE=
+User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
+Host: 10.4.2.4:8091
+Accept: */*
+    
+ +
+ + + + +

Response

+

If successful, Couchbase Server responds with a 200 OK response.

+ +
HTTP/1.1 200 OK
+Server: Couchbase Server 2.0.0-1941-rel-community
+Pragma: no-cache
+
+....
+
+"ok"
+    
+ +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-xdcr-delete-replication.html b/preview/contents/REST/rest-xdcr-delete-replication.html new file mode 100644 index 0000000..2622381 --- /dev/null +++ b/preview/contents/REST/rest-xdcr-delete-replication.html @@ -0,0 +1,53 @@ +Deleting XDCR replications
+

Deleting XDCR replications

+ + +

To delete an XDCR replication, use the DELETE /controller/cancelXDCR HTTP method and URI.

+ + +

Description

+

When a replication is deleted, it stops replication from the source to the destination. If + the replication is re-created the between the same source and destination clusters and buckets, + XDCR resumes replication.

+ +
+ + +

HTTP method and URI

+
DELETE /controller/cancelXDCR/[UUID]/[local-bucket-name]/[remote-bucket-name]
+ +
+ + + +

Example

+

A URL-encoded endpoint is used which contains the unique document ID that references the + replication. The replication can also be deleted via the web console.

+ + +

Curl request example:

+ +
curl -u admin:password1  \
+  http://10.4.2.4:8091/controller/cancelXDCR/9eee38236f3bf28406920213d93981a3%2Fbeer-sample%2Fremote_beer
+  -X DELETE
+      
+ +
+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-xdcr-get-ref.html b/preview/contents/REST/rest-xdcr-get-ref.html new file mode 100644 index 0000000..81c6c6d --- /dev/null +++ b/preview/contents/REST/rest-xdcr-get-ref.html @@ -0,0 +1,113 @@ +Creating a destination cluster reference
+

Creating a destination cluster reference

+ + +

To retrieve an XDCR reference to a destination cluster, use the GET /pools/default/remoteClusters HTTP method and URI.

+ + +

Description

+

To use XDCR, source and destination clusters must be established. + A source cluster is the cluster where the original data is stored. A destination cluster is the cluster + where the replica data is stored. Data is copied from the source cluster to the destination cluster.

+ +
+ + + +

HTTP method and URI

+
GET /pools/default/remoteClusters
+ +
+ + + +

Syntax

+

Curl request syntax:

+ +
curl -u [admin]:[password] 
+    http://[localhost]:8091/pools/default/remoteClusters
+    
+ +
+ + + +

Example

+

When requesting the remote cluster reference, provide credentials for the local cluster + and the hostname and port for the remote cluster.

+ +

Curl request example:

+ +
curl -u [admin]:[password] 
+    http://10.4.2.4:8091/pools/default/remoteClusters
+    
+ + +

Raw HTTP request example:

+ +
GET /pools/default/remoteClusters HTTP/1.1
+Authorization: Basic QWRtaW5pc3RyYXRvcjpwYXNzd29yZA==
+User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8r zlib/1.2.5
+Host: 10.4.2.4:8091
+Accept: */*
+      
+ +
+ + + + +

Response

+

If successful, Couchbase Server responds with a JSON response similar to the following:

+ +
[{
+"name":"remote1",
+"uri":"/pools/default/remoteClusters/remote1",
+"validateURI":"/pools/default/remoteClusters/remote1?just_validate=1",
+"hostname":"10.4.2.6:8091",
+"username":"Administrator",
+"uuid":"9eee38236f3bf28406920213d93981a3",
+"deleted":false
+}]
+
+ +

The following describes the response elements:

+ +
    +
  • (String) name: Name of the destination cluster referenced for XDCR.
  • + +
  • (String) uri: URI for destination cluster information.
  • + +
  • (String) validateURI: URI to validate details of cluster reference.
  • + +
  • (String) hostname: Hostname/IP (and :port) of the remote cluster.
  • + +
  • (String) uuid: UUID of the remote cluster reference.
  • + +
  • (String) username: Username for the destination cluster administrator.
  • + +
  • (Boolean) deleted: Indicates whether the reference to the destination cluster has been + deleted or not.
  • + +
+ + +
+ +
+ + + + +
\ No newline at end of file diff --git a/preview/contents/REST/rest-xdcr-intro.html b/preview/contents/REST/rest-xdcr-intro.html new file mode 100644 index 0000000..03f5f19 --- /dev/null +++ b/preview/contents/REST/rest-xdcr-intro.html @@ -0,0 +1,170 @@ +XDCR API
+

XDCR API

+ + +

The XDCR REST API is used to manage Cross Datacenter Replication (XDCR) + operations.

+ + +

Description

+

Cross Datacenter Replication (XDCR) configuration automatically replicates data between + clusters and between data buckets. When using XDCR, the source and destination clusters are + specified. A source cluster is the cluster from where you want to copy data. A destination + cluster is the cluster where you want the replica data to be stored. When configuring + replication, specify your selections for an individual cluster using Couchbase web console. + XDCR replicates data between specific buckets and specific clusters and replications can be + configured to be either uni-directional or bi-directional. Uni-directional replication means + that XDCR replicates from a source to a destination. Bi-directional replication means that + XDCR replicates from a source to a destination and also replicates from the destination to + the source.

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. XDCR endpoints
HTTP methodURI pathDescription
GET/pools/default/remoteClustersRetrieves the destination cluster reference
POST/pools/default/remoteClustersCreates a reference to the destination cluster
PUT/pools/default/remoteClusters/[UUID]Modifies the destination cluster reference
DELETE/pools/default/remoteClusters/[UUID]Deletes the reference to the destination cluster.
GET/pools/default/certificateRetrieves the certificate from the cluster.
POST/controller/regenerateCertificateRegenerates a certificate on a destination cluster.
DELETE/controller/cancelXDCR/[replication_id]/[source_bucket]/[destination_bucket]Deletes the replication.
GET, POST/settings/replications/Global setting supplied to all replications for a cluster.
GET, POST/settings/replications/[replication_id]Settings for a specific replication for a bucket.
GET/pools/default/buckets/[bucket_name]/stats/[destination_endpoint]Retrieves bucket statistics.
+
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-xdcr-pause-resume.html b/preview/contents/REST/rest-xdcr-pause-resume.html new file mode 100644 index 0000000..1071f7a --- /dev/null +++ b/preview/contents/REST/rest-xdcr-pause-resume.html @@ -0,0 +1,120 @@ +Pausing XDCR replication streams
+

Pausing XDCR replication streams

+ + +

XDCR replication is paused and resumed using the + /settings/replications/ URI path and the pauseRequested + option.

+ +

HTTP method and URI

+ +

+POST /settings/replications/
+POST /settings/replications/[replication_id]
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. XDCR URI paths for settings
URI pathDescription
/settings/replications/Global setting supplied to all replications for a cluster.
/settings/replications/[replication_id]Settings for specific replication for a bucket.
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. XDCR advanced settings
ParameterValueDescription
pauseRequestedBoolean (true or false)Specify true to pause the replication. Specify false to continue replication. + Initially set to false.
+
+ +
+ + +

Syntax

+ +

+# curl -X POST -u [admin]:[password] http://[localhost]:8091/settings/replications -d pauseRequested=[true | false]    
+    
+ +
+ + + + +

Example

+ +

+# curl -X POST -u Administrator:password http://10.5.2.54:8091/settings/replications -d pauseRequested=true    
+    
+ +
+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/REST/rest-xdcr-statistics.html b/preview/contents/REST/rest-xdcr-statistics.html new file mode 100644 index 0000000..5c6f199 --- /dev/null +++ b/preview/contents/REST/rest-xdcr-statistics.html @@ -0,0 +1,539 @@ +Getting XDCR stats
+

Getting XDCR stats

+ +

Requests for XDCR statistics about a destination cluster are performed on the source cluster.

+ + + +
+

Description

+ +
+
+

All XDCR statistical requests use the UUID, a unique identifier for destination cluster. + The UUID is retrieved with the GET /pools/default/remoteClusters HTTP + method and URI. Many of these statistics are exposed in the Couchbase web console.

+ +
Important: You need to provide a properly URL-encoded URI string for the + destination endpoint when requesting XDCR statistics.
+ +
+ + + +

HTTP method and URI

+ +

The destination endpoint follows the + /pools/default/buckets/[bucket_name]/stats/ URI endpoint:

+ +
GET /pools/default/buckets/[bucket_name]/stats/[destination_endpoint]
+                
+ + +

Where the destination endpoint is:

+ +
replications/[remote_UUID]/[source_bucket]/[destination_bucket]/[stat_name]
+ + +

Where the HTTP endpoint string with full URI is:

+ +
http://[localhost]:[port]/pools/default/buckets/[bucket_name]/stats/replications/[remote_UUID]/[source_bucket]/[destination_bucket]/[stat_name]
+                
+ + +

Where the HTTP string with a properly URL-encoded URI is:

+ +
http://[localhost]:[port]/pools/default/buckets/[bucket_name]/stats/replications%2F[remote_UUID]%2F[source_bucket]%2F[destination_bucket]%2F[stat_name]
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Stat nameDescription
docs_writtenNumber of documents written to the destination cluster via + XDCR.
data_replicatedSize of data replicated in bytes.
changes_leftNumber of updates still pending replication.
docs_checkedNumber of documents checked for changes.
num_checkpointsNumber of checkpoints issued in replication queue.
num_failedckptsNumber of checkpoints failed during replication.
size_rep_queueSize of replication queue in bytes.
active_vbrepsActive vBucket replicators.
waiting_vbrepsWaiting vBucket replicators.
time_committingSeconds elapsed during replication.
time_workingTime working in seconds including wait time.
bandwidth_usageBandwidth used during replication.
docs_latency_aggrAggregate time waiting to send changes to destination cluster in + milliseconds.
docs_latency_wtWeighted average latency for sending replicated changes to + destination cluster.
docs_rep_queueNumber of documents in replication queue.
meta_latency_aggrAggregate time to request and receive metadata about documents. + XDCR uses this for conflict resolution prior to sending the document + into the replication queue.
meta_latency_wtWeighted average time for requesting document metadata. XDCR uses + this for conflict resolution prior to sending the document into the + replication queue.
rate_replicationBytes replicated per second.
docs_opt_repdNumber of docs sent optimistically.
+
+ + +
+ +
+ +
+ + +
+

Getting destination cluster info

+ +
+
+

For example, the following code example displays the destination remote name, URI and UUID (among other data):

+ + +

+// curl request example for retrieving the destination cluster UUID
+curl -u Administrator:password http://10.5.2.54:8091/pools/default/remoteClusters            
+
+
+// example results
+[
+    {
+        "deleted": false, 
+        "hostname": "10.5.2.117:8091", 
+        "name": "Remote117", 
+        "uri": "/pools/default/remoteClusters/Remote117", 
+        "username": "Administrator", 
+        "uuid": "995618a6a6cc9ac79731bd13240e19b5", 
+        "validateURI": "/pools/default/remoteClusters/Remote117?just_validate=1"
+    }  
+        
+ +
+ +
+ +
+ + +
+

Retrieving docs_written stats

+ +
+

HTTP method and URI

+

+GET /pools/default/buckets/[bucket_name]/stats/[destination_endpoint]
+                
+ + +

Where the [destination_endpoint] is:

+ +

+replications/[remote_UUID]/[source_bucket]/[destination_bucket]/docs_written
+                
+ + +
+ + +

Syntax

+

Curl request syntax for number of documents written:

+ +
curl -u [admin]:[password] 
+    http://[localhost]:8091/pools/default/buckets/default/stats/replications%2F[remote_UUID]%2F[source_bucket]%2F[destination_bucket]%2Fdocs_written
+                
+ +
+ + +

Example

+

To get the number of documents written:

+ +
curl -u admin:password 
+    http://10.5.2.54:8091/pools/default/buckets/default/stats/replications%2F8ba6870d88cd72b3f1db113fc8aee675%2Fsource_bucket%2Fdestination_bucket%2Fdocs_written
+
+ + +
+ + +

Response

+

The above command produces the following output which shows that XDCR transferred 1 + million documents at each of the timestamps.

+ +
{"samplesCount":60,"isPersistent":true,"lastTStamp":1371685106753,"interval":1000,
+"timestamp":[1371685048753,1371685049754,1371685050753,1371685051753,1371685052753,1371685053753,1371685054753,
+1371685055753,1371685056753,1371685057753,1371685058752,1371685059753,1371685060753,1371685061753,1371685062753,
+1371685063753,1371685064753,1371685065753,1371685066753,1371685067753,1371685068753,1371685069753,1371685070753,
+1371685071753,1371685072753,1371685073753,1371685074753,1371685075753,1371685076753,1371685077753,1371685078753,
+1371685079753,1371685080753,1371685081753,1371685082753,1371685083753,1371685084753,1371685085753,1371685086753,
+1371685087753,1371685088753,1371685089753,1371685090753,1371685091754,1371685092753,1371685093753,1371685094753,
+1371685095753,1371685096753,1371685097753,1371685098753,1371685099753,1371685100753,1371685101753,1371685102753,
+1371685103753,1371685104753,1371685105753,1371685106753],
+"nodeStats":{"127.0.0.1:8091":[1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,
+1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,
+1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,
+1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,1000000,
+1000000,1000000,1000000,1000000,1000000,1000000,1000000]}}
+
+ +
+ +
+ +
+ + +
+

Retrieving rate_replication stats

+ +
+ +

HTTP method and URI

+

+GET /pools/default/buckets/[bucket_name]/stats/[destination_endpoint]
+                
+ + +

Where the [destination_endpoint] is:

+ +

+replications/[remote_UUID]/[source_bucket]/[destination_bucket]/rate_replication
+                
+ + +
+ + +

Syntax

+

Curl request syntax:

+ +
curl -u [admin]:[password] 
+    http://[localhost]:8091/pools/default/buckets/default/stats/replications%2F[remote_UUID]%2F[source_bucket]%2F[destination_bucket]%2Frate_replication
+
+            
+ + +
+ + +

Example

+

Curl request example to get the rate of replication:

+ +
curl -u admin:password 
+    http://10.5.2.54:8091/pools/default/buckets/default/stats/replications%2F8ba6870d88cd72b3f1db113fc8aee675%2Fsource_bucket%2Fdestination_bucket%2Frate_replication
+
+ + +
+ + +

Response

+

This produces the following output:

+ +
{"samplesCount":60,"isPersistent":true,"lastTStamp":1371685006753,"interval":1000,
+"timestamp":[1371684948753,1371684949753,1371684950753,1371684951753,1371684952753,1371684953753,1371684954753,
+1371684955754,1371684956753,1371684957753,1371684958753,1371684959753,1371684960753,1371684961753,1371684962753,
+1371684963753,1371684964753,1371684965753,1371684966753,1371684967753,1371684968752,1371684969753,1371684970753,
+1371684971753,1371684972753,1371684973753,1371684974753,1371684975753,1371684976753,1371684977753,1371684978753,
+1371684979753,1371684980753,1371684981753,1371684982753,1371684983753,1371684984753,1371684985754,1371684986753,
+1371684987754,1371684988753,1371684989753,1371684990753,1371684991753,1371684992753,1371684993753,1371684994753,
+1371684995753,1371684996753,1371684997753,1371684998776,1371684999753,1371685000753,1371685001753,1371685002753,
+1371685003753,1371685004753,1371685005753,1371685006753],
+"nodeStats":{"127.0.0.1:8091":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}}
+
+ +
+ +
+ +
+ + +
+

Retrieving docs_opt_repd stats

+ +
+ +

HTTP method and URI

+

+GET /pools/default/buckets/[bucket_name]/stats/[destination_endpoint]
+                
+ + +

Where the [destination_endpoint] is:

+ +

+replications/[remote_UUID]/[source_bucket]/[destination_bucket]/docs_opt_repd
+                
+ + +
+ + +

Syntax: get replication id

+
curl -s -u admin:password \
+    http://[localhost]:8091/pools/default/tasks
+ +
+ + +

Example: get replication id

+

To get docs_opt_repd, get the replication id for a source and + destination bucket via a list of the active tasks for a cluster:

+ +
curl -s -u admin:password \
+    http://10.5.2.54:8091/pools/default/tasks
+
+ +
+ + +

Response

+

This results in output as follows:

+ +
....
+    "id": "def03dbf5e968a47309194ebe052ed21\/bucket_source\/bucket_destination", 
+    "source": "bucket_source",
+    "target":"\/remoteClusters\/def03dbf5e968a47309194ebe052ed21\/buckets\/bucket_name", 
+    "continuous": true, 
+    "type": "xdcr", 
+    ....
+
+ +
+ + +

Example: get docs_opt_repd stats

+

With this replication id, retrieve a sampling of stats for docs_opt_repd:

+ + +
curl -s -u admin:password \
+http://10.3.121.119:8091/pools/default/buckets/default/stats/ \
+replications%2fdef03dbf5e968a47309194ebe052ed21%2fbucket_source%2fbucket_destination%2fdocs_opt_repd 
+
+ +
+ + +

Response

+

This results in output similar to the following:

+ +
{ 
+       "samplesCount":60, 
+       "isPersistent":true, 
+       "lastTStamp":1378398438975, 
+       "interval":1000, 
+       "timestamp":[ 
+          1378398380976, 
+          1378398381976,
+          ....
+
+ +
+ +
+ +
+ + +
+

Retrieving incoming write operations

+ +
+ +

HTTP method and URI

+

+GET /pools/default/buckets/[bucket_name]/stats
+            
+ +
+ + +

Syntax

+

To retrieve the incoming write operations that occur on a destination cluster due to + replication, make the request on your destination cluster.

+ +

Curl request syntax:

+ + +
curl -u [admin]:[password] -X GET
+    http://[Destination_IP]:8091/pools/default/buckets/[bucket_name]/stats
+
+ +
+ + +

Example

+

Curl request example:

+ +
curl -u admin:password -X GET
+    http://10.5.2.117:8091/pools/default/buckets/testbucket2/stats
+
+ +
+ + +

Response

+

This returns results for all stats. Within the JSON response, find the array + xdc_ops. The value for this attribute is the last sampling of + write operations on an XDCR destination cluster.

+ +
{
+.................
+"xdc_ops":[0.0,0.0,0.0,0.0,633.3666333666333,1687.6876876876877, \
+2610.3896103896104,3254.254254254254,3861.138861138861,4420.420420420421, \
+................
+}
+        
+ + +
+ +
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Tasks/backup-cbbackup.html b/preview/contents/Tasks/backup-cbbackup.html new file mode 100644 index 0000000..deecfe8 --- /dev/null +++ b/preview/contents/Tasks/backup-cbbackup.html @@ -0,0 +1,339 @@ +Backing up with cbbackup
+

Backing up with cbbackup

+ +
+

The cbbackup tool is a flexible backup command that enables you to backup + both local data and remote nodes and clusters involving different combinations of your + data:

+ +
    +
  • Single bucket on a single node
  • + +
  • All the buckets on a single node
  • + +
  • Single bucket from an entire cluster
  • + +
  • All the buckets from an entire cluster
  • + +
+ +

Backups can be performed either locally, by copying the files directly on a single node, or + remotely by connecting to the cluster and then streaming the data from the cluster to your + backup location. Backups can be performed either on a live running node or cluster, or on an + offline node.

+

The cbbackup command stores data in a format that enables + easy restoration. When restoring, using `cbrestore`, you can restore back to a cluster of + any configuration. The source and destination clusters do not need to match if you used + `cbbackup` to store the information.

+

The cbbackup command will copy the + data in each course from the source definition to a destination backup directory. The backup + file format is unique to Couchbase and enables you to restore, all or part of the backed up + data when restoring the information to a cluster. Selection can be made on a key (by regular + expression) or all the data stored in a particular vBucket ID. You can also select to copy the + source data from a bucketname into a bucket of a different name on the cluster on which you + are restoring the data.

+

The cbbackup command takes the following + arguments:

+ + +
cbbackup [options] [source] [backup_dir] 
+ + +
Note: The cbbackup tool is located within the standard Couchbase + command-line directory.

Be aware that cbbackup does not support external IP + addresses. This means that if you install Couchbase Server with the default IP address, you + cannot use an external hostname to access it.

+
+ + +

The following are cbbackup [options] arguments:

+ + +

These options are used to configure username and password information for connecting to + the cluster, backup type selection, and bucket selection. One or more options can be used. + The primary options select what will be backed up by cbbackup, including:

+ + +
    +
  • --single-node +

    Only back + up the single node identified by the source specification.

    + +
  • + +
  • --bucket-source or -b +

    Backup only + the specified bucket name.

    + +
  • + +
+ + +

The following are cbbackup [source] arguments:

+ +

The source for the data, either a local data directory + reference, or a remote node/cluster specification:

+ + +
    +
  • Local Directory Reference +

    A local + directory specification is defined as a URL using the `couchstore-files` protocol. For example:

    + + couchstore-files:///opt/couchbase/var/lib/couchbase/data/default +

    Using this method you + are specifically backing up the specified bucket data on a single node only. To backup an entire + bucket data across a cluster, or all the data on a single node, you must use the cluster node + specification. This method does not backup the design documents defined within the bucket.

    + +
  • + +
  • cluster node +

    A node or node within a cluster, specified as a URL to the node or cluster + service. For example:

    + +
    http://HOST:8091
    +
    +// For distinction you can use the couchbase protocol prefix:
    +    couchbase://HOST:8091
    +
    +
    +// The administrator and password can also be combined with both forms of the URL for authentication. 
    +If you have named data buckets (other than the default bucket) that you want to backup, 
    +specify an administrative name and password for the bucket:
    +
    +    couchbase://Administrator:password@HOST:8091 
    +        
    + +
  • + +
+ + +

The combination of additional options specifies whether the supplied URL refers to the entire + cluster, a single node, or a single bucket (node or cluster). The node and cluster can be remote + (or local). This method also backs up the design documents used to define views and indexes.

+ + +

The cbbackup [backup_dir] argument is + the directory where the backup data files will be stored on the node on which the + cbbackup is executed. This must be an absolute, explicit, directory, as the files will be + stored directly within the specified directory; no additional directory structure is created to + differentiate between the different components of the data backup. The directory that you + specify for the backup should either not exist, or exist and be empty with no other files. If + the directory does not exist, it will be created, but only if the parent directory already + exists. The backup directory is always created on the local node, even if you are backing up a + remote node or cluster. The backup files are stored locally in the backup directory specified. + Backups can take place on a live, running, cluster or node for the IP.

+ + +

Using this basic + structure, you can backup a number of different combinations of data from your source cluster. + Examples of the different combinations are provided below:

+ + +

Backup all nodes and all buckets

+ +

To backup an entire cluster, consisting of all the buckets and all the node data:

+ + + +
cbbackup http://HOST:8091 /backups/backup-20120501 \ 
+    -u Administrator -p password 
+    [####################] 100.0% (231726/231718 msgs) 
+bucket: default, msgs transferred... 
+          : 
+               total |     last | per sec 
+    batch :     5298 |     5298 | 617.1 
+    byte  : 10247683 | 10247683 | 1193705.5 
+    msg   :   231726 |   231726 | 26992.7 
+done 
+    [####################] 100.0% (11458/11458 msgs) 
+bucket: loggin, msgs transferred... 
+          : 
+               total |     last | per sec 
+    batch :     5943 |     5943 | 15731.0 
+    byte  : 11474121 | 11474121 | 30371673.5 
+    msg   :       84 |       84 | 643701.2 
+done   
+
+ + +

When backing up multiple buckets, a progress + report, and summary report for the information transferred will be listed for each bucket + backed up. The `msgs` count shows the number of documents backed up. The `byte` shows the + overall size of the data document data.

+ +

The source specification in this case is the URL of one of the nodes in the cluster. The + backup process will stream data directly from each node in order to create the backup content. + The initial node is only used to obtain the cluster topology so that the data can be backed + up.

+ +

A backup created in this way enables you to choose during restoration how you want to restore + the information. You can choose to restore the entire dataset, or a single bucket, or a + filtered selection of that information onto a cluster of any size or configuration.

+ + +
+ + + +

Backup all nodes, single bucket

+

To backup all the data for a single bucket, containing all of the information from the + entire cluster:

+ +
cbbackup http://HOST:8091 /backups/backup-20120501 \
+      -u Administrator -p password \
+      -b default
+      [####################] 100.0% (231726/231718 msgs)
+    bucket: default, msgs transferred...
+           :                total |       last |    per sec
+     batch :                 5294 |       5294 |      617.0
+     byte  :             10247683 |   10247683 |  1194346.7
+     msg   :               231726 |     231726 |    27007.2
+    done
+
+ + The -b option specifies the name of the bucket that you want to backup. If + the bucket is a named bucket you will need to provide administrative name and password for + that bucket. To backup an entire cluster, you will need to run the same operation on each + bucket within the cluster.
+ + +

Backup single node, all buckets

+ +

To backup all of the data stored on a single node across all of the different buckets:

+ +
cbbackup http://HOST:8091 /backups/backup-20120501 \
+      -u Administrator -p password \
+      --single-node
+
+ +

Using this method, the source specification must specify the node that you want backup. To + backup an entire cluster using this method, you should backup each node individually.

+ +
+ + +

Backup single node, single bucket

+ +

To backup the data from a single bucket on a single node:

+ +
cbbackup http://HOST:8091 /backups/backup-20120501 \
+      -u Administrator -p password \
+      --single-node \
+      -b default
+
+ +

Using this method, the source specification must be the node that you want to back up.

+ +
+ + + +

Backup single node, single bucket; backup files stored on same node

+ +

To backup a single node and bucket, with the files stored on the same node as the source + data, there are two methods available. One uses a node specification, the other uses a file + store specification. Using the node specification:

+ +
ssh USER@HOST
+    remote-> sudo su - couchbase
+    remote-> cbbackup http://127.0.0.1:8091 /mnt/backup-20120501 \
+      -u Administrator -p password \
+      --single-node \
+      -b default
+
+ +

This method backups up the cluster data of a single bucket on the local node, storing the + backup data in the local filesystem.

+ +

Using a file store reference (in place of a node reference) is faster because the data + files can be copied directly from the source directory to the backup directory:

+ +
ssh USER@HOST
+    remote-> sudo su - couchbase
+    remote-> cbbackup couchstore-files:///opt/couchbase/var/lib/couchbase/data/default /mnt/backup-20120501
+
+ +

To backup the entire cluster using this method, you will need to backup each node, and each + bucket, individually.

+ +
Note: Choosing the right backup solution depends on your requirements and your + expected method for restoring the data to the cluster.
+ +
+ +

Filter keys during backup

+ +

The cbbackup command includes support for filtering the keys that are + backed up into the database files you create. This can be useful if you want to specifically + backup a portion of your dataset, or you want to move part of your dataset to a different + bucket.

+ +

The specification is in the form of a regular expression, and is performed on the + client-side within the cbbackup tool. For example, to backup information + from a bucket where the keys have a prefix of 'object':

+ +
cbbackup http://HOST:8091 /backups/backup-20120501 \
+  -u Administrator -p password \
+  -b default \
+  -k '^object.*'
+
+ +

The above copies only the keys matching the specified prefix into the backup file. When the + data is restored, only those keys that were recorded in the backup file will be + restored.

+ +
Important: +

The regular expression match is performed on the client side. This means that the entire bucket + contents must be accessed by the cbbackup command and then discarded if + the regular expression does not match.

+ +
+ +

Key-based regular expressions can also be used when restoring data. You can backup an + entire bucket and restore selected keys during the restore process using + cbrestore.

+ +
+ +

Backup using file copies

+ +

You can also backup by using either cbbackup and specifying the local + directory where the data is stored, or by copying the data files directly using cp, tar, or + similar.

+ +

For example, using cbbackup:

+ +

+> cbbackup \
+    couchstore-files:///opt/couchbase/var/lib/couchbase/data/default \
+    /mnt/backup-20120501
+
+ +

The same backup operation using `cp` :

+ +

+> cp -R /opt/couchbase/var/lib/couchbase/data/default \
+      /mnt/copy-20120501
+
+ +

The limitation of backing up information in this way is that the data can only be restored + to offline nodes in an identical cluster configuration, and where an identical vbucket map + is in operation (you should also copy the `config.dat` configuration file from each + node.

+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/backup-restore-tween-opsys.html b/preview/contents/Tasks/backup-restore-tween-opsys.html new file mode 100644 index 0000000..14c3244 --- /dev/null +++ b/preview/contents/Tasks/backup-restore-tween-opsys.html @@ -0,0 +1,76 @@ +Backing up and restoring between platforms
+

Backing up and restoring between platforms

+ +
+

Couchbase Server on Mac OS X uses a different number of configured vBuckets than the Linux + and Windows installations. Backing up is a standard backup, however, + restoring to Mac OS X from a Linux or Windows backup or restoring to Linux/Windows from a Mac OS X backup + requires the rehash=1 option.

+ +

Backing up Mac OS X and restoring on Linux/Windows

+ +

To backup the data from Mac OS X, use the standard cbbackup tool and options:

+ +
cbbackup http://Administrator:password@mac:8091 /macbackup/today
+ +

To restore the data to a Linux/Windows cluster, connect to the 8091 port, and use the + rehash=1 option to rehash the information and distribute the data to + the appropriate node within the cluster. rehash=1 rehashes the partition + id's of each item.

+ +
cbrestore backup 
+  -u [username] -p [password] 
+  -x rehash=1
+  http://[localhost]:8091 --bucket-source [my_bucket] --bucket-destination [my_bucket]
+ +
Note: If you have backed up multiple buckets from your Mac, you must restore to each bucket + individually.
+ +
+ +

Backing up Linux/Windows and restoring on Mac OS X

+ +

To backup the data from Linux or Windows, use the standard cbbackup tool + and options:

+ +
cbbackup http://Administrator:password@linux:8091 /linuxbackup/today
+ +

To restore to the Mac OS X node or cluster, connect to the 8091 port, and use the + rehash=1 option to rehash the information and distribute the data to the + appropriate node within the cluster. rehash=1 rehashes the partition id's + of each item. This is needed when transferring data between clusters with different number + of partitions, such as when transferring data from a Mac OS X server to a non-Mac OS X + cluster.

+ +

Syntax:

+ +
./cbrestore backup 
+  -u [username] -p [password] 
+  -x rehash=1
+  http://[localhost]:8091 --bucket-source [my_bucket] --bucket-destination [my_bucket]
+      
+ +
+ +

Transferring data directly

+ +

The cbtransfer tool can be used to move data directly between Mac OS X and + Linux/Windows clusters without creating the backup file.

+ +

+cbtransfer http://linux:8091 http://mac:8091 -b [bucket-source] -B [bucket-destination] -x rehash=1
+cbtransfer http://mac:8091 http://linux:8091 -b [bucket-source] -B [bucket-destination] -x rehash=1
+    
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/cluster-maintenance.html b/preview/contents/Tasks/cluster-maintenance.html new file mode 100644 index 0000000..48c7a9b --- /dev/null +++ b/preview/contents/Tasks/cluster-maintenance.html @@ -0,0 +1,35 @@ +クラスタのメンテナンス
+

クラスタのメンテナンス

+ +
+

クラスタのメンテナンスは以下の操作を含みます:

+ +
    +
  • サーバノードをクラスタに追加する。
  • + +
  • クラスタからサーバノードを削除する。
  • + +
  • クラスタをリバランスする。
  • + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/cluster-management.html b/preview/contents/Tasks/cluster-management.html new file mode 100644 index 0000000..a69c103 --- /dev/null +++ b/preview/contents/Tasks/cluster-management.html @@ -0,0 +1,37 @@ +クラスタ管理
+

クラスタ管理

+ +

運用で重要となるCouchbase Serverクラスタ管理について説明します。

+ +

管理タスクは、Couchbase Serverのウォームアップ、レプリケーション、データファイルのコンパクション、クラスタメンテナンスを含みます。

+ +

これらの各タスクを以下のセクションで解説しています。

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/hard-failover.html b/preview/contents/Tasks/hard-failover.html new file mode 100644 index 0000000..75e767f --- /dev/null +++ b/preview/contents/Tasks/hard-failover.html @@ -0,0 +1,34 @@ +ハードフェイルオーバ
+

ハードフェイルオーバ

+ + +

ハードフェイルオーバは即座にクラスタからノードをフェイルオーバします。

+ +

フェイルオーバ中は、レプリカvBucketがアクティブのvBucketへと昇格し、フェイルオーバしたノード上のアクティブなvBucketはレプリカvBucketへと遷移します。 ノードをフェイルオーバした後、デルタ、もしくはフルリカバリでクラスタにそのノードを再追加することができます。 ノードがフェイルオーバされてからクラスタに再追加する際、フェイルオーバされたノード上のレプリカvBucketが再同期されて、アクティブに戻されます。 フェイルオーバ後にトポロジを変更(追加、削除、サーバのフェイルオーバ)すると、異なる種別のリバランスを実行します。

+ + +

ハードフェイルオーバは一般的に、ノードが不正な状態で利用します。 自動フェイルオーバはハードフェイルオーバです。 + ハードフェイルオーバは通常以下の状況で利用します:

+ + +
    +
  • サーバノードが健全でない。
  • + +
  • すべてのアクティブvBucketが対応するレプリカvBucketを持っていない。
  • + +
  • レプリカvBucketが存在しない。
  • + +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/maintenance-server-node.html b/preview/contents/Tasks/maintenance-server-node.html new file mode 100644 index 0000000..36585e9 --- /dev/null +++ b/preview/contents/Tasks/maintenance-server-node.html @@ -0,0 +1,37 @@ +サーバのメンテナンス
+

サーバのメンテナンス

+ + +

サーバノードの削除、メンテナンス実行後の再追加などを含むサーバのメンテナンスについて解説します。

+ +

サーバのメンテナンスは以下の操作を含みます:

+ +
    +
  1. グレイスフルフェイルオーバまたはハードフェイルオーバ操作によるノードのフェイルオーバ。
  2. + +
  3. デルタノードリカバリ、またはフルリカバリの指定。
  4. + +
  5. サーバノードを再追加してリバランス。
  6. + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rebalance-adding-nodes.html b/preview/contents/Tasks/rebalance-adding-nodes.html new file mode 100644 index 0000000..db5a9cb --- /dev/null +++ b/preview/contents/Tasks/rebalance-adding-nodes.html @@ -0,0 +1,239 @@ +ノードの追加
+

ノードの追加

+ +

ノードはUI、CLI、REST APIを利用してクラスタに追加できます。

+ +

クラスタにノードを追加するにはいくつかの方法があります。 どの方法でも、ノードはクラスタに追加されるようにマークされますが、リバランス操作を実行するまではノードはクラスタのアクティブなメンバにはなりません。

+ + +

新しくCouchbase Serverをインストールする際、新規ノードを既存のクラスタに参加させるか選択できます。

+ +

まず、以下の図の様に、Join a cluster nowラジオボタンを選択します:

+ + +
+ + +

次の情報を入力します:

+ +
+ +
IPアドレス
+ +
参加するクラスタ内の任意の既存ノードのIPアドレスを指定します。
+ + +
+ +
+ +
ユーザ名
+ +
対象のクラスタの管理者ユーザ名です。
+ + +
+ +
+ +
パスワード
+ +
対象クラスタの管理者パスワードです。
+ + +
+ + +

ノードはクラスタの新規ノードとして作成されますが、クラスタ内で追加待ちの状態として、Cluster Overviewページに以下の様に表示されます:

+ + +
+ + + + + +

UIでノードを追加する

+

インストール後に既存クラスタに新規ノードを追加するには、管理コンソールのManage Server NodesエリアにあるAdd Serverボタンをクリックします。

+ + +

+ + +

Couchbase Serverは通常の手順でインストールされ、設定されています。 同様の手順で、このクラスタや他のクラスタの一部だったサーバを追加できます。 この処理の間、Couchbase Serverは起動している必要があります。

+ + + +
+ + +

必要な情報を入力します:

+ +
+ +
サーバIPアドレス
+ +
追加するサーバのIPアドレスです。
+ + +
+ +
+ +
ユーザ名
+ +
対象ノードの管理者ユーザ名です。
+ + +
+ +
+ +
パスワード
+ +
対象ノードの管理者パスワードです。
+ + +
+ + +

対象のサーバ上のデータは削除される旨の警告が表示されます。 追加するサーバに現在保存されているデータは削除され、もしそのサーバが現在他のクラスタの一部であった場合、そのクラスタから削除され、そのクラスタ内ではフェイルオーバされたとマークされます。

+ + +

情報が正常に入力されると、ノードはそのクラスタに追加される準備が整います、そしてサーバはリバランスカウントが更新されるまでペンディング状態となります。

+ +
+ + + + +

RESTでノードを追加する

+ + +

REST APIを利用すると、IPアドレス、管理者ユーザ名およびパスワードをペイロードデータで指定して、ノードをクラスタに追加できます。 例えば、curlを利用して新規ノードを追加できます:

+ + + +

+> curl -u cluster-username:cluster-password\
+    localhost:8091/controller/addNode \
+    -d "hostname=192.168.0.68&user=node-username&password=node-password"
+
+ +
+ + + + +

CLIでノードを追加する

+

couchbase-cliコマンドラインツールを利用して一つまたは複数のノードを既存クラスタに追加できます。 新規ノードにはCouchbase Serverを事前にインストールする必要があり、Couchbase Serverが各ノード上で稼働している必要があります。

+ + +

追加するには、次のコマンドを実行します:

+
```
+> couchbase-cli server-add \
+      --cluster=localhost:8091 \
+      -u cluster-username -p cluster-password \
+      --server-add=192.168.0.72:8091 \
+      --server-add-username=node-username \
+      --server-add-password=node-password
+```
+
+

ここで指定するパラメータは:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
パラメータ説明
--cluster既存クラスタ内のノードのIPアドレス。
-u既存クラスタのユーザ名。
-p既存クラスタのパスワード。
--server-addクラスタに追加するノードのIPアドレス。
--server-add-username追加するノードのユーザ名。
--server-add-password追加するノードのパスワード。
+
+ + +

追加が成功すると、以下のレスポンスが返ります:

+ +

+SUCCESS: server-add 192.168.0.72:8091
+
+ + +

失敗すると、メッセージに失敗の種別が表示されます。

+ +

複数の--server-addコマンドラインオプションを指定して、複数のノードを単一のコマンドで追加できます。

+ + + +
注: サーバが正常に追加されると、Couchbase Serverは操作を完了するためにリバランスが必要な旨を示します。 +
+ +

リバランス操作を実行せずに、クラスタへのノード追加をキャンセルすることができます。 + 操作をキャンセルすると、リバランス操作を実行していないので、データの転送や交換は実施せず、サーバをクラスタから削除します。 + Webインタフェースから操作をキャンセルできます。

+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rebalance-and-failover-nodes.html b/preview/contents/Tasks/rebalance-and-failover-nodes.html new file mode 100644 index 0000000..809ec6d --- /dev/null +++ b/preview/contents/Tasks/rebalance-and-failover-nodes.html @@ -0,0 +1,25 @@ +フェイルオーバ後のリバランス
+

フェイルオーバ後のリバランス

+ + +

リバランス操作は、フェイルオーバしたサーバノードをクラスタに再追加し(リカバリオプションに基づき)、アクティブとレプリカのvBucketを管理します。

+ +

リバランス操作中に、フェイルオーバしたノード上のレプリカvBucketが再同期されて、アクティブに戻されます。

+ +
+ + + + + +
\ No newline at end of file diff --git a/preview/contents/Tasks/rebalance-behind-the-scenes.html b/preview/contents/Tasks/rebalance-behind-the-scenes.html new file mode 100644 index 0000000..5352175 --- /dev/null +++ b/preview/contents/Tasks/rebalance-behind-the-scenes.html @@ -0,0 +1,58 @@ +リバランスの舞台裏
+

リバランスの舞台裏

+ + +

リバランス処理は、 orchestratorと呼ばれる特別なプロセスによって管理されています。

+ + +

orchestratorは現在のvBucketマップを調査し、ノードの追加や削除の情報を組み合わせ、新しいvBucketマップを作成します。

+ +

orchestratorは、現在のvBucketマップから、新しいvBucket構成へと、各vBucketの移動処理を開始します。 ノード自身が実際にノード間でデータの移動を実行している間だけ、そのプロセスは稼働します。 目的は新しく計算されたvBucketマップに、現在の状況を一致させることです。

+ +

各vBucketは個別に移動し、クラスタ内の様々なノード間で複数のvBucketを同時並列で移動できます。 各宛先ノード上では、 ebucketmigrator と呼ばれるプロセスが開始されます。 これはTAPシステムを利用し単一のvBucketにおけるすべてのデータの転送をリクエストし、移行が完了すると、新規vBucketデータをアクティブなvBucketとします。

+ +

vBucket移行処理を実行中にも、クライアントは継続して既存のvBucketへとデータを送信できます。 + この情報は移行がリクエストされた時点で存在していたオリジナルのデータとともに移行されます。 + すべてのデータの移行が完了すると、オリジナルのvBucketは無効とマークされ、新しいvBucketが有効になります。 これはvBucketマップを更新し、接続されたクライアントに伝わり、新しいロケーションが利用可能となります。

+ + + + +

RESTを利用してvBucket移動を変更する

+

リバランス中に発生するvBucketの移動数の設定は変更できます。 + デフォルトは1で、1つのvBucketのみがリバランス操作中に移動可能であることを示します。

+ +

vBucket移動数を変更するには、curlの POST + コマンドを以下のシンタックスで/internalSettingsエンドポイントに対し、rebalanceMovesPerNodeオプションを指定して実行します。

+ + +

+curl -X POST -u admin:password
+ -d rebalanceMovesPerNode=1
+ http://HOST:PORT/internalSettings
+
+ + +

例:

+ +

+curl -X POST -u Administrator:password
+ -d rebalanceMovesPerNode=14
+ http://soursop-s11201.sc.couchbase.com:8091/internalSettings
+
+ +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rebalance-bucket-types.html b/preview/contents/Tasks/rebalance-bucket-types.html new file mode 100644 index 0000000..1bd4f40 --- /dev/null +++ b/preview/contents/Tasks/rebalance-bucket-types.html @@ -0,0 +1,50 @@ +バケット種別によるリバランスの影響
+

バケット種別によるリバランスの影響

+ + +

リバランス操作はクラスタ全体、Couchbaseとmemcahcedバケットの両方で動作します。

+ +

二つのバケット種別が持つ違いにより、Couchbaseとmemcachedバケットでのリバランス処理には異なる点があります。

+ + +

Couchbaseバケット

+ +

Couchbaseバケットでは:

+
    +
  • 新しい構成に一致するように、データはクラスタ内のすべてのノードにリバランスされます。
  • + +
  • 更新されたvBucketマップは各vBucketが正常に移動するにつれ、クライアントへと伝わります。
  • + +
  • データロスは発生せず、キャッシュや各キーの可用性には変化がありません。
  • + +
+
+ + + +

Memcachedバケット

+

Memcachedバケットでは:

+ +
    +
  • 新規ノードがクラスタに追加されると、各新規ノードはmemcachedバケットデータをサポートするノードのリストに追加されます。
  • + +
  • クラスタからノードが削除されると、そのノードで保存されていたmemcachedバケット内のデータは失われ、そのノードは利用可能なノードのリストから削除されます。
  • + +
  • どちらの場合も、バケットデータを処理するノードのリストは自動的に更新され、クライアントノードへと伝わります。 Memcachedバケットは、サーバの変更に対応できるように設計されているKetamaハッシュアルゴリズムを利用しています。 しかしながら、サーバノードの変更によりハッシュが移動することになり、リバランス操作が完了すると、いくつかのキーが利用できなくなります。
  • + +
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rebalance-factors.html b/preview/contents/Tasks/rebalance-factors.html new file mode 100644 index 0000000..4a1587f --- /dev/null +++ b/preview/contents/Tasks/rebalance-factors.html @@ -0,0 +1,105 @@ +リバランス実行時の考慮事項
+

リバランス実行時の考慮事項

+ + +

クラスタをいつ、なぜ、どのようにリバランスするかは、シナリオに依存します。

+ +

どの状況かを選択し適用するかはいつも単純とは限らず、様々な要素がいつノード構成を変更してリバランスを行うべきかを決定します。

+ + +

いつクラスタを拡張するべきか

+

より多くのノードを追加することで、クラスタのサイズを拡張できます。 ノードを追加することで、利用可能なRAM、ディスクI/O、クライアントアプリケーションで利用可能なネットワーク帯域が増加し、より多くのマシンに負荷を分散可能になります。 ここでは、タイミングを決定するためにいくつかのメトリックと統計情報があります:

+ + +
+ +
RAM容量を増加する
+ +
Couchbase Serverクラスタ内で最も重要なコンポーネントの一つが利用可能なRAM容量です。 RAMはCouchbase Serverのキャッシュレイヤとしてアプリケーションデータを保存するだけでなく、その他のオペレーションでもサーバによって利用されます。 全体で利用可能なRAM容量を低減すると、どこか別の場所で性能の問題を引き起こすこともあります。 以下にクラスタのRAM容量を増加すべき一般的なインジケータを示します:
    +
  • より多くのディスクフェッチが発生している場合、アプリケーションがリクエストしたデータがRAM上に存在せず、より多くのデータをディスクからフェッチしていることを意味します。 クラスタ内のRAMを増加すると、より多くのデータをRAMに保持でき、より良いパフォーマンスをアプリケーションに提供できます。
  • + +
  • Couchbase Serverクラスタにより多くのバケットを追加する場合、より多くのRAMが必要になることがあります。 ノードを追加すると、システム全体のキャパシティを増加し、既存バケットを縮小して新規バケット用の空きを作ることができます。
  • + +
+
+ + +
+ + + +
+ +
ディスクI/Oスループットを増加させる
+ +
Couchbase Serverクラスタにノードを追加することで、クラスタ全体で実行可能なディスクI/Oを増加させることができます。 これは特に書き込み頻度の高い環境で重要です、しかしディスクから大量のデータを参照する必要がある場合にも重要な要素となります。
+ + +
+ +
+ +
ディスク容量を増加させる
+ +
現在のノードにより多くのディスク容量を追加するか、より多くのノードを追加することでクラスタ全体のディスク容量を追加できます。
+ + +
+ + +
+ +
ネットワーク帯域を増加させる
+ +
クラスタのネットワーク帯域が飽和してしまうか、飽和しそうなポイントに達した場合、より多くのノードが必要である協力なインジケータとなります。 より多くのノードはこれらの追加したノードに、必要なネットワーク帯域を拡散し、各ノード個別の帯域を削減します。
+ + +
+ + +
+ + + + +

いつクラスタを縮小すべきか

Couchbaseクラスタ縮小の選択はより主観的な判断となります。 通常は、コスト面での考慮、またはアプリケーション要件が変わり、必要な負荷に対応するために大きなクラスタが必要になくなったときに検討します。

いつクラスタを縮小すべきか:

+
    +
  • データセットとアプリケーション負荷をサポートするために、残りのノードで十分なキャパシティを提供できるか確認してください。 ノードを削除すると、十分なノードが存在しない場合、クラスタに不利益な重大な影響を与えることがあります。
  • + +
  • 理想的なクラスタサイズの決定を試行する場合、一度に複数のノードを削除することは避けてください。 代わりに、各ノードを一度に一つずつ削除し、クラスタ全体での影響を理解できるようにします。
  • + +
  • フェイルオーバを利用するより、ノードの削除とリバランスを利用してください。 ノードがダウンし、クラスタに復帰しない場合、フェイルオーバ機能によってそのレプリカvBucketが即座にアクティブに昇格されます。 健全なノードをフェイルオーバすると、実行中のオペレーションのレプリケーションデータの一部を失う可能性があります。 removeを利用すると、すべてのデータが正しくレプリケートされ、継続して利用可能であることを保証できます。
  • + +
+
+ + +

いつクラスタをリバランスすべきか

+ +

ノードを追加または削除することを決定したなら、次の点を考慮してください:

+ +
    +
  • 複数のノードを短時間で追加または削除することを計画している場合、一台ずつリバランスを実行するよりも、それらすべてを一度に追加し、リバランスを実行するのが最良の手順です。 これはシステムにかかる全体的な負荷と、移動が必要なデータ量を削減します。
  • + +
  • クラスタへの負荷が低い時間帯にノードを追加します。 リバランス操作はオンラインで実行できるように設計されているものの、"全く負荷がない"処理ではなく、ディスクI/O、ネットワーク帯域、CPU利用率、RAM利用量という形でシステム全体の負荷を増加させることは疑う余地はありません。
  • + +
  • 自主的にリバランスを行う場合(フェイルオーバ後の復旧ではない場合)は、システムの利用が少ない時間帯に実行すべきです。 クラスタ内でデータが再分散されるため、リバランスは比較的リソースインテンシブな処理であり、全体的なクラスタパフォーマンスに不利益な影響を与えることを避けるために、システムを活発に利用している時間帯にリバランスを実行することは避けるべきです。
  • + +
  • リバランスはクラスタ内で大量のデータを移動します。 より多くのRAMが利用できれば、オペレーティングシステムがより多くのディスクアクセスをキャッシュでき、リバランス処理をより高速に実行できます。 クラスタ内に十分なメモリがない場合、リバランスは非常に遅くなるでしょう。 クラスタのキャパシティを使い切る前に、新規ノードを追加しリバランスを実行することを推奨します。
  • + +
+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rebalance-incremental.html b/preview/contents/Tasks/rebalance-incremental.html new file mode 100644 index 0000000..58727e6 --- /dev/null +++ b/preview/contents/Tasks/rebalance-incremental.html @@ -0,0 +1,21 @@ +リバランス失敗からの再開
+

リバランス失敗からの再開

+ +

リバランス実行中に一時的な不具合や障害が発生した後に、リバランスを再開できることは、Couchbase Serverのリバランス時間を向上させます。

+ +

リバランス操作がある時点で中断された場合、すべてのプロセスを繰り返す代わりに、リバランスを再開できます。

+ +

Couchbase Serverは、DCP (Database Change Protocol)を利用しており、 + 再開可能 で、インクリメンタルにキャッチアップできます。

+ +

DCPの利用は、効率的なデータの移動でリバランスレイテンシを向上させ、障害発生後にオペレーションを再開しインクリメンタルにキャッチアップできる特徴があります。

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rebalance-performing.html b/preview/contents/Tasks/rebalance-performing.html new file mode 100644 index 0000000..04449fb --- /dev/null +++ b/preview/contents/Tasks/rebalance-performing.html @@ -0,0 +1,99 @@ +リバランスの実行
+

リバランスの実行

+ + + +

クラスタのリバランスはクラスタへとノードを追加または削除としてマークし、リバランス操作を実行します。

+ + +

リバランスは、データがクラスタ全体で分散されるようにデータをクラスタ内で移動し、様々なノード上でデータの削除や追加を行います。

+ + +
重要: リバランスが完了するまで、まだレプリケートされていないデータをロスする可能性があるため、フェイルオーバ機能の利用は避けてください。
+ + +

フェイルオーバを実行した後、クラスタを健全な状態に復元し、レプリカの設定を再度有効にするために、リバランスが必要になります。

+ + +

UIからリバランスを実行する

+ +

Couchbase Webコンソールはリバランスが必要になると、その旨を表示します。 これはノードの追加や削除、またはフェイルオーバによってクラスタの構成が変化した場合です。 + リバランスが必要という通知はサーバ間で共有されます。 + 以下は、Manage Server Nodesページのイメージです。

+ + +
+ + +

Couchbase Serverが(明示的なノードの追加、削除、またはフェイルオーバにより)リバランスが必要だと特定すると、クラスタはPending Rebalance状態になります。 + これはクラスタの操作に何の影響も与えず、単に設定された構成へとクラスタを遷移させるために、リバランス操作が必要だということを示しています。 + リバランスを開始するには、Rebalanceをクリックします。

+ +
+ + +

CLIからリバランスを実行する

+ +

リバランスを開始するには、couchbase-cliのrebalanceコマンドを利用します:

+ + +

+> couchbase-cli rebalance -c 127.0.0.1:8091 -u Administrator -p Password
+  INFO: rebalancing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
+  . . . . . . . . . . .
+  SUCCESS: rebalanced cluster
+
+ + +

この方法を利用すると、ノードの追加や削除を行うと同時にリバランスの開始を、 + 単一の コマンドで実行できます。

+ +

追加するノードを、--server-addオプションで、削除するノードを--server-removeオプションで指定します。

+ +

これらのオプションは複数回指定することができます。 例えば、二つのノードを追加し、二つのノードを削除し、即座にリバランスを開始するには:

+ + +

+> couchbase-cli rebalance -c 127.0.0.1:8091 \
+          -u Administrator -p Password \
+          --server-add=192.168.0.72 \
+          --server-add=192.168.0.73 \
+          --server-remove=192.168.0.70 \
+          --server-remove=192.168.0.69
+
+ + +

CLIはアクティブな進捗状態を提供し、リバランス操作が正常に完了するか、失敗した場合にCLIは終了します。 + リバランス操作にかかる時間はサーバ台数、データ量、クラスタのパフォーマンスと既存のクラスタアクティビティに依存します。 + すなわち、実行時間を正確に予測または算出することは困難です。

+ + +
注: リバランス操作を通して、プロセスをモニタリングし、正常に完了することを確認してください。
+ + +

CLIコマンドの、 stop-rebalanceを利用してリバランス処理を停止できます。

+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rebalance-questions.html b/preview/contents/Tasks/rebalance-questions.html new file mode 100644 index 0000000..e465130 --- /dev/null +++ b/preview/contents/Tasks/rebalance-questions.html @@ -0,0 +1,77 @@ +一般的なリバランスに関する質問
+

一般的なリバランスに関する質問

+ + +

一般的にリバランスに関して行われる質疑応答を紹介します。

+ + + + +

リバランスにはどのくらいの時間がかかるか?

+ +

リバランス操作はクラスタが継続してクライアントリクエストを処理する間に、RAMとディスクに保存されたデータを移動するため、リバランス操作の実行に必要な時間は各クラスタ独自のものになります。 その他の要素として、オブジェクトのサイズと数、ストレージに利用しているディスクの速度、ネットワーク帯域とキャパシティがリバランスの速度に影響します。

+ +

ビジーなクラスタではリバランス操作の完了に非常に長時間かかることがあります。 + 同様に、クラスタ上のノード間で巨大なデータを移動する場合、オペレーション完了までに長時間かかることがあります。 ビジーで大量のデータを保持するクラスタではリバランスが完了するまでに非常に長い時間がかかるでしょう。

+ +
+ + + + +

何台のノードを追加、または削除できるのか?

+ +

機能的には一度の操作で追加および削除できるノード数に上限はありません。 + しかしながら、現実的には、一度に追加または削除するノード台数に関しては保守的になるべきでしょう。

+ +
    +
  • クラスタを拡張するとき、より多くのノードを追加し、実行するリバランスの回数を減らすことが推奨される手順になります。
  • + +
  • ノードを削除するときは、一度に多くのノードを削除しすぎて、クラスタのキャパシティと機能性を極端に減らさないように注意してください。
  • + +
+ +

同時にノードの削除と追加ができる点も忘れないでください。 同時に追加と削除を実行することを検討している場合、複数のノードを同時に追加、および削除し、一回のリバランスを実行する方が、個々の移動ごとにリバランスを実行するよりも良いです。

+ +

クラスタのサイズやパフォーマンスを一貫して維持するためには、ノードをスワップアウトさせます。

+ +
+ + + + +

リバランス中にクラスタのパフォーマンスに影響はあるか?

+ +

設計上、アプリケーションのパフォーマンスに重大な影響を与えるべきではありません。 + しかしながら、リバランス操作はクラスタ内のノード上の負荷、特にノード間でデータを転送するため、ネットワークとディスクI/O性能への負荷が大幅に増加することは明らかです。

+ +

理想的には、稼働中のアプリケーションへの影響を削減するために、クラスタへの負荷が低い時間帯にリバランスを実行するべきです。

+ +
+ + + + +

リバランス処理は停止できるか?

+ +

クラスタ内のvBucketは個別に移動されます。 このため、リバランス処理はいつでも停止することができます。 すでに完全に移行されたvBucketだけがアクティブになります。 処理を継続するために、いつでもリバランス操作を再開できます。

+ +

部分的に移行されたvBucketはアクティブになりません。

+ +

このルールに対する一つの例外は、クラスタからノードを削除する場合です。 リバランスの停止はノードの削除をキャンセルします。 リバランス処理を継続する前に、これらのノードを削除として再度マークする必要があります。

+ +

必要なクリーンアップを確実にするため、リバランスを停止した後は、リバランスを再開できるまで5分の待機期間が必要です。 これはリバランスが再度リクエストされる前にクラスタが状態を修復することを保証するためです。

+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rebalance-remove-node.html b/preview/contents/Tasks/rebalance-remove-node.html new file mode 100644 index 0000000..72206fb --- /dev/null +++ b/preview/contents/Tasks/rebalance-remove-node.html @@ -0,0 +1,67 @@ +ノードの削除
+

ノードの削除

+ + +

ノードを削除すると、クラスタからそのノードを削除するようにマークします。

+ +

ノードを削除しても、そのノードでのリクエスト処理を停止するわけではありません。 その代わり、クラスタからそのノードを削除するようにマークするだけです。 削除処理を完了させるためには、リバランス操作を実行する必要があります。 ノードが削除されると、そのノードはクラスタの一部ではなくなり、停止、アップデート、アップグレードが可能となります。

+ + +
重要: クラスタからノードを削除する前に、残りのノードでワークロードを処理できるキャパシティがあることを確認してください。 最良の結果を得るには、スワップリバランスを利用します。
+ + +
警告: オンラインアップグレード中に、VMベースの環境では、複数の古いVMノードを完全に新しいノードセットに置き換えることもあります。 すべてのノードをクラスタから削除すると、クライアントはもはやどのノードもわからず、接続に失敗するでしょう。 この問題を回避するために、以下のいずれかの解決策を利用するようにしてください:
    +
  • 少なくとも一つの既存ノードをクラスタ内に維持しておき、このノードをクライアントのサーバ設定に登録しておく。
  • + +
  • クライアントのサーバ設定を適切に更新し、最後の既存ノードが削除される前に、少なくとも一つの新規ノードを登録しておく。
  • + +
+
+ + +

ノードはCouchbase WebコンソールまたはCLIから削除できます。

+ + +

Couchbase Webコンソールを利用する

+

Couchbase WebコンソールのManage Server Nodesセクションで、ノードをクラスタから削除できます。

+ +
    +
  1. 削除するノードの隣にある、Remove Serverボタンをクリックします。 ノードを削除するかの確認メッセージが表示されます。
  2. + +
  3. Removeをクリックし、ノードを削除状態にマークします。
  4. + +
+ +
+ + +

CLIの利用

+

コマンドラインからは、同時にリバランス操作を実行せずに、ノードを削除状態としてマークすることはできません。 + この、 rebalance コマンドでは一つ以上の、--server-addと、--server-removeオプションを指定できます。 + クラスタからサーバを削除または追加し、即座にリバランス操作を実行します。

+ + +

リバランス操作中にノードを削除するには:

+ + +

+> couchbase-cli rebalance --cluster=127.0.0.1:8091 \
+          -u Administrator -p Password \
+          --server-remove=192.168.0.73
+
+ + +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rebalance-swap-rebalance.html b/preview/contents/Tasks/rebalance-swap-rebalance.html new file mode 100644 index 0000000..d753f5a --- /dev/null +++ b/preview/contents/Tasks/rebalance-swap-rebalance.html @@ -0,0 +1,100 @@ +スワップリバランス
+

スワップリバランス

+ + +

スワップリバランスは、同数のノードを同一のオペレーションで追加、かつ削除する際に、データの移動を最適化する自動的なプロセスです。

+ + +

スワップリバランスは削除されるノードから追加されるノードへと直接データを移動することでリバランス処理を最適化しています。 このため、クラスタ全体でデータを移動する通常のリバランスよりも効率的です。

+ +

スワップリバランスは追加するノードと削除するノードの台数が等しい時に自動的に発動します。 + 例えば、2つのノードを削除としてマークし、他の2つのノードをクラスタに追加します。 + スワップリバランスを強制する設定や選択する仕組みはありません。 + スワップリバランスを実行できない場合、通常のリバランスを代わりに実行します。

+ +

スワップリバランス処理は以下のように動作します:

+ +
    +
  • 削除されるノードから追加されるノードへと1対1で直接データを移動します。 このため、全体的にvBucketマップを再構成する必要がありません。

    +
  • + +
  • ソースノードから宛先ノードへと、アクティブなvBucketが一つずつ移動されます。

    +
  • + +
  • レプリカvBucketが新規ノード上で作成され、有効なレプリカバケットとしてアクティベートされる前に、既存のデータで生成されます。 このため、リバランス処理実行中に障害が発生しても、レプリカが有効であることを保証します。

    +
  • + +
+ +

例えば、20ノードのクラスタで、2つのノード(XとY)を追加し、2つのノード(AとB)を削除したとします。

+ +
    +
  • ノードAのvBucketはノードXに移動します。

    +
  • + +
  • ノードBのvBucketはノードYに移動します。

    +
  • + +
+ + +

スワップリバランスの利点

+

スワップリバランスの利点は:

+ +
    +
  • 削除されるノードから追加されるノードへと直接データを移動するため、リバランス時間が短縮されます。

    +
  • + +
  • リバランス中のクラスタ負荷の低減。

    +
  • + +
  • リバランス中のネットワークオーバヘッドの低減。

    +
  • + +
  • 旧ホストのレプリカが有効な状態で、新規ホストのレプリカも同時に作成されるため、リバランス中にフェイルオーバが発生した場合のリバランスが失敗する確率が減ります。

    +
  • + +
  • 完全なリバランスではなく、ノード上のデータがスワップされるため、リバランス処理中のクラスタのキャパシティは変わりません。 パフォーマンスとフェイルオーバのサポートを保証します。

    +
  • + +
+
+ + +

リバランスの失敗

+
+ +
リバランス処理の失敗
+ +
リバランスが失敗するか、故意に停止した場合、すでに移行されたアクティブとレプリカvBucketはアクティブなvBucketマップの一部となります。 実行中の転送はすべてキャンセルされます。 リバランス処理を再開すると、停止したところからリバランスを再開します。
+ + +
+ +
+ +
ノード障害
+ +
ノードに障害が発生した際、そのノードを削除して代替のノードを追加する(もしくは、そのノードを再追加する)と、スワップリバランスとなります。
+ + +
+ + +
重要: スワップリバランス中にノード障害が発生した場合、そのノードをクリーンアップするか、再追加するか、または新規ノードを追加してリバランスを通常通り実行します。
+ + +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/recovery-failover-nodes.html b/preview/contents/Tasks/recovery-failover-nodes.html new file mode 100644 index 0000000..168a968 --- /dev/null +++ b/preview/contents/Tasks/recovery-failover-nodes.html @@ -0,0 +1,29 @@ +フェイルオーバしたノードのリカバリ
+

フェイルオーバしたノードのリカバリ

+ + +

フェイルオーバしたノードのリカバリ方法には、デルタノードリカバリとフルリカバリがあります。

+ +

デルタノードリカバリはフェイルオーバしたノードのディスク上にあるデータを再利用し、差分の変更を元にデータを再同期する形で、そのノードをリカバリできです。

+ + +

フルリカバリモードでは、フェイルオーバしたサーバノードからデータファイルを削除し、リバランス中に新規のデータファイルが生成されます(アクティブとレプリカのvBucket)。

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/recovery-full-recovery.html b/preview/contents/Tasks/recovery-full-recovery.html new file mode 100644 index 0000000..a0333c0 --- /dev/null +++ b/preview/contents/Tasks/recovery-full-recovery.html @@ -0,0 +1,48 @@ +フルリカバリ
+

フルリカバリ

+ + +

フルリカバリモードでは、フェイルオーバしたサーバノードからデータファイルを削除し、リバランス中に新規のデータファイルが生成されます(アクティブとレプリカのvBucket)。

+ + +

サーバノードをフェイルオーバした後、Webコンソールに、Delta RecoveryとFull Recoveryオプションが表示されます。 + どちらのリカバリ方法も、リバランス中にサーバノードをクラスタに再追加しますが、フルリカバリはそのノードのデータをリバランスの前に削除するのに対し、デルタリカバリはノードの既存データを再利用するようにします。 +

+ + + +

フルリカバリの特徴:

+ +
    +
  • データファイルはサーバノードから削除されます。
  • + +
  • インデックスは再追加するサーバ上で再構築する必要があります。
  • + +
  • 移動しているvBucketのドキュメントのワーキングセットが復元されます。
  • + +
  • バケット割当量よりもデータサイズが小さい時に利用してください。 この場合、ネットワーク経由でディスクへとデータを移動する(フルリカバリ)方が、データのウォーミングアップ(デルタリカバリ)よりも早いでしょう。
  • + +
+ + +
注: フルリカバリでは、ディスクが初期化され、アクティブとレプリカのバケットで作成されます。 + このオペレーションはクリーンなディスクを保証しますが、リソース利用に関するオーバヘッドと、ディスクの再生成のためのダウンタイムがあります。
+ + +

ノードをフェイルオーバし、メンテナンスし、ノードをクラスタに再追加して、リバランスを行う処理において、ファイルはフェイルオーバしたサーバノードから削除され、リバランス中に新規のデータファイルが生成されます(アクティブとレプリカのvBucket)。

+ + +

サーバノードをフェイルオーバした後、Webコンソールに、Delta RecoveryとFull Recoveryオプションが表示されます。 + どちらのリカバリ方法も、リバランス中にサーバノードをクラスタに再追加しますが、フルリカバリはそのノードのデータをリバランスの前に削除するのに対し、デルタリカバリはノードの既存データを再利用するようにします。 +

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/replication-backoff.html b/preview/contents/Tasks/replication-backoff.html new file mode 100644 index 0000000..e4442cd --- /dev/null +++ b/preview/contents/Tasks/replication-backoff.html @@ -0,0 +1,93 @@ +Specifying backoff for replication
+

Specifying backoff for replication

+ + +

Data replication enables high availability of data in a cluster so that data is still available at a replica in case any node in a cluster fails.

+ + +

Your cluster is set up to perform some level of data replication between nodes within + the cluster for any given node. Every node contains both active data and replica data. + Active data is all the data that had been written to the node from a client, while + replica data is a copy of data from another node in the cluster.

+ + +

On any given node, both active and replica data must wait in a disk write queue before + being persisted, or written to disk. If your node experiences a heavy load of writes, the replication + queue can become overloaded with replica and active data waiting to be persisted.

+ + +

By default, a node will send backoff messages when the disk write queue on the node + contains one million items or 10%. When other nodes receive this message, they will + reduce the rate at which they send replica data. You can configure this default to be a + given number so long as this value is less than 10% of the total items currently in a + replica partition. For instance, if a node contains 20 million items, when the disk write + queue reaches 2 million items a backoff message will be sent to nodes sending replica + data. You use the Couchbase command-line tool, cbepctl to change this + configuration:

+ + +
+ +
Example 1
+ +
A node sends replication backoff requests when it has two + million items or 10% of all items, whichever is greater. +
> ./cbepctl 10.5.2.31:11210 -b bucket_name -p bucket_password set tap_param tap_throttle_queue_cap 2000000
+
+
+ + +
+ + +
+ +
Example 2
+ +
The default percentage, used to manage the replication stream, + is changed. If the items in a disk write queue reach the greater of this percentage or a + specified number of items, replication requests slow down: +
setting param: tap_throttle_queue_cap 2000000
+
+ +
+ + +
+ + +
+ +
Example 3
+ +
The threshold is set to 15% of all items at a replica node. + When a disk write queue on a node reaches this point, it sends replication backoff + requests to other nodes. +
> ./cbepctl  10.5.2.31:11210 set -b bucket_name tap_param tap_throttle_cap_pcnt 15
+
+
+ + +
+ + +
Important: The cbepctl tool provides per-node, per-bucket + operations. That means that if you want to perform this operation, you must specify the + IP address of a node in the cluster and a named bucket. If you do not provided a named + bucket, the server applies the setting to any default bucket that exists at the + specified node. If you want to perform this operation for an entire cluster, perform the + command for every node/bucket combination that exists for that cluster.
+ +

You can also monitor the progress of this backoff operation in Couchbase Web Console + under Tap Queue Statistics > Back-off rate.

+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/restore-cbrestore.html b/preview/contents/Tasks/restore-cbrestore.html new file mode 100644 index 0000000..5918e7d --- /dev/null +++ b/preview/contents/Tasks/restore-cbrestore.html @@ -0,0 +1,237 @@ +Restoring with cbrestore
+

Restoring with cbrestore

+ + +

To restore bucket data that was backed up using the command cbbackup, + use the command cbrestore to restore information into a bucket on a new cluster.

+ + + +

When restoring a backup, you have to select the appropriate restore sequence + based on the type of restore you are performing. The available methods + when restoring a cluster depend on the method you used when backing up + the cluster.

+ + +

If cbbackup was used to backup the bucket data, you can restore + back to a cluster with the same or different configuration. This is because + cbbackup stores information about the stored bucket data in a format that + enables it to be restored back into a bucket on a new cluster.

+ + +
Note: If the information was backed up using a direct file copy, then you must restore + the information back to an identical cluster.
+ + + +

The cbrestore command takes the information that has been backed up via the + cbbackup> command and streams the stored data into a cluster. The configuration + of the cluster does not have to match the cluster configuration when the data + was backed up, allowing it to be used when transferring information to a new + cluster or updated or expanded version of the existing cluster in the event of + disaster recovery.

+ + +

Because the data can be restored flexibly, it provides for a number of different + scenarios to be executed on the data that has been backed up:

+ + +
    +
  • Restoring data into a cluster of a different size and configuration.
  • + +
  • Transferring or restoring data into a different bucket on the same or + different cluster.
  • + +
  • Restoring a selected portion of the data into a new or different + cluster, or the same cluster but a different bucket.
  • + +
+ + + +

The basic format of the cbrestore command is as follows:

+ + +
cbrestore [options] [source] [destination]
+
+ + +

Where:

+ +
+ +
[options]
+ +
Options specifying how the information should be restored into the cluster. Common options include: +
    +
  • --bucket-source +

    Specify the name of the bucket data to be read from the backup data that will be + restored.

    +
  • + +
  • --bucket-destination +

    Specify the name of the bucket the data will be written to. If this option is + not specified, the data will be written to a bucket with the same name as the + source bucket.

    +
  • + +
  • --add +

    Use --add instead of --set in order to not overwrite existing items in the destination.

    +
  • + +
+
+ + +
+ +
+ +
[source]
+ +
The backup directory specified to cbbackup where the backup data was stored.
+ + +
+ +
+ +
[destination]
+ +
The REST API URL of a node within the cluster where the information will be + restored.
+ + +
+ + + +

The cbrestore command restores only a single bucket of data at a time. If you + have created a backup of an entire cluster (such as all buckets), then you must + restore each bucket individually back to the cluster. All destination buckets + must already exist since cbrestore does not create or configure destination buckets + for you.

+ + +

For example, to restore a single bucket of data to a cluster:

+ + + +
cbrestore \
+    /backups/backup-2012-05-10 \
+    http://Administrator:password@HOST:8091 \
+    --bucket-source=XXX
+    [####################] 100.0% (231726/231726 msgs)
+    bucket: default, msgs transferred...
+    :                total |       last |    per sec
+    batch :                  232 |        232 |       33.1
+    byte  :             10247683 |   10247683 |  1462020.7
+    msg   :               231726 |     231726 |    33060.0
+    done
+
+ + +

To restore the bucket data to a different bucket on the cluster:

+ + + +
cbrestore \
+    /backups/backup-2012-05-10 \
+    http://Administrator:password@HOST:8091 \
+    --bucket-source=XXX \
+    --bucket-destination=YYY
+    [####################] 100.0% (231726/231726 msgs)
+    bucket: default, msgs transferred...
+    :                total |       last |    per sec
+    batch :                  232 |        232 |       33.1
+    byte  :             10247683 |   10247683 |  1462020.7
+    msg   :               231726 |     231726 |    33060.0
+    done
+
+ + +

The msg count in this case is the number of documents restored back to the + bucket in the cluster.

+ + +

Filtering keys during restore

+ The cbrestore command includes support for filtering the keys that are + restored to the database from the files that were created during backup. This is + in addition to the filtering support available during backup). +

The specification is in the form of a regular expression supplied as an option + to the cbrestore command. For example, to restore information to a bucket only + where the keys have an object prefix:

+ + + +
cbrestore /backups/backup-20120501 http://HOST:8091 \
+    -u Administrator -p password \
+    -b default \
+    -k '^object.*'
+    2013-02-18 10:39:09,476: w0 skipping msg with key: sales_7597_3783_6
+    ...
+    2013-02-18 10:39:09,476: w0 skipping msg with key: sales_5575_3699_6
+    2013-02-18 10:39:09,476: w0 skipping msg with key: sales_7597_3840_6
+    [                    ] 0.0% (0/231726 msgs)
+    bucket: default, msgs transferred...
+    :                total |       last |    per sec
+    batch :                    1 |          1 |        0.1
+    byte  :                    0 |          0 |        0.0
+    msg   :                    0 |          0 |        0.0
+    done
+  
+ + +

This copies only the keys matching the specified prefix into the + default bucket. For each key skipped, an information message is provided. + The remaining output shows the records transferred and summary as normal.

+ + +
+ + +

Restoring using file copies

To restore the information to the same + cluster with the same configuration, shut down your entire cluster while you restore the data + and then restart the cluster again. In this case, you are replacing the entire cluster data + and configuration with the backed up version of the data files, and then restarting the + cluster with the saved version of the cluster files.
Important: Make sure that any + restoration of files also sets the proper ownership of those files to the Couchbase + user.
+ +
When restoring data back in the same cluster, verify the following:
    +
  • Backup and restore must use the same version of Couchbase Server.
  • + +
  • The cluster must contain the same number of nodes.
  • + +
  • Each node must have the same IP address or hostname it was configured with when the + cluster was backed up.
  • + +
  • All config.dat configuration files as well as all database files must + be restored to their original locations.
  • + +
+
+

The steps required to complete the restore process are:

+
    +
  1. Stop the Couchbase Server service on all nodes.
  2. + +
  3. On each node, restore the database, stats.json, and configuration file + config.dat from your backup copies for each node.
  4. + +
  5. Restart the service on each node.
  6. + +
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rza-add-server.html b/preview/contents/Tasks/rza-add-server.html new file mode 100644 index 0000000..1fe7356 --- /dev/null +++ b/preview/contents/Tasks/rza-add-server.html @@ -0,0 +1,29 @@ +Adding servers to server groups
+

Adding servers to server groups

+ + +

Server are added to server groups from the Server Nodes tab.

+ +
+
Figure 1. Add server to server group +
+ +
+ +
  1. From the Server Nodes tab, click Add Server
  2. +
  3. Provide the Server IP Address, select a server group from the drop down menu, and provide the administrator username and password for the server being added.
  4. +
  5. Click Add Server
  6. +
  7. From the Server Nodes tab, click Rebalance
  8. +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rza-create-group.html b/preview/contents/Tasks/rza-create-group.html new file mode 100644 index 0000000..74c8ca7 --- /dev/null +++ b/preview/contents/Tasks/rza-create-group.html @@ -0,0 +1,28 @@ +Creating server groups
+

Creating server groups

+ + +

Server groups are created from the web console by selecting the Server Nodes tab and clicking on Server Groups.

+ +
+
Figure 1. Create server group +
+ +
+ +
  1. From the Server Nodes tab, click Server Groups.
  2. +
  3. Click Create Group and provide a group name to the Add Group pop-up.
  4. +
  5. Click Create.
  6. +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rza-delete-group.html b/preview/contents/Tasks/rza-delete-group.html new file mode 100644 index 0000000..b952958 --- /dev/null +++ b/preview/contents/Tasks/rza-delete-group.html @@ -0,0 +1,24 @@ +Deleting server groups
+

Deleting server groups

+ + +

Server groups are deleted by removing all nodes from the server group and then deleting the server group.

+ + +
  1. From the Server Nodes tab, click Remove to remove all nodes from the server group.
  2. +
  3. From the Server Nodes tab, click Server Groups.
  4. +
  5. Click on "This group is empty, click to delete." which is displayed if the server group is empty.
  6. +
  7. Click Delete from the Removing pop-up.
  8. +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rza-manage-group.html b/preview/contents/Tasks/rza-manage-group.html new file mode 100644 index 0000000..4fed3c7 --- /dev/null +++ b/preview/contents/Tasks/rza-manage-group.html @@ -0,0 +1,67 @@ +Managing Rack Awareness
+

Managing Rack Awareness

+ + +

The Rack Awareness feature (Enterprise Edition) enables logical groupings of servers on + a cluster where each server group physically belongs to a rack or availability zone. + This feature provides the ability to specify that active and corresponding replica + partitions be created on servers that are part of a separate rack or zone.

+ +
+

This section describes how to manage server groups through the Web Console. Server + and server groups can also be managed through the Couchbase command-line interface + (CLI) and REST API.

+ +
Note: By default, when a Couchbase cluster is initialized, Group 1 is created.
+ +
    +
  • Upgrade all servers in the cluster to version 2.5 or higher and to Couchbase Enterprise Edition
  • + +
  • Configure at least two server groups.
  • + +
  • Configure all of the servers to use server groups.
  • + +
  • Configure each server group to have the same number of serves (recommended).
  • + +
+ + +

The servers and server groups are displayed from the Server Nodes tab. + Server groups are edited and created by clicking on Server Groups

+ +
Figure 1. Server Nodes tab +
+ + +
Figure 2. Server Groups +
+ + +
+ +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Tasks/rza-move-server.html b/preview/contents/Tasks/rza-move-server.html new file mode 100644 index 0000000..2172b57 --- /dev/null +++ b/preview/contents/Tasks/rza-move-server.html @@ -0,0 +1,29 @@ +Moving servers between server groups
+

Moving servers between server groups

+ + +

Servers are moved between server groups from the Server Groups section.

+ +
+
Figure 1. Apply changes to server group +
+ +
+ +
  1. From the Server Nodes tab, click Server Groups
  2. +
  3. Drag and drop the server from one group to another.
  4. +
  5. Click Apply Changes.
  6. +
  7. From the Server Nodes tab, click Rebalance
  8. +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rza-remove-server.html b/preview/contents/Tasks/rza-remove-server.html new file mode 100644 index 0000000..60cbd9d --- /dev/null +++ b/preview/contents/Tasks/rza-remove-server.html @@ -0,0 +1,22 @@ +Removing servers from server groups
+

Removing servers from server groups

+ + +

Servers are removed from server groups group.

+ +
  1. From the Server Nodes tab, click Remove for the server that you want to delete.
  2. +
  3. Click Remove from the confirmation pop-up.
  4. +
  5. From the Server Nodes tab, click Rebalance.
  6. +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/rza-rename-group.html b/preview/contents/Tasks/rza-rename-group.html new file mode 100644 index 0000000..9104066 --- /dev/null +++ b/preview/contents/Tasks/rza-rename-group.html @@ -0,0 +1,27 @@ +Renaming server groups
+

Renaming server groups

+ + +

Server groups are rename from the web console by selecting the Server Nodes tab and clicking on Server Groups.

+ +
+
Figure 1. Edit server group +
+ +
+ +
  1. From the Server Nodes tab, click Server Groups.
  2. +
  3. Click Edit Group
  4. +
  5. Change the group name and click Save.
  6. +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-autocompact-strategies.html b/preview/contents/Tasks/tasks-autocompact-strategies.html new file mode 100644 index 0000000..7c9aaa5 --- /dev/null +++ b/preview/contents/Tasks/tasks-autocompact-strategies.html @@ -0,0 +1,126 @@ +自動コンパクションの設定と戦略
+

自動コンパクションの設定と戦略

+ + +

Couchbase Serverは自動化したコンパクションメカニズムを採用しており、データファイルとViewインデックスファイルをコンパクションできます。

+

データベース、Viewインデックスデータファイル内のフラグメント状態を測定し、コンパクションを実行します。

+ +
注: 地理空間インデックスは自動的にコンパクションされません。 これらは手動でコンパクションする必要があります。
+ + +

設定

+ +

自動コンパクションは次を利用して設定できます:

+ +
    +
  • デフォルト自動コンパクション、これはCouchbase Server内のすべてのCouchbaseバケットに影響します。 Couchbase Serverでデフォルトの自動コンパクション設定を行った場合、すべてのCouchbaseバケットで自動的に自動コンパクションが有効になります。
  • + +
  • バケット自動コンパクション 、各Couchbaseバケットで設定できます。 + バケット単位のコンパクションは、設定していなかったとしても、デフォルトの自動コンパクション設定を常にオーバーライドします。 Couchbaseバケットの作成時および変更時に、明示的にCouchbaseバケット単位の特定の設定をオーバライドするか選択できます。
  • + +
+ +

デフォルトの自動コンパクションと、Couchbaseバケット単位で利用可能な設定は同一です:

+ +
+ +
データベースフラグメンテーション
+ +
コンパクションを実行する最初の設定は、データベース内のフラグメント率です。 + この数値は各アイテムのフラグメント率を表現し、コンパクション処理を実行する際のフラグメントレベルを設定することができます。 +

例えば、フラグメント率を10%に設定すると、自動コンパクションの時間帯を制限していない場合は、フラグメントレベルが判定された時点で、コンパクション処理が開始されます。 詳細は、 時間帯を参照してください。

+
+ + +
+ +
+ +
Viewフラグメンテーション
+ +
コンパクションを実行する、すべてのViewインデックスファイル内のフラグメント率を、パーセンテージで指定します。
+ + +
+ +
+ +
時間帯
+ +
データベースを頻繁に利用している最中に自動コンパクションの実行を避けるために、コンパクションを実行可能な時間帯を指定できます。 時間と分の組み合わせでコンパクション実行時間帯を表現します。 例えば、01:00から06:00の間でコンパクションが実行されるように設定できます。

指定した時間帯以外でコンパクションの実行が必要と判断されても、指定した時間帯になるまで延期されます。 + この時間帯はCouchbase Serverがを稼働中、毎日適用されます。 + 時間帯は日単位で設定することはできません。

+
+ + +
+ +
+ +
コンパクションの強制停止
+ +
コンパクションは、コンパクション実行中に実行可能な時間帯を過ぎた場合、コンパクションプロセス全体を終了するように設定することができます。 + このオプションはコンパクション処理に影響し、このオプションが有効でコンパクションが実行中の場合、コンパクション処理は停止します。 + コンパクション処理中に生成したファイルは保持され、次の時間帯になったらコンパクションが再開します。 + コンパクションが指定時間外で稼働することがないことを保証するため、特定の時間帯でCouchbaseのパフォーマンスを保証したい場合に便利な設定です。

このオプションが無効の場合、時間帯を過ぎても、コンパクションは完了するまで継続して稼働します。

+

コンパクション処理を確実に完了させたい場合、便利なオプションです。

+
+ + +
+ +
+ +
コンパクションの並列実行
+ +
デフォルトでは、コンパクションはまずデータベース、次にViewと、シーケンシャルに実行します(両方とも自動コンパクションで設定されていた場合)。 並列コンパクションを有効にすると、データベースとViewは同時にコンパクションされます。 + これは、両方を同時に処理するためにより多くのCPUとデータベースアクティビティが必要となりますが、CPUコアやディスクI/O (例えば、データベースやViewインデックス情報が別々の物理ディスクデバイスに保存されている)が十分にある場合、これら二つはより短時間で完了できます。
+ + +
+ +
+ +
メタデータ削除間隔
+ +
期限切れおよび削除されたアイテムの、 墓石 (tombstone) は自動コンパクション処理の途中で削除できます。 墓石は、削除された、または期限切れとなったアイテムのキーとメタデータを保持するレコードで、クラスタ間、およびViewの一貫性を保つために利用されます。
+ + +
+ +

自動コンパクションの設定はCouchbase Webコンソールから実行できます。 バケット単位の情報は、Couchbase Bucket create/edit画面で設定できます。 これらの設定はREST APIを利用して閲覧、設定することもできます。

+ +
+ + +

自動コンパクション戦略

+ +

データベースとコンパクションのパフォーマンスが要件に一致するよう、自動コンパクションのフラグメンテーションとスケジュールの設定は慎重に選択してください。

+ +

以下を考慮してください:

+
    +
  • コンパクション処理を監視し、データベースのコンパクション時間を把握します。 これは、自動コンパクション実行時間帯を適切に設定するために役立つでしょう。
  • + +
  • コンパクションはデータベースで利用しているディスク容量に影響しますが、パフォーマンスに影響を与えるべきではありません。 小規模なデータベースファイルに頻繁にコンパクションを実行する場合は問題になりませんが、巨大なデータベースファイルに頻繁にコンパクションを実行するとパフォーマンスとディスク利用に影響を与える場合があります。
  • + +
  • コンパクションはいつでも停止できます。 これはコンパクションを特定の時間帯でスケジュールしている場合に、リソースが不足した場合、コンパクションを停止し、次のオフピーク時間帯に再開するということです。
  • + +
  • コンパクションは停止、再開できるので、間接的にインクリメンタルなコンパクションを実行することができます。 例えば、1時間のコンパクション時間帯と、コンパクションの強制終了を設定していて、コンパクションが完了するまでに4時間かかる場合、4日間にわたってインクリメンタルに実行されます。
  • + +
  • 自動コンパクションを適用したいCouchbaseバケットが大量にある場合、各バケットのコンパクションがそれぞれ独自の時間帯に実行されるように、自動コンパクションの実行時間帯を各バケットでずらしてスケジュールすると良いでしょう。
  • + +
+
+ +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-backup-restore-incremental.html b/preview/contents/Tasks/tasks-backup-restore-incremental.html new file mode 100644 index 0000000..e8ef113 --- /dev/null +++ b/preview/contents/Tasks/tasks-backup-restore-incremental.html @@ -0,0 +1,139 @@ +差分バックアップとリストア
+

差分バックアップとリストア

+ + + + +

+ 差分バックアップとリストアを利用すると、データベース内の変更されたデータのみを高速にバックアップし、 + より大きなデータセットに対し、バックアップの作成とリストアをより効率的に行うことができます。 +

+ +
重要: この機能はEnterprise Editionのみで利用可能です。
+ +

差分バックアップの目的は前回のバックアップから変更されたデータのみのバックアップを行うことです。 + 差分バックアップには次の利点があります: +

+ + +
    +
  • より多くのバックアップ戦略を選択可能
  • + +
  • より柔軟なリストアプロセス
  • + +
  • 日次のバックアップ時間を短縮
  • + +
  • バックアップに必要なディスクストレージ容量の削減
  • + +
  • ネットワーク経由のバックアップによる帯域の削減
  • + +
+ + +

+ データを復旧する場合、復旧プロセスでは最後のフルバックアップと、一つ以上の差分バックアップを利用します。 + 特定の指定で始まるデータを指定したり、特定の日付で終わるデータを指定してリストアすることができます。 + より詳細な情報はCouchbase CLIのcbbackupと、 + cbrestore commandsを参照してください。 +

+ + + + +

フルバックアップに加えて、Couchbase Serverは以下の差分バックアップが可能です:

+ +
    +
  • 変更差分バックアップ(Differential incremental backup)
  • + +
  • 累積差分バックアップ(Cumulative incremental backup)
  • + +
+ + +

変更差分バックアップ

+ +

+ 変更差分バックアップは最終バックアップから発生したデータベースの変更のみを含みます。 + 変更差分バックアップは、より少ないデータをバックアップするので、高速に作成できますが、 + 変更差分バックアップによるリストアは、累積差分バックアップよりも長い時間がかかります。 +

+ +

+ 以下の図は変更差分バックアップ戦略の例を示しています。 + 日曜日ごとに、フルバックアップを作成しています。 + その他の曜日では、変更差分バックを作成しています。 +

+ + +

+ この例では、月曜日のバックアップは日曜日のフルバックアップからの変更を含み、 + 火曜日のバックアップは月曜日のバックアップ以降の変更を含み、 + 水曜日のバックアップは火曜日のバックアップ以降の変更を含みます。 + もし、例えば水曜日にリストアを行ったとすると、リストアでは日曜日に取得したフルバックアップと、 + 月曜日と火曜日に作成した変更差分バックアップを利用します。 +

+
+ + +

累積差分バックアップ

+ +

+ 累積差分バックアップは最終フルバックアップから発生したすべての変更を含みます。 + 累積差分バックアップからの復旧は、変更差分バックアップよりも高速ですが、 + 累積差分バックアップは、変更差分バックアップよりもバックアップ時間とディスク容量を要します。 +

+ +

+ 以下の図は、累積差分バックアップ戦略の例を示しています。 + 日曜日ごとに、フルバックアップを作成しています。 + その他の曜日では、累積差分バックアップを作成しています。 +

+ + +

+ この例では、月曜日のバックアップは日曜日に作成したフルバックアップ以降のすべての変更を含み、 + 火曜日のバックアップも日曜日に作成したフルバックアップ以降のすべての変更を含み、 + 水曜日のバックアップも日曜日に作成したフルバックアップ以降のすべての変更を含みます。 + もし、例えば水曜日にリストアを行ったとすると、 + リストアでは日曜日のフルバックアップと、火曜日の累積差分バックアップを利用します。 +

+ +
+ + +

差分バックアップを結合

+ +

+ より高い柔軟性を持つリストア処理として、変更差分バックアップと累積差分バックアップを結合した戦略をとることも可能です。 +

+ +

+ 以下の図では、変更差分バックアップ、累積差分バックアップ両方を取り入れたバックアップ戦略を示しています。 + 日曜日ごとにフルバックアップを作成しています。 + その他の曜日では、曜日によって、変更差分バックアップか、累積差分バックアップのいずれかを作成しています。 +

+ + +

+ この例では、バックアップスケジュールは曜日ごとに変更差分バックアップと累積差分バックアップを利用しています。 + 月曜日、火曜日、水曜日、金曜日、土曜日には変更差分バックアップを作成します。 + 木曜日には、累積差分バックアップを作成しています。 + このバックアップスケジュールでは、土曜日にリストアを行った場合、 + 日曜日に作成したフルバックアップと、木曜日に作成した累積差分バックアップと、 + 金曜日に作成した変更差分バックアップを利用します。 +

+ +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-backup-restore.html b/preview/contents/Tasks/tasks-backup-restore.html new file mode 100644 index 0000000..9bffc38 --- /dev/null +++ b/preview/contents/Tasks/tasks-backup-restore.html @@ -0,0 +1,69 @@ +Backup and restore
+

Backup and restore

+ + +

Back up your entire cluster periodically to minimize data inconsistency when a restore + is required.

+ +

Backing up your data should be a regular process on your cluster to ensure that + you do not lose information in the event of a serious hardware or installation + failure.

+ + +

There are a number of methods for performing a backup:

+ +
+ +
Using cbbackup
+ +
The cbbackup command enables you to back up a single node, single + buckets, or the entire cluster into a flexible backup structure that allows for restoring + the data into the same, or different, clusters and buckets. All backups can be performed + on a live cluster or node. The command cbbackup is the most flexible + and recommended backup tool.
+ + +
+ +
+ +
Using file copies
+ +
A running or offline cluster can be backed up by copying the files on each node. With + this method, you can only restore to a cluster with the identical configuration.
+ + +
+ +
Note: Due to the active nature of Couchbase Server, it is impossible to create a + complete in-time backup and snapshot of the entire cluster. Because data is always being + updated and modified, it is impossible to take an accurate snapshot.
+ + +
Note: You must back up and restore your entire cluster to minimize any data + inconsistencies. Couchbase is always per-item consistent, but does not guarantee total cluster + consistency or in-order persistence.
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-common.html b/preview/contents/Tasks/tasks-common.html new file mode 100644 index 0000000..45482e9 --- /dev/null +++ b/preview/contents/Tasks/tasks-common.html @@ -0,0 +1,116 @@ +Common administration tasks
+

Common administration tasks

+ +

Couchbase Server is capable to perform self-managing tasks such as general running and + configuration.

+ +

The management + infrastructure and components of the Couchbase Server system are able to adapt to the + different events within the cluster. There are only a few different configuration variables, + and the majority of these configuration variables do not need to be modified or altered in most + installations.

+ +

However, there are a number of different tasks that are performed over the lifetime of the + cluster environment including:

+ +
    +
  • Expanding your cluster when you need to expand the RAM or disk I/O capabilities.
  • + +
  • Failing over and altering the size of your cluster as your application demands change.
  • + +
  • Monitoring and reacting to the various statistics reported by the server to ensure that + your cluster is operating at the highest performance level.
  • + +
  • Backing up the cluster.
  • + +
+ +

These tasks require additional activities such as:

+ +

Increasing or reducing your cluster size

+

When your cluster requires additional RAM, disk I/O, or network capacity, you will need to + expand its size. If the increased load is only a temporary event, then you may + later want to reduce the size of your cluster.

+ +

You can add or remove multiple nodes from your cluster at the same time. Once the new node + arrangement has been configured, the process of re-distributing the data and bringing the nodes + into the cluster is called rebalancing. The rebalancing process moves the + data around the cluster to match the new structure, and can be performed live while the + cluster is still servicing application data requests.

+ +
+ + + +

Warming up a server

+ +

In some cases you might want to explicitly shut down a server + and then restart it. Typically, the server has been running for a while and contains data stored on + disk when you restart it. In this case, the server needs to undergo a warmup process before it + can again serve data requests.

+ +
+ + +

Handling a failover situation

+

A failover situation occurs when one of the nodes within your cluster fails, usually due to a + significant hardware or network problem. Couchbase Server is designed to cope with this + situation through the use of replicas, which provide copies of the data around the cluster + that can be activated when a node fails.

+ +
Couchbase Server provides two mechanisms for handling failovers.
+ +
Automated failover
+ +
It enables the cluster to operate autonomously and react to failovers without human + intervention.
+ + +
+
+ +
Monitored failover
+ +
It enables you to perform a controlled failure by manually failing over a node. + There are additional considerations for each failover type, and you should read the + notes to ensure that you know the best solution for your specific situation.
+ + +
+
+ +
+ + +

Managing database and view fragmentation

+

The database and view index files created by Couchbase Server can become fragmented. This can + cause performance problems and an increase in space used on disk by the files + compared to the size of the information they hold. Compaction reduces this fragmentation to + reclaim the disk space.

+ +
+ + +

Backing up and restoring your cluster data

+

Couchbase Server automatically distributes your data across the nodes within the cluster, and + supports replicas of that data. It is a good practice to have a backup of your bucket + data in the event of a more significant failure.

+ +
+ +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-compaction-process.html b/preview/contents/Tasks/tasks-compaction-process.html new file mode 100644 index 0000000..3761b19 --- /dev/null +++ b/preview/contents/Tasks/tasks-compaction-process.html @@ -0,0 +1,115 @@ +コンパクションプロセス
+

コンパクションプロセス

+ +

Couchbase ServerはViewとデータファイルをコンパクションします。

+ +

データベースのコンパクションでは、Couchbase Serverは新規ファイルを作成し、アクティブな(最新の)情報を書き込みます。 その際、既存のデータベースファイルはそのまま存在し、情報の保存とインデックスデータの更新に利用されます。 この処理はコンパクションを実行中でも、データベースが継続して利用可能であることを保証します。 コンパクションが完了すると、以前のデータベースは無効化され保存されます。 その後、すべての更新リクエストは新しく作成されたデータベースファイルに渡され、古いデータベースはシステムから削除されます。

+ +

Viewのコンパクションも同様の方法で実行します。 Couchbase Serverは各アクティブなデザインドキュメントで、新規のインデックスファイルを作成します。 そして、この新規インデックスファイルを利用し、アクティブなインデックス情報を書き込みます。 古いインデックスファイルをコンパクション中に、古いインデックスファイルは同様に処理されます。 + コンパクションが完了すると、古いインデックスファイルはシステムから削除されます。

+ + +

コンパクションの利用方法

+ +

コンパクションはCouchbase Server稼働中に、バックグラウンドプロセスとして実行されます。 + データベースオペレーションを停止したり、シャットダウンすることなく、データベース稼働中にクライアントが継続してアクセスでき、リクエストを送信できます。 コンパクションをバックグラウンドで実行中は、以下に注意してください:

+ + +
+ +
すべてのサーバ上でコンパクションを実施する。
+ +
コンパクションはCouchbase Serverクラスタ内の単一のサーバ上で実行される処理です。 クラスタ内のすべてのデータベース、およびすべてのノード上でコンパクションを実行する必要があります。
+ + +
+ +
+ +
オフピーク時間帯にコンパクションを実行する。
+ +
コンパクション処理はディスク、CPUインテンシブな処理です。 頻繁に書き込みを行うデータベースでコンパクションを実行する場合、オフピーク時間帯にスケジュールするべきです (特定の時間帯を指定するには自動コンパクションを利用します)。

コンパクションをオフピーク時間帯にスケジュールしない場合、問題が発生する可能性があります。 巨大でビジーなデータベースでは、コンパクションが完了するまでに長時間かかることがあり、データベースがアクティブであっても、正常に完了せず失敗することがあります。 極端な場合、データベース変更にコンパクション処理が追いつかず、結果的にすべてのディスク領域を使い果たしてしまう場合もあります。 これを避けるために、オフピーク時間帯にコンパクションをスケジュールしてください。

+
+ + +
+ +
+ +
十分なディスク領域を用いてコンパクションを実行する。
+ +
コンパクションは新規ファイルを作成して情報を更新するため、現在のデータベースとインデックスファイルの二倍のディスク領域が必要になります。 しかしながら、実際に必要となるディスク領域は、フラグメントレベル、最新でないデータの量、コンパクション中にも更新したデータファイルを書き込む必要があるため、データベースのアクティビティに依存するということを考慮してください。 コンパクション実行前にディスク容量がチェックされます。 利用可能なディスク容量が現在のデータベースサイズの二倍より少ない場合、コンパクション処理は実行されず、警告がログに出力されます。
+ + +
+ + + +
+ +

コンパクションの挙動

+ +

自動コンパクションで設定可能な挙動は:

+ + +
+ +
停止/再開:
+ +
コンパクション処理は停止、再開できます。 しかしながら、コンパクション処理を停止し、データベースへの更新を行った場合、コンパクション処理を再開しても、更新されたデータベースはコンパクションされたバージョンではないことに注意してください。 これはコンパクションをキャンセルし、再開する前に実行したデータベースファイルの一部への変更が、すでに処理されているため発生します。
+ + +
+ + +
+ +
自動コンパクション
+ +
自動コンパクションはデータベースのコンパクション処理を自動的に開始します。 コンパクション実行時間帯を指定できます。
+ + +
+ +
+ +
コンパクション実行ログ:
+ +
コンパクションの実行はCouchbase Serverログに出力されます。 コンパクションの動作と実行時間を示す以下のようなエントリが出力されます: +
    +
  • 自動コンパクション: ディスク容量不足のため、コンパクションが実行できなかったことを示します。
  • + + +
  • 手動で実行されたコンパクション
  • + +
  • コンパクションが正常に完了
  • + +
  • コンパクションが失敗
  • + +
  • コンパクションを削除
  • + +
  • コンパクションの開始/完了
  • + +
  • コンパクションが失敗
  • + +
+ +
+ +
+ + +
+ +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-compaction.html b/preview/contents/Tasks/tasks-compaction.html new file mode 100644 index 0000000..439a5f5 --- /dev/null +++ b/preview/contents/Tasks/tasks-compaction.html @@ -0,0 +1,37 @@ +データファイルのコンパクション
+

データファイルのコンパクション

+ + +

データベースとViewのコンパクションはフラグメント化を解消し、ディスク容量を解放します。

+ +

Couchbaseバケットの情報が永続化されたデータファイルは、情報が追加、更新、削除されるたびに書き込まれます。 このプロセスは結果的にデータファイル内で実データサイズとファイルサイズの差(特にデータを削除した場合)が発生します、これはコンパクションと呼ばれる処理で解消します。

+ +

Viewが構築されるたびに作成されるインデックスファイルも、シーケンシャルなフォーマットで保存されています。 保存された情報のインデックスを更新する際に、更新したインデックス情報がファイルに追記されます。

+ +

どちらの場合も、ディスク上のファイルを頻繁にコンパクションすることで、ディスク容量を解放し、フラグメント化を削減できます。

+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-create-readUser.html b/preview/contents/Tasks/tasks-create-readUser.html new file mode 100644 index 0000000..c9fac9f --- /dev/null +++ b/preview/contents/Tasks/tasks-create-readUser.html @@ -0,0 +1,85 @@ +Creating a read-only user
+

Creating a read-only user

+ + +

One non-administrative user can be created with read-only access for the Web Console and REST API.

+ +
+

A read-only user cannot create buckets, edit buckets, add nodes to clusters, change XDCR settings, create views or see any stored data. + Any REST API calls which require an administrator fail and return an error for this user.

+ + +

In the Couchbase web console, a read-only user can view:

+
    +
  • Cluster Overview.
  • + +
  • Design documents and view definitions but cannot query views.
  • + +
  • Bucket summaries including Cache Size and Storage Size, but cannot view documents.
  • + +
  • List of XDCR replications and remote clusters.
  • + +
  • Logged events under the Log tab, but the user cannot Generate Diagnostic Report.
  • + +
  • Settings for a cluster.
  • + +
+ + +
Note: +

If a read-only user performs a REST POST or DELETE request that changes cluster, bucket, XDCR, or node settings, + the server sends an HTTP 401 error:

+ +

+HTTP/1.1 401 Unauthorized WWW-Authenticate: Basic realm="Couchbase Server Admin / REST"
+....
+
+ +
+ + +
Tip: The read-only user cannot set up a Couchbase SDK to connect to the server. + All SDKs require that a client connect with bucket-level credentials.
+ + + +
+ + + + + +
  1. + + In the Couchbase Web Console, click Settings. +
    A panel appears with several different sub-tabs. +
    +
    +
  2. +
  3. Click Account Management. A panel appears where you can add a read-only user.
  4. +
  5. Enter a Username, Password and verify the password.
  6. +
  7. Click Create. +
    The panel refreshes and has options for resetting the read-only user password or deleting the user. +
    +
    +
  8. +
+ + + + +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-create-readwrite-existing.html b/preview/contents/Tasks/tasks-create-readwrite-existing.html new file mode 100644 index 0000000..0c2c829 --- /dev/null +++ b/preview/contents/Tasks/tasks-create-readwrite-existing.html @@ -0,0 +1,60 @@ +既存バケットの read-write を指定する
+

既存バケットの read-write を指定する

+ + +

既存のデータバケットのreaderとwriter数を変更できます: Data Buckets > Data bucket drop-down > Disk Read-Write Concurrency

+ + + +
+

バケットを作成した後も、reader/writer設定は変更することができます。 + バケットの設定を変更すると、そのバケットは再起動し、利用可能となる前に、サーバウォームアップを行います。

+ +
+ + +
  1. + Data Bucketsタブをクリックします。 +
    クラスタ内のすべてのバケットが一覧表示されます。
    +
  2. +
  3. + データバケット名の隣のドロップダウンをクリックします。 +
    バケットの情報が表示されると同時に、バケット管理のコントロールが表示されます。 +
    +
    + +
    +
  4. +
  5. + Editをクリックします。 +
    Configure Bucketパネルが表示され、reader-writer設定を変更できます。
    +
  6. +
  7. Disk I/O Optimizationで、バケットのディスクI/O優先度を指定します。 Low (デフォルト) は3つのreader/writer、Highは8つを割り当てます。
  8. +
  9. Saveをクリックします。 +
    この変更はデータバケットを再作成することを示す警告が表示されます。 +
    + +
    + +
    +
  10. +
  11. + Continueをクリックします。 +
    Data Bucketsタブが表示され、そのバケットが黄色または緑のインジケータで表示されます。 + 黄色のインジケータはバケットが再作成され、ウォームアップ中であることを示します。 + 緑のインジケータはバケットのウォームアップが完了したことを示します。 + この時点で、バケットはリクエストを受け付け、処理する準備が整います。
    +
  12. +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-create-readwrite-new.html b/preview/contents/Tasks/tasks-create-readwrite-new.html new file mode 100644 index 0000000..33a7d5a --- /dev/null +++ b/preview/contents/Tasks/tasks-create-readwrite-new.html @@ -0,0 +1,50 @@ +新規バケットの read-write を指定する
+

新規バケットの read-write を指定する

+ + +

readerとwriterの数は一般的にデータバケットの作成時に指定します: Data Buckets > Create New Data Bucket > Disk Read-Write Concurrency

+ +
+

readerとwriterの数は一般的に新規バケットの作成時に指定します(デフォルト: 3)。 + ですが、read-write設定は既存のバケットでも設定可能です。

+ +

デフォルトバケットはリクエストを受け付け、処理する準備ができています。 名前付きバケットを作成すると、同様のステータスインジケータがバケット名の隣に表示されます。

+ +
+ + +
  1. + Data Bucketで、Create New Data Bucketをクリックします。 +
    Configure Bucketパネルが表示され、新規バケットの設定を指定できます。
    +
  2. +
  3. + Disk I/O Optimizationで、バケットのディスクI/O優先度を指定します。 Low (デフォルト) は3つのreader/writer、Highは8つを割り当てます。 +
    +
    + +
    +
  4. +
  5. + その他のバケット単位の設定を入力します。
  6. +
  7. + Createをクリックします。 +
    新規バケットがウォームアップを実行中は黄色のインジケータで表示され、ウォームアップが完了すると緑のインジケータで表示されます。 +
    + +
    + +
    +
  8. +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-dataRecovery.html b/preview/contents/Tasks/tasks-dataRecovery.html new file mode 100644 index 0000000..971cf72 --- /dev/null +++ b/preview/contents/Tasks/tasks-dataRecovery.html @@ -0,0 +1,205 @@ +リモートクラスタからのデータリカバリ
+

リモートクラスタからのデータリカバリ

+ + +

リモートクラスタからのデータリカバリはXDCR環境、負荷と復旧データを扱うための十分なメモリとディスク容量が必要です。

+ +

レプリカ数を超えるノードがダウンしてしまうと、クラスタ内のデータパーティションは利用できなくなります。 例えば、4ノードのクラスタでレプリカを1つの構成で、2つのノードがダウンすると、いくつかのデータパーティションが利用できなくなります。 + この状況の解決方法は二つあります:

+ +
    +
  • ディスクからデータを復旧する。 ディスクから復旧する計画の場合、ディスクが完全に故障してしまうと復旧できなくなります。
  • + +
  • リモートクラスタのパーティションから復旧する。 二つ目のクラスタにXDCRのデータレプリケーションを設定している場合、この方法が利用できます。 cbrecoveryを利用するためには、バックアップデータを保持する第二のクラスタを構築する必要があります。
  • + +
+ +

以下は複数ノードの障害により、クラスタのレプリカvBucketが消失しているシナリオを表しています:

+ + + + +

リカバリを実行する前に、メインのクラスタが十分なメモリとディスク容量を持っていて、負荷と復旧するデータを扱えることを確認してください。 + ノード障害が起こったクラスタにデータが復旧できるとしても、ノード障害の原因を調査し、データを復旧する前に、十分なキャパシティを持つクラスタを用意することが重要です。 + ノード追加後はリバランスを実行してください。

+ + +

cbrecoveryを利用すると、メインのクラスタとバックアップのクラスタのデータパーティションを比較し、検知した消失しているデータパーティションを送信します。 失敗した場合、cbrecoveryを正常にリスタートすると、クラスタ間の差分を再度比較し、失敗した時点から消失しているパーティションを特定し、これらのパーティションの復旧を再開します。

+ +

障害シナリオ

+ +

4ノードのクラスタで、レプリカ数が1のとき、以下の事象が発生したとします。 各ノードは256のアクティブ、256のレプリカvBucketを持ち、合計で1024のアクティブ、1024のレプリカvBucketとなります。

+ +
    +
  1. ノードが一つダウンすると、クラスタ内のいくつかのアクティブとレプリカのvBucketが利用できなくなります。
  2. + +
  3. このノードをフェイルオーバすると、他のノード上にある関連するレプリカvBucketがアクティブの状態に遷移します。 この時点で、完全なアクティブのvBucketセットと、部分的なレプリカvBucketセットがクラスタ内に存在します。
  4. + +
  5. 二つ目のノードがダウンします。 より多くのアクティブvBucketがアクセスできなくなります。
  6. + +
  7. 二つ目のノードをフェイルオーバします。 この時、対応するレプリカvBucketが存在しないアクティブvBucketはすべて消失してしまいます。
  8. + +
+ +

このようなシナリオのとき、cbrecoveryを利用して、失われたvBucketをバックアップクラスタから取得できます。 メインとバックアップの両クラスタで、複数ノードの障害が発生した場合、データロスが発生してしまいます。

+ +

cbrecoveryのリカバリシナリオ

+ +

このアプローチが発生した障害シナリオに有効かどうか、より良く理解していただけるよう、以下にいくつかのクラスタ構成を記載します:

+ +
    +
  • クラスタ内の複数ノードがダウン。 クラスタ内の複数ノードがダウンすると、いくつかのvBucketが利用不可となります。 この場合、すでに他のクラスタとXDCRをセットアップしていれば、それらの利用できないvBucketを他のクラスタから復旧できます。
  • + +
  • レプリカが不十分なバケット。
  • + +
+ +

単一バケット。 クラスタ内に、レプリカが0の単一のバケットしか存在しない場合、 + クラスタ内のノードがダウンすると、そのノードのパーティションは利用不可となります。 + このクラスタでXDCRをセットアップしてあれば、失われたパーティションをcbrecoveryで復旧できます。

+ +

複数バケット。 クラスタ内のノードは複数のバケットを持ち、あるバケットにはレプリカがあり、またレプリカを持たないバケットもあるでしょう。 以下の図では、すべてのノードがBucket 1とBucket 2の二つのバケットを持っているクラスタを示しています。 Bucket 1はレプリカがありますが、Bucket 2にはありません。 この場合、ノードが1つダウンすると、Bucket 1にはレプリカがあるので、そのノードをフェイルオーバすれば、他のノード上のレプリカをアクティブにできます。 + しかし、レプリカがないバケットのいくつかのパーティションは利用不可となり、cbrecoveryでデータを復旧しなくてはなりません。 + この例で、もしクラスタ内の複数のノードがダウンした場合、どちらのバケットもパーティションが失われるため、vBucketリカバリを両バケットに対して実行する必要があります。

+ + + + +

リカバリのハンドリング

+ +

ノード障害が発生し、vBucketが利用できなくなった場合、以下のプロセスに従ってください:

+ +
    +
  1. 各障害ノードで、WebコンソールのServer NodesタブにあるFail Overをクリックします。 +

    Fail Overをクリックすると、Web コンソールのLogタブにデータが利用不可かどうか、また利用不可のvBucketはどれかが表示されます。 フェイルオーバしたノード数に対して十分なレプリカがない場合、いくつかのvBucketが利用不可となります:

    + + + +
  2. + + +
  3. 障害ノードを置換するための、正常に機能する新規ノードを追加します。 +

    新規ノードをクラスタに追加後、リバランスはしないでください。 通常、ノードをクラスタに追加後にリバランスをしますが、このシナリオではリバランスすると、失われたvBucketの情報が削除されてしまい、それらを復旧することができなくなります。

    + + + + +

    この例では、3ノードのクラスタ内で、2つの障害ノードが存在し、新規ノードとして、10.3.3.61を追加しています。

    + +

    お使いのクラスタが容易に負荷と復旧データを処理できるなら、このステップはスキップしても構いません。

    +
  4. + + +
  5. cbrecoveryを実行し、バックアップクラスタからデータを復旧します。 Serverパネルに、Stop Recoveryボタンが表示されます。 + + +

    リカバリが完了すると、このボタンは非表示となります。

    + +
  6. + + +
  7. クラスタをリバランスします。 +

    リカバリが完了したら、クラスタをリバランスできます、実行するとレプリカを再作成し、クラスタ全体に均等に再分配します。

    + + + +
  8. + +
+ + +

リカバリの'ドライラン'

+ +

vBucketをリカバリする前に、クラスタ内で利用できなくなっているバケットのリストを確認したい場合があります。 次のコマンドとオプションを利用します:

+ +

+   shell> ./cbrecovery http://Administrator:password@10.3.3.72:8091 http://Administrator:password@10.3.3.61:8091 -n
+
+ +

クラスタ内のノードの管理者情報を指定し、同時に-nオプションも指定しています。 + これはメインのクラスタ内にはすでに存在しない、リモートのセカンダリクラスタのvBucketの一覧を返します。 クラスタ内でノード障害が発生していて、利用不可となっているバケットが存在する場合、以下のように出力されます:

+ +

+   2013-04-29 18:16:54,384: MainThread Missing vbuckets to be recovered:[{"node": "ns_1@10.3.3.61",
+"vbuckets": [513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526,, 528, 529,
+530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545,, 547, 548,
+549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567,
+568, 569, 570, 571, 572,....
+
+ +

vbuckets配列はクラスタ内で利用不可となっているすべてのvBucketを含んでいます。 + これらが、リモートクラスタから復旧できるバケットです。 vBucketのリカバリ方法:

+ +

+shell> ./cbrecovery http://Administrator:password@<From_IP>:8091 \
+ http://Administrator:password@<To_IP>:8091 -B bucket_name
+
+ +

ホスト名、ポート、リモートクラスタの認証情報、失われたvBucketを持つクラスタの順で指定すれば、利用不可のvBucketがあるクラスタから、もしくはリモートクラスタからコマンドを実行できます。 -Bパラメータを指定しない場合、ツールはデフォルトバケットの利用できないvBucketをリカバリします。

+ +

リカバリプロセスのモニタリング

+ +

Couchbase WebコンソールのData Bucketsタブでリカバリプロセスの進捗状況をモニタリングできます。

+ +
    +
  1. Data Bucketタブをクリックします。
  2. + +
  3. Data Bucketsドロップダウンから、リカバリ中のデータバケットを選択します。
  4. + +
  5. Summaryドロップダウンをクリックし、このデータバケットのより詳細な情報を確認します。 itemsのグラフでリカバリ中に数値が上昇しているのが確認できます。 + + +
  6. + + +
  7. アクティブvBucketの数も増加し、1024個のvBucketとなるまでリカバリされます。 ドロップダウンでvBucket Resourcesをクリックします: + + + +

    コマンドラインから実行したこのツールは、他のコマンドと同様、いつでも停止することができます。

    + +
  8. + +
  9. ServersパネルにStop Recoveryボタンが表示されます。 このボタンをクリックすると、クラスタ間のリカバリプロセスを停止します。 リカバリプロセスが完了すると、このボタンは非表示となり、クラスタをリバランスする必要があります。 Couchbase Webコンソールを表示していれば、このパネルからも停止できます: + + +
  10. + + +
  11. リカバリが完了した後、Server Nodesタブをクリックし、Rebalanceをクリックしてクラスタをリバランスします。
  12. + +
+ + + +

cbrecoveryが完了すると、コンソールにレポートが出力されます:

+ +

+ Recovery :                Total |    Per sec
+ batch    :                 0000 |       14.5
+ byte     :                 0000 |      156.0
+ msg      :                 0000 |       15.6
+4 vbuckets recovered with elapsed time 10.90 seconds
+
+ + +

このレポート内のbatchcbrecoveryによって実行された内部オペレーションのグループで、byteはリカバリされた総バイト数、msgはリカバリされたドキュメント数を示します。

+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-manage-ReadWrite.html b/preview/contents/Tasks/tasks-manage-ReadWrite.html new file mode 100644 index 0000000..6e5221f --- /dev/null +++ b/preview/contents/Tasks/tasks-manage-ReadWrite.html @@ -0,0 +1,36 @@ +マルチ reader writer の利用
+

マルチ reader writer の利用

+ + +

複数のreaderとwriterを利用すると、ディスクI/Oスループットを向上できます。

+ +

複数のreaderとwriterはディスクへのデータ永続化をサポートします。 デフォルトでは、データバケット単位に計3つのワーカが設定され、2つのreaderワーカと、1つのwriterワーカとなります。 この機能はディスクI/Oスループットの改善に利用できます。 最適なディスク利用レベルに達していない場合、設定を増加させることでディスク利用を向上できます。 ディスク利用がほぼ最大で、I/O競合が発生している場合、この設定を下げてください。 デフォルトでは計3つのreaderとwriterが割り当てられています。

+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-manage-replication.html b/preview/contents/Tasks/tasks-manage-replication.html new file mode 100644 index 0000000..d5eed83 --- /dev/null +++ b/preview/contents/Tasks/tasks-manage-replication.html @@ -0,0 +1,95 @@ +レプリケーションの設定
+

レプリケーションの設定

+ + +

レプリカデータはCouchbaseクラスタ内で分散され、単一障害点を回避します。 + データのレプリケーションはバケットごとに、ノード単位で構成されます。

+ +

Couchbaseクラスタ内には、アクティブデータレプリカデータ + が各ノード上にあります。アクティブデータはクライアントからそのノードに書き込まれたデータです。 + レプリカデータは他のノードにあるアイテムのコピーです。 +

+ +

Couchbase Serverにアイテムを書き込むと、そのデータのコピーをそのノードのRAMから他のノードへとコピーします。 + レプリカデータの分散はアクティブデータの分散と同様に処理されます。レプリカデータの一部分がクラスタ内で分散され、単一障害点を回避します。

+ + +

ノード間のデータレプリケーションは完全にピアツーピアで、直接クラスタ内のノード間で情報がレプリケートされます。 + クラスタ内のノード間にトポロジ、階層、マスタ - スレーブの関係はありません。 + クライアントがクラスタ内のノードに書き込みを行うと、Couchbase Serverはそのノード上にデータを保存し、データをクラスタ内の一つ以上の他のノードに分配します。

+ +

以下の図はCouchbaseクラスタ内の2つのノードがどのようにお互いのレプリカデータを保存しているのかを示しています:

+ + + + + +

クライアントアプリケーションがデータをノードに書き込むと、そのデータはレプリケーションキューに追加され、コピーが他のノードに送信されます。 + レプリケートされたデータは二つ目のノードのRAM上に保存され、二つ目のノード上のディスクに書き込むために、ディスク書き込みキューに配置されます。

+ +

二つ目のノードはまた、レプリカデータとクライアントからの書き込みを同時に処理しています。 + レプリカデータと送信された書き込みデータを同一のディスクキューに追加します。 + ディスク書き込みキュー内のアイテム数が多くなり過ぎると、二つ目のノードは + backoff message + を一つ目のノードに返すことがあります。 + すると一つ目のノードは、二つ目のノードにレプリケーションするアイテムの送信頻度を低くします。 + これは二つ目のノードがすでに大量の書き込み要求をクライアントアプリケーションから受け付けている場合に必要となります。 +

+ +

レプリケーション対象の同一のドキュメントに複数の変更が発生した場合、Couchbase Serverはアイテムを + deduplicateします。 + これは効率化のため、ドキュメントの最新のバージョンのみを二つ目のノードに送るということです。 +

+ +

もしシステム内の一つ目のノードがダウンしても、レプリケートされたデータは二つ目のノードで利用できます。 + 二つ目のノードのRAM内にデータのコピーが存在するため、Couchbaseは二つ目のノードにあるレプリカデータを即座に提供することができます。 + ダウンしたノードからデータをコピーしたり、ディスクからデータを読み込む必要はありません。 + レプリカデータが二つ目のノードで有効になると、Couchbase Serverはデータとサーバのマッピング情報を更新し、 + クライアントアプリケーションにこの情報を共有します。 + そしてクライアントアプリケーションは動作しているノードからレプリカデータを取得できるようになります。 +

+ + +

データレプリケーションの適用

+

必要なデータのコピー数に応じて、各バケットで異なるデータレプリケーションを設定することができます。 + データを冗長化させ可用性を高めるために、各データバケットでは最大3つのレプリカをクラスタ内に作成することができます。 +

+ +

レプリケーションはクラスタ内のノード数が設定したレプリカ数を満たす場合に有効となります。 + 例えば、バケットのレプリカ数を3に設定した場合、クラスタ内に4つ以上のノードが存在する場合のみレプリケーションが有効となります。 +

+ + +

バケットに対してレプリカ数を設定し、バケットを作成した後、レプリカ数を変更することはできません。 + このため、必要なレプリカ数を確実に指定するように注意してください。

+
+ + +
+ + + + + +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-manage-serverWarmup.html b/preview/contents/Tasks/tasks-manage-serverWarmup.html new file mode 100644 index 0000000..5129d09 --- /dev/null +++ b/preview/contents/Tasks/tasks-manage-serverWarmup.html @@ -0,0 +1,84 @@ +サーバウォームアップの対処
+

サーバウォームアップの対処

+ + + + +

Couchbase Serverのウォームアップ動作は、cbepctlツールからアクセススキャナとウォームアップ閾値を設定することで変更できます。

+ + +

ウォームアップ動作を変更するには、Couchbase Serverのアクセスログとスキャンプロセスを理解することが重要です。

+ +

サーバはアクセスログを利用して、どのドキュメントが最も利用されていて、どのドキュメントを優先してロードするのかを決定します。 + RAMの各キーを定期的にスキャンし、access.logという名前のログファイルを作成します。 + また、access.oldという名前でアクセスログのバックアップを作成します。

+ +

ノード障害やウォームアップで最新のアクセスログが壊れていた場合、サーバはこのバックアップファイルをウォームアップに利用します。 + デフォルトでは、このプロセスは2:00 GMTに起動し、その後24時間間隔で実行されます。別の時間に起動し、異なる間隔で実行するように設定することができます。

+ + +

Couchbase Serverがウォームアップ中にクライアントが接続を試みると、サーバはENGINE_TMPFAIL (0x0d) のエラーコードを返します。 + このエラーはウォームアップが完了していないため、まだデータへアクセスできないという意味です。

+ + +
注: もしご自身でCouchbase SDKを開発している場合、このエラーをライブラリ内で適切に処理してください。 + 例えば、クライアントを待たせ、リトライしたり、リクエストを滞留させたり、リトライせずにエラーを返すなどです。
+ + +
注: Couchbase SDKを利用してアプリケーションを開発している場合、このエラー処理については各々のSDKを参照してください。
+ + +

Couchbase Serverウォームアップ中にすべき次のタスクがあります:

+ + +
+ +
ウォームアップの情報を収集する
+ +
cbstatsツールを利用して、ウォームアップ状態や、ウォームアップが有効となっていかなど、サーバウォームアップの情報を取得できます。
+ + +
+ +
+ +
ウォームアップ閾値の変更
+ +
cbepctl ep_warmup_min_items_thresholdパラメータで、ウォームアップの動作を変更できます。 + これはCouchbase Serverがデータの提供を開始する前に到達する必要があるRAMにロードされるアイテム数の割合を指定します。 + より低い値を設定すると、より早くサーバに対するデータアクセスが可能になります。 + ただし、低すぎる値を設定すると、アイテムをリクエストした際に、そのアイテムはメモリ上に存在しない可能性があり、Couchbase Serverではキャッシュミスエラーとなります。 +
+ + +
+ +
+ +
アクセススキャナ設定の変更
+ +
サーバは定期的にスキャナプロセスを実行し、どのキーが最も利用されていて、どのドキュメントを優先してロードするのかを判定します。 + cbepctl flush_paramalog_sleep_timealog_task_timeパラメータを設定し、初回起動時刻と実行間隔を変更できます。
+ + +
+ + + +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-manage-xdcr-dataEncryption.html b/preview/contents/Tasks/tasks-manage-xdcr-dataEncryption.html new file mode 100644 index 0000000..2e58f26 --- /dev/null +++ b/preview/contents/Tasks/tasks-manage-xdcr-dataEncryption.html @@ -0,0 +1,185 @@ +Managing XDCR data encryption
+

Managing XDCR data encryption

+ +
+

The cross data center (XDCR) data security feature (Enterprise Edition only) provides + secure cross data center replication using Secure Socket Layer (SSL) data encryption. + The data replicated between clusters can be encrypted in both uni-directional and + bi-directional replications.

+ +

XDCR data encryption prerequisites

    +
  • Couchbase servers on both source and destination clusters must have Couchbase + 2.5 Enterprise Edition and above installed.
  • + +
  • The source cluster must use the destination cluster’s certificate. The + certificate is a self-signed certificate used by SSL to initiate secure + sessions.
  • + +
  • The reserved ports for XDCR data encryption must be available.
  • + +
+ + +
Important: Ensure that the Secure Socket Layer (SSL) reserved ports are + available prior to using XDCR data encryption. Otherwise, XDCR data encryption is + unavailable.
+ + +

With XDCR data encryption, the following ports are reserved:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PortDescription
11214Incoming SSL Proxy
11215Internal Outgoing SSL Proxy
18091Internal REST HTTPS for SSL
18092Internal CAPI HTTPS for SSL
+
+ + +
Note: If XDCR is employed in a situation where the XDCR traffic between data centers + travels over the internet, Couchbase recommends that you use VPN.
+ + + + +
+ +

To enable XDCR data security

To enable XDCR data security using + SSL and create replication:

+
    +
  1. On the destination cluster, navigate to Settings > Cluster and copy the + certificate.
      +
    • (Optional) To regenerate the existing destination certificate, click + Regenerate before copying.
    • + +
    +
  2. + +
  3. On the source cluster, select the XDCR tab.
  4. + +
  5. On the Remote Clusters panel, click Create Cluster Reference to verify or + create the cluster reference.
  6. + +
  7. Select the Enable Encryption box and paste the certificate in the + provided area and click Save.
  8. + +
  9. On the Ongoing Replications panel, click Create Replication, provide the + cluster and bucket information, and click Replicate.
  10. + +
+
+ +

To change XDCR data encryption

In some situations (such as + updating SSL data security), the SSL certificate is regenerated and the XDCR data + encryption is updated. To change XDCR data encryption:

+
    +
  1. On the destination cluster, navigate to Settings > Cluster.
  2. + +
  3. Click Regenerate and copy the certificate.
  4. + +
  5. On the source cluster, select the XDCR tab.
  6. + +
  7. On the Remote Clusters panel, for the destination cluster, click + Edit.
  8. + +
  9. Paste the regenerated certificate in the provided area and click + Save.
  10. + +
+

Anytime a destination cluster’s certificate is regenerated, the corresponding + source cluster(s) must be updated with the regenerated certificate.

+

For + example, if source clusters A, B, and C use XDCR data encryption to replicate to + destination cluster D, each of the source clusters must be updated whenever the + certificate on the destination cluster D is regenerated + (changed).

+

Important

+

If a destination cluster's certificate is + regenerated and the source cluster(s) are not updated with the new certificate, + replication stops.

+
+ +

SSL certificate

The following is an example of an SSL certificate + and where the certificate is obtained on the cluster.

+ + +
Remote certificate
+ +
+ + +

Create Cluster Reference

The following is an example of the Create + Cluster Reference pop-up.

+ +
Create Cluster Reference +
+
+ + +

XDCR data security error messages

When creating the cluster + reference, if the SSL certificates are not the same on the destination and source + clusters, the following error message + displays:

+
Attention - Got certificate mismatch while trying to send https request to HOST:18091
+
+

If + the SSL certificates become mismatched (for example, if the certificate on the + destination cluster is regenerated and the source cluster is not updated with the + new certificate), vBucket replication stops and the following error message + displays:

+
Error replicating vbucket <bucketNumber>. Please see logs for details.
+
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-manage-xdcr.html b/preview/contents/Tasks/tasks-manage-xdcr.html new file mode 100644 index 0000000..2d9ec71 --- /dev/null +++ b/preview/contents/Tasks/tasks-manage-xdcr.html @@ -0,0 +1,43 @@ +XDCRの管理
+

XDCRの管理

+ +

クロスデータセンタレプリケーション(XDCR)は、あるクラスタから別のクラスタへとデータをレプリケートする方法で、ディザスタリカバリやより良いデータローカリティ(ユーザにより近い場所にデータを配置)に利用できます。

+ + + + + + +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-nodeFailover.html b/preview/contents/Tasks/tasks-nodeFailover.html new file mode 100644 index 0000000..2b2816d --- /dev/null +++ b/preview/contents/Tasks/tasks-nodeFailover.html @@ -0,0 +1,275 @@ +フェイルオーバの考慮事項
+

フェイルオーバの考慮事項

+ + +

ノードをフェイルオーバするとは、Couchbase Serverがそのノードをクラスタから削除し、他のノードにあるレプリケートしたデータをクライアントのリクエストで利用可能にすることです。

+ +

Couchbase Serverはクラスタ内でのデータレプリケーションを提供しているため、保存されたデータへのアクセスに影響させることなく、クラスタは一つ以上のノード障害へ対応できます。 + ノード障害発生時には、Couchbase Webコンソールから、そのノードにfailoverステータスを設定し、問題を解決することができます。

+ +

または、クラスタから自動的に障害ノードを削除し、縮退モードでクラスタを稼働させるように設定することもできます。 + この自動オプションを選択した場合、クラスタ内に残る稼働中のノードに対する負荷は増大します。 + クラスタがノード障害前と同じ状態で機能するためには、正常に機能するノードをクラスタに戻し、リバランスを実行して、ノード障害から復旧する必要があります。

+ +

手動でフェイルオーバを実行しても、Couchbase Serverが自動的に実行するようにしても、障害の原因を解明する必要があります。 + そして、正常に機能するノードをセットアップし、そのノードを追加し、クラスタをリバランスします。 + ノード障害とフェイルオーバシナリオに対処する際は、ノードの交換および追加に関する以下のガイダンスを参考にしてください:

+ +
    +
  • ハードウェアやシステム障害が起因してノードがダウンした場合、新規の交換用ノードをクラスタに追加してリバランスしてください。

    +
  • + +
  • クラスタのキャパシティ不足が原因でノードがダウンした場合、ノードの交換に加え、必要なキャパシティとするために必要な分だけノードを追加してください。

    +
  • + +
  • ノードの障害が一時的なもので、ノードが再び機能する場合、そのノードをクラスタに再追加することもできます。

    +
  • + +
+ +

フェイルオーバはノードの削除やノードのリバランスとは異なる操作であることに注意してください。 + 一般的には、正常に機能しているノードをメンテナンスなどの理由でクラスタから削除しますが、一方、フェイルオーバは正常に動作していないノードに対して実行します。

+ +

クラスタから機能しているノードを削除するには、Couchbase Webコンソールを利用し、削除するノードを指定します。 + そしてクラスタをリバランスし、そのノードへのデータリクエストが他のノードで処理できるようにします。 + 削除したいノードはまだ機能しているので、リバランスが完了するまでデータリクエストを処理することができます。 + この時点で、クラスタ内の他のノードによりデータリクエストが処理されることになります。 すなわち、データサービスを破壊するようなことも、データを消失してしまうこともなく、ノードを削除してクラスタをリバランスできるのです。 + 機能しているノードを運用管理目的で削除したい場合、フェイルオーバではなく、Removeを利用し、リバランスを実行してください。

+ +

機能するノードをフェイルオーバする場合、フェイルオーバは即座にノードをクラスタから削除するため、データロスが発生する可能性があります。 まだ他のノードへレプリケートされていないデータは、ディスクに永続化されていない場合完全に消失してしまいます。

+ +

フェイルオーバの実行に関するより詳細な情報は次もご参照ください:

+ +
    +
  • 自動フェイルオーバ。 ノードが応答なし、または稼働していないと判断されると、ノードを自動的にフェイルオーバとしてマークします。 自動フェイルオーバ機能には設計上いくつかの制限があります。
  • + +
  • フェイルオーバの実行。 手動または自動のフェイルオーバのどちらを利用するかで、クラスタを完全に機能する状態へ戻すために、いくつかの手順を実行する必要があります。
  • + +
  • フェイルオーバ後にノードを追加する。 フェイルオーバしたノードの問題を解決したら、ノードをクラスタへ再追加することができます。
  • + +
+ + + +

フェイルオーバ手段の選択

+

フェイルオーバはクラスタの性能を縮小させてしまうため、フェイルオーバの状況をどのように処理すべきかをよく検討するべきです。 + 自動フェイルオーバを利用すると、ユーザ操作なしにノードをフェイルオーバできますが、ノード障害を発生させた問題の調査や特定は難しくなります。 + クラスタを健全な状態に戻すためにはリバランスを実行する必要もあります。

+ +

手動フェイルオーバによりクラスタを管理する場合、クラスタを監視し、問題の発生を検知できるようにします。 問題が発生したら、手動でフェイルオーバを実行し、リバランスを行います。 この手順では、より多くの監視や手動の操作が必要で、加えて、フェイルオーバとリバランスを実行するまでの間、クラスタやデータアクセスが縮退してしまう可能性があります。

+ +

次のセクションでは二つの手段と、それぞれの問題についてより詳しく解説します。

+ +

自動フェイルオーバの考慮事項

+

自動でコンポーネントを取り除くには、どんな分散システムでも問題が付き物です。 問題の原因を特定できない場合、または残りのシステムにかかる負荷を理解していない場合、自動フェイルオーバは問題を解決するどころか、より多くの問題を発生させる可能性があります。 次のような状況では、問題を誘発する可能性があります:

+ + +
    +
  • フェイルオーバによる連鎖反応(Thundering Herd)の回避
  • + +
+

5ノードのCouchbase Serverクラスタが、ネットワーク負荷キャパシティの80-90%で稼働しているとします。 すべては順調に稼働していますが、クラスタのキャパシティは限界です。 ノード障害が発生し、ソフトウェアが自動的にノードをフェイルオーバしたとします。 残りの4ノードでは負荷が増大し、正常に処理することはできないでしょう。

+

結果として負荷が増加することで、他のノードもダウンし、自動的にフェイルオーバされてしまいます。 これらの障害は連鎖し、結果的にクラスタ全体の消失へとつながる可能性があります。 単一ノード障害発生時には、1/5のリクエストを処理できない方が、クラスタ全体の障害によってまったくリクエストを処理できないことよりも理想的であることは明確です。

+

この場合の解決策は、単一ノード障害が発生してもクラスタの運用を続け、新しいサーバをクラスタに追加し、失われたキャパシティを補填して、ダウンしたノードを削除としてマークし、リバランスを実行することです。 + こうすれば、クラスタ全体が利用不可となる代わりに、部分的な停止で済みます。

+ +

もう一つの予防策は、予期せぬノード障害発生時にも十分な余剰のキャパシティを確保し、レプリカへの引き継ぎができるようにすることです。

+ + +
    +
  • ネットワーク分断とフェイルオーバ
  • + +
+

ネットワークデバイスの故障が原因でネットワークが分割されてしまう、ネットワーク分断やスプリットブレインの状況を考慮し、Couchbaseは以下の制約付きで自動フェイルオーバを実装しています:

+ +
    +
  • 自動フェイルオーバは最低でも1クラスタに3台のノードが必要。 + これは、ネットワーク分断が発生した際に、2ノードのクラスタがお互いのノードをフェイルオーバすることを防ぎ、データの整合性と一貫性を保護するためです。
  • + +
  • 自動フェイルオーバはノードが1台だけダウンしたときのみ実行される。 + これはネットワーク分断発生時に、2つ以上の部分的なクラスタがお互いをフェイルオーバすることを防ぎ、データの整合性と一貫性を保護するためです。
  • + +
  • 自動フェイルオーバは管理操作を必要とする前に一度だけ発動する。 + これは、フェイルオーバの連鎖や、以後の性能や安定性の劣化を防ぐためです。 + 多くの場合、クラスタが機能できなくなるまで劣化し続けるよりも、データセットの小さな部分にアクセスできなくなる方が望ましいでしょう。
  • + +
  • 自動フェイルオーバはノードがダウンしてから自動フェイルオーバを実行するまでに30秒の遅延時間を設けています。 + これは一時的なネットワーク障害や、システムの遅延によって、誤ってノードがフェイルオーバされることを防ぎます。
  • + +
+

ネットワーク分断の際、特定の制限により許可された場合のみ、自動フェイルオーバが実行されます。 例えば、5ノードのクラスタで、1つのノードだけが分断された場合、それは自動でフェイルオーバされます。 + 2つ以上のノードが分断された場合、自動フェイルオーバは実行されません。 自動フェイルオーバ後、リセットする管理操作が必要になります。 自動フェイルオーバをリセットする前に、他のノードがダウンすると、自動フェイルオーバは実行されません。

+
    +
  • 不正に動作しているノードへの対処
  • + +
+

あるノードがクラスタへの接続を失ったか、クラスタへの接続を失ったかのように動作する場合があります。 クラスタで自動フェイルオーバを有効にしている場合、そのノードは単一ノードのクラスタとなります。 結果としてこのクラスタは前述の分断状態と同様になります。

+

この場合、ネットワークに問題があるノードをフェイルオーバするために十分なノードがクラスタに存在することを確認してください。 + 十分なキャパシティが無いと判断した場合、ノードを追加し、問題のノードをフェイルオーバした後にキャパシティを補填します。

+ +

手動フェイルオーバとモニタリング

+

モニタリング経由で手動フェイルオーバを行う場合、二つ方法があり、一つは人による監視、もう一つはCouchbase Serverクラスタの外部システムを利用する方法です。 + 外部モニタリングシステムはクラスタやノードの実行環境を監視でき、より多くの情報を元に判断できるようになります。 + 手動フェイルオーバの手法を選択した場合、このほかにも意識すべき問題があります。 + 自動フェイルオーバは潜在的な問題がありますが、手動またはモニタリングによるフェイルオーバにも潜在的な問題があります。

+
    +
  • 人の介入
  • + +
+

アラートに対して次の行動に関する意思決定をする人員を確保することは一つの選択肢です。 + 人間が広範囲のデータ、観測、経験を考慮し、最適な方法で状況を解決できるユニークな存在です。 + 多くの組織では、人が影響に対する考慮をしないままにフェイルオーバを自動化することを許可していません。 + 人の介入を行うことの問題点はコンピュータベースのモニタリングシステムを利用することに比べ、対応が遅くなるということです。

+
    +
  • 外部モニタリング
  • + +
+

もう一つの選択肢はCouchbase REST APIを利用してクラスタをモニタリングするシステムを利用することです。 + このような外部システムは、Couchbase Serverのスコープ外のシステムコンポーネントに関しても考慮できるため、ノードのフェイルオーバにとって優位な位置に存在します。

+ +

例えば、モニタリングソフトウェアは、Couchbaseクラスタが依存するネットワークスイッチがダウンしていることを検知できます。 システムはCouchbase Serverノードをフェイルオーバしても状況は改善しないことが分かるため、ノードのフェイルオーバはしません。

+ +

モニタリングシステムはCouchbase Server周辺のコンポーネントが機能しているか、クラスタ内の様々なノードが健全であるかを判断することもできます。 + モニタリングシステムが、問題は単一のノードだけで起きており、クラスタ内の残りのノードで集約したトラフィックを処理できると判断すれば、システムからREST APIやコマンドラインツールを利用してそのノードをフェイルオーバすることもできます。

+
+ + +

自動フェイルオーバの利用

Couchbase Serverの自動フェイルオーバには多くの制約があります。 これは自動フェイルオーバを利用する際に発生する可能性のある問題を回避するためです。

+
    +
  • デフォルトでは無効 自動フェイルオーバはデフォルトでは無効となっています。 これは明示的に有効とされるまで、Couchbase Serverが自動フェイルオーバを利用することを防止するためです。

    +
  • + +
  • 最小ノード数 自動フェイルオーバは最低でも3台のノードそ持つクラスタでしか利用できません。

    +
  • + +
+

設定された遅延時間内に、同時に2台以上のノードがダウンした場合、自動フェイルオーバシステムはいずれのノードもフェイルオーバしません。

+
    +
  • 人の介入が必要 自動フェイルオーバは、人の介入が必要になる前に一つのノードだけをフェイルオーバします。 + これはクラスタ内の全ノードがダウンする連鎖反応を防止するためです。

    +
  • + +
  • フェイルオーバの遅延時間 ノードがフェイルオーバされるまでに、最低でも30秒の遅延時間が必要です。 + この時間を延ばすことはできますが、ソフトウェアはダウンしているかもしれないノードに対して複数回の死活監視を実行するようにハードコーディングされています。 + これは機能しているが遅いノードのフェイルオーバや、ネットワーク接続問題によりフェイルオーバが発動することを防ぐためです。

    +
  • + +
+

REST APIを利用して、ノード障害が発生し、ノードが自動でフェイルオーバされた際にCouchbase Serverがメールで通知を送信するように設定することができます。

+ +

自動フェイルオーバが発生した後、Couchbaseクラスタは他のノードがレプリカデータを提供できることに依存しています。 クラスタを完全に機能する状態へと戻すためにリバランスを実行すべきです。

+ +

自動フェイルオーバカウンタのリセット

+

ノードが自動的にフェイルオーバされた後、Couchbase Serverはノードがフェイルオーバされたことを示す内部カウンタをインクリメントします。 + このカウンタは、フェイルオーバを引き起こした問題が特定され、解決されるまで、その他のノードが自動的にフェイルオーバされることを防止します。 + 内部カウンタでノードがフェイルオーバされたことを示している場合、サーバはクラスタ内の他のノードを自動フェイルオーバしません。 このカウンタをリセットして、クラスタ内の自動フェイルオーバを再度有効にする必要があります。

+ +

重要

+

自動フェイルオーバはノードの問題が解決し、クラスタが完全に機能する状態に戻ってからリセットしてください。

+ +

REST APIを利用してカウンタをリセットできます:

+
> curl -i -u cluster-username:cluster-password \
+    http://localhost:8091/settings/autoFailover/resetCount
+
+ +
+ +

ノードのフェイルオーバを実行する

ハードウェアやシステム障害によりクラスタからノードを削除する必要がある場合、そのノードのフェイルオーバを実行する必要があります。 + これは、Couchbase Serverが、クラスタ内の他の機能しているノードからレプリカデータを利用するということです。

+ + +
重要: 運用管理、またはアップグレード操作として、機能しているノードをクラスタから削除するためにフェイルオーバを利用しないでください。 + これはフェイルオーバを実行すると、他のノードのレプリカデータがアクティブとなり、クラスタ全体のキャパシティが縮小してしまうからです。 + フェイルオーバされるノード上の、他のノードにレプリケートされていない、もしくはディスクに永続化されていないデータは消失します。
+ + +

ノードのフェイルオーバは二つの方法で実行できます:

+
    +
  • Webコンソールの利用
  • + +
+

WebコンソールのManagement -> Server Nodes セクションに移動します。 + フェイルオーバしたいノードのFail Overボタンをクリックします。 + クラスタがDownとして判定したノードのみフェイルオーバできます。

+

Webコンソールに警告メッセージが表示されます。

+

Fail Overをクリックし、ノードをフェイルオーバします。 + Cancelを選択することもできます。

+
    +
  • コマンドラインツールの利用
  • + +
+

couchbase-clifailoverコマンドを利用して、複数のノードをフェイルオーバできます。 + ノードをフェイルオーバするには、フェイルオーバするノードのIPアドレスと、標準のポートでない場合はポートを指定します。 + 例:

+
```
+> couchbase-cli failover --cluster=localhost:8091\
+    -u cluster-username -p cluster-password\
+    --server-failover=192.168.0.72:8091
+```
+
+ +

成功すると、ノードがフェイルオーバされたと表示されます。

+ +

ノードをフェイルオーバした後は問題の原因を解決し、クラスタを完全に機能する状態に戻してください。

+ +
+ +

フェイルオーバ後の対応

自動でも、手動でもノードをフェイルオーバすると、クラスタのキャパシティは縮小します。 ノードをフェイルオーバしたら:

+
    +
  • クラスタ内の各データバケットに対する利用可能なノード数は一つ減少します。

    +
  • + +
  • フェイルオーバしたノードが担当していたデータのレプリカは、クラスタ内の他のノード上で有効化されます。

    +
  • + +
  • 残りのノードがデータへのリクエストを処理しなくてはなりません。

    +
  • + +
+

ノードをフェイルオーバした後、リバランスを実行すべきです。 + リバランス操作は:

+
    +
  • クラスタ内の残りのノード間でデータを再分配します。

    +
  • + +
  • 残りのノードで全バケットのレプリカデータを再作成します。

    +
  • + +
  • クラスタを設定された運用可能な状態に復元します。

    +
  • + +
+

クラスタを完全に機能する状態とするために、フェイルオーバ後に一つあるいは複数のノードをクラスタへと追加することもあるでしょう。 障害ノードを交換して、さらにノードを追加すれば、以前よりもキャパシティを拡張することができます。

+ +
+ +

フェイルオーバしたノードの再追加

ノード障害を引き起こした問題を回収できたなら、フェイルオーバしたノードをクラスタに再追加することができます。 + Couchbase Serverがノードをフェイルオーバとしてマークした後も、データはそのノード上のディスクに残っています。 フェイルオーバされたノードはもはや、元のクラスタと同期されていない状態です; そのノードはデータリクエストを処理することもなく、レプリカデータを受信することもありません。

+ +

フェイルオーバしたノードをクラスタに再追加する際、クラスタはこれを新規ノードとして扱います。 + このため、ノードをクラスタに追加後、リバランスが必要です。 + これは、そのノードのディスクに保存されていたいかなるデータも、リバランスを実行すると削除されることを意味します。

+ +

クラスタへの再追加前にデータをコピーまたは削除する

+

フェイルオーバしたノードをクラスタに再追加する前に、永続化されたデータファイルを移動するか削除することがベストプラクティスです。 + ファイルを保持したい場合は、他のディスクやEBSボリュームといった他のロケーションにファイルをコピーまたは移動します。 + クラスタにノードを再追加しリバランスすると、データファイルは削除され、再作成、再生成されます。

+
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-rebalance.html b/preview/contents/Tasks/tasks-rebalance.html new file mode 100644 index 0000000..942243d --- /dev/null +++ b/preview/contents/Tasks/tasks-rebalance.html @@ -0,0 +1,55 @@ +リバランス
+

リバランス

+ +

リバランスは情報をノード間に再分配する処理です。

+ +

Couchbase Serverクラスタにデータを保存するにつれ、アプリケーション負荷、RAM、ディスクI/O、ネットワーク性能要件などの変化により、クラスタ内のノード数を変更する必要がでてくる場合があります。

+ + +

vBucket構造が提供する分散方式を通して、Couchbase Serverにデータが保存されます。 Couchbase Serverクラスタが拡張もしくは縮小されたとき、vBucket内に保存された情報は利用可能なノード間に再分配され、関連するvBucketマップが新しい構造を反映するために更新されます。 この処理を、 + リバランスと呼びます。

+ + +

リバランス処理

+ リバランスは、クラスタの構成を変更する際に手動で実行する必要のある、計画的なプロセスです。 情報の保存に利用されるvBucketの割り当てを変更し、新しい構成に一致するように、物理的にデータをノード間で移動します。 +

リバランス処理はクラスタの稼働中、リクエスト処理中に実行できます。 + ノード間でのデータ移動はバックグラウンドで行われるため、クラスタを利用しているクライアントは既存の構成に対してデータの読み書きを行います。 移動処理が完了すると、vBucketマップが更新され、スマートクライアントやプロキシサービス(Moxi)へと伝わります。

+

結果として、クラスタ内のデータ分散は再配置され、データがデータベース内で均等に分散されます。 + リバランスはデータと、システムをサポートするためのデータのレプリカを考慮します。

+
+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Tasks/tasks-view-readwrite.html b/preview/contents/Tasks/tasks-view-readwrite.html new file mode 100644 index 0000000..d382d7c --- /dev/null +++ b/preview/contents/Tasks/tasks-view-readwrite.html @@ -0,0 +1,34 @@ +read-write変更の効果を確認する
+

read-write変更の効果を確認する

+ + +

Webコンソールから、バケットのreader/writer変更が与える影響を、そのバケットのグラフで閲覧することができます: Data Buckets > Bucket Name > DISK QUEUES

+ +
+

readers/writers数の変更はアクティブとレプリカの fill ratedrain rateaverage ageに反映されます。

+ +
+ +
  1. + Data Bucketsタブをクリックします。 +
  2. +
  3. + バケット名をクリックし(アイコンを開くのではなく)、バケットのグラフを表示します。 +
  4. +
  5. + DISK QUEUEセクションを開き、active、replica、pending、summaryを確認します。 +
    加えて、サーバ単位のアイテム数、fill rate、drain rate、average ageが合計されて表示されます。
    +
  6. +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/xdcr-adv-settings.html b/preview/contents/Tasks/xdcr-adv-settings.html new file mode 100644 index 0000000..85f5a1b --- /dev/null +++ b/preview/contents/Tasks/xdcr-adv-settings.html @@ -0,0 +1,95 @@ +XDCR advanced settings
+

XDCR advanced settings

+ + +

XDCR advanced settings are internal settings that are available for + configuration.

+ + +

Advanced settings that can be updated include:

+ +
+ +
XDCR Max Replications per Bucket
+ +
Maximum concurrent replications per bucket, 8 to 256. This controls the number of parallel + replication streams per node. If you are running your cluster on hardware with + high-performance CPUs, you can increase this value to improve replication speed.
+ + + +
XDCR Checkpoint Interval
+ +
Interval between checkpoints, 60 to 14400 (seconds). Default 1800. At this time + interval, batches of data via XDCR replication will be placed in the front of the disk + persistence queue. This time interval determines the volume of data that will be + replicated via XDCR should replication need to restart. The greater this value, the longer + amount of time transpires for XDCR queues to grow. For example, if you set this to 10 + minutes and a network error occurs, when XDCR restarts replication, 10 minutes of items + will have accrued for replication.

Changing this to a smaller value could impact + cluster operations when you have significant amount of write operations on a destination + cluster and you are performing bidirectional replication with XDCR. For instance, if you + set this to 5 minutes, the incoming batches of data via XDCR replication will take + priority in the disk write queue over incoming write workload for a destination cluster. + This may result in the problem of having an ever growing disk-write queue on a + destination cluster; also items in the disk-write queue that are higher priority than + the XDCR items will grow staler/older before they are persisted.

+
+ + + +
XDCR Batch Count
+ +
Document batching count, 500 to 10000. Default 500. In general, increasing this value by 2 + or 3 times will improve XDCR transmissions rates, since larger batches of data will be sent in + the same timed interval. For unidirectional replication from a source to a destination + cluster, adjusting this setting by 2 or 3 times will improve overall replication performance + as long as persistence to disk is fast enough on the destination cluster. Note however that + this can have a negative impact on the destination cluster if you are performing bidirectional + replication between two clusters and the destination already handles a significant volume of + reads/writes.
+ + + +
XDCR Batch Size (KB)
+ +
Document batching size, 10 to 100000 (KB). Default 2048. In general, increasing this value + by 2 or 3 times will improve XDCR transmissions rates, since larger batches of data will be + sent in the same timed interval. For unidirectional replication from a source to a destination + cluster, adjusting this setting by 2 or 3 times will improve overall replication performance + as long as persistence to disk is fast enough on the destination cluster. Note however that + this can have a negative impact on the destination cluster if you are performing bidirectional + replication between two clusters and the destination already handles a significant volume of + reads/writes.
+ + + +
XDCR Failure Retry Interval
+ +
Interval for restarting failed XDCR, 1 to 300 (seconds). Default 30. If you expect more + frequent network or server failures, you may want to set this to a lower value. This is the + time that XDCR waits before it attempts to restart replication after a server or network + failure.
+ + + +
XDCR Optimistic Replication Threshold
+ +
This is compressed document size in bytes. 0 to 2097152 Bytes (20MB). Default is 256 + Bytes. XDCR will get metadata for documents larger than this size on a single time before + replicating the uncompressed document to a destination cluster. This option improves XDCR + latency.
+ + + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/xdcr-cancel-replication.html b/preview/contents/Tasks/xdcr-cancel-replication.html new file mode 100644 index 0000000..f092e80 --- /dev/null +++ b/preview/contents/Tasks/xdcr-cancel-replication.html @@ -0,0 +1,33 @@ +Canceling replication
+

Canceling replication

+ + +

To cancel the replication, delete the active replication.

+ +
+

Canceled replications that were terminated while the replication was still active are + displayed within the Past Replications section of + Replications.

+ +
+ +
  1. + From the XDCR section, click Delete next to the active replication that is to be canceled. +
  2. +
  3. + Confirm the deletion of the configured replication. Once the replication has been stopped, + replication ceases on the originating cluster on a document boundary.
  4. +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/xdcr-cloud.html b/preview/contents/Tasks/xdcr-cloud.html new file mode 100644 index 0000000..b34ece5 --- /dev/null +++ b/preview/contents/Tasks/xdcr-cloud.html @@ -0,0 +1,57 @@ +クラウド環境でのXDCR
+

クラウド環境でのXDCR

+ +

XDCR (クロスデータセンタレプリケーション)はクラウド上にデプロイされたクラスタ間でのデータレプリケーションに利用できます。

+ +

クラウド上にデプロイした二つ以上のクラスタ間でレプリケートするには、以下の設定に注意してください:

+ +
+ +
パブリックDNS名とパブリックIPアドレスを利用する
+ +
パブリックDNS名とパブリックIPアドレスをクラスタ内のノードで利用できます。 + クラウドサービスはパブリックIPアドレスをクラスタ内のノード間通信で利用することをサポートしています。 + クラウドのデプロイ環境では、パブリックIPアドレスはクラスタ内で解決されますが、外部通信も許容しています。
+ +
例えば、Amazon EC2では、インスタンス設定でパブリックインタフェースを有効にして、セキュリティパラメータが必要なポートで通信を許可し、Amazonにより公開されているパブリックDNSレコードを参照名として利用するようにしてください。
+ +
Couchbaseをクラウドで利用する際は、推奨設定に従って、クラスタを固定IPアドレスとパブリックDNS名で構築します。
+ + +
+ + +
+ +
DNSサービスの利用
+ +
クラスタ内のノードでパブリックDNS名とパブリックIPアドレスを利用できます。 DNSサービスを利用して、クラスタ内の各ノードのパブリックDNSアドレスを指し示すCNAMEの特定や登録をします。 これにより、XDCRがクラスタ内のノードにCNAMEを使用するように設定できます。 クラウドサービス内のパブリックDNSアドレスが変わったとしてもCNAMEは不変です。
+ +
このため、クラスタ間のレプリケーションに利用するXDCRの設定時に、宛先のIPアドレスとしてCNAMEレコードエントリを指定できます。 一時的な障害が原因であるクラスタノードのパブリックDNSアドレスが変わった場合、CNAMEを更新し、クラウドサービスで提供された最新のパブリックDNSアドレスを設定します。
+ +
XDCRで設定されている各クラスタ内のノードのIPアドレスが変わっても、CNAMEレコードを更新することで、レプリケーションはパブリックなインターネットベースのコネクションでも継続することができます。
+ + +
+ + + +

セキュリティを高めるために、各クラスタのIPアドレス間で必要なポートのトラフィックのみを許可するようにセキュリティグループを設定すべきです。 セキュリティグループの設定には、インバウンドポートとIPアドレスの範囲を指定する必要があります。 同時に、クラスタ内のノード間の通信を許可するために、正しいポートとIPアドレスをセキュリティグループの設定に含めてください。

+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Tasks/xdcr-configure-bidirection.html b/preview/contents/Tasks/xdcr-configure-bidirection.html new file mode 100644 index 0000000..2d1ab6d --- /dev/null +++ b/preview/contents/Tasks/xdcr-configure-bidirection.html @@ -0,0 +1,42 @@ +双方向レプリケーションの設定
+

双方向レプリケーションの設定

+ + +

+ +
+

レプリケーションはあるクラスタから他のクラスタへの単一方向です。 双方向のレプリケーションを二つのクラスタ間で設定するには、二つの独立したレプリケーションストリームの設定を行います。 一つのストリームはクラスタAからクラスタBへと変更をレプリケートし、もう一つのストリームはクラスタBからクラスタAへと変更をレプリケートします。

+ + +
注: 双方のクラスタで同一の構成である必要はありません。 各クラスタで異なるノード数、RAM設定、永続化設定を利用できます。
+ + +

双方向レプリケーションを設定するには:

+ +
+ +
  1. + クラスタAからクラスタBへのレプリケーションを、クラスタAで作成します。 +
  2. +
  3. + クラスタBからクラスタAへのレプリケーションを、クラスタAで作成します。 +
  4. +
  5. + ノードごとに起動する並列レプリケータ数を設定します。 アクティブなストリームにおけるノード単位の並列数はデフォルトでは32で、変更も可能です。 +
  6. +
+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/xdcr-configure-replications.html b/preview/contents/Tasks/xdcr-configure-replications.html new file mode 100644 index 0000000..ae054f8 --- /dev/null +++ b/preview/contents/Tasks/xdcr-configure-replications.html @@ -0,0 +1,39 @@ +XDCRレプリケーションの設定
+

XDCRレプリケーションの設定

+ + +

XDCRレプリケーションの設定はバケット単位に行います。

+ + +

WebコンソールのXDCRタブからレプリケーションを設定します。 レプリケーションはバケット単位に設定します。 クラスタ内のすべてのバケットからデータをレプリケートするには、各バケットに対して個別のレプリケーションを設定します。

+ + +

XDCRを設定する前に:

+ +
    +
  • 各クラスタ内のすべてのノードが対象のクラスタ内のすべてのノードと通信ができるように設定してください。 XDCRは二つのクラスタ間でレプリケーションを行うために、クラスタ内のすべてのノードを利用します。
  • + +
  • すべてのCouchbase Serverバージョンとプラットフォームが一致している必要があります。 例えばLinuxベースのクラスタからレプリケートするなら、もう一つのLinuxベースのクラスタが必要です。
  • + +
  • XDCRがレプリケーションを実行する際、TCP/IPの8092ポートを利用してデータを転送します; Couchbase ServerはTCP/IPの8091ポートを利用し、クラスタ設定情報を転送します。 + 専用線やインターネットの先にあるクラスタへと通信をする場合、ソース、宛先の両クラスタ内のすべてのノードでお互いに8091ポートと8092ポートを利用した通信を可能にしてください。
  • + +
+ +

Ongoing Replicationsは設定され稼働中のレプリケーションを指します。 現在の設定、現在のステータス、各レプリケーション設定における最終レプリケーション日時を監視することができます。

+

XDCRタブでは、XDCR用のRemote Clustersを設定することもできます; これらは名前付きの宛先クラスタで、レプリケーションの設定時に選択できます。 XDCRを設定するときは、宛先クラスタへの参照に、宛先クラスタ内の任意のノードのIPアドレスを指定します。

+

XDCRでレプリケーションを設定する前に、宛先のバケットがすでに存在するかを確認してください。 このバケットが存在しない場合、XDCRは宛先クラスタのシャードを見つけられません; このため、ソースバケットのいくつかのデータのみがレプリケートされ、レプリケーションが大幅に遅延します。 この場合、レプリケーションを複数回繰り返し、ソースバケットを完全に宛先へとレプリケートする必要があります。

+ +

このため、宛先のバケットが存在するか必ず確認してください。 推奨される方法はバケットから任意のキーを参照することです。 もし、'key not found'エラーが返された、もしくはキーのドキュメントが返されたなら、そのバケットは存在し、クラスタ内の全ノードで利用可能です。 クラスタ内の任意のノードに対し、Couchbase SDKを利用してこれを実行できます。

+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/xdcr-conflictResolution.html b/preview/contents/Tasks/xdcr-conflictResolution.html new file mode 100644 index 0000000..3c6d2d2 --- /dev/null +++ b/preview/contents/Tasks/xdcr-conflictResolution.html @@ -0,0 +1,38 @@ +XDCRのコンフリクト解決
+

XDCRのコンフリクト解決

+ + +

XDCRはソースと宛先クラスタの間で異なるドキュメントのバージョンに対し、自動的にコンフリクトの解決を実行します。

+ + +

アルゴリズムはソース、宛先の両クラスタで一貫して同一のドキュメントが選択できるように設計されています。 各保存されたドキュメントごとに、XDCRはメタデータをチェックし、コンフリクトを解決します。 次の項目を確認します:

+
    +
  • シーケンス番号、各データ変更でインクリメントされる

    +
  • + +
  • CAS値

    +
  • + +
  • ドキュメントのフラグ

    +
  • + +
  • 有効期限(TTL)

    +
  • + +
+

ドキュメントが最大のバージョン番号ではない場合、このドキュメントに対する変更は保存、またはレプリケートされません; 代わりに、最大スコアを持つドキュメントが両クラスタ上で優先されます。 コンフリクトの解決は自動的に行われ、手動で補正やドキュメントの選択を行う必要はありません。

+

デフォルトでは各ドキュメントにつき2回ずつメタデータをフェッチしてから、宛先クラスタへとドキュメントをレプリケートします。 XDCRはソースクラスタ上のメタデータをフェッチし、ドキュメントのリビジョン番号を確認します。 そしてこの番号と、宛先クラスタ上のリビジョン番号とを比較し、より大くのリビジョンを持つドキュメントを'勝者'とします。

+

XDCRは、ソースクラスタのドキュメントがコンフリクトの解決で勝者と判断すると、レプリケーションキューにそのドキュメントを登録します。 ソースクラスタのドキュメントの方が小さな変更数であった場合、コンフリクトの解決で敗者となり、このドキュメントはXDCRのレプリケーションキューに登録されません。 ドキュメントが宛先クラスタに到達すると、このクラスタはもう一度メタデータをリクエストし、宛先クラスタのドキュメントが初回のチェックから変更されていないかを確認します。 ソースクラスタから送られたドキュメントがまだ'勝者'であるなら、宛先クラスタのディスク上に永続化されます。 宛先クラスタは少ない変更数を持つドキュメントのバージョンを削除します。

+

重要な点は、ドキュメントの変更回数が、XDCRによってドキュメントのバージョンを保持するか否かを決定するための主な要素であるということです。 このため、もっとも最近更新されたドキュメントがコンフリクトの解決で必ずしも勝者となるとは限りません。 もし双方のドキュメントが同一の更新回数であった場合、XDCRはドキュメントのその他のメタデータを元に勝者を選択します。 正確にどちらのドキュメントが最後に更新されたものなのかを特定することは、分散システムにおいてしばしば困難となります。 Couchbase Serverが利用しているアルゴリズムは、各クラスタが独立してどのドキュメントが勝者なのかを一貫して決定できることを保証しています。

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/xdcr-create-replications.html b/preview/contents/Tasks/xdcr-create-replications.html new file mode 100644 index 0000000..4ed22c3 --- /dev/null +++ b/preview/contents/Tasks/xdcr-create-replications.html @@ -0,0 +1,37 @@ +Creating replications
+

Creating replications

+ + +

After references to the source and destination clusters are created, replication can be created + between the clusters.

+ +
+

After replication has been configured and started, view current status + and list of replications in the Ongoing Replications section.

+ +
+ +
+ +
+ +
  1. Click Create Replication to configure a new XDCR replication. A panel + appears where you can configure a new replication from source to destination cluster.
  2. +
  3. In the Replicate changes from section select a from the current + cluster that is to be replicated. This is your source bucket.
  4. +
  5. In the To section, select a destination cluster and enter a bucket + name from the destination cluster:
  6. +
  7. Click the Replicate button to start the replication process.
  8. +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/xdcr-modify-settings.html b/preview/contents/Tasks/xdcr-modify-settings.html new file mode 100644 index 0000000..448e555 --- /dev/null +++ b/preview/contents/Tasks/xdcr-modify-settings.html @@ -0,0 +1,52 @@ +XDCR設定の変更
+

XDCR設定の変更

+ + +

XDCRの詳細設定を変更するには、Couchbase CLIかREST APIを利用します。

+ +
+ +

Couchbase Webコンソールの他に、いくつかのREST APIエンドポイントでXDCR設定を変更できます。 これらの設定のいくつかはXDCR内で利用される値で、これらの設定のいくつかはXDCRの挙動や性能に影響するものです。

+ + +

XDCRのリトライ間隔には、環境変数を利用するか、PUTリクエストを利用できます。 + デフォルトでは、ネットワーク障害などの理由でXDCRがレプリケートできない場合、レプリケーションを停止し、30秒ごとにネットワークが復旧しているかリモートクラスタに接続を試み、XDCRはレプリケーションを再開します。 + この挙動は、環境変数を変更するか、xdcr_failure_restart_intervalサーバパラメータをPUTリクエストで変更します:

+ +
注: 複数ノードのクラスタでXDCRを利用しており、クラスタ全体でこの設定を変更したい場合、この操作をクラスタ内のすべてのノードで実行する必要があります。
+ +
    +
  • 環境変数で指定する:
  • + +
+ +

+export XDCR_FAILURE_RESTART_INTERVAL=60
+
+ +
    +
  • サーバ設定で指定する:
  • + +
+ +

+curl -X POST 
+  http://Administrator: asdasd@127.0.0.1:8091/diag/eval 
+  -d 'rpc:call(node(), ns_config, set, [xdcr_failure_restart_interval, 60]).'
+
+ +

システム環境変数は、ノードのシステム設定ファイルに定義できます。 サーバが再起動すると、このパラメータをロードします。 環境変数とサーバパラメータの両方が設定されている場合、環境変数で指定した値が優先されます。

+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/xdcr-monitor-replication.html b/preview/contents/Tasks/xdcr-monitor-replication.html new file mode 100644 index 0000000..dcca1a0 --- /dev/null +++ b/preview/contents/Tasks/xdcr-monitor-replication.html @@ -0,0 +1,43 @@ +Monitoring replication status
+

Monitoring replication status

+ + +

Replication status is monitored via the XDCR and Data Buckets tabs.

+ +

The following Couchbase Web Console areas contains information about replication via XDCR:

+ + +
    +
  • The XDCR tab.
  • + +
  • The outgoing XDCR section under the Data Buckets tab.
  • + +
+ + +

The Couchbase Web Console displays replication from the cluster it belongs to. Therefore, + when you view the console from a particular cluster, it will display any replications + configured, or replications in progress for that particular source cluster. If you want to view + information about replications at a destination cluster, you need to open the console at that + cluster. Therefore, when configuring bidirectional, use the web consoles that belong + to the source and destination clusters to monitor both clusters.

+ + +

Any errors that occur during replication appear in the XDCR errors panel. The following example + shows the errors that occur if replication streams from XDCR fail due to the + missing vBuckets:

+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/xdcr-secure-communication.html b/preview/contents/Tasks/xdcr-secure-communication.html new file mode 100644 index 0000000..e12fbdd --- /dev/null +++ b/preview/contents/Tasks/xdcr-secure-communication.html @@ -0,0 +1,52 @@ +データ通信をセキュアにする
+

データ通信をセキュアにする

+ + +

レプリケートする情報のセキュリティを確保するには、適切にVPNゲートウェイを二つのデータセンタ間に設定し、データセンタ間の各ルート上のデータを暗号化します。

+ + +

パブリックなネットワークを利用して複数クラスタ間でXDCRを構成する場合、データは暗号化されずに、パブリックなインターフェイスチャネルを経由して送信されます。 +

+ + +

Couchbase Serverのデプロイに専用のデータセンタを利用しているなら、二つのクラスタ間で静的ルーティングを利用して拠点間のVPN接続を構成できます。

+ + + +

Amazon EC2などのクラウドデプロイメントソリューションを利用していて、特に異なるEC2のゾーンを利用している場合は、地理的に異なるEC2のゾーン間で利用できるビルトインのVPNはサポートされていません。 しかしながら、EC2上のクラスタでVPNクライアントがサポートされており、Amazon VPCを利用すれば、専用のVPNソリューションで通信が可能です。

+ + +

EC2でクラスタ間のVPN接続を適用するには:

+ +
    +
  1. マルチポイントBGP VPNソリューションを設定し、複数のVPN接続をルーティングできるようにします。
  2. + +
  3. 一つのEC2クラスタとリージョンからサードパーティのBGP VPNルータへと、VPN接続をルーティングします。
  4. + +
  5. もう一つリージョンからのVPN接続は、BGPゲートウェイを利用して二つのVPN接続間でルーティングします。
  6. + +
+ + + + + +
注: これらのVPN経路とシステムはお使いのVPNソリューションに依存します。
+ + +

さらにセキュリティを高めるために、各クラスタのIPアドレス間で必要なポートのみをセキュリティグループで通信可能とします。 セキュリティグループの設定には、インバウンドポートとIPアドレスの範囲を指定します。 同時に、クラスタ内のノード間の通信を許可するために、正しいポートとIPアドレスをセキュリティグループの設定に含めてください。

+ + +
重要: VPN接続を設定する際は、XDCRの通信プロトコルで利用されるすべてのポート、8091ポートと8092ポートを、双方のクラスタ内のすべてのノードで、セキュアにルーティングするようにしてください。
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/xdcr-specify-adv-settings.html b/preview/contents/Tasks/xdcr-specify-adv-settings.html new file mode 100644 index 0000000..c90ffd2 --- /dev/null +++ b/preview/contents/Tasks/xdcr-specify-adv-settings.html @@ -0,0 +1,71 @@ +Specifying XDCR settings
+

Specifying XDCR settings

+ + +

When creating a new replication, advanced settings are modified (from the default) via XDCR > Ongoing Replications > Create Replication.

+ +
+

To change the replication protocol for an existing XDCR replication, + delete the replication and then re-create the replication with your preference.

+ + +
Note: How you adjust these variables differs based on what whether you want to + perform unidirectional or bidirectional replication between clusters. Other factors for + consideration include intensity of read/write operations on your clusters, the rate of disk + persistence on your destination cluster, and your system environment. Changing these parameters + impacts cluster performance and XDCR replication performance.
+ +
+ +
  1. Navigate to XDCR > Ongoing Replications > Create Replication.
  2. +
  3. + In the Create Replication panel, click Advanced Settings. + +
  4. +
  5. + Under Advanced settings, choose an XDCR Protocol version. The XDCR + protocol defaults to version 2. +
      +
    • Version 1 uses the REST protocol for replication. This increases XDCR throughput at + destination clusters. If the Elasticsearch plug-in used, choose + version 1 because it depends on XDCR.
    • + +
    • Version 2 uses memcached REST protocol for replication. It is a high-performance mode that + directly uses the memcached protocol on destination nodes. Choose version 2 when setting up a + new replication with Couchbase Server 2.2 or later.
    • + +
    + +
  6. +
  7. Change the XDCR settings. These settings plus additional internal settings can be modified via + the REST API.
  8. +
  9. Click Replicate.
  10. +
  11. After creating the replication or updating the setting, view or edit them by clicking + Settings in Outgoing Replications.
  12. +
+ + + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Tasks/xdcr-specify-dest-cluster.html b/preview/contents/Tasks/xdcr-specify-dest-cluster.html new file mode 100644 index 0000000..dd3e91f --- /dev/null +++ b/preview/contents/Tasks/xdcr-specify-dest-cluster.html @@ -0,0 +1,60 @@ +Specifying a destination cluster
+

Specifying a destination cluster

+ + +

The destination cluster for XDCR replication is specified via XDCR > Remote Cluster > + Create Cluster Reference.

+ +
+
To create a uni-directional replication (from cluster A to cluster B): +
+
+ +
+ +
  1. + Verify that a destination bucket exists on the cluster where you will be + replicating. +
    To check that a destination bucket exists, issue a REST API request using the + following syntax, GET HTTP method, and URI path: +
    
    +curl GET -u Admin:password http://ip.for.destination.cluster:8091/pools/default/buckets
    +                    
    + +
    +
  2. +
  3. Navigate to the XDCR section, XDCR > Remote Cluster section > Create Cluster + Reference.
  4. +
  5. + Click the Create Cluster Reference button. +
  6. +
  7. Provide the following information for identifying and accessing the destination cluster. +
      +
    • Cluster Name
    • + +
    • IP address or hostname of a node in the destination cluster
    • + +
    • Administrator username and password for the destination cluster
    • + +
    • Enable Encryption - If selected, XDCR data encryption occurs using SSL.
    • + +
    + +
  8. +
  9. Click Save to store new reference to the destination cluster. This + cluster information is now be available when configuring replication for the source + cluster.
  10. +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/Tasks/xdcr-tuning-optimistic-replication.html b/preview/contents/Tasks/xdcr-tuning-optimistic-replication.html new file mode 100644 index 0000000..e2728da --- /dev/null +++ b/preview/contents/Tasks/xdcr-tuning-optimistic-replication.html @@ -0,0 +1,66 @@ +XDCRのパフォーマンスチューニング
+

XDCRのパフォーマンスチューニング

+ + +

XDCRのパフォーマンスはWebコンソールかRESTで、XDCRの詳細設定にてチューニングできます。

+ + +

デフォルトでは、XDCRは256バイトを超えるドキュメントについて、コンフリクトの解決を実行する前に、宛先クラスタから2回メタデータを取得します。 + コンフリクトの解決に失敗したドキュメントは、宛先クラスタで削除されます。

+ + +

このパラメータで指定されたバイト数よりも小さなドキュメントの場合、XDCRはソースクラスタ上のメタデータを取得せずに、即座にレプリケーションキューに登録されます。 ソースクラスタでドキュメントが削除されると、XDCRはこのドキュメントのメタデータをフェッチせずに、この更新を宛先クラスタへと送信します。 宛先クラスタにドキュメントが到達すると、XDCRはメタデータをフェッチし、ドキュメント間のコンフリクトの解決を実行します。 ドキュメントがコンフリクト解決で'敗者'となった場合、Couchbase Serverは宛先クラスタ上からそれを削除し、宛先クラスタ上のバージョンを保持します。 この新機能は、特に小さなドキュメントをレプリケートする際に、レプリケーションのレイテンシを向上します。

+ + +

この設定の変更にはトレードオフがあります。 ドキュメントサイズに対して小さな値を設定すると、XDCRは頻繁にメタデータをチェックします。 するとレプリケーション中のレイテンシは大きくなり、レプリケーションキューに登録する前にメタデータを取得し、コンフリクト解決を実行するために宛先のメタデータを再度取得することになります。 利点としては、XDCRが'敗者'となるドキュメントは送信しないため、ネットワーク帯域を無駄に利用することがなくなります。

+ + +

ドキュメントサイズに対して非常に大きな値を設定すると、XDCRがメタデータをフェッチする回数が減り、レプリケーション中のレイテンシが向上します。 一方で、XDCRが即座にレプリケーションキューに登録する割合が増えるため、ネットワークに過度の負荷がかかる可能性もあります、特に多数の並列レプリケータ数を設定している場合注意してください。 これはXDCRで、ネットワーク帯域を無駄に利用する、宛先のコンフリクト解決で確実に'敗者'となるドキュメントの送信数を増加させます。

+ + +
注: XDCRは削除したドキュメントのメタデータはフェッチしません。
+ + +

ドキュメント閾値の変更

+ +

RESTでドキュメント閾値を変更するには、/settings/replications optimisticReplicationThresholdのURIとXDCRの詳細設定パラメータを利用します。 + もしくは、XDCRレプリケーションのXDCR Optimistic Replication Threshold設定を変更します。

+ +
+ + + +

楽観的レプリケーションのモニタリング

+

この設定の影響を確認するもっとも簡単な方法は、Couchbase Webコンソールにあります。 Data BucketsタブのIncoming XDCR Operationsで、metadata reads per secと、sets per secを比較します。

+ + +

ドキュメントサイズに対して小さな閾値を設定した場合、metadata reads per secが、sets per secの約2倍となります。 ドキュメントサイズに対して大きな閾値を設定した場合、一回目のメタデータフェッチを行わなくなるため、 +metadata reads per secは、sets per secと同程度になります。

+ +

その他の確認ポイントとして、ソースバケットのノード上の、/opt/couchbase/var/lib/couchbase/logsにあるXDCRのログを確認します。 + ログファイルの命名規則は、xdcr.1xdcr.2、のようになります。 ログの中には以下のようなエントリが出力されます:

+ +

+out of all 11 docs, number of small docs (including dels: 2) is 4,
+number of big docs is 7, threshold is 256 bytes,
+after conflict resolution at target ("http://Administrator:asdasd@127.0.0.1:9501/default%2f3%3ba19c9d4e733a97fa7cb38daa4113d034/"),
+out of all big 7 docs the number of docs we need to replicate is: 5;
+total # of docs to be replicated is: 9, total latency: 142 ms
+
+ +

一行目は、4つのドキュメントが閾値を下回り、7つのドキュメントではメタデータを2回チェックし、5つの大きなドキュメントと、4つの小さなドキュメントをレプリケートしたことを示しています。 全11のドキュメントをチェックしてレプリケートするのに142ミリ秒経過しました。

+ +
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/UI/ui-cluster-summary.html b/preview/contents/UI/ui-cluster-summary.html new file mode 100644 index 0000000..122d502 --- /dev/null +++ b/preview/contents/UI/ui-cluster-summary.html @@ -0,0 +1,129 @@ +Cluster Overview
+

Cluster Overview

+ + +

Cluster Overview is the home page and provides an overview of your cluster health, including RAM and disk usage and activity. +

+ + + + + +

Viewing cluster overview

The Cluster section provides information on the + RAM and disk usage information for your cluster.

+ + +

For the RAM information you are provided with a graphical + representation of your RAM situation, including:

+
    +
  • Total in Cluster
  • + +
+

Total RAM configured within the cluster. This is the total amount of memory configured + for all the servers within the cluster.

+
    +
  • Total Allocated
  • + +
+

The amount of RAM allocated to data buckets within your cluster.

+
    +
  • Unallocated
  • + +
+

The amount of RAM not allocated to data buckets within your cluster.

+
    +
  • In Use
  • + +
+

The amount of memory across all buckets that is actually in use (that is data is actively + being stored).

+
    +
  • Unused
  • + +
+

The amount of memory that is unused (available) for storing data.

+

The Disk + Overview section provides similar summary information for disk storage space across + your cluster.

+
    +
  • Total Cluster Storage
  • + +
+

Total amount of disk storage available across your entire cluster for storing data.

+
    +
  • Usable Free Space
  • + +
+

The amount of usable space for storing information on disk. This figure shows the amount + of space available on the configured path after non-Couchbase files have been taken into + account.

+
    +
  • Other Data
  • + +
+

The quantity of disk space in use by data other than Couchbase information.

+
    +
  • In Use
  • + +
+

The amount of disk space being used to actively store information on disk.

+
    +
  • Free
  • + +
+

The free space available for storing objects on + disk.

+
+ +

Viewing buckets

The Buckets section provides two graphs + showing the Operations per second and Disk fetches per + second.

+ + +

The Operations per second provides information on + the level of activity on the cluster in terms of storing or retrieving objects from the data + store.

+

The Disk fetches per second indicates how frequently Couchbase is + having to go to disk to retrieve information instead of using the information stored in + RAM.

+
+ +

Viewing servers

The Servers section indicates overall + server information for the cluster:

+ + +
    +
  • Active Servers is the number of active servers within the current + cluster configuration.

    +
  • + +
  • Servers Failed Over is the number of servers that have failed over due + to an issue that should be investigated.

    +
  • + +
  • Servers Down shows the number of servers that are down and + not-contactable.

    +
  • + +
  • Servers Pending Rebalance shows the number of servers that are currently + waiting to be rebalanced after joining a cluster or being reactivated after failover.

    +
  • + +
+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/UI/ui-cluster-wide-info.html b/preview/contents/UI/ui-cluster-wide-info.html new file mode 100644 index 0000000..89d9408 --- /dev/null +++ b/preview/contents/UI/ui-cluster-wide-info.html @@ -0,0 +1,204 @@ +Managing diagnostics
+

Managing diagnostics

+ +

The web console provides a graphical interface for collecting and sending system diagnostics to the Couchbase support team.

+ + +
+

Collecting and uploading log information

+ + +
+
You can collect and upload logs via Log > Collect Information + panel
+ + +
  1. + Click Collect Information. +
  2. +
  3. + In the Collect Information window, select the nodes you + want to report on. +
    +

    You can choose to report on all accessible nodes or select one or more specific + accessible nodes. You can collect information only from accessible nodes. + Accessible nodes are nodes that are in the Up or Pending state. + You cannot select nodes in the Down state because they cannot respond to + cluster messages.

    + +
    + + + + + + + + + + + + + + + + + + + +
    OptionDescription
    All accessible nodesCollects logs for all accessible nodes in the cluster.
    Selected nodesCollects logs for a subset of the nodes in the cluster.
    + +
  4. +
  5. + If you want to send the report to Couchbase, select the Upload to + Couchbase check box and fill in the additional + fields. +
    +

    The Upload to Couchbase check box is selected by default. The additional fields are:

    + +
      +
    • Upload to host—enter the name of the host that you + want the logs uploaded to. The host name can be either your own server or a + specific server to which Couchbase support asked you to upload the + files.
    • + +
    • Customer name—enter the name of your company. This + field is used to create file names for the logs and the URL that the files + are uploaded to.
    • + +
    • Ticket number—enter the Couchbase support ticket + number associated with the request for logs. This field is optional, but if + specified it is used as a path component of the URL that the files are + uploaded to.
    • + +
    + +
    +
  6. +
  7. + Click Collect. +
    +

    The Collect Results window appears and begins to display + the status of the collection process. The status display continues to update until + the collection process is complete. The current status of each node is displayed. + The node statuses are:

    + +
      +
    • Pending—collection hasn’t started on the node.
    • + +
    • Collection in progress—collection is currently + running on the node.
    • + +
    • Collected—collection is complete. This status is + displayed only if the logs will not be uploaded to a server.
    • + +
    • Uploaded—collection is complete and the logs have + been uploaded to a server.
    • + +
    • Failed to collect—collection was unsuccessful. When + available, additional information about the failure is shown in the Details + column.
    • + +
    • Collected, failed to upload—collection was + successful, but the logs could not be uploaded. When available, additional + information about the failure is shown in the Details column.
    • + +
    • Cancelled—the user canceled collection for this + node.
    • + +
    + +
    +
  8. +
  9. + View the results. +
    +

    After the collection process finishes, the Collection + Results window contains a summary of the collection process + result. The summary contains the following lists:

    + +
      +
    • Logs that were successfully uploaded. The list includes the destination URL + for each log file. If you didn't choose to upload the files to Couchbase, + you can use this information to locate the files and upload them + manually.
    • + +
    • Logs that were collected but couldn't be uploaded. The list includes the + node and path for each log file that couldn't be uploaded.
    • + +
    • Nodes that could not be collected from.
    • + +
    + +
    +
  10. +
+ +
+ +
+ + +
+

Canceling information collection

+ +
+
You can cancel the collection process at any time before it finishes.
+ +
  1. + In the Collect results window, click + Cancel. +
  2. +
  3. + Verify whether you want to cancel the collection process. +
  4. +
+ +
+ +
+ + +
+

Hiding the collection results window

+ +
+
You can hide the Collection results window before the + collection process finishes by clicking the Close button in the + window title bar. You will receive a notification when the collection process + finishes.
+ +
+ +
+ + +
+

Showing the collection results window

+ +
+
If you closed the Collection results window before the + collection process finished, you can bring it back up to review the results.
+ +
  1. + Select the Logs tab. +
  2. +
  3. + Click View Log Collect Status. +
  4. +
+ +
+ +
+ + + + +
\ No newline at end of file diff --git a/preview/contents/UI/ui-data-buckets.html b/preview/contents/UI/ui-data-buckets.html new file mode 100644 index 0000000..c6e4756 --- /dev/null +++ b/preview/contents/UI/ui-data-buckets.html @@ -0,0 +1,296 @@ +Data Buckets
+

Data Buckets

+ +
+

Couchbase Server provides a range of statistics and settings through the Data + Buckets and Server Nodes. These show overview and detailed information + so that administrators can better understand the current state of individual nodes and the + cluster as a whole.

+ +

The Data Buckets page displays a list of all the configured buckets on your + system (of both Couchbase and memcached types). The page provides a quick overview of your + cluster health from the perspective of the configured buckets, rather than whole cluster or + individual servers.

+ +

The information is shown in the form of a table, as seen in the figure below.

+ + + + +

The list of buckets are separated by the bucket type. For each bucket, the following + information is provided in each column:

+ +
    +
  • Bucket name is the given name for the bucket. Clicking on the bucket name + takes you to the individual bucket statistics page.
  • + +
  • RAM Usage/Quota shows the amount of RAM used (for active objects) against + the configure bucket size.
  • + +
  • Disk Usage shows the amount of disk space in use for active object data + storage.
  • + +
  • Item Count indicates the number of objects stored in the bucket.
  • + +
  • Ops/sec shows the number of operations per second for this data + bucket.
  • + +
  • Disk Fetches/sec shows the number of operations required to fetch items + from disk.
  • + +
  • Clicking the Bucket Name opens the basic bucket information summary.
  • + +
  • Clicking the Documents button will take you to a list of objects + identified as parseable documents.
  • + +
  • The Views button permits you to create and manage views on your stored + objects.
  • + +
+ +

To create a new data bucket, click the Create New Data Bucket.

+ + + +

Creating and editing data buckets

+

When creating a new data bucket, or + editing an existing one, you will be presented with the bucket configuration screen. From here + you can set the memory size, access control and other settings, depending on whether you are + editing or creating a new bucket, and the bucket + type.

+ + +

You can create a new bucket in Couchbase Web + Console under the Data Buckets tab.

+ +
    +
  1. Click Data Buckets | Create New Data Bucket. You see the Create Bucket + panel, as follows:
  2. + + +
  3. Select a name for the new bucket. +

    The bucket name can only contain characters in range + A-Z, a-z, 0–9 as well as underscore, period, dash and percent symbols.

    + +
    Tip: Create a named bucket specifically for your application. Any default + bucket you initially set up with Couchbase Server should not be used for storing live + application data. The default bucket you create when you first install Couchbase Server should + be used only for testing.
    +
  4. + +
  5. Select a Bucket Type, either Memcached or Couchbase. +

    The options that appear in this panel differ based on the bucket + type.

    + +

    For Couchbase bucket type:

    + +
      +
    • Memory Size
    • + +
    + +

    The amount of available RAM on this server which should be allocated to the bucket. Note + that the allocation is the amount of memory that will be allocated for this bucket on each + node, not the total size of the bucket across all nodes.

    + +
      +
    • Replicas
    • + +
    + +

    For Couchbase buckets you can enable data replication so that the data is copied to other + nodes in a cluster. You can configure up to three replicas per bucket. If you set this to one, + you need to have a minimum of two nodes in your cluster and so forth. If a node in a cluster + fails, after you perform failover, the replicated data will be made available on a functioning + node. This provides continuous cluster operations in spite of machine failure.

    + +

    You can disable replication by deselecting the Enable check box.

    + +

    You can disable replication by setting the number of replica copies to zero (0).

    + +

    To configure replicas, Select a number in Number of replica (backup) copies + drop-down list.

    + +

    To enable replica indexes, Select the Index replicas check box. Couchbase + Server can also create replicas of indexes. This ensures that indexes do not need to be + rebuilt in the event of a node failure. This will increase network load as the index + information is replicated along with the data.

    + +
      +
    • Disk Read-Write Concurrency
    • + +
    + +

    Multiple readers and writers are supported to persist data onto disk. For earlier versions + of Couchbase Server, each server instance had only single disk reader and writer threads. By + default this is set to three total threads per data bucket, with two reader threads and one + writer thread for the bucket.

    + +

    For now, leave this setting at the default. In the future, when you create new data buckets + you can update this setting.

    + +
      +
    • Flush
    • + +
    + +

    To enable the operation for a bucket, click the Enable check box. Enable or + disable support for the Flush command, which deletes all the data in an a bucket. The default + is for the flush operation to be disabled.

    + +

    For Memcached bucket type:

    + +
      +
    • Memory Size
    • + +
    + +

    The bucket is configured with a per-node amount of memory. Total bucket memory will change + as nodes are added/removed.

    + +

    Warning: Changing the size of a memcached bucket will erase all the data in the + bucket and recreate it, resulting in loss of all stored data for existing buckets.

    + +
      +
    • Auto-Compaction
    • + +
    + +

    Both data and index information stored on disk can become fragmented. Compaction rebuilds + the stored data on index to reduce the fragmentation of the data.

    + +

    You can opt to override the default auto compaction settings for this individual bucket. + Default settings are configured through the Settings menu. + If you override the default autocompaction settings, you can + configure the same parameters, but the limits will affect only this bucket.

    + +

    For either bucket type provide these two settings in the Create Bucket panel:

    + + +
      +
    • Access Control +

      The access control configures the port clients use to communicate with the data bucket, and + whether the bucket requires a password.

      + +

      To use the TCP standard port (11211), the first bucket you create can use this port without + requiring SASL authentication. For each subsequent bucket, you must specify the password to be + used for SASL authentication, and client communication must be made using the binary + protocol.

      + +

      To use a dedicated port, select the dedicate port radio button and enter the port number you + want to use. Using a dedicated port supports both the text and binary client protocols, and + does not require authentication.

      + +

      Note: When defining a port on a bucket, the server automatically starts up a copy of Moxi on + the servers, and exposes it on that port. This supports the ASCII memcached protocol. However, + Couchbase strongly recommend against using Moxi in this way. If needed, a client-side Moxi + should be installed on the application servers and have it connect to this bucket (whether it + is “port” or “password” doesn’t matter).

      + +

      When defining a password on a bucket, it requires a client that supports the binary + memcached protocol with SASL (all Couchbase client libraries and client-side Moxi provide this + support). Defining a password on a bucket is the recommended approach.

      + +
    • + +
    • Flush +

      Enable or disable support for the Flush command, which deletes all the data in an a bucket. + The default is for the flush operation to be disabled. To enable the operation for a bucket, + select the Enable check box.

      +
    • + +
    • Click Create.
    • + +
    + +
  6. + +
+ +
+ + + +

Editing Couchbase buckets

You can edit a number of settings for an + existing Couchbase bucket in Couchbase Web Console:

+ +
    +
  • Access Control, including the standard port/password or custom port + settings.
  • + +
  • Memory Size can be modified providing you have unallocated space within + your Cluster configuration. You can reduce the amount of memory allocated to a bucket if that + space is not already in use.
  • + +
  • Auto-Compaction settings, including enabling the override of the default + auto-compaction settings, and bucket-specific auto-compaction.
  • + +
  • Flush support. You can enable or disable support for the Flush + command.
  • + +
+ +

The bucket name cannot be modified. To delete the configured bucket entirely, click the + Delete + button.

+
+ + +

Editing Memcached buckets

For Memcached buckets, you can modify the + following settings when editing an existing bucket:

+
    +
  • Access Control, including the standard port/password or custom port + settings.

    +
  • + +
  • Memory Size can be modified providing you have unallocated RAM quota + within your Cluster configuration. You can reduce the amount of memory allocated to a bucket + if that space is not already in use.

    +
  • + +
+

You can delete the bucket entirely by clicking the Delete + button.

+

You can empty a Memcached bucket of all the cached information that it stores by + using the Flush button.

+

Warning: Using the Flush + button removes all the objects stored in the Memcached bucket. Using this button on active + Memcached buckets may delete important + information.

+
+ +

Bucket information

You can obtain basic information about the status of + your data buckets by clicking on the drop-down next to the bucket name under the Data + Buckets page. The bucket information shows memory size, access, and replica + information for the bucket, as shown in the figure below.

+ + + +

You can edit the bucket information by clicking the + Edit button within the bucket information display.

+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/UI/ui-dcp-queues.html b/preview/contents/UI/ui-dcp-queues.html new file mode 100644 index 0000000..360bd78 --- /dev/null +++ b/preview/contents/UI/ui-dcp-queues.html @@ -0,0 +1,41 @@ +DCPキューの確認
+

DCPキューの確認

+ + +

+ DCPキューは、バケット間でデータ変更をストリームするために使用する、データベース変更プロトコル(DCP)の情報を提供します。 +

+ +
+

+ DCPキューの情報は各ノードのServer Nodesタブから参照できます。 +

+ +
+ +
  1. Server Nodes > node linkに移動します。
  2. +
  3. (三角形を開くのではなく)ノードのリンクをクリックします。
  4. +
  5. DCP QUEUESモジュールの三角形を開きます。
  6. +
  7. DCP情報上にマウスを乗せると、バケット分析に関する説明が確認できます。
  8. +
  9. バケット分析モジュールの三角形を開くと、サーバ単位の情報を確認できます。
  10. +
+ + +
+ +
+ + + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/UI/ui-document-editor.html b/preview/contents/UI/ui-document-editor.html new file mode 100644 index 0000000..0289292 --- /dev/null +++ b/preview/contents/UI/ui-document-editor.html @@ -0,0 +1,50 @@ +Managing documents
+

Managing documents

+ + +

The Document Viewer and Editor enables you to browse, view, and edit individual documents + stored in Couchbase Server buckets.

+ +

To get to the Documents editor, click on + the Documents button within the Data Buckets view. + The opens a list of available documents. Only a selection of the available documents are displayed + rather than all documents. The maximum size of editable documents is 2.5 KB.

+ + + + +

Select a different Bucket by using the bucket selection popup on the left. + Page through the list of documents shown by using the navigation arrows on the right. To + jump to a specific document ID, enter the ID in the box provided and click Lookup + Id. To edit an existing document, click the Edit Document button. + To delete the document from the bucket, click Delete.

+ +

To create a new document, click the Create Document button. This opens a + prompt to specify the document Id of the created document.

+ + + +

Once the document Id has been set, the document editor displays. The + document editor is also opened when the document ID within the document + list is selected. To edit the contents of the document, use the text box to modify the JSON of the stored + document.

+ + + + +

Within the document editor, click Delete to delete the current + document, Save As... copies the currently displayed information and create + a new document with the document Id you specify. The Save saves the + current document and return you to the list of documents.

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/UI/ui-intro.html b/preview/contents/UI/ui-intro.html new file mode 100644 index 0000000..25d3857 --- /dev/null +++ b/preview/contents/UI/ui-intro.html @@ -0,0 +1,58 @@ +Webコンソール
+

Webコンソール

+ + + + +

CouchbaseのWebコンソールは、Couchbaseの環境を管理するための主要なツールです。

+ +

The web console provides the following tabs:

+ + +
    +
  • Cluster Overview - A quick guide to the status of your Couchbase cluster.
  • + +
  • Server Nodes - To show active nodes, node configuration, node activity and performance, and + cluster statistics. Provides node failover, node removal.
  • + +
  • Data Buckets - To create data buckets, edit bucket settings, and view bucket statistics.
  • + +
  • Views - To create and manage view functions for indexing and querying data including managing documents.
  • + +
  • Log - To display errors and problems.
  • + +
  • Settings - To provide configuration and information for the cluster, update notifications, auto failover, + alerts, auto compaction, sample buckets, and account management.
  • + +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/UI/ui-logs.html b/preview/contents/UI/ui-logs.html new file mode 100644 index 0000000..e4405de --- /dev/null +++ b/preview/contents/UI/ui-logs.html @@ -0,0 +1,43 @@ +Log
+

Log

+ + +

The Log section provides a built-in event log and diagnostics collection section.

+ + +

Log

+

+ The event log enables you to identify activity and errors within the Couchbase cluster.

+ + + + +
+ + +

Collect Information

+

The collection information section enables you to collect logs and diagnostic information from + either all nodes or selected nodes in a cluster. In addition, upload options are provided.

+ + + + +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/UI/ui-monitoring-statistics.html b/preview/contents/UI/ui-monitoring-statistics.html new file mode 100644 index 0000000..7c16880 --- /dev/null +++ b/preview/contents/UI/ui-monitoring-statistics.html @@ -0,0 +1,802 @@ +Monitoring statistics
+

Monitoring statistics

+ + +

Within the Data Bucket tab, information and statistics about + buckets and nodes is displayed for the entire Couchbase Server cluster. The information is + aggregated from all the server nodes within the configured cluster for the selected + bucket.

+ + +

The following functionality is available through this display, and is common to all the graphs + and statistics display within the web console.

+ +
    +
  • Bucket Selection
  • + +
+ +

The Data Buckets selection list lets you select which of the buckets + configured on your cluster is to be used as the basis for the graph display. The statistics shown + are aggregated over the whole cluster for the selected bucket.

+ +
    +
  • Server Selection
  • + +
+ +

The Server Selection option enables you to limit the display to an individual + server or entire cluster. The individual node selection displays information for the node. The + all server nodes selection displays information for the entire cluster.

+ +
    +
  • Interval Selection
  • + +
+ +

The Interval Selection at the top of the main graph changes interval display + for all graphs displayed on the page. For example, selecting Minute shows + information for the last minute, continuously updating.

+ +

As the selected interval increases, the amount of statistical data displayed will depend on how + long your cluster has been running.

+ +
    +
  • Statistic Selection
  • + +
+ +

All of the graphs within the display update simultaneously. Clicking on any of the smaller + graphs will promote that graph to be displayed as the main graph for the page.

+ +
    +
  • Individual Server Selection
  • + +
+ +

Clicking the blue triangle next to any of the smaller statistics graphs enables you to show the + selected statistic individual for each server within the cluster, instead of aggregating the + information for the entire cluster.

+ + +

Individual bucket monitoring

+ +

Bucket monitoring within the Couchbase Web + Console has been updated to show additional detailed information. The following statistic groups + are available for Couchbase bucket types.

+
    +
  • Summary
  • + +
+

The summary section provides a quick overview of the cluster activity.

+
    +
  • vBucket Resources
  • + +
+

This section provides detailed information on the vBucket resources across the cluster, + including the active, replica and pending operations.

+
    +
  • Disk Queues
  • + +
+

Disk queues show the activity on the backend disk storage used for persistence within a + data bucket. The information displayed shows the active, replica and pending activity.

+
    +
  • TAP Queues
  • + +
+

The TAP queues section provides information on the activity within the TAP queues across + replication, rebalancing and client activity.

+
    +
  • XDCR Destination
  • + +
+

The XDCR Destination section show you statistical information about the Cross Datacenter + Replication (XDCR), if XDCR has been configured.

+
    +
  • View Stats
  • + +
+

The View Stats section lets you monitor the statistics for each production view + configured within the bucket or system.

+
    +
  • Top Keys
  • + +
+

This shows a list of the top 10 most actively used keys within the selected data + bucket.

+

For Memcached bucket types, the Memcached statistic summary is provided.

+
+ +

Bucket monitoring — summary statistics

The summary section is designed + to provide a quick overview of the cluster activity. Each graph (or selected graph) shows + information based on the currently selected bucket.

+ + +

The following graph types are available:

+ + +
+ +
ops per second
+ +
The total number of operations per second on this bucket.
+ + + +
cache miss ratio
+ +
Ratio of reads per second to this bucket which required a read from disk rather than + RAM.
+ + + +
creates per second
+ +
Number of new items created in this bucket per second.
+ + + +
updates per second
+ +
Number of existing items updated in this bucket per second.
+ + + +
XDCR ops per sec
+ +
Number of XDCR related operations per second for this bucket.
+ + + +
disk reads per sec
+ +
Number of reads per second from disk for this bucket.
+ + + +
temp OOM per sec
+ +
Number of temporary out of memory conditions per second.
+ + + +
gets per second
+ +
Number of get operations per second.
+ + + +
sets per second
+ +
Number of set operations per second.
+ + + +
deletes per second
+ +
Number of delete operations per second.
+ + + +
items
+ +
Number of items (documents) stored in the bucket.
+ + + +
disk write queue
+ +
Size of the disk write queue.
+ + + +
docs data size
+ +
Size of the stored document data.
+ + + +
docs total disk size
+ +
Size of the persisted stored document data on disk.
+ + + +
doc fragmentation %
+ +
Document fragmentation of persisted data as stored on disk.
+ + + +
XDC replication queue
+ +
Size of the XDCR replication queue.
+ + + +
total disk size
+ +
Total size of the information for this bucket as stored on disk, including persisted and view index data.
+ + + +
views data size
+ +
Size of the view data information.
+ + + +
views total disk size
+ +
Size of the view index information as stored on disk.
+ + + +
views fragmentation %
+ +
Percentage of fragmentation for a given view index.
+ + + +
view reads per second
+ +
Number of view reads per second.
+ + + +
memory used
+ +
Amount of memory used for storing the information in this bucket.
+ + + +
high water mark
+ +
High water mark for this bucket (based on the configured bucket RAM quota).
+ + + +
low water mark
+ +
Low water mark for this bucket (based on the configured bucket RAM quota).
+ + + +
disk update time
+ +
Time required to update data on disk.
+ + +
+ + +
+ + + +

Monitoring vBucket resources

The vBucket statistics provide information + for all vBucket types within the cluster across three different states. Within the statistic + display the table of statistics is organized in four columns, showing the Active, Replica and + Pending states for each individual statistic. The final column provides the total value for each + statistic.

+ + + +

The Active column displays the information for vBuckets within the + Active state. The Replica column displays the statistics for vBuckets within the Replica state + (that is currently being replicated). The Pending columns shows statistics for vBuckets in the + Pending state, that is while data is being exchanged during rebalancing.

+

These states are + shared across all the following statistics. For example, the graph new items per + sec within the Active state column displays the number of new items + per second created within the vBuckets that are in the active state.

+

The individual + statistics, one for each state, shown are:

+
    +
  • vBuckets
  • + +
+

The number of vBuckets within the specified state.

+
    +
  • items
  • + +
+

Number of items within the vBucket of the specified state.

+
    +
  • resident %
  • + +
+

Percentage of items within the vBuckets of the specified state that are resident (in + RAM).

+
    +
  • new items per sec.
  • + +
+

Number of new items created in vBuckets within the specified state. Note that new items + per second is not valid for the Pending state.

+
    +
  • ejections per second
  • + +
+

Number of items ejected per second within the vBuckets of the specified state.

+
    +
  • user data in RAM
  • + +
+

Size of user data within vBuckets of the specified state that are resident in RAM.

+
    +
  • metadata in RAM
  • + +
+

Size of item metadata within the vBuckets of the specified state that are resident in + RAM.

+
+ + +

Monitoring disk queues

The Disk Queues statistics section displays the + information for data being placed into the disk queue. Disk queues are used within Couchbase + Server to store the information written to RAM on disk for persistence. Information is displayed + for each of the disk queue states, Active, Replica and Pending.

+ + +

The Active column displays the information for the Disk Queues within + the Active state. The Replica column displays the statistics for the Disk Queues within the + Replica state (that is currently being replicated). The Pending columns shows statistics for the + disk Queues in the Pending state, that is while data is being exchanged during + rebalancing.

+

These states are shared across all the following statistics. For example, the + graph fill rate within the Replica state column displays the + number of items being put into the replica disk queue for the selected bucket.

+

The + displayed statistics are:

+
    +
  • items
  • + +
+

The number of items waiting to be written to disk for this bucket for this state.

+
    +
  • fill rate
  • + +
+

The number of items per second being added to the disk queue for the corresponding + state.

+
    +
  • drain rate
  • + +
+

Number of items actually written to disk from the disk queue for the corresponding + state.

+
    +
  • average age
  • + +
+

The average age of items (in seconds) within the disk queue for the specified + state.

+
+ + +

Monitoring TAP queues

The TAP queues statistics are designed to show + information about the TAP queue activity, both internally, between cluster nodes and clients. + The statistics information is therefore organized as a table with columns showing the statistics + for TAP queues used for replication, rebalancing and clients.

+ + + +

The statistics in this section are detailed below:

+
    +
  • TAP senders
  • + +
+

Number of TAP queues in this bucket for internal (replica), rebalancing or client + connections.

+
    +
  • items
  • + +
+

Number of items in the corresponding TAP queue for this bucket.

+
    +
  • drain rate
  • + +
+

Number of items per second being sent over the corresponding TAP queue connections to + this bucket.

+
    +
  • back-off rate
  • + +
+

Number of back-offs per second sent when sending data through the corresponding TAP + connection to this bucket.

+
    +
  • backfill remaining
  • + +
+

Number of items in the backfill queue for the corresponding TAP connection for this + bucket.

+
    +
  • remaining on disk
  • + +
+

Number of items still on disk that need to be loaded in order to service the TAP + connection to this + bucket.

+
+ + +

Memcached buckets

For Memcached buckets, Web Console displays a + separate group of statistics:

+ + +

The Memcached statistics are:

+
    +
  • Operations per sec.
  • + +
+

Total operations per second serviced by this bucket

+
    +
  • Hit Ratio %
  • + +
+

Percentage of get requests served with data from this bucket

+
    +
  • Memory bytes used
  • + +
+

Total amount of RAM used by this bucket

+
    +
  • Items count
  • + +
+

Number of items stored in this bucket

+
    +
  • RAM evictions per sec.
  • + +
+

Number of items per second evicted from this bucket

+
    +
  • Sets per sec.
  • + +
+

Number of set operations serviced by this bucket

+
    +
  • Gets per sec.
  • + +
+

Number of get operations serviced by this bucket

+
    +
  • Net. bytes TX per sec
  • + +
+

Number of bytes per second sent from this bucket

+
    +
  • Net. bytes RX per sec.
  • + +
+

Number of bytes per second sent into this bucket

+
    +
  • Get hits per sec.
  • + +
+

Number of get operations per second for data that this bucket contains

+
    +
  • Delete hits per sec.
  • + +
+

Number of delete operations per second for data that this bucket contains

+
    +
  • Incr hits per sec.
  • + +
+

Number of increment operations per second for data that this bucket contains

+
    +
  • Decr hits per sec.
  • + +
+

Number of decrement operations per second for data that this bucket contains

+
    +
  • Delete misses per sec.
  • + +
+

Number of delete operations per second for data that this bucket does not contain

+
    +
  • Decr misses per sec.
  • + +
+

Number of decr operations per second for data that this bucket does not contain

+
    +
  • Get Misses per sec.
  • + +
+

Number of get operations per second for data that this bucket does not contain

+
    +
  • Incr misses per sec.
  • + +
+

Number of increment operations per second for data that this bucket does not contain

+
    +
  • CAS hits per sec.
  • + +
+

Number of CAS operations per second for data that this bucket contains

+
    +
  • CAS badval per sec.
  • + +
+

Number of CAS operations per second using an incorrect CAS ID for data that this bucket + contains

+
    +
  • CAS misses per sec.
  • + +
+

Number of CAS operations per second for data that this bucket does not + contain

+
+ + +

Monitoring outgoing XDCR

The Outgoing XDCR shows the XDCR operations + that are supporting cross datacenter replication from the current cluster to a destination + cluster.

+

You can monitor the current status for all + active replications in the Ongoing Replications section under the XDCR + tab:

+ + +

The Ongoing Replications section shows the following + information:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ColumnDescription
BucketThe source bucket on the current cluster that is being replicated.
FromSource cluster name.
ToDestination cluster name.
StatusCurrent status of replications.
WhenIndicates when replication occurs.
+
+

The Status column indicates the current state of the replication + configuration. Possible include:

+
    +
  • Starting Up
  • + +
+

The replication process has just started, and the clusters are determining what data + needs to be sent from the originating cluster to the destination cluster.

+
    +
  • Replicating
  • + +
+

The bucket is currently being replicated and changes to the data stored on the + originating cluster are being sent to the destination cluster.

+
    +
  • Failed
  • + +
+

Replication to the destination cluster has failed. The destination cluster cannot be + reached. The replication configuration may need to be deleted and recreated.

+

Under the + Data Buckets tab you can click on a named Couchbase bucket and find more + statistics about replication for that bucket. Couchbase Web Console displays statistics for the + particular bucket; on this page you can find two drop-down areas called in the Outgoing + XDCR and Incoming XDCR Operations. Both provides statistics about + ongoing replication for the particular bucket. Under the Outgoing XDCR panel if + you have multiple replication streams you will see statistics for each + stream.

+ + outbound xdcr stats 2.2 +

The statistics shown are:

+
    +
  • outbound XDCR mutation
  • + +
+

Number of changes in the queue waiting to be sent to the destination cluster.

+
    +
  • mutations checked
  • + +
+

Number of document mutations checked on source cluster.

+
    +
  • mutations replicated
  • + +
+

Number of document mutations replicated to the destination cluster.

+
    +
  • data replicated
  • + +
+

Size of data replicated in bytes.

+
    +
  • active vb reps
  • + +
+

Number of parallel, active vBucket replicators. Each vBucket has one replicator which can + be active or waiting. By default you can only have 32 parallel active replicators at once per + node. Once an active replicator finishes, it will pass a token to a waiting replicator.

+
    +
  • waiting vb reps
  • + +
+

Number of vBucket replicators that are waiting for a token to replicate.

+
    +
  • secs in replicating
  • + +
+

Total seconds elapsed for data replication for all vBuckets in a cluster.

+
    +
  • secs in checkpointing
  • + +
+

Time working in seconds including wait time for replication.

+
    +
  • checkpoints issued
  • + +
+

Total number of checkpoints issued in replication queue. By default active vBucket + replicators issue a checkpoint every 30 minutes to keep track of replication progress.

+
    +
  • checkpoints failed
  • + +
+

Number of checkpoints failed during replication. This can happen due to timeouts, due to + network issues or if a destination cluster cannot persist quickly enough.

+
    +
  • mutations in queue
  • + +
+

Number of document mutations waiting in replication queue.

+
    +
  • XDCR queue size
  • + +
+

Amount of memory used by mutations waiting in replication queue. In bytes.

+
    +
  • mutation replication rate
  • + +
+

Number of mutations replicated to destination cluster per second.

+
    +
  • data replication rate
  • + +
+

Bytes replicated to destination per second.

+
    +
  • ms meta ops latency
  • + +
+

Weighted average time for requesting document metadata. In milliseconds.

+
    +
  • mutations replicated optimistically
  • + +
+

Total number of mutations replicated with optimistic XDCR.

+
    +
  • ms docs ops latency
  • + +
+

Weighted average time for sending mutations to destination cluster. In milliseconds.

+
    +
  • percent completed
  • + +
+

Percent of total mutations checked for metadata.

+

Be aware that if you use an + earlier version of Couchbase Server, such as Couchbase Server 2.0, only the first three + statistics appear and have the labels changes queue, documents checked, and documents + replicated respectively. You can also get XDCR statistics using the Couchbase REST API. All + of the statistics in Web Console are based on statistics via the REST API or values derived from + them.

+
+ + + +

Monitoring incoming XDCR

The Incoming XDCR section shows the XDCR + operations that are coming into to the current cluster from a remote cluster.

+ + +

The statistics shown are:

+
    +
  • metadata reads per sec.
  • + +
+

Number of documents XDCR scans for metadata per second. XDCR uses this information for + conflict resolution.

+
    +
  • sets per sec.
  • + +
+

Set operations per second for incoming XDCR data.

+
    +
  • deletes per sec.
  • + +
+

Delete operations per second as a result of the incoming XDCR data stream.

+
    +
  • total ops per sec.
  • + +
+

Total of all the operations per + second.

+
+ + +

Monitoring view statistics

The View statistics show information about + individual design documents within the selected bucket. One block of stats will be shown for + each production-level design document.

+ + +

The statistics shown are:

+
    +
  • data size
  • + +
+

Size of the data required for this design document.

+
    +
  • disk size
  • + +
+

Size of the stored index as stored on disk.

+
    +
  • view reads per sec.
  • + +
+

Number of read operations per second for this view.

+
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/UI/ui-server-nodes.html b/preview/contents/UI/ui-server-nodes.html new file mode 100644 index 0000000..1928c80 --- /dev/null +++ b/preview/contents/UI/ui-server-nodes.html @@ -0,0 +1,160 @@ +Server Nodes
+

Server Nodes

+ + +

The Server Nodes section shows statistics across the server nodes in the cluster.

+ +

In addition to monitoring buckets over all the nodes within the cluster, Couchbase Server + also includes support for monitoring the statistics for an individual node.

+ +

The Server Nodes monitoring overview shows summary data for the Swap Usage, RAM Usage, CPU + Usage and Active Items across all the nodes in your cluster.

+ + + + +

Clicking the triangle next to a server displays server node specific information, including + the IP address, OS, Couchbase version and Memory and Disk allocation information.

+ + + + +

The detail display shows the following information:

+ +
    +
  • Node information +
      +
    • Server Name - The server IP address and port number used to communicated with this sever.
    • + +
    • Uptime - The uptime of the Couchbase Server process. This displays how long Couchbase + Server has been running as a node, not the uptime for the server.
    • + +
    • OS - The operating system identifier, showing the platform, environment, operating + system and operating system derivative.
    • + +
    • Version - The version number of Couchbase Server installed and running on this node.
    • + +
    +
  • + +
  • Memory cache +

    The Memory Cache section shows you the information about memory usage, both for Couchbase + Server and for the server as a whole. You can use this to compare RAM usage within + Couchbase Server to the overall available RAM. The specific details tracked are:

    +
      +
    • Couchbase Quota - Shows the amount of RAM in the server allocated specifically to + Couchbase Server.
    • + +
    • In Use - Shows the amount of RAM currently in use by stored data by Couchbase + Server.
    • + +
    • Other Data - Shows the RAM used by other processes on the server.
    • + +
    • Free - Shows the amount of free RAM out of the total RAM available on the server.
    • + +
    • Total - Shows the total amount of free RAM on the server available for all + processes.
    • + +
    +
  • + +
  • Disk Storage +

    This section displays the amount of disk storage available and configured for Couchbase. + Information will be displayed for each configured disk.

    +
      +
    • In Use - Shows the amount of disk space currently used to stored data for Couchbase + Server.
    • + +
    • Other Data - Shows the disk space used by other files on the configured device, not + controlled by Couchbase Server.
    • + +
    • Free - Shows the amount of free disk storage on the server out of the total disk space + available.
    • + +
    • Total - Shows the total disk size for the configured storage device.
    • + +
    +
  • + +
+ + + + +

Selecting a server from the list shows the server-specific version of the Bucket Monitoring + overview, showing server-specific performance information.

+ + + +

The graphs specific to the server are:

+ +
    +
  • swap usage - Amount of swap space in use on this server.
  • + +
  • free RAM - Amount of RAM available on this server.
  • + +
  • CPU utilization - Percentage of CPU utilized across all cores on the selected server.
  • + +
  • connection count - Number of connections to this server of all types for client, proxy, TAP requests and + internal statistics.
  • + +
+ +

By clicking on the blue triangle against an individual statistic within the server monitoring + display, you can optionally select to view the information for a specific bucket-statistic on + an individual server, instead of across the entire cluster.

+ + + + +

Understanding server states

Couchbase Server nodes can be in a number + of different states depending on their current activity and availability. The displayed + states are:

+
    +
  • Up

    Host is up, replicating data between nodes and servicing requests from clients.

    +
  • + +
  • Down

    Host is down, not replicating data between nodes and not servicing requests from + clients.

    + +
  • + +
  • Pend +

    Host is up and currently filling RAM with data, but is not servicing requests from + clients. Client access will be supported once the RAM has been pre-filled with + information.

    + +
  • + +
+ + +

You can monitor the current server status using both the Manage: + Server Nodes and Monitor: Server Nodes screens within the Web + Console.

+
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/UI/ui-settings-account-mgmt.html b/preview/contents/UI/ui-settings-account-mgmt.html new file mode 100644 index 0000000..1c3a650 --- /dev/null +++ b/preview/contents/UI/ui-settings-account-mgmt.html @@ -0,0 +1,25 @@ +Account Management tab
+

Account Management tab

+ +
+

Account management settings lets you set up and modify the read-only user's user name and password. + This user has read-only access and cannot make any changes to the system. + The user can only view existing servers, buckets, views and monitor stats.

+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/UI/ui-settings-alerts.html b/preview/contents/UI/ui-settings-alerts.html new file mode 100644 index 0000000..7b7a7dc --- /dev/null +++ b/preview/contents/UI/ui-settings-alerts.html @@ -0,0 +1,252 @@ +Alerts tab
+

Alerts tab

+ +
+

You can enable email alerts to be raised when a significant error occurs on your Couchbase + Server cluster. The email alert system works by sending email directly to a configured SMTP + server. Each alert email is send to the list of configured email recipients. + This is used to highlight specific issues and problems that you should be aware of and + may need to check to ensure the health of your Couchbase cluster. + Alerts are provided as a popup within the web console.

+ + +

Select Enable email alerts to configure email alerts + including the server settings and recipient information. + Email alerts are raised for the errors selected in the Available Alerts section. +

+ + + + +

Email Server Settings

+ + +

The available settings are:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Email Server settings
OptionsDescription
HostThe hostname for the SMTP server that will be used to send the email.
PortThe TCP/IP port to be used to communicate with the SMTP server. The default is + the standard SMTP port 25.
UsernameFor email servers that require a username and password to send email, the + username for authentication.
PasswordFor email servers that require a username and password to send email, the + password for authentication.
Require TSLEnable Transport Layer Security (TLS) when sending the email through the + designated server.
+
+ + +

Email Settings

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Email settings
OptionDescription
Sender emailThe email address from which the email will be identified as being sent from. + This email address should be one that is valid as a sender address for the SMTP server + that you specify.
RecipientsA list of the recipients of each alert message. To specify more than one + recipient, separate each address by a space, comma, or semicolon.
Test MailClick Test + Mail to send a test email to confirm the settings and configuration of the email + server and recipients.
+
+ +
+ + + + +

Available Alerts

+

You can enable individual alert messages that can be sent by using the series of check boxes. + The supported alerts are:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3. Available alerts
AlertDescription
Node was auto-failoveredThe sending node has been auto-failovered.
Maximum number of auto-failovered nodes was reachedThe auto-failover system stops auto-failover when the maximum number of + spare nodes available has been reached.
Node wasn't auto-failovered as other nodes are down at the same timeAuto-failover does not take place if there are no spare nodes within the current + cluster.
Node wasn't auto-failovered as the cluster was too small (less than 3 nodes)You cannot support auto-failover with less than 3 nodes.
Node's IP address has changed unexpectedlyThe IP address of the node has changed, which may indicate a network interface, + operating system, or other network or system failure.
Disk space used for persistent storage has reach at least 90% of capacityThe disk device configured for storage of persistent data is nearing full + capacity.
Metadata overhead is more than 50%The amount of data required to store the metadata information for your dataset + is now greater than 50% of the available RAM.
Bucket memory on a node is entirely used for metadataAll the available RAM on a node is being used to store the metadata for the + objects stored. This means that there is no memory available for caching + values,. With no memory left for storing metadata, further requests to store + data will also fail.
Writing data to disk for a specific bucket has failedThe disk or device used for persisting data has failed to store persistent data + for a bucket.
+
+ + +
+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/UI/ui-settings-autocompaction.html b/preview/contents/UI/ui-settings-autocompaction.html new file mode 100644 index 0000000..cb2c9a4 --- /dev/null +++ b/preview/contents/UI/ui-settings-autocompaction.html @@ -0,0 +1,119 @@ +Auto-Compaction tab
+

Auto-Compaction tab

+ +
+

The Auto-Compaction tab + configures the default auto-compaction settings for all the databases. + These can be overridden using per-bucket settings available when creating or editing data buckets. + You can provide a purge interval to remove the key and metadata for items that have been deleted or are expired. + This is known as ‘tombstone purging’.

+ + + + +

The Auto-Compaction tab sets the following default parameters:

+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Auto-compaction parameters
ParameterDescription
Database FragmentationIf checked, you must specify either the percentage of fragmentation at which + database compaction will be triggered, or the database size at which compaction will + be triggered. You can also configure both trigger parameters.
View FragmentationIf checked, you must specify either the percentage of fragmentation at which + database compaction will be triggered, or the view size at which compaction will be + triggered. You can also configure both trigger parameters.
Time PeriodIf checked, you must specify the start hour and minute, and end hour and minute + of the time period when compaction is allowed to occur.
Abort if run time exceeds the above periodIf checked, if database compaction is running when the configured time period + ends, the compaction process will be terminated.
Process Database and View compaction in parallelIf enabled, database and view compaction will be executed simultaneously, + implying a heavier processing and disk I/O load during the compaction + process.
Metadata Purge Interval +

Defaults to three days. Tombstones are records of expired or deleted items and + they include the key and metadata. Tombstones are used in Couchbase Server to + provide eventual consistency of data between clusters.

+ +

The auto-compaction process waits this number of days before it permanently + deletes tombstones for expired or deleted items.

+ +

If you set this value too low, you may see more inconsistent results in views + queries such as deleted items in a result set. You may also see inconsistent items + in clusters with XDCR set up between the clusters. If you set this value too high, + it will delay the server from reclaiming disk space.

+ +
+
+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/UI/ui-settings-autofailover.html b/preview/contents/UI/ui-settings-autofailover.html new file mode 100644 index 0000000..fbf86ba --- /dev/null +++ b/preview/contents/UI/ui-settings-autofailover.html @@ -0,0 +1,28 @@ +Auto-Failover tab
+

Auto-Failover tab

+ +
+

The Auto-Failover settings enable auto-failover. + The timeout before the auto-failover process is started when a cluster node failure is detected.

+ +

To enable Auto-Failover, check the Enable auto-failover check box. To set the + delay in seconds before auto-failover is started, enter the number of seconds in the + Timeout box. The default timeout is 120 seconds.

+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/UI/ui-settings-cluster.html b/preview/contents/UI/ui-settings-cluster.html new file mode 100644 index 0000000..1c11d49 --- /dev/null +++ b/preview/contents/UI/ui-settings-cluster.html @@ -0,0 +1,50 @@ +Cluster tab
+

Cluster tab

+ + +

Cluster settings tab shows cluster name, SSL certificate, and RAM quota.

+ + +
In the Clusters settings tab, the following are displayed: +
    +
  • Cluster Name - The cluster name labels the Couchbase web console.
  • + +
  • Certificate - With Couchbase Server Enterprise Edition, the self-signed SSL certificate + that is deployed across the cluster on each node. The self-signed SSL certification is + provided to set up secure communication in an XDCR environment. The SSL certificate can be + regenerated.
  • + +
  • Cluster RAM Quota - The available RAM on your cluster and the per server RAM quota is displayed. Per Server RAM Quota is adjustable.
  • + +
+
+ + +

The following graphic shows the web console for the cluster labeled as San Jose.

+ + +
+ + +

The following graphic shows the SSL certificate.

+ + +
+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/UI/ui-settings-sample-buckets.html b/preview/contents/UI/ui-settings-sample-buckets.html new file mode 100644 index 0000000..7ae8a17 --- /dev/null +++ b/preview/contents/UI/ui-settings-sample-buckets.html @@ -0,0 +1,28 @@ +Sample Buckets tab
+

Sample Buckets tab

+ +
+

The Sample Buckets tab enables you to install the sample bucket data if the data has not already been loaded in the + system. + If the sample bucket data was not loaded during setup, select the + sample buckets that you want to load using the check boxes, and click Create.

+ +

If the sample bucket data has already been loaded, it is listed under the + Installed Samples section of the + page.

+ + + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/UI/ui-settings-update-notifications.html b/preview/contents/UI/ui-settings-update-notifications.html new file mode 100644 index 0000000..c1bc150 --- /dev/null +++ b/preview/contents/UI/ui-settings-update-notifications.html @@ -0,0 +1,68 @@ +Update Notifications tab
+

Update Notifications tab

+ +
+

You can enable or disable Update + Notifications by checking the Enable software update notifications check box + within the Update Notifications screen. Once you have changed the option, + click Save to record the change.

+ + +

If update notifications are + disabled, then the Update Notifications screen only notifies you of your currently + installed version, and no alert is provided.

+ + + + + +

During installation you can select to enable the Update Notification function. Update + notifications allow a client accessing the Couchbase Web Console to determine whether a newer + version of Couchbase Server is available for download.

+ +

If Enable software update notifications is selected, the web console + communicates with Couchbase servers to confirm the version number of your Couchbase + installation. During this process, the client submits the following information to + Couchbase server:

+ +
    +
  • The current version of your Couchbase Server installation. + When a new version of Couchbase Server becomes available, + you are provided with notification of the new version and information on where to download the new version.

    +
  • + +
  • Basic information about the size and configuration of your Couchbase cluster. This + information is used to help Couchbase prioritize development efforts.

    +
  • + +
+ +

You can enable/disable software update notifications. + The process occurs within the browser accessing the web console, not within the server itself. + No further configuration or internet access is required on the server to enable + this functionality. Providing the client accessing Couchbase Server Console has internet + access, the information can be communicated to the Couchbase servers.

+ +

The update notification process the information anonymously, and the data cannot be tracked. + The information is only used to provide you with update notification and to provide + information that will help improve future development process for Couchbase Server and + related products.

+ +
Note: If the browser or computer that you are using to connect to your Couchbase Server web console + does not have Internet access, the update notification system does not work.
+ + + +
+ + + +
\ No newline at end of file diff --git a/preview/contents/UI/ui-settings.html b/preview/contents/UI/ui-settings.html new file mode 100644 index 0000000..cba1387 --- /dev/null +++ b/preview/contents/UI/ui-settings.html @@ -0,0 +1,43 @@ +Settings
+

Settings

+ + +

The Settings section provides configuration and information + for the cluster, update notifications, auto failover, alerts, auto compaction, sample buckets, and account management.

+ +

The Settings interface sets the global settings for your Couchbase Server + instance.

+ + +
+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/UI/ui-task-bucket-metadata-ejection.html b/preview/contents/UI/ui-task-bucket-metadata-ejection.html new file mode 100644 index 0000000..518317a --- /dev/null +++ b/preview/contents/UI/ui-task-bucket-metadata-ejection.html @@ -0,0 +1,44 @@ +メモリ内メタデータの管理
+

メモリ内メタデータの管理

+ + +

+ メタデータを残すか除去するかのメモリ設定は、バケット作成時および変更時に指定します。 +

+ +
+

バケットのメモリサイズを指定する:

+ +
+ + +
  1. + Data Buckets > Create New Data Bucketからバケットを作成するか、 + Data Buckets > bucket_name link > Editから既存のバケットを変更します。 +
  2. +
  3. + + Memory Size panel > Cache Metadataセクションで、メモリ内にメタデータを保持するかを指定します。 + +
    + メタデータをメモリ内に保持する場合、より多くのRAMが必要になりますが、より良い参照性能が得られます。 + メタデータをメモリ内に保持しない場合、必要なRAM容量を削減できます。 +
    +
    +
  4. +
  5. Saveをクリックします。 +
  6. +
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/UI/ui-task-failover-graceful.html b/preview/contents/UI/ui-task-failover-graceful.html new file mode 100644 index 0000000..9f6bc59 --- /dev/null +++ b/preview/contents/UI/ui-task-failover-graceful.html @@ -0,0 +1,60 @@ +ノードのフェイルオーバ
+

ノードのフェイルオーバ

+ + +

Server Nodes > + Failoverから、特定のノードに対し、フェイルオーバを実行できます。 +

+ + +
+

フェイルオーバを実行するには:

+ +
+ +
  1. + Server Nodesを表示します。 +
  2. +
  3. + サーバノードのFail Overを選択します。 + +
  4. +
  5. + Graceful Failoverを選択しグレイスフルフェイルオーバを実行します。 + もしくは、Hard Fail Overを選択し強制的にフェイルオーバするか、キャンセルすることができます。 +
    + +
  6. +
  7. + Fail Overをクリックします。 +
    ノードをフェイルオーバ中に、 + Stop Failoverをクリックしてフェイルオーバ処理をキャンセルすることができます。
    +
    フェイルオーバを特定のノードに対して実行すると、そのノードは + Failed Over: Pending Removalとしてマークされます。
    + +
    +
  8. +
  9. + フェイルオーバのステータスを確認するには、Pending Rebalanceをクリックします。 +
    注: + (リカバリオプションを選択せずに、)この時点でリバランスを行うと、そのサーバノードはクラスタから削除されます。 + クラスタからノードを削除したあと、そのノードをクラスタに追加することが可能ですが、 + この場合、そのノードは新規のサーバノードとして扱われます。 + これはそのサーバノード上にあるすべてのデータが削除されることを意味します。 +
    +
    +
    +
  10. +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/UI/ui-task-node-recovery-incremental.html b/preview/contents/UI/ui-task-node-recovery-incremental.html new file mode 100644 index 0000000..5f562f9 --- /dev/null +++ b/preview/contents/UI/ui-task-node-recovery-incremental.html @@ -0,0 +1,84 @@ +Recovering a node
+

Recovering a node

+ + +

Recovery is performed after a server node is failed over and before rebalance + operations. Either Delta or Full recovery can be specified.

+ + +
+
The process for re-adding a server involves:
    +
  1. Fail over the node using either the graceful or hard failover method. + Graceful failover is recommended.
  2. + +
  3. After the node is failed over, specify whether to use delta or full + recovery.
  4. + +
  5. Perform maintenance operations on the node.
  6. + +
  7. Rebalance the cluster. During the rebalance, the same server node is added + back to the cluster using the specified recovery method.
  8. + +
+ +
+ + +

To use delta recovery during failover, recovery, and rebalance operations:

+ +
+ + + +
  1. + Navigate to Server Nodes. +
  2. +
  3. + Click Failover. +
  4. +
  5. + Select Graceful Failover. +
    When failover happens on a specific node, that node is marked as + Failed Over: Pending Removal
    + +
    +
  6. +
  7. + Click Delta Recovery. Alternatively, select Full + Recovery. +
    With delta recovery mode, Couchbase detects (with the Database Change + Protocol) which data files are up-to-date and which are out-of-date and then, + during rebalance, the existing data files on the failed over server node are + retained and the out-of-date files are updated. With full recovery mode, the + data files are removed from the failed over server node and then, during + rebalance, the node is populated with new data files (active and replica + vBuckets).
    +
  8. +
  9. + To view the status of the server node, click Pending Rebalance. +
    The server node shows a Pending delta recovery status + if delta recovery was selected. If you cancel the recovery, you can re-select + either delta or full recovery.
    +
    + + + + + + +
  10. +
  11. Click Rebalance. +
    The rebalance operation must be performed to re-add the failed over server node to + the cluster.
  12. +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/UI/ui-task-set-bucket-priority.html b/preview/contents/UI/ui-task-set-bucket-priority.html new file mode 100644 index 0000000..c655c6c --- /dev/null +++ b/preview/contents/UI/ui-task-set-bucket-priority.html @@ -0,0 +1,38 @@ +Managing disk I/O priority
+

Managing disk I/O priority

+ + +

The disk I/O priority for a bucket is set via the Data Bucket panel either + when creating a data bucket or when editing a data bucket.

+ + +
+

To set disk I/O priority for a bucket:

+ +
+ +
  1. + Navigate to Data Buckets > Create New Bucket (new + bucket) or Data Buckets > bucket_name link > Edit + (existing bucket). +
  2. +
  3. + In the Disk I/O Optimization panel, set bucket disk I/O priority option. Specify either High or Low to set. Low is the default. +
  4. +
  5. Click Save. +
  6. +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/UI/ui-views-editor.html b/preview/contents/UI/ui-views-editor.html new file mode 100644 index 0000000..ef6f363 --- /dev/null +++ b/preview/contents/UI/ui-views-editor.html @@ -0,0 +1,228 @@ +Views
+

Views

+ + +

The Views section lets you manage your development and production views.

+ +

The Views Editor is available within the Couchbase web console. You can access the View + Editor either by clicking the Views for a given data bucket within the + Data Buckets display, or by selecting the Views page from + the main navigation panel.

+ + +

The individual elements of this interface are:

+ +
    +
  • The pop-up, at the top-left, provides the selection of the data bucket where you are + viewing or editing a view.

    +
  • + +
  • The Create Development View enables you to create a new view either + within the current design document, or within a new document.

    +
  • + +
  • You can switch between Production Views and Development + Views.

    +
  • + +
  • The final section provides a list of the design documents, and within each document, + each defined view.

    +
  • + +
+ +

When viewing Development Views, you can perform the following actions:

+ +
* `Compact` the view index with an associated design document. This will compact
+  the view index and recover space used to store the view index on disk.
+
+* `Delete` a design document. This deletes all of the views defined within the
+  design document.
+
+* `Add Spatial View` creates a new spatial view within the corresponding design
+  document. See [Creating and Editing Views](#couchbase-views-editor-createedit).
+
+* `Add View` creates a new view within the corresponding design document. See
+  [Creating and Editing Views](#couchbase-views-editor-createedit).
+
+* `Publish` your design document (and all of the defined views) as a production
+  design document. See [Publishing Views](#couchbase-views-editor-publishing).
+
+* For each individual view listed:
+
+   * `Edit`, or clicking the view name
+
+     Opens the view editor for the current view name, see [Creating and Editing
+     Views](#couchbase-views-editor-createedit).
+
+   * `Delete`
+
+     Deletes an individual view.
+
+ +

When viewing Production Views you can perform the following operations on + each design document:

+ +
* `Compact` the view index with an associated design document. This will compact
+  the view index and recover space used to store the view index on disk.
+
+* `Delete` a design document. This will delete all of the views defined within the
+  design document.
+
+* `Copy to Dev` copies the view definition to the development area of the view
+  editor. This enables you edit the view definition. Once you have finished making
+  changes, using the `Publish` button will then overwrite the existing view
+  definition.
+
+* For each individual view:
+
+   * By clicking the view name, or the `Show` button, execute and examine the results
+     of a production view. See [Getting View Results](#couchbase-views-editor-view)
+     for more information.
+
+ + +

Creating and editing views

You can create a new design document and/or + view by clicking the Create Development View button within the + Views section of the Web Console. If you are creating a new design + document and view you will be prompted to supply both the design document and view name.

+ +

To create a new view as part of an existing design document, click the + Add View button against the corresponding design document.

+

View + names must be specified using one or more UTF–8 characters. You cannot have a blank view + name. View names cannot have leading or trailing white space characters (space, tab, newline, + or carriage-return).

+

If you create a new view, or have selected a Development view, + you can create and edit the map() and reduce() functions. + Within a development view, the results shown for the view are executed either over a small + subset of the full document set (which is quicker and places less load on the system), or + the full data set.

+> + +

The top portion of the interface provides navigation between the + available design documents and views.

+

The Sample Document section + lets you view a random document from the database to help you write your view functions + and so that you can compare the document content with the generated view output. Clicking + the Preview a Random Document will randomly select a document from the + database. Clicking Edit Document takes you to the Views editor.

+ +

Documents stored in the database that are identified as Non-JSON may + be displayed as binary, or text-encoded binary, within the UI.

+

Document metadata is + displayed in a separate box on the right hand side of the associated document. This shows + the metadata for the displayed document, as supplied to the map() as the + second argument to the function. For more information on writing views and creating the + map() and reduce() functions.

+

With the View Code + section, you should enter the function that you want to use for the map() + and reduce() portions of the view. The map function is required, the reduce + function is optional. When creating a new view a basic map() function will + be provided. You can modify this function to output the information in your view that you + require.

+

Once you have edited your map() and + reduce() functions, you must use the Save button to save + the view definition.

+

The design document will be validated before it is created or + updated in the system. The validation checks for valid JavaScript and for the use of valid + built-in reduce functions. Any validation failure is reported as an error.

+

You can + also save the modified version of your view as a new view using the Save + As... button.

+

The lower section of the window will show you the list of + documents that would be generated by the view. You can use the Show Results + to execute the view.

+

To execute a view and get a sample of the output generated by the + view operation, click the Show Results button. This will create the index + and show the view output within the table below. You can configure the different parameters + by clicking the arrow next to Filter Results. This shows the view selection + criteria, as seen in the figure below.

+ + +

Clicking on the Filter Results query string + opens a new window containing the raw, JSON formatted, version of the View results.

+ +

By default, Views during the development stage are executed only over + a subset of the full document set. This is indicated by the Development Time + Subset button. You can execute the view over the full document set by selecting + Full Cluster Data Set. Because this executes the view in real-time on the + data set, the time required to build the view may be considerable. Progress for building the + view is shown at the top of the window.

+

If you have edited either the + map() or reduce() portions of your view definition, you + must save the definition. The Show Results button will remain + grayed out until the view definition has been saved.

+

You can also filter the results + and the output using the built-in filter system. This filter provides similar options that + are available to clients for filtering results.

+ +
+ + +

Publishing views

+

Publishing a view moves the view definition from the + Development view to a Production View. Production views cannot be edited. The act of + publishing a view and moving the view from the development to the production view will + overwrite a view the same name on the production side. To edit a Production view, you copy + the view from production to development, edit the view definition, and then publish the + updated version of the view back to the production + side.

+
+ + +

Getting view results

Once a view has been published to be a production + view, you can examine and manipulate the results of the view from within the web console + view interface. This makes it easy to study the output of a view without using a suitable + client library to obtain the information.

+

To examine the output of a view, click icon + next to the view name within the view list. This will present you with a view similar to + that shown in the figure below.

+ + +

The top portion of the interface provides navigation between the + available design documents and views.

+

The Sample Document section + lets you view a random document from the database so that you can compare the document + content with the generated view output. Clicking the Preview a Random + Document will randomly select a document from the database. If you know the ID of + a document that you want to examine, enter the document ID in the box, and click the + Lookup Id button to load the specified document.

+

To examine the + function that generate the view information, use the View Code section of + the display. This will show the configured map and reduce functions.

+

The lower portion + of the window will show you the list of documents generated by the view. You can use the + Show Results to execute the view.

+

The Filter + Results interface lets you query and filter the view results by selecting + the sort order, key range, or document range, and view result limits and offsets.

+

To + specify the filter results, click on the pop-up triangle next to Filter + Results. You can delete existing filters, and add new filters using the embedded + selection windows. Click Show Results when you have finished selecting + filter values. The filter values you specify are identical to those available when querying + from a standard client library.

+

Due to the + nature of range queries, a special character may be added to query specifications when + viewing document ranges. The character may not show up in all web browsers, and may instead + appear instead as an invisible, but selectable, character.

+
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/UI/ui-xdcr-panel.html b/preview/contents/UI/ui-xdcr-panel.html new file mode 100644 index 0000000..d308b4d --- /dev/null +++ b/preview/contents/UI/ui-xdcr-panel.html @@ -0,0 +1,57 @@ +XDCR
+

XDCR

+ + +

The XDCR panel is used to create a remote cluster reference and specify replication.

+ + + +
+ + +

Create cluster reference

+

To create a cluster reference, provide the cluster name, IP or hostname, administrator username and password + and whether or not to enable encryption (Enterprise Edition only).

+ + + +
+ + +

Create replication

+

To create a replication, provide the bucket to replicated on the remote cluster, the remote cluster and bucket, + and modify any advanced XDCR settings.

+ +
+ + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/UI/ui-xdcr-pause-resume.html b/preview/contents/UI/ui-xdcr-pause-resume.html new file mode 100644 index 0000000..0348a06 --- /dev/null +++ b/preview/contents/UI/ui-xdcr-pause-resume.html @@ -0,0 +1,42 @@ +Pausing XDCR replication
+

Pausing XDCR replication

+ + +

XDCR replication can be paused and resumed via the web console under the XDCR section.

+ + +
+

To pause and resume replication, click the replicating and paused icons under the + ongoing replication status.

+ +
+ +
  1. + Navigate to XDCR. +
  2. +
  3. + Under Ongoing Replication > Status, click on the + Replicating icon to pause replication. +
    +
  4. +
  5. + Under Ongoing Replication > Status, click on the + Paused triangle icon to continue replicating. +
    + +
  6. +
+ + + +
+ +
\ No newline at end of file diff --git a/preview/contents/Views/views-basics.html b/preview/contents/Views/views-basics.html new file mode 100644 index 0000000..47cef2b --- /dev/null +++ b/preview/contents/Views/views-basics.html @@ -0,0 +1,46 @@ +Viewの基本
+

Viewの基本

+ + +

Viewはデータから特定のフィールドや情報を抽出して、インデックスの作成を可能とします。

+ +

+ Viewの目的はCouchbase Serverデータベースに保存された非構造化、半構造化データを元に、任意のフィールドや情報を抽出し、選択した情報のインデックスを生成することです。 + Couchbase Serverに情報をJSON形式で保存すると、特定のフィールドを選択して出力する処理がより簡単になります。 + この結果として生成された構造が保存されているデータに対するViewです。 + この処理中に生成されたViewを利用して、データベース内に保存されたデータオブジェクト情報の走査、選択やクエリが可能となります。 +

+ +

以下の図はこの処理の概要を示しています。

+ + + + +

+ 上記の例では、Viewが保存されたドキュメントのName、City、Salaryのフィールドを利用し、各ドキュメントについて、これらの情報から成る配列をView内に生成します。 + ViewはCouchbaseバケット内の全てのドキュメントを走査することで作成され、指定した情報を出力します。 + 結果としてインデックスが保存され、利用可能となり、新規データが保存されると、Viewにアクセスした際にインデックスが更新されます。 + この処理はインクリメンタルであり、稼働中に与える性能への影響は小さいです。 + 既存の大きなデータセットに対して新規のViewを作成すると、構築に長時間かかることがありますが、データの更新は高速です。 +

+ +

+ Viewの定義は、フォーマットと、データベース内の各ドキュメントから生成するコンテンツを指定します。 + 保存したJSONのフィールドに依存した処理であり、ドキュメントがJSONではない、あるいはViewで指定したフィールドが存在しない場合、その情報は無視されます。 + このため、幾つかのドキュメントで軽微なエラーや関連するフィールドの欠損があったとしても、Viewを生成することができます。 +

+ +

+ ドキュメント型データベースの利点の一つは、アプリケーション全体を変更したり、コストのかかるスキーマの更新を事前に実行することなく、データベース内に保存されたドキュメントのフォーマットをいつでも変更できることです。 +

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Views/views-development.html b/preview/contents/Views/views-development.html new file mode 100644 index 0000000..baf09c1 --- /dev/null +++ b/preview/contents/Views/views-development.html @@ -0,0 +1,70 @@ +開発View
+

開発View

+ + +

Viewはデプロイ前のViewの影響を制御するために、開発環境で作成されます。

+ +

+ Couchbaseクラスタの性質と、クラスタにわたって保存されているデータセットのサイズによっては、View開発の影響を制御する必要があります。 + Viewの作成はインデックスを作成するため、インデックスの生成中はサーバの性能を低下させることがあります。 + しかしながら、Viewはまたアクティブに保存された情報に対して開発、構築される必要もあります。 +

+ +

+ Viewの生成とテスト、およびプロダクションでのViewの開発の両方をサポートするため、Couchbase Serverは、「開発」Viewと「プロダクション」Viewという2つの異なるViewタイプをサポートしています。 + 二つのViewタイプは同じように動作しますが、操作において異なる目的と制約があります。 +

+ +

+ 開発ビューはビューの定義を選択、設計している間に利用されるように設計されています。 + ビューが開発モードの場合、ビューは次のように動作します: +

+ +
    +
  • + デフォルトでは、開発ビューは保存された情報のサブセットのみで動作します。 + 完全なデータセットに対して開発ビューを生成することもできます。 +
  • + +
  • + 選択したCouchbaseバケット内の生データを利用することで、プロダクション環境のデータに対してリアルタイムにビューを開発、改良することができます。 +
  • + +
  • + 開発モードのビューは自動的に再構築されません。また、一貫したビューであっても、自動更新メカニズムに依存しているので、リバランス処理中は開発モードのビューは更新されません。 + このように開発モードのビューを更新するとシステムリソースが無駄になるからです。 +
  • + +
  • + 開発ビューは編集、変更が可能です。 + 開発ビューの定義はいつでも変更、更新することができます。 + ビューの開発中に、ビュー定義の開発を支援するために、保存されたドキュメントを参照および編集できます。 +
  • + +
  • + 開発ビューは、プロダクションビューとは異なるURLでクライアントライブラリからアクセスでき、アプリケーション開発中にビューの種別と情報の特定を容易にします。 +
  • + +
+ +

+ Webコンソールからビューを実行すると、デフォルトではバケットに保存されたドキュメント内のサブセットに対して処理を行います。 + Webコンソールから、全てのドキュメントに対してビューを実行することもできます。 +

+ +

+ 対象ドキュメントがサブセットの場合、reduceした結果はバケット内のすべてのドキュメントに対するものではありません。 + 全てのドキュメントに対するビュー実行結果をチェックするべきです。 +

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Views/views-geospatial.html b/preview/contents/Views/views-geospatial.html new file mode 100644 index 0000000..5077bed --- /dev/null +++ b/preview/contents/Views/views-geospatial.html @@ -0,0 +1,312 @@ +Writing geospatial views
+

Writing geospatial views

+ + +

Geospatial views adds two-dimensional spatial index support to Couchbase. Development only.

+ +

Geospatial support was introduced as an experimental feature in Couchbase Server. + This feature is currently unsupported and is provided only for the purposes of + demonstration and testing.

+ +

GeoCouch adds two-dimensional spatial index support to Couchbase. Spatial support enables + you to record geometry data into the bucket and then perform queries which return + information based on whether the recorded geometries existing within a given + two-dimensional range such as a bounding box. This can be used in spatial queries and in + particular geolocationary queries where you want to find entries based on your location + or region.

+ +

The GeoCouch support is provided through updated index support and modifications to the + view engine to provide advanced geospatial queries.

+ + + + + +

Adding geometry data

+

GeoCouch supports the storage of any geometry + information using the GeoJSON specification. The format of the + storage of the point data is arbitrary with the geometry type being supported during + the view index generation.

+ +

For example, you can use two-dimensional geometries + for storing simple location data. You can add these to your Couchbase documents + using any field name. The convention is to use a single field with two-element array + with the point location, but you can also use two separate fields or compound + structures as it is the view that compiles the information into the geospatial + index.

+

For example, to populate a bucket with city location information, the + document sent to the bucket could be formatted like that + below:

+
{
+"loc" : [-122.270833, 37.804444],
+"title" : "Oakland"
+}
+
+ +
+ + + + +

Views and queries

The GeoCouch extension uses the standard + Couchbase indexing system to build a two-dimensional index from the point data + within the bucket. The format of the index information is based on the GeoJSON specification.

+ +

To create a geospatial index, use the + emit() function to output a GeoJSON Point value containing the + coordinates of the point you are describing. For example, the following function + will create a geospatial index on the earlier spatial record + example.

+
function(doc, meta)
+{
+  if (doc.loc)
+  {
+     emit(
+          {
+             type: "Point",
+             coordinates: doc.loc,
+          },
+          [meta.id, doc.loc]);
+  }
+}
+
+

The + key in the spatial view index can be any valid GeoJSON geometry value, including + points, multipoints, linestrings, polygons and geometry collections.

+

The view + map() function should be placed into a design document using + the spatial prefix to indicate the nature of the view definition. + For example, the following design document includes the above function as the view + points

+
{
+   "spatial" : {
+      "points" : "function(doc, meta) { if (doc.loc) { emit({ type: \"Point\", coordinates: doc.loc}, [meta.id, doc.loc]);}}",
+   }
+}
+
+

To + execute the geospatial query you use the design document format using the embedded + spatial indexing. For example, if the design document is called + main within the bucket places, the URL will be + http://localhost:8092/places/_design/main/_spatial/points.

+

Spatial + queries include support for a number of additional arguments to the view request. + The full list is provided in the following summary + table.

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Get Spatial NameDescription
MethodGET + /bucket/_design/design-doc/_spatial/spatial-name
Request DataNone
Response DataJSON of the documents returned by the view
Authentication Requiredno
 Query Arguments
bboxSpecify the bounding box for a spatial query
 Parameters : string; optional
limitLimit the number of the returned documents to the specified + number
 Parameters : numeric; optional
skipSkip this number of records before starting to return the + results
 Parameters : numeric; optional
staleAllow the results from a stale view to be used
 Parameters : string; optional
 Supported Values
 false : Force update of the view index before + results are returned
 ok : Allow stale views
 update_after : Allow stale view, update view + after access
+
+

Bounding Box Queries If you do not supply a bounding box, the full dataset is + returned. When querying a spatial index you can use the bounding box to specify the + boundaries of the query lookup on a given value. The specification should be in the + form of a comma-separated list of the coordinates to use during the + query.

+

These coordinates are specified using the GeoJSON format, so the first + two numbers are the lower left coordinates, and the last two numbers are the upper + right coordinates.

+

For example, using the above design + document:

+
GET http://localhost:8092/places/_design/main/_spatial/points?bbox=-180,-90,0,0
+Content-Type: application/json
+
+

Returns + the following + information:

+
{
+    "total_rows": 0,
+    "rows": [
+        {
+            "id": "oakland",
+            "key": [
+                [
+                    -122.270833,
+                    -122.270833
+                ],
+                [
+                    37.804444,
+                    37.804444
+                ]
+            ],
+            "value": [
+                "oakland",
+                [
+                    -122.270833,
+                    37.804444
+                ]
+            ],
+            "geometry": {
+                "coordinates": [
+                    -122.270833,
+                    37.804444
+                ],
+                "type": "Point"
+            }
+        }
+    ]
+}
+
+
Note: The return data includes the value specified in the design document view + function, and the bounding box of each individual matching document. If the spatial + index includes the bbox bounding box property as part of the + specification, then this information will be output in place of the automatically + calculated version.
+
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Views/views-index-updates.html b/preview/contents/Views/views-index-updates.html new file mode 100644 index 0000000..20ca4d4 --- /dev/null +++ b/preview/contents/Views/views-index-updates.html @@ -0,0 +1,95 @@ +ストリームベースのView
+ +

ストリームベースのView

+ + + + +
+ + ストリームベースのViewはViewの更新レイテンシを削減し、より高速にViewの一貫性を保ち、最新のデータを提供します。 + + + この章では新しいストリーミングプロトコル、データベース変更プロトコル(Database Change Protocol, DCP)について解説します。 +
+ + +

+ DCPを利用すると、Viewクエリを利用してデータを取得する前に、データがディスクに永続化される必要がなくなります。 + DCPはViewに対し、以下の利点があります: +

+ +
    +
  • Key-Valueの更新がより速くViewに反映されます。
  • + +
  • View更新のレイテンシが削減されます。
  • + +
  • Viewとデータがより短時間に同期されます。
  • + +
+ + +

以下の図は、ストリームベースのViewがどのように動作するのかを示しています。

+ + + + +

+ Viewクエリを実行する際、データの鮮度をパラメータとして指定することができます。 + そのパラメータの名前はstaleで、以下の値を指定できます: +

+ + +
    +
  • ok—サーバは現在のインデックスファイルに含まれるエントリを返します。
  • + +
  • update_after—サーバは現在のインデックスファイルからエントリを返し、インデックスの更新を開始します。
  • + +
  • false—サーバは現在のKey-Valueドキュメントセットのインデックス作成の完了を待ち、 + 最新のViewインデックスからエントリを返します。
  • + +
+ + +

+ 更新プロセスは5秒ごとに自動的に、5000の変更が発生したかをチェックします。 + もし、少なくとも5000の変更が発生していたら、インデックスの更新を開始します。 + そうでない場合、インデックス更新は行いません。 + インデックス更新が実行されると、インデクサは、最後に実行してから発生したすべての変更をDCPに問い合わせます。 + チェックを行うデフォルトの変更数は5000ですが、updateMinChangesオプションを設定することで変更できます。 + 更新感覚についても、updateIntervalオプションを設定することで変更可能です。 +

+ + +

+ Viewクエリ引数のstale=falseが改善されました。 + アプリケーションがstaleパラメータをfalseでクエリを送信すると、 + ディスクにまだ永続化されていない変更を含む、ドキュメントに対する直近のすべての変更を受信できます。 + クエリを受信した時点までのすべてのドキュメントの変更が対象となります。 + これにより、stale=falseを指定したクエリを実行する前に、 + 永続性要件やobserve機能を利用し、永続化をブロックするアプリケーションコードが不要になりました。 + データ更新後のこのようなアプリケーションレベルでのチェック実装は、削除していただくことを推奨します。 +

+ + + +
ベストプラクティス: + より良いスケーラビリティとスループットを実現するためには、 + staleパラメータにokを指定することを推奨します。 + ストリームベースのViewでは、staleパラメータにokを指定しても、 + すべての変更を含んでいない可能性はありますが、以前に比べKey-Valueデータの状態に近くなります。 +
+ + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Views/views-intro.html b/preview/contents/Views/views-intro.html new file mode 100644 index 0000000..f78666b --- /dev/null +++ b/preview/contents/Views/views-intro.html @@ -0,0 +1,90 @@ +Viewとインデックス
+

Viewとインデックス

+ + +

CouchbaseのViewはデータをインデクシングしクエリを可能とします。

+ +

+ Viewは定義したフォーマットと構造に基づき、データのインデックスを作成します。 + ViewはCouchbase内のオブジェクトから抽出した特定のフィールドと情報で構成されます。 + Viewは保存した情報のインデックスを作成し、データの検索と選択の操作を可能とします。 +

+ +

+ Viewは内部で保存されたドキュメントと比較すると結果整合性となります。 + ドキュメントデータがディスクに永続化されるとそのドキュメントはViewに反映されます。 + 有効期限付きのドキュメントは期限切れページャがデータベースからドキュメントを削除するときに、インデックスからも削除されます。 +

+ +

Viewを利用する理由は様々な理由があります、例えば:

+ +
    +
  • 保存したオブジェクトのデータをインデクシングしデータをクエリする
  • + +
  • 特定のオブジェクトタイプのデータリストを生成する
  • + +
  • 保存データを元に情報のテーブルとリストを生成する
  • + +
  • データベースから情報を抽出、フィルタリングする
  • + +
  • 保存データの集合が持つ情報を計算し、集約、要約する
  • + +
+ +
複数のViewを作成し、保存データに対する複数のインデックスを作成できます。 + 保存した情報の特定のフィールドを公開することで、Viewは以下を可能とします: +
    +
  • インデックスの作成と保存データのクエリ
  • + +
  • データのクエリや選択の実行
  • + +
  • View実行結果のページ操作
  • + +
+ +
+ + +

+ ViewビルダはWebコンソール上でViewを作成するインタフェースを提供します。 + ViewはCouchbaseクライアントライブラリを利用しアクセスし、マッチするレコードを取得します。 +

+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Views/views-operation.html b/preview/contents/Views/views-operation.html new file mode 100644 index 0000000..cf65130 --- /dev/null +++ b/preview/contents/Views/views-operation.html @@ -0,0 +1,551 @@ +Viewの動作
+

Viewの動作

+ + +

このセクションではView動作や様々なViewやデータに関連する機能を説明します。

+ +

Couchbase内の全てのViewは以下の様に動作します:

+ +
    +
  • ドキュメントデータがメモリ上で更新される際にViewが更新されます。 + ドキュメントが作成、更新されるタイミングと、ドキュメントがView内で更新されるタイミングの間には、 + クライアント側でのクエリパラメータに依存して遅延が発生します。
  • + +
  • 有効期限を指定して保存したドキュメントはバックグラウンドの期限切れドキュメント削除プロセスがデータベースからそれらを削除するまで、 + 自動的に削除されません。 + このため、インデックス内に期限切れのドキュメントが残る場合があります。 +
  • + +
  • Viewはデザインドキュメント内で定義され、各デザインドキュメントは単一のバケットの一部です。 + Viewは対応するバケット内の情報にのみアクセスできます。
  • + +
  • View名は一つ以上のUTF-8文字で指定する必要があります。 + View名を空白にすることはできません。 + View名の前後には空白文字(スペース、タブ、改行)を含めることはできません。 +
  • + +
  • UTF-8でエンコードできないドキュメントIDは自動的にフィルタリングされ、いかなるViewにも含まれません。 + フィルタリングされたドキュメントはログに出力されます。
  • + +
  • 複雑なViewリクエストを送信する場合、GETではなくPOSTを利用します。
  • + +
  • Viewを定義した、対応するバケット内のドキュメントにのみアクセス可能です。 + 複数のバケットのデータへアクセスしたり、集約することはできません。
  • + +
  • Viewはデザインドキュメントの一部として作成し、デザインドキュメントは対応するバケットの内部に存在します。 +
      +
    • 各デザインドキュメントは0からn個のViewを持ちます。
    • + +
    • 各バケットは0からn個のデザインドキュメントを持ちます。
    • + +
    +
  • + +
  • 単一のデザインドキュメント内にある全てのViewは、単一のViewの更新が発動した時に同時に更新されます。 + 例えば、3つのViewを持つデザインドキュメントは、1つのViewが更新されると同時に3つ全てのViewを更新します。
  • + +
  • 更新は二つの方法で実行できます:
      +
    • +

      staleパラメータを指定してアクセス、クエリを実行した時。

      + +
    • + +
    • +

      更新されたドキュメントの数、および最終更新時からの経過時間に応じてCouchbase Serverが自動的に実施。 + 自動更新はグローバルに、あるいは個々のデザインドキュメント単位に制御できます。

      + +
    • + +
    +
  • + +
  • Viewはインクリメンタルに更新されます。 + 初めてViewにアクセスすると、バケット内の全てのドキュメントがmap/reduce関数で処理されます。 + その後のViewに対する各アクセスでは、最後にViewインデックスを更新してから、追加、更新、削除されたドキュメントのみを処理します。

    +
  • + +
+ +

このため、Viewは完全にインクリメンタルな性質を持ちます。 + Viewの更新は変更したドキュメントのみを更新するため、通常高速です。 + ビルトインの自動更新システム、クライアントからの実行、アプリケーションフレームワークでの明示的な更新などで、Viewが更新されていることを確実にしてください。

+ +
    +
  • Viewの更新処理はインクリメンタルな性質を持つため、情報はディスクに保存されたインデックスに追記されるだけです。 + このため、インデックスの更新は効率的に行われます。 + コンパクション(自動コンパクションを含む)はディスク上のインデックスサイズ、インデックス構造を最適化します。 + 最適化したインデックスはより効率的に更新、クエリが可能です。

    +
  • + +
  • View定義を変更すると、View全体が再作成されます。 + これは利用中のデータに害をもたらす可能性があるため、開発Viewのみが変更可能です。

    +
  • + +
+ +

+ Viewはデザインドキュメントで組織され、インデックスはデザインドキュメントに基づき作成されます。 + 複数のViewを持つデザインドキュメント内のあるViewを変更すると、そのデザインドキュメント内の全てのView(および保存されたインデックス)が無効化され、そのデザインドキュメント内に定義された関連する全てのViewを再構築しなければなりません。 + これは、アクティブなプロダクションViewで必要なI/Oに加え、インデックスの再構築のI/Oを増加させます。 +

+ +
    +
  • + Viewの結果の更新方法はクエリ実行前かクエリ実行後から選択できます。 + もしくは、クエリ実行時に、Viewが持つ現在の結果セットを取得することも可能です。 + この場合、結果が最新でない可能性があります。 +

    +
  • + +
  • Viewエンジンはインデックスをデザインドキュメントごとに作成します; このインデックスはそのデザインドキュメント内の全てのViewの結果を保持します。

    +
  • + +
  • + このインデックス情報はディスクに保存され、Viewで定義したkeyとvalueの両情報から構成されます。 + 可能な限り高速に情報を返却できるようにkeyとvalueの値はインデックス内に保存され、同時にreduce関数を持つViewがインデックスからデータを抽出し集約できるようにしています。 +

    +
  • + +
+ +

map関数で定義したkeyとvalueの情報はインデックス内に保存されているため、出力したkey/value情報がオリジナルのドキュメントデータよりも大きい場合、インデックスの総データサイズは保存データの総サイズよりも大きくなる場合があります。

+ + +

有効期限がViewに与える影響

+

+ Couchbase Serverは有効期限を遅延判定していることに注意してください、これは、期限切れのアイテムは即座に削除されるのではなく、削除状態でフラグ付けされるということです。 + Couchbase Serverはexpiry pagerというメンテナンスプロセスを定期的に実行し、全ての情報を参照して期限切れのアイテムを削除します。 + このメンテナンスプロセスは実行間隔を変更していない場合、デフォルトでは60分ごとに実行されます。 + アイテムがリクエストされると、Couchbase Serverは削除用にフラグ付けされたアイテムを削除し、そのアイテムは存在しないというレスポンスを返します。 +

+ +

+ Viewの結果はViewに定義された条件に一致するいかなるアイテムも含みます。 + このため、ディスクから削除されていない情報はViewクエリの結果内に現れることがあります。 + CouchbaseのViewを使うと、reduce関数をデータに適用し、計算やデータの集約を実行することもできます。 + 例えば、ある種別のオブジェクトインスタンスの数をカウントしたい場合、reduce関数を利用します。 + 繰り返しになりますが、ディスク上に存在するアイテムはreduce関数で実行される全ての計算に含まれることになります。 + ディスク永続化に起因する挙動に対して、Viewで有効期限を処理するガイドラインを以下に記載します: +

+ + +
    +
  • 結果セット内の期限切れドキュメントを検知する: Couchbase Server内のアイテムをインデクシングするためにViewを利用している場合、まだ期限切れページャメンテナンスプロセスにより削除されていないアイテムは、Viewクエリの結果セット内に含まれます。

    +
  • + +
  • Reduceと期限切れアイテム + : 時として、reduce関数を実行し、Couchbase Server内のデータの集約や計算を行いたい場合があるでしょう。 + この場合、Couchbase Serverはインデックス用に保存されている、事前に計算された値を利用して、最終的な結果を導きます。 + これはまた、ディスク上にまだ存在する期限切れアイテムが計算の一部に含まれることを意味します。 + 期限切れアイテムの割合がそうでないアイテムに比べて比較的低い場合、これが最終結果に影響を与えることはないかもしれません。 + 例えば、100万人のプレイヤーにおける平均スコアを計算する際に、ディスク上に10の期限切れスコアが残っていたとしても、最終結果での違いはごくわずかでしょう。 + しかし、20人のプレイヤーにおける平均スコアを計算する際に、ディスク上に10の期限切れスコアが残っている場合、期待する平均値よりも大きく異なる結果となるでしょう。 +
  • + +
+ + +

+ この場合、より頻繁に期限切れページャプロセスを実行し、すでに期限切れとなっているアイテムがreduce関数内の計算に含まれないようにすることもできます。 + クラスタ内の各ノード上の期限切れページャを10分ごとに実行することをお勧めします。 + この間隔はノード上でクリーンアップをより頻繁に実行するので、ノード上の性能に僅かながら影響を与えることに留意してください。 +

+ +

+ メンテナンスプロセスの実行感覚設定に関する詳細情報は、Couchbaseコマンドラインツールを参照し、exp_pager_stimeの例を確認してください。 +

+ +
+ + + +

クラスタ内Viewの挙動

データの分散。 + Couchbase Serverをすでに利用しているなら、サーバがデータをクラスタ内の異なるサーバ間で分散していることをご存知でしょう。 + クラスタ内にノードが4台ある場合、平均して各ノードはアクティブデータの25%を保持します。 + Couchbase ServerのViewを利用すると、インデクシング処理は4つ全てのノード上で実行され、ディスク上のインデックスは結果の約25%を含みます。 + クラスタ内のデータの一部分を元にしているので、これらのインデックスを部分インデックスとします。 + 以下の図でこの部分インデックスを示します。 +

+ +

データのレプリケーションとインデックス。 + Couchbase Serverはまた、データのレプリケーションを提供します; このため、サーバはあるノードから他のノードへとデータをレプリケートします。 + 一つ目のノードがダウンしても、二つ目のノードが継続してそのデータに対するリクエストを処理できます。 + ノード障害に対応するため、Couchbase Serverにレプリカデータ用の部分インデックスもレプリケートするように指定できます。 + デフォルトではクラスタ内の各ノードは各デザインドキュメントとView関数のコピーを保持しています。 + View関数を変更すると、Couchbase Serverはその変更をクラスタ内の全てのノードにレプリケートします。 + サーバは単一のデザインドキュメント内のViewからインデックスを生成し、そのインデックスをクラスタ内各ノード上に単一のファイルとして保存します: +

+ + +
+ + +

+ Couchbase Serverはまた、レプリカデータを含むレプリカインデックスをノード上に作成することも可能です; これはクラスタでのフェイルオーバシナリオに対する準備のためです。 + サーバは他のサーバからインデックス情報をレプリケートしません、代わりに、各ノードは保持するレプリカデータのインデックスを作成します。 + サーバはノード上のレプリカデータを利用して、定義された各デザインドキュメントとViewのインデックスを再作成します。 + レプリカインデックスにより、ノード障害が発生したとしてもクエリの実行が可能になります。 + バケットの作成時にCouchbase Serverがレプリカインデックスを作成するか否かを指定できます。 +

+ + +

クラスタでのクエリ実行

+ + +

+ Viewをクエリしインデクシング処理を実行するには、リクエストをクラスタ内にある一つのノードに送信します。 + そのノードはリクエストをクラスタ内の全てのノードへと分配します。 + クエリに設定するパラメータに応じて、各ノードはノードにおける現在の部分インデックスか、部分インデックスを更新して送信するか、部分インデックスを送信後にディスク上の部分インデックスを更新します。 + Couchbase Serverはこれらの部分インデックスを収集し照合して、集約した結果をクライアントに送信します。 +

+ +

クエリ実行時のエラー処理として、エラー発生時のクラスタの挙動を設定できます。

+ + +

リバランスおよびフェイルオーバ中のクエリ

+ +

クラスタのリバランスおよびノードのフェイルオーバ中でもインデックスをクエリできます。 + リバランスやノード障害中にクエリを実行すると、Couchbase Serverはリバランスやノード障害が発生していない場合に期待されるようなクエリ結果を返すようにします。 +

+ +

リバランス中は、データがあるノードから他のノードへと移動していないかのように、ノード上のデータがアクティブである場合に期待される結果と同様の結果を返します。 + 言い換えると、この機能はリバランス中にも、あるノードからのクエリ結果と、リバランスを開始する前のノードから返されるクエリ結果との一貫性を保証するということです。 + Couchbase Serverのデフォルトとしてこの機能は動作しますが、無効化することもできます。 + この機能が有効な場合、クラスタのリバランスにはより長い時間がかかることに注意してください; しかし、一貫性のないクエリ結果となるため、この機能をテストすることなくプロダクション環境で無効化することは推奨しません。 +

+
+ + +

Viewの性能

+ Viewの更新に必要な時間、Viewの更新へアクセスするための時間、そして更新された情報が返却されるまでの時間などのView性能はさまざまな要素に依存します。 + ファイルシステムキャッシュ、更新頻度、ドキュメントデータ更新からViewへアクセス(もしくは更新)するまでの時間などはすべて性能に影響します。 +

+ +

いくつかの重要な点を以下に記載します:

+ +
    +
  • + インデックスのクエリは常にディスクへとアクセスします; インデックスはCouchbase ServerによってRAM上に保持されていません。 + しかし、頻繁に利用するインデックスは、ディスク上の情報をキャッシュするためのファイルシステムキャッシュに保存される場合があります。 + 利用可能な総RAM容量からCouchbase Serverに割り当てるRAMを削減し、ファイルシステムキャッシュを増加させると、OSで利用可能なRAMが増加します。 +
  • + +
  • + ファイルシステムキャッシュはインデックス情報の更新処理においても重要な役割を担います。 + 最近更新されたドキュメントはファイルシステムキャッシュ内に保存されているでしょう。 + 更新操作の直後にViewの更新をリクエストすると、ファイルシステムキャッシュからの情報を使うことになるでしょう。 + 結果永続性の性質によりドキュメントの更新、永続化、インデックス内への反映までに若干の遅延があります。 +
  • + +
+オペレーティングシステム用のある程度のRAMを確保しておくことで、ファイルシステムキャッシュとして割り当てられるRAMを増加させ、インデックスファイルキャッシュに利用できる領域を確保するのに役立ちます。
    +
  • + Viewインデックスはドキュメント更新システムとは完全に独立して保存、アクセス、更新されます。 + このため、インデックス更新と参照はインデックス情報を構築するためにドキュメントがメモリに存在するかどうかに依存しません。 + 独立したシステムは、クラスタへアクセスし取得する性能が、ドキュメントストアに依存しないことも意味します。 +
  • + +
+ +
+ + + +

インデックスの更新とstaleパラメータ

+ +

+ インデックスはView定義に基づき、Couchbase Serverによって作成されますが、インデックスの更新はデータが挿入されるたびに実行するのではなく、データのクエリ時に制御できます。 + クエリ実行時にインデックスを更新するか否かはstaleパラメータで制御します。 + staleパラメータに関わらず、ドキュメントはディスクに永続化された後にのみシステムでインデクシング可能となります。 + ドキュメントがまだディスクに永続化されていない場合、staleを使用してもこの処理を強制することはできません。 + インデックスに反映されるように、observeオペレーションを利用しドキュメントがディスクに永続化されることを監視できます。 + Viewはまた、ドキュメントの変更と更新間隔に応じて自動的に更新することもできます。 +

+ + +

staleでは3つの値をサポートしています:

+
    +
  • stale=ok
  • + +
+

インデックスは更新されません。 + もしインデックスがViewに存在している場合、クエリ発行時点でのインデックス内の現在の情報が利用され、それに応じて結果を返します。

+ + +
+ + +

この設定は既存のインデックスを更新せずに利用するため、最も高速にクエリのレスポンスを返します。 + しかし、データベース内のドキュメントが変更されていても、Viewに含まれていない場合、不完全な情報を返すリスクがあります。

+
    +
  • stale=false
  • + +
+ + +

+ クエリ実行前にインデックスを更新します。 + これは更新されたすべてのドキュメント(ディスクに永続化済み)がViewに含まれることを保証します。 + クライアントはインデックスの更新が完了するまでクエリの実行を待つことになり、更新されたインデックスが利用可能になるまでレスポンスが遅延します。 +

+ + +
+ + +
    +
  • stale=update_after
  • + +
+

staleパラメータをしていしない場合のデフォルト設定です。 + クエリ時点の既存のインデックスが利用されますが、インデックスはクライアントに結果を返却した後に更新されるようにマークされます。

+ + + +
+ + + +

+ インデクシングエンジンは非同期なプロセスです; このため、インデックをクエリすると予期せぬ結果を返す可能性があります。 + 例えば、ドキュメントを更新した直後に、そのドキュメントを含むクエリを実行すると、更新後の情報が出力されたViewデータ内に含まれない可能性があります。 + これはドキュメントの更新がインデックスの更新を実施した時点でまだディスクにコミットされていないためです。 + 削除したドキュメントがまだインデックスから削除されていないために、インデックス内に削除したドキュメントが出現する可能性もあります。 +

+ +

+ どちらのシナリオでも、observe コマンドをpersistto引数とともにクライアントで利用し、ドキュメントの永続化状態を確認してから、stale=falseを利用してViewの更新を強制的に行うべきです。 + そうすればViewインデックス内に正しくそのドキュメントが反映されたことを保証できます。 +

+ +

+ 一つのインデックスに複数のクライアントがアクセスする場合、インデックス更新処理とクライアントに返却される結果は各クライアントがしていしたパラメータとクライアントがサーバとやりとりする順序に依存します。 +

+
    +
  • シナリオ1

    + + + +
      +
    1. クライアント1がstale=falseでクエリを実行
    2. + +
    3. クライアント1はサーバがインデックスを更新するのを待つ
    4. + +
    5. クライアント1の処理中に、クライアント2がstale=falseでViewをクエリ
    6. + +
    7. クライアント2はクライアント1によって開始された既存のインデックス処理完了を待つ。
    8. + +
    9. クライアント2は更新されたインデックスを得る。
    10. + +
    +
  • + +
  • シナリオ2

    + +
      +
    1. クライアント1がstale=falseでViewをクエリ
    2. + +
    3. クライアント1はサーバがインデックスを更新するのを待つ
    4. + +
    5. クライアント1のインデックス更新が処理中に、クライアント2がstale=okでViewをクエリ
    6. + +
    7. クライアント2は既存のインデックスを得る
    8. + +
    +
  • + +
  • シナリオ3

    + +
      +
    1. クライアント1がstale=falseでViewをクエリ
    2. + +
    3. クライアント1はサーバのインデックスを更新を待つ
    4. + +
    5. クライアント2がstale=update_afterでViewをクエリ
    6. + +
    7. クライアント1のインデックス更新が完了していない場合、クライアント2は既存のインデックスを得る。
    8. + +
    9. クライアント1のインデックス更新が完了している場合、クライアント2は更新されたインデックスを得て、さらにインデックス更新が開始される。
    10. + +
    +
  • + +
+ + +

+ 複数のクライアントがViewの更新を情報の返却前にリクエストすると(stale=false)、インデックス更新はスタックすることがあります。 + よって複数のクライアントがインデックスを更新およびインデックスデータのクエリを行うと更新されたドキュメントと各時点のViewを返すことを保証しています。 + stale=update_afterのクエリでは、クエリがアクセスした後にすべての更新が発生するため、インデックスの更新はスタックされません。 +

+ + +

シーケンシャルなアクセス

+ + +
    +
  1. クライアント1がstale=okでViewをクエリ
  2. + +
  3. クライアント2がstale=falseでViewをクエリ
  4. + +
  5. Viewが更新される
  6. + +
  7. クライアント1が再びstale=okでViewをクエリ
  8. + +
  9. クライアント1は更新されたViewを得る
  10. + +
+

上記のシナリオはそれぞれのクエリ間でレコードの順序が変わる可能性があるため、複数のレコードをページ制御している場合に問題が起こる場合があります。

+ + +
+ + + +

インデックス更新の自動化

+ +

+ 更新間隔の設定に加え、すべてのインデックスをバックグラウンドで自動的に更新することもできます。 + 自動更新はViewエンジンがインデックスを更新するまでの、更新間隔(ミリ秒)と変更されたドキュメントの数の二つのパラメータで制御できます。 + これら二つのパラメータはupdateIntervalupdateMinChangesです:

+ + +
    +
  • updateInterval : インターバルをミリ秒で指定、デフォルトは5000ミリ秒。 + updateIntervalごとにViewエンジンはディスク上のドキュメントの変更数がupdateMinChangesより多いかをチェックします。 + そうであれば、Viewの更新を開始します。 + ディスクに保存されたドキュメントはメモリ内のドキュメントと比べて数十秒遅れている可能性もあります。 +

    +
  • + +
  • + updateMinChanges : 再インデックス実施までに発生したドキュメント変更数で、デフォルトは5000です。 +

    +
  • + +
+ + +

+ 自動更新処理はフルセットの開発用およびプロダクション用インデックスでのみ実行されます。 + 自動更新は部分的な開発用インデックスでは実施されません。 +

+ +

+ 自動更新プロセスに関わらず、ドキュメントはディスクに永続化された後にのみシステムでインデックス可能となります。 + ドキュメントがディスクに永続化されていなくても、自動更新処理は未書き込みのデータをディスクに強制的に書き込むことはしません。 + observeオペレーションを利用してドキュメントがディスクに永続化され、インデックスに反映されることを監視できます。 +

+ + +

更新は以下のように適用されます:

+
    +
  • アクティブインデックス、プロダクションView
  • + +
+ + +

+ すべてのアクティブ、プロダクションViewのインデックスは自動的に更新間隔updateIntervalと、ドキュメント変更数updateMinChangesに応じて更新されます。 +

+ + +

updateMinChangesを0に設定すると、自動更新は無効化されます。

+ + + +
    +
  • レプリカインデックス
  • + +
+ + +

バケットでレプリカインデックスを有効にすると、ドキュメントの変更数設定(replicaUpdateMinChanges; デフォルトは5000)に応じて自動的にインデックスを更新します。

+ + +

replicaUpdateMinChangesを0に設定すると、レプリカインデックスの自動更新は無効化されます。

+ +

これらの設定はグローバルに、あるいはREST APIを利用して各デザインドキュメント単位で設定することができます。

+ + +

現在のView更新デーモン設定を取得するには、クラスタ内のノードの管理用ポートに次のURLでアクセスします、http://nodename:8091/settings/viewUpdateDaemon :

+ + +
GET http://Administrator:Password@nodename:8091/settings/viewUpdateDaemon
+
+

現在の更新設定がJSONで返却されます:

+ + +
{
+    "updateInterval":5000,
+    "updateMinChanges":5000,
+    "replicaUpdateMinChanges":5000
+}
+
+ + +

+ 設定を更新するには、変更する値を含むペイロードデータをPOSTで渡します。 + 例えば、更新間隔を10秒に、ドキュメントの変更数を7000に変更する場合: +

+ + +
POST http://nodename:8091/settings/viewUpdateDaemon
+updateInterval=10000&updateMinChanges=7000
+
+ + +

成功すると、変更後の設定がJSONで返却されます。

+ +

updateMinChangesreplicaUpdateMinChangesの設定を個別のデザインドキュメントで明示的に変更するには、デザインドキュメントのoptionsセクションにこれらのパラメータを指定します。例えば:

+ + +
{
+   "_id": "_design/myddoc",
+   "views": {
+      "view1": {
+          "map": "function(doc, meta) { if (doc.value) { emit(doc.value, meta.id);} }"
+      }
+   },
+   "options": {
+       "updateMinChanges": 1000,
+       "replicaUpdateMinChanges": 20000
+   }
+}
+
+

デザインドキュメントのREST APIを利用し、作成時や更新時にこれらの情報を設定できます。 +curlコマンドを利用してこの操作を実行するには:

+ + +
> curl -X POST -v -d 'updateInterval=7000&updateMinChanges=7000' \
+    'http://Administrator:Password@192.168.0.72:8091/settings/viewUpdateDaemon'
+
+ + +

+ 部分的な開発用Viewは自動的に再構築されず、Viewの一貫性を有効にしていても、Viewの一貫性は自動更新の仕組みに依存するため、リバランス実行中には開発用Viewは更新されません。 + 開発用Viewをこの様に更新するのはシステムリソースの無駄遣いになるからです。 +

+ + +
+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Views/views-production.html b/preview/contents/Views/views-production.html new file mode 100644 index 0000000..56d2e12 --- /dev/null +++ b/preview/contents/Views/views-production.html @@ -0,0 +1,93 @@ +プロダクションView
+

プロダクションView

+ + +

プロダクションViewはデプロイされた環境で利用されます。

+ +

+ Couchbaseクラスタの性質と、クラスタにわたって保存されているデータセットのサイズによっては、View開発の影響を制御する必要があります。 + Viewの作成はインデックスを作成するため、インデックスの生成中はサーバの性能を低下させることがあります。 + しかしながら、Viewはまたアクティブに保存された情報に対して開発、構築される必要もあります。 +

+ +

+ Viewの生成とテスト、およびプロダクションでのViewの開発の両方をサポートするため、Couchbase Serverは、「開発」Viewと「プロダクション」Viewという2つの異なるViewタイプをサポートしています。 + 二つのViewタイプは同じように動作しますが、操作において異なる目的と制約があります。 +

+ +
    +
  • プロダクションView
  • + +
+ +

プロダクションビューは本番環境での利用に最適化されています。 + プロダクションビューには次の特性があります:

+ +
    +
  • プロダクションビューは、常にそれぞれのバケットの完全なデータセット上で動作します。
  • + +
  • プロダクションビューはWebコンソールもしくはREST APIで作成できます。 + Webコンソールからは、まず開発Viewを作成し、それらをプロダクションViewとしてパブリッシュします。 + REST APIを利用すると、直接プロダクションViewの作成が可能です(開発Viewの作成をスキップします)。
  • + +
  • プロダクションビューはUIで変更することはできません。 + プロダクションビューの処理結果にのみアクセス可能です。 + プロダクションビューに変更を加えるには、開発ビューにコピーしてから変更し、再度パブリッシュする必要があります。
  • + +
+ +

REST APIを利用してビューを更新することもできますが、プロダクションのデザインドキュメントを更新すると、含まれる全てのビューが即座に無効になります。

+ +
    +
  • プロダクションビューは開発ビューとは異なるURLでアクセスします。
  • + +
+ +

二つの異なるビュータイプは、以下の図に示すビュー開発における典型的なワークフローのために存在します:

+ + +
+ +
+ + +

上記の図は次の手順を示しています:

+ +
    +
  1. 開発ビューを作成し、サンプルのビュー出力を確認します。
  2. + +
  3. 目的の結果となるようビュー定義を更新し、ビューが完成するまでこのプロセスを繰り返します。 + この段階で、クライアントアプリケーションからライブラリを利用してビューにアクセスし、ニーズに合うか確認できます。
  4. + +
  5. ビュー定義が完了したら、クラスタ全体のデータセットにビューを適用します。
  6. + +
  7. 開発ビューをプロダクションビューにプッシュします。 + 開発ビューをプロダクションビューに移動し、インデックス名を変更します(インデックスの再作成は必要ありません)。
  8. + +
  9. プロダクションビューの利用を開始します。
  10. + +
+ +

個々のビューは、デザインドキュメントの一部として作成されます。 + 各デザインドキュメントは、複数のビューを持つことができ、各Couchbaseのバケットは複数のデザインドキュメントを持つことができます。 + データに対するさまざまなインデックスを作成する際に、開発用とプロダクション用のビューの両方を保持することができます。

+ + + + +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Views/views-querySample.html b/preview/contents/Views/views-querySample.html new file mode 100644 index 0000000..15fbcd2 --- /dev/null +++ b/preview/contents/Views/views-querySample.html @@ -0,0 +1,850 @@ +View and query examples
+

View and query examples

+ + +

This section provides general information and query examples.

+ +

Building views and querying the indexes they generate is a combined process based both on the + document structure and the view definition. + Writing an effective view to query your data may + require changing or altering your document structure, or creating a more complex view in order + to allow the specific selection of the data through the querying mechanism.

+ +

For background and examples, the following selections provide a number of different scenarios + and examples have been built to demonstrate the document structures, views and querying + parameters required for different situations.

+ + + + + +

General advice

There are some general points and advice for writing + all views that apply irrespective of the document structure, query format, or view + content.

+
    +
  • Do not assume the field will exist in all documents.
  • + +
+

Fields may be missing from your document, or may only be supported in specific + document types. Use an if test to identify problems. For example:

+ + +
if (document.firstname)...
+ +
    +
  • View output is case sensitive.
  • + +
+

The value emitted by the emit() function is case sensitive. Emitting + a field value of ‘Martin’ but specifying a key value of ‘martin’ will not + match the data. Emitted data, and the key selection values, should be normalized to + eliminate potential problems. For example:

+ +
emit(doc.firstname.toLowerCase(),null);
+ +
    +
  • Number formatting
  • + +
+

Numbers within JavaScript may inadvertently be converted and output as strings. To + ensure that data is correctly formatted, the value should be explicitly converted. For + example:

+ +
emit(parseInt(doc.value,10),null);
+

The + parseInt() built-in function will convert a supplied value to an integer. + The parseFloat() function can be used for floating-point + numbers.

+
+ + + + +

Validating document type

+

If your dataset includes documents that may be either JSON or binary, then you do not want + to create a view that outputs individual fields for non-JSON documents. You can fix this by + using a view that checks the metadata type field before outputting the JSON + view + information:

+
function(doc,meta) {
+    if (meta.type == "json") {
+        emit(doc.firstname.toLowerCase(),null);
+    }
+}
+

In + the above example, the emit() function will only be called on a valid JSON + document. Non-JSON documents will be ignored and not included in the view + output.

+
+ + + + +

Document ID (primary) index

+

To create a ‘primary key’ index, i.e. an index that contains a list of every document + within the database, with the document ID as the key, you can create a simple + view:

+
function(doc,meta)
+{
+  emit(meta.id,null);
+}
+
+

This + enables you to iterate over the documents stored in the database.

+

This will provide + you with a view that outputs the document ID of every document in the bucket using the + document ID as the key.

+

The view can be useful for obtaining groups or ranges of + documents based on the document ID, for example to get documents with a specific ID + prefix:

+
?startkey="object"&endkey="object\u0000"
+
+

Or + to obtain a list of objects within a given + range:

+
?startkey="object100"&endkey="object199"
+
+

For + all views, the document ID is automatically included as part of the view response. But the + without including the document ID within the key emitted by the view, it cannot be used as a + search or querying mechanism.

+
+ + + + +

Secondary index

+

The simplest form of view is to create an index against a single field from the documents + stored in your database.

+

For example, given the document + structure:

+
{
+    "firstname": "Martin",
+    "lastname": "Brown"
+}
+
+

A + view to support queries on the firstname field could be defined as + follows:

+
function(doc, meta)
+{
+  if (doc.firstname)
+  {
+     emit(doc.firstname.toLowerCase(),null);
+  }
+}
+
+

The + view works as follows for each document:

+
    +
  • Only outputs a record if the document contains a firstname + field.

    +
  • + +
  • Converts the content of the firstname field to lowercase.

    +
  • + +
+

Queries can now be specified by supplying a string converted to lowercase. For + example:

+
?key="martin"
+
+

Will return all + documents where the firstname field contains ‘Martin’, regardless of the + document field capitalization.

+
+ + + + +

Using expiration metadata

+

The metadata object makes it very easy to create and update different views on your data + using information outside of the main document data. For example, you can use the expiration + field within a view to get the list of recently active sessions in a system.

+

Using the + following map() function, which uses the expiration as part of the emitted + data.

+
function(doc, meta)
+{
+  if (doc.type && doc.type == "session")
+  {
+    emit(meta.expiration, doc.nickname)
+  }
+}
+
+

If + you have sessions which are saved with a TTL, this will allow you to give a view of who was + recently active on the service.

+
+ + + + +

Emitting multiple rows

The emit() function is used to + create a record of information for the view during the map phase, but it can be called + multiple times within that map phase to allowing querying over more than one source of + information from each stored document.

+

An example of this is when the source documents + contain an array of information. For example, within a recipe document, the list of + ingredients is exposed as an array of objects. By iterating over the ingredients, an index + of ingredients can be created and then used to find recipes by + ingredient.

+
{
+    "title": "Fried chilli potatoes",
+    "preptime": "5"
+    "servings": "4",
+    "totaltime": "10",
+    "subtitle": "A new way with chips.",
+    "cooktime": "5",
+    "ingredients": [
+        {
+            "ingredtext": "chilli powder",
+            "ingredient": "chilli powder",
+            "meastext": "3-6 tsp"
+        },
+        {
+            "ingredtext": "potatoes, peeled and cut into wedges",
+            "ingredient": "potatoes",
+            "meastext": "900 g"
+        },
+        {
+            "ingredtext": "vegetable oil for deep frying",
+            "ingredient": "vegetable oil for deep frying",
+            "meastext": ""
+        }
+    ],
+}
+
+

The + view can be created using the following map() + function:

+
function(doc, meta)
+{
+  if (doc.ingredients)
+  {
+    for (i=0; i < doc.ingredients.length; i++)
+    {
+        emit(doc.ingredients[i].ingredient, null);
+    }
+  }
+}
+
+

To + query for a specific ingredient, specify the ingredient as a + key:

+
?key="carrot"
+
+

The keys + parameter can also be used in this situation to look for recipes that contain multiple + ingredients. For example, to look for recipes that contain either “potatoes” or “chilli + powder” you would + use:

+
?keys=["potatoes","chilli powder"]
+
+

This + will produce a list of any document containing either ingredient. A simple count of the + document IDs by the client can determine which recipes contain all three.

+

The output + can also be combined. For example, to look for recipes that contain carrots and can be + cooked in less than 20 minutes, the view can be rewritten + as:

+
function(doc, meta)
+{
+  if (doc.ingredients)
+  {
+    for (i=0; i < doc.ingredients.length; i++)
+    {
+      if (doc.ingredients[i].ingredtext &amp;&amp; doc.totaltime)
+      {
+        emit([doc.ingredients[i].ingredtext, parseInt(doc.totaltime,10)], null);
+      }
+    }
+  }
+}
+
+

In + this map function, an array is output that generates both the ingredient name, and the total + cooking time for the recipe. To perform the original query, carrot recipes requiring less + than 20 minutes to + cook:

+
?startkey=["carrot",0]&endkey=["carrot",20]
+
+

This + generates the following + view:

+
{"total_rows":26471,"rows":[
+{"id":"Mangoandcarrotsmoothie","key":["carrots",5],"value":null},
+{"id":"Cheeseandapplecoleslaw","key":["carrots",15],"value":null}
+]
+}
+
+
+ + + + +

Date and time selection

For date and time selection, consideration + must be given to how the data will need to be selected when retrieving the information. This + is particularly true when you want to perform log roll-up or statistical collection by using + a reduce function to count or quantify instances of a particular event over + time.

+

Examples of this in action include querying data over a specific range, on + specific day or date combinations, or specific time periods. Within a traditional relational + database it is possible to perform an extraction of a specific date or date range by storing + the information in the table as a date type.

+

Within a map/reduce, the effect can be + simulated by exposing the date into the individual components at the level of detail that + you require. For example, to obtain a report that counts individual log types over a period + identifiable to individual days, you can use the following map() + function:

+
function(doc, meta) {
+    emit([doc.year, doc.mon, doc.day, doc.logtype], null);
+}
+

By + incorporating the full date into the key, the view provides the ability to search for + specific dates and specific ranges. By modifying the view content you can simplify this + process further. For example, if only searches by year/month are required for a specific + application, the day can be omitted.

+

And with the corresponding + reduce() built-in of _count, you can perform a number of + different queries. Without any form of data selection, for example, you can use the + group_level parameter to summarize down as far as individual day, month, + and year. Additionally, because the date is explicitly output, information can be selected + over a specific range, such as a specific + month:

+
endkey=[2010,9,30]&group_level=4&startkey=[2010,9,0]
+

Here + the explicit date has been specified as the start and end key. The + group_level is required to specify roll-up by the date and log + type.

+

This will generate information similar to + this:

+
{"rows":[
+{"key":[2010,9,1,"error"],"value":5},
+{"key":[2010,9,1,"warning"],"value":10},
+{"key":[2010,9,2,"error"],"value":8},
+{"key":[2010,9,2,"warning"],"value":9},
+{"key":[2010,9,3,"error"],"value":16},
+{"key":[2010,9,3,"warning"],"value":8},
+{"key":[2010,9,4,"error"],"value":15},
+{"key":[2010,9,4,"warning"],"value":11},
+{"key":[2010,9,5,"error"],"value":6},
+{"key":[2010,9,5,"warning"],"value":12}
+]
+}
+

Additional + granularity, for example down to minutes or seconds, can be achieved by adding those as + further arguments to the map + function:

+
function(doc, meta)
+{
+    emit([doc.year, doc.mon, doc.day, doc.hour, doc.min, doc.logtype], null);
+}
+

The + same trick can also be used to output based on other criteria. For example, by day of the + week, week number of the year or even by + period:

+
function(doc, meta) {
+  if (doc.mon)
+  {
+    var quarter = parseInt((doc.mon - 1)/3,10)+1;
+
+    emit([doc.year, quarter, doc.logtype], null);
+  }
+}
+

To + get more complex information, for example a count of individual log types for a given date, + you can combine the map() and reduce() stages to provide + the collation.

+

For example, by using the following map() function we + can output and collate by day, month, or year as before, and with data selection at the date + level.

+
function(doc, meta) {
+    emit([doc.year, doc.mon, doc.day], doc.logtype);
+}
+
+

For + convenience, you may wish to use the dateToArray() function, which converts + a date object or string into an array. For example, if the date has been stored within the + document as a single + field:

+
function(doc, meta) {
+    emit(dateToArray(doc.date), doc.logtype);
+}
+
+

For + more information, see dateToArray().

+

Using the following + reduce() function, data can be collated for each individual logtype for + each day within a single record of + output.

+
function(key, values, rereduce)
+{
+  var response = {"warning" : 0, "error": 0, "fatal" : 0 };
+  for(i=0; i<values.length; i++)
+  {
+    if (rereduce)
+    {
+      response.warning = response.warning + values[i].warning;
+      response.error = response.error + values[i].error;
+      response.fatal = response.fatal + values[i].fatal;
+    }
+    else
+    {
+      if (values[i] == "warning")
+      {
+        response.warning++;
+      }
+      if (values[i] == "error" )
+      {
+        response.error++;
+      }
+      if (values[i] == "fatal" )
+      {
+        response.fatal++;
+      }
+    }
+  }
+  return response;
+}
+

When + queried using a group_level of two (by month), the following output is + produced:

+
{"rows":[
+{"key":[2010,7], "value":{"warning":4,"error":2,"fatal":0}},
+{"key":[2010,8], "value":{"warning":4,"error":3,"fatal":0}},
+{"key":[2010,9], "value":{"warning":4,"error":6,"fatal":0}},
+{"key":[2010,10],"value":{"warning":7,"error":6,"fatal":0}},
+{"key":[2010,11],"value":{"warning":5,"error":8,"fatal":0}},
+{"key":[2010,12],"value":{"warning":2,"error":2,"fatal":0}},
+{"key":[2011,1], "value":{"warning":5,"error":1,"fatal":0}},
+{"key":[2011,2], "value":{"warning":3,"error":5,"fatal":0}},
+{"key":[2011,3], "value":{"warning":4,"error":4,"fatal":0}},
+{"key":[2011,4], "value":{"warning":3,"error":6,"fatal":0}}
+]
+}
+

The + input includes a count for each of the error types for each month. Note that because the key + output includes the year, month and date, the view also supports explicit querying while + still supporting grouping and roll-up across the specified group. For example, to show + information from 15th November 2010 to 30th April 2011 using the following + query:

+
?endkey=[2011,4,30]&group_level=2&startkey=[2010,11,15]
+
+

Which + generates the following + output:

+
{"rows":[
+{"key":[2010,11],"value":{"warning":1,"error":8,"fatal":0}},
+{"key":[2010,12],"value":{"warning":3,"error":4,"fatal":0}},
+{"key":[2011,1],"value":{"warning":8,"error":2,"fatal":0}},
+{"key":[2011,2],"value":{"warning":4,"error":7,"fatal":0}},
+{"key":[2011,3],"value":{"warning":4,"error":4,"fatal":0}},
+{"key":[2011,4],"value":{"warning":5,"error":7,"fatal":0}}
+]
+}
+

Keep + in mind that you can create multiple views to provide different views and queries on your + document data. In the above example, you could create individual views for the limited + datatypes of logtype to create a warningsbydate view.

+
+ + + + +

Selective record output

If you are storing different document types + within the same bucket, then you may want to ensure that you generate views only on a + specific record type within the map() phase. This can be achieved by using + an if statement to select the record.

+

For example, if you are storing + blog ‘posts’ and ‘comments’ within the same bucket, then a view on the blog posts could be + created using the following + map:

+
function(doc, meta) {
+    if (doc.title && doc.type && doc.date &&
+        doc.author && doc.type == 'post')
+    {
+        emit(doc.title, [doc.date, doc.author]);
+    }
+}
+
+

The + same solution can also be used if you want to create a view over a specific range or value + of documents while still allowing specific querying structures. For example, to filter all + the records from the statistics logging system over a date range that are of the type error + you could use the following map() + function:

+
function(doc, meta) {
+    if (doc.logtype == 'error')
+    {
+       emit([doc.year, doc.mon, doc.day],null);
+    }
+}
+
+

The + same solution can also be used for specific complex query types. For example, all the + recipes that can be cooked in under 30 minutes, made with a specific + ingredient:

+
function(doc, meta)
+{
+  if (doc.totaltime &amp;&amp; doc.totaltime <= 20)
+  {
+    if (doc.ingredients) {
+      for (i=0; i < doc.ingredients.length; i++)
+      {
+        if (doc.ingredients[i].ingredtext)
+        {
+          emit(doc.ingredients[i].ingredtext, null);
+        }
+      }
+    }
+  }
+}
+
+

The + above function provides for much quicker and simpler selection of recipes by using a query and + the key parameter, instead of having to work out the range that may be + required to select recipes when the cooking time and ingredients are generated by the + view.

+

These selections are application specific, but by producing different views for + a range of appropriate values, for example 30, 60, or 90 minutes, recipe selection can be + much easier at the expense of updating additional view indexes.

+
+ + + + +

Sorting on reduce values

+

The sorting algorithm within the view system outputs information ordered by the generated + key within the view, and therefore it operates before any reduction takes place. + Unfortunately, it is not possible to sort the output order of the view on computed reduce + values, as there is no post-processing on the generated view information.

+

To sort + based on reduce values, you must access the view content with reduction enabled from a + client, and perform the sorting within the client application.

+
+ + + + +

Solutions for simulating joins

+

Joins between data, even when the documents being examined are contained within the same + bucket, are not possible directly within the view system. However, you can simulate this by + making use of a common field used for linking when outputting the view information. For + example, consider a blog post system that supports two different record types, ‘blogpost’ + and ‘blogcomment’. The basic format for ‘blogpost’ + is:

+
{
+    "type" : "post",
+    "title" : "Blog post"
+    "categories" : [...],
+    "author" : "Blog author"
+    ...
+}
+
+

The + corresponding comment record includes the blog post ID within the document + structure:

+
{
+    "type" : "comment",
+    "post_id" : "post_3454"
+    "author" : "Comment author",
+    "created_at" : 123498235
+...
+}
+
+

To + output a blog post and all the comment records that relate to the blog post, you can use the + following + view:

+
function(doc, meta)
+{
+    if (doc.post_id && doc.type && doc.type == "post")
+    {
+        emit([doc.post_id, null], null);
+    }
+    else if (doc.post_id && doc.created_at && doc.type && doc.type == "comment")
+    {
+        emit([doc.post_id, doc.created_at], null);
+    }
+}
+
+

The + view makes use of the sorting algorithm when using arrays as the view key. For a blog post + record, the document ID will be output will a null second value in the array, and the blog + post record will therefore appear first in the sorted output from the view. For a comment + record, the first value will be the blog post ID, which will cause it to be sorted in line + with the corresponding parent post record, while the second value of the array is the date + the comment was created, allowing sorting of the child comments.

+

For + example:

+
{"rows":[
+{"key":["post_219",null],       "value":{...}},
+{"key":["post_219",1239875435],"value":{...}},
+{"key":["post_219",1239875467],"value":{...}},
+]
+}
+
+

Another + alternative is to make use of a multi-get operation within your client through the main + Couchbase SDK interface, which should load the data from cache. This lets you structure + your data with the blog post containing an array of the of the child comment records. For + example, the blog post structure might + be:

+
{
+    "type" : "post",
+    "title" : "Blog post"
+    "categories" : [...],
+    "author" : "Blog author",
+    "comments": ["comment_2298","comment_457","comment_4857"],
+    ...
+}
+
+

To + obtain the blog post information and the corresponding comments, create a view to find the + blog post record, and then make a second call within your client SDK to get all the comment + records from the Couchbase Server cache.

+
+ + + + +

Simulating transactions

+

Couchbase Server does not support transactions, but the effect can be simulated by writing + a suitable document and view definition that produces the effect while still only requiring + a single document update to be applied.

+

For example, consider a typical banking + application, the document structure could be as + follows:

+
{
+   "account" : "James",
+   "value" : 100
+}
+
+

A + corresponding record for another + account:

+
{
+   "account" : "Alice",
+   "value" : 200
+}
+
+

To + get the balance of each account, the following map() + :

+
function(doc, meta) {
+    if (doc.account && doc.value)
+    {
+      emit(doc.account,doc.value);
+    }
+}
+
+

The + reduce() function can use the built-in _sum + function.

+

When queried, using a group_level of 1, the balance of the + accounts is + displayed:

+
{"rows":[
+{"key":"Alice","value":200},
+{"key":"James","value":100}
+]
+}
+
+

Money + in an account can be updated just by adding another record into the system with the account + name and value. For example, adding the + record:

+
{
+   "account" : "James",
+   "value" : 50
+}
+
+

Re-querying + the view produces an updated balance for each + account:

+
{"rows":[
+{"key":"Alice","value":200},
+{"key":"James","value":150}
+]
+}
+
+

However, + if Alice wants to transfer $100 to James, two record updates are required:

+
    +
  1. A record that records an update to Alice’s account to reduce the value by 100.
  2. + +
  3. A record that records an update to James’s account to increase the value by + 100.
  4. + +
+

Unfortunately, the integrity of the transaction could be compromised in the event of a + problem between step 1 and step 2. Alice’s account may be deducted, without updates James’ + record.

+

To simulate this operation while creating (or updating) only one record, a + combination of a transaction record and a view must be used. The transaction record looks + like + this:

+
{
+     "fromacct" : "Alice",
+     "toacct" : "James",
+     "value" : 100
+}
+
+

The + above records the movement of money from one account to another. The view can now be updated + to handle a transaction record and output a row through emit() to update + the value for each + account.

+
function(doc, meta)
+{
+  if (doc.fromacct)
+  {
+    emit(doc.fromacct, -doc.value);
+    emit(doc.toacct, doc.value);
+  }
+  else
+  {
+    emit(doc.account, doc.value);
+  }
+}
+
+

The + above map() effectively generates two fake rows, one row subtracts the + amount from the source account, and adds the amount to the destination account. The + resulting view then uses the reduce() function to sum up the transaction + records for each account to arrive at a final + balance:

+
{"rows":[
+{"key":"Alice","value":100},
+{"key":"James","value":250}
+]
+}
+
+

Throughout + the process, only one record has been created, and therefore transient problems with that + record update can be captured without corrupting or upsetting the existing stored + data.

+
+ + + +

Simulating multi-phase transactions

+

The technique in Simulating Transactions works if your data will allow the use of a view to + effectively roll-up the changes into a single operation. However, if your data and document + structure do not allow it then you can use a multi-phase transaction process to perform the + operation in a number of distinct stages.

+

This method is not reliant on views, but the + document structure and update make it easy to find out if there are ‘hanging’ or trailing + transactions that need to be processed without additional document updates. Using views and + the Observe operation to monitor changes could lead to long wait times during the + transaction process while the view index is updated.

+

To employ this method, you use a + similar transaction record as in the previous example, but use the transaction record to + record each stage of the update process.

+

Start with the same two account + records:

+
{
+   "type" : "account",
+   "account" : "James",
+   "value" : 100,
+   "transactions" : []
+}
+
+

The + record explicitly contains a transactions field which contains an array of + all the currently active transactions on this record.

+

The corresponding record for the + other + account:

+
{
+   "type" : "account",
+   "account" : "Alice",
+   "value" : 200,
+   "transactions" : []
+}
+
+

Now + perform the following operations in sequence:

+ +
    +
  1. Create a new transaction record that records the transaction information:

    { + "type" : "transaction", "fromacct" : "Alice", "toacct" : "James", "value" : 100, + "status" : "waiting" }

    + +

    The core of the transaction record is the same, + the difference is the use of a status field which will be used to + monitor the progress of the transaction.

    +

    Record the ID of the transaction, for + example, transact_20120717163.

    +
  2. + +
  3. Set the value of the status field in the transaction document to + ‘pending’:

    { "type" : "transaction", "fromacct" : "Alice", "toacct" : + "James", "value" : 100, "status" : "pending" }

    +
  4. + +
  5. Find all transaction records in the pending state using a suitable + view:

    function(doc, meta) { if (doc.type && doc.status && + doc.type == "transaction" && doc.status == "pending" ) { + emit([doc.fromacct,doc.toacct], doc.value); } }

    +
  6. + +
  7. Update the record identified in toacct with the transaction + information, ensuring that the transaction is not already pending:

    { "type" : + "account", "account" : "Alice", "value" : 100, "transactions" : + ["transact_20120717163"] }

    +

    Repeat on the other account:

    + +

    + { "type" : "account", "account" : "James", "value" : 200, "transactions" : + ["transact_20120717163"] }

    +
  8. + +
  9. Update the transaction record to mark that the records have been updated:

    { + "type" : "transaction", "fromacct" : "Alice", "toacct" : "James", "value" : 100, + "status" : "committed" }

    +
  10. + +
  11. Find all transaction records in the committed state using a suitable + view:

    function(doc, meta) { if (doc.type && doc.status && + doc.type == "transaction" && doc.status == "committed" ) { emit([doc.fromacct, + doc.toacct], doc.value); } }

    +

    Update the source account record noted in + the transaction and remove the transaction ID:

    +

    { "type" : "account", + "account" : "Alice", "value" : 100, "transactions" : [] }

    +

    Repeat on + the other account:

    +

    { "type" : "account", "account" : "James", "value" : + 200, "transactions" : [] }

    +
  12. + +
  13. Update the transaction record state to ‘done’. This will remove the transaction from the + two views used to identify unapplied, or uncommitted transactions.
  14. + +
+

Within this process, although there are multiple steps required, you can identify at + each step whether a particular operation has taken place or not.

+

For example, if the + transaction record is marked as ‘pending’, but the corresponding account records do not + contain the transaction ID, then the record still needs to be updated. Since the account + record can be updated using a single atomic operation, it is easy to determine if the record + has been updated or not.

+

The result is that any sweep process that accesses the views + defined in each step can determine whether the record needs updating. Equally, if an + operation fails, a record of the transaction, and whether the update operation has been + applied, also exists, allowing the changes to be reversed and backed out.

+
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Views/views-querying.html b/preview/contents/Views/views-querying.html new file mode 100644 index 0000000..2d3d295 --- /dev/null +++ b/preview/contents/Views/views-querying.html @@ -0,0 +1,961 @@ +Querying views
+

Querying views

+ + +

The content of the key that is generated by the emit() function provides information on + how the data is selected from your view.

+ +

In order to query a view, the view definition must include a suitable map function that + uses the emit() function to generate each row of information.

+ +

The key can be used when querying a view as the selection mechanism, either by using + an:

+ +
    +
  • explicit key — show all the records matching the exact structure of the + supplied key.

    +
  • + +
  • list of keys — show all the records matching the exact structure of each of + the supplied keys (effectively showing keya or keyb or keyc).

    +
  • + +
  • range of keys — show all the records starting with keyA and stopping on the last instance + of keyB.

    +
  • + +
+ +

When querying the view results, a number of parameters can be used to select, limit, order + and otherwise control the execution of the view and the information that is returned.

+ +

When a view is accessed without specifying any parameters, the view will produce results + matching the following:

+ +
    +
  • Full view specification, i.e. all documents are potentially output according to the + view definition.

    +
  • + +
  • Limited to 10 items within the Admin Console, unlimited through the REST + API.

    +
  • + +
  • Reduce function used if defined in the view.

    +
  • + +
  • Items sorted in ascending order (using UTF–8 comparison for strings, natural number + order)

    +
  • + +
+ +

View results and the parameters operate and interact in a specific order. The interaction + directly affects how queries are written and data is selected.

+ + +
+ +
+ + +

The core arguments and selection systems are the same through both the REST API interface, + and the client libraries. The setting of these values differs between different client + libraries, but the argument names and expected and supported values are the same across all + environments.

+ + + + +

Querying

Querying can be performed through the REST API endpoint. + The REST API supports and operates using the core HTTP protocol, and this is the same + system used by the client libraries to obtain the view data.

+ To retrieve views + information, access any server node in a cluster on port 8092.

The following is the HTTP + method and URI used to query + views:

+
GET /[bucket-name]/_design/[ddoc-name]/_view/[view-name]
+

Where:

+
    +
  • bucket-name is the name of the bucket.
  • + +
  • ddoc-name is the name of the design document that contains the view.
  • + +
  • view-name is the name of the corresponding view within the design document.
  • + +
+

Development view, the ddoc-name is prefixed with + dev_. For example, the design document beer is + accessible as a development view using dev_beer.

+

Production views + are accessible using their name only.

+ +

Parameters (optional):

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. Views parameters
ParametersTypeDescription
descendingbooleanReturn the documents in descending by key order.
endkeystringStop returning records when the specified key is reached. Key must be + specified as a JSON value.
endkey_docidstringStop returning records when the specified document ID is + reached.
full_setbooleanUse the full cluster data set (development views only).
groupbooleanGroup the results using the reduce function to a group or single row. + Note: Do not use group with group_level + because they are not compatible.
group_levelnumericSpecify the group level to be used. Note: Do not use + group_level with group because they are + not compatible.
inclusive_endbooleanSpecifies whether the specified end key is included in the result. Note: + Do not use inclusive_end with key or + keys.
keystringReturn only documents that match the specified key. Key must be + specified as a JSON value.
keysarrayReturn only documents that match each of keys specified within the given + array. Key must be specified as a JSON value. Sorting is not applied when + using this option.
limitnumericLimit the number of the returned documents to the specified + number.
on_errorstringSets the response in the event of an error.
Supported values:
    +
  • continue : Continue to generate view information + in the event of an error, including the error information in the + view response stream.
  • + +
  • stop : Stop immediately when an error condition + occurs. No further view information is returned.
  • + +
+
+ +
reducebooleanUse the reduction function.
skipnumericSkip this number of records before starting to return the + results.
stalestringAllow the results from a stale view to be used.
Supported values:
    +
  • false : The server waits for the indexer to + finish the changes that correspond to the current key-value + document set and then returns the latest entries from the view + index.
  • + +
  • ok : The server returns the current entries from + the index file including the stale views.
  • + +
  • update_after : The server returns the current + entries from the index, and then initiates an index update.
  • + +
+
+
startkeystringReturn records with a value equal to or greater than the specified key. + Key must be specified as a JSON value.
startkey_docidstringReturn records starting with the specified document ID.
+
+ +

Curl request syntax:

+ +
GET http://[localhost]:8092/[bucket-name]/_design/[ddoc-name]/_view/[view-name]
+ +

To access a view stored within an SASL password-protected bucket, include the bucket + name and bucket password within the URL of the request:

+ +
GET http://[bucket-name]:[password]@[localhost]:8092/[bucket-name]/_design/[ddoc-name]/_view/[view-name]
+
+ +
Note: Additional arguments to the URL request can be used to select information + from the view, and provide limit, sorting and other options.
+ +

To output only ten items:

+ +
GET http://[localhost]:8092/[bucket-name]/_design/[ddoc-name]/_view/[view-name]?limit=10
+
+ +
Important: The formatting of the URL follows the HTTP specification. The first + argument is separated from the base URL using a question mark ( ? ). + Additional arguments are separated using an ampersand ( & ). + Special characters are quoted or escaped according to the HTTP standard rules.
+ +
+ + + + +

Selecting information

Couchbase Server supports a number of + mechanisms for selecting information returned by the view. Key selection is made after + the view results (including the reduction function) are executed, and after the items in + the view output have been sorted.

+

When specifying keys to the selection mechanism, + the key must be expressed in the form of a JSON value. For example, when specifying a + single key, a string must be quoted (“string”).

+

When specifying the key selection + through a parameter, the keys must match the format of the keys emitted by the view. + Compound keys, for example where an array or hash has been used in the emitted key + structure, the supplied selection value should also be an array or a hash.

+

The + following selection types are supported:

+
    +
  • Explicit Key
  • + +
+

An explicit key can be specified using the parameter key. The view + query will only return results where the key in the view output, and the value supplied + to the key parameter match identically.

+

For example, if you + supply the value “tomato” only records matching exactly “tomato” will be selected + and returned. Keys with values such as “tomatoes” will not be returned.

+
    +
  • Key List
  • + +
+

A list of keys to be output can be specified by supplying an array of values using + the keys parameter. In this instance, each item in the specified array + will be used as explicit match to the view result key, with each array value being + combined with a logical or.

+

For example, if the value specified + to the keys parameter was ["tomato","avocado"], then + all results with a key of ‘tomato’ or ‘avocado’ will be returned.

+

When + using this query option, the output results are not sorted by key. This is because key + sorting of these values would require collating and sorting all the rows before + returning the requested information.

+

In the event of using a compound key, each + compound key must be specified in the query. For example:

+
```
+keys=[["tomato",20],["avocado",20]]
+```
+
+
    +
  • Key Range
  • + +
+

A key range, consisting of a startkey and endkey. + These options can be used individually, or together, as + follows:

+
* `startkey` only
+
+  Output does not start until the first occurrence of `startkey`, or a value
+  greater than the specified value, is seen. Output will then continue until the
+  end of the view.
+
+* `endkey` only
+
+  Output starts with the first view result, and continues until the last
+  occurrence of `endkey`, or until the emitted value is greater than the computed
+  lexical value of `endkey`.
+
+* `startkey` and `endkey`
+
+  Output of values does not start until `startkey` is seen, and stops when the
+  last occurrence of `endkey` is identified.
+
+

When + using endkey, the inclusive_end option specifies + whether output stops after the last occurrence of the specified endkey + (the default). If set to false, output stops on the last result before the specified + endkey is seen.

+

The matching algorithm works on partial + values, which can be used to an advantage when searching for ranges of keys.

+ + +
Note: Do not use the inclusive_end parameter with key + or keys parameters. + The inclusive_end parameter is not designed to work with key + or keys because it is an attribute of range operations.
+ + + +
+ + + + +

Selecting compound information by key or keys

If you are generating + a compound key within your view, for example when outputting a date split into + individually year, month, day elements, then the selection value must exactly match the + format and size of your compound key. The value of key or + keys must exactly match the output key structure.

+ + + +

For example, + with the view + data:

+
{"total_rows":5693,"rows":[
+{"id":"1310653019.12667","key":[2011,7,14,14,16,59],"value":null},
+{"id":"1310662045.29534","key":[2011,7,14,16,47,25],"value":null},
+{"id":"1310668923.16667","key":[2011,7,14,18,42,3],"value":null},
+{"id":"1310675373.9877","key":[2011,7,14,20,29,33],"value":null},
+{"id":"1310684917.60772","key":[2011,7,14,23,8,37],"value":null},
+{"id":"1310693478.30841","key":[2011,7,15,1,31,18],"value":null},
+{"id":"1310694625.02857","key":[2011,7,15,1,50,25],"value":null},
+{"id":"1310705375.53361","key":[2011,7,15,4,49,35],"value":null},
+{"id":"1310715999.09958","key":[2011,7,15,7,46,39],"value":null},
+{"id":"1310716023.73212","key":[2011,7,15,7,47,3],"value":null}
+]
+}
+
+

Using + the key selection mechanism you must specify the entire key value, + i.e.:

+
?key=[2011,7,15,7,47,3]
+
+

If you + specify a value, such as only the + date:

+
?key=[2011,7,15]
+
+

The view will + return no records, since there is no exact key match. Instead, you must use a range that + encompasses the information range you want to + output:

+
?startkey=[2011,7,15,0,0,0]&endkey=[2011,7,15,99,99,99]
+
+

This + will output all records within the specified range for the specified date.

+
+ + + + +

Partial selection and key ranges

Matching of the key value has a + precedence from right to left for the key value and the supplied + startkey and/or endkey. Partial strings may + therefore be specified and return specific information.

+

For example, given the + view + data:

+
"a",
+ "aa",
+ "bb",
+ "bbb",
+ "c",
+ "cc",
+ "ccc"
+ "dddd"
+
+

Specifying + a startkey parameter with the value “aa” will return the last seven + records, including + “aa”:

+
"aa",
+ "bb",
+ "bbb",
+ "c",
+ "cc",
+ "ccc",
+ "dddd"
+
+

Specifying + a partial string to startkey will trigger output of the selected values + as soon as the first value or value greater than the specified value is identified. For + strings, this partial match (from left to right) is identified. For example, specifying + a startkey of “d” will + return:

+
"dddd"
+
+

This is because the first + match is identified as soon as the a key from a view row matches the supplied + startkey value from left to right. The supplied single + character matches the first character of the view output.

+

When comparing larger + strings and compound values the same matching algorithm is used. For example, searching + a database of ingredients and specifying a startkey of “almond” will + return all the ingredients, including “almond”, “almonds”, and “almond + essence”.

+

To match all of the records for a given word or value across the entire + range, you can use the null value in the endkey parameter. For example, + to search for all records that start only with the word “almond”, you specify a + startkey of “almond”, and an endkey of “almond\u02ad” (i.e. with the + last Latin character at the end). If you are using Unicode strings, you may want to use + “\uefff”.

+
startkey="almond"&endkey="almond\u02ad"
+
+

The + precedence in this example is that output starts when ‘almond’ is seen, and stops when + the emitted data is lexically greater than the supplied endkey. + Although a record with the value “almond\02ad” will never be seen, the emitted data will + eventually be lexically greater than “almond\02ad” and output will stop.

+

In + effect, a range specified in this way acts as a prefix with all the data being output + that match the specified + prefix.

+
+ + + + +

Partial selection with compound keys

Compound keys, such as arrays + or hashes, can also be specified in the view output, and the matching precedence can be + used to provide complex selection ranges. For example, if time data is emitted in the + following + format:

+
[year,month,day,hour,minute]
+
+

Then + precise date (and time) ranges can be selected by specifying the date and time in the + generated data. For example, to get information between 1st April 2011, 00:00 and 30th + September 2011, + 23:59:

+
?startkey=[2011,4,1,0,0]&endkey=[2011,9,30,23,59]
+
+

The + flexible structure and nature of the startkey and + endkey values enable selection through a variety of range + specifications. For example, you can obtain all of the data from the beginning of the + year until the 5th March + using:

+
?startkey=[2011]&endkey=[2011,3,5,23,59]
+
+

You + can also examine data from a specific date through to the end of the + month:

+
?startkey=[2011,3,16]&endkey=[2011,3,99]
+
+

In + the above example, the value for the day element of the array is an + impossible value, but the matching algorithm will identify when the emitted value is + lexically greater than the supplied endkey value, and information + selected for output will be stopped.

+

A limitation of this structure is that it is + not possible to ignore the earlier array values. For example, to select information from + 10am to 2pm each day, you cannot use this parameter + set:

+
?startkey=[null,null,null,10,0]&endkey=[null,null,null,14,0]
+
+

In + addition, because selection is made by a outputting a range of values based on the start + and end key, you cannot specify range values for the date portion of the + query:

+
?startkey=[0,0,0,10,0]&endkey=[9999,99,99,14,0]
+
+

This + will instead output all the values from the first day at 10am to the last day at + 2pm.

+
+ + + + +

Pagination

Pagination over results can be achieved by using the + skip and limit parameters. For example, to get the + first 10 records from the + view:

+
?limit=10
+
+

The next ten records can + obtained by + specifying:

+
?skip=10&limit=10
+
+

On the + server, the skip option works by executing the query and literally + iterating over the specified number of output records specified by + skip, then returning the remainder of the data up until the specified + limit records are reached, if the limit parameter + is specified.

+

When paginating with larger values for skip, the + overhead for iterating over the records can be significant. A better solution is to + track the document id output by the first query (with the limit + parameter). You can then use startkey_docid to specify the last + document ID seen, skip over that record, and output the next ten + records.

+

Therefore, the paging sequence is, for the first + query:

+
?startkey="carrots"&limit=10
+
+

Record + the last document ID in the generated output, then + use:

+
?startkey="carrots"&startkey_docid=DOCID&skip=1&limit=10
+
+

When + using startkey_docid you must specify the startkey + parameter to specify the information being searched for. By using the + startkey_docid parameter, Couchbase Server skips through the B-Tree + index to the specified document ID. This is much faster than the skip/limit example + shown + above.

+
+ + + + +

Grouping in queries

If you have specified an array as your compound + key within your view, then you can specify the group level to be applied to the query + output when using a reduce().

+

When grouping is enabled, the view + output is grouped according to the key array, and you can specify the level within the + defined array that the information is grouped by. You do this by specifying the index + within the array by which you want the output grouped using the + group_level parameter.

+ + +
+ +
+ + +

The group_level parameter specifies the + array index (starting at 1) at which you want the grouping occur, and generate a unique + value based on this value that is used to identify all the items in the view output that + include this unique value:

+
    +
  • A group level of 0 groups by the entire dataset (as if no array + exists).

    +
  • + +
  • A group level of 1 groups the content by the unique value of the + first element in the view key array. For example, when outputting a date split by + year, month, day, hour, minute, each unique year will be output.

    +
  • + +
  • A group level of 2 groups the content by the unique value of the + first and second elements in the array. With a date, this outputs each unique year + and month, including all records with that year and month into each + group.

    +
  • + +
  • A group level of 3 groups the content by the unique value of the + first three elements of the view key array. In a date this outputs each unique + date (year, month, day) grouping all items according to these first three + elements.

    +
  • + +
+

The grouping will work for any output structure where you have output an compound + key using an array as the output value for the + key.

+
+ + + + +

Selection when grouping

When using grouping and selection using the + key, keys, or startkey / + endkey parameters, the query value should match at least the format + (and element count) of the group level that is being queried.

+

For example, using + the following map() function to output information by date as an + array:

+
function(doc, meta)
+{
+  emit([doc.year, doc.mon, doc.day], doc.logtype);
+}
+
+

If + you specify a group_level of 2 then you must specify a + key using at least the year and month information. For example, you can specify an + explicit key, such as [2012,8] + :

+
?group=true&group_level=2&key=[2012,8]
+
+

You + can query it for a + range:

+
?group=true&group_level=2&startkey=[2012,2]&endkey=[2012,8]
+
+

You + can also specify a year, month and day, while still grouping at a higher level. For + example, to group by year/month while selecting by specific + dates:

+
?group=true&group_level=2&startkey=[2012,2,15]&endkey=[2012,8,10]
+
+

Specifying + compound keys that are shorter than the specified group level may output unexpected + results due to the selection mechanism and the way startkey and + endkey are used to start and stop the selection of output + rows.

+
+ + + + +

Ordering

All view results are automatically output sorted, with the + sorting based on the content of the key in the output view. Views are sorted using a + specific sorting format, with the basic order for all basic and compound follows as + follows:

+
    +
  • null

    +
  • + +
  • false

    +
  • + +
  • true

    +
  • + +
  • Numbers

    +
  • + +
  • Text (case sensitive, lowercase first, UTF–8 order)

    +
  • + +
  • Arrays (according to the values of each element, in order)

    +
  • + +
  • Objects (according to the values of keys, in key order)

    +
  • + +
+

The natural sorting is therefore by default close to natural sorting order both + alphabetically (A-Z) and numerically (0–9).

+

There is no collation or foreign + language support. Sorting is always according to the above rules based on UTF–8 + values.

+

You can alter the direction of the sorting (reverse, highest to lowest + numerically, Z-A alphabetically) by using the descending option. When + set to true, this reverses the order of the view results, ordered by their + key.

+

Because selection is made after sorting the view results, if you configure + the results to be sorted in descending order and you are selecting information using a + key range, then you must also reverse the startkey and + endkey parameters. For example, if you query ingredients where the + start key is ‘tomato’ and the end key is ‘zucchini’, for + example:

+
?startkey="tomato"&endkey="zucchini"
+
+

The + selection will operate, returning information when the first key matches ‘tomato’ and + stopping on the last key that matches ‘zucchini’.

+

If the return order is + reversed:

+
?descending=true&startkey="tomato"&endkey="zucchini"
+
+

The + query will return only entries matching ‘tomato’. This is because the order will be + reversed, ‘zucchini’ will appear first, and it is only when the results contain ‘tomato’ + that any information is returned.

+

To get all the entries that match, the + startkey and endkey values must also be + reversed:

+
?descending=true&startkey="zucchini"&endkey="tomato"
+
+

The + above selection will start generating results when ‘zucchini’ is identified in the key, + and stop returning results when ‘tomato’ is identified in the key.

+

View output and + selection are case sensitive. Specifying the key ‘Apple’ will not return ‘apple’ or + ‘APPLE’ or other case differences. Normalizing the view output and query input to all + lowercase or upper case will simplify the process by eliminating the case + differences.

+
+ + + + +

Understanding letter ordering in views

Couchbase Server uses a + Unicode collation algorithm to order letters, so you should be aware of how this + functions. Most developers are typically used to Byte order, such as that found in ASCII + and which is used in most programming languages for ordering strings during string + comparisons.

+

The following shows the order of precedence used in Byte order, such + as ASCII:

+
123456890 < A-Z < a-z
+
+

This + means any items that start with integers will appear before any items with letters; any + items that beginning with capital letters will appear before items in lower case + letters. This means the item named “Apple” will appear before “apple” and the item + “Zebra” will appear before “apple”. Compare this with the order of precedence used in + Unicode collation, which is used in Couchbase + Server:

+
123456790 < aAbBcCdDeEfFgGhH...
+
+

Notice + again that items that start with integers will appear before any items with letters. + However, in this case, the lowercase and then uppercase of the same letter are grouped + together. This means that that if “apple” will appear before “Apple” and would also + appear before “Zebra.” In addition, be aware that with accented characters will follow + this + ordering:

+
a < á < A < Á < b
+
+

This + means that all items starting with “a” and accented variants of the letter will + occur before “A” and any accented variants of “A.”

+

Ordering + Example

+

In Byte order, keys in an index would appear as + follows:

+
"ABC123" < "ABC223" < "abc123" < "abc223" < "abcd23" < "bbc123" < "bbcd23"
+
+

The + same items will be ordered this way by Couchbase Server under Unicode + collation:

+
"abc123" < "ABC123" < "abc223" < "ABC223" < "abcd23" < "bbc123" < "bbcd23"
+
+

This + is particularly important for you to understand if you query Couchbase Server with a + startkey and endkey to get back a range of results. + The items you would retrieve under Byte order are different compared to Unicode + collation.

+ + +

Ordering and Query Example

+

This + following example demonstrates Unicode collation in Couchbase Server and the impact on + query results returned with a startkey and endkey. It + is based on the beer-sample database provided with Couchbase Server. +

+

Imagine you want to retrieve all breweries with names starting + with uppercase Y. Your query parameters would appear as + follows:

+
startkey="Y"&endkey="z"
+
+

If + you want breweries starting with lowercase y or uppercase Y, you would provides a + query as + follows:

+
startkey="y"&endkey="z"
+
+

This + will return all names with lower case Y and items up to, but not including lowercase z, + thereby including uppercase Y as well. To retrieve the names of breweries starting with + lowercase y only, you would terminate your range with capital + Y:

+
startkey="y"&endkey="Y"
+
+

As it + happens, the sample database does not contain any results because there are no beers in + it which start with lowercase y.

+
+ + + + +

Error control

There are a number of parameters that can be used to + help control errors and responses during a view query.

+
    +
  • on_error
  • + +
+

The on_error parameter specifies whether the view results will be + terminated on the first error from a node, or whether individual nodes can fail and + other nodes return information.

+

When returning the information generated by a view + request, the default response is for any raised error to be included as part of the JSON + response, but for the view process to continue. This permits for individual nodes within + the Couchbase cluster to timeout or fail, while still generating the requested view + information.

+

In this instance, the error is included as part of the JSON + returned:

+ + +

+{
+   "errors" : [
+      {
+         "from" : "http://192.168.1.80:9503/_view_merge/?stale=false",
+         "reason" : "req_timedout"
+      },
+      {
+         "from" : "http://192.168.1.80:9502/_view_merge/?stale=false",
+         "reason" : "req_timedout"
+      },
+      {
+         "from" : "http://192.168.1.80:9501/_view_merge/?stale=false",
+         "reason" : "req_timedout"
+      }
+   ],
+   "rows" : [
+      {
+         "value" : 333280,
+         "key" : null
+      }
+   ]
+}
+
+ +

You + can alter this behavior by using the on_error argument. The default + value is continue. If you set this value to stop then + the view response will cease the moment an error occurs. The returned JSON will contain + the error information for the node that returned the first error. For + example:

+
```
+{
+   "errors" : [
+      {
+         "from" : "http://192.168.1.80:9501/_view_merge/?stale=false",
+         "reason" : "req_timedout"
+      }
+   ],
+   "rows" : [
+      {
+         "value" : 333280,
+         "key" : null
+      }
+   ]
+}
+```
+
+
+ + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/Views/views-schemaless.html b/preview/contents/Views/views-schemaless.html new file mode 100644 index 0000000..d6c20f5 --- /dev/null +++ b/preview/contents/Views/views-schemaless.html @@ -0,0 +1,72 @@ +Views in a schema-less database
+

Views in a schema-less database

+ + +

A schema-less database along with view definitions provide for a flexible document structure.

+ +

One of the primary advantages of the document-based storage and the use of map/reduce views + for querying the data is that the structure of the stored documents does not need to be + predeclared, or even consistent across multiple documents.

+ +

Instead, the view can cope with and determine the structure of the incoming documents that + are stored in the database, and the view can then reformat and restructure this data during + the map/reduce stage. This simplifies the storage of information, both in the initial format, + and over time, as the format and structure of the documents can change over time.

+ +

For example, you could start storing name information using the following JSON structure:

+ +
{
+   "email" : "mc@example.org",
+   "name" : "Martin Brown"
+}
+
+ +

A view can be defined that outputs the email and name:

+ +
function(doc, meta)
+{
+    emit([doc.name, doc.email], null);
+}
+
+ +

This generates an index containing the name and email information. Over time, the application + is adjusted to store the first and last names separately:

+ +
{
+   "email" : "mc@example.org",
+   "firstname" : "Martin",
+   "lastname" : "Brown"
+}
+
+ +

The view can be modified to cope with both the older and newer document types, while still + emitting a consistent view:

+ +
function(doc, meta)
+{
+  if (doc.name && (doc.name != null))
+  {
+    emit([doc.name, doc.email], null);
+  }
+  else
+  {
+    emit([doc.firstname + " " + doc.lastname, doc.email], null);
+  }
+}
+
+ +

The schema-less nature and view definitions provide for a flexible document structure, and an + evolving one, without requiring either an initial schema description, or explicit schema + updates when the format of the information changes.

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/Views/views-storedData.html b/preview/contents/Views/views-storedData.html new file mode 100644 index 0000000..ff5da3f --- /dev/null +++ b/preview/contents/Views/views-storedData.html @@ -0,0 +1,240 @@ +Viewと保存データ
+

Viewと保存データ

+ + +

このセクションはViewシステムが保存データと関連してどのように動作するのかを解説します。

+ +

+ Viewシステムはクラスタ内にJSONドキュメント形式で保存されている情報に依存しています。 + この形式でデータをフォーマットすることで、データ内の各フィールドを特定でき、インデックスのコンポーネントで利用できます。 +

+ +

+ Couchbaseデータベースに情報が保存されると、保存されたデータはパースされ、有効なJSONだと特定されると、有効なJSONとしてデータベース内で特定され、タグ付けられます。 + 情報が有効なJSONとしてパースできない場合、送信されたデータのコピーを文字通りバイナリとして保存します。 +

+ + +
+ + +

保存したデータを取得する際、情報のフォーマットはデータが有効なJSONとしてタグ付けされているかどうかに依存します:

+ + +

JSON情報

+ +

+ JSONとして判定された情報は保存された状態と同一の形式で返却されます。 + この情報は意味的に同一で、送信された状態と同じフィールド、データ、構造で返却されます。 + Viewの処理中には、ドキュメントのメタデータ情報が別の構造として提供され、利用できます。 +

+ +

空白文字、フィールドの順序は送信されたバージョンのJSONドキュメントと異なる場合があります。

+ +

例えば、以下のJSONドキュメントをmykeyのキーで保存します:

+ + +

+{
+   "title" : "Fish Stew",
+   "servings" : 4,
+   "subtitle" : "Delicious with fresh bread"
+}
+
+ + +

Viewプロセッサ内では以下の様に返される場合があります:

+ +

+{
+    "servings": 4,
+    "subtitle": "Delicious with fresh bread",
+    "title": "Fish Stew"
+}
+    
+ +
+ + +

JSON以外の情報

+ +

+ JSONとしてパースできない情報は常にデータベースに送信された情報のバイナリコピーとして保存され、返却されます。 + 例えば、画像を保存すると、保存された画像と同一のバイナリコピーが返されます。 +

+ +

+ JSON以外のデータはbase64文字列としてView処理中に利用できます。 + JSON以外のドキュメントはメタデータ構造のtypeフィールドを参照し特定できます。 +

+ +

返却された構造は、WebコンソールでのView編集時に確認できます。

+ +
+ + + +

JSONの基本

+

+ JSONは軽量で、容易にパースでき、クロスプラットフォームなデータ表現形式です。 + ブラウザを含む全てのプラットフォームと全ての言語、アプリケーションフレームワークで、JSON形式のデータを扱い、開発者の仕事を効率的に助けるために設計された多くのライブラリやツールが存在します。 +

+ +

JSONはJavaScriptでサポートされる基本的な型をサポートしています:

+ +
    +
  • Number (整数もしくは浮動小数)
  • + +
+

JavaScriptがサポートする最大の数値は253です。クライアントライブラリの環境でこれより大きな数字(例えば、64-bitの数字)を扱う場合は、文字列として値を保存する必要があります。

+
    +
  • String — 二重引用符で囲まれた文字とUnicode文字やバックスラッシュエスケープをサポートします。例:

    + +
    "A String"
    +
  • + +
  • Boolean — trueもしくはfalseの値です。 + これらの文字列を直接利用できます。例:

    +{ "value": true}
  • + +
  • Array — 角かっこで囲まれた値のリストです。例:

    + + ["one", "two", "three"]
  • + +
  • Object — キー/値ペアのセット(すなわち、連想配列、またはハッシュ)です。 + キーは文字列でなければなりませんが、値はJSONでサポートされている全ての値を利用できます。例:

    + +
    {
    +   "servings" : 4,
    +   "subtitle" : "Easy to make in advance, and then cook when ready",
    +   "cooktime" : 60,
    +   "title" : "Chicken Coriander"
    +}
    +
    +
  • + +
+ +

キーは文字列でなければなりませんが、値はJSONでサポートされている全ての値を利用できます。

+
+ + + +

ドキュメントメタデータ

+

ビューの処理中に、各ドキュメントのメタデータは、独立したJSONオブジェクトmetaとして参照でき、オプションでmap()関数の第二引数として定義されています。このメタデータは処理中のドキュメントを識別、特定するために利用することができます。

+ +

meta構造には、次のフィールド、及び関連情報が含まれています:

+ +
    +
  • id
  • + +
+

保存データオブジェクトのID、あるいはキーです。Couchbaseデータベースにオブジェクトを書き込んだ際に指定したキーと同じです。

+
    +
  • rev
  • + +
+

情報の現在のリビジョンを記録するために、内部で利用されるリビジョンIDです。このフィールドに格納された情報は一貫性がなく、追跡もできないので、クライアントアプリケーションからは利用すべきではありません。

+
    +
  • type
  • + +
+

格納されたデータのタイプを指定します。有効なJSONドキュメントにはjsonタイプが設定されます。 + バイナリデータとして識別されたドキュメントはbase64タイプが設定されます。

+
    +
  • flags
  • + +
+

データが保存されたときに設定されたフラグの数値です。 + フラグの値の利用可否と値はデータを保存する際に利用しているクライアントライブラリに依存します。 + 内部的にフラグは32ビット整数として格納されます。

+
    +
  • expiration
  • + +
+ +

格納されたオブジェクトの有効期限の値です。 + 有効期限は常に絶対的なUnixエポック時間として保存されています。

+ +

これらの付加的なフィールドはViewサーバでドキュメントを処理している間だけ参照できます。 + これらのフィールドはMemcached/Couchbaseプロトコルを介してオブジェクトにアクセスしても、ドキュメントの一部としては返却されません。

+ +
+ + + +

JSON以外のデータ

+

+ Couchbaseに保存された全てのドキュメントはJSON構造を返しますが、サブミットされた情報でJSONドキュメントとしてパースできたものだけがJSONドキュメントとして保存されます。 + JSONドキュメントにパースできない値を保存した場合、オリジナルのバイナリデータが保存されます。 + これは、map()関数に与えられるmetaオブジェクトを使用して、ビューの処理中に識別することができます。 + JSONドキュメントではなく、バイナリドキュメントとして識別され、保存されているドキュメントであっても、ビューシステムにより、キーのデータを利用してインデックスを作成することができます。 + ドキュメントのキーが意味を持つ場合に特に有効です。 + たとえば、レコードのタイプを識別するために、キーにプレフィックスを付けている場合、ドキュメントのタイプでインデックスを作成できます。 +

+
+ + + +

ドキュメントストレージとインデックスの処理順序

+ Couchbase Serverへ情報が格納される手順は、どのように、どのタイミングで情報のインデックスが作成されるのかに影響をあたえ、インデックスとデータがクラスタに保存されるタイミングは関連しています。 + 加えて、データのインデクシングはViewシステムとそのViewへアクセスする際の設定が影響します。 +

+ + + + + +

基本的なデータ保存とインデクシングの順序は以下のようになります:

+ + + + +
    +
  1. ドキュメントがクラスタに保存されます。まず、RAM上にのみドキュメントが保存されます。
  2. + +
  3. ドキュメントはレプリケーションを通してインデクサへと渡され、Viewによりインデクシングされます。
  4. + +
+ + +

+ この処理順序は、インデクサへと変更がレプリケートされるレイテンシをベースとして、メモリに保存されている情報とViewの実行結果の間には結果整合性があることを意味します。 + クラスタに新規にドキュメントを保存したあと、インデックスにアクセスすると、新規に保存されたドキュメントが生成されたView内に出現しない可能性があります。 +

+ + + +

+ また、期限切れチェック処理によってデータベースから削除されるまで、有効期限付きのドキュメントがビューインデックス内に存在し続ける場合もあります。 +

+ + +

+ Couchbase ServerはObserveコマンドをサポートしており、対象のドキュメントがインデクサにレプリケートされたか、インデックスに含まれているかどうかといった、ドキュメントの現在の状態を確認することができます。 +

+ +

Viewにアクセスする際、Viewの内容は保存されているドキュメントとは非同期です。 + 加えて、ビューの作成や変更はstaleパラメータに依存します。 + これはViewのコンテンツをクエリする際に、Viewをいつ、どのように更新するのかを制御します。 +

+ +
+ + +
+ + + +
\ No newline at end of file diff --git a/preview/contents/Views/views-translateSQL.html b/preview/contents/Views/views-translateSQL.html new file mode 100644 index 0000000..a8da0cc --- /dev/null +++ b/preview/contents/Views/views-translateSQL.html @@ -0,0 +1,545 @@ +Translating SQL to map/reduce
+

Translating SQL to map/reduce

+ + +

This section provides information on how to translate SQL to a map/reduce + environment.

+ +
SELECT fieldlist FROM table \
+    WHERE condition \
+    GROUP BY groupfield \
+    ORDER BY orderfield \
+    LIMIT limitcount OFFSET offsetcount
+
+ +

The different elements within the source statement affect how a view is written in the + following ways:

+ +
    +
  • SELECT fieldlist
  • + +
+ +

The field list within the SQL statement affects either the corresponding key or value within + the map() function, depending on whether you are also selecting or reducing + your data.

+ +
    +
  • FROM table
  • + +
+ +

There are no table compartments within Couchbase Server and you cannot perform views across + more than one bucket boundary. However, if you are using a type field within + your documents to identify different record types, then you may want to use the + map() function to make a selection.

+ + +
    +
  • WHERE condition
  • + +
+ +

The map() function and the data generated into the view key directly affect + how you can query, and therefore how selection of records takes place.

+ +
    +
  • ORDER BY orderfield
  • + +
+ +

The order of record output within a view is directly controlled by the key specified during + the map() function phase of the view generation.

+ +
    +
  • LIMIT limitcount OFFSET offsetcount
  • + +
+ +

There are a number of different paging strategies available within the map/reduce and views + mechanism.

+ +
    +
  • GROUP BY groupfield
  • + +
+ +

Grouping within SQL is handled within views through the use of the reduce() + function.

+ +

The interaction between the view map() function, reduce() + function, selection parameters and other miscellaneous parameters according to the table + below:

+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SQL Statement FragmentView KeyView Valuemap() Functionreduce() FunctionSelection ParametersOther Parameters
SELECT fieldsYesYesYesNo: with GROUP BY and SUM() or + COUNT() functions onlyNoNo
FROM tableNoNoYesNoNoNo
WHERE clauseYesNoYesNoYesNo
ORDER BY fieldYesNoYesNoNodescending
LIMIT x OFFSET yNoNoNoNoNolimit, skip
GROUP BY fieldYesYesYesYesNoNo
+
+ +

Within SQL, the basic query structure can be used for a multitude of different queries. For + example, the same ’ SELECT fieldlist FROM table WHERE xxxx can be used with a + number of different clauses.

+ +

Within map/reduce and Couchbase Server, multiple views may be needed to be created to handled + different query types. For example, performing a query on all the blog posts on a specific + date will need a very different view definition than one needed to support selection by the + author.

+ + + + + +

Translating SQL SELECT to map/reduce

The field selection within an SQL + query can be translated into a corresponding view definition, either by adding the fields to + the emitted key (if the value is also used for selection in a WHERE + clause), or into the emitted value, if the data is separate from the required query + parameters.

+

For example, to get the sales data by country from each stored document + using the following map() + function:

+
function(doc, meta) {
+  emit([doc.city, doc.sales], null);
+}
+
+

If + you want to output information that can be used within a reduce function, this should be + specified in the value generated by each emit() call. For example, to + reduce the sales figures the above map() function could be rewritten + as:

+
function(doc, meta) {
+  emit(doc.city, doc.sales);
+}
+
+

In + essence this does not produce significantly different output (albeit with a simplified key), + but the information can now be reduced using the numerical value.

+

If you want to + output data or field values completely separate to the query values, then these fields can + be explicitly output within the value portion of the view. For + example:

+
function(doc, meta) {
+  emit(doc.city, [doc.name, doc.sales]);
+}
+
+

If + the entire document for each item is required, load the document data after the view has + been requested through the client library. For more information on this parameter and the + performance impact.

+

Within a SELECT statement it is + common practice to include the primary key for a given record in the output. Within a view + this is not normally required, since the document ID that generated each row is always + included within the view + output.

+
+ + + + +

Translating SQL WHERE to map/reduce

The WHERE clause + within an SQL statement forms the selection criteria for choosing individual records. Within + a view, the ability to query the data is controlled by the content and structure of the + key generated by the map() function.

+

In general, + for each WHERE clause you need to include the corresponding field in the + key of the generated view, and then use the key, keys or + startkey / endkey combinations to indicate the data you + want to select.. The complexity occurs when you need to perform queries on multiple fields. + There are a number of different strategies that you can use for this.

+

The simplest way + is to decide whether you want to be able to select a specific combination, or whether you + want to perform range or multiple selections. For example, using our recipe database, if you + want to select recipes that use the ingredient ‘carrot’ and have a cooking time of exactly + 20 minutes, then you can specify these two fields in the map() + function:

+
function(doc, meta)
+{
+  if (doc.ingredients)
+  {
+    for(i=0; i < doc.ingredients.length; i++)
+    {
+      emit([doc.ingredients[i].ingredient, doc.totaltime], null);
+    }
+  }
+}
+
+

Then + the query is an array of the two selection + values:

+
?key=["carrot",20]
+
+

This is equivalent + to the SQL + query:

+
SELECT recipeid FROM recipe JOIN ingredients on ingredients.recipeid = recipe.recipeid
+    WHERE ingredient = 'carrot' AND totaltime = 20
+
+

If, + however, you want to perform a query that selects recipes containing carrots that can be + prepared in less than 20 minutes, a range query is possible with the same + map() + function:

+
?startkey=["carrot",0]&endkey=["carrot",20]
+
+

This + works because of the sorting mechanism in a view, which outputs in the information + sequentially, fortunately nicely sorted with carrots first and a sequential + number.

+

More complex queries though are more difficult. What if you want to select + recipes with carrots and rice, still preparable in under 20 minutes?

+

A standard + map() function like that above wont work. A range query on both + ingredients will list all the ingredients between the two. There are a number of solutions + available to you. First, the easiest way to handle the timing selection is to create a view + that explicitly selects recipes prepared within the specified time. + I.E:

+
function(doc, meta)
+{
+  if (doc.totaltime <= 20)
+  {
+    ...
+  }
+}
+
+

Although + this approach seems to severely limit your queries, remember you can create multiple views, + so you could create one for 10 mins, one for 20, one for 30, or whatever intervals you + select. It’s unlikely that anyone will really want to select recipes that can be prepared in + 17 minutes, so such granular selection is overkill.

+

The multiple ingredients is more + difficult to solve. One way is to use the client to perform two queries and merge the data. + For example, the map() + function:

+
function(doc, meta)
+{
+  if (doc.totaltime &amp;&amp; doc.totaltime <= 20)
+  {
+    if (doc.ingredients)
+    {
+      for(i=0; i < doc.ingredients.length; i++)
+      {
+        emit(doc.ingredients[i].ingredient, null);
+      }
+    }
+  }
+}
+
+

Two + queries, one for each ingredient can easily be merged by performing a comparison and count + on the document ID output by each view.

+

The alternative is to output the ingredients + twice within a nested loop, like + this:

+
function(doc, meta)
+{
+  if (doc.totaltime &amp;&amp; doc.totaltime <= 20)
+  {
+    if (doc.ingredients)
+    {
+      for (i=0; i < doc.ingredients.length; i++)
+      {
+        for (j=0; j < doc.ingredients.length; j++)
+        {
+          emit([doc.ingredients[i].ingredient, doc.ingredients[j].ingredient], null);
+        }
+      }
+    }
+  }
+}
+
+

Now + you can perform an explicit query on both + ingredients:

+
?key=["carrot","rice"]
+
+

If you + really want to support flexible cooking times, then you can also add the cooking + time:

+
function(doc, meta)
+{
+  if (doc.ingredients)
+  {
+    for (i=0; i < doc.ingredients.length; i++)
+    {
+      for (j=0; j < doc.ingredients.length; j++)
+      {
+        emit([doc.ingredients[i].ingredient, doc.ingredients[j].ingredient, recipe.totaltime], null);
+      }
+    }
+  }
+}
+
+

And + now you can support a ranged query on the cooking time with the two ingredient + selection:

+
?startkey=["carrot","rice",0]&key=["carrot","rice",20]
+
+

This + would be equivalent + to:

+
SELECT recipeid FROM recipe JOIN ingredients on ingredients.recipeid = recipe.recipeid
+    WHERE (ingredient = 'carrot' OR ingredient = 'rice') AND totaltime = 20
+
+
+ + + + +

Translating SQL ORDER BY to map/reduce

The ORDER BY + clause within SQL controls the order of the records that are output. Ordering within a view + is controlled by the value of the key. However, the key also controls and supports the + querying mechanism.

+

In SELECT statements where there is no explicit + WHERE clause, the emitted key can entirely support the sorting you want. + For example, to sort by the city and salesman name, the following map() + will achieve the required + sorting:

+
function(doc, meta)
+{
+   emit([doc.city, doc.name], null)
+}
+
+

If + you need to query on a value, and that query specification is part of the order sequence + then you can use the format above. For example, if the query basis is city, then you can + extract all the records for ‘London’ using the above view and a suitable range + query:

+
?endkey=["London\u0fff"]&startkey=["London"]
+
+

However, + if you want to query the view by the salesman name, you need to reverse the field order in + the emit() + statement:

+
function(doc, meta)
+{
+   emit([doc.name,doc.city],null)
+}
+
+

Now + you can search for a name while still getting the information in city order.

+

The order + the output can be reversed (equivalent to ORDER BY field DESC ) by using + the descending query parameter.

+
+ + + + +

Translating SQL GROUP BY to map/reduce

The GROUP BY + parameter within SQL provides summary information for a group of matching records according + to the specified fields, often for use with a numeric field for a sum or total value, or + count operation.

+

For + example:

+
SELECT name,city,SUM(sales) FROM sales GROUP BY name,city
+
+

This + query groups the information by the two fields ‘name’ and ‘city’ and produces a sum total of + these values. To translate this into a map/reduce function within Couchbase Server:

+
    +
  • From the list of selected fields, identify the field used for the calculation. These + will need to be exposed within the value emitted by the map() + function.

    +
  • + +
  • Identify the list of fields in the GROUP BY clause. These will need + to be output within the key of the map() function.

    +
  • + +
  • Identify the grouping function, for example SUM() or + COUNT(). You will need to use the equivalent built-in function, or a + custom function, within the reduce() function of the view.

    +
  • + +
+

For example, in the above case, the corresponding map function can be written as + map() + :

+
function(doc, meta)
+{
+   emit([doc.name,doc.city],doc.sales);
+}
+
+

This + outputs the name and city as the key, and the sales as the value. Because the + SUM() function is used, the built-in reduce() function + _sum can be used.

+

An example of this map/reduce combination can be + seen _sum.

+

More complex grouping operations may require a custom reduce function. +

+
+ + + + +

Translating SQL LIMIT and OFFSET

Within SQL, the + LIMIT and OFFSET clauses to a given query are used as a + paging mechanism. For example, you might + use:

+
SELECT recipeid,title FROM recipes LIMIT 100
+
+

To + get the first 100 rows from the database, and then use the OFFSET to get + the subsequent groups of + records:

+
SELECT recipeid,title FROM recipes LIMIT 100 OFFSET 100
+
+

With + Couchbase Server, the limit and skip parameters when + supplied to the query provide the same basic + functionality:

+
?limit=100&skip=100
+
+

Performance + for high values of skip can be affected.

+
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Views/views-writing.html b/preview/contents/Views/views-writing.html new file mode 100644 index 0000000..73c7bed --- /dev/null +++ b/preview/contents/Views/views-writing.html @@ -0,0 +1,1158 @@ +Writing views
+

Writing views

+ + +

During the view creation process, + the output structure, field order, content, and any summary or grouping + information desired in the view is defined.

+ +

The fundamentals of a view are straightforward. A view creates a perspective on the data + stored in your Couchbase buckets in a format that can be used to represent the data in a + specific way, define and filter the information, and provide a basis for searching or + querying the data in the database based on the content.

+ +

Views achieve this by defining an output structure that translates the stored JSON object + data into a JSON array or object across two components, the key and the value. This + definition is performed through the specification of two separate functions written in + JavaScript. The view definition is divided into two parts, a map function and a reduce + function:

+ +
    +
  • Map function
  • + +
+ +

As the name suggests, the map function creates a mapping between the input data (the JSON + objects stored in your database) and the data as you want it displayed in the results + (output) of the view. Every document in the Couchbase bucket for the view is submitted to + the map() function in each view once, and it is the output from the + map() function that is used as the result of the view.

+ +

The map() function is supplied two arguments by the views processor. The + first argument is the JSON document data. The optional second argument is the associated + metadata for the document, such as the expiration, flags, and revision information.

+ +

The map function outputs zero or more ‘rows’ of information using an + emit() function. Each call to the emit() function is + equivalent to a row of data in the view result. The emit() function can be + called multiple times within the single pass of the map() function. This + functionality enables you to create views that may expose information stored in a compound + format within a single stored JSON record, for example generating a row for each item in an + array.

+ +

You can see this in the figure below, where the name, salary and city fields of the stored + JSON documents are translated into a table (an array of fields) in the generated view + content.

+ +
    +
  • Reduce function
  • + +
+ +

The reduce function is used to summarize the content generated during the map phase. Reduce + functions are optional in a view and do not have to be defined. When they exist, each row + of output (from each emit() call in the corresponding + map() function) is processed by the corresponding + reduce() function.

+ +

If a reduce function is specified in the view definition it is automatically used. You can + access a view without enabling the reduce function by disabling reduction ( + reduce=false ) when the view is accessed.

+ +

Typical uses for a reduce function are to produce a summarized count of the input data, or + to provide sum or other calculations on the input data. For example, if the input data + included employee and salary data, the reduce function could be used to produce a count of + the people in a specific location, or the total of all the salaries for people in those + locations.

+ +

The combination of the map and the reduce function produce the corresponding view. The two + functions work together, with the map producing the initial material based on the content + of each JSON document, and the reduce function summarizing the information generated during + the map phase. The reduction process is selectable at the point of accessing the view, you + can choose whether to the reduce the content or not, and, by using an array as the key, you + can specifying the grouping of the reduce information.

+ +

Each row in the output of a view consists of the view key and the view value. When + accessing a view using only the map function, the contents of the view key and value are + those explicitly stated in the definition. In this mode the view will also always contain + an id field which contains the document ID of the source record (i.e. the + string used as the ID when storing the original data record).

+ +

When accessing a view employing both the map and reduce functions the key and value are + derived from the output of the reduce function based on the input key and group level + specified. A document ID is not automatically included because the document ID cannot be + determined from reduced data where multiple records may have been merged into one. Examples + of the different explicit and implicit values in views will be shown as the details of the + two functions are discussed.

+ +

You can see an example of the view creation process in the figure below.

+ +
+ +
+ +

Because of the separation of the two elements, you can consider the two functions + individually.

+ +

For information on how to write map functions, and how the output of the map function + affects and supports searching.

+ +

View names must be specified using one or more UTF–8 characters. You cannot have a blank + view name. View names cannot have leading or trailing whitespace characters (space, tab, + newline, or carriage-return).

+ +

To create views, you can use either the Admin Console View editor, use the REST + API for design documents, or use one of the client libraries that support view management.

+ + + + + + +

Map functions

The map function is the most critical part of any view + as it provides the logical mapping between the input fields of the individual objects + stored within Couchbase to the information output when the view is + accessed.

+

Through this mapping process, the map function and the view provide:

+
    +
  • The output format and structure of the view on the bucket.

    +
  • + +
  • Structure and information used to query and select individual documents using the + view information.

    +
  • + +
  • Sorting of the view results.

    +
  • + +
  • Input information for summarizing and reducing the view content.

    +
  • + +
+

Applications access views through the REST API, or through a Couchbase client + library. All client libraries provide a method for submitting a query into the view + system and obtaining and processing the results.

+

The basic operation of the map + function can be seen in the figure below.

+ + +
+ +
+ +

In this example, a map function is taking the Name, City, and + Salary fields from the JSON documents stored in the Couchbase bucket and mapping them to + a table of these fields. The map function which produces this output might look like + this:

+
function(doc, meta)
+{
+  emit(doc.name, [doc.city, doc.salary]);
+}
+
+

When + the view is generated the map() function is supplied two arguments for + each stored document, doc and meta :

+
    +
  • doc
  • + +
+

The stored document from the Couchbase bucket, either the JSON or binary content. + Content type can be identified by accessing the type field of the + meta argument object.

+
    +
  • meta
  • + +
+

The metadata for the stored document, containing expiry time, document ID, revision + and other information.

+

Every document in the Couchbase bucket is submitted to the + map() function in turn. After the view is created, only the + documents created or changed since the last update need to be processed by the view. + View indexes and updates are materialized when the view is accessed. Any documents added + or changed since the last access of the view will be submitted to the + map() function again so that the view is updated to reflect the + current state of the data bucket.

+

Within the map() function + itself you can perform any formatting, calculation or other detail. To generate the view + information, you use calls to the emit() function. Each call to the + emit() function outputs a single row or record in the generated view + content.

+

The emit() function accepts two arguments, the key and + the value for each record in the generated view:

+
    +
  • key
  • + +
+

The emitted key is used by Couchbase Server both for sorting and querying the + content in the database.

+

The key can be formatted in a variety of ways, including + as a string or compound value (such as an array or JSON object). The content and + structure of the key is important, because it is through the emitted key structure that + information is selected within the view.

+

All views are output in a sorted order + according to the content and structure of the key. Keys using a numeric value are sorted + numerically, for strings, UTF–8 is used. Keys can also support compound values such as + arrays and hashes.

+ +

The key content is used for querying by using a combination of + this sorting process and the specification of either an explicit key or key range within + the query specification. For example, if a view outputs the RECIPE + TITLE field as a key, you could obtain all the records matching ‘Lasagne’ by + specifying that only the keys matching ‘Lasagne’ are returned.

+ + +
    +
  • value
  • + +
+

The value is the information that you want to output in each view row. The value + can be anything, including both static data, fields from your JSON objects, and + calculated values or strings based on the content of your JSON objects.

+

The + content of the value is important when performing a reduction, since it is the value + that is used during reduction, particularly with the built-in reduction functions. For + example, when outputting sales data, you might put the SALESMAN into + the emitted key, and put the sales amounts into the value. The built-in + _sum function will then total up the content of the corresponding + value for each unique key.

+

The format of both key and value is up to you. You can + format these as single values, strings, or compound values such as arrays or JSON. The + structure of the key is important because you must specify keys in the same format as + they were generated in the view specification.

+

The emit() + function can be called multiple times in a single map function, with each call + outputting a single row in the generated view. This can be useful when you want to + supporting querying information in the database based on a compound field. For a sample + view definition and selection criteria.

+ +

Views and map generation are also very forgiving. If you elect to + output fields in from the source JSON objects that do not exist, they will simply be + replaced with a null value, rather than generating an error.

+

For + example, in the view below, some of the source records do contain all of the fields in + the specified view. The result in the view result is just the null + entry for that field in the value output.

+ + +
+ +
+ +

You should check that the field or data source exists during + the map processing before emitting the data.

+

To better understand how the map + function works to output different types of information and retrieve it, see View and Query Pattern + Samples.

+ +
+ + + + +

Reduce functions

+ +

Often the information that you are searching or + reporting on needs to be summarized or reduced. There are a number of different + occasions when this can be useful. For example, if you want to obtain a count of all the + items of a particular type, such as comments, recipes matching an ingredient, or blog + entries against a keyword.

+

When using a reduce function in your view, the value + that you specify in the call to emit() is replaced with the value + generated by the reduce function. This is because the value specified by + emit() is used as one of the input parameters to the reduce + function. The reduce function is designed to reduce a group of values emitted by the + corresponding map() function.

+

Alternatively, reduce can be used + for performing sums, for example totalling all the invoice values for a single client, + or totalling up the preparation and cooking times in a recipe. Any calculation that can + be performed on a group of the emitted data.

+

In each of the above cases, the raw + data is the information from one or more rows of information produced by a call to + emit(). The input data, each record generated by the + emit() call, is reduced and grouped together to produce a new record + in the output.

+

The grouping is performed based on the value of the emitted key, + with the rows of information generated during the map phase being reduced and collated + according to the uniqueness of the emitted key.

+

When using a reduce function the + reduction is applied as follows:

+
    +
  • For each record of input, the corresponding reduce function is applied on the row, + and the return value from the reduce function is the resulting row.
  • + +
+

For example, using the built-in _sum reduce function, the + value in each case would be totaled based on the emitted + key:

+
```
+{
+   "rows" : [
+      {"value" : 13000, "id" : "James", "key" : "James" },
+      {"value" : 20000, "id" : "James", "key" : "James" },
+      {"value" : 5000,  "id" : "Adam",  "key" : "Adam"  },
+      {"value" : 8000,  "id" : "Adam",  "key" : "Adam"  },
+      {"value" : 10000, "id" : "John",  "key" : "John"  },
+      {"value" : 34000, "id" : "John",  "key" : "John"  }
+   ]
+}
+```
+
+

Using + the unique key of the name, the data generated by the map above would be reduced, using + the key as the collator, to the produce the following + output:

+ + +

+{
+   "rows" : [
+      {"value" : 33000, "key" : "James" },
+      {"value" : 13000, "key" : "Adam"  },
+      {"value" : 44000, "key" : "John"  },
+   ]
+}
+
+ + +

In + each case the values for the common keys (John, Adam, James), have been totalled, and + the six input rows reduced to the 3 rows shown here.

+
    +
  • Results are grouped on the key from the call to emit() if + grouping is selected during query time. As shown in the previous example, the + reduction operates by the taking the key as the group value as using this as the + basis of the reduction.

    +
  • + +
  • If you use an array as the key, and have selected the output to be grouped during + querying you can specify the level of the reduction function, which is analogous + to the element of the array on which the data should be grouped.

    +
  • + +
+

The view definition is flexible. You can select whether the reduce function is + applied when the view is accessed. This means that you can access both the reduced and + unreduced (map-only) content of the same view. You do not need to create different views + to access the two different types of data.

+

Whenever the reduce function is called, + the generated view content contains the same key and value fields for each row, but the + key is the selected group (or an array of the group elements according to the group + level), and the value is the computed reduction value.

+ + +

Couchbase includes the following built-in reduce functions:

+ +
    +
  • _count
  • + +
  • _sum
  • + +
  • _stats.
  • + +
+ + +
Note: You can also write your own custom reduction functions.
+ + + +

The reduce function also has a final additional benefit. The + results of the computed reduction are stored in the index along with the rest of the + view information. This means that when accessing a view with the reduce function + enabled, the information comes directly from the index content. This results in a very + low impact on the Couchbase Server to the query (the value is not computed at runtime), + and results in very fast query times, even when accessing information based on a + range-based query.

+

The reduce() function is designed to reduce + and summarize the data emitted during the map() phase of the process. + It should only be used to summarize the data, and not to transform the output + information or concatenate the information into a single structure.

+

When using a + composite structure, the size limit on the composite structure within the + reduce() function is + 64KB.

+ +
+ + + + +

Built-in _count

The _count function provides a + simple count of the input rows from the map() function, using the keys + and group level to provide a count of the correlated items. The values generated during + the map() stage are ignored.

+

For example, using the + input:

+
{
+   "rows" : [
+      {"value" : 13000, "id" : "James", "key" : ["James", "Paris"] },
+      {"value" : 20000, "id" : "James", "key" : ["James", "Tokyo"] },
+      {"value" : 5000,  "id" : "James", "key" : ["James", "Paris"] },
+      {"value" : 7000,  "id" : "Adam",  "key" : ["Adam",  "London"] },
+      {"value" : 19000, "id" : "Adam",  "key" : ["Adam",  "Paris"] },
+      {"value" : 17000, "id" : "Adam",  "key" : ["Adam",  "Tokyo"] },
+      {"value" : 22000, "id" : "John",  "key" : ["John",  "Paris"] },
+      {"value" : 3000,  "id" : "John",  "key" : ["John",  "London"] },
+      {"value" : 7000,  "id" : "John",  "key" : ["John",  "London"] },
+    ]
+}
+
+ + +

Enabling + the reduce() function and using a group level of 1 would + produce:

+ + +
{
+   "rows" : [
+      {"value" : 3, "key" : ["Adam" ] },
+      {"value" : 3, "key" : ["James"] },
+      {"value" : 3, "key" : ["John" ] }
+   ]
+}
+
+

The + reduction has produce a new result set with the key as an array based on the first + element of the array from the map output. The value is the count of the number of + records collated by the first element.

+

Using a group level of 2 would generate the + following:

+ + +
{
+   "rows" : [
+      {"value" : 1, "key" : ["Adam", "London"] },
+      {"value" : 1, "key" : ["Adam", "Paris" ] },
+      {"value" : 1, "key" : ["Adam", "Tokyo" ] },
+      {"value" : 2, "key" : ["James","Paris" ] },
+      {"value" : 1, "key" : ["James","Tokyo" ] },
+      {"value" : 2, "key" : ["John", "London"] },
+      {"value" : 1, "key" : ["John", "Paris" ] }
+   ]
+}
+
+ + +

Now + the counts are for the keys matching both the first two elements of the map + output.

+ +
+ + + + +

Built-in _sum

+ +

The built-in _sum function sums the + values from the map() function call, this time summing up the + information in the value for each row. The information can either be a single number or + during a rereduce an array of numbers.

+

The input values must be a number, not a + string-representation of a number. The entire map/reduce will fail if the reduce input + is not in the correct format. You should use the parseInt() or + parseFloat() function calls within your map() + function stage to ensure that the input data is a number.

+

For example, using the + same sales source data, accessing the group level 1 view would produce the total sales + for each + salesman:

+ + +
{
+   "rows" : [
+      {"value" : 43000, "key" : [ "Adam"  ] },
+      {"value" : 38000, "key" : [ "James" ] },
+      {"value" : 32000, "key" : [ "John"  ] }
+   ]
+}
+
+

Using + a group level of 2 you get the information summarized by salesman and + city:

+
{
+   "rows" : [
+      {"value" : 7000,  "key" : [ "Adam",  "London" ] },
+      {"value" : 19000, "key" : [ "Adam",  "Paris"  ] },
+      {"value" : 17000, "key" : [ "Adam",  "Tokyo"  ] },
+      {"value" : 18000, "key" : [ "James", "Paris"  ] },
+      {"value" : 20000, "key" : [ "James", "Tokyo"  ] },
+      {"value" : 10000, "key" : [ "John",  "London" ] },
+      {"value" : 22000, "key" : [ "John",  "Paris"  ] }
+   ]
+}
+
+ +
+ + + + +

Built-in _stats

The built-in _stats reduce function + produces statistical calculations for the input data. As with the _sum + function, the corresponding value in the emit call should be a number. The generated + statistics include the sum, count, minimum ( min ), maximum ( + max ) and sum squared ( sumsqr ) of the input + rows.

+

Using the sales data, a slightly truncated output at group level one would + be:

+
{
+   "rows" : [
+      {
+         "value" : {
+            "count" : 3,
+            "min" : 7000,
+            "sumsqr" : 699000000,
+            "max" : 19000,
+            "sum" : 43000
+         },
+         "key" : [
+            "Adam"
+         ]
+      },
+      {
+         "value" : {
+            "count" : 3,
+            "min" : 5000,
+            "sumsqr" : 594000000,
+            "max" : 20000,
+            "sum" : 38000
+         },
+         "key" : [
+            "James"
+         ]
+      },
+      {
+         "value" : {
+            "count" : 3,
+            "min" : 3000,
+            "sumsqr" : 542000000,
+            "max" : 22000,
+            "sum" : 32000
+         },
+         "key" : [
+            "John"
+         ]
+      }
+   ]
+}
+
+

The + same fields in the output value are provided for each of the reduced output + rows.

+ +
+ + + + +

Writing custom reduce functions

The reduce() + function has to work slightly differently to the map() function. In the + primary form, a reduce() function must convert the data supplied to it + from the corresponding map() function.

+

The core structure of the + reduce function execution is shown the figure below.

+ + + +
+ +
+ +

The base format of the reduce() function is + as + follows:

+ +
function(key, values, rereduce) {
+…
+
+return retval;
+}
+
+ +

The + reduce function is supplied three arguments:

+
    +
  • key
  • + +
+

The key is the unique key derived from the map() + function and the group_level parameter.

+
    +
  • values
  • + +
+

The values argument is an array of all of the values that match a + particular key. For example, if the same key is output three times, + data will be an array of three items containing, with each item + containing the value output by the emit() function.

+
    +
  • rereduce
  • + +
+

The rereduce indicates whether the function is being called as + part of a re-reduce, that is, the reduce function being called again to further reduce + the input data.

+

When rereduce is + false:

+ +
* The supplied `key` argument will be an array where the first argument is the
+  `key` as emitted by the map function, and the `id` is the document ID that
+  generated the key.
+
+* The values is an array of values where each element of the array matches the
+  corresponding element within the array of `keys`.
+
+

When + rereduce is + true:

+ + +
* `key` will be null.
+
+* `values` will be an array of values as returned by a previous `reduce()`
+  function.
+
+

The + function should return the reduced version of the information by calling the + return() function. The format of the return value should match the + format required for the specified + key.

+ +
+ + + +

Re-writing the built-in reduce functions

Using this model as a + template, it is possible to write the full implementation of the built-in functions + _sum and _count when working with the sales data + and the standard map() function + below:

+
function(doc, meta)
+{
+  emit(meta.id, null);
+}
+
+

The + _count function returns a count of all the records for a given key. + Since argument for the reduce function contains an array of all the values for a given + key, the length of the array needs to be returned in the reduce() + function:

+
function(key, values, rereduce) {
+   if (rereduce) {
+       var result = 0;
+       for (var i = 0; i < values.length; i++) {
+           result += values[i];
+       }
+       return result;
+   } else {
+       return values.length;
+   }
+}
+
+

To + explicitly write the equivalent of the built-in _sum reduce function, + the sum of supplied array of values needs to be + returned:

+
function(key, values, rereduce) {
+  var sum = 0;
+  for(i=0; i < values.length; i++) {
+    sum = sum + values[i];
+  }
+  return(sum);
+}
+
+

In + the above function, the array of data values is iterated over and added up, with the + final value being + returned.

+ +
+ + + +

Handling re-reduce

+

For reduce() functions, they + should be both transparent and standalone. For example, the _sum + function did not rely on global variables or parsing of existing data, and didn’t need + to call itself, hence it is also transparent.

+

In order to handle incremental + map/reduce functionality (i.e. updating an existing view), each function must also be + able to handle and consume the functions own output. This is because in an incremental + situation, the function must be handle both the new records, and previously computed + reductions.

+

This can be explicitly written as + follows:

+ + +
f(keys, values) = f(keys, [ f(keys, values) ])
+
+

This + can been seen graphically in the illustration below, where previous reductions are + included within the array of information are re-supplied to the reduce function as an + element of the array of values supplied to the reduce function.

+ + + +
+ + +

That is, the input of a reduce function can be not only the + raw data from the map phase, but also the output of a previous reduce phase. This is + called rereduce, and can be identified by the third argument to the + reduce(). When the rereduce argument is true, both + the key and values arguments are arrays, with the + corresponding element in each containing the relevant key and value. I.e., + key[1] is the key related to the value of + value[1].

+ + +

An example of this can be seen by considering an + expanded version of the sum function showing the supplied values for + the first iteration of the view index + building:

+ + +
function('James', [ 13000,20000,5000 ]) {...}
+
+

When + a document with the ‘James’ key is added to the database, and the view operation is + called again to perform an incremental update, the equivalent call + is:

+ + +
function('James', [ 19000, function('James', [ 13000,20000,5000 ]) ]) { ... }
+
+ +

In + reality, the incremental call is supplied the previously computed value, and the newly + emitted value from the new + document:

+ + +
function('James', [ 19000, 38000 ]) { ... }
+
+ + +

Fortunately, + the simplicity of the structure for sum means that the function both + expects an array of numbers, and returns a number, so these can easily be + recombined.

+

If writing more complex reductions, where a compound key is output, + the reduce() function must be able to handle processing an argument of + the previous reduction as the compound value in addition to the data generated by the + map() phase. For example, to generate a compound output showing both + the total and count of values, a suitable reduce() function could be + written like + this:

+ + +
function(key, values, rereduce) {
+  var result = {total: 0, count: 0};
+  for(i=0; i < values.length; i++) {
+    if(rereduce) {
+        result.total = result.total + values[i].total;
+        result.count = result.count + values[i].count;
+    } else {
+        result.total = sum(values);
+        result.count = values.length;
+    }
+  }
+  return(result);
+}
+
+

Each + element of the array supplied to the function is checked using the built-in + typeof function to identify whether the element was an object (as + output by a previous reduce), or a number (from the map phase), and then updates the + return value accordingly.

+

Using the sample sales data, and group level of two, the + output from a reduced view may look like + this:

+ +
{"rows":[
+{"key":["Adam", "London"],"value":{"total":7000,  "count":1}},
+{"key":["Adam", "Paris"], "value":{"total":19000, "count":1}},
+{"key":["Adam", "Tokyo"], "value":{"total":17000, "count":1}},
+{"key":["James","Paris"], "value":{"total":118000,"count":3}},
+{"key":["James","Tokyo"], "value":{"total":20000, "count":1}},
+{"key":["John", "London"],"value":{"total":10000, "count":2}},
+{"key":["John", "Paris"], "value":{"total":22000, "count":1}}
+]
+}
+
+ + +

Reduce + functions must be written to cope with this scenario in order to cope with the + incremental nature of the view and index building. If this is not handled correctly, the + index will fail to be built correctly.

+ + +

The reduce() function is + designed to reduce and summarize the data emitted during the map() + phase of the process. It should only be used to summarize the data, and not to transform + the output information or concatenate the information into a single + structure.

+

When using a composite structure, the size limit on the composite + structure within the reduce() function is + 64KB.

+ +
+ + + +

Views on non-JSON data

If the data stored within your buckets is not + JSON formatted or JSON in nature, then the information is stored in the database as an + attachment to a JSON document returned by the core database layer.

+

This does not + mean that you cannot create views on the information, but it does limit the information + that you can output with your view to the information exposed by the document key used + to store the information.

+

At the most basic level, this means that you can still + do range queries on the key information. For + example:

+
function(doc, meta)
+{
+    emit(meta.id, null);
+}
+
+

You + can now perform range queries by using the emitted key data and an appropriate + startkey and endkey value.

+

If you use a + structured format for your keys, for example using a prefix for the data type, or + separators used to identify different elements, then your view function can output this + information explicitly in the view. For example, if you use a key structure where the + document ID is defined as a series of values that are colon + separated:

+
OBJECTYPE:APPNAME:OBJECTID
+
+

You + can parse this information within the JavaScript map/reduce query to output each item + individually. For + example:

+
function(doc, meta)
+{
+    values = meta.id.split(':',3);
+    emit([values[0], values[1], values[2]], null);
+}
+
+

The + above function will output a view that consists of a key containing the object type, + application name, and unique object ID. You can query the view to obtain all entries of + a specific object type + using:

+
startkey=['monster', null, null]&endkey=['monster','\u0000' ,'\u0000']
+
+ +
+ + + +

Built-in utility functions

Couchbase Server incorporates different + utility function beyond the core JavaScript functionality that can be used within + map() and reduce() functions where relevant.

+
    +
  • dateToArray(date)
  • + +
+

Converts a JavaScript Date object or a valid date string such as + “2012–07–30T23:58:22.193Z” into an array of individual date components. For example, the + previous string would be converted into a JavaScript + array:

+
```
+[2012, 7, 30, 23, 58, 22]
+```
+
+

The + function can be particularly useful when building views using dates as the key where the + use of a reduce function is being used for counting or rollup.

+ + +

Currently, the function works only on UTC values. Timezones are not supported.

+ + +
    +
  • decodeBase64(doc)
  • + +
+

Converts a binary (base64) encoded value stored in the database into a string. This + can be useful if you want to output or parse the contents of a document that has not + been identified as a valid JSON value.

+
    +
  • sum(array)
  • + +
+

When supplied with an array containing numerical values, each value is summed and + the resulting total is returned.

+

For + example:

+ + +

+sum([12,34,56,78])
+
+ +
+ + + +

View writing best practice

Although you are free to write views + matching your data, you should keep in mind the performance and storage implications of + creating and organizing the different design document and view definitions.

+

You + should keep the following in mind while developing and deploying your views:

+
    +
  • Quantity of Views per Design Document
  • + +
+

Because the index for each map/reduce combination within each view within a given + design document is updated at the same time, avoid declaring too many views within the + same design document. For example, if you have a design document with five different + views, all five views will be updated simultaneously, even if only one of the views is + accessed.

+

This can result in increase view index generation times, especially for + frequently accessed views. Instead, move frequently used views out to a separate design + document.

+

The exact number of views per design document should be determined from + a combination of the update frequency requirements on the included views and grouping of + the view definitions. For example, if you have a view that needs to be updated with a + high frequency (for example, comments on a blog post), and another view that needs to be + updated less frequently (e.g. top blogposts), separate the views into two design + documents so that the comments view can be updated frequently, and independently, of the + other view.

+

You can always configure the updating of the view through the use of + the stale parameter. You can also configure different automated view update times for + individual design documents

+ + + +
    +
  • Modifying Existing Views
  • + +
+

If you modify an existing view definition, or are executing a full build on a + development view, the entire view will need to be recreated. In addition, all the views + defined within the same design document will also be recreated.

+

Rebuilding all the + views within a single design document is an expensive operation in terms of I/O and CPU + requirements, as each document will need to be parsed by each views + map() and reduce() functions, with the resulting + index stored on disk.

+

This process of rebuilding will occur across all the nodes + within the cluster and increases the overall disk I/O and CPU requirements until the + view has been recreated. This process will take place in addition to any production + design documents and views that also need to be kept up to date.

+
    +
  • Don’t Include Document ID
  • + +
+

The document ID is automatically output by the view system when the view is + accessed. When accessing a view without reduce enabled you can always determine the + document ID of the document that generated the row. You should not include the document + ID (from meta.id ) in your key or value data.

+
    +
  • Check Document Fields
  • + +
+

Fields and attributes from source documentation in map() or + reduce() functions should be checked before their value is checked + or compared. This can cause issues because the view definitions in a design document are + processed at the same time. A common cause of runtime errors in views is missing or + invalid field and attribute checking.

+

The most common issue is a field within a + null object being accessed. This generates a runtime error that will cause execution of + all views within the design document to fail. To address this problem, you should check + for the existence of a given object before it is used, or the content value is checked. + For example, the following view will fail if the doc.ingredient object + does not exist, because accessing the length attribute on a null object + will + fail:

+
```
+function(doc, meta)
+{
+    emit(doc.ingredient.ingredtext, null);
+}
+```
+
+

Adding + a check for the parent object before calling emit() ensures that the + function is not called unless the field in the source document + exists:

+
```
+function(doc, meta)
+{
+  if (doc.ingredient)
+  {
+     emit(doc.ingredient.ingredtext, null);
+  }
+}
+```
+
+

The + same check should be performed when comparing values within the if + statement.

+

This test should be performed on all objects where you are checking the + attributes or child values (for example, indices of an array).

+
    +
  • View Size, Disk Storage and I/O
  • + +
+

Within the map function, the information declared within your + emit() statement is included in the view index data and stored on + disk. Outputting this information will have the following effects on your + indexes:

+
* *Increased index size on disk* — More detailed or complex key/value combinations
+  in generated views will result in more information being stored on disk.
+
+* *Increased disk I/O* — in order to process and store the information on disk,
+  and retrieve the data when the view is queried. A larger more complex key/value
+  definition in your view will increase the overall disk I/O required both to
+  update and read the data back.
+
+

The + result is that the index can be quite large, and in some cases, the size of the index + can exceed the size of the original source data by a significant factor if multiple + views are created, or you include large portions or the entire document data in the view + output.

+

For example, if each view contains the entire document as part of the + value, and you define ten views, the size of your index files will be more than 10 times + the size of the original data on which the view was created. With a 500-byte document + and 1 million documents, the view index would be approximately 5GB with only 500MB of + source data.

+
    +
  • Including Value Data in Views
  • + +
+

Views store both the key and value emitted by the emit(). To + ensure the highest performance, views should only emit the minimum key data required to + search and select information. The value output by emit() should only + be used when you need the data to be used within a reduce().

+

You + can obtain the document value by using the core Couchbase API to get individual + documents or documents in bulk. Some SDKs can perform this operation for you + automatically.

+

Using this model will also prevent issues + where the emitted view data may be inconsistent with the document state and your view is + emitting value data from the document which is no longer stored in the document + itself.

+

For views that are not going to be used with reduce, you should output a + null + value:

+
```
+function(doc, meta)
+    {
+    if(doc.type == 'object')
+    emit(doc.experience, null);
+    }
+```
+
+

This + will create an optimized view containing only the information required, ensuring the + highest performance when updating the view, and smaller disk usage.

+
    +
  • Don’t Include Entire Documents in View output
  • + +
+

A view index should be designed to provide base information and through the + implicitly returned document ID point to the source document. It is bad practice to + include the entire document within your view output.

+

You can always access the + full document data through the client libraries by later requesting the individual + document data. This is typically much faster than including the full document data in + the view index, and enables you to optimize the index performance without sacrificing + the ability to load the full document data.

+

For example, the following is an + example of a bad + view:

+
```
+function(doc, meta)
+    {
+    if(doc.type == 'object')
+    emit(doc.experience, doc);
+    }
+```
+
+

The + above view may have significant performance and index size effects.

+

This will + include the full document content in the index.

+

Instead, the view should be + defined + as:

+
```
+function(doc, meta)
+    {
+    if(doc.type == 'object')
+    emit(doc.experience, null);
+    }
+```
+
+

You + can then either access the document data individually through the client libraries, or + by using the built-in client library option to separately obtain the document data.

+
    +
  • Using Document Types
  • + +
+

If you are using a document type (by using a field in the stored JSON to indicate + the document structure), be aware that on a large database this can mean that the view + function is called to update the index for document types that are not being updated or + added to the index.

+

For example, within a database storing game objects with a + standard list of objects, and the users that interact with them, you might use a field + in the JSON to indicate ‘object’ or ‘player’. With a view that outputs information when + the document is an + object:

+
```
+function(doc, meta)
+{
+  emit(doc.experience, null);
+}
+```
+
+

If + only players are added to the bucket, the map/reduce functions to update this view will + be executed when the view is updated, even though no new objects are being added to the + database. Over time, this can add a significant overhead to the view building + process.

+

In a database organization like this, it can be easier from an + application perspective to use separate buckets for the objects and players, and + therefore completely separate view index update and structure without requiring to check + the document type during progressing.

+
    +
  • Use Built-in Reduce Functions
  • + +
+

Where possible, use + one of the supplied built-in reduce functions, _sum, + _count](#couchbase-views-writing-reduce-count), + _stats](#couchbase-views-writing-reduce-stats).

+

These + functions are highly optimized. Using a custom reduce function requires additional + processing and may impose additional build time on the production of the + index.

+
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/Whats-new-3.0.html b/preview/contents/Whats-new-3.0.html new file mode 100644 index 0000000..493ccbe --- /dev/null +++ b/preview/contents/Whats-new-3.0.html @@ -0,0 +1,95 @@ +3.0の新機能
+

3.0の新機能

+ + +

+ Couchbase Server 3.0はスケーラビリティ、パフォーマンス、可用性、信頼性、管理の容易性、セキュリティに対する、非常に重要な機能拡張を含むメジャーリリースです。 +

+ + +

+ Couchbase Server 3.0は、最も高性能でスケーラブルなNoSQLデータベースとして、 + ミッションクリティカルなエンタープライズアプリケーションにおいて、Couchbaseがリードする領域を広げます。 + エンタープライズ用途の優れた新機能を追加するだけではなく、3.0では、最適なNoSQLプロダクトとしてご利用いただくため、 + 開発者や管理者がCouchbase Serverをより簡単に扱うための新機能を追加しています。 +

+ + + + +

新機能

+

次のリストはCouchbase Server 3.0の主要な機能拡張、新機能です:

+ + + + + +
+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/XDCR/xdcr-architecture.html b/preview/contents/XDCR/xdcr-architecture.html new file mode 100644 index 0000000..d84e5cd --- /dev/null +++ b/preview/contents/XDCR/xdcr-architecture.html @@ -0,0 +1,65 @@ +XDCR architecture
+

XDCR architecture

+ +
+

There are a number of key elements in Couchbase Server’s XDCR architecture including:

+ +

Continuous Replication. XDCR in Couchbase Server provides continuous replication + across geographically distributed datacenters. Data mutations are replicated to the + destination cluster after they are written to disk. There are multiple data streams (32 by + default) that are shuffled across all shards (called vBuckets in Couchbase Server) on the + source cluster to move data in parallel to the destination cluster. The vBucket list is + shuffled so that replication is evenly load balanced across all the servers in the cluster. + The clusters scale horizontally, more the servers, more the replication streams, faster the + replication rate.

+ +

Cluster Aware. XDCR is cluster topology aware. The source and destination clusters + could have different number of servers. If a server in the source or destination cluster goes + down, XDCR is able to get the updated cluster topology information and continue replicating + data to available servers in the destination cluster.

+ +

Push based connection resilient replication. XDCR in Couchbase Server is push-based + replication. The source cluster regularly checkpoints the replication queue per vBucket and + keeps track of what data the destination cluster last received. If the replication process is + interrupted for example due to a server crash or intermittent network connection failures, it + is not required to restart replication from the beginning. Instead, once the replication link + is restored, replication can continue from the last checkpoint seen by the destination + cluster.

+ +

Efficient. For the sake of efficiency, Couchbase Server is able to de-duplicate + information that is waiting to be stored on disk. For instance, if there are three changes to + the same document in Couchbase Server, and these three changes are waiting in queue to be + persisted, only the last version of the document is stored on disk and later gets pushed into + the XDCR queue to be replicated.

+ +

Active-Active Conflict Resolution. Within a cluster, Couchbase Server provides strong + consistency at the document level. On the other hand, XDCR also provides eventual consistency + across clusters. Built-in conflict resolution will pick the same “winner” on both the clusters + if the same document was mutated on both the clusters. If a conflict occurs, the document with + the most updates will be considered the “winner.” If the same document is updated the same + number of times on the source and destination, additional metadata such as numerical sequence, + CAS value, document flags and expiration TTL value are used to pick the “winner.” XDCR applies + the same rule across clusters to make sure document consistency is maintained:

+ + + +

As shown in above, bidirectional replication is set up between Datacenter 1 and Datacenter 2 + and both the clusters start off with the same JSON document (Doc 1). In addition, two + additional updates to Doc 1 happen on Datacenter 2. In the case of a conflict, Doc 1 on + Datacenter 2 is chosen as the winner because it has seen more updates.

+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/XDCR/xdcr-dataEncryption.html b/preview/contents/XDCR/xdcr-dataEncryption.html new file mode 100644 index 0000000..997c8b1 --- /dev/null +++ b/preview/contents/XDCR/xdcr-dataEncryption.html @@ -0,0 +1,80 @@ +XDCRのデータ暗号化
+

XDCRのデータ暗号化

+ + +

+ クロスデータセンタレプリケーション(XDCR)のデータセキュリティ機能は、 + Secure Socket Layer (SSL)を利用したデータ暗号化によるセキュアなクロスデータセンタレプリケーションを利用できます。 +

+ +
重要: + この機能はエンタープライズエディションでのみ利用可能です。 +
+ +

+ クラスタ間でレプリケートされるデータは、単一方向でも双方向のレプリケーショントポロジでも暗号化が可能です。 +

+ +

+ デフォルトでは、XDCRで宛先クラスタへ送信されるデータは、暗号化されていない平文です。 + 暗号化を行わない場合で、XDCRトラフィックがパブリックなネットワークを経由して転送される場合、 + VPNゲートウェイを二つのデータセンタ間に設定してデータを各ルート間で暗号することを推奨します。 +

+ +

+ XDCRデータ暗号化機能を利用すると、ソースクラスタからのXDCRトラフィックは、 + 宛先クラスタの証明書を設定してXDCR暗号化オプションを有効にすることで、セキュアにレプリケーションできます。 + 証明書は自己署名の証明書で、SSLがセキュアなセッションを確立するために利用します。 +

+ + +
注: + XDCRデータの暗号化はCouchbaseの自己署名証明書のみサポートしています。 + その他の証明書ファイルをインポートすることはできず、認証局(CA)によりサインされた証明書を利用することもできません。 +
+ + +

+ データ暗号化はソースと宛先クラスタの間で実施されます。 + データ暗号化はクラスタレベルで実行されるため、宛先クラスタにレプリケートされるすべてのバケットでデータが暗号化されます。 + データの暗号化を利用せずバケットをレプリケートする必要がある場合、もうひとつXDCRデータ暗号化を無効にしたXDCR宛先クラスタを作成します。 +

+ +

+ +
重要: + データを暗号化したレプリケーションと、しないレプリケーションを同一のXDCRソースクラスタと宛先クラスタで混在させることはできません。 + 例えば、クラスタA(ソース)がクラスタB(宛先)へのデータ暗号化を有効にしていた場合、 + クラスタA(ソース)はクラスタB(宛先)に対し、暗号化しないレプリケーションを設定することはできません。 +
+ + +

+ XDCRデータ暗号化でサポートしているSSL/TLSバージョンは、SSL-3.0とTLS-1.0です。 + デフォルトではXDCRはrc4-128Cipherスイートを利用します、しかし、 + rc4-128が利用できない場合、aes128を利用します。 + COUCHBASE_WANT_ARCFOUR環境変数を設定し、XDCRでrc4-128のみを利用するように設定することができます。 + TLS/SSLハンドシェイクロジックではOpenSSLを利用していません。 + 代わりに、TLS/SSLロジックがErlangで実装されています。 + 特定のCipher/プロトコル/証明書が必須の場合、代替策として、クラスタ間を暗号化したVPN接続でつなぐ方法があります。 +

+ + + + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/XDCR/xdcr-docs.html b/preview/contents/XDCR/xdcr-docs.html new file mode 100644 index 0000000..13571f8 --- /dev/null +++ b/preview/contents/XDCR/xdcr-docs.html @@ -0,0 +1,27 @@ +XDCRドキュメントのハンドリング
+

XDCRドキュメントのハンドリング

+ + +

XDCRはビューやビューのインデックスは複製しません。

+ +

+ ビューやビューのインデックスを複製するには、手動でビュー定義をクラスタ間でコピーし、目的のクラスタでインデックスを再生成します。 +

+ +

+ ソースクラスタ上のUTF-8でエンコードできないドキュメントIDは自動的にフィルタリングされ、ログに出力されます。 + これらのIDはリモートクラスタに転送されません。 + 非UTF-8のキーが存在する場合、XDCRが検知した非UTF-8のすべてのキーのリストとともに、ログファイルにxdcr_error.*の警告が出力されます。 +

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/XDCR/xdcr-flushRequests.html b/preview/contents/XDCR/xdcr-flushRequests.html new file mode 100644 index 0000000..d7a8e0d --- /dev/null +++ b/preview/contents/XDCR/xdcr-flushRequests.html @@ -0,0 +1,46 @@ +XDCR flush requests
+

XDCR flush requests

+ + +

Flush requests to delete the entire contents of bucket are not replicated to the remote + cluster.

+ +

Performing a flush operation only deletes data on the local cluster. Flush is disabled if + there is an active outbound replica stream configured.

+ + +
If a bucket needs to be flushed on either the source or the destination of an XDCR stream, + use the following operation sequence: +
    +
  1. Delete the XDCR stream.
  2. + +
  3. Flush the vBucket.
  4. + +
  5. Recreate the XDCR stream.
  6. + +
+
+ + +

If this bucket is acting as more than one source or destination for XDCR, + all streams need to be deleted before the flush and recreated afterward. + This resets the XDCR stream entirely and results in all data being resent. + Deleting and recreating the XDCR stream does not reset the stream or + resend the data that has been synchronized.

+ + +
Important: When replicating to or from a bucket, do not flush that bucket on the + source or destination cluster. Flushing causes the vBucket state to become temporarily + inaccessible and results in a "not_found” error. The error suspends replication.
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/XDCR/xdcr-intro.html b/preview/contents/XDCR/xdcr-intro.html new file mode 100644 index 0000000..94d48d1 --- /dev/null +++ b/preview/contents/XDCR/xdcr-intro.html @@ -0,0 +1,75 @@ +クロスデータセンターレプリケーション(XDCR)
+

クロスデータセンターレプリケーション(XDCR)

+ + +

XDCRは、主に災害復旧のために、あるクラスタのデータを別のクラスタに複製します。

+ +

Couchbase Server supports cross datacenter replication (XDCR), providing an easy way to + replicate data from one cluster to another for disaster recovery as well as better data + locality (getting data closer to its users).

+ +

Couchbase Server provides support for both intra-cluster replication and cross datacenter + replication (XDCR). Intra-cluster replication is the process of replicating data on multiple + servers within a cluster in order to provide data redundancy should one or more servers crash. + Data in Couchbase Server is distributed uniformly across all the servers in a cluster, with + each server holding active and replica documents. When a new document is added to Couchbase + Server, in addition to being persisted, it is also replicated to other servers within the + cluster (this is configurable up to three replicas). If a server goes down, failover promotes + replica data to active:

+ +
+ +
+ +

Cross datacenter replication in Couchbase Server involves replicating active data to + multiple, geographically diverse datacenters either for disaster recovery or to bring data + closer to its users for faster data access, as shown in below:

+ +
+ +
+ + +

You can also see that XDCR and intra-cluster replication occurs simultaneously. Intra-cluster + replication is taking place within the clusters at both Datacenter 1 and Datacenter 2, while + at the same time XDCR is replicating documents across datacenters. Both datacenters are + serving read and write requests from the application.

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/XDCR/xdcr-memcachedReplication.html b/preview/contents/XDCR/xdcr-memcachedReplication.html new file mode 100644 index 0000000..f53414b --- /dev/null +++ b/preview/contents/XDCR/xdcr-memcachedReplication.html @@ -0,0 +1,48 @@ +XDCR replication via memcached protocol
+

XDCR replication via memcached protocol

+ + +

XDCR can replicate data through the memcached protocol at a destination cluster.

+ +

This mode utilizes highly efficient memcached protocol on the destination cluster for replicating + changes. The new mode of XDCR increases XDCR throughput, reducing the CPU usage at destination + cluster and also improves XDCR scalability.

+ +

In earlier versions of Couchbase Server only the REST protocol could be used for replication. + On a source cluster a work process batched multiple mutations and sent the batch to a + destination cluster using a REST interface. The REST interface at the destination node + unpacked the batch of mutations and sent each mutation via a single memcached command. The + destination cluster then stored mutations in RAM. This process is known as CAPI mode + XDCR as it relies on the REST API known as CAPI.

+ +

This second mode available for XDCR is known as XMEM mode XDCR which bypasses the REST + interface and replicates mutations via the memcached protocol at the destination cluster:

+ + + +

In this mode, every replication process at a source cluster delivers mutations directly via + the memcached protocol on the remote cluster. This additional mode does not impact current + XDCR architecture, rather it is implemented completely within the data communication layer + used in XDCR. Any external XDCR interface remains the same. The benefit of using this mode is + performance by increasing XDCR throughput, improving XDCR scalability, and reducing CPU usage + at destination clusters during replication.

+ +

XDCR can be configured to operate via the new XMEM mode, which is the default or with CAPI + mode. To change the replication mode, change the setting for + xdcr_replication_mode via the Web Console or REST API.

+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/XDCR/xdcr-memory-replication.html b/preview/contents/XDCR/xdcr-memory-replication.html new file mode 100644 index 0000000..3e05f0f --- /dev/null +++ b/preview/contents/XDCR/xdcr-memory-replication.html @@ -0,0 +1,67 @@ +ストリームベースのXDCR
+

ストリームベースのXDCR

+ + +

+ ストリームベースのXDCRはソースクラスタ上のデータ変更をメモリから収集し、データ変更を直接宛先クラスタのメモリへとストリームします。 +

+ + + +

+ ストリームベースのXDCRレプリケーションは、ストリームベースのプロトコルである、データベース変更プロトコル(DCP)により実現しました。 + データ変更が検知されると、宛先クラスタのメモリへストリームされ、各クラスタはデータをディスクに永続化します。 + ソースクラスタでは、(メモリ内の)データの変更はキューに登録され、ディスクに永続化されます。 + これと関連して、宛先クラスタでは、(メモリにストリームされた)データ変更がキューに登録され、ディスクへと永続化されます。 +

+ + + + +

ストリームベースのXDCRレプリケーションは以下を提供します:

+ +
    +
  • より小さなデータレプリケーションレイテンシ
  • + +
  • 高可用性とディザスタリカバリ
  • + +
  • リカバリポイントオブジェクティブ(RPO)の向上
  • + +
  • より小さなデータロスウィンドウ
  • + +
+ + + + + + +

後方互換性

+
    +
  • アップグレードの際、自動的に変更が行わます。
  • + +
  • アップグレードが必要なのはソースクラスタのみです。宛先クラスタはデータ変更をメモリへと反映します。
  • + +
+ +
+ + + +
+ + +
\ No newline at end of file diff --git a/preview/contents/XDCR/xdcr-pause-resume.html b/preview/contents/XDCR/xdcr-pause-resume.html new file mode 100644 index 0000000..4c0231a --- /dev/null +++ b/preview/contents/XDCR/xdcr-pause-resume.html @@ -0,0 +1,31 @@ +XDCRレプリケーションの一時停止と再開
+

XDCRレプリケーションの一時停止と再開

+ + + +

XDCRレプリケーション実行中に、レプリケーションを一時停止し、再開することができます。

+ +

+ ソースと宛先クラスタ間のXDCRストリームは、一時停止し、その後再開することができます。 + XDCRを再開すると、前回停止した時点からソースと宛先クラスタの間でデータのレプリケーションを開始し、継続します。 +

+ + +

詳細は、Couchbase Webコンソール、 + CLI、 + REST APIをご参照ください。

+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/XDCR/xdcr-streamMgmt.html b/preview/contents/XDCR/xdcr-streamMgmt.html new file mode 100644 index 0000000..47e7aea --- /dev/null +++ b/preview/contents/XDCR/xdcr-streamMgmt.html @@ -0,0 +1,44 @@ +XDCR stream management
+

XDCR stream management

+ + +

New XDCR stream creation must occur a period of time after creating a bucket or after deleting a XDCR stream.

+ +

XDCR stream management Under the following circumstances, a period of time should pass + (depending on the CPU load) before creating new XDCR streams:

+ + +
    +
  • After creating a bucket
  • + +
  • After deleting an old XDCR stream
  • + +
+ + +

If a new XDCR stream is created immediately after a bucket has been created, a db_not_found + error may occur. When a bucket is created, a period of time passes before the buckets are + available. If XDCR tries to replicate to or from the vBucket too soon, a db_not_found error + occurs. The same situation applies when other clients are “talking” to a bucket.

+ +

If a new XDCR stream is created immediately after an old XDCR stream is deleted, an Erlang + eaddrinuse error occurs. This is related to the Erlang implementation of the TCP/IP protocol. + After an Erlang process releases a socket, the socket stays in TIME_WAIT for a while before a + new Erlang process can reuse it. If the new XDCR stream is created too quickly, vBucket + replicators may encounter the eaddrinuse error and XDCR may not be able to fully start.

+ + +
Note: The TIME_WAIT interval may be tunable from the operating system. + If so, try lowering the interval time.
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/XDCR/xdcr-systemOutage.html b/preview/contents/XDCR/xdcr-systemOutage.html new file mode 100644 index 0000000..98d2f89 --- /dev/null +++ b/preview/contents/XDCR/xdcr-systemOutage.html @@ -0,0 +1,25 @@ +XDCR and network or system outages
+

XDCR and network or system outages

+ + +

XDCR is resilient to intermittent network failures.

+ +

In the event that the destination cluster + is unavailable due to a network interruption, XDCR pauses replication and then retries the + connection to the cluster every 30 seconds. Once XDCR can successfully reconnect with a + destination cluster, it resumes replication. In the event of a more prolonged network failure + where the destination cluster is unavailable for more than 30 seconds, a source cluster + continues polling the destination cluster which may result in numerous errors over time.

+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/XDCR/xdcr-topologies-adv.html b/preview/contents/XDCR/xdcr-topologies-adv.html new file mode 100644 index 0000000..2295d1b --- /dev/null +++ b/preview/contents/XDCR/xdcr-topologies-adv.html @@ -0,0 +1,31 @@ +XDCR advanced topologies
+

XDCR advanced topologies

+ +
+

By combining unidirectional and bidirectional topologies, you have the flexibility to create + several complex topologies such as the chain and propagation topology.

+ + + +

In the image below there is one bidirectional replication link between Datacenter 1 and + Datacenter 2 and two unidirectional replication links between Datacenter 2 and Datacenters 3 + and 4. Propagation replication can be useful in a scenario when you want to setup a + replication scheme between two regional offices and several other local offices. Data between + the regional offices is replicated bidirectionally between Datacenter 1 and Datacenter 2. Data + changes in the local offices (Datacenters 3 and 4) are pushed to the regional office using + unidirectional replication:

+ + + + +
+ +
\ No newline at end of file diff --git a/preview/contents/XDCR/xdcr-topologies.html b/preview/contents/XDCR/xdcr-topologies.html new file mode 100644 index 0000000..955d0ac --- /dev/null +++ b/preview/contents/XDCR/xdcr-topologies.html @@ -0,0 +1,70 @@ +XDCR basic topologies
+

XDCR basic topologies

+ +
+

XDCR can be configured to support a variety of different topologies; the most common are + unidirectional and bidirectional.

+ +

Unidirectional Replication is one-way replication, where active data gets replicated from the + source cluster to the destination cluster. You may use unidirectional replication when you + want to create an active offsite backup, replicating data from one cluster to a backup + cluster.

+ +

Bidirectional Replication enables two clusters to replicate data with each other. Setting up + bidirectional replication in Couchbase Server involves setting up two unidirectional + replication links from one cluster to the other. This is useful when you want to load balance + your workload across two clusters where each cluster bidirectionally replicates data to the + other cluster.

+ +

In both topologies, data changes on the source cluster are replicated to the destination + cluster only after they are persisted to disk. You can also have more than two datacenters and + replicate data between all of them.

+ +

XDCR can be setup on a per bucket basis. A bucket is a logical container for documents in + Couchbase Server. Depending on your application requirements, you might want to replicate only + a subset of the data in Couchbase Server between two clusters. With XDCR you can selectively + pick which buckets to replicate between two clusters in a unidirectional or bidirectional + fashion. As shown in Figure 3, there is no XDCR between Bucket A (Cluster 1) and Bucket A + (Cluster 2). Unidirectional XDCR is setup between Bucket B (Cluster 1) and Bucket B (Cluster + 2). There is bidirectional XDCR between Bucket C (Cluster 1) and Bucket C (Cluster 2):

+ +

Cross datacenter replication in Couchbase Server involves replicating active data to + multiple, geographically diverse datacenters either for disaster recovery or to bring data + closer to its users for faster data access, as shown in below:

+ + + + +

As shown above, after the document is stored in Couchbase Server and before XDCR replicates a + document to other datacenters, a couple of things happen within each Couchbase Server + node.

+ +
    +
  1. Each server in a Couchbase cluster has a managed cache. When an application stores a + document in Couchbase Server it is written into the managed cache.
  2. + +
  3. The document is added into the intra-cluster replication queue to be replicated to other + servers within the cluster.
  4. + +
  5. The document is added into the disk write queue to be asynchronously persisted to disk. + The document is persisted to disk after the disk-write queue is flushed.
  6. + +
  7. After the documents are persisted to disk, XDCR pushes the replica documents to other + clusters. On the destination cluster, replica documents received will be stored in cache. + This means that replica data on the destination cluster can undergo low latency read/write + operations: +
  8. + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/XDCR/xdcr-usecases.html b/preview/contents/XDCR/xdcr-usecases.html new file mode 100644 index 0000000..82602a4 --- /dev/null +++ b/preview/contents/XDCR/xdcr-usecases.html @@ -0,0 +1,26 @@ +XDCR use cases

XDCR use cases

+

Disaster Recovery. Disaster can strike your datacenter at any time – often +with little or no warning. With active-active cross datacenter replication in +Couchbase Server, applications can read and write to any geo-location ensuring +availability of data 24x365 even if an entire datacenter goes down.

+

Bringing Data Closer to Users. Interactive web applications demand low +latency response times to deliver an awesome application experience. The best +way to reduce latency is to bring relevant data closer to the user. For example, +in online advertising, sub-millisecond latency is needed to make optimized +decisions about real-time ad placements. XDCR can be used to bring +post-processed user profile data closer to the user for low latency data access.

+

Data Replication for Development and Test Needs. Developers and testers +often need to simulate production-like environments for troubleshooting or to +produce a more reliable test. By using cross datacenter replication, you can +create test clusters that host subset of your production data so that you can +test code changes without interrupting production processing or risking data +loss.

+
+
\ No newline at end of file diff --git a/preview/contents/admin-intro.html b/preview/contents/admin-intro.html new file mode 100644 index 0000000..c8ced8a --- /dev/null +++ b/preview/contents/admin-intro.html @@ -0,0 +1,35 @@ +Couchbase Serverの管理
+

Couchbase Serverの管理

+ +

Couchbase Serverの管理を行う上でさまざまなツールやシステムを利用可能です。

+ +

Couchbase Serverの管理者ガイドでは、次のトピックを解説します:

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/assets/fonts/kievitot-bold.eot b/preview/contents/assets/fonts/kievitot-bold.eot new file mode 100644 index 0000000..6a17c7f Binary files /dev/null and b/preview/contents/assets/fonts/kievitot-bold.eot differ diff --git a/preview/contents/assets/fonts/kievitot-bold.woff b/preview/contents/assets/fonts/kievitot-bold.woff new file mode 100644 index 0000000..0c0a673 Binary files /dev/null and b/preview/contents/assets/fonts/kievitot-bold.woff differ diff --git a/preview/contents/assets/fonts/kievitot-bolditalic.eot b/preview/contents/assets/fonts/kievitot-bolditalic.eot new file mode 100644 index 0000000..9c787cf Binary files /dev/null and b/preview/contents/assets/fonts/kievitot-bolditalic.eot differ diff --git a/preview/contents/assets/fonts/kievitot-bolditalic.woff b/preview/contents/assets/fonts/kievitot-bolditalic.woff new file mode 100644 index 0000000..ace6ea0 Binary files /dev/null and b/preview/contents/assets/fonts/kievitot-bolditalic.woff differ diff --git a/preview/contents/assets/fonts/kievitot-italic.eot b/preview/contents/assets/fonts/kievitot-italic.eot new file mode 100644 index 0000000..2f562f5 Binary files /dev/null and b/preview/contents/assets/fonts/kievitot-italic.eot differ diff --git a/preview/contents/assets/fonts/kievitot-italic.woff b/preview/contents/assets/fonts/kievitot-italic.woff new file mode 100644 index 0000000..a948a2c Binary files /dev/null and b/preview/contents/assets/fonts/kievitot-italic.woff differ diff --git a/preview/contents/assets/fonts/kievitot-regular.eot b/preview/contents/assets/fonts/kievitot-regular.eot new file mode 100644 index 0000000..ff3e024 Binary files /dev/null and b/preview/contents/assets/fonts/kievitot-regular.eot differ diff --git a/preview/contents/assets/fonts/kievitot-regular.woff b/preview/contents/assets/fonts/kievitot-regular.woff new file mode 100644 index 0000000..d58f8a9 Binary files /dev/null and b/preview/contents/assets/fonts/kievitot-regular.woff differ diff --git a/preview/contents/assets/images/figures/why-nosql-2.png b/preview/contents/assets/images/figures/why-nosql-2.png new file mode 100644 index 0000000..db9bd87 Binary files /dev/null and b/preview/contents/assets/images/figures/why-nosql-2.png differ diff --git a/preview/contents/assets/images/figures/why-nosql-3.png b/preview/contents/assets/images/figures/why-nosql-3.png new file mode 100644 index 0000000..668fbfa Binary files /dev/null and b/preview/contents/assets/images/figures/why-nosql-3.png differ diff --git a/preview/contents/assets/images/figures/why-nosql-4.png b/preview/contents/assets/images/figures/why-nosql-4.png new file mode 100644 index 0000000..8d97af8 Binary files /dev/null and b/preview/contents/assets/images/figures/why-nosql-4.png differ diff --git a/preview/contents/assets/images/figures/why-nosql-5.png b/preview/contents/assets/images/figures/why-nosql-5.png new file mode 100644 index 0000000..159108d Binary files /dev/null and b/preview/contents/assets/images/figures/why-nosql-5.png differ diff --git a/preview/contents/assets/images/icons/article-arrow.png b/preview/contents/assets/images/icons/article-arrow.png new file mode 100644 index 0000000..6917e0e Binary files /dev/null and b/preview/contents/assets/images/icons/article-arrow.png differ diff --git a/preview/contents/assets/images/icons/carousel-next.png b/preview/contents/assets/images/icons/carousel-next.png new file mode 100644 index 0000000..ce931c7 Binary files /dev/null and b/preview/contents/assets/images/icons/carousel-next.png differ diff --git a/preview/contents/assets/images/icons/carousel-previous.png b/preview/contents/assets/images/icons/carousel-previous.png new file mode 100644 index 0000000..c642e15 Binary files /dev/null and b/preview/contents/assets/images/icons/carousel-previous.png differ diff --git a/preview/contents/assets/images/icons/close.png b/preview/contents/assets/images/icons/close.png new file mode 100644 index 0000000..d386d2f Binary files /dev/null and b/preview/contents/assets/images/icons/close.png differ diff --git a/preview/contents/assets/images/icons/contact-avatar.png b/preview/contents/assets/images/icons/contact-avatar.png new file mode 100644 index 0000000..ea44c58 Binary files /dev/null and b/preview/contents/assets/images/icons/contact-avatar.png differ diff --git a/preview/contents/assets/images/icons/developer-portal-mobile.png b/preview/contents/assets/images/icons/developer-portal-mobile.png new file mode 100644 index 0000000..77ad871 Binary files /dev/null and b/preview/contents/assets/images/icons/developer-portal-mobile.png differ diff --git a/preview/contents/assets/images/icons/developer-portal-projects.png b/preview/contents/assets/images/icons/developer-portal-projects.png new file mode 100644 index 0000000..e1c0b1c Binary files /dev/null and b/preview/contents/assets/images/icons/developer-portal-projects.png differ diff --git a/preview/contents/assets/images/icons/developer-portal-server.png b/preview/contents/assets/images/icons/developer-portal-server.png new file mode 100644 index 0000000..584725a Binary files /dev/null and b/preview/contents/assets/images/icons/developer-portal-server.png differ diff --git a/preview/contents/assets/images/icons/developer-portal-sidebar-navigation--active.png b/preview/contents/assets/images/icons/developer-portal-sidebar-navigation--active.png new file mode 100644 index 0000000..a61487e Binary files /dev/null and b/preview/contents/assets/images/icons/developer-portal-sidebar-navigation--active.png differ diff --git a/preview/contents/assets/images/icons/developer-portal-sidebar-navigation-toggler.png b/preview/contents/assets/images/icons/developer-portal-sidebar-navigation-toggler.png new file mode 100644 index 0000000..e10651b Binary files /dev/null and b/preview/contents/assets/images/icons/developer-portal-sidebar-navigation-toggler.png differ diff --git a/preview/contents/assets/images/icons/developer-portal-sidebar-navigation.png b/preview/contents/assets/images/icons/developer-portal-sidebar-navigation.png new file mode 100644 index 0000000..49254fc Binary files /dev/null and b/preview/contents/assets/images/icons/developer-portal-sidebar-navigation.png differ diff --git a/preview/contents/assets/images/icons/developer-portal-sidebar-versions-toggler--active.png b/preview/contents/assets/images/icons/developer-portal-sidebar-versions-toggler--active.png new file mode 100644 index 0000000..c18109a Binary files /dev/null and b/preview/contents/assets/images/icons/developer-portal-sidebar-versions-toggler--active.png differ diff --git a/preview/contents/assets/images/icons/developer-portal-sidebar-versions-toggler.png b/preview/contents/assets/images/icons/developer-portal-sidebar-versions-toggler.png new file mode 100644 index 0000000..e44dde0 Binary files /dev/null and b/preview/contents/assets/images/icons/developer-portal-sidebar-versions-toggler.png differ diff --git a/preview/contents/assets/images/icons/download-next.png b/preview/contents/assets/images/icons/download-next.png new file mode 100644 index 0000000..d0e64fa Binary files /dev/null and b/preview/contents/assets/images/icons/download-next.png differ diff --git a/preview/contents/assets/images/icons/download-previous.png b/preview/contents/assets/images/icons/download-previous.png new file mode 100644 index 0000000..73c30b5 Binary files /dev/null and b/preview/contents/assets/images/icons/download-previous.png differ diff --git a/preview/contents/assets/images/icons/download.png b/preview/contents/assets/images/icons/download.png new file mode 100644 index 0000000..d692c8e Binary files /dev/null and b/preview/contents/assets/images/icons/download.png differ diff --git a/preview/contents/assets/images/icons/event-date.png b/preview/contents/assets/images/icons/event-date.png new file mode 100644 index 0000000..905bffe Binary files /dev/null and b/preview/contents/assets/images/icons/event-date.png differ diff --git a/preview/contents/assets/images/icons/event-location.png b/preview/contents/assets/images/icons/event-location.png new file mode 100644 index 0000000..f4b8bd0 Binary files /dev/null and b/preview/contents/assets/images/icons/event-location.png differ diff --git a/preview/contents/assets/images/icons/event.png b/preview/contents/assets/images/icons/event.png new file mode 100644 index 0000000..1b98bbc Binary files /dev/null and b/preview/contents/assets/images/icons/event.png differ diff --git a/preview/contents/assets/images/icons/header-backlink.png b/preview/contents/assets/images/icons/header-backlink.png new file mode 100644 index 0000000..49268af Binary files /dev/null and b/preview/contents/assets/images/icons/header-backlink.png differ diff --git a/preview/contents/assets/images/icons/homepage-products-availability.png b/preview/contents/assets/images/icons/homepage-products-availability.png new file mode 100644 index 0000000..203ee33 Binary files /dev/null and b/preview/contents/assets/images/icons/homepage-products-availability.png differ diff --git a/preview/contents/assets/images/icons/homepage-products-mobility.png b/preview/contents/assets/images/icons/homepage-products-mobility.png new file mode 100644 index 0000000..cc4109c Binary files /dev/null and b/preview/contents/assets/images/icons/homepage-products-mobility.png differ diff --git a/preview/contents/assets/images/icons/homepage-products-performance.png b/preview/contents/assets/images/icons/homepage-products-performance.png new file mode 100644 index 0000000..889faa4 Binary files /dev/null and b/preview/contents/assets/images/icons/homepage-products-performance.png differ diff --git a/preview/contents/assets/images/icons/homepage-products-scalability.png b/preview/contents/assets/images/icons/homepage-products-scalability.png new file mode 100644 index 0000000..e5d0977 Binary files /dev/null and b/preview/contents/assets/images/icons/homepage-products-scalability.png differ diff --git a/preview/contents/assets/images/icons/learn-blog.png b/preview/contents/assets/images/icons/learn-blog.png new file mode 100644 index 0000000..f3bd3e6 Binary files /dev/null and b/preview/contents/assets/images/icons/learn-blog.png differ diff --git a/preview/contents/assets/images/icons/learn-events.png b/preview/contents/assets/images/icons/learn-events.png new file mode 100644 index 0000000..a7c0bbf Binary files /dev/null and b/preview/contents/assets/images/icons/learn-events.png differ diff --git a/preview/contents/assets/images/icons/learn-presentations.png b/preview/contents/assets/images/icons/learn-presentations.png new file mode 100644 index 0000000..900d0d7 Binary files /dev/null and b/preview/contents/assets/images/icons/learn-presentations.png differ diff --git a/preview/contents/assets/images/icons/learn-training.png b/preview/contents/assets/images/icons/learn-training.png new file mode 100644 index 0000000..9d94cb9 Binary files /dev/null and b/preview/contents/assets/images/icons/learn-training.png differ diff --git a/preview/contents/assets/images/icons/learn-webinars.png b/preview/contents/assets/images/icons/learn-webinars.png new file mode 100644 index 0000000..2447649 Binary files /dev/null and b/preview/contents/assets/images/icons/learn-webinars.png differ diff --git a/preview/contents/assets/images/icons/learn-whitepapers.png b/preview/contents/assets/images/icons/learn-whitepapers.png new file mode 100644 index 0000000..b5610c6 Binary files /dev/null and b/preview/contents/assets/images/icons/learn-whitepapers.png differ diff --git a/preview/contents/assets/images/icons/nav-arrow--active.png b/preview/contents/assets/images/icons/nav-arrow--active.png new file mode 100644 index 0000000..cc0960f Binary files /dev/null and b/preview/contents/assets/images/icons/nav-arrow--active.png differ diff --git a/preview/contents/assets/images/icons/nav-arrow.png b/preview/contents/assets/images/icons/nav-arrow.png new file mode 100644 index 0000000..5151f71 Binary files /dev/null and b/preview/contents/assets/images/icons/nav-arrow.png differ diff --git a/preview/contents/assets/images/icons/open.png b/preview/contents/assets/images/icons/open.png new file mode 100644 index 0000000..7b64f26 Binary files /dev/null and b/preview/contents/assets/images/icons/open.png differ diff --git a/preview/contents/assets/images/icons/pagination-next.png b/preview/contents/assets/images/icons/pagination-next.png new file mode 100644 index 0000000..f4746d9 Binary files /dev/null and b/preview/contents/assets/images/icons/pagination-next.png differ diff --git a/preview/contents/assets/images/icons/pagination-previous.png b/preview/contents/assets/images/icons/pagination-previous.png new file mode 100644 index 0000000..f6690e8 Binary files /dev/null and b/preview/contents/assets/images/icons/pagination-previous.png differ diff --git a/preview/contents/assets/images/icons/play.png b/preview/contents/assets/images/icons/play.png new file mode 100644 index 0000000..52372d3 Binary files /dev/null and b/preview/contents/assets/images/icons/play.png differ diff --git a/preview/contents/assets/images/icons/press-release.png b/preview/contents/assets/images/icons/press-release.png new file mode 100644 index 0000000..c8a2e6c Binary files /dev/null and b/preview/contents/assets/images/icons/press-release.png differ diff --git a/preview/contents/assets/images/icons/pricing-expertise.png b/preview/contents/assets/images/icons/pricing-expertise.png new file mode 100644 index 0000000..0aa68e4 Binary files /dev/null and b/preview/contents/assets/images/icons/pricing-expertise.png differ diff --git a/preview/contents/assets/images/icons/pricing-options.png b/preview/contents/assets/images/icons/pricing-options.png new file mode 100644 index 0000000..9cf3e6c Binary files /dev/null and b/preview/contents/assets/images/icons/pricing-options.png differ diff --git a/preview/contents/assets/images/icons/pricing-success.png b/preview/contents/assets/images/icons/pricing-success.png new file mode 100644 index 0000000..9572060 Binary files /dev/null and b/preview/contents/assets/images/icons/pricing-success.png differ diff --git a/preview/contents/assets/images/icons/pricing-support.png b/preview/contents/assets/images/icons/pricing-support.png new file mode 100644 index 0000000..b0a86f7 Binary files /dev/null and b/preview/contents/assets/images/icons/pricing-support.png differ diff --git a/preview/contents/assets/images/icons/pricing-updates.png b/preview/contents/assets/images/icons/pricing-updates.png new file mode 100644 index 0000000..9599ec8 Binary files /dev/null and b/preview/contents/assets/images/icons/pricing-updates.png differ diff --git a/preview/contents/assets/images/icons/quote.png b/preview/contents/assets/images/icons/quote.png new file mode 100644 index 0000000..b63e80f Binary files /dev/null and b/preview/contents/assets/images/icons/quote.png differ diff --git a/preview/contents/assets/images/icons/related-content--close.png b/preview/contents/assets/images/icons/related-content--close.png new file mode 100644 index 0000000..66ebed8 Binary files /dev/null and b/preview/contents/assets/images/icons/related-content--close.png differ diff --git a/preview/contents/assets/images/icons/related-content--grid.png b/preview/contents/assets/images/icons/related-content--grid.png new file mode 100644 index 0000000..5657a54 Binary files /dev/null and b/preview/contents/assets/images/icons/related-content--grid.png differ diff --git a/preview/contents/assets/images/icons/sales-office-marker.png b/preview/contents/assets/images/icons/sales-office-marker.png new file mode 100644 index 0000000..f266259 Binary files /dev/null and b/preview/contents/assets/images/icons/sales-office-marker.png differ diff --git a/preview/contents/assets/images/icons/search-close.png b/preview/contents/assets/images/icons/search-close.png new file mode 100644 index 0000000..dd61ec8 Binary files /dev/null and b/preview/contents/assets/images/icons/search-close.png differ diff --git a/preview/contents/assets/images/icons/search.png b/preview/contents/assets/images/icons/search.png new file mode 100644 index 0000000..9595e0c Binary files /dev/null and b/preview/contents/assets/images/icons/search.png differ diff --git a/preview/contents/assets/images/icons/share-email.png b/preview/contents/assets/images/icons/share-email.png new file mode 100644 index 0000000..c4af359 Binary files /dev/null and b/preview/contents/assets/images/icons/share-email.png differ diff --git a/preview/contents/assets/images/icons/share-facebook.png b/preview/contents/assets/images/icons/share-facebook.png new file mode 100644 index 0000000..f0425ff Binary files /dev/null and b/preview/contents/assets/images/icons/share-facebook.png differ diff --git a/preview/contents/assets/images/icons/share-reddit.png b/preview/contents/assets/images/icons/share-reddit.png new file mode 100644 index 0000000..495d34a Binary files /dev/null and b/preview/contents/assets/images/icons/share-reddit.png differ diff --git a/preview/contents/assets/images/icons/share-twitter.png b/preview/contents/assets/images/icons/share-twitter.png new file mode 100644 index 0000000..d4c5600 Binary files /dev/null and b/preview/contents/assets/images/icons/share-twitter.png differ diff --git a/preview/contents/assets/images/icons/social-facebook.png b/preview/contents/assets/images/icons/social-facebook.png new file mode 100644 index 0000000..eac0d8d Binary files /dev/null and b/preview/contents/assets/images/icons/social-facebook.png differ diff --git a/preview/contents/assets/images/icons/social-googleplus.png b/preview/contents/assets/images/icons/social-googleplus.png new file mode 100644 index 0000000..2dc595f Binary files /dev/null and b/preview/contents/assets/images/icons/social-googleplus.png differ diff --git a/preview/contents/assets/images/icons/social-linkedin.png b/preview/contents/assets/images/icons/social-linkedin.png new file mode 100644 index 0000000..e4e4952 Binary files /dev/null and b/preview/contents/assets/images/icons/social-linkedin.png differ diff --git a/preview/contents/assets/images/icons/social-twitter.png b/preview/contents/assets/images/icons/social-twitter.png new file mode 100644 index 0000000..95c7b21 Binary files /dev/null and b/preview/contents/assets/images/icons/social-twitter.png differ diff --git a/preview/contents/assets/images/icons/stats-population.png b/preview/contents/assets/images/icons/stats-population.png new file mode 100644 index 0000000..da5e5ca Binary files /dev/null and b/preview/contents/assets/images/icons/stats-population.png differ diff --git a/preview/contents/assets/images/icons/stats-time.png b/preview/contents/assets/images/icons/stats-time.png new file mode 100644 index 0000000..957e11f Binary files /dev/null and b/preview/contents/assets/images/icons/stats-time.png differ diff --git a/preview/contents/assets/images/icons/stats-users.png b/preview/contents/assets/images/icons/stats-users.png new file mode 100644 index 0000000..ddcda39 Binary files /dev/null and b/preview/contents/assets/images/icons/stats-users.png differ diff --git a/preview/contents/assets/images/icons/whitepaper.png b/preview/contents/assets/images/icons/whitepaper.png new file mode 100644 index 0000000..a72e357 Binary files /dev/null and b/preview/contents/assets/images/icons/whitepaper.png differ diff --git a/preview/contents/assets/images/logo.png b/preview/contents/assets/images/logo.png new file mode 100644 index 0000000..238d063 Binary files /dev/null and b/preview/contents/assets/images/logo.png differ diff --git a/preview/contents/assets/images/logo.svg b/preview/contents/assets/images/logo.svg new file mode 100644 index 0000000..c9f16f2 --- /dev/null +++ b/preview/contents/assets/images/logo.svg @@ -0,0 +1 @@ +logo \ No newline at end of file diff --git a/preview/contents/assets/images/logos/android.png b/preview/contents/assets/images/logos/android.png new file mode 100644 index 0000000..3ce2e99 Binary files /dev/null and b/preview/contents/assets/images/logos/android.png differ diff --git a/preview/contents/assets/images/logos/homepage-aol.png b/preview/contents/assets/images/logos/homepage-aol.png new file mode 100644 index 0000000..035eda0 Binary files /dev/null and b/preview/contents/assets/images/logos/homepage-aol.png differ diff --git a/preview/contents/assets/images/logos/homepage-cisco.png b/preview/contents/assets/images/logos/homepage-cisco.png new file mode 100644 index 0000000..8bea1a7 Binary files /dev/null and b/preview/contents/assets/images/logos/homepage-cisco.png differ diff --git a/preview/contents/assets/images/logos/homepage-docomo.png b/preview/contents/assets/images/logos/homepage-docomo.png new file mode 100644 index 0000000..82de6ac Binary files /dev/null and b/preview/contents/assets/images/logos/homepage-docomo.png differ diff --git a/preview/contents/assets/images/logos/homepage-ebay.png b/preview/contents/assets/images/logos/homepage-ebay.png new file mode 100644 index 0000000..c7088c4 Binary files /dev/null and b/preview/contents/assets/images/logos/homepage-ebay.png differ diff --git a/preview/contents/assets/images/logos/homepage-intel.png b/preview/contents/assets/images/logos/homepage-intel.png new file mode 100644 index 0000000..16bc3bc Binary files /dev/null and b/preview/contents/assets/images/logos/homepage-intel.png differ diff --git a/preview/contents/assets/images/logos/homepage-orbitz.png b/preview/contents/assets/images/logos/homepage-orbitz.png new file mode 100644 index 0000000..b911a92 Binary files /dev/null and b/preview/contents/assets/images/logos/homepage-orbitz.png differ diff --git a/preview/contents/assets/images/logos/homepage-salesforce.png b/preview/contents/assets/images/logos/homepage-salesforce.png new file mode 100644 index 0000000..f7ceb52 Binary files /dev/null and b/preview/contents/assets/images/logos/homepage-salesforce.png differ diff --git a/preview/contents/assets/images/logos/java.png b/preview/contents/assets/images/logos/java.png new file mode 100644 index 0000000..c339b1c Binary files /dev/null and b/preview/contents/assets/images/logos/java.png differ diff --git a/preview/contents/assets/images/logos/linux.png b/preview/contents/assets/images/logos/linux.png new file mode 100644 index 0000000..1bd9a49 Binary files /dev/null and b/preview/contents/assets/images/logos/linux.png differ diff --git a/preview/contents/assets/images/logos/mac.png b/preview/contents/assets/images/logos/mac.png new file mode 100644 index 0000000..146267c Binary files /dev/null and b/preview/contents/assets/images/logos/mac.png differ diff --git a/preview/contents/assets/images/logos/redhat.png b/preview/contents/assets/images/logos/redhat.png new file mode 100644 index 0000000..fbbfbbe Binary files /dev/null and b/preview/contents/assets/images/logos/redhat.png differ diff --git a/preview/contents/assets/images/logos/ubuntu.png b/preview/contents/assets/images/logos/ubuntu.png new file mode 100644 index 0000000..6ce452a Binary files /dev/null and b/preview/contents/assets/images/logos/ubuntu.png differ diff --git a/preview/contents/assets/images/logos/windows.png b/preview/contents/assets/images/logos/windows.png new file mode 100644 index 0000000..573bda4 Binary files /dev/null and b/preview/contents/assets/images/logos/windows.png differ diff --git a/preview/contents/assets/images/patterns/exhaust.jpg b/preview/contents/assets/images/patterns/exhaust.jpg new file mode 100644 index 0000000..64f8650 Binary files /dev/null and b/preview/contents/assets/images/patterns/exhaust.jpg differ diff --git a/preview/contents/assets/images/patterns/mosaic-bright.png b/preview/contents/assets/images/patterns/mosaic-bright.png new file mode 100644 index 0000000..86c0398 Binary files /dev/null and b/preview/contents/assets/images/patterns/mosaic-bright.png differ diff --git a/preview/contents/assets/images/patterns/mosaic-dark.png b/preview/contents/assets/images/patterns/mosaic-dark.png new file mode 100644 index 0000000..634fc08 Binary files /dev/null and b/preview/contents/assets/images/patterns/mosaic-dark.png differ diff --git a/preview/contents/assets/images/patterns/mosaic-light.png b/preview/contents/assets/images/patterns/mosaic-light.png new file mode 100644 index 0000000..2f74257 Binary files /dev/null and b/preview/contents/assets/images/patterns/mosaic-light.png differ diff --git a/preview/contents/assets/images/patterns/thatch.png b/preview/contents/assets/images/patterns/thatch.png new file mode 100644 index 0000000..d1b8e31 Binary files /dev/null and b/preview/contents/assets/images/patterns/thatch.png differ diff --git a/preview/contents/assets/images/photos/company-hq.jpg b/preview/contents/assets/images/photos/company-hq.jpg new file mode 100644 index 0000000..6d28452 Binary files /dev/null and b/preview/contents/assets/images/photos/company-hq.jpg differ diff --git a/preview/contents/assets/images/photos/homepage-image-header.jpg b/preview/contents/assets/images/photos/homepage-image-header.jpg new file mode 100644 index 0000000..8d760e4 Binary files /dev/null and b/preview/contents/assets/images/photos/homepage-image-header.jpg differ diff --git a/preview/contents/assets/images/products/always-available--sm--2x.png b/preview/contents/assets/images/products/always-available--sm--2x.png new file mode 100644 index 0000000..604ae23 Binary files /dev/null and b/preview/contents/assets/images/products/always-available--sm--2x.png differ diff --git a/preview/contents/assets/images/products/always-available--sm.png b/preview/contents/assets/images/products/always-available--sm.png new file mode 100644 index 0000000..7cc21ea Binary files /dev/null and b/preview/contents/assets/images/products/always-available--sm.png differ diff --git a/preview/contents/assets/images/products/always-available.png b/preview/contents/assets/images/products/always-available.png new file mode 100644 index 0000000..bfdceae Binary files /dev/null and b/preview/contents/assets/images/products/always-available.png differ diff --git a/preview/contents/assets/images/products/available-anywhere--2x.png b/preview/contents/assets/images/products/available-anywhere--2x.png new file mode 100644 index 0000000..06d120c Binary files /dev/null and b/preview/contents/assets/images/products/available-anywhere--2x.png differ diff --git a/preview/contents/assets/images/products/available-anywhere--sm.png b/preview/contents/assets/images/products/available-anywhere--sm.png new file mode 100644 index 0000000..2e94144 Binary files /dev/null and b/preview/contents/assets/images/products/available-anywhere--sm.png differ diff --git a/preview/contents/assets/images/products/available-anywhere.png b/preview/contents/assets/images/products/available-anywhere.png new file mode 100644 index 0000000..20e8560 Binary files /dev/null and b/preview/contents/assets/images/products/available-anywhere.png differ diff --git a/preview/contents/assets/images/products/data-mobility--sm--2x.png b/preview/contents/assets/images/products/data-mobility--sm--2x.png new file mode 100644 index 0000000..84b1195 Binary files /dev/null and b/preview/contents/assets/images/products/data-mobility--sm--2x.png differ diff --git a/preview/contents/assets/images/products/data-mobility--sm.png b/preview/contents/assets/images/products/data-mobility--sm.png new file mode 100644 index 0000000..7e35b3e Binary files /dev/null and b/preview/contents/assets/images/products/data-mobility--sm.png differ diff --git a/preview/contents/assets/images/products/data-mobility.png b/preview/contents/assets/images/products/data-mobility.png new file mode 100644 index 0000000..063ab83 Binary files /dev/null and b/preview/contents/assets/images/products/data-mobility.png differ diff --git a/preview/contents/assets/images/products/dev-power--sm--2x.png b/preview/contents/assets/images/products/dev-power--sm--2x.png new file mode 100644 index 0000000..0ebb902 Binary files /dev/null and b/preview/contents/assets/images/products/dev-power--sm--2x.png differ diff --git a/preview/contents/assets/images/products/dev-power--sm.png b/preview/contents/assets/images/products/dev-power--sm.png new file mode 100644 index 0000000..d4cd1e0 Binary files /dev/null and b/preview/contents/assets/images/products/dev-power--sm.png differ diff --git a/preview/contents/assets/images/products/dev-power.png b/preview/contents/assets/images/products/dev-power.png new file mode 100644 index 0000000..296ea73 Binary files /dev/null and b/preview/contents/assets/images/products/dev-power.png differ diff --git a/preview/contents/assets/images/products/feature-rich--2x.png b/preview/contents/assets/images/products/feature-rich--2x.png new file mode 100644 index 0000000..eb41acd Binary files /dev/null and b/preview/contents/assets/images/products/feature-rich--2x.png differ diff --git a/preview/contents/assets/images/products/feature-rich--sm.png b/preview/contents/assets/images/products/feature-rich--sm.png new file mode 100644 index 0000000..092abda Binary files /dev/null and b/preview/contents/assets/images/products/feature-rich--sm.png differ diff --git a/preview/contents/assets/images/products/feature-rich.png b/preview/contents/assets/images/products/feature-rich.png new file mode 100644 index 0000000..fc861f4 Binary files /dev/null and b/preview/contents/assets/images/products/feature-rich.png differ diff --git a/preview/contents/assets/images/products/flexible-map--sm--2x.png b/preview/contents/assets/images/products/flexible-map--sm--2x.png new file mode 100644 index 0000000..cbe3a5e Binary files /dev/null and b/preview/contents/assets/images/products/flexible-map--sm--2x.png differ diff --git a/preview/contents/assets/images/products/flexible-map--sm.png b/preview/contents/assets/images/products/flexible-map--sm.png new file mode 100644 index 0000000..2a5a7d5 Binary files /dev/null and b/preview/contents/assets/images/products/flexible-map--sm.png differ diff --git a/preview/contents/assets/images/products/flexible-map.png b/preview/contents/assets/images/products/flexible-map.png new file mode 100644 index 0000000..7064c2b Binary files /dev/null and b/preview/contents/assets/images/products/flexible-map.png differ diff --git a/preview/contents/assets/images/products/general-purpose--sm--2x.png b/preview/contents/assets/images/products/general-purpose--sm--2x.png new file mode 100644 index 0000000..9573801 Binary files /dev/null and b/preview/contents/assets/images/products/general-purpose--sm--2x.png differ diff --git a/preview/contents/assets/images/products/general-purpose--sm.png b/preview/contents/assets/images/products/general-purpose--sm.png new file mode 100644 index 0000000..ccc9b08 Binary files /dev/null and b/preview/contents/assets/images/products/general-purpose--sm.png differ diff --git a/preview/contents/assets/images/products/general-purpose.png b/preview/contents/assets/images/products/general-purpose.png new file mode 100644 index 0000000..9398651 Binary files /dev/null and b/preview/contents/assets/images/products/general-purpose.png differ diff --git a/preview/contents/assets/images/products/native-api--2x.png b/preview/contents/assets/images/products/native-api--2x.png new file mode 100644 index 0000000..2f36c35 Binary files /dev/null and b/preview/contents/assets/images/products/native-api--2x.png differ diff --git a/preview/contents/assets/images/products/native-api--sm.png b/preview/contents/assets/images/products/native-api--sm.png new file mode 100644 index 0000000..0e33461 Binary files /dev/null and b/preview/contents/assets/images/products/native-api--sm.png differ diff --git a/preview/contents/assets/images/products/native-api.png b/preview/contents/assets/images/products/native-api.png new file mode 100644 index 0000000..c476dff Binary files /dev/null and b/preview/contents/assets/images/products/native-api.png differ diff --git a/preview/contents/assets/images/products/onecode--2x.png b/preview/contents/assets/images/products/onecode--2x.png new file mode 100644 index 0000000..08442e5 Binary files /dev/null and b/preview/contents/assets/images/products/onecode--2x.png differ diff --git a/preview/contents/assets/images/products/onecode--sm.png b/preview/contents/assets/images/products/onecode--sm.png new file mode 100644 index 0000000..c13da45 Binary files /dev/null and b/preview/contents/assets/images/products/onecode--sm.png differ diff --git a/preview/contents/assets/images/products/onecode.png b/preview/contents/assets/images/products/onecode.png new file mode 100644 index 0000000..a316e3b Binary files /dev/null and b/preview/contents/assets/images/products/onecode.png differ diff --git a/preview/contents/assets/images/products/performance--sm--2x.png b/preview/contents/assets/images/products/performance--sm--2x.png new file mode 100644 index 0000000..cd72eb0 Binary files /dev/null and b/preview/contents/assets/images/products/performance--sm--2x.png differ diff --git a/preview/contents/assets/images/products/performance--sm.png b/preview/contents/assets/images/products/performance--sm.png new file mode 100644 index 0000000..bd65b99 Binary files /dev/null and b/preview/contents/assets/images/products/performance--sm.png differ diff --git a/preview/contents/assets/images/products/performance.png b/preview/contents/assets/images/products/performance.png new file mode 100644 index 0000000..e08cc75 Binary files /dev/null and b/preview/contents/assets/images/products/performance.png differ diff --git a/preview/contents/assets/images/products/powerful-admin--sm--2x.png b/preview/contents/assets/images/products/powerful-admin--sm--2x.png new file mode 100644 index 0000000..17f78bd Binary files /dev/null and b/preview/contents/assets/images/products/powerful-admin--sm--2x.png differ diff --git a/preview/contents/assets/images/products/powerful-admin--sm.png b/preview/contents/assets/images/products/powerful-admin--sm.png new file mode 100644 index 0000000..d6ca0d4 Binary files /dev/null and b/preview/contents/assets/images/products/powerful-admin--sm.png differ diff --git a/preview/contents/assets/images/products/powerful-admin.png b/preview/contents/assets/images/products/powerful-admin.png new file mode 100644 index 0000000..432ec90 Binary files /dev/null and b/preview/contents/assets/images/products/powerful-admin.png differ diff --git a/preview/contents/assets/images/products/real-time--sm--2x.png b/preview/contents/assets/images/products/real-time--sm--2x.png new file mode 100644 index 0000000..d07ad00 Binary files /dev/null and b/preview/contents/assets/images/products/real-time--sm--2x.png differ diff --git a/preview/contents/assets/images/products/real-time--sm.png b/preview/contents/assets/images/products/real-time--sm.png new file mode 100644 index 0000000..c086fec Binary files /dev/null and b/preview/contents/assets/images/products/real-time--sm.png differ diff --git a/preview/contents/assets/images/products/real-time.png b/preview/contents/assets/images/products/real-time.png new file mode 100644 index 0000000..d9725c7 Binary files /dev/null and b/preview/contents/assets/images/products/real-time.png differ diff --git a/preview/contents/assets/images/products/sync--2x.png b/preview/contents/assets/images/products/sync--2x.png new file mode 100644 index 0000000..f77ae03 Binary files /dev/null and b/preview/contents/assets/images/products/sync--2x.png differ diff --git a/preview/contents/assets/images/products/sync--sm.png b/preview/contents/assets/images/products/sync--sm.png new file mode 100644 index 0000000..8315530 Binary files /dev/null and b/preview/contents/assets/images/products/sync--sm.png differ diff --git a/preview/contents/assets/images/products/sync.png b/preview/contents/assets/images/products/sync.png new file mode 100644 index 0000000..90ba08f Binary files /dev/null and b/preview/contents/assets/images/products/sync.png differ diff --git a/preview/contents/assets/javascripts/application.js b/preview/contents/assets/javascripts/application.js new file mode 100644 index 0000000..3849f31 --- /dev/null +++ b/preview/contents/assets/javascripts/application.js @@ -0,0 +1,25 @@ +require( + [ + 'modules/navigation', + 'modules/globalheadersearch' + ], + + function(Navigation, GlobalHeaderSearch) { + new Navigation(); + new GlobalHeaderSearch(); + + var modules = document.body.getAttribute('data-modules'); + + if (modules !== null) { + modules = modules.trim(); + + if (modules.length) { + modules.split(' ').forEach(function(module) { + require(['modules/' + module], function(Module) { + new Module(); + }); + }); + } + } + } +); \ No newline at end of file diff --git a/preview/contents/assets/javascripts/init.js b/preview/contents/assets/javascripts/init.js new file mode 100644 index 0000000..65a6477 --- /dev/null +++ b/preview/contents/assets/javascripts/init.js @@ -0,0 +1,39 @@ +var BASEPATH; +if (!BASEPATH) { + BASEPATH = '../'; +} + +(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement); + +/* Added placeholder for GCSE */ +window.__gcse = { + callback: function() { + var gcse_el = document.getElementById('gsc-i-id1'); + gcse_el.setAttribute('placeholder', 'Search Documentation'); + } +}; + +/* Load Vendor Things */ +(function(d,t) { + if ('querySelector' in d && 'addEventListener' in window) { + r=d.createElement(t);s=d.querySelector(t); + r.src=BASEPATH+'assets/javascripts/vendor/require.js'; + r.setAttribute('data-main', BASEPATH+'assets/javascripts/application'); + s.parentNode.insertBefore(r,s); + } +})(document,'script'); + +/* Load Google Analytics */ +/* +var _gaq = _gaq || []; + _gaq.push(['_setAccount', 'UA-7763794-10']); + _gaq.push(['_setDomainName', '.couchbase.com']); + _gaq.push(['_setAllowLinker', true]); + _gaq.push(['_setAllowHash', false]); + _gaq.push(['_trackPageview']); + (function() { + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); +})(); +*/ diff --git a/preview/contents/assets/javascripts/modules/carousel.js b/preview/contents/assets/javascripts/modules/carousel.js new file mode 100644 index 0000000..d78ce9a --- /dev/null +++ b/preview/contents/assets/javascripts/modules/carousel.js @@ -0,0 +1,161 @@ +define(function() { + var Carousel = function() { + var modules = document.querySelectorAll('.carousel'); + + for (var i = 0, j = modules.length; i < j; i++) { + new CarouselModule(modules[i]); + } + }; + + var CarouselModule = function(el) { + this.el = el; + + this.init(); + }; + + CarouselModule.prototype = { + init: function() { + this.setVars(); + + if (this.pages.length > 1) { + this.appendNavigation(); + this.bindEvents(); + + this.setPagesWrapperHeight(); + this.setPageClasses(); + } + }, + + appendNavigation: function() { + this.nextNav.innerHTML = 'Next'; + this.nextNav.classList.add('carousel__navigation--next'); + this.nextNav.setAttribute('data-delta', '1'); + this.nextNav.setAttribute('type', 'button'); + + this.prevNav.innerHTML = 'Previous'; + this.prevNav.classList.add('carousel__navigation--previous'); + this.prevNav.setAttribute('data-delta', '-1'); + this.prevNav.setAttribute('type', 'button'); + + this.carouselWrapper.appendChild(this.nextNav); + this.carouselWrapper.appendChild(this.prevNav); + }, + + bindEvents: function() { + this.nextNav.addEventListener('click', this.click.bind(this)); + this.prevNav.addEventListener('click', this.click.bind(this)); + + window.addEventListener('resize', this.resize.bind(this)); + }, + + click: function(event) { + event.preventDefault(); + + var button = event.currentTarget, + delta = parseInt(button.getAttribute('data-delta'), 10); + + this.updateIndices(delta); + this.setPageClasses(); + }, + + resize: function(event) { + var t = setTimeout(function() { + this.pagesWrapper.removeAttribute('style'); + this.maxPageHeight = 0; + + this.setPagesWrapperHeight(); + + clearTimeout(t); + }.bind(this), 100); + }, + + setPageClasses: function() { + for (var i = 0, j = this.pages.length; i < j; i++) { + var page = this.pages[i]; + + page.classList.remove(this.classNames.currentPage); + page.classList.remove(this.classNames.nextPage); + page.classList.remove(this.classNames.previousPage); + + if (i == this.currentIndex) { + page.classList.add(this.classNames.currentPage); + } else if (i == this.prevIndex) { + page.classList.add(this.classNames.previousPage); + } else { + page.classList.add(this.classNames.nextPage); + } + } + }, + + setMaxPageHeight: function() { + for (var i = 0, j = this.pages.length; i < j; i++) { + var page = this.pages[i], + pageHeight = page.offsetHeight; + + this.maxPageHeight = pageHeight > this.maxPageHeight ? pageHeight : this.maxPageHeight; + } + }, + + setPagesWrapperHeight: function() { + this.setMaxPageHeight(); + + this.pagesWrapper.style.height = this.maxPageHeight + 'px'; + }, + + setVars: function() { + this.classNames = { + currentPage: 'carousel__page--current', + nextPage: 'carousel__page--next', + previousPage: 'carousel__page--previous' + }; + + this.carouselWrapper = this.el.querySelector('.carousel__wrapper'); + this.pagesWrapper = this.carouselWrapper.querySelector('.carousel__pages'); + this.pages = this.pagesWrapper.querySelectorAll('.carousel__page'); + + this.nextNav = document.createElement('button'); + this.prevNav = document.createElement('button'); + + this.totalPages = this.pages.length; + this.currentIndex = 0; + this.nextIndex = 1; + this.prevIndex = this.totalPages - 1; + this.maxPageHeight = 0; + }, + + updateIndices: function(delta) { + var newCurrentIndex = this.currentIndex + delta, + newNextIndex = newCurrentIndex + 1, + newPrevIndex = newCurrentIndex -1, + lastPageIndex = this.totalPages - 1; + + switch(newCurrentIndex) { + case -1: + newCurrentIndex = lastPageIndex; + newNextIndex = 0; + newPrevIndex = newCurrentIndex - 1; + break; + case 0: + newPrevIndex = lastPageIndex; + break; + case this.totalPages: + newCurrentIndex = 0; + newNextIndex = 1; + newPrevIndex = lastPageIndex; + break; + case this.totalPages - 1: + newNextIndex = 0; + break; + default: + newNextIndex = newCurrentIndex + 1; + newPrevIndex = newCurrentIndex - 1; + } + + this.currentIndex = newCurrentIndex; + this.nextIndex = newNextIndex; + this.prevIndex = newPrevIndex; + } + }; + + return Carousel; +}); \ No newline at end of file diff --git a/preview/contents/assets/javascripts/modules/developer-portal-sidebar-navigation.js b/preview/contents/assets/javascripts/modules/developer-portal-sidebar-navigation.js new file mode 100644 index 0000000..bb4cc47 --- /dev/null +++ b/preview/contents/assets/javascripts/modules/developer-portal-sidebar-navigation.js @@ -0,0 +1,43 @@ +define(function() { + var DeveloperPortalSidebarNavigation = function() { + this.el = document.getElementById('developer-portal-sidebar-navigation'); + + if (this.el) { + this.init(); + } + }; + + DeveloperPortalSidebarNavigation.prototype = { + init: function() { + var attributes = { + 'aria-controls': 'developer-portal-sidebar-navigation', + 'aria-pressed': 'false', + 'class': 'developer-portal-sidebar__navigation__toggler', + 'type': 'button' + }; + + this.toggler = document.createElement('button'); + + for (var attr in attributes) { + this.toggler.setAttribute(attr, attributes[attr]); + } + + this.toggler.innerHTML = '' + this.el.querySelector('.current').textContent.trim() + ''; + this.toggler.addEventListener('click', this.click.bind(this)); + + this.el.setAttribute('aria-expanded', 'false'); + this.el.parentNode.insertBefore(this.toggler, this.el); + }, + + click: function(event) { + event.preventDefault(); + + var isPressed = this.toggler.getAttribute('aria-pressed') !== 'true'; + + this.el.setAttribute('aria-expanded', isPressed); + this.toggler.setAttribute('aria-pressed', isPressed); + } + }; + + return DeveloperPortalSidebarNavigation; +}); \ No newline at end of file diff --git a/preview/contents/assets/javascripts/modules/developer-portal-versions-navigation.js b/preview/contents/assets/javascripts/modules/developer-portal-versions-navigation.js new file mode 100644 index 0000000..dc730f2 --- /dev/null +++ b/preview/contents/assets/javascripts/modules/developer-portal-versions-navigation.js @@ -0,0 +1,49 @@ +define(function() { + var DeveloperPortalVersionsNavigation = function() { + this.el = document.getElementById('developer-portal-versions-navigation'); + + if (this.el) { + this.init(); + } + }; + + DeveloperPortalVersionsNavigation.prototype = { + init: function() { + var attributes = { + 'aria-controls': 'developer-portal-versions-navigation', + 'aria-pressed': 'false', + 'class': 'developer-portal-sidebar__versions__toggler', + 'type': 'button' + }; + + var togglerWrapper = document.createElement('div'); + + togglerWrapper.setAttribute('class', 'developer-portal-sidebar__versions__toggler'); + + this.toggler = document.createElement('button'); + + for (var attr in attributes) { + this.toggler.setAttribute(attr, attributes[attr]); + } + + this.toggler.innerHTML = '' + this.el.querySelector('.active').textContent.trim() + ''; + this.toggler.addEventListener('click', this.click.bind(this)); + + togglerWrapper.appendChild(this.toggler); + + this.el.setAttribute('aria-expanded', 'false'); + this.el.parentNode.insertBefore(togglerWrapper, this.el); + }, + + click: function(event) { + event.preventDefault(); + + var isPressed = this.toggler.getAttribute('aria-pressed') !== 'true'; + + this.el.setAttribute('aria-expanded', isPressed); + this.toggler.setAttribute('aria-pressed', isPressed); + } + }; + + return DeveloperPortalVersionsNavigation; +}); \ No newline at end of file diff --git a/preview/contents/assets/javascripts/modules/download-section.js b/preview/contents/assets/javascripts/modules/download-section.js new file mode 100644 index 0000000..c7612da --- /dev/null +++ b/preview/contents/assets/javascripts/modules/download-section.js @@ -0,0 +1,62 @@ +define(function() { + var DownloadSection = function() { + var modules = document.querySelectorAll('.download-section'); + + for (var i = 0, j = modules.length; i < j; i++) { + new DownloadSectionModule(modules[i]); + } + }; + + var DownloadSectionModule = function(el) { + this.el = el; + + this.init(); + }; + + DownloadSectionModule.prototype = { + init: function() { + this.initInstructions(); + this.initAdditionalVersions(); + }, + + initAdditionalVersions: function() { + var anchors = this.el.querySelectorAll('.additional-versions a'), + containers = this.el.querySelectorAll('.download-table--additional-versions'); + + this.initElements(anchors, containers); + }, + + initInstructions: function() { + var anchors = this.el.querySelectorAll('.instructions'), + containers = this.el.querySelectorAll('.download-table__instructions'); + + this.initElements(anchors, containers); + }, + + initElements: function(anchors, containers) { + for (var i = 0, j = anchors.length; i < j; i++) { + var anchor = anchors[i], + container = containers[i]; + + anchor.addEventListener('click', this.click.bind(this)); + anchor.setAttribute('aria-controls', container.getAttribute('id')); + anchor.setAttribute('aria-pressed', 'false'); + + container.setAttribute('aria-expanded', 'false'); + } + }, + + click: function(event) { + event.preventDefault(); + + var anchor = event.currentTarget, + isActive = anchor.getAttribute('aria-pressed') !== 'true', + containerId = anchor.getAttribute('aria-controls'); + + this.el.querySelector('#' + containerId).setAttribute('aria-expanded', isActive); + anchor.setAttribute('aria-pressed', isActive); + } + }; + + return DownloadSection; +}); \ No newline at end of file diff --git a/preview/contents/assets/javascripts/modules/globalheadersearch.js b/preview/contents/assets/javascripts/modules/globalheadersearch.js new file mode 100644 index 0000000..89d0619 --- /dev/null +++ b/preview/contents/assets/javascripts/modules/globalheadersearch.js @@ -0,0 +1,51 @@ +define(function() { + var GlobalHeaderSearch = function() { + this.el = document.querySelector('#global-header-search'); + + if (this.el) { + this.init(); + } + }; + + GlobalHeaderSearch.prototype = { + init: function() { + var attributes = { + 'aria-controls': 'global-header-search__items', + 'aria-pressed': 'false', + 'class': 'global-header-search__toggler', + 'type': 'button' + }; + + this.searchInput = this.el.querySelector('input[type="search"]'); + this.toggler = document.createElement('button'); + + for (var attr in attributes) { + this.toggler.setAttribute(attr, attributes[attr]); + } + + this.toggler.innerHTML = 'Search'; + this.toggler.addEventListener('click', this.click.bind(this)); + + this.el.setAttribute('aria-expanded', 'false'); + this.el.appendChild(this.toggler); + this.el.classList.add('global-header-search--js'); + }, + + click: function(event) { + event.preventDefault(); + + var isPressed = this.toggler.getAttribute('aria-pressed') !== 'true'; + + this.el.setAttribute('aria-expanded', isPressed); + this.toggler.setAttribute('aria-pressed', isPressed); + + if (isPressed) { + this.searchInput.focus(); + } else { + this.toggler.focus(); + } + } + }; + + return GlobalHeaderSearch; +}); \ No newline at end of file diff --git a/preview/contents/assets/javascripts/modules/image-header.js b/preview/contents/assets/javascripts/modules/image-header.js new file mode 100644 index 0000000..5d783a1 --- /dev/null +++ b/preview/contents/assets/javascripts/modules/image-header.js @@ -0,0 +1,51 @@ +define(function() { + var ImageHeader = function() { + var modules = document.querySelectorAll('.image-header[data-bg-large][data-bg-small]'); + + for (var i = 0, j = modules.length; i < j; i++) { + new ImageHeaderModule(modules[i]); + } + }; + + var ImageHeaderModule = function(el) { + this.el = el; + + this.init(); + }; + + ImageHeaderModule.prototype = { + init: function() { + this.setVars(); + this.bindEvents(); + + this.setBackgroundImage(window.outerWidth); + }, + + bindEvents: function() { + window.addEventListener('resize', this.resize.bind(this)); + }, + + resize: function(event) { + var t = setTimeout(function() { + this.setBackgroundImage(window.outerWidth); + + clearTimeout(t); + }.bind(this), 500); + }, + + setBackgroundImage: function(width) { + var src = (width < this.breakpoint) ? this.smallSrc : this.largeSrc; + + this.el.style.backgroundImage = 'url(' + src + ')'; + }, + + setVars: function() { + this.breakpoint = 800; + + this.largeSrc = this.el.getAttribute('data-bg-large'); + this.smallSrc = this.el.getAttribute('data-bg-small'); + } + }; + + return ImageHeader; +}); \ No newline at end of file diff --git a/preview/contents/assets/javascripts/modules/navigation.js b/preview/contents/assets/javascripts/modules/navigation.js new file mode 100644 index 0000000..6170134 --- /dev/null +++ b/preview/contents/assets/javascripts/modules/navigation.js @@ -0,0 +1,45 @@ +define(function() { + var Navigation = function() { + this.el = document.getElementById('primary-navigation'); + + if (this.el) { + this.init(); + } + }; + + Navigation.prototype = { + init: function() { + var attributes = { + 'aria-controls': 'primary-navigation__wrapper', + 'aria-pressed': 'false', + 'class': 'primary-navigation__toggler', + 'type': 'button' + }; + + this.wrapper = document.getElementById('primary-navigation__wrapper'); + this.toggler = document.createElement('button'); + + for (var attr in attributes) { + this.toggler.setAttribute(attr, attributes[attr]); + } + + this.toggler.innerHTML = 'Menu'; + this.toggler.addEventListener('click', this.click.bind(this)); + + this.wrapper.setAttribute('aria-expanded', 'false'); + + this.el.insertBefore(this.toggler, this.wrapper); + }, + + click: function(event) { + event.preventDefault(); + + var isPressed = this.toggler.getAttribute('aria-pressed') !== 'true'; + + this.wrapper.setAttribute('aria-expanded', isPressed); + this.toggler.setAttribute('aria-pressed', isPressed); + } + }; + + return Navigation; +}); \ No newline at end of file diff --git a/preview/contents/assets/javascripts/modules/related-content.js b/preview/contents/assets/javascripts/modules/related-content.js new file mode 100644 index 0000000..cf0bf90 --- /dev/null +++ b/preview/contents/assets/javascripts/modules/related-content.js @@ -0,0 +1,59 @@ +define(function() { + var RelatedContent = function() { + var modules = document.querySelectorAll('.related-content'); + + for (var i = 0, j = modules.length; i < j; i++) { + new RelatedContentModule(modules[i]); + } + }; + + var RelatedContentModule = function(el) { + this.el = el; + + this.init(); + }; + + RelatedContentModule.prototype = { + init: function() { + this.setVars(); + this.initToggler(); + this.initItems(); + }, + + click: function(event) { + event.preventDefault(); + + var isPressed = this.toggler.getAttribute('aria-pressed') !== 'true'; + + this.toggler.innerHTML = isPressed ? this.togglerTextClose : this.togglerTextOpen; + this.toggler.setAttribute('aria-pressed', isPressed); + + this.items.setAttribute('aria-expanded', isPressed); + }, + + initItems: function() { + this.items.setAttribute('aria-expanded', 'false'); + }, + + initToggler: function() { + this.toggler.innerHTML = this.togglerTextOpen; + this.toggler.classList.add('related-content__toggler'); + this.toggler.setAttribute('aria-pressed', 'false'); + this.toggler.setAttribute('type', 'button'); + + this.toggler.addEventListener('click', this.click.bind(this)); + + this.el.insertBefore(this.toggler, this.items); + }, + + setVars: function() { + this.items = this.el.querySelector('.related-content__items'); + this.toggler = document.createElement('button'); + + this.togglerTextOpen = this.el.getAttribute('data-toggler-text-open'); + this.togglerTextClose = this.el.getAttribute('data-toggler-text-close'); + } + }; + + return RelatedContent; +}); \ No newline at end of file diff --git a/preview/contents/assets/javascripts/modules/section-scroller.js b/preview/contents/assets/javascripts/modules/section-scroller.js new file mode 100644 index 0000000..b957da4 --- /dev/null +++ b/preview/contents/assets/javascripts/modules/section-scroller.js @@ -0,0 +1,160 @@ +define( + [ + 'vendor/smooth-scroll', + 'vendor/enquire', + 'vendor/radio', + 'modules/section-video' + ], function(smoothScroll, enquire, radio, sectionVideo) { + + 'use strict'; + + var SectionScroll = function() { + new sectionVideo(); + new SectionScroller(document.querySelector('.section-scroller')); + }; + + var SectionScroller = function(elem) { + this.elem = elem; + + if (this.elem) { + enquire.register('(min-width: 900px)', { + setup: this.setup.bind(this), + deferSetup: true, + match: this.init.bind(this), + unmatch: this.destroy.bind(this) + }); + } + }; + + SectionScroller.prototype = { + setup: function() { + this.setVars(); + this.bindEvents(); + }, + + init: function() { + this.active = true; + this.current = null; + this.checkScroll(); + + smoothScroll.init({ + updateURL: true, + callbackAfter: this.navClick.bind(this) + }); + }, + + destroy: function() { + this.active = false; + this.current = null; + + this.sectionNavHide(); + smoothScroll.destroy(); + }, + + setVars: function() { + this.classShow = 'section-nav--show'; + this.current = null; + this.currentFocused = null; + this.globalHeader = document.querySelector('.global-header'); + this.globalHeaderH = this.globalHeader.clientHeight; + this.sections = this.elem.querySelectorAll('.product-section'); + this.sectionH = this.sections[0].clientHeight; + this.sectionNav = document.querySelector('.product-section__nav'); + this.sectionNavH = this.sectionNav.clientHeight; + this.sectionNavLinks = this.sectionNav.querySelectorAll('.product-section__nav__links a'); + this.scrollPos = 0; + }, + + bindEvents: function() { + window.addEventListener('scroll', this.checkScroll.bind(this)); + window.addEventListener('resize', this.findCurrent.bind(this)); + + // move between section nav links with keyboard arrows + this.sectionNav.addEventListener('keydown', this.sectionNavKeyboard.bind(this)); + }, + + sectionNavShow: function() { + this.sectionNav.classList.add(this.classShow); + }, + + sectionNavHide: function() { + this.sectionNav.classList.remove(this.classShow); + }, + + sectionNavKeyboard: function(event) { + if (event.which >= 37 && event.which <= 40) { + event.preventDefault(); + + // move prev + if (event.which === 37 || event.which === 38) { + this.currentFocused--; + if (this.currentFocused < 0) this.currentFocused = this.sectionNavLinks.length - 1; + + // move next + } else if (event.which === 39 || event.which === 40) { + this.currentFocused++; + if (this.currentFocused > this.sectionNavLinks.length - 1) this.currentFocused = 0; + } + + this.sectionNavLinks[this.currentFocused].focus(); + } + }, + + navClick: function(toggle, anchor) { + var target = document.querySelector(toggle.getAttribute('href')); + target.focus(); + + this.findCurrent(); + }, + + checkScroll: function() { + if (this.active) { + this.scrollPos = this.getScrollTop(); + + // trigger section header when main header is scrolled past + (this.scrollPos >= this.globalHeaderH) ? this.sectionNavShow() : this.sectionNavHide(); + + this.findCurrent(); + } + }, + + findCurrent: function() { + + // adjust trigger by difference in height between main header and section header + var currentPanel = Math.floor((this.scrollPos - (this.globalHeaderH - this.sectionNavH)) / this.sectionH); + currentPanel = (currentPanel < 0) ? 0 : currentPanel; + + if (currentPanel !== this.current) { + if (this.currentNav) { + this.currentNav.setAttribute('aria-selected', 'false'); + this.currentNav.setAttribute('tabindex', '-1'); + + radio('exitSection').broadcast(this.currentNav.getAttribute('href').substr(1)); + } + + this.currentNav = this.sectionNavLinks[currentPanel]; + this.currentNav.setAttribute('aria-selected', 'true'); + this.currentNav.setAttribute('tabindex', '0'); + + this.current = this.currentFocused = currentPanel; + + radio('enterSection').broadcast(this.currentNav.getAttribute('href').substr(1)); + } + }, + + getScrollTop: function() { + if (typeof pageYOffset != 'undefined') { + //most browsers except IE before #9 + return pageYOffset; + } else { + var B = document.body; //IE 'quirks' + var D = document.documentElement; //IE with doctype + D = (D.clientHeight) ? D : B; + + return D.scrollTop; + } + } + }; + + return SectionScroll; +}); diff --git a/preview/contents/assets/javascripts/modules/section-video.js b/preview/contents/assets/javascripts/modules/section-video.js new file mode 100644 index 0000000..51a5945 --- /dev/null +++ b/preview/contents/assets/javascripts/modules/section-video.js @@ -0,0 +1,265 @@ +define(['vendor/radio', 'vendor/enquire'], function(radio, enquire) { + + 'use strict'; + + var SectionVideo = function() { + + // detect video support + var supports_video = false; + if ((/iP(ad|hone|od)/i).test(navigator.userAgent) || (/android/i).test(navigator.userAgent)) { + supports_video = false; + } else if (!!document.createElement('video').canPlayType) { + supports_video = true; + } + + // add video class to body + document.body.classList.add('video-' + supports_video); + + if (supports_video) { + + // add safari colors class + if (safari()) document.body.classList.add('safari-colors'); + + // set variables + var videos = document.querySelectorAll('.product-section'); + + // set up videos + for (var i = 0, len = videos.length; i < len; i++) { + new Video(videos[i]); + } + + // set up enquire + enquire.register('(min-width: 900px)', { + match: function() { + radio('largeViewSetup').broadcast(); + }, + unmatch: function() { + radio('largeViewTeardown').broadcast(); + } + }).register('(max-width: 899px)', { + match: function() { + radio('mobileViewSetup').broadcast(); + }, + unmatch: function() { + radio('mobileViewTeardown').broadcast(); + } + }); + } + + window.addEventListener('resize', function() { + radio('videoResize').broadcast(); + }); + }; + + var Video = function(elem) { + this.elem = elem; + if (this.elem) this.init(); + }; + + Video.prototype = { + classVideo: 'has-video', + classImage: 'has-image', + + attrs: { + 'aria-hidden': 'true', + 'preload': '', + 'tabindex': '-1' + }, + + init: function() { + this.setVariables(); + this.subscribe(); + }, + + setVariables: function() { + this.container = this.elem.querySelector('.product-section__graphic__inner'); + this.src = this.container.getAttribute('data-src'); + this.poster = this.container.getAttribute('data-poster'); + this.videoStateTimer; + if (this.src) this.aspectRatio = this.container.getAttribute('data-ratio').split(':'); + }, + + subscribe: function() { + // mobile + radio('mobileViewSetup').subscribe(this.mobileViewSetup.bind(this)); + radio('mobileViewTeardown').subscribe(this.mobileViewTeardown.bind(this)); + + // large + radio('largeViewSetup').subscribe(this.largeViewSetup.bind(this)); + radio('largeViewTeardown').subscribe(this.largeViewTeardown.bind(this)); + + // scrolling + radio('enterSection').subscribe(this.playVideo.bind(this)); + radio('exitSection').subscribe(this.stopVideo.bind(this)); + }, + + + /** setup/teardown */ + + largeViewSetup: function() { + if (this.src) { + this.container.classList.add(this.classVideo); + + this.createVideo(); + this.sizeVideo(); + this.container.appendChild(this.videoContainer); + + radio('videoResize').subscribe(this.sizeVideo.bind(this)); + } else { + this.container.classList.add(this.classImage); + } + }, + + largeViewTeardown: function() { + if (this.src) { + this.container.classList.remove(this.classVideo); + this.removeVideo(); + + radio('videoResize').unsubscribe(this.sizeVideo.bind(this)); + } else { + this.container.classList.remove(this.classImage); + } + + }, + + mobileViewSetup: function() { + this.container.classList.add(this.classImage); + }, + + mobileViewTeardown: function() { + this.container.classList.remove(this.classImage); + }, + + + /** create video */ + + createVideo: function() { + var poster = (this.poster) ? this.poster : 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='; + + this.videoContainer = document.createElement('div'); + this.videoContainer.classList.add('video__container'); + + this.video = document.createElement('video'); + for (var key in this.attrs) this.video.setAttribute(key, this.attrs[key]); + this.video.setAttribute('poster', poster); + + this.video.classList.add('video'); + + this.setSource('webm'); + this.setSource('mp4'); + + this.videoContainer.appendChild(this.video); + }, + + setSource: function(type) { + var src = document.createElement('source'); + src.setAttribute('src', this.src + '.' + type); + src.setAttribute('type', 'video/' + type); + + this.video.appendChild(src); + }, + + sizeVideo: function() { + var clientW = this.container.clientWidth; + var clientH = this.container.clientHeight; + + var newSize = scaleSize( + clientW, + clientH, + parseInt(this.aspectRatio[0], 10), + parseInt(this.aspectRatio[1], 10) + ); + + this.videoContainer.style.left = ((clientW - newSize[0]) / 2) + 'px'; + this.videoContainer.style.top = ((clientH - newSize[1]) / 2) + 'px'; + this.videoContainer.style.width = Math.floor(newSize[0]) + 'px'; + this.videoContainer.style.height = Math.floor(newSize[1]) + 'px'; + }, + + + /** play/pause video */ + + playVideo: function(section) { + if (this.src && section === this.elem.getAttribute('id')) { + this.video.classList.add('play'); + this.videoStateChecker(); + } + }, + + videoStateChecker: function() { + this.videoStateTimer = setTimeout(this.checkVideoState.bind(this), 10); + }, + + checkVideoState: function() { + if (this.video.readyState === 4) { + this.video.currentTime = 0; + this.video.play(); + } else { + this.videoStateChecker(); + } + }, + + stopVideo: function(section) { + if (this.src) { + clearTimeout(this.videoStateTimer); + + if (section === this.elem.getAttribute('id')) { + this.video.classList.remove('play'); + this.video.pause(); + } + } + }, + + + /** remove video */ + + removeVideo: function() { + this.container.removeChild(this.videoContainer); + } + }; + + + /** utilities */ + + var scaleSize = function(maxW, maxH, currW, currH) { + var ratio = currH / currW; + + var sizeHeight = function() { + currH = maxH; + currW = currH / ratio; + }; + + var sizeWidth = function() { + currW = maxW; + currH = currW * ratio; + }; + + if (ratio <= 1) { + sizeHeight(); + + if (currW > maxW) sizeWidth(); + } else { + sizeWidth(); + + if (currH > maxH) sizeHeight(); + } + + return [currW, currH]; + }; + + var safari = function() { + var ua = navigator.userAgent; + + return ( + ua.indexOf('Mac OS X') !== -1 && + ua.indexOf('Safari') !== -1 && + ua.indexOf('Chrome') === -1 && + ua.indexOf('Mobile') === -1 && + (ua.indexOf('Version/5') !== -1 || + ua.indexOf('Version/6') !== -1 || + ua.indexOf('Version/7') !== -1) + ) ? true : false; + }; + + return SectionVideo; +}); diff --git a/preview/contents/assets/javascripts/modules/videoblock.js b/preview/contents/assets/javascripts/modules/videoblock.js new file mode 100644 index 0000000..0464dd4 --- /dev/null +++ b/preview/contents/assets/javascripts/modules/videoblock.js @@ -0,0 +1,45 @@ +define(function() { + var Videoblock = function() { + var modules = document.querySelectorAll('.videoblock'); + + for (var i = 0, j = modules.length; i < j; i++) { + new VideoblockModule(modules[i]); + } + }; + + var VideoblockModule = function(el) { + this.el = el; + + this.init(); + }; + + VideoblockModule.prototype = { + init: function() { + this.container = this.el.querySelector('.videoblock__content'); + this.iframe = this.el.querySelector('iframe'); + + this.button = document.createElement('button'); + this.button.innerHTML = 'Play'; + this.button.setAttribute('class', 'videoblock__button'); + this.button.setAttribute('type', 'button'); + + this.button.addEventListener('click', this.click.bind(this)); + + this.cover = document.createElement('div'); + this.cover.setAttribute('class', 'videoblock__cover'); + + this.container.appendChild(this.cover); + this.container.appendChild(this.button); + }, + + click: function(event) { + event.preventDefault(); + + this.container.removeChild(this.button); + this.container.removeChild(this.cover); + this.iframe.setAttribute('src', this.iframe.getAttribute('src') + '?autoplay=1'); + } + }; + + return Videoblock; +}); \ No newline at end of file diff --git a/preview/contents/assets/javascripts/polyfills/addEventListener.js b/preview/contents/assets/javascripts/polyfills/addEventListener.js new file mode 100644 index 0000000..d65d8e3 --- /dev/null +++ b/preview/contents/assets/javascripts/polyfills/addEventListener.js @@ -0,0 +1,71 @@ +(function() { + if (!Event.prototype.preventDefault) { + Event.prototype.preventDefault=function() { + this.returnValue=false; + }; + } + if (!Event.prototype.stopPropagation) { + Event.prototype.stopPropagation=function() { + this.cancelBubble=true; + }; + } + if (!Element.prototype.addEventListener) { + var eventListeners=[]; + + var addEventListener=function(type,listener /*, useCapture (will be ignored) */) { + var self=this; + var wrapper=function(e) { + e.target=e.srcElement; + e.currentTarget=self; + if (listener.handleEvent) { + listener.handleEvent(e); + } else { + listener.call(self,e); + } + }; + if (type=="DOMContentLoaded") { + var wrapper2=function(e) { + if (document.readyState=="complete") { + wrapper(e); + } + }; + document.attachEvent("onreadystatechange",wrapper2); + eventListeners.push({object:this,type:type,listener:listener,wrapper:wrapper2}); + + if (document.readyState=="complete") { + var e=new Event(); + e.srcElement=window; + wrapper2(e); + } + } else { + this.attachEvent("on"+type,wrapper); + eventListeners.push({object:this,type:type,listener:listener,wrapper:wrapper}); + } + }; + var removeEventListener=function(type,listener /*, useCapture (will be ignored) */) { + var counter=0; + while (counter>> 0; + + // 4. If IsCallable(callback) is false, throw a TypeError exception. + // See: http://es5.github.com/#x9.11 + if (typeof callback !== "function") { + throw new TypeError(callback + ' is not a function'); + } + + // 5. If thisArg was supplied, let T be thisArg; else let T be undefined. + if (arguments.length > 1) { + T = thisArg; + } + + // 6. Let k be 0 + k = 0; + + // 7. Repeat, while k < len + while (k < len) { + + var kValue; + + // a. Let Pk be ToString(k). + // This is implicit for LHS operands of the in operator + // b. Let kPresent be the result of calling the HasProperty internal method of O with argument Pk. + // This step can be combined with c + // c. If kPresent is true, then + if (k in O) { + + // i. Let kValue be the result of calling the Get internal method of O with argument Pk. + kValue = O[k]; + + // ii. Call the Call internal method of callback with T as the this value and + // argument list containing kValue, k, and O. + callback.call(T, kValue, k, O); + } + // d. Increase k by 1. + k++; + } + // 8. return undefined + }; +} \ No newline at end of file diff --git a/preview/contents/assets/javascripts/polyfills/html5shiv.js b/preview/contents/assets/javascripts/polyfills/html5shiv.js new file mode 100644 index 0000000..d4c731a --- /dev/null +++ b/preview/contents/assets/javascripts/polyfills/html5shiv.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document); \ No newline at end of file diff --git a/preview/contents/assets/javascripts/polyfills/matchMedia.addListener.js b/preview/contents/assets/javascripts/polyfills/matchMedia.addListener.js new file mode 100644 index 0000000..764232d --- /dev/null +++ b/preview/contents/assets/javascripts/polyfills/matchMedia.addListener.js @@ -0,0 +1,75 @@ +/*! matchMedia() polyfill addListener/removeListener extension. Author & copyright (c) 2012: Scott Jehl. Dual MIT/BSD license */ +(function(){ + // Bail out for browsers that have addListener support + if (window.matchMedia && window.matchMedia('all').addListener) { + return false; + } + + var localMatchMedia = window.matchMedia, + hasMediaQueries = localMatchMedia('only all').matches, + isListening = false, + timeoutID = 0, // setTimeout for debouncing 'handleChange' + queries = [], // Contains each 'mql' and associated 'listeners' if 'addListener' is used + handleChange = function(evt) { + // Debounce + clearTimeout(timeoutID); + + timeoutID = setTimeout(function() { + for (var i = 0, il = queries.length; i < il; i++) { + var mql = queries[i].mql, + listeners = queries[i].listeners || [], + matches = localMatchMedia(mql.media).matches; + + // Update mql.matches value and call listeners + // Fire listeners only if transitioning to or from matched state + if (matches !== mql.matches) { + mql.matches = matches; + + for (var j = 0, jl = listeners.length; j < jl; j++) { + listeners[j].call(window, mql); + } + } + } + }, 30); + }; + + window.matchMedia = function(media) { + var mql = localMatchMedia(media), + listeners = [], + index = 0; + + mql.addListener = function(listener) { + // Changes would not occur to css media type so return now (Affects IE <= 8) + if (!hasMediaQueries) { + return; + } + + // Set up 'resize' listener for browsers that support CSS3 media queries (Not for IE <= 8) + // There should only ever be 1 resize listener running for performance + if (!isListening) { + isListening = true; + window.addEventListener('resize', handleChange, true); + } + + // Push object only if it has not been pushed already + if (index === 0) { + index = queries.push({ + mql : mql, + listeners : listeners + }); + } + + listeners.push(listener); + }; + + mql.removeListener = function(listener) { + for (var i = 0, il = listeners.length; i < il; i++){ + if (listeners[i] === listener){ + listeners.splice(i, 1); + } + } + }; + + return mql; + }; +}()); diff --git a/preview/contents/assets/javascripts/polyfills/matchMedia.js b/preview/contents/assets/javascripts/polyfills/matchMedia.js new file mode 100644 index 0000000..7774538 --- /dev/null +++ b/preview/contents/assets/javascripts/polyfills/matchMedia.js @@ -0,0 +1,46 @@ +/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */ + +window.matchMedia || (window.matchMedia = function() { + "use strict"; + + // For browsers that support matchMedium api such as IE 9 and webkit + var styleMedia = (window.styleMedia || window.media); + + // For those that don't support matchMedium + if (!styleMedia) { + var style = document.createElement('style'), + script = document.getElementsByTagName('script')[0], + info = null; + + style.type = 'text/css'; + style.id = 'matchmediajs-test'; + + script.parentNode.insertBefore(style, script); + + // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers + info = ('getComputedStyle' in window) && window.getComputedStyle(style) || style.currentStyle; + + styleMedia = { + matchMedium: function(media) { + var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }'; + + // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers + if (style.styleSheet) { + style.styleSheet.cssText = text; + } else { + style.textContent = text; + } + + // Test if media query is true or false + return info.width === '1px'; + } + }; + } + + return function(media) { + return { + matches: styleMedia.matchMedium(media || 'all'), + media: media || 'all' + }; + }; +}()); diff --git a/preview/contents/assets/javascripts/polyfills/respond.js b/preview/contents/assets/javascripts/polyfills/respond.js new file mode 100644 index 0000000..1736d82 --- /dev/null +++ b/preview/contents/assets/javascripts/polyfills/respond.js @@ -0,0 +1,7 @@ +/*! Respond.js v1.4.2: min/max-width media query polyfill + * Copyright 2014 Scott Jehl + * Licensed under MIT + * http://j.mp/respondjs + */ + +!function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){v(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))},g=function(a){return a.replace(c.regex.minmaxwh,"").match(c.regex.other)};if(c.ajax=f,c.queue=d,c.unsupportedmq=g,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,comments:/\/\*[^*]*\*+([^/][^*]*\*+)*\//gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,maxw:/\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/,minmaxwh:/\(\s*m(in|ax)\-(height|width)\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/gi,other:/\([^\)]*\)/g},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var h,i,j,k=a.document,l=k.documentElement,m=[],n=[],o=[],p={},q=30,r=k.getElementsByTagName("head")[0]||l,s=k.getElementsByTagName("base")[0],t=r.getElementsByTagName("link"),u=function(){var a,b=k.createElement("div"),c=k.body,d=l.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=k.createElement("body"),c.style.background="none"),l.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&l.insertBefore(c,l.firstChild),a=b.offsetWidth,f?l.removeChild(c):c.removeChild(b),l.style.fontSize=d,e&&(c.style.fontSize=e),a=j=parseFloat(a)},v=function(b){var c="clientWidth",d=l[c],e="CSS1Compat"===k.compatMode&&d||k.body[c]||d,f={},g=t[t.length-1],p=(new Date).getTime();if(b&&h&&q>p-h)return a.clearTimeout(i),i=a.setTimeout(v,q),void 0;h=p;for(var s in m)if(m.hasOwnProperty(s)){var w=m[s],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?j||u():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?j||u():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(n[w.rules]))}for(var C in o)o.hasOwnProperty(C)&&o[C]&&o[C].parentNode===r&&r.removeChild(o[C]);o.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=k.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,r.insertBefore(E,g.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(k.createTextNode(F)),o.push(E)}},w=function(a,b,d){var e=a.replace(c.regex.comments,"").replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var h=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},i=!f&&d;b.length&&(b+="/"),i&&(f=1);for(var j=0;f>j;j++){var k,l,o,p;i?(k=d,n.push(h(a))):(k=e[j].match(c.regex.findStyles)&&RegExp.$1,n.push(RegExp.$2&&h(RegExp.$2))),o=k.split(","),p=o.length;for(var q=0;p>q;q++)l=o[q],g(l)||m.push({media:l.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:n.length-1,hasquery:l.indexOf("(")>-1,minw:l.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:l.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}v()},x=function(){if(d.length){var b=d.shift();f(b.href,function(c){w(c,b.href,b.media),p[b.href]=!0,a.setTimeout(function(){x()},0)})}},y=function(){for(var b=0;be.length)break e;if(!(d instanceof a)){c.lastIndex=0;var m=c.exec(d);if(m){u&&(f=m[1].length);var y=m.index-1+f,m=m[0].slice(f),v=m.length,k=y+v,b=d.slice(0,y+1),w=d.slice(k+1),N=[p,1];b&&N.push(b);var O=new a(l,g?t.tokenize(m,g):m,h);N.push(O),w&&N.push(w),Array.prototype.splice.apply(r,N)}}}}}return r},hooks:{all:{},add:function(e,n){var a=t.hooks.all;a[e]=a[e]||[],a[e].push(n)},run:function(e,n){var a=t.hooks.all[e];if(a&&a.length)for(var r,i=0;r=a[i++];)r(n)}}},n=t.Token=function(e,t,n){this.type=e,this.content=t,this.alias=n};if(n.stringify=function(e,a,r){if("string"==typeof e)return e;if("[object Array]"==Object.prototype.toString.call(e))return e.map(function(t){return n.stringify(t,a,e)}).join("");var i={type:e.type,content:n.stringify(e.content,a,r),tag:"span",classes:["token",e.type],attributes:{},language:a,parent:r};if("comment"==i.type&&(i.attributes.spellcheck="true"),e.alias){var l="Array"===t.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(i.classes,l)}t.hooks.run("wrap",i);var o="";for(var s in i.attributes)o+=s+'="'+(i.attributes[s]||"")+'"';return"<"+i.tag+' class="'+i.classes.join(" ")+'" '+o+">"+i.content+""},!self.document)return self.addEventListener?(self.addEventListener("message",function(e){var n=JSON.parse(e.data),a=n.language,r=n.code;self.postMessage(JSON.stringify(t.util.encode(t.tokenize(r,t.languages[a])))),self.close()},!1),self.Prism):self.Prism;var a=document.getElementsByTagName("script");return a=a[a.length-1],a&&(t.filename=a.src,document.addEventListener&&!a.hasAttribute("data-manual")&&document.addEventListener("DOMContentLoaded",t.highlightAll)),self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism);; +Prism.languages.markup={comment://g,prolog:/<\?.+?\?>/,doctype://,cdata://i,tag:{pattern:/<\/?[\w:-]+\s*(?:\s+[\w:-]+(?:=(?:("|')(\\?[\w\W])*?\1|[^\s'">=]+))?\s*)*\/?>/gi,inside:{tag:{pattern:/^<\/?[\w:-]+/i,inside:{punctuation:/^<\/?/,namespace:/^[\w-]+?:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/gi,inside:{punctuation:/=|>|"/g}},punctuation:/\/?>/g,"attr-name":{pattern:/[\w:-]+/g,inside:{namespace:/^[\w-]+?:/}}}},entity:/\&#?[\da-z]{1,8};/gi},Prism.hooks.add("wrap",function(t){"entity"===t.type&&(t.attributes.title=t.content.replace(/&/,"&"))});; +Prism.languages.css={comment:/\/\*[\w\W]*?\*\//g,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*{))/gi,inside:{punctuation:/[;:]/g}},url:/url\((["']?).*?\1\)/gi,selector:/[^\{\}\s][^\{\};]*(?=\s*\{)/g,property:/(\b|\B)[\w-]+(?=\s*:)/gi,string:/("|')(\\?.)*?\1/g,important:/\B!important\b/gi,punctuation:/[\{\};:]/g,"function":/[-a-z0-9]+(?=\()/gi},Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{style:{pattern:/[\w\W]*?<\/style>/gi,inside:{tag:{pattern:/|<\/style>/gi,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.css}}});; +Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//g,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*?(\r?\n|$)/g,lookbehind:!0}],string:/("|')(\\?.)*?\1/g,"class-name":{pattern:/((?:(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/gi,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/g,"boolean":/\b(true|false)\b/g,"function":{pattern:/[a-z0-9_]+\(/gi,inside:{punctuation:/\(/}},number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?)\b/g,operator:/[-+]{1,2}|!|<=?|>=?|={1,3}|&{1,2}|\|?\||\?|\*|\/|\~|\^|\%/g,ignore:/&(lt|gt|amp);/gi,punctuation:/[{}[\];(),.:]/g};; +Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|function|get|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/g,number:/\b-?(0x[\dA-Fa-f]+|\d*\.?\d+([Ee]-?\d+)?|NaN|-?Infinity)\b/g}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,lookbehind:!0}}),Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/[\w\W]*?<\/script>/gi,inside:{tag:{pattern:/|<\/script>/gi,inside:Prism.languages.markup.tag.inside},rest:Prism.languages.javascript}}});; +Prism.languages.java=Prism.languages.extend("clike",{keyword:/\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/g,number:/\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+[e]?[\d]*[df]\b|\W\d*\.?\d+\b/gi,operator:{pattern:/(^|[^\.])(?:\+=|\+\+?|-=|--?|!=?|<{1,2}=?|>{1,3}=?|==?|&=|&&?|\|=|\|\|?|\?|\*=?|\/=?|%=?|\^=?|:|~)/gm,lookbehind:!0}});; +Prism.languages.php=Prism.languages.extend("clike",{keyword:/\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/gi,constant:/\b[A-Z0-9_]{2,}\b/g,comment:{pattern:/(^|[^\\])(\/\*[\w\W]*?\*\/|(^|[^:])(\/\/|#).*?(\r?\n|$))/g,lookbehind:!0}}),Prism.languages.insertBefore("php","keyword",{delimiter:/(\?>|<\?php|<\?)/gi,variable:/(\$\w+)\b/gi,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/g,lookbehind:!0,inside:{punctuation:/\\/}}}),Prism.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/g,lookbehind:!0}}),Prism.languages.markup&&(Prism.hooks.add("before-highlight",function(e){"php"===e.language&&(e.tokenStack=[],e.backupCode=e.code,e.code=e.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/gi,function(n){return e.tokenStack.push(n),"{{{PHP"+e.tokenStack.length+"}}}"}))}),Prism.hooks.add("before-insert",function(e){"php"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),Prism.hooks.add("after-highlight",function(e){if("php"===e.language){for(var n,a=0;n=e.tokenStack[a];a++)e.highlightedCode=e.highlightedCode.replace("{{{PHP"+(a+1)+"}}}",Prism.highlight(n,e.grammar,"php"));e.element.innerHTML=e.highlightedCode}}),Prism.hooks.add("wrap",function(e){"php"===e.language&&"markup"===e.type&&(e.content=e.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g,'$1'))}),Prism.languages.insertBefore("php","comment",{markup:{pattern:/<[^?]\/?(.*?)>/g,inside:Prism.languages.markup},php:/\{\{\{PHP[0-9]+\}\}\}/g}));; +Prism.languages.coffeescript=Prism.languages.extend("javascript",{comment:[/([#]{3}\s*\r?\n(.*\s*\r*\n*)\s*?\r?\n[#]{3})/g,/(\s|^)([#]{1}[^#^\r^\n]{2,}?(\r?\n|$))/g],keyword:/\b(this|window|delete|class|extends|namespace|extend|ar|let|if|else|while|do|for|each|of|return|in|instanceof|new|with|typeof|try|catch|finally|null|undefined|break|continue)\b/g}),Prism.languages.insertBefore("coffeescript","keyword",{"function":{pattern:/[a-z|A-z]+\s*[:|=]\s*(\([.|a-z\s|,|:|{|}|\"|\'|=]*\))?\s*->/gi,inside:{"function-name":/[_?a-z-|A-Z-]+(\s*[:|=])| @[_?$?a-z-|A-Z-]+(\s*)| /g,operator:/[-+]{1,2}|!|=?<|=?>|={1,2}|(&){1,2}|\|?\||\?|\*|\//g}},"attr-name":/[_?a-z-|A-Z-]+(\s*:)| @[_?$?a-z-|A-Z-]+(\s*)| /g});; +Prism.languages.scss=Prism.languages.extend("css",{comment:{pattern:/(^|[^\\])(\/\*[\w\W]*?\*\/|\/\/.*?(\r?\n|$))/g,lookbehind:!0},atrule:/@[\w-]+(?=\s+(\(|\{|;))/gi,url:/([-a-z]+-)*url(?=\()/gi,selector:/([^@;\{\}\(\)]?([^@;\{\}\(\)]|&|\#\{\$[-_\w]+\})+)(?=\s*\{(\}|\s|[^\}]+(:|\{)[^\}]+))/gm}),Prism.languages.insertBefore("scss","atrule",{keyword:/@(if|else if|else|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)|(?=@for\s+\$[-_\w]+\s)+from/i}),Prism.languages.insertBefore("scss","property",{variable:/((\$[-_\w]+)|(#\{\$[-_\w]+\}))/i}),Prism.languages.insertBefore("scss","ignore",{placeholder:/%[-_\w]+/i,statement:/\B!(default|optional)\b/gi,"boolean":/\b(true|false)\b/g,"null":/\b(null)\b/g,operator:/\s+([-+]{1,2}|={1,2}|!=|\|?\||\?|\*|\/|\%)\s+/g});; +Prism.languages.bash=Prism.languages.extend("clike",{comment:{pattern:/(^|[^"{\\])(#.*?(\r?\n|$))/g,lookbehind:!0},string:{pattern:/("|')(\\?[\s\S])*?\1/g,inside:{property:/\$([a-zA-Z0-9_#\?\-\*!@]+|\{[^\}]+\})/g}},keyword:/\b(if|then|else|elif|fi|for|break|continue|while|in|case|function|select|do|done|until|echo|exit|return|set|declare)\b/g}),Prism.languages.insertBefore("bash","keyword",{property:/\$([a-zA-Z0-9_#\?\-\*!@]+|\{[^}]+\})/g}),Prism.languages.insertBefore("bash","comment",{important:/(^#!\s*\/bin\/bash)|(^#!\s*\/bin\/sh)/g});; +Prism.languages.c=Prism.languages.extend("clike",{string:/("|')([^\n\\\1]|\\.|\\\r*\n)*?\1/g,keyword:/\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/g,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\//g}),Prism.languages.insertBefore("c","string",{property:{pattern:/((^|\n)\s*)#\s*[a-z]+([^\n\\]|\\.|\\\r*\n)*/gi,lookbehind:!0,inside:{string:{pattern:/(#\s*include\s*)(<.+?>|("|')(\\?.)+?\3)/g,lookbehind:!0}}}}),delete Prism.languages.c["class-name"],delete Prism.languages.c["boolean"];; +Prism.languages.cpp=Prism.languages.extend("c",{keyword:/\b(alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|delete\[\]|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|new\[\]|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/g,"boolean":/\b(true|false)\b/g,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|:{1,2}|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\/|\b(and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/g}),Prism.languages.insertBefore("cpp","keyword",{"class-name":{pattern:/(class\s+)[a-z0-9_]+/gi,lookbehind:!0}});; +Prism.languages.python={comment:{pattern:/(^|[^\\])#.*?(\r?\n|$)/g,lookbehind:!0},string:/"""[\s\S]+?"""|("|')(\\?.)*?\1/g,keyword:/\b(as|assert|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|with|yield)\b/g,"boolean":/\b(True|False)\b/g,number:/\b-?(0x)?\d*\.?[\da-f]+\b/g,operator:/[-+]{1,2}|=?<|=?>|!|={1,2}|(&){1,2}|(&){1,2}|\|?\||\?|\*|\/|~|\^|%|\b(or|and|not)\b/g,ignore:/&(lt|gt|amp);/gi,punctuation:/[{}[\];(),.:]/g};; +Prism.languages.sql={comment:{pattern:/(^|[^\\])(\/\*[\w\W]*?\*\/|((--)|(\/\/)|#).*?(\r?\n|$))/g,lookbehind:!0},string:{pattern:/(^|[^@])("|')(\\?[\s\S])*?\2/g,lookbehind:!0},variable:/@[\w.$]+|@("|'|`)(\\?[\s\S])+?\1/g,"function":/\b(?:COUNT|SUM|AVG|MIN|MAX|FIRST|LAST|UCASE|LCASE|MID|LEN|ROUND|NOW|FORMAT)(?=\s*\()/ig,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALTER|ANALYZE|APPLY|AS|ASC|AUTHORIZATION|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADE|CASCADED|CASE|CHAIN|CHAR VARYING|CHARACTER VARYING|CHECK|CHECKPOINT|CLOSE|CLUSTERED|COALESCE|COLUMN|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS|CONTAINSTABLE|CONTINUE|CONVERT|CREATE|CROSS|CURRENT|CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP|CURRENT_USER|CURSOR|DATA|DATABASE|DATABASES|DATETIME|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DOUBLE PRECISION|DROP|DUMMY|DUMP|DUMPFILE|DUPLICATE KEY|ELSE|ENABLE|ENCLOSED BY|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPE|ESCAPED BY|EXCEPT|EXEC|EXECUTE|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR|FOR EACH ROW|FORCE|FOREIGN|FREETEXT|FREETEXTTABLE|FROM|FULL|FUNCTION|GEOMETRY|GEOMETRYCOLLECTION|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|IDENTITY|IDENTITY_INSERT|IDENTITYCOL|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTO|INVOKER|ISOLATION LEVEL|JOIN|KEY|KEYS|KILL|LANGUAGE SQL|LAST|LEFT|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONGBLOB|LONGTEXT|MATCH|MATCHED|MEDIUMBLOB|MEDIUMINT|MEDIUMTEXT|MERGE|MIDDLEINT|MODIFIES SQL DATA|MODIFY|MULTILINESTRING|MULTIPOINT|MULTIPOLYGON|NATIONAL|NATIONAL CHAR VARYING|NATIONAL CHARACTER|NATIONAL CHARACTER VARYING|NATIONAL VARCHAR|NATURAL|NCHAR|NCHAR VARCHAR|NEXT|NO|NO SQL|NOCHECK|NOCYCLE|NONCLUSTERED|NULLIF|NUMERIC|OF|OFF|OFFSETS|ON|OPEN|OPENDATASOURCE|OPENQUERY|OPENROWSET|OPTIMIZE|OPTION|OPTIONALLY|ORDER|OUT|OUTER|OUTFILE|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREV|PRIMARY|PRINT|PRIVILEGES|PROC|PROCEDURE|PUBLIC|PURGE|QUICK|RAISERROR|READ|READS SQL DATA|READTEXT|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEATABLE|REPLICATION|REQUIRE|RESTORE|RESTRICT|RETURN|RETURNS|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROWCOUNT|ROWGUIDCOL|ROWS?|RTREE|RULE|SAVE|SAVEPOINT|SCHEMA|SELECT|SERIAL|SERIALIZABLE|SESSION|SESSION_USER|SET|SETUSER|SHARE MODE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|START|STARTING BY|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLE|TABLES|TABLESPACE|TEMP(?:ORARY)?|TEMPTABLE|TERMINATED BY|TEXT|TEXTSIZE|THEN|TIMESTAMP|TINYBLOB|TINYINT|TINYTEXT|TO|TOP|TRAN|TRANSACTION|TRANSACTIONS|TRIGGER|TRUNCATE|TSEQUAL|TYPE|TYPES|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNPIVOT|UPDATE|UPDATETEXT|USAGE|USE|USER|USING|VALUE|VALUES|VARBINARY|VARCHAR|VARCHARACTER|VARYING|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH|WITH ROLLUP|WITHIN|WORK|WRITE|WRITETEXT)\b/gi,"boolean":/\b(?:TRUE|FALSE|NULL)\b/gi,number:/\b-?(0x)?\d*\.?[\da-f]+\b/g,operator:/\b(?:ALL|AND|ANY|BETWEEN|EXISTS|IN|LIKE|NOT|OR|IS|UNIQUE|CHARACTER SET|COLLATE|DIV|OFFSET|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b|[-+]{1}|!|[=<>]{1,2}|(&){1,2}|\|?\||\?|\*|\//gi,punctuation:/[;[\]()`,.]/g};; +Prism.languages.groovy=Prism.languages.extend("clike",{keyword:/\b(as|def|in|abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/g,string:/("""|''')[\W\w]*?\1|("|'|\/)[\W\w]*?\2|(\$\/)(\$\/\$|[\W\w])*?\/\$/g,number:/\b0b[01_]+\b|\b0x[\da-f_]+(\.[\da-f_p\-]+)?\b|\b[\d_]+(\.[\d_]+[e]?[\d]*)?[glidf]\b|[\d_]+(\.[\d_]+)?\b/gi,operator:{pattern:/(^|[^.])(={0,2}~|\?\.|\*?\.@|\.&|\.{1,2}(?!\.)|\.{2}|\?:|[-+]{1,2}|!|<=>|>{1,3}|<{1,2}|={1,2}|&{1,2}|\|{1,2}|\?|\*{1,2}|\/|\^|%)/g,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/g}),Prism.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(setup|given|when|then|and|cleanup|expect|where):/g}),Prism.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0}}),Prism.hooks.add("wrap",function(e){if("groovy"===e.language&&"string"===e.type){var t=e.content[0];if("'"!=t){var n=/([^\\])(\$(\{.*?\}|[\w\.]+))/;"$"===t&&(n=/([^\$])(\$(\{.*?\}|[\w\.]+))/),e.content=Prism.highlight(e.content,{expression:{pattern:n,lookbehind:!0,inside:Prism.languages.groovy}}),e.classes.push("/"===t?"regex":"gstring")}}});; +Prism.languages.http={"request-line":{pattern:/^(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\b\shttps?:\/\/\S+\sHTTP\/[0-9.]+/g,inside:{property:/^\b(POST|GET|PUT|DELETE|OPTIONS|PATCH|TRACE|CONNECT)\b/g,"attr-name":/:\w+/g}},"response-status":{pattern:/^HTTP\/1.[01] [0-9]+.*/g,inside:{property:/[0-9]+[A-Z\s-]+$/g}},keyword:/^[\w-]+:(?=.+)/gm};var httpLanguages={"application/json":Prism.languages.javascript,"application/xml":Prism.languages.markup,"text/xml":Prism.languages.markup,"text/html":Prism.languages.markup};for(var contentType in httpLanguages)if(httpLanguages[contentType]){var options={};options[contentType]={pattern:new RegExp("(content-type:\\s*"+contentType+"[\\w\\W]*?)\\n\\n[\\w\\W]*","gi"),lookbehind:!0,inside:{rest:httpLanguages[contentType]}},Prism.languages.insertBefore("http","keyword",options)}; +Prism.languages.ruby=Prism.languages.extend("clike",{comment:/#[^\r\n]*(\r?\n|$)/g,keyword:/\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/g,builtin:/\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z][a-zA-Z_0-9]*[?!]?\b/g}),Prism.languages.insertBefore("ruby","keyword",{regex:{pattern:/(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/g,lookbehind:!0},variable:/[@$]+\b[a-zA-Z_][a-zA-Z_0-9]*[?!]?\b/g,symbol:/:\b[a-zA-Z_][a-zA-Z_0-9]*[?!]?\b/g});; +Prism.languages.csharp=Prism.languages.extend("clike",{keyword:/\b(abstract|as|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\b/g,string:/@?("|')(\\?.)*?\1/g,preprocessor:/^\s*#.*/gm,number:/\b-?(0x)?\d*\.?\d+\b/g});; +Prism.languages.go=Prism.languages.extend("clike",{keyword:/\b(break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/g,builtin:/\b(bool|byte|complex(64|128)|error|float(32|64)|rune|string|u?int(8|16|32|64|)|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(ln)?|real|recover)\b/g,"boolean":/\b(_|iota|nil|true|false)\b/g,operator:/([(){}\[\]]|[*\/%^!]=?|\+[=+]?|-[>=-]?|\|[=|]?|>[=>]?|<(<|[=-])?|==?|&(&|=|^=?)?|\.(\.\.)?|[,;]|:=?)/g,number:/\b(-?(0x[a-f\d]+|(\d+\.?\d*|\.\d+)(e[-+]?\d+)?)i?)\b/gi,string:/("|'|`)(\\?.|\r|\n)*?\1/g}),delete Prism.languages.go["class-name"];; +Prism.languages.scala=Prism.languages.extend("java",{keyword:/(<-|=>)|\b(abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\b/g,builtin:/\b(String|Int|Long|Short|Byte|Boolean|Double|Float|Char|Any|AnyRef|AnyVal|Unit|Nothing)\b/g,number:/\b0x[\da-f]*\.?[\da-f\-]+\b|\b\d*\.?\d+[e]?[\d]*[dfl]?\b/gi,symbol:/'([^\d\s]\w*)/g,string:/(""")[\W\w]*?\1|("|\/)[\W\w]*?\2|('.')/g}),delete Prism.languages.scala["function"];; +Prism.languages.objectivec=Prism.languages.extend("c",{keyword:/(\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while|in|self|super)\b)|((?=[\w|@])(@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b)/g,string:/(?:("|')([^\n\\\1]|\\.|\\\r*\n)*?\1)|(@"([^\n\\"]|\\.|\\\r*\n)*?")/g,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\/|@/g});; +Prism.languages.ini={comment:/^\s*;.*$/gm,important:/\[.*?\]/gm,constant:/^\s*[^\s\=]+?(?=[ \t]*\=)/gm,"attr-value":{pattern:/\=.*/gm,inside:{punctuation:/^[\=]/g}}};; +Prism.languages.latex={comment:/%.*?(\r?\n|$)$/m,string:/(\$)(\\?.)*?\1/g,punctuation:/[{}]/g,selector:/\\[a-z;,:\.]*/i};; +Prism.languages.git={comment:/^#.*$/m,string:/("|')(\\?.)*?\1/gm,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s(--|-)\w+/m}},coord:/^@@.*@@$/m,deleted:/^-(?!-).+$/m,inserted:/^\+(?!\+).+$/m,commit_sha1:/^commit \w{40}$/m} +Prism.languages.xml=Prism.languages.extend('markup',{}); +Prism.languages.json=Prism.languages.extend('javascript',{}); +; +Prism.hooks.add("after-highlight",function(e){var n=e.element.parentNode;if(n&&/pre/i.test(n.nodeName)&&-1!==n.className.indexOf("line-numbers")){var t,a=1+e.code.split("\n").length;lines=new Array(a),lines=lines.join(""),t=document.createElement("span"),t.className="line-numbers-rows",t.innerHTML=lines,n.hasAttribute("data-start")&&(n.style.counterReset="linenumber "+(parseInt(n.getAttribute("data-start"),10)-1)),e.element.appendChild(t)}});; +!function(){if(self.Prism){var a={csharp:"C#",cpp:"C++"};Prism.hooks.add("before-highlight",function(e){var t=a[e.language]||e.language;e.element.setAttribute("data-language",t)})}}();; diff --git a/preview/contents/assets/javascripts/vendor/radio.js b/preview/contents/assets/javascripts/vendor/radio.js new file mode 100644 index 0000000..a6ce52c --- /dev/null +++ b/preview/contents/assets/javascripts/vendor/radio.js @@ -0,0 +1,176 @@ +/** + Radio.js - Chainable, Dependency Free Publish/Subscribe for Javascript + http://radio.uxder.com + Author: Scott Murphy 2011 + twitter: @hellocreation, github: uxder + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + */ +(function (name, global, definition) { + if (typeof module !== 'undefined') module.exports = definition(name, global); + else if (typeof define === 'function' && typeof define.amd === 'object') define(definition); + else global[name] = definition(name, global); +})('radio', this, function (name, global) { + + "use strict"; + + /** + * Main Wrapper for radio.$ and create a function radio to accept the channelName + * @param {String} channelName topic of event + */ + function radio(channelName) { + arguments.length ? radio.$.channel(channelName) : radio.$.reset(); + return radio.$; + } + + radio.$ = { + version: '0.2', + channelName: "", + channels: [], + + /** + * Reset global state, by removing all channels + * @example + * radio() + */ + reset: function() { + radio.$.channelName = ""; + radio.$.channels = []; + }, + + /** + * Broadcast (publish) + * Iterate through all listeners (callbacks) in current channel and pass arguments to subscribers + * @param arguments data to be sent to listeners + * @example + * //basic usage + * radio('channel1').broadcast('my message'); + * //send an unlimited number of parameters + * radio('channel2').broadcast(param1, param2, param3 ... ); + */ + broadcast: function() { + var i, c = this.channels[this.channelName], + l = c.length, + subscriber, callback, context; + //iterate through current channel and run each subscriber + for (i = 0; i < l; i++) { + subscriber = c[i]; + //if subscriber was an array, set the callback and context. + if ((typeof(subscriber) === 'object') && (subscriber.length)) { + callback = subscriber[0]; + //if user set the context, set it to the context otherwise, it is a globally scoped function + context = subscriber[1] || global; + } + callback.apply(context, arguments); + } + return this; + }, + + /** + * Create the channel if it doesn't exist and set the current channel/event name + * @param {String} name the name of the channel + * @example + * radio('channel1'); + */ + channel: function(name) { + var c = this.channels; + //create a new channel if it doesn't exists + if (!c[name]) c[name] = []; + this.channelName = name; + return this; + }, + + /** + * Add Subscriber to channel + * Take the arguments and add it to the this.channels array. + * @param {Function|Array} arguments list of callbacks or arrays[callback, context] separated by commas + * @example + * //basic usage + * var callback = function() {}; + * radio('channel1').subscribe(callback); + * + * //subscribe an endless amount of callbacks + * radio('channel1').subscribe(callback, callback2, callback3 ...); + * + * //adding callbacks with context + * radio('channel1').subscribe([callback, context],[callback1, context], callback3); + * + * //subscribe by chaining + * radio('channel1').subscribe(callback).radio('channel2').subscribe(callback).subscribe(callback2); + */ + subscribe: function() { + var a = arguments, + c = this.channels[this.channelName], + i, l = a.length, + p, ai = []; + + //run through each arguments and subscribe it to the channel + for (i = 0; i < l; i++) { + ai = a[i]; + //if the user sent just a function, wrap the fucntion in an array [function] + p = (typeof(ai) === "function") ? [ai] : ai; + if ((typeof(p) === 'object') && (p.length)) c.push(p); + } + return this; + }, + + /** + * Remove subscriber from channel + * Take arguments with functions and unsubscribe it if there is a match against existing subscribers. + * @param {Function} arguments callbacks separated by commas + * @example + * //basic usage + * radio('channel1').unsubscribe(callback); + * //you can unsubscribe as many callbacks as you want + * radio('channel1').unsubscribe(callback, callback2, callback3 ...); + * //removing callbacks with context is the same + * radio('channel1').subscribe([callback, context]).unsubscribe(callback); + */ + unsubscribe: function() { + var a = arguments, + i, j, c = this.channels[this.channelName], + l = a.length, + cl = c.length, + offset = 0, + jo; + //loop through each argument + for (i = 0; i < l; i++) { + //need to reset vars that change as the channel array items are removed + offset = 0; + cl = c.length; + //loop through the channel + for (j = 0; j < cl; j++) { + jo = j - offset; + //if there is a match with the argument and the channel function, unsubscribe it from the channel array + if (c[jo][0] === a[i]) { + //unsubscribe matched item from the channel array + c.splice(jo, 1); + offset++; + } + } + } + return this; + } + }; + + return radio; +}); \ No newline at end of file diff --git a/preview/contents/assets/javascripts/vendor/require.js b/preview/contents/assets/javascripts/vendor/require.js new file mode 100644 index 0000000..e6244f1 --- /dev/null +++ b/preview/contents/assets/javascripts/vendor/require.js @@ -0,0 +1,36 @@ +/* + RequireJS 2.1.14 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved. + Available via the MIT or new BSD license. + see: http://github.com/jrburke/requirejs for details +*/ +var requirejs,require,define; +(function(ba){function G(b){return"[object Function]"===K.call(b)}function H(b){return"[object Array]"===K.call(b)}function v(b,c){if(b){var d;for(d=0;dthis.depCount&&!this.defined){if(G(l)){if(this.events.error&&this.map.isDefine||g.onError!==ca)try{f=i.execCb(c,l,b,f)}catch(d){a=d}else f=i.execCb(c,l,b,f);this.map.isDefine&&void 0===f&&((b=this.module)?f=b.exports:this.usingExports&& +(f=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",w(this.error=a)}else f=l;this.exports=f;if(this.map.isDefine&&!this.ignore&&(r[c]=f,g.onResourceLoad))g.onResourceLoad(i,this.map,this.depMaps);y(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a= +this.map,b=a.id,d=p(a.prefix);this.depMaps.push(d);q(d,"defined",u(this,function(f){var l,d;d=m(aa,this.map.id);var e=this.map.name,P=this.map.parentMap?this.map.parentMap.name:null,n=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(f.normalize&&(e=f.normalize(e,function(a){return c(a,P,!0)})||""),f=p(a.prefix+"!"+e,this.map.parentMap),q(f,"defined",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=m(h,f.id)){this.depMaps.push(f); +if(this.events.error)d.on("error",u(this,function(a){this.emit("error",a)}));d.enable()}}else d?(this.map.url=i.nameToUrl(d),this.load()):(l=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),l.error=u(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];B(h,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&y(a.map.id)});w(a)}),l.fromText=u(this,function(f,c){var d=a.name,e=p(d),P=M;c&&(f=c);P&&(M=!1);s(e);t(j.config,b)&&(j.config[d]=j.config[b]);try{g.exec(f)}catch(h){return w(C("fromtexteval", +"fromText eval for "+b+" failed: "+h,h,[b]))}P&&(M=!0);this.depMaps.push(e);i.completeLoad(d);n([d],l)}),f.load(a.name,n,l,j))}));i.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){V[this.map.id]=this;this.enabling=this.enabled=!0;v(this.depMaps,u(this,function(a,b){var c,f;if("string"===typeof a){a=p(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=m(L,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;q(a,"defined",u(this,function(a){this.defineDep(b, +a);this.check()}));this.errback&&q(a,"error",u(this,this.errback))}c=a.id;f=h[c];!t(L,c)&&(f&&!f.enabled)&&i.enable(a,this)}));B(this.pluginMaps,u(this,function(a){var b=m(h,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){v(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};i={config:j,contextName:b,registry:h,defined:r,urlFetched:S,defQueue:A,Module:Z,makeModuleMap:p, +nextTick:g.nextTick,onError:w,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=j.shim,c={paths:!0,bundles:!0,config:!0,map:!0};B(a,function(a,b){c[b]?(j[b]||(j[b]={}),U(j[b],a,!0,!0)):j[b]=a});a.bundles&&B(a.bundles,function(a,b){v(a,function(a){a!==b&&(aa[a]=b)})});a.shim&&(B(a.shim,function(a,c){H(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);b[c]=a}),j.shim=b);a.packages&&v(a.packages,function(a){var b, +a="string"===typeof a?{name:a}:a;b=a.name;a.location&&(j.paths[b]=a.location);j.pkgs[b]=a.name+"/"+(a.main||"main").replace(ia,"").replace(Q,"")});B(h,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=p(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ba,arguments));return b||a.exports&&da(a.exports)}},makeRequire:function(a,e){function j(c,d,m){var n,q;e.enableBuildCallback&&(d&&G(d))&&(d.__requireJsBuild= +!0);if("string"===typeof c){if(G(d))return w(C("requireargs","Invalid require call"),m);if(a&&t(L,c))return L[c](h[a.id]);if(g.get)return g.get(i,c,a,j);n=p(c,a,!1,!0);n=n.id;return!t(r,n)?w(C("notloaded",'Module name "'+n+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):r[n]}J();i.nextTick(function(){J();q=s(p(null,a));q.skipMap=e.skipMap;q.init(c,d,m,{enabled:!0});D()});return j}e=e||{};U(j,{isBrowser:z,toUrl:function(b){var d,e=b.lastIndexOf("."),k=b.split("/")[0];if(-1!== +e&&(!("."===k||".."===k)||1e.attachEvent.toString().indexOf("[native code"))&&!Y?(M=!0,e.attachEvent("onreadystatechange",b.onScriptLoad)): +(e.addEventListener("load",b.onScriptLoad,!1),e.addEventListener("error",b.onScriptError,!1)),e.src=d,J=e,D?y.insertBefore(e,D):y.appendChild(e),J=null,e;if(ea)try{importScripts(d),b.completeLoad(c)}catch(m){b.onError(C("importscripts","importScripts failed for "+c+" at "+d,m,[c]))}};z&&!q.skipDataMain&&T(document.getElementsByTagName("script"),function(b){y||(y=b.parentNode);if(I=b.getAttribute("data-main"))return s=I,q.baseUrl||(E=s.split("/"),s=E.pop(),O=E.length?E.join("/")+"/":"./",q.baseUrl= +O),s=s.replace(Q,""),g.jsExtRegExp.test(s)&&(s=I),q.deps=q.deps?q.deps.concat(s):[s],!0});define=function(b,c,d){var e,g;"string"!==typeof b&&(d=c,c=b,b=null);H(c)||(d=c,c=null);!c&&G(d)&&(c=[],d.length&&(d.toString().replace(ka,"").replace(la,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));if(M){if(!(e=J))N&&"interactive"===N.readyState||T(document.getElementsByTagName("script"),function(b){if("interactive"===b.readyState)return N=b}),e=N;e&&(b|| +(b=e.getAttribute("data-requiremodule")),g=F[e.getAttribute("data-requirecontext")])}(g?g.defQueue:R).push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(q)}})(this); \ No newline at end of file diff --git a/preview/contents/assets/javascripts/vendor/smooth-scroll.js b/preview/contents/assets/javascripts/vendor/smooth-scroll.js new file mode 100644 index 0000000..8b6f7dd --- /dev/null +++ b/preview/contents/assets/javascripts/vendor/smooth-scroll.js @@ -0,0 +1,393 @@ +/** + * smooth-scroll v5.1.2 + * Animate scrolling to anchor links, by Chris Ferdinandi. + * http://github.com/cferdinandi/smooth-scroll + * + * Free to use under the MIT License. + * http://gomakethings.com/mit/ + */ + +(function (root, factory) { + if ( typeof define === 'function' && define.amd ) { + define([], factory(root)); + } else if ( typeof exports === 'object' ) { + module.exports = factory(root); + } else { + root.smoothScroll = factory(root); + } +})(this, function (root) { + + 'use strict'; + + // + // Variables + // + + var smoothScroll = {}; // Object for public APIs + var supports = !!document.querySelector && !!root.addEventListener; // Feature test + var settings; + + // Default settings + var defaults = { + speed: 500, + easing: 'easeInOutCubic', + offset: 0, + updateURL: true, + callbackBefore: function () {}, + callbackAfter: function () {} + }; + + + // + // Methods + // + + /** + * A simple forEach() implementation for Arrays, Objects and NodeLists + * @private + * @param {Array|Object|NodeList} collection Collection of items to iterate + * @param {Function} callback Callback function for each iteration + * @param {Array|Object|NodeList} scope Object/NodeList/Array that forEach is iterating over (aka `this`) + */ + var forEach = function (collection, callback, scope) { + if (Object.prototype.toString.call(collection) === '[object Object]') { + for (var prop in collection) { + if (Object.prototype.hasOwnProperty.call(collection, prop)) { + callback.call(scope, collection[prop], prop, collection); + } + } + } else { + for (var i = 0, len = collection.length; i < len; i++) { + callback.call(scope, collection[i], i, collection); + } + } + }; + + /** + * Merge defaults with user options + * @private + * @param {Object} defaults Default settings + * @param {Object} options User options + * @returns {Object} Merged values of defaults and options + */ + var extend = function ( defaults, options ) { + var extended = {}; + forEach(defaults, function (value, prop) { + extended[prop] = defaults[prop]; + }); + forEach(options, function (value, prop) { + extended[prop] = options[prop]; + }); + return extended; + }; + + /** + * Get the closest matching element up the DOM tree + * @param {Element} elem Starting element + * @param {String} selector Selector to match against (class, ID, or data attribute) + * @return {Boolean|Element} Returns false if not match found + */ + var getClosest = function (elem, selector) { + var firstChar = selector.charAt(0); + for ( ; elem && elem !== document; elem = elem.parentNode ) { + if ( firstChar === '.' ) { + if ( elem.classList.contains( selector.substr(1) ) ) { + return elem; + } + } else if ( firstChar === '#' ) { + if ( elem.id === selector.substr(1) ) { + return elem; + } + } else if ( firstChar === '[' ) { + if ( elem.hasAttribute( selector.substr(1, selector.length - 2) ) ) { + return elem; + } + } + } + return false; + }; + + /** + * Escape special characters for use with querySelector + * @private + * @param {String} id The anchor ID to escape + * @author Mathias Bynens + * @link https://github.com/mathiasbynens/CSS.escape + */ + var escapeCharacters = function ( id ) { + var string = String(id); + var length = string.length; + var index = -1; + var codeUnit; + var result = ''; + var firstCodeUnit = string.charCodeAt(0); + while (++index < length) { + codeUnit = string.charCodeAt(index); + // Note: there’s no need to special-case astral symbols, surrogate + // pairs, or lone surrogates. + + // If the character is NULL (U+0000), then throw an + // `InvalidCharacterError` exception and terminate these steps. + if (codeUnit === 0x0000) { + throw new InvalidCharacterError( + 'Invalid character: the input contains U+0000.' + ); + } + + if ( + // If the character is in the range [\1-\1F] (U+0001 to U+001F) or is + // U+007F, […] + (codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F || + // If the character is the first character and is in the range [0-9] + // (U+0030 to U+0039), […] + (index === 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) || + // If the character is the second character and is in the range [0-9] + // (U+0030 to U+0039) and the first character is a `-` (U+002D), […] + ( + index === 1 && + codeUnit >= 0x0030 && codeUnit <= 0x0039 && + firstCodeUnit === 0x002D + ) + ) { + // http://dev.w3.org/csswg/cssom/#escape-a-character-as-code-point + result += '\\' + codeUnit.toString(16) + ' '; + continue; + } + + // If the character is not handled by one of the above rules and is + // greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or + // is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to + // U+005A), or [a-z] (U+0061 to U+007A), […] + if ( + codeUnit >= 0x0080 || + codeUnit === 0x002D || + codeUnit === 0x005F || + codeUnit >= 0x0030 && codeUnit <= 0x0039 || + codeUnit >= 0x0041 && codeUnit <= 0x005A || + codeUnit >= 0x0061 && codeUnit <= 0x007A + ) { + // the character itself + result += string.charAt(index); + continue; + } + + // Otherwise, the escaped character. + // http://dev.w3.org/csswg/cssom/#escape-a-character + result += '\\' + string.charAt(index); + + } + return result; + }; + + /** + * Calculate the easing pattern + * @private + * @param {String} type Easing pattern + * @param {Number} time Time animation should take to complete + * @returns {Number} + */ + var easingPattern = function ( type, time ) { + var pattern; + if ( type === 'easeInQuad' ) pattern = time * time; // accelerating from zero velocity + if ( type === 'easeOutQuad' ) pattern = time * (2 - time); // decelerating to zero velocity + if ( type === 'easeInOutQuad' ) pattern = time < 0.5 ? 2 * time * time : -1 + (4 - 2 * time) * time; // acceleration until halfway, then deceleration + if ( type === 'easeInCubic' ) pattern = time * time * time; // accelerating from zero velocity + if ( type === 'easeOutCubic' ) pattern = (--time) * time * time + 1; // decelerating to zero velocity + if ( type === 'easeInOutCubic' ) pattern = time < 0.5 ? 4 * time * time * time : (time - 1) * (2 * time - 2) * (2 * time - 2) + 1; // acceleration until halfway, then deceleration + if ( type === 'easeInQuart' ) pattern = time * time * time * time; // accelerating from zero velocity + if ( type === 'easeOutQuart' ) pattern = 1 - (--time) * time * time * time; // decelerating to zero velocity + if ( type === 'easeInOutQuart' ) pattern = time < 0.5 ? 8 * time * time * time * time : 1 - 8 * (--time) * time * time * time; // acceleration until halfway, then deceleration + if ( type === 'easeInQuint' ) pattern = time * time * time * time * time; // accelerating from zero velocity + if ( type === 'easeOutQuint' ) pattern = 1 + (--time) * time * time * time * time; // decelerating to zero velocity + if ( type === 'easeInOutQuint' ) pattern = time < 0.5 ? 16 * time * time * time * time * time : 1 + 16 * (--time) * time * time * time * time; // acceleration until halfway, then deceleration + return pattern || time; // no easing, no acceleration + }; + + /** + * Calculate how far to scroll + * @private + * @param {Element} anchor The anchor element to scroll to + * @param {Number} headerHeight Height of a fixed header, if any + * @param {Number} offset Number of pixels by which to offset scroll + * @returns {Number} + */ + var getEndLocation = function ( anchor, headerHeight, offset ) { + var location = 0; + if (anchor.offsetParent) { + do { + location += anchor.offsetTop; + anchor = anchor.offsetParent; + } while (anchor); + } + location = location - headerHeight - offset; + return location >= 0 ? location : 0; + }; + + /** + * Determine the document's height + * @private + * @returns {Number} + */ + var getDocumentHeight = function () { + return Math.max( + document.body.scrollHeight, document.documentElement.scrollHeight, + document.body.offsetHeight, document.documentElement.offsetHeight, + document.body.clientHeight, document.documentElement.clientHeight + ); + }; + + /** + * Convert data-options attribute into an object of key/value pairs + * @private + * @param {String} options Link-specific options as a data attribute string + * @returns {Object} + */ + var getDataOptions = function ( options ) { + return !options || !(typeof JSON === 'object' && typeof JSON.parse === 'function') ? {} : JSON.parse( options ); + }; + + /** + * Update the URL + * @private + * @param {Element} anchor The element to scroll to + * @param {Boolean} url Whether or not to update the URL history + */ + var updateUrl = function ( anchor, url ) { + if ( history.pushState && (url || url === 'true') ) { + history.pushState( { + pos: anchor.id + }, '', window.location.pathname + anchor ); + } + }; + + /** + * Start/stop the scrolling animation + * @public + * @param {Element} toggle The element that toggled the scroll event + * @param {Element} anchor The element to scroll to + * @param {Object} settings + * @param {Event} event + */ + smoothScroll.animateScroll = function ( toggle, anchor, options ) { + + // Options and overrides + var settings = extend( settings || defaults, options || {} ); // Merge user options with defaults + var overrides = getDataOptions( toggle ? toggle.getAttribute('data-options') : null ); + settings = extend( settings, overrides ); + anchor = '#' + escapeCharacters(anchor.substr(1)); // Escape special characters and leading numbers + + // Selectors and variables + var fixedHeader = document.querySelector('[data-scroll-header]'); // Get the fixed header + var headerHeight = fixedHeader === null ? 0 : (fixedHeader.offsetHeight + fixedHeader.offsetTop); // Get the height of a fixed header if one exists + var startLocation = root.pageYOffset; // Current location on the page + var endLocation = getEndLocation( document.querySelector(anchor), headerHeight, parseInt(settings.offset, 10) ); // Scroll to location + var animationInterval; // interval timer + var distance = endLocation - startLocation; // distance to travel + var documentHeight = getDocumentHeight(); + var timeLapsed = 0; + var percentage, position; + + // Update URL + updateUrl(anchor, settings.updateURL); + + /** + * Stop the scroll animation when it reaches its target (or the bottom/top of page) + * @private + * @param {Number} position Current position on the page + * @param {Number} endLocation Scroll to location + * @param {Number} animationInterval How much to scroll on this loop + */ + var stopAnimateScroll = function (position, endLocation, animationInterval) { + var currentLocation = root.pageYOffset; + if ( position == endLocation || currentLocation == endLocation || ( (root.innerHeight + currentLocation) >= documentHeight ) ) { + clearInterval(animationInterval); + settings.callbackAfter( toggle, anchor ); // Run callbacks after animation complete + } + }; + + /** + * Loop scrolling animation + * @private + */ + var loopAnimateScroll = function () { + timeLapsed += 16; + percentage = ( timeLapsed / parseInt(settings.speed, 10) ); + percentage = ( percentage > 1 ) ? 1 : percentage; + position = startLocation + ( distance * easingPattern(settings.easing, percentage) ); + root.scrollTo( 0, Math.floor(position) ); + stopAnimateScroll(position, endLocation, animationInterval); + }; + + /** + * Set interval timer + * @private + */ + var startAnimateScroll = function () { + settings.callbackBefore( toggle, anchor ); // Run callbacks before animating scroll + animationInterval = setInterval(loopAnimateScroll, 16); + }; + + /** + * Reset position to fix weird iOS bug + * @link https://github.com/cferdinandi/smooth-scroll/issues/45 + */ + if ( root.pageYOffset === 0 ) { + root.scrollTo( 0, 0 ); + } + + // Start scrolling animation + startAnimateScroll(); + + }; + + /** + * If smooth scroll element clicked, animate scroll + * @private + */ + var eventHandler = function (event) { + var toggle = getClosest(event.target, '[data-scroll]'); + if ( toggle && toggle.tagName.toLowerCase() === 'a' ) { + event.preventDefault(); // Prevent default click event + smoothScroll.animateScroll( toggle, toggle.hash, settings, event ); // Animate scroll + } + }; + + /** + * Destroy the current initialization. + * @public + */ + smoothScroll.destroy = function () { + if ( !settings ) return; + document.removeEventListener( 'click', eventHandler, false ); + settings = null; + }; + + /** + * Initialize Smooth Scroll + * @public + * @param {Object} options User settings + */ + smoothScroll.init = function ( options ) { + + // feature test + if ( !supports ) return; + + // Destroy any existing initializations + smoothScroll.destroy(); + + // Selectors and variables + settings = extend( defaults, options || {} ); // Merge user options with defaults + + // When a toggle is clicked, run the click handler + document.addEventListener('click', eventHandler, false); + + }; + + + // + // Public APIs + // + + return smoothScroll; + +}); diff --git a/preview/contents/assets/stylesheets/application.css b/preview/contents/assets/stylesheets/application.css new file mode 100644 index 0000000..4f6b60b --- /dev/null +++ b/preview/contents/assets/stylesheets/application.css @@ -0,0 +1,5096 @@ +@charset "UTF-8"; +/* + image naming convention: + desktop: image.png + mobile: image--sm.png + mobile retina: image--sm--2x.png + $image: '../images/slide' image path plus name fragment + $ext: 'png' +*/ +/* line 1, ../sass/placeholder_selectors/_clear.scss */ +.blog-entry-meta dl, .blog-entry-meta ul, .company-hq-details__content, .contactblock__content, .customer-grouping__items, .developer-portal-logo-grid__items, .download-table__header, .event-date-location__wrapper, .featured-speakers__items, .featured-speakers__item, .icon-link-grid__items, .link-block, .logo-grid__items, .pagination__items, .related-content__items, .sales-offices .sales-offices__items, .stats--contained__content ul, .stats__content ul, .toggle-group, .developer-portal-global-content, .developer-portal-header__hgroup, .developer-portal-header__navigation__items, .developer-portal-sidebar__navigation__wrapper a, .developer-portal-sidebar__versions a, .developer-portal-sidebar__versions__toggler, .global-footer, .global-footer__contact, .global-footer__contact__social, .global-header, .global-sub-footer, .homepage-products__content ul, .homepage-promos, .footer-navigation, .primary-navigation__items { + zoom: 1; +} +/* line 4, ../sass/placeholder_selectors/_clear.scss */ +.blog-entry-meta dl:after, .blog-entry-meta ul:after, .company-hq-details__content:after, .contactblock__content:after, .customer-grouping__items:after, .developer-portal-logo-grid__items:after, .download-table__header:after, .event-date-location__wrapper:after, .featured-speakers__items:after, .featured-speakers__item:after, .icon-link-grid__items:after, .link-block:after, .logo-grid__items:after, .pagination__items:after, .related-content__items:after, .sales-offices .sales-offices__items:after, .stats--contained__content ul:after, .stats__content ul:after, .toggle-group:after, .developer-portal-global-content:after, .developer-portal-header__hgroup:after, .developer-portal-header__navigation__items:after, .developer-portal-sidebar__navigation__wrapper a:after, .developer-portal-sidebar__versions a:after, .developer-portal-sidebar__versions__toggler:after, .global-footer:after, .global-footer__contact:after, .global-footer__contact__social:after, .global-header:after, .global-sub-footer:after, .homepage-products__content ul:after, .homepage-promos:after, .footer-navigation:after, .primary-navigation__items:after { + clear: both; + content: ""; + display: table; +} + +/* line 1, ../sass/placeholder_selectors/_image-replace.scss */ +.blog-entry-meta .share-icon, .carousel__navigation--next span, +.carousel__navigation--previous span, .pagination__item--next b, +.pagination__item--previous b, .videoblock__button span, .developer-portal-header__logo a, .developer-portal-header__search button span, .global-footer__contact__social a, .global-header-search button span, .global-header__logo a, .product-section__nav__logo a { + overflow: hidden; + text-indent: 100%; + text-shadow: none; + white-space: nowrap; +} + +/* line 1, ../sass/placeholder_selectors/_ui-list.scss */ +.blog-entry-meta ul, .customer-grouping__items, .developer-portal-logo-grid__items, .download-intro__wrapper ul, .download-section__content .links, .download-section__links .download-links, .download-table, .featured-speakers__items, .icon-link-grid__items, .logo-grid__items, .pagination__items, .pricing-icon-list__items, .related-content__items, .sales-offices .sales-offices__items, .sponsor-grid__items, .stats--contained__content ul, .stats .stats__content ul, .toggle-group, .developer-portal-header__navigation__items, .developer-portal-header__search ul, .developer-portal-sidebar__navigation__wrapper ul, .developer-portal-sidebar__versions ul, .global-footer__contact__social, .global-header-search ul, .homepage-customers__items, .homepage-get-started__content ul, .homepage-products__content ul, .homepage-products__actions ul, .footer-navigation__items, .primary-navigation__items, .secondary-navigation__items { + list-style: none; + margin: 0; + padding: 0; +} + +@-ms-viewport { + width: device-width; +} +/* line 5, ../sass/base/_elements.scss */ +*, +*:before, +*:after { + box-sizing: inherit; +} + +/* line 11, ../sass/base/_elements.scss */ +html { + box-sizing: border-box; + -webkit-text-size-adjust: 100%; +} + +/* line 16, ../sass/base/_elements.scss */ +body { + font-family: "Kievit OT", sans-serif; + color: #000; + margin: 0; +} + +/* @group HTML5 elements */ +/* line 24, ../sass/base/_elements.scss */ +article, +figure, +footer, +header, +main { + display: block; +} + +/* @end */ +/* @group Links */ +/* line 36, ../sass/base/_elements.scss */ +a { + background: none; + color: #ec1e2c; + text-decoration: none; +} +/* line 41, ../sass/base/_elements.scss */ +a:focus, a:hover { + color: #d7181b; +} + +/* @end */ +/* @group Text-level semantics */ +/* line 51, ../sass/base/_elements.scss */ +b, +strong { + font-weight: 700; +} + +/* @end */ +/* @group Embedded content */ +/* line 60, ../sass/base/_elements.scss */ +img { + border: 0; + -ms-interpolation-mode: bicubic; + vertical-align: middle; +} + +/* @end */ +/* @group Grouping content */ +/* line 70, ../sass/base/_elements.scss */ +hr { + background: #ec1e2c; + border: 0; + height: 2px; + margin: 3em auto; + width: 2em; +} +/* line 77, ../sass/base/_elements.scss */ +hr.wide { + background: #cccccc; + border: solid #fff; + border-width: 0 1em; + max-width: 52em; + width: 100%; +} + +/* @end */ +/* @group Forms */ +/* line 90, ../sass/base/_elements.scss */ +button, +input, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} + +/* line 99, ../sass/base/_elements.scss */ +button { + overflow: visible; +} + +/* line 103, ../sass/base/_elements.scss */ +button, +select { + text-transform: none; +} + +/* line 108, ../sass/base/_elements.scss */ +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} + +/* line 116, ../sass/base/_elements.scss */ +button[disabled], +html input[disabled] { + cursor: default; +} + +/* line 121, ../sass/base/_elements.scss */ +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/* line 127, ../sass/base/_elements.scss */ +input { + line-height: normal; +} + +/* line 131, ../sass/base/_elements.scss */ +input[type="checkbox"], +input[type="radio"] { + padding: 0; +} + +/* line 136, ../sass/base/_elements.scss */ +input[type="search"] { + -webkit-appearance: textfield; +} +/* line 139, ../sass/base/_elements.scss */ +input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* line 145, ../sass/base/_elements.scss */ +textarea { + overflow: auto; +} + +/* @end */ +@font-face { + font-family: "Kievit OT"; + font-style: normal; + font-weight: normal; + src: url("../fonts/kievitot-regular.eot"); + src: url("../fonts/kievitot-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/kievitot-regular.woff") format("woff"); +} +@font-face { + font-family: "Kievit OT"; + font-style: normal; + font-weight: bold; + src: url("../fonts/kievitot-bold.eot"); + src: url("../fonts/kievitot-bold.eot?#iefix") format("embedded-opentype"), url("../fonts/kievitot-bold.woff") format("woff"); +} +@font-face { + font-family: "Kievit OT"; + font-style: italic; + font-weight: normal; + src: url("../fonts/kievitot-italic.eot"); + src: url("../fonts/kievitot-italic.eot?#iefix") format("embedded-opentype"), url("../fonts/kievitot-italic.woff") format("woff"); +} +@font-face { + font-family: "Kievit OT"; + font-style: italic; + font-weight: bold; + src: url("../fonts/kievitot-bolditalic.eot"); + src: url("../fonts/kievitot-bolditalic.eot?#iefix") format("embedded-opentype"), url("../fonts/kievitot-bolditalic.woff") format("woff"); +} +/* line 1, ../sass/components/_article-listing.scss */ +.article-listing__header { + margin: 0 auto 1em auto; + max-width: 52em; + padding: 0 1em; +} + +/* line 7, ../sass/components/_article-listing.scss */ +.article-listing__header__title { + font-size: 32px; + font-weight: normal; + margin: 0; + text-align: center; +} + +/* line 1, ../sass/components/_article.scss */ +.article__wrapper { + margin: 0 auto; + max-width: 52em; + padding: 0 1em 3em 1em; + position: relative; +} + +/* line 8, ../sass/components/_article.scss */ +.article__header { + padding: 3em 0 0 0; +} +/* line 11, ../sass/components/_article.scss */ +.article + .article .article__header { + border-top: 2px solid #bfbfbf; +} + +/* line 16, ../sass/components/_article.scss */ +.article__title { + font-size: 28px; + margin: 0; +} + +/* line 21, ../sass/components/_article.scss */ +.article__meta { + font-weight: bold; + margin: 0.5em 0; +} + +/* line 26, ../sass/components/_article.scss */ +.article__avatar { + border-radius: 50%; + display: none; + left: -5em; + position: absolute; + top: 3em; +} +@media (min-width: 65.5em) { + /* line 26, ../sass/components/_article.scss */ + .article__avatar { + display: block; + } +} + +/* line 38, ../sass/components/_article.scss */ +.article__content { + line-height: 1.6; + margin: 1em 0; +} + +/* line 43, ../sass/components/_article.scss */ +.article__footer { + margin-top: 1.5em; +} +/* line 46, ../sass/components/_article.scss */ +.article__footer a { + background: url("../images/icons/article-arrow.png") no-repeat 100% 40%; + display: inline-block; + font-weight: bold; + padding-right: 1em; + text-transform: uppercase; +} + +/* line 1, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta { + margin: 3em auto; + max-width: 52em; + padding: 0 1em; +} +/* line 10, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta dt { + font-weight: bold; + margin-bottom: 0.5em; +} +@media (min-width: 40em) { + /* line 10, ../sass/components/_blog-entry-meta.scss */ + .blog-entry-meta dt { + float: left; + padding-top: 0.5em; + width: 4em; + } +} +/* line 21, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta dd { + margin: 0 0 1.5em 0; +} +@media (min-width: 40em) { + /* line 21, ../sass/components/_blog-entry-meta.scss */ + .blog-entry-meta dd { + margin-left: 4em; + } +} +/* line 34, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta li { + float: left; + margin: 0 0.5em 0.5em 0; +} +/* line 39, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta .tag { + background: #7bbdcb; + border-radius: 0.25em; + color: #fff; + display: inline-block; + padding: 0.5em 1em; + white-space: nowrap; + text-transform: uppercase; +} +/* line 48, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta .tag:focus, .blog-entry-meta .tag:hover { + background: #8ec5d2; +} +/* line 54, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta .share-icon { + background: no-repeat 50% 50%; + display: inline-block; + height: 2em; + width: 2em; +} +/* line 63, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta .share-icon--twitter { + background-image: url("../images/icons/share-twitter.png"); +} +/* line 63, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta .share-icon--facebook { + background-image: url("../images/icons/share-facebook.png"); +} +/* line 63, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta .share-icon--reddit { + background-image: url("../images/icons/share-reddit.png"); +} +/* line 63, ../sass/components/_blog-entry-meta.scss */ +.blog-entry-meta .share-icon--email { + background-image: url("../images/icons/share-email.png"); +} + +/* line 1, ../sass/components/_buttonblock.scss */ +.buttonblock { + margin: 3em 0; + padding: 0 1em; + text-align: center; +} + +/* line 1, ../sass/components/_buttons.scss */ +.button, .button--blue, .button--teal, .button--grey, .global-footer__contact__button, .global-header__download-button { + background: #ec1e2c; + border-radius: 3px; + color: #fff; + display: inline-block; + font-size: 16px; + font-weight: bold; + line-height: 1; + padding: 1em 2.5em; + text-align: center; + text-transform: uppercase; +} +/* line 13, ../sass/components/_buttons.scss */ +.button:focus, .button--blue:focus, .button--teal:focus, .button--grey:focus, .global-footer__contact__button:focus, .global-header__download-button:focus, .button:hover, .button--blue:hover, .button--teal:hover, .button--grey:hover, .global-footer__contact__button:hover, .global-header__download-button:hover { + background: #d7181b; + color: #fff; +} +/* line 19, ../sass/components/_buttons.scss */ +.button:active, .button--blue:active, .button--teal:active, .button--grey:active, .global-footer__contact__button:active, .global-header__download-button:active { + background: #be0e11; +} + +/* line 24, ../sass/components/_buttons.scss */ +.button--blue { + background: #0081a5; +} +/* line 28, ../sass/components/_buttons.scss */ +.button--blue:focus, .button--blue:hover { + background: #006d8b; +} + +/* line 34, ../sass/components/_buttons.scss */ +.button--teal { + background: #6da6b3; +} +/* line 38, ../sass/components/_buttons.scss */ +.button--teal:focus, .button--teal:hover { + background: #7fb5c1; +} +/* line 43, ../sass/components/_buttons.scss */ +.button--teal:active { + background: #8fcad7; +} + +/* line 48, ../sass/components/_buttons.scss */ +.button--grey { + background: #e6e6e6; + color: #000; +} +/* line 53, ../sass/components/_buttons.scss */ +.button--grey:focus, .button--grey:hover { + background: #bfbfbf; + color: #000; +} +/* line 59, ../sass/components/_buttons.scss */ +.button--grey:active { + background: #4a4947; + color: #fff; +} + +/* line 65, ../sass/components/_buttons.scss */ +.button--outlined { + background: none; + border: 2px solid #1b1a19; + border-radius: 5px; + color: #1b1a19; + display: block; + font-weight: bold; + line-height: 1.1; + margin: 0 auto; + max-width: 26em; + padding: 1.1em 1em 1em 1em; + text-align: center; + text-transform: uppercase; + width: 100%; +} +/* line 80, ../sass/components/_buttons.scss */ +.button--outlined:focus, .button--outlined:hover { + border-color: #1b1a19; + color: #1b1a19; +} + +/* line 1, ../sass/components/_carousel.scss */ +.carousel { + margin: 3em 0; +} + +/* line 5, ../sass/components/_carousel.scss */ +.carousel__wrapper { + padding: 0 2em; + position: relative; +} + +/* line 10, ../sass/components/_carousel.scss */ +.carousel__pages { + overflow: hidden; + position: relative; +} + +/* line 15, ../sass/components/_carousel.scss */ +.carousel__page { + transition: all 200ms ease-in-out; + -ms-transform: translate3d(0, 0, 0); + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + width: 100%; +} + +/* line 21, ../sass/components/_carousel.scss */ +.carousel__page--current { + opacity: 1; + position: relative; + z-index: 1; +} + +/* line 27, ../sass/components/_carousel.scss */ +.carousel__page--previous, +.carousel__page--next { + opacity: 0; + position: absolute; + top: 0; +} + +/* line 34, ../sass/components/_carousel.scss */ +.carousel__page--previous { + -ms-transform: translate3d(-100%, 0, 0); + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); +} + +/* line 38, ../sass/components/_carousel.scss */ +.carousel__page--next { + -ms-transform: translate3d(100%, 0, 0); + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); +} + +/* line 42, ../sass/components/_carousel.scss */ +.carousel__navigation--next, +.carousel__navigation--previous { + background: no-repeat 50% 50%; + border: 0; + display: block; + height: 41px; + margin-top: -1.5em; + position: absolute; + top: 50%; + width: 24px; + z-index: 10; +} +/* line 54, ../sass/components/_carousel.scss */ +.carousel__navigation--next span, +.carousel__navigation--previous span { + display: block; +} + +/* line 60, ../sass/components/_carousel.scss */ +.carousel__navigation--next { + background-image: url("../images/icons/carousel-next.png"); + right: 0; +} + +/* line 65, ../sass/components/_carousel.scss */ +.carousel__navigation--previous { + background-image: url("../images/icons/carousel-previous.png"); + left: 0; +} + +/* line 1, ../sass/components/_company-hq-details.scss */ +.company-hq-details { + background: #7bbdcb; + min-height: 20em; + padding: 3em 1em; +} +/* line 6, ../sass/components/_company-hq-details.scss */ +.company-hq-details .layout-wrapper { + max-width: 60em; + position: relative; +} +@media (min-width: 40em) { + /* line 6, ../sass/components/_company-hq-details.scss */ + .company-hq-details .layout-wrapper { + padding-left: 16em; + } +} + +/* line 16, ../sass/components/_company-hq-details.scss */ +.company-hq-details__header { + margin-bottom: 1.5em; +} +/* line 19, ../sass/components/_company-hq-details.scss */ +.company-hq-details__header h1 { + color: #0d4c5a; + font-size: 32px; + font-weight: normal; + margin: 0; +} + +/* line 27, ../sass/components/_company-hq-details.scss */ +.company-hq-details__content { + color: #fff; + line-height: 1.4; +} +/* line 32, ../sass/components/_company-hq-details.scss */ +.company-hq-details__content img { + border: 0.25em solid #fff; + border-radius: 50%; + display: block; + margin-bottom: 1.5em; +} +@media (min-width: 40em) { + /* line 32, ../sass/components/_company-hq-details.scss */ + .company-hq-details__content img { + left: 0; + position: absolute; + top: 0; + } +} +/* line 46, ../sass/components/_company-hq-details.scss */ +.company-hq-details__content .column + .column { + margin-top: 1.5em; +} +@media (min-width: 64em) { + /* line 45, ../sass/components/_company-hq-details.scss */ + .company-hq-details__content .column { + float: left; + padding-right: 3em; + width: 50%; + } + /* line 55, ../sass/components/_company-hq-details.scss */ + .company-hq-details__content .column + .column { + margin-top: 0; + } +} +/* line 61, ../sass/components/_company-hq-details.scss */ +.company-hq-details__content h2, +.company-hq-details__content p { + font-size: 20px; + margin: 0; +} +/* line 67, ../sass/components/_company-hq-details.scss */ +.company-hq-details__content a { + color: #fff; + text-decoration: underline; +} + +/* line 1, ../sass/components/_contactblock.scss */ +.contactblock { + margin: 3em auto; + max-width: 52em; + padding: 0 1em; +} + +/* line 7, ../sass/components/_contactblock.scss */ +.contactblock__content { + border: 0.25em solid #f2f2f2; + padding: 1.5em 1.5em 1.5em 6.5em; + position: relative; +} +/* line 13, ../sass/components/_contactblock.scss */ +.contactblock__content p { + line-height: 1.4; + margin: 0; +} + +/* line 19, ../sass/components/_contactblock.scss */ +.contactblock__avatar { + background: #00bfe8; + border-radius: 50%; + display: block; + height: 58px; + left: 1.5em; + margin-bottom: 0.5em; + overflow: hidden; + position: absolute; + top: 1.5em; + width: 58px; +} + +/* line 32, ../sass/components/_contactblock.scss */ +.contactblock__title { + font-size: 16px; + margin: 0 0 0.25em 0; +} + +/* line 1, ../sass/components/_ctablock.scss */ +.ctablock, .ctablock--bright, .ctablock--grey { + background: #282725 url("../images/patterns/exhaust.jpg") repeat-y 50% 50%; + color: #fff; + margin: 3em 0; +} + +/* line 7, ../sass/components/_ctablock.scss */ +.ctablock__wrapper { + margin: 0 auto; + max-width: 52em; + padding: 3em 1em; + text-align: center; +} + +/* line 14, ../sass/components/_ctablock.scss */ +.ctablock__title { + font-size: 32px; + font-weight: normal; + margin: 0; +} + +/* line 20, ../sass/components/_ctablock.scss */ +.ctablock__content { + font-size: 20px; + line-height: 1.6; + margin: 1.5em 0; +} +/* line 25, ../sass/components/_ctablock.scss */ +.ctablock__content p { + margin: 0; +} + +/* @group Bright variant */ +/* line 32, ../sass/components/_ctablock.scss */ +.ctablock--bright { + background: #00bfe8 url("../images/patterns/mosaic-bright.png") repeat 50% 50%; +} + +/* @end */ +/* @group Grey variant */ +/* line 41, ../sass/components/_ctablock.scss */ +.ctablock--grey { + background: #f2f2f2; + border-top: 1px solid #e6e6e6; +} +/* line 46, ../sass/components/_ctablock.scss */ +.global-content .ctablock--grey:last-child { + margin-bottom: 0; +} +/* line 50, ../sass/components/_ctablock.scss */ +.ctablock--grey .ctablock__content { + color: #000; + font-weight: bold; + margin-top: 0; + text-transform: uppercase; +} + +/* @end */ +/* line 1, ../sass/components/_customer-grouping.scss */ +.customer-grouping { + margin: 3em auto; + max-width: 68em; + padding: 0 1em; +} + +/* line 7, ../sass/components/_customer-grouping.scss */ +.customer-grouping__title { + font-size: 28px; + font-weight: normal; + margin: 0; + text-align: center; +} + +/* line 19, ../sass/components/_customer-grouping.scss */ +.customer-grouping__item { + margin-top: 1.5em; +} +@media (min-width: 45em) { + /* line 19, ../sass/components/_customer-grouping.scss */ + .customer-grouping__item { + float: left; + padding: 0 0.75em; + width: 33.33333%; + } + /* line 27, ../sass/components/_customer-grouping.scss */ + .customer-grouping__item:nth-child(3n) { + padding-right: 0; + } + /* line 31, ../sass/components/_customer-grouping.scss */ + .customer-grouping__item:nth-child(3n+1) { + padding-left: 0; + } +} +/* line 36, ../sass/components/_customer-grouping.scss */ +.customer-grouping__item a { + background: rgba(0, 0, 0, 0.6); + display: table; + height: 13.75em; + transition: background 100ms linear; + width: 100%; +} +/* line 43, ../sass/components/_customer-grouping.scss */ +.customer-grouping__item a:focus, .customer-grouping__item a:hover { + background: rgba(0, 0, 0, 0.5); +} + +/* line 50, ../sass/components/_customer-grouping.scss */ +.customer-grouping__item__wrapper { + background: no-repeat 50% 50%; + background-size: cover; +} + +/* line 55, ../sass/components/_customer-grouping.scss */ +.customer-grouping__item__logo { + display: table-cell; + margin: 0; + padding: 1em; + text-align: center; + vertical-align: middle; +} +/* line 62, ../sass/components/_customer-grouping.scss */ +.customer-grouping__item__logo img { + max-width: 235px; + width: 100%; +} + +/* line 1, ../sass/components/_developer-portal-logo-grid.scss */ +.developer-portal-logo-grid { + margin: 3em auto; + max-width: 52em; + padding: 0 1em; +} + +/* line 12, ../sass/components/_developer-portal-logo-grid.scss */ +.developer-portal-logo-grid__item { + display: block; + text-align: center; +} +/* line 16, ../sass/components/_developer-portal-logo-grid.scss */ +.developer-portal-logo-grid__item + .developer-portal-logo-grid__item { + margin-top: 3em; +} +@media (min-width: 36em) { + /* line 12, ../sass/components/_developer-portal-logo-grid.scss */ + .developer-portal-logo-grid__item { + float: left; + padding: 0 1em; + width: 33.33333%; + } + /* line 25, ../sass/components/_developer-portal-logo-grid.scss */ + .developer-portal-logo-grid__item + .developer-portal-logo-grid__item { + margin-top: 0; + } +} +/* line 31, ../sass/components/_developer-portal-logo-grid.scss */ +.developer-portal-logo-grid__item span:before { + background: #00bfe8 no-repeat 50% 50%; + border-radius: 50%; + content: ""; + display: block; + margin: 0 auto 2em auto; + height: 7.5em; + width: 7.5em; +} +/* line 45, ../sass/components/_developer-portal-logo-grid.scss */ +.developer-portal-logo-grid__item .server span:before { + background-image: url("../images/icons/developer-portal-server.png"); +} +/* line 45, ../sass/components/_developer-portal-logo-grid.scss */ +.developer-portal-logo-grid__item .mobile span:before { + background-image: url("../images/icons/developer-portal-mobile.png"); +} +/* line 45, ../sass/components/_developer-portal-logo-grid.scss */ +.developer-portal-logo-grid__item .projects span:before { + background-image: url("../images/icons/developer-portal-projects.png"); +} + +/* line 1, ../sass/components/_download-intro.scss */ +.download-intro__wrapper { + line-height: 1.4; + margin: 3em auto; + max-width: 52em; + padding: 0 1em; + text-align: center; +} +/* line 8, ../sass/components/_download-intro.scss */ +.download-intro__wrapper p:first-child { + color: #757575; + font-size: 24px; + font-weight: bold; +} +/* line 14, ../sass/components/_download-intro.scss */ +.download-intro__wrapper ul { + margin-top: 3em; +} +/* line 19, ../sass/components/_download-intro.scss */ +.download-intro__wrapper li { + display: inline-block; + margin: 0 1em; +} +/* line 23, ../sass/components/_download-intro.scss */ +.download-intro__wrapper li a { + font-size: 24px; + font-weight: bold; +} + +/* line 1, ../sass/components/_download-section.scss */ +.download-section { + background: #f2f2f2; +} +/* line 4, ../sass/components/_download-section.scss */ +.download-section hr { + border-color: #f2f2f2; + max-width: 64em; +} + +/* line 10, ../sass/components/_download-section.scss */ +.download-section__header { + background: #282725; + color: #fff; + padding: 1.5em 0; + text-align: center; +} +/* line 16, ../sass/components/_download-section.scss */ +.download-section__header h1 { + font-size: 32px; + font-weight: normal; + margin: 0; +} + +/* line 23, ../sass/components/_download-section.scss */ +.download-section__content { + margin: 0 auto; + max-width: 70em; + padding: 3em 1em; +} +/* line 28, ../sass/components/_download-section.scss */ +.download-section__content .title { + font-size: 24px; + margin: 0; +} +/* line 33, ../sass/components/_download-section.scss */ +.download-section__content .links { + margin-top: 0.75em; +} +/* line 37, ../sass/components/_download-section.scss */ +.download-section__content .links li { + display: inline-block; +} +/* line 41, ../sass/components/_download-section.scss */ +.download-section__content .links li + li:before { + content: "•"; + display: inline-block; + margin: 0 0.75em 0 0.5em; +} + +/* line 49, ../sass/components/_download-section.scss */ +.download-section__subheader { + margin-bottom: 3em; + position: relative; + text-align: center; +} +/* line 54, ../sass/components/_download-section.scss */ +.download-section__subheader .next-version, +.download-section__subheader .previous-version { + font-weight: bold; + position: absolute; + text-transform: uppercase; + top: 1.5em; +} +/* line 62, ../sass/components/_download-section.scss */ +.download-section__subheader .next-version:after, +.download-section__subheader .previous-version:before { + background: no-repeat 0 0; + content: ""; + display: inline-block; + height: 15px; + vertical-align: middle; + width: 9px; +} +/* line 72, ../sass/components/_download-section.scss */ +.download-section__subheader .next-version { + right: 0; +} +/* line 75, ../sass/components/_download-section.scss */ +.download-section__subheader .next-version:after { + background-image: url("../images/icons/download-next.png"); + margin-left: 0.5em; +} +/* line 81, ../sass/components/_download-section.scss */ +.download-section__subheader .previous-version { + left: 0; +} +/* line 84, ../sass/components/_download-section.scss */ +.download-section__subheader .previous-version:before { + background-image: url("../images/icons/download-previous.png"); + margin-right: 0.5em; +} + +/* line 91, ../sass/components/_download-section.scss */ +.download-section__links { + text-align: center; +} +/* line 94, ../sass/components/_download-section.scss */ +.download-section__links .sub-title { + font-size: 20px; + margin: 2em 0 0 0; + text-transform: uppercase; +} +/* line 100, ../sass/components/_download-section.scss */ +.download-section__links .download-links { + margin-top: 0.5em; +} +/* line 104, ../sass/components/_download-section.scss */ +.download-section__links .download-links li { + display: inline-block; + margin-top: 1.5em; + padding: 0 1em; + width: 30%; +} +/* line 110, ../sass/components/_download-section.scss */ +.download-section__links .download-links li a { + font-weight: bold; +} +/* line 114, ../sass/components/_download-section.scss */ +.download-section__links .download-links li span { + display: block; + margin-top: 0.5em; +} + +/* line 1, ../sass/components/_download-table.scss */ +.download-table__wrapper { + background: #fff; + padding: 2em 3em; +} + +/* line 6, ../sass/components/_download-table.scss */ +.download-table__header { + margin-bottom: 1.5em; +} +/* line 10, ../sass/components/_download-table.scss */ +.download-table__header .toggle-group { + float: left; +} +/* line 13, ../sass/components/_download-table.scss */ +.download-table__header .toggle-group + .toggle-group { + margin-left: 2em; +} +/* line 18, ../sass/components/_download-table.scss */ +.download-table__header p { + float: left; + font-weight: bold; + margin: 0 0 0 1em; + padding: 1em 0; +} + +/* line 29, ../sass/components/_download-table.scss */ +.download-table > li { + border-top: 2px solid #bfbfbf; + padding: 1em 0; +} + +/* line 36, ../sass/components/_download-table.scss */ +.download-table--additional-versions[aria-expanded="false"] { + display: none; +} +/* line 40, ../sass/components/_download-table.scss */ +.download-table--additional-versions > li:first-child { + border-top: 0; +} + +/* line 45, ../sass/components/_download-table.scss */ +.download-table__row { + display: table; + table-layout: fixed; + width: 100%; +} + +/* line 51, ../sass/components/_download-table.scss */ +.download-table__cell { + display: table-cell; + vertical-align: middle; +} +/* line 55, ../sass/components/_download-table.scss */ +.download-table__cell .platform { + display: block; + font-size: 20px; +} +/* line 59, ../sass/components/_download-table.scss */ +.download-table__cell .platform:before { + background: no-repeat 50% 50%; + content: ""; + display: inline-block; + height: 80px; + margin-right: 1em; + width: 80px; + vertical-align: middle; +} +/* line 71, ../sass/components/_download-table.scss */ +.download-table__cell .platform--android:before { + background-image: url("../images/logos/android.png"); +} +/* line 71, ../sass/components/_download-table.scss */ +.download-table__cell .platform--java:before { + background-image: url("../images/logos/java.png"); +} +/* line 71, ../sass/components/_download-table.scss */ +.download-table__cell .platform--linux:before { + background-image: url("../images/logos/linux.png"); +} +/* line 71, ../sass/components/_download-table.scss */ +.download-table__cell .platform--mac:before { + background-image: url("../images/logos/mac.png"); +} +/* line 71, ../sass/components/_download-table.scss */ +.download-table__cell .platform--redhat:before { + background-image: url("../images/logos/redhat.png"); +} +/* line 71, ../sass/components/_download-table.scss */ +.download-table__cell .platform--ubuntu:before { + background-image: url("../images/logos/ubuntu.png"); +} +/* line 71, ../sass/components/_download-table.scss */ +.download-table__cell .platform--windows:before { + background-image: url("../images/logos/windows.png"); +} +/* line 76, ../sass/components/_download-table.scss */ +.download-table__cell .download, +.download-table__cell .instructions { + font-weight: bold; +} +/* line 80, ../sass/components/_download-table.scss */ +.download-table__cell .download:before, +.download-table__cell .instructions:before { + background: no-repeat 50% 50%; + content: ""; + display: inline-block; + margin: -2px 0.5em 0 0; + height: 20px; + vertical-align: middle; + width: 20px; +} +/* line 91, ../sass/components/_download-table.scss */ +.download-table__cell .download:before { + background-image: url("../images/icons/download.png"); +} +/* line 96, ../sass/components/_download-table.scss */ +.download-table__cell .instructions:before { + background-image: url("../images/icons/open.png"); +} +/* line 100, ../sass/components/_download-table.scss */ +.download-table__cell .instructions[aria-pressed="true"] { + background: #f2f2f2; + border-radius: 0.25em 0.25em 0 0; + color: #000; + display: inline-block; + margin-bottom: -2em; + padding: 1em 1.5em 3em 1.5em; +} +/* line 108, ../sass/components/_download-table.scss */ +.download-table__cell .instructions[aria-pressed="true"]:before { + background-image: url("../images/icons/close.png"); +} + +/* line 115, ../sass/components/_download-table.scss */ +.download-table__cell--actions { + color: #ec1e2c; + font-size: 20px; + text-align: right; +} + +/* line 121, ../sass/components/_download-table.scss */ +.download-table__cell--instructions { + text-align: center; +} + +/* line 125, ../sass/components/_download-table.scss */ +.download-table__instructions { + background: #f2f2f2; + margin-bottom: -1em; + padding: 1.5em; +} +/* line 130, ../sass/components/_download-table.scss */ +.download-table__instructions[aria-expanded="false"] { + display: none; +} +/* line 134, ../sass/components/_download-table.scss */ +.download-table__instructions .title { + font-size: 16px; + margin: 0; +} + +/* line 140, ../sass/components/_download-table.scss */ +.additional-versions { + border-top: 2px solid #bfbfbf; + padding-top: 1em; + margin: 0 0 1.5em 0; +} +/* line 146, ../sass/components/_download-table.scss */ +.additional-versions a:before { + background: url("../images/icons/open.png") no-repeat 50% 50%; + content: ""; + display: inline-block; + margin: -2px 0.5em 0 0; + height: 20px; + vertical-align: middle; + width: 20px; +} +/* line 156, ../sass/components/_download-table.scss */ +.additional-versions a[aria-pressed="true"]:before { + background-image: url("../images/icons/close.png"); +} + +/* line 1, ../sass/components/_event-agenda.scss */ +.event-agenda { + margin: 3em auto; + max-width: 52em; + padding: 0 1em; +} + +/* line 7, ../sass/components/_event-agenda.scss */ +.event-agenda__title { + font-size: 32px; + font-weight: normal; + margin: 0; + text-align: center; +} + +/* line 14, ../sass/components/_event-agenda.scss */ +.event-agenda__content { + margin-top: 3em; +} +/* line 17, ../sass/components/_event-agenda.scss */ +.event-agenda__content table { + border-collapse: collapse; + width: 100%; +} +/* line 22, ../sass/components/_event-agenda.scss */ +.event-agenda__content th, +.event-agenda__content td { + vertical-align: top; +} +/* line 27, ../sass/components/_event-agenda.scss */ +.event-agenda__content th { + font-size: 20px; + font-weight: bold; + text-align: left; + text-transform: uppercase; +} +/* line 34, ../sass/components/_event-agenda.scss */ +.event-agenda__content thead th { + padding: 0 0 1em 1.25em; +} +/* line 39, ../sass/components/_event-agenda.scss */ +.event-agenda__content tbody th { + border-right: 2px solid #cccccc; + min-width: 10.5em; +} +/* line 43, ../sass/components/_event-agenda.scss */ +.event-agenda__content tbody th span { + display: block; + padding-right: 1.5em; + position: relative; +} +/* line 48, ../sass/components/_event-agenda.scss */ +.event-agenda__content tbody th span:after { + background: #ec1e2c; + border: 3px solid #fff; + border-radius: 50%; + box-shadow: 0 0 0 2px #cccccc; + content: ""; + display: block; + height: 18px; + position: absolute; + right: -11px; + top: 0; + width: 18px; +} +/* line 64, ../sass/components/_event-agenda.scss */ +.event-agenda__content tbody tr:last-child th { + border-color: #fff; +} +/* line 68, ../sass/components/_event-agenda.scss */ +.event-agenda__content tbody td { + line-height: 1.6; + padding: 0 1.5em 1.5em 1.5em; +} +@media (max-width: 40em) { + /* line 75, ../sass/components/_event-agenda.scss */ + .event-agenda__content table, + .event-agenda__content tbody, + .event-agenda__content tr, + .event-agenda__content th, + .event-agenda__content td { + display: block; + } + /* line 83, ../sass/components/_event-agenda.scss */ + .event-agenda__content thead, + .event-agenda__content tbody th span:after { + display: none; + } + /* line 89, ../sass/components/_event-agenda.scss */ + .event-agenda__content tbody th { + border: 0; + margin-bottom: 1em; + } + /* line 94, ../sass/components/_event-agenda.scss */ + .event-agenda__content tbody td { + margin-bottom: 1.5em; + padding: 0; + } + /* line 98, ../sass/components/_event-agenda.scss */ + .event-agenda__content tbody td:before { + content: attr(data-title); + display: block; + font-weight: bold; + text-transform: uppercase; + } +} + +/* line 1, ../sass/components/_event-date-location.scss */ +.event-date-location { + margin: 3em auto; + max-width: 52em; + padding: 0 1em; + position: relative; +} +/* line 7, ../sass/components/_event-date-location.scss */ +.event-date-location:after { + background: #cccccc; + bottom: 1.5em; + content: ""; + display: block; + left: 50%; + margin-left: -1px; + position: absolute; + top: 0; + width: 2px; +} + +/* line 20, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper { + border-bottom: 2px solid #cccccc; + line-height: 1.4; + padding-bottom: 1.5em; +} +/* line 26, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper .title { + display: block; + font-size: 20px; + font-weight: bold; + margin-bottom: 0.25em; +} +/* line 33, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper .event-date, +.event-date-location__wrapper .event-location { + float: left; + min-height: 7em; + position: relative; + width: 50%; +} +@media (min-width: 50em) { + /* line 33, ../sass/components/_event-date-location.scss */ + .event-date-location__wrapper .event-date, + .event-date-location__wrapper .event-location { + padding: 1em 0 0 8.5em; + } +} +/* line 44, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper .event-date:before, +.event-date-location__wrapper .event-location:before { + background: #7bbdcb no-repeat 50% 50%; + border-radius: 50%; + content: ""; + display: block; + margin-bottom: 1em; + height: 5.125em; + width: 5.125em; +} +@media (min-width: 50em) { + /* line 44, ../sass/components/_event-date-location.scss */ + .event-date-location__wrapper .event-date:before, + .event-date-location__wrapper .event-location:before { + left: 2em; + position: absolute; + top: 0; + } +} +/* line 61, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper .event-date { + padding-right: 1.5em; +} +/* line 64, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper .event-date:before { + background-image: url("../images/icons/event-date.png"); +} +/* line 69, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper .event-location { + padding-left: 1.5em; +} +@media (min-width: 50em) { + /* line 69, ../sass/components/_event-date-location.scss */ + .event-date-location__wrapper .event-location { + padding-left: 8.5em; + } +} +/* line 76, ../sass/components/_event-date-location.scss */ +.event-date-location__wrapper .event-location:before { + background-image: url("../images/icons/event-location.png"); +} + +/* line 1, ../sass/components/_featured-article.scss */ +.featured-article { + background: #7bbdcb; +} + +/* line 5, ../sass/components/_featured-article.scss */ +.featured-article__wrapper { + margin: 0 auto; + max-width: 52em; + padding: 3em 1em; + position: relative; +} + +/* line 12, ../sass/components/_featured-article.scss */ +.featured-article__tag { + color: #0d4c5a; + display: block; + font-weight: bold; + margin-bottom: 1em; + text-transform: uppercase; +} + +/* line 20, ../sass/components/_featured-article.scss */ +.featured-article__title { + color: #fff; + font-size: 32px; + margin: 0; +} + +/* line 26, ../sass/components/_featured-article.scss */ +.featured-article__meta { + color: #fff; + font-weight: bold; + margin: 0.5em 0; +} + +/* line 32, ../sass/components/_featured-article.scss */ +.featured-article__avatar { + border: 0.25em solid #fff; + border-radius: 50%; + display: none; + left: -7.5em; + position: absolute; + top: 3em; +} +@media (min-width: 70em) { + /* line 32, ../sass/components/_featured-article.scss */ + .featured-article__avatar { + display: block; + } +} + +/* line 46, ../sass/components/_featured-article.scss */ +.featured-article__content { + color: #fff; + font-size: 20px; + line-height: 1.5; +} + +/* line 53, ../sass/components/_featured-article.scss */ +.featured-article__footer a { + background: #388695; + border-radius: 3px; + color: #fff; + display: inline-block; + font-size: 20px; + font-weight: bold; + padding: 0.6em 2em 0.5em 2em; + text-transform: uppercase; +} + +/* line 1, ../sass/components/_featured-speakers.scss */ +.featured-speakers { + background: #7bbdcb url("../images/patterns/mosaic-light.png") repeat 50% 0; + color: #fff; + margin: 3em 0; +} + +/* line 7, ../sass/components/_featured-speakers.scss */ +.featured-speakers__wrapper { + margin: 0 auto; + max-width: 52em; + padding: 3em 1em 0 1em; +} + +/* line 13, ../sass/components/_featured-speakers.scss */ +.featured-speakers__title { + font-size: 32px; + font-weight: normal; + margin: 0; + text-align: center; +} + +/* line 20, ../sass/components/_featured-speakers.scss */ +.featured-speakers__items { + margin-top: 3em; +} + +/* line 26, ../sass/components/_featured-speakers.scss */ +.featured-speakers__item { + margin-bottom: 3em; +} +@media (min-width: 30em) { + /* line 26, ../sass/components/_featured-speakers.scss */ + .featured-speakers__item { + float: left; + padding-right: 1.5em; + width: 50%; + } + /* line 35, ../sass/components/_featured-speakers.scss */ + .featured-speakers__item:nth-child(odd) { + clear: left; + } +} +/* line 40, ../sass/components/_featured-speakers.scss */ +.featured-speakers__item .avatar { + background: #fff; + border: 0.25em solid #fff; + border-radius: 50%; + display: block; + height: 6.75em; + margin-bottom: 1em; + width: 6.75em; +} +@media (min-width: 40em) { + /* line 40, ../sass/components/_featured-speakers.scss */ + .featured-speakers__item .avatar { + float: left; + } +} +/* line 53, ../sass/components/_featured-speakers.scss */ +.featured-speakers__item .avatar img { + border-radius: 50%; +} + +/* line 59, ../sass/components/_featured-speakers.scss */ +.featured-speakers__item__details { + line-height: 1.2; +} +@media (min-width: 40em) { + /* line 59, ../sass/components/_featured-speakers.scss */ + .featured-speakers__item__details { + margin-left: 7.75em; + padding-top: 1em; + } +} +/* line 67, ../sass/components/_featured-speakers.scss */ +.featured-speakers__item__details .name { + font-size: 20px; + margin: 0; +} +/* line 72, ../sass/components/_featured-speakers.scss */ +.featured-speakers__item__details .title { + margin: 0.35em 0; +} +/* line 76, ../sass/components/_featured-speakers.scss */ +.featured-speakers__item__details .company { + font-style: italic; + margin: 0; +} + +/* line 1, ../sass/components/_generic-header.scss */ +.generic-header, .image-header--no-bg { + background: #f1f1f1 url("../images/patterns/thatch.png") repeat 50% 50%; + background-size: auto; + color: #000; + padding: 0 1em; +} + +/* line 8, ../sass/components/_generic-header.scss */ +.generic-header__content { + padding: 3.125em 0; + text-align: center; +} + +/* line 13, ../sass/components/_generic-header.scss */ +.generic-header__type, .image-header__type { + display: block; + font-size: 12px; + font-weight: bold; + text-transform: uppercase; +} +@media (min-width: 42em) { + /* line 13, ../sass/components/_generic-header.scss */ + .generic-header__type, .image-header__type { + font-size: 16px; + } +} + +/* line 24, ../sass/components/_generic-header.scss */ +.generic-header__title, .image-header__title { + font-size: 32px; + font-weight: normal; + line-height: 1.1; + margin: .3em 0 .4em 0; +} +@media (min-width: 42em) { + /* line 24, ../sass/components/_generic-header.scss */ + .generic-header__title, .image-header__title { + font-size: 56px; + } +} + +/* line 35, ../sass/components/_generic-header.scss */ +.generic-header__detail { + font-size: 16px; + margin: 0; +} +@media (min-width: 42em) { + /* line 35, ../sass/components/_generic-header.scss */ + .generic-header__detail { + font-size: 20px; + } +} + +/* line 44, ../sass/components/_generic-header.scss */ +.generic-header__avatar { + border-radius: 50%; + display: inline-block; + margin: 0 8px; +} + +/* line 1, ../sass/components/_highlighted-link.scss */ +.highlighted-link { + background: #e6e6e6; + border: 2px solid #bfbfbf; + border-radius: 0.25em; + display: block; + font-size: 20px; + font-weight: bold; + line-height: 1; + margin: 2.4em 0; + padding: 1.5em; + text-align: center; +} + +/* line 1, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid { + margin: 3em auto; + max-width: 65em; + padding: 0 1em; +} + +/* line 12, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item { + border-top: 2px solid #cccccc; +} +/* line 15, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item:first-child { + border-top: 0; +} +@media (min-width: 38em) { + /* line 12, ../sass/components/_icon-link-grid.scss */ + .icon-link-grid__item { + border-left: 2px solid #cccccc; + float: left; + width: 50%; + } + /* line 24, ../sass/components/_icon-link-grid.scss */ + .icon-link-grid__item:nth-child(odd) { + border-left-color: transparent; + clear: left; + } + /* line 29, ../sass/components/_icon-link-grid.scss */ + .icon-link-grid__item:nth-child(2) { + border-top: 0; + } +} +@media (min-width: 57em) { + /* line 12, ../sass/components/_icon-link-grid.scss */ + .icon-link-grid__item { + width: 33.33333%; + } + /* line 37, ../sass/components/_icon-link-grid.scss */ + .icon-link-grid__item:nth-child(odd) { + border-left-color: #cccccc; + clear: none; + } + /* line 42, ../sass/components/_icon-link-grid.scss */ + .icon-link-grid__item:nth-child(3n+1) { + border-left-color: transparent; + clear: left; + } + /* line 47, ../sass/components/_icon-link-grid.scss */ + .icon-link-grid__item:nth-child(3) { + border-top: 0; + } +} +/* line 52, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item a { + display: block; + font-weight: bold; + padding: 3em; + text-align: center; + text-transform: uppercase; +} +/* line 59, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item a:before { + background: #7bbdcb no-repeat 50% 50%; + border-radius: 50%; + content: ""; + display: block; + margin: 0 auto 2em auto; + height: 7.5em; + width: 7.5em; +} +/* line 69, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item a span { + font-size: 20px; +} +/* line 75, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item .webinars:before { + background-image: url("../images/icons/learn-webinars.png"); +} +/* line 75, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item .whitepapers:before { + background-image: url("../images/icons/learn-whitepapers.png"); +} +/* line 75, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item .blog:before { + background-image: url("../images/icons/learn-blog.png"); +} +/* line 75, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item .training:before { + background-image: url("../images/icons/learn-training.png"); +} +/* line 75, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item .events:before { + background-image: url("../images/icons/learn-events.png"); +} +/* line 75, ../sass/components/_icon-link-grid.scss */ +.icon-link-grid__item .presentations:before { + background-image: url("../images/icons/learn-presentations.png"); +} + +/* line 1, ../sass/components/_image-header.scss */ +.image-header { + background: no-repeat 50% 50%; + background-size: cover; + color: #fff; + padding: 0 1em; +} + +/* line 12, ../sass/components/_image-header.scss */ +.image-header__content { + max-width: 26em; + padding: 6em 0 3em 0; +} +@media (min-width: 42em) { + /* line 12, ../sass/components/_image-header.scss */ + .image-header__content { + height: 32.5em; + padding: 9em 0 0 0; + } +} + +/* line 26, ../sass/components/_image-header.scss */ +.image-header__title { + margin-bottom: 0; +} + +/* line 1, ../sass/components/_introblock.scss */ +.introblock { + background: #f9f9f9; + border-bottom: 1px solid #e6e6e6; + padding: 0 1em; +} + +/* line 7, ../sass/components/_introblock.scss */ +.introblock__content { + color: #757575; + font-size: 20px; + line-height: 1.6; + padding: 2em 0 0 0; +} +/* line 13, ../sass/components/_introblock.scss */ +.introblock__content p { + margin: 0; +} + +/* line 18, ../sass/components/_introblock.scss */ +.introblock__sidebar { + padding: 2em 0; +} +/* line 21, ../sass/components/_introblock.scss */ +.introblock__sidebar p { + color: #6da6b3; + line-height: 1.4; + margin: 0.5em 0 0 0; +} +/* line 27, ../sass/components/_introblock.scss */ +.introblock__sidebar a { + color: #6da6b3; + font-weight: bold; +} + +/* line 33, ../sass/components/_introblock.scss */ +.introblock__sidebar__title { + margin: 0; + font-size: 20px; + text-transform: uppercase; +} +/* line 38, ../sass/components/_introblock.scss */ +* + .introblock__sidebar__title { + margin-top: 1.5em; +} + +@media (min-width: 56em) { + /* line 44, ../sass/components/_introblock.scss */ + .introblock .layout-wrapper { + display: table; + width: 100%; + } + + /* line 49, ../sass/components/_introblock.scss */ + .introblock__content { + display: table-cell; + padding: 2em 2em 2em 0; + vertical-align: top; + } + + /* line 55, ../sass/components/_introblock.scss */ + .introblock__sidebar { + border-left: 1px solid #e6e6e6; + display: table-cell; + padding: 2em 0 2em 2em; + vertical-align: top; + width: 22em; + } +} +/* line 1, ../sass/components/_layout-wrapper.scss */ +.layout-wrapper { + margin: 0 auto; + max-width: 68em; +} + +/* line 1, ../sass/components/_link-block.scss */ +.link-block { + border: 3px solid #e6e6e6; + list-style: none; + margin: 2em 0; + padding: .75em; + width: 100%; +} +@media (min-width: 40em) { + /* line 1, ../sass/components/_link-block.scss */ + .link-block { + margin: 3em 0; + } +} + +/* line 15, ../sass/components/_link-block.scss */ +.link-block__item a { + display: block; + line-height: 1.2; + padding: .3em; + position: relative; + text-align: center; +} +@media (min-width: 40em) { + /* line 15, ../sass/components/_link-block.scss */ + .link-block__item a { + padding: 1.125em 0; + } +} +@media (min-width: 40em) { + /* line 14, ../sass/components/_link-block.scss */ + .link-block__item { + display: inline-block; + margin-right: -4px; + vertical-align: middle; + width: 50%; + } + /* line 34, ../sass/components/_link-block.scss */ + .link-block__item:nth-child(odd) a { + padding-left: 2em; + padding-right: 3.125em; + text-align: right; + } + /* line 43, ../sass/components/_link-block.scss */ + .link-block__item:nth-child(even) a { + padding-left: 3.125em; + padding-right: 2em; + text-align: left; + } + /* line 48, ../sass/components/_link-block.scss */ + .link-block__item:nth-child(even) a:before { + background-color: #e6e6e6; + content: ''; + display: block; + height: 1.2em; + left: -1px; + margin-top: -0.6em; + position: absolute; + top: 50%; + width: 2px; + } +} + +/* line 1, ../sass/components/_logo-grid.scss */ +.logo-grid { + background: #f1f1f1; + margin: 3em 0; + padding: 3em 0; +} +/* line 6, ../sass/components/_logo-grid.scss */ +.logo-grid .layout-wrapper { + padding: 0 1em; +} + +/* line 11, ../sass/components/_logo-grid.scss */ +.logo-grid__title { + font-size: 20px; + margin: 0; + text-align: center; + text-transform: uppercase; +} + +/* line 18, ../sass/components/_logo-grid.scss */ +.logo-grid__items { + padding: 1em 0; +} + +/* line 24, ../sass/components/_logo-grid.scss */ +.logo-grid__item { + float: left; + margin-top: 0.5em; + width: 50%; +} +@media (min-width: 30em) { + /* line 24, ../sass/components/_logo-grid.scss */ + .logo-grid__item { + width: 33.33333%; + } +} +@media (min-width: 40em) { + /* line 24, ../sass/components/_logo-grid.scss */ + .logo-grid__item { + width: 25%; + } +} +@media (min-width: 50em) { + /* line 24, ../sass/components/_logo-grid.scss */ + .logo-grid__item { + width: 20%; + } +} + +/* line 42, ../sass/components/_logo-grid.scss */ +.logo-grid__item__wrapper { + display: table; + width: 100%; +} + +/* line 47, ../sass/components/_logo-grid.scss */ +.logo-grid__item__logo { + display: table-cell; + margin: 0; + padding: 1em; + text-align: center; + vertical-align: middle; +} +/* line 54, ../sass/components/_logo-grid.scss */ +.logo-grid__item__logo img { + max-width: 170px; + width: 100%; +} + +/* line 1, ../sass/components/_mediablock.scss */ +.mediablock { + margin: 3em 0; +} +/* line 4, ../sass/components/_mediablock.scss */ +.mediablock .layout-wrapper { + max-width: 42em; + padding: 0 1em; +} + +/* line 10, ../sass/components/_mediablock.scss */ +.mediablock__content { + height: 0; + margin: 0 auto; + padding-bottom: 56.25%; + position: relative; + width: 100%; +} +/* line 17, ../sass/components/_mediablock.scss */ +.mediablock__content iframe { + border: 0.25em solid #e6e6e6; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +/* line 1, ../sass/components/_page-intro.scss */ +.page-intro { + line-height: 1.6; + margin: 4em auto; + max-width: 52em; + padding: 0 1em; + text-align: center; +} + +/* line 9, ../sass/components/_page-intro.scss */ +.page-intro__headline { + color: #757575; + font-size: 20px; + font-weight: bold; +} + +/* line 1, ../sass/components/_pagination.scss */ +.pagination { + overflow: hidden; + margin: 3em auto; +} + +/* line 6, ../sass/components/_pagination.scss */ +.pagination__items { + float: left; + left: 50%; + position: relative; +} + +/* line 14, ../sass/components/_pagination.scss */ +.pagination__item { + border: solid #1b1a19; + border-width: 2px 2px 2px 0; + float: left; + font-weight: bold; + position: relative; + right: 50%; +} +/* line 22, ../sass/components/_pagination.scss */ +.pagination__item a, +.pagination__item span { + display: block; + line-height: 3em; + padding: 0 1em; + min-width: 3em; + text-align: center; +} +/* line 31, ../sass/components/_pagination.scss */ +.pagination__item span { + background: #e6e6e6; +} + +/* line 36, ../sass/components/_pagination.scss */ +.pagination__item--next, +.pagination__item--previous { + background: no-repeat 50% 50%; + width: 4em; +} +/* line 41, ../sass/components/_pagination.scss */ +.pagination__item--next b, +.pagination__item--previous b { + display: block; +} + +/* line 47, ../sass/components/_pagination.scss */ +.pagination__item--next { + background-image: url("../images/icons/pagination-next.png"); + border-radius: 0 3px 3px 0; +} + +/* line 52, ../sass/components/_pagination.scss */ +.pagination__item--previous { + background-image: url("../images/icons/pagination-previous.png"); + border-radius: 3px 0 0 3px; + border-width: 2px; +} + +/* line 1, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list { + margin: 3em auto; + max-width: 52em; + padding: 0 1em; +} + +/* line 11, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item { + margin-bottom: 3em; + min-height: 5.125em; + position: relative; +} +@media (min-width: 40em) { + /* line 11, ../sass/components/_pricing-icon-list.scss */ + .pricing-icon-list__item { + padding-left: 6.625em; + } +} +@media (min-width: 68em) { + /* line 11, ../sass/components/_pricing-icon-list.scss */ + .pricing-icon-list__item { + padding-left: 0; + } +} +/* line 24, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item:before { + background: #7bbdcb no-repeat 50% 50%; + border-radius: 50%; + content: ""; + display: block; + margin-bottom: 1em; + height: 5.125em; + width: 5.125em; +} +@media (min-width: 40em) { + /* line 24, ../sass/components/_pricing-icon-list.scss */ + .pricing-icon-list__item:before { + left: 0; + margin: 0; + position: absolute; + top: 0; + } +} +@media (min-width: 68em) { + /* line 24, ../sass/components/_pricing-icon-list.scss */ + .pricing-icon-list__item:before { + left: -6.625em; + } +} +/* line 46, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item--success:before { + background-image: url("../images/icons/pricing-success.png"); +} +/* line 46, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item--expertise:before { + background-image: url("../images/icons/pricing-expertise.png"); +} +/* line 46, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item--support:before { + background-image: url("../images/icons/pricing-support.png"); +} +/* line 46, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item--updates:before { + background-image: url("../images/icons/pricing-updates.png"); +} +/* line 46, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item--options:before { + background-image: url("../images/icons/pricing-options.png"); +} +/* line 51, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item h1 { + font-size: 24px; + margin: 0; +} +/* line 56, ../sass/components/_pricing-icon-list.scss */ +.pricing-icon-list__item p { + line-height: 1.6; + margin: 0.5em 0 0 0; +} + +/* line 1, ../sass/components/_quoteblock.scss */ +.quoteblock { + background: #1b1a19 no-repeat 50% 50%; + background-size: cover; + color: #fff; + font-family: Georgia, serif; + margin: 6em 0 3em 0; + position: relative; + text-align: center; +} +/* line 10, ../sass/components/_quoteblock.scss */ +.quoteblock:before { + background: #455154; + bottom: 0; + content: ""; + display: block; + left: 0; + opacity: 0.5; + position: absolute; + right: 0; + top: 0; +} +/* line 22, ../sass/components/_quoteblock.scss */ +.quoteblock blockquote { + margin: 0 auto; + max-width: 52em; + padding: 3em 1em 2em 1em; + position: relative; +} +@media (min-width: 40em) { + /* line 22, ../sass/components/_quoteblock.scss */ + .quoteblock blockquote { + padding: 4.5em 1em 3em 1em; + } +} +@media (min-width: 48em) { + /* line 22, ../sass/components/_quoteblock.scss */ + .quoteblock blockquote { + padding-top: 6em; + } +} +/* line 37, ../sass/components/_quoteblock.scss */ +.quoteblock p { + font-style: italic; + line-height: 1.4; + margin: 0; +} +@media (min-width: 40em) { + /* line 37, ../sass/components/_quoteblock.scss */ + .quoteblock p { + font-size: 20px; + } +} +@media (min-width: 48em) { + /* line 37, ../sass/components/_quoteblock.scss */ + .quoteblock p { + font-size: 28px; + } +} +/* line 51, ../sass/components/_quoteblock.scss */ +.quoteblock cite { + display: block; + font-size: 14px; + font-style: normal; + margin-top: 1em; +} +@media (min-width: 48em) { + /* line 51, ../sass/components/_quoteblock.scss */ + .quoteblock cite { + font-size: 20px; + } +} +/* line 61, ../sass/components/_quoteblock.scss */ +.quoteblock cite:before { + border-top: 1px solid #fff; + content: ""; + display: block; + height: 0; + margin: 0 auto 1em auto; + width: 2em; +} + +/* line 72, ../sass/components/_quoteblock.scss */ +.quoteblock__avatar { + background: #7bbdcb url("../images/icons/quote.png") no-repeat 50% 50%; + border: 0.25em solid #fff; + border-radius: 50%; + display: block; + margin-left: -2.75em; + left: 50%; + position: absolute; + top: -2.75em; + width: 5em; +} +@media (min-width: 40em) { + /* line 72, ../sass/components/_quoteblock.scss */ + .quoteblock__avatar { + margin-left: -3.25em; + top: -3.25em; + width: 6em; + } +} +/* line 89, ../sass/components/_quoteblock.scss */ +.quoteblock__avatar img { + border-radius: 50%; + display: block; + width: 100%; +} + +/* line 1, ../sass/components/_related-content.scss */ +.related-content { + margin: 3em auto; + max-width: 65em; + padding: 0 1em; +} + +/* line 7, ../sass/components/_related-content.scss */ +.related-content__toggler { + background: none; + border: 2px solid #1b1a19; + border-radius: 5px; + color: #1b1a19; + display: block; + font-weight: bold; + line-height: 1.1; + margin: 0 auto; + max-width: 26em; + padding: 1.1em 1em 1em 1em; + text-transform: uppercase; + width: 100%; +} +/* line 21, ../sass/components/_related-content.scss */ +.related-content__toggler:before { + background: url("../images/icons/related-content--grid.png") no-repeat 0 0; + content: ""; + display: inline-block; + height: 19px; + margin-right: 1em; + position: relative; + top: -2px; + vertical-align: middle; + width: 19px; +} +/* line 33, ../sass/components/_related-content.scss */ +.related-content__toggler[aria-pressed="true"]:before { + background-image: url("../images/icons/related-content--close.png"); +} + +/* line 38, ../sass/components/_related-content.scss */ +.related-content__items { + padding-bottom: 1.5em; +} +/* line 43, ../sass/components/_related-content.scss */ +.related-content__items[aria-expanded="false"] { + display: none; +} + +/* line 48, ../sass/components/_related-content.scss */ +.related-content__item { + margin-top: 1.5em; +} +@media (min-width: 35em) { + /* line 48, ../sass/components/_related-content.scss */ + .related-content__item { + float: left; + padding: 0 0.75em; + width: 50%; + } + /* line 56, ../sass/components/_related-content.scss */ + .related-content__item:nth-child(odd) { + padding-left: 0; + } + /* line 60, ../sass/components/_related-content.scss */ + .related-content__item:nth-child(even) { + padding-right: 0; + } +} +@media (min-width: 60em) { + /* line 48, ../sass/components/_related-content.scss */ + .related-content__item { + width: 33.33333%; + } + /* line 68, ../sass/components/_related-content.scss */ + .related-content__item:nth-child(odd) { + padding-left: 0.75em; + } + /* line 72, ../sass/components/_related-content.scss */ + .related-content__item:nth-child(even) { + padding-right: 0.75em; + } +} +/* line 77, ../sass/components/_related-content.scss */ +.related-content__item a { + background: rgba(0, 0, 0, 0.6); + display: table; + height: 13.5em; + transition: background 100ms linear; + width: 100%; +} +/* line 84, ../sass/components/_related-content.scss */ +.related-content__item a:focus, .related-content__item a:hover { + background: rgba(0, 0, 0, 0.5); +} + +/* line 91, ../sass/components/_related-content.scss */ +.related-content__item__wrapper { + background: no-repeat 50% 50%; + background-size: cover; +} + +/* line 96, ../sass/components/_related-content.scss */ +.related-content__item__title { + color: #fff; + display: table-cell; + font-size: 20px; + font-weight: bold; + padding: 1em; + text-align: center; + vertical-align: middle; +} + +/* line 1, ../sass/components/_sales-offices.scss */ +.sales-offices .sales-offices__items { + margin-left: 2em; +} +@media (min-width: 56em) { + /* line 1, ../sass/components/_sales-offices.scss */ + .sales-offices .sales-offices__items { + margin-left: 0; + } +} + +/* line 12, ../sass/components/_sales-offices.scss */ +.sales-offices__item, .sales-offices__item + .sales-offices__item { + margin-top: 3em; +} +@media (min-width: 40em) { + /* line 11, ../sass/components/_sales-offices.scss */ + .sales-offices__item { + float: left; + padding-right: 2.5em; + width: 50%; + } + /* line 22, ../sass/components/_sales-offices.scss */ + .sales-offices__item:nth-child(odd) { + clear: left; + } +} +@media (min-width: 50em) { + /* line 11, ../sass/components/_sales-offices.scss */ + .sales-offices__item { + width: 33.33333%; + } + /* line 30, ../sass/components/_sales-offices.scss */ + .sales-offices__item:nth-child(odd) { + clear: none; + } + /* line 34, ../sass/components/_sales-offices.scss */ + .sales-offices__item:nth-child(3n+1) { + clear: left; + } +} +/* line 39, ../sass/components/_sales-offices.scss */ +.sales-offices__item:last-child { + margin-bottom: 0; +} +/* line 43, ../sass/components/_sales-offices.scss */ +.sales-offices__item .title { + color: #000; + font-size: 16px; + margin: 0; +} +/* line 49, ../sass/components/_sales-offices.scss */ +.sales-offices__item p { + margin: 0; +} + +/* line 54, ../sass/components/_sales-offices.scss */ +.sales-offices__item--has-address { + position: relative; +} +/* line 57, ../sass/components/_sales-offices.scss */ +.sales-offices__item--has-address:before { + background: url("../images/icons/sales-office-marker.png") no-repeat 0 0; + content: ""; + display: block; + height: 30px; + left: -2em; + position: absolute; + top: 0; + width: 20px; +} + +/* line 1, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid { + margin: 3em 0; +} +/* line 4, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid .layout-wrapper { + padding: 0 1em; +} + +/* line 9, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid__title { + font-size: 32px; + font-weight: normal; + margin: 0; + text-align: center; +} + +/* line 16, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid__items { + padding: 1em 0; + text-align: center; +} + +/* line 22, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid__item { + display: inline-block; + margin-top: 0.5em; + width: 50%; +} +@media (min-width: 30em) { + /* line 22, ../sass/components/_sponsor-grid.scss */ + .sponsor-grid__item { + width: 33.33333%; + } +} +@media (min-width: 40em) { + /* line 22, ../sass/components/_sponsor-grid.scss */ + .sponsor-grid__item { + width: 25%; + } +} +@media (min-width: 50em) { + /* line 22, ../sass/components/_sponsor-grid.scss */ + .sponsor-grid__item { + width: 20%; + } +} + +/* line 40, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid__item__wrapper { + display: table; + width: 100%; +} + +/* line 45, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid__item__logo { + display: table-cell; + margin: 0; + padding: 1em; + text-align: center; + vertical-align: middle; +} +/* line 52, ../sass/components/_sponsor-grid.scss */ +.sponsor-grid__item__logo img { + max-width: 170px; + width: 100%; +} + +/* line 1, ../sass/components/_stats--contained.scss */ +.stats--contained { + background: #7bbdcb url("../images/patterns/mosaic-light.png") repeat 50% 50%; + color: #fff; + margin: 3em 0; + padding: 3em 0; +} + +/* line 8, ../sass/components/_stats--contained.scss */ +.stats--contained__header, +.stats--contained__content { + margin: 0 auto; + max-width: 65em; + padding: 0 1em; +} + +/* line 15, ../sass/components/_stats--contained.scss */ +.stats--contained__title { + font-size: 28px; + margin: 0; + text-align: center; +} + +/* line 27, ../sass/components/_stats--contained.scss */ +.stats--contained__content li { + font-size: 20px; + font-weight: bold; + line-height: 1.4; + margin-top: 1.5em; + padding: 0 0.5em; + text-align: center; +} +@media (min-width: 50em) { + /* line 27, ../sass/components/_stats--contained.scss */ + .stats--contained__content li { + float: left; + width: 33.33333%; + } +} +/* line 40, ../sass/components/_stats--contained.scss */ +.stats--contained__content li b { + display: block; + font-size: 56px; +} + +/* line 1, ../sass/components/_stats.scss */ +.stats { + margin: 1.5em auto 3em auto; +} +/* line 7, ../sass/components/_stats.scss */ +.stats .stats__content ul li + li { + margin-top: 1.5em; +} + +/* line 18, ../sass/components/_stats.scss */ +.stats__content li { + color: #000; + font-size: 20px; + font-weight: bold; + line-height: 1.4; + margin-top: 1.5em; + padding: 0 0.5em; + text-align: center; +} +@media (min-width: 50em) { + /* line 18, ../sass/components/_stats.scss */ + .stats__content li { + float: left; + width: 33.33333%; + } +} +/* line 32, ../sass/components/_stats.scss */ +.stats__content li span { + background: #ec1e2c no-repeat 50% 50%; + border-radius: 50%; + content: ""; + display: block; + height: 104px; + margin: 0 auto; + width: 104px; +} +/* line 42, ../sass/components/_stats.scss */ +.stats__content li b { + display: block; + font-size: 72px; +} + +/* line 1, ../sass/components/_textblock--centered.scss */ +.textblock--centered { + margin: 4em auto; + max-width: 52em; + padding: 0 1em; +} + +/* line 7, ../sass/components/_textblock--centered.scss */ +.textblock--centered__header { + text-align: center; +} + +/* line 11, ../sass/components/_textblock--centered.scss */ +.textblock--centered__header__title { + font-size: 32px; + font-weight: normal; +} + +/* line 16, ../sass/components/_textblock--centered.scss */ +.textblock--centered__content { + color: #757575; + font-size: 20px; + line-height: 1.6; + text-align: center; +} + +/* line 1, ../sass/components/_textblock--contained.scss */ +.textblock--contained { + background: #f2f2f2; + border: solid #e6e6e6; + border-width: 1px 0; + padding: 3em 1em; +} + +/* line 8, ../sass/components/_textblock--contained.scss */ +.textblock--contained__header, +.textblock--contained__content { + margin: 0 auto; + max-width: 50em; +} + +/* line 14, ../sass/components/_textblock--contained.scss */ +.textblock--contained__header { + margin-bottom: 3em; + text-align: center; +} + +/* line 19, ../sass/components/_textblock--contained.scss */ +.textblock--contained__header__title { + color: #757575; + font-size: 20px; + font-weight: bold; +} + +/* line 25, ../sass/components/_textblock--contained.scss */ +.textblock--contained__content { + color: #4a4947; + line-height: 1.6; +} +/* line 29, ../sass/components/_textblock--contained.scss */ +.textblock--contained__content ul { + padding-left: 1em; +} +/* line 33, ../sass/components/_textblock--contained.scss */ +.textblock--contained__content li + li { + margin-top: 0.5em; +} + +/* line 1, ../sass/components/_textblock.scss */ +.textblock { + margin: 4em auto; + max-width: 52em; + padding: 0 1em; +} + +/* line 7, ../sass/components/_textblock.scss */ +.textblock__header { + text-align: center; +} + +/* line 11, ../sass/components/_textblock.scss */ +.textblock__header__title { + font-size: 32px; + font-weight: normal; + line-height: 1.2; +} + +/* line 17, ../sass/components/_textblock.scss */ +.textblock__content { + color: #4a4947; + line-height: 1.6; +} +/* line 21, ../sass/components/_textblock.scss */ +.textblock__content .centered-title { + text-align: center; +} +/* line 25, ../sass/components/_textblock.scss */ +.textblock__content ul { + padding-left: 1em; +} +/* line 29, ../sass/components/_textblock.scss */ +.textblock__content li + li { + margin-top: 0.5em; +} +/* line 33, ../sass/components/_textblock.scss */ +.textblock__content figure { + margin: 1.5em 0; +} +/* line 36, ../sass/components/_textblock.scss */ +.textblock__content figure img { + display: block; + margin: 0 auto 1.5em auto; + max-width: 100%; +} +/* line 43, ../sass/components/_textblock.scss */ +.textblock__content figcaption { + color: #999; +} + +/* line 6, ../sass/components/_toggle-group.scss */ +.toggle-group__item { + float: left; +} +/* line 9, ../sass/components/_toggle-group.scss */ +.toggle-group__item a { + background: #f2f2f2; + border: 1px solid #e6e6e6; + border-radius: 0 0.25em 0.25em 0; + color: #bfbfbf; + display: block; + font-weight: bold; + padding: 1em 1.5em; +} +/* line 18, ../sass/components/_toggle-group.scss */ +.toggle-group__item a:focus, .toggle-group__item a:hover { + color: #9a9a9a; +} +/* line 24, ../sass/components/_toggle-group.scss */ +.toggle-group__item:first-child a { + border-radius: 0.25em 0 0 0.25em; +} + +/* line 29, ../sass/components/_toggle-group.scss */ +.toggle-group__item--current a { + background: #ec1e2c; + border-color: #ec1e2c; + color: #fff; +} +/* line 34, ../sass/components/_toggle-group.scss */ +.toggle-group__item--current a:focus, .toggle-group__item--current a:hover { + color: #fff; +} + +/* line 1, ../sass/components/_videoblock.scss */ +.videoblock { + margin: 3em 0; +} +/* line 4, ../sass/components/_videoblock.scss */ +.videoblock .layout-wrapper { + max-width: 52em; + padding: 0 1em; +} + +/* line 10, ../sass/components/_videoblock.scss */ +.videoblock__header { + margin-bottom: 3em; +} +/* line 13, ../sass/components/_videoblock.scss */ +.videoblock__header h1 { + font-size: 32px; + font-weight: normal; + margin: 0; + text-align: center; +} + +/* line 21, ../sass/components/_videoblock.scss */ +.videoblock__content { + height: 0; + margin: 0 auto; + padding-bottom: 56.25%; + position: relative; + width: 100%; +} +/* line 28, ../sass/components/_videoblock.scss */ +.videoblock__content iframe { + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +/* line 37, ../sass/components/_videoblock.scss */ +.videoblock__cover { + background: rgba(0, 0, 0, 0.75); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +/* line 46, ../sass/components/_videoblock.scss */ +.videoblock__button { + background: #ec1e2c; + border: 0; + border-radius: 3px; + color: #fff; + font-weight: bold; + left: 50%; + margin: -1.75em 0 0 -1.75em; + padding: 0; + position: absolute; + text-transform: uppercase; + top: 50%; +} +/* line 59, ../sass/components/_videoblock.scss */ +.videoblock__button:focus, .videoblock__button:hover { + background: #d7181b; +} +/* line 64, ../sass/components/_videoblock.scss */ +.videoblock__button span { + background: url("../images/icons/play.png") no-repeat 50% 50%; + display: block; + height: 3.5em; + width: 3.5em; +} + +@media (min-width: 58em) { + /* line 1, ../sass/components/developer-portal/_base.scss */ + .developer-portal { + height: 100%; + } + /* line 5, ../sass/components/developer-portal/_base.scss */ + .developer-portal body { + height: 100%; + overflow-x: auto; + overflow-y: hidden; + padding: 122px 0 0; + } +} + +/* line 1, ../sass/components/developer-portal/_content.scss */ +.developer-portal-global-content { + margin: 0 auto; + max-width: 68em; +} +@media (min-width: 58em) { + /* line 1, ../sass/components/developer-portal/_content.scss */ + .developer-portal-global-content { + height: 100%; + } +} + +@media (min-width: 58em) { + /* line 12, ../sass/components/developer-portal/_content.scss */ + .developer-portal-sidebar { + background: #f1f1f1 url("../images/patterns/thatch.png") repeat 50% 50%; + float: left; + height: 100%; + overflow-x: hidden; + overflow-y: scroll; + width: 25%; + } + + /* line 21, ../sass/components/developer-portal/_content.scss */ + .developer-portal-content { + border-left: 2px solid #e6e6e6; + float: left; + height: 100%; + overflow-x: hidden; + overflow-y: scroll; + width: 75%; + } +} +/* line 31, ../sass/components/developer-portal/_content.scss */ +.developer-portal-content__wrapper { + padding: 1em; +} +@media (min-width: 58em) { + /* line 31, ../sass/components/developer-portal/_content.scss */ + .developer-portal-content__wrapper { + padding: 3em; + } +} + +/* line 1, ../sass/components/developer-portal/_footer.scss */ +.developer-portal-footer { + background: #1b1a19; + padding: 1em; +} +@media (min-width: 42em) { + /* line 1, ../sass/components/developer-portal/_footer.scss */ + .developer-portal-footer { + padding-right: 3em; + } +} +/* line 9, ../sass/components/developer-portal/_footer.scss */ +.developer-portal-footer p { + color: #4a4947; + font-size: 12px; + line-height: 1.6; + margin: 0 -1em 0 0; + text-align: right; +} +/* line 17, ../sass/components/developer-portal/_footer.scss */ +.developer-portal-footer a { + color: #4a4947; + display: inline-block; + margin-right: 1em; +} +/* line 22, ../sass/components/developer-portal/_footer.scss */ +.developer-portal-footer a:focus, .developer-portal-footer a:hover { + text-decoration: underline; +} +/* line 28, ../sass/components/developer-portal/_footer.scss */ +.developer-portal-footer .license { + display: block; + margin: 0 1em 0.5em 0; +} +@media (min-width: 42em) { + /* line 28, ../sass/components/developer-portal/_footer.scss */ + .developer-portal-footer .license { + display: inline-block; + margin-bottom: 0; + } +} +/* line 38, ../sass/components/developer-portal/_footer.scss */ +.developer-portal-footer .company-name { + font-weight: normal; + text-transform: uppercase; +} + +/* line 1, ../sass/components/developer-portal/_header.scss */ +.developer-portal-header { + background: #fff; + border-bottom: 2px solid #e6e6e6; + padding: 1em; + width: 100%; +} +@media (min-width: 58em) { + /* line 1, ../sass/components/developer-portal/_header.scss */ + .developer-portal-header { + border-top: 3em solid #e6e6e6; + position: absolute; + top: 0; + width: 100%; + } +} +/* line 14, ../sass/components/developer-portal/_header.scss */ +.developer-portal-header > .layout-wrapper { + position: relative; +} + +/* line 1, ../sass/components/developer-portal/_header__logo.scss */ +.developer-portal-header__logo { + font-size: 16px; + margin: 0; +} +@media (min-width: 44em) { + /* line 1, ../sass/components/developer-portal/_header__logo.scss */ + .developer-portal-header__logo { + float: left; + } +} +/* line 9, ../sass/components/developer-portal/_header__logo.scss */ +.developer-portal-header__logo a { + background: url("../images/logo.svg") no-repeat 0 0; + background-size: contain; + display: block; + height: 26px; + width: 114px; +} +@media (min-width: 44em) { + /* line 9, ../sass/components/developer-portal/_header__logo.scss */ + .developer-portal-header__logo a { + height: 40px; + width: 175px; + } +} + +@media (min-width: 44em) { + /* line 1, ../sass/components/developer-portal/_header__navigation.scss */ + .developer-portal-header__navigation .primary-navigation__toggler { + display: block; + top: 1em; + } +} +@media (min-width: 58em) { + /* line 1, ../sass/components/developer-portal/_header__navigation.scss */ + .developer-portal-header__navigation .primary-navigation__toggler { + display: none; + } +} + +/* line 12, ../sass/components/developer-portal/_header__navigation.scss */ +.developer-portal-header__navigation__wrapper { + border-top: 2px solid #e6e6e6; + margin: 1em -1em 0 -1em; +} +@media (min-width: 58em) { + /* line 12, ../sass/components/developer-portal/_header__navigation.scss */ + .developer-portal-header__navigation__wrapper { + border: 0; + margin: 0; + } +} +/* line 21, ../sass/components/developer-portal/_header__navigation.scss */ +.primary-navigation__toggler + .developer-portal-header__navigation__wrapper { + clip: rect(0 0 0 0); + height: 0; + overflow: hidden; + position: absolute; + width: 0; +} +/* line 25, ../sass/components/developer-portal/_header__navigation.scss */ +.developer-portal-header__navigation__wrapper[aria-expanded="true"] { + clip: auto; + height: auto; + overflow: visible; + position: static; + width: auto; +} +@media (min-width: 58em) { + /* line 30, ../sass/components/developer-portal/_header__navigation.scss */ + .primary-navigation__toggler + .developer-portal-header__navigation__wrapper { + clip: auto; + height: auto; + overflow: visible; + position: static; + width: auto; + } +} + +/* line 36, ../sass/components/developer-portal/_header__navigation.scss */ +.developer-porta-header__navigation__back { + background: url("../images/icons/header-backlink.png") no-repeat 0 40%; + display: none; + font-weight: bold; + left: 0; + padding-left: 1em; + position: absolute; + text-transform: uppercase; + top: -3em; +} +@media (min-width: 68em) { + /* line 36, ../sass/components/developer-portal/_header__navigation.scss */ + .developer-porta-header__navigation__back { + display: inline-block; + } +} + +/* line 51, ../sass/components/developer-portal/_header__navigation.scss */ +.developer-portal-header__navigation__items { + padding: 0.5em 0; +} +@media (min-width: 58em) { + /* line 51, ../sass/components/developer-portal/_header__navigation.scss */ + .developer-portal-header__navigation__items { + margin: -4em -0.75em 0 0; + position: absolute; + right: 0; + top: 0; + } +} + +@media (min-width: 58em) { + /* line 64, ../sass/components/developer-portal/_header__navigation.scss */ + .developer-portal-header__navigation__item { + float: left; + } +} +/* line 69, ../sass/components/developer-portal/_header__navigation.scss */ +.developer-portal-header__navigation__item a { + color: #000; + display: block; + font-size: 20px; + padding: 0.4em 0.8em; +} +@media (min-width: 58em) { + /* line 69, ../sass/components/developer-portal/_header__navigation.scss */ + .developer-portal-header__navigation__item a { + font-size: 16px; + font-weight: bold; + padding: 0.5em 0.75em; + } +} +/* line 81, ../sass/components/developer-portal/_header__navigation.scss */ +.developer-portal-header__navigation__item a:focus, .developer-portal-header__navigation__item a:hover { + color: #ec1e2c; +} + +/* line 1, ../sass/components/developer-portal/_header__page-title.scss */ +.developer-portal-header__page-title { + display: none; + float: left; + font-size: 24px; + font-weight: normal; + margin: 0 0 0 1em; + padding-top: 0.4em; +} +@media (min-width: 44em) { + /* line 1, ../sass/components/developer-portal/_header__page-title.scss */ + .developer-portal-header__page-title { + display: block; + } +} + +/* line 1, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search { + background: #f2f2f2; + margin-bottom: -1em; + clear: both; +} +@media (min-width: 58em) { + /* line 1, ../sass/components/developer-portal/_header__search.scss */ + .developer-portal-header__search { + background: none; + border: solid #e6e6e6; + border-width: 0 2px; + bottom: -1em; + margin: 0; + padding: 0.8em 1em 0.8em 2em; + position: absolute; + top: -1em; + right: 0; + width: 22em; + } +} +/* line 19, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search ul { + display: table; + width: 100%; +} +/* line 25, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search li { + display: table-cell; + vertical-align: top; +} +/* line 29, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search li + li { + width: 3em; +} +/* line 34, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search label { + clip: rect(0 0 0 0); + height: 0; + overflow: hidden; + position: absolute; + width: 0; +} +/* line 38, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search input[type="search"] { + background: none; + border: 0; + padding: 0 1em; + height: 3em; + width: 100%; +} +@media (min-width: 58em) { + /* line 38, ../sass/components/developer-portal/_header__search.scss */ + .developer-portal-header__search input[type="search"] { + padding-left: 0; + } +} +/* line 50, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search button { + background: #e6e6e6 url("../images/icons/search.png") no-repeat 50% 50%; + background-size: contain; + border: 0; + height: 3em; + width: 3em; +} +@media (min-width: 58em) { + /* line 50, ../sass/components/developer-portal/_header__search.scss */ + .developer-portal-header__search button { + border-radius: 0.25em; + } +} +/* line 61, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search button:focus, .developer-portal-header__search button:hover { + background-color: #d9d9d9; +} +/* line 66, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search button span { + display: block; +} +/* line 72, ../sass/components/developer-portal/_header__search.scss */ +.developer-portal-header__search li button { + display: block; +} + +/* line 1, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__toggler { + background: none; + border: 0; + padding: 0; + text-align: left; + width: 100%; +} +@media (min-width: 58em) { + /* line 1, ../sass/components/developer-portal/_sidebar__navigation.scss */ + .developer-portal-sidebar__navigation__toggler { + display: none; + } +} +/* line 12, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__toggler span { + background: #f2f2f2 url("../images/icons/developer-portal-sidebar-navigation-toggler.png") no-repeat 100% 50%; + border-radius: 0.25em; + display: block; + font-weight: bold; + margin: 0.5em 1em; + padding: 1em 3.5em 1em 1em; +} + +/* line 22, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper { + background: #f2f2f2; +} +/* line 25, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper[aria-expanded="false"] { + display: none; +} +@media (min-width: 58em) { + /* line 25, ../sass/components/developer-portal/_sidebar__navigation.scss */ + .developer-portal-sidebar__navigation__wrapper[aria-expanded="false"] { + display: block; + } +} +/* line 37, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper a { + border-bottom: 2px solid #e6e6e6; + display: block; + font-weight: bold; +} +/* line 43, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper a:focus, .developer-portal-sidebar__navigation__wrapper a:hover { + background: rgba(0, 0, 0, 0.02); +} +/* line 48, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper a span { + display: block; + padding: 1em; + width: 100%; +} +@media (min-width: 58em) { + /* line 48, ../sass/components/developer-portal/_sidebar__navigation.scss */ + .developer-portal-sidebar__navigation__wrapper a span { + max-width: 20em; + float: right; + } +} +/* line 60, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper .section--has-sub-sections > a span { + background: url("../images/icons/developer-portal-sidebar-navigation.png") no-repeat 100% 50%; + padding-right: 3.5em; +} +/* line 66, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper .section--active a { + color: #000; +} +/* line 70, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper .section--active > a { + background: #e6e6e6; +} +/* line 73, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper .section--active > a span { + background-image: url("../images/icons/developer-portal-sidebar-navigation--active.png"); +} +/* line 80, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper .sub-sections span { + padding-left: 2.5em; +} +/* line 84, ../sass/components/developer-portal/_sidebar__navigation.scss */ +.developer-portal-sidebar__navigation__wrapper .sub-sections ul span { + padding-left: 4em; +} + +/* line 1, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions { + background: #fff; +} +/* line 4, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions ul { + padding: 0.5em 0; +} +/* line 8, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions ul[aria-expanded="false"] { + display: none; +} +/* line 13, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions a { + display: block; + font-weight: bold; +} +/* line 18, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions a span { + display: block; + padding: 0.5em 1em; + width: 100%; +} +@media (min-width: 58em) { + /* line 18, ../sass/components/developer-portal/_versions.scss */ + .developer-portal-sidebar__versions a span { + max-width: 20em; + float: right; + } +} +/* line 30, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions .active a { + color: #bfbfbf; +} + +/* line 35, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions__toggler { + border-bottom: 4px solid #bfbfbf; +} +/* line 39, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions__toggler button { + background: none; + border: 0; + display: block; + padding: 0; + text-align: left; + width: 100%; +} +@media (min-width: 58em) { + /* line 39, ../sass/components/developer-portal/_versions.scss */ + .developer-portal-sidebar__versions__toggler button { + max-width: 20em; + float: right; + } +} +/* line 53, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions__toggler span { + background: url("../images/icons/developer-portal-sidebar-versions-toggler.png") no-repeat 100% 50%; + color: #bfbfbf; + display: block; + font-weight: bold; + padding: 1em; +} +/* line 61, ../sass/components/developer-portal/_versions.scss */ +.developer-portal-sidebar__versions__toggler [aria-pressed="true"] span { + background-image: url("../images/icons/developer-portal-sidebar-versions-toggler--active.png"); + color: #000; +} + +/* line 1, ../sass/components/global/_global-footer.scss */ +.global-footer { + background: #282725; + padding: 3em 1em; +} + +/* line 7, ../sass/components/global/_global-footer.scss */ +.global-footer__contact { + margin-bottom: 3em; +} +@media (min-width: 58em) { + /* line 7, ../sass/components/global/_global-footer.scss */ + .global-footer__contact { + float: left; + margin-right: 3em; + width: 16em; + } +} + +/* line 18, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__button { + background: #4a4947; + color: #fff; + display: block; +} +@media (min-width: 42em) { + /* line 18, ../sass/components/global/_global-footer.scss */ + .global-footer__contact__button { + float: left; + width: 14em; + } +} +@media (min-width: 58em) { + /* line 18, ../sass/components/global/_global-footer.scss */ + .global-footer__contact__button { + width: 100%; + } +} +/* line 33, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__button:focus, .global-footer__contact__button:hover { + background: #454442; +} + +/* line 39, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social { + margin-top: 1.5em; +} +@media (min-width: 42em) { + /* line 39, ../sass/components/global/_global-footer.scss */ + .global-footer__contact__social { + float: right; + margin-top: 0.5em; + width: 16em; + } +} +@media (min-width: 58em) { + /* line 39, ../sass/components/global/_global-footer.scss */ + .global-footer__contact__social { + margin-top: 1.5em; + } +} +/* line 54, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social li { + float: left; + text-align: center; + width: 25%; +} +/* line 60, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social a { + background: no-repeat 0 0; + display: block; + margin: 0 auto; + height: 32px; + width: 32px; +} +/* line 70, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social .facebook { + background-image: url("../images/icons/social-facebook.png"); +} +/* line 70, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social .googleplus { + background-image: url("../images/icons/social-googleplus.png"); +} +/* line 70, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social .linkedin { + background-image: url("../images/icons/social-linkedin.png"); +} +/* line 70, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social .twitter { + background-image: url("../images/icons/social-twitter.png"); +} +/* line 75, ../sass/components/global/_global-footer.scss */ +.global-footer__contact__social .twitter { + width: 36px; +} + +/* line 1, ../sass/components/global/_global-header-search.scss */ +.global-header-search { + background: #f2f2f2; + clear: both; +} +/* line 5, ../sass/components/global/_global-header-search.scss */ +.global-header-search ul { + display: table; + width: 100%; +} +/* line 11, ../sass/components/global/_global-header-search.scss */ +.global-header-search li { + display: table-cell; + vertical-align: top; +} +/* line 15, ../sass/components/global/_global-header-search.scss */ +.global-header-search li + li { + width: 3em; +} +/* line 20, ../sass/components/global/_global-header-search.scss */ +.global-header-search label { + clip: rect(0 0 0 0); + height: 0; + overflow: hidden; + position: absolute; + width: 0; +} +/* line 24, ../sass/components/global/_global-header-search.scss */ +.global-header-search input[type="search"] { + background: none; + border: 0; + height: 3em; + width: 100%; +} +@media (min-width: 44em) { + /* line 24, ../sass/components/global/_global-header-search.scss */ + .global-header-search input[type="search"] { + padding-left: 1em; + } +} +/* line 35, ../sass/components/global/_global-header-search.scss */ +.global-header-search button { + background: #e6e6e6 url("../images/icons/search.png") no-repeat 50% 50%; + background-size: contain; + border: 0; + height: 3em; + width: 3em; +} +/* line 42, ../sass/components/global/_global-header-search.scss */ +.global-header-search button:focus, .global-header-search button:hover { + background-color: #d9d9d9; +} +/* line 47, ../sass/components/global/_global-header-search.scss */ +.global-header-search button span { + display: block; +} +/* line 53, ../sass/components/global/_global-header-search.scss */ +.global-header-search li button { + display: block; +} + +@media (min-width: 68em) { + /* line 59, ../sass/components/global/_global-header-search.scss */ + .global-header-search--js { + left: 16.25em; + padding-right: 3em; + position: absolute; + right: 9.5em; + top: 0; + } + /* line 66, ../sass/components/global/_global-header-search.scss */ + .global-header-search--js[aria-expanded="false"] { + left: auto; + overflow: hidden; + width: 3em; + } + /* line 72, ../sass/components/global/_global-header-search.scss */ + .global-header-search--js li button { + background-color: transparent; + } +} +/* line 78, ../sass/components/global/_global-header-search.scss */ +.global-header-search__toggler { + display: none; + position: absolute; + right: 0; + top: 0; +} +@media (min-width: 68em) { + /* line 78, ../sass/components/global/_global-header-search.scss */ + .global-header-search__toggler { + display: block; + } + /* line 87, ../sass/components/global/_global-header-search.scss */ + .global-header-search--js[aria-expanded="true"] .global-header-search__toggler { + background-image: url("../images/icons/search-close.png"); + } +} + +/* line 1, ../sass/components/global/_global-header.scss */ +.global-header { + padding: 1em 1em 0 1em; +} +/* line 5, ../sass/components/global/_global-header.scss */ +.global-header > .layout-wrapper { + position: relative; +} + +/* line 10, ../sass/components/global/_global-header.scss */ +.global-header__download-button { + display: none; + padding: 1em; + width: 8.75em; +} +@media (min-width: 68em) { + /* line 10, ../sass/components/global/_global-header.scss */ + .global-header__download-button { + display: inline-block; + position: absolute; + right: 0; + top: 0; + } +} + +/* line 1, ../sass/components/global/_global-header__logo.scss */ +.global-header__logo { + font-size: 16px; + margin: 0; +} +@media (min-width: 58em) { + /* line 1, ../sass/components/global/_global-header__logo.scss */ + .global-header__logo { + float: left; + margin-bottom: 0.75em; + } +} +/* line 10, ../sass/components/global/_global-header__logo.scss */ +.global-header__logo a { + background: url("../images/logo.svg") no-repeat 0 0; + background-size: contain; + display: block; + height: 26px; + width: 114px; +} +@media (min-width: 44em) { + /* line 10, ../sass/components/global/_global-header__logo.scss */ + .global-header__logo a { + height: 52px; + width: 227px; + } +} + +/* line 1, ../sass/components/global/_global-sub-footer.scss */ +.global-sub-footer { + background: #1b1a19; + padding: 1em; +} +/* line 6, ../sass/components/global/_global-sub-footer.scss */ +.global-sub-footer p { + color: #4a4947; + font-size: 12px; + line-height: 1.6; + margin: 0; +} +/* line 13, ../sass/components/global/_global-sub-footer.scss */ +.global-sub-footer a { + color: #4a4947; + display: inline-block; + margin-right: 1em; +} +/* line 18, ../sass/components/global/_global-sub-footer.scss */ +.global-sub-footer a:focus, .global-sub-footer a:hover { + text-decoration: underline; +} +@media (min-width: 58em) { + /* line 25, ../sass/components/global/_global-sub-footer.scss */ + .global-sub-footer .legal { + float: left; + } +} +/* line 30, ../sass/components/global/_global-sub-footer.scss */ +.global-sub-footer .license { + display: block; + margin-bottom: 1em; +} +@media (min-width: 42em) { + /* line 30, ../sass/components/global/_global-sub-footer.scss */ + .global-sub-footer .license { + display: inline-block; + margin: 0 1em 0 0; + } +} +/* line 40, ../sass/components/global/_global-sub-footer.scss */ +.global-sub-footer .company-name { + font-weight: normal; + text-transform: uppercase; +} +/* line 45, ../sass/components/global/_global-sub-footer.scss */ +.global-sub-footer .languages { + margin-top: 1em; +} +@media (min-width: 58em) { + /* line 45, ../sass/components/global/_global-sub-footer.scss */ + .global-sub-footer .languages { + float: right; + margin: 0; + } +} + +/* line 1, ../sass/components/homepage/_customers.scss */ +.homepage-customers { + margin: 3em 0; + padding: 0 1em; +} +/* line 5, ../sass/components/homepage/_customers.scss */ +.homepage-customers hr { + margin: 1.5em auto; +} + +/* line 10, ../sass/components/homepage/_customers.scss */ +.homepage-customers__title { + font-weight: normal; + margin: 0; + text-align: center; +} + +/* line 16, ../sass/components/homepage/_customers.scss */ +.homepage-customers__content { + overflow: hidden; + width: 100%; +} + +/* line 21, ../sass/components/homepage/_customers.scss */ +.homepage-customers__items { + float: left; + left: 50%; + position: relative; +} + +/* line 28, ../sass/components/homepage/_customers.scss */ +.homepage-customers__item { + float: left; + position: relative; + right: 50%; +} + +/* line 34, ../sass/components/homepage/_customers.scss */ +.homepage-customers__item__wrapper { + display: table; + width: 100%; +} + +/* line 39, ../sass/components/homepage/_customers.scss */ +.homepage-customers__item__logo { + display: table-cell; + height: 100px; + margin: 0; + max-width: 150px; + padding: 0 1em 1em 1em; + text-align: center; + vertical-align: middle; +} +/* line 48, ../sass/components/homepage/_customers.scss */ +.homepage-customers__item__logo img { + width: 100%; +} + +/* line 1, ../sass/components/homepage/_get-started.scss */ +.homepage-get-started { + background: #f2f2f2; + padding: 3em 1em; +} + +/* line 6, ../sass/components/homepage/_get-started.scss */ +.homepage-get-started__header { + margin-bottom: 3em; + text-align: center; +} +/* line 10, ../sass/components/homepage/_get-started.scss */ +.homepage-get-started__header h1 { + font-weight: normal; + margin: 0; +} + +/* line 16, ../sass/components/homepage/_get-started.scss */ +.homepage-get-started__content { + text-align: center; +} +@media (min-width: 30em) { + /* line 23, ../sass/components/homepage/_get-started.scss */ + .homepage-get-started__content li { + display: inline-block; + padding: 0 0.5em; + width: 18em; + } +} +/* line 30, ../sass/components/homepage/_get-started.scss */ +.homepage-get-started__content li + li { + margin-top: 1em; +} +@media (min-width: 30em) { + /* line 30, ../sass/components/homepage/_get-started.scss */ + .homepage-get-started__content li + li { + margin: 0; + } +} +/* line 39, ../sass/components/homepage/_get-started.scss */ +.homepage-get-started__content a { + width: 100%; +} + +/* line 1, ../sass/components/homepage/_image-header.scss */ +.homepage-image-header { + background: url("../images/photos/homepage-image-header.jpg") no-repeat 50% 50%; + background-size: cover; +} + +/* line 6, ../sass/components/homepage/_image-header.scss */ +.homepage-image-header__content { + margin: 0 auto; + max-width: 68em; + padding: 6em 1em; +} +@media (min-width: 30em) { + /* line 6, ../sass/components/homepage/_image-header.scss */ + .homepage-image-header__content { + padding: 15em 1em; + } +} +/* line 15, ../sass/components/homepage/_image-header.scss */ +.homepage-image-header__content p { + color: #fff; + font-size: 28px; + line-height: 1.2; + margin: 0; + text-align: center; + text-shadow: 0 0 1em rgba(0, 0, 0, 0.4); +} +@media (min-width: 30em) { + /* line 15, ../sass/components/homepage/_image-header.scss */ + .homepage-image-header__content p { + font-size: 56px; + } +} + +/* line 1, ../sass/components/homepage/_products.scss */ +.homepage-products { + background: #00bfe8 url("../images/patterns/mosaic-bright.png") repeat 50% 50%; + color: #fff; + margin: 3em 0; + padding: 3em 1em; + text-align: center; +} + +/* line 9, ../sass/components/homepage/_products.scss */ +.homepage-products__title { + font-weight: normal; + margin: 0; +} + +/* line 14, ../sass/components/homepage/_products.scss */ +.homepage-products__content { + margin-top: 1.5em; +} +/* line 17, ../sass/components/homepage/_products.scss */ +.homepage-products__content p { + font-size: 20px; + line-height: 1.6; + margin: 0 auto; + max-width: 34em; +} +/* line 24, ../sass/components/homepage/_products.scss */ +.homepage-products__content ul { + margin-top: 3em; +} +/* line 30, ../sass/components/homepage/_products.scss */ +.homepage-products__content li { + margin-bottom: 3em; + padding: 0 1em; +} +@media (min-width: 30em) { + /* line 30, ../sass/components/homepage/_products.scss */ + .homepage-products__content li { + float: left; + width: 50%; + } + /* line 38, ../sass/components/homepage/_products.scss */ + .homepage-products__content li:nth-child(odd) { + clear: left; + } +} +@media (min-width: 30em) { + /* line 30, ../sass/components/homepage/_products.scss */ + .homepage-products__content li { + width: 25%; + } + /* line 46, ../sass/components/homepage/_products.scss */ + .homepage-products__content li:nth-child(odd) { + clear: none; + } + /* line 50, ../sass/components/homepage/_products.scss */ + .homepage-products__content li:nth-child(4n+1) { + clear: left; + } +} +/* line 55, ../sass/components/homepage/_products.scss */ +.homepage-products__content li span { + background: #fff no-repeat 50% 50%; + border-radius: 50%; + display: block; + margin: 0 auto 1.5em auto; + height: 124px; + width: 124px; +} +/* line 64, ../sass/components/homepage/_products.scss */ +.homepage-products__content li b { + color: #1b1a19; + font-weight: bold; + line-height: 1.4; + text-transform: uppercase; +} + +/* line 78, ../sass/components/homepage/_products.scss */ +.homepage-products__actions li { + margin-top: 3em; +} +/* line 81, ../sass/components/homepage/_products.scss */ +.homepage-products__actions li:first-child { + margin-top: 0; +} +@media (min-width: 30em) { + /* line 78, ../sass/components/homepage/_products.scss */ + .homepage-products__actions li { + display: inline-block; + margin: 0 1.5em; + } +} +/* line 91, ../sass/components/homepage/_products.scss */ +.homepage-products__actions a { + min-width: 16em; +} +/* line 95, ../sass/components/homepage/_products.scss */ +.homepage-products__actions span { + display: block; + margin-top: 1.5em; +} + +/* line 1, ../sass/components/homepage/_promos.scss */ +.homepage-promos { + background: #f2f2f2; + border-bottom: 1px solid #e6e6e6; +} + +/* line 7, ../sass/components/homepage/_promos.scss */ +.homepage-promos__promo { + padding: 3em 1em; +} +@media (min-width: 50em) { + /* line 7, ../sass/components/homepage/_promos.scss */ + .homepage-promos__promo { + float: left; + width: 50%; + } + /* line 14, ../sass/components/homepage/_promos.scss */ + .homepage-promos__promo:first-child { + border-right: 1px solid #e6e6e6; + padding-right: 3em; + } + /* line 19, ../sass/components/homepage/_promos.scss */ + .homepage-promos__promo + .homepage-promos__promo { + border-left: 1px solid #e6e6e6; + margin-left: -1px; + padding-left: 3em; + } +} +/* line 26, ../sass/components/homepage/_promos.scss */ +.homepage-promos__promo h1 { + font-weight: normal; + line-height: 1.4; + margin: 0; +} +/* line 32, ../sass/components/homepage/_promos.scss */ +.homepage-promos__promo p { + color: #757575; + font-size: 20px; + line-height: 1.6; + margin: 1em 0; +} + +@media (min-width: 58em) { + /* line 1, ../sass/components/navigation/_footer-navigation.scss */ + .footer-navigation { + padding-left: 19em; + } +} + +/* line 9, ../sass/components/navigation/_footer-navigation.scss */ +.footer-navigation__group, .footer-navigation__group--even { + clear: left; + float: left; + margin-bottom: 3em; + padding-right: 1em; + width: 50%; +} + +/* line 17, ../sass/components/navigation/_footer-navigation.scss */ +.footer-navigation__group--even { + clear: right; + float: right; +} + +@media (min-width: 42em) { + /* line 24, ../sass/components/navigation/_footer-navigation.scss */ + .footer-navigation__group, .footer-navigation__group--even, + .footer-navigation__group--even { + clear: none; + float: left; + margin-bottom: 0; + width: 25%; + } +} +/* line 33, ../sass/components/navigation/_footer-navigation.scss */ +.footer-navigation__title { + color: #4a4947; + font-size: 14px; + margin: 0 0 1.5em 0; + text-transform: uppercase; +} + +/* line 44, ../sass/components/navigation/_footer-navigation.scss */ +.footer-navigation__item { + font-size: 14px; + margin-top: 0.75em; +} +/* line 48, ../sass/components/navigation/_footer-navigation.scss */ +.footer-navigation__item a { + color: #848380; + display: inline-block; + font-weight: bold; + margin: -0.25em; + padding: 0.25em; +} +/* line 55, ../sass/components/navigation/_footer-navigation.scss */ +.footer-navigation__item a:focus, .footer-navigation__item a:hover { + text-decoration: underline; +} + +/* line 1, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__toggler { + background: none; + border: 0; + display: block; + font-size: 14px; + font-weight: bold; + margin: -1em; + padding: 1em 2.5em 1em 1em; + position: absolute; + right: 0; + text-transform: uppercase; + top: 0.6em; +} +@media (min-width: 44em) { + /* line 1, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__toggler { + display: none; + } +} +/* line 18, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__toggler:before, .primary-navigation__toggler:after { + background: #000; + content: ""; + display: block; + height: 4px; + margin-top: -4px; + position: absolute; + right: 1em; + top: 50%; + transition: all 100ms linear; + width: 12px; +} +/* line 32, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__toggler:after { + -ms-transform: rotate(90deg); + -webkit-transform: rotate(90deg); + transform: rotate(90deg); +} +/* line 36, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__toggler[aria-pressed="true"] { + color: #ec1e2c; +} +/* line 39, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__toggler[aria-pressed="true"]:before, .primary-navigation__toggler[aria-pressed="true"]:after { + background: #ec1e2c; + -ms-transform: rotate(45deg); + -webkit-transform: rotate(45deg); + transform: rotate(45deg); +} +/* line 45, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__toggler[aria-pressed="true"]:after { + -ms-transform: rotate(135deg); + -webkit-transform: rotate(135deg); + transform: rotate(135deg); +} + +/* line 51, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation { + border-top: 1px solid #e6e6e6; + margin: 1em -1em 0 -1em; +} +@media (min-width: 58em) { + /* line 51, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation { + border: 0; + margin: 0; + } +} + +/* line 62, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__toggler + .primary-navigation__wrapper { + clip: rect(0 0 0 0); + height: 0; + overflow: hidden; + position: absolute; + width: 0; +} +/* line 66, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__wrapper[aria-expanded="true"] { + clip: auto; + height: auto; + overflow: visible; + position: static; + width: auto; +} +@media (min-width: 44em) { + /* line 71, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__toggler + .primary-navigation__wrapper { + clip: auto; + height: auto; + overflow: visible; + position: static; + width: auto; + } +} + +/* line 77, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__items { + -moz-column-count: 2; + -webkit-column-count: 2; + column-count: 2; + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + padding: 1em 1em 0 3em; +} +@media (min-width: 34em) { + /* line 77, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__items { + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + } +} +@media (min-width: 44em) { + /* line 77, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__items { + -moz-column-count: auto; + -webkit-column-count: auto; + column-count: auto; + padding: 1.5em 1em; + } +} +@media (min-width: 58em) { + /* line 77, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__items { + float: left; + margin: -0.25em 0 0 2em; + } +} + +/* line 99, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__item { + margin-bottom: 1em; +} +@media (min-width: 44em) { + /* line 99, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__item { + float: left; + margin: 0; + position: relative; + } + /* line 107, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__item + .primary-navigation__item { + margin-left: 2em; + } +} +/* line 112, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__item > a { + color: #000; + display: inline-block; +} +@media (min-width: 44em) { + /* line 112, ../sass/components/navigation/_primary-navigation.scss */ + .primary-navigation__item > a { + margin: -0.5em -0.75em; + padding: 0.5em 0.75em; + } +} +/* line 121, ../sass/components/navigation/_primary-navigation.scss */ +.primary-navigation__item > a:focus, .primary-navigation__item > a:hover { + color: #ec1e2c; +} + +@media (min-width: 44em) { + /* line 130, ../sass/components/navigation/_primary-navigation.scss */ + .has-secondary-navigation:before { + background: #1b1a19; + bottom: 0; + content: ""; + display: none; + left: -1.25em; + position: absolute; + top: -1.25em; + width: 12em; + } + /* line 141, ../sass/components/navigation/_primary-navigation.scss */ + .has-secondary-navigation > a:after { + background: url("../images/icons/nav-arrow.png") no-repeat 0 0; + content: ""; + display: inline-block; + height: 6px; + margin: -2px 0 0 0.5em; + vertical-align: middle; + width: 9px; + } + /* line 151, ../sass/components/navigation/_primary-navigation.scss */ + .has-secondary-navigation:hover { + z-index: 1; + } + /* line 154, ../sass/components/navigation/_primary-navigation.scss */ + .has-secondary-navigation:hover:before { + display: block; + } + /* line 158, ../sass/components/navigation/_primary-navigation.scss */ + .has-secondary-navigation:hover > a { + color: #ec1e2c; + position: relative; + } + /* line 162, ../sass/components/navigation/_primary-navigation.scss */ + .has-secondary-navigation:hover > a:after { + background-image: url("../images/icons/nav-arrow--active.png"); + } + /* line 167, ../sass/components/navigation/_primary-navigation.scss */ + .has-secondary-navigation:hover .secondary-navigation { + display: block; + } +} +/* line 1, ../sass/components/navigation/_secondary-navigation.scss */ +.secondary-navigation { + background: #1b1a19; + display: none; + left: -1.25em; + position: absolute; + top: 100%; + width: 12em; +} + +/* line 10, ../sass/components/navigation/_secondary-navigation.scss */ +.secondary-navigation__items { + padding: 1.25em; +} + +/* line 16, ../sass/components/navigation/_secondary-navigation.scss */ +.secondary-navigation__item + .secondary-navigation__item { + margin-top: 1em; +} +/* line 20, ../sass/components/navigation/_secondary-navigation.scss */ +.secondary-navigation__item a { + color: #fff; + display: inline-block; + margin: -0.25em; + padding: 0.25em; +} +/* line 26, ../sass/components/navigation/_secondary-navigation.scss */ +.secondary-navigation__item a:focus, .secondary-navigation__item a:hover { + color: #ec1e2c; +} + +@media (min-width: 56em) { + /* line 4, ../sass/components/products/_base.scss */ + .page-products, + .page-products-mobile { + height: 100%; + } +} +@media (min-width: 56em) { + /* line 10, ../sass/components/products/_base.scss */ + .page-products body, + .page-products-mobile body { + height: 100%; + } +} + +/* line 19, ../sass/components/products/_base.scss */ +.page-products .global-content, +.page-products-mobile .global-content { + overflow: hidden; +} + +/* line 24, ../sass/components/products/_base.scss */ +.product-section { + position: relative; +} +/* line 27, ../sass/components/products/_base.scss */ +.product-section[data-brkpnt-small='image-bottom'] { + padding-bottom: 250px; +} +/* line 31, ../sass/components/products/_base.scss */ +.product-section[data-brkpnt-small='image-bottom--flush'] { + padding-bottom: 200px; +} +/* line 35, ../sass/components/products/_base.scss */ +.product-section[data-brkpnt-small='image-top'] { + padding-top: 250px; +} +@media (min-width: 56em) { + /* line 24, ../sass/components/products/_base.scss */ + .product-section { + overflow: hidden; + padding: 0 !important; + width: 100%; + } +} + +@media (min-width: 56em) { + /* line 47, ../sass/components/products/_base.scss */ + .page-products .global-content { + height: 800%; + } +} +@media (min-width: 56em) { + /* line 53, ../sass/components/products/_base.scss */ + .page-products .product-section { + height: 12.5%; + } +} + +@media (min-width: 56em) { + /* line 61, ../sass/components/products/_base.scss */ + .page-products-mobile .global-content { + height: 500%; + } +} +@media (min-width: 56em) { + /* line 67, ../sass/components/products/_base.scss */ + .page-products-mobile .product-section { + height: 20%; + } +} + +/* line 1, ../sass/components/products/_button.scss */ +.product-section__button { + border: 2px solid #000; + border-radius: 3px; + color: #000; + display: inline-block; + font-size: 16px; + font-weight: bold; + padding: 12px 36px; + text-decoration: none; + text-transform: uppercase; + transition: all 200ms; +} + +/* line 1, ../sass/components/products/_content.scss */ +.product-section__content { + font-size: 14px; + line-height: 1.4; + text-align: center; + padding: 50px 0; +} +@media (min-width: 30em) { + /* line 1, ../sass/components/products/_content.scss */ + .product-section__content { + font-size: 16px; + } +} +@media (min-width: 56em) { + /* line 1, ../sass/components/products/_content.scss */ + .product-section__content { + font-size: 18px; + } +} +/* line 15, ../sass/components/products/_content.scss */ +.product-section__content h2 { + font-size: 26px; + line-height: 1.2; + margin: 0 0 10px; +} +/* line 20, ../sass/components/products/_content.scss */ +.product-section__content h2 + p { + margin-top: 0; +} +@media (min-width: 30em) { + /* line 15, ../sass/components/products/_content.scss */ + .product-section__content h2 { + font-size: 28px; + } +} +@media (min-width: 56em) { + /* line 15, ../sass/components/products/_content.scss */ + .product-section__content h2 { + font-size: 30px; + margin-left: 20%; + margin-right: 20%; + } +} +/* line 35, ../sass/components/products/_content.scss */ +.product-section__content p { + margin: 15px 5% 0; +} +@media (min-width: 30em) { + /* line 35, ../sass/components/products/_content.scss */ + .product-section__content p { + margin-left: 15%; + margin-right: 15%; + } +} +@media (min-width: 56em) { + /* line 35, ../sass/components/products/_content.scss */ + .product-section__content p { + margin-left: 12%; + margin-right: 12%; + } + /* line 47, ../sass/components/products/_content.scss */ + [data-brkpnt-large='image-bottom'] .product-section__content p { + margin-left: 32%; + margin-right: 32%; + } +} +@media (min-width: 56em) { + /* line 1, ../sass/components/products/_content.scss */ + .product-section__content { + display: table; + padding: 0; + } + /* line 58, ../sass/components/products/_content.scss */ + [data-brkpnt-large='image-bottom'] .product-section__content { + height: 50%; + padding-top: 70px; + width: 100%; + } + /* line 64, ../sass/components/products/_content.scss */ + [data-brkpnt-large='image-left'] .product-section__content, [data-brkpnt-large='image-right'] .product-section__content { + height: 100%; + width: 50%; + } + /* line 70, ../sass/components/products/_content.scss */ + [data-brkpnt-large='image-left'] .product-section__content { + float: right; + padding-right: 5%; + } + /* line 75, ../sass/components/products/_content.scss */ + [data-brkpnt-large='image-right'] .product-section__content { + float: left; + padding-left: 5%; + } +} + +@media (min-width: 56em) { + /* line 82, ../sass/components/products/_content.scss */ + .product-section__content__inner { + display: table-cell; + vertical-align: middle; + } +} + +@media (min-width: 56em) { + /* line 3, ../sass/components/products/_graphic.scss */ + [data-brkpnt-large='image-left'] .product-section__graphic, [data-brkpnt-large='image-right'] .product-section__graphic { + display: table; + height: 100%; + width: 50%; + } + /* line 10, ../sass/components/products/_graphic.scss */ + [data-brkpnt-large='image-left'] .product-section__graphic { + float: left; + padding-left: 5%; + } + /* line 15, ../sass/components/products/_graphic.scss */ + [data-brkpnt-large='image-right'] .product-section__graphic { + float: right; + padding-right: 5%; + } +} + +/* line 22, ../sass/components/products/_graphic.scss */ +.product-section__graphic__inner { + background-position: 50% 100%; + background-repeat: no-repeat; + display: block; + font-size: 0; + height: 200px; + left: 0; + line-height: 0; + overflow: hidden; + position: absolute; + width: 100%; +} +/* line 34, ../sass/components/products/_graphic.scss */ +[data-brkpnt-small='image-bottom'] .product-section__graphic__inner { + bottom: 50px; +} +/* line 38, ../sass/components/products/_graphic.scss */ +[data-brkpnt-small='image-bottom--flush'] .product-section__graphic__inner { + bottom: 0; +} +/* line 42, ../sass/components/products/_graphic.scss */ +[data-brkpnt-small='image-top'] .product-section__graphic__inner { + top: 50px; +} +@media (min-width: 56em) { + /* line 22, ../sass/components/products/_graphic.scss */ + .product-section__graphic__inner { + background-size: contain; + bottom: auto !important; + position: relative; + text-align: center; + top: auto !important; + } + /* line 53, ../sass/components/products/_graphic.scss */ + .product-section__graphic__inner.has-video { + background-image: none !important; + } + /* line 57, ../sass/components/products/_graphic.scss */ + [data-brkpnt-large='image-left'] .product-section__graphic__inner, [data-brkpnt-large='image-right'] .product-section__graphic__inner { + background-position: 50% 50%; + display: table-cell; + vertical-align: middle; + } + /* line 64, ../sass/components/products/_graphic.scss */ + [data-brkpnt-large='image-bottom'] .product-section__graphic__inner { + height: 50%; + width: 100%; + } +} + +/* line 71, ../sass/components/products/_graphic.scss */ +.video__container { + overflow: hidden; + position: absolute; +} +/* line 75, ../sass/components/products/_graphic.scss */ +[data-brkpnt-large='image-bottom'] .video__container { + bottom: -1px !important; + top: auto !important; +} +/* line 80, ../sass/components/products/_graphic.scss */ +.video__container .video { + background-color: transparent; + height: 100%; + left: 0; + opacity: 0; + outline: 0; + position: absolute; + top: -1px; + transition: opacity 500ms 1s; + width: 100%; +} +/* line 91, ../sass/components/products/_graphic.scss */ +.video__container .video.play { + opacity: 1; + transition: opacity 1s; +} + +/* line 4, ../sass/components/products/_nav.scss */ +.product-section__nav { + background-color: #fff; + height: 70px; + left: 0; + padding: 0 1em; + position: fixed; + top: -70px; + transition: top 200ms; + width: 100%; + z-index: 10; +} +/* line 15, ../sass/components/products/_nav.scss */ +.product-section__nav.section-nav--show { + box-shadow: 0 0 3px rgba(0, 0, 0, 0.4); + top: 0; +} + +/* line 21, ../sass/components/products/_nav.scss */ +.product-section__nav__inner { + display: table; +} + +/* line 25, ../sass/components/products/_nav.scss */ +.section-nav__table-cell, .product-section__nav__logo, .product-section__nav__links, .product-section__nav__buttons { + display: table-cell; + height: 70px; + vertical-align: middle; + white-space: nowrap; +} + +/* line 35, ../sass/components/products/_nav.scss */ +.product-section__nav__logo a { + background: url("../images/logo.svg") no-repeat 0 0; + background-size: cover; + content: ''; + display: block; + float: left; + height: 39px; + width: 170px; +} + +/* line 47, ../sass/components/products/_nav.scss */ +.product-section__nav__links { + list-style: none; + margin: 0; + padding: 0; + text-align: center; + width: 100%; +} +/* line 55, ../sass/components/products/_nav.scss */ +.product-section__nav__links li { + display: inline-block; + margin: 0; + padding: 0 0 0 1.4em; +} +/* line 60, ../sass/components/products/_nav.scss */ +.product-section__nav__links li:first-child { + padding-left: 0; +} + +/* line 69, ../sass/components/products/_nav.scss */ +.product-section__nav__buttons a { + margin-left: .625em; + padding: 1em; +} +/* line 73, ../sass/components/products/_nav.scss */ +.product-section__nav__buttons a:first-child { + margin-left: 0; +} + +/* line 79, ../sass/components/products/_nav.scss */ +.product-section__nav__link { + background-color: #282727; + border-radius: 50%; + display: block; + height: 12px; + transition: all 200ms; + width: 12px; +} +/* line 87, ../sass/components/products/_nav.scss */ +.product-section__nav__link span { + clip: rect(0 0 0 0); + height: 0; + overflow: hidden; + position: absolute; + width: 0; +} +/* line 91, ../sass/components/products/_nav.scss */ +.product-section__nav__link[aria-selected='true'] { + background-color: #ec1e2c; +} + +/* @group section color placeholders */ +/* line 3, ../sass/components/products/_sections.scss */ +.section__data-mobility, .section__performance, .section__real-time, .section__native-api-support { + background-color: white; + color: black; +} +/* line 32, ../sass/mixins/_products.scss */ +.safari-colors .section__data-mobility, .safari-colors .section__performance, .safari-colors .section__real-time, .safari-colors .section__native-api-support { + background-color: white; +} +/* line 36, ../sass/mixins/_products.scss */ +.section__data-mobility .product-section__button, .section__performance .product-section__button, .section__real-time .product-section__button, .section__native-api-support .product-section__button { + border-color: black; + color: black; +} +/* line 40, ../sass/mixins/_products.scss */ +.section__data-mobility .product-section__button:focus, .section__performance .product-section__button:focus, .section__real-time .product-section__button:focus, .section__native-api-support .product-section__button:focus, .section__data-mobility .product-section__button:hover, .section__performance .product-section__button:hover, .section__real-time .product-section__button:hover, .section__native-api-support .product-section__button:hover { + background-color: black; + color: white; +} +/* line 45, ../sass/mixins/_products.scss */ +.safari-colors .section__data-mobility .product-section__button:focus, .safari-colors .section__performance .product-section__button:focus, .safari-colors .section__real-time .product-section__button:focus, .safari-colors .section__native-api-support .product-section__button:focus, .safari-colors .section__data-mobility .product-section__button:hover, .safari-colors .section__performance .product-section__button:hover, .safari-colors .section__real-time .product-section__button:hover, .safari-colors .section__native-api-support .product-section__button:hover { + color: white; +} + +/* line 7, ../sass/components/products/_sections.scss */ +.section__always-available, .section__powerful-admin { + background-color: #7bbdcb; + color: white; +} +/* line 32, ../sass/mixins/_products.scss */ +.safari-colors .section__always-available, .safari-colors .section__powerful-admin { + background-color: #8ec5d2; +} +/* line 36, ../sass/mixins/_products.scss */ +.section__always-available .product-section__button, .section__powerful-admin .product-section__button { + border-color: white; + color: white; +} +/* line 40, ../sass/mixins/_products.scss */ +.section__always-available .product-section__button:focus, .section__powerful-admin .product-section__button:focus, .section__always-available .product-section__button:hover, .section__powerful-admin .product-section__button:hover { + background-color: white; + color: #7bbdcb; +} +/* line 45, ../sass/mixins/_products.scss */ +.safari-colors .section__always-available .product-section__button:focus, .safari-colors .section__powerful-admin .product-section__button:focus, .safari-colors .section__always-available .product-section__button:hover, .safari-colors .section__powerful-admin .product-section__button:hover { + color: #8ec5d2; +} + +/* line 11, ../sass/components/products/_sections.scss */ +.section__feature-rich, .section__one-code-many-platforms { + background-color: #17bee7; + color: white; +} +/* line 32, ../sass/mixins/_products.scss */ +.safari-colors .section__feature-rich, .safari-colors .section__one-code-many-platforms { + background-color: #40c7ea; +} +/* line 36, ../sass/mixins/_products.scss */ +.section__feature-rich .product-section__button, .section__one-code-many-platforms .product-section__button { + border-color: white; + color: white; +} +/* line 40, ../sass/mixins/_products.scss */ +.section__feature-rich .product-section__button:focus, .section__one-code-many-platforms .product-section__button:focus, .section__feature-rich .product-section__button:hover, .section__one-code-many-platforms .product-section__button:hover { + background-color: white; + color: #17bee7; +} +/* line 45, ../sass/mixins/_products.scss */ +.safari-colors .section__feature-rich .product-section__button:focus, .safari-colors .section__one-code-many-platforms .product-section__button:focus, .safari-colors .section__feature-rich .product-section__button:hover, .safari-colors .section__one-code-many-platforms .product-section__button:hover { + color: #40c7ea; +} + +/* line 15, ../sass/components/products/_sections.scss */ +.section__dev-power, .section__scalable-sync { + background-color: #efeef0; + color: black; +} +/* line 32, ../sass/mixins/_products.scss */ +.safari-colors .section__dev-power, .safari-colors .section__scalable-sync { + background-color: #f2f2f2; +} +/* line 36, ../sass/mixins/_products.scss */ +.section__dev-power .product-section__button, .section__scalable-sync .product-section__button { + border-color: black; + color: black; +} +/* line 40, ../sass/mixins/_products.scss */ +.section__dev-power .product-section__button:focus, .section__scalable-sync .product-section__button:focus, .section__dev-power .product-section__button:hover, .section__scalable-sync .product-section__button:hover { + background-color: black; + color: #efeef0; +} +/* line 45, ../sass/mixins/_products.scss */ +.safari-colors .section__dev-power .product-section__button:focus, .safari-colors .section__scalable-sync .product-section__button:focus, .safari-colors .section__dev-power .product-section__button:hover, .safari-colors .section__scalable-sync .product-section__button:hover { + color: #f2f2f2; +} + +/* line 19, ../sass/components/products/_sections.scss */ +.section__flexible-map, .section__general-purpose, .section__available-anywhere { + background-color: #282727; + color: white; +} +/* line 32, ../sass/mixins/_products.scss */ +.safari-colors .section__flexible-map, .safari-colors .section__general-purpose, .safari-colors .section__available-anywhere { + background-color: #2c2c2a; +} +/* line 36, ../sass/mixins/_products.scss */ +.section__flexible-map .product-section__button, .section__general-purpose .product-section__button, .section__available-anywhere .product-section__button { + border-color: white; + color: white; +} +/* line 40, ../sass/mixins/_products.scss */ +.section__flexible-map .product-section__button:focus, .section__general-purpose .product-section__button:focus, .section__available-anywhere .product-section__button:focus, .section__flexible-map .product-section__button:hover, .section__general-purpose .product-section__button:hover, .section__available-anywhere .product-section__button:hover { + background-color: white; + color: #282727; +} +/* line 45, ../sass/mixins/_products.scss */ +.safari-colors .section__flexible-map .product-section__button:focus, .safari-colors .section__general-purpose .product-section__button:focus, .safari-colors .section__available-anywhere .product-section__button:focus, .safari-colors .section__flexible-map .product-section__button:hover, .safari-colors .section__general-purpose .product-section__button:hover, .safari-colors .section__available-anywhere .product-section__button:hover { + color: #2c2c2a; +} + +/* @end */ +/* @group product page */ +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__always-available .product-section__graphic__inner, .video-false .section__always-available .product-section__graphic__inner, .section__always-available .product-section__graphic__inner.has-image { + background-image: url("../images/products/always-available--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__always-available .product-section__graphic__inner, .video-false .section__always-available .product-section__graphic__inner, .section__always-available .product-section__graphic__inner.has-image { + background-image: url("../images/products/always-available--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__always-available .product-section__graphic__inner, .video-false .section__always-available .product-section__graphic__inner, .section__always-available .product-section__graphic__inner.has-image { + background-image: url("../images/products/always-available.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__data-mobility .product-section__graphic__inner, .video-false .section__data-mobility .product-section__graphic__inner, .section__data-mobility .product-section__graphic__inner.has-image { + background-image: url("../images/products/data-mobility--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__data-mobility .product-section__graphic__inner, .video-false .section__data-mobility .product-section__graphic__inner, .section__data-mobility .product-section__graphic__inner.has-image { + background-image: url("../images/products/data-mobility--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__data-mobility .product-section__graphic__inner, .video-false .section__data-mobility .product-section__graphic__inner, .section__data-mobility .product-section__graphic__inner.has-image { + background-image: url("../images/products/data-mobility.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__dev-power .product-section__graphic__inner, .video-false .section__dev-power .product-section__graphic__inner, .section__dev-power .product-section__graphic__inner.has-image { + background-image: url("../images/products/dev-power--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__dev-power .product-section__graphic__inner, .video-false .section__dev-power .product-section__graphic__inner, .section__dev-power .product-section__graphic__inner.has-image { + background-image: url("../images/products/dev-power--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__dev-power .product-section__graphic__inner, .video-false .section__dev-power .product-section__graphic__inner, .section__dev-power .product-section__graphic__inner.has-image { + background-image: url("../images/products/dev-power.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__flexible-map .product-section__graphic__inner, .video-false .section__flexible-map .product-section__graphic__inner, .section__flexible-map .product-section__graphic__inner.has-image { + background-image: url("../images/products/flexible-map--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__flexible-map .product-section__graphic__inner, .video-false .section__flexible-map .product-section__graphic__inner, .section__flexible-map .product-section__graphic__inner.has-image { + background-image: url("../images/products/flexible-map--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__flexible-map .product-section__graphic__inner, .video-false .section__flexible-map .product-section__graphic__inner, .section__flexible-map .product-section__graphic__inner.has-image { + background-image: url("../images/products/flexible-map.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__general-purpose .product-section__graphic__inner, .video-false .section__general-purpose .product-section__graphic__inner, .section__general-purpose .product-section__graphic__inner.has-image { + background-image: url("../images/products/general-purpose--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__general-purpose .product-section__graphic__inner, .video-false .section__general-purpose .product-section__graphic__inner, .section__general-purpose .product-section__graphic__inner.has-image { + background-image: url("../images/products/general-purpose--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__general-purpose .product-section__graphic__inner, .video-false .section__general-purpose .product-section__graphic__inner, .section__general-purpose .product-section__graphic__inner.has-image { + background-image: url("../images/products/general-purpose.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__performance .product-section__graphic__inner, .video-false .section__performance .product-section__graphic__inner, .section__performance .product-section__graphic__inner.has-image { + background-image: url("../images/products/performance--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__performance .product-section__graphic__inner, .video-false .section__performance .product-section__graphic__inner, .section__performance .product-section__graphic__inner.has-image { + background-image: url("../images/products/performance--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__performance .product-section__graphic__inner, .video-false .section__performance .product-section__graphic__inner, .section__performance .product-section__graphic__inner.has-image { + background-image: url("../images/products/performance.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__powerful-admin .product-section__graphic__inner, .video-false .section__powerful-admin .product-section__graphic__inner, .section__powerful-admin .product-section__graphic__inner.has-image { + background-image: url("../images/products/powerful-admin--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__powerful-admin .product-section__graphic__inner, .video-false .section__powerful-admin .product-section__graphic__inner, .section__powerful-admin .product-section__graphic__inner.has-image { + background-image: url("../images/products/powerful-admin--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__powerful-admin .product-section__graphic__inner, .video-false .section__powerful-admin .product-section__graphic__inner, .section__powerful-admin .product-section__graphic__inner.has-image { + background-image: url("../images/products/powerful-admin.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__real-time .product-section__graphic__inner, .video-false .section__real-time .product-section__graphic__inner, .section__real-time .product-section__graphic__inner.has-image { + background-image: url("../images/products/real-time--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__real-time .product-section__graphic__inner, .video-false .section__real-time .product-section__graphic__inner, .section__real-time .product-section__graphic__inner.has-image { + background-image: url("../images/products/real-time--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__real-time .product-section__graphic__inner, .video-false .section__real-time .product-section__graphic__inner, .section__real-time .product-section__graphic__inner.has-image { + background-image: url("../images/products/real-time.png"); + } +} + +/* @end */ +/* @group mobile server product page */ +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__available-anywhere .product-section__graphic__inner, .video-false .section__available-anywhere .product-section__graphic__inner, .section__available-anywhere .product-section__graphic__inner.has-image { + background-image: url("../images/products/available-anywhere--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__available-anywhere .product-section__graphic__inner, .video-false .section__available-anywhere .product-section__graphic__inner, .section__available-anywhere .product-section__graphic__inner.has-image { + background-image: url("../images/products/available-anywhere--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__available-anywhere .product-section__graphic__inner, .video-false .section__available-anywhere .product-section__graphic__inner, .section__available-anywhere .product-section__graphic__inner.has-image { + background-image: url("../images/products/available-anywhere.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__feature-rich .product-section__graphic__inner, .video-false .section__feature-rich .product-section__graphic__inner, .section__feature-rich .product-section__graphic__inner.has-image { + background-image: url("../images/products/feature-rich--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__feature-rich .product-section__graphic__inner, .video-false .section__feature-rich .product-section__graphic__inner, .section__feature-rich .product-section__graphic__inner.has-image { + background-image: url("../images/products/feature-rich--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__feature-rich .product-section__graphic__inner, .video-false .section__feature-rich .product-section__graphic__inner, .section__feature-rich .product-section__graphic__inner.has-image { + background-image: url("../images/products/feature-rich.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__native-api-support .product-section__graphic__inner, .video-false .section__native-api-support .product-section__graphic__inner, .section__native-api-support .product-section__graphic__inner.has-image { + background-image: url("../images/products/native-api--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__native-api-support .product-section__graphic__inner, .video-false .section__native-api-support .product-section__graphic__inner, .section__native-api-support .product-section__graphic__inner.has-image { + background-image: url("../images/products/native-api--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__native-api-support .product-section__graphic__inner, .video-false .section__native-api-support .product-section__graphic__inner, .section__native-api-support .product-section__graphic__inner.has-image { + background-image: url("../images/products/native-api.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__one-code-many-platforms .product-section__graphic__inner, .video-false .section__one-code-many-platforms .product-section__graphic__inner, .section__one-code-many-platforms .product-section__graphic__inner.has-image { + background-image: url("../images/products/onecode--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__one-code-many-platforms .product-section__graphic__inner, .video-false .section__one-code-many-platforms .product-section__graphic__inner, .section__one-code-many-platforms .product-section__graphic__inner.has-image { + background-image: url("../images/products/onecode--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__one-code-many-platforms .product-section__graphic__inner, .video-false .section__one-code-many-platforms .product-section__graphic__inner, .section__one-code-many-platforms .product-section__graphic__inner.has-image { + background-image: url("../images/products/onecode.png"); + } +} + +/* line 11, ../sass/mixins/_products.scss */ +.no-js .section__scalable-sync .product-section__graphic__inner, .video-false .section__scalable-sync .product-section__graphic__inner, .section__scalable-sync .product-section__graphic__inner.has-image { + background-image: url("../images/products/sync--sm.png"); +} +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__scalable-sync .product-section__graphic__inner, .video-false .section__scalable-sync .product-section__graphic__inner, .section__scalable-sync .product-section__graphic__inner.has-image { + background-image: url("../images/products/sync--sm--2x.png"); + background-size: auto 200px; + } +} +@media (min-width: 56em) { + /* line 11, ../sass/mixins/_products.scss */ + .no-js .section__scalable-sync .product-section__graphic__inner, .video-false .section__scalable-sync .product-section__graphic__inner, .section__scalable-sync .product-section__graphic__inner.has-image { + background-image: url("../images/products/sync.png"); + } +} + +/* @end */ +/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript+php+scss */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +/* line 8, ../sass/vendor/_prism.scss */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', monospace; + direction: ltr; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + line-height: 1.5; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +/* line 30, ../sass/vendor/_prism.scss */ +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +/* line 38, ../sass/vendor/_prism.scss */ +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + /* line 47, ../sass/vendor/_prism.scss */ + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} +/* Code blocks */ +/* line 54, ../sass/vendor/_prism.scss */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +/* line 60, ../sass/vendor/_prism.scss */ +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f4f4f4; +} + +/* Inline code */ +/* line 66, ../sass/vendor/_prism.scss */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; +} + +/* line 71, ../sass/vendor/_prism.scss */ +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +/* line 78, ../sass/vendor/_prism.scss */ +.token.punctuation { + color: #999; +} + +/* line 82, ../sass/vendor/_prism.scss */ +.namespace { + opacity: .7; +} + +/* line 86, ../sass/vendor/_prism.scss */ +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +/* line 96, ../sass/vendor/_prism.scss */ +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +/* line 105, ../sass/vendor/_prism.scss */ +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #a67f59; + background: rgba(255, 255, 255, 0.5); +} + +/* line 114, ../sass/vendor/_prism.scss */ +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +/* line 120, ../sass/vendor/_prism.scss */ +.token.function { + color: #DD4A68; +} + +/* line 124, ../sass/vendor/_prism.scss */ +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +/* line 130, ../sass/vendor/_prism.scss */ +.token.important { + font-weight: bold; +} + +/* line 134, ../sass/vendor/_prism.scss */ +.token.entity { + cursor: help; +} diff --git a/preview/contents/assets/stylesheets/docs.css b/preview/contents/assets/stylesheets/docs.css new file mode 100644 index 0000000..34fa2d2 --- /dev/null +++ b/preview/contents/assets/stylesheets/docs.css @@ -0,0 +1,302 @@ +/* DITA overrides */ + +.developer-portal-content__wrapper table th { + background-color: #006784; + border: 0px; + color: #f9f9f9 +} + +.developer-portal-content__wrapper { + position: relative; +} + +.developer-portal-sidebar__navigation__wrapper .sub-sections ul ul span { + padding-left: 5.5em; +} + +.developer-portal-sidebar__navigation__wrapper .sub-sections ul ul ul span { + padding-left: 7.0em; +} + +.product-action { + position: absolute; + top: 0.8em; + right: 12em; + text-align: right; +} + +/* +.related-links { + border-top: 1px solid black; + margin-bottom: 0.5em; +} +*/ + +.olchildlinks:before { + content: "Subtopics:"; + font-weight: bold; + margin-left: -40px; +} + +.linklist { + padding-top: 1em; +} + +.linklist:before { + content: "Related topics:"; + font-weight: bold; +} + +.product-action a { + display: block; +} + +.ghforkme { + position: absolute; + top: 0; + right: 0; + border: 0; +} + +.filepath { + font-weight:bold; +} + +.msgph { + display: inline; + padding: .2em .6em .3em; + font-size: 85%; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; + background-color: #777777; + position: relative; + top: -0.3em; + margin-left: 0.3em; +} +.msgph.current { + background-color: #46A746; +} +.msgph.stable { + background-color: #777777; +} +.msgph.snapshot { + background-color: #C63F3B; +} +.msgph.preview { + background-color: #F0AD4E; +} + +.note { + border: 1px solid #0081a5; + border-radius: 0.4em; + border-left: 0.7em solid #0081a5; + padding: 0.2em 0.4em; + margin: 1em 0px; +} + +.attentiontitle, +.cautiontitle, +.dangertitle, +.fastpathtitle, +.importanttitle, +.notetitle, +.remembertitle, +.restrictiontitle, +.tiptitle, +.warningtitle { + display:block; + font-weight:bold; +} + +pre { + background: #f4f4f4; + font-family: Consolas, Monaco, 'Andale Mono', monospace; +} + +.codeph, +.cmdname, +.apiname { + font-family: Consolas, Monaco, 'Andale Mono', monospace; +} + +.menucascade, .uicontrol { + font-weight: bold; +} + +.tablecap { + font-weight: bold; +} + +.varname { + font-style: italic; +} + +.parmname { + font-style: italic; + font-weight: bold; +} + +wintitle { + font-weight: bold; +} + +h2 { + border-bottom: thin solid; + line-height: 1.2; + margin-botton: 0; +} + +dt { + font-weight: bold; + margin-top: 0.5em; +} + + +/* GCSE Template Overrides */ +div.gsc-control-cse { + padding: 0 !important; + border: 0 !important; +} +input.gsc-search-button { + width: 4em !important; + height: 4em !important; + border: 0 !important; + background: #e6e6e6 url("../images/icons/search.png") no-repeat 50% 50% !important; + background-size: contain !important; + border-radius: 0.25em !important; + overflow: hidden !important; + text-indent: 200% !important; + text-shadow: none !important; + white-space: nowrap !important; +} +input.gsc-search-button:focus, input.gsc-search-button:hover { + background-color: #d9d9d9 !important; +} +.gsc-input input.gsc-input { + border: 0 !important; + font-family: "Kievit OT", sans-serif !important; + font-size: 120% !important; + position: relative !important; + left: 0.5em !important; +} +@media (min-width: 58em) { + .gsc-input input.gsc-input { + left: 0 !important; + } +} +.gsc-search-box { + background: #f2f2f2 !important; +} +@media (min-width: 58em) { + .gsc-search-box { + background: #ffffff !important; + } +} + + +/* Bretts Template Overrides */ +.textblock__content ul { + padding-left: 2.5em; +} +.developer-porta-header__navigation__back { + display: none; +} +@media (min-width: 78em) { + .developer-porta-header__navigation__back { + display: inline-block; + } +} +.developer-portal-content__wrapper { + padding: 1.8em 2.4em; +} +.developer-portal-content__wrapper h1 { + margin: 0em 0em 0.2em 0em; +} +.developer-portal-header__search { + width: 100%; + padding-top: 0; +} +@media (min-width: 58em) { + .developer-portal-header__search { + padding: 1.0em; + width: 40%; + } +} +.developer-portal-global-content { + max-width: initial; +} +.layout-wrapper { + max-width: initial; +} +.developer-portal-sidebar__navigation__wrapper a span { + max-width: initial; +} +.developer-portal-sidebar__navigation__wrapper a.current span { + color: #848380; +} +.developer-portal-footer .legal, +.developer-portal-footer .license, +.developer-portal-footer a { + color: #848380; +} + +/* New Prism Enhancements */ +pre.line-numbers { + position: relative; + padding-left: 3.8em; + counter-reset: linenumber; +} +pre.line-numbers > code { + position: relative; +} +.line-numbers .line-numbers-rows { + position: absolute; + pointer-events: none; + top: 0; + font-size: 100%; + left: -3.8em; + width: 3em; /* works for line-numbers below 1000 lines */ + letter-spacing: -1px; + border-right: 1px solid #999; + + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + +} +.line-numbers-rows > span { + pointer-events: none; + display: block; + counter-increment: linenumber; +} +.line-numbers-rows > span:before { + content: counter(linenumber); + color: #999; + display: block; + padding-right: 0.8em; + text-align: right; +} +pre[class*='language-'] { + position: relative; +} +pre[class*='language-'] > code[data-language] { + display: block; +} +pre[class*='language-'] > code[data-language]::before { + content: attr(data-language); + color: black; + background-color: #CFCFCF; + display: inline-block; + position: absolute; + top: 0; + right: 0; + font-size: 0.9em; + border-radius: 0 0 0 5px; + padding: 0 0.5em; + text-shadow: none; +} diff --git a/preview/contents/assets/stylesheets/legacy.css b/preview/contents/assets/stylesheets/legacy.css new file mode 100644 index 0000000..949fc99 --- /dev/null +++ b/preview/contents/assets/stylesheets/legacy.css @@ -0,0 +1,24 @@ +/* line 1, ../sass/legacy.scss */ +.global-header__logo a { + background: none; + -ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/logo.png', sizingMethod='scale')"; +} + +/* line 6, ../sass/legacy.scss */ +.global-header-search input[type="search"] { + padding-bottom: 1em; + padding-top: 1em; +} + +/* line 11, ../sass/legacy.scss */ +.carousel__page--current { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; + filter: alpha(opacity=100); +} + +/* line 16, ../sass/legacy.scss */ +.carousel__page--previous, +.carousel__page--next { + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + filter: alpha(opacity=0); +} diff --git a/preview/contents/assets/videos/buildings-1200x406.mp4 b/preview/contents/assets/videos/buildings-1200x406.mp4 new file mode 100644 index 0000000..0999168 Binary files /dev/null and b/preview/contents/assets/videos/buildings-1200x406.mp4 differ diff --git a/preview/contents/assets/videos/buildings-1200x406.webm b/preview/contents/assets/videos/buildings-1200x406.webm new file mode 100644 index 0000000..b22903a Binary files /dev/null and b/preview/contents/assets/videos/buildings-1200x406.webm differ diff --git a/preview/contents/assets/videos/clock-500x500.mp4 b/preview/contents/assets/videos/clock-500x500.mp4 new file mode 100644 index 0000000..2d1f543 Binary files /dev/null and b/preview/contents/assets/videos/clock-500x500.mp4 differ diff --git a/preview/contents/assets/videos/clock-500x500.webm b/preview/contents/assets/videos/clock-500x500.webm new file mode 100644 index 0000000..093c8f4 Binary files /dev/null and b/preview/contents/assets/videos/clock-500x500.webm differ diff --git a/preview/contents/assets/videos/clock-poster.png b/preview/contents/assets/videos/clock-poster.png new file mode 100644 index 0000000..aeb2200 Binary files /dev/null and b/preview/contents/assets/videos/clock-poster.png differ diff --git a/preview/contents/assets/videos/concurrency-1200x406.mp4 b/preview/contents/assets/videos/concurrency-1200x406.mp4 new file mode 100644 index 0000000..6e63b8d Binary files /dev/null and b/preview/contents/assets/videos/concurrency-1200x406.mp4 differ diff --git a/preview/contents/assets/videos/concurrency-1200x406.webm b/preview/contents/assets/videos/concurrency-1200x406.webm new file mode 100644 index 0000000..5fb8e8b Binary files /dev/null and b/preview/contents/assets/videos/concurrency-1200x406.webm differ diff --git a/preview/contents/assets/videos/feature-rich-500x500.mp4 b/preview/contents/assets/videos/feature-rich-500x500.mp4 new file mode 100644 index 0000000..dc8c454 Binary files /dev/null and b/preview/contents/assets/videos/feature-rich-500x500.mp4 differ diff --git a/preview/contents/assets/videos/feature-rich-500x500.webm b/preview/contents/assets/videos/feature-rich-500x500.webm new file mode 100644 index 0000000..87ebb60 Binary files /dev/null and b/preview/contents/assets/videos/feature-rich-500x500.webm differ diff --git a/preview/contents/assets/videos/generalpurpose-500x500.mp4 b/preview/contents/assets/videos/generalpurpose-500x500.mp4 new file mode 100644 index 0000000..bf23072 Binary files /dev/null and b/preview/contents/assets/videos/generalpurpose-500x500.mp4 differ diff --git a/preview/contents/assets/videos/generalpurpose-500x500.webm b/preview/contents/assets/videos/generalpurpose-500x500.webm new file mode 100644 index 0000000..7add479 Binary files /dev/null and b/preview/contents/assets/videos/generalpurpose-500x500.webm differ diff --git a/preview/contents/assets/videos/laptop-500x500.mp4 b/preview/contents/assets/videos/laptop-500x500.mp4 new file mode 100644 index 0000000..e4ce88f Binary files /dev/null and b/preview/contents/assets/videos/laptop-500x500.mp4 differ diff --git a/preview/contents/assets/videos/laptop-500x500.webm b/preview/contents/assets/videos/laptop-500x500.webm new file mode 100644 index 0000000..0fcb66b Binary files /dev/null and b/preview/contents/assets/videos/laptop-500x500.webm differ diff --git a/preview/contents/assets/videos/map-500x500.mp4 b/preview/contents/assets/videos/map-500x500.mp4 new file mode 100644 index 0000000..d94188c Binary files /dev/null and b/preview/contents/assets/videos/map-500x500.mp4 differ diff --git a/preview/contents/assets/videos/map-500x500.webm b/preview/contents/assets/videos/map-500x500.webm new file mode 100644 index 0000000..68d7c60 Binary files /dev/null and b/preview/contents/assets/videos/map-500x500.webm differ diff --git a/preview/contents/assets/videos/mobile-578x670.mp4 b/preview/contents/assets/videos/mobile-578x670.mp4 new file mode 100644 index 0000000..a673055 Binary files /dev/null and b/preview/contents/assets/videos/mobile-578x670.mp4 differ diff --git a/preview/contents/assets/videos/mobile-578x670.webm b/preview/contents/assets/videos/mobile-578x670.webm new file mode 100644 index 0000000..5c725b6 Binary files /dev/null and b/preview/contents/assets/videos/mobile-578x670.webm differ diff --git a/preview/contents/assets/videos/native-api-support-500x500.mp4 b/preview/contents/assets/videos/native-api-support-500x500.mp4 new file mode 100644 index 0000000..57963a6 Binary files /dev/null and b/preview/contents/assets/videos/native-api-support-500x500.mp4 differ diff --git a/preview/contents/assets/videos/native-api-support-500x500.webm b/preview/contents/assets/videos/native-api-support-500x500.webm new file mode 100644 index 0000000..b2e6095 Binary files /dev/null and b/preview/contents/assets/videos/native-api-support-500x500.webm differ diff --git a/preview/contents/assets/videos/one-code-many-platforms-1200x406.mp4 b/preview/contents/assets/videos/one-code-many-platforms-1200x406.mp4 new file mode 100644 index 0000000..793a91b Binary files /dev/null and b/preview/contents/assets/videos/one-code-many-platforms-1200x406.mp4 differ diff --git a/preview/contents/assets/videos/one-code-many-platforms-1200x406.webm b/preview/contents/assets/videos/one-code-many-platforms-1200x406.webm new file mode 100644 index 0000000..e41c7c4 Binary files /dev/null and b/preview/contents/assets/videos/one-code-many-platforms-1200x406.webm differ diff --git a/preview/contents/assets/videos/scalable-sync-1200x406.mp4 b/preview/contents/assets/videos/scalable-sync-1200x406.mp4 new file mode 100644 index 0000000..915d727 Binary files /dev/null and b/preview/contents/assets/videos/scalable-sync-1200x406.mp4 differ diff --git a/preview/contents/assets/videos/scalable-sync-1200x406.webm b/preview/contents/assets/videos/scalable-sync-1200x406.webm new file mode 100644 index 0000000..9bb1ea9 Binary files /dev/null and b/preview/contents/assets/videos/scalable-sync-1200x406.webm differ diff --git a/preview/contents/assets/videos/superman-500x500.mp4 b/preview/contents/assets/videos/superman-500x500.mp4 new file mode 100644 index 0000000..085f328 Binary files /dev/null and b/preview/contents/assets/videos/superman-500x500.mp4 differ diff --git a/preview/contents/assets/videos/superman-500x500.webm b/preview/contents/assets/videos/superman-500x500.webm new file mode 100644 index 0000000..7386423 Binary files /dev/null and b/preview/contents/assets/videos/superman-500x500.webm differ diff --git a/preview/contents/assets/videos/train-1200x406.mp4 b/preview/contents/assets/videos/train-1200x406.mp4 new file mode 100644 index 0000000..e07caf4 Binary files /dev/null and b/preview/contents/assets/videos/train-1200x406.mp4 differ diff --git a/preview/contents/assets/videos/train-1200x406.webm b/preview/contents/assets/videos/train-1200x406.webm new file mode 100644 index 0000000..77a0b3d Binary files /dev/null and b/preview/contents/assets/videos/train-1200x406.webm differ diff --git a/preview/contents/cli-intro.html b/preview/contents/cli-intro.html new file mode 100644 index 0000000..e8d4f44 --- /dev/null +++ b/preview/contents/cli-intro.html @@ -0,0 +1,42 @@ +CLIリファレンス
+

CLIリファレンス

+ + +

Couchbase Serverコマンドラインインタフェース(CLI) ツールはクラスタ、サーバ、vBuckets、XDCRなどの管理や監視を提供します。

+ +

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/enterprise-edition.html b/preview/contents/enterprise-edition.html new file mode 100644 index 0000000..7e5c274 --- /dev/null +++ b/preview/contents/enterprise-edition.html @@ -0,0 +1,34 @@ +エンタープライズエディションの機能
+

エンタープライズエディションの機能

+ + +

+ いくつかの機能は、Couchbase Server 3.0エンタープライズエディションでのみ利用可能です。 +

+ +
エンタープライズエディションでのみ利用可能な機能は以下の通りです: + + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/images/BP-02.png b/preview/contents/images/BP-02.png new file mode 100644 index 0000000..b543d89 Binary files /dev/null and b/preview/contents/images/BP-02.png differ diff --git a/preview/contents/images/BP_security1.png b/preview/contents/images/BP_security1.png new file mode 100644 index 0000000..cd127e7 Binary files /dev/null and b/preview/contents/images/BP_security1.png differ diff --git a/preview/contents/images/CreateGroup.png b/preview/contents/images/CreateGroup.png new file mode 100644 index 0000000..6ec789f Binary files /dev/null and b/preview/contents/images/CreateGroup.png differ diff --git a/preview/contents/images/EditGroup.png b/preview/contents/images/EditGroup.png new file mode 100644 index 0000000..4820de0 Binary files /dev/null and b/preview/contents/images/EditGroup.png differ diff --git a/preview/contents/images/NewServer.png b/preview/contents/images/NewServer.png new file mode 100644 index 0000000..05a5773 Binary files /dev/null and b/preview/contents/images/NewServer.png differ diff --git a/preview/contents/images/RZAServerIN.png b/preview/contents/images/RZAServerIN.png new file mode 100644 index 0000000..74fdd63 Binary files /dev/null and b/preview/contents/images/RZAServerIN.png differ diff --git a/preview/contents/images/RZAServerOUT.png b/preview/contents/images/RZAServerOUT.png new file mode 100644 index 0000000..8255020 Binary files /dev/null and b/preview/contents/images/RZAServerOUT.png differ diff --git a/preview/contents/images/RZASimple.png b/preview/contents/images/RZASimple.png new file mode 100644 index 0000000..08bf079 Binary files /dev/null and b/preview/contents/images/RZASimple.png differ diff --git a/preview/contents/images/XDCR_xmem.png b/preview/contents/images/XDCR_xmem.png new file mode 100644 index 0000000..d9ce387 Binary files /dev/null and b/preview/contents/images/XDCR_xmem.png differ diff --git a/preview/contents/images/add-server.png b/preview/contents/images/add-server.png new file mode 100644 index 0000000..056fb31 Binary files /dev/null and b/preview/contents/images/add-server.png differ diff --git a/preview/contents/images/admin-access-control.png b/preview/contents/images/admin-access-control.png new file mode 100644 index 0000000..8303d35 Binary files /dev/null and b/preview/contents/images/admin-access-control.png differ diff --git a/preview/contents/images/admin-readOnly.png b/preview/contents/images/admin-readOnly.png new file mode 100644 index 0000000..0b2cbc9 Binary files /dev/null and b/preview/contents/images/admin-readOnly.png differ diff --git a/preview/contents/images/admin-tasks-pending-rebalance.png b/preview/contents/images/admin-tasks-pending-rebalance.png new file mode 100644 index 0000000..813e2c1 Binary files /dev/null and b/preview/contents/images/admin-tasks-pending-rebalance.png differ diff --git a/preview/contents/images/admin-tasks-rebalance-add-button.png b/preview/contents/images/admin-tasks-rebalance-add-button.png new file mode 100644 index 0000000..df2a159 Binary files /dev/null and b/preview/contents/images/admin-tasks-rebalance-add-button.png differ diff --git a/preview/contents/images/admin-tasks-rebalance-add-console.png b/preview/contents/images/admin-tasks-rebalance-add-console.png new file mode 100644 index 0000000..0c2f2a6 Binary files /dev/null and b/preview/contents/images/admin-tasks-rebalance-add-console.png differ diff --git a/preview/contents/images/admin-tasks-rebalance-add-setup.png b/preview/contents/images/admin-tasks-rebalance-add-setup.png new file mode 100644 index 0000000..a95b85f Binary files /dev/null and b/preview/contents/images/admin-tasks-rebalance-add-setup.png differ diff --git a/preview/contents/images/admin-tasks-rebalance-node-added.png b/preview/contents/images/admin-tasks-rebalance-node-added.png new file mode 100644 index 0000000..f928eaa Binary files /dev/null and b/preview/contents/images/admin-tasks-rebalance-node-added.png differ diff --git a/preview/contents/images/backup-combined-incremental.jpg b/preview/contents/images/backup-combined-incremental.jpg new file mode 100644 index 0000000..4aefc83 Binary files /dev/null and b/preview/contents/images/backup-combined-incremental.jpg differ diff --git a/preview/contents/images/backup-cumulative-incremental.jpg b/preview/contents/images/backup-cumulative-incremental.jpg new file mode 100644 index 0000000..b44aae7 Binary files /dev/null and b/preview/contents/images/backup-cumulative-incremental.jpg differ diff --git a/preview/contents/images/backup-differential-incremental.jpg b/preview/contents/images/backup-differential-incremental.jpg new file mode 100644 index 0000000..a4f1051 Binary files /dev/null and b/preview/contents/images/backup-differential-incremental.jpg differ diff --git a/preview/contents/images/cb_rec_multi_failure.png b/preview/contents/images/cb_rec_multi_failure.png new file mode 100644 index 0000000..8bbc99f Binary files /dev/null and b/preview/contents/images/cb_rec_multi_failure.png differ diff --git a/preview/contents/images/cb_recovery1b.png b/preview/contents/images/cb_recovery1b.png new file mode 100644 index 0000000..fdb9b98 Binary files /dev/null and b/preview/contents/images/cb_recovery1b.png differ diff --git a/preview/contents/images/cb_recovery2.png b/preview/contents/images/cb_recovery2.png new file mode 100644 index 0000000..5db5e07 Binary files /dev/null and b/preview/contents/images/cb_recovery2.png differ diff --git a/preview/contents/images/cbrec_monitor_vbucks.png b/preview/contents/images/cbrec_monitor_vbucks.png new file mode 100644 index 0000000..dc5f65b Binary files /dev/null and b/preview/contents/images/cbrec_monitor_vbucks.png differ diff --git a/preview/contents/images/cbrecovery_3b.png b/preview/contents/images/cbrecovery_3b.png new file mode 100644 index 0000000..093c687 Binary files /dev/null and b/preview/contents/images/cbrecovery_3b.png differ diff --git a/preview/contents/images/cbrecovery_diff_replicas.png b/preview/contents/images/cbrecovery_diff_replicas.png new file mode 100644 index 0000000..ea6598e Binary files /dev/null and b/preview/contents/images/cbrecovery_diff_replicas.png differ diff --git a/preview/contents/images/cluster-overview.png b/preview/contents/images/cluster-overview.png new file mode 100644 index 0000000..eff1c86 Binary files /dev/null and b/preview/contents/images/cluster-overview.png differ diff --git a/preview/contents/images/configure_server1.png b/preview/contents/images/configure_server1.png new file mode 100644 index 0000000..82ac1e6 Binary files /dev/null and b/preview/contents/images/configure_server1.png differ diff --git a/preview/contents/images/couchbase-060711-1157-32_img_279.jpg b/preview/contents/images/couchbase-060711-1157-32_img_279.jpg new file mode 100644 index 0000000..c7d2891 Binary files /dev/null and b/preview/contents/images/couchbase-060711-1157-32_img_279.jpg differ diff --git a/preview/contents/images/couchbase-060711-1157-32_img_280.jpg b/preview/contents/images/couchbase-060711-1157-32_img_280.jpg new file mode 100644 index 0000000..3c4b782 Binary files /dev/null and b/preview/contents/images/couchbase-060711-1157-32_img_280.jpg differ diff --git a/preview/contents/images/couchbase-060711-1157-32_img_281.jpg b/preview/contents/images/couchbase-060711-1157-32_img_281.jpg new file mode 100644 index 0000000..75308a6 Binary files /dev/null and b/preview/contents/images/couchbase-060711-1157-32_img_281.jpg differ diff --git a/preview/contents/images/couchbase-060711-1157-32_img_300.jpg b/preview/contents/images/couchbase-060711-1157-32_img_300.jpg new file mode 100644 index 0000000..9ef9597 Binary files /dev/null and b/preview/contents/images/couchbase-060711-1157-32_img_300.jpg differ diff --git a/preview/contents/images/create-cluster-reference.png b/preview/contents/images/create-cluster-reference.png new file mode 100644 index 0000000..e12200c Binary files /dev/null and b/preview/contents/images/create-cluster-reference.png differ diff --git a/preview/contents/images/create_rep_xdcr_advance2.2.png b/preview/contents/images/create_rep_xdcr_advance2.2.png new file mode 100644 index 0000000..ec4597c Binary files /dev/null and b/preview/contents/images/create_rep_xdcr_advance2.2.png differ diff --git a/preview/contents/images/create_xdcr_rep2.2.png b/preview/contents/images/create_xdcr_rep2.2.png new file mode 100644 index 0000000..877fb52 Binary files /dev/null and b/preview/contents/images/create_xdcr_rep2.2.png differ diff --git a/preview/contents/images/custom-reduce.png b/preview/contents/images/custom-reduce.png new file mode 100644 index 0000000..355d40b Binary files /dev/null and b/preview/contents/images/custom-reduce.png differ diff --git a/preview/contents/images/custom-rereduce.png b/preview/contents/images/custom-rereduce.png new file mode 100644 index 0000000..a1e9731 Binary files /dev/null and b/preview/contents/images/custom-rereduce.png differ diff --git a/preview/contents/images/health-report-alerts.png b/preview/contents/images/health-report-alerts.png new file mode 100644 index 0000000..1efa0a6 Binary files /dev/null and b/preview/contents/images/health-report-alerts.png differ diff --git a/preview/contents/images/health-report-cluster-overview.png b/preview/contents/images/health-report-cluster-overview.png new file mode 100644 index 0000000..f69c757 Binary files /dev/null and b/preview/contents/images/health-report-cluster-overview.png differ diff --git a/preview/contents/images/health-report-header.png b/preview/contents/images/health-report-header.png new file mode 100644 index 0000000..166ce7d Binary files /dev/null and b/preview/contents/images/health-report-header.png differ diff --git a/preview/contents/images/health-report-warnings.png b/preview/contents/images/health-report-warnings.png new file mode 100644 index 0000000..8bfda45 Binary files /dev/null and b/preview/contents/images/health-report-warnings.png differ diff --git a/preview/contents/images/hostname_add_node.png b/preview/contents/images/hostname_add_node.png new file mode 100644 index 0000000..73fb290 Binary files /dev/null and b/preview/contents/images/hostname_add_node.png differ diff --git a/preview/contents/images/inbound_xdcr_web_console.png b/preview/contents/images/inbound_xdcr_web_console.png new file mode 100644 index 0000000..e60ed91 Binary files /dev/null and b/preview/contents/images/inbound_xdcr_web_console.png differ diff --git a/preview/contents/images/init-default-bucket-settings.png b/preview/contents/images/init-default-bucket-settings.png new file mode 100644 index 0000000..522ab95 Binary files /dev/null and b/preview/contents/images/init-default-bucket-settings.png differ diff --git a/preview/contents/images/intra_cluster_repl.png b/preview/contents/images/intra_cluster_repl.png new file mode 100644 index 0000000..8272d00 Binary files /dev/null and b/preview/contents/images/intra_cluster_repl.png differ diff --git a/preview/contents/images/macosx-menubar.png b/preview/contents/images/macosx-menubar.png new file mode 100644 index 0000000..0d60acf Binary files /dev/null and b/preview/contents/images/macosx-menubar.png differ diff --git a/preview/contents/images/manage-nodes.png b/preview/contents/images/manage-nodes.png new file mode 100644 index 0000000..4fa1c4b Binary files /dev/null and b/preview/contents/images/manage-nodes.png differ diff --git a/preview/contents/images/monitor_cb_recovery.png b/preview/contents/images/monitor_cb_recovery.png new file mode 100644 index 0000000..9a30f9c Binary files /dev/null and b/preview/contents/images/monitor_cb_recovery.png differ diff --git a/preview/contents/images/monitor_optmized_xdcr.png b/preview/contents/images/monitor_optmized_xdcr.png new file mode 100644 index 0000000..c0fac20 Binary files /dev/null and b/preview/contents/images/monitor_optmized_xdcr.png differ diff --git a/preview/contents/images/mrw_bucket_edit_warning.png b/preview/contents/images/mrw_bucket_edit_warning.png new file mode 100644 index 0000000..e4863ca Binary files /dev/null and b/preview/contents/images/mrw_bucket_edit_warning.png differ diff --git a/preview/contents/images/mrw_bucket_ready2.png b/preview/contents/images/mrw_bucket_ready2.png new file mode 100644 index 0000000..a4bb738 Binary files /dev/null and b/preview/contents/images/mrw_bucket_ready2.png differ diff --git a/preview/contents/images/mrw_bucket_warmup.png b/preview/contents/images/mrw_bucket_warmup.png new file mode 100644 index 0000000..41296a0 Binary files /dev/null and b/preview/contents/images/mrw_bucket_warmup.png differ diff --git a/preview/contents/images/mrw_create_bucket.png b/preview/contents/images/mrw_create_bucket.png new file mode 100644 index 0000000..1a9d689 Binary files /dev/null and b/preview/contents/images/mrw_create_bucket.png differ diff --git a/preview/contents/images/mrw_edit_bucket.png b/preview/contents/images/mrw_edit_bucket.png new file mode 100644 index 0000000..caf08a6 Binary files /dev/null and b/preview/contents/images/mrw_edit_bucket.png differ diff --git a/preview/contents/images/mrw_setting_panel.png b/preview/contents/images/mrw_setting_panel.png new file mode 100644 index 0000000..476cbc9 Binary files /dev/null and b/preview/contents/images/mrw_setting_panel.png differ diff --git a/preview/contents/images/multi-instance.png b/preview/contents/images/multi-instance.png new file mode 100644 index 0000000..52e48ef Binary files /dev/null and b/preview/contents/images/multi-instance.png differ diff --git a/preview/contents/images/outbound_xdcr_2.2.png b/preview/contents/images/outbound_xdcr_2.2.png new file mode 100644 index 0000000..661a620 Binary files /dev/null and b/preview/contents/images/outbound_xdcr_2.2.png differ diff --git a/preview/contents/images/post-failover-log-lost-data.png b/preview/contents/images/post-failover-log-lost-data.png new file mode 100644 index 0000000..df3dc2b Binary files /dev/null and b/preview/contents/images/post-failover-log-lost-data.png differ diff --git a/preview/contents/images/rack-aware-apply.png b/preview/contents/images/rack-aware-apply.png new file mode 100644 index 0000000..1512b1f Binary files /dev/null and b/preview/contents/images/rack-aware-apply.png differ diff --git a/preview/contents/images/rack-aware-groups.png b/preview/contents/images/rack-aware-groups.png new file mode 100644 index 0000000..850d814 Binary files /dev/null and b/preview/contents/images/rack-aware-groups.png differ diff --git a/preview/contents/images/rack-aware-groups2.png b/preview/contents/images/rack-aware-groups2.png new file mode 100644 index 0000000..fd85f61 Binary files /dev/null and b/preview/contents/images/rack-aware-groups2.png differ diff --git a/preview/contents/images/ram-quotas.png b/preview/contents/images/ram-quotas.png new file mode 100644 index 0000000..f424581 Binary files /dev/null and b/preview/contents/images/ram-quotas.png differ diff --git a/preview/contents/images/read_only_created.png b/preview/contents/images/read_only_created.png new file mode 100644 index 0000000..d6957ba Binary files /dev/null and b/preview/contents/images/read_only_created.png differ diff --git a/preview/contents/images/read_only_setup.png b/preview/contents/images/read_only_setup.png new file mode 100644 index 0000000..b9bda17 Binary files /dev/null and b/preview/contents/images/read_only_setup.png differ diff --git a/preview/contents/images/rebalance_detail_report.png b/preview/contents/images/rebalance_detail_report.png new file mode 100644 index 0000000..a40f32b Binary files /dev/null and b/preview/contents/images/rebalance_detail_report.png differ diff --git a/preview/contents/images/replica_backoff.png b/preview/contents/images/replica_backoff.png new file mode 100644 index 0000000..aa0be9d Binary files /dev/null and b/preview/contents/images/replica_backoff.png differ diff --git a/preview/contents/images/rightscale-workflow.png b/preview/contents/images/rightscale-workflow.png new file mode 100644 index 0000000..d850d91 Binary files /dev/null and b/preview/contents/images/rightscale-workflow.png differ diff --git a/preview/contents/images/sharedthreadpool_DCP.png b/preview/contents/images/sharedthreadpool_DCP.png new file mode 100644 index 0000000..d5c6ea3 Binary files /dev/null and b/preview/contents/images/sharedthreadpool_DCP.png differ diff --git a/preview/contents/images/stop_cbrecovery.png b/preview/contents/images/stop_cbrecovery.png new file mode 100644 index 0000000..071ba15 Binary files /dev/null and b/preview/contents/images/stop_cbrecovery.png differ diff --git a/preview/contents/images/stream-based-views.png b/preview/contents/images/stream-based-views.png new file mode 100644 index 0000000..e34ce4c Binary files /dev/null and b/preview/contents/images/stream-based-views.png differ diff --git a/preview/contents/images/streambased_XDCR.png b/preview/contents/images/streambased_XDCR.png new file mode 100644 index 0000000..70acfb7 Binary files /dev/null and b/preview/contents/images/streambased_XDCR.png differ diff --git a/preview/contents/images/threads_read_write.png b/preview/contents/images/threads_read_write.png new file mode 100644 index 0000000..6b65119 Binary files /dev/null and b/preview/contents/images/threads_read_write.png differ diff --git a/preview/contents/images/tunable_memory.png b/preview/contents/images/tunable_memory.png new file mode 100644 index 0000000..24f33cf Binary files /dev/null and b/preview/contents/images/tunable_memory.png differ diff --git a/preview/contents/images/ui-bucket-config.png b/preview/contents/images/ui-bucket-config.png new file mode 100644 index 0000000..2fafa3d Binary files /dev/null and b/preview/contents/images/ui-bucket-config.png differ diff --git a/preview/contents/images/ui-bucket-metadata.png b/preview/contents/images/ui-bucket-metadata.png new file mode 100644 index 0000000..f6a007d Binary files /dev/null and b/preview/contents/images/ui-bucket-metadata.png differ diff --git a/preview/contents/images/ui-dcp-queues.png b/preview/contents/images/ui-dcp-queues.png new file mode 100644 index 0000000..9b4491e Binary files /dev/null and b/preview/contents/images/ui-dcp-queues.png differ diff --git a/preview/contents/images/ui-delta-rebalance-not-available.png b/preview/contents/images/ui-delta-rebalance-not-available.png new file mode 100644 index 0000000..8854af5 Binary files /dev/null and b/preview/contents/images/ui-delta-rebalance-not-available.png differ diff --git a/preview/contents/images/ui-delta-recovery-pending.png b/preview/contents/images/ui-delta-recovery-pending.png new file mode 100644 index 0000000..1fffb20 Binary files /dev/null and b/preview/contents/images/ui-delta-recovery-pending.png differ diff --git a/preview/contents/images/ui-delta-recovery.png b/preview/contents/images/ui-delta-recovery.png new file mode 100644 index 0000000..089cf58 Binary files /dev/null and b/preview/contents/images/ui-delta-recovery.png differ diff --git a/preview/contents/images/ui-failover-pending-removal.png b/preview/contents/images/ui-failover-pending-removal.png new file mode 100644 index 0000000..cf78fa2 Binary files /dev/null and b/preview/contents/images/ui-failover-pending-removal.png differ diff --git a/preview/contents/images/ui-log-collect-info.png b/preview/contents/images/ui-log-collect-info.png new file mode 100644 index 0000000..28bad2d Binary files /dev/null and b/preview/contents/images/ui-log-collect-info.png differ diff --git a/preview/contents/images/ui-log-log.png b/preview/contents/images/ui-log-log.png new file mode 100644 index 0000000..7e7c1d1 Binary files /dev/null and b/preview/contents/images/ui-log-log.png differ diff --git a/preview/contents/images/ui-node-failover-options.png b/preview/contents/images/ui-node-failover-options.png new file mode 100644 index 0000000..6629688 Binary files /dev/null and b/preview/contents/images/ui-node-failover-options.png differ diff --git a/preview/contents/images/ui-rebalance-failed.png b/preview/contents/images/ui-rebalance-failed.png new file mode 100644 index 0000000..7e3c641 Binary files /dev/null and b/preview/contents/images/ui-rebalance-failed.png differ diff --git a/preview/contents/images/ui-settings-cluster-name.png b/preview/contents/images/ui-settings-cluster-name.png new file mode 100644 index 0000000..0f3191b Binary files /dev/null and b/preview/contents/images/ui-settings-cluster-name.png differ diff --git a/preview/contents/images/ui-settings-cluster-tab.png b/preview/contents/images/ui-settings-cluster-tab.png new file mode 100644 index 0000000..1ea35fb Binary files /dev/null and b/preview/contents/images/ui-settings-cluster-tab.png differ diff --git a/preview/contents/images/ui-settings.png b/preview/contents/images/ui-settings.png new file mode 100644 index 0000000..593bb60 Binary files /dev/null and b/preview/contents/images/ui-settings.png differ diff --git a/preview/contents/images/ui-ssl-ip.png b/preview/contents/images/ui-ssl-ip.png new file mode 100644 index 0000000..e7cf49e Binary files /dev/null and b/preview/contents/images/ui-ssl-ip.png differ diff --git a/preview/contents/images/ui-xdcr-panel.png b/preview/contents/images/ui-xdcr-panel.png new file mode 100644 index 0000000..49f96cf Binary files /dev/null and b/preview/contents/images/ui-xdcr-panel.png differ diff --git a/preview/contents/images/ui-xdcr-pause1.png b/preview/contents/images/ui-xdcr-pause1.png new file mode 100644 index 0000000..1e4d5e5 Binary files /dev/null and b/preview/contents/images/ui-xdcr-pause1.png differ diff --git a/preview/contents/images/ui-xdcr-pause2.png b/preview/contents/images/ui-xdcr-pause2.png new file mode 100644 index 0000000..ef8db55 Binary files /dev/null and b/preview/contents/images/ui-xdcr-pause2.png differ diff --git a/preview/contents/images/upgrade_disk_write_zero.png b/preview/contents/images/upgrade_disk_write_zero.png new file mode 100644 index 0000000..65f303c Binary files /dev/null and b/preview/contents/images/upgrade_disk_write_zero.png differ diff --git a/preview/contents/images/vbuckets-after.png b/preview/contents/images/vbuckets-after.png new file mode 100644 index 0000000..5d13504 Binary files /dev/null and b/preview/contents/images/vbuckets-after.png differ diff --git a/preview/contents/images/vbuckets.png b/preview/contents/images/vbuckets.png new file mode 100644 index 0000000..c132ecd Binary files /dev/null and b/preview/contents/images/vbuckets.png differ diff --git a/preview/contents/images/view-building.png b/preview/contents/images/view-building.png new file mode 100644 index 0000000..cddb438 Binary files /dev/null and b/preview/contents/images/view-building.png differ diff --git a/preview/contents/images/view-types-datastore.png b/preview/contents/images/view-types-datastore.png new file mode 100644 index 0000000..417afdd Binary files /dev/null and b/preview/contents/images/view-types-datastore.png differ diff --git a/preview/contents/images/view-types-workflow.png b/preview/contents/images/view-types-workflow.png new file mode 100644 index 0000000..0323a02 Binary files /dev/null and b/preview/contents/images/view-types-workflow.png differ diff --git a/preview/contents/images/views-basic-overview-missing.png b/preview/contents/images/views-basic-overview-missing.png new file mode 100644 index 0000000..1a64240 Binary files /dev/null and b/preview/contents/images/views-basic-overview-missing.png differ diff --git a/preview/contents/images/views-basic-overview.png b/preview/contents/images/views-basic-overview.png new file mode 100644 index 0000000..e40786f Binary files /dev/null and b/preview/contents/images/views-basic-overview.png differ diff --git a/preview/contents/images/views-detail.png b/preview/contents/images/views-detail.png new file mode 100644 index 0000000..ad6a2aa Binary files /dev/null and b/preview/contents/images/views-detail.png differ diff --git a/preview/contents/images/views-editing.png b/preview/contents/images/views-editing.png new file mode 100644 index 0000000..f965781 Binary files /dev/null and b/preview/contents/images/views-editing.png differ diff --git a/preview/contents/images/views-filters.png b/preview/contents/images/views-filters.png new file mode 100644 index 0000000..c31da29 Binary files /dev/null and b/preview/contents/images/views-filters.png differ diff --git a/preview/contents/images/views-grouping.png b/preview/contents/images/views-grouping.png new file mode 100644 index 0000000..586f61a Binary files /dev/null and b/preview/contents/images/views-grouping.png differ diff --git a/preview/contents/images/views-overview.png b/preview/contents/images/views-overview.png new file mode 100644 index 0000000..f49c36a Binary files /dev/null and b/preview/contents/images/views-overview.png differ diff --git a/preview/contents/images/views-query-flow.png b/preview/contents/images/views-query-flow.png new file mode 100644 index 0000000..66a6dcd Binary files /dev/null and b/preview/contents/images/views-query-flow.png differ diff --git a/preview/contents/images/views-stale-sequence-stale.png b/preview/contents/images/views-stale-sequence-stale.png new file mode 100644 index 0000000..53b8314 Binary files /dev/null and b/preview/contents/images/views-stale-sequence-stale.png differ diff --git a/preview/contents/images/views-stale-sequence-updateafter.png b/preview/contents/images/views-stale-sequence-updateafter.png new file mode 100644 index 0000000..235f053 Binary files /dev/null and b/preview/contents/images/views-stale-sequence-updateafter.png differ diff --git a/preview/contents/images/views-stale-sequence-updatebefore.png b/preview/contents/images/views-stale-sequence-updatebefore.png new file mode 100644 index 0000000..787c4c8 Binary files /dev/null and b/preview/contents/images/views-stale-sequence-updatebefore.png differ diff --git a/preview/contents/images/views_replica.png b/preview/contents/images/views_replica.png new file mode 100644 index 0000000..478447a Binary files /dev/null and b/preview/contents/images/views_replica.png differ diff --git a/preview/contents/images/web-console-bucket-info.png b/preview/contents/images/web-console-bucket-info.png new file mode 100644 index 0000000..66ce131 Binary files /dev/null and b/preview/contents/images/web-console-bucket-info.png differ diff --git a/preview/contents/images/web-console-cluster-overview-buckets.png b/preview/contents/images/web-console-cluster-overview-buckets.png new file mode 100644 index 0000000..d471e89 Binary files /dev/null and b/preview/contents/images/web-console-cluster-overview-buckets.png differ diff --git a/preview/contents/images/web-console-cluster-overview-cluster.png b/preview/contents/images/web-console-cluster-overview-cluster.png new file mode 100644 index 0000000..56a3bae Binary files /dev/null and b/preview/contents/images/web-console-cluster-overview-cluster.png differ diff --git a/preview/contents/images/web-console-cluster-overview-servers.png b/preview/contents/images/web-console-cluster-overview-servers.png new file mode 100644 index 0000000..2e879cd Binary files /dev/null and b/preview/contents/images/web-console-cluster-overview-servers.png differ diff --git a/preview/contents/images/web-console-cluster-overview.png b/preview/contents/images/web-console-cluster-overview.png new file mode 100644 index 0000000..27d1dee Binary files /dev/null and b/preview/contents/images/web-console-cluster-overview.png differ diff --git a/preview/contents/images/web-console-data-buckets-overview.png b/preview/contents/images/web-console-data-buckets-overview.png new file mode 100644 index 0000000..f377363 Binary files /dev/null and b/preview/contents/images/web-console-data-buckets-overview.png differ diff --git a/preview/contents/images/web-console-document-create.png b/preview/contents/images/web-console-document-create.png new file mode 100644 index 0000000..bc78a95 Binary files /dev/null and b/preview/contents/images/web-console-document-create.png differ diff --git a/preview/contents/images/web-console-document-edit.png b/preview/contents/images/web-console-document-edit.png new file mode 100644 index 0000000..7687267 Binary files /dev/null and b/preview/contents/images/web-console-document-edit.png differ diff --git a/preview/contents/images/web-console-document-list.png b/preview/contents/images/web-console-document-list.png new file mode 100644 index 0000000..5f0f7df Binary files /dev/null and b/preview/contents/images/web-console-document-list.png differ diff --git a/preview/contents/images/web-console-server-individual.png b/preview/contents/images/web-console-server-individual.png new file mode 100644 index 0000000..46144f4 Binary files /dev/null and b/preview/contents/images/web-console-server-individual.png differ diff --git a/preview/contents/images/web-console-server-node.png b/preview/contents/images/web-console-server-node.png new file mode 100644 index 0000000..b4007b0 Binary files /dev/null and b/preview/contents/images/web-console-server-node.png differ diff --git a/preview/contents/images/web-console-server-settings-account-mgmt.png b/preview/contents/images/web-console-server-settings-account-mgmt.png new file mode 100644 index 0000000..40df27b Binary files /dev/null and b/preview/contents/images/web-console-server-settings-account-mgmt.png differ diff --git a/preview/contents/images/web-console-server-settings-alerts.png b/preview/contents/images/web-console-server-settings-alerts.png new file mode 100644 index 0000000..7625706 Binary files /dev/null and b/preview/contents/images/web-console-server-settings-alerts.png differ diff --git a/preview/contents/images/web-console-server-settings-autocompaction.png b/preview/contents/images/web-console-server-settings-autocompaction.png new file mode 100644 index 0000000..f05d146 Binary files /dev/null and b/preview/contents/images/web-console-server-settings-autocompaction.png differ diff --git a/preview/contents/images/web-console-server-settings-autofailover.png b/preview/contents/images/web-console-server-settings-autofailover.png new file mode 100644 index 0000000..a4b6194 Binary files /dev/null and b/preview/contents/images/web-console-server-settings-autofailover.png differ diff --git a/preview/contents/images/web-console-server-settings-sample-buckets.png b/preview/contents/images/web-console-server-settings-sample-buckets.png new file mode 100644 index 0000000..2acf045 Binary files /dev/null and b/preview/contents/images/web-console-server-settings-sample-buckets.png differ diff --git a/preview/contents/images/web-console-server-settings-update-notifications.png b/preview/contents/images/web-console-server-settings-update-notifications.png new file mode 100644 index 0000000..931e7bb Binary files /dev/null and b/preview/contents/images/web-console-server-settings-update-notifications.png differ diff --git a/preview/contents/images/web-console-server-specific.png b/preview/contents/images/web-console-server-specific.png new file mode 100644 index 0000000..5da4825 Binary files /dev/null and b/preview/contents/images/web-console-server-specific.png differ diff --git a/preview/contents/images/web-console-server-states-down.png b/preview/contents/images/web-console-server-states-down.png new file mode 100644 index 0000000..2e38e4c Binary files /dev/null and b/preview/contents/images/web-console-server-states-down.png differ diff --git a/preview/contents/images/web-console-server-states-pend.png b/preview/contents/images/web-console-server-states-pend.png new file mode 100644 index 0000000..f11eae9 Binary files /dev/null and b/preview/contents/images/web-console-server-states-pend.png differ diff --git a/preview/contents/images/web-console-server-stats-diskqueues.png b/preview/contents/images/web-console-server-stats-diskqueues.png new file mode 100644 index 0000000..1b86b13 Binary files /dev/null and b/preview/contents/images/web-console-server-stats-diskqueues.png differ diff --git a/preview/contents/images/web-console-server-stats-memcached.png b/preview/contents/images/web-console-server-stats-memcached.png new file mode 100644 index 0000000..22db614 Binary files /dev/null and b/preview/contents/images/web-console-server-stats-memcached.png differ diff --git a/preview/contents/images/web-console-server-stats-summary.png b/preview/contents/images/web-console-server-stats-summary.png new file mode 100644 index 0000000..cbcb3bd Binary files /dev/null and b/preview/contents/images/web-console-server-stats-summary.png differ diff --git a/preview/contents/images/web-console-server-stats-tapqueues.png b/preview/contents/images/web-console-server-stats-tapqueues.png new file mode 100644 index 0000000..9b31333 Binary files /dev/null and b/preview/contents/images/web-console-server-stats-tapqueues.png differ diff --git a/preview/contents/images/web-console-server-stats-vbucket.png b/preview/contents/images/web-console-server-stats-vbucket.png new file mode 100644 index 0000000..accfb3d Binary files /dev/null and b/preview/contents/images/web-console-server-stats-vbucket.png differ diff --git a/preview/contents/images/web-console-server-stats-views.png b/preview/contents/images/web-console-server-stats-views.png new file mode 100644 index 0000000..d289cd1 Binary files /dev/null and b/preview/contents/images/web-console-server-stats-views.png differ diff --git a/preview/contents/images/web-console-server-summary.png b/preview/contents/images/web-console-server-summary.png new file mode 100644 index 0000000..160d8f4 Binary files /dev/null and b/preview/contents/images/web-console-server-summary.png differ diff --git a/preview/contents/images/web-console-startup-3.png b/preview/contents/images/web-console-startup-3.png new file mode 100644 index 0000000..76b7230 Binary files /dev/null and b/preview/contents/images/web-console-startup-3.png differ diff --git a/preview/contents/images/web-console-startup-7.png b/preview/contents/images/web-console-startup-7.png new file mode 100644 index 0000000..ad84425 Binary files /dev/null and b/preview/contents/images/web-console-startup-7.png differ diff --git a/preview/contents/images/windows_port_check.png b/preview/contents/images/windows_port_check.png new file mode 100644 index 0000000..c8a7105 Binary files /dev/null and b/preview/contents/images/windows_port_check.png differ diff --git a/preview/contents/images/windows_port_check2.png b/preview/contents/images/windows_port_check2.png new file mode 100644 index 0000000..324f96b Binary files /dev/null and b/preview/contents/images/windows_port_check2.png differ diff --git a/preview/contents/images/xdcr-cluster-monitor.png b/preview/contents/images/xdcr-cluster-monitor.png new file mode 100644 index 0000000..61bee32 Binary files /dev/null and b/preview/contents/images/xdcr-cluster-monitor.png differ diff --git a/preview/contents/images/xdcr-cluster-reference.png b/preview/contents/images/xdcr-cluster-reference.png new file mode 100644 index 0000000..b637fb7 Binary files /dev/null and b/preview/contents/images/xdcr-cluster-reference.png differ diff --git a/preview/contents/images/xdcr-errors-missing-vbuckets.png b/preview/contents/images/xdcr-errors-missing-vbuckets.png new file mode 100644 index 0000000..1293e07 Binary files /dev/null and b/preview/contents/images/xdcr-errors-missing-vbuckets.png differ diff --git a/preview/contents/images/xdcr-persistence.png b/preview/contents/images/xdcr-persistence.png new file mode 100644 index 0000000..82a3ac5 Binary files /dev/null and b/preview/contents/images/xdcr-persistence.png differ diff --git a/preview/contents/images/xdcr-remote-cert3.png b/preview/contents/images/xdcr-remote-cert3.png new file mode 100644 index 0000000..d85e8bb Binary files /dev/null and b/preview/contents/images/xdcr-remote-cert3.png differ diff --git a/preview/contents/images/xdcr-source-encrypt.png b/preview/contents/images/xdcr-source-encrypt.png new file mode 100644 index 0000000..58df2a5 Binary files /dev/null and b/preview/contents/images/xdcr-source-encrypt.png differ diff --git a/preview/contents/images/xdcr-ssl.png b/preview/contents/images/xdcr-ssl.png new file mode 100644 index 0000000..3d2eba2 Binary files /dev/null and b/preview/contents/images/xdcr-ssl.png differ diff --git a/preview/contents/images/xdcr-vpn-bgp.png b/preview/contents/images/xdcr-vpn-bgp.png new file mode 100644 index 0000000..d1ae423 Binary files /dev/null and b/preview/contents/images/xdcr-vpn-bgp.png differ diff --git a/preview/contents/images/xdcr-vpn-static.png b/preview/contents/images/xdcr-vpn-static.png new file mode 100644 index 0000000..0229d80 Binary files /dev/null and b/preview/contents/images/xdcr-vpn-static.png differ diff --git a/preview/contents/images/xdcr_1.png b/preview/contents/images/xdcr_1.png new file mode 100644 index 0000000..c1d0fc6 Binary files /dev/null and b/preview/contents/images/xdcr_1.png differ diff --git a/preview/contents/images/xdcr_advanced.png b/preview/contents/images/xdcr_advanced.png new file mode 100644 index 0000000..84336cb Binary files /dev/null and b/preview/contents/images/xdcr_advanced.png differ diff --git a/preview/contents/images/xdcr_conflict_res.png b/preview/contents/images/xdcr_conflict_res.png new file mode 100644 index 0000000..3d20e37 Binary files /dev/null and b/preview/contents/images/xdcr_conflict_res.png differ diff --git a/preview/contents/images/xdcr_ongoing.png b/preview/contents/images/xdcr_ongoing.png new file mode 100644 index 0000000..7ebe41b Binary files /dev/null and b/preview/contents/images/xdcr_ongoing.png differ diff --git a/preview/contents/images/xdcr_repl_chain.png b/preview/contents/images/xdcr_repl_chain.png new file mode 100644 index 0000000..f9cf2b5 Binary files /dev/null and b/preview/contents/images/xdcr_repl_chain.png differ diff --git a/preview/contents/images/xdcr_selective.png b/preview/contents/images/xdcr_selective.png new file mode 100644 index 0000000..1d8c5fc Binary files /dev/null and b/preview/contents/images/xdcr_selective.png differ diff --git a/preview/contents/install-intro.html b/preview/contents/install-intro.html new file mode 100644 index 0000000..8825e2a --- /dev/null +++ b/preview/contents/install-intro.html @@ -0,0 +1,36 @@ +インストールとアップグレード
+

インストールとアップグレード

+ + +

+ このガイドはCouchbase Serverのインストール要件、各種プラットフォームでのインストール、インストール後の設定、 + アップグレード、移行手順について解説します。 +

+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/rel-notes/rel-notes3.0.html b/preview/contents/rel-notes/rel-notes3.0.html new file mode 100644 index 0000000..cb57172 --- /dev/null +++ b/preview/contents/rel-notes/rel-notes3.0.html @@ -0,0 +1,1188 @@ +Release notes
+

Release notes

+ +
Couchbase Server 3.0 is a major release that extends Couchbase lead as the most + performant and scalable NoSQL database for mission critical enterprise applications. + In + addition to adding great new functionality for the enterprise, 3.0 delivers many new features + that make it easier for developers and administrators to work with Couchbase Server, making it + the best choice for your NoSQL projects.
+ + +
+

Release notes for 3.0.2

+ +
+

Couchbase Server 3.0.2, released in December 2014, is the second maintenance release for + Couchbase Server 3.0. This release further fortifies Couchbase Server 3.0 and includes some + critical bug fixes in the areas of database engine, performance, security, and server + operations. It also includes several bug fixes related to the Windows platform.

+ +

Fixed issues in 3.0.2

+ +

The following issues are fixed in the Couchbase Server 3.0.2 release.

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 IssueDescription
Couchbase bucket
 MB-12160When a key is locked, setWithMeta() is able to update the + key even when the set fails.
 MB-12305memcached was crashing during the online upgrade from the Couchbase Server version 2.5.0 to version 3.0.1.
 MB-12647gethrtime() implementation on Windows can cause requests to + store() with CAS to be incorrectly processed.
Performance  
 MB-12117Access log locks for heavy write workloads can cause performance + slowdowns.
 MB-12576Massive increase in disk write queue size on both SSD and HDD was + detected.
Security  
 MB-8872A number of CAPI REST API endpoints is not secured.
 MB-9890XDCR crash logs can sometimes have document contents.
 MB-10262Corrupted key in a data file rolls backwards to an earlier version, or + disappears without detection.
 MB-12288The XDCR-over-SSL proxy allows for a connection to any port on the + destination nodes.
 MB-12358Remove support for SSL v3 in ns_server SSL server sockets to mitigate against + the POODLE attack.
 MB-12655Configuration replication of certain per-node keys is broken after a node is + upgraded offline from 2.x to 3.0 and then added back to formerly 2.x cluster that + is now upgraded to 3.0.
 MB-12695Certain XDCR logging exposes remote cluster passwords.
Server operations  
 MB-11935Failed connections on port 11213 cause Unable to + listen errors and server restarts.
 MB-12156Race condition with time check when changing the data path may lead to + deletion of all buckets after adding a node to a cluster.
 MB-12382Offline cluster upgrade failed when upgrading from 2.0.1-170-rel to + 3.0.1-1422-rel.
 MB-12706In an XDCR environment, when add-delete-add operations are performed, the + second add operation fails when performed on temporary items.
Windows  
 MB-11611memcached.logs can grow large after the node failure and + bucket flush.
 MB-12091Compact files might not be cleaned up after compaction.
 MB-12247View engine failed to index documents in a query after the rebalance.
 MB-12371Incremental backup must not consume additional space with no + delta.
 MB-12483Online upgrade from 2.0.0 to 3.0.1 with a single bucket might + fail warmup.
 MB-12238An infinite timeout on the outgoing xmem + request might lead to XDCR hanging when there are + network or NAT issues.
+
+ + +
+ + +

Known issues in 3.0.2

+ + +

The following known issues are associated with Couchbase Server release 3.0.2.

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 IssueDescription
Security  
 MB-12359Remove support for SSL v3 in memcached SSL server sockets to mitigate against + the POODLE attack.
+
+ +
Note: Port scanners might detect that port 11207 + negotiates SSLv3. Upgrading to the latest 2.x client SDKs blocks pre-TLS + communication and reduces the risk of the POODLE bug.
+ +
+ +
+ +
+ + + + + +
+

Release notes for 3.0.1

+ +
+

Couchbase Server 3.0.1, released in October 2014, is the first maintenance release for + Couchbase Server 3.0. This release focuses on getting the system stability bugs fixed for + the Windows platform and providing general availability. In addition, this release includes + some critical bug fixes related to meta data corruption.

+ + + + +

Fixed issues in 3.0.1

+ +

The following issues are fixed in the Couchbase Server 3.0.1 release.

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 IssueDescription
Couchbase bucket
 MB-12197Bucket deletion failing with error 500 and reason: unknown + {"_":"Bucket deletion not yet complete, but will + continue."}
 MB-11955Could not recreate the default bucket after deleting it.
 MB-11934After warmup, fewer items are shown.
 MB-11804Memcached error #132 Internal error: Internal error for + vbucket... when set key to bucket.
Installation
 MB-12321New message box is thrown during the silent installation.
 MB-12135Once installation of the Couchbase Server is completed, it launches a console + page that opens with a blank page.
 MB-11567Failed to load Beer Sample in the initial setup.
Rebalance
 MB-12328Item flags are mangled during rebalance.
 MB-11948Simple test broken - Rebalance exited with the following reason: + unexpected_exit..{dcp_wait_for_data_move_failed,"default",254,..wrong_rebalancer_pid}}}
Upgrade
 MB-12425Bucket failed to restore after an offline upgrade from 2.0.0 to + 3.0.1.
 MB-12209The offline upgrade from 2.5.x to 3.0.1 failed.
 MB-11930All data was lost after an offline upgrade from 2.0.0 to 3.0.0.
Views
 MB-12138View query fails with the error 500 and reason: reason + {"error":"error","reason":"{index_builder_exit,89,<<>>}"}
+
+ +
+ + + + +

Known issues in 3.0.1

+ +

The following issues are associated with Couchbase Server release 3.0.1.

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 IssueDescription
Database operations  
 MB-12647In situations with high throughput (when the client is making multiple + parallel requests), or with very low network latency (such as when running on + localhost), there is a high probability that requests to + store() with CAS might incorrectly be processed on the Windows + Server due to the change in gethrtime() implementation. It is + recommended that Windows users stay on version 2.5.x, or wait for the next + maintenance release 3.0.2.
Performance  
 MB-12353Regression (from 2.5.1) in rebalance out with views and query + workload.
 MB-12349Regression (from 2.5.1) in rebalance after failover with views and query + workload.
 MB-12293Regression in 4 to 3 node rebalance out on the Windows 2012 Server.
Upgrade
 MB-12655Replication of certain per-node keys is broken after a node is first upgraded + offline from 2.x to 3.0 and then added back to the formerly 2.x cluster that is + now upgraded to 3.0.

Workaround: When performing an online upgrade from + Couchbase Server 2.x to 3.x, always fully delete the 2.x package (including the + config files) before installing the 3.x package.

+
 MB-12483Data lost with online upgrade from 2.0.0 to 3.0.1 and cluster reboot.
+
+ +
Note: Couchbase is working on known issues related to performance and upgrading + on the Windows platform. When upgrading to the Couchbase Server Windows 3.0.1 release, + test your applications extensively before upgrading. Couchbase also requires that you + upgrade to the latest available production version before upgrading to Couchbase Server + 3.0.1. For Enterprise Edition customers, that version is Couchbase Server 2.5.1. For + Community Edition users, that version is Couchbase Server 2.2.0.
+ +
+ + +
+ +
+ +
+

Release notes for 3.0.0

+ +
+

Couchbase Server 3.0, released in September 2014, includes many major new enhancements and + features:

+ + + +

Couchbase .NET incompatibility

+ +

An incompatibility between Microsoft Framework 4.0 or earlier, the Couchbase .NET SDK + 1.3.7 or earlier, and Couchbase Server 3.0 has been identified where the URL generated for + a View operation on the Couchbase bucket is improperly encoded. This causes view requests + to fail with the following message in the body:

+ +
"Design document not found, body: {"error":"not_found","reason":"missing"}"
+ +
+ +
Impact
+ +
The affected Microsoft .NET versions are 4.0 or earlier, Couchbase .NET SDK 1.3.7 or + earlier, and Couchbase Server 3.0 (including Beta) is >= 3.0.
+ +
Microsoft .NET version 4.5 changes the way Uri.ToString handles its + Unicode encoding, which resolves the issue. In this case, clients running on this + version or higher of the CLR are not impacted. Additionally, Couchbase Server 2.5 and + lower are not impacted.
Note: Couchbase .NET 1.3.8 has a patch that + resolves the issue for all versions of Couchbase Server and Microsoft .NET + Frameworks.
+ +
+ + + +
Workaround
+ +
In addition to the patch released with Couchbase .NET SDK version 1.3.8, add the + following element to your App.Config or Web.Config + to enable support for all SDK and Server versions:
<uri>
+    <iriParsing enabled="true"/>
+<uri>
+            
+ +

Customers who are not ready or cannot upgrade their Couchbase .NET SDKs to 1.3.8 or + greater are strongly advised to add this element to their deployments if they intend + to use the Couchbase .NET SDK with Couchbase Server 3.0 or greater.

+ +
+ + + +
References
+ +
https://connect.microsoft.com/VisualStudio/feedback/details/758479/system-uri-tostring-behaviour-change
+ + +
+ +
+ +

Views behavior change

+ +

The stale=false view query argument has been enhanced. It considers all + document changes that have been received at the time the query was received. This means it + is no longer needed to use the durability requirements or the Observe feature to block for + persistence in application code before issuing the stale=false stale + query. It is recommended that you remove all such application level checks after + completing the upgrade to the 3.0 release.

+ +
+ + +

Fixed issues in 3.0.0

+ +

There are many bugs fixed in the 3.0.0 release. Some of the notable fixes include the + following:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 IssueDescription
Couchbase bucket
 MB-10059Replica vbucket simply ignores the rev_seq values of new + items from the active vbucket.
 MB-11037High replication latency is observed due to the racing in pausing and + resuming of the TAP connection notifier.
 MB-11411Warmup with an access log always sets the loaded document's + rev-id to 1.
Views
 MB-10921File descriptor leak is detected in views with reduce.
 MB-11187V8 crashes on memory allocation errors and closes Erlang on some indexing + loads .
+
+ +
+ + + +

Known issues in 3.0.0

+ +

The following known issues are associated with Couchbase Server release 3.0.0:

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 IssueDescription
DCP/rebalance  
 MB-12226Rebalance operation hung during the online upgrade.
 MB-12125Rebalance swap regression of 39.3% when compared with release 2.5.1.
 MB-12124Rebalance after failover, 3 to 4 nodes regression of 54.9% when compared with + 2.5.1.
 MB-11642Intra-replication falling far behind under moderate to heavy workload when + XDCR is enabled on the small-scale hardware (for example, AWS instances).
Views
 MB-11917One node is slow, possibly due to the Erlang scheduler.
 MB-11589Sliding endseqno during initial index build or DCP reading + from disk snapshot results in longer stale=false query latency + and index start-up time.
+
+ +
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/rest-intro.html b/preview/contents/rest-intro.html new file mode 100644 index 0000000..0eb816b --- /dev/null +++ b/preview/contents/rest-intro.html @@ -0,0 +1,36 @@ +REST APIリファレンス
+

REST APIリファレンス

+ + +

Couchbase REST APIを使用するとCouchbaseサーバのデプロイメントの管理だけでなくデザインドキュメントの格納や、結果を参照する操作を実行できます。

+ +

+ +
+ +
\ No newline at end of file diff --git a/preview/contents/security/security-admin-access.html b/preview/contents/security/security-admin-access.html new file mode 100644 index 0000000..db800f3 --- /dev/null +++ b/preview/contents/security/security-admin-access.html @@ -0,0 +1,107 @@ +管理用アクセスの暗号化
+

管理用アクセスの暗号化

+ + +

+ Secure Socket Layer (SSL) 認証によるHTTPSアクセスを利用して、Couchbase WebコンソールとREST APIを利用した管理用アクセスを暗号化できます。 +

+ +
重要: 本機能はエンタープライズエディションのみで利用可能です。
+ +

+ Couchbase Serverのクライアントライブラリは、Secure Socket Layer (SSL)を利用したクライアントサイドの暗号化により、 + クライアントとサーバ間で転送されるデータの暗号化をサポートしています。 + リモートマシンとサーバ間でセキュアな接続を確立することができます。 +

+ + +

+ Couchbase Serverは最初のノードで自己署名の証明書を生成します、これはクラスタ内の各サーバに転送されます。 + 自己署名の証明書を再生成、更新した場合、セキュアなサーバ通信を再度確立する前に、これを再取得する必要があります。 + セキュアな接続はバケット単位ではなく、クラスタレベルで行われ、 + HTTPS REST専用のポート18091と、HTTPS CAPIポート18092を利用します。 +

+ +

セキュアな管理用アクセスを利用するWebブラウザの設定

+
    +
  1. + セキュアなチャネル(REST HTTPは18091、CAPI HTTPは18092)を経由してCouchbase Serverに接続します。 +
  2. + +
  3. 管理者のユーザ名とパスワードでログインします。
  4. + +
  5. ログインすると、URLはセキュアな接続であることを示します。 +

    + 次のURLはSafari Webブラウザでセキュアな接続を利用した場合の例です: +

    + +

    +

    + +
  6. + +
+ +
+ +

SSL証明書

+
-----BEGIN CERTIFICATE-----
+MIIC/jCCAeigAwIBAgIIE3jc9BofgigwCwYJKoZIhvcNAQEFMCQxIjAgBgNVBAMT
+GUNvdWNoYmFzZSBTZXJ2ZXIgOTRmYTE3YTUwHhcNMTMwMTAxMDAwMDAwWhcNNDkx
+MjMxMjM1OTU5WjAkMSIwIAYDVQQDExlDb3VjaGJhc2UgU2VydmVyIDk0ZmExN2E1
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxaaXsKm06xxzzYqejDAO
+3qW1x6vLz9jcLdZkNQgxGk4+/ulrfK4PSLHARf4vml8Ev3bcOzCwfyDCp2/TCSX0
+qDTn4iBRp9CJtxVyY/xqWkYkld+GGtj28P0CtZ1UKOHCRB7KInzxesxITg/a0vsL
+M8GrcwFpmZEJjeY7HGdUuBRcoMfm2Yn28drmr92SNSsz+npdfEFkQloYStqemOOG
+h1Jn7ldU5rBj/B2zcvh6guDXKKz/bMMeCTX84BmkG3rmiKQwxyizuxtYi5u1BthC
+X3aO58lC9uRMja1lA5TrJnZOCRT24G6VTh2bYhN98W6YmvF9l4ESDR4I7nE8E6Gt
+eQIDAQABozgwNjAOBgNVHQ8BAf8EBAMCAKQwEwYDVR0lBAwwCgYIKwYBBQUHAwEw
+DwYDVR0TAQH/BAUwAwEB/zALBgkqhkiG9w0BAQUDggEBAF0Bz2MpQoBEdOdDRix3
+j0/XGKjH7kI5zDFiOlUvANMeErVZf9kM8xqS7Yd3bCa2rjT1Y8BM3Sciurtrd/Cy
+iTVzpXjQOR/K1AFtiBtuNb2Hx5SXvgeW4p4uNmK74u1UUNmAyb3mwSQ+duuqK/Ef
+D4wTolPTZP5gcricyWI3qUCi3pTeCz/2jcAWn3DI4KVtlAsOy9sFFo4RxBDgmOuS
+klUAb8eu4e2XxcLJ++geYoum0VIKa3ygjpZ800PupwZZetjD8/6tfbYFuoBTXL+r
+27M9ArsOxkVbh3fDQ8b8qnr5sam1P7IfSzqq/Lq4vjh1mvred62zuJlMvY9KmNJU
+rqw=
+-----END CERTIFICATE-----
+
+ + +

RESTアクセスを暗号化

+

+ REST APIの、/pools/default/certificateにHTTP GETメソッドを利用してアクセスすると、 + SSLの自己署名証明書がクラスタから取得できます。 +

+ + +

curlを利用して証明書を取得する場合、以下のシンタックスを利用します:

+ +
curl –X GET  -u adminName:adminPassword
+    http://localHost:Port/pools/default/certificate > ./<certificate_name>
+ +

以下は、curlと、wgetを利用して証明書を取得する例です:

+ +
curl http://10.5.2.54:8091/pools/default/certificate > clusterCertificate
+ +
wget http://10.5.2.54:8091/pools/default/certificate -O clusterCertificate
+ +

以下は、curlと、wgetでSSL証明書を利用して、 + 暗号化したコネクション経由でクラスタの情報を取得する例です。RESTアクセスを暗号化する場合、ポートは18091を利用します:

+ + +
curl --cacert clusterCertificate https://10.5.2.54:18091/pools/default
+ +
wget --ca-certificate clusterCertificate  https://10.5.2.54:18091/pools/default -O output
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/security/security-best-practices.html b/preview/contents/security/security-best-practices.html new file mode 100644 index 0000000..340ec71 --- /dev/null +++ b/preview/contents/security/security-best-practices.html @@ -0,0 +1,57 @@ +セキュリティのベストプラクティス
+

セキュリティのベストプラクティス

+ + +

セキュリティのベストプラクティスはガイドラインとセキュリティ機能をネットワーク全般に適用するためのヒントで構成されています。

+ +

セキュリティはCouchbaseインフラ全体で必要であり、内部ネットワーク、境界ネットワーク、そしてネットワーク外部で必要になります。 + マルウェアやハッカーから防衛するために、継続的に更新しメンテナンスする必要があります。

+ +

セキュリティはネットワークインフラとデータベースの物理的な保護と、それらのインフラ上で稼働するアプリケーションとして捉えることができます。

+ +

+ +

インフラの防護とは、ネットワーク自身、ストレージデバイス、サーバ、仮想マシン、そしてそれらのマシン上にインストールされたオペレーティングシステムを指します。データベースとアプリケーションの防護とは、Couchbase Server自身、および共に利用されるさまざまなアプリケーションを指します。

+ +

どこでセキュリティを確保するか

セキュリティは次の領域でメンテナンスされ、更新されるべきです:
    +
  • ネットワーク外部で稼働するブラウザやモバイルアプリケーション。
  • + +
  • 内部および外部ファイアウォール間の境界ネットワーク。 + これは典型的にはWebサーバとロードバランサのマシンで構成されます。
  • + +
  • このネットワークは、バックエンドとWebやモバイルアプリケーションのような外部インタフェースを物理的に分離します。
  • + +
+ +

+ +

内部ネットワークは内部ファイアウォール内に存在します。 + 一般的には、Couchbaseは内部ネットワーク内にデプロイします。 + 外部ネットワークからのリクエストは外部ファイアウォールを経由し、ロードバランサに到達します、ここではセキュリティ管理者がパケットフィルタリングや不正なIPアドレスのブロックを設置することができます。 + その後、リクエストはWebサーバに到達します。 + 第二ファイアウォールレベルでは、ITやデータベース管理者が、境界ネットワークと内部ネットワークの間で、内部ファイアウォールによりCouchbaseの入出力ポートのみを許可するように設定します。

+

外部ファイアウォールでは特定のポートのみを解放し、内部ファイアウォールは特定のCouchbaseポートのみを解放します。

+
+ +
+ + +
\ No newline at end of file diff --git a/preview/contents/security/security-client-ssl.html b/preview/contents/security/security-client-ssl.html new file mode 100644 index 0000000..77c341b --- /dev/null +++ b/preview/contents/security/security-client-ssl.html @@ -0,0 +1,82 @@ +データアクセスの暗号化
+

データアクセスの暗号化

+ + + + +

+ Couchbase ServerクライアントライブラリはSecure Socket Layer (SSL)を利用した、クライアントサイドの暗号化をサポートしています。 +

+ + +
重要: 本機能はエンタープライズエディションでのみ利用できます。
+ +

+ データアクセスの暗号化はクライアントサーバ間の通信と、Viewアクセスで実行されます。 +

+ + + +

SSLベースのクライアントサーバ通信

+

+ Couchbase Serverクライアントライブラリは、SSLプロトコルを使用したクライアントサイドの暗号化により、 + クライアントとサーバ間で転送されるデータの暗号化をサポートしています。 + セキュアなクライアントサーバ間の通信は、Couchbaseクライアントのバージョン2.0以降で利用可能です。 +

+ +

+ 一部のクライアントでSSLを利用した通信を行い、その他のクライアントはSSLを利用しない構成もできます。 +

+ +

+ SSLをクライアント側で有効にするには、SSL証明書をCouchbase Serverから取得し、お使いのクライアントごとの手順に従ってください。 +

+ +

+ 証明書を取得するには、Couchbase Webコンソールから、 + Settings > Certificate > Show certificateにアクセスし、証明書をコピーします。

+ + +
注: Couchbase ServerでSSL証明書を再生成した場合、新しい証明書を取得しなおす必要があります。
+ + +

以下のクライアントがSSLに対応しています:

+ +
    +
  • Java
  • + +
  • .NET
  • + +
  • Node.js
  • + +
  • PHP
  • + +
  • C
  • + +
+ + +
注: + SSLを利用したクライアントとデータノード間の通信には、11207Couchbaseネットワークポートを利用します。 +
+ + +
+ +

SSLベースのViewアクセス

+

+ Viewアクセスには、18092ポートを利用します: https://couchbase_server:18092

+
+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/security/security-in-applications.html b/preview/contents/security/security-in-applications.html new file mode 100644 index 0000000..c8c81c9 --- /dev/null +++ b/preview/contents/security/security-in-applications.html @@ -0,0 +1,69 @@ +Security in applications
+

Security in applications

+ + +

To provide for security in applications, pay attention to the client configuration cache + and user input validation.

+ + +

Client configuration cache

The majority of the Couchbase clusters are + running in a steady state most of the time, which means that the cluster nodes are not removed or + added very often. Since clients only infrequently receive an update from the cluster whose + topology is changing, cluster information is well suited for caching.

When the client is + instantiated, it looks for a cached named file in the file system. If the file is there, the + client assumes that it belongs to a current cluster configuration and starts using it. If it + isn't there, the client starts a normal bootstrap to get the configuration from the cluster and + writes it to a file. Whenever you try to access an item on a node and the node tells you that + you tried to communicate to the wrong node, you invalidate the cache and request a new copy of + the configuration cache.

+
To use the configuration cache from PHP, add the following + to the file php.ini: +
couchbase.config_cache = /tmp 
+
+
+ + +

User input validation

+

User input is validated by implementing these validation techniques:

+ + +
    +
  • Injection of arbitrary key-value pairs.
  • + +
  • Changing of the user specified document type.
  • + +
  • Overriding of important document fields.
  • + +
+ +
+ + + +

Example

 {"user": "will","password":"0asd21$1%", 
+  "created":"2012-06-12", "password":"password"}
+In + this JSON document, the first password field 0asd21$1% is the intended value + and the application was supposed to store the hashed value for that particular password field. + However, the application developer built concatenation based on the user specified input. As a + result, the plain password password has become the concatenated input. If you + try to save this document in Couchbase, you will override the first field with the last supplied + value.

Be aware that an attacker might try to inject arbitrary key-value pairs, override a + key-value pair, or change the document type (such as from Private to + Public). You must, therefore, protect the input and ensure that field + overrides are explicit so that they cannot be changed implicitly by attackers.

+Best + practices for validating user input prohibit accepting of the user input directly and require + that strings be concatenated and sent to the database. This requires you to use a document model + that includes Java POJOs or .Net POCOs.
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/security/security-in-cloud.html b/preview/contents/security/security-in-cloud.html new file mode 100644 index 0000000..e84a40d --- /dev/null +++ b/preview/contents/security/security-in-cloud.html @@ -0,0 +1,102 @@ +Security in the cloud
+

Security in the cloud

+ + +

There are a couple of security measures you can implement in a cloud: network ACLs and + secure XDCR.

+ +

Network ACLs and security groups

For the Amazon Virtual Private Cloud + (VPC), security is provided with:
    +
  • Network Access Control Lists (ACLs), which are an optional layer of security that acts as a + firewall for controlling traffic in and out of a subnet.
  • + +
  • Security groups, which act as a virtual firewall for your instance to control inbound and + outbound traffic.
  • + +
+
To ensure security:
    +
  • On the host level, you can set individual SSL keys using a bashing host. Make sure that + accesses to your Couchbase instances are logged and audited through Amazon’s logging + capabilities.
  • + +
  • Obtain customer generated key pairs.
  • + +
  • Set up an outbound instance of a firewall in the VPC.
  • + +
  • Sign your calls using a certificate or a customer key to protect your access.
  • + +
+
+ +
+ +

Secure XDCR

Secure Cross Datacenter Replication (XDCR) enables you to + encrypt traffic between two data centers using an SSL connection. All traffic in the source + and destination data centers will be encrypted, which will result in a slight increase in the + CPU load since any encryption needs additional CPU cycles.

As a security best practice, + periodically rotate the XDCR certificates and also make sure that you instantiate a new + certificate on the remote cluster.

+
To configure security in XDCR, do the following:
    +
  1. Acces the dialog at XDCR > Create Cluster Reference.

    +
  2. + +
  3. Enter the following information: +
    + +
    Cluster Name
    + +
    Name of the cluster you are adding.
    + + +
    +
    + +
    IP/hostname
    + +
    The hostname or IP address of a node in the cluster you are adding.
    + + +
    +
    + +
    Security
    + +
    Username and password or the login credentials for the remote cluster
    + + +
    +
    + +
    Enable encryption
    + +
    If this option is selected, XDCR data encryption occurs using SSL. A window + will open where you have to paste the SSL certificate that has been obtained + from the remote cluster. This certificate is available on the remote cluster on + the location Settings > Cluster.
    Attention: Do not share the certificate with any + unintended entities.
    +
    Attention: Regenerate the certificate + periodically based on your organizational requirements.
    +
    + + +
    +
  4. + +
+
+
Note: It is recommended to conduct traffic for XDCR using a Virtual + Private Network (VPN).
+ +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/security/security-inside-server.html b/preview/contents/security/security-inside-server.html new file mode 100644 index 0000000..dfdc153 --- /dev/null +++ b/preview/contents/security/security-inside-server.html @@ -0,0 +1,166 @@ +Security inside Couchbase Server
+

Security inside Couchbase Server

+ + +

Best security practices inside the Couchbase Server cover passwords, bucket + authentication, read-only administrators, access logs, and encrypted administrative + access.

+ + +

Couchbase passwords

+

Couchbase Server has several passwords:

+ +
    +
  • Administrative password
  • + +
  • Bucket password
  • + +
  • XDCR remote cluster password
  • + +
+ + +

Requirement for strong passwords means that all passwords must comply with the following:

+ +
    +
  • Length of a password must be at least 7 characters, consisting of letters (upper and lower case), digits, and special characters.
  • + +
  • Rotation of passwords must be enforced based on organization's requirements.
  • + +
  • Forgotten administrative passwords are reset using the cbreset_password + tool.
  • + +
+
+ + +

Bucket authentication through SSL

To enforce bucket security, make sure to + provide for bucket authentication through SASL (Simple Authentication and Security Layer). +

Authentication on the bucket level takes place over the CRAM-MD5 protocol and involves a + single challenge-and-response cycle initiated by Couchbase Server. In the challenge + sequence, the server sends a string in the format of a Message ID (email header value + including angle brackets), which includes an arbitrary string of random digits, a timestamp, + and the server's fully qualified domain name.

+

Access control is configured using the + Couchbase Web Console and is set for two ports:

+
+ +
Standard port
+ +
This is TCP port 11211, which requires SASL authentication. Enter the + password that complies with the best practices rules.
+ + + +
Dedicated port
+ +
This port supports ASCII protocol and doesn't need authentication. You only need to + enter the port number.
+ + +
+ +

+ +
+ +

Removal of unprotected buckets

To safeguard security in the production + phase, buckets that have been created by Couchbase Server as a part of the installation + process must be deleted. This applies to:
    +
  • Default bucket, which has no password support.
  • + +
  • Any sample buckets that have been supplied with empty passwords.
  • + +
+
+ + + +

Encrypted administrative access

+ +

A new port for encrypted administrative access was provided in release 3.0 and is useful + for administrators who administer Couchbase Server over the Internet.

+ +
+ +
+

In case you want to force an SSL connection to the Couchbase cluster, you have to lock the + non-SSL ports.

+ +
+ +
+

While an administrative console is typically protected via an HTTPS connection, the new + administrative access on port 18091 allows connection to the Couchbase Web + Console over SSL, which is enabled by default. To talk over SSL to the Couchbase Web + Console, connect to the following URL with your web browser: + https://couchbase_server:18091

+ +

The Cluster Overview screen is displayed, from where you can access + other cluster information such as server nodes, data buckets, views, and so on.

+ +

+ +

The Settings tab shows that a self-signed SSL certificate has been + deployed across the cluster. This certificate can be regenerated, or replaced.

+ +
+ +

Read-only administrative users

+

A read-only administrator can view certain activities without having ability to edit. + Privileges and credentials for this user can be set in the UI.

+ +

Passwords for the read-only administrators follow the same requirements as for other + Couchbase passwords: they must be strong and rotated periodically.

+ +

To set up the credentials for a read-only administrator using the Couchbase Web Console, go to + Settings > Account Management and enter the administrator's username and password.

+ +

+ +
+ + + + +

Access logs

+

Access logs are used to monitor the administrator's access to the Couchbase cluster. These + logs:

+ +
    +
  • Track REST or the Couchbase Web Console's accesses and can be found in the file + /opt/couchbase/var/lib/couchbase/logs/http_access.log.
  • + +
  • Are ASCII text based, which is a common log format.
  • + +
  • Allow you to retrieve the following information:
      +
    • Client IP patterns
    • + +
    • Error codes, such as 401
    • + +
    • Suspicious URLs
    • + +
    +
  • + + +
+ +

You can use an access log along with OS auditing on your server. While the OS log shows who + logged in, the access log shows whether an administrator who logged in actually connected to + Couchbase Server or failed to connect.

+ + +
+ +
+ +
\ No newline at end of file diff --git a/preview/contents/security/security-intro.html b/preview/contents/security/security-intro.html new file mode 100644 index 0000000..dd35e83 --- /dev/null +++ b/preview/contents/security/security-intro.html @@ -0,0 +1,34 @@ +セキュリティ
+

セキュリティ

+ + +

Couchbase Server 3.0は、アプリケーションや管理者向けに安全なネットワーク経由のデータアクセスをサポートしています。

+ +

Security is very important for big data applications, which process a large amount of + unstructured data coming in big volumes and at high speed.

+ + +

Couchbase Server provides security features associated with administrative access and + client access via Secure Socket Layer (SSL).

+ + +
+ +
\ No newline at end of file diff --git a/preview/contents/security/security-outside-server.html b/preview/contents/security/security-outside-server.html new file mode 100644 index 0000000..911bddd --- /dev/null +++ b/preview/contents/security/security-outside-server.html @@ -0,0 +1,209 @@ +Couchbase Serve外部のセキュリティ
+

Couchbase Serve外部のセキュリティ

+ + +

Couchbase Server外部のセキュリティではIPテーブルとポートの設定を実施します。

+ +

Couchbase Serverをインストールするホストマシンをセキュアにするには、ベストプラクティスとして、Vormetricのような透過的なデータ暗号化技術の導入があります:

+ +
    +
  • データとインデックスのファイルパス (Linuxでのデフォルトのデータパス)は/opt/couchbase/var/lib/couchbase/dataです。
  • + +
  • ツールのパスは/opt/couchbase/bin/です。
  • + +
  • パスワードファイルは、/opt/couchbase/var/lib/couchbase/isasl.pw and /opt/couchbase/var/lib/config/にあります。
  • + + +
+ +

さらにセキュリティを高めるには:

+ +
    +
  • 特定のマシンからのみ、Couchbase Serverの管理アクセスを許可します。 + アクセスを許容するマシンでは、OSの監査ログを有効にします。
  • + +
  • IPSecをローカルネットワークで使用します。
  • + +
+ +

IPテーブルとポートの設定方法

+ +
LinuxでIPテーブルを設定するには、/etc/sysconfig/iptablesにあるファイルを以下の手順で変更してください: +
##allow everyone to access port 80 and 443##
+   -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
+   -A INPUT -m state --state NEW -p tsp --dport 443 -j ACCEPT
+
+ +

また、特定のCouchbaseポートはノード間、およびノード、クライアント間の通信に利用されることに注意してください。

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
表 1. 重要なCouchbaseポート
ポート説明ノード間ノード、クライアント間
8091Web管理ポートYesYes
8092Couchbase APIポートYesYes
11207内部/外部 SSL用バケットポートNoYes
11209内部バケットポートYesNo
11210内部/外部 バケットポートYesYes
11211クライアントインタフェース (プロキシ)NoYes
11214SSLプロキシ入力NoNo
11215内部SSLプロキシ出力NoNo
18091内部REST HTTPS SSL用NoYes
18092内部 CAPI HTTPS SSL用NoYes
4369Erlangポートマッパー (epmd)YesNo
21100 から 21199 までノード間データ送信YesNo
+
+ +
注: IPテーブルファイアウォールを設定するサンプルスクリプトは、次のブログ記事でも紹介しています: IPTables Firewall Settings for Couchbase DB and Couchbase Mobile Sync_gateway
+ +
+ +
+ +
\ No newline at end of file