zoukankan      html  css  js  c++  java
  • Redis 主从同步配置

    主从功能:

    为了防止 Redis 磁盘损坏,导致数据丢失,Redis 提供了复制功能,将一个主数据库的数据自动同步到从数据库,防止数据丢失。
    同时还可以配置一主多从来分担主压力,主只接受写的操作,将读的操作给从来实现;其中从库也可以接受其它从库的同步请求。
    如果主、从因为网络原因出现连接断开,网络正常后从可以自动连接主,连接成功后主会将完整的数据同步一次给从,保证数据一致性。

    主从原理:

    1、从数据库启动后,向主数据库发送 SYNC 命令
    2、主数据库收到 SYNC 命令后开始保存快照,在此期间所有发给主数据库的命令都被缓存起来
    3、快照保存完后,主数据库把快照和缓存的命令一起发给从数据库
    4、从数据库保存主数据发来的快照文件,并依次执行主数据库发来的缓存命令

    在同步过程中,主、从数据库都不会阻塞:

    -----> 主库可以继续接受客户端提交的查询或修改请求;
    -----> 从库默认使用同步之前的数据继续响应客户端发来的命令

    一、配置 Redis 主从

    ## 这里可以使用一台服务器启动两个 Redis 服务,只需指定不同的配置文件,不同的端口即可
    ## 为了加入防火墙规则,我使用两台服务器来完成

    Redis Master :192.168.1.88
    Redis Slave :192.168.1.80

    1、Redis Master ( 这里不写安装过程了,写到 Slave 位置 )

    [root@master ~]# vim /usr/local/redis/redis.conf
    
    daemonize yes
    port 6379
    timeout 300
    loglevel verbose
    pidfile /usr/local/redis/logs/redis.pid
    logfile /usr/local/redis/logs/redis.log
    
    requirepass redispassword
    databases 16
    
    save 900 1
    save 300 10
    save 60 10000
    rdbcompression yes
    dbfilename dump.rdb
    
    dir /usr/local/redis/data/
    
    appendonly no
    appendfilename appendonly.aof
    appendfsync everysec
    
    no-appendfsync-on-rewrite yes
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    
    [root@master ~]# redis-server /usr/local/redis/redis.conf
    
    [root@master ~]# netstat -anpt | grep redis
    tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 1154/redis-server
    
    [root@master ~]# iptables -I INPUT 4 -s 192.168.1.80 -p tcp --dport 6379 -j ACCEPT

    2、Redis Slave

    下载地址:https://code.google.com/p/redis/downloads/list

    [root@slave ~]# cd /usr/local/src/
    [root@slave src]# tar zxf redis-2.6.10.tar.gz
    [root@slave src]# cd redis-2.6.10
    [root@slave redis-2.6.10]# make ; make install
    
    [root@slave ~]# mkdir /usr/local/redis
    [root@slave ~]# cd !$
    cd /usr/local/redis
    [root@slave redis]# cp ../src/redis-2.6.10/redis.conf .
    [root@slave redis]# cp ../src/redis-2.6.10/src/redis-cli .
    [root@slave redis]# cp ../src/redis-2.6.10/src/redis-server .
    [root@slave redis]# cp ../src/redis-2.6.10/src/redis-sentinel .
    [root@slave redis]# cp ../src/redis-2.6.10/src/redis-benchmark .
    [root@slave redis]# cp ../src/redis-2.6.10/src/redis-check-aof .
    [root@slave redis]# cp ../src/redis-2.6.10/src/redis-check-dump .
    
    [root@slave redis]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
    [root@slave redis]# sysctl vm.overcommit_memory=1
    [root@slave redis]# mkdir data logs
    [root@slave redis]# vim redis.conf
    
    daemonize yes
    port 6379
    timeout 300
    loglevel verbose
    pidfile /usr/local/redis/logs/redis.pid
    logfile /usr/local/redis/logs/redis.log
    
    #requirepass redispassword
    databases 16
    
    save 900 1
    save 300 10
    save 60 10000
    rdbcompression yes
    dbfilename dump.rdb
    
    dir /usr/local/redis/data/
    
    appendonly no
    appendfilename appendonly.aof
    appendfsync everysec
    
    no-appendfsync-on-rewrite yes
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    
    masterauth redispassword
    slaveof 192.168.1.88 6379

    ## 直接复制 Master 的配置文件,添加最后两行即可

    [root@slave ~]# redis-server /usr/local/redis/redis.conf
    
    [root@slave ~]# netstat -anpt | grep redis
    tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 3442/redis-server
    tcp 0 0 192.168.1.80:50799 192.168.1.88:6379 ESTABLISHED 3442/redis-server

    ## 可以看到启动成功,并且建立了一条到 Master 的连接

    [root@slave ~]# ls /usr/local/redis/data/
    dump.rdb

    ## data 目录下也有了 master 同步过来的数据( 虽然主库并没有写入数据 )

    二、测试 Redis 主从

    [root@master ~]# redis-cli -a redispassword
    redis 127.0.0.1:6379> keys *
    (empty list or set)
    redis 127.0.0.1:6379> set name wang
    OK
    redis 127.0.0.1:6379> set id 8
    OK
    redis 127.0.0.1:6379> keys *
    1) "id"
    2) "name"
    redis 127.0.0.1:6379> quit

    ## 这是在 master 上的操作,-a 指定认证密码

    [root@slave ~]# redis-cli
    redis 127.0.0.1:6379> keys *
    1) "id"
    2) "name"
    redis 127.0.0.1:6379> get name
    "wang"
    redis 127.0.0.1:6379> get id
    "8"
    redis 127.0.0.1:6379> set cc 123
    (error) READONLY You can't write against a read only slave.
    redis 127.0.0.1:6379> quit

    ## 这是在从上的操作,其中 slave 没有设密码所以不用 -a 指定,可以查到同步过来的 keys ,因为要保持数据一致性,所以不能写入。
    ## 如果在主执行 del name 那么从上的 name 也被删除。
    ## 主从同步完成 !

  • 相关阅读:
    学校的破网,你别再掉了
    PhotoShop SDK的获取
    我的C++博客开张了
    一个新的嵌入式门户
    试用Bloglines.com
    PhotoShop的插件体系
    VB6 to VB.NET Migration Guide Community Preview #4
    看看Microsoft都买了些什么
    Borland CTO辞职
    PhotoShop插件的开发
  • 原文地址:https://www.cnblogs.com/wangxiaoqiangs/p/5640024.html
Copyright © 2011-2022 走看看