一、環境準備
準備三台虛拟機centOS7伺服器,redis安裝包redis-6.0.3.tar.gz,java開發環境[用于測試]
我的三台伺服器ip位址192.168.42.101;192.168.42.102;192.168.42.103
二、單機安裝
2.1 前置安裝檢查
yum -y install cpp gcc make binutils glibc-kernheaders glibc-common glibc-devel
2.2 安裝包下載下傳
wget http://download.redis.io/releases/redis-6.0.3.tar.gz
2.3 本機編譯環境準備
安裝新版本redis,需要更新到gcc9,不然會編譯失敗
2.3.1 gcc -v 檢視版本,centos7預設4.8.5
2.3.2 安裝scl和gcc編譯環境
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash 臨時啟用gcc9編譯
若永久修改則需要修改環境變量:echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
再次gcc -v 如下圖
2.4 redis安裝
tar -vxzf redis-6.0.3.tar.gz 解壓
mv redis-6.0.3 redis 重命名檔案夾
mv redis-6.0.3.tar.gz redis 将壓縮包移入redis安裝包,備用
cd redis 進入檔案夾
make && make install 編譯安裝
如下圖,顯示Hint: It's a good idea to run 'make test' ;) 則安裝成功
2.5 配置檔案修改
vim redis.conf 使用vim工具編輯配置檔案
/protected 找到protected-mode 修改為no,注釋掉上面的bind127.0.0.1
requirepass 1234 如需添加密碼 找到requirepass foobared,在下面設定密碼,如1234
2.6 登入
redis-server redis.conf & 啟動redis服務
redis-cli -h 192.168.42.101 -p 6379 -a 1234[密碼] 啟動redis用戶端
三、主從搭建
主從場景一般分為一主一從、一主多從和樹狀主從,本文設定為一主兩從,101master,102和103為slave
在102和103兩個伺服器上完成單機步驟的搭建,設定密碼為1234
三台伺服器的redis.conf最後加上如下三行配置,主服務注釋掉第一行。中文為該配置解釋,需要删除或者放到下一行
slaveof 192.168.42.101 6379 #本機作為從節點,指定連接配接的主節點位址
slave-read-only yes #從節點設定隻讀[可選]
masterauth 1234 #連接配接主節點的密碼
分别啟動三台服務,如圖,101服務設定的值可以被102服務讀取。102服務redis設定了隻讀權限,是以無法寫入。
info replication 檢視主從服務狀态
四、哨兵模式
哨兵其實是對三中主從配置的一種增強或者說是主從的高可用配置,主從模式中,當主服務挂了時需要人工修改配置設定新的主
4.1 哨兵模式配置運作
基于主從的配置修改
vim sentinel.conf 修改哨兵配置檔案
/sentinel monitor mymaster 127.0.0.1 6379 2 #找到該行預設配置并注釋,在下面添加兩行自定義配置如下:
192.168.42.101 6379 2代表初始化時master服務的位址,後面的2代表有兩個哨兵确認master當機才客觀下線,進行故障轉移
mymaster 1234代表連接配接master的密碼
#sentinel monitor mymaster 127.0.0.1 6379 2
sentinel monitor mymaster 192.168.42.101 6379 2
sentinel auth-pass mymaster 1234
redis-sentinel sentinel.conf 啟動哨兵
檢視程序是否正常啟動
使用java代碼測試連接配接
//建立一個java項目,引入jedis
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
//測試代碼如下
public class JedisSentinel {
@Test
public void testJedis() {
Set<String> sentinels = new HashSet<String>();
String hostAndPort1 = "192.168.42.101:26379";
String hostAndPort2 = "192.168.42.102:26379";
String hostAndPort3 = "192.168.42.103:26379";
String clusterName = "mymaster";
String password = "1234";
sentinels.add(hostAndPort1);
sentinels.add(hostAndPort2);
sentinels.add(hostAndPort3);
JedisSentinelPool redisSentinelJedisPool = new JedisSentinelPool(clusterName, sentinels, password);
try {
Jedis jedis = redisSentinelJedisPool.getResource();
jedis.set("name", "cheng11111");
System.out.println(jedis.get("name"));
} catch (Exception e) {
e.printStackTrace();
}
redisSentinelJedisPool.close();
}
}
4.2 哨兵模式 master崩潰模拟
kill掉master程序[101],哨兵會自行選舉出新的主
登入redis檢視,發現103成為了master,隻有一個slave[102伺服器]
重新開機101的redis,發現101成為了slave,如下圖[面試題:redis哨兵,master挂了後重新開機會不會還是master]
檢視redis.conf 最後幾行,發現slaveof 192.168.42.101 6379變成replicaof 192.168.42.103 6379
檢視sentinel.conf最後幾行
五、RedisCluster叢集
叢集搭建是差別于哨兵的另外一種高可用模式。哨兵模式下每個節點都是全量存儲資料,當資料量足夠大時,我們需要通過擴充伺服器來實作擴容,即a、b、c三份資料存在三台不同的伺服器上。叢集主要作用就是分離資料
5.1 配置檔案準備
準備單機的配置檔案6份(101/102/103每台服務配置檔案各複制兩份,端口分别為6380 6381)
cp redis.conf redis6380.conf
vim redis6380.conf
5.1.1 / bgsave_cpulist 定位到文檔最後,删除後面的幾行配置,這是哨兵自動添加關于主從的配置。slaveof/masterauth/replicaof/user default
或者重新解壓redis使用全新新配置檔案,配置同單機。修改protected-mode=no,注釋掉上面的bind127.0.0.1
5.1.2 注釋掉 requirepass 有密碼叢集建構時會報錯,如下圖
5.1.3 /cluster-enabled yes 打開該行注釋,否則redis将以非cluster模式啟動,無法建構redisCluster叢集
5.1.4 / 6379 相關端口改成目前配置檔案的端口,端口/cluster配置檔案/pid檔案 也可以根據名字直接搜尋如下:
[port][cluster-config-file nodes-6379.conf] [pidfile "/var/run/redis_6379.pid"]
分别啟動6個redis服務,檢視啟動狀态如下圖 cluster:
5.2 叢集建構
5.2.1 清空資料
如果redis存在資料使用flushall 清空redis的資料[生産環境禁用],可以删除本目錄的rdb/aof檔案再啟動,不然會自動加載
5.2.2 建構叢集 redis-cli --cluster create 192.168.42.101:6380 192.168.42.102:6380 192.168.42.103:6380 192.168.42.101:6381 192.168.42.102:6381 192.168.42.103:6381 --cluster-replicas 1
和老版的redis指令使用方式相似,不過不需要使用ruby,新版的redis使用c語言重寫了,整合在redis-cli --cluster 指令裡。
redis-cli --cluster create ... --cluster-replicas 1 [1代表一個從,上述語句為三主三從,6380為主,6381為從。
此處為模拟,生産環境每一個端口都應該是一個獨立的伺服器],如下界面代表叢集建構成功[注意!!!16384slots]
5.2.3 檢測叢集 redis-cli --cluster check 192.168.42.101:6380
5.2.4 檢視叢集 cluster nodes
5.3 代碼測試
5.3.1 建構項目,使用如下代碼
@Test
public void testBasic() throws IOException{
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
jedisClusterNodes.add(new HostAndPort("192.168.42.101", 6380));
jedisClusterNodes.add(new HostAndPort("192.168.42.102", 6380));
jedisClusterNodes.add(new HostAndPort("192.168.42.103", 6380));
jedisClusterNodes.add(new HostAndPort("192.168.42.101", 6381));
jedisClusterNodes.add(new HostAndPort("192.168.42.102", 6381));
jedisClusterNodes.add(new HostAndPort("192.168.42.103", 6381));
JedisCluster jc = new JedisCluster(jedisClusterNodes);
jc.set("cheng", "long");
System.out.println("set successful!!");
String value = jc.get("cheng");
System.out.println(value);
jc.close();
}
5.3.2 登入叢集檢視結果
redis-cli -h 192.168.42.101 -p 6380 -c [注意結尾-c,代表cluster模式]
5.4 新增節點
5.4.1 準備兩個新的redis服務節點
cp redis6380.conf
在101伺服器 複制兩份配置檔案重命名為redis6390.conf/redis6391.conf
/6380 将端口相關修改成新的端口
分别啟動兩個服務,檢視程序如下
5.4.2 新增主節點
和任意一個已存在的節點握手綁定
5.4.3新增從節點
redis-cli --cluster add-node 192.168.42.101:6391 192.168.42.101:6390 --cluster-slave --cluster-master-id
檢視節點狀态,我們看到新的master節點是沒有被配置設定槽的
5.4.4 配置設定hash槽
redis-cli --cluster reshard 192.168.42.101:6390 --cluster-from 011cfa64cb93525e4cac5b3ca85267b807e762d2,5300228cd8579f75d4b070a7a93f678664f53604,1a2dd68db514855d452f7afc10cd770683cb35f8 --cluster-to 0f77668c52045eb887433a0a7ee4b8981748f7ed --cluster-slots 4096 --cluster-yes
--cluster-from:表示目前擁有slot的節點id,多個ID用逗号分隔
--cluster-to:待配置設定節點的id
--cluster-slots:配置設定的slot數量
再次檢視節點狀态
5.5 移除節點
5.5.1 移除從節點
redis-cli --cluster del-node 192.168.42.101:6391 39bd88efc63bb0c56a733ef40d763b1ae84f76b7
5.5.2 移除主節點 hash槽
redis-cli --cluster reshard 192.168.42.101:6390 --cluster-from 0f77668c52045eb887433a0a7ee4b8981748f7ed --cluster-to 011cfa64cb93525e4cac5b3ca85267b807e762d2 --cluster-slots 4096 --cluster-yes
接受配置設定的id隻能是一個,多個會報不存在該id或者該id不是master的錯誤
5.5.3 删除主節點
redis-cli --cluster del-node 192.168.42.101:6390 0f77668c52045eb887433a0a7ee4b8981748f7ed
再次檢視節點狀态
5.6 叢集其他指令
redis-cli --cluster help
最後記得給叢集服務添加密碼