一、環境說明
192.168.5.65 master
192.168.5.66 slave
#hosts文件配置
cat >> /etc/hosts << EOF 192.168.5.65 redis65 192.168.5.66 redis65 EOF
二、修改系統參數
#修改最大可打開文件數
cat >> /etc/security/limits.conf << EOF * soft nofile 102400 * hard nofile 102400 EOF
#TCP監聽隊列大小
echo "net.core.somaxconn = 32767" >> /etc/sysctl.conf sysctl -p
#OOM相關:vm.overcommit_memory
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf sysctl -p
#開啓內核的“Transparent Huge Pages (THP)”特性
echo never > /sys/kernel/mm/transparent_hugepage/enabled echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >>/etc/rc.local chmod +x /etc/rc.local
三、安裝redis
[root@redis65 /]# cd /opt [root@redis65 opt]# wget http://download.redis.io/releases/redis-5.0.0.tar.gz [root@redis65 opt]# tar -zxvf redis-5.0.0.tar.gz [root@redis65 opt]# cd redis-5.0.0/ [root@redis65 redis-5.0.0]# make [root@redis65 redis-5.0.0]# make install PREFIX=/usr/local/redis
#創建實例目錄
[root@redis65 /]# mkdir -p /data/redis/redis_7001
##redis65 7001配置文件(master)
cat >> /data/redis/redis_7001/redis_7001.conf <<EOF bind 0.0.0.0 protected-mode no port 7001 daemonize yes loglevel notice requirepass zxc789 #rdb持久化 dir /data/redis/redis_7001 dbfilename dump.rdb save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes #AOF持久化 appendonly yes appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 1024mb aof-load-truncated yes pidfile /data/redis/redis_7001/redis_7001.pid logfile /data/redis/redis_7001/redis_7001.log EOF
##redis66 7001配置文件(slave)
cat >> /data/redis/redis_7001/redis_7001.conf <<EOF bind 0.0.0.0 protected-mode no port 7001 daemonize yes loglevel notice requirepass zxc789 #連接redis master slaveof 192.168.5.65 7001 masterauth zxc789 slave-read-only yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 #rdb持久化 dir /data/redis/redis_7001 dbfilename dump.rdb save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes #AOF持久化 appendonly yes appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 1024mb aof-load-truncated yes pidfile /data/redis/redis_7001/redis_7001.pid logfile /data/redis/redis_7001/redis_7001.log EOF
##redis啓動文件
cat >> /etc/init.d/redis_7001 <<EOF # chkconfig: 2345 10 90 # description: Start and Stop redis PATH=/usr/local/bin:/sbin:/usr/bin:/bin REDISPORT=7001 EXEC=/usr/local/redis-cluster/bin/redis-server REDIS_CLI=/usr/local/redis-cluster/bin/redis-cli PIDFILE=/data/redis/redis_7001/redis_7001.pid CONF="/data/redis/redis_7001/redis_7001.conf" #AUTH="1234" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed." else echo "Starting Redis server..." $EXEC $CONF fi if [ "$?"="0" ] then echo "Redis is running..." fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE exists, process is not running." else PID=$(cat $PIDFILE) echo "Stopping..." $REDIS_CLI -p $REDISPORT -a 'zxc789' SHUTDOWN 2>/dev/null sleep 2 while [ -x $PIDFILE ] do echo "Waiting for Redis to shutdown..." sleep 1 done echo "Redis stopped" fi ;; restart|force-reload) ${0} stop ${0} start ;; *) echo "Usage: /etc/init.d/redis_7001 {start|stop|restart|force-reload}" >&2 exit 1 esac EOF
chmod +x /etc/init.d/redis_7001 /etc/init.d/redis_7001 start chkconfig redis_7001 on
# 在redis-cli -h 127.0.0.1 -a 'password'這裏會有一個問題,當在shell中輸入以上命令時,控制檯總會輸出一串“Warning: Using a password with '-a' option on the command line interface may not be safe.”
#解決辦法將標準錯誤去除即可,加了2>/dev/null,將標準錯誤丟棄即可,如:redis-cli -h 192.168.5.65 -p 7001 -c -a 'zxc789' 2>/dev/null
# 同步確認
[root@redis65 /]# redis-cli -h 192.168.5.65 -p 7001 -c -a 'zxc789' 2>/dev/null
192.168.5.65:7001> INFO replication # Replication role:master connected_slaves:1 slave0:ip=192.168.5.66,port=7001,state=online,offset=70,lag=1 master_replid:c8cbd4ae635da25193060cacaaebf8a696227476 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:70 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:70
[root@redis66 /]# redis-cli -h 192.168.5.66 -p 7001 -c -a 'zxc789' 2>/dev/null
192.168.5.66:7001> INFO replication # Replication role:slave master_host:192.168.5.65 master_port:7001 master_link_status:up master_last_io_seconds_ago:9 master_sync_in_progress:0 slave_repl_offset:112 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:c8cbd4ae635da25193060cacaaebf8a696227476 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:112 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:112
同期正常時:
master_link_status:up
master_repl_offset #和slave_repl_offset相等,
master_last_io_seconds_ago #在10秒內。
#shell腳本隨機插入數據測試
cat >> /data/11.sh <<EOF #!/bin/bash for ((i=0;i<100;i++)) do echo -en "cldjiowehjijcvjsopdjfjpjj" | redis-cli -p 7001 -a 'zxc789' -x set name$i 2>/dev/null done EOF
chmod +x /data/11.sh time sh /data/11.sh
# slave只讀不允許寫
192.168.5.66:7001> set yaya 465464654 (error) READONLY You can't write against a read only replica.
#停止slave後往master裏寫數據
cat >> /data/11.sh <<EOF #!/bin/bash for ((i=101;i<150;i++)) do echo -en "64we64f54f4qwe464cvw6e4" | redis-cli -p 7001 -a 'zxc789' -x set name$i 2>/dev/null done EOF
#master寫完數據再開啓slave,看slave是否有同步數據
192.168.5.65:7001> info keyspace # Keyspace db0:keys=149,expires=0,avg_ttl=0 192.168.5.65:7001> DBSIZE (integer) 149 192.168.5.65:7001> get name112 "64we64f54f4qwe464cvw6e4" 192.168.5.65:7001> INFO replication # Replication role:master connected_slaves:0 master_replid:c8cbd4ae635da25193060cacaaebf8a696227476 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:14549 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:14549 192.168.5.65:7001> INFO replication # Replication role:master connected_slaves:1 slave0:ip=192.168.5.66,port=7001,state=online,offset=14563,lag=1 master_replid:c8cbd4ae635da25193060cacaaebf8a696227476 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:14563 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:14563 192.168.5.66:7001> info keyspace # Keyspace db0:keys=149,expires=0,avg_ttl=0 192.168.5.66:7001> DBSIZE (integer) 149 192.168.5.66:7001> get name112 "64we64f54f4qwe464cvw6e4" 192.168.5.66:7001> INFO replication # Replication role:slave master_host:192.168.5.65 master_port:7001 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:14633 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:c8cbd4ae635da25193060cacaaebf8a696227476 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:14633 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:14550 repl_backlog_histlen:84
# 從上面可以看到數據已同步