redis主从部署

redis主从搭建:

*********************

系统环境:Centos 6.5 

redis版本:redis-3.2.3

master IP:10.10.8.170

slave IP:10.10.8.171

*********************


master配置:

# yum install tcl gcc gcc-c++ -y

# tar -zxf redis-3.2.3.tar.gz -C /usr/local/src/

# cp -r /usr/local/src/redis-3.2.3 /usr/local/redis-3

# cd /usr/local/redis-3
# make && make install


简单配置:(之所以要做简单配置是因为redis在启动的时候会报3个warning)
# echo "vm.overcommit_memory=1" >> /etc/sysctl.conf             
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# echo 511 > /proc/sys/net/core/somaxconn

ps:

waring(1)

2429:M 18 Aug 23:18:50.410 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

解释:'somaxconn'定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128。 
处理: 
# echo 511 >/proc/sys/net/core/somaxconn或者# echo "net.core.somaxconn = 551" >> /etc/sysctl.conf


waring(2)

2429:M 18 Aug 23:18:50.410 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. 
To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

解释:'overcommit_memory'指定了内核针对内存分配的策略,其值可以是0、1、2
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
处理: 
# echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
# echo 1 > /proc/sys/vm/overcommit_memory

延伸解释:
注意:redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用 的内存为8G,这个时候也要同样分配8G的内存给child,
如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所 以这里比较优化的内存分配策略应该设置为 1
(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)。
这里又涉及到Overcommit和OOM。
什么是Overcommit和OOM
在Unix中,当一个用户进程使用malloc()函数申请内存时,假如返回值是NULL,则这个进程知道当前没有可用内存空间,就会做相应的处理工作。许多进程会打印错误信息并退出。
Linux使用另外一种处理方式,它对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做Overcommit。
当内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。
Overcommit的策略
Linux下overcommit有三种策略(Documentation/vm/overcommit-accounting):
0. 启发式策略。合理的overcommit会被接受,不合理的overcommit会被拒绝。
1. 任何overcommit都会被接受。
2. 当系统分配的内存超过swap+N%*物理RAM(N%由vm.overcommit_ratio决定)时,会拒绝commit。
overcommit的策略通过vm.overcommit_memory设置。
overcommit的百分比由vm.overcommit_ratio设置。
# echo 2 > /proc/sys/vm/overcommit_memory
# echo 80 > /proc/sys/vm/overcommit_ratio
当oom-killer发生时,linux会选择杀死哪些进程
选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该函数会计算每个进程的点数(0~1000)。
点数越高,这个进程越有可能被杀死。
每个进程的点数跟oom_score_adj有关,而且oom_score_adj可以被设置(-1000最低,1000最高)。


waring(3)

2429:M 18 Aug 23:18:50.410 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. 
This will create latency and memory usage issues with Redis. 
To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, 
and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

解释:'Transparent Huge Pages (THP)'是一个使管理Huge Pages自动化的抽象层。目前好像问题挺多,很多的数据库产品都是要求(建议)关闭该功能的。 
处理: 
# echo never > /sys/kernel/mm/transparent_hugepage/enabled


编辑主配置文件(基本配置不含优化):

# vim redis.conf     (做如下修改)

################################## NETWORK #####################################

bind 10.10.8.170

port 9736                    ##端口默认6379,根据需求修改,我这里使用的是9736端口

################################# GENERAL #####################################

daemonize yes                                        ## 设置后台运行,否则启动的话是前台运行,会一直占用终端

pidfile /var/run/redis_9736.pid              ##这里可以不用修改默认即可,我这里只是修改了pid文件名路径没变

logfile "/data/logs/redis.log"                  ##设置日志文件路径

################################ SNAPSHOTTING  ################################

dir /data/back/redis/                               ##设置本地数据库存放路径,即dump.rdb文件存放路径

################################## SECURITY ###################################

requirepass redhat                                ##设置密码


编写redis启动脚本:

