1.MySQL 主从配置
主从复制的原理 :主服务器开启bin-log(记录了写操作) 从服务器获取到主服务器的bin-log 记录到relay-log中。从服务器在通过异步的线程方式,对于relay-log进行重放操作。
IO线程去主服务器binlog日志拷贝 => 写入到从服务器的relay log中
SQL线程根据relay log变化,自动去执行拷贝过来DML语句,重演
主服务器: bin-log
从服务器: relay-log
DML => MASTER SQL => binlog日志中
SLAVE SQL => 监听MASTER binlog日志变化,一旦监测到主服务器发生变化 => 通过网络IO线程复制到SLAVE从服务器中,放入relaylog中继日志 => SLAVE使用SQL线程重演MASTER SQL操作
[root@master ~]# cat > /etc/my.cnf <<EOF [mysqld] basedir=/export/server/mysql datadir=/export/server/mysql/data socket=/tmp/mysql.sock port=3306 log-error=/export/server/mysql/master.err log-bin=/export/server/mysql/data/binlog server-id=10 character_set_server=utf8mb4 gtid_mode=on enforce_gtid_consistency=on log_slave_updates=1 EOF [root@slave ~]# cat > /etc/my.cnf <<EOF [mysqld] basedir=/export/server/mysql datadir=/export/server/mysql/data socket=/tmp/mysql.sock port=3306 log-error=/export/server/mysql/slave.err log-bin=/export/server/mysql/data/binlog relay-log=/export/server/mysql/data/relaylog server-id=20 character_set_server=utf8mb4 gtid_mode=on enforce_gtid_consistency=on log_slave_updates=1 read-only=on EOF [root@master ~] # systemctl stop mysqld [root@master ~] # rm -rf /export/server/mysql/data/auto.cnf [root@master ~] # rsync -av /export/server/mysql/data/* root@192.168.88.104:/export/server/mysql/data/ [root@master ~] # systemctl start mysqld mysql> CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123'; mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; [root@slave ~] # systemctl start mysqld mysql> change replication source to source_host='192.168.6.150', source_port=3306, source_user='slave', source_password='123', source_auto_position=1; mysql> start replica; mysql> show slave status2.MyCAT 配置
下载地址:https://github.com/MyCATApache/Mycat2,需要编译 可以使用编译好的包 解压完成安装 第一步: mkdir mycat2 # 上传软件到此目录,mycat2-install-template-1.21.zip 以及 mycat2-1.21-release-jar-with-dependencies.jar cd mycat2/ unzip mycat2-install-template-1.21.zip mv mycat /usr/local/ cp mycat2-1.21-release-jar-with-dependencies.jar /usr/local/mycat/lib/ cd /usr/local/mycat/ 第二步:设置数据源 前提:使用管理员账号 mysql01服务器: mysql> CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123'; mysql> GRANT ALL ON *.* TO 'root'@'%'; 配置数据源 cd conf/datasources 把mycat带的数据源配置正确 vim prototypeDs.datasource.json { "dbType":"mysql", "idleTimeout":60000, "initSqls":[], "initSqlsGetConnection":true, "instanceType":"READ_WRITE", "maxCon":1000, "maxConnectTimeout":3000, "maxRetryCount":5, "minCon":1, "name":"prototypeDs", "password":"123", "type":"JDBC", "url":"jdbc:mysql://192.168.6.150:3306/node_db?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8", "user":"root", "weight":0 } 需要修改位置: 1. 代表要连接数据源的MySQL密码 password 2. 代表要连接数据源的MySQL数据库信息 url 3. 代表要连接数据源的MySQL账号 user 启动 #/usr/local/mycat/bin/mycat start 重启 #/usr/local/mycat/bin/mycat restart chmod +x /usr/local/mycat/bin/* shell > /usr/local/mycat/bin/mycat console #确认mycat是否真的启动,查看它的端口 9066 8066 shell > ss -naltp |grep 8066 8066:MyCAT客户端 9066:MyCAT管理端 > 如果启动不成功,报错:Ignoring option MaxPerSize:support was removed in 8.0 原因分析:因为系统不能够在规定时间内,启动mycat,可以设置启动等待时间延长(配置低) 部署好mycat之后,先启动一下,是否能够正常启动。就不需要修改。 # vim conf/wrapper.conf 111 wrapper.startup.timeout=300 ==> 添加这一行 112 wrapper.ping.timeout=120 ==> 默认存在3.Redis 配置
#源码安装方式 wget https://download.redis.io/releases/redis-7.4.0.tar.gz tar -zxvf redis-7.4.0.tar.gz cd redis-7.4.0 make make PREFIX=/usr/local/redis install [root@node5 redis-7.4.0]# mkdir -p /usr/local/redis/conf [root@node5 redis-7.4.0]# cp redis.conf /usr/local/redis/conf/ # 修改redis配置文件 vim /usr/local/redis/conf/redis.conf # 第88行:bind 127.0.0.1 -::1 改为 允许外部IP访问Redis bind 0.0.0.0 # 第112行关闭保护模式,允许外部 IP 访问 protected-mode no # 第310行:daemonize no 改为 开启守护进程,redis后台运行 daemonize yes # 配置环境变量,让redis-cli、redis-server可以全局调用 sudo vim /etc/profile # 在文件末尾添加 export PATH="$PATH:/usr/local/redis/bin" # 生效环境变量 source /etc/profile # 修改Linux内核参数,解决Redis fork时内存警告 sudo vim /etc/sysctl.conf # 添加一行 #内核内存分配策略,`1`表示总是允许内存 overcommit, #消除 Redis RDB 持久化 fork 时的`WARNING overcommit_memory`警告 vm.overcommit_memory = 1 # 加载sysctl配置,立即生效 sysctl -p #查看 [root@node5 ~]# redis-cli -v redis-cli 7.4.0 #启动 [root@node5 ~]# redis-server /usr/local/redis/conf/redis.conf #添加开机自启动 [root@node5 ~]# vim /etc/systemd/system/redis.service [Unit] Description=redis-server After=network.target [Service] Type=forking ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf PrivateTmp=true [Install] WantedBy=multi-user.target #保存退出 [root@node5 ~]# sudo systemctl daemon-reload [root@node5 ~]# pkill redis [root@node5 ~]# ps -ef|grep 6379 root 7999 1771 0 15:10 pts/0 00:00:00 grep --color=auto 6379 [root@node5 ~]# systemctl start redis [root@node5 ~]# ps -ef|grep 6379 root 8158 1 0 15:10 ? 00:00:00 /usr/local/redis/bin/redis-server 0.0.0.0:6379 root 8240 1771 0 15:10 pts/0 00:00:00 grep --color=auto 6379 [root@node5 ~]# systemctl enable redis Created symlink /etc/systemd/system/multi-user.target.wants/redis.service → /etc/systemd/system/redis.service. [root@node5 ~]# systemctl status redis #测试 [root@node5 ~]# redis-cli 127.0.0.1:6379> set aaa 123 OK 127.0.0.1:6379> get aaa "123" 127.0.0.1:6379> exit [root@node5 ~]#4.Redis RDB 快照触发条件 + 禁用 RDB
## ✅ 触发 RDB 快照的 5 种场景(a~e 逐项解析) > > RDB 本质:把内存全量数据写入磁盘二进制文件`dump.rdb` 1. a) 配置自动触发:`save 900 1 300 100 60 10000`(redis.conf 默认)** > > 满足任意一条就后台 fork 子进程执行`bgsave`。 - `save 秒数 变更key数量` - `save 900 1`:900 秒 (15 分钟) 内至少 1 个 key 改动 → 触发 bgsave - `save 300 100`:300 秒 (5 分钟) 内至少 100 个 key 改动 → 触发 bgsave - `save 60 10000`:60 秒内至少 10000 个 key 改动 → 触发 bgsave 2. b) 手动命令:`SAVE` / `BGSAVE`,推荐 BGSAVE** - `SAVE`:**主线程阻塞**,全部数据写入 rdb,大数据量会卡死 redis,生产禁止。 - `BGSAVE`:fork 子进程在后台做快照,主线程继续处理客户端请求,**生产推荐**。 3. c) `FLUSHALL`** 清空所有 key,**会触发 RDB,生成一个空 dump.rdb**,里面没有任何数据,这个 rdb 文件没有业务意义。 > FLUSHDB(只清空当前库)同样也会触发 RDB。 4. d) `SHUTDOWN` 关闭 Redis,且 AOF 没有开启** 正常执行`SHUTDOWN`时,如果**AOF 关闭**,Redis 会自动执行一次`BGSAVE`,生成 rdb 后再退出; > > 如果 AOF 开启,优先走 AOF 持久化,不会触发 RDB。 5. e) 主从复制建立时,自动触发** 从节点第一次和主节点做全量同步(full resync),**主节点自动执行 BGSAVE 生成 RDB**,然后把 rdb 文件传输给从节点,完成数据同步。 > > 补充:**主从复制这个 RDB,是主节点临时用来同步数据的,不会覆盖本地 dump.rdb 持久化文件。** ## ❌ 禁用 RDB 快照两种方式 ### 方式 1:运行时动态关闭(不用重启 redis,临时生效) redis-cli config set save "" 含义:清空所有`save`自动触发规则,不再自动 RDB; > ⚠️ 重启 redis 后,会读取 redis.conf 配置,这个修改会失效。 ### 方式 2:修改 redis.conf 永久关闭(重启后依然生效) 在`redis.conf`写入: save "" > 原来的`save 900 1 ...`那几行要注释掉,配置文件优先级更高。5.Redis AOF 配置
# redis.conf appendonly yes #刷盘策略 `appendfsync`(备份频率)3 个可选值: 1. appendfsync always:每一条写命令都刷盘。最安全,几乎不丢数据;性能最差,生产极少用。 2. appendfsync everysec(✅生产推荐默认):每秒执行一次刷盘。最多丢失1 秒数据,性能与安全性均衡。 3. appendfsync no:交给操作系统内核自动刷盘。Redis 不主动刷,性能最好;宕机可能丢失几十秒数据。 ----------AOF 文件存放路径(Redis6 vs Redis7 区别) ###### Redis 6 及更早 - AOF 文件路径:由 `dir` 配置 + `appendfilename` dir /usr/local/redis/ appendfilename "appendonly.aof" # 最终文件:/usr/local/redis/appendonly.aof ###### Redis7 新增 `appenddirname` Redis7 把 AOF 拆成多个文件(基础文件 + 增量段文件),放在独立目录: dir /usr/local/redis/ appendfilename "appendonly.aof" appenddirname "appendonlydir" # AOF目录:/usr/local/redis/appendonlydir ####AOF 自动重写两个核心参数解析 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb - 第一次:AOF 达到 **64MB**,满足 min-size,触发第一次重写。重写完成后新 AOF 是 64MB。 - 第二次:AOF 持续增长,涨到 **128MB** - 对比上次重写后的 64MB,增量 = 100%,满足 percentage=100 - 同时 128MB ≥64MB,满足 min-size - ✅两个条件同时成立,触发第二次重写。 > > 如果重写后文件是 100MB,那要涨到 200MB 才会满足 100% 增长率条件。6.Redis 主从配置
#主节点 node5,从节点node6 -----------node5配置----master vim /usr/local/redis/conf/redis.conf bind 0.0.0.0 # 允许所有IP连接,公网环境设置redis 密码 protected-mode no # 关闭redis安全保护机制,允许主从、哨兵、集群中各节点之间的相互访问 requirepass rds999 #redis密码1050行 -----------node6配置----slave vim /usr/local/redis/conf/redis.conf bind 0.0.0.0 protected-mode no replicaof node5 6379 replica-read-only yes #主节点密码 masterauth rds999 #重启redis服务器,查看是否成功 info replication ----------扩展 默认:Redis不单独生成日志文件,日志输出到系统日志 `/var/log/messages`,不利于单独排查 redis 问题。用 `logfile` 参数指定独立日志文件 mkdir /var/log/redis -p #修改 redis.conf,找到 356 行左右,写入 logfile "/var/log/redis/redis-server.log" #loglevel notice 日志级别7.Redis 哨兵配置
#redis01/redis02/redis03修改配置 #M## master 配置 node5 bind 0.0.0.0 # 允许所有IP连接 protected-mode no # 禁用保护模式(确保访问受防火墙控制) requirepass rds999 # 设置从服务器连接需要使用密码 masterauth rds999 # 连接主节点时需要使用的主节点密码 #protected-mode:默认代表只允许127.0.0.1访问,集群、哨兵等模式必须关闭此参数 ### 配置slave node6,node7 和上面配置 master一样,我们需要修改端口号和pid 文件,在修改完之后,我们有两种方法配置从服务。 ① 在配置文件中配置从服务 replicaof node5 6379 masterauth rds999 ###配置Sentinel端口 #在sentinel.conf 配置文件中, 我们可以找到port 属性,这里是用来设置sentinel 的端口,一般情况下,至少会需要三个哨兵对 redis 进行监控。 cd /root/redis-7.4.0 cp sentinel.conf /usr/local/redis/conf/ vim /usr/local/redis/conf/sentinel.conf protected-mode no port 26379 daemonize yes ### 配置主服务器的IP和端口 node5、node6、node7 都要配置 sentinel.conf sentinel monitor mymaster node5 6379 2 sentinel auth-pass mymaster rds999 ### 启动所有的Sentinel node5、node6、node7 执行 bin/redis-sentinel /usr/local/redis/conf/sentinel.conf -------------------------------------- 一旦failover发生时,系统会自动调整2个文件,redis.conf更改主节点信息,sentinel.conf最末端会写入一些选举等信息。 如果Master 异常,先主观下线,超过节点阈值,则客观下线。就会进行Master-Slave 转换,将其中一个Slave作为Master,将之前的Master作为Slave Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换8.Redis 集群配置
#分别在/usr/local/redis/conf目录中创建redis7001.conf...redis7006.conf #以redis_01 配置为例 port 7001 cluster-enabled yes cluster-config-file nodes_7001.conf cluster-node-timeout 5000 appendonly yes daemonize yes protected-mode no pidfile /var/run/redis_7001.pid #分别启动 6台redis # cd /usr/local/redis # bin/redis-server conf/redis7001.conf #创建集群(集群最少需要3个主节点) bin/redis-cli --cluster create 192.168.6.101:7001 192.168.6.102:7004 192.168.6.103:7006 192.168.6.104:7003 192.168.6.105:7005 192.168.6.106:7002 --cluster-replicas 1 参数说明: --cluster create创建集群,后面跟Redis及端口号 --cluster-replicas 1,每个主节点默认都有1个从节点 集群模式不需要提前搭建主从架构,而是在创建集群时,系统会自动配置主从,不需要人工干预 bin/redis-cli --cluster create ①主节点 ②主节点 ③主节点 ①从节点 ②从节点 ③从节点 #常见问题:Redis集群要求Redis中不能有数据,包括appendonlydir、dump.rdb、nodes_700X.conf 解决方案:哪个节点报错,就清除哪个节点(以7001为例) ps -ef |grep redis-server 找到7001对应的进程 kill -9 进程号 rm -rf appendonlydir rm -rf dump.rdb rm -rf node_7001.conf 清除完成后,重启Redis bin/redis-server conf/redis7001.conf #测试连接 # bin/redis-cli -c -h 主节点IP地址 -p 7001 选项说明: -c代表已集群的方式进行连接 #关闭集群bin/redis-cli -c -h 节点IP -p 端口号 shutdown #添加新节点redis-cli --cluster add-node node8:7008 node9:7009