深入浅出Docker技术- Redis 集群的搭建-1

本文主要介绍基于redis的集群搭建

环境准备:

   docker/centos7

实例机器:
  192.168.137.128 由于机子原因,采用一台机器多容器部署的方式;

  

单机部署命令:

  docker run -d –name=redis  -p 6179:6179  –restart=always redis:4.0.9

 

redis主从复制部署方式:

master

   docker run -d -p 6379:6379 –restart=always –name=viemall-redis-master  –net=viemall-zookeeper -v /opt/docker/compose/redis/redis-a/conf/redis-master.conf:/usr/local/etc/redis/redis.conf redis:4.0.9 redis-server /usr/local/etc/redis/redis.conf

 

slave

   docker run -d -p 6380:6379 –restart=always –name=viemall-redis-slave –net=viemall-zookeeper  -v /opt/docker/compose/redis/redis-a/conf/redis-slave.conf:/usr/local/etc/redis/redis.conf redis:4.0.9 redis-server /usr/local/etc/redis/redis.conf

 

当配好主从redis之后,经常会发现,slave无法连接上master。

出现如下错误: Error condition on socket for SYNC: No route to host

解决的方式:

在redis主服务器上的redis.conf中修改bind字段,将

bind 127.0.0.1

 修改为 bind 0.0.0.0  

又或者直接注释掉bind字段

# bind 127.0.0.1

原因: 
        如果redis主服务器绑定了127.0.0.1,那么跨服务器IP的访问就会失败,从服务器用IP和端口访问主的时候,主服务器发现本机6379端口绑在了127.0.0.1上,也就是只能本机才能访问,外部请求会被过滤,这是linux的网络安全策略管理的。如果bind的IP地址是172.168.10.70,那么本机通过localhost和127.0.0.1、或者直接输入命令redis-cli登录本机redis也就会失败了。只能加上本机ip才能访问到。 
所以,在研发、测试环境可以考虑bind 0.0.0.0,线上生产环境建议绑定IP地址。

 

如果完成了上述操作还是出现slave无法连接上master问题:

执行” sudo iptables F ” 就轻松解决了;

 

测试:

 

#主服务器查看主从信息
#[root@php1 ~]# redis-cli -h 127.0.0.1 -a redispass info replication
# Replication

role:master

connected_slaves:1

slave0:ip=172.18.0.1,port=6379,state=online,offset=1108,lag=1

master_replid:766cd3d92f9bb8ea4f19ce71d653ab9ff47e2d45

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:1108

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:1108

 


#
从服务器查看主从信息
#[root@mysql1 ~]# redis-cli -h 127.0.0.1 -a redispass info replication
# Replication

role:slave

master_host:192.168.137.128

master_port:6379

master_link_status:up

master_last_io_seconds_ago:8

master_sync_in_progress:0

slave_repl_offset:1178

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:766cd3d92f9bb8ea4f19ce71d653ab9ff47e2d45

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:1178

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:1178

 

 

#写同步测试
#主服务器 

# redis-cli -h 127.0.0.1 -a redispass 
redis 127.0.0.1:6379> set a 123
OK
redis 127.0.0.1:6379> get a
"123"

 

#从服务器
[root@mysql1 ~]# redis-cli -h 127.0.0.1 -a redispass
 
redis 127.0.0.1:6379> get a
"123"
[root@mysql3 ~]# redis-cli -h 127.0.0.1 -a redispass
redis 127.0.0.1:6379> get a
"123"

redis 127.0.0.1:6379> set b 234
(error) READONLY You can't write against a read only slave.
(开起了只读模式,所以从将不能写入数据,可以保证数据只从主服务器同步至从服务器)

#故障测试
#从服务器宕机

将自动从主服务器的主从关系中解除
#主服务器宕机,从服务器显示,并且不能自动切换

[15932] 03 Nov 09:46:25.465 * Connecting to MASTER…
[15932] 03 Nov 09:46:25.465 * MASTER <-> SLAVE sync started
[15932] 03 Nov 09:46:25.466 # Error condition on socket for SYNC: Connection refused

后面的Redis主从切换部署方式 将在下一章讲述;