mysql redis 集群搭建_CentOS完美搭建Redis3.0集群并附测试

线上的统一聊天和推送项目使用的是Redis主从,redis版本2.8.6

redis主从和MySQL主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口:slaveof 192.168.1.197 6379,然后启动主从,主从就搭建好了redis主从中如果主节点发生故障,不会自动切换,需要借助redis的Sentinel或者keepalive来实现主的故障转移

redis集群是一个无中心的分布式redis存储架构,可以在多个节点之间进行数据共享,解决了redis高可用、可扩展等问题,redis集群提供了以下两个好处

1、将数据自动切分(split)到多个节点

2、当集群中的某一个节点故障时,redis还可以继续处理客户端的请求。

一个 Redis 集群包含 16384 个哈希槽(hash slot),数据库中的每个数据都属于这16384个哈希槽中的一个。集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽。集群中的每一个节点负责处理一部分哈希槽。

集群中的主从复制

集群中的每个节点都有1个至N个复制品,其中一个为主节点,其余的为从节点,如果主节点下线了,集群就会把这个主节点的一个从节点设置为新的主节点,继续工作。这样集群就不会因为一个主节点的下线而无法正常工作

下面开始搭建redis集群

由于最小的redis集群需要3个主节点,一台机器可运行多个redis实例,我搭建时使用两台机器,6个redis实例,其中三个主节点,三个从节点作为备份

网上很多使用单台服务器开6个端口,操作差不多,只是配置基本相对简单点,多台服务器更接近生产环境

redis 6个节点的ip和端口对应关系

server1:

192.168.1.198:7000

192.168.1.198:7001

192.168.1.198:7002

server2:

192.168.1.199:7003

192.168.1.199:7004

192.168.1.199:7005

1、安装需要的依赖包

[root@localhost ~]# yum install gcc gcc-c++ kernel-devel automake autoconf libtool make wget tcl vim ruby rubygems unzip git -y

2、两台机器分别下载redis并安装

[root@localhost src]# cd /usr/local/

[root@localhost local]# wget http://download.redis.io/releases/redis-3.0.6.tar.gz

[root@localhost local]# tar xzf redis-3.0.6.tar.gz

[root@localhost local]# cd redis-3.0.6

[root@localhost redis-3.0.6]# make

3、创建集群需要的目录

server1执行:

mkdir -p /usr/local/cluster

cd /usr/local/cluster

mkdir 7000

mkdir 7001

mkdir 7002server2执行:

mkdir -p /usr/local/cluster

cd /usr/local/cluster

mkdir 7003

mkdir 7004

mkdir 7005

4、修改配置文件redis.conf

cp /usr/local/redis-3.0.6/redis.conf  /usr/local/cluster

cd /usr/local/cluster

vi redis.conf

##注意每个实例的端口号不同

port 7000

daemonize yes

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

appendonly yes##修改完redis.conf配置文件中的这些配置项之后把这个配置文件分别拷贝到7000/7001/7002/7003/7004/7005节点目录下

server1执行:

cp /usr/local/cluster/redis.conf /usr/local/cluster/7000

cp /usr/local/cluster/redis.conf /usr/local/cluster/7001

cp /usr/local/cluster/redis.conf /usr/local/cluster/7002server2执行:

cp /usr/local/cluster/redis.conf /usr/local/cluster/7003

cp /usr/local/cluster/redis.conf /usr/local/cluster/7004

cp /usr/local/cluster/redis.conf /usr/local/cluster/7005##注意:拷贝完成之后要分别修改7001/7002/7003/7004/7005目录下面redis.conf文件中的port参数,分别改为对应的文件夹的名称

5、分别启动这6个redis实例,并查看是否成功:ps -ef|grep redis

server1执行:

[root@localhost cluster]# cd /usr/local/cluster/7000

[root@localhost 7000]# redis-server redis.conf

[root@localhost 7000]# cd /usr/local/cluster/7001

[root@localhost 7001]# redis-server redis.conf

[root@localhost 7001]# cd /usr/local/cluster/7002

[root@localhost 7002]# redis-server redis.conf

[root@localhost 7002]# ps -ef|grep redis

root      2741    1  0 09:39 ?        00:00:00 redis-server *:7000 [cluster]

root      2747    1  0 09:40 ?        00:00:00 redis-server *:7001 [cluster]

root      2751    1  0 09:40 ?        00:00:00 redis-server *:7002 [cluster]

root      2755  2687  0 09:40 pts/0    00:00:00 grep redisserver2执行:

[root@localhost cluster]# cd /usr/local/cluster/7003

[root@localhost 7003]# redis-server redis.conf

[root@localhost 7003]# cd /usr/local/cluster/7004

[root@localhost 7004]# redis-server redis.conf

[root@localhost 7004]# cd /usr/local/cluster/7005

[root@localhost 7005]# redis-server redis.conf

[root@localhost 7005]# ps -ef|grep redis

root      1619    1  0 09:40 ?        00:00:00 redis-server *:7003 [cluster]

root      1623    1  0 09:40 ?        00:00:00 redis-server *:7004 [cluster]

