Centos 7 两台机器搭建三主三从的redis集群
阅读原文时间:2021年04月20日阅读:1

忠告:在学习搭建redis集群之前,先学会搭建单个的redis。上一篇我们就介绍了单个的redis搭建,有兴趣的朋友可以参照一下。

两台服务器,个启动三个实例,形成三主三从。

ip:    192.9.200.159   192.9.200.160

1、使用yum安装所需环境和工具。

    yum -y install wget vim tcl gcc make

2、下载redis并解压。

    cd /usr/local/        (本人用的是local目录,当然其他目录也是可以。)

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

    tar -zxf redis-3.2.x.tar.gz

    (也可以在网站上下载下来,然后上传解压,付网址:http://download.redis.io/releases/redis-3.2.5.tar.gz)

3、编译安装redis源文件

    cd /redis

    make    (若安装报错,可以改为这一句:make MALLOC=libc)

    make install

        (如果 /usr/local/bin/ 文件夹内没有 redis-server 那几个文件,就从 /usr/local/redis-3.2.8/src/ 中拷贝过去,命令:cp         redis-server redis-cli redis-sentinel redis-benchmark redis-check-aof redis-check-rdb /usr/local/bin/)

4、配置内核参数(可以省略)

    --配置 vm.overcommit_memory 为1,这可以避免数据被截断

        systcl -w vm.overcommit_memory=1

5、创建多实例的文件夹

    cd /usr/local/

    mkdir cluster

    cd cluster

    mkdir 7000 7001 7002

6、修改配置文件

    vim /usr/local/redis/redis.conf

    bind 192.9.200.159 (需要不同的服务器进行节点的联通,就不能设为127.0.0.1)

    protected-mode no (需要不同的服务器进行节点的联通,就不能设为yes)

    daemonize yes (设置后台运行redis)

    cluster-enabled yes(开启集群,把#去掉)

    cluster-node-timeout 15000 (设置请求超时时间,默认为15秒,可以自行修改)

    appendonly yes (aop日志开启,会每次进行写操作都记录一条日志)

    --根据不同的端口需要设置的地方

        port 7000

        pidfile /var/run/redis_7000.pid

        logfile /var/log/redis/redis_7000.log

        dbfilename dump_7000.rdb

        applendfilename "applendonly_7000.aof"

        cluster-config-file nodes_7000.conf

7、复制配置文件到各个实例文件夹,并且对相应的端口号和参数进行配置。

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

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

    cp -f /usr/local/redis/redis.conf   /usr/local/cluster/7002/

8、启动各个节点

    redis-server /usr/local/cluster/7000/redis.conf

    redis-server /usr/local/cluster/7001/redis.conf

    redis-server /usr/local/cluster/7002/redis.conf

    --使用ps -ef|grep redis | grep cluster查看是否都启动成功,ip和端口号是否都正确。

9、防火墙开通策略 (防火墙未开就不用配置)

    firewall-cmd --zone=public --add-port=7000-7002/tcp --permanent

    firewall-cmd --zone=public --add-port=17000-17002/tcp --permanent (必须开集群总线端口,集群总线端口=端口号 +10000,例:7000的集群总线端口是17000。这个集群总线端口不开放,集群的时候外部服务器的节点添加不进来)

===============================一条华丽的分割线=================================

        以上1-9的步骤在另一台服务器上也需要配置,另一台服务器端口可以设为7003,7004,7005,或者跟上面一样也可以

===============================一条华丽的分割线=================================

10、测试两台服务器是否都能 telnet 得通另一台的 7000~7002 和 17000~17002

    telnet -tlnp | grep redis 

    

11、安装ruby环境

    yum -y install ruby rubygems

12、跟新gem源

    gem sources -a http://ruby.taobao.org/

13、使用gem安装redis和ruby接口

    gem install redis (或者gem install redis --version3.2.x)

14、创建集群

    cd /usr/local/redis/src/

    (redis官方提供了redis-trib.rb 这个工具,就这解压目录src目录中,第3步中已将它复制到/usr/local/bin目录中,可以直接在命令行中使用。)

    redis-trib.rb create --replicas 1 192.9.200.159:7000 192.9.200.159:7001 192.9.200.159:7002 192.9.200.160:7000 192.9.200.160:7001 192.9.200.160:7002

    留意一下屏幕,会有一句(type 'yes' or accept),输入yes,回车。(意思是:接受自主分配三主三从)

    如果最后出现

       

        说明搭建成功。

    如果出现

        

        一直出现'…',说明另一台服务器的端口策略没通,一直在等那边的节点加入集群,O(∩_∩)O哈哈哈~~那么恭喜你,悲剧发生咯!!

15、验证集群

    在第一台服务器上连接集群的某一端口(7000)节点,在另一台服务器上连接某一端口(7002)节点,连接方式为:redis-cli -h 192.9.200.159 -c -p 7000 (加参数 -c 可以连接到集群,因为redis.conf将bind改为了ip地址,所以 -h 不可以省略)

    在7000节点上执行命令  set hello world

        

    在另一台服务器上7002节点执行命令查看kay为‘hello’的内容 get hello

        

       说明集群运行正常。

16、总结

    redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,每个节点都保存着各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些节点保持着活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

    redis集群并没有使用传统的一致性hash来分配数据,而是采用另外一种叫做hash槽(hash slot)的方式来进行分配。redis cluster默认分配了16384个槽,当我们set一个key时,会用CRC16算法来取模得到所属的slot,然后将这个key分配到hash slot区间的节点上,具体的算法就是:CRC16(key) %16384。

    redis集群会把数据存在一个master节点,然后在这个master和其对应的salve之间进行数据同步。当读取数据时,也根据一致性hash算法到对应的master节点获取数据。只有当一个master挂掉之后,才会启动一个对应的salve节点,充当master。

    值得注意的是:必须要3个以及以上的主节点,否则会创建集群不成功,并且当存活的主节点树小于总结点数一半的时候,整个集群就 无法提供服务了。