Redis主从与集群
Redis搭建主从服务
配置主服务器,然后利用该配置文件启动主服务器
1
2# 修改redis的配置文件中的bind绑定地址为服务器所在的地址
bind 192.168.85.129配置从服务器,然后利用该配置文件启动从服务器
1
2
3
4修改从服务器的配置文件slave.conf文件
bind 192.168.85.128
slaveof 192.168.85.129 6379
port 6379查看主从关系
1
redis-cli -h 192.168.85.129 -p 6379 info Republication
Redis集群搭建
背景
集群:是多台设备通过高速网路连接,并以同一的方式进行管理,共同对外提供服务。redis集群可以在一台机器上部署,也可以在多台机器上进行部署
Redis集群特点:
- Redis去中心化,每个节点都是平等的,每个节点都保存了各自数据和整个集群的状态,并且各个节点之间保持活跃,这样就保证只要连接到其中任意一个节点,都能够获取到所有节点的数据
- Redis集群中的数据存储通过CRC16算法来计算数据存放的位置。Redis集群中将存储分为16384个槽,每个存入的键值都存放于这些槽中,而我们存储的数据都需要通过CRC16算法来计算得出存放的节点,而不能人为设定
- Redis集群中会将数据存放于主节点中,然后主节点的从服务器与其数据同步,获取数据也只是获取主节点上的。只有当主节点挂了,这个时候该主节点的从服务器才会被启动充当主节点继续服务
- Redis集群必须要3个及3个以上的主节点才能够启动成功。当存活的节点数小于总节点数的一半的时候,redis集群就无法提供服务
搭建
安装依赖环境,redis集群依赖于ruby环境
1
sudo apt-get install ruby
如果下面创建redis出错时,可能是因为ruby安装的不是最新版的原因,可以通过以下更换源
1
2
3
4
5
6
7
8查看自己的gem源,若是https://rubyrems.org则需要更换
gem source -l
更换源为国内的
gem source --add https://gems.ruby-china.org/ --remove https://rubyrems.org
通过gem安装redis的相关依赖
sudo gem install redis在不同的服务器上依次创建对应的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17配置文件内容如下:
绑定端口, 果是同一台服务器,则端口号不能相同
port 6379
绑定IP
bind 192.168.85.129
后台运行
daemonize yes
运行以后进行的ID写入的文件,数字需要与port保持一致
pidfile 6379.pid
标识该redis服务允许成为一个集成节点
cluster-enabled yes
标识该Redis服务在集群中的一个配置文件,数字必须与port保持一致
cluster-config-file 6379_node.conf
标识连接节点的超时时间
cluster-node-timeout 15000
标识数据文件的追加
appendonly yes运行命令创建集群
1
2--cluster-replicas 1:表示每创建一个节点(主节点)的时候,都会为其分配一个从属服务器
redis-cli --cluster create 192.168.85.129:7000 192.168.85.129:7001 192.168.85.129:7002 --cluster-replicas 1测试数据连接认证
1
2-c:表示连接到集群
redis-cli -p [节点IP] -p [节点端口] -c
Redis集群与Python交互
安装环境
1
2
3由于redis-py-cluster与redis的包可能存在冲突,导致导入的时候会报错,因此需要注意版本搭配
目前已知版本搭配:redis==2.10.6,redis-py-cluster:1.3.6
pip install redis-py-cluster编写程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18from rediscluster import *
if __name__=="__main__":
try:
# 构建redis所有的服务器节点,Redis会根据CRC16算法,将键和值写在某个节点上
startup_nodes = [
{"host":"192.168.85.129", "port":7001},
{"host":"192.168.85.129", "port":7002},
{"host":"192.168.85.129", "port":7003},
]
# 构建StrictRedisCluster对象,用于操作redis数据库
src = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
result = src.set('key', 'value')
print(result)
name = src.get("name")
print(name)
except Exception as msg:
print(msg)