@zhangsiming65965
2019-02-14T03:22:52.000000Z
字数 16749
阅读 214
云计算
如果有梦想,就放开的去追;
因为只有奋斗,才能改变命运。
[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.confcluster-enabled yesport 7000pidfile "/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 redistcp 0 0 0.0.0.0:7000 0.0.0.0:* LISTEN 2005/redis-server 0tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 2010/redis-server 0tcp 0 0 0.0.0.0:7002 0.0.0.0:*#启动成功
[root@ZhangSiming ~]# lsanaconda-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 --versionruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-linux]#编译安装成功[root@ZhangSiming ruby-2.2.7]# /usr/local/bin/gem install redisFetching: redis-4.1.0.gem (100%)Successfully installed redis-4.1.0Parsing documentation for redis-4.1.0Installing ri documentation for redis-4.1.0Done installing documentation for redis after 2 seconds1 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:7000127.0.0.1:7001127.0.0.1:7002M: d2a7c90c060f1af1a3455c0f7fe125c2381f6e85 127.0.0.1:7000slots:0-5460 (5461 slots) masterM: 8869a51897e65ae056eda34f7c46f34c0b564b4a 127.0.0.1:7001slots:5461-10922 (5462 slots) masterM: 3317575b248992940744b22438ac7dbaab4da258 127.0.0.1:7002slots:10923-16383 (5461 slots) masterCan 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 clusterWaiting for the cluster to join..>>> Performing Cluster Check (using node 127.0.0.1:7000)M: d2a7c90c060f1af1a3455c0f7fe125c2381f6e85 127.0.0.1:7000slots:0-5460 (5461 slots) master0 additional replica(s)M: 8869a51897e65ae056eda34f7c46f34c0b564b4a 127.0.0.1:7001slots:5461-10922 (5462 slots) master0 additional replica(s)M: 3317575b248992940744b22438ac7dbaab4da258 127.0.0.1:7002slots:10923-16383 (5461 slots) master0 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 nodes8869a51897e65ae056eda34f7c46f34c0b564b4a 127.0.0.1:7001@17001 master - 0 1549808213336 2 connected 5461-109223317575b248992940744b22438ac7dbaab4da258 127.0.0.1:7002@17002 master - 0 1549808214342 3 connected 10923-16383d2a7c90c060f1af1a3455c0f7fe125c2381f6e85 127.0.0.1:7000@17000 myself,master - 0 1549808213000 1 connected 0-5460#集群有三个节点
#本地访问[root@ZhangSiming ruby-2.2.7]# redis-cli -c -p 7000127.0.0.1:7000> set zhangsiming 111-> Redirected to slot [14612] located at 127.0.0.1:7002OK#在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 zhangsimingCould not connect to Redis at 127.0.0.1:7002: Connection refusedCould 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 zhangsimingCould not connect to Redis at 127.0.0.1:7002: Connection refusedCould 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:7000192.168.17.128:7001192.168.17.128:7002M: 2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 192.168.17.128:7000slots:0-5460 (5461 slots) masterM: d5d6028eb3642590d72449f9fd050790cf4adb6b 192.168.17.128:7001slots:5461-10922 (5462 slots) masterM: aaa7721d29411e686a3eb0bbe64b92e80875f7e2 192.168.17.128:7002slots:10923-16383 (5461 slots) masterCan 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 clusterWaiting for the cluster to join...>>> Performing Cluster Check (using node 192.168.17.128:7000)M: 2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 192.168.17.128:7000slots:0-5460 (5461 slots) master0 additional replica(s)M: d5d6028eb3642590d72449f9fd050790cf4adb6b 192.168.17.128:7001slots:5461-10922 (5462 slots) master0 additional replica(s)M: aaa7721d29411e686a3eb0bbe64b92e80875f7e2 192.168.17.128:7002slots:10923-16383 (5461 slots) master0 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 66OK[root@ZhangSiming ruby-2.2.7]# redis-cli -h 127.0.0.1 -c -p 7001 set zhang 66OK#本地可以访问[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# Keyspacedb0:keys=3337,expires=0,avg_ttl=0[root@ZhangSiming ruby-2.2.7]# redis-cli -h 192.168.17.128 -p 7001 info Keyspace# Keyspacedb0:keys=3354,expires=0,avg_ttl=0[root@ZhangSiming ruby-2.2.7]# redis-cli -h 192.168.17.128 -p 7002 info Keyspace# Keyspacedb0: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 redistcp 0 0 0.0.0.0:7000 0.0.0.0:* LISTEN 32109/redis-servertcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 32114/redis-servertcp 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:7000slots:0-5460 (5461 slots) master0 additional replica(s)M: d5d6028eb3642590d72449f9fd050790cf4adb6b 192.168.17.128:7001slots:5461-10922 (5462 slots) master0 additional replica(s)M: aaa7721d29411e686a3eb0bbe64b92e80875f7e2 192.168.17.128:7002slots:10923-16383 (5461 slots) master0 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 nodes2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 192.168.17.128:7000@17000 myself,master - 0 1549810051000 1 connected 0-546039de9ac7abd1e4d06622ecdd7b4cb8070258a59b 192.168.17.138:7001@17001 slave d5d6028eb3642590d72449f9fd050790cf4adb6b 0 1549810049402 2 connectedd5d6028eb3642590d72449f9fd050790cf4adb6b 192.168.17.128:7001@17001 master - 0 1549810051412 2 connected 5461-10922f63f39b84221052d69c37c398c6743ff9326e214 192.168.17.138:7000@17000 slave 2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 0 1549810050000 1 connected95839bc0c056879b36d4e3b992938dec546d3aeb 192.168.17.138:7002@17002 slave aaa7721d29411e686a3eb0bbe64b92e80875f7e2 0 1549810050406 3 connectedaaa7721d29411e686a3eb0bbe64b92e80875f7e2 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 7000192.168.17.138:7000> set hahaha 111-> Redirected to slot [12185] located at 192.168.17.128:7002OK192.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 nodes39de9ac7abd1e4d06622ecdd7b4cb8070258a59b 192.168.17.138:7001@17001 slave d5d6028eb3642590d72449f9fd050790cf4adb6b 0 1549810609000 2 connectedaaa7721d29411e686a3eb0bbe64b92e80875f7e2 192.168.17.128:7002@17002 master - 0 1549810611000 3 connected 10923-16383d5d6028eb3642590d72449f9fd050790cf4adb6b 192.168.17.128:7001@17001 myself,master - 0 1549810610000 2 connected 5461-10922f63f39b84221052d69c37c398c6743ff9326e214 192.168.17.138:7000@17000 master - 0 1549810611723 4 connected 0-5460#.138地址的7000端口提升为了master95839bc0c056879b36d4e3b992938dec546d3aeb 192.168.17.138:7002@17002 slave aaa7721d29411e686a3eb0bbe64b92e80875f7e2 0 1549810610718 3 connected2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 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 nodes95839bc0c056879b36d4e3b992938dec546d3aeb 192.168.17.138:7002@17002 slave aaa7721d29411e686a3eb0bbe64b92e80875f7e2 0 1549810732314 3 connected2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 192.168.17.128:7000@17000 myself,slave f63f39b84221052d69c37c398c6743ff9326e214 0 1549810732000 1 connected#重启启动后.128本地还是slave,没有自动提升到masterd5d6028eb3642590d72449f9fd050790cf4adb6b 192.168.17.128:7001@17001 master - 0 1549810731309 2 connected 5461-10922f63f39b84221052d69c37c398c6743ff9326e214 192.168.17.138:7000@17000 master - 0 1549810731000 4 connected 0-5460aaa7721d29411e686a3eb0bbe64b92e80875f7e2 192.168.17.128:7002@17002 master - 0 1549810732000 3 connected 10923-1638339de9ac7abd1e4d06622ecdd7b4cb8070258a59b 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 failoverOK#手动切换回来[root@ZhangSiming ruby-2.2.7]# redis-cli -h 127.0.0.1 -p 7001 cluster nodes39de9ac7abd1e4d06622ecdd7b4cb8070258a59b 192.168.17.138:7001@17001 slave d5d6028eb3642590d72449f9fd050790cf4adb6b 0 1549810911340 2 connectedaaa7721d29411e686a3eb0bbe64b92e80875f7e2 192.168.17.128:7002@17002 master - 0 1549810912345 3 connected 10923-16383d5d6028eb3642590d72449f9fd050790cf4adb6b 192.168.17.128:7001@17001 myself,master - 0 1549810909000 2 connected 5461-10922f63f39b84221052d69c37c398c6743ff9326e214#又变回master了,切换成功192.168.17.138:7000@17000 slave 2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 0 1549810910000 5 connected95839bc0c056879b36d4e3b992938dec546d3aeb 192.168.17.138:7002@17002 slave aaa7721d29411e686a3eb0bbe64b92e80875f7e2 0 1549810910000 3 connected2ea8eddb9842a2a17e8b150c4c2b41720c82fa93 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 CurrentDload Upload Total Spent Left Speed100 1662k 100 1662k 0 0 21158 0 0:01:20 0:01:20 --:--:-- 20303[root@ZhangSiming ruby-2.2.7]# python get-pip.pyDEPRECATION: 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 pipDownloading https://files.pythonhosted.org/packages/d7/41/34dd96bd33958e52cb4da2f1bf0818e396514fd4f4725a79199564cd0c20/pip-19.0.2-py2.py3-none-any.whl (1.4MB)100% |████████████████████████████████| 1.4MB 7.6kB/sCollecting setuptoolsDownloading https://files.pythonhosted.org/packages/d1/6a/4b2fcefd2ea0868810e92d519dacac1ddc64a2e53ba9e3422c3b62b378a6/setuptools-40.8.0-py2.py3-none-any.whl (575kB)100% |████████████████████████████████| 583kB 17kB/sCollecting wheelDownloading https://files.pythonhosted.org/packages/ff/47/1dfa4795e24fd6f93d5d58602dd716c3f101cfd5a77cd9acbe519b44a0a9/wheel-0.32.3-py2.py3-none-any.whlInstalling collected packages: pip, setuptools, wheelSuccessfully 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 rdbtoolsDownloading https://files.pythonhosted.org/packages/16/2d/0389de4b615dfe456715444d2c56ff538cf9bf5b1df87ac2ab558064e52d/rdbtools-0.1.14.tar.gzCollecting 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/sBuilding wheels for collected packages: rdbtoolsBuilding wheel for rdbtools (setup.py) ... doneStored in directory: /root/.cache/pip/wheels/a2/82/f1/0583362b80af95f5b6f4aa81f7d163d06fd467c9094bdb0ee5Successfully built rdbtoolsInstalling collected packages: redis, rdbtoolsSuccessfully 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.csvWARNING: 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 | headdatabase,type,key,size_in_bytes,encoding,num_elements,len_largest_element,expiry0,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 | headdatabase type key size_in_bytes encoding num_elements len_largest_element expiry0 string key3_00002 72 string 11 110 string key3_00003 72 string 11 110 string key3_00006 72 string 11 110 string key3_00007 72 string 11 110 string key3_00010 72 string 11 110 string key3_00014 72 string 11 110 string key3_00018 72 string 11 110 string key3_00020 72 string 11 110 string key3_00021 72 string 11 11#优化排版,分析key