詳細チュートリアル丨KubernetesにRedisクラスタを配備する方法
紹介する
Redis(Remote DIctionary Server)は、データベース、キャッシュ、およびメッセージ・エージェントとして一般的に使用されるオープン・ソースのメモリ・データ・ストレージです.lists、maps、sets、ソートsetsなどの高度なデータ構造タイプを格納および操作できます.Redisは複数のフォーマットのキーを受け入れるため、サーバ上で操作を実行し、クライアントのワークロードを削減することができます.データベースを完全にメモリに保存し、ディスクのみを使用して永続的なストレージを行います.Redisは人気のあるデータストレージソリューションで、Github、Pinterest、Snapchat、Twitter、StackOverflow、Flickrなどの科学技術大手に人気があります.
どうしてRedisを使うの?は非常に速く、ANSI Cによって作成され、Linux、Mac OS X、SolarisなどのPOSIXシステムで実行できます. Reisは、最もポピュラーなキー値データベースと、コンテナ上で最もポピュラーなNoSQLデータベースを使用すると評価されることが多い. キャッシュ・ソリューションにより、クラウド・データベースのバックエンドへの呼び出しが減少します. アプリケーションは、クライアントAPIライブラリを介してアクセスすることができる. 流行のプログラミング言語はすべてRedisをサポートしています. オープンソースで非常に安定しています.
Redisの応用例 Facebookの一部のオンラインゲームでは、ゲームの点数の更新頻度が非常に高い.Redisソートsetを使用すると、毎分数百万のユーザーと数百万の新しいスコアがあっても、これらの操作を実行するのは簡単です. TwitterはRedisクラスタにすべてのユーザのタイムラインを格納している. Pinterestは、データが数百のインスタンスに分散されたRedisクラスタにユーザ関心者マップを格納する. GithubはRedisをキュー として使用する
Redisクラスタとは?
Redisクラスタは、データベースのパーティション化によってデータベースを拡張し、より弾力性を持たせるためのマルチRedisインスタンスの集合です.クラスタ内の各メンバーは、プライマリ・レプリカでもセカンダリ・レプリカでも、ハッシュ・スロットのサブセットを管理します.プライマリ・サーバにアクセスできない障害が発生した場合、セカンダリ・サーバはプライマリ・サーバに昇格します.3つのプライマリノードからなる最小Redisクラスタでは、各プライマリノードは、少なくとも最小限のフェイルオーバを保証するために、0〜16383の範囲のハッシュスロットを割り当てる依存ノードを有する.ノードAは、ハッシュスロット範囲が0〜5000、ノードBが5001〜10000、ノードCが10001〜18383を含む.クラスタ内部の通信は内部バスを介して行われ,gossipプロトコルを用いてクラスタに関する情報を伝播したり,新しいノードを発見したりする.
KubernetesにRedisクラスタを配備する
KubernetesにおけるRedisクラスタの導入は、各Redisインスタンスが他のクラスタインスタンスとその役割を追跡するプロファイルに依存するため、困難である.そのため、Kubernetes状態セット(StatefulSets)と永続ボリューム(PersistentVolumes)を組み合わせて使用する必要があります.
前期準備
今回のdemoを完了するには、次の準備が必要です. Rancher Googleクラウドプラットフォームまたはその他のクラウドプロバイダアカウント.以下の展示ではGKEを使用していますが、どのクラウドプロバイダを使用しても可能で、操作方法はほぼ同じです.
ランチャーインスタンスの起動
Rancherのインスタンスがない場合は、ここのQuick Startドキュメントを参照して簡単に起動してください.
https://rancher.com/quick-start/
GKEクラスタをRancherで配備
RancherでKubernetesクラスタを起動して構成するには、ドキュメントを参照してください.
https://rancher.com/docs/ranc...
クラスタの準備が整うとkubectl命令で現在の状態を確認できます
配備Redis
次にRedisクラスタを配備し、kubectlでYAMLファイルを適用したり、Rancher UIにインポートしたりすることができます.必要なすべてのYAMLファイルを以下に示します.
YAMLの内容は以下の通りです.
redis-sts.yaml
redis-svc.yaml
導入の検証
Redisノードが起動して実行されているかどうかを確認します.
次の6つのボリュームは私たちが作成したものです.
どのpodもチェックして、追加されたボリュームを見てみましょう.
同じデータをRancher UIで見ることもできます
Redisクラスタの配備
次はRedisクラスタの作成です.このため、次のコマンドを実行し、yesを入力して構成を受け入れる必要があります.最初の3つのノードはプライマリノードになり、最後の3つのノードはセカンダリノードに設定されます.
以下は完全な出力コマンドです.
クラスタ導入の検証
クラスタの詳細と各メンバーの役割の確認
Redisクラスタのテスト
クラスタを使用してノード障害をシミュレートしたい.前のタスクでは、単純なpythonアプリケーションを配備し、次のタスクでは、クラスタの動作を観察するためにノードを削除します.
Hit Counterアプリケーションの導入
クラスタに簡単なアプリケーションを導入し、その前に負荷イコライザを配置します.このアプリケーションの目的は、カウンタの値をHTTP応答の戻り値として返す前に、カウンタの値を増やし、値をRedisクラスタに格納することです.
kubectlまたはRancher UIを使用して導入:
YAMLの内容は以下の通りです.
app-deployment-service.yaml
Rancherは、pythonアプリケーションを含むpodと、LoadBalancerタイプのサービスを作成したリソースを示しています.このサービスの詳細には、そのパブリックIPアドレスが表示されます.
これにより、ブラウザでIPにアクセスし、hit counterの値を生成できます.
シミュレーションノード障害
pod(kubectlまたはRancher UIを使用)を削除することで、クラスタメンバーの障害をシミュレートできます.元masterのredis-cluster-0を削除すると、Kubernetesはredis-cluster-3をmasterに昇格させ、redis-cluster-0が再び戻ってくると、redis-cluster-3は従属アイデンティティを再開するのを見ました.
前
を選択します.
redis-cluster-0のIPが変化していることがわかりますが、クラスタはどのように回復しているのでしょうか.
クラスタを作成するとき、/conf/update-nodeにあるConfigMapを作成しました.shでは、コンテナが起動時にスクリプトを呼び出すスクリプトが作成されます.このスクリプトは、ローカルノードの新しいIPアドレスを使用してRedis構成を更新します.conficの新しいIPがあれば、クラスタは新しいpodで異なるIPアドレスで起動して復元することができます.
このプロセスでは、ページをロードし続けるとカウンタが増加し続け、クラスタが収束した後もデータが失われていないことがわかります.
結論
Redisは強力なデータストレージとキャッシュツールです.Redisクラスタは、Redisがデータを格納する方法のため、スライス、関連するパフォーマンスの利点、線形拡張、および高可用性を提供することによって、その機能をさらに拡張することができる.データは、複数のノード間で自動的に分割され、ノードのサブセットに障害が発生したり、クラスタの他の部分と通信できなくても、操作は継続できます.
Redisクラスタの詳細については、チュートリアル(https://redis.io/topics/clust...)またはドキュメント(https://redis.io/topics/clust...).
Rancherの詳細については、私たちのホームページ(https://www.cnrancher.com)または配置ドキュメント(https://www.cnrancher.com/doc...).
Redis(Remote DIctionary Server)は、データベース、キャッシュ、およびメッセージ・エージェントとして一般的に使用されるオープン・ソースのメモリ・データ・ストレージです.lists、maps、sets、ソートsetsなどの高度なデータ構造タイプを格納および操作できます.Redisは複数のフォーマットのキーを受け入れるため、サーバ上で操作を実行し、クライアントのワークロードを削減することができます.データベースを完全にメモリに保存し、ディスクのみを使用して永続的なストレージを行います.Redisは人気のあるデータストレージソリューションで、Github、Pinterest、Snapchat、Twitter、StackOverflow、Flickrなどの科学技術大手に人気があります.
どうしてRedisを使うの?
Redisの応用例
Redisクラスタとは?
Redisクラスタは、データベースのパーティション化によってデータベースを拡張し、より弾力性を持たせるためのマルチRedisインスタンスの集合です.クラスタ内の各メンバーは、プライマリ・レプリカでもセカンダリ・レプリカでも、ハッシュ・スロットのサブセットを管理します.プライマリ・サーバにアクセスできない障害が発生した場合、セカンダリ・サーバはプライマリ・サーバに昇格します.3つのプライマリノードからなる最小Redisクラスタでは、各プライマリノードは、少なくとも最小限のフェイルオーバを保証するために、0〜16383の範囲のハッシュスロットを割り当てる依存ノードを有する.ノードAは、ハッシュスロット範囲が0〜5000、ノードBが5001〜10000、ノードCが10001〜18383を含む.クラスタ内部の通信は内部バスを介して行われ,gossipプロトコルを用いてクラスタに関する情報を伝播したり,新しいノードを発見したりする.
KubernetesにRedisクラスタを配備する
KubernetesにおけるRedisクラスタの導入は、各Redisインスタンスが他のクラスタインスタンスとその役割を追跡するプロファイルに依存するため、困難である.そのため、Kubernetes状態セット(StatefulSets)と永続ボリューム(PersistentVolumes)を組み合わせて使用する必要があります.
前期準備
今回のdemoを完了するには、次の準備が必要です.
ランチャーインスタンスの起動
Rancherのインスタンスがない場合は、ここのQuick Startドキュメントを参照して簡単に起動してください.
https://rancher.com/quick-start/
GKEクラスタをRancherで配備
RancherでKubernetesクラスタを起動して構成するには、ドキュメントを参照してください.
https://rancher.com/docs/ranc...
クラスタの準備が整うとkubectl命令で現在の状態を確認できます
配備Redis
次にRedisクラスタを配備し、kubectlでYAMLファイルを適用したり、Rancher UIにインポートしたりすることができます.必要なすべてのYAMLファイルを以下に示します.
YAMLの内容は以下の通りです.
redis-sts.yaml
redis-svc.yaml
導入の検証
Redisノードが起動して実行されているかどうかを確認します.
次の6つのボリュームは私たちが作成したものです.
$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-ae61ad5c-f0a5-11e8-a6e0-42010aa40039 1Gi RWO Delete Bound default/data-redis-cluster-0 standard 7m
pvc-b74b6ef1-f0a5-11e8-a6e0-42010aa40039 1Gi RWO Delete Bound default/data-redis-cluster-1 standard 7m
pvc-c4f9b982-f0a5-11e8-a6e0-42010aa40039 1Gi RWO Delete Bound default/data-redis-cluster-2 standard 6m
pvc-cd7af12d-f0a5-11e8-a6e0-42010aa40039 1Gi RWO Delete Bound default/data-redis-cluster-3 standard 6m
pvc-d5bd0ad3-f0a5-11e8-a6e0-42010aa40039 1Gi RWO Delete Bound default/data-redis-cluster-4 standard 6m
どのpodもチェックして、追加されたボリュームを見てみましょう.
$ kubectl describe pods redis-cluster-0 | grep pvc
Normal SuccessfulAttachVolume 29m attachdetach-controller AttachVolume.Attach succeeded for volume "pvc-ae61ad5c-f0a5-11e8-a6e0-42010aa40039"
同じデータをRancher UIで見ることもできます
Redisクラスタの配備
次はRedisクラスタの作成です.このため、次のコマンドを実行し、yesを入力して構成を受け入れる必要があります.最初の3つのノードはプライマリノードになり、最後の3つのノードはセカンダリノードに設定されます.
$ kubectl exec -it redis-cluster-0 -- redis-cli --cluster create --cluster-replicas 1 $(kubectl get pods -l app=redis-cluster -o jsonpath='{range.items[*]}{.status.podIP}:6379 ')
以下は完全な出力コマンドです.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.60.1.13:6379 to 10.60.2.12:6379
Adding replica 10.60.2.14:6379 to 10.60.1.12:6379
Adding replica 10.60.1.14:6379 to 10.60.2.13:6379
M: 2847de6f6e7c8aaa8b0d2f204cf3ff6e8562a75b 10.60.2.12:6379
slots:[0-5460] (5461 slots) master
M: 3f119dcdd4a33aab0107409524a633e0d22bac1a 10.60.1.12:6379
slots:[5461-10922] (5462 slots) master
M: 754823247cf28af9a2a82f61a8caaa63702275a0 10.60.2.13:6379
slots:[10923-16383] (5461 slots) master
S: 47efe749c97073822cbef9a212a7971a0df8aecd 10.60.1.13:6379
replicates 2847de6f6e7c8aaa8b0d2f204cf3ff6e8562a75b
S: e40ae789995dc6b0dbb5bb18bd243722451d2e95 10.60.2.14:6379
replicates 3f119dcdd4a33aab0107409524a633e0d22bac1a
S: 8d627e43d8a7a2142f9f16c2d66b1010fb472079 10.60.1.14:6379
replicates 754823247cf28af9a2a82f61a8caaa63702275a0
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 10.60.2.12:6379)
M: 2847de6f6e7c8aaa8b0d2f204cf3ff6e8562a75b 10.60.2.12:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 47efe749c97073822cbef9a212a7971a0df8aecd 10.60.1.13:6379
slots: (0 slots) slave
replicates 2847de6f6e7c8aaa8b0d2f204cf3ff6e8562a75b
M: 754823247cf28af9a2a82f61a8caaa63702275a0 10.60.2.13:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 3f119dcdd4a33aab0107409524a633e0d22bac1a 10.60.1.12:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: e40ae789995dc6b0dbb5bb18bd243722451d2e95 10.60.2.14:6379
slots: (0 slots) slave
replicates 3f119dcdd4a33aab0107409524a633e0d22bac1a
S: 8d627e43d8a7a2142f9f16c2d66b1010fb472079 10.60.1.14:6379
slots: (0 slots) slave
replicates 754823247cf28af9a2a82f61a8caaa63702275a0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
クラスタ導入の検証
クラスタの詳細と各メンバーの役割の確認
Redisクラスタのテスト
クラスタを使用してノード障害をシミュレートしたい.前のタスクでは、単純なpythonアプリケーションを配備し、次のタスクでは、クラスタの動作を観察するためにノードを削除します.
Hit Counterアプリケーションの導入
クラスタに簡単なアプリケーションを導入し、その前に負荷イコライザを配置します.このアプリケーションの目的は、カウンタの値をHTTP応答の戻り値として返す前に、カウンタの値を増やし、値をRedisクラスタに格納することです.
kubectlまたはRancher UIを使用して導入:
YAMLの内容は以下の通りです.
app-deployment-service.yaml
Rancherは、pythonアプリケーションを含むpodと、LoadBalancerタイプのサービスを作成したリソースを示しています.このサービスの詳細には、そのパブリックIPアドレスが表示されます.
これにより、ブラウザでIPにアクセスし、hit counterの値を生成できます.
シミュレーションノード障害
pod(kubectlまたはRancher UIを使用)を削除することで、クラスタメンバーの障害をシミュレートできます.元masterのredis-cluster-0を削除すると、Kubernetesはredis-cluster-3をmasterに昇格させ、redis-cluster-0が再び戻ってくると、redis-cluster-3は従属アイデンティティを再開するのを見ました.
前
を選択します.
redis-cluster-0のIPが変化していることがわかりますが、クラスタはどのように回復しているのでしょうか.
クラスタを作成するとき、/conf/update-nodeにあるConfigMapを作成しました.shでは、コンテナが起動時にスクリプトを呼び出すスクリプトが作成されます.このスクリプトは、ローカルノードの新しいIPアドレスを使用してRedis構成を更新します.conficの新しいIPがあれば、クラスタは新しいpodで異なるIPアドレスで起動して復元することができます.
このプロセスでは、ページをロードし続けるとカウンタが増加し続け、クラスタが収束した後もデータが失われていないことがわかります.
結論
Redisは強力なデータストレージとキャッシュツールです.Redisクラスタは、Redisがデータを格納する方法のため、スライス、関連するパフォーマンスの利点、線形拡張、および高可用性を提供することによって、その機能をさらに拡張することができる.データは、複数のノード間で自動的に分割され、ノードのサブセットに障害が発生したり、クラスタの他の部分と通信できなくても、操作は継続できます.
Redisクラスタの詳細については、チュートリアル(https://redis.io/topics/clust...)またはドキュメント(https://redis.io/topics/clust...).
Rancherの詳細については、私たちのホームページ(https://www.cnrancher.com)または配置ドキュメント(https://www.cnrancher.com/doc...).