• 主从复制(多台服务器搭建环境)【十五】


    Master:主   Slaves:从

    一、Redis的Replication:

    下面的列表清楚的解释了Redis Replication的特点和优势。
    1). 同一个Master可以同步多个Slaves。
    2). Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。因此我们可以将Redis的Replication架构视为图结构。
    3). Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
    4). Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据。
    5). 为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成。即便如此,系统的伸缩性还是得到了很大的提高。
    6). Master可以将数据保存操作交给Slaves完成,从而避免了在Master中要有独立的进程来完成此操作。

    二、Replication的工作原理:

      在Slave启动并连接到Master之后,它将主动发送一个SYNC命令。此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave服务器在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。
      如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。

    三、如何配置Replication:

    见如下步骤:
    1). 同时启动两个Redis服务器,可以考虑在同一台机器上启动两个Redis服务器,分别监听不同的端口,如6379和6380。
    2). 在Slave服务器上执行一下命令:
    /> redis-cli -p 6380 #这里我们假设Slave的端口号是6380
    redis 127.0.0.1:6380> slaveof 127.0.0.1 6379 #我们假设Master和Slave在同一台主机,Master的端口为6379
    OK
    上面的方式只是保证了在执行slaveof命令之后,redis_6380成为了redis_6379的slave,一旦服务(redis_6380)重新启动之后,他们之间的复制关系将终止。
    如果希望长期保证这两个服务器之间的Replication关系,可以在redis_6380的配置文件中做如下修改:
    /> cd /etc/redis #切换Redis服务器配置文件所在的目录。
    /> ls
    6379.conf 6380.conf
    /> vi 6380.conf

    # slaveof <masterip> <masterport>
    改为
    slaveof 127.0.0.1 6379
    保存退出。
    这样就可以保证Redis_6380服务程序在每次启动后都会主动建立与Redis_6379的Replication连接了。

    四、应用示例:

    这里我们假设Master-Slave已经建立。

    主服务器:

    #启动master服务器。
    [root@Stephen-PC redis]# redis-cli -p 6379
    redis 127.0.0.1:6379>
    #情况Master当前数据库中的所有Keys。
    redis 127.0.0.1:6379> flushdb
    OK
    #在Master中创建新的Keys作为测试数据。
    redis 127.0.0.1:6379> set mykey hello
    OK
    redis 127.0.0.1:6379> set mykey2 world
    OK
    #查看Master中存在哪些Keys。
    redis 127.0.0.1:6379> keys *
    1) "mykey"
    2) "mykey2"
    

      

    从服务器:

    #启动slave服务器。
    [root@Stephen-PC redis]# redis-cli -p 6380
    #查看Slave中的Keys是否和Master中一致,从结果看,他们是相等的。
    redis 127.0.0.1:6380> keys *
    1) "mykey"
    2) "mykey2"
    

      

    主服务器:

    #在Master中删除其中一个测试Key,并查看删除后的结果。
    redis 127.0.0.1:6379> del mykey2
    (integer) 1
    redis 127.0.0.1:6379> keys *
    1) "mykey"
    

      

    从服务器:

    #在Slave中查看是否mykey2也已经在Slave中被删除。
    redis 127.0.0.1:6380> keys *
    1) "mykey"
    

      

    -----------主从服务配置过程------------------

    主服务器只接收数据,持久化操作在从服务器进行。可以减小主服务器的压力。

    1.复制一个配置文件作为另一个从服务器

    root@qiaozhi:/usr/local/redis# cp redis.conf  redis6380.conf 
    root@qiaozhi:/usr/local/redis# ll
    total 132
    drwxr-xr-x  3 root root  4096 Nov  7 09:38 ./
    drwxr-xr-x 12 root root  4096 Nov  4 03:28 ../
    drwxr-xr-x  2 root root  4096 Nov  4 03:28 bin/
    -rw-r--r--  1 root root 57772 Nov  7 09:38 redis6380.conf
    -rw-r--r--  1 root root 57772 Nov  7 07:52 redis.conf
    

      

    2.修改redis6380.conf配置文件:(从服务器配置)

    (0).从服务器的启动端口

    (1)打开主从复制开关:

     (2)如果主服务器有密码需要配置密码:

     

     (3)从服务器是否只读

     3.修改主服务器的配置文件(redis.conf),将RDB和AOF持久化关掉:(主服务器配置)

    (1)关掉RDB持久化(注释掉保存方式)

    (2)关掉AOF持久化:

     

     4.开启主服务器与从服务器

    root@qiaozhi:/usr/local/redis# ./bin/redis-server redis.conf
    4714:C 07 Nov 09:50:45.518 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    4714:C 07 Nov 09:50:45.518 # Redis version=4.0.2, bits=32, commit=00000000, modified=0, pid=4714, just started
    4714:C 07 Nov 09:50:45.518 # Configuration loaded
    root@qiaozhi:/usr/local/redis# ./bin/redis-server redis6380.conf
    4720:C 07 Nov 09:50:50.924 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    4720:C 07 Nov 09:50:50.924 # Redis version=4.0.2, bits=32, commit=00000000, modified=0, pid=4720, just started
    4720:C 07 Nov 09:50:50.925 # Configuration loaded
    root@qiaozhi:/usr/local/redis# ps -ef | grep redis
    root      4715     1  0 09:50 ?        00:00:00 ./bin/redis-server 127.0.0.1:6379
    root      4721     1  0 09:50 ?        00:00:00 ./bin/redis-server 127.0.0.1:6380
    root      4730  3763  0 09:51 pts/0    00:00:00 grep --color=auto redis
    root@qiaozhi:/usr/local/redis# 
    

     

    5.测试主从复制

    (1)连接主服务器并且添加数据:

    root@qiaozhi:/usr/local/redis# ./bin/redis-cli -p 6379
    127.0.0.1:6379> keys *
    (empty list or set)
    127.0.0.1:6379> set str1 hello
    OK
    127.0.0.1:6379> set str2 world
    OK
    127.0.0.1:6379> keys *
    1) "str1"
    2) "str2"
    

     (2)从服务器连接并获取主服务器上的值:

    root@qiaozhi:~# cd /usr/local/redis
    root@qiaozhi:/usr/local/redis# ./bin/redis-cli -p 6380
    127.0.0.1:6380> keys *
    1) "str2"
    2) "str1"
    127.0.0.1:6380> get str1
    "hello"
    127.0.0.1:6380> get str2
    "world"
    127.0.0.1:6380> 
    

    (3)主服务器上删除一个值并重新添加一个:

    127.0.0.1:6379> del str1
    (integer) 1
    127.0.0.1:6379> set str3 test3
    OK
    127.0.0.1:6379> keys *
    1) "str3"
    2) "str2"
    127.0.0.1:6379> 
    

     (4)从服务器上获取数据;

    127.0.0.1:6380> keys *
    1) "str3"
    2) "str2"
    127.0.0.1:6380> get str3
    "test3"
    127.0.0.1:6380> 
    

     (5)在一个只读的从服务器上写数据会报错:

    127.0.0.1:6380> set test3 eee
    (error) READONLY You can't write against a read only slave.
    127.0.0.1:6380> 
    

    (6)验证是否搭建成功也可以通过info命令查看服务信息:

    # Replication模块显示的是主从服务器的信息
    127.0.0.1:6380> info
    # Server
    redis_version:4.0.2
    redis_git_sha1:00000000
    redis_git_dirty:0
    redis_build_id:33f2ebc265a685ff
    redis_mode:standalone
    os:Linux 3.11.0-12-generic i686
    arch_bits:32
    multiplexing_api:epoll
    atomicvar_api:atomic-builtin
    gcc_version:4.8.1
    process_id:2718
    run_id:79a305359f89298847959bb64f5e55735f0b4600
    tcp_port:6380
    uptime_in_seconds:1231
    uptime_in_days:0
    hz:10
    lru_clock:121176
    executable:/usr/local/redis/./bin/redis-server
    config_file:/usr/local/redis/redis6380.conf
    
    # Clients
    connected_clients:2
    client_longest_output_list:0
    client_biggest_input_buf:0
    blocked_clients:0
    
    # Memory
    used_memory:1720672
    used_memory_human:1.64M
    used_memory_rss:2383872
    used_memory_rss_human:2.27M
    used_memory_peak:1760576
    used_memory_peak_human:1.68M
    used_memory_peak_perc:97.73%
    used_memory_overhead:1703768
    used_memory_startup:588880
    used_memory_dataset:16904
    used_memory_dataset_perc:1.49%
    total_system_memory:1050468352
    total_system_memory_human:1001.80M
    used_memory_lua:25600
    used_memory_lua_human:25.00K
    maxmemory:3221225472
    maxmemory_human:3.00G
    maxmemory_policy:noeviction
    mem_fragmentation_ratio:1.39
    mem_allocator:jemalloc-4.0.3
    active_defrag_running:0
    lazyfree_pending_objects:0
    
    # Persistence
    loading:0
    rdb_changes_since_last_save:0
    rdb_bgsave_in_progress:0
    rdb_last_save_time:1510069822
    rdb_last_bgsave_status:ok
    rdb_last_bgsave_time_sec:0
    rdb_current_bgsave_time_sec:-1
    rdb_last_cow_size:270336
    aof_enabled:1
    aof_rewrite_in_progress:0
    aof_rewrite_scheduled:0
    aof_last_rewrite_time_sec:0
    aof_current_rewrite_time_sec:-1
    aof_last_bgrewrite_status:ok
    aof_last_write_status:ok
    aof_last_cow_size:147456
    aof_current_size:370
    aof_base_size:136
    aof_pending_rewrite:0
    aof_buffer_length:0
    aof_rewrite_buffer_length:0
    aof_pending_bio_fsync:0
    aof_delayed_fsync:0
    
    # Stats
    total_connections_received:1
    total_commands_processed:133
    instantaneous_ops_per_sec:0
    total_net_input_bytes:2305
    total_net_output_bytes:53816
    instantaneous_input_kbps:0.00
    instantaneous_output_kbps:0.04
    rejected_connections:0
    sync_full:0
    sync_partial_ok:0
    sync_partial_err:0
    expired_keys:0
    evicted_keys:0
    keyspace_hits:3
    keyspace_misses:0
    pubsub_channels:0
    pubsub_patterns:0
    latest_fork_usec:524
    migrate_cached_sockets:0
    slave_expires_tracked_keys:0
    active_defrag_hits:0
    active_defrag_misses:0
    active_defrag_key_hits:0
    active_defrag_key_misses:0
    
    # Replication
    role:slave
    master_host:localhost
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:10
    master_sync_in_progress:0
    slave_repl_offset:1900
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:8975dc3026cea391919b1e5bb4bc8842252e21ac
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:1900
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:1900
    
    # CPU
    used_cpu_sys:2.73
    used_cpu_user:1.00
    used_cpu_sys_children:0.01
    used_cpu_user_children:0.00
    
    # Cluster
    cluster_enabled:0
    
    # Keyspace
    db0:keys=2,expires=0,avg_ttl=0
    

    总结:

      从服务器:打开从服务器(设置主服务器地址与端口,设置连接主服务器密码,设置主服务器只读,设置持久化的地址与方式)

      主服务器:关闭持久化操作即可

  • 相关阅读:
    jQuery 遍历 table
    jQuery下拉框三级联动
    C# 读取Excel模板 修改某行某列的值 另存为新的Excel
    jQuery iframe之间相互调用
    设计模式
    Rookey.Frame企业级快速开发框架(学习笔记)
    在Gridview中实现多选
    Gridview改变单元格颜色
    SQLserver函数编写和使用方法
    SVN服务器搭建和使用(转载)
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/7801535.html
Copyright © 2020-2023  润新知