主节点数据更新后根据配置和策略,自动同步到从节点,Master以写为主,Slave以读为主。
redis主从复制的作用:
本章节配置的redis主从复制,只是在一台机器上两个不同端口上配置master和slave,实现一个最简单的redis主从复制架构。
安装redis
redis下载地址:https://redis.io/download,这里我下载的是redis-5.0.4(只有redis3.0以上的版本才能搭建redis集群)。
下载之后解压
sudo tar -xzf redis-5.0.4.tar.gz -C /usr/local
cd redis-5.0.4
sudo make
在make命令编译时候报出一个bug:error:jemalloc/jemalloc.h:No such file or directory。
原因:Redis 2.4版本之后,默认使用jemalloc来做内存管理,因为jemalloc被证明解决fragmentation problems(内存碎片化问题)比libc更好。报出这个错误原因是没有jemalloc而只有libc。
解决办法:指定libc做redis的内存管理,在make命令上指定参数。
sudo make MALLOC=libc
make完后 redis-5.0.4/src目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序都位于安装目录 src 目录下。
复制redis.conf
redis安装完毕后可以把原来自带的redis.conf改名为redis1.conf,用来做Master-redis启动时指定的配置文件;从redis1.conf复制出一份redis2.conf的配置文件,用来做Slave-redis启动时指定的配置文件。
cd /usr/local/redis-5.0.4
mv redis.conf redis1.conf
cp redis1.conf redis2.conf
配置redis.conf
修改配置文件
vi redis1.conf
修改如下配置项
#后端模式运行
daemonize yes
#指定pid文件,把pidfile生成到有权限的目录下
pidfile /usr/local/redis-5.0.4/redis1.pid
修改配置文件
vi redis2.conf
修改如下配置项,并加入slaveof 127.0.0.1 6379
port 6380
#后端模式运行
daemonize yes
#指定pid文件,把pidfile生成到有权限的目录下
pidfile /usr/local/redis-5.0.4/redis_6380.pid
#指定redis集群的主节点
slaveof 127.0.0.1 6379
启动两个redis实例客户端,启动时指定配置文件(一个主节点,一个从节点)
cd /usr/local/redis-5.0.4/src
./redis-server ../redis1.conf
./redis-server ../redis2.conf
启动redis客户端,连接主节点
./redis-cli -h 127.0.0.1 -p 6379
输入info指令
info
在Replication显示项可以看出,连接的此redis实例role(角色)为master,有一个Slave(从节点)与之连接,Slave的ip和端口为127.0.0.1和6380。
连接master(127.0.0.1:6379的redis实例)
./redis-cli -h 127.0.0.1 -p 6379
在master中设置键值,并取值
set name "atuo"
get name
连接slave(127.0.0.1:6380的redis实例)
./redis-cli -h 127.0.0.1 -p 6380
在slave上取出在master上设置的键的值(取值成功)
get name
我们发现master和slave已经实现了数据的同步
而此时我们若想在slave上设置键值,是会报错的,可见redis的主从复制实现了读写分离
set age 3
在这里我们只是在一台机器上演示了一下配置redis主从复制的一个最简单的模型,而在真正的应用开发中,redis的主从复制配置肯定是分开在不同的机器上的。