<?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/">
  <channel>
    <title>Load-Balancer on Mini Fish</title>
    <link>https://blog.minifish.org/tags/load-balancer/</link>
    <description>Recent content in Load-Balancer on Mini Fish</description>
    <image>
      <title>Mini Fish</title>
      <url>https://blog.minifish.org/android-chrome-512x512.png</url>
      <link>https://blog.minifish.org/android-chrome-512x512.png</link>
    </image>
    <generator>Hugo -- 0.154.5</generator>
    <language>en-US</language>
    <copyright>Mini Fish 2014-present. Licensed under CC-BY-NC</copyright>
    <lastBuildDate>Tue, 10 Jul 2018 15:07:00 +0800</lastBuildDate>
    <atom:link href="https://blog.minifish.org/tags/load-balancer/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How to Use HAProxy to Test CockroachDB</title>
      <link>https://blog.minifish.org/posts/how-to-use-haproxy-to-test-cockroachdb/</link>
      <pubDate>Tue, 10 Jul 2018 15:07:00 +0800</pubDate>
      <guid>https://blog.minifish.org/posts/how-to-use-haproxy-to-test-cockroachdb/</guid>
      <description>&lt;h2 id=&#34;installing-haproxy&#34;&gt;Installing HAProxy&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;yum install haproxy&lt;/code&gt; is effective for CentOS 7. After installation, you can start the service using &lt;code&gt;systemctl start haproxy&lt;/code&gt;. But don&amp;rsquo;t rush yet.&lt;/p&gt;
