主从复制
Redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master server相同的数据库副本。
redis主从复制的特点:
1.一台master可以拥有多个slave(1对多的关系)
2.多个slave可以连接同一个master外,还可以连接到其他slave(这样做的原因是如果masterdown掉之后其中的一台slave立马可以充当master的角色,这样整个服务流程不受影响)
3.中从复制不会阻塞master,在同步数据的同时,master可以继续处理client请求。
4.提高系统的伸缩性
redis主从复制的过程:
1.slave与master建立连接,发送sync同步命令。
2.Master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新得写命令并缓存。
3.后台完成保存后,将文件发送给slave
4.slave将文件保存到硬盘上
配置主从服务器:
配置slave服务器很简单,只需要在slave的配置文件中加入以下配置:
slaveof masterip masterport
如果主机开启了登录验证,那么还需要加入下面这句:
masterauth authpassword
然后启动从机,首先主机会发快照给从机,从机的数据库会更新到和主机相同的状态,然后往主机里写内容,从机也会随之更新。
如果我们在从机上写数据那么会报错:
(error) READONLY You can't write against a read only slave.
我们可以用info命令来查看主从服务器的信息,在从机上用info命令可以看到
role:slave
master_host:masterip
master_port:masterport
master_link_status:up证明和主机处在连接状态
在主机上用info命令
role:master
同时连接着几台从机
connected_slaves:1
同时可以查看连接到主机上的从机的ip和在线状态
slave0:ip=192.168.1.107,port=6379,state=online,offset=1709,lag=1
=============================================================第二篇
redis是一个键值(key-value)存储系统。和Memcached类似,它支持存储的value类型有很多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。redis还会周期性把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
环境规划:
master:192.168.1.250 6379
slave:192.168.1.251 6379
slave:192.168.1.252 6379
auth:system
1.下载安装redis数据库
master节点:
[root@node1 home]# wget http://download.redis.io/releases/redis-2.8.17.tar.gz[root@node1 home]# wgethttp://download.redis.io/releases/redis-2.8.17.tar.gz
[root@node1 home]# tar xvf redis-2.8.17.tar.gz -C /usr/local/
[root@node1 home]# cd /usr/local/redis-2.8.17/
[root@node1 redis-2.8.17]# make && make install
[root@node1 redis-2.8.17]# echo $?
0
[root@node1 redis-2.8.17]#
slave1,slave2和master节点安装是一样
2.修改配置文件
master节点:
[root@node1 redis-2.8.17]# vim redis.conf
daemonize yes --进程后台启动
logfile /var/log/redis.log --日志文件
syslog-enabled no --日志不写进系统日志
dir /usr/local/redis-2.8.17/data --数据文件存放
requirepass system --认证密码
slave1和slave2节点:
[root@node2 redis-2.8.17]# vim redis.conf
daemonize yes
logfile /var/log/redis.log
syslog-enabled no
dir /usr/local/redis-2.8.17/data
slaveof 192.168.1.250 6379 --主服务器的IP地址和端口
masterauth system --主服务器上的认证密码
3.启动服务,检查端口
master节点:
[root@node1 redis-2.8.17]# cd src/
[root@node1 src]# ./redis-server ../redis.conf
[root@node1 src]# netstat -antp | grep 6379
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 23672/./redis-serve
tcp 0 0 192.168.1.250:6379 192.168.1.252:51446 TIME_WAIT -
tcp 0 0 192.168.1.250:6379 192.168.1.251:54193 TIME_WAIT -
tcp 0 0 192.168.1.250:6379 192.168.1.252:51620 ESTABLISHED 23672/./redis-serve
tcp 0 0 192.168.1.250:6379 192.168.1.251:54208 ESTABLISHED 23672/./redis-serve
tcp 0 0 :::6379 :::* LISTEN 23672/./redis-serve
[root@node1 src]#
slave1节点:
[root@node2 redis-2.8.17]# cd src/
[root@node2 src]# ./redis-server ../redis.conf
[root@node2 src]# netstat -antp | grep 6379
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 22435/./redis-serve
tcp 0 0 192.168.1.251:54031 192.168.1.250:6379 TIME_WAIT -
tcp 0 0 192.168.1.251:54193 192.168.1.250:6379 ESTABLISHED 22435/./redis-serve
tcp 0 0 :::6379 :::* LISTEN 22435/./redis-serve
[root@node2 src]#
slave2节点:
[root@node3 redis-2.8.17]# cd src/
[root@node3 src]# ./redis-server ../redis.conf
[root@node3 src]# netstat -antp | grep 6379
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 20656/./redis-serve
tcp 0 0 192.168.1.252:51620 192.168.1.250:6379 TIME_WAIT -
tcp 0 0 127.0.0.1:39998 127.0.0.1:6379 TIME_WAIT -
tcp 0 0 192.168.1.252:51626 192.168.1.250:6379 ESTABLISHED 20656/./redis-serve
tcp 0 0 :::6379 :::* LISTEN 20656/./redis-serve
[root@node3 src]#
4.测试数据是否同步
master节点:
[root@node1 src]# ./redis-cli
127.0.0.1:6379> set name 123456
(error) NOAUTH Authentication required. --需要认证权限
127.0.0.1:6379> auth system
OK
127.0.0.1:6379> set name 123456
OK
127.0.0.1:6379> get name
"123456"
127.0.0.1:6379> set age Hello
OK
127.0.0.1:6379> get age
"Hello"
127.0.0.1:6379>
slave1和slave2节点查看数据:
[root@node2 src]# ./redis-cli
127.0.0.1:6379> get name --在从服务器不需要认证权限
"123456"
127.0.0.1:6379> get age
"Hello"
127.0.0.1:6379>
[root@node3 src]# ./redis-cli
127.0.0.1:6379> get name
"123456"
127.0.0.1:6379> get age
"Hello"
127.0.0.1:6379>