Redis単機構築主従(1)
20862 ワード
Redisスタンドアロンマスタースイッチ導入説明
準備作業 redis.ioダウンロード導入パッケージeg:redis-3.2.8.tar.gz 新規マスターディレクトリ は、それぞれ2つのディレクトリの下にredis をインストールする.==問題が発生する可能性があります:gccまたはtclコンポーネントが不足し、コマンド を使用します.
構成パラメータの変更
マスター_の変更redis構成
slave_の変更redis構成
redisがデーモン方式で実行する場合、システムはデフォルトでpidを/var/run/redisに書き込む.pid、pidfileでpidファイルを指定できます
起動master_redisとslave_redisとクライアント接続の使用
infoコマンドを使用してredisマスター情報を表示する master_redisクライアント接続の下で実行: slave_redisクライアント接続の下で実行:
テストマスターコピー、読み書き分離 master_redisクライアント接続の下で実行: master_redisクライアント接続で実行: slave_redisクライアント接続で実行: slave_redisクライアント接続の下で実行: マスター・スレーブ・スイッチの構成
準備するconfプロファイル
マスター・スレーブ・スイッチの構成 kill現在のすべてのredisプロセス を削除準備するsentinel.confは、削除するばかりの2つのconfファイルを置換する対応するディレクトリの下にそれぞれ配置される .再起動マスタスレーブredis 主従redisのsentinel(哨兵) を起動
クライアントを使用して哨兵監視状況を表示クライアントを使用して2つのsentinel に接続
試験主従自動切替(具体的な操作は上のコマンドを参照) kill落としmaster_redisサービス クライアントを使用してslave_に接続redis info replicationを使用してslave_を表示redis接続情報、発見、slave_redisはmasterにアップグレードされましたredis クライアントを使用してsentinelに再接続し、info sentinelコマンドを使用して2つの哨兵監視情報を表示すると、監視アドレスがaddress=IP:6380 になったことがわかります. killが落ちたmasterを再起動redisサービス、起動後のクライアント接続、info replicationコマンドを使用して表示すると、role:slave(再起動後に自動的にslave_redisになる) が表示されます.
Javaコード実装redis主従
準備作業
mkdir -p /usr/local/redis/master/
mkdir -p /usr/local/redis/slave/
tar –zxf redis-3.2.8.tar.gz
cd redis-3.2.8
make **# **
make test **# **
yum install gcc
またはyum install tcl
==構成パラメータの変更
マスター_の変更redis構成
cd /usr/local/redis/master/redis-3.2.8/
vi redis.conf
bind 127.0.0.1 ----> bind IP( )
daemonize no ----> daemonize yes( , , )
protected-mode yes ---> protected-mode no( , )
slave_の変更redis構成
cd /usr/local/redis/slave/redis-3.2.8/
vi redis.conf
bind 127.0.0.1 ----> bind IP( )
daemonize no ----> daemonize yes( , , )
protected-mode yes ---> protected-mode no( , )
port 6379 ---> port 6380( )
slaveof master_redis IP 6379
pidfile /var/run/redis_ 6379.pid ----> pidfile /var/run/redis_ 6380.pid
redisがデーモン方式で実行する場合、システムはデフォルトでpidを/var/run/redisに書き込む.pid、pidfileでpidファイルを指定できます
起動master_redisとslave_redisとクライアント接続の使用
cd /usr/local/redis/master/redis-3.2.8/src/
./redis-server /usr/local/redis/master/redis-3.2.8/redis.conf( )
./redis-cli -h IP -p 6379 ( master_redis)
cd /usr/local/redis/slave/redis-3.2.8/src/
./redis-server /usr/local/redis/slave/redis-3.2.8/redis.conf`( )
./redis-cli -h IP -p 6380` ( slave_redis)
infoコマンドを使用してredisマスター情報を表示する
172.20.1.47:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.20.1.47,port=6380,state=online,offset=38335325,lag=0
master_repl_offset:38335461
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:37286886
repl_backlog_histlen:1048576
172.20.1.47:6380> info replication
# Replicatio
role:slave
master_host:172.20.1.47
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:38343419
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
テストマスターコピー、読み書き分離
set name zhangsan
get name
結果:zhangsan get name
結果:zhangsan set name lisi
(error)READONLY You can`t write against a read only slave.(slave_redis読み取り専用)準備するconfプロファイル
# , , session
daemonize yes
# ,
protected-mode no
#sentinel 26379
port
# redis IP , slave
#sentinel monitor
# sentinel ip:port master,quorum , sentinel master ,master
sentinel monitor master1 IP 6379 1
#master sentinel “ ” .
#sentinel down-after-milliseconds
# sentinel master ( , ), , sentinel master
sentinel down-after-milliseconds master1 5000
# failover( ) , failover , sentinel failover
sentinel failover-timeout master1 15000
# master , slaveof master “SYNC”( ) slave 。( 1)
# salve salveof , 。 , “ ” .
# , “ ” , salve .
sentinel parallel-syncs master1 1
マスター・スレーブ・スイッチの構成
ps -ef | grep redis
kill -9 pid
rm -f /usr/local/redis/master/redis-3.2.8/sentinel.conf
rm -f /usr/local/redis/slave/redis-3.2.8/sentinel.conf
cd /usr/local/redis/slave/redis-3.2.8/
vi sentinel.conf port 26379 ---> port 26380
cd /usr/local/redis/master/redis-3.2.8/src/
./redis-server /usr/local/redis/master/redis-3.2.8/redis.conf
cd /usr/local/redis/slave/redis-3.2.8/src/
./redis-server /usr/local/redis/slave/redis-3.2.8/redis.conf
cd /usr/local/redis/master/redis-3.2.8/src/
./redis-sentinel /usr/local/redis/master/redis-3.2.8/sentinel.conf
cd /usr/local/redis/slave/redis-3.2.8/src/
./redis-sentinel /usr/local/redis/slave/redis-3.2.8/sentienl.conf
ps -ef | grep redis # (redis + )
クライアントを使用して哨兵監視状況を表示
cd /usr/local/redis/master/redis-3.2.8/src/
./redis-cli -h IP 26379
cd /usr/local/redis/slave/redis-3.2.8/src/
./redis-cli -h IP 26380
`info sentinel ` , name=master1,status=ok,address=IP:6379( master_redis)
試験主従自動切替(具体的な操作は上のコマンドを参照)
Javaコード実装redis主従
public class JedisUtil {
private final static String REDIS_HOST = "172.20.1.47";
private final static Integer REDIS_PORT = 6379;
private final static Integer REDIS_MaxActive = 200;
private final static Integer REDIS_MaxIdle = 1000;
private final static Integer REDIS_MaxWait = 512;
private final static Integer REDIS_ConnTimeout = 2000;
private final static Integer REDIS_RetryNum = 3;
private final static String SENTINEL_HOST_1 = "172.20.1.47:26381";
private final static String SENTINEL_HOST_2 = "172.20.1.47:26380";
private final static String CLUSTER_NAME = "master1";
/**
* .
*/
private JedisUtil() {
}
private static Map maps = new HashMap();
/**
* .
*
* @return
*/
private static JedisSentinelPool getPool() {
String key = REDIS_HOST + ":" + REDIS_PORT;
Set sentinels = new HashSet();
String hostAndPort1 = SENTINEL_HOST_1;
String hostAndPort2 = SENTINEL_HOST_2;
sentinels.add(hostAndPort1);
sentinels.add(hostAndPort2);
String clusterName = CLUSTER_NAME;
JedisSentinelPool redisSentinelJedisPool = null;
if (!maps.containsKey(key)) {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(REDIS_MaxActive);
config.setMaxIdle(REDIS_MaxIdle);
config.setMaxWaitMillis(REDIS_MaxWait);
config.setTestOnBorrow(true);
config.setTestOnReturn(true);
try {
/**
* java.net.SocketTimeoutException: Read timed out exception JedisPool . JedisPool 2 ( )
*/
redisSentinelJedisPool = new JedisSentinelPool(clusterName, sentinels, config, REDIS_ConnTimeout);
maps.put(key, redisSentinelJedisPool);
} catch (Exception e) {
e.printStackTrace();
}
} else {
redisSentinelJedisPool = maps.get(key);
}
return redisSentinelJedisPool;
}
/**
* , , , , 。
*/
private static class RedisUtilHolder {
/**
* , JVM
*/
private static JedisUtil instance = new JedisUtil();
}
/**
* getInstance , RedisUtilHolder.instance, RedisUtilHolder ; ,
* , RedisUtil , , , 。 ,getInstance , , 。
*/
public static JedisUtil getInstance() {
return RedisUtilHolder.instance;
}
/**
* Redis .
*
* @return Redis
*/
public Jedis getJedis() {
Jedis jedis = null;
int count = 0;
do {
try {
jedis = getPool().getResource();
} catch (Exception e) {
e.printStackTrace();
//
if (jedis != null) {
jedis.close();
}
}
count++;
} while (jedis == null && count < REDIS_RetryNum);
return jedis;
}
/**
* redis .
*
* @param jedis redis
*/
public void closeJedis(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
}