Hi Sanjeewa,

On Sun, Mar 6, 2016 at 7:25 AM, Sanjeewa Malalgoda <sanje...@wso2.com>
wrote:

> Implementing cache is better than having another table mapping IMO. What
> if we query database and keep IP range and network name in memory.
> Then we may do quick search on network name and then based on that rest
> can load some other way.
> WDYT?
>
​We thought of having an in memory cache but we faced several issues along
the way. Let me explain the situation as it is per now.​

The Max-Mind DB has the IP addresses with the IP and the netmask.
Ex: 192.168.0.0/20

The calculation of the IP address range would be like the following.

Address:   192.168.0.1           11000000.10101000.0000 0000.00000001
Netmask:   255.255.240.0 = 20    11111111.11111111.1111 0000.00000000
Wildcard:  0.0.15.255            00000000.00000000.0000 1111.11111111
=>Network:   192.168.0.0/20        11000000.10101000.0000
0000.00000000 (Class C)
Broadcast: 192.168.15.255        11000000.10101000.0000 1111.11111111
HostMin:   192.168.0.1           11000000.10101000.0000 0000.00000001
HostMax:   192.168.15.254        11000000.10101000.0000 1111.11111110
Hosts/Net: 4094                  (Private Internet
<http://www.ietf.org/rfc/rfc1918.txt>)


Therefore what we are currently doing is to calculate the start and end IP
for all the values in the max-mind DB and alter the tables with those
values initially(this is a one time thing that will happen). When the Spark
script executes, we check whether the given IP is between any of the start
and end ranges in the tables. That is the reason why it is taking a long
time to fetch results for a given IP.

As a solution for this, we discussed what Tharindu has mentioned.
1. Have a in memory caching mechanism.
2. Have a DB based caching mechanism.

The only point that we have to highlight is the fact that in both the above
mechanisms we need to cache the IP address(not the ip-netmask as it was in
the max-mind db) against the Geo location.

Ex:-
For 192.168.0.1       - Colombo, Sri Lanka
For 192.168.15.254 - Colombo, Sri Lanka

So as per the above example I took, if there are requests form all the
possible 4094 address we will be caching each IP with the Geo
location(since introducing range queries in a cache is not a good practice).

Please find my comments about both the approaches.

1. Having an in-memory cache would speedup things but based on the IPs in
the data set, there could be number of entries for IPs in the same range.
One problem with this approach is that, if there is a server restart, the
initial script execution would take a lots of time. Also based on certain
scenarios(high number of different IPs) the cache would not have a
significant effect on script execution performance.

2. Having a DB based cache would persist the data even on a restart and the
data fetching query would be searching for an specific value(not a range
query as against the max-mind DB). But the downside is that for a cache
miss there would be minimum 3 DB queries (one for the cache table lookup
and one for the max-mind db lookup and one for the cache persistence).

That is why we have initiated this thread to finalize the caching approach
we should take.
​
​Thanks,
Janaka​



> Thanks,
> sanjeewa.
>
> On Fri, Mar 4, 2016 at 3:12 PM, Tharindu Dharmarathna <tharin...@wso2.com>
> wrote:
>
>> Hi All,
>>
>> We are going to implement Client IP based Geo-location Graph in API
>> Manager Analytics. When we go through the ways of doing in [1] , we
>> selected [2] as the most suitable way to do.
>>
>>
>> *Overview of max-mind's DB.*
>>
>> As the structure of the db (attached in image), They have two tables
>> which incorporate to get the location.
>>
>> Find geoname_id according to network and get Country,City from locations
>> table.
>>
>> *Limitations*
>>
>> As their database dump we couldn't directly process the ip from those
>> tables. We need to check the given ip is in between the network min and max
>> ip. This query get some long time (10 seconds in indexed data). If we
>> directly do this from spark script for each and every ip which in summary
>> table (regardless if ip is same from two row data) will query from the
>> tables. Therefore this will incur the performance impact on this graph.
>>
>> *Solution*
>>
>> 1. Implement LRU cache against ip address vs location.
>>
>> This will need to implement on custom UDF in Spark. If ip querying from
>> spark available in cache it will give the location from it , IF it is not
>> It will retrieve from DB and put into the cache.
>>
>> 2. Persist in a Table
>>
>> ip as the primary key and Country and city as other columns and retrieve
>> data from that table.
>>
>>
>> Please feel free to give us the most suitable way of doing this solution?.
>>
>> [1] - Implementing Geographical based Analytics in API Manager mail
>> thread.
>>
>> [2] - http://dev.maxmind.com/geoip/geoip2/geolite2/
>>
>>
>> *Thanks*
>>
>> *Tharindu Dharmarathna*
>> Associate Software Engineer
>> WSO2 Inc.; http://wso2.com
>> lean.enterprise.middleware
>>
>> mobile: *+94779109091 <%2B94779109091>*
>>
>
>
>
> --
>
> *Sanjeewa Malalgoda*
> WSO2 Inc.
> Mobile : +94713068779
>
> <http://sanjeewamalalgoda.blogspot.com/>blog
> :http://sanjeewamalalgoda.blogspot.com/
> <http://sanjeewamalalgoda.blogspot.com/>
>
>
>


-- 
*Janaka Ranabahu*
Associate Technical Lead, WSO2 Inc.
http://wso2.com


*E-mail: jan...@wso2.com <http://wso2.com>**M: **+94 718370861*

Lean . Enterprise . Middleware
_______________________________________________
Architecture mailing list
Architecture@wso2.org
https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture

Reply via email to