怎样进行差异数据库的集群操纵?--从部署谈起,本日来看MySQL和NoSql数据库 ...

打印 上一主题 下一主题

主题 1021|帖子 1021|积分 3063

篇幅较长,主要分为mysql和Redis两部门。找想要的部门可见目录食用。。

目录
什么是集群?为什么要集群?
1.1 数据库主要分为两大类:关系型数据库与 NoSQL 数据库
1.2 为什么还要用 NoSQL 数据库呢?
                      -------------------华丽分割线--------------
一、关系型数据库MySQL
1.部署mysql
1.1安装依赖
1.2下载解压源码包
1.3源码编译安装
1.4部署mysql
测试安装效果:
集群方式
mysql的主从复制模式:
异步复制
实验1:添加slave1
1.环境设置
​编辑
2.开启slave,测试:
实验2:在有数据的环境下添加slave2
1.环境设置
2.测试
实验3:延迟复制
实验4:慢查询日志
​编辑
实验5:并行复制
测试:
半同步复制
1.gtid模式
2.半同步模式
组复制(高可用)
组复制的流程图:
实验
1.初始化数据库数据,防止出现问题
2.向本地剖析文件中设置其他几台主机内容
3.设置sql内容
4.设置别的两台
5测试
MySQL路由
MySQL-router的部署方式
测试
MySQL高可用--MHA
1.MHA简介
2.MHA的部署
(1)搭建主两从架构
(2)安装MHA所必要的软件
​编辑
(3)设置MHA管理环境
1.天生设置目录和设置文件
2.编写一个设置文件
2.检测设置
3.MHA故障切换
(1)master未出现故障手动切换
​编辑
(2)master出现故障手动切换
​编辑
(3)自动切换
4.添加VIP功能
二、Redis非关系型数据库
1.Redis特点
2.Redis应用场景
3.缓存的实现流程
数据更新操纵流程
数据读操纵流程
4.Redis的安装
4.1.rpm包方式安装
4.2.源码安装
4.3.基本操纵
(1)检察设置(赤色是命令,黄色是结果)
(2)写入和读取数据
(3)选择数据库 Redis中有0-15个数据库
(4)改变键名
(5)设定数据过期时间 / 持久化(设置时间版)保持
(6)删除
(7)判定key的存在
(8)清空当前库
(9)清空所有库
5.Redis主从复制
5.1.环境
5.2.设置主从同步
(1)修改master节点的设置文件
(2)设置slave节点
(3)测试
6.Redis的哨兵(高可用)
6.1.哨兵的实验过程
6.2架构缺陷
7.Redis Cluster(无中心化设计)
7.1.工作原理
7.2创建Redis Cluster的要求
7.3部署Redis Cluster
7.4集群扩容
7.5集群维护
总结


什么是集群?为什么要集群?




  • 普通一点来说,就是让若干台盘算机联合起来工作 (服务),可以是并行的,也可以是做备份
  • 数据库集群的特性就是 有多台呆板,这多台呆板上都有数据库, 这些数据库的数据是完全一样的,即相当于一套数据的多个副本。集群就是要保证这些副本的及时或定时实(可以延时一会)的同步,即如果一台呆板上的数据更改时,集群系统要保证这个更改及时或定时实的应用到所有的呆板上,实现数据同步。
集群主要办理两个问题:

  • 负载平衡:这个主要是办理访问量大的问题。一台呆板的读写能力是有限的,当同时有大量用户访问的时候,仅一台呆板大概就会因负载过大而垮掉。而利用集群后,集群系统会将访问量平衡到每台呆板上,也即多台呆板分担了访问量,这就达到了负载平衡的目的。
  • 当机:当只有一台呆板时,如果这台呆板因不测当时机必要停机维护,那么此时系统就不能访问,对于一些利用量大,利用频仍的系统而言,如许是肯定不行的。如果利用集群,只有集群中有一台呆板还在运行,就能让系统继承运行下去,而且对于重新启动的呆板,能很快的同步在停机时间用户所做的更改。我的当前公司很喜好用顶这个词,当一台呆板垮掉时,能立马有另一台呆板顶上。
1.1 数据库主要分为两大类:关系型数据库与 NoSQL 数据库



  • 关系型数据库,是创建在关系模子底子上的数据库,其借助于聚集代数等数学概念和方法来处置惩罚数据库 中的数据主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库。
  • NoSQL 数据库,全称为 Not Only SQL,意思就是实用关系型数据库的时候就利用关系型数据库,不适 用的时候也没有必要非利用关系型数据库不可,可以思量利用更加合适的数据存储。主要分为暂时性键 值存储(memcached、Redis)、永久性键值存储(ROMA、Redis)、面向文档的数据库 (MongoDB、CouchDB)、面向列的数据库(Cassandra、HBase),每种 NoSQL 都有其特有的利用 场景及优点。
1.2 为什么还要用 NoSQL 数据库呢?

主要是由于随着互联网发展,数据量越来越大,对性能要求越来越高,传统数据库存在着天赋性的缺 陷,即单机(单库)性能瓶颈,而且扩展困难。如许既有单机单库瓶颈,却又扩展困难,天然无法满意 日益增长的海量数据存储及其性能要求,所以才会出现了各种差异的 NoSQL 产物,NoSQL 根本性的上风在于在云盘算期间,简单、易于大规模分布式扩展,而且读写性能非常高

                      -------------------华丽分割线--------------

实验环境:

  • vmware支持的redhat7.9虚拟机若干(做MySQL)9.4虚拟机若干台(做Redis)
  • 虚拟机可联网,无其他操纵的全新环境
  • 虚拟机每一个都可以进行yum下载,拥有顺畅下载的本地堆栈
  • 关闭防火墙,selinux
一、关系型数据库MySQL

如果你安装的redhat7.9是带图形化的可以利用以下命令禁掉:
   systemctl set-default multi-user.target    #这条命令会永久关闭图形化
  reboot   #重启即可
  1.部署mysql



  • 在企业中90%的服务器操纵系统均为Linux
  • 在企业中对于Mysql的安装通常用源码编译的方式来进行(源码编译相比软件安装其可拓展性,功能性更强,对于利用者来说也更加机动)
步调:


  • 安装依赖
  • 下载解压源码包
  • 源码编译安装mysql
  • 利用部署
1.1安装依赖

   yum install cmake gcc-c++ openssl-devel \ ncurses-devel.x86_64 libtirpc-devel-1.3.3-8.el9_4.x86_64.rpm rpcgen.x86_64 -y 
  1.2下载解压源码包

可自行去官网查找包,用xftp传输(速率快)


1.3源码编译安装