# vim /etc/init.d/redis

#!/bin/bash
# Init file for redis
# chkconfig: - 80 12
# description: redis daemon


# processname: redis
# config: /etc/redis.conf
# pidfile: /var/run/redis.pid
source /etc/init.d/functions
#BIN="/usr/local/bin"
BIN="/usr/local/bin"
CONFIG="/usr/local/redis-3/redis.conf"
PIDFILE="/var/run/redis.pid"
### Read configuration
[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
RETVAL=0
prog="redis-server"
desc="Redis Server"
start() {
        if [ -e $PIDFILE ];then
             echo "$desc already running...."
             exit 1
        fi
        echo -n $"Starting $desc: "
        daemon $BIN/$prog $CONFIG
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
        return $RETVAL
}
stop() {
        echo -n $"Stop $desc: "
        killproc $prog
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILE
        return $RETVAL
}
#!/bin/bash
#
# Init file for redis
#
# chkconfig: - 80 12
# description: redis daemon
#
# processname: redis
# config: /etc/redis.conf
# pidfile: /var/run/redis.pid
source /etc/init.d/functions
#BIN="/usr/local/bin"
BIN="/usr/local/bin"
CONFIG="/usr/local/redis-3/redis.conf"
PIDFILE="/var/run/redis.pid"
### Read configuration
[ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
RETVAL=0
prog="redis-server"
desc="Redis Server"
start() {
        if [ -e $PIDFILE ];then
             echo "$desc already running...."
             exit 1
        fi
        echo -n $"Starting $desc: "
        daemon $BIN/$prog $CONFIG
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
        return $RETVAL
}
stop() {
        echo -n $"Stop $desc: "
        killproc $prog
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILE
        return $RETVAL
}
restart() {
        stop
        start
}
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  condrestart)
        [ -e /var/lock/subsys/$prog ] && restart
        RETVAL=$?
        ;;
  status)
        status $prog
        RETVAL=$?
        ;;
   *)
        echo $"Usage: $0 {start|stop|restart|condrestart|status}"
        RETVAL=1
esac
exit $RETVAL


# chmod +x /etc/init.d/redis

# /etc/init.d/redis restart

手动启动redis:

# /usr/local/redis-3/src/redis-server /usr/local/redis-3/redis.conf


防火墙开启改端口:
# vim /etc/sysconfig/iptables       ##加入如下一条
-I INPUT -p tcp --dport 9736 -j ACCEPT


设置开机自启动:
# chkconfig --add redis
# chkconfig redis on


# vim /etc/services     最后加入

redis           9736/tcp                # redis
redis           9736/udp                # redis


slave配置:

同master一样,参考master,此处省略,以下只写出与master不同之处


编辑主配置文件(基本配置不含优化)

# vim redis.conf     (做如下修改)

################################## NETWORK #####################################

bind 10.10.8.171

port 9736                    ##端口默认6379,根据需求修改,我这里使用的是9736端口

################################# GENERAL #####################################

daemonize yes                                        ## 设置后台运行,否则启动的话是前台运行,会一直占用终端

pidfile /var/run/redis_9736.pid              ##这里可以不用修改默认即可,我这里只是修改了pid文件名路径没变

logfile "/data/logs/redis.log"                  ##设置日志文件路径

################################ SNAPSHOTTING  ################################

dir /data/back/redis/                               ##设置本地数据库存放路径,即dump.rdb文件存放路径

################################# REPLICATION #################################

slaveof 10.10.8.170 9736                       ##master IP及端口

masterauth redhat                                ##master 密码

################################## SECURITY ###################################

requirepass redhat                                ##设置密码


master与slave都配置完成并启动后进行测试:

master输入:
# redis-cli  -a redhat
10.10.8.155:6379> set b 111
OK
10.10.8.155:6379> get b
"111"

slave输入
# redis-cli -a redhat
10.10.8.156:6379> get b
"111"

redis主从配置完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值