I took a quick look at the code, specifically here:
https://code.google.com/p/beitmemcached/source/browse/trunk/ClientLibrary/MemcachedClient.cs#354

As far as I can tell, the client is probably doing the right thing (eg,
sharding across memcached instances as expected). I didn't see options to
even attempt replication.

I think this comes down to a bug in your code or error in methodology, or a
bug in the library. I can't tell which from the information you provided.

I do most of my coding in PHP, C, and Python, so I can't help much with
.NET stuff, sorry.

~Ryan



On Mon, May 19, 2014 at 9:53 AM, Jonathan Minond <[email protected]> wrote:

> Hi Ryan,
>
> Thanks for getting  back to me.
> I have the code for the BtIT client, so I can look... can you give me a
> hint what I would be looking for?
> It's an open source imp (
> https://code.google.com/p/beitmemcached/source/browse/ )
> If not, do you have a .NET client you would recommend, or is more widely
> used/supported perhaps?
> All of my interaction with BT / Memcached is wrapped in one library, so I
> can swap the back end client fairly easily if that would be better.
>
>
>
>
> On Sat, May 17, 2014 at 9:19 PM, Ryan McElroy <[email protected]> wrote:
>
>> memcached itself knows nothing about other nodes in a system. How the
>> keys are distributed is entirely dependent upon your client implementation.
>> I'm not familiar with BeIT client, but from reading through the wiki page,
>> I would expect it to be splitting the keys among your memcache servers
>> approximately equally. I say approximately, because hashing functions are
>> probabilisitic. With only 27 keys, I wouldn't be surprised to see
>> significant deviation here. At large numbers of keys, I would expect pretty
>> even distribution though.
>>
>> I think more important than how you are fetching keys from each server is
>> how you're using the BeIT client -- which you don't show here. Do you set
>> it up to do replication or sharding? If replication, what you're seeing is
>> expected. If sharding, I'd say it's unexpected.
>>
>> You can figure out what it is doing by using a packet sniffer (eg, ngrep,
>> wireshark) and seeing when the client sets keys to which boxes.
>>
>> ~Ryan
>>
>>
>> On Thu, May 15, 2014 at 1:39 PM, Jonathan Minond <[email protected]>wrote:
>>
>>> I am seeing something that struck me as a little odd.
>>>
>>> From my reading, as I understand, in a memcached environment, each
>>> memcache node contains a portion of the objects in the cluster.
>>>
>>> So, I would expect something like if I have 27 keys and 3 nodes.
>>>
>>> Each node is holding ~9 keys/objects.... is that correct to assume?
>>>
>>> So, to test out...
>>> <add key="MemCached.Endpoint"
>>> value="server1:11211,server2:11211,server3:11211" />
>>>
>>> As a client, I am using the BeIT Memcached Client for .NET (
>>> code.google.com/p/beitmemcached/)
>>>
>>> To get the keys, I am using Telnet, to get slabs, and then the items, as
>>> described by Boris here:
>>> groups.google.com/forum/#!topic/memcached/YyzonP9HUi0
>>>
>>> 1) I loop through my collection of hosts
>>> 2) Do the telnet process against that host
>>> 3) Collect all the info.
>>>
>>> It seems to me, that I am getting the same keys listed on all 3
>>> servers..... ?
>>> *I did not expect this, and I am hoping someone can explain.*
>>>
>>> To clarify:
>>> This is how I do a GET:
>>>
>>>
>>> And this is how I am trying to get the list of keys.... there is a bit
>>> of debug code buried in there, but it should still be clear:
>>> (TelNetConn = A simple telnet helper)
>>>
>>> List<string> ret = new List<string>();
>>>
>>> string memCacheEndPointAddress =
>>> Config.GetValueWithDefault("MemCached.Endpoint", "localhost:11211");
>>>
>>> string[] points = memCacheEndPointAddress.Split(new[] { ',' },
>>> StringSplitOptions.RemoveEmptyEntries);
>>>
>>>                     foreach (string h in points)
>>>                     {
>>>                         string[] hParts = h.Split(new[] { ':' },
>>> StringSplitOptions.RemoveEmptyEntries);
>>>
>>>                         string cacheHost = hParts[0];
>>>                         TelNetConn tc = new TelNetConn(cacheHost,
>>> Convert.ToInt32(hParts[1]));
>>>
>>>                         if (tc.IsConnected)
>>>                         {
>>>                             ret.Add("HOST: " + cacheHost);
>>>
>>>                             tc.WriteLine("stats items");
>>>                             String s = tc.Read();
>>>                             String[] sLines = s.Split(
>>>                                 new string[] { Environment.NewLine },
>>>                                 StringSplitOptions.RemoveEmptyEntries);
>>>
>>>                             foreach (string sl in sLines)
>>>                             {
>>>                                 if (sl == "END") continue;
>>>
>>>                                 String[] slParts = sl.Split(new[] { ':'
>>> }, StringSplitOptions.RemoveEmptyEntries);
>>>
>>>                                 int slabID = Convert.ToInt32(slParts[1]);
>>>                                 string slabType = slParts[2];
>>>
>>>                                 if (slabType.StartsWith("number") ||
>>> slabType.StartsWith("age"))
>>>                                 {
>>>                                     tc.WriteLine("stats cachedump " +
>>> slabID + " 100");
>>>
>>>                                     s = tc.Read();
>>>
>>>                                     if (!String.IsNullOrEmpty(s))
>>>                                     {
>>>                                         if (s != "END")
>>>                                         {
>>>                                             // ret.Add("FULL: " + s);
>>>
>>>                                             if (s.StartsWith("ITEM "))
>>>                                             {
>>>                                                 string[] itemparts =
>>> s.Split(new[] { ' ' }, StringSplitOptions.None);
>>>                                                 string key =
>>> itemparts[1];
>>>                                                 ret.Add("ITEM: " + key);
>>>                                             }
>>>                                         }
>>>                                     }
>>>                                 }
>>>                             }
>>>
>>>                         }
>>>                         else
>>>                         {
>>>                             ret.Add("HOST: " + cacheHost + " NOT
>>> CONNECTED");
>>>                         }
>>>
>>>                         tc.Dispose();
>>>                     }
>>>
>>> --
>>>
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "memcached" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>>
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>  --
>>
>> ---
>> You received this message because you are subscribed to a topic in the
>> Google Groups "memcached" group.
>> To unsubscribe from this topic, visit
>> https://groups.google.com/d/topic/memcached/G4el5l0eD7I/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to
>> [email protected].
>>
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>  --
>
> ---
> You received this message because you are subscribed to the Google Groups
> "memcached" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"memcached" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to