Kevin Deldycke - Javahttps://kevin.deldycke.com/2016-11-03T17:46:00+01:00 — 🦬🪒🐇🕳 yak-shaving the rabbit holesHow-to initialize Cassandra in macOS?2016-11-03T17:46:00+01:002016-11-03T17:46:00+01:00Kevin Deldycketag:kevin.deldycke.com,2016-11-03:/2016/11/cassandra-macos-init/<p>A little note on how I setup and bootstrap a local Cassandra clusters on macOS
machines for development.</p>
<p>Instructions below were tested on macOS Sierra, and aim to spawn a 3-nodes
2.1.x cluster.</p>
<p>Install <a href="https://github.com/pcmanus/ccm"><code>ccm</code></a> and its dependencies:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span>brew<span class="w"> </span>install<span class="w"> </span>ant
<span class="linenos" data-linenos="2 "></span><span class="gp">$ </span>brew<span class="w"> </span>cask<span class="w"> </span>install<span class="w"> </span>java
<span class="linenos" data-linenos="3 "></span><span class="gp">$ </span>pip<span class="w"> </span>install<span class="w"> </span>--upgrade …</code></pre></div><p>A little note on how I setup and bootstrap a local Cassandra clusters on macOS
machines for development.</p>
<p>Instructions below were tested on macOS Sierra, and aim to spawn a 3-nodes
2.1.x cluster.</p>
<p>Install <a href="https://github.com/pcmanus/ccm"><code>ccm</code></a> and its dependencies:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span>brew<span class="w"> </span>install<span class="w"> </span>ant
<span class="linenos" data-linenos="2 "></span><span class="gp">$ </span>brew<span class="w"> </span>cask<span class="w"> </span>install<span class="w"> </span>java
<span class="linenos" data-linenos="3 "></span><span class="gp">$ </span>pip<span class="w"> </span>install<span class="w"> </span>--upgrade<span class="w"> </span>ccm
</code></pre></div>
<p>Just in case we messed up a previous installation, let’s clean things up:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span>ccm<span class="w"> </span>switch<span class="w"> </span>test21
<span class="linenos" data-linenos="2 "></span><span class="gp">$ </span>ccm<span class="w"> </span>stop<span class="w"> </span>test21
<span class="linenos" data-linenos="3 "></span><span class="gp">$ </span>killall<span class="w"> </span>java
<span class="linenos" data-linenos="4 "></span><span class="gp">$ </span>ccm<span class="w"> </span>remove
<span class="linenos" data-linenos="5 "></span><span class="gp">$ </span>rm<span class="w"> </span>-rf<span class="w"> </span><span class="s2">"</span><span class="si">${</span><span class="nv">HOME</span><span class="si">}</span><span class="s2">/.ccm/test21"</span>
</code></pre></div>
<p>Create a new 3-nodes cluster named <code>test21</code> with the latest Cassandra release
of the 2.1.x series:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span>ccm<span class="w"> </span>create<span class="w"> </span>test21<span class="w"> </span>-v<span class="w"> </span><span class="m">2</span>.1<span class="w"> </span>-n<span class="w"> </span><span class="m">3</span>
</code></pre></div>
<p>Here is an example on how we can alter the common configuration of all nodes of
the cluster. In this case to bump all timeouts ten times:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span>tee<span class="w"> </span>-a<span class="w"> </span>~/.ccm/test21/cluster.conf<span class="w"> </span><<-EOF
<span class="linenos" data-linenos="2 "></span><span class="go">config_options: {</span>
<span class="linenos" data-linenos="3 "></span><span class="go"> read_request_timeout_in_ms: 50000,</span>
<span class="linenos" data-linenos="4 "></span><span class="go"> range_request_timeout_in_ms: 100000,</span>
<span class="linenos" data-linenos="5 "></span><span class="go"> write_request_timeout_in_ms: 20000,</span>
<span class="linenos" data-linenos="6 "></span><span class="go"> request_timeout_in_ms: 100000,</span>
<span class="linenos" data-linenos="7 "></span><span class="go"> tombstone_failure_threshold: 10000000}</span>
<span class="linenos" data-linenos="8 "></span><span class="go">EOF</span>
<span class="linenos" data-linenos="9 "></span><span class="gp">$ </span>ccm<span class="w"> </span>updateconf
</code></pre></div>
<p>Also had to sometimes increase Java’s heap size, like to accommodate large data imports:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span><span class="nb">export</span><span class="w"> </span><span class="nv">CCM_MAX_HEAP_SIZE</span><span class="o">=</span><span class="s2">"12G"</span>
<span class="linenos" data-linenos="2 "></span><span class="gp">$ </span><span class="nb">export</span><span class="w"> </span><span class="nv">CCM_HEAP_NEWSIZE</span><span class="o">=</span><span class="s2">"2400M"</span>
</code></pre></div>
<p>Before starting the server, we need to create missing local network interfaces,
one for each node:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span>sudo<span class="w"> </span>ifconfig<span class="w"> </span>lo0<span class="w"> </span><span class="nb">alias</span><span class="w"> </span><span class="m">127</span>.0.0.1<span class="w"> </span>up
<span class="linenos" data-linenos="2 "></span><span class="gp">$ </span>sudo<span class="w"> </span>ifconfig<span class="w"> </span>lo0<span class="w"> </span><span class="nb">alias</span><span class="w"> </span><span class="m">127</span>.0.0.2<span class="w"> </span>up
<span class="linenos" data-linenos="3 "></span><span class="gp">$ </span>sudo<span class="w"> </span>ifconfig<span class="w"> </span>lo0<span class="w"> </span><span class="nb">alias</span><span class="w"> </span><span class="m">127</span>.0.0.3<span class="w"> </span>up
</code></pre></div>
<p>We can now start the cluster:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span>ccm<span class="w"> </span>start<span class="w"> </span>test21
</code></pre></div>
<p>To get the state of the cluster:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span>ccm<span class="w"> </span>status
<span class="linenos" data-linenos="2 "></span><span class="go">Cluster: 'test21'</span>
<span class="linenos" data-linenos="3 "></span><span class="go">-----------------</span>
<span class="linenos" data-linenos="4 "></span><span class="go">node1: UP</span>
<span class="linenos" data-linenos="5 "></span><span class="go">node3: UP</span>
<span class="linenos" data-linenos="6 "></span><span class="go">node2: UP</span>
</code></pre></div>
<p>Or a much more detailed status:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos=" 1 "></span><span class="gp">$ </span>ccm<span class="w"> </span>status<span class="w"> </span>-v
<span class="linenos" data-linenos=" 2 "></span><span class="go">Cluster: 'test21'</span>
<span class="linenos" data-linenos=" 3 "></span><span class="go">-----------------</span>
<span class="linenos" data-linenos=" 4 "></span><span class="go">node1: UP</span>
<span class="linenos" data-linenos=" 5 "></span><span class="go"> auto_bootstrap=False</span>
<span class="linenos" data-linenos=" 6 "></span><span class="go"> thrift=('127.0.0.1', 9160)</span>
<span class="linenos" data-linenos=" 7 "></span><span class="go"> binary=('127.0.0.1', 9042)</span>
<span class="linenos" data-linenos=" 8 "></span><span class="go"> storage=('127.0.0.1', 7000)</span>
<span class="linenos" data-linenos=" 9 "></span><span class="go"> jmx_port=7100</span>
<span class="linenos" data-linenos="10 "></span><span class="go"> remote_debug_port=0</span>
<span class="linenos" data-linenos="11 "></span><span class="go"> byteman_port=0</span>
<span class="linenos" data-linenos="12 "></span><span class="go"> initial_token=-9223372036854775808</span>
<span class="linenos" data-linenos="13 "></span><span class="go"> pid=81379</span>
<span class="linenos" data-linenos="14 "></span>
<span class="linenos" data-linenos="15 "></span><span class="go">node3: UP</span>
<span class="linenos" data-linenos="16 "></span><span class="go"> auto_bootstrap=False</span>
<span class="linenos" data-linenos="17 "></span><span class="go"> thrift=('127.0.0.3', 9160)</span>
<span class="linenos" data-linenos="18 "></span><span class="go"> binary=('127.0.0.3', 9042)</span>
<span class="linenos" data-linenos="19 "></span><span class="go"> storage=('127.0.0.3', 7000)</span>
<span class="linenos" data-linenos="20 "></span><span class="go"> jmx_port=7300</span>
<span class="linenos" data-linenos="21 "></span><span class="go"> remote_debug_port=0</span>
<span class="linenos" data-linenos="22 "></span><span class="go"> byteman_port=0</span>
<span class="linenos" data-linenos="23 "></span><span class="go"> initial_token=3074457345618258602</span>
<span class="linenos" data-linenos="24 "></span><span class="go"> pid=81381</span>
<span class="linenos" data-linenos="25 "></span>
<span class="linenos" data-linenos="26 "></span><span class="go">node2: UP</span>
<span class="linenos" data-linenos="27 "></span><span class="go"> auto_bootstrap=False</span>
<span class="linenos" data-linenos="28 "></span><span class="go"> thrift=('127.0.0.2', 9160)</span>
<span class="linenos" data-linenos="29 "></span><span class="go"> binary=('127.0.0.2', 9042)</span>
<span class="linenos" data-linenos="30 "></span><span class="go"> storage=('127.0.0.2', 7000)</span>
<span class="linenos" data-linenos="31 "></span><span class="go"> jmx_port=7200</span>
<span class="linenos" data-linenos="32 "></span><span class="go"> remote_debug_port=0</span>
<span class="linenos" data-linenos="33 "></span><span class="go"> byteman_port=0</span>
<span class="linenos" data-linenos="34 "></span><span class="go"> initial_token=-3074457345618258603</span>
<span class="linenos" data-linenos="35 "></span><span class="go"> pid=81380</span>
</code></pre></div>
<p>To get the detailed data ownership status, you need to get through a node and
point to an existing column family:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos=" 1 "></span><span class="gp">$ </span>ccm<span class="w"> </span>node1<span class="w"> </span>status<span class="w"> </span>my_column_family
<span class="linenos" data-linenos=" 2 "></span>
<span class="linenos" data-linenos=" 3 "></span><span class="go">Datacenter: datacenter1</span>
<span class="linenos" data-linenos=" 4 "></span><span class="go">=======================</span>
<span class="linenos" data-linenos=" 5 "></span><span class="go">Status=Up/Down</span>
<span class="linenos" data-linenos=" 6 "></span><span class="go">|/ State=Normal/Leaving/Joining/Moving</span>
<span class="linenos" data-linenos=" 7 "></span><span class="go">-- Address Load Tokens Owns (effective) Host ID Rack</span>
<span class="linenos" data-linenos=" 8 "></span><span class="go">UN 127.0.0.1 6.08 GB 1 100.0% 25e0440b-3ac9-490e-b0b0-260e96395f15 rack1</span>
<span class="linenos" data-linenos=" 9 "></span><span class="go">UN 127.0.0.2 6.22 GB 1 100.0% 848edc79-db1c-49bf-bdd8-3768b588460f rack1</span>
<span class="linenos" data-linenos="10 "></span><span class="go">UN 127.0.0.3 6.14 GB 1 100.0% 75acd6c7-61c5-4ae7-9008-63d6426d1468 rack1</span>
</code></pre></div>
<p>For debugging, a node’s log is available through <code>ccm</code>:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span>ccm<span class="w"> </span>node1<span class="w"> </span>showlog
</code></pre></div>
<p>And you can directly query through that node:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span><span class="nv">TZ</span><span class="o">=</span>UTC<span class="w"> </span>cqlsh<span class="w"> </span>--cqlversion<span class="o">=</span><span class="m">3</span>.2.1<span class="w"> </span><span class="m">127</span>.0.0.1
<span class="linenos" data-linenos="2 "></span><span class="go">Connected to test21 at 127.0.0.1:9042.</span>
<span class="linenos" data-linenos="3 "></span><span class="go">[cqlsh 5.0.1 | Cassandra 2.1.12 | CQL spec 3.2.1 | Native protocol v3]</span>
<span class="linenos" data-linenos="4 "></span><span class="go">Use HELP for help.</span>
<span class="linenos" data-linenos="5 "></span><span class="go">cqlsh> CONSISTENCY QUORUM;</span>
<span class="linenos" data-linenos="6 "></span><span class="go">Consistency level set to QUORUM.</span>
<span class="linenos" data-linenos="7 "></span><span class="go">cqlsh></span>
</code></pre></div>
<p>Finally, to restore a bunch of table snapshots from your production cluster:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span><span class="nv">TABLES</span><span class="o">=</span><span class="s2">"table1 table2 table3"</span>
<span class="linenos" data-linenos="2 "></span><span class="gp">$ </span><span class="nv">DUMP_FOLDER</span><span class="o">=</span><span class="s2">"</span><span class="si">${</span><span class="nv">HOME</span><span class="si">}</span><span class="s2">/dump/2016-09-12/"</span>
<span class="linenos" data-linenos="3 "></span><span class="gp">$ </span><span class="k">for</span><span class="w"> </span>host_folder<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="k">$(</span>ls<span class="w"> </span><span class="s2">"</span><span class="si">${</span><span class="nv">DUMP_FOLDER</span><span class="si">}</span><span class="s2">"</span><span class="k">)</span><span class="p">;</span><span class="w"> </span><span class="k">do</span>
<span class="linenos" data-linenos="4 "></span><span class="go">> for table in ${TABLES}; do</span>
<span class="linenos" data-linenos="5 "></span><span class="go">> SSTABLE_FOLDER="${DUMP_FOLDER}/${host_folder}/my_column_family/${table}";</span>
<span class="linenos" data-linenos="6 "></span><span class="go">> echo "Importing: ${SSTABLE_FOLDER} ...";</span>
<span class="linenos" data-linenos="7 "></span><span class="go">> ccm bulkload "${SSTABLE_FOLDER}";</span>
<span class="linenos" data-linenos="8 "></span><span class="go">> done</span>
<span class="linenos" data-linenos="9 "></span><span class="go">> done</span>
</code></pre></div>
<p>Forcing a repair on each table after a massive import can’t be bad:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span><span class="k">for</span><span class="w"> </span>table<span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="si">${</span><span class="nv">TABLES</span><span class="si">}</span><span class="p">;</span><span class="w"> </span><span class="k">do</span>
<span class="linenos" data-linenos="2 "></span><span class="go">> ccm node1 nodetool repair my_column_family ${table};</span>
<span class="linenos" data-linenos="3 "></span><span class="go">> done</span>
</code></pre></div>How-to Install Sun’s Java for Firefox on your Mandriva 20062006-05-19T23:26:55+02:002006-05-19T23:26:55+02:00Kevin Deldycketag:kevin.deldycke.com,2006-05-19:/2006/05/how-to-install-suns-java-for-firefox-on-your-mandriva-2006/<p>One week ago I succeed to install the Sun’s Java Runtime Environment (<span class="caps">JRE</span>) on my Mandriva 2006. I avoid to use proprietary softwares as long as I can. Unfortunately I needed it to fill my annual tax form online…</p>
<p>So, here is how I achieve this:</p>
<ol>
<li>
<p><a href="https://jdl.sun.com/webapps/download/AutoDL?BundleId=10335">Download the last …</a></p></li></ol><p>One week ago I succeed to install the Sun’s Java Runtime Environment (<span class="caps">JRE</span>) on my Mandriva 2006. I avoid to use proprietary softwares as long as I can. Unfortunately I needed it to fill my annual tax form online…</p>
<p>So, here is how I achieve this:</p>
<ol>
<li>
<p><a href="https://jdl.sun.com/webapps/download/AutoDL?BundleId=10335">Download the last <span class="caps">JRE</span></a> (v1.5.0-06 at that time) from <a href="https://java.com/download">Sun official website</a>.</p>
</li>
<li>
<p>As root, lauch:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span>sh<span class="w"> </span>./jre-1_5_0_06-linux-i586-rpm.bin
</code></pre></div>
<p>(name of the file can change depending of the version number).</p>
</li>
<li>
<p>Accept the licence (tip: scroll down until the end of the text).</p>
</li>
<li>
<p>Back to the console, run:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span>urpmi<span class="w"> </span>./jre-1_5_0_06-linux-i586.rpm
</code></pre></div>
</li>
<li>
<p>Go to mozilla system-wide plugin directory:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>/usr/lib/mozilla/plugins
</code></pre></div>
</li>
<li>
<p>Create a symlink to the java plugin file:</p>
<div class="highlight"><pre><span></span><code><span class="linenos" data-linenos="1 "></span><span class="gp">$ </span>ln<span class="w"> </span>-s<span class="w"> </span>/usr/java/jre1.5.0_06/plugin/i386/ns7/libjavaplugin_oji.so
</code></pre></div>
</li>
<li>
<p>Finished!</p>
</li>
</ol>
<p>To check that java is well installed, type <code>about:plugins</code> in your Firefox browser <span class="caps">URL</span> field and check that java plug-in appear on the list.</p>
<p>Happy tax form filling!</p>