01_Redisのインストールと基本的な最適化

Redisの概要

1.1Redisを初めて知る

Redis(リモート辞書サーバー)はオープンソース(BSDライセンス)であり、キーと値のペア(キーと値)に基づくNoSQLデータベースであり、メモリストレージ用のデータ構造サーバーであり、高速キャッシュとして使用できます。およびメッセージキューエージェント。

多くのキーと値のペアのデータベースとは異なり、redisは文字列(文字列)、ハッシュテーブル(ハッシュ)、リスト(リスト)、セット(セット)、順序付きセット(zset)、ビットマップ(ビットマップ)、HyperLogLogs、GEOおよびその他のデータ構造をサポートします。アルゴリズムが構成されているため、redisは多くのアプリケーションシナリオに対応でき、redisはすべてのデータをメモリに保存するため、読み取りと書き込みのパフォーマンスは非常に優れています。それだけでなく、Redisはメモリ内のデータをスナップショットやログの形式でハードディスクに保存できるため、電源障害やマシン障害が発生した場合にメモリ内のデータが「失われる」ことはありません。上記の機能に加えて、Redisはキーの有効期限、パイプライン、センチネル、組み込みレプリケーション、Luaスクリプト、LRUリカバリ、トランザクションも提供します。同時に、RedisSentinelによる高可用性とRedisクラスターによる自動パーティショニングを提供します。

2008年、Redisの作者であるSalvatore SanfilippoがLLOOGGというWebサイトを開発していたとき、彼は高性能のキュー関数を実装する必要がありました。最初はMySQLを使用して実装されましたが、後でSQLステートメントがどれほど最適化されていてもウェブサイトのパフォーマンスを向上させることはできません。彼自身の恥と相まって、彼はLLOOGG専用のデータベースを構築することを決定しました。これは、Redisの前身です。その後、SalvatoreSanfilippoがRedis1.0!のソースコードをGitHubに公開しました。おそらく、Redisがその後それほど人気になるとは思っていませんでした。Redisを使用しているRedisの作成者に尋ねると、Redisの公式企業統計から、Twitter、Instagram、Stack Overflow、GitHubなど、海外、さらには国内でRedisを使用している大企業がたくさんあります。あまりにも多く、ボリュームから数えるだけで、SinaWeiboはSinaWeiboを除いて世界最大のRedisユーザーであると言えます。Alibaba、Tencent、Baidu、Sohu、Youku Tudou、Meituan、Xiaomi、Vipshopなどの企業はすべてRedisのユーザーです。

1.2Redisの機能

Redisが非常に多くの企業に支持されている理由は、間違いなく優れています。Redisの8つの機能について説明しましょう。

1.高速。
通常の状況では、Redisはコマンドを非常に高速に実行します。公式の数値では、読み取りと書き込みのパフォーマンスは100,000 /秒に達する可能性があります。もちろん、これはマシンのパフォーマンスにも依存しますが、ここでは説明しません。ここでのマシンのパフォーマンス違いは、Redisが非常に高速である理由を分析することです。これは、次の3つの
ポイントに大まかに要約できます

  • データをメモリに配置することが、Redisが高速である主な理由です。
  • RedisはC言語で実装されています。一般的に、C言語で実装されたプログラムはオペレーティングシステムに近く、実行速度は比較的高速です。
  • Redisは、シングルスレッドアーキテクチャを使用して、複数のスレッドから発生する可能性のある競合の問題を防ぎます。

2.キーと値のペアに基づくデータ構造サーバー
ほとんどすべてのプログラミング言語は、Javaのmap、Pythonのdictなど、辞書のような関数を提供します。これは、データを整理するこの方法と同様に、キーと値に基づく方法と呼ばれます。多くのKey-Valueペアデータベースとは異なり、Redisの値は文字列だけでなく、特定のデータ構造にすることもできます。これにより、多くのアプリケーションシナリオでの開発が容易になるだけでなく、開発効率も向上します。RedisのフルネームはREmoteDictionary Serverで、主に文字列、ハッシュ、リスト、セット、順序付きセットの5つのデータ構造を提供します。同時に、文字列に基づいて、ビットマップ(Bitmaps)とHyperLogLogを進化させました。この種の魔法の「データ構造」と、LBS(Location Based Service)の継続的な開発により、Redis 3.2バージョンでは、GEO(地理情報の配置)に関連する人々が追加されました。つまり、これらのデータ構造の助けを借りて、開発者は開発できます。さまざまな「興味深い」アプリケーション。

