redis主从复制,哨兵以及集群搭建部署

博客 动态
0 307
优雅殿下
优雅殿下 2022-03-06 16:56:12
悬赏:0 积分 收藏

redis主从复制,哨兵以及集群搭建部署

 

redis主从复制

1.redis支持多实例的功能,一台机器上,可以运行多个单个的redis数据库

环境准备,运行3个redis数据库,达到  1主 2从的配置主库  6379.conf     port 6379    daemonize yes    pidfile /data/6379/redis.pid    loglevel notice    logfile "/data/6379/redis.log"    dbfilename dump.rdb    dir /data/6379从库 6380    port 6380    daemonize yes    pidfile /data/6380/redis.pid    loglevel notice    logfile "/data/6380/redis.log"    dbfilename dump.rdb    dir /data/6380    slaveof  127.0.0.1  6379             从库 6381      port 6381    daemonize yes    pidfile /data/6381/redis.pid    loglevel notice    logfile "/data/6381/redis.log"    dbfilename dump.rdb    dir /data/6381    slaveof  127.0.0.1  6379                 [root@mcw01 ~/msRedis]$ ls [root@mcw01 ~/msRedis]$ tree /data//data/├── 6379├── 6380└── 63813 directories, 0 files[root@mcw01 ~/msRedis]$ vim 6379.conf[root@mcw01 ~/msRedis]$ vim 6380.conf[root@mcw01 ~/msRedis]$ vim 6381.conf[root@mcw01 ~/msRedis]$ cat 6379.conf port 6379daemonize yespidfile /data/6379/redis.pidloglevel noticelogfile "/data/6379/redis.log"dbfilename dump.rdbdir /data/6379[root@mcw01 ~/msRedis]$ cat 6380.confport 6380daemonize yespidfile /data/6380/redis.pidloglevel noticelogfile "/data/6380/redis.log"dbfilename dump.rdbdir /data/6380[root@mcw01 ~/msRedis]$ redis-server 6379.conf [root@mcw01 ~/msRedis]$ redis-server 6380.conf  #创建三个配置文件,并启动redis服务[root@mcw01 ~/msRedis]$ redis-server 6381.conf [root@mcw01 ~/msRedis]$ ps -ef|grep -v grep |grep redisroot      25270      1  0 11:43 ?        00:00:00 redis-server *:6379root      25275      1  0 11:43 ?        00:00:00 redis-server *:6380root      25280      1  0 11:43 ?        00:00:00 redis-server *:6381[root@mcw01 ~/msRedis]$ redis-cli   127.0.0.1:6379> keys *(empty list or set)127.0.0.1:6379> set name1 mcw1OK127.0.0.1:6379> keys *1) "name1"127.0.0.1:6379> [root@mcw01 ~/msRedis]$ redis-cli -p 6380 #6379上创建的key,在6380和6381上都看不到,三者没有关系127.0.0.1:6380> get name1(nil)127.0.0.1:6380> keys *(empty list or set)127.0.0.1:6380> [root@mcw01 ~/msRedis]$ redis-cli -p 6381127.0.0.1:6381> keys *(empty list or set)127.0.0.1:6381> [root@mcw01 ~/msRedis]$ redis-cli -p 6379 get name1  #连接进入的后面加命令,像MySQL一样的免交互执行命令"mcw1"[root@mcw01 ~/msRedis]$ tree /data/  #查看目录结构/data/├── 6379│   ├── redis.log│   └── redis.pid├── 6380│   ├── redis.log│   └── redis.pid└── 6381    ├── redis.log    └── redis.pid3 directories, 6 files[root@mcw01 ~/msRedis]$ 

2.开启主从复制功能

