以前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に接続
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
タイムアップ。。グダグダで終わっちゃった…笑
コメント