redis主從叢集搭建
redis作為目前炙手可熱的NOSQL系統,本身就支援主從叢集,下面我們就來動手搭建一個一主兩從的redis叢集。
一、安裝操作
1、環境準備
這裡使用三台伺服器,按照1主2從3哨兵配置,每台伺服器上開啟一個redis-server和redis-sentinel哨兵服務,redis-server端口為8000,redis-sentinel的端口為6800,端口也可以使用預設端口,一般線上環境會修改。
redis-server說明
192.168.68.110:8000 主
192.168.68.111:8000 從
192.168.68.112:8000 從
redis-sentinel 哨兵說明
192.168.68.110:6800
192.168.68.111:6800
192.168.68.112:6800
2、搭建redis系統
1 檢查是否安裝了 gcc環境,如果沒有請安裝,否則後面會出現編譯錯誤,gcc: Command not found**
yum list installed | grep gcc #檢視是否安裝
yum install gcc #安裝
2 下載下傳redis,并編譯
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
tar xzf redis-4.0.9.tar.gz
cd redis-4.0.9
make
如果編譯失敗,重新編譯:
make MALLOC=libc
3 修改配置檔案redis.conf
cd /usr/local/redis
vi redis.conf
主節點192.168.68.110上的配置
port 8000
daemonize yes
bind 192.168.68.110 #如果要開放連接配接的話 則可以修改為0.0.0.0
requirepass 123456 #如果需要密碼可以設定 不需要可以不設定
pidfile /var/run/redis-8000.pid
logfile /var/log/redis/redis-8000.log
從節點192.168.68.111,192.168.68.112上的配置
port 8000
daemonize yes
bind 192.168.68.111 #192.168.68.112 #如果要開放連接配接的話 則可以修改為0.0.0.0
requirepass 123456 #如果需要密碼可以設定 不需要可以不設定
masterauth 123456 #這是主節點的密碼 如果master 設定了密碼 這裡必須設定
pidfile /var/run/redis-8000.pid
logfile /var/log/redis/redis-8000.log
slaveof 192.168.68.110 8000 #這是主節點的ip 和端口 注意中間沒有冒号
4 啟動三台機器上的redis
./src/redis-server ./redis.conf
#啟動redis
三個redis服務啟動完畢後,進入指令行,執行info replication檢視目前主從配置
master 節點顯示

slave 節點顯示
如果如上圖所示沒有發現從節點,很有可能是防火牆沒有開放8000端口導緻主從節點之間沒法通信
執行以下指令 将端口加入白名單 或者關閉防火牆
firewall-cmd --zone=public --add-port=8000/tcp --permanent
firewall-cmd --zone=public --add-port=6800/tcp --permanent
firewall-cmd --reload
3、搭建redis-sentinel系統
vi /usr/local/redis/sentinel.conf
修改下面的配置 3台機器的哨兵都需要修改這個配置
protected-mode no
daemonize yes #背景啟動
port 6800 #端口号
#master 節點的位址和端口 2 代表法定人數 即需要2個哨兵報告的情況下才會自動故障轉移
sentinel monitor mymaster 192.168.68.110 8000 2
sentinel auth-pass mymaster 123456//如果主節點設定了密碼這裡必須設定 如果沒有設定密碼 本行可以忽略
#5秒内master6800沒有響應,就認為SDOWN
sentinel down-after-milliseconds mymaster 5000
# 故障切換逾時時間
sentinel failover-timeout mymaster 15000
logfile /var/log/redis/sentinel.log
pidfile /var/run/sentinel.pid
啟動redis-sentinel 哨兵
./src/redis-sentinel ./sentinel.conf
二、測試
1、主從複制測試
主節點添加資料
從節點擷取資料
2、故障轉移測試
停掉主節點
檢視redis叢集資訊
從節點192.168.68.112更新為主節點
三、springboot配置
1.添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、配置redis連接配接資訊
spring:
redis:
database: 2
# host: 192.168.1.61
# port: 6379
pool:
# 連接配接池最大連接配接數(使用負值表示沒有限制)
max-active: 20
# 連接配接池中的最大空閑連接配接
max-idle: 8
# 連接配接池中的最小空閑連接配接
min-idle: 0
# 連接配接池最大阻塞等待時間(使用負值表示沒有限制)
max-wait: -1
# 連接配接逾時時間(毫秒)
timeout: 3000
sentinel:
master: mymaster
nodes: 192.168.1.107:26379,192.168.1.107:26380,192.168.1.108:26379
3、自定義redis配置檔案
Configuration
public class RedisConfig {
/**
* @param redisConnectionFactory redis連接配接工廠
*/
@Bean
public RedisTemplate<String, Object> buildRedisConn(RedisConnectionFactory redisConnectionFactory) {
Objects.requireNonNull(redisConnectionFactory);
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(jsonSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(jsonSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
4、添加redis操作服務類即可操作
@Component
public class RedisService {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
private static final String PREFIX = "api:";
// =============================common============================
/**
* 指定緩存失效時間
*
* @param key 鍵
* @param time 時間(秒)
* @return
*/
public boolean expire(String key, long time) {
try {
if (time > 0) {
redisTemplate.expire(PREFIX + key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
.
.
.
}