<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Sysbench｜林鼎淵 Dean Lin</title>
    <link>https://deanlin.net/tags/sysbench/</link>
    <image><url>https://deanlin.net/images/author_hu_aa256fc934e9a932.jpg</url><title>Sysbench｜林鼎淵 Dean Lin</title><link>https://deanlin.net/tags/sysbench/</link><width>144</width><height>144</height></image>
    <description>林鼎淵（Dean Lin）的部落格：生成式 AI 企業內訓講師、外商資安公司軟體專家、7 本書作者。400 多篇文章用白話分享生成式 AI 實戰、Claude Code 與 Vibe Coding 教學、團隊合作與職場成長。</description>
    <generator>Hugo</generator>
    <language>zh-tw</language>
    <copyright>© 2020–2026 林鼎淵 Dean Lin</copyright>
    <lastBuildDate>Mon, 29 Mar 2021 15:27:42 +0800</lastBuildDate>
    <atom:link href="https://deanlin.net/tags/sysbench/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>解決 MySQL 主從複製的延遲問題 (Replication lag)</title>
      <link>https://deanlin.net/blog/202103/mysql-replication-lag/</link>
      <pubDate>Mon, 29 Mar 2021 15:27:42 +0800</pubDate>
      <guid>https://deanlin.net/blog/202103/mysql-replication-lag/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>技術教學</category>
      <description>Slave DB 上的資料從 Master DB 複製過來時會有延遲，所以會造成用戶看到舊的資訊；在過去想解決這個問題真的需要 18 般武藝，但到了 MySQL 5.7 版後官方說只要調整一個設定就能解決，具體做法讓我們看下去。</description>
      <media:content url="https://deanlin.net/blog/202103/mysql-replication-lag/images/mysql-replication-lag-og_hu_e6c9419343a55c95.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<p>在『MySQL Master Slave Replication 主從式架構設定教學』這篇文章的結尾有提到因為 Slave DB 上的資料從 Master DB 複製過來時會有延遲，所以會造成用戶看到舊的資訊；在過去想解決這個問題真的需要 18 般武藝，但到了 MySQL 5.7 版後官方說只要調整一個設定就能解決，具體做法讓我們看下去。</p>
