redis环境搭建,单机,主从,哨兵,集群

一、环境准备

准备三台虚拟机centOS7服务器,redis安装包redis-6.0.3.tar.gz,java开发环境[用于测试]
我的三台服务器ip地址192.168.42.101;192.168.42.102;192.168.42.103

二、单机安装

2.1 前置安装检查
yum -y install cpp gcc make binutils glibc-kernheaders glibc-common glibc-devel
2.2 安装包下载
wget http://download.redis.io/releases/redis-6.0.3.tar.gz
2.3 本机编译环境准备
安装新版本redis,需要升级到gcc9,不然会编译失败

2.3.1 gcc -v   查看版本,centos7默认4.8.5


2.3.2 安装scl和gcc编译环境
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash 临时启用gcc9编译
若永久修改则需要修改环境变量:echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
再次gcc -v 如下图

2.4 redis安装
tar -vxzf redis-6.0.3.tar.gz   解压
mv redis-6.0.3 redis            重命名文件夹
mv redis-6.0.3.tar.gz redis  将压缩包移入redis安装包,备用
cd redis                               进入文件夹
make && make install         编译安装
如下图,显示Hint: It's a good idea to run 'make test' ;) 则安装成功

2.5 配置文件修改
vim redis.conf       使用vim工具编辑配置文件
/protected              找到protected-mode 修改为no,注释掉上面的bind127.0.0.1
requirepass 1234  如需添加密码 找到requirepass foobared,在下面设置密码,如1234
2.6 登录
redis-server redis.conf &                       启动redis服务
redis-cli -h 192.168.42.101 -p 6379 -a 1234[密码]      启动redis客户端

三、主从搭建
主从场景一般分为一主一从、一主多从和树状主从,本文设置为一主两从,101master,102和103为slave

在102和103两个服务器上完成单机步骤的搭建,设置密码为1234
三台服务器的redis.conf最后加上如下三行配置,主服务注释掉第一行。中文为该配置解释,需要删除或者放到下一行

slaveof 192.168.42.101 6379 #本机作为从节点,指定连接的主节点地址
slave-read-only yes     #从节点设置只读[可选]
masterauth 1234         #连接主节点的密码

分别启动三台服务,如图,101服务设置的值可以被102服务读取。102服务redis设置了只读权限,因此无法写入。

info replication          查看主从服务状态

四、哨兵模式
哨兵其实是对三中主从配置的一种增强或者说是主从的高可用配置,主从模式中,当主服务挂了时需要人工修改配置设置新的主
4.1 哨兵模式配置运行
基于主从的配置修改
vim sentinel.conf 修改哨兵配置文件
/sentinel monitor mymaster 127.0.0.1 6379 2 #找到该行默认配置并注释,在下面添加两行自定义配置如下:
192.168.42.101 6379 2代表初始化时master服务的地址,后面的2代表有两个哨兵确认master宕机才客观下线,进行故障转移
mymaster 1234代表连接master的密码

#sentinel monitor mymaster 127.0.0.1 6379 2
sentinel monitor mymaster 192.168.42.101 6379 2
sentinel auth-pass mymaster 1234

redis-sentinel sentinel.conf  启动哨兵
查看进程是否正常启动

使用java代码测试连接

//创建一个java项目,引入jedis
        <dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.9.0</version>
		</dependency>
//测试代码如下
public class JedisSentinel {
	@Test
	public void testJedis() {
		Set<String> sentinels = new HashSet<String>();
		String hostAndPort1 = "192.168.42.101:26379";
		String hostAndPort2 = "192.168.42.102:26379";
		String hostAndPort3 = "192.168.42.103:26379";
		String clusterName = "mymaster";
		String password = "1234";
		sentinels.add(hostAndPort1);
		sentinels.add(hostAndPort2);
		sentinels.add(hostAndPort3);
		JedisSentinelPool redisSentinelJedisPool = new JedisSentinelPool(clusterName, sentinels, password);
		try {
			Jedis jedis = redisSentinelJedisPool.getResource();
			jedis.set("name", "cheng11111");
			System.out.println(jedis.get("name"));
		} catch (Exception e) {
			e.printStackTrace();
		}
		redisSentinelJedisPool.close();
	}
}

 4.2 哨兵模式 master崩溃模拟
kill掉master进程[101],哨兵会自行选举出新的主

登录redis查看,发现103成为了master,只有一个slave[102服务器]

重启101的redis,发现101成为了slave,如下图[面试题:redis哨兵,master挂了后重启会不会还是master]

查看redis.conf 最后几行,发现slaveof 192.168.42.101 6379变成replicaof 192.168.42.103 6379

查看sentinel.conf最后几行


