redis 主从搭建

主从服务器

使用redis 搭建一主多从环境.
redis 提供一种复制(replication)功能, 可以实现当一台数据库中的数据更新后,自动同更新同步到其他数据库上. 这就是所谓的主从模式.

在这种主从模式中, 数据库分两类:
- 主数据库: 可以进行读写操作;
- 从数据库: 一般可以读操作;

实战

1. 环境准备

现在模拟在一台电脑上,开启三个redis 实例,监听端口分别是6379(默认端口), 6380, 6381 . 使用redis 6379 端口作为master; 安装过程此处省略…

##### 启动三个实例

###### 配置初始化脚本
在redis 解压源码目录utils 文件夹有一个redis_init_script的初始化脚本文件. 将脚本文件复制到 /etc/init.d 目录中 分别命名为redis_6379, redis_6380, redis_6381; 并修改端口属性REDISPORT 如下:

6380:

#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

REDISPORT=6380
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"
...

6381:

#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

REDISPORT=6381
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"
...

6379:

#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"
...

脚本参数说明

  • redisport: 指定程序开启的端口号
  • EXEC: redis程序安装目录(一般是默认路径)
  • CLIEXEC: redis连接客户端程序路径(一般都是路径)
  • PIDFILE: 当redis 做为守护进程启动时,进程pid 存储位置
  • CONF : redis启动时加载的配置文件路径
创建配置管理文件夹

redis 默认会开启RDB持久化,所以需要配置管理持久化文件的位置;
1. 创建 /etc/redis 文件夹; 作用:存放redis配置文件(redis_6379.conf redis_6380.conf redis_6381.conf), 为什么要在etc 下创建redis 文件夹, 如果想切换到其他文件夹,修改直接修改redis_* 脚本
2. 创建 /var/redis/6379, /var/redis/6380, /var/redis/6381 目录; 作用: 用于存储持久化文件目录(配置路径见redis_端口.conf)

配置文件

复制redis 源码路径下redis.conf 到etc/redis 文件夹zhong, 命名:redis_6379.conf redis_6380.conf redis_6381.conf

修改配置文件
1. 设置redis守护进程 daemonize yes
2. 配置redis Pid 位置 pidfile /var/run/redis_端口号.pid
3. 配置监听端口号 port 端口号
4. 配置持久化文件位置 dir /var/redis/端口

分配权限,并启动

sudo chmod +x /etc/init.d/redis_6379

etc/init.d/redis_6381 start

root@ubuntu:/# sudo chmod +x etc/init.d/redis_6381 
root@ubuntu:/# 
root@ubuntu:/# 
root@ubuntu:/# etc/init.d/redis_6381 start
Starting Redis server...
root@ubuntu:/# 
root@ubuntu:/# 
root@ubuntu:/# netstat -ano |grep 6381
tcp        0      0 0.0.0.0:6381            0.0.0.0:*               LISTEN      off (0.00/0/0)
tcp6       0      0 :::6381                 :::*                    LISTEN      off (0.00/0/0)
root@ubuntu:/# redis-cli -p 6381
127.0.0.1:6381> auth ricisung
OK
127.0.0.1:6381> keys *
(empty list or set)
127.0.0.1:6381> 
127.0.0.1:6381> 
127.0.0.1:6381> 
127.0.0.1:6381> 
127.0.0.1:6381> 
127.0.0.1:6381> quit

….

2. 配置过程

目前为止, 现在已经将三个redis实例启动起来,三个独立的redis实例,没有任何关联,目前他们都是master;
通过info replication 查看

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> 
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> 
127.0.0.1:6379> 

启动主从的两种方式
1. 通过命令启动
启动6379 端口后, 在启动6380,和6381 时候指定6379为master;

redis-server –port 6380 –slaveof 127.0.0.1 6379
redis-server –port 6381 –slaveof 127.0.0.1 6379

不加建议使用因为没有作为守护进程启动,这种启动方式根据客户端进程创建的;
2. 通过修改配置启动
修改配置文件 端口.config
slaveof 选项默认是禁止的 :

# slaveof <masterip> <masterport>

slaveof 127.0.0.1 6379
3. 运行中配置
直接使用slaveof 命令; 语法 slaveof masterip masterport

修改完配置重启redis_6380 和redis_6381 ,然后使用info replication 查看

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1468133220
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6380> 
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.0.223,port=6381,state=online,offset=85,lag=1
master_repl_offset:85
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:84

此时要小心了,如果master 有密码保护, slave 主机显示已经连接上了master, 而master显示没有客户端连接;

修改slave的配置 masterauth masterpassword

3. 测试

在master主机上添加删除修改内容,分别从slave 获取判断是否正确;

测试master info replication 信息如下:

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.0.223,port=6381,state=online,offset=617,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=617,lag=0
master_repl_offset:617
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:616
127.0.0.1:6379> 
创建测试

master:

127.0.0.1:6379> 
127.0.0.1:6379> hmset l2 l2_a1 asdf l2_a2 sjdiw
OK
127.0.0.1:6379> hgetall l2
1) "l2_a1"
2) "asdf"
3) "l2_a2"
4) "sjdiw"
127.0.0.1:6379>

6380:

127.0.0.1:6380> hgetall l2
1) "l2_a1"
2) "asdf"
3) "l2_a2"
4) "sjdiw"
127.0.0.1:6380> 

6381:

root@ubuntu:/# redis-cli -p 6381
127.0.0.1:6381> auth ricisung
OK
127.0.0.1:6381> hgetall l2
1) "l2_a1"
2) "asdf"
3) "l2_a2"
4) "sjdiw"
127.0.0.1:6381> 

到此redis 一主多从已经搭建完毕.

你可能感兴趣的:(Nosql)