转自:http://www.rootop.org/pages/2615.html
redis复制原理:
当设置好slave服务器后,slave会建立和master的连接,然后发送sync命令。无论是第一次同步建立的连接还是连接断开后的重新连 接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存起来。后台进程完成写文件 后,master就发送文件给slave,slave将文件保存到磁盘上,然后加载到内存恢复数据库快照到slave上。接着master就会把缓存的命 令转发给slave。而且后续master收到的写命令都会通过开始建立的连接发送给slave。从master到slave的同步数据的命令和从 client发送的命令使用相同的协议格式。当master和slave的连接断开时slave可以自动重新建立连接。如果master同时收到多个 slave发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给所有slave。
环境信息:
selinux、iptables 关闭
master centos6.5_x65 ip:192.168.0.76
slave centos6.5_x65 ip:192.168.0.75
两台机器安装redis,过程略。
修改master主配置文件:
[root@localhost ~]# vi /usr/local/redis/conf/redis.conf
daemonize yes #守护进程
保存退出。
启动master:
[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
修改slave主配置文件:
daemonize yes #守护进程
slaveof 192.168.0.76 6379 #定义master的ip及端口
[root@localhost ~]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
[root@localhost ~]# lsof -i:6379 #看到服务已启动并且与master建立连接
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 4713 root 4u IPv6 21909 0t0 TCP *:6379 (LISTEN)
redis-ser 4713 root 5u IPv4 21911 0t0 TCP *:6379 (LISTEN)
redis-ser 4713 root 6u IPv4 21915 0t0 TCP 192.168.0.75:44736->192.168.0.76:6379 (ESTABLISHED)
测试:
在master执行:
[root@localhost ~]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> set test1 aaa #添加test1
OK
127.0.0.1:6379> get test1
“aaa”
127.0.0.1:6379> set test2 bbb ##添加test2
OK
127.0.0.1:6379> get test2
“bbb”
127.0.0.1:6379>
在slave执行:
[root@localhost ~]# /usr/local/redis/bin/redis-cli
127.0.0.1:6379> get test1 #获取数据
“aaa”
127.0.0.1:6379> get test2
“bbb”
127.0.0.1:6379>
默认slave是只能读取,不能添加数据的。在slave添加数据时会报错:
127.0.0.1:6379> set test3 ccc
(error) READONLY You can’t write against a read only slave.
要启用slave的写操作,需要修改配置文件,将slave-read-only改为no
slave-read-only no #yes改为no
redis的主从复制与mysql比较来说配置还是很简单的。