新宿鮫:第10回AWSもくもく勉強会でElastiCacheをいじってみました

以前Consistent HashingでMemcacheクラスタを〜みたいな事をやろうとしてて、結局やらなかったなぁと。
って事で、今回はElastiCacheを使って3台のクラスタでやってみようと思います。
 
■ Consistent Hashing
 
なんでコンシステントハッシングか?っていう話は他に詳しく記述しているページが沢山あるのですが、
端折って書くと、キャッシュサーバーであるとは言え、台数が増えたり減ったりした場合に、
全データ入れ直しってなってしまうのはちょっとツライ、と。
 
例えばアクセスするインスタンスを、IDをインスタンス数で割り算した余りで〜とかってやると、
インスタンス数が変わった時に途端にヒットしなくなってしまいます。
 
で、コンシステントハッシングを使えば、犠牲になるデータは一部で済むっていう。
 
 
■ EC2インスタンスにRubyとRubyGemsとmemcache-clientをインストール
 
ググっていくと、Rubyのmemcache-clientっていう名前そのまんまのクライアントだと、
バージョン1.6からConsistent Hashingをサポートしてるそうなのでソレでやってみます。
 
EC2(Ubuntu)インスタンスを立てて、

 
SSHで繋いで、

$ ssh -i eshinohara_tokyo.pem ubuntu@ec2-54-248-28-219.ap-northeast-1.compute.amazonaws.com
Welcome to Ubuntu 12.04.2 LTS (GNU/Linux 3.2.0-40-virtual x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Wed Jun 26 10:33:59 UTC 2013

  System load:  0.11              Processes:           58
  Usage of /:   11.0% of 7.87GB   Users logged in:     0
  Memory usage: 7%                IP address for eth0: 10.134.131.227
  Swap usage:   0%

 
apt-getでRuby入れたら、1.8.7になるんすね…orz まぁイイかと。。

ubuntu@ip-10-134-131-227:~$ sudo apt-get install ruby
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  libreadline5 libruby1.8 ruby1.8
〜略〜
ldconfig deferred processing now taking place
ubuntu@ip-10-134-131-227:~$ ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]

 
gem入れようとしたら、、なんか落ちた。。。

ubuntu@ip-10-134-131-227:~$ sudo apt-get install rubygems
Reading package lists... Done
Building dependency tree
Reading state information... Done
〜略〜
Failed to fetch http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu/pool/main/e/eglibc/libc6-dev_2.15-0ubuntu10.3_amd64.deb  403  Forbidden
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

 
apt-get updateしてから、、

ubuntu@ip-10-134-131-227:~$ sudo apt-get update
Get:1 http://ap-northeast-1.ec2.archive.ubuntu.com precise Release.gpg [198 B]
Get:2 http://ap-northeast-1.ec2.archive.ubuntu.com precise-updates Release.gpg [198 B]
Get:3 http://ap-northeast-1.ec2.archive.ubuntu.com precise Release [49.6 kB]

 
もっかいapt-get install rubygemsしたら、、無事入りました。。

ubuntu@ip-10-134-131-227:~$ sudo apt-get install rubygems
Reading package lists... Done
Building dependency tree
Reading state information... Done
〜略〜
update-alternatives: using /usr/bin/g++ to provide /usr/bin/c++ (c++) in auto mode.
Setting up build-essential (11.5ubuntu2.1) ...
Processing triggers for libc-bin ...
ldconfig deferred processing now taking place
ubuntu@ip-10-134-131-227:~$ gem -v
1.8.15

 
で、gem install memcache-clientでクライアント入れます。

ubuntu@ip-10-134-131-227:~$ sudo gem install memcache-client
Fetching: memcache-client-1.8.5.gem (100%)
Successfully installed memcache-client-1.8.5
1 gem installed
Installing ri documentation for memcache-client-1.8.5...
Installing RDoc documentation for memcache-client-1.8.5...

 
 
■ ElastiCacheインスタンスを立てる
 
アクセス元の準備は出来たので、いよいよElastiCacheのインスタンスを立てます。
Launch〜から。

 
ゾーンをaの方でEC2と同じところで。
あと、何か怒られたからDisable Notification的な。

  
んでもって↓こんな感じでインスタンスが立ち上がりました。

 
Nodesの方みると、それぞれMemcachedデフォルトの11211ポートでエンドポイントが3つ。

tryelasticache.ayvnmf.0001.apne1.cache.amazonaws.com
tryelasticache.ayvnmf.0002.apne1.cache.amazonaws.com
tryelasticache.ayvnmf.0003.apne1.cache.amazonaws.com

 
接続してみると、、、アレっていう。。Rubyからやってもダメ。

ubuntu@ip-10-134-131-227:~$ telnet tryelasticache.ayvnmf.0001.apne1.cache.amazonaws.com 11211
Trying 10.150.131.55...
telnet: Unable to connect to remote host: Connection timed out

 
あー、セキュリティグループか、と。。TCPで11211追加して。。

 
それでも繋がらないのでEC2のSTOP、STARTとかやってたみたけど、ダメで、
ElastiCacheのCache Security GroupsからAddしてやってStatusがauthorizedになったイケました。