3.豊富な機能
5つのデータ構造に加えて、Redisは多くの追加機能も提供します。

  • キャッシュを実装するために使用できるキーの有効期限機能を提供します。
  • メッセージシステムの実装に使用できるパブリッシュおよびサブスクライブ機能を提供します。
  • Luaスクリプト機能をサポートします。Luaを使用して新しいRedisコマンドを作成できます。
  • トランザクション特性をある程度保証できるシンプルなトランザクション機能を提供します。
  • パイプライン(パイプライン)機能を提供し、クライアントがコマンドのバッチをRedisに一度に送信できるようにして、ネットワークのオーバーヘッドを削減します。

5.複数のクライアント言語
RedisはシンプルなTCP通信プロトコルを提供し、多くのプログラミング言語をRedisに簡単に接続できます。また、Redisはコミュニティや主要企業に広く認識されているため、Redisをサポートするクライアント言語は多数あります。 Java、PHP、Python、C、C ++、Nodejsなどの主流のプログラミング言語をほぼカバーしています。

6.永続性
一般的に、データをメモリに保存することは安全ではありません。電源障害またはマシン障害が発生すると、重要なデータが失われる可能性があります。したがって、RedisにはRDBとAOFの2つの永続性方法があります。データの保存には2つの戦略が使用されます。データの耐久性を確保するために、メモリからハードディスクに保存します。

7.マスタースレーブレプリケーション
Redisは、同じデータの複数のRedisコピーを実現するレプリケーション機能を提供します。レプリケーション機能は、分散Redisの基盤です。

8.高可用性と分散型
Redisは、バージョン2.8からの高可用性実装Redis Sentinelを公式に提供します。これにより、Redisノードの障害検出と自動フェイルオーバーを保証できます。Redisは、バージョン3.0からRedisクラスターの分散実装を正式に導入しました。これはRedisの真の分散実装であり、高可用性、読み取り/書き込み、および容量のスケーラビリティを提供します。

1.3Redisの使用シナリオ

Redisの多くの機能についてはすでに理解しているので、Redisの典型的なアプリケーションシナリオを見てみましょう。

1.3.1 Redisでできることは何ですか?
1.キャッシング
キャッシングメカニズムは、ほとんどすべての大規模Webサイトで使用されています。キャッシングを適切に使用すると、データアクセスが高速化されるだけでなく、バ​​ックエンドデータソースへの負荷が効果的に軽減されます。Redisは、キー値の有効期限設定を提供し、最大メモリの柔軟な制御とメモリオーバーフロー後の排除戦略も提供します。合理的なキャッシュ設計は、ウェブサイトの安定性を高めることができると言えます。

2、ランキングシステムランキングシステムは、ほぼすべてのサイトに存在します。たとえば、ランキングReduランキング、リリース時間の
ランキング、ランキングに従って計算された複雑なディメンションに従って、Redisはリストと順序付けられたコレクションを提供しますデータ構造、合理的な使用これらのデータ構造のうち、
さまざまなランキングシステムを簡単に構築できます。

3.
カウンターの用途ウェブサイトでのカウンターの役割は非常に重要です。たとえば、ビデオウェブサイトには視聴回数があり、eコマースウェブサイトには視聴回数があります。リアルタイム性を確保するためにデータのパフォーマンスについては、再生および参照するたびに1を加算する操作を実行する必要があります。大量の同時実行性は、従来のリレーショナルデータのパフォーマンスに対する課題です。Redisは当然カウント機能をサポートしており、カウント性能も非常に優れており、カウンターシステムにとって重要な選択と言えます。

4.
ソーシャルネットワーキングサイトは通常比較的大規模にアクセスされ、従来のリレーショナルデータはこのタイプの保存Redisが提供するデータ構造は、これらの機能を比較的簡単に実装できます。

5.
メッセージキューイングシステムメッセージキューイングシステムは、ビジネスデカップリングや非リアルタイムビジネスXiaofengなどの機能を備えているため、大規模なWebサイトに不可欠な基本コンポーネントと言えます。Redisは、パブリッシュ/サブスクライブの機能とキューのブロック機能を提供します。プロフェッショナルメッセージキューと比較すると十分な機能はありませんが、基本的には一般的なメッセージキュー機能を満たすことができます。

1.3.2Redisでできないこと