redis-cli info   #查看数据库信息,查出所有redis-cli info replication  #快速查看复制信息。只查info里的Replication部分在6380 和6381数据库上 ,配置主从信息,通过参数形式修改配置,临时生效,注意要写入配置文件     redis-cli -p 6380 slaveof 127.0.0.1 6379    redis-cli -p 6381 slaveof 127.0.0.1 6379此时检查6379的复制信息,以及6380 6381的复制信息redis-cli -p 6380 info replication  redis-cli -p 6381 info replication  主从复制是 读写分离的,master可写,  slave只读[root@mcw01 ~/msRedis]$ redis-cli -p 6379 info# Serverredis_version:4.0.10redis_git_sha1:00000000redis_git_dirty:0redis_build_id:279e3e51d6e7969bredis_mode:standaloneos:Linux 3.10.0-693.el7.x86_64 x86_64arch_bits:64multiplexing_api:epollatomicvar_api:atomic-builtingcc_version:4.8.5process_id:25270run_id:29d570833f783120fd9e884ea8d4108384abaeaetcp_port:6379uptime_in_seconds:466uptime_in_days:0hz:10lru_clock:2371478executable:/root/msRedis/redis-serverconfig_file:/root/msRedis/6379.conf# Clientsconnected_clients:1client_longest_output_list:0client_biggest_input_buf:0blocked_clients:0# Memoryused_memory:849456used_memory_human:829.55Kused_memory_rss:7688192used_memory_rss_human:7.33Mused_memory_peak:849456used_memory_peak_human:829.55Kused_memory_peak_perc:100.12%used_memory_overhead:836206used_memory_startup:786504used_memory_dataset:13250used_memory_dataset_perc:21.05%total_system_memory:1911832576total_system_memory_human:1.78Gused_memory_lua:37888used_memory_lua_human:37.00Kmaxmemory:0maxmemory_human:0Bmaxmemory_policy:noevictionmem_fragmentation_ratio:9.05mem_allocator:jemalloc-4.0.3active_defrag_running:0lazyfree_pending_objects:0# Persistenceloading:0rdb_changes_since_last_save:1rdb_bgsave_in_progress:0rdb_last_save_time:1646538180rdb_last_bgsave_status:okrdb_last_bgsave_time_sec:-1rdb_current_bgsave_time_sec:-1rdb_last_cow_size:0aof_enabled:0aof_rewrite_in_progress:0aof_rewrite_scheduled:0aof_last_rewrite_time_sec:-1aof_current_rewrite_time_sec:-1aof_last_bgrewrite_status:okaof_last_write_status:okaof_last_cow_size:0# Statstotal_connections_received:3total_commands_processed:5instantaneous_ops_per_sec:0total_net_input_bytes:131total_net_output_bytes:10197instantaneous_input_kbps:0.00instantaneous_output_kbps:0.00rejected_connections:0sync_full:0sync_partial_ok:0sync_partial_err:0expired_keys:0expired_stale_perc:0.00expired_time_cap_reached_count:0evicted_keys:0keyspace_hits:1keyspace_misses:0pubsub_channels:0pubsub_patterns:0latest_fork_usec:0migrate_cached_sockets:0slave_expires_tracked_keys:0active_defrag_hits:0active_defrag_misses:0active_defrag_key_hits:0active_defrag_key_misses:0# Replicationrole:masterconnected_slaves:0master_replid:e3784eb64085052e7107d06d1fc605ae6dbb5b59master_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0# CPUused_cpu_sys:0.32used_cpu_user:0.11used_cpu_sys_children:0.00used_cpu_user_children:0.00# Clustercluster_enabled:0# Keyspacedb0:keys=1,expires=0,avg_ttl=0[root@mcw01 ~/msRedis]$ [root@mcw01 ~/msRedis]$ [root@mcw01 ~/msRedis]$ redis-cli -p 6379 info replication  #现在6379是master,但是连接的从为0# Replicationrole:masterconnected_slaves:0master_replid:e3784eb64085052e7107d06d1fc605ae6dbb5b59master_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0[root@mcw01 ~/msRedis]$ redis-cli -p 6379 info keyspace  #info加上后面这个keyspace,就是info里被注释的英文# Keyspacedb0:keys=1,expires=0,avg_ttl=0[root@mcw01 ~/msRedis]$ redis-cli -p 6379 info cluster# Clustercluster_enabled:0[root@mcw01 ~/msRedis]$ 开启主从复制功能[root@mcw01 ~/msRedis]$  redis-cli -p 6380 slaveof 127.0.0.1 6379  #开启6380为6379的从OK[root@mcw01 ~/msRedis]$ redis-cli -p 6381 slaveof 127.0.0.1 6379  #开启6381为6379的从OK[root@mcw01 ~/msRedis]$ redis-cli -p 6379 info replication  #查看主6379的信息,角色是主,连接的从有两个,从0和从1的ip端口等信息# Replicationrole:masterconnected_slaves:2slave0:ip=127.0.0.1,port=6381,state=online,offset=28,lag=0slave1:ip=127.0.0.1,port=6380,state=online,offset=28,lag=0master_replid:99b8b1b5d61e13152f4025821626574ed7f92ac9master_replid2:0000000000000000000000000000000000000000master_repl_offset:28second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:28[root@mcw01 ~/msRedis]$ redis-cli -p 6380 info replication  #查看从6380的复制信息。角色是从,主的ip端口是什么,主的连接状态,是否只读等信息# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:upmaster_last_io_seconds_ago:2master_sync_in_progress:0slave_repl_offset:56slave_priority:100slave_read_only:1connected_slaves:0master_replid:99b8b1b5d61e13152f4025821626574ed7f92ac9master_replid2:0000000000000000000000000000000000000000master_repl_offset:56second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:56[root@mcw01 ~/msRedis]$ 再来查看刚刚主上创建的数据,现在已经复制到从库上去了[root@mcw01 ~/msRedis]$ redis-cli -p 6379127.0.0.1:6379> keys *1) "name1"127.0.0.1:6379> [root@mcw01 ~/msRedis]$ redis-cli -p 6380 keys *(error) ERR wrong number of arguments for 'keys' command[root@mcw01 ~/msRedis]$ redis-cli -p 6380 127.0.0.1:6380> keys *1) "name1"127.0.0.1:6380> [root@mcw01 ~/msRedis]$ redis-cli -p 6381127.0.0.1:6381> keys *1) "name1"127.0.0.1:6381> [root@mcw01 ~/msRedis]$ [root@mcw01 ~/msRedis]$ redis-cli -p 6379   #在主上创建一个新的数据,也很快同步到从上去了,说明主从复制正常运行127.0.0.1:6379> set name2 mcw2OK127.0.0.1:6379> [root@mcw01 ~/msRedis]$ redis-cli -p 6381127.0.0.1:6381> keys *1) "name1"2) "name2"127.0.0.1:6381> 127.0.0.1:6381> set name3 mcw3  #然后在从上写入一个数据,发现从是只读的。这也是实现了读写分离的(error) READONLY You can't write against a read only slave.127.0.0.1:6381> [root@mcw01 ~/msRedis]$ 如果命令行设置了主从复制了,但是没有写进配置文件,需要记得把执行过的命令加进去,这样即使重启redis,也会自动加载上。slaveof  127.0.0.1  6379

