目录
搭建redis cluster
- 使用的redis是5.0.14。在redis官网下载后传到服务器上
- 因为redis是c语言的写的,需要安装c语言环境。Yum install gcc。 gcc -v 可以看到信息证明安装成功
- 去到redis安装包目录tar zxf redis-5.0.14.tar.gz 解压,然后修改redis的文件夹名字 mv redis-5.0.14 redis。进到redis目录 使用make 命令进行安装
- 在redis目录下新建config文件夹(后面用来放各redis的conf。一个conf对应一个redis实例)。mkdir data6369、 mkdir data6370、mkdir data6371。新建了3个文件夹存不同实例的数据和文件(aof文件和logs日志)。这台机器上我准备使用以上3个端口启动3个实例所有建了对应3个端口的文件夹,拷贝redis目录下的redis.conf文件到config目录下.cp redis.conf config/redis6369.conf
- 然后修改redis6369.conf 文件配置
port 端口号
daemonize yes 后台启动 修改为yes
pidfile /var/run/redis_6369.pid pid文件对应的端口号方便区分
logfile "log6369.log" 日志文件,按端口号编写以便区分
dbfilename dump.rdb 备份文件
dir ./data6369 这个路径不太清楚,这样写的话是指定前面redis目录下data6369目录,该实例的文件及数据都存放在这个目录下
masterauth zyz
requirepass zyz 这两个设置密码 连接的时候要带上
appendonly yes 持久化aof方式
appendfilename "appendonly.aof" 持久化的文件存在dir对应目录下
# appendfsync always
appendfsync everysec 持久化aof 的间隔 默认是每秒
# appendfsync no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb aof文件重写对应的参数
aof-use-rdb-preamble yes 使用aof和rdb混合方式进行持久化
cluster-enabled yes
cluster-config-file nodes-6369.conf
cluster-node-timeout 15000 这3个参数为redis集群的设置 nodes-6369.conf 在集群创建
成功后会再dir目录下 记录的是节点信息(master和slave)
6、保存并退出,然后cp redis6369.conf redis6370.conf cp redis6369.conf redis6371.conf
因为我一个机器启动3个redis实例,所以再cp两份。然后编辑文件,使用”:%s/6369/6370/g” 进行统一替换。命令中6369是原字符串,6370是需要替换成的字符串
7、其它机器操作同上。
8、使用集群创建命令
src/redis-cli -a zyz --cluster create --cluster-replicas 2 172.16.14.10:6379 172.16.14.10:6380 172.16.14.10:6381 172.16.14.11:6389 172.16.14.11:6390 172.16.14.11:6391 172.16.14.15:6369 172.16.14.15:6370 172.16.14.15:6371
-a 后面跟到就是刚才conf设置的密码zyz ,--cluster-replicas 后面2 是表示一个节点有两个slave。
9、然后进到redis客户端 src/redis-cli -a zyz -c -h xxx.xxx.xx.xx -p xxxx (-c 集群模式。-h ip -p 端口号)。然后输入cluster info 可以看到cluster_state:ok(这个是集群状态,我的最开始是fail)。Cluster nodes 查看节点信息
遇到的问题(报错slots未分配完):
在创建集群的时候,出现了报错说slots未分配完。查看cluster info 状态为fail。
然后我就手动再分配了一次。
先进到redis客户端 src/redis-cli -a zyz -c -h xxx.xxx.xx.xx -p xxxx,输入Cluster nodes 查看节点信息备用。
输入命令 src/redis-cli -a zyz --cluster reshard 172.16.14.10:6379
然后输入槽位数。回车后提示输入接受的nodeId。再回车输入的源nodeid
回车后输入done。然后跟随提示操作就可以了。在第一次分配的时候slots分配不连续。我把所有slots先分配到一个节点,然后重复上面操作,再每个节点分配了5400个slots。
最后输入 src/redis-cli -a zyz --cluster check 172.16.14.10:6379 提示OK。在进入redis-cli 查看cluster info 的时候cluster_state变为ok。证明集群已经建立。
最后:数据是对key按crc16计算后对16384取模的到槽位slots存储。每个节点存储读取都是master。Slave只是在master的备份,master挂了它才有用。所有连接slave节点不能执行set get命令
Redis cluster 扩容
1、复制两份redis.conf文件(每个redis.conf对应一个实例)。
cp redis6369.conf redis9000.conf
cp redis6369.conf redis9001.conf
然后字符串替换,同时在redis根目录新建两个存放数据的目录,redis6369.conf 是之前已经配置好的文件
2、使用新的配置文件启动。启动成功后,就把节点加入到之前的cluster,使用src/redis-cli --cluster help 可以看到 add-node 需要传入新的ip:port 后面跟存在的ip:port(使用gssip协议meet,只要跟一个存在的节点通讯,告诉任意一个存在的节点,就可以加入集群了)。
3、使用第二步查询的命令。输入
src/redis-cli -a zyz --cluster add-node 172.16.14.15:9000 172.16.14.15:6389
src/redis-cli -a zyz --cluster add-node 172.16.14.15:9001 172.16.14.15:6389
6389是已经存在在集群中的redis实例。进入redis-cli 使用cluster nodes 可以看到集群中多了两个master节点,对应的是新加入的9000和90001端口。
4、新加入的节点没有对应的slot,需要分配slots。9000端口的为主,9001为从节点。
给9000分配slot。
src/redis-cli -a zyz --cluster reshard 172.16.14.10:6379
依次输入接受的node-id。Slot源node-id 最后输入done回车就分配成功了。
然后进入到9001。src/redis-cli -a zyz -c -p 9001。进入客户端后输入
cluster replicate a53cfe7a7d2553c10254bd40495eada841727623
后面的字符串是9000的nodeid。
5、输入命令查看 cluster nodes 可以看到已经分配成功