root      1627    1  0 09:41 ?        00:00:00 redis-server *:7005 [cluster]

root      1631  1563  0 09:41 pts/0    00:00:00 grep redis

6、执行redis的创建集群命令创建集群(注意ip地址和端口号)

[root@localhost cluster]# cd /usr/local/redis-3.0.6/src

[root@localhost src]# ./redis-trib.rb  create --replicas 1 192.168.1.198:7000 192.168.1.198:7001 192.168.1.198:7002 192.168.1.199:7003 192.168.1.199:7004 192.168.1.199:70056.1到这一步因为前面第1步装了依赖包,未提示ruby和rubygems的错误,但还是会报错,提示不能加载redis,是因为缺少redis和ruby的接口,使用gem 安装

错误内容:

/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)

from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'

from ./redis-trib.rb:25

解决:gem install redis

6.2 再次执行第6步的命令,正常执行,提示是否允许修改配置文件,输入yes,然后整个集群配置完成!

[root@localhost src]# ./redis-trib.rb  create --replicas 1 192.168.1.198:7000 192.168.1.198:7001 192.168.1.198:7002 192.168.1.199:7003 192.168.1.199:7004 192.168.1.199:7005

>>> Creating cluster

>>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

192.168.1.199:7003

192.168.1.198:7000

192.168.1.199:7004

Adding replica 192.168.1.198:7001 to 192.168.1.199:7003

Adding replica 192.168.1.199:7005 to 192.168.1.198:7000

Adding replica 192.168.1.198:7002 to 192.168.1.199:7004

M: 2f70e9f2b4a06a846e46d7034a54e0fe6971beea 192.168.1.198:7000

slots:5461-10922 (5462 slots) master

S: e60f49920cf8620927b200b0001892d08067d065 192.168.1.198:7001

replicates 02f1958bd5032caca2fd47a56362c8d562d7e621

S: 26101db06b5c2d4431ca8308cf43d51f6939b4fc 192.168.1.198:7002

replicates 6c4f18b9e8729c3ab5d43b00b0bc1e2ee976f299

M: 02f1958bd5032caca2fd47a56362c8d562d7e621 192.168.1.199:7003

slots:0-5460 (5461 slots) master

M: 6c4f18b9e8729c3ab5d43b00b0bc1e2ee976f299 192.168.1.199:7004

slots:10923-16383 (5461 slots) master

S: ebb27bd0a48b67a4f4e0584be27c1c909944e935 192.168.1.199:7005

replicates 2f70e9f2b4a06a846e46d7034a54e0fe6971beea

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.1.198:7000)

M: 2f70e9f2b4a06a846e46d7034a54e0fe6971beea 192.168.1.198:7000

slots:5461-10922 (5462 slots) master

M: e60f49920cf8620927b200b0001892d08067d065 192.168.1.198:7001

slots: (0 slots) master

replicates 02f1958bd5032caca2fd47a56362c8d562d7e621

M: 26101db06b5c2d4431ca8308cf43d51f6939b4fc 192.168.1.198:7002

slots: (0 slots) master

replicates 6c4f18b9e8729c3ab5d43b00b0bc1e2ee976f299

M: 02f1958bd5032caca2fd47a56362c8d562d7e621 192.168.1.199:7003

slots:0-5460 (5461 slots) master

M: 6c4f18b9e8729c3ab5d43b00b0bc1e2ee976f299 192.168.1.199:7004

slots:10923-16383 (5461 slots) master

M: ebb27bd0a48b67a4f4e0584be27c1c909944e935 192.168.1.199:7005

slots: (0 slots) master

replicates 2f70e9f2b4a06a846e46d7034a54e0fe6971beea

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

7、测试集群

server1上登录redis客户端并执行

[root@localhost src]# redis-cli -c -p 7000

127.0.0.1:7000> get key

-> Redirected to slot [12539] located at 192.168.1.199:7004

"val"

192.168.1.199:7004> set name test

-> Redirected to slot [5798] located at 192.168.1.198:7000

OK

192.168.1.198:7000> set adress shanghai

-> Redirected to slot [1562] located at 192.168.1.199:7003

OK

192.168.1.199:7003>server2上登录redis客户端并执行

[root@localhost src]# redis-cli -c -p 7003

127.0.0.1:7003> set key val

-> Redirected to slot [12539] located at 192.168.1.199:7004

OK

192.168.1.199:7004> get keyv

"val"

192.168.1.199:7004> set key2 val2

-> Redirected to slot [4998] located at 192.168.1.199:7003

OK

192.168.1.199:7003> get key2

"val2"

192.168.1.199:7003>

从中可以发现存时是分布式存储,取时也是从集群中取,测试成功

8、redis cluster 架构

1)redis-cluster架构图

d9f6264398cf26b763e4a454df01803b.png

架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.

(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护nodeslotvalue

2) redis-cluster选举:容错

fd86031cea81c01d070e47bc49287959.png

(1)领着选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.

(2):什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态.

b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

下面关于Redis的文章您也可能喜欢,不妨参考下:

Redis 的详细介绍:请点这里

Redis 的下载地址:请点这里

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值