mariadb和redis主从复制
mariadb
步骤
- 主数据库在修改数据后,会有data changes(数据变化)记录,并且会将变化的sql语句记录到本地的bin-log二进制日志文件中
- 从库会开启一个io线程来读取主库的bin-log日志文件中,当发现日志文件有变化则读取变化日志
- 从库将读取到的日志文件写道本地的relay-log(中继日志文件中)
- 从库会起一个线程读取中继日志文件内容,当发现该日志文件发生改变时,将改变的内容读取
- 将读取的内容转化成sql语句并执行,这样就可以将主库数据同步到从库
实际操作
准备:准备号两台安装了mariadb数据库的服务器,ip分部是主库192.168.1.10,从库:192.168.1.20
1.停止mariasdb:systemctl stop mariadb
2.修改主服务器的配置文件,添加下列配置
[mysqld] # 自定义一个唯一id值 server-id=1 # 本地存储bin-log日志文件名 log-bin=qishi-logbin
3.启动mariadb:systemctl srtart mariadb
4.创建从库读取bin-log日志文件的用户并授权
#创建用户 create user 'root'@'192.168.1.20' identified by '123456'; #用户授权 grant replication slave on *.* to 'root'@'192.168.1.20'; # 刷新授权 flush privileges
5.进入主数据库并且对数据库进行锁表只读(防止在配置从库时数据发生该表)
# 进入mysql数据库 mysql -uroot -p123456 # 锁表 flush table with read lock;
6.查看主库状态
7.将主数据库原来数据导出
mysqldump -u root -p --all-databases > /opt/qishimaster.sql
8.停止从库数据库服务:systemctl stop mariadb
9.在从库数据库添加配置文件
# 与主库一样设置id值 server-id=3 # 设置为只读模式 read-only=true
10.启动数据库systemctl restart mariadb
11.将主数据库备份数据复制到从数据库中:scp 192.168.1.10:/opt/qishimaster.sql /opt/
12.进入到从数据库中将数据导入到数据库内:source /opt/qishimaster.sql
13.在从数据库内配置主库配置
#主库ip change master to master_host='192.168.1.10', #用户名 master_user='root', #密码 master_password='123456', #bin-log文件名,在上图看 master_log_file='qishi_logbin.000001', # 状态码 master_log_pos=479;
14.在从数据库启动同步开关:start slave;
15.解锁主库只读:unlock tables;
redis主从同步的原理
-
-
接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。
-
当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。
-
主服务器将缓冲区储存的所有写命令发送给从服务器执行。
具体配置
主数据库配置
# 主数据库端口
port 6380
# 是否为守护模式,即是否后台运行
daemonize yes
# 存放pid文件路径
pidfile /data/6380/redis.pid
# 保存日志级别
loglevel notice
# 日志文件目录
logfile "/data/6380/redis.log"
# rdb持久化存储设置
dbfilename dump.rdb
# 文件目录
dir /data/6380
# 是否不允许远程连接
protected-mode no
从数据库配置
# 主数据库端口
port 6380
# 是否为守护模式,即是否后台运行
daemonize yes
# 存放pid文件路径
pidfile /data/6380/redis.pid
# 保存日志级别
loglevel notice
# 日志文件目录
logfile "/data/6380/redis.log"
# rdb持久化存储设置
dbfilename dump.rdb
# 文件目录
dir /data/6380
# 是否不允许远程连接
protected-mode no
再实际应用过程中,通常会有一个主数据库多个从数据库,当主数据出现问题时,从数据库也就随机挂了,此时我们可以通过设置一个从数据库为主数据库让整个数据库群正常运行
我们可以通过手动切换或者启动哨兵自动切换
手动切换
在要设置为主数据库内执行代码 slaveof no one ,在其他数据库中执行 SLAVEOF no one ,然后再执行 SLAVEOF 新主数据库ip 端口号即可
redis哨兵
redis哨兵起始也是一个redis服务器,只不过该服务器的作用不是用来存储数据,而是监控数据库的状态,所以可以通过配置文件启动哨兵服务器即可,配置如下
# 哨兵端口
port 26380
# 哨兵运行后数据存储目录
dir /data/26380
# 日志文件名
logfile "26380.log"
# qishimaster 是自定义名,127.0.0.1 6380是主数据库ip,2是当有多个哨兵服务器时,至少有2个哨兵服务器任务主服务器断开才切换主数据库
sentinel monitor qishimaster 127.0.0.1 6380 2
# 主数据库掉线60秒后任务数据库掉线
sentinel down-after-milliseconds qishimaster 60000
# 当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
sentinel parallel-syncs qishimaster 1
# 故障转移超时时间为180000毫秒
sentinel failover-timeout qishimaster 180000
daemonize yes
启动哨兵服务器
redis-sentinel 配置文件名