Linux Redis 主從復制,Redis slaveof replicaof主從復制,redis-sentinel哨兵
================================
©Copyright 蕃薯耀 2020-12-18
https://www.cnblogs.com/fanshuyao/
基於redis-5.0.10.tar.gz
一、Redis主從復制配置,從機配置
進行redis配置文件的目錄,在redis.conf加入下面的配置(replicaof <masterip> <masterport>)
vim redis.conf
replicaof 192.168.170.11 6379
從機只讀模式默認是開啟的:
replica-read-only yes
或者(不打開配置文件,直接加到文件中):
echo "replicaof 192.168.170.11 6379" >> redis.conf
說明一下,replicaof是新版本的命令,舊版本是slaveof命令
(舊版本)使用slaveof命令:
slaveof 192.168.170.11 6379 slave-read-only yes
或者直接追加到配置文件
echo "slaveof 192.168.170.11 6379" >> redis.conf echo "slave-read-only yes" >> redis.conf
二、查看redis主從配置
主機查看主從信息(先運行redis-cli)
127.0.0.1:6379> info replication
或者直接(不需要運行redis-cli):
/java/redis5/bin/redis-cli info replication
顯示的內容是:
# Replication role:master connected_slaves:2 slave0:ip=192.168.170.129,port=6379,state=online,offset=1207,lag=0 slave1:ip=192.168.170.130,port=6379,state=online,offset=1207,lag=0 master_replid:498a75a7d0eeacef2b29664a4f1c848be4882460 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:1207 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:1207
role:master,表示是主機
從機查看主從信息(開啟了redis-cli):
info replication
或者(不需要運行redis-cli)
/java/redis5/bin/redis-cli info replication
顯示的內容:
127.0.0.1:6379> info replication # Replication role:slave master_host:192.168.170.11 master_port:6379 master_link_status:up
role:slave,表示從機
測試從機有沒有復制主機的值,建立主從關系后,從機自動會從主機復制所有數據:
/java/redis5/bin/redis-cli get b
顯示內容
[root@host_132 ~]# /java/redis5/bin/redis-cli get b "456"
測試在從機增加數據:
從機是只讀模式,是不能設置值的:
127.0.0.1:6379> set c 12345 (error) READONLY You can't write against a read only replica.
三、Redis sentinel哨兵模式
Sentinel(哨兵)是用於監控redis集群中Master狀態的工具,是Redis 的高可用性解決方案。
sentinel哨兵模式已經被集成在redis2.4之后的版本中。
sentinel是redis高可用的解決方案,sentinel系統可以監視一個或者多個redis master服務,以及這些master服務的所有從服務;
當某個master服務下線時,自動將該master下的某個從服務升級為master服務替代已下線的master服務繼續處理請求。
sentinel可以讓redis實現主從復制,當一個集群中的master失效之后,sentinel可以選舉出一個新的master用於自動接替master的工作,集群中的其他redis服務器自動指向新的master同步數據。
一般建議sentinel采取奇數台,防止某一台sentinel無法連接到master導致誤切換。其結構如下:
1、復制sentinel的配置文件sentinel.conf 到指定的目錄
cp /java/redis5/sentinel.conf /java/redis5/bin/
2、去掉配置文件的注釋和空行,生成新的配置文件
cd /java/redis5/bin/ cat sentinel.conf | grep -v "#" | grep -v "^$" > sentinel-26379.conf
3、修改配置文件sentinel-26379.conf
vim sentinel-26379.conf
修改內容:(這個文件夾要先建:/java/redis5/data/)
port 26379 daemonize yes pidfile /java/redis5/data/redis-sentinel-26379.pid logfile "redis-sentinel-26379.log" dir /java/redis5/data/
4、修改ip地址,將127.0.0.1修改成192.168.170.11,端口如果是默認的,不需要修改,后面那個2表示2個redis-sentinel檢查到master出問題后進入換master的方案。
sentinel monitor mymaster 192.168.170.11 6379 2
5、啟動sentinel
/java/redis5/bin/redis-sentinel /java/redis5/bin/sentinel-26379.conf
6、查看進程:
ps -ef | grep redis-sentinel
[root@host_132 bin]# ps -ef | grep redis-sentinel root 4303 1 0 09:32 ? 00:00:00 /java/redis5/bin/redis-sentinel *:26379 [sentinel] root 4311 1396 0 09:32 pts/0 00:00:00 grep --color=auto redis-sentinel
四、設置redis-sentinel開機啟動
1、創建服務文件(此方式為centos7的方式),文件原來是沒有的。
vi /etc/systemd/system/redis-sentinel.service
開機啟動文件內容:
[Unit] #Description:描述服務 Description=RedisSentinel #After:描述服務類別 After=network.target #服務運行參數的設置 [Service] #Type=forking是后台運行的形式 Type=forking #ExecStart為服務的具體運行命令,路徑必須是絕對路徑 ExecStart=/java/redis5/bin/redis-sentinel /java/redis5/bin/sentinel-26379.conf #ExecReload為重啟命令 ,路徑必須是絕對路徑 ExecReload=/java/redis5/bin/redis-sentinel -s reload #ExecStop為停止命令 ,路徑必須是絕對路徑 ExecStop=/java/redis5/bin/redis-sentinel -s stop #PrivateTmp=True表示給服務分配獨立的臨時空間 PrivateTmp=true #運行級別下服務安裝的相關設置,可設置為多用戶,即系統運行級別為3 [Install] WantedBy=multi-user.target
2、重載系統服務:
systemctl daemon-reload
3、將服務加入開機自啟 (注意redis-sentinel.service后面不能跟空格 )
systemctl enable redis-sentinel.service
成功后提示:
[root@host_132 bin]# systemctl enable redis-sentinel.service
Created symlink from /etc/systemd/system/multi-user.target.wants/redis-sentinel.service to /etc/systemd/system/redis-sentinel.service.
4、測試開機啟動是否成功,重啟服務器
重啟服務器
reboot -f
5、系統重啟后,查看服務運行狀態:
systemctl status redis-sentinel.service
或者查看進程
ps -ef | grep redis-sentinel
五、開放redis-sentinel的連接端口,默認是26379
過程略。
六、Jedis測試Redis哨兵模式切換master
1、准備3台虛擬機,分別安裝了redis和redis-sentinel
過程略。
2、引入jedis依賴
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
3、編寫Java代碼測試:
import java.util.HashSet; import java.util.Random; import java.util.Set; import java.util.concurrent.TimeUnit; import org.apache.log4j.Logger; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisSentinelPool; public class RedisSentinel { private static Logger log = Logger.getLogger(RedisSentinel.class); public static void redisSentinel() { Set<String> sentinels = new HashSet<String>(); sentinels.add("192.168.170.128:26379");//192.168.170.11 sentinels.add("192.168.170.129:26379");//192.168.170.12 sentinels.add("192.168.170.130:26379");//192.168.170.13 JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster", sentinels); Jedis jedis = jedisSentinelPool.getResource(); String a = jedis.get("a"); String b = jedis.get("b"); System.out.println("a=" + a); System.out.println("b=" + b); jedis.close(); jedisSentinelPool.close(); } /** * 測試哨兵轉移 */ public static void redisSentinelTransfer() { Set<String> sentinels = new HashSet<String>(); sentinels.add("192.168.170.11:26379"); sentinels.add("192.168.170.12:26379"); sentinels.add("192.168.170.13:26379"); @SuppressWarnings("resource") JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster", sentinels); Jedis jedis = null; while(true) { try { //不能放在while里面,這樣連接池在8次后會被用完,不執行redis方法,也不報錯。 //如果放在while,必須回收。 jedis = jedisSentinelPool.getResource(); int randInt = new Random().nextInt(10000); String key = "k_" + randInt; String value = "v_" + randInt; jedis.set(key, value); log.info(key + " = " + value); TimeUnit.SECONDS.sleep(2); } catch (Exception e) { log.info(e); } finally { if(jedis != null) { jedis.close(); } } } } public static void main(String[] args) { //redisSentinel(); redisSentinelTransfer(); } }
4、直接通過kill -9 xxx 關閉Redis(主)的redis服務,測試master是否切換。
注意:默認是要 30秒 后才會切換。
Centos7 Redis5安裝及配置,Linux Centos7安裝Redis5,Centos7 Redis自啟動,見:
https://www.cnblogs.com/fanshuyao/p/14144607.html
(如果文章對您有幫助,歡迎捐贈,^_^)
================================
©Copyright 蕃薯耀 2020-12-18
https://www.cnblogs.com/fanshuyao/