天天看點

redis環境搭建,單機,主從,哨兵,叢集

一、環境準備

準備三台虛拟機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,不然會編譯失敗

redis環境搭建,單機,主從,哨兵,叢集

2.3.1 gcc -v   檢視版本,centos7預設4.8.5

redis環境搭建,單機,主從,哨兵,叢集

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 如下圖

redis環境搭建,單機,主從,哨兵,叢集

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' ;) 則安裝成功

redis環境搭建,單機,主從,哨兵,叢集

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設定了隻讀權限,是以無法寫入。

redis環境搭建,單機,主從,哨兵,叢集

info replication          檢視主從服務狀态

redis環境搭建,單機,主從,哨兵,叢集

四、哨兵模式

哨兵其實是對三中主從配置的一種增強或者說是主從的高可用配置,主從模式中,當主服務挂了時需要人工修改配置設定新的主

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  啟動哨兵

檢視程序是否正常啟動

redis環境搭建,單機,主從,哨兵,叢集

使用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環境搭建,單機,主從,哨兵,叢集

登入redis檢視,發現103成為了master,隻有一個slave[102伺服器]

redis環境搭建,單機,主從,哨兵,叢集

重新開機101的redis,發現101成為了slave,如下圖[面試題:redis哨兵,master挂了後重新開機會不會還是master]

redis環境搭建,單機,主從,哨兵,叢集

檢視redis.conf 最後幾行,發現slaveof 192.168.42.101 6379變成replicaof 192.168.42.103 6379

redis環境搭建,單機,主從,哨兵,叢集

檢視sentinel.conf最後幾行

redis環境搭建,單機,主從,哨兵,叢集

五、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  有密碼叢集建構時會報錯,如下圖

redis環境搭建,單機,主從,哨兵,叢集

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:

redis環境搭建,單機,主從,哨兵,叢集

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]

redis環境搭建,單機,主從,哨兵,叢集

5.2.3 檢測叢集 redis-cli --cluster check 192.168.42.101:6380

redis環境搭建,單機,主從,哨兵,叢集

5.2.4 檢視叢集 cluster nodes

redis環境搭建,單機,主從,哨兵,叢集

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模式]

redis環境搭建,單機,主從,哨兵,叢集

5.4 新增節點

5.4.1 準備兩個新的redis服務節點

cp redis6380.conf

在101伺服器 複制兩份配置檔案重命名為redis6390.conf/redis6391.conf

/6380   将端口相關修改成新的端口

分别啟動兩個服務,檢視程序如下

redis環境搭建,單機,主從,哨兵,叢集

5.4.2 新增主節點

和任意一個已存在的節點握手綁定

redis環境搭建,單機,主從,哨兵,叢集

5.4.3新增從節點

redis-cli --cluster add-node 192.168.42.101:6391 192.168.42.101:6390 --cluster-slave --cluster-master-id

redis環境搭建,單機,主從,哨兵,叢集

檢視節點狀态,我們看到新的master節點是沒有被配置設定槽的

redis環境搭建,單機,主從,哨兵,叢集

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數量

再次檢視節點狀态

redis環境搭建,單機,主從,哨兵,叢集

5.5 移除節點

5.5.1 移除從節點

redis-cli --cluster del-node 192.168.42.101:6391 39bd88efc63bb0c56a733ef40d763b1ae84f76b7

redis環境搭建,單機,主從,哨兵,叢集

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

再次檢視節點狀态

redis環境搭建,單機,主從,哨兵,叢集

5.6 叢集其他指令

redis-cli --cluster help

redis環境搭建,單機,主從,哨兵,叢集

最後記得給叢集服務添加密碼

繼續閱讀