Redis集群 高性能缓存服务

作者:じ☆ve宝贝

发布时间:2015-08-17T16:08:52

Redis 安装步骤

准备工作

(1)确保系统安装zlib,否则gem install会报(no such file to load -- zlib)
    下载:zlib-1.2.6.tar  
	./configure  
	make  
	make install  
(2)安装ruby1.9.2
	cd /文件夹路径/ruby  
	./configure //指定编译后的路径
	make  
	make install  
(3)安装 rubygems-1.8.16.tgz
	cd /文件夹路径/rubygems  
	sudo ruby setup.rb  
(4)安装redis-3.0.0.gem
#由于源的原因,可能下载失败,就手动下载下来安装  
#download地址:http://rubygems.org/gems/redis/versions/3.0.0  
gem install -l /文件路径/redis-3.0.0.gem  

正式安装

(1)下载官方提供的压缩包。(注意:一定要在linux解压,否则出错)
(2)使用make编译.c文件  (32位系统 查看方法getconf LONG_BIT 使用 make CFLAGS="-march=i686")
  使用  make install  可以将 redis-server redis-cli redis-benchmark redis-check-dump redis-check-aof 安装在 usr/local/bin下  直接使用
(3)把redis.conf中的配置修改一下
daemonize yes #是否以后台daemon方式运行 
pidfile /usr/local/redis/var/redis.pid #pid文件位置 
port 6379 #监听的端口号 
timeout 300 #请求超时时间 
loglevel debug #log信息级别 
logfile /usr/local/redis/var/redis.log #log文件位置
databases 16 #开启数据库的数量
save 900 1 #保存快照的频率,第一个*表示多长时间,第二个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。 
save 300 10 # 在5分钟内 执行写的操作超过10次  自动保存快照
save 60 10000 #
rdbcompression yes # 是否使用压缩 
dbfilename dump.rdb #数据快照文件名(只是文件名,不包括目录)
dir /usr/local/redis/var/ #数据快照的保存目录(这个是目录) 
appendonly no #是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。 
appendfsync always #appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步) 
glueoutputbuf yes #
shareobjects no #
shareobjectspoolsize 1024 #

####启动 Redis服务

  1. src/redis-server 启动redis服务
  2. 存值redis-cli set mykey somevalue
  3. 取值redis-cli get mykey
  4. 关闭服务redis-cli shutdown
    redis-cli -p 7002 shutdown 关闭端口号为7002的redis服务端 redis-cli -p 7002 debug segfault 让这个节点崩溃 (如果没有提示的话 加上./就行了 例如:./redis-cli shutdown ./意思是:当前文件夹)

####Windows版 Redis服务

启动 redis-server.exe redis.window.conf     //会按照你redis.window.conf 配置启动
使用 redis-cli.exe -h 192.168.79.110 -p 6379 //启动windos版的客户端

####Redis主从配置 //在丛机位置配置 打开redis.conf 添加上如下的内容 OK

slaveof 192.168.223.153 6379 # slaveof(奴隶) master(主人)的ip master的端口

####Redis集群配置 要让集群正常运作至少需要三个主节点和三个从节点 #####1.打开redis.conf
修改如下的内容 OK(最节俭的配置)

	port 7000 #端口号
	cluster-enabled yes #打开实例的集群模式
	cluster-config-file nodes-"名字不要重复".conf #设定了保存节点配置文件的路径, 默认值为 nodes.conf 
	(节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更新。)
	cluster-node-timeout 5000 #连接超时
	appendonly yes #是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。 

#####2.安装必要的插件 一、zlib安装zlib-1.2.6.tar.gz ./configure
make
make install
二、 Ruby 安装ruby-1.8.7-p174.tar.gz 1)得到Ruby安装包 wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p174.tar.gz 安装的1.8.7版本 2) 解压安装 tar -xzvf ruby-1.8.7-p174.tar.gz cd ruby-1.8.7-p174 ./configure make make install 通过以上步骤就已经安装好了ruby 3) 验证 ruby –v 输出:ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-linux] 这样表示ruby 安装成功了 三、 RubyGems 安装ruby安装成共rubygems-1.8.5.tgz 1) 得到rubygems包 wget http://rubyforge.org/frs/download.php/73882/rubygems-1.4.2.tgz 2) 安装 tar –xzvf rubygems-1.4.2.tgz cd rubygems-1.4.2 ruby setup.rb 3) 验证安装成功: gem –v 输出:1.4.2 那么就rubygems就安装成功了 三、redis的第三方接口!既然ruby程序要访问redis数据库,总得有个连接接口。 1) gem install redis 到此位置 ok #####3.启动集群程序 安装好的软件在 /usr/local/bin下

安装完成后使用redis-trib.rb来创建集群 1)启动各个节点

	进入redis安装的文件  使用 src/redis-server redis.conf  来启动redis

(注意:不能直接在该终端继续开启,一个终端在没有关闭重新打开的情况下只能开启一个redis,建议不要关闭重新打开一个终端) 2)创建集群

redis-trib.rb create --replicas 1 192.168.223.153:7000 192.168.223.153:7001 192.168.223.153:7002 192.168.223.153:7003 192.168.223.153:7004 192.168.223.153:7005
	
	redis-trib.rb 程序的命令是 create , 这表示我们希望创建一个新的集群。
	选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
	之后跟着的其他参数则是实例的地址列表, 我们希望程序使用这些地址所指示的实例来创建新集群。

3)启动集群
	redis-cli -c -p 7000 
4)检查集群状态
	redis-trib.rb check 127.0.0.1:7001
5)添加新master(主人)节点
	a)首先启动redis端口及配置文件src/redis-server redis.conf
	b)添加新的节点redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000   第一个ip是新增加的   第二个是已经存在的
		(注意:官方add-node没有横线,可能版本不同,大家可以 redis-trib.rb help 来了解里面的命令)
	c)为新增加节点添加槽数:
		redis-trib.rb reshard 127.0.0.1:7006
		#根据提示选择要迁移的slot(槽)数量(ps:这里选择500)
		How many slots do you want to move (from 1 to 16384)? 500
		#选择要接受这些slot的node-id
		What is the receiving node ID? f51e26b5d5ff74f85341f06f28f125b7254e61bf (7006端口的nodeid)
		#选择slot来源:
		#all表示从所有的master重新分配,
		#或者数据要提取slot的master节点id,最后用done结束
		Please enter all the source node IDs.
		  Type 'all' to use all the nodes as source nodes for the hash slots.
		  Type 'done' once you entered all the source nodes IDs.
		Source node #1:all
		#打印被移动的slot后,输入yes开始移动slot以及对应的数据.
		#Do you want to proceed with the proposed reshard plan (yes/no)? yes
		#结束
(哈希槽:一个 Redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个哈希槽的其中一个)
6)添加slave(奴隶)节点
	a)b)和上面相同
	c)	输入redis-cli -p 7006 连接上新节点shell ,输入命令:cluster replicate 对应master的node-id	
		如果我们打算让新节点(7006)成为 127.0.0.1:7005 的从节点, 那么我们只要用客户端连接上新节点
		cluster replicate 2b9ebcbd627ff0fd7a7bbcc5332fb09e72788835  (主节点 127.0.0.1:7005 的节点 ID )
	注意:
	note:在线添加slave 时,需要dump(将整个储存装置记录在另一储存装置中)整个master进程,并传递到slave,再由 slave加载rdb文件到内存,rdb传输过程中Master可能无法提供服务,整个过程消耗大量io,小心操作
7)对负载均衡的处理
	对于负载/数据不均匀的情况,可以在线reshard slot来解决,方法与添加新master的reshard一样,只是需要reshard的master节点是老节点
8)删除一个slave(奴隶)节点
	#redis-trib del-node ip地址:端口号 '<节点的id(启动服务的时候在图的上面 I'f51e26b5d5ff74f85341f06f28f125b7254e61bf>'  
	redis-trib.rb del-node 127.0.0.1:7006 'f51e26b5d5ff74f85341f06f28f125b7254e61bf'  

9)删除一个master(主人)节点
	a)删除master节点之前首先要使用reshard移除master的全部slot(哈希槽的数据),然后再删除当前节点(目前只能把被删除
		master的slot迁移到一个节点上)
	b)为删除的节点移动槽数:
		#把127.0.0.1:7006当前master迁移到127.0.0.1:7000上  
		redis-trib.rb reshard 127.0.0.1:7000  
		#根据提示选择要迁移的slot数量(ps:这里选择500)  
		How many slots do you want to move (from 1 to 16384)? 500(被删除master的所有slot数量)  
		#选择要接受这些slot的node-id(10.10.34.14:6380)  
		What is the receiving node ID? c4a31c852f81686f6ed8bcd6d1b13accdc947fd2 #(ps:127.0.0.1:7000的node-id)  
		Please enter all the source node IDs.  
		  Type 'all' to use all the nodes as source nodes for the hash slots.  
		  Type 'done' once you entered all the source nodes IDs.  
		Source node #1:f51e26b5d5ff74f85341f06f28f125b7254e61bf#(被删除master的node-id,也就是7006端口号的nodeid)  
		Source node #2:done  
		#打印被移动的slot后,输入yes开始移动slot以及对应的数据.  
		#Do you want to proceed with the proposed reshard plan (yes/no)? yes  
	c)删除该空节点
		redis-trib.rb del-node 127.0.0.1:7006 'f51e26b5d5ff74f85341f06f28f125b7254e61bf'  
10)获得节点的运行 ID 	
		redis-cli -p 7001 cluster nodes | grep myself #查看自己的id
		redis-cli -p 7001 cluster nodes | grep master #查看所有的主节点id
		
测试
	redis-cli -h 192.168.223.153 -p 7000//进入 端口号为的7000节点
	redis-cli -c -p 7000   //进入集群

错误总结

  1. 问题:

    	[ERR]Node 127.0.0.1:7006 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    

    描述:

    	删除了一个节点,我再一次添加,他会提示错误!
    

    解决: cluster-config-file nodes-"名字不要重复".conf #设定了保存节点配置文件的路径)把这个路径里node-xxx.conf删除掉就行 如果还是报错换个生成后的路径/usr/xx/nodes-xx.conf 或者删除该redis文件夹 重新生成!

  2. 问题: ERROR: Invalid configuration for cluster creation. Redis Cluster requires at least 3 master nodes. This is not possible with 4 nodes and 1 replicas per node. At least 6 nodes are required. 描述: redis集群启动个数不够 解决: Redis官说,至少3+3

  3. 问题 Either the node already knows other nodes 描述:由于单机测试,产生垃圾数据 解决: db和log下能清空的都清空了。

linux centOS6.5不支持中文解决?

1)# vi  /etc/sysconfig/i18n
	修改LANG="en_US.UTF-8"为LANG="zh_CN.UTF-8"保存
2) # export LC_ALL=zh_CN.UTF-8
OK 重新启动电脑即可

有中文乱码问题? http://www.cnblogs.com/ylqmf/archive/2011/09/05/2167458.html