diff --git a/.eleventy.js b/.eleventy.js index 28d6a46c9..369b4613e 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -1,8 +1,9 @@ const fs = require('fs'); +const path = require('path'); // Plugins const eleventyNavigationPlugin = require('@11ty/eleventy-navigation'); -const build = require('./src/_data/build'); +const build = require('./src/_data/build') || {}; const i18n = require('eleventy-plugin-i18n'); const markdownIt = require('markdown-it'); const markdownItAnchor = require('markdown-it-anchor'); @@ -10,78 +11,102 @@ const sitemap = require('@quasibit/eleventy-plugin-sitemap'); const translations = require('./src/_data/i18n'); module.exports = function (eleventyConfig) { - console.log(process.env.NODE_ENV); + console.log(`Running in environment: ${process.env.NODE_ENV || 'development'}`); // Hot-reload site on CSS changes eleventyConfig.addWatchTarget('src/css'); eleventyConfig.addWatchTarget('src/_11ty'); + // Helper function to check if a file exists before requiring it + const requireIfExists = filePath => { + if (!fs.existsSync(filePath)) { + console.warn(`Missing file: ${filePath}`); + } + return fs.existsSync(filePath) ? require(filePath) : () => {}; + }; + // Collections - const collectionsDir = `./src/_11ty/collections`; - eleventyConfig.addCollection('primary', require(`${collectionsDir}/primary.js`)); - eleventyConfig.addCollection('sitemap', require(`${collectionsDir}/sitemap.js`)); + const collectionsDir = './src/_11ty/collections'; + eleventyConfig.addCollection('primary', requireIfExists(`${collectionsDir}/primary.js`)); + eleventyConfig.addCollection('sitemap', requireIfExists(`${collectionsDir}/sitemap.js`)); // Filters - const filtersDir = `./src/_11ty/filters`; - eleventyConfig.addFilter('chunkByYear', require(`${filtersDir}/chunkByYear.js`)); - eleventyConfig.addFilter('cleanCardContent', require(`${filtersDir}/cleanCardContent.js`)); - eleventyConfig.addFilter('cleanSearchRaw', require(`${filtersDir}/cleanSearchRaw.js`)); - eleventyConfig.addFilter('endsWith', require(`${filtersDir}/endsWith.js`)); - eleventyConfig.addFilter('formatDate', require(`${filtersDir}/formatDate.js`)); - eleventyConfig.addFilter('formatDateRange', require(`${filtersDir}/formatDateRange.js`)); - eleventyConfig.addFilter('getArticleType', require(`${filtersDir}/getArticleType.js`)); - eleventyConfig.addFilter('getCollectionByTag', require(`${filtersDir}/getCollectionByTag.js`)); - eleventyConfig.addFilter('getCollectionTags', require(`${filtersDir}/getCollectionTags.js`)); - eleventyConfig.addFilter('getItems', require(`${filtersDir}/getItems.js`)); - eleventyConfig.addFilter('getItemsByLocale', require(`${filtersDir}/getItemsByLocale.js`)); - eleventyConfig.addFilter('getItemsInFuture', require(`${filtersDir}/getItemsInFuture.js`)); - eleventyConfig.addFilter('getItemsInPast', require(`${filtersDir}/getItemsInPast.js`)); - eleventyConfig.addFilter('getJobs', require(`${filtersDir}/getJobs.js`)); - eleventyConfig.addFilter('getSingleDigitFromDate', require(`${filtersDir}/getSingleDigitFromDate.js`)); - eleventyConfig.addFilter('isInFuture', require(`${filtersDir}/isInFuture.js`)); - eleventyConfig.addFilter('objectValues', require(`${filtersDir}/objectValues.js`)); - eleventyConfig.addFilter('randomize', require(`${filtersDir}/randomize.js`)); - eleventyConfig.addFilter('removeHtml', require(`${filtersDir}/removeHtml.js`)); - eleventyConfig.addFilter('removeTags', require(`${filtersDir}/removeTags.js`)); - eleventyConfig.addFilter('startsWith', require(`${filtersDir}/startsWith.js`)); - eleventyConfig.addFilter('truncate', require(`${filtersDir}/truncate.js`)); - - // Layout aliases — TBC if this is bringing enough benefit - eleventyConfig.addLayoutAlias('base', 'layouts/_base.njk'); - eleventyConfig.addLayoutAlias('blog-post', 'layouts/blog-post.njk'); - eleventyConfig.addLayoutAlias('case-study', 'layouts/case-study.njk'); - eleventyConfig.addLayoutAlias('content', 'layouts/content.njk'); - eleventyConfig.addLayoutAlias('content-simple', 'layouts/content-simple.njk'); - eleventyConfig.addLayoutAlias('content-support', 'layouts/content-support.njk'); - eleventyConfig.addLayoutAlias('event', 'layouts/event.njk'); - eleventyConfig.addLayoutAlias('home', 'layouts/home.njk'); - eleventyConfig.addLayoutAlias('press-release', 'layouts/press-release.njk'); - eleventyConfig.addLayoutAlias('hub-community', 'layouts/hub-community.njk'); - eleventyConfig.addLayoutAlias('hub-developers', 'layouts/hub-developers.njk'); - eleventyConfig.addLayoutAlias('hub-discover', 'layouts/hub-discover.njk'); - eleventyConfig.addLayoutAlias('hub-foundation', 'layouts/hub-foundation.njk'); - eleventyConfig.addLayoutAlias('hub-news', 'layouts/hub-news.njk'); - eleventyConfig.addLayoutAlias('hub-users', 'layouts/hub-users.njk'); - eleventyConfig.addLayoutAlias('listing-blog-posts', 'layouts/listing-blog-posts.njk'); - eleventyConfig.addLayoutAlias('listing-blog-post-categories', 'layouts/listing-blog-post-categories.njk'); - eleventyConfig.addLayoutAlias('listing-blog-search', 'layouts/listing-blog-search.njk'); - eleventyConfig.addLayoutAlias('listing-case-studies', 'layouts/listing-case-studies.njk'); - eleventyConfig.addLayoutAlias('listing-case-study-categories', 'layouts/listing-case-study-categories.njk'); - eleventyConfig.addLayoutAlias('listing-events', 'layouts/listing-events.njk'); - eleventyConfig.addLayoutAlias('listing-event-categories', 'layouts/listing-event-categories.njk'); - eleventyConfig.addLayoutAlias('listing-planet-ceph-articles', 'layouts/listing-planet-ceph-articles.njk'); - eleventyConfig.addLayoutAlias('listing-press-releases', 'layouts/listing-press-releases.njk'); - eleventyConfig.addLayoutAlias('listing-press-release-categories', 'layouts/listing-press-release-categories.njk'); - eleventyConfig.addLayoutAlias('navigation', 'layouts/navigation.njk'); + const filtersDir = './src/_11ty/filters'; + const filterFiles = [ + 'chunkByYear', + 'cleanCardContent', + 'cleanSearchRaw', + 'endsWith', + 'formatDate', + 'formatDateRange', + 'getArticleType', + 'getCollectionByTag', + 'getCollectionTags', + 'getItems', + 'getItemsByLocale', + 'getItemsInFuture', + 'getItemsInPast', + 'getJobs', + 'getSingleDigitFromDate', + 'isInFuture', + 'objectValues', + 'randomize', + 'removeHtml', + 'removeTags', + 'startsWith', + 'truncate', + ]; + + filterFiles.forEach(filter => { + eleventyConfig.addFilter(filter, requireIfExists(`${filtersDir}/${filter}.js`)); + }); + + // Layout aliases + const layoutAliases = { + base: 'layouts/_base.njk', + 'blog-post': 'layouts/blog-post.njk', + 'case-study': 'layouts/case-study.njk', + content: 'layouts/content.njk', + 'content-simple': 'layouts/content-simple.njk', + 'content-support': 'layouts/content-support.njk', + event: 'layouts/event.njk', + home: 'layouts/home.njk', + 'press-release': 'layouts/press-release.njk', + 'hub-community': 'layouts/hub-community.njk', + 'hub-developers': 'layouts/hub-developers.njk', + 'hub-discover': 'layouts/hub-discover.njk', + 'hub-foundation': 'layouts/hub-foundation.njk', + 'hub-news': 'layouts/hub-news.njk', + 'hub-users': 'layouts/hub-users.njk', + 'listing-blog-posts': 'layouts/listing-blog-posts.njk', + 'listing-blog-post-categories': 'layouts/listing-blog-post-categories.njk', + 'listing-blog-search': 'layouts/listing-blog-search.njk', + 'listing-case-studies': 'layouts/listing-case-studies.njk', + 'listing-case-study-categories': 'layouts/listing-case-study-categories.njk', + 'listing-events': 'layouts/listing-events.njk', + 'listing-event-categories': 'layouts/listing-event-categories.njk', + 'listing-planet-ceph-articles': 'layouts/listing-planet-ceph-articles.njk', + 'listing-press-releases': 'layouts/listing-press-releases.njk', + 'listing-press-release-categories': 'layouts/listing-press-release-categories.njk', + navigation: 'layouts/navigation.njk', + }; + + Object.entries(layoutAliases).forEach(([alias, layoutPath]) => { + const fullPath = path.join(__dirname, 'src/_includes', layoutPath); + if (!fs.existsSync(fullPath)) { + console.error(`Missing layout: ${layoutPath}`); + } + eleventyConfig.addLayoutAlias(alias, layoutPath); + }); // Shortcodes - const shortcodesDir = `./src/_11ty/shortcodes`; - eleventyConfig.addShortcode('ArticleCard', require(`${shortcodesDir}/ArticleCard.js`)); - eleventyConfig.addShortcode('YouTube', require(`${shortcodesDir}/YouTube.js`)); + const shortcodesDir = './src/_11ty/shortcodes'; + eleventyConfig.addShortcode('ArticleCard', requireIfExists(`${shortcodesDir}/ArticleCard.js`)); + eleventyConfig.addShortcode('YouTube', requireIfExists(`${shortcodesDir}/YouTube.js`)); // Transforms - const transformsDir = `./src/_11ty/transforms`; - eleventyConfig.addTransform('htmlmin', require(`${transformsDir}/html-minifier.js`)); + const transformsDir = './src/_11ty/transforms'; + eleventyConfig.addTransform('htmlmin', requireIfExists(`${transformsDir}/html-minifier.js`)); // Passthrough copy eleventyConfig.addPassthroughCopy('./src/assets/**/*.json'); @@ -97,9 +122,10 @@ module.exports = function (eleventyConfig) { }); eleventyConfig.addPlugin(sitemap, { sitemap: { - hostname: build.isProduction ? 'https://ceph.io' : 'https://develop.ceph.io', + hostname: build && build.isProduction ? 'https://ceph.io' : 'https://develop.ceph.io', }, }); + // Markdown overrides let markdownLibrary = markdownIt({ html: true, @@ -107,38 +133,42 @@ module.exports = function (eleventyConfig) { }).use(markdownItAnchor, { level: [2, 3, 4, 5, 6], permalink: true, - permalinkClass: 'link-anchor', - permalinkSymbol: '¶', + permalinkClass: 'direct-link', + permalinkSymbol: '🔗', + space: true, }); eleventyConfig.setLibrary('md', markdownLibrary); // Run after the build ends eleventyConfig.on('afterBuild', () => { - require('./scripts/search-index.js'); + const searchIndexPath = './scripts/search-index.js'; + if (fs.existsSync(searchIndexPath)) { + require(searchIndexPath); + } else { + console.warn('Warning: search-index.js not found, skipping post-build task.'); + } }); eleventyConfig.setServerOptions({ - // Swapping back to Browsersync - // See https://www.11ty.dev/docs/dev-server/#swap-back-to-browsersync module: '@11ty/eleventy-server-browsersync', callbacks: { ready: function (err, bs) { bs.addMiddleware('*', (req, res) => { - // Dev mode redirect for root path to default language if (req.url === '/') { - res.writeHead(302, { - location: '/en/', - }); + res.writeHead(302, { location: '/en/' }); res.end(); + } else { + const errorPagePath = path.join(__dirname, 'src/en/404.html'); + if (fs.existsSync(errorPagePath)) { + const content_404 = fs.readFileSync(errorPagePath); + res.writeHead(404); + res.end(content_404); + } else { + res.writeHead(404, { 'Content-Type': 'text/plain' }); + res.end('404 Not Found'); + } } - - // 404 on --serve - // https://www.11ty.dev/docs/quicktips/not-found/#with-serve - const content_404 = fs.readFileSync('dist/en/404.html'); - res.write(content_404); - res.writeHead(404); - res.end(); }); }, }, @@ -146,8 +176,6 @@ module.exports = function (eleventyConfig) { // Configuration eleventyConfig.setDataDeepMerge(true); - // TBC if this is a bit heavy-handed - // See https://www.11ty.dev/docs/data-deep-merge/ return { htmlTemplateEngine: 'njk', diff --git a/src/_includes/components/site-footer.njk b/src/_includes/components/site-footer.njk index 2182b25d2..5a8422ef4 100644 --- a/src/_includes/components/site-footer.njk +++ b/src/_includes/components/site-footer.njk @@ -1,103 +1,103 @@ -{% set localeParentKey = '/' + locale + '/' %} -{% set primaryNav = collections.primary | eleventyNavigation(localeParentKey) %} -{% set supportNav = collections.support | eleventyNavigation(localeParentKey) %} - - +{% set localeParentKey = '/' + locale + '/' %} +{% set primaryNav = collections.primary | eleventyNavigation(localeParentKey) %} +{% set supportNav = collections.support | eleventyNavigation(localeParentKey) %} + + diff --git a/src/_includes/components/social-shares.njk b/src/_includes/components/social-shares.njk index fc46daa1f..7c4a1f89a 100644 --- a/src/_includes/components/social-shares.njk +++ b/src/_includes/components/social-shares.njk @@ -1,21 +1,21 @@ -
- - - Twitter - - - - Facebook - -
- +
+ + + X + + + + Facebook + +
+ diff --git a/src/_includes/layouts/_base.njk b/src/_includes/layouts/_base.njk index bac79823b..fc6b404d3 100644 --- a/src/_includes/layouts/_base.njk +++ b/src/_includes/layouts/_base.njk @@ -1,132 +1,132 @@ - - - - - {# In cases where nosuchbranch.ceph.io is loaded, the relative paths like /css/main.css don't load - - so we need to provide the full path of https://ceph.io/css/main.css #} - {% if 'Not found' in title %}{% endif %} - - - - - - - Ceph.io — {{ title }} - - - {% for lang in locales -%} - - {# loop through all the content of the site #} - {% for item in collections.all -%} - - {# for each item in the loop, check if - - its translationKey matches the current item translationKey - - its locale matches the code of the language we are looping through #} - {%- if item.data.translationKey == translationKey and item.data.locale == lang.code -%} - - {%- endif -%} - - {%- endfor -%} - - {%- endfor -%} - - {# Canonical link? #} - - - {# Preload/preconnect #} - - - - {% for link in preload -%} - - {%- endfor -%} - - {# Stylesheet #} - - - {# async Google Fonts #} - - - {# no-JS fallback Google Fonts #} - - - {# Favicons #} - - - - - - - - - - - - - - - - - - - - {# Robots #} - {% if not build.isProduction %} - - {% endif %} - - {# Social meta #} - - - - - - - - - - - - - - - - - - - - - {% include 'components/site-header.njk' %} - -
-
- {{ content | safe }} -
-
- - {% include 'components/site-footer.njk' %} - - - - + + + + + {# In cases where nosuchbranch.ceph.io is loaded, the relative paths like /css/main.css don't load + - so we need to provide the full path of https://ceph.io/css/main.css #} + {% if 'Not found' in title %}{% endif %} + + + + + + + Ceph.io — {{ title }} + + + {% for lang in locales -%} + + {# loop through all the content of the site #} + {% for item in collections.all -%} + + {# for each item in the loop, check if + - its translationKey matches the current item translationKey + - its locale matches the code of the language we are looping through #} + {%- if item.data.translationKey == translationKey and item.data.locale == lang.code -%} + + {%- endif -%} + + {%- endfor -%} + + {%- endfor -%} + + {# Canonical link? #} + + + {# Preload/preconnect #} + + + + {% for link in preload -%} + + {%- endfor -%} + + {# Stylesheet #} + + + {# async Google Fonts #} + + + {# no-JS fallback Google Fonts #} + + + {# Favicons #} + + + + + + + + + + + + + + + + + + + + {# Robots #} + {% if not build.isProduction %} + + {% endif %} + + {# Social meta #} + + + + + + + + + + + + + + + + + + + + + {% include 'components/site-header.njk' %} + +
+
+ {{ content | safe }} +
+
+ + {% include 'components/site-footer.njk' %} + + + + diff --git a/src/assets/svgs/logo-X-grey.svg b/src/assets/svgs/logo-X-grey.svg new file mode 100644 index 000000000..12b918b57 --- /dev/null +++ b/src/assets/svgs/logo-X-grey.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/svgs/logo-twitter-blue-red.svg b/src/assets/svgs/logo-twitter-blue-red.svg deleted file mode 100644 index f7b5e8394..000000000 --- a/src/assets/svgs/logo-twitter-blue-red.svg +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/svgs/logo-twitter-grey.svg b/src/assets/svgs/logo-twitter-grey.svg deleted file mode 100644 index a672d2798..000000000 --- a/src/assets/svgs/logo-twitter-grey.svg +++ /dev/null @@ -1,4 +0,0 @@ - diff --git a/src/css/component.site-footer.css b/src/css/component.site-footer.css index 7e53473c0..8bd569db5 100644 --- a/src/css/component.site-footer.css +++ b/src/css/component.site-footer.css @@ -87,8 +87,8 @@ fill: var(--color-facebook-blue); } -.site-footer__twitter:hover svg { - fill: var(--color-twitter-blue); +.site-footer__X:hover svg { + fill: var(--color-X-blue); } .site-footer__youtube:hover svg { diff --git a/src/css/component.social-shares.css b/src/css/component.social-shares.css index a282f9f34..2be60c638 100644 --- a/src/css/component.social-shares.css +++ b/src/css/component.social-shares.css @@ -29,10 +29,10 @@ stroke: var(--color-facebook-blue); } -.social-shares__twitter:hover svg g { +.social-shares__X:hover svg g { fill: var(--color-twitter-blue); } -.social-shares__twitter:hover svg circle { +.social-shares__X:hover svg circle { stroke: var(--color-twitter-blue); } diff --git a/src/css/settings.colors.css b/src/css/settings.colors.css index e8a28d818..43c705de8 100644 --- a/src/css/settings.colors.css +++ b/src/css/settings.colors.css @@ -86,11 +86,11 @@ --color-facebook-blue-hsl: var(--color-facebook-blue-h), var(--color-facebook-blue-s), var(--color-facebook-blue-l); --color-facebook-blue: hsl(var(--color-facebook-blue-hsl)); - --color-twitter-blue-h: 203; - --color-twitter-blue-s: 89%; - --color-twitter-blue-l: 53%; - --color-twitter-blue-hsl: var(--color-twitter-blue-h), var(--color-twitter-blue-s), var(--color-twitter-blue-l); - --color-twitter-blue: hsl(var(--color-twitter-blue-hsl)); + --color-X-blue-h: 203; + --color-X-blue-s: 89%; + --color-X-blue-l: 53%; + --color-X-blue-hsl: var(--color-twitter-blue-h), var(--color-twitter-blue-s), var(--color-twitter-blue-l); + --color-X-blue: hsl(var(--color-twitter-blue-hsl)); --color-youtube-red-h: 360; --color-youtube-red-s: 100%; diff --git a/src/en/community/events/2022/ceph-virtual/index.md b/src/en/community/events/2022/ceph-virtual/index.md index d1a47b756..5d7423949 100644 --- a/src/en/community/events/2022/ceph-virtual/index.md +++ b/src/en/community/events/2022/ceph-virtual/index.md @@ -16,7 +16,7 @@ No registration is required. The meeting link will be provided on this event page on November 4th. Sign up for the Ceph Announcement list or follow Ceph on Twitter to get notified before we start +href="https://x.com/ceph">X to get notified before we start each day. Click to join us diff --git a/src/en/community/events/2023/cephalocon-amsterdam/index.md b/src/en/community/events/2023/cephalocon-amsterdam/index.md index 8bd5247b1..c807c5ac6 100644 --- a/src/en/community/events/2023/cephalocon-amsterdam/index.md +++ b/src/en/community/events/2023/cephalocon-amsterdam/index.md @@ -60,6 +60,6 @@ Join the Ceph announcement list, or follow Ceph on social media for updates: - [Ceph Announcement list](https://lists.ceph.io/postorius/lists/ceph-announce.ceph.io/) - [Slack](https://ceph-storage.slack.com/) -- [Twitter](https://twitter.com/ceph) +- [X](https://x.com/ceph) - [LinkedIn](https://www.linkedin.com/company/ceph/) - [FaceBook](https://www.facebook.com/cephstorage/) diff --git a/src/en/community/events/2024/ceph-days-asia/index.md b/src/en/community/events/2024/ceph-days-asia/index.md index f504d4ed3..d50109084 100644 --- a/src/en/community/events/2024/ceph-days-asia/index.md +++ b/src/en/community/events/2024/ceph-days-asia/index.md @@ -191,7 +191,7 @@ Join the Ceph announcement list, or follow Ceph on social media for Ceph event updates: - [Ceph Announcement list](https://lists.ceph.io/postorius/lists/ceph-announce.ceph.io/) -- [Twitter](https://twitter.com/ceph) +- [X](https://x.com/ceph) - [LinkedIn](https://www.linkedin.com/company/ceph/) - [FaceBook Ceph Korea Group](https://www.facebook.com/groups/cephkr) - [FaceBook](https://www.facebook.com/cephstorage/) diff --git a/src/en/community/events/2024/cephalocon-2024/index.md b/src/en/community/events/2024/cephalocon-2024/index.md index fce9129e2..888732897 100644 --- a/src/en/community/events/2024/cephalocon-2024/index.md +++ b/src/en/community/events/2024/cephalocon-2024/index.md @@ -81,6 +81,6 @@ Join the Ceph announcement list, or follow Ceph on social media for Ceph event updates: - [Ceph Announcement list](https://lists.ceph.io/postorius/lists/ceph-announce.ceph.io/) -- [Twitter](https://twitter.com/ceph) +- [Twitter](https://x.com/ceph) - [LinkedIn](https://www.linkedin.com/company/ceph/) - [FaceBook](https://www.facebook.com/cephstorage/) diff --git a/src/en/community/events/2024/cloudstack-and-ceph-day-netherlands/index.md b/src/en/community/events/2024/cloudstack-and-ceph-day-netherlands/index.md index da1de3273..cc10ba7eb 100644 --- a/src/en/community/events/2024/cloudstack-and-ceph-day-netherlands/index.md +++ b/src/en/community/events/2024/cloudstack-and-ceph-day-netherlands/index.md @@ -14,10 +14,10 @@ Get ready for a power-packed day, delving into all things Apache CloudStack and #### What to expect: -* **Ceph updates:** Stay updated about the latest Ceph releases, the latest features, and tap into its full potential as a storage system. -* **Apache CloudStack updates:** Gain a sneakpeak into the future with the Apache CloudStack 4.19 release, discover fresh integrations and features that are set to redefine cloud orchestration. -* **Real stories, real wins:** Gain insights from users who've achieved remarkable success by leveraging Ceph and Apache CloudStack together. -* **What’s next?:** Explore the future of open-source tech, discussing the course for innovations that will shape the digital landscape. +- **Ceph updates:** Stay updated about the latest Ceph releases, the latest features, and tap into its full potential as a storage system. +- **Apache CloudStack updates:** Gain a sneakpeak into the future with the Apache CloudStack 4.19 release, discover fresh integrations and features that are set to redefine cloud orchestration. +- **Real stories, real wins:** Gain insights from users who've achieved remarkable success by leveraging Ceph and Apache CloudStack together. +- **What’s next?:** Explore the future of open-source tech, discussing the course for innovations that will shape the digital landscape. ## Important Dates @@ -32,6 +32,6 @@ Join the Ceph announcement list, or follow Ceph on social media for Ceph event updates: - [Ceph Announcement list](https://lists.ceph.io/postorius/lists/ceph-announce.ceph.io/) -- [Twitter](https://twitter.com/ceph) +- [Twitter](https://x.com/ceph) - [LinkedIn](https://www.linkedin.com/company/ceph/) - [FaceBook](https://www.facebook.com/cephstorage/) diff --git a/src/en/community/events/2024/user-dev-meeting/index.md b/src/en/community/events/2024/user-dev-meeting/index.md index f92fd605a..fc73d960a 100644 --- a/src/en/community/events/2024/user-dev-meeting/index.md +++ b/src/en/community/events/2024/user-dev-meeting/index.md @@ -30,6 +30,6 @@ updates: - [Ceph User list](https://lists.ceph.io/postorius/lists/ceph-users.ceph.io/) - [Ceph Dev list](https://lists.ceph.io/postorius/lists/dev.ceph.io/) -- [X/Twitter](https://twitter.com/ceph) +- [X/Twitter](https://x.com/ceph) - [LinkedIn](https://www.linkedin.com/company/ceph/) - [FaceBook](https://www.facebook.com/cephstorage/) diff --git a/src/en/community/events/2025/ceph-days-india/index.md b/src/en/community/events/2025/ceph-days-india/index.md index 4cca8bb3d..421857a70 100644 --- a/src/en/community/events/2025/ceph-days-india/index.md +++ b/src/en/community/events/2025/ceph-days-india/index.md @@ -242,11 +242,10 @@ MicroCeph is an opinionated ceph orchestration tool which allows for single comm Closing Remarks - Join the Ceph announcement list, or follow Ceph on social media for Ceph event updates: - [Ceph Announcement list](https://lists.ceph.io/postorius/lists/ceph-announce.ceph.io/) -- [Twitter](https://twitter.com/ceph) +- [X](https://x.com/ceph) - [LinkedIn](https://www.linkedin.com/company/ceph/) -- [FaceBook](https://www.facebook.com/cephstorage/) \ No newline at end of file +- [FaceBook](https://www.facebook.com/cephstorage/) diff --git a/src/en/news/blog/2012/ceph-is-the-new-black-it-goes-with-everything/index.md b/src/en/news/blog/2012/ceph-is-the-new-black-it-goes-with-everything/index.md index 220a0a36f..208917f10 100644 --- a/src/en/news/blog/2012/ceph-is-the-new-black-it-goes-with-everything/index.md +++ b/src/en/news/blog/2012/ceph-is-the-new-black-it-goes-with-everything/index.md @@ -2,7 +2,7 @@ title: "Ceph is the new black. It goes with everything!" date: "2012-10-17" author: "scuttlemonkey" -tags: +tags: --- In my (rather brief) time digging in to Ceph and working with the community, most discussions generally boil down to two questions: _“How does Ceph work?”_ and _“What can I do with Ceph?”_ The first question has garnered a fair amount of attention in our outreach efforts. Ross Turk’s post “[More Than an Object Store](http://ceph.com/community/more-than-an-object-store/ "More Than an Object Store")” does a fantastic job summarizing Ceph’s magic. The second question is what I will address below. @@ -73,6 +73,6 @@ Other avenues of study could incorporate things like cluster power efficiency, m ### Conclusion -Now that you have read the details, you can see our skip-to-the-end conclusion of “a blindingly awesome ton” was pretty accurate, even with today’s list. This list grows every day thanks to the creativity of our community. We are all deeply excited to see what fancy new cloud apps, massive data applications, or other incredibly creative new tools might be built on top of Ceph tomorrow! If you have questions, ideas, or requests please feel free to snag us at one of the stops on our rigorous trade show schedule, on irc (irc.oftc.net #ceph), or on Twitter ([@Ceph](http://twitter.com/ceph) or [@Inktank](http://twitter.com/inktank)). We’d love to hear from you. +Now that you have read the details, you can see our skip-to-the-end conclusion of “a blindingly awesome ton” was pretty accurate, even with today’s list. This list grows every day thanks to the creativity of our community. We are all deeply excited to see what fancy new cloud apps, massive data applications, or other incredibly creative new tools might be built on top of Ceph tomorrow! If you have questions, ideas, or requests please feel free to snag us at one of the stops on our rigorous trade show schedule, on irc (irc.oftc.net #ceph), or on X ([@Ceph](https://x.com/ceph) or [@Inktank](https://x.com/inktank)). We’d love to hear from you. ![](http://track.hubspot.com/__ptq.gif?a=268973&k=14&bu=http://ceph.com&r=http://ceph.com/community/ceph-is-the-new-black-it-goes-with-everything/&bvt=rss&p=wordpress) diff --git a/src/en/news/blog/2012/getting-involved-with-ceph/index.md b/src/en/news/blog/2012/getting-involved-with-ceph/index.md index fe1a96ffc..68c8d5e54 100644 --- a/src/en/news/blog/2012/getting-involved-with-ceph/index.md +++ b/src/en/news/blog/2012/getting-involved-with-ceph/index.md @@ -2,7 +2,7 @@ title: "Getting Involved with Ceph" date: "2012-11-19" author: "scuttlemonkey" -tags: +tags: --- The Ceph community is made up of many individuals with a wide variety of backgrounds, from FOSS hacker to corporate architect. We feel very fortunate to have such a great, and active, community. Even more so lately, as we have been fielding a number of questions on how best to become a more active participant in the Ceph community. With that in mind we decided it was time to sketch out a brief menu of different engagement opportunities to make it easy for anyone (not just developers) to take part in our digital revolution. @@ -48,7 +48,7 @@ If you would like to pass along anything doc-related, feel free to simply drop a [![](images/hands-holding-ceph.jpg)](http://objects.dreamhost.com/community/newsletter/img/hands-holding-ceph.jpg) -We love it that you are interested in Ceph! Please help us spread the word wherever you might find yourself. From the enterprise to college campuses, we have tons of stuff going on for just about any audience. We do love it when new friends play in our sandboxes, so feel free to find us on [Facebook](https://www.facebook.com/cephstorage), [Twitter](http://twitter.com/ceph), [Google+](https://plus.google.com/100228383599142686318/posts), and [GitHub](https://github.com/ceph/). +We love it that you are interested in Ceph! Please help us spread the word wherever you might find yourself. From the enterprise to college campuses, we have tons of stuff going on for just about any audience. We do love it when new friends play in our sandboxes, so feel free to find us on [Facebook](https://www.facebook.com/cephstorage), [X](https://x.com/ceph), [Google+](https://plus.google.com/100228383599142686318/posts), and [GitHub](https://github.com/ceph/). As you can see there are tons of ways to be a part of the Ceph community and all it generally takes is poking someone with a semi-sharp stick. We’re happy to help anyone that has questions, whether it’s a quick chat on IRC or ongoing support via [Inktank](http://inktank.com). We look forward to building “The Future of Storage” with you. diff --git a/src/en/news/blog/2013/ceph-comes-to-synnefo-and-ganeti/index.md b/src/en/news/blog/2013/ceph-comes-to-synnefo-and-ganeti/index.md index f2d6df745..75cc1cf46 100644 --- a/src/en/news/blog/2013/ceph-comes-to-synnefo-and-ganeti/index.md +++ b/src/en/news/blog/2013/ceph-comes-to-synnefo-and-ganeti/index.md @@ -2,12 +2,12 @@ title: "Ceph Comes to Synnefo and Ganeti" date: "2013-02-12" author: "scuttlemonkey" -tags: +tags: --- During my most recent schlep through Europe I met some really great people, and heard some awesome Ceph use cases. One particularly interesting case was the work the guys at Synnefo shared with me at [FOSDEM](https://fosdem.org/2013/) that they have been doing with Ganeti and RADOS. They were nice enough to write up some of the details on their blog and give me permission to repost here. -If any of you have interesting things that you have done with Ceph we always want to hear about it. Feel free to send a link to [@Ceph](http://twitter.com/ceph) or email it to our [Community](mailto:community@inktank.com) alias. Now, on to the goods! +If any of you have interesting things that you have done with Ceph we always want to hear about it. Feel free to send a link to [@Ceph](https://x.com/ceph) or email it to our [Community](mailto:community@inktank.com) alias. Now, on to the goods! [![](images/synnefo-logo.png "synnefo-logo")](http://www.synnefo.org/) @@ -63,6 +63,6 @@ Enjoy! —————- -_REPOSTED FROM:_ [http://www.synnefo-software.blogspot.com/2013/02/we-are-happy-to-announce-that-synnefo\_11.html](http://www.synnefo-software.blogspot.com/2013/02/we-are-happy-to-announce-that-synnefo_11.html) +_REPOSTED FROM:_ [http://www.synnefo-software.blogspot.com/2013/02/we-are-happy-to-announce-that-synnefo_11.html](http://www.synnefo-software.blogspot.com/2013/02/we-are-happy-to-announce-that-synnefo_11.html) ![](http://track.hubspot.com/__ptq.gif?a=268973&k=14&bu=http://ceph.com&r=http://ceph.com/community/ceph-comes-to-synnefo-and-ganeti/&bvt=rss&p=wordpress) diff --git a/src/en/news/blog/2013/ceph-developer-summit-dumpling/index.md b/src/en/news/blog/2013/ceph-developer-summit-dumpling/index.md index 7a3fa7249..41673b329 100644 --- a/src/en/news/blog/2013/ceph-developer-summit-dumpling/index.md +++ b/src/en/news/blog/2013/ceph-developer-summit-dumpling/index.md @@ -2,21 +2,21 @@ title: "Ceph Developer Summit: Dumpling" date: "2013-04-12" author: "scuttlemonkey" -tags: +tags: --- Come one, come all, to the world’s first (virtual) Ceph Developer Summit! Now that the Ceph project has moved to a regular release schedule we are trying to be more transparent about the [planning process](http://www.inktank.com/about-inktank/roadmap/). To that end, we would like to invite participation from any interested parties as the next release of Ceph (and beyond) is planned. Starting today we will be accepting blueprint submissions via the [relaunched Ceph wiki](http://wiki.ceph.com). The timeline for submissions and announcements is as follows: -| Date | Milestone | -| --- | --- | -| 11 APR | Summit announced, blueprint submissions begin | -| 29 APR | Blueprint submission closed | -| 01 MAY | Summit agenda announced | -| **07 MAY** | **Ceph Developer Summit** | -| 08 JUL | Dumpling Feature Freeze | -| August | Dumpling Release | +| Date | Milestone | +| ---------- | --------------------------------------------- | +| 11 APR | Summit announced, blueprint submissions begin | +| 29 APR | Blueprint submission closed | +| 01 MAY | Summit agenda announced | +| **07 MAY** | **Ceph Developer Summit** | +| 08 JUL | Dumpling Feature Freeze | +| August | Dumpling Release | Interested in submitting a blueprint? Click this button. Want more details? Read on! @@ -43,7 +43,7 @@ Given how geographically disparate both our development team and the general Cep The underlying purpose of the summit will be to discuss _how_ features should be implemented (rather than _which_ features should be implemented). Once blueprint submission closes, Sage will review all available documents and decide which are the most relevent features that need to be discussed. Simple stand-alone projects probably don’t need a discussion, but please still create the blueprint. Even if you don’t provide a blueprint in time, you can still land work in ‘Dumpling,’ so make sure to get that blueprint up! -Keep your eyes peeled for the connection details as the event gets closer. We’ll be sure to share them via the blog, twitter, facebook, google+, irc, mailing-list, and general word of mouth. In the meantime, if you have questions, comments, or anything for the good of the cause, feel free to hit up our [community team](mailto:community@inktank.com). Looking forward to your suggestions and your bright, smiling faces at the Developer Summit. +Keep your eyes peeled for the connection details as the event gets closer. We’ll be sure to share them via the blog, X, facebook, google+, irc, mailing-list, and general word of mouth. In the meantime, if you have questions, comments, or anything for the good of the cause, feel free to hit up our [community team](mailto:community@inktank.com). Looking forward to your suggestions and your bright, smiling faces at the Developer Summit. scuttlemonkey out diff --git a/src/en/news/blog/2013/ceph-developer-summit-emperor/index.md b/src/en/news/blog/2013/ceph-developer-summit-emperor/index.md index 9a13cf064..f21dafd08 100644 --- a/src/en/news/blog/2013/ceph-developer-summit-emperor/index.md +++ b/src/en/news/blog/2013/ceph-developer-summit-emperor/index.md @@ -2,19 +2,19 @@ title: "Ceph Developer Summit: Emperor" date: "2013-07-18" author: "scuttlemonkey" -tags: +tags: --- It’s that time again! Time for the (virtual) Ceph Developer Summit. We are currently [accepting community blueprints](http://wiki.ceph.com/01Planning/02Blueprints/Emperor) for ‘Emperor,’ the next stable release of Ceph, which is due out in November. This summit will be slightly different from the Dumpling summit in that it will be spread over two days to give some of our more geographically disparate community members the opportunity to participate. Below you can find the timeline for all summit activities. -| Date | Milestone | -| --- | --- | -| 03 JUL | Blueprint submissions begin | -| 30 JUL | Blueprint submissions end | -| 01 AUG | Summit agenda announced | -| 05 AUG | **Ceph Developer Summit: Day 1** | -| 06 AUG | **Ceph Developer Summit: Day 2** | -| November | Emperor Release | +| Date | Milestone | +| -------- | -------------------------------- | +| 03 JUL | Blueprint submissions begin | +| 30 JUL | Blueprint submissions end | +| 01 AUG | Summit agenda announced | +| 05 AUG | **Ceph Developer Summit: Day 1** | +| 06 AUG | **Ceph Developer Summit: Day 2** | +| November | Emperor Release | If you are interested in submitting a blueprint, collaborating on an existing blueprint, or just attending to learn more about Ceph, read on! @@ -22,7 +22,7 @@ If you are interested in submitting a blueprint, collaborating on an existing bl ### Planned Work -The folks at Inktank are already ramping up work on the next step on [asynchronous replication](http://www.inktank.com/about-inktank/roadmap/), and the community is continuing the work on [erasure coding](http://wiki.ceph.com/01Planning/02Blueprints/Emperor/Erasure_coded_storage_backend_(step_2)) led by Cloudwatt’s Loic Dachary. There are several other blueprints slated for submission, but we could always use more! If you have an idea for work you would like to do to improve or extend Ceph, please submit it before the developer summit! We welcome all suggestions, even if you don’t have all the skills to complete the work. Now is the time to lobby for help! +The folks at Inktank are already ramping up work on the next step on [asynchronous replication](http://www.inktank.com/about-inktank/roadmap/), and the community is continuing the work on [erasure coding]() led by Cloudwatt’s Loic Dachary. There are several other blueprints slated for submission, but we could always use more! If you have an idea for work you would like to do to improve or extend Ceph, please submit it before the developer summit! We welcome all suggestions, even if you don’t have all the skills to complete the work. Now is the time to lobby for help! If you are interested in looking at some of the available tasks you can also take a spin through the [Ceph Tracker](http://tracker.ceph.com/). There are many tasks ranging from novice to expert that are available to be tackled, and we love to help new community members get up to speed. Some ideas that might be interesting to newcomers are: @@ -39,7 +39,7 @@ Just as with the Dumpling developer summit we will be hosting this as a virtual As before, the underlying purpose of the summit will be to discuss how features should be implemented (rather than which features should be implemented). Once blueprint submission closes, Sage will review all available documents and decide which are the most relevent features that need to be discussed. Simple stand-alone projects probably don’t need a discussion, but please still create the blueprint. -Keep your eyes peeled for the connection details as the event gets closer. We’ll be sure to share them via the blog, twitter, facebook, google+, irc, mailing-list, and general word of mouth. In the meantime, if you have questions, comments, or anything for the good of the cause, feel free to hit up our community team. Looking forward to your suggestions and your bright, smiling faces at the Developer Summit. +Keep your eyes peeled for the connection details as the event gets closer. We’ll be sure to share them via the blog, X, facebook, google+, irc, mailing-list, and general word of mouth. In the meantime, if you have questions, comments, or anything for the good of the cause, feel free to hit up our community team. Looking forward to your suggestions and your bright, smiling faces at the Developer Summit. scuttlemonkey out diff --git a/src/en/news/blog/2013/deploying-ceph-with-comodit/index.md b/src/en/news/blog/2013/deploying-ceph-with-comodit/index.md index ca59a7ae1..e0e7a018f 100644 --- a/src/en/news/blog/2013/deploying-ceph-with-comodit/index.md +++ b/src/en/news/blog/2013/deploying-ceph-with-comodit/index.md @@ -2,12 +2,12 @@ title: "Deploying Ceph with ComodIT" date: "2013-02-14" author: "scuttlemonkey" -tags: +tags: --- At this year’s [Cloud Expo Europe](http://www.cloudexpoeurope.com/) I had a nice chat with the guys from ComodIT who are making some interesting deployment and orchestration tools. They were kind enough to include their work in a blog post earlier this week and give me permission to replicate it here for your consumption. -As always, if any of you have interesting things that you have done with Ceph we always want to hear about it. Feel free to send a link to [@Ceph](http://twitter.com/ceph) or email it to our [Community](mailto:community@inktank.com) alias. Now enjoy this week’s slice of deployment goodness. +As always, if any of you have interesting things that you have done with Ceph we always want to hear about it. Feel free to send a link to [@Ceph](https://x.com/ceph) or email it to our [Community](mailto:community@inktank.com) alias. Now enjoy this week’s slice of deployment goodness. ### Effortless deployment and scaling of a Ceph cluster @@ -48,70 +48,68 @@ scuttlemonkey: it’s also worth noting here that while I deployed from an Ubunt ### Deployment 1. Clone the demos public repository and enter Ceph cluster’s folder: - - git clone https://github.com/comodit/demos.git - cd demos/ceph-cluster - + + git clone https://github.com/comodit/demos.git + cd demos/ceph-cluster + 2. Create a config.py file with the following content: - - scuttlemonkey: I noticed that there was a config.py.sample here, so I just did a ‘cp config.py.sample config.py’ and edited the values required. - - endpoint = "https://my.comodit.com/api" - - username = "" - password = "" - organization = "" - - time\_out = 60 \* 30 # seconds - - admin\_key = "AQAEKwlRgBqsDhAA7cwN/JtEyCym6vYN/ixHqA==" - - platform = {"name" : "", - "settings" : { ... } - } - - distribution = {"name" : "", - "settings" : { ... } - } - - where and are your ComodIT credentials, the name of your organization, the name of a platform in your organization and the name of a distribution in your organization. You should also fill the settings for both platform and distribution. - - scuttlemonkey: Platform and Distribution are things you define in your ComodIT web GUI. For the purposes of this demo I would suggest creating and using an ‘ec2′ paltform and just using ComodIT’s ‘Default Distribution’ (a CentOS image with the user data stuff already configured). - - For instance, you may use an Amazon EC2 platform and store’s CentOS 6.3 AMI. In this case, platform settings look like: - - "settings" : { - "ec2.instanceType": "t1.micro", - "ec2.securityGroups": "default", - "ec2.zone": "eu-west-1a", - "ec2.keyPair": "" - } - - scuttlemonkey: I chose to leave ec2.zone blank in this case as Amazon was pitching a fit about us-east-1a at the time I was testing this. - - where is a key pair name and distribution takes no setting: - - "settings" : {} - + + scuttlemonkey: I noticed that there was a config.py.sample here, so I just did a ‘cp config.py.sample config.py’ and edited the values required. + + endpoint = "https://my.comodit.com/api" + + username = "" + password = "" + organization = "" + + time_out = 60 \* 30 # seconds + + admin_key = "AQAEKwlRgBqsDhAA7cwN/JtEyCym6vYN/ixHqA==" + + platform = {"name" : "", + "settings" : { ... } + } + + distribution = {"name" : "", + "settings" : { ... } + } + + where and are your ComodIT credentials, the name of your organization, the name of a platform in your organization and the name of a distribution in your organization. You should also fill the settings for both platform and distribution. + + scuttlemonkey: Platform and Distribution are things you define in your ComodIT web GUI. For the purposes of this demo I would suggest creating and using an ‘ec2′ paltform and just using ComodIT’s ‘Default Distribution’ (a CentOS image with the user data stuff already configured). + + For instance, you may use an Amazon EC2 platform and store’s CentOS 6.3 AMI. In this case, platform settings look like: + + "settings" : { + "ec2.instanceType": "t1.micro", + "ec2.securityGroups": "default", + "ec2.zone": "eu-west-1a", + "ec2.keyPair": "" + } + + scuttlemonkey: I chose to leave ec2.zone blank in this case as Amazon was pitching a fit about us-east-1a at the time I was testing this. + + where is a key pair name and distribution takes no setting: + + "settings" : {} + 3. Setup your ComodIT account i.e. create all required applications and create an environment that will contain cluster’s hosts: - - ./setup.py - + + ./setup.py + 4. Actually deploy the cluster: - - ./deploy.py - - A simple Ceph cluster composed of 1 MON, 1 MDS and 2 OSDs hosted by 3 hosts is deployed: the MON and the MDS are hosted by the same host, the OSDs have their own host. Of course, this is not an architecture to use in production, you should always have several MONs. The complete deployment takes a few minutes on Amazon EC2. - + + ./deploy.py + + A simple Ceph cluster composed of 1 MON, 1 MDS and 2 OSDs hosted by 3 hosts is deployed: the MON and the MDS are hosted by the same host, the OSDs have their own host. Of course, this is not an architecture to use in production, you should always have several MONs. The complete deployment takes a few minutes on Amazon EC2. scuttlemonkey: it’s worth noting here that if you have an error, or need to ^C out to fix or tweak something, you’ll want to run the ./teardown.py script to reset the stored variables on mon/osd number. If you don’t it may just sit there waiting for a machine to deploy that never will (this is an early prototype afterall). 6. Deployment script prints the public address of what we call the master node i.e. the computer hosting the monitor and MDS. You can connect to this host using SSH and check cluster’s health using the following command (executed as super-user or root): - - ceph -s - - See [Ceph’s documentation](http://ceph.com/docs/master/rados/operations/monitoring/#checking-a-cluster-s-status) for more details. - + + ceph -s + + See [Ceph’s documentation](http://ceph.com/docs/master/rados/operations/monitoring/#checking-a-cluster-s-status) for more details. scuttlemonkey: In case you are used to using Ubuntu hosts like I am you’ll need to use ‘ec2-user’ and whatever key pair you specified at ComodIT setup for logging in to your CentOS box. @@ -119,17 +117,17 @@ scuttlemonkey: In case you are used to using Ubuntu hosts like I am you’ll nee Add an OSD to deployed cluster: -./scale\_osds.py -c 1 +./scale_osds.py -c 1 \-c option is the number of OSDs to add. -scuttlemonkey: in my case, the ‘-c 1′ portion was causing the script to choke (perhaps some issue w/ arg parsing from Cent vs Ubuntu?). I didn’t really poke around to find out, the ./scale\_osds.py script defaults to 1 so I just ran it without args and it worked fine. +scuttlemonkey: in my case, the ‘-c 1′ portion was causing the script to choke (perhaps some issue w/ arg parsing from Cent vs Ubuntu?). I didn’t really poke around to find out, the ./scale_osds.py script defaults to 1 so I just ran it without args and it worked fine. ### Scaling up (MONs) Add a monitor to deployed cluster: -./scale\_mons.py -c 1 +./scale_mons.py -c 1 \-c option is the number of monitors to add. diff --git a/src/en/news/blog/2013/dreamobjects-case-study-webinar/index.md b/src/en/news/blog/2013/dreamobjects-case-study-webinar/index.md index 6f4cb09c4..8f3fa279b 100644 --- a/src/en/news/blog/2013/dreamobjects-case-study-webinar/index.md +++ b/src/en/news/blog/2013/dreamobjects-case-study-webinar/index.md @@ -2,7 +2,7 @@ title: "DreamObjects Case Study Webinar" date: "2013-02-06" author: "syndicated" -tags: +tags: --- [![](images/do.png)](http://www.inktank.com/wp-content/uploads/2013/02/do.png "DreamObjects Case Study Webinar") @@ -20,6 +20,6 @@ You can register for the webinar [here](http://www.inktank.com/news-events/webin Kyle -[@mmgaggle](https://twitter.com/mmgaggle) +[@mmgaggle](https://x.com/mmgaggle) ![](http://track.hubspot.com/__ptq.gif?a=265024&k=14&bu=http%3A%2F%2Fwww.inktank.com&r=http%3A%2F%2Fwww.inktank.com%2Finktank-blog%2Fdreamobjects-case-study-webinar%2F&bvt=rss&p=wordpress) diff --git a/src/en/news/blog/2013/dynamic-object-interfaces-with-lua/index.md b/src/en/news/blog/2013/dynamic-object-interfaces-with-lua/index.md index 6a1349a66..715384f5d 100644 --- a/src/en/news/blog/2013/dynamic-object-interfaces-with-lua/index.md +++ b/src/en/news/blog/2013/dynamic-object-interfaces-with-lua/index.md @@ -2,13 +2,13 @@ title: "Dynamic Object Interfaces with Lua" date: "2013-10-29" author: "noah" -tags: +tags: - "lua" --- In this post I’m going to demonstrate how to dynamically extend the interface of objects in RADOS using the [Lua](http://www.lua.org/) scripting language, and then build an example service for image thumbnail generation and storage that performs remote image processing inside a target object storage device (OSD). We’re gonna have a lot of fun. -Before we get started, since this is my first post on ceph.com, I want to introduce myself. I’m [Noah Watkins](http://twitter.com/noahdesu), a PhD student and an occasional contributor to the Ceph project. I worked for [Inktank](http://www.inktank.com) over the summer, and also I maintain the Ceph Hadoop bindings. +Before we get started, since this is my first post on ceph.com, I want to introduce myself. I’m [Noah Watkins](https://x.com/noahdesu), a PhD student and an occasional contributor to the Ceph project. I worked for [Inktank](http://www.inktank.com) over the summer, and also I maintain the Ceph Hadoop bindings. . @@ -21,46 +21,46 @@ One of the less publicized features of the RADOS object store is the ability to The straightforward method for a client to compute the MD5 hash of an object is to first retrieve the entire object and then apply the MD5 hash function to the data locally. Using librados and the crypotpp library, this might look something like the following: bufferlist data; -size\_t size; +size_t size; -ioctx.read("my\_obj", data, 0, 0); +ioctx.read("my_obj", data, 0, 0); byte digest\[AES::BLOCKSIZE\]; -MD5().CalculateDigest(digest, (byte\*)data.c\_str(), data.length()); +MD5().CalculateDigest(digest, (byte\*)data.c_str(), data.length()); Here the client first reads the entire object over the network, and then computes the MD5 hash of the object data. However, transferring the entire object to the client can be avoided by introducing a custom object interface for computing the MD5 hash within the storage system. The following code snippet illustrates the basics of how an MD5 hash could be computed using the object class facility. Note that the following code would in practice be compiled into a shared library and loaded dynamically into a running OSD process, but we’ve omitted the deployment details to keep things simple (there are links at the end of this section to more information on getting started with object classes). -int compute\_md5(cls\_method\_context\_t hctx, bufferlist \*in, bufferlist \*out) +int compute_md5(cls_method_context_t hctx, bufferlist \*in, bufferlist \*out) { - size\_t size; - int ret \= cls\_cxx\_stat(hctx, &size, NULL); - if (ret < 0) - return ret; +size_t size; +int ret \= cls_cxx_stat(hctx, &size, NULL); +if (ret < 0) +return ret; - bufferlist data; - ret \= cls\_cxx\_read(hctx, 0, size, data); - if (ret < 0) - return ret; +bufferlist data; +ret \= cls_cxx_read(hctx, 0, size, data); +if (ret < 0) +return ret; - byte digest\[AES::BLOCKSIZE\]; - MD5().CalculateDigest(digest, (byte\*)data.c\_str(), data.length()); +byte digest\[AES::BLOCKSIZE\]; +MD5().CalculateDigest(digest, (byte\*)data.c_str(), data.length()); - out\-\>append(digest, sizeof(digest)); - return 0; +out\-\>append(digest, sizeof(digest)); +return 0; } -Before explaining the function _compute\_md5_, let’s see how a client would remotely invoke _compute\_md5_ to calculate the hash: +Before explaining the function _compute_md5_, let’s see how a client would remotely invoke _compute_md5_ to calculate the hash: bufferlist input, output; -ioctx.exec("my\_obj", "my\_hash\_class", "compute\_md5", input, output); +ioctx.exec("my_obj", "my_hash_class", "compute_md5", input, output); -Here the client runs the librados _exec_ method to invoke the _compute\_md5_ function remotely on the object named “my\_obj”. Note that the “my\_hash\_class” is a name that identifies the plugin (not shown in this tutorial), and may contain many functions that can be invoked remotely. Now, through the power of networking, and lots of hand waving, a client can invoke the _compute\_md5_ function above which will run remotely on the OSD storing the target object (these are lots of gory details about how this actually happens that are beyond the scope of this document). When the remote method is executed, it performs a transaction that atomically reads the object payload and computes the MD5 hash, all within the OSD process, avoiding any network transfer of object data. At the end of the _compute\_md5_ function the digest is written into the _out_ parameter that will be marshaled back to the client. +Here the client runs the librados _exec_ method to invoke the _compute_md5_ function remotely on the object named “my*obj”. Note that the “my_hash_class” is a name that identifies the plugin (not shown in this tutorial), and may contain many functions that can be invoked remotely. Now, through the power of networking, and lots of hand waving, a client can invoke the \_compute_md5* function above which will run remotely on the OSD storing the target object (these are lots of gory details about how this actually happens that are beyond the scope of this document). When the remote method is executed, it performs a transaction that atomically reads the object payload and computes the MD5 hash, all within the OSD process, avoiding any network transfer of object data. At the end of the _compute_md5_ function the digest is written into the _out_ parameter that will be marshaled back to the client. Now that is some pretty magical stuff right there. But, there are situations where the overhead of compiling C/C++ into a shared library–potentially with multiple target architectures–is too heavy weight. It’d be nice if we could inject and alter object interfaces on-the-fly. To address this need, we’ve created a mechanism for defining new object classes using the Lua scripting language, which I’ll describe next. ## Additional Resources: Object Class Development -While it was necessary to introduce the concept of object classes, unfortunately a full tutorial on the subject is not in the scope of this post. Located on github is a “Hello, World” example object class containing extensive documentation: [https://github.com/ceph/ceph/blob/master/src/cls/hello/cls\_hello.cc](https://github.com/ceph/ceph/blob/master/src/cls/hello/cls_hello.cc). This resource is a good starting point, and if you have questions, please do not hesitate to ask questions on the [Ceph mailing lists or IRC channels](http://ceph.com/resources/mailing-list-irc/). +While it was necessary to introduce the concept of object classes, unfortunately a full tutorial on the subject is not in the scope of this post. Located on github is a “Hello, World” example object class containing extensive documentation: [https://github.com/ceph/ceph/blob/master/src/cls/hello/cls_hello.cc](https://github.com/ceph/ceph/blob/master/src/cls/hello/cls_hello.cc). This resource is a good starting point, and if you have questions, please do not hesitate to ask questions on the [Ceph mailing lists or IRC channels](http://ceph.com/resources/mailing-list-irc/). # Dynamic Object Classes With Lua @@ -76,7 +76,7 @@ function helper() end function handler1(input, output) - helper() +helper() end function handler2(input, output) @@ -92,11 +92,11 @@ In the above Lua script any number of functions and modules can be used to suppo Object classes written in Lua may have many functions, only a subset of which are handlers available to be directly invoked by a client. In order to make a Lua function available, the function must be exported by registering it. This is done using the _cls.register_ function. The following code snippet illustrates how this works. function helper() - \-- help out with stuff +\-- help out with stuff end function thehandler(input, output) - helper() +helper() end cls.register(thehandler) @@ -107,24 +107,24 @@ In the above example _cls.register(thehandler)_ exports the function _thehandler In the previous section we presented an example object class method written in C++ that calculated the MD5 hash of an object. Returning to this example, notice that each operation on the object is carefully checked for failure, and an error code is returned if any operation fails. When a negative value is returned from an object class handler the current transaction will be aborted, and the return value is passed back to the client. When the handler has completed successfully a return value of zero will commit the transaction. While in C++ we must perform these checks explicitly, in Lua this common pattern for handling errors can be fully managed. Take as an example the following C++ object class handler: -int handle1(cls\_method\_context\_t hctx, bufferlist \*in, bufferlist \*out) +int handle1(cls_method_context_t hctx, bufferlist \*in, bufferlist \*out) { - int ret \= cls\_cxx\_create(hctx, true); - if (ret < 0) - return ret; - ... - return 0; +int ret \= cls_cxx_create(hctx, true); +if (ret < 0) +return ret; +... +return 0; } -The handler _handle1_ will return _\-EEXIST_ if the object already exists (or any other error encountered when running _cls\_cxx\_create_), and return zero if the handler complete successfully. The same functionality can be constructed in Lua, but when error handling fits this common pattern of aborting automatically, the Lua object class run-time will automagically select the correct return value. For instance in the following example, _handle2_ and _handle3_ have identical semantics to _handle1_ defined above in C++. +The handler *handle1* will return _\-EEXIST_ if the object already exists (or any other error encountered when running _cls_cxx_create_), and return zero if the handler complete successfully. The same functionality can be constructed in Lua, but when error handling fits this common pattern of aborting automatically, the Lua object class run-time will automagically select the correct return value. For instance in the following example, _handle2_ and _handle3_ have identical semantics to _handle1_ defined above in C++. function handle2(input, output) - cls.create(true); - return 0; +cls.create(true); +return 0; end function handle3(input, output) - cls.create(true); +cls.create(true); end cls.register(handle2) @@ -132,47 +132,47 @@ cls.register(handle3) Some operations return error codes that we may want to handle directly. For example, when retrieving a value from the object map, _\-`ENOENT`_ is used to indicate that the given key was not found. If the handler code can deal with this case (e.g. creating and initializing a new key), then it is simple enough to just return all other error codes. This exact scenario is shown in the following C++ handler, in which we abort on any error code that is not _\-ENOENT_. -int handle(cls\_method\_context\_t hctx, bufferlist \*in, bufferlist \*out) +int handle(cls_method_context_t hctx, bufferlist \*in, bufferlist \*out) { - string key; - ::decode(key, \*in); - int ret \= cls\_cxx\_map\_get\_val(hctx, key, &bl); - if (ret < 0 && ret !\= \-ENOENT) - return ret; - if (ret \=\= \-ENOENT) { - /\* initialize new key \*/ - } - ... - return 0; +string key; +::decode(key, \*in); +int ret \= cls_cxx_map_get_val(hctx, key, &bl); +if (ret < 0 && ret !\= \-ENOENT) +return ret; +if (ret \=\= \-ENOENT) { +/\* initialize new key \*/ +} +... +return 0; } The same handler can be constructed in Lua as follows: function handle(input, output) - key \= input:str() - ok, ret\_or\_val \= pcall(cls.map\_get\_val, key) - if not ok then - if ret\_or\_val ~\= \-cls.ENOENT then - return ret\_or\_val - else - \-- initialize new key - end - end - val \= ret\_or\_val - ... - return 0 +key \= input:str() +ok, ret_or_val \= pcall(cls.map_get_val, key) +if not ok then +if ret_or_val ~\= \-cls.ENOENT then +return ret_or_val +else +\-- initialize new key +end +end +val \= ret_or_val +... +return 0 end -The trick here is to call the _cls.map\_get\_val_ in protected mode via the Lua _pcall_ function, which prevents any errors from being automatically propagated to the caller, allowing our handler to examine the return value. +The trick here is to call the _cls.map_get_val_ in protected mode via the Lua _pcall_ function, which prevents any errors from being automatically propagated to the caller, allowing our handler to examine the return value. ## Logging An object class can write into the OSD log (e.g. /var/log/ceph/osd-0.log) to record debugging information using the _cls.log_ function. The function takes any number of arguments which are converted into strings and separated by spaces in the final output. If the first argument is numeric then it is interpreted as a log-level. If no log-level is specified a default log-level is used. -cls.log('hi') \-- will log 'hi' -cls.log(0, 'ouch') \-- log 'ouch' at log-level = 0 +cls.log('hi') \-- will log 'hi' +cls.log(0, 'ouch') \-- log 'ouch' at log-level = 0 cls.log('foo', 'bar') \-- log 'foo bar' -cls.log(1) \-- will log '1' at default log-level +cls.log(1) \-- will log '1' at default log-level Logging is useful in debugging script execution and can also be used to provide more detailed error information. @@ -181,24 +181,24 @@ Logging is useful in debugging script execution and can also be used to provide The payload data of an object can be read from and written to using the **_cls.read_** and _**cls.write**_ functions. Each function takes an offset and length parameter. size, mtime \= cls.stat() -data \= cls.read(0, size) \-- size bytes from offset 0 +data \= cls.read(0, size) \-- size bytes from offset 0 cls.write(0, data:length(), data) \-- length of data at offset 0 ## Index Access -A key/value store supporting range queries (based on Google’s LevelDB) can be accessed using the _cls.map\_set\_val_ and _cls.map\_get\_val_ functions. A key can be any string and a value is a standard blob of any size. +A key/value store supporting range queries (based on Google’s LevelDB) can be accessed using the _cls.map_set_val_ and _cls.map_get_val_ functions. A key can be any string and a value is a standard blob of any size. function handler(input, output) - cls.map\_set\_val("foo", input) - data \= cls.map\_get\_val("foo") - assert(data \=\= input) +cls.map_set_val("foo", input) +data \= cls.map_get_val("foo") +assert(data \=\= input) end ## Additional Resources The Lua object class facility is not yet in the mainline Ceph tree. The feature is located in the cls-lua branch, and can be checked out from github: - git://github.com/ceph/ceph.git cls-lua +git://github.com/ceph/ceph.git cls-lua The normal procedures for building and installing Ceph from source apply, and the only dependency is that LuaJIT development libraries be installed. These dependencies are available on Ubuntu. In addition, more functionality than is listed in this post has been implemented, and a set of unit tests are available in the source tree demonstrating the the full range of features. @@ -213,18 +213,18 @@ Lua bindings for the librados client library are available on github at [https: local rados \= require "rados" local cluster \= rados.create() -cluster:conf\_read\_file() +cluster:conf_read_file() cluster:connect() Next, open a client I/O context for a particular pool: -local ioctx \= cluster:open\_ioctx('data') +local ioctx \= cluster:open_ioctx('data') Now the Lua client can interact with objects, such as setting an extended attribute: local name \= 'xattr key' local data \= 'i am some important data' -ioctx:setxattr('my\_obj', name, data, #data) +ioctx:setxattr('my_obj', name, data, #data) Those are the basics of writing RADOS clients in Lua. Now, let’s run some remote scripts from a Lua client. @@ -233,24 +233,24 @@ Those are the basics of writing RADOS clients in Lua. Now, let’s run some remo The protocol for sending a script to an OSD is fairly simple, but is easily wrapped up in a convenience library. The cls-lua-client located on github at [https://github.com/noahdesu/cls-lua-client/](https://github.com/noahdesu/cls-lua-client/) does just that, building on top of the lua-rados library described in the previous section. Assuming that we have connected to a RADOS cluster and constructed an I/O context object, a remote Lua script can be executed as in the following example. First, let’s create a Lua string containing the script we want to execute. local script \= \[\[ -function say\_hello(input, output) - output:append("Hello, ") - if #input \=\= 0 then - output:append("world") - else - output:append(input:str()) - end - output:append("!") +function say_hello(input, output) +output:append("Hello, ") +if #input \=\= 0 then +output:append("world") +else +output:append(input:str()) +end +output:append("!") end -cls.register(say\_hello) +cls.register(say_hello) \]\] The script above will send to its output the string “Hello, world!” if the input is zero-length. Otherwise, it will reply with “Hello, !”, where is substituted with the input sent from the client. This can be remotely executed using the cls-lua-client library as follows: -local ret, outdata \= clslua.exec(ioctx, "oid", script, "say\_hello", "") +local ret, outdata \= clslua.exec(ioctx, "oid", script, "say_hello", "") print(outdata) -local ret, outdata \= clslua.exec(ioctx, "oid", script, "say\_hello", "John") +local ret, outdata \= clslua.exec(ioctx, "oid", script, "say_hello", "John") print(outdata) Executing this would produce the output: @@ -275,48 +275,48 @@ In the following examples I’ll demonstrate the core of the service. In practic To store an image in RADOS we first read it from a local file, and then write it to the object. In order to support storage and retrieval of different thumbnails, we record the location and size of an image blob in the object index under a key describing it. In this simple example writing an image sets its base image, so we store it under the key “original”. function put(object, filename) - \-- read in image blob from file - local file \= io.open(filename, "rb") - local img \= file:read("\*all") - - \-- write the blob into the object - local size, offset \= #img, 0 - ioctx:write(object, img, size, offset) - - \-- record size/offset in the object index - local loc\_spec \= size .. "@" .. offset - ioctx:omapset(object, { - original \= loc\_spec, - }) +\-- read in image blob from file +local file \= io.open(filename, "rb") +local img \= file:read("\*all") + +\-- write the blob into the object +local size, offset \= #img, 0 +ioctx:write(object, img, size, offset) + +\-- record size/offset in the object index +local loc_spec \= size .. "@" .. offset +ioctx:omapset(object, { +original \= loc_spec, +}) end ## Reducing Round-trips In the previous example two round-trips were required to 1) set the object data and 2) update the index. These can be done atomically in a single round-trip by using a co-designed interface, demonstrated in the following script: -function put\_smart(object, filename) - \-- define the script to execute remotely - local script \= \[\[ - function put(img) - -- write the input blob - local size, offset = #img, 0 - cls.write(offset, size, img) - - -- update the leveldb index - local loc\_spec\_bl = bufferlist.new() - local loc\_spec = size .. "@" .. offset - loc\_spec\_bl:append(spec) - cls.map\_set\_val("original", loc\_spec\_bl) - end - cls.register(store) - \]\] - - \-- read the input image blob from the file - local file \= io.open(filename, "rb") - local img \= file:read("\*all") - - \-- remotely execute script with image as input - clslua.exec(ioctx, object, script, "put", img) +function put_smart(object, filename) +\-- define the script to execute remotely +local script \= \[\[ +function put(img) +-- write the input blob +local size, offset = #img, 0 +cls.write(offset, size, img) + +-- update the leveldb index +local loc_spec_bl = bufferlist.new() +local loc_spec = size .. "@" .. offset +loc_spec_bl:append(spec) +cls.map_set_val("original", loc_spec_bl) +end +cls.register(store) +\]\] + +\-- read the input image blob from the file +local file \= io.open(filename, "rb") +local img \= file:read("\*all") + +\-- remotely execute script with image as input +clslua.exec(ioctx, object, script, "put", img) end The script reads the image from the file and sends the image as the input to a script which executes on the OSD, taking care of the write and index update at the same time. Neat! @@ -326,25 +326,25 @@ The script reads the image from the file and sends the image as the input to a s To read a particular version of an image we need to look-up the offset and length for the target image blob stored in the object index. In the following example the index look-up and object read are performed remotely, and the image is returned to the client if it exists. In the next section I’ll show how the _spec_ string is stored, but for context it describes the specification for creating a thumbnail (e.g. 500×400 pixels). function get(object, filename, spec) - local script \= \[\[ - function get(input, output) - -- lookup the location of the image given the spec - local loc\_spec\_bl = cls.map\_get\_val(input:str()) - local size, offset = string.match(loc\_spec\_bl:str(), "(%d+)@(%d+)") - - -- read and return the image blob from the object - out\_bl = cls.read(offset, size) - output:append(out\_bl:str()) - end - cls.register(get) - \]\] - - \-- execute script remotely - ret, img \= clslua.exec(ioctx, object, script, "get", spec) - - \-- write image to output file - local file \= io.open(filename, "wb") - file:write(img) +local script \= \[\[ +function get(input, output) +-- lookup the location of the image given the spec +local loc_spec_bl = cls.map_get_val(input:str()) +local size, offset = string.match(loc_spec_bl:str(), "(%d+)@(%d+)") + +-- read and return the image blob from the object +out_bl = cls.read(offset, size) +output:append(out_bl:str()) +end +cls.register(get) +\]\] + +\-- execute script remotely +ret, img \= clslua.exec(ioctx, object, script, "get", spec) + +\-- write image to output file +local file \= io.open(filename, "wb") +file:write(img) end The image returned from the script is then written to the output file. @@ -353,43 +353,43 @@ The image returned from the script is then written to the output file. Thumbnails are generated using Lua wrappers to [ImageMagick](http://www.imagemagick.org/) available on github at [https://github.com/leafo/magick](https://github.com/leafo/magick). A thumbnail is generated using the _magick.thumb_ function, passing in an image blob and a thumbnail specification string (e.g. 500×300 pixels). The script that runs remotely first reads the original image, computes the thumbnail, appends the thumbnail to the object payload, and then records the offset and size of the thumbnail in the object index under a key equal to the specification string. -function thumb(object, spec\_string) - local script \= \[\[ - (\*local magick = require "magick" - - function get\_orig\_img() - -- lookup the location of the original image - local loc\_spec\_bl = cls.map\_get\_val("original") - local size, offset = string.match(loc\_spec\_bl:str(), "(%d+)@(%d+)") - - -- read image into memory - return cls.read(offset, size) - end - - function thumb(input, output) - -- apply thumbnail spec to original image - local spec\_string = input:str() - local blob = get\_orig\_img() - local img = assert(magick.load\_image\_from\_blob(blob:str())) - img = magick.thumb(img, spec\_string) - - -- append thumbnail to object - local obj\_size = cls.stat() - local img\_bl = bufferlist.new() - img\_bl:append(img) - cls.write(obj\_size, #img\_bl, img\_bl) - - -- save location in leveldb - local loc\_spec = #img\_bl .. "@" .. obj\_size - local loc\_spec\_bl = bufferlist.new() - loc\_spec\_bl:append(loc\_spec) - cls.map\_set\_val(spec\_string, loc\_spec\_bl) - end - - cls.register(thumb)\*) - \]\] - - clslua.exec(ioctx, object, script, "thumb", spec\_string) +function thumb(object, spec_string) +local script \= \[\[ +(\*local magick = require "magick" + +function get_orig_img() +-- lookup the location of the original image +local loc_spec_bl = cls.map_get_val("original") +local size, offset = string.match(loc_spec_bl:str(), "(%d+)@(%d+)") + +-- read image into memory +return cls.read(offset, size) +end + +function thumb(input, output) +-- apply thumbnail spec to original image +local spec_string = input:str() +local blob = get_orig_img() +local img = assert(magick.load_image_from_blob(blob:str())) +img = magick.thumb(img, spec_string) + +-- append thumbnail to object +local obj_size = cls.stat() +local img_bl = bufferlist.new() +img_bl:append(img) +cls.write(obj_size, #img_bl, img_bl) + +-- save location in leveldb +local loc_spec = #img_bl .. "@" .. obj_size +local loc_spec_bl = bufferlist.new() +loc_spec_bl:append(loc_spec) +cls.map_set_val(spec_string, loc_spec_bl) +end + +cls.register(thumb)\*) +\]\] + +clslua.exec(ioctx, object, script, "thumb", spec_string) end And that’s it folks… on-the-fly custom RADOS object interfaces! Want to contribute? We are continually improving the Lua bindings and the internal Lua object class API and are always looking for feedback. Thanks for stopping by! diff --git a/src/en/news/blog/2013/measure-ceph-rbd-performance-in-a-quantitative-way-part-ii/images/search_publish_icon.jpg b/src/en/news/blog/2013/measure-ceph-rbd-performance-in-a-quantitative-way-part-ii/images/search_publish_icon.jpg index 0330aee58..8e68a6bdd 100644 --- a/src/en/news/blog/2013/measure-ceph-rbd-performance-in-a-quantitative-way-part-ii/images/search_publish_icon.jpg +++ b/src/en/news/blog/2013/measure-ceph-rbd-performance-in-a-quantitative-way-part-ii/images/search_publish_icon.jpg @@ -135,7 +135,7 @@ - + @@ -169,7 +169,7 @@ - + @@ -1227,187 +1227,187 @@ -
- -
- -
-
-
-

-
-
- -
- - -
- - -
- - - -
- - - - -
- - - -
-
- - - -
- alt -
- - - - -
-
- -
- - - - -
-
- - - -
- alt -
- - - - -
-
- -
- - - -
- - - -
-
- - - -
- alt -
- - - - -
-
- -
-
- - - -
- alt -
- - - -
FPGA -
-
-
- -
- - -
- - - -
-
- - - -
- alt -
- - - - -
-
- -
-
- - - -
- alt -
- - - - -
-
- -
-
-
-
-
-
-
+
+ +
+ +
+
+
+

+
+
+ +
+ + +
+ + +
+ + + +
+
+ + + +
+ alt +
+ + + + +
+
+ + +
+
+ + + +
+ alt +
+ + + + +
+
+ +
+ + + +
+
+ + + +
+ alt +
+ + + + +
+
+ +
+ + + + +
+
+ + + +
+ alt +
+ + + + +
+
+ +
+ + + +
+ + + +
+
+ + + +
+ alt +
+ + + + +
+
+ +
+
+ + + +
+ alt +
+ + + +
FPGA +
+
+
+ +
+ + +
+ + + +
+
+ + + +
+ alt +
+ + + + +
+
+ +
+
+ + + +
+ alt +
+ + + + +
+
+ +
+
+
+
+
+
+
@@ -5209,11 +5209,11 @@ -

By submitting this form, you are confirming you are an adult 18 years or older and you agree to share your personal information with Intel to stay connected to the latest Intel technologies and industry trends by email and telephone. You can unsubscribe at any time. Intel’s web sites and communications are subject to our Privacy Notice and Terms of Use.
-

+

By submitting this form, you are confirming you are an adult 18 years or older and you agree to share your personal information with Intel to stay connected to the latest Intel technologies and industry trends by email and telephone. You can unsubscribe at any time. Intel’s web sites and communications are subject to our Privacy Notice and Terms of Use.
+

-

By submitting this form, you are confirming you are an adult 18 years or older and you agree to share your personal information with Intel to stay connected to the latest Intel technologies and industry trends by email and telephone. You can unsubscribe at any time. Intel’s web sites and communications are subject to our Privacy Notice and Terms of Use.
-

+

By submitting this form, you are confirming you are an adult 18 years or older and you agree to share your personal information with Intel to stay connected to the latest Intel technologies and industry trends by email and telephone. You can unsubscribe at any time. Intel’s web sites and communications are subject to our Privacy Notice and Terms of Use.
+

@@ -5514,8 +5514,8 @@
  • - - + +
  • @@ -5629,7 +5629,7 @@ diff --git a/src/en/news/blog/2013/our-first-webinar-getting-started-with-ceph/index.md b/src/en/news/blog/2013/our-first-webinar-getting-started-with-ceph/index.md index 1d7a8c8c0..a49c1e10e 100644 --- a/src/en/news/blog/2013/our-first-webinar-getting-started-with-ceph/index.md +++ b/src/en/news/blog/2013/our-first-webinar-getting-started-with-ceph/index.md @@ -2,13 +2,13 @@ title: "Our First Webinar – Getting Started With Ceph" date: "2013-01-18" author: "syndicated" -tags: +tags: - "ceph" --- [![](images/Workplace-Violence-Webinar-e1358536924128.png "Workplace-Violence-Webinar")](http://www.inktank.com/wp-content/uploads/2013/01/Workplace-Violence-Webinar-e1358536924128.png "Workplace-Violence-Webinar") -Yesterday was another milestone for our Inktank scrapbook. We hosted our first webinar titled “Getting Started with [Ceph](http://ceph.com/ceph-storage/)”. Our technical marketing engineer/overall nice guy [@klivansky](https://twitter.com/klivansky) presented the webinar, which lasted one hour and covered the basics of getting setup with Ceph. +Yesterday was another milestone for our Inktank scrapbook. We hosted our first webinar titled “Getting Started with [Ceph](http://ceph.com/ceph-storage/)”. Our technical marketing engineer/overall nice guy [@klivansky](https://x.com/klivansky) presented the webinar, which lasted one hour and covered the basics of getting setup with Ceph. He covered… @@ -26,16 +26,16 @@ He covered… Missed the webinar? No problem, we have you covered with a [replay](https://www.brighttalk.com/webcast/8847/63173). Hint! The attachment tab in the replay will allow you to download just the slides. -Calling all [OpenStack](http://www.openstack.org/) junkies! Our next webinar is on “[Ceph With OpenStack](https://www.brighttalk.com/webcast/8847/63177)”. Co-hosting this webinar is [Kamesh Pemmaraju](https://twitter.com/kpemmaraju) of [Dell’s OpenStack-Powered Cloud Solution group](http://content.dell.com/us/en/enterprise/by-need-it-productivity-data-center-change-response-openstack-cloud), our latest partner. [Register today!](https://www.brighttalk.com/webcast/8847/63177) +Calling all [OpenStack](http://www.openstack.org/) junkies! Our next webinar is on “[Ceph With OpenStack](https://www.brighttalk.com/webcast/8847/63177)”. Co-hosting this webinar is [Kamesh Pemmaraju](https://x.com/kpemmaraju) of [Dell’s OpenStack-Powered Cloud Solution group](http://content.dell.com/us/en/enterprise/by-need-it-productivity-data-center-change-response-openstack-cloud), our latest partner. [Register today!](https://www.brighttalk.com/webcast/8847/63177) For a full list of Ceph webinars in the series – [click here](http://www.inktank.com/news-events/webinars/) If you think of a Ceph webinar you would like to see, shoot us an email at [marketing@inktank.com](mailto:marketing@inktank.com). Happy Friday! -[@JudeFitzz](https://twitter.com/JudeFitzz) +[@JudeFitzz](https://x.com/JudeFitzz) -[Follow](https://twitter.com/inktank) Inktank on Twitter +[Follow](https://x.com/inktank) Inktank on X [Like](https://www.facebook.com/inktank) Inktank on Facebook [Subscribe](http://www.inktank.com/newsletter-signup/) to “The InkWell” – Our quarterly newsletter. diff --git a/src/en/news/blog/2013/what-a-year-1/index.md b/src/en/news/blog/2013/what-a-year-1/index.md index b3e105fc8..a1f1cf73b 100644 --- a/src/en/news/blog/2013/what-a-year-1/index.md +++ b/src/en/news/blog/2013/what-a-year-1/index.md @@ -2,16 +2,16 @@ title: "What a Year 1!" date: "2013-05-11" author: "bryan" -tags: +tags: --- [![](images/DSC_0166.png)](http://www.inktank.com/wp-content/uploads/2013/05/DSC_0166.png "What a Year 1!") Back in January I posted about how Inktank’s [momentum was accelerating](http://www.inktank.com/culture/the-momentum-continues-to-accelerate-for-inktank-and-ceph/). Well, to say this trend is continuing would be a gross understatement. The Inktank team continues to execute at a blinding pace and the world keeps on noticing. For example: -•    The Community and Marketing ([we are hiring](http://www.inktank.com/careers/)) teams killed it at the OpenStack Summit. There was so much positive reinforcement of our core message, that Ceph is the ideal storage for OpenStack implementations, during the Keynotes, on the event floor and in the blueprint sessions, that it motivated Barb Darrow to write an article for GigaOm that declared that _[Ceph is hot, hot, hot](http://gigaom.com/2013/04/16/top-5-lessons-learned-at-openstack-summit/)_. +•    The Community and Marketing ([we are hiring](http://www.inktank.com/careers/)) teams killed it at the OpenStack Summit. There was so much positive reinforcement of our core message, that Ceph is the ideal storage for OpenStack implementations, during the Keynotes, on the event floor and in the blueprint sessions, that it motivated Barb Darrow to write an article for GigaOm that declared that *[Ceph is hot, hot, hot](http://gigaom.com/2013/04/16/top-5-lessons-learned-at-openstack-summit/)*. -•    The [Ceph Community](http://ceph.com/) continues to diversify and grow at a rapid pace. There are 55 new authors for the Ceph project since the company launch (40 from outside of Inktank). We have seen over 1300 commits in a single month!  Downloads and adoption continue to grow. We had our first virtual [Ceph developer summit](http://wiki.ceph.com/01Planning/Developer_Summit) this month, we continue to offer Ceph educational [webinars](http://www.inktank.com/news-events/webinars/) to support adoption, and if you follow us on [Twitter](https://twitter.com/Inktank/)  you can hear about our latest events including upcoming Ceph Days.  +•    The [Ceph Community](http://ceph.com/) continues to diversify and grow at a rapid pace. There are 55 new authors for the Ceph project since the company launch (40 from outside of Inktank). We have seen over 1300 commits in a single month!  Downloads and adoption continue to grow. We had our first virtual [Ceph developer summit](http://wiki.ceph.com/01Planning/Developer_Summit) this month, we continue to offer Ceph educational [webinars](http://www.inktank.com/news-events/webinars/) to support adoption, and if you follow us on [X](https://x.com/Inktank/)  you can hear about our latest events including upcoming Ceph Days. •    The Engineering and QA team (we are hiring) just pushed out our third stable release, [Cuttlefish](http://ceph.com/releases/v0-61-cuttlefish-released/) which has so many significant improvements and feature additions, including RHEL support, that the story was covered/picked up by everyone from the [VARGuy](http://thevarguy.com/big-data-technology-solutions-and-information/inktank-ceph-upgrade-targets-big-data-storage-red-hat-) to the [WSJ Online](http://online.wsj.com/article/PR-CO-20130507-909253.html). Our integrations with popular cloud platforms also continue to expand and mature. diff --git a/src/en/news/blog/2014/a-use-case-of-tengine-a-drop-in-replacement-and-fork-of-nginx-2/index.md b/src/en/news/blog/2014/a-use-case-of-tengine-a-drop-in-replacement-and-fork-of-nginx-2/index.md index 019a9d9a5..be2f63d9e 100644 --- a/src/en/news/blog/2014/a-use-case-of-tengine-a-drop-in-replacement-and-fork-of-nginx-2/index.md +++ b/src/en/news/blog/2014/a-use-case-of-tengine-a-drop-in-replacement-and-fork-of-nginx-2/index.md @@ -2,7 +2,7 @@ title: "A use case of Tengine, a drop-in replacement and fork of nginx" date: "2014-06-22" author: "dmsimard" -tags: +tags: - "ceph" --- @@ -30,7 +30,7 @@ Did I tell you that nginx can also do [SSL termination](http://nginx.com/resourc Enough of nginx, let’s talk about [Tengine](http://tengine.taobao.org/). Ever heard of [Taobao](http://www.taobao.com/market/global/index_new.php) ? I’ll be honest, I hadn’t until fairly recently. -It turns out they are number 8 on [Alexa’s top websites](http://www.alexa.com/topsites), right in front of Twitter. +It turns out they are number 8 on [Alexa’s top websites](http://www.alexa.com/topsites), right in front of X. When China makes up [almost 20%](http://www.worldpopulationstatistics.com/population-of-china-2014/) of the World’s population, even a small penetration on the market is in fact huge by all means. Tengine is a fork of nginx created by the team over at Taobao. There’s a lot of features in Tengine that do not (yet) exist in nginx and some features that upstream maintainers said they would not implement. @@ -61,11 +61,11 @@ It looks a bit like this: +-----------+ +--> | Storage | | +-----------+ - | + | +-----+ File +-------+ | +-----------+ | You | +----> | Proxy | +-----> | Storage | +-----+ +-------+ | +-----------+ - | + | | +-----------+ +--> | Storage | +-----------+ @@ -77,11 +77,11 @@ With a load balancer in front of your proxy servers, your setup now looks like  +-------+ +-----------+ +--> | Proxy | +--+--> | Storage | | +-------+ | +-----------+ - | | + | | +-----+ File +---------------+ | +-------+ | +-----------+ | You | +----> | Load Balancer | +-----> | Proxy | +-----> | Storage | +-----+ +---------------+ | +-------+ | +-----------+ - | | + | | | +-------+ | +-----------+ +--> | Proxy | +--+--> | Storage | +-------+ +-----------+ diff --git a/src/en/news/blog/2014/ceph-at-the-red-hat-summit/index.md b/src/en/news/blog/2014/ceph-at-the-red-hat-summit/index.md index 88904e90b..b34fadccc 100644 --- a/src/en/news/blog/2014/ceph-at-the-red-hat-summit/index.md +++ b/src/en/news/blog/2014/ceph-at-the-red-hat-summit/index.md @@ -2,7 +2,7 @@ title: "Ceph at the Red Hat Summit" date: "2014-04-22" author: "syndicated" -tags: +tags: --- Last week in San Francisco, we attended the [2014 Red Hat Summit](http://www.redhat.com/summit/). This event, in its tenth year, is a gathering of Red Hat customers and partners looking for information and best practices that help them build better infrastructure. @@ -17,7 +17,7 @@ We were pleased to find out that Red Hat Summit attendees are fans of Ceph! Half Another Inktank partner, Dell, also reported substantial Ceph interest in the financial industry. Sam Greenblatt, VP Architecture and Technology CTO, mentioned during his talk that [10 of 12 top Wall Street banks are asking to run Ceph](https://twitter.com/cote/status/456478984545390592). -[![tweet](images/tweet.png)](https://twitter.com/cote/status/456478984545390592) +[![tweet](images/tweet.png)](https://x.com/cote/status/456478984545390592) All in all, this Red Hat Summit was a great event! We had a chance to talk with a lot of long-time users, as well as meet some new ones, and we were able to validate what we already suspected: many Red Hat users already love Ceph! diff --git a/src/en/news/blog/2014/ceph-submissions-abound-openstack-paris/index.md b/src/en/news/blog/2014/ceph-submissions-abound-openstack-paris/index.md index ecbc0c3bd..3e06cec07 100644 --- a/src/en/news/blog/2014/ceph-submissions-abound-openstack-paris/index.md +++ b/src/en/news/blog/2014/ceph-submissions-abound-openstack-paris/index.md @@ -4,9 +4,9 @@ date: "2014-08-05" author: "scuttlemonkey" --- -[Twitter](http://twitter.com/ceph) || [Facebook](https://www.facebook.com/cephstorage) || [Google+](https://plus.google.com/+Cephstorage) || [Lists/IRC](http://ceph.com/resources/mailing-list-irc/) +[X](https://x.com/ceph) || [Facebook](https://www.facebook.com/cephstorage) || [Google+](https://plus.google.com/+Cephstorage) || [Lists/IRC](http://ceph.com/resources/mailing-list-irc/) -* * * +--- ![openstack-logo512](images/openstack-logo512-220x220.png) diff --git a/src/en/news/blog/2014/ceph-turns-10-twitter-photo-contest/index.md b/src/en/news/blog/2014/ceph-turns-10-twitter-photo-contest/index.md index 04506ffe2..abaf2dbcd 100644 --- a/src/en/news/blog/2014/ceph-turns-10-twitter-photo-contest/index.md +++ b/src/en/news/blog/2014/ceph-turns-10-twitter-photo-contest/index.md @@ -1,5 +1,5 @@ --- -title: "Ceph Turns 10 Twitter Photo Contest" +title: "Ceph Turns 10 X Photo Contest" date: "2014-07-21" author: "scuttlemonkey" --- diff --git a/src/en/news/blog/2014/lots-going-on-with-ceph/index.md b/src/en/news/blog/2014/lots-going-on-with-ceph/index.md index 6d100d174..1aa9a5a58 100644 --- a/src/en/news/blog/2014/lots-going-on-with-ceph/index.md +++ b/src/en/news/blog/2014/lots-going-on-with-ceph/index.md @@ -8,13 +8,13 @@ While we knew that after the acquisition of Inktank life would accelerate again, Just in case something flew by you, I wanted to take a few minutes to recap some of the highlights of recent history. If you would like to keep a closer eye on what has been going on feel free to follow one (or all!) of our informational feeds: -[Twitter](”http://twitter.com/ceph”) || [Facebook](”https://www.facebook.com/cephstorage”) || [Google+](”https://plus.google.com/+Cephstorage”) || [Lists/IRC](”http://ceph.com/resources/mailing-list-irc/”) +[X](”https://x.com/ceph”) || [Facebook](”https://www.facebook.com/cephstorage”) || [Google+](”https://plus.google.com/+Cephstorage”) || [Lists/IRC](”http://ceph.com/resources/mailing-list-irc/”) ![ludicrous speed](images/ludicrous-speed-small-208x220.jpg) **24 JUL -- Sage wins Open Source Award** Those who attended OSCON most likely had the opportunity to see the winners of this year’s [O’Reilly Open Source Award](”http://en.wikipedia.org/wiki/O'Reilly_Open_Source_Award#2014”) take the stage. Among the winners [was our own Sage Weil](”http://www.redhat.com/about/news/archive/2014/7/ceph-project-leader-sage-weil-recognized-for-decade-long-commitment-to-open-source”) for his tireless work over the last ten years of Ceph development. Sage was in good company as he shared the stage with Deb Nicholson of MediaGoblin and OpenHatch.org, John “Warthog9” Hawley of gitweb and kernel.org, Erin Petersen of Outercurve and Girl Develop It, and Patrick Volkerding of Slackware fame. This is great validation for a long commitment to Open Source. Congratulations again to Sage! -**21 JUL -- Twitter photo contest** If you hadn’t already seen the social media posts and mailing list messages, we are [giving away a desktop Ceph cluster!](”http://ceph.com/uncategorized/ceph-turns-10-twitter-photo-contest/”) Users that find some way to celebrate Ceph’s 10th birthday and submit photo evidence via Twitter including the hashtag #cephturns10 are entered to win a small desktop Ceph cluster, built by our own Mark Nelson, to play with. The contest is only open through the end of the month though, so hurry! +**21 JUL -- Twitter photo contest** If you hadn’t already seen the social media posts and mailing list messages, we are [giving away a desktop Ceph cluster!](”http://ceph.com/uncategorized/ceph-turns-10-X-photo-contest/”) Users that find some way to celebrate Ceph’s 10th birthday and submit photo evidence via Twitter including the hashtag #cephturns10 are entered to win a small desktop Ceph cluster, built by our own Mark Nelson, to play with. The contest is only open through the end of the month though, so hurry! **20 JUL -- OSCON** The Ceph crew [descended on Portland again this year for both the](”http://ceph.com/uncategorized/celebrate-10-years-ceph-oscon/”) [Community Leadership Summit](”http://www.communityleadershipsummit.com/”) and [OSCON](”http://www.oscon.com/oscon2014”). We enjoyed a multitude of cupcakes and great conversations. Hopefully you’ll join us again next year! @@ -24,7 +24,7 @@ Just in case something flew by you, I wanted to take a few minutes to recap some **24 JUN -- 10th BDay** This year marks the [10th year of Ceph development](”http://community.redhat.com/blog/2014/06/ceph-turns-10-a-look-back/”) (even though we have only been commercializing Ceph for the last two)! We have a number of efforts to help our community celebrate all of their hard work including a giveaway for a desktop Ceph cluster and the celebration in meatspace at OSCON. Happy birthday Ceph! -**24 JUN -- CDS G/H** This June’s [G/H Summit](”https://wiki.ceph.com/Planning/CDS/CDS_Giant_and_Hammer_(Jun_2014)”) marked our fifth Ceph Developer Summit. Because of the delays of Firefly it ended up being an interim summit that recapped work already planned and discussed for Giant as well as some forward-looking plans for the Hammer release. Keep your eyes peeled for the next CDS as we get back on track for our quarterly release schedule! +**24 JUN -- CDS G/H** This June’s [G/H Summit](<”https://wiki.ceph.com/Planning/CDS/CDS_Giant_and_Hammer_(Jun_2014)”>) marked our fifth Ceph Developer Summit. Because of the delays of Firefly it ended up being an interim summit that recapped work already planned and discussed for Giant as well as some forward-looking plans for the Hammer release. Keep your eyes peeled for the next CDS as we get back on track for our quarterly release schedule! **12 JUN -- OpenStack User Survey** The OpenStack community’s periodic user survey once again were very encouraging for fans of Ceph. The survey results showed that Ceph was the [leader across the board](”http://ceph.com/uncategorized/openstack-foundation-survey-cites-ceph-leading-distribution-block-storage/”) for block storage in clouds of all stages. We’re so very grateful for Ceph and OpenStack users everywhere for their continued support. We plan on working hard to continue advancing the state of the art with both Ceph and OpenStack! diff --git a/src/en/news/blog/2014/openstack-swift-and-ceph-openstack-montreal/index.md b/src/en/news/blog/2014/openstack-swift-and-ceph-openstack-montreal/index.md index e56be5245..d57f1eb7c 100644 --- a/src/en/news/blog/2014/openstack-swift-and-ceph-openstack-montreal/index.md +++ b/src/en/news/blog/2014/openstack-swift-and-ceph-openstack-montreal/index.md @@ -2,13 +2,13 @@ title: "Openstack, Swift and Ceph @ Openstack Montreal" date: "2014-03-16" author: "dmsimard" -tags: +tags: - "ceph" --- The second meetup of [Openstack Montreal](http://montrealopenstack.org/), in collaboration with [iWeb](http://blog.iweb.com/en/2014/03/register-openstack-montreal-2014/13258.html), [Enovance](https://www.enovance.com/) and [Savoir-faire Linux](https://www.savoirfairelinux.com/), will happen at the [Université du Québec à Montréal](http://www.uqam.ca/) (UQAM) monday march 17th. -It’s with great pleasure that I accepted an invitation from my colleague Rafael Rosa ([@rafaelrosafu](https://twitter.com/rafaelrosafu)) to talk about Ceph in the context of Openstack. +It’s with great pleasure that I accepted an invitation from my colleague Rafael Rosa ([@rafaelrosafu](https://x.com/rafaelrosafu)) to talk about Ceph in the context of Openstack. Our friends at Enovance will be talking about Swift, the object storage project in Openstack. diff --git a/src/en/news/blog/2014/openstack-swift-ceph-openstack-montreal/index.md b/src/en/news/blog/2014/openstack-swift-ceph-openstack-montreal/index.md index 0b566f4e5..21cfbbd7e 100644 --- a/src/en/news/blog/2014/openstack-swift-ceph-openstack-montreal/index.md +++ b/src/en/news/blog/2014/openstack-swift-ceph-openstack-montreal/index.md @@ -2,13 +2,13 @@ title: "Openstack, Swift & Ceph @ Openstack Montreal" date: "2014-03-16" author: "dmsimard" -tags: +tags: - "ceph" --- The second meetup of [Openstack Montreal](http://montrealopenstack.org/), in collaboration with [iWeb](http://blog.iweb.com/en/2014/03/register-openstack-montreal-2014/13258.html), [Enovance](https://www.enovance.com/) and [Savoir-faire Linux](https://www.savoirfairelinux.com/), will happen at the [Université du Québec à Montréal](http://www.uqam.ca/) (UQAM) monday march 17th. -It’s with great pleasure that I accepted an invitation from my colleague Rafael Rosa ([@rafaelrosafu](https://twitter.com/rafaelrosafu)) to talk about Ceph in the context of Openstack. +It’s with great pleasure that I accepted an invitation from my colleague Rafael Rosa ([@rafaelrosafu](https://x.com/rafaelrosafu)) to talk about Ceph in the context of Openstack. Our friends at Enovance will be talking about Swift, the object storage project in Openstack. diff --git a/src/en/news/blog/2014/support-ada-initiative-half-way/index.md b/src/en/news/blog/2014/support-ada-initiative-half-way/index.md index d03fc9f0f..80960c07d 100644 --- a/src/en/news/blog/2014/support-ada-initiative-half-way/index.md +++ b/src/en/news/blog/2014/support-ada-initiative-half-way/index.md @@ -10,9 +10,7 @@ A few days ago I made a [challenge to the open storage community](http://ceph.co I'm quite pleased to see Linux, [Lustre](http://lustre.opensfs.org/), [GlusterFS](http://blog.gluster.org/2014/10/adding-voices-support-the-ada-initiative/), and [OpenZFS](http://open-zfs.org/wiki/Main_Page) / [Illumos](http://wiki.illumos.org/display/illumos/About+illumos) represented on this list! It's also great to see that this is an issue that the Illumos community has already identified and recently called out: -  - -  +
    #illumos is a 4 year old project, ~150 unique contributors. Not a single female engineer is involved yet. What can we do? @gedamore
    — Magnus Hedemark (@Magnus919) September 27, 2014
      Increasing awareness of the issue and showing broad support for these campaigns is just as important as the money raised, so please contribute or help spread the word even if it is a token amount! diff --git a/src/en/news/blog/2018/ceph-at-kubecon-seattle-2018/index.md b/src/en/news/blog/2018/ceph-at-kubecon-seattle-2018/index.md index 53e918754..9a3798e13 100644 --- a/src/en/news/blog/2018/ceph-at-kubecon-seattle-2018/index.md +++ b/src/en/news/blog/2018/ceph-at-kubecon-seattle-2018/index.md @@ -24,6 +24,6 @@ Editing a single line of the "image" in the cluster's custom resource definition The audience seemed to have more developers than operators from my small sampling of discussions. This distinction is essential at beginning conversations around Rook as developers ideally will never know about Rook if their objectives are only to consume storage for their application. -We had some very excited users of Rook and Ceph come up to the booth to express their experiences and ideas to support certain use cases. Watch the Ceph [twitter](https://twitter.com/ceph) and blog for some new stories of users using Rook and Ceph together in production! You can also read Rubab Syed's [evaluation of Rook and Ceph](https://ceph.com/community/evaluating-ceph-deployments-with-rook/) during her work at CERN labs. +We had some very excited users of Rook and Ceph come up to the booth to express their experiences and ideas to support certain use cases. Watch the Ceph [X](https://x.com/ceph) and blog for some new stories of users using Rook and Ceph together in production! You can also read Rubab Syed's [evaluation of Rook and Ceph](https://ceph.com/community/evaluating-ceph-deployments-with-rook/) during her work at CERN labs. Ceph will have presence at future KubeCon's such as [Barcelona 2019](https://events.linuxfoundation.org/events/kubecon-cloudnativecon-europe-2019/), in which the Ceph Foundation plans to have a collocated [Cephalocon](https://ceph.com/cephalocon/barcelona-2019/) with more than 800 passionate engineers. diff --git a/src/en/news/blog/2018/ceph-community-april-2018/index.md b/src/en/news/blog/2018/ceph-community-april-2018/index.md index 41802acaf..a6cc83f58 100644 --- a/src/en/news/blog/2018/ceph-community-april-2018/index.md +++ b/src/en/news/blog/2018/ceph-community-april-2018/index.md @@ -10,7 +10,7 @@ Hey Cephers! March was a very busy month for Ceph Project that we are releasing #### Ceph user Survey -It's been 5 years since [Ross Turk](https://twitter.com/rossturk) organized the [Ceph Census](https://ceph.com/geen-categorie/results-from-the-ceph-census/) and a lot of things changed since then. We created [this survey](https://www.surveymonkey.com/r/ceph2018) to collect the feedback from our community and it will be accepting answers until May 15th, 2018. The results will be shared with the community on Ceph blog. +It's been 5 years since [Ross Turk](https://x.com/rossturk) organized the [Ceph Census](https://ceph.com/geen-categorie/results-from-the-ceph-census/) and a lot of things changed since then. We created [this survey](https://www.surveymonkey.com/r/ceph2018) to collect the feedback from our community and it will be accepting answers until May 15th, 2018. The results will be shared with the community on Ceph blog. #### Changes on Bluejeans meetings and the new Ceph Calendar @@ -100,15 +100,15 @@ On March 22-23, 2018 the first Cephalocon in the world was successfully held in #### Ceph Meetup in Santiago de Compostela, ES -The [Ceph Meetup in Santiago de Compostela](https://cdtic.xunta.gal/es/ceph), ES happened on April 4th at [Amtega](https://twitter.com/amtega) and it was organized by [Javier Muñoz](https://twitter.com/javimunhoz). Approximately 50 people attended to the event which had the main goal to discuss the technology and topics including Ceph adoption, hardware, use cases, features among others. Although the event had the Galician community in mind they had participants from northwest Spain (A Coruña, Lugo, Pontevedra and Ourense) and also from Belgium and Portugal. +The [Ceph Meetup in Santiago de Compostela](https://cdtic.xunta.gal/es/ceph), ES happened on April 4th at [Amtega](https://x.com/amtega) and it was organized by [Javier Muñoz](https://x.com/javimunhoz). Approximately 50 people attended to the event which had the main goal to discuss the technology and topics including Ceph adoption, hardware, use cases, features among others. Although the event had the Galician community in mind they had participants from northwest Spain (A Coruña, Lugo, Pontevedra and Ourense) and also from Belgium and Portugal. #### Ceph Day London -On April 19th we joined our [Apache CloudStack](https://cloudstack.apache.org/) friends for the [Ceph Day in London](https://ceph.com/cephdays/london/). The event was attended by approximately 120 people and we had 11 talks about Ceph presented by community contributors including [Wido den Hollander](https://twitter.com/widodh) (42on), [John Spray](https://twitter.com/jcsp_tweets) (Red Hat), [Lars Marowsky-Brée](https://twitter.com/larsmb) (SUSE), [Kai Wagner](https://twitter.com/ImTheKai) (SUSE), [Danny Al-Gaaf](https://twitter.com/dannyalgaaf) (Deutsche Telekom) and Nick Fisk (SysGroup PLC). Special thanks to Wido for organizing the event. +On April 19th we joined our [Apache CloudStack](https://cloudstack.apache.org/) friends for the [Ceph Day in London](https://ceph.com/cephdays/london/). The event was attended by approximately 120 people and we had 11 talks about Ceph presented by community contributors including [Wido den Hollander](https://x.com/widodh) (42on), [John Spray](https://x.com/jcsp_tweets) (Red Hat), [Lars Marowsky-Brée](https://x.com/larsmb) (SUSE), [Kai Wagner](https://x.com/ImTheKai) (SUSE), [Danny Al-Gaaf](https://x.com/dannyalgaaf) (Deutsche Telekom) and Nick Fisk (SysGroup PLC). Special thanks to Wido for organizing the event. #### TEQnation in Jaarbeurs Utrecht, NL -[Kai Wagner](https://twitter.com/ImTheKai) (SUSE) presented a talk about Ceph Management and Monitoring at [TEQnation](https://teqnation.nl/) which happened from April 25th to 26th in in Jaarbeurs Utrecht, NL. +[Kai Wagner](https://x.com/ImTheKai) (SUSE) presented a talk about Ceph Management and Monitoring at [TEQnation](https://teqnation.nl/) which happened from April 25th to 26th in in Jaarbeurs Utrecht, NL. ### Upcoming conferences diff --git a/src/en/news/blog/2018/ceph-community-february-2018/index.md b/src/en/news/blog/2018/ceph-community-february-2018/index.md index 348e16ee9..6a1a4d1d5 100644 --- a/src/en/news/blog/2018/ceph-community-february-2018/index.md +++ b/src/en/news/blog/2018/ceph-community-february-2018/index.md @@ -2,7 +2,7 @@ title: "Ceph Community Newsletter, Feb 2018 edition" date: "2018-03-01" author: "lvaz" -tags: +tags: - "ceph" - "community" - "newsletter" @@ -42,28 +42,28 @@ The following project meetings happened in February, the video recordings have b #### linux.conf.au 2018 -[Sage Weil](https://twitter.com/liewegas) went to [LCA](https://linux.conf.au/) in Sydney and presented the talk "[Making distributed storage easy: usability in Ceph Luminous and beyond](https://www.youtube.com/watch?v=GrStE7XSKFE)" about the current status of Ceph as well the future plans for the project. +[Sage Weil](https://x.com/liewegas) went to [LCA](https://linux.conf.au/) in Sydney and presented the talk "[Making distributed storage easy: usability in Ceph Luminous and beyond](https://www.youtube.com/watch?v=GrStE7XSKFE)" about the current status of Ceph as well the future plans for the project. #### DevConf.cz -[Orit Wasserman](https://twitter.com/oritwas), [Greg Farnum](https://twitter.com/gregsfortytwo) and [Leo Vaz](https://twitter.com/leonardovaz) attended to [DevConf](https://devconf.info/cz/2018) in Brno, Czechia. Orit presented the talk "[Everything you wanted to know about object storage](https://www.youtube.com/watch?v=sHLEjKfACuk)", Greg talked about "[Programming your Storage with Ceph](https://www.youtube.com/watch?v=gEKPoBxP5ZQ)". Besides the talks we also had the "Cephers at DevConf" meetup which was attended by 10 people. +[Orit Wasserman](https://x.com/oritwas), [Greg Farnum](https://x.com/gregsfortytwo) and [Leo Vaz](https://x.com/leonardovaz) attended to [DevConf](https://devconf.info/cz/2018) in Brno, Czechia. Orit presented the talk "[Everything you wanted to know about object storage](https://www.youtube.com/watch?v=sHLEjKfACuk)", Greg talked about "[Programming your Storage with Ceph](https://www.youtube.com/watch?v=gEKPoBxP5ZQ)". Besides the talks we also had the "Cephers at DevConf" meetup which was attended by 10 people. #### FOSDEM Ceph joined Gluster, OpenStack Swift, LizardFS and OpenEBS on the [Software Defined Storage DevRoom](https://fosdem.org/2018/schedule/track/software_defined_storage/) at [FOSDEM 2018](https://fosdem.org/2018/) and the following Ceph talks have been presented: -- [Ceph management with openATTIC](https://fosdem.org/2018/schedule/event/ceph_mgmt_openattic/), by [Kai Wagner](https://twitter.com/ImTheKai) +- [Ceph management with openATTIC](https://fosdem.org/2018/schedule/event/ceph_mgmt_openattic/), by [Kai Wagner](https://x.com/ImTheKai) - [Ceph & ELK: Use the power of the ELK stack to know more about your Ceph Cluster!](https://fosdem.org/2018/schedule/event/ceph_and_elk/) by [Abhishek Lekshmanan](http://includeio.stream/) and [Denis Kondratenko](https://twitter.com/stdden) -- [CephFS Gateways: Distributed Filesystem Access via NFS and Samba](https://fosdem.org/2018/schedule/event/cephfs_gateways/), by [David Disseldorp](https://twitter.com/dmdiss) and [Supriti Singh](https://github.com/supriti) +- [CephFS Gateways: Distributed Filesystem Access via NFS and Samba](https://fosdem.org/2018/schedule/event/cephfs_gateways/), by [David Disseldorp](https://x.com/dmdiss) and [Supriti Singh](https://github.com/supriti) - [How to backup Ceph at scale](https://fosdem.org/2018/schedule/event/backup_ceph_at_scale/), by [Bartłomiej Święcki](https://github.com/byo) -We also had a talk presented by [John Spray](https://twitter.com/jcsp_tweets) at the [Virtualization and IaaS DevRoom](https://fosdem.org/2018/schedule/track/virtualization_and_iaas/) called "[Distributed File Storage in Multi-Tenant Clouds using CephFS](https://fosdem.org/2018/schedule/event/vai_distributed_file_storage/)". +We also had a talk presented by [John Spray](https://x.com/jcsp_tweets) at the [Virtualization and IaaS DevRoom](https://fosdem.org/2018/schedule/track/virtualization_and_iaas/) called "[Distributed File Storage in Multi-Tenant Clouds using CephFS](https://fosdem.org/2018/schedule/event/vai_distributed_file_storage/)". Finally, we shared a table with our friends from Gluster project at FOSDEM's booth area and we distributed a lot of cool swag and stickers! #### Ceph Day Germany -[Deutsche Telekom AG](https://www.telekom.com/en) hosted the [Ceph Day Germany](https://ceph.com/cephdays/germany/) in Darmstadt. The event was attended by over 150 people from Europe Ceph Community and the video recordings for the 14 talks presented have been [published on Ceph's YouTube channel](https://www.youtube.com/watch?v=5W6K_ruq66w&list=PLrBUGiINAakOYmNQsjbl7KidgY9p-5QBX). Special thanks to [Danny Al-Gaaf](https://twitter.com/dannyalgaaf) for all his help to organize the event and also for recording the presentations. +[Deutsche Telekom AG](https://www.telekom.com/en) hosted the [Ceph Day Germany](https://ceph.com/cephdays/germany/) in Darmstadt. The event was attended by over 150 people from Europe Ceph Community and the video recordings for the 14 talks presented have been [published on Ceph's YouTube channel](https://www.youtube.com/watch?v=5W6K_ruq66w&list=PLrBUGiINAakOYmNQsjbl7KidgY9p-5QBX). Special thanks to [Danny Al-Gaaf](https://x.com/dannyalgaaf) for all his help to organize the event and also for recording the presentations. ### Upcoming conferences diff --git a/src/en/news/blog/2019/community-newsletter-march-2019/index.md b/src/en/news/blog/2019/community-newsletter-march-2019/index.md index 78391e29c..17025a18e 100644 --- a/src/en/news/blog/2019/community-newsletter-march-2019/index.md +++ b/src/en/news/blog/2019/community-newsletter-march-2019/index.md @@ -12,8 +12,6 @@ author: "thingee" March 19 we announced the new release of Ceph Nautilus! Take a look at our [blog post](https://ceph.com/releases/v14-2-0-nautilus-released/) that captures the major features and upgrade notes. -  - #### Cephalocon Barcelona May 19-20: Registration and Sponsor slots still available! We're very excited for the upcoming Cephalocon in Barcelona! We have a convenient [blog post](https://ceph.com/community/cephalocon-barcelona/) that tells you everything you need to know about the upcoming event. See our great lineup with the posted [schedule](http://ceph.com/cephalocon/barcelona-2019/cephalocon-2019-barcelona-schedule/). [Registration](https://www.cvent.com/d/p6qjsh/4W?tw=0A-C7-A7-F1-14-4C-37-96-92-DD-A4-1A-9A-96-AB-50) is still available and we still have some [sponsorship](https://www2.thelinuxfoundation.org/sponsor-cephalocon19) slots left. @@ -41,9 +39,7 @@ In the last two months, the team working on the Dashboard was working hard on ge The community of translators was also very busy: Indonesian, Polish and Czech have been added and are (almost) complete! If you would help us with completing the existing translations or adding new ones, please see [https://www.transifex.com/ceph/ceph-dashboard/dashboard/](https://www.transifex.com/ceph/ceph-dashboard/dashboard/) and get in touch with us if you need any guidance or help. -  - -Thanks a lot to everyone who helped with the translations, particularly Kefu Chai (zh\_CN), Danni Setiawan (id\_ID), Jarosław Owsiewski and Elzbieta Dziomdziora (pl\_PL) and Pavel Borecki (cs)! +Thanks a lot to everyone who helped with the translations, particularly Kefu Chai (zh_CN), Danni Setiawan (id_ID), Jarosław Owsiewski and Elzbieta Dziomdziora (pl_PL) and Pavel Borecki (cs)! New features currently under review: @@ -85,10 +81,10 @@ We're also taking part in [Outreachy](https://www.outreachy.org/)) and have merg ### Ceph Planet -- [慢话crush-各种crush组合](https://ceph.com/planet/%e6%85%a2%e8%af%9dcrush-%e5%90%84%e7%a7%8dcrush%e7%bb%84%e5%90%88/) +- [慢话 crush-各种 crush 组合](https://ceph.com/planet/%e6%85%a2%e8%af%9dcrush-%e5%90%84%e7%a7%8dcrush%e7%bb%84%e5%90%88/) - [Run ceph CLI commands from Python](https://ceph.com/planet/run-ceph-cli-commands-from-python/) - [OpenStack and Ceph for Distributed Hyperconverged Edge Deployments](https://ceph.com/planet/openstack-and-ceph-for-distributed-hyperconverged-edge-deployments/) -- [ceph的pg的分布的快速查看](https://ceph.com/planet/ceph%e7%9a%84pg%e7%9a%84%e5%88%86%e5%b8%83%e7%9a%84%e5%bf%ab%e9%80%9f%e6%9f%a5%e7%9c%8b/) +- [ceph 的 pg 的分布的快速查看](https://ceph.com/planet/ceph%e7%9a%84pg%e7%9a%84%e5%88%86%e5%b8%83%e7%9a%84%e5%bf%ab%e9%80%9f%e6%9f%a5%e7%9c%8b/) - [Ceph nano is getting better and better](https://ceph.com/planet/ceph-nano-is-getting-better-and-better/) ### Project meetings @@ -107,7 +103,7 @@ We're also taking part in [Outreachy](https://www.outreachy.org/)) and have merg #### Ceph DocuBetter -We're behind on uploading these. View the [full playlist](https://www.youtube.com/playlist?list=PLrBUGiINAakNe0PzkhHnr1c54O7Zh--zy) for now and watch [@Ceph](https://twitter.com/ceph) on twitter for updates. +We're behind on uploading these. View the [full playlist](https://www.youtube.com/playlist?list=PLrBUGiINAakNe0PzkhHnr1c54O7Zh--zy) for now and watch [@Ceph](https://x.com/ceph) on X for updates. #### Ceph Testing Weekly @@ -118,7 +114,7 @@ We're behind on uploading these. View the [full playlist](https://www.youtube.co #### FOSDEM -We shared a [booth](https://twitter.com/gluster/status/1091626500741320705) with our Gluster friends. Thanks to FOSDEM for having us and for providing recordings from the Software Defined Storage room! +We shared a [booth](https://x.com/gluster/status/1091626500741320705) with our Gluster friends. Thanks to FOSDEM for having us and for providing recordings from the Software Defined Storage room! - Sage Weil gave a project update with what's new in Nautilus. - [video](https://fosdem.org/2019/schedule/event/ceph_project_status_update/) - Ricardo Dias: Ceph wire protocol revisited - Messenger V2 - [video](https://fosdem.org/2019/schedule/event/ceph_msgrv2/) @@ -129,7 +125,7 @@ We shared a [booth](https://twitter.com/gluster/status/1091626500741320705) with #### SUSECON -The Ceph Foundation was present at [SUSECON 2019](http://susecon.com/) in Nashville, TN. We had a [booth](https://twitter.com/Ceph/status/1113132623424032768) provided by the wonderful people at SUSE. We got to meet lots of Ceph fans, [Dolly Parton](https://twitter.com/Ceph/status/1113418431108403200), and [dance like a chameleon](https://twitter.com/Ceph/status/1114251350379040768). [Lenz Grimmer](https://twitter.com/LenzGrimmer) presented some [live demos](https://twitter.com/LenzGrimmer/status/1113959707172114433) showing off the new dashboard in Nautilus! +The Ceph Foundation was present at [SUSECON 2019](http://susecon.com/) in Nashville, TN. We had a [booth](https://x.com/Ceph/status/1113132623424032768) provided by the wonderful people at SUSE. We got to meet lots of Ceph fans, [Dolly Parton](https://x.com/Ceph/status/1113418431108403200), and [dance like a chameleon](https://x.com/Ceph/status/1114251350379040768). [Lenz Grimmer](https://x.com/LenzGrimmer) presented some [live demos](https://twitter.com/LenzGrimmer/status/1113959707172114433) showing off the new dashboard in Nautilus! ### Upcoming conferences diff --git a/src/en/news/blog/2019/rook-v1-0-nautilus-support-and-much-more/index.md b/src/en/news/blog/2019/rook-v1-0-nautilus-support-and-much-more/index.md index 665eef8a6..1c323a624 100644 --- a/src/en/news/blog/2019/rook-v1-0-nautilus-support-and-much-more/index.md +++ b/src/en/news/blog/2019/rook-v1-0-nautilus-support-and-much-more/index.md @@ -2,7 +2,7 @@ title: "Rook v1.0: Nautilus Support and much more!" date: "2019-05-02" author: "tnielsen" -tags: +tags: - "ceph" - "rook" - "storage" @@ -38,43 +38,43 @@ With Nautilus comes new support for NFS. Rook has a new Custom Resource Definiti Ever wonder what the status of the Ceph cluster is when deployed by Rook? In the past you would start up the [Rook Toolbox](https://rook.io/docs/rook/v1.0/ceph-toolbox.html) and run ceph commands to find any status information. While you may still want to fire up the toolbox occasionally, the operator now periodically queries the ceph status and saves it in the CephCluster custom resource for you. To see the status, there is a new "Health" column when you get the cluster: -> $ kubectl -n rook-ceph get CephCluster rook-ceph +> $ kubectl -n rook-ceph get CephCluster rook-ceph > NAME DATADIRHOSTPATH MONCOUNT AGE STATE HEALTH -> rook-ceph /var/lib/rook 3 5h27m Created HEALTH\_OK +> rook-ceph /var/lib/rook 3 5h27m Created HEALTH_OK If there is ever a health warning or error, you can monitor the full details in the "status" section of the cluster: > $ kubectl -n rook-ceph get CephCluster rook-ceph -o yaml -> ... -> status: -> ceph: -> health: HEALTH\_WARN details: -> OSD\_DOWN: -> message: 1 osds down -> severity: HEALTH\_WARN -> lastChecked: 2019-05-01T19:42:30Z -> lastChanged: 2019-05-01T19:42:30Z previousHealth: HEALTH\_OK +> ... +> status: +> ceph: +> health: HEALTH_WARN details: +> OSD_DOWN: +> message: 1 osds down +> severity: HEALTH_WARN +> lastChecked: 2019-05-01T19:42:30Z +> lastChanged: 2019-05-01T19:42:30Z previousHealth: HEALTH_OK ## Versioning One last small, but helpful feature, is to easily recognize what version of Rook and Ceph you are running in your cluster. Each deployment that starts a Ceph daemon has a version label for both Rook and Ceph. You can either inspect the individual deployments with a "kubectl describe", or you may find it useful to dump all the versions with the following command: > $ kubectl -n rook-ceph get deployments \\ -> -o jsonpath='{range .items\[\*\]}{.metadata.name}{" \\trook="}{.metadata.labels.rook-version}{" \\tceph="}{.metadata.labels.ceph-version}{"\\n"}{end}' -> -> rook-ceph-mds-myfs-a rook=v1.0.0 ceph=14.2.1 -> rook-ceph-mds-myfs-b rook=v1.0.0 ceph=14.2.1 -> rook-ceph-mgr-a rook=v1.0.0 ceph=14.2.1 -> rook-ceph-mon-a rook=v1.0.0 ceph=14.2.1 -> rook-ceph-osd-0 rook=v1.0.0 ceph=14.2.1 -> rook-ceph-rgw-my-store rook=v1.0.0 ceph=14.2.1 +> -o jsonpath='{range .items\[\*\]}{.metadata.name}{" \\trook="}{.metadata.labels.rook-version}{" \\tceph="}{.metadata.labels.ceph-version}{"\\n"}{end}' +> +> rook-ceph-mds-myfs-a rook=v1.0.0 ceph=14.2.1 +> rook-ceph-mds-myfs-b rook=v1.0.0 ceph=14.2.1 +> rook-ceph-mgr-a rook=v1.0.0 ceph=14.2.1 +> rook-ceph-mon-a rook=v1.0.0 ceph=14.2.1 +> rook-ceph-osd-0 rook=v1.0.0 ceph=14.2.1 +> rook-ceph-rgw-my-store rook=v1.0.0 ceph=14.2.1 ## Next Steps Even while Rook has come so far, we look forward to what is coming next. An initial draft of features for the 1.1 release is found in the Rook [roadmap](https://github.com/rook/rook/blob/master/ROADMAP.md). In summary, the highest priority items include: - CSI Driver: As mentioned earlier, completing the integration of the CSI driver is a top priority to add new capabilities while we transition away from the Rook flex driver. - - The CephFS provisioning is still the subject of some attention as we map the Kubernetes RWX PersistentVolumes (PVs) directly on the (new) first-class Ceph 'subvolume' concept for tighter integration with Ceph Nautilus. + - The CephFS provisioning is still the subject of some attention as we map the Kubernetes RWX PersistentVolumes (PVs) directly on the (new) first-class Ceph 'subvolume' concept for tighter integration with Ceph Nautilus. - External Clusters: One of our most requested features is the ability to connect to Ceph storage that is running in a separate, "external" cluster. Whether Rook has configured Ceph in the external Kubernetes cluster, or whether it is a Ceph cluster running on bare-metal, Rook and the CSI driver will enable the [ability](https://github.com/rook/rook/blob/master/design/ceph-external-cluster.md) to connect to the external cluster. - Improved topology awareness for mon placement and CRUSH map support through Kubernetes node labels. - Backing OSDs with Persistent Volumes (PVs) to enable more dynamic provisioning when running in cloud environments. @@ -89,7 +89,7 @@ We are excited by the growth of the Rook community and we invite everyone to eng - - [Github](https://github.com/rook/rook) -- - [Twitter](https://twitter.com/rook_io) +- - [X](https://x.com/rook_io) - - [Slack](https://slack.rook.io) diff --git a/src/en/news/blog/2021/community-newsletter-november/index.md b/src/en/news/blog/2021/community-newsletter-november/index.md index c840c92ce..2e29992d2 100644 --- a/src/en/news/blog/2021/community-newsletter-november/index.md +++ b/src/en/news/blog/2021/community-newsletter-november/index.md @@ -32,7 +32,7 @@ The [Ceph Community Ambassador team](ceph.io/en/community/ambassadors/) comprise The first meeting took place on October 18 at 6:00 UTC, in which the group has plans to see which Ceph meetups in their regions are still active and need assistance. -Chris Ballnath is planning a Ceph meetup at either end of November or early December in Munich. Look for promotions of the event [@Ceph](https://twitter.com/ceph) twitter and the [Ceph users mailing list](https://lists.ceph.io/postorius/lists/ceph-users.ceph.io/). +Chris Ballnath is planning a Ceph meetup at either end of November or early December in Munich. Look for promotions of the event [@Ceph](https://x.com/ceph) twitter and the [Ceph users mailing list](https://lists.ceph.io/postorius/lists/ceph-users.ceph.io/). We're still looking for more people who can join the team to support more regions. Meetings will be announced on the Ceph mailing list and are open to everyone.