3.模拟主从复制故障,手动切换master-slave身份

    1.杀死6379进程 ,干掉主库         2.手动切换 6381为新的主库,需要先关闭它的从库身份    redis-cli -p 6381  slaveof no one         3.修改6380的新主库是 6381    redis-cli -p 6380 slaveof  127.0.0.1 6381    1.杀死6379进程 ,干掉主库 [root@mcw01 ~/msRedis]$ ps -ef|grep -v grep |grep redisroot      25270      1  0 11:43 ?        00:00:02 redis-server *:6379root      25275      1  0 11:43 ?        00:00:02 redis-server *:6380root      25280      1  0 11:43 ?        00:00:02 redis-server *:6381[root@mcw01 ~/msRedis]$ kill 25270[root@mcw01 ~/msRedis]$ ps -ef|grep -v grep |grep redisroot      25275      1  0 11:43 ?        00:00:02 redis-server *:6380root      25280      1  0 11:43 ?        00:00:02 redis-server *:6381[root@mcw01 ~/msRedis]$ [root@mcw01 ~/msRedis]$ redis-cli -p 6380 info replication  #虽然主库已经杀掉了,但是现在还是连接的6379# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:down..........[root@mcw01 ~/msRedis]$ redis-cli -p 6381 info replication# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:downmaster_last_io_seconds_ago:-1master_sync_in_progress:0........[root@mcw01 ~/msRedis]$ 2.手动切换 6381为新的主库,需要先关闭它的从库身份redis-cli -p 6381  slaveof no one [root@mcw01 ~/msRedis]$ redis-cli -p 6381  slaveof no one  #OK[root@mcw01 ~/msRedis]$ redis-cli -p 6381  127.0.0.1:6381> keys *1) "name1"2) "name2"127.0.0.1:6381> set name3 mcw3 #取消它从库身份,就可以写入数据了OK127.0.0.1:6381> [root@mcw01 ~/msRedis]$ redis-cli -p 6381 info replication  #查看自己的复制信息,是主了,现在还没有从# Replicationrole:masterconnected_slaves:0........[root@mcw01 ~/msRedis]$ redis-cli -p 6380 info replication  #查看6380,现在的从不是新的主6381的从,需要手动修改# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:down......[root@mcw01 ~/msRedis]$ 3.修改6380的新主库是 6381redis-cli -p 6380 slaveof  127.0.0.1 6381[root@mcw01 ~/msRedis]$ redis-cli -p 6380 slaveof  127.0.0.1 6381OK[root@mcw01 ~/msRedis]$ redis-cli -p 6380 info replication  #上面是修改新的主,下面是查看已经修改成功,连接状态up# Replicationrole:slavemaster_host:127.0.0.1master_port:6381master_link_status:up.........[root@mcw01 ~/msRedis]$ redis-cli -p 6380  #从上面可以看到刚刚主上创建的name3了127.0.0.1:6380> keys *1) "name2"2) "name3"3) "name1"127.0.0.1:6380> [root@mcw01 ~/msRedis]$ redis-cli -p 6381 #主上创建一条数据name4127.0.0.1:6381> set name4 mcw4OK127.0.0.1:6381> [root@mcw01 ~/msRedis]$ redis-cli -p 6380 #从上能查到新建的数据集name4.并且从不能写入数据,是只读的。127.0.0.1:6380> keys *1) "name2"2) "name3"3) "name1"4) "name4"127.0.0.1:6380> set name5 mcw5(error) READONLY You can't write against a read only slave.127.0.0.1:6380> [root@mcw01 ~/msRedis]$ 

哨兵搭建

redis哨兵高可用

redis-sentinel功能

环境准备:redis主从复制集群部署 

