{"id":1017,"date":"2018-05-11T23:55:51","date_gmt":"2018-05-11T15:55:51","guid":{"rendered":"https:\/\/www.xiaobo.li\/?p=1017"},"modified":"2018-06-30T00:51:30","modified_gmt":"2018-06-29T16:51:30","slug":"ceph%e7%9a%84%e5%ae%89%e8%a3%85","status":"publish","type":"post","link":"https:\/\/www.xiaobo.li\/notes\/archives\/1017","title":{"rendered":"Ceph\u7684\u5b89\u88c5"},"content":{"rendered":"<h2>Ceph\u7684\u5b89\u88c5<\/h2>\n<p>\u5b98\u7f51\u94fe\u63a5\uff1ahttp:\/\/docs.ceph.com\/docs\/master\/install\/install-storage-cluster\/<\/p>\n<h3>2.1 \u76f8\u5173\u4f9d\u8d56\u7684\u5b89\u88c5<\/h3>\n<p>\u6211\u8fd9\u91cc\u64cd\u4f5c\u7cfb\u7edf\u90fd\u662fCentos7.2\u7684\u64cd\u4f5c\u7cfb\u7edf\u3002<\/p>\n<p>#yum install yum-plugin-priorities -y<\/p>\n<p># cat \/etc\/yum\/pluginconf.d\/priorities.conf\u00a0\u00a0 #\u786e\u4fddpriority.conf\u542f\u7528\u63d2\u4ef6\u3002<\/p>\n<pre class=\"prism-highlight prism- prism-line-numbers language-bash\" data-language=\"Bash\">[main]\r\nenabled = 1<\/pre>\n<p># vim \/etc\/yum.repos.d\/ceph.repo\u00a0 #\u505aceph\u6e90\u6587\u4ef6<\/p>\n<pre class=\"prism-highlight prism- prism-line-numbers language-bash\" data-language=\"Bash\">[Ceph]\r\nname=Ceph packages for $basearch\r\nbaseurl=http:\/\/download.ceph.com\/rpm-jewel\/el7\/$basearch\r\nenabled=1\r\ngpgcheck=1\r\ntype=rpm-md\r\ngpgkey=https:\/\/download.ceph.com\/keys\/release.asc\r\n\r\n[Ceph-noarch]\r\nname=Ceph noarch packages\r\nbaseurl=http:\/\/download.ceph.com\/rpm-jewel\/el7\/noarch\r\nenabled=1\r\ngpgcheck=1\r\ntype=rpm-md\r\ngpgkey=https:\/\/download.ceph.com\/keys\/release.asc\r\n\r\n[ceph-source]\r\nname=Ceph source packages\r\nbaseurl=http:\/\/download.ceph.com\/rpm-jewel\/el7\/SRPMS\r\nenabled=1\r\ngpgcheck=1\r\ntype=rpm-md\r\ngpgkey=https:\/\/download.ceph.com\/keys\/release.asc<\/pre>\n<p>OR<\/p>\n<pre class=\"prism-highlight prism- prism-line-numbers language-bash\" data-language=\"Bash\">[ceph]\r\nname=ceph\r\nbaseurl=http:\/\/mirrors.aliyun.com\/ceph\/rpm-jewel\/el7\/x86_64\/\r\ngpgcheck=0\r\n[ceph-noarch]\r\nname=cephnoarch\r\nbaseurl=http:\/\/mirrors.aliyun.com\/ceph\/rpm-jewel\/el7\/noarch\/\r\ngpgcheck=0<\/pre>\n<p>#yum install snappy leveldb gdisk python-argparse gperftools-libs -y<\/p>\n<h3>2.2 ceph\u5b89\u88c5<\/h3>\n<p>rpm -Uvh http:\/\/mirrors.aliyun.com\/ceph\/rpm-jewel\/el7\/noarch\/ceph-release-1-1.el7.noarch.rpm<br \/>\nyum -y install epel-release<br \/>\nyum -y install ceph-deploy<br \/>\nyum -y install ntp ntpdate ntp-doc<br \/>\nyum -y install openssh-server openssh-client<br \/>\nyum -y install yum-plugin-priorities -y<br \/>\nyum -y install redhat-lsb<br \/>\nyum -y install ceph ceph-release ceph-common ceph-radosgw<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>\u6027\u80fd\u4f18\u5316\uff1a<\/p>\n<h3>\u00a0Ceph Configurations<\/h3>\n<h4>[global]<\/h4>\n<table>\n<thead>\n<tr>\n<th>\u53c2\u6570\u540d<\/th>\n<th>\u63cf\u8ff0<\/th>\n<th>\u9ed8\u8ba4\u503c<\/th>\n<th>\u5efa\u8bae\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>public network<\/td>\n<td>\u5ba2\u6237\u7aef\u8bbf\u95ee\u7f51\u7edc<\/td>\n<td><\/td>\n<td>192.168.100.0\/24<\/td>\n<\/tr>\n<tr>\n<td>cluster network<\/td>\n<td>\u96c6\u7fa4\u7f51\u7edc<\/td>\n<td><\/td>\n<td>192.168.1.0\/24<\/td>\n<\/tr>\n<tr>\n<td>max open files<\/td>\n<td>\u5982\u679c\u8bbe\u7f6e\u4e86\u8be5\u9009\u9879\uff0cCeph\u4f1a\u8bbe\u7f6e\u7cfb\u7edf\u7684max open fds<\/td>\n<td>0<\/td>\n<td>131072<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<ul>\n<li>\u67e5\u770b\u7cfb\u7edf\u6700\u5927\u6587\u4ef6\u6253\u5f00\u6570\u53ef\u4ee5\u4f7f\u7528\u547d\u4ee4<\/li>\n<\/ul>\n<figure class=\"code\">\n<div class=\"highlight\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre class=\"line-numbers\"><span class=\"line-number\">1<\/span>\r\n<\/pre>\n<\/td>\n<td class=\"code\">\n<pre>cat \/proc\/sys\/fs\/file-max<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/figure>\n<hr \/>\n<h4>[osd] - filestore<\/h4>\n<table>\n<thead>\n<tr>\n<th>\u53c2\u6570\u540d<\/th>\n<th>\u63cf\u8ff0<\/th>\n<th>\u9ed8\u8ba4\u503c<\/th>\n<th>\u5efa\u8bae\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>filestore xattr use omap<\/td>\n<td>\u4e3aXATTRS\u4f7f\u7528object map\uff0cEXT4\u6587\u4ef6\u7cfb\u7edf\u65f6\u4f7f\u7528\uff0cXFS\u6216\u8005btrfs\u4e5f\u53ef\u4ee5\u4f7f\u7528<\/td>\n<td>false<\/td>\n<td>true<\/td>\n<\/tr>\n<tr>\n<td>filestore max sync interval<\/td>\n<td>\u4ece\u65e5\u5fd7\u5230\u6570\u636e\u76d8\u6700\u5927\u540c\u6b65\u95f4\u9694(seconds)<\/td>\n<td>5<\/td>\n<td>15<\/td>\n<\/tr>\n<tr>\n<td>filestore min sync interval<\/td>\n<td>\u4ece\u65e5\u5fd7\u5230\u6570\u636e\u76d8\u6700\u5c0f\u540c\u6b65\u95f4\u9694(seconds)<\/td>\n<td>0.1<\/td>\n<td>10<\/td>\n<\/tr>\n<tr>\n<td>filestore queue max ops<\/td>\n<td>\u6570\u636e\u76d8\u6700\u5927\u63a5\u53d7\u7684\u64cd\u4f5c\u6570<\/td>\n<td>500<\/td>\n<td>25000<\/td>\n<\/tr>\n<tr>\n<td>filestore queue max bytes<\/td>\n<td>\u6570\u636e\u76d8\u4e00\u6b21\u64cd\u4f5c\u6700\u5927\u5b57\u8282\u6570(bytes)<\/td>\n<td>100 &lt;&lt; 20<\/td>\n<td>10485760<\/td>\n<\/tr>\n<tr>\n<td>filestore queue committing max ops<\/td>\n<td>\u6570\u636e\u76d8\u80fd\u591fcommit\u7684\u64cd\u4f5c\u6570<\/td>\n<td>500<\/td>\n<td>5000<\/td>\n<\/tr>\n<tr>\n<td>filestore queue committing max bytes<\/td>\n<td>\u6570\u636e\u76d8\u80fd\u591fcommit\u7684\u6700\u5927\u5b57\u8282\u6570(bytes)<\/td>\n<td>100 &lt;&lt; 20<\/td>\n<td>10485760000<\/td>\n<\/tr>\n<tr>\n<td>filestore op threads<\/td>\n<td>\u5e76\u53d1\u6587\u4ef6\u7cfb\u7edf\u64cd\u4f5c\u6570<\/td>\n<td>2<\/td>\n<td>32<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<ul>\n<li>\u8c03\u6574omap\u7684\u539f\u56e0\u4e3b\u8981\u662fEXT4\u6587\u4ef6\u7cfb\u7edf\u9ed8\u8ba4\u4ec5\u67094K<\/li>\n<li>filestore queue\u76f8\u5173\u7684\u53c2\u6570\u5bf9\u4e8e\u6027\u80fd\u5f71\u54cd\u5f88\u5c0f\uff0c\u53c2\u6570\u8c03\u6574\u4e0d\u4f1a\u5bf9\u6027\u80fd\u4f18\u5316\u6709\u672c\u8d28\u4e0a\u63d0\u5347<\/li>\n<\/ul>\n<hr \/>\n<h4>[osd] - journal<\/h4>\n<table>\n<thead>\n<tr>\n<th>\u53c2\u6570\u540d<\/th>\n<th>\u63cf\u8ff0<\/th>\n<th>\u9ed8\u8ba4\u503c<\/th>\n<th>\u5efa\u8bae\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>osd journal size<\/td>\n<td>OSD\u65e5\u5fd7\u5927\u5c0f(MB)<\/td>\n<td>5120<\/td>\n<td>20000<\/td>\n<\/tr>\n<tr>\n<td>journal max write bytes<\/td>\n<td>journal\u4e00\u6b21\u6027\u5199\u5165\u7684\u6700\u5927\u5b57\u8282\u6570(bytes)<\/td>\n<td>10 &lt;&lt; 20<\/td>\n<td>1073714824<\/td>\n<\/tr>\n<tr>\n<td>journal max write entries<\/td>\n<td>journal\u4e00\u6b21\u6027\u5199\u5165\u7684\u6700\u5927\u8bb0\u5f55\u6570<\/td>\n<td>100<\/td>\n<td>10000<\/td>\n<\/tr>\n<tr>\n<td>journal queue max ops<\/td>\n<td>journal\u4e00\u6b21\u6027\u6700\u5927\u5728\u961f\u5217\u4e2d\u7684\u64cd\u4f5c\u6570<\/td>\n<td>500<\/td>\n<td>50000<\/td>\n<\/tr>\n<tr>\n<td>journal queue max bytes<\/td>\n<td>journal\u4e00\u6b21\u6027\u6700\u5927\u5728\u961f\u5217\u4e2d\u7684\u5b57\u8282\u6570(bytes)<\/td>\n<td>10 &lt;&lt; 20<\/td>\n<td>10485760000<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<ul>\n<li>Ceph OSD Daemon stops writes and synchronizes the journal with the filesystem, allowing Ceph OSD Daemons to trim operations from the journal and reuse the space.<\/li>\n<li>\u4e0a\u9762\u8fd9\u6bb5\u8bdd\u7684\u610f\u601d\u5c31\u662f\uff0cCeph OSD\u8fdb\u7a0b\u5728\u5f80\u6570\u636e\u76d8\u4e0a\u5237\u6570\u636e\u7684\u8fc7\u7a0b\u4e2d\uff0c\u662f\u505c\u6b62\u5199\u64cd\u4f5c\u7684\u3002<\/li>\n<\/ul>\n<hr \/>\n<h4>[osd] - osd config tuning<\/h4>\n<table>\n<thead>\n<tr>\n<th>\u53c2\u6570\u540d<\/th>\n<th>\u63cf\u8ff0<\/th>\n<th>\u9ed8\u8ba4\u503c<\/th>\n<th>\u5efa\u8bae\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>osd max write size<\/td>\n<td>OSD\u4e00\u6b21\u53ef\u5199\u5165\u7684\u6700\u5927\u503c(MB)<\/td>\n<td>90<\/td>\n<td>512<\/td>\n<\/tr>\n<tr>\n<td>osd client message size cap<\/td>\n<td>\u5ba2\u6237\u7aef\u5141\u8bb8\u5728\u5185\u5b58\u4e2d\u7684\u6700\u5927\u6570\u636e(bytes)<\/td>\n<td>524288000<\/td>\n<td>2147483648<\/td>\n<\/tr>\n<tr>\n<td>osd deep scrub stride<\/td>\n<td>\u5728Deep Scrub\u65f6\u5019\u5141\u8bb8\u8bfb\u53d6\u7684\u5b57\u8282\u6570(bytes)<\/td>\n<td>524288<\/td>\n<td>131072<\/td>\n<\/tr>\n<tr>\n<td>osd op threads<\/td>\n<td>OSD\u8fdb\u7a0b\u64cd\u4f5c\u7684\u7ebf\u7a0b\u6570<\/td>\n<td>2<\/td>\n<td>8<\/td>\n<\/tr>\n<tr>\n<td>osd disk threads<\/td>\n<td>OSD\u5bc6\u96c6\u578b\u64cd\u4f5c\u4f8b\u5982\u6062\u590d\u548cScrubbing\u65f6\u7684\u7ebf\u7a0b<\/td>\n<td>1<\/td>\n<td>4<\/td>\n<\/tr>\n<tr>\n<td>osd map cache size<\/td>\n<td>\u4fdd\u7559OSD Map\u7684\u7f13\u5b58(MB)<\/td>\n<td>500<\/td>\n<td>1024<\/td>\n<\/tr>\n<tr>\n<td>osd map cache bl size<\/td>\n<td>OSD\u8fdb\u7a0b\u5728\u5185\u5b58\u4e2d\u7684OSD Map\u7f13\u5b58(MB)<\/td>\n<td>50<\/td>\n<td>128<\/td>\n<\/tr>\n<tr>\n<td>osd mount options xfs<\/td>\n<td>Ceph OSD xfs Mount\u9009\u9879<\/td>\n<td>rw,noatime,inode64<\/td>\n<td>rw,noexec,nodev,noatime,nodiratime,nobarrier<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<ul>\n<li>\u589e\u52a0osd op threads\u548cdisk threads\u4f1a\u5e26\u6765\u989d\u5916\u7684CPU\u5f00\u9500<\/li>\n<\/ul>\n<hr \/>\n<h4>[osd] - recovery tuning<\/h4>\n<table>\n<thead>\n<tr>\n<th>\u53c2\u6570\u540d<\/th>\n<th>\u63cf\u8ff0<\/th>\n<th>\u9ed8\u8ba4\u503c<\/th>\n<th>\u5efa\u8bae\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>osd recovery op priority<\/td>\n<td>\u6062\u590d\u64cd\u4f5c\u4f18\u5148\u7ea7\uff0c\u53d6\u503c1-63\uff0c\u503c\u8d8a\u9ad8\u5360\u7528\u8d44\u6e90\u8d8a\u9ad8<\/td>\n<td>10<\/td>\n<td>4<\/td>\n<\/tr>\n<tr>\n<td>osd recovery max active<\/td>\n<td>\u540c\u4e00\u65f6\u95f4\u5185\u6d3b\u8dc3\u7684\u6062\u590d\u8bf7\u6c42\u6570<\/td>\n<td>15<\/td>\n<td>10<\/td>\n<\/tr>\n<tr>\n<td>osd max backfills<\/td>\n<td>\u4e00\u4e2aOSD\u5141\u8bb8\u7684\u6700\u5927backfills\u6570<\/td>\n<td>10<\/td>\n<td>4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>[osd] - client tuning<\/h4>\n<table>\n<thead>\n<tr>\n<th>\u53c2\u6570\u540d<\/th>\n<th>\u63cf\u8ff0<\/th>\n<th>\u9ed8\u8ba4\u503c<\/th>\n<th>\u5efa\u8bae\u503c<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>rbd cache<\/td>\n<td>RBD\u7f13\u5b58<\/td>\n<td>true<\/td>\n<td>true<\/td>\n<\/tr>\n<tr>\n<td>rbd cache size<\/td>\n<td>RBD\u7f13\u5b58\u5927\u5c0f(bytes)<\/td>\n<td>33554432<\/td>\n<td>268435456<\/td>\n<\/tr>\n<tr>\n<td>rbd cache max dirty<\/td>\n<td>\u7f13\u5b58\u4e3awrite-back\u65f6\u5141\u8bb8\u7684\u6700\u5927dirty\u5b57\u8282\u6570(bytes)\uff0c\u5982\u679c\u4e3a0\uff0c\u4f7f\u7528write-through<\/td>\n<td>25165824<\/td>\n<td>134217728<\/td>\n<\/tr>\n<tr>\n<td>rbd cache max dirty age<\/td>\n<td>\u5728\u88ab\u5237\u65b0\u5230\u5b58\u50a8\u76d8\u524ddirty\u6570\u636e\u5b58\u5728\u7f13\u5b58\u7684\u65f6\u95f4(seconds)<\/td>\n<td>1<\/td>\n<td>5<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>\u5173\u95edDebug<\/h4>\n<h3>3. PG Number<\/h3>\n<p>PG\u548cPGP\u6570\u91cf\u4e00\u5b9a\u8981\u6839\u636eOSD\u7684\u6570\u91cf\u8fdb\u884c\u8c03\u6574\uff0c\u8ba1\u7b97\u516c\u5f0f\u5982\u4e0b\uff0c\u4f46\u662f\u6700\u540e\u7b97\u51fa\u7684\u7ed3\u679c\u4e00\u5b9a\u8981\u63a5\u8fd1\u6216\u8005\u7b49\u4e8e\u4e00\u4e2a2\u7684\u6307\u6570\u3002<\/p>\n<pre>Total PGs = (Total_number_of_OSD * 100) \/ max_replication_count\r\n<\/pre>\n<p>\u4f8b\u598215\u4e2aOSD\uff0c\u526f\u672c\u6570\u4e3a3\u7684\u60c5\u51b5\u4e0b\uff0c\u6839\u636e\u516c\u5f0f\u8ba1\u7b97\u7684\u7ed3\u679c\u5e94\u8be5\u4e3a500\uff0c\u6700\u63a5\u8fd1512\uff0c\u6240\u4ee5\u9700\u8981\u8bbe\u5b9a\u8be5pool(volumes)\u7684pg_num\u548cpgp_num\u90fd\u4e3a512.<\/p>\n<figure class=\"code\">\n<div class=\"highlight\">\n<table>\n<tbody>\n<tr>\n<td class=\"gutter\">\n<pre class=\"line-numbers\"><span class=\"line-number\">1<\/span>\r\n<span class=\"line-number\">2<\/span>\r\n<\/pre>\n<\/td>\n<td class=\"code\">\n<pre>ceph osd pool set volumes pg_num 512\r\nceph osd pool set volumes pgp_num 512<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/figure>\n<h3>4. CRUSH Map<\/h3>\n<p>CRUSH\u662f\u4e00\u4e2a\u975e\u5e38\u7075\u6d3b\u7684\u65b9\u5f0f\uff0cCRUSH MAP\u7684\u8c03\u6574\u53d6\u51b3\u4e8e\u90e8\u7f72\u7684\u5177\u4f53\u73af\u5883\uff0c\u8fd9\u4e2a\u53ef\u80fd\u9700\u8981\u6839\u636e\u5177\u4f53\u60c5\u51b5\u8fdb\u884c\u5206\u6790\uff0c\u8fd9\u91cc\u9762\u5c31\u4e0d\u518d\u8d58\u8ff0\u4e86\u3002<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<h2>Mon\u5220\u9664<\/h2>\n<p>\u4ece\u5065\u5eb7\u7684\u96c6\u7fa4\u4e2d\u5220\u9664<\/p>\n<p>1\u3001\u00a0 systemctl stop ceph-mon@{mon-id}<\/p>\n<p>2\u3001\u00a0 ceph mon remove {mon-id}<\/p>\n<p>3\u3001\u00a0 \u4ececeph.conf\u4e2d\u5220\u9664<\/p>\n<p>\u4ece\u4e0d\u5065\u5eb7\u7684\u96c6\u7fa4\u4e2d\u5220\u9664<\/p>\n<p>1\u3001\u00a0 ceph mon dump<\/p>\n<p>2\u3001\u00a0 service ceph stop mon<\/p>\n<p>3\u3001\u00a0 ceph-mon \u2013i {mon-id}\u00a0--extract-monmap {mappath}<\/p>\n<p>4\u3001\u00a0 monmaptool {mappath}\u00a0 -rm {mon-id}<\/p>\n<p>5\u3001\u00a0 ceph-mon \u2013I {mon-id} \u2013inject-monmap {monpath}<\/p>\n<hr \/>\n<p>\u53c2\u8003\uff1a<\/p>\n<p><a href=\"https:\/\/www.cnblogs.com\/schangech\/p\/8036191.html\" target=\"_blank\" rel=\"noopener\">\u5220\u9664Ceph OSD\u8282\u70b9<\/a><\/p>\n<p><a href=\"http:\/\/xiaoquqi.github.io\/blog\/2015\/06\/28\/ceph-performance-optimization-summary\/\" target=\"_blank\" rel=\"noopener\">Ceph\u6027\u80fd\u4f18\u5316<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>..<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ceph\u7684\u5b89\u88c5 \u5b98\u7f51\u94fe\u63a5\uff1ahttp:\/\/docs.ceph.com\/docs\/m &hellip; <a href=\"https:\/\/www.xiaobo.li\/notes\/archives\/1017\">\u7ee7\u7eed\u9605\u8bfb <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[292],"tags":[264],"class_list":["post-1017","post","type-post","status-publish","format-standard","hentry","category-storage","tag-ceph"],"_links":{"self":[{"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/posts\/1017","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/comments?post=1017"}],"version-history":[{"count":0,"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/posts\/1017\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/media?parent=1017"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/categories?post=1017"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xiaobo.li\/notes\/wp-json\/wp\/v2\/tags?post=1017"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}