• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

redis主从复制

开发技术 开发技术 2周前 (04-07) 8次浏览

一,给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]# 

安装redis


[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

redis主从复制

七在从库中执行主从复制语句并测试:

如果主库在配置文件中设置密码了,那么从库的配置文件中要将主库的密码进行配置,否则无法实现主从同步,并且日志也会报错提示:

[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

 


程序员灯塔
转载请注明原文链接:redis主从复制
喜欢 (0)