<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Angel's Blog</title>
		<link>https://angelcool.net/sphpblog/blog_index.php</link>
		<description><![CDATA[No Footer]]></description>
		<copyright>Copyright 2026, Angel</copyright>
		<managingEditor>Angel</managingEditor>
		<language>en-US</language>
		<generator>SPHPBLOG 0.7.0</generator>
		<item>
			<title>Riak: Enabling Solr Search</title>
			<link>https://angelcool.net/sphpblog/blog_index.php?entry=entry200120-204654</link>
			<description><![CDATA[General notes about Riak Search -ac<br /><br /><pre># install java JRE (so solr can run)<br />[entadmin@dev3 equeuelib]$ sudo yum install java-1.8.0-openjdk<br /><br /># enable it in riak.conf: search=on<br /># reload/restart riak as needed<br /><br />#create index (can also be done via PHP)<br />[aesteban@localhost ansible]$ curl -X PUT riak.example.com:8098/search/index/story_index<br /><br /># associate index to bucket (can also be done via PHP)<br />[aesteban@localhost ansible]$ curl -X PUT riak.example.com:8098/buckets/story/props -H&#039;content-type:application/json&#039; -d&#039;{&quot;props&quot;:{&quot;search_index&quot;:&quot;story_index&quot;}}&#039;<br /><br /># verify it by viewing bucket props, search for &#039;search_index&#039;<br />riak.example.com:8098/buckets/story/props<br /><br /># add indexable fields to a Story object per se<br />eg: authorId_i and publicationDate_dt<br /><br /># query it !<br />riak.example.com:8098/search/query/story_index?wt=json&amp;q=authorId_i:8144<br /><br /># it returns all story keys associated with that author.<br /><br /># looks like there&#039;s sort capabilities available too:<br />riak.example.com:8098/search/query/story_index?wt=json&amp;q=authorId_i:8144&amp;sort=publicationDate_dt%20desc<br /><br /># by default it seems to put a limit of 10 rows, we can change that...<br />riak.example.com:8098/search/query/story_index?wt=json&amp;q=authorId_i:8144&amp;sort=publicationDate_dt%20desc&amp;rows=50<br /><br /># Solr dashboard riak.example.com:8093/internal_solr/#/story_index</pre><br /><br />PHP<br /><pre><br />$indexes = [<br /> [<br />  &quot;name&quot;   =&gt; &quot;story_index&quot;,<br />  &quot;bucket&quot; =&gt; &quot;story&quot;<br /> ]<br />];<br /><br />$node = (new \Basho\Riak\Node\Builder)<br />  -&gt;atHost(&#039;riak host&#039;)<br />  -&gt;onPort(&#039;riak port&#039;))<br />  -&gt;build();<br /><br />$riak = new \Basho\Riak ([$node]);<br /><br />foreach ($indexes as $index)<br />{<br />  // creates index<br />  $response = (new \Basho\Riak\Command\Builder\Search\StoreIndex($riak))<br />    -&gt;withName( $index[&#039;name&#039;] )<br />    -&gt;usingSchema(&#039;_yz_default&#039;)<br />    -&gt;build()<br />    -&gt;execute();<br />  // associates index with bucket<br />  (new \Basho\Riak\Command\Builder\Search\AssociateIndex($riak))<br />    -&gt;withName( $index[&#039;name&#039;] )<br />    -&gt;buildBucket($index[&#039;bucket&#039;])<br />    -&gt;build()<br />    -&gt;execute();<br />}<br /><br /></pre><br /><br />Docs:<br /><a href="http://docs.basho.com/riak/kv/2.2.3/developing/usage/search/" >http://docs.basho.com/riak/kv/2.2.3/dev ... ge/search/</a><br /><a href="https://docs.riak.com/riak/kv/latest/developing/usage/search/index.html" >https://docs.riak.com/riak/kv/latest/developing/usage/search/index.html</a><br /><br />Default schema:<br /><a href="https://raw.githubusercontent.com/basho/yokozuna/develop/priv/default_schema.xml" >https://raw.githubusercontent.com/basho/yokozuna/develop/priv/default_schema.xml</a><br /><br /><br />12/7/2020<br /><br />Sample query<br /><pre>$query = [<br />    // &quot;defType&quot; =&gt; &quot;edismax&quot;,                              // query parser<br />    &quot;sort&quot;    =&gt; &quot;score DESC&quot;,                              // override default score sorting<br />    &quot;q&quot;       =&gt; &quot;{!edismax}{$parameters[&#039;phrase&#039;]}&quot;,       // query<br />    &quot;qf&quot;      =&gt; &quot;authorName^6 objectId^4 headline^2 deck&quot;, // query fields<br />    &quot;fq&quot;      =&gt; &quot;{!lucene}<br />                    edition:{$parameters[&#039;edition&#039;]}<br />                    AND statusId:4<br />                    AND objectTypeId:(1 2 4 12 15)<br />                    AND publicationDateISO8601:[NOW-10YEAR TO NOW]&quot;, // filter query<br />    &quot;qs&quot;      =&gt; &quot;5&quot;,  // query phrase slop<br />    &quot;bq&quot;      =&gt; &quot;publicationDateISO8601:[NOW-2YEAR TO NOW]&quot;, // boost query<br />    &quot;fl&quot;      =&gt; &quot;*,score&quot;, // field list<br />    &quot;hl&quot;      =&gt; &quot;true&quot;,    // highlight<br />    &quot;mm&quot;      =&gt; &quot;3&lt;80%&quot;,   // minimum match<br />    &quot;wt&quot;      =&gt; &quot;json&quot;,    // response writer<br />    &quot;rows&quot;    =&gt; $rows,     // rows<br />    &quot;start&quot;   =&gt; $start,    // offset<br /><br />    // spell check parameters<br />    &quot;df&quot;                                 =&gt; &quot;entspellcheck&quot;,<br />    &quot;spellcheck&quot;                         =&gt; &quot;true&quot; ,<br />    &quot;spellcheck.q&quot;                       =&gt; &quot;\&quot;{$parameters[&#039;phrase&#039;]}\&quot;~10&quot; , // proximity added<br />    // &quot;spellcheck.build&quot;                   =&gt; &quot;true&quot; ,<br />    &quot;spellcheck.collate&quot;                 =&gt; &quot;true&quot; ,<br />    &quot;spellcheck.maxCollations&quot;           =&gt; &quot;30&quot; ,<br />    &quot;spellcheck.maxCollationTries&quot;       =&gt; &quot;30&quot; ,<br />    &quot;spellcheck.maxCollationEvaluations&quot; =&gt; &quot;30&quot; ,<br />    &quot;spellcheck.collateExtendedResults&quot;  =&gt; &quot;true&quot; ,<br />    &quot;spellcheck.collateMaxCollectDocs&quot;   =&gt; &quot;30&quot; ,<br />    &quot;spellcheck.count&quot;                   =&gt; &quot;10&quot; ,<br />    // &quot;spellcheck.dictionary&quot;              =&gt; &#039;wordbreak&#039; ,<br />    &quot;spellcheck.extendedResults&quot;         =&gt; &quot;true&quot; ,<br />    // &quot;spellcheck.onlyMorePopular&quot;         =&gt; &quot;true&quot; ,<br />    &quot;spellcheck.maxResultsForSuggest&quot;    =&gt; &quot;5&quot; ,<br />    &quot;spellcheck.alternativeTermCount&quot;    =&gt; &quot;10&quot; ,<br />    // &quot;spellcheck.reload&quot;                  =&gt; &quot;true&quot;,<br />    &quot;spellcheck.accuracy&quot;                =&gt; &quot;0.5&quot; ,<br />];</pre><br /><br />Which will be something like this:<br /><pre>http://app01.example.com:8098/search/query/article_index?sort=score DESC<br />&amp;q={!edismax}how to become a millionaire<br />&amp;qf=authorName^6 objectId^4 headline^2 deck<br />&amp;fq={!lucene}<br />    edition:us<br />    AND statusId:4<br />    AND objectTypeId:(1 2 4 12 15)<br />    AND publicationDateISO8601:[NOW-10YEAR TO NOW]<br />&amp;qs=5<br />&amp;bq=publicationDateISO8601:[NOW-2YEAR TO NOW]<br />&amp;fl=*,score<br />&amp;hl=true<br />&amp;mm=3&lt;80%<br />&amp;wt=json<br />&amp;rows=20<br />&amp;start=0<br />&amp;df=entspellcheck<br />&amp;spellcheck=true<br />&amp;spellcheck.q=&quot;how to become a millionaire&quot;~10<br />&amp;spellcheck.collate=true<br />&amp;spellcheck.maxCollations=30<br />&amp;spellcheck.maxCollationTries=30<br />&amp;spellcheck.maxCollationEvaluations=30<br />&amp;spellcheck.collateExtendedResults=true<br />&amp;spellcheck.collateMaxCollectDocs=30<br />&amp;spellcheck.count=10<br />&amp;spellcheck.extendedResults=true<br />&amp;spellcheck.maxResultsForSuggest=5<br />&amp;spellcheck.alternativeTermCount=10<br />&amp;spellcheck.accuracy=0.5</pre>]]></description>
			<category>- Riak Notes</category>
			<guid isPermaLink="true">https://angelcool.net/sphpblog/blog_index.php?entry=entry200120-204654</guid>
			<author>Angel</author>
			<pubDate>Mon, 20 Jan 2020 20:46:54 GMT</pubDate>
		</item>
		<item>
			<title>Load Balancing Riak with Keepalived (Draft)</title>
			<link>https://angelcool.net/sphpblog/blog_index.php?entry=entry141004-164035</link>
			<description><![CDATA[This is a working draft, like lots of things in this site. For dev purposes firewalld was turned off.<br /><br />Cluster VIP:172.16.1.213<br /><br />TODO: VRRP failover setup for load balancer (keepalived)<br />ALSO: It looks like I configured net.ipv4.ip_forward=1 in load balancer but failed to document it, check this when doing a new load balancer.<br /><pre><br />#####################Edge01 Configuration (loadbalancer 1)#########################<br />//keepalived.conf<br />! Configuration File for keepalived<br /><br />global_defs {<br />#   notification_email {<br />#     me[at]example.net<br /><br />#   }<br />#   notification_email_from not-replay[at]example.net<br />#   smtp_server 192.168.200.1<br />#   smtp_connect_timeout 30<br />   router_id LVS_DEVEL<br />}<br /><br />vrrp_instance VI_1 {<br />    state MASTER<br />    interface eth0<br />    virtual_router_id 51<br />    priority 100<br />    advert_int 1<br />    authentication {<br />        auth_type PASS<br />        auth_pass 1111<br />    }<br />    virtual_ipaddress {<br />    #    172.16.1.213<br />    #    172.16.1.254<br />    }<br />}<br /><br />virtual_server 172.16.1.213 8098  {<br />    delay_loop 6<br />    lb_algo wlc<br />    lb_kind DR<br />    nat_mask 255.255.255.0<br />    persistence_timeout 50<br />    protocol TCP<br /><br />    real_server 172.16.1.113 8098 {<br />        weight 1<br />        TCP_CHECK {<br />         connect_timeout 3<br />         connect_port 8098<br />        }<br />    }<br /><br />    real_server 172.16.1.112 8098 {<br />        weight 100<br />        TCP_CHECK {<br />        connect_timeout 3<br />       connect_port 8098<br />        }<br />    }<br /><br />    real_server 172.16.1.111 8098 {<br />        weight 100<br />        TCP_CHECK {<br />         connect_timeout 3<br />         connect_port 8098<br />        }<br />    }<br />}<br /><br />//ifconfig (secondary address for VIP)<br />[acool@edge01 ~]$ ifconfig<br />eth0      Link encap:Ethernet  HWaddr 00:24:54:3A:66:4D<br />          inet addr:172.16.1.200  Bcast:172.16.1.255  Mask:255.255.255.0<br />          inet6 addr: fe80::224:54ff:fe3a:664d/64 Scope:Link<br />          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1<br />          RX packets:385 errors:0 dropped:0 overruns:0 frame:0<br />          TX packets:243 errors:0 dropped:0 overruns:0 carrier:0<br />          collisions:0 txqueuelen:1000<br />          RX bytes:37042 (36.1 KiB)  TX bytes:35302 (34.4 KiB)<br /><br />eth0:0    Link encap:Ethernet  HWaddr 00:24:54:3A:66:4D<br />          inet addr:172.16.1.213  Bcast:172.16.1.255  Mask:255.255.255.0<br />          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1<br /><br />lo        Link encap:Local Loopback<br />          inet addr:127.0.0.1  Mask:255.0.0.0<br />          inet6 addr: ::1/128 Scope:Host<br />          UP LOOPBACK RUNNING  MTU:16436  Metric:1<br />          RX packets:4 errors:0 dropped:0 overruns:0 frame:0<br />          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0<br />          collisions:0 txqueuelen:0<br />          RX bytes:240 (240.0 b)  TX bytes:240 (240.0 b)<br /><br />[acool@edge01 ~]$ ip a<br />1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 16436 qdisc noqueue state UNKNOWN<br />    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />    inet 127.0.0.1/8 scope host lo<br />    inet6 ::1/128 scope host<br />       valid_lft forever preferred_lft forever<br />2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000<br />    link/ether 00:24:54:3a:66:4d brd ff:ff:ff:ff:ff:ff<br />    inet 172.16.1.200/24 brd 172.16.1.255 scope global eth0<br />    inet 172.16.1.213/24 brd 172.16.1.255 scope global secondary eth0:0<br />    inet6 fe80::224:54ff:fe3a:664d/64 scope link<br />       valid_lft forever preferred_lft forever<br /><br /><br />#####################Real Server 2 ( 99% same output for other real servers) #########################<br />//DR-IPVS file<br />#!/bin/bash<br /><br />VIP=172.16.1.213<br />host=`/bin/hostname`<br /><br />/sbin/ifconfig lo down<br />/sbin/ifconfig lo up<br />echo 1 &gt; /proc/sys/net/ipv4/conf/lo/arp_ignore<br />echo 2 &gt; /proc/sys/net/ipv4/conf/lo/arp_announce<br />echo 1 &gt; /proc/sys/net/ipv4/conf/all/arp_ignore<br />echo 2 &gt; /proc/sys/net/ipv4/conf/all/arp_announce<br /><br /><br />/sbin/ifconfig lo:1 $VIP netmask 255.255.255.255 up<br />/sbin/route add -host $VIP dev lo:1<br /><br /><br />exit 1<br /><br />//ifconfig<br />[acool@app02 ~]$ ifconfig<br />ens1: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt;  mtu 1500<br />        inet 172.16.1.112  netmask 255.255.255.0  broadcast 172.16.1.255<br />        inet6 fe80::216:d4ff:fe45:8ae1  prefixlen 64  scopeid 0x20&lt;link&gt;<br />        ether 00:16:d4:45:8a:e1  txqueuelen 1000  (Ethernet)<br />        RX packets 564  bytes 53931 (52.6 KiB)<br />        RX errors 0  dropped 0  overruns 0  frame 1<br />        TX packets 428  bytes 57911 (56.5 KiB)<br />        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0<br />        device interrupt 16<br /><br />lo: flags=73&lt;UP,LOOPBACK,RUNNING&gt;  mtu 65536<br />        inet 127.0.0.1  netmask 255.0.0.0<br />        inet6 ::1  prefixlen 128  scopeid 0x10&lt;host&gt;<br />        loop  txqueuelen 0  (Local Loopback)<br />        RX packets 13  bytes 1360 (1.3 KiB)<br />        RX errors 0  dropped 0  overruns 0  frame 0<br />        TX packets 13  bytes 1360 (1.3 KiB)<br />        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0<br /><br />lo:1: flags=73&lt;UP,LOOPBACK,RUNNING&gt;  mtu 65536<br />        inet 172.16.1.213  netmask 255.255.255.255<br />        loop  txqueuelen 0  (Local Loopback)<br /><br />[acool@app02 ~]$<br />[acool@app02 ~]$<br />[acool@app02 ~]$ ip address<br />1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN<br />    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00<br />    inet 127.0.0.1/8 scope host lo<br />       valid_lft forever preferred_lft forever<br />    inet 172.16.1.213/32 scope global lo:1<br />       valid_lft forever preferred_lft forever<br />    inet6 ::1/128 scope host<br />       valid_lft forever preferred_lft forever<br />2: ens1: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP qlen 1000<br />    link/ether 00:16:d4:45:8a:e1 brd ff:ff:ff:ff:ff:ff<br />    inet 172.16.1.112/24 brd 172.16.1.255 scope global ens1<br />       valid_lft forever preferred_lft forever<br />    inet6 fe80::216:d4ff:fe45:8ae1/64 scope link<br />       valid_lft forever preferred_lft forever<br /><br /></pre><br /><br />edge01 verification (keealived load balancer):<br /><pre>[acool@edge01 ~]$<br />[acool@edge01 ~]$<br />[acool@edge01 ~]$ sudo ipvsadm<br />IP Virtual Server version 1.2.1 (size=4096)<br />Prot LocalAddress:Port Scheduler Flags<br />  -&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn<br />TCP  172.16.1.213:8098 wlc persistent 50<br />  -&gt; 172.16.1.111:8098            Route   100    1          0<br />  -&gt; 172.16.1.112:8098            Route   100    0          0<br />  -&gt; 172.16.1.113:8098            Route   1      0          0<br />[acool@edge01 ~]$<br />[acool@edge01 ~]$<br />[acool@edge01 ~]$</pre><br /><br />Riak ring verification:<br /><pre>[acool@app02 ~]$<br />[acool@app02 ~]$<br />[acool@app02 ~]$ sudo riak-admin member_status<br />================================= Membership ==================================<br />Status     Ring    Pending    Node<br />-------------------------------------------------------------------------------<br />valid      32.8%      --      &#039;riak@172.16.1.111&#039;<br />valid      32.8%      --      &#039;riak@172.16.1.112&#039;<br />valid      34.4%      --      &#039;riak@172.16.1.113&#039;<br />-------------------------------------------------------------------------------<br />Valid:3 / Leaving:0 / Exiting:0 / Joining:0 / Down:0<br />[acool@app02 ~]$<br />[acool@app02 ~]$<br />[acool@app02 ~]$<br />[acool@app02 ~]$ sudo riak-admin ring-status<br />================================== Claimant ===================================<br />Claimant:  &#039;riak@172.16.1.113&#039;<br />Status:     up<br />Ring Ready: true<br /><br />============================== Ownership Handoff ==============================<br />No pending changes.<br /><br />============================== Unreachable Nodes ==============================<br />All nodes are up and reachable<br /><br />[acool@app02 ~]$</pre><br /><br />Finally, storing data in riak:<br /><pre>Angels-Mac-mini:~ webmaster$ curl -v -XPUT 172.16.1.213:8098/buckets/test-bucket/keys/friends?returnbody=true  -H &quot;Content-Type: application/json&quot; -d &#039;{&quot;Name&quot;:&quot;Angel Cool&quot;}&#039;</pre><br /><br />Fetching data:<br /><pre>http://172.16.1.213:8098/buckets/test-bucket/keys/friends</pre><br /><br />Or using any of the real servers:<br /><pre>http://172.16.1.111:8098/buckets/test-bucket/keys/friends<br /></pre><br /><br />Adding another node at a later time:<br /><pre>[webmaster@dev ~]$ sudo riak-admin cluster join riak@172.16.1.111<br />[webmaster@dev ~]$ sudo riak-admin cluster plan<br />[webmaster@dev ~]$ sudo riak-admin cluster commit</pre><br /><br />If plan does not look good:<br /><pre>[webmaster@dev ~]$ sudo riak-admin cluster clear</pre><br /><br /><br />Riak must be bound to all interfaces: 0.0.0.0:8098<br /><br /><pre>[aesteban@localhost ~]$ <br />[aesteban@localhost ~]$ riak-admin status | grep riak_kv_version<br />riak_kv_version : &lt;&lt;&quot;1.4.7-0-g5daeedd&quot;&gt;&gt;<br />[aesteban@localhost ~]$ <br /></pre><br />]]></description>
			<category>- Riak Notes</category>
			<guid isPermaLink="true">https://angelcool.net/sphpblog/blog_index.php?entry=entry141004-164035</guid>
			<author>Angel</author>
			<pubDate>Sat, 04 Oct 2014 23:40:35 GMT</pubDate>
		</item>
		<item>
			<title>Riak: Tasks 101</title>
			<link>https://angelcool.net/sphpblog/blog_index.php?entry=entry140122-134916</link>
			<description><![CDATA[<pre>//list all buckets<br />curl -i riak1.barney.com:8098/buckets?buckets=true<br /><br />//putting/storing JSON in riak<br />curl -v -XPUT riak1.barney.com:8098/buckets/my_bucket/keys/my_test?returnbody=true \<br />  -H &quot;Content-Type: application/json&quot; \<br />  -d &#039;{&quot;TestName&quot;:&quot;Monday test&quot;}&#039;<br /><br />//listing keys in bucket<br />curl -i riak1.barney.com:8098/buckets/my_bucket/keys?keys=true<br /><br />//fetch a key<br />curl -v riak1.barney.com:8098/buckets/my_bucket/keys/my_test<br /></pre><br /><br /><a href="http://docs.basho.com/riak/latest/dev/using/basics/" >http://docs.basho.com/riak/latest/dev/using/basics/</a>]]></description>
			<category>- Riak Notes</category>
			<guid isPermaLink="true">https://angelcool.net/sphpblog/blog_index.php?entry=entry140122-134916</guid>
			<author>Angel</author>
			<pubDate>Wed, 22 Jan 2014 20:49:16 GMT</pubDate>
		</item>
	</channel>
</rss>