実際、他のテクノロジーと同様に、各テクノロジーには独自のアプリケーションシナリオと境界があります。つまり、Redisは万能薬ではありません。解決するのに適した問題はたくさんありますが、そうでない問題もたくさんあります。解決する。

データスケールとデータの冷熱の観点から分析できます。データスケールの観点から、データは大規模データと小規模データに分けることができます。Redisデータはメモリに保存されていることがわかっています。たとえば、データ量が非常に多い場合、メモリは十分に安価になりました。 、毎日いくつのデータがありますか?Redisを使用して数十億のユーザー行動データを保存する場合、それは基本的に底なしの穴であり、経済的コストは非常に高くなります。ホットデータとコールドデータの観点から、データはホットデータとコールドデータに分けられます。ホットデータとは通常、頻繁な操作が必要なデータを指し、その逆も同様です。たとえば、ビデオWebサイトの場合、基本的なビデオ情報は基本的に各ビジネスラインで頻繁に操作されるデータであり、ユーザーの視聴記録は必ずしも頻繁にアクセスする必要のあるデータではありません。データスケールの違いについては説明しません。ホットデータとコールドデータの観点からは、ビデオ情報はホットデータであり、ユーザーの閲覧記録はコールドデータです。これらのコールドデータをRedisに配置すると、基本的にメモリの浪費になりますが、一部のホットデータの場合は、Redisに配置して読み取りと書き込みを高速化し、バックエンドストレージの負荷を軽減することもできます。 、これは半分の労力で2倍の結果と言えます。したがって、Redisは万能薬ではありません。Redisを徐々に学習することで、Redisの実際の使用シナリオを理解できるようになると思います。

1.4Redisをインストールしてデプロイする

wget http://download.redis.io/releases/redis-5.0.9.tar.gz
[root@redis-01 ~]# tar zxf redis-5.0.9.tar.gz -C /usr/local/src/
[root@redis-01 ~]# cd /usr/local/src/redis-5.0.9/
[root@redis-01 redis-5.0.9]# make 

// cp構成ファイルとコマンドをカスタムディレクトリに

[root@redis-01 ~]# mkdir /usr/local/redis/{conf,bin} -p
[root@redis-01 ~]# cp /usr/local/src/redis-5.0.9/src/redis* /usr/local/redis/bin/
[root@redis-01 ~]# cp /usr/local/src/redis-5.0.9/redis.conf /usr/local/redis/conf/

//冗長なコマンドを削除します

[root@redis-01 ~]# cd /usr/local/redis/bin/
[root@redis-01 bin]# ls
redisassert.h      redis-check-aof    redis-check-rdb.c  redis-cli.o     redis-trib.rb
redis-benchmark    redis-check-aof.c  redis-check-rdb.o  redismodule.h
redis-benchmark.c  redis-check-aof.o  redis-cli          redis-sentinel
redis-benchmark.o  redis-check-rdb    redis-cli.c        redis-server
[root@redis-01 bin]# rm -rf *.o
[root@redis-01 bin]# rm -rf *.c
[root@redis-01 bin]# ls
redisassert.h    redis-check-aof  redis-cli      redis-sentinel  redis-trib.rb
redis-benchmark  redis-check-rdb  redismodule.h  redis-server

コマンドは次の場所にあります:/ usr / local / redis / bin /
構成ファイルは次の場所にあります:/ usr / local / redis / conf /

構成ファイルの変更

[root@redis-01 bin]# mkdir /data/redis -p
[root@redis-01 bin]# vim /usr/local/redis/conf/redis.conf 
.....
bind 127.0.0.1 192.168.1.40 
daemonize yes
pidfile /data/redis/redis.pid 
logfile "/data/redis/redis.log" 
dir /data/redis

pidは次の場所に配置されます:/data/redis/redis.pid
ログは次の場所に配置されます: "/ data / redis / redis.log" dir / data / redis

設定ファイルの重要なオプションは次のように説明されています