这一步时间比力漫长,稍作等待
  1. [root@mysql-node10 mysql-5.7.44]# cmake \
  2. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #指定安装路径
  3. -DMYSQL_DATADIR=/data/mysql \ #指定数据目录
  4. -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \ #指定套接字文件
  5. -DWITH_INNOBASE_STORAGE_ENGINE=1 \ #指定启用INNODB存储引擎,默认用myisam
  6. -DWITH_EXTRA_CHARSETS=all \ #扩展字符集
  7. -DDEFAULT_CHARSET=utf8mb4 \ #指定默认字符集
  8. -DDEFAULT_COLLATION=utf8mb4_unicode_ci \ #指定默认校验字符集
  9. -DWITH_BOOST=/root/mysql-5.7.44/boost/boost_1_59_0/ #指定c++库依赖
  10. [root@mysql-node10 mysql-5.7.44]# make -j2 #-j2 表示有几个核心就跑几个进程
  11. [root@mysql-node10 mysql-5.7.44# make install
复制代码
出现以下画面说明就成功下载中了:

这一步出现问题的小伙伴看这里:

牢记要删除缓存再重新检测
1.4部署mysql

  1. mkdir /data/mysql/
  2. chown -R /data/mysql/
  3. #生成启动脚本
  4. [root@node10 ~]# cd /usr/local/mysql/support-files/
  5. [root@node10 support-files]# cp mysql.server /etc/init.d/mysqld
  6. #修改环境变量
  7. [root@node10 ~]# vim ~/.bash_profile
  8. export PATH=$PATH:/usr/local/mysql/bin
  9. [root@node10 ~]# source ~/.bash_profile
  10. #生成配置文件
  11. [root@node10 my.cnf.d]# vim /etc/my.cnf
  12. [mysqld]
  13. datadir=/data/mysql     #指定数据目录
  14. socket=/data/mysql/mysql.sock     #指定套接字
  15. symbolic-links=0     #数据只能存放到数据目录中,禁止链接到数据目录
  16. #数据库初始化建立mysql基本数据
  17. [root@node10 ~]# mysqld --initialize --user=mysql
  18. [root@node10 ~]# /etc/init.d/mysqld start
  19. #数据库安全初始化
  20. [root@node10 ~]# mysql_secure_installation
  21. Enter password for user root: #输入当前密码
  22. New password: #输入新密码
  23. Re-enter new password: #重复密码
  24. Press y|Y for Yes, any other key for No: no #是否启用密码插件
  25. Change the password for root ? ((Press y|Y for Yes, any other key for No) : no  
  26. #是否要重置密码
  27. Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
  28. Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
  29. Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
  30. Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
复制代码
测试安装效果:

(如下图则安装完成)

集群方式

mysql的主从复制模式:

异步复制

        MySQL异步复制是主从复制过程中默认的复制模式。主从复制涉及三个线程,master I/O线程、slave I/O线程、slave sql线程。因为是异步复制,所以master事件的提交,不必要经过slave的确认,即master I/O线程提交事件后,不必要等待slave I/O线程的回复确认,master并不保证binlog肯定写入到了relay log中;而slave I/O把binlog写入relay log后,由slave sql线程异步执行应用到slave mysql中,slave I/O也不必要slave sql的回复确认,并不保证relay log日志完整写入到了mysql中。

实验1:添加slave1

1.环境设置

主机名称ip脚色
mysql-node1172.25.254.10master
mysql-node2172.25.254,20slave

  1. 配置master
  2. [root@mysql-node10 ~]# vim /etc/my.cnf
  3. [mysqld]
  4. datadir=/data/mysql
  5. socket=/data/mysql/mysql.sock
  6. symbolic-links=0
  7. log-bin=mysql-bin        #添加
  8. server-id=1                #添加
  9. [root@mysql-node10 ~]# /etc/init.d/mysqld restart   
  10. #进入数据库配置用户权限
  11. [root@mysql-node10 ~]# mysql -plee
  12. ##生成专门用来做复制的用户,此用户是用于slave端做认证用
  13. mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'lee';
  14. mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';   ##对这个用户进行授权
  15. 配置slave
  16. [root@mysql-node2 ~]# vim /etc/my.cnf
  17. [mysqld]
  18. datadir=/data/mysql
  19. socket=/data/mysql/mysql.sock
  20. symbolic-links=0
  21. server-id=2    #添加
  22. [root@mysql-node2 ~]# /etc/init.d/mysqld restart
  23. [root@mysql-node2 ~]# mysql -plee
复制代码


定位mysql-node2

2.开启slave,测试:

定位mysql-node1

实验2:在有数据的环境下添加slave2

1.环境设置

主机名称ip脚色
mysql-node1172.25.254.10master
mysql-node2172.25.254,20slave1
mysql-node3 172.25.254.30
slave2
   #完成底子设置
  [root@mysql-node3 ~]# vim /etc/my.cnf
  [mysqld]
  datadir=/data/mysql
  socket=/data/mysql/mysql.sock
  symbolic-links=0
  server-id=3
  
  [root@mysql-node3 ~]# /etc/init.d/mysqld restart
  跟实验1稍有差异,这里必要先从master节点备份数据(在企业中备份必要锁表以保证备份前后的数据同等)
   [root@mysql-node1 ~]# mysqldump -uroot -plee lee > lee.sql
  因为此时的mysql-node3中没有任何数据,所以必要拉平数据
   #利用master节点中备份出来的lee.sql在slave2中拉平数据
  [root@mysql-node3 ~]# mysql -uroot -plee -e "create database lee;"
  [root@mysql-node3 ~]# mysql -uroot -p lee < lee.sql
  [roort@mysql-node3~]#mysql -uroot -plee -e "select * from lee.userlist;"
  设置slave2的功能(同实验一)
注意:master的状态大概会发生改变,要查了之后里面立马设置slave
   [root@mysql-node3 ~]# mysql -uroot -plee
  mysql> CHANGE MASTER TO
  MASTER_HOST='172.25.254.10',
  MASTER_USER='repl',
  MASTER_PASSWORD='lee',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=1251;
  
  mysql> start slave;      #开启slave功能
  mysql> SHOW SLAVE STATUS\G;   #检察设置是否成功
  2.测试

在mysql-node1中向表lee.userlist插入数据,看两个从机是否同步
   mysql> insert into lee.userlist values('五条悟','555');
  

实验3:延迟复制

  1. #在slave端(随便开一台)
  2. mysql> STOP SLAVE SQL_THREAD;
  3. mysql> CHANGE MASTER TO MASTER_DELAY=60;  #设置延迟时间
  4. mysql> START SLAVE SQL_THREAD;
  5. mysql> SHOW SLAVE STATUS\G;
  6.             Master_Server_Id: 1
  7.                 Master_UUID: db2d8c92-4dc2-11ef-b6b0-000c299355ea
  8.             Master_Info_File: /data/mysql/master.info
  9.                   SQL_Delay: 60 ##延迟效果
  10.         SQL_Remaining_Delay: NULL
  11.     Slave_SQL_Running_State: Slave has read all relay log; waiting for more
  12. updates
  13.           Master_Retry_Count: 86400
复制代码
测试: 在master中写入数据后过了延迟时间才能被查询到
实验4:慢查询日志

        当执行SQL超过long_query_time参数设定的时间阈值(默认10s)时,就被认为是慢查询,这个 SQL语句就是必要优化的
        慢查询被记载在慢查询日志里 ,慢查询日志默认是不开启的 。如果必要优化SQL语句,就可以开启这个功能,它可以让你很容易地知道哪些语句是必要优化的。
未开启状态:

开启慢查询:
   mysql> SET GLOBAL slow_query_log=ON;
  mysql> SET long_query_time=4;
  mysql> SHOW VARIABLES like "slow%";
  cat /data/mysql/mysql-node1-slow.log
  

可以看到日志内容:


实验5:并行复制

默认环境下slave中利用的是sql单线程回放
在master中时多用户读写,如果利用sql单线程回放那么会造成主从延迟严峻
开启MySQL的多线程回放可以办理上述问题
  1. 在slaves中设定
  2. [root@mysql-node2 ~]# vim /etc/my.cnf
  3. [mysqld]
  4. datadir=/data/mysql
  5. socket=/data/mysql/mysql.sock
  6. server-id=2
  7. gtid_mode=ON
  8. enforce-gtid-consistency=ON
  9. slave-parallel-type=LOGICAL_CLOCK     #基于组提交,
  10. slave-parallel-workers=16             #开启线程数量
  11. #master信息在表中记录,默认记录在/data/mysql//master.info
  12. master_info_repository=TABLE
  13. relay_log_info_repository=TABLE
  14. relay_log_recovery=ON #日志回放恢复功能开启
  15. [root@mysql-node2 ~]# /etc/init.d/mysql start
复制代码
测试:


此时sql线程转化为和谐线程,16个worker负责处置惩罚sql和谐线程发送过来的处置惩罚哀求
半同步复制

        基于传统异步存在的缺陷,mysql在5.5版本推出半同步复制,是对传统异步复制的改进。在master事件commit前,必须确保binlog日志已经写入slave 的relay log日志中,收到slave给master的响应后,才能进行事件的commit。但是后半部门的relay log到sql线程仍然属于异步执行。

1.gtid模式

当为启用gtid时我们要思量的问题 在master端的写入时多用户读写,在slave端的复制时单线程日志回放,所以slave端肯定会延迟与 master端
这种延迟在slave端的延迟大概会不同等,当master挂掉后slave接管,一般会挑选一个和master延迟日 志最靠近的充当新的master 那么为接管master的主机继承充当slave脚色并会指向到新master上,作为其slave 这时候按照之前的设置我们必要知道新的master上的pos的id,但是我们无法确定新的master和slave之间差多少

当激活GITD之后
当master出现问题后,slave2和master的数据最靠近,会被作为新的master slave1指向新的master,但是他不会去检测新的master的pos id,只必要继承读取自己gtid_next即可
  1. #在master端和slave端开启gtid模式
  2. [root@mysql-node1 ~]# vim /etc/my.cnf
  3. [mysqld]
  4. datadir=/data/mysql
  5. socket=/data/mysql/mysql.sock
  6. server-id=1
  7. log-bin=mysql-bin
  8. gtid_mode=ON
  9. enforce-gtid-consistency=ON
  10. symbolic-links=0
  11. [root@mysql-node1 ~]# /etc/init.d/mysqld restart
  12. [root@mysql-node2 ~]# vim /etc/my.cnf
  13. [mysqld]
  14. datadir=/data/mysql
  15. socket=/data/mysql/mysql.sock
  16. server-id=2
  17. log-bin=mysql-bin
  18. gtid_mode=ON
  19. enforce-gtid-consistency=ON
  20. symbolic-links=0
  21. [root@mysql-node2 ~]# /etc/init.d/mysqld restart
  22. [root@mysql-node3 ~]# vim /etc/my.cnf
  23. [mysqld]
  24. datadir=/data/mysql
  25. socket=/data/mysql/mysql.sock
  26. server-id=3
  27. log-bin=mysql-bin
  28. gtid_mode=ON
  29. enforce-gtid-consistency=ON
  30. symbolic-links=0
  31. [root@mysql-node3 ~]# /etc/init.d/mysqld restart
  32. #停止slave端
  33. [root@mysql-node2 ~]# mysql -p
  34. mysql> stop slave;
  35. [root@mysql-node3 ~]# mysql -p
  36. mysql> stop slave;
  37. #开启slave端的gtid
  38. mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl',
  39. MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1;
复制代码
2.半同步模式

定位master端 设置版同步模式
   [root@mysql-node1 ~]# vim /etc/my.cnf     //设置文件内容
  [mysqld]
  datadir=/data/mysql
  socket=/data/mysql/mysql.sock
  server-id=1
  log-bin=mysql-bin
  gtid_mode=ON
  enforce-gtid-consistency=ON
  rpl_semi_sync_master_enabled=1
  symbolic-links=0
  进入mysql安装办同步插件
   [root@mysql-node1 ~]# mysql -p lee
  mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
  
  #检察插件环境
  mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS  
          -> FROM INFORMATION_SCHEMA.PLUGINS  
          -> WHERE PLUGIN_NAME LIKE '%semi%';
  
  #打开半同步功能
  mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
  #检察半同步功能状态
  mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
  mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
  
  mysql> show plugins
  定位mysql-node2
   #设置文件内容
  [root@mysql-node2 ~]# vim /etc/my.cnf
  [mysqld]
  datadir=/data/mysql
  socket=/data/mysql/mysql.sock
  server-id=1
  log-bin=mysql-bin
  gtid_mode=ON
  enforce-gtid-consistency=ON
  rpl_semi_sync_master_enabled=1 #开启半同步功能
  symbolic-links=0
  进入mysql 进行操纵
   [root@mysql-node2 ~]# mysql -plee
  mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
  mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
  mysql> STOP SLAVE IO_THREAD; #重启io线程,半同步才能生效
  mysql> START SLAVE IO_THREAD; ##重启io线程,半同步才能生效
  mysql> SHOW VARIABLES LIKE 'rpl_semi_sync%';
  mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
  测试
  1. mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
  2. +--------------------------------------------+-------+
  3. | Variable_name                             | Value |
  4. +--------------------------------------------+-------+
  5. | Rpl_semi_sync_master_clients               | 2     |
  6. | Rpl_semi_sync_master_net_avg_wait_time     | 0     |
  7. | Rpl_semi_sync_master_net_wait_time         | 0     |
  8. | Rpl_semi_sync_master_net_waits             | 2     |
  9. | Rpl_semi_sync_master_no_times             | 0     |
  10. | Rpl_semi_sync_master_no_tx                 | 0     | #未同步数据0笔
  11. | Rpl_semi_sync_master_status               | ON   |
  12. | Rpl_semi_sync_master_timefunc_failures     | 0     |
  13. | Rpl_semi_sync_master_tx_avg_wait_time     | 981   |
  14. | Rpl_semi_sync_master_tx_wait_time         | 981   |
  15. | Rpl_semi_sync_master_tx_waits             | 1     |
  16. | Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
  17. | Rpl_semi_sync_master_wait_sessions         | 0     |
  18. | Rpl_semi_sync_master_yes_tx               | 1     | #已同步数据1笔
  19. +--------------------------------------------+-------+
  20. 14 rows in set (0.00 sec)
复制代码
模仿故障
定位mysql-node2,mysql-node3,关闭io线程
   [root@mysql-node2 ~]# mysql -plee
  mysql> STOP SLAVE IO_THREAD;
  
  [root@mysql-node3 ~]# mysql -plee
  mysql> STOP SLAVE IO_THREAD;
  定位master端 插入数据
   mysql> insert into lee.userlist values ('user5','555');
  Query OK, 1 row affected (10.00 sec) #10秒超时
  1. mysql> SHOW STATUS LIKE 'Rpl_semi%';
  2. +--------------------------------------------+-------+
  3. | Variable_name                             | Value |
  4. +--------------------------------------------+-------+
  5. | Rpl_semi_sync_master_clients               | 0     |
  6. | Rpl_semi_sync_master_net_avg_wait_time     | 0     |
  7. | Rpl_semi_sync_master_net_wait_time         | 0     |
  8. | Rpl_semi_sync_master_net_waits             | 2     |
  9. | Rpl_semi_sync_master_no_times             | 1     |
  10. | Rpl_semi_sync_master_no_tx                 | 1     | #一笔数据为同步
  11. | Rpl_semi_sync_master_status               | OFF   | #自动转为异步模式,当
  12. slave恢复
  13. | Rpl_semi_sync_master_timefunc_failures     | 0     | #会自动恢复
  14. | Rpl_semi_sync_master_tx_avg_wait_time     | 981   |
  15. | Rpl_semi_sync_master_tx_wait_time         | 981   |
  16. | Rpl_semi_sync_master_tx_waits             | 1     |
  17. | Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
  18. | Rpl_semi_sync_master_wait_sessions         | 0     |
  19. | Rpl_semi_sync_master_yes_tx               | 1     |
  20. +--------------------------------------------+-------+
复制代码
组复制(高可用)

        基于传统异步复制和半同步复制的缺陷——数据的同等性问题无法保证,MySQL官方在5.7.17版本正式推出组复制(MySQL Group Replication,简称MGR)。
        由若干个节点共同组成一个复制组,一个事件的提交,必须经过组内大多数节点(N / 2 + 1)决定并通过,才能得以提交。如上图所示,由3个节点组成一个复制组,Consensus层为同等性协议层,在事件提交过程中,发生组间通讯,由2个节点决定(certify)通过这个事件,事件才能够终极得以提交并响应。
        引入组复制,主要是为了办理传统异步复制和半同步复制大概产生数据不同等的问题。组复制依靠分布式同等性协议(Paxos协议的变体),实现了分布式下数据的终极同等性,提供了真正的数据高可用方案(是否真正高可用另有待商榷)。其提供的多写方案,给我们实现多活方案带来了希望。
MGR环境下,服务器数量必须是3台以上,而且是单数,实现2/n+1的算法。
组复制的流程图



注意:节点数量不能超过9台
实验

环境
主机名称ip脚色
mysql-node1172.25.254.10master
mysql-node2172.25.254,20slave1
mysql-node3 172.25.254.30
slave2
1.初始化数据库数据,防止出现问题

   #在mysql-node1中
  rm -fr /data/mysql/*    #删除这个目录下的内容
  [root@mysql-node1 ~]# vim /etc/my.cnf   #编辑设置内容
  

2.向本地剖析文件中设置其他几台主机内容


3.设置sql内容

  1. [root@mysql-node1 ~]# mysqld --user=mysql --initialize
  2. [root@mysql-node1 ~]# /etc/init.d/mysqld start
  3. [root@mysql-node1 ~]# mysql -uroot -p初始化后生成的密码 -e "alter user root@localhost identified by 'lee';"
  4. 进入mysql配置
  5. [root@mysql-node10 ~]# mysql -plee
  6. mysql> SET SQL_LOG_BIN=0;
  7. mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'lee';
  8. mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
  9. mysql> FLUSH PRIVILEGES;
  10. mysql> SET SQL_LOG_BIN=1;
  11. mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='lee' FOR CHANNEL
  12. 'group_replication_recovery';
  13. mysql> START GROUP_REPLICATION;
  14. mysql> SELECT * FROM performance_schema.replication_group_members;
复制代码

投个小懒,提高效率:
   [root@mysql-node2 & 3 ~]# scp /etc/my.cnf root@172.25.254.20:/etc/my.cnf                                                                              
  [root@mysql-node2 & 3 ~]# scp /etc/my.cnf root@172.25.254.30:/etc/my.cnf
  4.设置别的两台

  1. #修改mysql—node2和mysl-node3中的配置
  2. [root@mysql-node2 & 3 ~]# rm -fr/data/mysql/
  3. [root@mysql-node1 ~]# vim /etc/my.cnf
  4. [mysqld]
  5. datadir=/data/mysql
  6. socket=/data/mysql/mysql.sock
  7. symbolic-links=0
  8. server-id=2 #在3上写3
  9. disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
  10. gtid_mode=ON
  11. enforce_gtid_consistency=ON
  12. master_info_repository=TABLE
  13. relay_log_info_repository=TABLE
  14. binlog_checksum=NONE
  15. log_slave_updates=ON
  16. log_bin=binlog
  17. binlog_format=ROW
  18. plugin_load_add='group_replication.so'
  19. transaction_write_set_extraction=XXHASH64
  20. group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
  21. group_replication_start_on_boot=off
  22. group_replication_local_address="172.25.254.20:33061" #在3上要写30
  23. group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,
  24. 172.25.254.30:33061"
  25. group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8"
  26. group_replication_bootstrap_group=off
  27. group_replication_single_primary_mode=OFF
  28. group_replication_enforce_update_everywhere_checks=ON
  29. group_replication_allow_local_disjoint_gtids_join=1
  30. [root@mysql-node1 ~]# mysqld --user=mysql --initialize
  31. [root@mysql-node1 ~]# /etc/init.d/mysqld start
  32. [root@mysql-node1 ~]# mysql -uroot -p初始化后生成的密码 -e "alter user
  33. root@localhost identified by 'lee';"
  34. #配置sql
  35. [root@mysql-node2 & 3 ~]# mysql -plee
  36. mysql> SET SQL_LOG_BIN=0;
  37. mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'lee';
  38. mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
  39. mysql> FLUSH PRIVILEGES;
  40. mysql> SET SQL_LOG_BIN=1;
  41. mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='lee' FOR CHANNEL
  42. 'group_replication_recovery';
  43. mysql> START GROUP_REPLICATION;
  44. mysql> SELECT * FROM performance_schema.replication_group_members;
复制代码

5测试

  1. #在mysql-node1中
  2. [root@mysql-node1 ~]# mysql -p
  3. mysql> CREATE DATABASE lee;
  4. mysql> CREATE TABLE lee.userlist(
  5.   -> username VARCHAR(10) PRIMARY KEY NOT NULL,
  6.   -> password VARCHAR(50) NOT NULL
  7.   -> );
  8. mysql> INSERT INTO lee.userlist VALUES ('user1','111');
  9. mysql> SELECT * FROM lee.userlist;
  10. +----------+----------+
  11. | username | password |
  12. +----------+----------+
  13. | user1   | 111     |
  14. +----------+----------+
  15. #在mysql-node2中
  16. [root@mysql-node2 ~]# mysql -p
  17. mysql> INSERT INTO lee.userlist values ('user2','222');
  18. mysql> select * from lee.userlist;
  19. +----------+----------+
  20. | username | password |
  21. +----------+----------+
  22. | user1   | 111     |
  23. | user2   | 222     |
  24. +----------+----------+
  25. #mysql—node3中
  26. [root@mysql-node3 ~]# mysql -p
  27. mysql> INSERT INTO lee.userlist values ('user3','333');
  28. mysql> select * from lee.userlist;
  29. +----------+----------+
  30. | username | password |
  31. +----------+----------+
  32. | user1   | 111     |
  33. | user2   | 222     |
  34. | user3   | 333     |
  35. +----------+----------+
复制代码
MySQL路由


   mysql-router是一个对应用程序透明的InnoDB Cluster连接路由服务,提供负载平衡、应用连接故障转移和客户端路 由。 利用路由器的连接路由特性,用户可以编写应用程序来连接到路由器,并令路由器利用相应的路由策略来处置惩罚连接,使其连接到正确的MySQL数据库服务器。
  MySQL-router的部署方式

主机名称ip脚色
mysql-node1172.25.254.10master
mysql-node2172.25.254,20slave1
mysql-node3 172.25.254.30
slave2
mysql-node4172.25.254.40router
定位router端
   #安装mysql-router
  [root@mysql-router ~]# rpm -ivh mysql-router-community-8.4.0-1.el7.x86_64.rpm
    #设置mysql-router
  [root@mysql-router ~]# vim /etc/mysqlrouter/mysqlrouter.conf
  [routing:ro]
  bind_address = 0.0.0.0
  bind_port = 7001
  destinations = 172.25.254.10:3306,172.25.254.20:3306,172.25.254.30:3306 routing_strategy = round-robin
  
  [routing:rw]
  bind_address = 0.0.0.0
  bind_port = 7002
  destinations = 172.25.254.30:3306,172.25.254.20:3306,172.25.254.10:3306 routing_strategy = first-available
    [root@mysql-router ~]# systemctl start mysqlrouter.service
  测试

   #创建测试用户
  mysql> CREATE USER lee@'%' IDENTIFIED BY 'lee';
  mysql> GRANT ALL ON lee.* TO lee@'%';
  
  #检察调理效果
  [root@mysql-node10 & 20 & 30 ~]# watch -1 lsof -i :3306
  COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
  mysqld 9879 mysql   22u IPv6 56697     0t0 TCP *:mysql (LISTEN)
  
  [root@mysql-router ~]# mysql -ulee -plee -h 172.25.254.40 -P 7001  
  通过最后一行命令检察是否可以登录上指定的数据库,登录上则mysql-router成功,否则失败。检察日志排错。
MySQL高可用--MHA

1.MHA简介


什么是MHA?


  • MHA(Master High Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。
  • MHA 的出现就是办理MySQL 单点的问题
  • MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操纵。
  • MHA能在故障切换的过程中最大程度上保证数据的同等性,以达到真正意义上的高可用。
MHA的特点是什么?


  • 自动故障切换过程中,MHA从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失
  • 利用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日 志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数 据同等性
  • 目前MHA支持一主多从架构,最少三台服务,即一主两从
MHA的工作原理?


  • 目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群必须最少有3台数据库服务器, 一主二从,即一台充当Master,台充当备用Master,另一台充当从库。
  • MHA Node 运行在每台 MySQL 服务器上
  • MHAManager 会定时探测集群中的master 节点
  • 当master 出现故障时,它可以自动将最新数据的slave 提升为新的master 然后将所有其他的slave 重新指向新的master,VIP自动漂移到新的master。
  • 整个故障转移过程对应用程序完全透明
2.MHA的部署

环境
主机名称ip脚色
mysql-node1172.25.254.10master
mysql-node2 172.25.254,20
172.25.254.11
slave1
第二个暂时ip做检测用
mysql-node3 172.25.254.30
slave2
mysql-MHA
172.25.254.50MHA
(1)搭建主两从架构

  1. #在master节点中
  2. [root@mysql-node1 ~]# /etc/init.d/mysqld stop
  3. [root@mysql-node1 ~]# rm -fr /data/mysql/*     #删除之前的数据
  4. [root@mysql-node1 ~]# vim /etc/my.cnf
  5. [mysqld]
  6. datadir=/data/mysql
  7. socket=/data/mysql/mysql.sock
  8. server-id=1
  9. log-bin=mysql-bin
  10. gtid_mode=ON
  11. log_slave_updates=ON        #这一行一定要写进去 因为在后面做MHA检测的时候必须要有否则报错
  12. enforce-gtid-consistency=ON
  13. symbolic-links=0
  14. [root@mysql-node1 ~]# mysqld --user mysql --initialize   #初始化
  15. [root@mysql-node1 ~]# /etc/init.d/mysqld start
  16. [root@mysql-node1 ~]# mysql_secure_installation
  17. [root@mysql-node1 ~]# mysql -p
  18. mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'lee';
  19. mysql> GRANT REPLICATION SLAVE ON *.* TO repl@'%';
  20. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
  21. mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
复制代码
做好设置之后打开数据库进入检查开关环境,如下图则成功

定位mysql-node2和mysql-node3,初始化数据库再重启数据库更新密码,到场免密认证
  1. #在slave1和slave2
  2. [root@mysql-node2 & 3 ~]# /etc/init.d/mysqld stop
  3. [root@mysql-node2 & 3 ~]# rm -fr /data/mysql/*
  4. [root@mysql-node2 & 3 ~]# vim /etc/my.cnf
  5. [mysqld]
  6. datadir=/data/mysql
  7. socket=/data/mysql/mysql.sock
  8. server-id=1
  9. log-bin=mysql-bin
  10. gtid_mode=ON
  11. log_slave_updates=ON
  12. enforce-gtid-consistency=ON
  13. symbolic-links=0
  14. [root@mysql-node2 & 3 ~]# mysqld --user mysql --initialize
  15. [root@mysql-node2 & 3 ~]# /etc/init.d/mysqld start
  16. [root@mysql-node2 & 3 ~]# mysql_secure_installation
  17. [root@mysql-node2 & 3 ~]# mysql -p
  18. mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl',
  19. MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1;
  20. mysql> start slave;
  21. mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
  22. mysql> SET GLOBAL rpl_semi_sync_slave_enabled =1;
  23. mysql> STOP SLAVE IO_THREAD;
  24. mysql> START SLAVE IO_THREAD;
  25. mysql> SHOW STATUS LIKE 'Rpl_semi_sync%';
复制代码
输入如图所示的命令即可检察状态,必须是开启的。

(2)安装MHA所必要的软件

   [root@mysql-mha ~]# unzip MHA-7.zip   #解压已经导入的软件包
  注意要进入解压后的软件包目录之后再继承yum
   [root@mysql-mha MHA-7]# yum install *.rpm -y
  利用scp传输过去给其他几台主机:


这里想要速率变快就更改/etc/.sshd/ssh_config中的USERDNS yes 为 no 记得要重启sshd服务
工具包介绍

2.Node工具包 (通常用master主机直接调用,无需人去执行)
save_binary_logs                 #保存和复制master的二进制日志
apply_diff_relay_logs         #识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog                 #去除不必要的ROLLBACK事件(MHA已不再利用这个工具)
purge_relay_logs                 #清除中继日志(不会阻塞SQL线程)
(3)设置MHA管理环境

1.天生设置目录和设置文件

   [root@mysql-mha ~]# masterha_manager --help
  1. Usage:
  2.   masterha_manager --global_conf=/etc/masterha_default.cnf     #全局配置文件,记录公共设定
  3.   --conf=/usr/local/masterha/conf/app1.cnf     #不同管理配置文件,记录各自配置
  4.  
  5. See online reference   
  6.   (http://code.google.com/p/mysql-master-ha/wiki/masterha_manager) for
  7.   details.
复制代码
2.编写一个设置文件

解压源码包后在samples中找到设置文件的模板文件
  1. #生成配置文件
  2. [root@mysql-mha ~]# mkdir /etc/masterha
  3. [root@mysql-mha MHA-7]# tar zxf mha4mysql-manager-0.58.tar.gz
  4. [root@mysql-mha MHA-7]# cd mha4mysql-manager-0.58/samples/conf/
  5. [root@mysql-mha conf]# cat masterha_default.cnf app1.cnf > /etc/masterha/app1.cnf
  6. #编辑配置文件
  7. [root@mysql-mha ~]# vim /etc/masterha/app1.cnf
  8. [server default]
  9. user=root     #mysql管理员用户,因为需要做自动化配置
  10. password=lee     #mysql密码
  11. ssh_user=root     #ssh远程登陆用户
  12. repl_user=repl     #mysql主从复制中负责认证的用户
  13. repl_password=lee     #mysql主从复制中负责认证的用户密码
  14. master_binlog_dir= /data/mysql     #二进制日志目录
  15. remote_workdir=/tmp             #远程工作目录
  16. #此参数使为了提供冗余检测,方式是判断mha主机网络自身的问题无法连接数据库节点,应为集群之外的主机
  17. secondary_check_script= masterha_secondary_check -s 172.25.254.10 -s 172.25.254.11
  18. ##注意:两节点必须有一个是下面server中的 一台不是
  19. ping_interval=3     #每隔3秒检测一次
  20. #发生故障后调用的脚本,用来迁移vip
  21. # master_ip_failover_script= /script/masterha/master_ip_failover
  22. #电源管理脚本
  23. # shutdown_script= /script/masterha/power_manager
  24. #当发生故障后用此脚本发邮件或者告警通知
  25. # report_script= /script/masterha/send_report
  26. #在线切换时调用的vip迁移脚本,手动
  27. # master_ip_online_change_script= /script/masterha/master_ip_online_change
  28. manager_workdir=/etc/masterha         #mha工作目录
  29. manager_log=/var/etc/masterha/manager.log         #mha日志
  30. [server1]
  31. hostname=172.25.254.10
  32. candidate_master=1     #可能作为master的主机
  33. check_repl_delay=0     ##默认情况下如果一个slave落后master 100M的relay logs的话
  34.                            #MHA将不会选择该slave作为一个新的master
  35.                          #因为对于这个slave的恢复需要花费很长时间
  36.                          #通过设置check_repl_delay=0
  37.                          #MHA触发切换在选择一个新的master的时候将会忽略复制延时
  38.                          #这个参数对于设置了candidate_master=1的主机非常有用
  39.                          #因为这个候选主在切换的过程中一定是新的master
  40. [server2]
  41. hostname=172.25.254.20
  42. candidate_master=1 #可能作为master的主机
  43. check_repl_delay=0
  44. [server3]
  45. hostname=172.25.254.30
  46. no_master=1 #不会作为master的主机
复制代码
2.检测设置

a.检测网络以及ssh免密
   [root@mysql-mha ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
  b.检测数据主从复制环境
   [root@mysql-mha ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf
  note:如果出现报错就去看日志的具体描述,常见错误如下:


  • 防火墙没关
  • selinux不是disabled状态
  • /etc/masterha/app1.cnf这个设置文件内容不对
  • 其他主机的/etc/my.cnf设置文件内容缺失
如果你很幸运,那么就是下面的成功画面:


3.MHA故障切换


(1)master未出现故障手动切换

  1. #在master数据节点还在正常工作情况下
  2. [root@mysql-mha ~]# masterha_master_switch    \
  3. --conf=/etc/masterha/app1.cnf \             #    指定配置文件
  4. --master_state=alive \                         #指定master节点状态
  5. --new_master_host=172.25.254.20 \             #指定新master节点
  6. --new_master_port=3306 \                     #执行新master节点端口
  7. --orig_master_is_new_slave \                 #原始master会变成新的slave
  8. --running_updates_limit=10000                 #切换的超时时间
  9. 检测:
  10. [root@mysql-mha masterha]# masterha_check_repl --conf=/etc/masterha/app1.cnf
复制代码


(2)master出现故障手动切换

  1. #模拟master故障
  2. [root@mysql-node2 mysql]# /etc/init.d/mysqld stop
  3. #在MHA-master中做故障切换
  4. [root@mysql-mha masterha]# masterha_master_switch --master_state=dead --
  5. conf=/etc/masterha/app1.cnf --dead_master_host=192.168.56.12 --
  6. dead_master_port=3306 --new_master_host=192.168.56.11 --new_master_port=3306 --
  7. ignore_last_failover
  8. --ignore_last_failover     表示忽略在/etc/masterha/目录中在切换过程中生成的锁文件
  9. masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.cnf --
  10. dead_master_host=172.25.254.20 --dead_master_port=3306 --
  11. new_master_host=172.25.254.10 --new_master_port=3306 --ignore_last_failover
  12. --dead_master_ip=<dead_master_ip> is not set. Using 172.25.254.20.
复制代码
  恢复故障mysql节点
  [root@mysql-node20 tmp]# /etc/init.d/mysqld start Starting MySQL. SUCCESS! [root@mysql-node20 tmp]# mysql -p
  mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl', MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1;
  


(3)自动切换

  1. [root@mysql-mha masterha]# rm -fr app1.failover.complete #删掉切换锁文件
  2. #监控程序通过指定配置文件监控master状态,当master出问题后自动切换并退出避免重复做故障切换
  3. [root@mysql-mha masterha]# masterha_manager --conf=/etc/masterha/app1.cnf
  4. [root@mysql-mha masterha]# cat /etc/masterha/manager.log
  5. #恢复故障节点
  6. [root@mysql-node20 mysql]# /etc/init.d/mysqld start
  7. mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl',
  8. MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1
  9. #清除所锁文件
  10. [root@mysql-mha masterha]# rm -rf app1.failover.complete manager.log
复制代码
4.添加VIP功能

  1. 上传脚本(已写好的)
  2. [root@mysql-mha ~]# ls
  3. master_ip_failover master_ip_online_change MHA-7 MHA-7.zip
  4. [root@mysql-mha ~]# cp master_ip_failover master_ip_online_change /usr/local/bin/
  5. [root@mysql-mha ~]# chmod +x /usr/local/bin/master_ip_*
  6. #修改脚本在脚本中只需要修改下vip即可
  7. [root@mysql-mha ~]# vim /usr/local/bin/master_ip_failover
  8. my $vip = '172.25.254.100/24';
  9. my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
  10. my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";
  11. [root@mysql-mha ~]# vim /usr/local/bin/master_ip_online_change
  12. my $vip = '172.25.254.100/24';
  13. my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
  14. my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";
  15. my $exit_code = 0;
  16. [root@mysql-mha masterha]# masterha_manager --conf=/etc/masterha/app1.cnf     #启动监控程序
  17. [root@mysql-node10 tmp]# ip a a 172.25.254.100/24 dev eth0     #在master节点添加VIP
复制代码
  模仿故障:
  [root@mysql-node10 ~]# /etc/init.d/mysqld stop         #关闭主节点服务
  [root@mysql-mha masterha]# cat manager.log
  
  恢复故障主机:
  [root@mysql-node20 mysql]# /etc/init.d/mysqld start
  
  mysql> CHANGE MASTER TO MASTER_HOST='172.25.254.10', MASTER_USER='repl', MASTER_PASSWORD='lee', MASTER_AUTO_POSITION=1
  
  [root@mysql-mha masterha]# rm -rf app1.failover.complete manager.log
  手动切换后检察vip变革
   [root@mysql-mha masterha]# masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=172.25.254.10 --new_master_port=3306 -- orig_master_is_new_slave --running_updates_limit=10000
  
  [root@mysql-node10 ~]# ip a   #检察ip变革
  二、Redis非关系型数据库



1.Redis特点



  • 速率快: 10W QPS,基于内存,C语言实现
  • 单线程
  • 持久化
  • 支持多种数据结构
  • 支持多种编程语言
  • 功能丰富: 支持Lua脚本,发布订阅,事件,pipeline等功能
  • 简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,利用简单(单线程之所以超等快,是因为:纯内存、非阻塞、避免切换和竞态消耗)
  • 主从复制
  • 支持高可用和分布式
2.Redis应用场景


3.缓存的实现流程

数据更新操纵流程


数据读操纵流程


4.Redis的安装

官方下载地址:http://download.redis.io/releases/
任意选择以下方式安装(仅利用1种方式即可)
4.1.rpm包方式安装

   [root@redis-node1 ~]# dnf install redis -y
  4.2.源码安装

  1. [root@redis-node1 ~]# tar zxf redis-7.4.0.tar.gz
  2. [root@redis-node1 ~]# ls
  3. redis-7.4.0 redis-7.4.0.tar.gz
  4. #安装编译工具
  5. [root@redis-node1 redis-7.4.0]# dnf install make gcc initscripts-10.11.6-1.el9.x86_64 -y
  6. #执行编译命令
  7. [root@redis-node1 redis-7.4.0]# make
  8. [root@redis-node1 redis-7.4.0]# make install
  9. #启动Redis
  10. [root@redis-node1 redis-7.4.0]# cd utils/
  11. [root@redis-node1 utils]# ./install_server.sh
  12. 配置Redis
  13. [root@redis-node1 utils]# vim /etc/redis/6379.conf
  14. bind * -::*
  15. [root@redis-node1 utils]# /etc/init.d/redis_6379 restart
  16. Stopping ...
  17. Redis stopped
  18. Starting Redis server...
  19. [root@redis-node1 utils]# netstat -antlpe | grep redis
  20. tcp     0     0      0.0.0.0:6379             0.0.0.0:*             LISTEN             0
  21.           67267     38417/redis-server
  22. tcp6     0             0 :::6379
  23. #查看信息
  24. [root@redis-node1 utils]# redis-cli
  25. 127.0.0.1:6379> info
复制代码
如果提示如下图所示:

   vim /etc/redis/redis.conf   #进入Redis的主设置文件
  

如下图则表示成功进入了Redis,即可开始利用

4.3.基本操纵


(1)检察设置(赤色是命令,黄色是结果)


(2)写入和读取数据


(3)选择数据库 Redis中有0-15个数据库


(4)改变键名


(5)设定数据过期时间 / 持久化(设置时间版)保持


   127.0.0.1:6379> PERSIST name     持久化保持
  (6)删除


(7)判定key的存在


(8)清空当前库

   127.0.0.1:6379> flushdb
  (9)清空所有库

   127.0.0.1:6379[1]> FLUSHALL
  5.Redis主从复制

5.1.环境

必要安装同样的数据库主机三台
主机名称ip脚色
redis-node1
172.25.254.10master
redis-node2172.25.254,20slave
redis-node3 172.25.254.30
slave
5.2.设置主从同步




  • slave节点发送同步亲求到master节点
  • slave节点通过master节点的认证开始进行同步
  • master节点会开启bgsave进程发送内存rbd到slave节点,在此过程中是异步操纵,也就是说 master节点仍然可以进行写入动作
  • slave节点收到rdb后起首清空自己的所有数据
  • slave节点加载rdb并进行数据恢复 在master和slave同步过程中master还会开启新的bgsave进程把没有同步的数据进行缓存 然后通过自有的replactionfeedslave函数把未通过内存快照发动到slave的数据一条一条写入到 slave中
(1)修改master节点的设置文件

   [root@redis-node1 & node2 & node3 ~]# vim /etc/redis/6379.conf
  修改设置文件之后必要重启服务
  [root@redis-node1 &node2 & node3 ~]# /etc/init.d/redis_6379 restart
  

(2)设置slave节点

   [root@redis-node2 & 3 ~]# vim /etc/redis/6379.conf
  [root@redis-node2 & 3 ~]# /etc/init.d/redis_6379 restart
  

(3)测试

  1. #在mastser节点
  2. [root@redis-node1 ~]# redis-cli
  3. 127.0.0.1:6379> set name yara
  4. OK
  5. #在slave节点查看
  6. [root@redis-node2 ~]# redis-cli
  7. 127.0.0.1:6379> get name
  8. "yara"
复制代码
6.Redis的哨兵(高可用)


          每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、Master、Slave定时发送消息,以确认对方是否”活” 着,如果发现对方在指定设置时间(此项可设置)内未得到回应,则暂时认为对方已离线,也就是所谓的” 主观认为宕机” (主观:是每个成员都具有的独自的而且大概相同也大概差异的意识),英文名称: Subjective Down,简称SDOWN
           有主观宕机,对应的有客观宕机。当“哨兵群”中的多数Sentinel进程在对Master主服务器做出SDOWN 的 判定,而且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判 断,这种方式就是“客观宕机”(客观:是不依赖于某种意识而已经实际存在的一切事物),英文名称是: Objectively Down, 简称 ODOWN                       

6.1.哨兵的实验过程

在所有阶段中关闭 protected-mode no
  1. #编辑配置文件
  2. [root@redis-node1 ~]# cd redis-7.4.0/
  3. [root@redis-node1 redis-7.4.0]# cp sentinel.conf /etc/redis/
  4. [root@redis-node1 redis-7.4.0]# vim /etc/redis/sentinel.conf
  5. protected-mode no #关闭保护模式
  6. port 26379 #监听端口
  7. daemonize no #进入不打如后台
  8. pidfile /var/run/redis-sentinel.pid #sentinel进程pid文件
  9. loglevel notice #日志级别
  10. sentinel monitor mymaster 172.25.254.100 6379 2 #创建sentinel监控监控master主机,2表示必须得到2票
  11. sentinel down-after-milliseconds mymaster 10000 #master中断时长,10秒连不上视为master下线
  12. sentinel parallel-syncs mymaster 1 #发生故障转移后,同时开始同步新
  13. master数据的slave数量
  14. sentinel failover-timeout mymaster 180000 #整个故障切换的超时时间为3分钟
  15. ####复制配置文件到其他阶段
  16. [root@redis-node1 redis-7.4.0]# scp /etc/redis/sentinel.conf
  17. root@172.25.254.201:/etc/redis/
  18. root@172.25.254.201's password:
  19. sentinel.conf
  20. 100% 14KB 9.7MB/s 00:00
  21. [root@redis-node1 redis-7.4.0]# scp /etc/redis/sentinel.conf
  22. root@172.25.254.200:/etc/redis/
  23. root@172.25.254.200's password:
  24. sentinel.conf
复制代码
启动服务
  1. [root@redis-node1 redis-7.4.0]# redis-sentinel /etc/redis/sentinel.conf
  2. 39319:X 05 Aug 2024 20:53:16.807 # WARNING Memory overcommit must be enabled!
  3. Without it, a background save or replication may fail under low memory condition.
  4. Being disabled, it can also cause failures without low memory condition, see
  5. https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add
  6. 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command
  7. 'sysctl vm.overcommit_memory=1' for this to take effect.
  8. 39319:X 05 Aug 2024 20:53:16.807 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  9. 39319:X 05 Aug 2024 20:53:16.807 * Redis version=7.4.0, bits=64, commit=00000000,
  10. modified=0, pid=39319, just started
  11. 39319:X 05 Aug 2024 20:53:16.807 * Configuration loaded
  12. 39319:X 05 Aug 2024 20:53:16.808 * Increased maximum number of open files to
  13. 10032 (it was originally set to 1024).
  14. 39319:X 05 Aug 2024 20:53:16.808 * monotonic clock: POSIX clock_gettime
  15. _._
  16. _.-``__ ''-._
  17. _.-`` `. `_. ''-._ Redis Community Edition
  18. .-`` .-```. ```\/ _.,_ ''-._ 7.4.0 (00000000/0) 64 bit
  19. ( ' , .-` | `, ) Running in sentinel mode
  20. |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
  21. | `-._ `._ / _.-' | PID: 39319
  22. `-._ `-._ `-./ _.-' _.-'
  23. |`-._`-._ `-.__.-' _.-'_.-'|
  24. | `-._`-._ _.-'_.-' | https://redis.io
  25. `-._ `-._`-.__.-'_.-' _.-'
  26. |`-._`-._ `-.__.-' _.-'_.-'|
  27. | `-._`-._ _.-'_.-' |
  28. `-._ `-._`-.__.-'_.-' _.-'
  29. `-._ `-.__.-' _.-'
  30. `-._ _.-'
  31. `-.__.-'
  32. 39319:X 05 Aug 2024 20:53:16.810 * Sentinel new configuration saved on disk
  33. 39319:X 05 Aug 2024 20:53:16.810 * Sentinel ID is
  34. e568add863fd7c132e03f7a6ce2c5ef367d3bdae
  35. 39319:X 05 Aug 2024 20:53:16.810 # +monitor master mymaster 172.25.254.100 6379
  36. quorum 2
  37. 39319:X 05 Aug 2024 20:53:16.811 * +slave slave 172.25.254.201:6379
  38. 172.25.254.201 6379 @ mymaster 172.25.254.100 6379
  39. 39319:X 05 Aug 2024 20:53:16.812 * Sentinel new configuration saved on disk
  40. 39319:X 05 Aug 2024 20:53:16.812 * +slave slave 172.25.254.200:6379
  41. 172.25.254.200 6379 @ mymaster 172.25.254.100 6379
  42. 39319:X 05 Aug 2024 20:53:16.813 * Sentinel new configuration saved on disk
  43. 39319:X 05 Aug 2024 20:53:41.769 * +sentinel sentinel
  44. 4fe1dcbe25a801e75d6edfc5b0a8517bfa7992c3 172.25.254.200 26379 @ mymaster
  45. 172.25.254.100 6379
  46. 39319:X 05 Aug 2024 20:53:41.771 * Sentinel new configuration saved on disk
  47. 39319:X 05 Aug 2024 20:53:57.227 * +sentinel sentinel
  48. 83f928aafe317a5f9081eea8fc5c383ff31c55ef 172.25.254.201 26379 @ mymaster
  49. 172.25.254.100 6379
  50. 39319:X 05 Aug 2024 20:53:57.229 * Sentinel new configuration saved on disk
复制代码

测试
  1. 在开一个master节点终端
  2. [root@redis-node1 ~]# redis-cli
  3. 127.0.0.1:6379> SHUTDOWN
  4. [root@redis-node2 ~]# redis-cli
  5. 127.0.0.1:6379> info replications
  6. 127.0.0.1:6379> info replication
  7. # Replication
  8. role:master
  9. connected_slaves:2
  10. slave0:ip=172.25.254.201,port=6379,state=online,offset=211455,lag=1
  11. slave1:ip=172.25.254.100,port=6379,state=online,offset=211455,lag=1
  12. master_failover_state:no-failover
  13. master_replid:d42fd72f3dfae94c84ca722ad1653417495ef4fd
  14. master_replid2:290c3407108cc6120086981b7149a6fa377594c4
  15. master_repl_offset:211598
  16. second_repl_offset:185931
  17. repl_backlog_active:1
  18. repl_backlog_size:1048576
  19. repl_backlog_first_byte_offset:150986
  20. repl_backlog_histlen:60613
复制代码
6.2架构缺陷

        在生产环境中如果master和slave中的网络出现故障,由于哨兵的存在会把master提出去 当网络恢复后,master发现环境发生改变,master就会把自己的身份转换成slave master变成slave后会把网络故障那段时间写入自己中的数据清掉,如许数据就丢失了。
怎样办理这一问题呢?
        master在被写入数据时会持续连接slave,mater确保有2个slave可以写入我才答应写入 如果slave数量少于2个便拒绝写入
   #在matster中设定
  [root@redis-node2 ~]# redis-cli
  127.0.0.1:6379> CONFIG GET min-slaves-to-write
  1) "min-slaves-to-write"
  2) "0" 127.0.0.1:6379> CONFIG set min-slaves-to-write 2
  OK
  
  127.0.0.1:6379> CONFIG GET min-slaves-to-write
  1) "min-slaves-to-write"
  2) "2"
  
  #如果要永久保存写到设置文件中/etc/redis/6379.conf
  7.Redis Cluster(无中心化设计)

7.1.工作原理

        在哨兵sentinel机制中,可以办理redis高可用问题,即当master故障后可以自动将slave提升为master, 从而可以保证redis服务的正常利用,但是无法办理redis单机写入的瓶颈问题,即单机redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素。
redis 3.0版本之后推出了无中心架构的redis cluster机制,在无中心的redis集群当中,其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连接





Redis cluster的架构虽然办理了并发的问题,但是又引入了一个新的问题,每个Redis master的高可用 怎样办理?
那就是对每个master 节点都实现主从复制,从而实现 redis 高可用性

7.2创建Redis Cluster的要求


7.3部署Redis Cluster

在所有主机中
  1. [root@redis-masterx ~]# vim /etc/redis/redis.conf
  2. masterauth "123456" #集群主从认证
  3. requirepass "123456" #redis登陆密码 redis-cli 命令连接redis后要
  4. 用“auth 密码”进行认证
  5. cluster-enabled yes     #开启cluster集群功能
  6. cluster-config-file nodes-6379.conf     #指定集群配置文件
  7. cluster-node-timeout 15000         #节点加入集群的超时时间单位是ms
  8. [root@redis-master1 ~]# systemctl restart redis.service
  9. [root@redis-master1 ~]# redis-cli
  10. 127.0.0.1:6379> auth 123456
  11. OK
  12. 127.0.0.1:6379> info
  13. # Cluster
  14. cluster_enabled:1
复制代码
注意观察命令行前面主机称号
#设置文件位置 [root@redis-master1 ~]# ll /var/lib/redis/nodes-6379.conf
  1. [root@redis-master1 ~]# redis-cli --cluster create -a 123456 \
  2. > 172.25.254.10:6379 172.25.254.20:6379 172.25.254.30:6379 \
  3. > 172.25.254.110:6379 172.25.254.120:6379 172.25.254.130:6379 \
  4. > --cluster-replicas 1
  5. >>> Performing hash slots allocation on 6 nodes...
  6. Master[0] -> Slots 0 - 5460 #哈希槽分配
  7. Master[1] -> Slots 5461 - 10922
  8. Master[2] -> Slots 10923 - 16383
  9. Adding replica 172.25.254.120:6379 to 172.25.254.10:6379 #主从分配情况
  10. Adding replica 172.25.254.130:6379 to 172.25.254.20:6379
  11. Adding replica 172.25.254.110:6379 to 172.25.254.30:6379
  12. M: 5ab2e93f4f0783983676f7bd118efaacfb202bd1 172.25.254.10:6379
  13.   slots:[0-5460] (5461 slots) master
  14. M: ba504e78f14df5944280f9035543277a0cf5976b 172.25.254.20:6379
  15.   slots:[5461-10922] (5462 slots) master
  16. M: 1fcaeb1dd936b46f4ea1efe4330c54195e66acf7 172.25.254.30:6379
  17.   slots:[10923-16383] (5461 slots) master
  18. S: c20c9b5465b2e64868161c0e285d55bc81358ba4 172.25.254.110:6379
  19.   replicates 1fcaeb1dd936b46f4ea1efe4330c54195e66acf7
  20. S: d458f34fa900d83212c021dc1e65396e490b5495 172.25.254.120:6379
  21.   replicates 5ab2e93f4f0783983676f7bd118efaacfb202bd1
  22. S: 83d7a82fe896cf9f4d8212cb533058659bba16ce 172.25.254.130:6379
  23.   replicates ba504e78f14df5944280f9035543277a0cf5976b
  24. Can I set the above configuration? (type 'yes' to accept):  yes
  25. >>> Performing Cluster Check (using node 172.25.254.10:6379)
  26. M: 5ab2e93f4f0783983676f7bd118efaacfb202bd1 172.25.254.10:6379
  27.   slots:[0-5460] (5461 slots) master
  28.   1 additional replica(s)
  29. S: c20c9b5465b2e64868161c0e285d55bc81358ba4 172.25.254.110:6379
  30.   slots: (0 slots) slave
  31.   replicates 1fcaeb1dd936b46f4ea1efe4330c54195e66acf7
  32. M: ba504e78f14df5944280f9035543277a0cf5976b 172.25.254.20:6379
  33.   slots:[5461-10922] (5462 slots) master
  34.   1 additional replica(s)
  35. S: 83d7a82fe896cf9f4d8212cb533058659bba16ce 172.25.254.130:6379
  36.   slots: (0 slots) slave
  37.   replicates ba504e78f14df5944280f9035543277a0cf5976b
  38. M: 1fcaeb1dd936b46f4ea1efe4330c54195e66acf7 172.25.254.30:6379
  39.   slots:[10923-16383] (5461 slots) master
  40.   1 additional replica(s)
  41. S: d458f34fa900d83212c021dc1e65396e490b5495 172.25.254.120:6379
  42.   slots: (0 slots) slave
  43.   replicates 5ab2e93f4f0783983676f7bd118efaacfb202bd1
  44. [OK] All nodes agree about slots configuration.
  45. >>> Check for open slots... #检查打开的哈希槽位
  46. >>> Check slots coverage... #检查槽位覆盖范围
  47. [OK] All 16384 slots covered. #所有槽位分配完成
复制代码
检查Redis集群状态
  1. [root@redis-master1 ~]# redis-cli -a 123456 --cluster info 172.25.254.10:6379
  2. #查看集群状态
  3. Warning: Using a password with '-a' or '-u' option on the command line interface
  4. may not be safe.
  5. 172.25.254.10:6379 (5ab2e93f...) -> 0 keys | 5461 slots | 1 slaves.
  6. 172.25.254.20:6379 (ba504e78...) -> 0 keys | 5462 slots | 1 slaves.
  7. 172.25.254.30:6379 (1fcaeb1d...) -> 0 keys | 5461 slots | 1 slaves.
  8. [OK] 0 keys in 3 masters.
  9. 0.00 keys per slot on average.
  10. [root@redis-master1 ~]# redis-cli -a 123456 cluster info
  11. Warning: Using a password with '-a' or '-u' option on the command line interface
  12. may not be safe.
  13. cluster_state:ok
  14. cluster_slots_assigned:16384
  15. cluster_slots_ok:16384
  16. cluster_slots_pfail:0
  17. cluster_slots_fail:0
  18. cluster_known_nodes:6
  19. cluster_size:3
  20. cluster_current_epoch:6
  21. cluster_my_epoch:1
  22. cluster_stats_messages_ping_sent:821
  23. cluster_stats_messages_pong_sent:801
  24. cluster_stats_messages_sent:1622
  25. cluster_stats_messages_ping_received:796
  26. cluster_stats_messages_pong_received:821
  27. cluster_stats_messages_meet_received:5
  28. cluster_stats_messages_received:1622
  29. [root@redis-master1 ~]# redis-cli -a 123456 --cluster check 172.25.254.10:6379
  30. #检测集群
  31. Warning: Using a password with '-a' or '-u' option on the command line interface
  32. may not be safe.
  33. 172.25.254.10:6379 (5ab2e93f...) -> 0 keys | 5461 slots | 1 slaves.
  34. 172.25.254.20:6379 (ba504e78...) -> 0 keys | 5462 slots | 1 slaves.
  35. 172.25.254.30:6379 (1fcaeb1d...) -> 0 keys | 5461 slots | 1 slaves.
  36. [OK] 0 keys in 3 masters.
  37. 0.00 keys per slot on average.
  38. >>> Performing Cluster Check (using node 172.25.254.10:6379)
  39. M: 5ab2e93f4f0783983676f7bd118efaacfb202bd1 172.25.254.10:6379
  40.   slots:[0-5460] (5461 slots) master
  41.   1 additional replica(s)
  42. S: c20c9b5465b2e64868161c0e285d55bc81358ba4 172.25.254.110:6379
  43.   slots: (0 slots) slave
  44.   replicates 1fcaeb1dd936b46f4ea1efe4330c54195e66acf7
  45. M: ba504e78f14df5944280f9035543277a0cf5976b 172.25.254.20:6379
  46.   slots:[5461-10922] (5462 slots) master
  47.   1 additional replica(s)
  48. S: 83d7a82fe896cf9f4d8212cb533058659bba16ce 172.25.254.130:6379
  49.   slots: (0 slots) slave
  50.   replicates ba504e78f14df5944280f9035543277a0cf5976b
  51. M: 1fcaeb1dd936b46f4ea1efe4330c54195e66acf7 172.25.254.30:6379
  52.   slots:[10923-16383] (5461 slots) master
  53.   1 additional replica(s)
  54. S: d458f34fa900d83212c021dc1e65396e490b5495 172.25.254.120:6379
  55.   slots: (0 slots) slave
  56.   replicates 5ab2e93f4f0783983676f7bd118efaacfb202bd1
  57. [OK] All nodes agree about slots configuration.
  58. >>> Check for open slots...
  59. >>> Check slots coverage...
  60. [OK] All 16384 slots covered.
复制代码
  1. 写入数据
  2. [root@redis-master1 ~]# redis-cli -a 123456
  3. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
  4. 127.0.0.1:6379> set key1 value1 #被分配到20的hash槽位上
  5. (error) MOVED 9189 172.25.254.20:6379
  6. [root@redis-master2 ~]# redis-cli -a 123456
  7. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
  8. 127.0.0.1:6379> set key1 value1
  9. OK
复制代码
7.4集群扩容

   #添加master [root@redis-master1 ~]# redis-cli -a 123456 --cluster add-node 172.25.254.40:6379 172.25.254.10:6379
  
  [root@redis-master1 ~]# redis-cli -a 123456 --cluster info 172.25.254.10:6379
  
  #分配槽位
  [root@redis-master1 ~]# redis-cli -a 123456 --cluster reshard 172.25.254.10:6379
  
  #添加salve
  [root@redis-master1 ~]# redis-cli -a 123456 --cluster add-node 172.25.254.140:6379 172.25.254.10:6379 --cluster-slave --cluster-master-id 009571cb206a89afa6658b60b2d403136056ac09
  7.5集群维护

添加节点的时候是先添加node节点到集群,然后分配槽位,删除节点的操纵与添加节点的操纵正好相 反,是先将被删除的Redis node上的槽位迁徙到集群中的其他Redis node节点上,然后再将其删除,如 果一个Redis node节点上的槽位没有被完全迁徙,删除该node的时候会提示有数据且无法删除。
  1. #移除要下线主机的哈希槽位
  2. [root@redis-master2 ~]# redis-cli -a 123456 --cluster reshard 172.25.254.20:6379
  3. #删除master
  4. [root@redis-master2 ~]# redis-cli -a 123456 --cluster del-node
  5. 172.25.254.120:6379 d458f34fa900d83212c021dc1e65396e490b5495
  6. [root@redis-master2 ~]# redis-cli -a 123456 --cluster del-node
  7. 172.25.254.10:6379 5ab2e93f4f0783983676f7bd118efaacfb202bd1
复制代码
总结

至此我们的数据库集群技术就到这里


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表