三个redis数据库实例 ,配置好 1主 2从的配置    6379.conf        port 6379        daemonize yes        logfile "6379.log"        dbfilename "dump-6379.rdb"        dir "/var/redis/data/"    6380.conf         port 6380        daemonize yes        logfile "6380.log"        dbfilename "dump-6380.rdb"        dir "/var/redis/data/"        slaveof 127.0.0.1 6379    6381.conf         port 6381        daemonize yes        logfile "6381.log"        dbfilename "dump-6381.rdb"        dir "/var/redis/data/"        slaveof 127.0.0.1 6379        [root@mcw01 ~/msRedis]$ ps -ef|grep redisroot      25275      1  0 11:43 ?        00:00:08 redis-server *:6380root      25280      1  0 11:43 ?        00:00:07 redis-server *:6381root      45901  25154  0 13:51 pts/0    00:00:00 grep --color=auto redis[root@mcw01 ~/msRedis]$ kill 25275[root@mcw01 ~/msRedis]$ kill 25280[root@mcw01 ~/msRedis]$ [root@mcw01 ~/msRedis]$ [root@mcw01 ~/msRedis]$ ps -ef|grep redisroot      45903  25154  0 13:51 pts/0    00:00:00 grep --color=auto redis[root@mcw01 ~/msRedis]$ [root@mcw01 ~/msRedis]$ ls6379.conf  6380.conf  6381.conf[root@mcw01 ~/msRedis]$ vim 6380.conf [root@mcw01 ~/msRedis]$ vim 6381.conf [root@mcw01 ~/msRedis]$ cat 6379.conf port 6379daemonize yespidfile /data/6379/redis.pidloglevel noticelogfile "/data/6379/redis.log"dbfilename dump.rdbdir /data/6379[root@mcw01 ~/msRedis]$ cat 6380.conf  #我这里直接写进配置文件,这样用配置文件启动redis,就不需要执行相关命令了port 6380daemonize yespidfile /data/6380/redis.pidloglevel noticelogfile "/data/6380/redis.log"dbfilename dump.rdbdir /data/6380slaveof 127.0.0.1 6379[root@mcw01 ~/msRedis]$ redis-server 6379.conf [root@mcw01 ~/msRedis]$ redis-server 6380.conf [root@mcw01 ~/msRedis]$ redis-server 6381.conf [root@mcw01 ~/msRedis]$ ps -ef|grep -v grep |grep redis  #启动三个服务root      45949      1  0 13:53 ?        00:00:00 redis-server *:6379root      45954      1  0 13:53 ?        00:00:00 redis-server *:6380root      45960      1  0 13:53 ?        00:00:00 redis-server *:6381[root@mcw01 ~/msRedis]$ redis-cli -p 6379 info replication  #查看主从复制情况,一主两从正常# Replicationrole:masterconnected_slaves:2slave0:ip=127.0.0.1,port=6380,state=online,offset=84,lag=1slave1:ip=127.0.0.1,port=6381,state=online,offset=84,lag=0........[root@mcw01 ~/msRedis]$ redis-cli -p 6380 info replication # Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:up.......[root@mcw01 ~/msRedis]$ 