五、RedisCluster集群
集群搭建是区别于哨兵的另外一种高可用模式。哨兵模式下每个节点都是全量存储数据,当数据量足够大时,我们需要通过扩展服务器来实现扩容,即a、b、c三份数据存在三台不同的服务器上。集群主要作用就是分离数据
5.1 配置文件准备
准备单机的配置文件6份(101/102/103每台服务配置文件各复制两份,端口分别为6380 6381)
cp redis.conf redis6380.conf    
vim redis6380.conf
5.1.1 / bgsave_cpulist  定位到文档最后,删除后面的几行配置,这是哨兵自动添加关于主从的配置。slaveof/masterauth/replicaof/user default
或者重新解压redis使用全新新配置文件,配置同单机。修改protected-mode=no,注释掉上面的bind127.0.0.1
5.1.2 注释掉 requirepass  有密码集群构建时会报错,如下图

5.1.3 /cluster-enabled yes 打开该行注释,否则redis将以非cluster模式启动,无法构建redisCluster集群
5.1.4 / 6379 相关端口改成当前配置文件的端口,端口/cluster配置文件/pid文件 也可以根据名字直接搜索如下:
[port][cluster-config-file nodes-6379.conf] [pidfile "/var/run/redis_6379.pid"]
分别启动6个redis服务,查看启动状态如下图 cluster:

5.2 集群构建
5.2.1 清空数据
如果redis存在数据使用flushall 清空redis的数据[生产环境禁用],可以删除本目录的rdb/aof文件再启动,不然会自动加载
5.2.2 构建集群 redis-cli --cluster create 192.168.42.101:6380 192.168.42.102:6380 192.168.42.103:6380 192.168.42.101:6381 192.168.42.102:6381 192.168.42.103:6381 --cluster-replicas 1
和老版的redis命令使用方式相似,不过不需要使用ruby,新版的redis使用c语言重写了,整合在redis-cli --cluster 命令里。
redis-cli --cluster create ... --cluster-replicas 1 [1代表一个从,上述语句为三主三从,6380为主,6381为从。
此处为模拟,生产环境每一个端口都应该是一个独立的服务器],如下界面代表集群构建成功[注意!!!16384slots]

5.2.3 检测集群 redis-cli --cluster check 192.168.42.101:6380

5.2.4 查看集群 cluster nodes

5.3 代码测试
5.3.1 构建项目,使用如下代码

@Test
    public void testBasic() throws IOException{
    	Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
        jedisClusterNodes.add(new HostAndPort("192.168.42.101", 6380));
        jedisClusterNodes.add(new HostAndPort("192.168.42.102", 6380));
        jedisClusterNodes.add(new HostAndPort("192.168.42.103", 6380));
        jedisClusterNodes.add(new HostAndPort("192.168.42.101", 6381));
        jedisClusterNodes.add(new HostAndPort("192.168.42.102", 6381));
        jedisClusterNodes.add(new HostAndPort("192.168.42.103", 6381));
        JedisCluster jc = new JedisCluster(jedisClusterNodes);
        jc.set("cheng", "long");
        System.out.println("set successful!!");
        String value = jc.get("cheng");
        System.out.println(value);
        jc.close();
    }

5.3.2 登录集群查看结果

redis-cli -h 192.168.42.101 -p 6380 -c  [注意结尾-c,代表cluster模式]

5.4 新增节点
5.4.1 准备两个新的redis服务节点
cp redis6380.conf
在101服务器 复制两份配置文件重命名为redis6390.conf/redis6391.conf
/6380   将端口相关修改成新的端口
分别启动两个服务,查看进程如下

5.4.2 新增主节点
和任意一个已存在的节点握手绑定


5.4.3新增从节点
redis-cli --cluster add-node 192.168.42.101:6391 192.168.42.101:6390 --cluster-slave --cluster-master-id

查看节点状态,我们看到新的master节点是没有被分配槽的

5.4.4 分配hash槽
redis-cli --cluster reshard 192.168.42.101:6390 --cluster-from 011cfa64cb93525e4cac5b3ca85267b807e762d2,5300228cd8579f75d4b070a7a93f678664f53604,1a2dd68db514855d452f7afc10cd770683cb35f8 --cluster-to 0f77668c52045eb887433a0a7ee4b8981748f7ed --cluster-slots 4096 --cluster-yes
--cluster-from:表示当前拥有slot的节点id,多个ID用逗号分隔
--cluster-to:待分配节点的id
--cluster-slots:分配的slot数量
再次查看节点状态

5.5 移除节点
5.5.1 移除从节点
redis-cli --cluster del-node 192.168.42.101:6391 39bd88efc63bb0c56a733ef40d763b1ae84f76b7

5.5.2 移除主节点 hash槽
redis-cli --cluster reshard 192.168.42.101:6390 --cluster-from 0f77668c52045eb887433a0a7ee4b8981748f7ed --cluster-to 011cfa64cb93525e4cac5b3ca85267b807e762d2 --cluster-slots 4096 --cluster-yes
接受分配的id只能是一个,多个会报不存在该id或者该id不是master的错误
5.5.3 删除主节点
redis-cli --cluster del-node 192.168.42.101:6390 0f77668c52045eb887433a0a7ee4b8981748f7ed
再次查看节点状态

5.6 集群其他命令
redis-cli --cluster help


最后记得给集群服务添加密码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值