&lt;h2 id=&#34;configuring-haproxy&#34;&gt;Configuring HAProxy&lt;/h2&gt;
&lt;p&gt;Add the following content to /etc/haproxy/haproxy.cfg.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;global &lt;span style=&#34;color:#75715e&#34;&gt;# The content of global is generally fixed and quite understandable.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        log 127.0.0.1   local2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        maxconn &lt;span style=&#34;color:#ae81ff&#34;&gt;4096&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        user haproxy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        group haproxy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        chroot /var/lib/haproxy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        daemon
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pidfile /var/run/haproxy.pid
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        stats socket /var/run/haproxy.sock         &lt;span style=&#34;color:#75715e&#34;&gt;# Create a socket file for haproxy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        nbproc &lt;span style=&#34;color:#ae81ff&#34;&gt;40&lt;/span&gt;                                  &lt;span style=&#34;color:#75715e&#34;&gt;# Start 40 processes to forward concurrently, higher versions can use nbthread, a threaded approach.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;defaults &lt;span style=&#34;color:#75715e&#34;&gt;# This section is mostly copied, not entirely clear on the options.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        log     global
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mode    http
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        option  tcplog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        option  dontlognull
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        retries &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        option  redispatch
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        maxconn &lt;span style=&#34;color:#ae81ff&#34;&gt;1024&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        timeout connect 5000ms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        timeout client 50000ms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        timeout server 50000ms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;listen cdb_cluster 0.0.0.0:3030  &lt;span style=&#34;color:#75715e&#34;&gt;# The actual proxy name and address for receiving services.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;## cdb balance leastconn - the cluster listening on port 3030.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mode tcp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        balance leastconn  &lt;span style=&#34;color:#75715e&#34;&gt;# This method is most suitable for databases; do not change.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        server cdb1 172.16.30.3:26257 check &lt;span style=&#34;color:#75715e&#34;&gt;# Check seems to require a port for feedback status; without it, it might not work, but it doesn&amp;#39;t matter.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        server cdb2 172.16.30.3:26258 check
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        server cdb3 172.16.30.3:26259 check
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        server cdb4 172.16.30.3:26260 check
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;start-and-connect&#34;&gt;Start and Connect&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;systemctl start haproxy&lt;/code&gt; to start the service.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="installing-haproxy">Installing HAProxy</h2>
<p><code>yum install haproxy</code> is effective for CentOS 7. After installation, you can start the service using <code>systemctl start haproxy</code>. But don&rsquo;t rush yet.</p>
<h2 id="configuring-haproxy">Configuring HAProxy</h2>
<p>Add the following content to /etc/haproxy/haproxy.cfg.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>global <span style="color:#75715e"># The content of global is generally fixed and quite understandable.</span>
</span></span><span style="display:flex;"><span>        log 127.0.0.1   local2
</span></span><span style="display:flex;"><span>        maxconn <span style="color:#ae81ff">4096</span>
</span></span><span style="display:flex;"><span>        user haproxy
</span></span><span style="display:flex;"><span>        group haproxy
</span></span><span style="display:flex;"><span>        chroot /var/lib/haproxy
</span></span><span style="display:flex;"><span>        daemon
</span></span><span style="display:flex;"><span>        pidfile /var/run/haproxy.pid
</span></span><span style="display:flex;"><span>        stats socket /var/run/haproxy.sock         <span style="color:#75715e"># Create a socket file for haproxy</span>
</span></span><span style="display:flex;"><span>        nbproc <span style="color:#ae81ff">40</span>                                  <span style="color:#75715e"># Start 40 processes to forward concurrently, higher versions can use nbthread, a threaded approach.</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>defaults <span style="color:#75715e"># This section is mostly copied, not entirely clear on the options.</span>
</span></span><span style="display:flex;"><span>        log     global
</span></span><span style="display:flex;"><span>        mode    http
</span></span><span style="display:flex;"><span>        option  tcplog
</span></span><span style="display:flex;"><span>        option  dontlognull
</span></span><span style="display:flex;"><span>        retries <span style="color:#ae81ff">3</span>
</span></span><span style="display:flex;"><span>        option  redispatch
</span></span><span style="display:flex;"><span>        maxconn <span style="color:#ae81ff">1024</span>
</span></span><span style="display:flex;"><span>        timeout connect 5000ms
</span></span><span style="display:flex;"><span>        timeout client 50000ms
</span></span><span style="display:flex;"><span>        timeout server 50000ms
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>listen cdb_cluster 0.0.0.0:3030  <span style="color:#75715e"># The actual proxy name and address for receiving services.</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## cdb balance leastconn - the cluster listening on port 3030.</span>
</span></span><span style="display:flex;"><span>        mode tcp
</span></span><span style="display:flex;"><span>        balance leastconn  <span style="color:#75715e"># This method is most suitable for databases; do not change.</span>
</span></span><span style="display:flex;"><span>        server cdb1 172.16.30.3:26257 check <span style="color:#75715e"># Check seems to require a port for feedback status; without it, it might not work, but it doesn&#39;t matter.</span>
</span></span><span style="display:flex;"><span>        server cdb2 172.16.30.3:26258 check
</span></span><span style="display:flex;"><span>        server cdb3 172.16.30.3:26259 check
</span></span><span style="display:flex;"><span>        server cdb4 172.16.30.3:26260 check
</span></span></code></pre></div><h2 id="start-and-connect">Start and Connect</h2>
<p><code>systemctl start haproxy</code> to start the service.</p>
<p><code>psql -Uroot -h127.0.0.1 -p3030 test</code> to connect to the database.</p>
<h2 id="cockroachdb-official-recommendation">CockroachDB Official Recommendation</h2>
<p>CockroachDB officially provided their recommended <a href="https://www.cockroachlabs.com/docs/stable/deploy-cockroachdb-on-premises.html">configuration</a>. In this configuration, they use:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>default
</span></span><span style="display:flex;"><span><span style="color:#75715e"># TCP keep-alive on client side. Server already enables them.</span>
</span></span><span style="display:flex;"><span>    option              clitcpka
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>listen psql
</span></span><span style="display:flex;"><span>    option httpchk GET /health?ready<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>
</span></span></code></pre></div><p>These two configurations, the first is to keep the client connection alive, which seems very useful. The second is a status check port, which I understand might be an option to ensure the service is available before dispatching requests, and it also seems very useful. It is recommended to add them.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