环境准备:redis三个redis哨兵进程部署 

    三个redis哨兵进程,指定好,检测着谁    也是准备三个配置文件,内容如下    sentinel-26379.conf      port 26379      dir /var/redis/data/    logfile "26379.log"    // 当前Sentinel节点监控 192.168.182.130:6379 这个主节点    // 2代表判断主节点失败至少需要2个Sentinel节点节点同意    // mymaster是主节点的别名    sentinel monitor s21ms  0.0.0.0 6379 2    //每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达    sentinel down-after-milliseconds s21ms  20000    //当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,    原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1    sentinel parallel-syncs mymaster 1    //故障转移超时时间为180000毫秒    sentinel failover-timeout mymaster 180000    #三个哨兵的配置文件,一模一样,仅仅是端口的区别      #三个哨兵的配置文件,一模一样,仅仅是端口的区别      #三个哨兵的配置文件,一模一样,仅仅是端口的区别      #三个哨兵的配置文件,一模一样,仅仅是端口的区别      sentinel-26380.conf      sentinel-26381.conf  2.分别启动 三个redis数据库,  以及三个 哨兵进程 ,注意 ,哨兵第一次启动后,会修改配置文件,如果错了,得删除配置文件,重新写2.分别启动 三个redis数据库,  以及三个 哨兵进程 ,注意 ,哨兵第一次启动后,会修改配置文件,如果错了,得删除配置文件,重新写2.分别启动 三个redis数据库,  以及三个 哨兵进程 ,注意 ,哨兵第一次启动后,会修改配置文件,如果错了,得删除配置文件,重新写2.分别启动 三个redis数据库,  以及三个 哨兵进程 ,注意 ,哨兵第一次启动后,会修改配置文件,如果错了,得删除配置文件,重新写    配置文件在这里,这里用的是127.0.0.1     sentinel-26379.conf     port 26379      dir /var/redis/data/    logfile "26379.log"    sentinel monitor s21ms  127.0.0.1  6379 2    sentinel down-after-milliseconds s21ms  20000    sentinel parallel-syncs s21ms 1    sentinel failover-timeout s21ms 180000    #加一个后台运行    daemonize yes                 #仅仅是端口的不同    sentinel-26380.conf     sentinel-26381.conf     #启动     1244  redis-sentinel sentinel-26379.conf      1245  redis-sentinel sentinel-26380.conf      1246  redis-sentinel sentinel-26381.conf sentinel-26379.conf port 26379  dir /data/sentinellogfile "26379.log"sentinel monitor mcw  127.0.0.1  6379 2sentinel down-after-milliseconds mcw   20000sentinel parallel-syncs mcw  1sentinel failover-timeout mcw  180000daemonize yes                [root@mcw01 ~/msRedis]$ ss -lntup|grep 6379tcp    LISTEN     0      511       *:6379                  *:*                   users:(("redis-server",pitcp    LISTEN     0      511      :::6379                 :::*                   users:(("redis-server",pi[root@mcw01 ~/msRedis]$ ss -anp|grep 6379tcp    LISTEN     0      511       *:6379                  *:*                   users:(("redis-server",pitcp    ESTAB      0      0      127.0.0.1:6379               127.0.0.1:39093               users:(("redis-tcp    ESTAB      0      0      127.0.0.1:6379               127.0.0.1:39091               users:(("redis-tcp    ESTAB      0      0      127.0.0.1:39093              127.0.0.1:6379                users:(("redis-tcp    ESTAB      0      0      127.0.0.1:39091              127.0.0.1:6379                users:(("redis-tcp    LISTEN     0      511      :::6379                 :::*                   users:(("redis-server",pi[root@mcw01 ~/msRedis]$ [root@mcw01 ~/msRedis]$ ls /data/636379/ 6380/ 6381/ [root@mcw01 ~/msRedis]$ mkdir /data/sentinel[root@mcw01 ~/msRedis]$ vim 26379.conf[root@mcw01 ~/msRedis]$ sed "s#26379#26380#g" 26379.conf >26380.conf [root@mcw01 ~/msRedis]$ sed "s#26379#26381#g" 26379.conf >26381.conf [root@mcw01 ~/msRedis]$ cat 26379.conf port 26379  dir /data/sentinellogfile "26379.log"sentinel monitor mcw  127.0.0.1  6379 2sentinel down-after-milliseconds mcw   20000sentinel parallel-syncs mcw  1sentinel failover-timeout mcw  180000daemonize yes      [root@mcw01 ~/msRedis]$ cat 26380.conf port 26380  dir /data/sentinellogfile "26380.log"sentinel monitor mcw  127.0.0.1  6379 2sentinel down-after-milliseconds mcw   20000sentinel parallel-syncs mcw  1sentinel failover-timeout mcw  180000daemonize yes      [root@mcw01 ~/msRedis]$ [root@mcw01 ~/msRedis]$ ls 26379.conf  26380.conf  26381.conf  6379.conf  6380.conf  6381.conf[root@mcw01 ~/msRedis]$ mv 26379.conf  sentinel-26379.conf  #起个方便看的名字把[root@mcw01 ~/msRedis]$ mv 26380.conf  sentinel-26380.conf[root@mcw01 ~/msRedis]$ mv 26381.conf  sentinel-26381.conf[root@mcw01 ~/msRedis]$ ls 6379.conf  6380.conf  6381.conf  sentinel-26379.conf  sentinel-26380.conf  sentinel-26381.conf[root@mcw01 ~/msRedis]$ 报错:[root@mcw01 ~/msRedis]$ redis-server sentinel-26379.conf*** FATAL CONFIG FILE ERROR ***Reading the configuration file, at line 4>>> 'sentinel monitor mcw  127.0.0.1  6379 2'sentinel directive while not in sentinel mode[root@mcw01 ~/msRedis]$   部署哨兵模式的时候,使用的命令不对造成的,正确的命令如下:./redis-server.sh sentinel.conf --sentinel为了避免把后面的--sentinel竟然给忘了类似的事情发生,建议使用redis-sentinel sentinel.conf代替redis-server命令[root@mcw01 ~/msRedis]$ redis-sentinel sentinel-26379.conf[root@mcw01 ~/msRedis]$ redis-sentinel sentinel-26380.conf[root@mcw01 ~/msRedis]$ redis-sentinel sentinel-26381.conf  [root@mcw01 ~/msRedis]$ ps -ef|grep -v grep |grep redis  #启动了三个哨兵root      45949      1  0 13:53 ?        00:00:01 redis-server *:6379root      45954      1  0 13:53 ?        00:00:02 redis-server *:6380root      45960      1  0 13:53 ?        00:00:02 redis-server *:6381root      46061      1  1 14:27 ?        00:00:00 redis-sentinel *:26379 [sentinel]root      46066      1  0 14:28 ?        00:00:00 redis-sentinel *:26380 [sentinel]root      46071      1  0 14:28 ?        00:00:00 redis-sentinel *:26381 [sentinel][root@mcw01 ~/msRedis]$ ls6379.conf  6380.conf  6381.conf  sentinel-26379.conf  sentinel-26380.conf  sentinel-26381.conf[root@mcw01 ~/msRedis]$ cat 6379.conf port 6379daemonize yespidfile /data/6379/redis.pidloglevel noticelogfile "/data/6379/redis.log"dbfilename dump.rdbdir /data/6379[root@mcw01 ~/msRedis]$ cat sentinel-26379.conf  #查看配置,启动后配置被重写了,添加了部分配置port 26379dir "/data/sentinel"logfile "26379.log"sentinel myid 750ea6253069388e5897651086d50af8fc604a7fsentinel monitor mcw 127.0.0.1 6379 2sentinel down-after-milliseconds mcw 20000sentinel config-epoch mcw 0daemonize yes# Generated by CONFIG REWRITEsentinel leader-epoch mcw 0sentinel known-slave mcw 127.0.0.1 6380sentinel known-slave mcw 127.0.0.1 6381sentinel known-sentinel mcw 127.0.0.1 26380 3098a36a80a4d1f1b3f01f9a332c8abdf21ee56asentinel known-sentinel mcw 127.0.0.1 26381 50aa98a452708c83334286a9a8e2f06cef1f9fd2sentinel current-epoch 0[root@mcw01 ~/msRedis]$ 

