Redis的集群配置
如果我们redis的压力很大,如果我们的并发高到我们读数据和写数据都有了很大压力。 那么我们可能就需要把redis分开部署,并且配置为一个『主从』的状态。
在服务器上构筑Redis的集群配置:
1.切换root用户
su - centos
输入密码 ******
sudo su
输入密码 ******
2.安装前提包
yum install gcc-c++
yum install -y ruby
yum install -y rubygems
3.下载redis4.0.7
wget http://download.redis.io/releases/redis-4.0.7.tar.gz
4.移动redis至/usr/local/
mv redis-4.0.7.tar.gz /usr/local/
cd /usr/local/
5.解压redis安装包
tar zxf redis-4.0.7.tar.gz
6.映射redis快捷文件夹
ln -s /usr/local/redis-4.0.7 /usr/local/redis
cd /usr/local/redis
7.编译
make
8.映射redis bin快捷文件夹
ln -s /usr/local/redis/src /usr/local/redis/bin
9.备份配置文件
mkdir /usr/local/redis/conf_bak
cp -rp /usr/local/redis/*.conf /usr/local/redis/conf_bak/
10.修改配置文件redis.conf
vi /usr/local/redis/redis.conf
修改配置如下:
protected-mode yes
##绑定的主机地址
##bind <本机ip>
bind 10.76.64.16
##Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize yes
##设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
#slaveof <masterip> <masterport>
slaveof 10.76.64.16 6379 (为主服务器的 ip端口号)
##当master服务设置了密码保护时,slav服务连接master的密码
#masterauth <master-password>
masterauth redis2ac
##设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
#requirepass <master-password>
requirepass redis2ac
11.修改哨兵配置
vi /usr/local/redis/sentinel.conf
修改配置如下:
##bind <本机ip>
bind 10.76.64.16
##Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize yes
##sentinel monitor mymaster <主机master ip> <主机master port> 1
sentinel monitor mymaster 10.76.64.16 6379 1(为主服务器的 ip端口号)
##sentinel auth-pass mymaster <主机master redis密码>
sentinel auth-pass mymaster redis2ac
12.redis服务启动
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
13.reids哨兵进程启动
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf
注意:配完之后,项目在Linux环境,启动出现问题。
错误信息:
Error redis clients jedis HostAndPort cant resolve localhost address
07-Aug-2017 15:44:52.529 SEVERE [localhost-startStop-1] redis.clients.jedis.HostAndPort.getLocalHostQuietly cant resolve localhost address java.net.UnknownHostException: template: template: Name or service not known at java.net.InetAddress.getLocalHost(InetAddress.java:1473) at redis.clients.jedis.HostAndPort.getLocalHostQuietly(HostAndPort.java:105) at redis.clients.jedis.HostAndPort.<clinit>(HostAndPort.java:12) at redis.clients.jedis.JedisFactory.<init>(JedisFactory.java:37) at redis.clients.jedis.JedisPool.<init>(JedisPool.java:185) at redis.clients.jedis.JedisPool.<init>(JedisPool.java:162) at redis.clients.jedis.JedisPool.<init>(JedisPool.java:92) at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.createRedisPool(JedisConnectionFactory.java:227)
解决办法:
- 1.查看Linux系统的主机名
-
[root@template conf]# hostname DSWX [root@template conf]#
- 2.查看/etc/hosts文件中是否有127.0.0.1对应主机名,如果没有则添加 DSWX
-
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 DSWX ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
再次启动即可。
redis主从复制过程:
当配置好slave后,slave与master建立连接,然后发送sync命令。无论是第一次连接还是重新连接,master都会启动一个后台进程,将 数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存。后台进程完成写文件后,master就发送文件给slave,slave将 文件保存到硬盘上,再加载到内存中,接着master就会把缓存的命令转发给slave,后续master将收到的写命令发送给slave。
如果master同时收到多个slave发来的同步连接命令,master只会启动一个进程来写数据库镜像,然后发送给所有的slave。master同步数据时是非阻塞式的,可以接收用户的读写请求。然而在slave端是阻塞模式的,slave在同步master数据时,并不能够响应客户端的查询。
可以在master禁用数据持久化,只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化
拥有主从服务器的好处(从服务器是只读的,可以一主多从)
1. 主服务器进行读写时,会转移到从读,减轻服务器压力
2. 热备份 主从都可以设置密码,也可以密码不一致