一,给db01和db02两台机器建立互信:
1在db01机器中生成公匙并将公匙传送给db02:
[root@db01 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:POWIr1NfDKW6u/mwTo38iSQcRYDfLEc3N6x/xudYdmY root@db01
The key's randomart image is:
+---[RSA 2048]----+
| .... . |
| . .. o = |
| . +...* . |
| o++++ |
| ooS..+ . |
| . +o+ + + E|
| o.Bo.. o O.|
| .=.*.. . .|
| .oB++ |
+----[SHA256]-----+
[root@db01 ~]# cd ~/.ssh
[root@db01 .ssh]# ls
id_rsa id_rsa.pub
[root@db01 .ssh]# pwd
/root/.ssh
[root@db01 .ssh]# scp -r /root/.ssh/id_rsa.pub root@10.0.0.202:/root/.ssh/
root@10.0.0.202's password:
id_rsa.pub
100% 391 92.8KB/s 00:00
2在db02上 把id_rsa.pub内容添加到/.ssh/authorized_keys 中,至此两台机器就建立了互信
[root@db02 ~]# cd ~/.ssh
[root@db02 .ssh]# ls
id_rsa.pub
[root@db02 .ssh]# cat id_rsa.pub >authorized_keys
[root@db02 .ssh]#
3在db01中登录db02进行测试
[root@db01 .ssh]# ssh root@10.0.0.202
Last failed login: Tue Apr 6 22:18:10 CST 2021 from 10.0.0.201 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Tue Apr 6 22:09:36 2021 from 10.0.0.1
[root@db02 ~]#
4添加域名解析:
[root@db02 opt]# vim /etc/hosts
[root@db02 opt]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.201 db01
10.0.0.201 db02
[root@db02 opt]#
[root@instance-r5y0pf5d ~]# yum install gcc-c++ [root@instance-r5y0pf5d ~]# cd /data/soft [root@instance-r5y0pf5d soft]# ls redis-6.2.1.tar.gz [root@instance-r5y0pf5d soft]# tar -zxf redis-6.2.1.tar.gz [root@instance-r5y0pf5d soft]# ls redis-6.2.1 redis-6.2.1.tar.gz [root@instance-r5y0pf5d soft]# mv redis-6.2.1 /opt/redis [root@instance-r5y0pf5d soft]# cd /opt/redis [root@instance-r5y0pf5d redis]# make [root@instance-r5y0pf5d redis]# make install [root@instance-r5y0pf5d ~]# ll /usr/local/bin total 41404 -rwxr-xr-x 1 root root 17031320 Feb 17 11:08 docker-compose -rwxr-xr-x 1 root root 6548112 Apr 2 10:50 redis-benchmark #性能测试脚本 lrwxrwxrwx 1 root root 12 Apr 2 10:50 redis-check-aof -> redis-server #修复持久化文件的脚本 lrwxrwxrwx 1 root root 12 Apr 2 10:50 redis-check-rdb -> redis-server #修复持久化文件的脚本 -rwxr-xr-x 1 root root 6757032 Apr 2 10:50 redis-cli #登录客户端 lrwxrwxrwx 1 root root 12 Apr 2 10:50 redis-sentinel -> redis-server #构建哨兵模式依赖的命令 -rwxr-xr-x 1 root root 12053048 Apr 2 10:50 redis-server #启动服务 [root@instance-r5y0pf5d ~]#
三源服务器和目标服务器都需要安装sync同步软件并将db01中编译后的redis拷贝到db02中:
[root@db01 opt]# yum -y install rsync
[root@db01 opt]# rsync -avz redis_cluster db02:/opt/
四修改db02中配置文件的端口号:
[root@db02 opt]# vim redis_cluster/redis_6379/conf/redis_6379.conf
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 10.0.0.202 127.0.0.1
### 监听端口
port 6379
### pid 文件和 log 文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为 0
databases 16
### 指定本地持久化文件的文件名,默认是 dump.rdb
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379
save 600 1
save 300 10
save 60 100
requirepass 123456
~
五在db02中执行make install
[root@db02 opt]# cd /opt//redis_cluster/
[root@db02 redis_cluster]# ls
redis redis-3.2.9 redis_6379
[root@db02 redis_cluster]# cd redis
[root@db02 redis]# ls
00-RELEASENOTES CONTRIBUTING deps Makefile README.md runtest runtest-sentinel src utils
BUGS COPYING INSTALL MANIFESTO redis.conf runtest-cluster sentinel.conf tests
[root@db02 redis]# make install
cd src && make install
make[1]: 进入目录“/opt/redis_cluster/redis-3.2.9/src”
Hint: It's a good idea to run 'make test' ;)
INSTALL install
INSTALL install
INSTALL install
INSTALL install
INSTALL install
make[1]: 离开目录“/opt/redis_cluster/redis-3.2.9/src”
[root@db02 redis]#
六在db02中启动redis:
[root@db02 redis]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@db02 redis]# ps -ef|grep redis
root 1934 1 0 01:16 ? 00:00:00 redis-server 10.0.0.202:6379
root 1938 957 4 01:17 pts/0 00:00:00 grep --color=auto redis
[root@db02 ~]# redis-cli
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> keys *
如果启动不起来就查看日志看看是什么原因,下图是没有创建目录所以启动不起来:
[root@db02 redis_6379]# tail -f /opt/redis_cluster/redis_6379/logs/redis_6379.log
七在从库中执行主从复制语句并测试:
如果主库在配置文件中设置密码了,那么从库的配置文件中要将主库的密码进行配置,否则无法实现主从同步,并且日志也会报错提示:
[root@db02 ~]# tail -f /opt/redis_cluster/redis_6379/logs/redis_6379.log
1339:S 07 Apr 21:54:33.761 * (Non critical) Master does not understand REPLCONF listening-port: -NOAUTH Authentication required.
1配置从库db02文件并执行主从语句进行测试
127.0.0.1:6379> shutdown #关闭redis后在配置文件中写入主库密码
not connected>
[root@db02 redis_6379]# vim /opt/redis_c++luster/redis_6379/conf/redis_6379.conf
[root@db02 redis_6379]# cat /opt/redis_cluster/redis_6379/conf/redis_6379.conf
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 10.0.0.202 127.0.0.1
### 监听端口
port 6379
### pid 文件和 log 文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为 0
databases 16
### 指定本地持久化文件的文件名,默认是 dump.rdb
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379
save 600 1
save 300 10
save 60 100
requirepass 123456
masterauth 123456
[root@db02 redis_6379]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@db02 redis_6379]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> slaveof 10.0.0.201 6379
OK
127.0.0.1:6379> get k1
"v1;"
注意执行上面的热更新语句有两条风险:1一旦从库执行了slaveof 10.0.0.201 6379,那么从库之前的数据将会被全部清空。2一旦主库误执行了slaveof 10.0.0.202 6379语句,那么主库的数据也就都没了,公司的所有数据积累将全部清零,你也可能面临着坐牢!
为了避免上述情况的发生,建议使用配置文件进行主从配置:
#修改配置文件
[root@db02 redis_6379]# vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 10.0.0.202 127.0.0.1
### 监听端口
port 6379
### pid 文件和 log 文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为 0
databases 16
### 指定本地持久化文件的文件名,默认是 dump.rdb
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379
save 600 1
save 300 10
save 60 100
requirepass 123456
masterauth 123456
slaveof 10.0.0.201:6379
#重启redis后测试
[root@db02 redis_6379]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> shutdown
not connected>
[root@db02 redis_6379]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@db02 redis_6379]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> get k1
"v123"
127.0.0.1:6379>
备注:
如果从库要和主库脱离关系,并且不重启,保留旧数据,只需要在从库中执行slaveof no one
也就是说建立主从的语句是slaveof 10.0.0.201:6379,取消主从的语句是slaveof no one
重启后恢复配置文件中的规则
127.0.0.1:6379> slaveof no one OK 127.0.0.1:6379> get k1
127.0.0.1:6379> config get slaveof #查看是否主从关系脱离
1) "slaveof"
2) ""
127.0.0.1:6379>
[root@db02 redis_6379]# pkill redis
[root@db02 redis_6379]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
[root@db02 redis_6379]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> config get slaveof
1) “slaveof”
2) “10.0.0.201 6379”
127.0.0.1:6379>
八如果说我们在执行主从语句前已经备份了rdb数据,一旦我们在主库中误操作执行了主从同步语句,恢复的方法如下:
如果说已经在出库中误操作了slaveof 10.0.0.202 6379
补救措施:
1先在主库中断掉主从关系slave no one,以保证主库谁都不复制了
2停掉主库pkill redis
3进入配置文件注销掉aof,防止redis不读取rdb文件
#appendonly yes
#appendfilename "appendonly.aof"
#appendfsync everysec
#no-appendfsync-on-rewrite no
#auto-aof-rewrite-percentage 100
#auto-aof-rewrite-min-size 64mb
#aof-load-truncated yes
4将aof文件移走或者删除mv /data/redis_cluster/redis_6379/appendonly.aof /tmp/
5删除掉rdb文件:rm /data/redis_cluster/redis_6379/redis_6379.rdb
6恢复备份文件:cp /data/redis_cluster/redis_6379/redis_6379.rdb.bak /data/redis_cluster/redis_6379/redis_6379.rdb
7启动redis:redis-server /data/redis_cluster/redis_6379/conf/redis_6379.conf
8登录测试:redis-cli