@zhangsiming65965
2019-02-14T03:22:52.000000Z
字数 16749
阅读 194
云计算
如果有梦想,就放开的去追;
因为只有奋斗,才能改变命运。
[root@ZhangSiming conf]# which redis-server
/usr/local/bin/redis-server
[root@ZhangSiming conf]# cp /usr/src/redis-4.0.11/src/redis-trib.rb /usr/local/redis/bin/
#把redis-cluster自带的工具拷贝到/usr/local/redis/bin/下
[root@ZhangSiming conf]# mkdir /data/redis-cluster
#创建cluster目录
[root@ZhangSiming conf]# cd /data/redis-cluster
[root@ZhangSiming redis-cluster]# mkdir 7000 7001 7002
[root@ZhangSiming redis-cluster]# cp /usr/local/redis/conf/redis.conf /data/redis-cluster/7000/
[root@ZhangSiming redis-cluster]# cp /usr/local/redis/conf/redis.conf /data/redis-cluster/7001/
[root@ZhangSiming redis-cluster]# cp /usr/local/redis/conf/redis.conf /data/redis-cluster/7002/
#复制三份配置文件过来
要实现Redis多实例,只需要复制多份配置文件,然后更改端口号,PIDfile位置、日志文件和数据目录位置即可;启动的时候指向不同的配置文件。
[root@ZhangSiming redis-cluster]# sed -n "1p;3p;9p;11p;17p" /data/redis-cluster/7000/redis.conf
cluster-enabled yes
port 7000
pidfile "/date/redis-cluster/7000/redis.pid"
logfile "/data/redis-cluster/7000/redis.log"
dir "/data/redis-cluster/7000/"
[root@ZhangSiming redis-cluster]# sed "s#7000#7001#g" /data/redis-cluster/7000/redis.conf > /data/redis-cluster/7001/redis.conf
[root@ZhangSiming redis-cluster]# sed "s#7000#7002#g" /data/redis-cluster/7000/redis.conf > /data/redis-cluster/7002/redis.conf
#给三份配置文件都修改到相应端口,相应目录下
[root@ZhangSiming redis-cluster]# redis-server /data/redis-cluster/7000/redis.conf
[root@ZhangSiming redis-cluster]# redis-server /data/redis-cluster/7001/redis.conf
[root@ZhangSiming redis-cluster]# redis-server /data/redis-cluster/7002/redis.conf
#指向不同的配置文件启动多实例Redis
[root@ZhangSiming redis-cluster]# netstat -antup | grep redis
tcp 0 0 0.0.0.0:7000 0.0.0.0:* LISTEN 2005/redis-server 0
tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 2010/redis-server 0
tcp 0 0 0.0.0.0:7002 0.0.0.0:*
#启动成功
[root@ZhangSiming ~]# ls
anaconda-ks.cfg common_install.sh ruby-2.2.7.tar.gz
[root@ZhangSiming ~]# tar xf ruby-2.2.7.tar.gz -C /usr/src
[root@ZhangSiming ~]# cd /usr/src/ruby-2.2.7/
[root@ZhangSiming ruby-2.2.7]# ./configure && make && make install
[root@ZhangSiming ruby-2.2.7]# ruby --version
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-linux]
#编译安装成功
[root@ZhangSiming ruby-2.2.7]# /usr/local/bin/gem install redis
Fetching: redis-4.1.0.gem (100%)
Successfully installed redis-4.1.0
Parsing documentation for redis-4.1.0
Installing ri documentation for redis-4.1.0
Done installing documentation for redis after 2 seconds
1 gem installed
#在线安装Ruby的Redis扩展
[root@ZhangSiming ruby-2.2.7]# /usr/local/redis/bin/redis-trib.rb create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
>>> Creating cluster
>>> Performing hash slots allocation on 3 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
M: d2a7c90c060f1af1a3455c0f7fe125c2381f6e85 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: 8869a51897e65ae056eda34f7c46f34c0b564b4a 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: 3317575b248992940744b22438ac7dbaab4da258 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
#输入yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join..
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: d2a7c90c060f1af1a3455c0f7fe125c2381f6e85 127.0.0.1:7000
slots:0-5460 (5461 slots) master
0 additional replica(s)
M: 8869a51897e65ae056eda34f7c46f34c0b564b4a 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
0 additional replica(s)
M: 3317575b248992940744b22438ac7dbaab4da258 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#出现两个OK即代表成功
[root@ZhangSiming ruby-2.2.7]# redis-cli -p 7000 cluster nodes
8869a51897e65ae056eda34f7c46f34c0b564b4a 127.0.0.1:7001@17001 master - 0 1549808213336 2 connected 5461-10922
3317575b248992940744b22438ac7dbaab4da258 127.0.0.1:7002@17002 master - 0 1549808214342 3 connected 10923-16383
d2a7c90c060f1af1a3455c0f7fe125c2381f6e85 127.0.0.1:7000@17000 myself,master - 0 1549808213000 1 connected 0-5460
#集群有三个节点
#本地访问
[root@ZhangSiming ruby-2.2.7]# redis-cli -c -p 7000
127.0.0.1:7000> set zhangsiming 111
-> Redirected to slot [14612] located at 127.0.0.1:7002
OK
#在cluster集群中创建一个键值,被随机分配到了7002端口服务器上存储
127.0.0.1:7002> exit
[root@ZhangSiming ruby-2.2.7]# redis-cli -c -p 7001 get zhangsiming
"111"
[root@ZhangSiming ruby-2.2.7]# redis-cli -p 7001 get zhangsiming
(error) MOVED 14612 127.0.0.1:7002
#本地访问集群(-c)可以访问到,除了7002,其他端口普通访问服务器不能看到键值
#远程访问
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 192.168.17.128 -c -p 7000 get zhangsiming
Could not connect to Redis at 127.0.0.1:7002: Connection refused
Could not connect to Redis at 127.0.0.1:7002: Connection refused
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 192.168.17.128 -c -p 7001 get zhangsiming
Could not connect to Redis at 127.0.0.1:7002: Connection refused
Could not connect to Redis at 127.0.0.1:7002: Connection refused
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 192.168.17.128 -c -p 7002 get zhangsiming
"111"
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 192.168.17.128 -p 7002 get zhangsiming
"111"
#除了7002服务器,其余全部不能访问。事实上因为是创建的本地cluster集群,所有远程的服务器都不能访问应该。至于访问7002端口可以访问到,只是因为数据本身就存在了7002端口服务器上
[root@ZhangSiming ruby-2.2.7]# rm -rf /data/redis-cluster/7000/nodes.conf
[root@ZhangSiming ruby-2.2.7]# rm -rf /data/redis-cluster/7001/nodes.conf
[root@ZhangSiming ruby-2.2.7]# rm -rf /data/redis-cluster/7002/nodes.conf
#删除Redis-cluster的配置文件,就删除了集群
[root@ZhangSiming ruby-2.2.7]# redis-cli -p 7001 shutdown
[root@ZhangSiming ruby-2.2.7]# redis-cli -p 7000 shutdown
[root@ZhangSiming ruby-2.2.7]# redis-cli -p 7002 shutdown
[root@ZhangSiming ruby-2.2.7]# redis-server /data/redis-cluster/7002/redis.conf
[root@ZhangSiming ruby-2.2.7]# redis-server /data/redis-cluster/7001/redis.conf
[root@ZhangSiming ruby-2.2.7]# redis-server /data/redis-cluster/7000/redis.conf
#重启Redis
[root@ZhangSiming ruby-2.2.7]# /usr/local/redis/bin/redis-trib.rb create 192.168.17.128:7000 192.168.17.128:7001 192.168.17.128:7002
#以远程的方式创建Redis-cluster集群
>>> Creating cluster
>>> Performing hash slots allocation on 3 nodes...
Using 3 masters:
192.168.17.128:7000
192.168.17.128:7001
192.168.17.128:7002
M: 2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 192.168.17.128:7000
slots:0-5460 (5461 slots) master
M: d5d6028eb3642590d72449f9fd050790cf4adb6b 192.168.17.128:7001
slots:5461-10922 (5462 slots) master
M: aaa7721d29411e686a3eb0bbe64b92e80875f7e2 192.168.17.128:7002
slots:10923-16383 (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...
>>> Performing Cluster Check (using node 192.168.17.128:7000)
M: 2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 192.168.17.128:7000
slots:0-5460 (5461 slots) master
0 additional replica(s)
M: d5d6028eb3642590d72449f9fd050790cf4adb6b 192.168.17.128:7001
slots:5461-10922 (5462 slots) master
0 additional replica(s)
M: aaa7721d29411e686a3eb0bbe64b92e80875f7e2 192.168.17.128:7002
slots:10923-16383 (5461 slots) master
0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#创建成功
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 127.0.0.1 -c -p 7000 set zhang 66
OK
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 127.0.0.1 -c -p 7001 set zhang 66
OK
#本地可以访问
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 192.168.17.128 -c -p 7000 get zhang
"66"
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 192.168.17.128 -c -p 7001 get zhang
"66"
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 192.168.17.128 -c -p 7002 get zhang
"66"
#远程也可以访问
#大量写入数据到Redis-cluster集群
[root@ZhangSiming ruby-2.2.7]# for line in `seq -w 10000`;do redis-cli -h 192.168.17.128 -p 7000 -c set key3_${line} value_${line};done
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 192.168.17.128 -p 7000 info Keyspace
# Keyspace
db0:keys=3337,expires=0,avg_ttl=0
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 192.168.17.128 -p 7001 info Keyspace
# Keyspace
db0:keys=3354,expires=0,avg_ttl=0
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 192.168.17.128 -p 7002 info Keyspace
# Keyspace
db0:keys=3310,expires=0,avg_ttl=0
#可见,几乎是平均存储的,权重相同
#和master服务器上一样的配置,然后启动slave服务器的三个Redis实例
[root@ZhangSiming ruby-2.2.7]# redis-server /data/redis-cluster/7000/redis.conf
[root@ZhangSiming ruby-2.2.7]# redis-server /data/redis-cluster/7001/redis.conf
[root@ZhangSiming ruby-2.2.7]# redis-server /data/redis-cluster/7002/redis.conf
[root@ZhangSiming ruby-2.2.7]# netstat -antup | grep redis
tcp 0 0 0.0.0.0:7000 0.0.0.0:* LISTEN 32109/redis-server
tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 32114/redis-server
tcp 0 0 0.0.0.0:7002 0.0.0.0:* LISTEN 32119/redis-server
[root@ZhangSiming ruby-2.2.7]# /usr/local/redis/bin/redis-trib.rb add-node --slave 192.168.17.138:7000 192.168.17.128:7000
#添加主从对应关系
>>> Adding node 192.168.17.138:7000 to cluster 192.168.17.128:7000
>>> Performing Cluster Check (using node 192.168.17.128:7000)
M: 2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 192.168.17.128:7000
slots:0-5460 (5461 slots) master
0 additional replica(s)
M: d5d6028eb3642590d72449f9fd050790cf4adb6b 192.168.17.128:7001
slots:5461-10922 (5462 slots) master
0 additional replica(s)
M: aaa7721d29411e686a3eb0bbe64b92e80875f7e2 192.168.17.128:7002
slots:10923-16383 (5461 slots) master
0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Automatically selected master 192.168.17.128:7000
>>> Send CLUSTER MEET to node 192.168.17.138:7000 to make it join the cluster.
Waiting for the cluster to join.
>>> Configure node as replica of 192.168.17.128:7000.
[OK] New node added correctly.
#同理添加剩下两个端口的主从对应
[root@ZhangSiming ruby-2.2.7]# redis-cli -p 7000 cluster nodes
2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 192.168.17.128:7000@17000 myself,master - 0 1549810051000 1 connected 0-5460
39de9ac7abd1e4d06622ecdd7b4cb8070258a59b 192.168.17.138:7001@17001 slave d5d6028eb3642590d72449f9fd050790cf4adb6b 0 1549810049402 2 connected
d5d6028eb3642590d72449f9fd050790cf4adb6b 192.168.17.128:7001@17001 master - 0 1549810051412 2 connected 5461-10922
f63f39b84221052d69c37c398c6743ff9326e214 192.168.17.138:7000@17000 slave 2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 0 1549810050000 1 connected
95839bc0c056879b36d4e3b992938dec546d3aeb 192.168.17.138:7002@17002 slave aaa7721d29411e686a3eb0bbe64b92e80875f7e2 0 1549810050406 3 connected
aaa7721d29411e686a3eb0bbe64b92e80875f7e2 192.168.17.128:7002@17002 master - 0 1549810049000 3 connected 10923-16383
#已成功添加三对主从同步
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 192.168.17.138 -c -p 7000
192.168.17.138:7000> set hahaha 111
-> Redirected to slot [12185] located at 192.168.17.128:7002
OK
192.168.17.128:7002> get hahaha
"111"
#连接一个远程的从库,我们发现Redis-cluster从库也可以写操作了;这就比普通的redis主从复制好,因为普通的主从复制从库只可以读不可以写
当然,Redis-cluster主从同步的key的分布也是等权重的。
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 127.0.0.1 -p 7000 shutdown
#关闭.128地址的7000端口master
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 127.0.0.1 -p 7001 cluster nodes
39de9ac7abd1e4d06622ecdd7b4cb8070258a59b 192.168.17.138:7001@17001 slave d5d6028eb3642590d72449f9fd050790cf4adb6b 0 1549810609000 2 connected
aaa7721d29411e686a3eb0bbe64b92e80875f7e2 192.168.17.128:7002@17002 master - 0 1549810611000 3 connected 10923-16383
d5d6028eb3642590d72449f9fd050790cf4adb6b 192.168.17.128:7001@17001 myself,master - 0 1549810610000 2 connected 5461-10922
f63f39b84221052d69c37c398c6743ff9326e214 192.168.17.138:7000@17000 master - 0 1549810611723 4 connected 0-5460
#.138地址的7000端口提升为了master
95839bc0c056879b36d4e3b992938dec546d3aeb 192.168.17.138:7002@17002 slave aaa7721d29411e686a3eb0bbe64b92e80875f7e2 0 1549810610718 3 connected
2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 192.168.17.128:7000@17000 master,fail - 1549810559671 1549810557359 1 disconnected
#被我们手动down掉的变为了slave
[root@ZhangSiming ruby-2.2.7]# redis-server /data/redis-cluster/7000/redis.conf
#重新启动.128,7000端口
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 127.0.0.1 -p 7000 cluster nodes
95839bc0c056879b36d4e3b992938dec546d3aeb 192.168.17.138:7002@17002 slave aaa7721d29411e686a3eb0bbe64b92e80875f7e2 0 1549810732314 3 connected
2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 192.168.17.128:7000@17000 myself,slave f63f39b84221052d69c37c398c6743ff9326e214 0 1549810732000 1 connected
#重启启动后.128本地还是slave,没有自动提升到master
d5d6028eb3642590d72449f9fd050790cf4adb6b 192.168.17.128:7001@17001 master - 0 1549810731309 2 connected 5461-10922
f63f39b84221052d69c37c398c6743ff9326e214 192.168.17.138:7000@17000 master - 0 1549810731000 4 connected 0-5460
aaa7721d29411e686a3eb0bbe64b92e80875f7e2 192.168.17.128:7002@17002 master - 0 1549810732000 3 connected 10923-16383
39de9ac7abd1e4d06622ecdd7b4cb8070258a59b 192.168.17.138:7001@17001 slave d5d6028eb3642590d72449f9fd050790cf4adb6b 0 1549810733321 2 connected
#需要我们手动切换
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 127.0.0.1 -c -p 7000 cluster failover
OK
#手动切换回来
[root@ZhangSiming ruby-2.2.7]# redis-cli -h 127.0.0.1 -p 7001 cluster nodes
39de9ac7abd1e4d06622ecdd7b4cb8070258a59b 192.168.17.138:7001@17001 slave d5d6028eb3642590d72449f9fd050790cf4adb6b 0 1549810911340 2 connected
aaa7721d29411e686a3eb0bbe64b92e80875f7e2 192.168.17.128:7002@17002 master - 0 1549810912345 3 connected 10923-16383
d5d6028eb3642590d72449f9fd050790cf4adb6b 192.168.17.128:7001@17001 myself,master - 0 1549810909000 2 connected 5461-10922
f63f39b84221052d69c37c398c6743ff9326e214
#又变回master了,切换成功
192.168.17.138:7000@17000 slave 2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 0 1549810910000 5 connected
95839bc0c056879b36d4e3b992938dec546d3aeb 192.168.17.138:7002@17002 slave aaa7721d29411e686a3eb0bbe64b92e80875f7e2 0 1549810910000 3 connected
2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 192.168.17.128:7000@17000 master - 0 1549810910334 5 connected 0-5460
运维需求,根据dump.rdb文件分析key和key的大小,通过rdbtools分析工具实现。
[root@ZhangSiming ruby-2.2.7]# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1662k 100 1662k 0 0 21158 0 0:01:20 0:01:20 --:--:-- 20303
[root@ZhangSiming ruby-2.2.7]# python get-pip.py
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Collecting pip
Downloading https://files.pythonhosted.org/packages/d7/41/34dd96bd33958e52cb4da2f1bf0818e396514fd4f4725a79199564cd0c20/pip-19.0.2-py2.py3-none-any.whl (1.4MB)
100% |████████████████████████████████| 1.4MB 7.6kB/s
Collecting setuptools
Downloading https://files.pythonhosted.org/packages/d1/6a/4b2fcefd2ea0868810e92d519dacac1ddc64a2e53ba9e3422c3b62b378a6/setuptools-40.8.0-py2.py3-none-any.whl (575kB)
100% |████████████████████████████████| 583kB 17kB/s
Collecting wheel
Downloading https://files.pythonhosted.org/packages/ff/47/1dfa4795e24fd6f93d5d58602dd716c3f101cfd5a77cd9acbe519b44a0a9/wheel-0.32.3-py2.py3-none-any.whl
Installing collected packages: pip, setuptools, wheel
Successfully installed pip-19.0.2 setuptools-40.8.0 wheel-0.32.3
[root@ZhangSiming ruby-2.2.7]# which pip
/usr/bin/pip
#根据官网提示安装pip
[root@ZhangSiming ruby-2.2.7]# pip install rdbtools
#使用安装的pip安装rdb工具
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
Collecting rdbtools
Downloading https://files.pythonhosted.org/packages/16/2d/0389de4b615dfe456715444d2c56ff538cf9bf5b1df87ac2ab558064e52d/rdbtools-0.1.14.tar.gz
Collecting redis (from rdbtools)
Downloading https://files.pythonhosted.org/packages/f1/19/a0282b77c23f9f9dbcc6480787a60807c78a45947593a02dbf026636c90d/redis-3.1.0-py2.py3-none-any.whl (63kB)
100% |████████████████████████████████| 71kB 212kB/s
Building wheels for collected packages: rdbtools
Building wheel for rdbtools (setup.py) ... done
Stored in directory: /root/.cache/pip/wheels/a2/82/f1/0583362b80af95f5b6f4aa81f7d163d06fd467c9094bdb0ee5
Successfully built rdbtools
Installing collected packages: redis, rdbtools
Successfully installed rdbtools-0.1.14 redis-3.1.0
[root@ZhangSiming ruby-2.2.7]# which rdb
/usr/bin/rdb
#安装成功
[root@ZhangSiming ruby-2.2.7]# rdb -c memory /data/redis-cluster/7000/dump.rdb > /root/memory.csv
WARNING: python-lzf package NOT detected. Parsing dump file will be very slow unless you install it. To install, run the following command:
pip install python-lzf
#把key的信息导入到/root/memory.csv中方便分析
[root@ZhangSiming ruby-2.2.7]# cat /root/memory.csv | head
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element,expiry
0,string,key3_06000,72,string,11,11,
0,string,key3_01610,72,string,11,11,
0,string,key3_08476,72,string,11,11,
0,string,key3_02475,72,string,11,11,
0,string,key3_00892,72,string,11,11,
0,string,key3_03354,72,string,11,11,
0,string,key3_00036,72,string,11,11,
0,string,key3_05125,72,string,11,11,
0,string,key3_00002,72,string,11,11,
[root@ZhangSiming ruby-2.2.7]# cat /root/memory.csv | tr ',' ' ' | sort -k4n | head
database type key size_in_bytes encoding num_elements len_largest_element expiry
0 string key3_00002 72 string 11 11
0 string key3_00003 72 string 11 11
0 string key3_00006 72 string 11 11
0 string key3_00007 72 string 11 11
0 string key3_00010 72 string 11 11
0 string key3_00014 72 string 11 11
0 string key3_00018 72 string 11 11
0 string key3_00020 72 string 11 11
0 string key3_00021 72 string 11 11
#优化排版,分析key