新しい Sentinel-26379.conf ファイルを作成します
新しい Sentinel-26380.conf ファイルを作成します
新しい Sentinel-26381.conf ファイルを作成します
Sentinel ノードを起動するには 2 つの方法があります
Redis Cluster_Sentryの動作原理を詳しく解説
kill コマンドを使用してマスター ノードを強制終了します。
Redis Clusterの原理分析_Cluster Mode
Redis クラスター_Java 操作 Redis クラスター
Redis Cluster_Sentinel監視環境構築
新しい Sentinel-26379.conf ファイルを作成します
#端口
port 26379
#守护进程运行
daemonize yes
#日志文件
logfile "26379.log"
sentinel monitor mymaster 192.168.92.128 6379 2
新しい Sentinel-26380.conf ファイルを作成します
#端口
port 26380
#守护进程运行
daemonize yes
#日志文件
logfile "26380.log"
sentinel monitor mymaster 192.168.66.100 6379 2
新しい Sentinel-26381.conf ファイルを作成します
#端口
port 26381
#守护进程运行
daemonize yes
#日志文件
logfile "26381.log"
sentinel monitor mymaster 192.168.66.100 6379 2
Sentinel ノードを起動するには 2 つの方法があります
redis-sentinel sentinel-26379.conf
センチネルノードのステータスを表示する
[root@localhost src]# ./redis-cli -p 26379
127.0.0.1:26379>
127.0.0.1:26379>
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.66.100:6379,slaves=2,sentinels=3
Redis Cluster_Sentryの動作原理を詳しく解説
監視段階
通知フェーズ
Sentinel は、情報を収集するためにマスターとスレーブへの通知を継続的に開始します。
フェイルオーバーフェーズ
通知フェーズでは、センチネルによって送信された通知がマスターから応答を受け取らなかった場合、マスターを SRI_S_DOWN としてマークし、マスターのステータスを各センチネルに送信します。他のセンチネルがマスターが電話を切ったということを聞くと、信じられないと言うので、行って見て送信します 結果は各センチネルで共有され、センチネルの半数がマスターがダウンしていると判断すると、マスターを SRI_0_DOWN としてマークします。
投票方法
方法:選挙通知を最初に受け取った番兵に投票します。
一部のケースを除きます。
1.オフライン
2. 応答が遅い
3. オリジナルマスターから長時間切断された場合
4. 優先原則
1. Redis センチネル モードは、Redis の ___ アーキテクチャの 1 つの方法です。高可用性
Redis クラスター_フェイルオーバー
概要
マスター ノードに障害が発生した場合の Sentinel の監視機能と自動フェイルオーバー機能を示します。
デモフェイルオーバー
kill コマンドを使用してマスター ノードを強制終了します。
ps aux |grep redis
kill -9 pid
センチネルノード情報の表示
Sentinel ノードで info Sentinel コマンドを使用すると、すぐに表示されます。
[root@localhost src]# ./redis-cli -p 26379
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6381,slaves=5,sentinels=3
注:マスター ノードが切り替えられていないことがわかります。センチネルはマスター ノードに障害が発生したことを検出して転送するため、しばらく時間がかかります。
6379 ノードを再起動します
[root@localhost src]# ./redis-cli info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:down
設定ファイルは上書きされます
フェールオーバー フェーズ中に、センチネル ノードとマスター/スレーブ ノードの両方の構成ファイルが書き換えられます。
include /usr/local/redis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
# Generated by CONFIG REWRITE
daemonize yes
protected-mode no
appendonly yes
slowlog-max-len 1200
slowlog-log-slower-than 1000
save 5 1
user default on nopass ~* &* +@all
dir "/usr/local/redis"
replicaof 127.0.0.1 6381
Redis クラスターの概要_クラスターモード
Redis には 3 つのクラスター モードがあります
セントリーモードのデメリット
クラスターモードの概要
Redis クラスターは、複数のマスター/スレーブ ノード グループで構成される分散サービス クラスターであり、レプリケーション、高可用性、フラグメンテーションの特性を備えています。
Redis クラスターの利点
1. Redis クラスターは、__ ノード グループで構成される分散サービス クラスターです。複数のマスターとスレーブ
2. Redis センチネル モードの欠点は ____ です。センチネル選挙期間中は外部サービスを提供できません
Redisクラスタ_クラスタモード構築
Redis クラスターの構築には、少なくとも 3 つのマスター ノードが必要です。ここでは、それぞれにスレーブ ノードが接続された 3 つのマスター ノードを構築し、合計 6 つの Redis ノードを構築します。
環境整備
最初のマシン: 192.168.66.101 ポート 8001 ポート 8002
2 台目のマシン: 192.168.66.102 ポート 8001 ポート 8002
3 番目のマシン: 192.168.66.103 ポート 8001 ポート 8002
フォルダーを作る
mkdir -p /usr/local/redis/redis-cluster/8001 /usr/local/redis/redis-cluster/8002
設定ファイルをコピーする
redis インストール ディレクトリの redis.conf ファイルをそれぞれ 8001 ディレクトリにコピーします。
cp /usr/local/redis/redis.conf /usr/local/redis/redis-cluster/8001
redis.conf ファイルの次の内容を変更します。
port 8001
daemonize yes
pidfile "/var/run/redis_8001.pid"
#指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据
dir /usr/local/redis/redis-cluster/8001/
#启动集群模式
cluster-enabled yes
#集群节点信息文件,这里800x最好和port对应上
cluster-config-file nodes-8001.conf
# 节点离线的超时时间
cluster-node-timeout 5000
#去掉bind绑定访问ip信息
#bind 127.0.0.1
#关闭保护模式
protected-mode no
#启动AOF文件
appendonly yes
#如果要设置密码需要增加如下配置:
#设置redis访问密码
#requirepass xiaoton
#设置集群节点间访问密码,跟上面一致
#masterauth xiaoton
ファイルを 8002 フォルダーにコピーします
#将8001修改为8002:
cp /usr/local/redis/redis-cluster/8001/redis.conf /usr/local/redis/rediscluster/8002
# 批量修改字符串
:%s/8001/8002/g
ローカル マシン上のファイルを他の 2 台のマシンにコピーします。
# 第二台机器
scp /usr1/redis/redis-cluster/8001/redis.conf
[email protected]:/usr1/redis/redis-cluster/8001/
scp /usr1/redis/redis-cluster/8002/redis.conf
[email protected]:/usr1/redis/redis-cluster/8002/
# 第三台机器
scp /usr1/redis/redis-cluster/8001/redis.conf
[email protected]:/usr1/redis/redis-cluster/8001/
scp /usr1/redis/redis-cluster/8002/redis.conf
[email protected]:/usr1/redis/redis-cluster/8002/
これら 6 つの Redis インスタンスを個別に起動します
/usr/local/redis/src/redis-server /usr/local/redis/redis-cluster/8001/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis-cluster/8002/redis.conf
起動が成功したかどうかを確認する
ps -ef |grep redis
redis-cli を使用して Redis クラスター全体を作成する
/usr/local/redis/src/redis-cli -a redis-pw --cluster create --cluster-replicas 1
192.168.66.101:8001 192.168.66.101:8002 192.168.66.102:8001 192.168.66.102:8002
192.168.66.103:8001 192.168.66.103:8002
ヘルプコマンドを表示
src/redis‐cli --cluster help
クラスターの検証
任意のクライアントに接続する
/usr/local/redisd/src/redis-cli -a redis-pw -c -h 192.168.66.101 -p 8001
クラスター情報の表示
cluster info
Redis Clusterの原理分析_Cluster Mode
Redis Cluster はすべてのデータを 16384 個のスロット (スロット) に分割し、各ノードがスロットの一部を担当します。スロット情報は各ノードに格納されます。マスター ノードのみにスロットが割り当てられ、スレーブ ノードにはスロットが割り当てられません。
HASH_SLOT = CRC16(key) % 16384
コマンドの実行
set k1 v1
{} を使用してグループの概念を定義すると、キー内の {} に同じ内容を持つキーと値のペアが同じスロットに配置されます。
mset k1{test} v1 k2{test} v2 k3{test} v3
回復
ビューノード
192.168.66.103:8001> cluster nodes
マスターノードを強制終了します
lsof -i:8001
kill -9 pid
ノード情報の監視
1. デフォルトでは、Redis Cluster モードは __ アルゴリズムを使用してキー値をハッシュして整数値を取得し、この整数値を使用してモジュロ 16384 を実行して特定のスロットを取得します。crc-16
Redis クラスター_Java 操作 Redis クラスター
Jedis が Redis を統合
ジェダイのMaven座標を紹介する
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
Javaで書かれたコード
public class JedisClusterTest {
public static void main(String[] args) throws IOException {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20);
config.setMaxIdle(10);
config.setMinIdle(5);
Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
jedisClusterNode.add(new HostAndPort("192.168.66.101", 8001));
jedisClusterNode.add(new HostAndPort("192.168.66.102", 8002));
jedisClusterNode.add(new HostAndPort("192.168.66.103", 8001));
JedisCluster jedisCluster = null;
try {
//connectionTimeout:指的是连接一个url的连接等待时间
//soTimeout:指的是连接上一个url,获取response的返回等待时间
jedisCluster = new JedisCluster(jedisClusterNode, 6000, 5000, 10, "redis-pw", config);
System.out.println(jedisCluster.set("name", "zhangsan"));
System.out.println(jedisCluster.get("name"));
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedisCluster != null) {
jedisCluster.close();
}
}
}
}
SpringBoot は Redis を統合します
Maven 座標の導入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐data‐redis</artifactId>
</dependency>
設定ファイル
##单服务器
spring.redis.cluster.nodes=192.168.159.129:7001,192.168.159.129:7002,192.168.159
.129:7003,192.168.159.129:7004,192.168.159.129:7005,192.168.159.129:7006
## 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=300
## Redis数据库索引(默认为0)
spring.redis.database=0
## 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
## 连接池中的最大空闲连接
spring.redis.pool.max-idle=100
## 连接池中的最小空闲连接
spring.redis.pool.min-idle=20
## 连接超时时间(毫秒)
spring.redis.timeout=60000
Javaコード
@RestController
public class TestController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@RequestMapping("/test_cluster")
public void testCluster() throws InterruptedException {
stringRedisTemplate.opsForValue().set("user:name", "xiaoton");
System.out.println(stringRedisTemplate.opsForValue().get("user:name"));
}
}