3.验证哨兵是否正常

redis-cli -p 26379 info sentinelmaster0:name=s21ms,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3哨兵的名字,状态,监控的地址,监控的从的数量,以及哨兵的个数。查看到哨兵的信息,就说明哨兵的部署是正常的[root@mcw01 ~/msRedis]$ redis-cli -p 26379 info sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=mcw,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3[root@mcw01 ~/msRedis]$ 

4.干掉主库 ,检查主从切换状态

 1253  kill -9 12749 1254  ps -ef|grep redis 1255  redis-cli -p 6380 info replication 1256  redis-cli -p 6381 info replication 1257  redis-cli -p 6380 info replication 1258  redis-cli -p 6381 info replication [root@mcw01 ~/msRedis]$ ps -ef|grep -v grep |grep redisroot      45949      1  0 13:53 ?        00:00:02 redis-server *:6379root      45954      1  0 13:53 ?        00:00:03 redis-server *:6380root      45960      1  0 13:53 ?        00:00:02 redis-server *:6381root      46061      1  0 14:27 ?        00:00:02 redis-sentinel *:26379 [sentinel]root      46066      1  0 14:28 ?        00:00:01 redis-sentinel *:26380 [sentinel]root      46071      1  0 14:28 ?        00:00:01 redis-sentinel *:26381 [sentinel][root@mcw01 ~/msRedis]$ kill 45949  #杀掉主服务[root@mcw01 ~/msRedis]$ ps -ef|grep -v grep |grep redisroot      45954      1  0 13:53 ?        00:00:03 redis-server *:6380root      45960      1  0 13:53 ?        00:00:03 redis-server *:6381root      46061      1  0 14:27 ?        00:00:02 redis-sentinel *:26379 [sentinel]root      46066      1  0 14:28 ?        00:00:02 redis-sentinel *:26380 [sentinel]root      46071      1  0 14:28 ?        00:00:02 redis-sentinel *:26381 [sentinel][root@mcw01 ~/msRedis]$ redis-cli -p 6380 info replication  #迅速查看80和81,发现主从复制链接down了,但是还是指向79的# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:down.......[root@mcw01 ~/msRedis]$ redis-cli -p 6381 info replication# Replicationrole:slavemaster_host:127.0.0.1master_port:6379master_link_status:down........[root@mcw01 ~/msRedis]$ [root@mcw01 ~/msRedis]$ redis-cli -p 6380 info replication  #过一会再看,大约20秒。发现81已经自动成为主了,80已经成为81的从了,实现了自动故障转移# Replicationrole:slavemaster_host:127.0.0.1master_port:6381master_link_status:up.......[root@mcw01 ~/msRedis]$ redis-cli -p 6381 info replication# Replicationrole:masterconnected_slaves:1slave0:ip=127.0.0.1,port=6380,state=online,offset=166686,lag=0........[root@mcw01 ~/msRedis]$ 

redis-cluster搭建

环境准备 

1.准备好6个redis节点的配置文件 redis-7000.conf port 7000daemonize yesdir "/opt/redis/data"logfile "7000.log"dbfilename "dump-7000.rdbcluster-enabled yes   #开启集群模式cluster-config-file nodes-7000.conf  #集群内部的配置文件cluster-require-full-coverage no          #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no#6个配置文件,仅仅是端口的区别redis-7000.conf    port 7000    daemonize yes    dir "/opt/redis/data"    logfile "7000.log"    dbfilename "dump-7000.rdb"    cluster-enabled yes    cluster-config-file nodes-7000.conf    cluster-require-full-coverage no    redis-7001.conf redis-7002.conf redis-7003.conf redis-7004.conf redis-7005.conf [root@mcw01 ~/msRedis]$ cd cluster/[root@mcw01 ~/msRedis/cluster]$ ls7000.conf  7001.conf  7002.conf  7003.conf  7004.conf[root@mcw01 ~/msRedis/cluster]$ cat 7000.conf port 7000daemonize yesdir "/opt/redis/data"logfile "7000.log"dbfilename "dump-7000.rdbcluster-enabled yescluster-config-file nodes-7000.confcluster-require-full-coverage no[root@mcw01 ~/msRedis/cluster]$ sed "s#7000#7005#g" 7000.conf >7005.conf[root@mcw01 ~/msRedis/cluster]$ ls7000.conf  7001.conf  7002.conf  7003.conf  7004.conf  7005.conf[root@mcw01 ~/msRedis/cluster]$ cat 7005.conf port 7005daemonize yesdir "/opt/redis/data"logfile "7005.log"dbfilename "dump-7005.rdbcluster-enabled yescluster-config-file nodes-7005.confcluster-require-full-coverage no[root@mcw01 ~/msRedis/cluster]$ 