<p><img src="https://deanlin.net/blog/202103/mysql-replication-lag/images/mysql-replication-lag-01.webp" width="1400" height="783" alt="解決 MySQL 主從複製的延遲問題 (Replication lag)（圖 1）" fetchpriority="high" decoding="async"></p>
<pre tabindex="0"><code>一、模擬主從複製延遲的情境
二、了解發生問題的原因
三、解決方案：開啟 MySQL 5.7 的多 process 的功能
四、確認 Slave 已經沒有延遲
</code></pre><h2 id="一模擬主從複製延遲的情境">一、模擬主從複製延遲的情境<a class="h-anchor" href="#%e4%b8%80%e6%a8%a1%e6%93%ac%e4%b8%bb%e5%be%9e%e8%a4%87%e8%a3%bd%e5%bb%b6%e9%81%b2%e7%9a%84%e6%83%85%e5%a2%83" aria-label="這個段落的連結"></a></h2>
<blockquote>
<p>這裡我們利用 sysbench 進行情境模擬，如果不清楚如何操作的朋友請參考這篇文章：『<a href="https://deanlin.net/blog/202103/mysql-benchmark-sysbench/">用 sysbench 測試 MySQL 性能 — 在 mac &amp; ubuntu 上的安裝與使用</a>』</p>
</blockquote>
<p>下面是我在 ubuntu 的測試指令，如果你是 mac 需要自己更換 .lua 的路徑</p>
<pre tabindex="0"><code>sysbench /usr/share/sysbench/oltp_write_only.lua \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=user_name \
--mysql-password=user_password \
--mysql-db=test \
--db-driver=mysql \
--tables=10 \
--table_size=100000 \
--report-interval=10 \
--threads=128 \
--time=120 \
prepare
</code></pre><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/46688419066279598ee33553f5ae9c45" rel="noopener">sysbench_lag.cmd</a>（GitHub Gist）</p>
<p>指令輸入後你就會發現資料庫好像頓住不會動了…</p>
<p><img src="https://deanlin.net/blog/202103/mysql-replication-lag/images/mysql-replication-lag-02.webp" width="916" height="912" alt="一、模擬主從複製延遲的情境（圖 2）" loading="lazy" decoding="async"></p>
<p>一段時間後我們進入到 Slave 的 MySQL 中會發現他與 Master 的延遲很嚴重</p>
<pre tabindex="0"><code>mysql&gt; show slave status\G
</code></pre><ul>
<li><strong>Seconds_Behind_Master</strong>：延遲的時間</li>
</ul>
<p><img src="https://deanlin.net/blog/202103/mysql-replication-lag/images/mysql-replication-lag-03.webp" width="874" height="236" alt="一、模擬主從複製延遲的情境（圖 3）" loading="lazy" decoding="async"></p>
<h2 id="二了解發生問題的原因">二、了解發生問題的原因<a class="h-anchor" href="#%e4%ba%8c%e4%ba%86%e8%a7%a3%e7%99%bc%e7%94%9f%e5%95%8f%e9%a1%8c%e7%9a%84%e5%8e%9f%e5%9b%a0" aria-label="這個段落的連結"></a></h2>
<p>因為我們模擬的情境會製作出相當大量的 SQL command，執行內容包含：table 內容大量更新、index 建立；可是 Slave 去讀取 Master 的 process 卻只有一個，這樣使 Master 累積了太多尚未同步到 Slave 的 SQL command，因此造成了兩邊資料庫的內容不一致。</p>
<h2 id="三解決方案開啟-mysql-57-的多-process-的功能">三、解決方案：開啟 MySQL 5.7 的多 process 的功能<a class="h-anchor" href="#%e4%b8%89%e8%a7%a3%e6%b1%ba%e6%96%b9%e6%a1%88%e9%96%8b%e5%95%9f-mysql-57-%e7%9a%84%e5%a4%9a-process-%e7%9a%84%e5%8a%9f%e8%83%bd" aria-label="這個段落的連結"></a></h2>
<p><strong>STEP 1</strong>：先暫停 Slave，不然無法修改變數</p>
<pre tabindex="0"><code>mysql&gt; stop slave;
</code></pre><p><strong>STEP 2</strong>：更改 slave_parallel_type</p>
<p>先看看預設值</p>
<pre tabindex="0"><code>mysql&gt; show variables like ‘slave_parallel%’;
</code></pre><p><img src="https://deanlin.net/blog/202103/mysql-replication-lag/images/mysql-replication-lag-04.webp" width="403" height="163" alt="三、解決方案：開啟 MySQL 5.7 的多 process 的功能（圖 4）" loading="lazy" decoding="async"></p>
<p>修改變數</p>
<pre tabindex="0"><code>mysql&gt; set global slave_parallel_type=&#39;logical_clock&#39;;
mysql&gt; set global slave_parallel_workers=10; #根據實際需求設定
</code></pre><p>啟動 Slave 功能</p>
<pre tabindex="0"><code>mysql&gt; start slave;
</code></pre><p>查看剛剛設定的多 process 是否生效</p>
<pre tabindex="0"><code>mysql&gt; show processlist;
</code></pre><p><img src="https://deanlin.net/blog/202103/mysql-replication-lag/images/mysql-replication-lag-05.webp" width="1206" height="373" alt="三、解決方案：開啟 MySQL 5.7 的多 process 的功能（圖 5）" loading="lazy" decoding="async"></p>
<h2 id="四確認-slave-已經沒有延遲">四、確認 Slave 已經沒有延遲<a class="h-anchor" href="#%e5%9b%9b%e7%a2%ba%e8%aa%8d-slave-%e5%b7%b2%e7%b6%93%e6%b2%92%e6%9c%89%e5%bb%b6%e9%81%b2" aria-label="這個段落的連結"></a></h2>
<p>在上面的設定後稍等一段時間再去查看 Slave 的延遲狀態</p>
<pre tabindex="0"><code>mysql&gt; show slave status\G
</code></pre><p>就發現他已經變成 0 嚕～</p>
<p><img src="https://deanlin.net/blog/202103/mysql-replication-lag/images/mysql-replication-lag-06.webp" width="482" height="129" alt="四、確認 Slave 已經沒有延遲（圖 6）" loading="lazy" decoding="async"></p>
<hr>
<pre tabindex="0"><code>如果你想了解資料庫主從式架構的設定歡迎參考我的文章：
👍 MySQL Master Slave Replication 主從式架構設定教學
👍 Ubuntu 用 Atlas 實現 MySQL Proxy 讀寫分離 read/write splitting
</code></pre><p><strong>參考資訊</strong>：<a href="https://jerryw.blog/2021/01/07/mysql-master-slave-%E8%A4%87%E5%AF%AB%E5%BB%B6%E6%BB%AF%E5%90%8C%E6%AD%A5%E5%95%8F%E9%A1%8C/">mysql master-slave 複寫延滯同步問題</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>用 sysbench 測試 MySQL 性能 — 在 mac &amp; ubuntu 上的安裝與使用</title>
      <link>https://deanlin.net/blog/202103/mysql-benchmark-sysbench/</link>
      <pubDate>Mon, 29 Mar 2021 14:43:32 +0800</pubDate>
      <guid>https://deanlin.net/blog/202103/mysql-benchmark-sysbench/</guid>
      <dc:creator>林鼎淵</dc:creator>
      <category>技術教學</category>
      <description>sysbench 是我目前使用上最順手的一個測試工具，安裝、使用都非常容易，除了資料庫的測試外他還能對 CPU、Memory…做測試，本篇會詳細說明如何使用它來做 MySQL 性能測試，其他的功能可以參考文末附的連結。</description>
      <media:content url="https://deanlin.net/blog/202103/mysql-benchmark-sysbench/images/mysql-benchmark-sysbench-og_hu_19a351296783d12c.jpg" medium="image" type="image/jpeg" width="1200" height="675" />
      <content:encoded><![CDATA[<p>sysbench 是我目前使用上最順手的一個測試工具，安裝、使用都非常容易，除了資料庫的測試外他還能對 CPU、Memory…做測試，本篇會詳細說明如何使用它來做 MySQL 性能測試，其他的功能可以參考文末附的連結。</p>
<p><img src="https://deanlin.net/blog/202103/mysql-benchmark-sysbench/images/mysql-benchmark-sysbench-01.webp" width="1400" height="785" alt="用 sysbench 測試 MySQL 性能 — 在 mac &amp; ubuntu 上的安裝與使用（圖 1）" fetchpriority="high" decoding="async"></p>
<h2 id="一在-mac-上操作-sysbench">一、在 Mac 上操作 sysbench<a class="h-anchor" href="#%e4%b8%80%e5%9c%a8-mac-%e4%b8%8a%e6%93%8d%e4%bd%9c-sysbench" aria-label="這個段落的連結"></a></h2>
<h3 id="-安裝-sysbench">安裝 sysbench<a class="h-anchor" href="#-%e5%ae%89%e8%a3%9d-sysbench" aria-label="這個段落的連結"></a></h3>
<blockquote>
<p>如果還沒安裝過 brew 請<a href="https://brew.sh/zh-tw/">參考官網</a></p>
</blockquote>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>brew install sysbench
</span></span></code></pre></div><p>安裝完成後輸入指令確認安裝完成</p>
<pre tabindex="0"><code>sysbench — version
</code></pre><p><img src="https://deanlin.net/blog/202103/mysql-benchmark-sysbench/images/mysql-benchmark-sysbench-02.webp" width="880" height="92" alt="安裝 sysbench（圖 2）" loading="lazy" decoding="async"></p>
<p>我安裝的版本為 <code>1.0.20</code> 這個會跟下面的指令路徑有關，如果你安裝的是其他版本要自行修改這個版本路徑</p>
<h3 id="-測試-mysql-性能">測試 MySQL 性能<a class="h-anchor" href="#-%e6%b8%ac%e8%a9%a6-mysql-%e6%80%a7%e8%83%bd" aria-label="這個段落的連結"></a></h3>
<blockquote>
<p>mac 的範例是本地端的測試，針對 read 這塊</p>
</blockquote>
<p><strong>STEP 1</strong>：先建立好測試用的 DB</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#ff7b72">create</span><span style="color:#6e7681"> </span><span style="color:#ff7b72">database</span><span style="color:#6e7681"> </span>test;<span style="color:#6e7681">
</span></span></span></code></pre></div><p><strong>STEP 2</strong>：建立測試資料</p>
<ul>
<li><strong>mysql-user、mysql-password</strong>：改成自己 MySQL 的使用者</li>
<li><strong>mysql-db</strong>：測試的資料庫</li>
<li><strong>range_size、table_size、tables</strong>：測試的規模</li>
<li><strong>prepare</strong>：建立測資的意思</li>
</ul>
<pre tabindex="0"><code>sysbench /usr/local/Cellar/sysbench/1.0.20/share/sysbench/oltp_read_only.lua \
--db-driver=mysql \
--mysql-user=user_name \
--mysql-password=user_password \
--mysql-db=test \
--range_size=100 \
--table_size=10000 \
--tables=2 \
--threads=1 \
--events=0 \
--time=60 \
--rand-type=uniform \
prepare
</code></pre><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/d26df5b62cc8b790085ef4d6ee468883" rel="noopener">sysbench_prepare.cmd</a>（GitHub Gist）</p>
<p><img src="https://deanlin.net/blog/202103/mysql-benchmark-sysbench/images/mysql-benchmark-sysbench-03.webp" width="1032" height="334" alt="測試 MySQL 性能（圖 3）" loading="lazy" decoding="async"></p>
<p><strong>STEP 3</strong>：進行測試</p>
<blockquote>
<p>只是把指令最後面改成 run</p>
</blockquote>
<pre tabindex="0"><code>sysbench /usr/local/Cellar/sysbench/1.0.20/share/sysbench/oltp_read_only.lua \
--db-driver=mysql \
--mysql-user=user_name \
--mysql-password=user_password \
--mysql-db=test \
--range_size=100 \
--table_size=10000 \
--tables=2 \
--threads=1 \
--events=0 \
--time=60 \
--rand-type=uniform \
run
</code></pre><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/a3093daa95c2b7cae4dd327fcae4d9ba" rel="noopener">sysbench_run.cmd</a>（GitHub Gist）</p>
<p><img src="https://deanlin.net/blog/202103/mysql-benchmark-sysbench/images/mysql-benchmark-sysbench-04.webp" width="1330" height="1378" alt="測試 MySQL 性能（圖 4）" loading="lazy" decoding="async"></p>
<p><strong>STEP 4</strong>：清除測試數據</p>
<blockquote>
<p>只是把指令最後面改成 cleanup</p>
</blockquote>
<pre tabindex="0"><code>sysbench /usr/local/Cellar/sysbench/1.0.20/share/sysbench/oltp_read_only.lua \
--db-driver=mysql \
--mysql-user=user_name \
--mysql-password=user_password \
--mysql-db=test \
--range_size=100 \
--table_size=10000 \
--tables=2 \
--threads=1 \
--events=0 \
--time=60 \
--rand-type=uniform \
cleanup
</code></pre><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/24b62f7153920bd3fb4773d64f461945" rel="noopener">sysbench_cleanup.cmd</a>（GitHub Gist）</p>
<p><img src="https://deanlin.net/blog/202103/mysql-benchmark-sysbench/images/mysql-benchmark-sysbench-05.webp" width="992" height="152" alt="測試 MySQL 性能（圖 5）" loading="lazy" decoding="async"></p>
<h2 id="一在-ubuntu-上操作-sysbench">一、在 Ubuntu 上操作 sysbench<a class="h-anchor" href="#%e4%b8%80%e5%9c%a8-ubuntu-%e4%b8%8a%e6%93%8d%e4%bd%9c-sysbench" aria-label="這個段落的連結"></a></h2>
<h3 id="-安裝-sysbench-1">安裝 sysbench<a class="h-anchor" href="#-%e5%ae%89%e8%a3%9d-sysbench-1" aria-label="這個段落的連結"></a></h3>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo apt-get install sysbench -y
</span></span></code></pre></div><p>安裝完成後輸入指令確認安裝完成</p>
<pre tabindex="0"><code>sysbench — version
</code></pre><p><img src="https://deanlin.net/blog/202103/mysql-benchmark-sysbench/images/mysql-benchmark-sysbench-06.webp" width="696" height="82" alt="安裝 sysbench（圖 6）" loading="lazy" decoding="async"></p>
<h3 id="-測試-mysql-性能-1">測試 MySQL 性能<a class="h-anchor" href="#-%e6%b8%ac%e8%a9%a6-mysql-%e6%80%a7%e8%83%bd-1" aria-label="這個段落的連結"></a></h3>
<blockquote>
<p>ubuntu 的範例是遠端的測試，針對 write這塊</p>
</blockquote>
<p><strong>STEP 1</strong>：先建立好測試用的 DB</p>
<div class="highlight"><pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-sql" data-lang="sql"><span style="display:flex;"><span><span style="color:#ff7b72">create</span><span style="color:#6e7681"> </span><span style="color:#ff7b72">database</span><span style="color:#6e7681"> </span>test;<span style="color:#6e7681">
</span></span></span></code></pre></div><p><strong>STEP 2</strong>：建立測試資料</p>
<p>如果你的設定跟我的範例一樣可能要稍微等一下，因為範例的測資比較大筆</p>
<ul>
<li><strong>mysql-host</strong>：目標測試的 ip 或是 host name</li>
<li><strong>mysql-port</strong>：目標測試的 MySQL port</li>
<li><strong>mysql-user、mysql-password</strong>：改成自己 MySQL 的使用者</li>
<li><strong>mysql-db</strong>：測試的資料庫</li>
<li><strong>range_size、table_size、tables</strong>：測試的規模</li>
<li><strong>prepare</strong>：建立測資的意思</li>
</ul>
<pre tabindex="0"><code>sysbench /usr/share/sysbench/oltp_write_only.lua \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=user_name \
--mysql-password=user_password \
--mysql-db=test \
--db-driver=mysql \
--tables=10 \
--table_size=10000 \
--report-interval=10 \
--threads=128 \
--time=120 \
prepare
</code></pre><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/4adca32bb1877a41e51c23ff3ff127bf" rel="noopener">ubuntu_sysbench_prepare.cmd</a>（GitHub Gist）</p>
<p><img src="https://deanlin.net/blog/202103/mysql-benchmark-sysbench/images/mysql-benchmark-sysbench-07.webp" width="1026" height="1340" alt="測試 MySQL 性能（圖 7）" loading="lazy" decoding="async"></p>
<p><strong>STEP 3</strong>：進行測試</p>
<blockquote>
<p>只是把指令最後面改成 run</p>
</blockquote>
<pre tabindex="0"><code>sysbench /usr/share/sysbench/oltp_write_only.lua \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=user_name \
--mysql-password=user_password \
--mysql-db=test \
--db-driver=mysql \
--tables=10 \
--table_size=10000 \
--report-interval=10 \
--threads=128 \
--time=120 \
run
</code></pre><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/24b504d1f2056b6645b63a55ac2856c4" rel="noopener">ubuntu_sysbench_run.cmd</a>（GitHub Gist）</p>
<p><img src="https://deanlin.net/blog/202103/mysql-benchmark-sysbench/images/mysql-benchmark-sysbench-08.webp" width="1104" height="895" alt="測試 MySQL 性能（圖 8）" loading="lazy" decoding="async"></p>
<p><strong>STEP 4</strong>：清除測試數據</p>
<blockquote>
<p>只是把指令最後面改成 cleanup</p>
</blockquote>
<pre tabindex="0"><code>sysbench /usr/share/sysbench/oltp_write_only.lua \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=user_name \
--mysql-password=user_password \
--mysql-db=test \
--db-driver=mysql \
--tables=10 \
--table_size=10000 \
--report-interval=10 \
--threads=128 \
--time=120 \
cleanup
</code></pre><p class="code-source">原始碼：<a href="https://gist.github.com/dean9703111/957b162ca5a0bbe57a86e7c792e2a085" rel="noopener">ubuntu_sysbench_cleanup.cmd</a>（GitHub Gist）</p>
<p><img src="https://deanlin.net/blog/202103/mysql-benchmark-sysbench/images/mysql-benchmark-sysbench-09.webp" width="458" height="226" alt="測試 MySQL 性能（圖 9）" loading="lazy" decoding="async"></p>
<hr>
<blockquote class="pullquote"><p>以上是今天的分享，想了解更多功能請參考<a href="https://github.com/akopytov/sysbench">官方的 github</a></p>
</blockquote>
<p><strong>參考資源</strong>：Ubuntu 16.04中進行Sysbench環境搭建、<a href="https://blog.51cto.com/13990437/2400940">sysbench安装和使用</a></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