Prot:ポート
ログファイル:ログファイル
ログレベルverbose:ログレベル:debug \ verbose \
notify \ warningログ出力方法logfilestdoutRdbcomperssion yes:cpuを保存するためにローカルデータベースにデータを保存するかどうかを指定しますが、データベースファイルは巨大ですDbfilename
dump.rdb:指定ローカルデータベースのファイル名のデフォルトはdump.rdb
Slaveof:このマシンはマスターとスレーブのスレーブであり、マスターサーバーのIPとポートを設定し、データをマスターと同期します。パスワード保護、スレーブサーバーはマスターパスワードに接続できますRequirepass
foob​​ared:同時接続の数、同時にクライアント接続の最大数、0は制限
なしを意味しますMaxmemory:各更新操作がログに記録されることを指定します。デフォルトはNO
Appendfilename appendonly.aof:更新ログのファイル名を指定しますEverysecは1秒に1回同期します(デフォルト値、速度侵害)いいえ:システムはデータキャッシュをディスクに同期します(noメソッドは高速です)常に各更新操作の後、手動でfsyncを呼び出して、データをディスクに書き込みます(非常に低速ですが、安全です)
Vm-enabled no:仮想メモリメカニズムを有効にするかどうか(デフォルトはno)
Vmswap-file /path/redis.swap:仮想メモリファイルパス
Vm-max -memeory 0:仮想メモリへの次の数より大きい
Glueoutputbuf yes :(パイプラインをオンにする)小さいパッケージを1つのパッケージにマージし、クライアントに応答するときにDirを送信するかどうかを設定します。作業ディレクトリBind-バインドされたホストアドレスプロテクトモードはい。保護モジュールはデフォルトでオンになっています。タイムアウト0切断される秒数。0デフォルトtcp-keepalive300をオフにします。tcp接続タイムアウト時間は300秒です。daemonizenoデーモンとしてredisを開始するかどうか。デフォルトNOデータベース16データベース番号は0〜16まで設定できます。自分自身always-show-logoはいデフォルトはオンになってロゴを表示します保存9001900秒はい1変更保存保存30010300秒で保存された変更601000060秒保存された1W変更

redis -h host -pportはredisにインタラクティブに接続します

[root@redis-01 bin]# ln -s /usr/local/redis/bin/* /usr/sbin/
[root@redis-01 bin]# redis-server /usr/local/redis/conf/redis.conf 
[root@redis-01 bin]# netstat -anput | grep redis
tcp        0      0 192.168.1.71:6379       0.0.0.0:*               LISTEN      6265/redis-server 1 
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      6265/redis-server 1 
[root@redis-01 ~]# redis-cli -h 192.168.1.71 -p 6379
192.168.1.71:6379> SHUTDOWN

この時点でログを確認し、いくつかの問題を見つけたので、最適化する必要があります
。//View/data/redis/redis.logは次のように最適化する必要があります。合計4つの項目を最適化する必要があります。

【第一条】6265:M 18 Mar 2021 15:08:41.324 * Increased maximum number of open files to 10032 (it was originally set to 1024).
【第二条】6265:M 18 Mar 2021 15:08:41.326 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
【第三条】6265:M 18 Mar 2021 15:08:41.326 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
【第四条】6265:M 18 Mar 2021 15:08:41.326 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.                                           

最初の最適化

[root@redis-01 ~]# ulimit -n
1024
[root@redis-01 ~]# vim /etc/security/limits.conf 
....
* 		-		 nofile	 	10032

//別の端末に切り替えます

[root@redis-01 ~]# ulimit -n
10032

2番目を最適化する

[root@redis-01 ~]# echo "511" > /proc/sys/net/core/somaxconn
[root@redis-01 ~]# vim /etc/sysctl.conf 
....
net.core.somaxconn = 511
[root@redis-01 ~]# sysctl -p
net.core.somaxconn = 511

3番目を最適化する

[root@redis-01 ~]# vim /etc/sysctl.conf 
[root@redis-01 ~]# systemctl -p
.....
vm.overcommit_memory = 1
[root@redis-01 ~]# sysctl -p
vm.overcommit_memory = 1
net.core.somaxconn = 511

第4条を最適化する

[root@redis-01 ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@redis-01 ~]# vim /etc/rc.local 
......
echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@redis-01 ~]# chmod +x /etc/rc.local 

redisを再起動します

[root@redis-01 ~]#  > /data/redis/redis.log  #清空日志文件方便查看
[root@redis-01 ~]# kill -9 `cat /data/redis/redis.pid `
[root@redis-01 ~]# redis-server  /usr/local/redis/conf/redis.conf 

ログを確認すると、警告メッセージがないことがわかります

[root@redis-01 ~]# cat  /data/redis/redis.log 
.....此处省略日志信息

おすすめ

転載: blog.csdn.net/weixin_45310323/article/details/114976888