2.根据配置文件启动6个节点

 1288  redis-server 7000.conf  1290  redis-server 7001.conf  1291  redis-server 7002.conf  1292  redis-server 7003.conf  1293  redis-server 7004.conf  1294  redis-server 7005.conf   如下,6个集群的结点  7000-7005已经起来了,并且显示是cluster[root@mcw01 ~/msRedis/cluster]$ ls7000.conf  7001.conf  7002.conf  7003.conf  7004.conf  7005.conf[root@mcw01 ~/msRedis/cluster]$ mkdir /opt/redis/datamkdir: cannot create directory ‘/opt/redis/data’: No such file or directory[root@mcw01 ~/msRedis/cluster]$ mkdir -p  /opt/redis/data[root@mcw01 ~/msRedis/cluster]$ ps -ef|grep -v grep|grep redisroot      45954      1  0 13:53 ?        00:00:06 redis-server *:6380root      45960      1  0 13:53 ?        00:00:06 redis-server *:6381root      46061      1  0 14:27 ?        00:00:07 redis-sentinel *:26379 [sentinel]root      46066      1  0 14:28 ?        00:00:07 redis-sentinel *:26380 [sentinel]root      46071      1  0 14:28 ?        00:00:07 redis-sentinel *:26381 [sentinel][root@mcw01 ~/msRedis/cluster]$ [root@mcw01 ~/msRedis/cluster]$ redis-seredis-sentinel  redis-server    [root@mcw01 ~/msRedis/cluster]$ redis-server 7000.conf[root@mcw01 ~/msRedis/cluster]$ redis-server 7001.conf[root@mcw01 ~/msRedis/cluster]$ redis-server 7002.conf[root@mcw01 ~/msRedis/cluster]$ redis-server 7003.conf[root@mcw01 ~/msRedis/cluster]$ redis-server 7004.conf[root@mcw01 ~/msRedis/cluster]$ redis-server 7005.conf[root@mcw01 ~/msRedis/cluster]$ ps -ef|grep -v grep|grep redisroot      45954      1  0 13:53 ?        00:00:06 redis-server *:6380root      45960      1  0 13:53 ?        00:00:06 redis-server *:6381root      46061      1  0 14:27 ?        00:00:08 redis-sentinel *:26379 [sentinel]root      46066      1  0 14:28 ?        00:00:07 redis-sentinel *:26380 [sentinel]root      46071      1  0 14:28 ?        00:00:07 redis-sentinel *:26381 [sentinel]root      46293      1  0 15:17 ?        00:00:00 redis-server *:7000 [cluster]root      46298      1  0 15:17 ?        00:00:00 redis-server *:7001 [cluster]root      46303      1  0 15:18 ?        00:00:00 redis-server *:7002 [cluster]root      46308      1  0 15:18 ?        00:00:00 redis-server *:7003 [cluster]root      46313      1  0 15:18 ?        00:00:00 redis-server *:7004 [cluster]root      46318      1  1 15:18 ?        00:00:00 redis-server *:7005 [cluster][root@mcw01 ~/msRedis/cluster]$ 

3.分配redis slot 槽位

    -    手动写c语言 分配      -   使用ruby大神 写的一个redis模块,自动分配现在登录上去,添加一个数据,显示槽位没有被提供。意思是,7000这个节点没有分配槽位,而数据是放到槽位里的。    [root@mcw01 ~/msRedis/cluster]$ redis-cli -p 7000127.0.0.1:7000> keys *(empty list or set)127.0.0.1:7000> set name1 mcw1(error) CLUSTERDOWN Hash slot not served127.0.0.1:7000> [root@mcw01 ~/msRedis/cluster]$     

4.配置ruby脚本环境 

    1.yum安装最简单         yum install  ruby          2.自动配置好 PATH环境变量        ruby和gem的环境变量        3.下载ruby操作redis的模块        wget http://rubygems.org/downloads/redis-3.3.0.gem               4.用ruby的包管理工具 gem 安装这个模块                gem install -l redis-3.3.0.gem                ruby和python一样的解释型语言,gem相当于pip   [root@mcw01 ~/msRedis/cluster]$ wget http://rubygems.org/downloads/redis-3.3.0.gem  --2022-03-06 16:10:28--  http://rubygems.org/downloads/redis-3.3.0.gemResolving rubygems.org (rubygems.org)... 151.101.193.227, 151.101.1.227, 151.101.65.227, ...Connecting to rubygems.org (rubygems.org)|151.101.193.227|:80... failed: Connection timed out.Connecting to rubygems.org (rubygems.org)|151.101.1.227|:80... connected.HTTP request sent, awaiting response... 200 OKLength: 92160 (90K) [application/octet-stream]Saving to: ‘redis-3.3.0.gem’100%[===============================================================>] 92,160      --.-K/s   in 0.08s   2022-03-06 16:10:31 (1.12 MB/s) - ‘redis-3.3.0.gem’ saved [92160/92160][root@mcw01 ~/msRedis/cluster]$ ls7000.conf  7001.conf  7002.conf  7003.conf  7004.conf  7005.conf  redis-3.3.0.gem[root@mcw01 ~/msRedis/cluster]$ gem install -l redis-3.3.0.gemSuccessfully installed redis-3.3.0Parsing documentation for redis-3.3.0Installing ri documentation for redis-3.3.01 gem installed

