您的位置:首页 > 数据库 > Redis

redis 负载均衡

2015-07-02 16:55 706 查看
你看到的这个文章来自于http://www.cnblogs.com/ayanmw

redis 官网 http://redis.io/

中文网站 http://redis.cn/

谷歌代码的redis项目 https://code.google.com/p/redis/

http://www.oschina.net/p/redis/

在oschina.net的介绍:

复制代码

Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。

性能测试结果:

SET操作每秒钟 110000 次,GET操作每秒钟 81000 次,服务器配置如下:

Linux 2.6, Xeon X3320 2.5Ghz.

stackoverflow 网站使用 Redis 做为缓存服务器。

复制代码

我要做的事情就是,在多台linux服务器中,部署redis,由于redis的集群功能没有完全编写好,见:http://redis.io/topics/cluster-spec

目前 redis的最新版本是:redis-2.6.13.tar.gz

但是redis可以做一个主从复制的设置,见redis.conf的 复制【REPLICATION】 部分注释和设置

复制代码

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

Master-Slave replication. Use slaveof to make a Redis instance a copy of

another Redis server. Note that the configuration is local to the slave

so for example it is possible to configure the slave to save the DB with a

different interval, or to listen to another port, and so on.

#

slaveof

If the master is password protected (using the “requirepass” configuration

directive below) it is possible to tell the slave to authenticate before

starting the replication synchronization process, otherwise the master will

refuse the slave request.

#

masterauth

When a slave loses its connection with the master, or when the replication

is still in progress, the slave can act in two different ways:

#

1) if slave-serve-stale-data is set to ‘yes’ (the default) the slave will

still reply to client requests, possibly with out of date data, or the

data set may just be empty if this is the first synchronization.

#

2) if slave-serve-stale-data is set to ‘no’ the slave will reply with

an error “SYNC with master in progress” to all the kind of commands

but to INFO and SLAVEOF.

#

slave-serve-stale-data yes

You can configure a slave instance to accept writes or not. Writing against

a slave instance may be useful to store some ephemeral data (because data

written on a slave will be easily deleted after resync with the master) but

may also cause problems if clients are writing to it because of a

misconfiguration.

#

Since Redis 2.6 by default slaves are read-only.

#

Note: read only slaves are not designed to be exposed to untrusted clients

on the internet. It’s just a protection layer against misuse of the instance.

Still a read only slave exports by default all the administrative commands

such as CONFIG, DEBUG, and so forth. To a limited extend you can improve

security of read only slaves using ‘rename-command’ to shadow all the

administrative / dangerous commands.

slave-read-only yes

Slaves send PINGs to server in a predefined interval. It’s possible to change

this interval with the repl_ping_slave_period option. The default value is 10

seconds.

#

repl-ping-slave-period 10

The following option sets a timeout for both Bulk transfer I/O timeout and

master data or ping response timeout. The default value is 60 seconds.

#

It is important to make sure that this value is greater than the value

specified for repl-ping-slave-period otherwise a timeout will be detected

every time there is low traffic between the master and the slave.

#

repl-timeout 60

Disable TCP_NODELAY on the slave socket after SYNC?

#

If you select “yes” Redis will use a smaller number of TCP packets and

less bandwidth to send data to slaves. But this can add a delay for

the data to appear on the slave side, up to 40 milliseconds with

Linux kernels using a default configuration.

#

If you select “no” the delay for data to appear on the slave side will

be reduced but more bandwidth will be used for replication.

#

By default we optimize for low latency, but in very high traffic conditions

or when the master and slaves are many hops away, turning this to “yes” may

be a good idea.

repl-disable-tcp-nodelay no

The slave priority is an integer number published by Redis in the INFO output.

It is used by Redis Sentinel in order to select a slave to promote into a

master if the master is no longer working correctly.

A slave with a low priority number is considered better for promotion, so

for instance if there are three slaves with priority 10, 100, 25 Sentinel will

pick the one wtih priority 10, that is the lowest.

#

However a special priority of 0 marks the slave as not able to perform the

role of master, so a slave with priority of 0 will never be selected by

Redis Sentinel for promotion.

#

By default the priority is 100.

slave-priority 100

复制代码

看了上面的默认配置,其实也很容易理解,修改下就可以配置主从复制了,有 slaveof ,就成了 从服务器 ,没有就是 主服务器。

还有 主服务器 安全的设置

