array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 redis集群安装与配置(redis4.x) - 爱码网

redis集群安装与配置(redis4.x)
概要说明
redis单机/redis集群(本文档为redis4.0版本)
Redis 复制、Sentinel的搭建和原理(限于版本低于redis3.0的)
截止2019/06/27 最新稳定版为 redis5.0.5(x.y.z,y为偶数为稳定版).
redis5.x版本的集群,请重新查找网上资料(不再需要ruby支持). 如
https://blog.csdn.net/u010520146/article/details/84932104
https://www.jianshu.com/p/8045b92fafb2

官方集群搭建
https://redis.io/topics/cluster-tutorial

哨兵模式 Sentinel (redis3以前的方式)
在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。

20180615 Chenxin整理
安装单机版redis
cd /opt
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
tar xzvf redis-4.0.10.tar.gz
cd redis-4.0.10
make
cd /opt;mv /opt/redis-4.0.10 /usr/local/redis

Redis 集群
参考资料
https://www.cnblogs.com/mafly/p/redis_cluster.html redis集群搭建详细指南
https://blog.csdn.net/huwh_/article/details/79242625

Redis 集群说明
Redis 在3.0版本前只支持单实例模式,Redis 在 3.0 版本以后就推出了集群模式.
Redis 集群(至少需要6个节点,3主3从)采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 个 slot,每个 Redis 实例负责其中一部分 slot .集群中的所有信息(节点、端口、slot等),通过节点之间定期的数据交换进行更新.
Redis 客户端可以向任意一个 Redis 实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例.

集群准备
mkdir /usr/local/redis-cluster
cd /usr/local/redis-cluster
mkdir -p 9001/data 9002/data 9003/data 9004/data 9005/data 9006/data
mkdir bin
cd /usr/local/redis/src
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin/
cp -rf /usr/local/redis/* /usr/local/redis-cluster/9001

配置文件
修改配置文件/usr/local/redis-cluster/9001/redis.conf
cd /usr/local/redis-cluster/9001/
cat redis.conf

bind 10.0.1.200
protected-mode yes

port 6379

port 9001
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes

daemonize no

dir /usr/local/redis-cluster/9001/data/

以下为cluster需要的几项配置.

pidfile /var/run/redis_9001.pid
cluster-enabled yes
cluster-config-file nodes9001.conf
cluster-node-timeout 15000

以下为默认

slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly yes

appendonly no

appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing 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
hz 10
aof-rewrite-incremental-fsync yes
配置文件结束.

cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9002
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9003
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9004
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9005
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9006
sed -i 's/9001/9002/g' /usr/local/redis-cluster/9002/redis.conf
sed -i 's/9001/9003/g' /usr/local/redis-cluster/9003/redis.conf
sed -i 's/9001/9004/g' /usr/local/redis-cluster/9004/redis.conf
sed -i 's/9001/9005/g' /usr/local/redis-cluster/9005/redis.conf
sed -i 's/9001/9006/g' /usr/local/redis-cluster/9006/redis.conf

启动
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/9001/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/9002/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/9003/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/9004/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/9005/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/9006/redis.conf

测试各单节点运行情况
/usr/local/redis-cluster/bin/redis-cli -h 10.0.1.200 -p 9001

keys *
set name chenxin
会提示"(error) CLUSTERDOWN Hash slot not served(不提供集群的散列槽)",redis集群需要使用ruby命令,需要安装ruby和相关接口.

密码认证的方式
1.配置文件
requirepass aA.......THJ7jrd
2.连接方式
方式一 /usr/local/redis/src/redis-cli -h 10.16.200.6 -a aAORnquDATHJ7jrd (此方式会将密码记录在历史指令里)
方式二 /usr/local/redis/src/redis-cli -h 10.16.200.6 登陆进去后,执行 10.16.200.6:6379> auth aAORnquDATHJ7jrd

集群链接多个守护进程-构建集群
Redis的实例全部运行之后,还需要redis-trib.rb工具来完成集群的创建,redis-trib.rb二进制文件在Redis包主目录下的src目录中,运行该工具依赖Ruby环境和gem.Gem是一个管理Ruby库和程序的标准包,它通过Ruby Gem(如 http://rubygems.org/ )源来查找、安装、升级和卸载软件包
官网下载编译安装ruby2.5版本

编译安装ruby2.2以上版本 (注意,redis5.0版本以后,就不再使用此方式了,无需安装ruby.直接集成进redis-cli里了).
cd /opt/
wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.gz
tar xzvf ruby-2.5.1.tar.gz;cd ruby-2.5.1;
./configure
make
报错:
uh-oh! RDoc had a problem:
Directory .ext/rdoc already exists, but it looks like it isn't an RDoc directory.
Because RDoc doesn't want to risk destroying any of your existing files,
you'll need to specify a different output directory name (using the --op


option)
run with --debug for full backtrace
make: *** [rdoc] Error 1
没有查到解决此问题的办法,只能通过禁用掉的方式了.如下
./configure --disable-install-rdoc
make
make install
默认安装到/usr/local/bin/下的.系统自带的会在/usr/bin/目录下,自带的是ruby2.0版本.这里需要安装2.2以上版本.
确认当前调用的是2.5版本.
ruby -v

安装gem
yum install -y rubygems
安装gem需要的依赖包
yum install -y zlib zlib-devel openssl openssl-devel

gem安装redis
gem install redis
Fetching: redis-4.0.1.gem (100%)
Successfully installed redis-4.0.1
Parsing documentation for redis-4.0.1
Installing ri documentation for redis-4.0.1
Done installing documentation for redis after 0 seconds
1 gem installed
没有报错.
gem install redis 如果报错(缺少zlib依赖和openssl库),则修改以下

添加zlib依赖
cd /opt/ruby-2.5.1/ext/zlib
ruby extconf.rb
然后修改Makefile文件中的zlib.o: $(top_srcdir)/include/ruby.h,将$(top_srcdir)修改为../..即zlib.o: ../../include/ruby.h
sed -i 's/$(top_srcdir)/../../g' Makefile
make && make install
以上zlib的依赖包报错可以参考 https://blog.csdn.net/feinifi/article/details/78251486

添加openssl库
cd /opt/ruby-2.5.1/ext/openssl
ruby extconf.rb
然后同样修改Makefile文件中的$(top_srcdir)为../..
sed -i 's/$(top_srcdir)/../../g' Makefile
make && make install
以上zlib的依赖包报错可以参考 https://blog.csdn.net/feinifi/article/details/78251486

再次安装gem install redis
gem install redis

正式链接整个集群
/usr/local/redis-cluster/bin/redis-trib.rb create --replicas 1 10.0.1.200:9001 10.0.1.200:9002 10.0.1.200:9003 10.0.1.200:9004 10.0.1.200:9005 10.0.1.200:9006
调用 ruby 命令来进行创建集群,--replicas 1 表示主从复制比例为 1:1,即一个主节点对应一个从节点;然后,默认给我们分配好了每个主节点和对应从节点服务,以及 solt 的大小,因为在 Redis 集群中有且仅有 16383 个 solt ,默认情况会给我们平均分配,当然你可以指定,后续的增减节点也可以重新分配。
测试集群
/usr/local/redis-cluster/bin/redis-cli -c -h 10.0.1.200 -p 9001
执行:
cluster info
cluster nodes
可以详细的看出集群信息和各个节点状态,主从信息以及连接数、槽信息等
当我们 set name chenxin,出现了 Redirected to slot 信息并自动连接到了9002节点。这也是集群的一个数据分配特性,这里不详细说了.
另外,cluster的配置文件和数据文件发生了变化:
ls /usr/local/redis-cluster/9001/data/
appendonly.aof dump.rdb nodes9001.conf

迁移IP后注意事项
如果cluster发生IP地址的变化(迁移),需要调整nodes9001.conf文件内的IP配置信息.否则集群会无法"链接".

如何关闭集群
正确关闭
redis-cli -p 6380 -a fafa123 shutdown
/usr/local/redis/src/redis-cli -p 9001 -h 10.0.1.200 shutdown 并依次关闭9002-9006
语法
SHUTDOWN [NOSAVE|SAVE]
[root@T4 conf]# redis-cli -c -h 172.16.57.57 -p 6382
172.16.57.57:6382> shutdown save
注意关闭只能关闭一个进程,不能关闭集群.
/etc/init.d/redis-server stop
/etc/init.d/redis-server start
/etc/init.d/redis-server restart

redis-cli -h 127.0.0.1 -p 6379 shutdown
手动save:
/usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6379 save
OK

集群的扩容与收缩

数据的备份与恢复
貌似还是按照单个实例的方式进行备份或恢复物理文件,待后期继续研究更加合理的备份/恢复方案.

将远端redis上的rdb文件传输到本地(实现备份)
/usr/local/redis/src/redis-cli -h 10.0.1.198 -p 10379 save
cd /home/admin/
/usr/local/redis/src/redis-cli -h 10.0.1.198 -p 10379 --rdb test.rdb #将1.198上的redis数据拖到本地,本地文件命名为test.rdb

AWS的ElasticCache Redis不支持save和 --rdb 的指令.所以备份方案请参考aws云笔记里的ElasticCache备份和删除过期文件.

使用云服务商提供的redis集群服务
若服务过多,以及数据可靠性完整性考虑,推荐后期使用云服务商提供的redis集群服务.备份采取自备,不依赖云平台服务.

相关文章:

  • 2021-11-17
  • 2021-11-20
  • 2021-11-17
  • 2021-12-02
  • 2021-11-30
  • 2021-12-01
  • 2021-11-19
猜你喜欢
  • 2021-11-19
  • 2021-11-18
  • 2021-11-19
  • 2022-01-02
  • 2021-11-17
  • 2021-11-18
  • 2021-11-18
  • 2021-12-02
相关资源
相似解决方案