ubuntu@ip-10-132-69-101:~$ telnet tryelasticache.ayvnmf.0001.apne1.cache.amazonaws.com 11211
Trying 10.150.131.55...
Connected to ec2-54-250-91-74.ap-northeast-1.compute.amazonaws.com.
Escape character is '^]'.

 
 
■ RubyからElastiCacheに接続
 
https://github.com/mperham/memcache-clientのReadMeに従って。

require 'rubygems'
require 'memcache'

m = MemCache.new %w[tryelasticache.ayvnmf.0001.apne1.cache.amazonaws.com:11211 tryelasticache.ayvnmf.0002.apne1.cache.amazonaws.com:11211 tryelasticache.ayvnmf.0003.apne1.cache.amazonaws.com:11211]
m.set 'foo1', 'bar1'
puts m.get 'foo1'

 
無事イケました。

ubuntu@ip-10-132-69-101:~$ ruby hoge.rb
bar1

 
ちょっと件数増やしてみます。

m.set 'foo1', 'bar1'
m.set 'foo2', 'bar2'
m.set 'foo3', 'bar3'
m.set 'foo4', 'bar4'
m.set 'foo5', 'bar5'
m.set 'foo6', 'bar6'
m.set 'foo7', 'bar7'
m.set 'foo8', 'bar8'
m.set 'foo9', 'bar9'
m.set 'foo10', 'bar10'
m.set 'foo11', 'bar11'
m.set 'foo12', 'bar12'
m.set 'foo13', 'bar13'
m.set 'foo14', 'bar14'

 
1インスタンス目

ubuntu@ip-10-132-69-101:~$ telnet tryelasticache.ayvnmf.0001.apne1.cache.amazonaws.com 11211
Trying 10.150.131.55...
Connected to ec2-54-250-91-74.ap-northeast-1.compute.amazonaws.com.
Escape character is '^]'.
get foo1
VALUE foo1 0 8
"	bar1
END
get foo2
VALUE foo2 0 8
"	bar2
END
get foo3
END
get foo4
END
get foo5
END
get foo6
END
get foo7
END
get foo8
END
get foo9
VALUE foo9 0 8
"	bar9
END
get foo10
END
get foo11
END
get foo12
END
get foo13
END
get foo14
END

 
2インスタンス目

ubuntu@ip-10-132-69-101:~$ telnet tryelasticache.ayvnmf.0002.apne1.cache.amazonaws.com 11211
Trying 10.150.131.147...
Connected to ec2-176-34-9-106.ap-northeast-1.compute.amazonaws.com.
Escape character is '^]'.
get foo1
VALUE foo1 0 8
"	bar1
END
get foo2
END
get foo3
VALUE foo3 0 8
"	bar3
END
get foo4
VALUE foo4 0 8
"	bar4
END
get foo5
VALUE foo5 0 8
"	bar5
END
get foo6
VALUE foo6 0 8
"	bar6
END
get foo7
VALUE foo7 0 8
"	bar7
END
get foo8
VALUE foo8 0 8
"	bar8
END
get foo9
END
get foo10
VALUE foo10 0 9
"
bar10
END
get foo11
VALUE foo11 0 9
"
bar11
END
get foo12
VALUE foo12 0 9
"
bar12
END
get foo13
VALUE foo13 0 9
"
bar13
END
get foo14
VALUE foo14 0 9
"
bar14
END

 
3インスタンス目。件数が少ないからデータ入ってないのだろうか。。

ubuntu@ip-10-132-69-101:~$ telnet tryelasticache.ayvnmf.0003.apne1.cache.amazonaws.com 11211
Trying 10.150.163.24...
Connected to ec2-54-249-177-34.ap-northeast-1.compute.amazonaws.com.
Escape character is '^]'.
get foo1
END
get foo2
END
get foo3
END
get foo4
END
get foo5
END
get foo6
END
get foo7
END
get foo8
END
get foo9
END
get foo10
END
get foo11
END
get foo12
END
get foo13
END
get foo14
END

 
ってかデッカク↓とか書いてあったりするので、別のGEMでやってみます。。

memcache-client is deprecated as of August 2010. It will be supported through 2010 but new code should use Dalli instead.

 
再起動してElastiCacheのノードを再起動してデータ消します。

 
↓みるとmemcached gemでConsistent Hashingで分散って書いてあるので。。
https://gist.github.com/shouyu/3524345
 
さっそく入れようとすると、、、

ubuntu@ip-10-132-69-101:~$ sudo gem install memcached
Building native extensions.  This could take a while...
ERROR:  Error installing memcached:
	ERROR: Failed to build gem native extension.

        /usr/bin/ruby1.8 extconf.rb
checking for sasl/sasl.h... no
Please install SASL to continue. The package is called libsasl2-dev on Ubuntu and cyrus-sasl on Gentoo.
*** extconf.rb failed ***

 
SASLってライブラリが要るらしいので、、

ubuntu@ip-10-132-69-101:~$ sudo apt-get install libsasl2-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  libsasl2-dev

 
インストール出来たっぽい。。

ubuntu@ip-10-132-69-101:~$ sudo gem install memcached
Building native extensions.  This could take a while...
Successfully installed memcached-1.6.1
1 gem installed

 
タイムアップ。。グダグダで終わっちゃった…笑

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中