复制代码

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

Require clients to issue AUTH before processing any other

commands. This might be useful in environments in which you do not trust

others with access to the host running redis-server.

#

This should stay commented out for backward compatibility and because most

people do not need auth (e.g. they run their own servers).

#

Warning: since Redis is pretty fast an outside user can try up to

150k passwords per second against a good box. This means that you should

use a very strong password otherwise it will be very easy to break.

#

requirepass foobared

Command renaming.

#

It is possible to change the name of dangerous commands in a shared

environment. For instance the CONFIG command may be renamed into something

hard to guess so that it will still be available for internal-use tools

but not available for general clients.

#

Example:

#

rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

#

It is also possible to completely kill a command by renaming it into

an empty string:

#

rename-command CONFIG “”

#

Please note that changing the name of commands that are logged into the

AOF file or transmitted to slaves may cause problems.

复制代码

对了,redis的编译安装非常简单,下载redis-2.6.13.tar.gz后,

tar xvf redis-2.6.13.tar.gz

cd redis-2.6.13

make && make install

将会把redis-server、redis-cli、redis-benchmark、redis-check-aof、redis-check-dump 五个文件复制到 /usr/local/bin/下

复制代码

[root@localhost ~]# ll /usr/local/bin

总用量 12464

-rwxr-xr-x. 1 root root 3853805 6月 18 18:54 redis-benchmark

-rwxr-xr-x. 1 root root 16459 6月 18 18:54 redis-check-aof

-rwxr-xr-x. 1 root root 37707 6月 18 18:54 redis-check-dump

-rwxr-xr-x. 1 root root 3909826 6月 18 18:54 redis-cli

-rwxr-xr-x. 1 root root 4931736 6月 18 18:54 redis-server

[root@localhost ~]#

复制代码

然后将源码中的 redis.conf 复制到 /etc/redis.conf

再制作一个 init.d 的启动脚本:

复制代码

!/usr/bin/env bash

#

redis start up the redis server daemon

#

chkconfig: 345 99 99

description: redis service in /etc/init.d/redis \

chkconfig –add redis or chkconfig –list redis \

service redis start or service redis stop

processname: redis-server

config: /etc/redis.conf

PATH=/usr/local/bin:/sbin:/usr/bin:/bin

REDISPORT=6379

EXEC=/usr/local/bin/redis-server

REDIS_CLI=/usr/local/bin/redis-cli

PIDFILE=/var/run/redis.pid

CONF=”/etc/redis.conf”

make sure some dir exist

if [ ! -d /var/lib/redis ] ;then

mkdir -p /var/lib/redis

mkdir -p /var/log/redis

fi

case “1”instatus)ps−A|grepredis;;start)if[−fPIDFILE ]

then

echo “PIDFILEexists,processisalreadyrunningorcrashed”elseecho“StartingRedisserver…”EXEC CONFfiif[“?”=”0” ]

then

echo “Redis is running…”

fi

;;

stop)

if [ ! -f PIDFILE]thenecho“PIDFILE does not exist, process is not running”

else

PID=(catPIDFILE)

echo “Stopping …”

REDISCLI−pREDISPORT SHUTDOWN

while [ -x PIDFILE]doecho“WaitingforRedistoshutdown…”sleep1doneecho“Redisstopped”fi;;restart|force−reload){0} stop

${0} start

;;

*)

echo “Usage: /etc/init.d/redis {start|stop|restart|force-reload}” >&2

exit 1

esac

复制代码

将上面内容复制到 /etc/init.d/redis

chkconfig –add redis

chkconfig –list redis

service redis start

开启了服务,对了忘记了 /etc/redis.conf里面可以把 daemonize no 修改为

daemonize yes

就可以默认在后台执行redis-server了。

这就是主服务器,从服务器,配置一样,只不过 修改/etc/redis.conf 中

slaveof 6379

然后开启从服务器的redis服务。

测试

复制代码

主服务器

redis-cli -p 6379 set hello world

从服务器

redis-cli -p 6379 get hello

“world”

主服务器

redis-cli -p 6379 set hello world2

从服务器

redis-cli -p 6379 get hello

“world2”

redis-cli -p 6379 set hello world

(error) READONLY You can’t write against a read only slave.

成功 配置主从redis 服务器。好简单啊。

复制代码

由于配置中有一条 从服务器 是只读的,所以从服务器 没法设置数据,只可以读取数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis