Linux is not Matrix——redis集群搭建

  redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

  然而上面写的那些东西都是从百度百科抄来的- -。

  总结一下就是,redis是一个Key value型的数据库,所有redis的数据全都存在服务器的内存中,类似于memcache,并且支持更多的数据类型,目前官方已经推出了集群搭建方案。

  好,之前一直都有人跟我要这玩意,我就写写了。

  首先上redis的官方网站下载最新的redis源码包,一定是3.0之后的,因为是这个版本加入的集群功能。

  wget http://download.redis.io/releases/redis-3.0.7.tar.gz

 
  解压,tar命令,我就不写了。 

  然后我们先安装编译需要的gcc,然后执行编译。

  yum install gcc

 
  直接使用make && make install编译可能会报这个错误。 

  zmalloc.h:50:31: 错误:jemalloc/jemalloc.h:没有那个文件或目录    

  zmalloc.h:55:2: 错误:#error "Newer version of jemalloc required"

  这个时候我们需要执行别的编译命令。

  Make MALLOC=libc

 
  执行完成之后,我们就可以先启动一下redis试试了,进入src目录,直接执行./redis-server就可以了。 

  如果看到下面这个就算是启动成功了。

  成功了之后,可以看到我们的启动端口是6379,这个是可以通过指定配置文件来修改的,我们就来制定以下集群需要的配置文件。

  在src目录下就可以,新建一个文件交redis.conf,文件内容写成这个样。

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
  这里就是一些搭建集群的基本设定,而且我将端口改成了7000。

  好了,现在我们缺的就是6个同样的redis服务了,官方给的方案中推荐需要六个redis才能组成集群,三主三从,redis集群采用了数据分片的技术,节点 A 包含 0 到 5500号哈希槽,节点 B 包含5501 到 11000 号哈希槽,节点 C 包含11001 到 16384号哈希槽。如果节点B机器瘫了的话,那么5501到11000号槽位都不可用,也就是这些数据都没了,所以才有了三个从节点,这个时候如果B瘫了,B的从节点将会继续提供服务。

  我这里采用的6个虚拟机来模拟一下。

  假设我现在6个虚拟机的IP是179到184。我在每个虚拟机上都复制了一份刚才那种设定的配置文件和编译完成之后的文件,并且6个虚拟机互相之间能通信。

  创建集群。

./redis-trib.rb create --replicas 1 192.168.21.179:7000 192.168.21.180:7000 192.168.21.181:7000 192.168.21.182:7000 192.168.21.183:7000 192.168.21.184:7000
 后面会显示一大堆信息,大概就是创建集群的一些信息。

>>> Creating cluster
Connecting to node 192.168.21.179:7000: OK
Connecting to node 192.168.21.180:7000: OK
Connecting to node 192.168.21.181:7000: OK
Connecting to node 192.168.21.182:7000: OK
Connecting to node 192.168.21.183:7000: OK
Connecting to node 192.168.21.184:7000: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.21.179:7000
192.168.21.180:7000
192.168.21.181:7000
Adding replica 192.168.21.182:7000 to 192.168.21.179:7000
Adding replica 192.168.21.183:7000 to 192.168.21.180:7000
Adding replica 192.168.21.184:7000 to 192.168.21.181:7000
M: 254696f3918c6edaf71791e9afc1238f9fdd6c5a 192.168.21.179:7000
   slots:0-5460 (5461 slots) master
M: 937d2a1d9c6413766822681f39a752325a0fe5d8 192.168.21.180:7000
   slots:5461-10922 (5462 slots) master
M: 98cded3e87343076df271b3900eb227e3e68219d 192.168.21.181:7000
   slots:10923-16383 (5461 slots) master
S: b0785ca5d6d2d6bf0be5557ec699027d7d728141 192.168.21.182:7000
   replicates 254696f3918c6edaf71791e9afc1238f9fdd6c5a
S: 447340503107c902c0fb0759835600323b3b7d67 192.168.21.183:7000
   replicates 937d2a1d9c6413766822681f39a752325a0fe5d8
S: 83a9baf65210cae50a381bade28681c13e777d09 192.168.21.184:7000
   replicates 98cded3e87343076df271b3900eb227e3e68219d
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
2695:M 08 Dec 22:16:55.119 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
>>> Sending CLUSTER MEET messages to join the cluster
2695:M 08 Dec 22:16:55.174 # IP address for this node updated to 192.168.21.179
Waiting for the cluster to join....2695:M 08 Dec 22:17:00.134 # Cluster state changed: ok


>>> Performing Cluster Check (using node 192.168.21.179:7000)
M: 254696f3918c6edaf71791e9afc1238f9fdd6c5a 192.168.21.179:7000
   slots:0-5460 (5461 slots) master
M: 937d2a1d9c6413766822681f39a752325a0fe5d8 192.168.21.180:7000
   slots:5461-10922 (5462 slots) master
M: 98cded3e87343076df271b3900eb227e3e68219d 192.168.21.181:7000
   slots:10923-16383 (5461 slots) master
M: b0785ca5d6d2d6bf0be5557ec699027d7d728141 192.168.21.182:7000
   slots: (0 slots) master
   replicates 254696f3918c6edaf71791e9afc1238f9fdd6c5a
M: 447340503107c902c0fb0759835600323b3b7d67 192.168.21.183:7000
   slots: (0 slots) master
   replicates 937d2a1d9c6413766822681f39a752325a0fe5d8
M: 83a9baf65210cae50a381bade28681c13e777d09 192.168.21.184:7000
   slots: (0 slots) master
   replicates 98cded3e87343076df271b3900eb227e3e68219d
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost cluster-test]# 2695:M 08 Dec 22:17:02.247 * Slave 192.168.21.182:7000 asks for synchronization
2695:M 08 Dec 22:17:02.247 * Full resync requested by slave 192.168.21.182:7000
2695:M 08 Dec 22:17:02.247 * Starting BGSAVE for SYNC with target: disk
2695:M 08 Dec 22:17:02.247 * Background saving started by pid 2701
2701:C 08 Dec 22:17:02.249 * DB saved on disk
2701:C 08 Dec 22:17:02.250 * RDB: 0 MB of memory used by copy-on-write
2695:M 08 Dec 22:17:02.339 * Background saving terminated with success
2695:M 08 Dec 22:17:02.340 * Synchronization with slave 192.168.21.182:7000 succeeded
  出现这个就表示集群创建成功了。我们可以使用redis-cli来连接一下集群中的一个主节点来测试一下。

./redis-cli -c -h 192.168.21.179 -p 7000

192.168.21.179:7000> set foo bar
-> Redirected to slot [12182] located at 192.168.21.181:7000
OK
192.168.21.181:7000> set hello world
-> Redirected to slot [866] located at 192.168.21.179:7000
OK
192.168.21.179:7000> set key value
-> Redirected to slot [12539] located at 192.168.21.181:7000
OK
192.168.21.181:7000> set kuro sesei
-> Redirected to slot [1863] located at 192.168.21.179:7000
OK
192.168.21.179:7000> get hello
"world"
192.168.21.179:7000> get foo
-> Redirected to slot [12182] located at 192.168.21.181:7000
"bar"
  好了,这样看起来,我们从179set一个数据,他会使用哈希算法放到181上面,这个时候如果我们关闭181,那么181的从节点将会代替181成为主节点,get数据也会get到。
  that's all

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值