5.通过ruby一键分配redis-cluster集群的槽位

 找到机器上的redis-trib.rb命令,用绝对命令创建 开启集群,分配槽位/opt/redis-4.0.10/src/redis-trib.rb  create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005如下已经分配好槽位了[root@mcw01 ~/msRedis/cluster]$ /opt/redis-4.0.10/src/redis-trib.rb  create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005>>> Creating cluster>>> Performing hash slots allocation on 6 nodes...Using 3 masters: #三个主,三个复制的从127.0.0.1:7000127.0.0.1:7001127.0.0.1:7002Adding replica 127.0.0.1:7004 to 127.0.0.1:7000Adding replica 127.0.0.1:7005 to 127.0.0.1:7001Adding replica 127.0.0.1:7003 to 127.0.0.1:7002>>> Trying to optimize slaves allocation for anti-affinity[WARNING] Some slaves are in the same host as their masterM: 2d2654b26e43f6245b41dc2cae44f7bb6ec846bb 127.0.0.1:7000  #三个主上分别分配了槽位区间   slots:0-5460 (5461 slots) masterM: 102d887feee9b5d2db0284ecff83d893f4736aef 127.0.0.1:7001   slots:5461-10922 (5462 slots) masterM: c2ba927b42526110a7f840643a1c653057c6b811 127.0.0.1:7002   slots:10923-16383 (5461 slots) masterS: 22bcee4dc0439600aae268b9de093db39d73e2cf 127.0.0.1:7003   replicates c2ba927b42526110a7f840643a1c653057c6b811S: fb7ed8949b7ab36351aabe72a9cb1ae8f859d6d8 127.0.0.1:7004   replicates 2d2654b26e43f6245b41dc2cae44f7bb6ec846bbS: cc0da6e5df726d65df53849dd92e2edd6ef66760 127.0.0.1:7005   replicates 102d887feee9b5d2db0284ecff83d893f4736aefCan I set the above configuration? (type 'yes' to accept): yes #接受分配>>> Nodes configuration updated>>> Assign a different config epoch to each node>>> Sending CLUSTER MEET messages to join the clusterWaiting for the cluster to join.....>>> Performing Cluster Check (using node 127.0.0.1:7000)M: 2d2654b26e43f6245b41dc2cae44f7bb6ec846bb 127.0.0.1:7000   slots:0-5460 (5461 slots) master   1 additional replica(s)M: 102d887feee9b5d2db0284ecff83d893f4736aef 127.0.0.1:7001   slots:5461-10922 (5462 slots) master   1 additional replica(s)S: 22bcee4dc0439600aae268b9de093db39d73e2cf 127.0.0.1:7003   slots: (0 slots) slave   replicates c2ba927b42526110a7f840643a1c653057c6b811S: fb7ed8949b7ab36351aabe72a9cb1ae8f859d6d8 127.0.0.1:7004   slots: (0 slots) slave   replicates 2d2654b26e43f6245b41dc2cae44f7bb6ec846bbM: c2ba927b42526110a7f840643a1c653057c6b811 127.0.0.1:7002   slots:10923-16383 (5461 slots) master   1 additional replica(s)S: cc0da6e5df726d65df53849dd92e2edd6ef66760 127.0.0.1:7005   slots: (0 slots) slave   replicates 102d887feee9b5d2db0284ecff83d893f4736aef[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.  #分配槽位成功[root@mcw01 ~/msRedis/cluster]$ 

6.分配好集群后,可以向集群内写入数据了

    redis-cli -c  指定集群模式,登录数据库        登录redis写入数据,发现槽位分配,且重定向之后,集群搭建成功     集群模式登录redis。 [root@mcw01 ~/msRedis/cluster]$ redis-cli -c -p 7000127.0.0.1:7000> keys * (empty list or set)127.0.0.1:7000> set name1 mcw1  #7000上设置数据,分配的槽位是12933,它在10923-16383之间,也就是7002服务上-> Redirected to slot [12933] located at 127.0.0.1:7002OK127.0.0.1:7002> keys *  #添加之后,自动切换到7002服务了1) "name1"127.0.0.1:7002> get name1"mcw1"127.0.0.1:7002> [root@mcw01 ~/msRedis/cluster]$ redis-cli -c -p 7000  #退出重新登录7000服务127.0.0.1:7000> keys *  #key不在7000上(empty list or set)127.0.0.1:7000> get name1  #7000上能get到其它节点上的数据,数据存储在其它节点上的槽位,-> Redirected to slot [12933] located at 127.0.0.1:7002"mcw1"127.0.0.1:7002> keys *  #get到之后,命令行切换到这个数据所在节点上1) "name1"127.0.0.1:7002> [root@mcw01 ~/msRedis/cluster]$ 

 

posted @ 2022-03-06 16:34 马昌伟 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    优雅殿下

    优雅殿下 (王者 段位)

    2018 积分 (2)粉丝 (47)源码

    小小码农,大大世界

     

    温馨提示

    亦奇源码

    最新会员