redis主從模式

一、環境說明

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

# 從上面可以看到數據已同步



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章