使用redis 搭建一主多从环境.
redis 提供一种复制(replication)功能, 可以实现当一台数据库中的数据更新后,自动同更新同步到其他数据库上. 这就是所谓的主从模式.
在这种主从模式中, 数据库分两类:
- 主数据库: 可以进行读写操作;
- 从数据库: 一般可以读操作;
现在模拟在一台电脑上,开启三个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"
...
脚本参数说明
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
….
目前为止, 现在已经将三个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
在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 一主多从已经搭建完毕.