数据:描述事物的符号记录,可以是数字,也可以是文字、图形、图像、声音、语言等,数据有多种形式,它们都可以经过数字化后存入计算机。
数据库:存储数据的仓库,是长期存放在计算机内、有组织、可共享的大量数据的集合。数据库中的数据按照一定数据模型组织、描述和存储,具有较小的冗余度,较高的独立性和易扩展性,并为各种用户共享,即数据库有永久存储、有知识和可共享三个基本特点。
一、数据库分类:
1、关系型数据库
特点:存储数据采用表结构,数据之间有关系,数据保存在磁盘上。
如:mysql、Oracle、SQL Server、DB2
2、非关系型数据库
特点:数据库存储数据的格式可以是 key-value 形式、文档形式、数据一般保存在内存上、一般用在数据量大而且有读取速度要求的业务。
如:Redis、MongoDB、Elasticsearch
3、时序型数据库
特点:可以实时对大量数据进行计算、对于重复的数据,informix timeserise只保留一份、一般用于存储与分析时间序列数据。
如: InfluxDB
4、列存储数据库(分布式存储)
特点:数据以列的方式组织并存储,查找速度快,可靠性高,常用于数据分析。
如:HBase、ClickHouse
当然,目前市场上的数据库有很多,数据库的分类不是绝对只有以上四种,以上只是目前比较主流的而已,接下来本文重点介绍linux运维工作中基本上必用mysql和redis这两种数据库。
二、mysql数据库
1、mysql简介
mysql是一款功能强大的关系型数据库,MySQL中提供了多种数据库存储引擎,各个引擎各有所长,适用于不同的应用场合。用户可以选择最合适的引擎以得到最高性能,这些引擎升值可以应用处理每天访问量数亿的高强度Web搜索站点。MySQL支持事务、视图、存储过程和触发器等。
2、MySQL安装部署
这里演示的是centos7.6下安装mysql5.7
2.1更新yum
yum update -y
2.2安装wget工具
yum install -y wget
2.3使用wget下载mysql yum源
mkdir /mysql && cd /mysql
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
2.4添加 mysql yum 源
yum localinstall mysql80-community-release-el7-3.noarch.rpm -y
2.5查看可用的 mysql
yum repolist enabled | grep "mysql.*-community.*"
因为这里默认是8.0
2.6查看所有的 mysql 版本
2.7安装 yum 工具 yum-utils
yum install yum-utils
2.8使用指定版本MySQL
这里是关闭8.0,打开5.7
yum-config-manager --disable mysql80-community
yum-config-manager --enable mysql57-community
yum repolist enabled | grep mysql
2.9安装mysql
yum install -y mysql-community-server
如果出现此报错
可以执行以下命令,再重新安装
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
2.10启动mysql
systemctl start mysqld
2.11查看服务状态
systemctl status mysqld
2.12查看mysql初始密码
grep 'temporary password' /var/log/mysqld.log
2.13使用初始密码进行登录
2.14设置mysql密码策略并修改密码
set global validate_password_policy=LOW;
set global validate_password_length=6;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
3、常用mysql命令
#创建数据库
Mysql>create database web; #创建库名为web的数据库
#创建数据表
Mysql>use web; #选择要使用的数据库
Mysql>create table a1 (id int ,name char(30)); #创建a1表,并添加id和name字段以及类型
Mysql>describe a1; #查看表结构(字段)
#创建复杂一点的表
Mysql>create table a2 (
->id int unsigned not null auto_increment, #字段要求为正数、且自增长、主键
->name char(30) not null default ‘’, #字符型长度30字节,默认值为空格
->age int not null default 0, #字段默认值为0
->primary key (id)); #设置id为主键
Mysql> describe a2;
插入数据
Mysql>insert into a2 (id,name,age) values (1,‘zhangsan’,21); #指明插入字段和数据
Mysql>select * from a2;
Mysql>insert into a2 values (2,‘lisi’,20); #按顺序插入指定字段
Mysql>insert into a2 values (4,‘zhao’,19),(5,‘sun’,25); #插入多条数据
将表a2的数据复制到表a1
Mysql>select * from a1;
Mysql>insert into a1 (id,name) select id,name from a2; #查询a2值,并写入到a1
Mysql>select * from a1;
删除数据库
Mysql>drop database abc;
Mysql>show databases;
删除数据表
Mysql>drop table a1;
Mysql>show tables;
删除表里的数据记录
Mysql>delete from a2 where id=5; #删除id=5的记录
Mysql>delete from a2 where age between 23 and 25; #删除年龄在23-25之间的
修改表中的数据
Mysql>update a2 set age=21 where id=3;
修改数据表的名称
Mysql>alter table a2 rename a1;
修改数据表的字段类型
Mysql>describe a1;
Mysql>alter table a1 modify name char(50);
Mysql>describe a1;
修改数据表的字段类型详情
Mysql>describe a1;
Mysql>alter table a1 change name username char(50) not null default ‘’;
Mysql>describe a1;
添加字段
Mysql>describe a1;
Mysql>alter table a1 add time datetime;
Mysql>describe a1;
#添加位置默认在末尾
Mysql>alter table a1 add birthday year first; #添加字段到第一列
Mysql>alter table a1 add sex nchar(1) after id; #添加到指定字段后
删除字段
Mysql>alter table a1 drop birthday;
Mysql用户授权
授予用户全部权限
create user zhangsan@'localhost' identified by '123456';
Mysql>select user from mysql.user;
grant all on *.* to zhangsan@'localhost'; #给张三在所有数据库所有表有所有权限
Mysql>grant all on aa.a1 to zhangsan@‘%’; #给已存在用户授权
Mysql>grant all on aa.a1 to abc@‘%’ identified by ‘123456’; #创建用户并授权,给abc用户在aa数据库a1表有所有权限
取消abc用户的删除库、表、表中数据的权限
Mysql>revoke drop,delete on aa.a1 from abc@‘%’; #取消删除权限(登录abc测试)
Mysql>show grants for abc@‘%’; #查看指定用户的授权
Mysql>show grants for sans@‘%’;
Mysql备份和还原
把数据库aa 备份到/root目录下
#mysqldump -uroot -p aa > ~/aa.sql
模拟数据库aa丢失(删除数据库aa)
Mysql>drop database aa;
通过aa.sql文件还原(指定导入到哪个库中)
#mysql -uroot -p test < aa.sql
备份多个数据库(--databases)
#mysqldump -uroot -p --databases aa test > abc.sql
还原(先模拟丢失)
#mysql -uroot -p < abc.sql
备份有规则的数据库
Mysql>create database a1; #连续创建三个a开头的数据库
# mysqlhotcopy -u=‘root’ -p=‘123456’ 数据库名 备份目 录
# mysqlhotcopy --flushlog -u=‘root’ -p=‘123456’ --regexp=^a 备份目录
还原(先模拟丢失)
Mysql>drop database a1; #顺序删除a开头的数据库
#cp -a /mnt/* /var/lib/mysql/ #复制产生的文件到数据库目录下
#登录数据库查看即可,恢复后,请修改目录归属
4.mysql集群
作用:分摊单台数据库的压力,在数据读取和写入量比较大的时候一般会用到一主多从,多主多从的模式,有一些场景还会配置读写分离。
读写分离:有的数据库只负责读取数据,有的数据只负责写入数据。
4.1主从模式
4.1.1安装mysql
主从两台服务器均安装mysql服务,安装过程参考第二节
4.1.2修改配置文件(两台均执行)
vim /etc/my.cnf
注意服务器的id号不能一致
重启mysql服务systemctl restart mysqld
4.1.3在主服务器上面授权,从服务器上保存授权信息
主服务器执行
grant replication slave on 库.表 to 用户@'从服务器IP' identified by '密码';
show master status;
从服务器执行
change master to
master_user='root', #授权用户
master_password='123456', #密码
master_host='192.168.241.4', #主服务器地址
master_log_file='mysql-bin.000001', #主服务器使用的二进制日志文件
master_log_pos=753; #当前日志的大小
之后在从服务器会产生授权信息文件
io线程和sql现场状态都是yes则主从搭建完毕
我们可以测试一下
主服务器创建一个库,查看从服务器有没有同步
4.2主主模式(互为主从)
4.2.1安装mysql
主从两台服务器均安装mysql服务,安装过程参考第二节
4.2.2修改配置文件(两台均执行)
vim /etc/my.cnf
重启服务systemctl restart mysqld
4.2.3在主服务器上面授权,从服务器上保存授权信息
两台服务器均执行
`start slave;
show slave status\G;`
两台服务器互为主从,主主模式搭建完毕
三、redis数据库
1.redis简介
Redis是一个开源的,先进的key-value存储。它通常被称为数据结构服务器,因为键可以包含string(字符串)、hash(哈希)、list(链表)、set(集合)和zset(sorted-set--有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作。
Redis为了保证效率,数据都是缓存在内存中,同时Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
2.redis安装部署
2.1安装依赖
yum install -y gcc
2.2安装redis服务
#下载安装包
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
#解压
tar -xvf redis-5.0.3.tar.gz
#将解压得到的目录移动到/usr/local/
mv redis-5.0.3 /usr/local/
#进入到目录下面
cd /usr/local/redis-5.0.3
#使用命令make进行编译
make
#安装
#指定安装位置,如果没有指定安装位置PREFIX=/usr/local/redis,则make install会把redis安装到/usr/local/bin/目录下
make PREFIX=/usr/local/redis install
#复制Redis的配置文件到/usr/local/redis/etc/下,便于管理
mkdir /usr/local/redis/etc
mkdir /usr/local/redis/logs
mkdir /usr/local/redis/data
cp ./redis.conf /usr/local/redis/etc/
#修改配置文件
vim /usr/local/redis/etc/redis.conf
daemonize no 修改为yes #后台启动
dir ./ 修改为具体的绝对路径 #将redis数据库文件保存在哪个位置可以根据自己需求来修改
#添加软链接
ln -s /usr/local/redis/bin/* /usr/local/bin/
#启动服务
/usr/local/redis/bin/redis-server
#查看端口
netstat -tunlp |grep 6379
#客户端连接
redis-cli
3.redis密码防护
#给redis服务器设置密码
#修改配置文件
vi /usr/local/redis/etc/redis.conf
requirepass 123456
#重启redis
pkill redis
…/bin/redis-server …/etc/redis.conf
#客户端登录
…/bin/redis-cli -a 123456
#交互模式下使用【auth密码】命令
4.redis数据持久化
Redis是一个支持持久化的内存数据库,也就是说需要经常将内存中的数据同步到硬盘来保证持久化。
Redis支持两种数据持久化模式
RDS模式:RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。这种持久化方式被称为快照 snapshotting(快照)
AOF模式:使用AOF 会让Redis更加耐久: 你可以使用不同的持久化策略:每次写的时候备份、每秒备份、无备份。使用默认的每秒备份策略,Redis的性能依然很好(备份是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据。打开AOF模式的方式:在redis.conf配置文件开启AOF持久化
appendonly no 改为yes
5.redis集群
5.1redis主从
redis主从的作用:分摊单点压力、数据冗余
5.1.1安装redis服务
主从两台服务器均安装redis服务,安装过程参考2.2安装redis服务
5.1.2修改配置文件
主服务器
#vim redis.conf
daemonize yes #改成yes,表示允许后台运行
pidfile /usr/local/redis/logs/redis_6379.pid #改成自己创建的目录下(可以不改)
logfile “/usr/local/redis/logs/redis_6379.log” #指定日志文件存放位置
dir /usr/local/redis/data/ #指定持久化文件存放位置
bind 127.0.0.1 192.168.241.3 #在原有的基础上,再增加本机IP,保证别的服务器能连接到它
requirepass 123456 #服务器设置登陆密码 (原来是 #requirepass foobared)
#redis-server /usr/local/redis/etc/redis.conf #此处启动必须指定配置文件否则会报错
#netstat -anpt #查看端口是否正常启动
从服务器
#vim /usr/local/redis/etc/redis.conf
daemonize yes #改成yes,表示允许后台运行
logfile "/usr/local/redis/logs/redis_6379.log" #指定日志文件存放位置
dir /usr/local/redis/data/ #指定持久化文件存放位置
requirepass 123456 #服务器设置登陆密码(可以不设置)
replicaof 192.168.241.3 6379 #设置连接主服务器的ip和端口
masterauth 123456 #登陆主服务器时的密码
redis-cli shutdown
redis-server /usr/local/redis/etc/redis.conf
redis-cli
auth 123456 #登陆验证是否成功
主服务器查询
从服务器查询
状态为up且测试数据可以同步则主从搭建成功
5.2redis哨兵
哨兵模式:Redis Sentinel,即Redis哨兵,Redis 2.8版本开始引入;哨兵的核心功能是主节点的自动故障转移。
哨兵模式工作原理:哨兵会不断地检查主节点和从节点是否运作正常,当主节点不能正常工作时,哨兵会开始自动故障转移操作,将故障主节点的一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
故障转移过程:其中某一个节点哨兵先发现了主服务器故障,故障发现者申请成为此次故障转移任务的领导者,将主服务器故障的事件通告给其他哨兵节点,要求其他哨兵节点进行故障判断和投票选举,若超过半数以上的票数有,则申请者会成为故障转移领导者,进行此次故障转移;故障转移领导者会在slave服务器中根据自己的规则选择一台slave变成master,其他slave切换新的master,故障恢复以后原master作为slave。
5.2.1哨兵集群搭建
5.2.1.1redis服务安装
1台服务器
同时运行3个哨兵节点进程+3个数据存储节点
6379(主)+6380(从)+6381(从)
26379/26380/26381为哨兵端口
安装一次redis服务即可,然后再etc配置文件目录内分别为三个端口创建三个端口独立的配置文件即可。redis安装请参考2.2
5.2.1.2主从搭建(1主2从)
主服务器
cd /usr/local/redis/etc
cp -a redis.conf redis-6379.conf
vim redis-6379.conf
bind 127.0.0.1 192.168.241.3 #再设置一个除本机也能访问到的监听地址
daemonize yes
logfile “/usr/local/redis/logs/redis-6379.log”
pidfile /usr/local/redis/logs/redis-6379.pid
dir /usr/local/redis/data #数据文件保存位置
dbfilename dump-6379.rdb #数据文件名
requirepass 123456 #密码
masterauth 123456 #因为谁主谁从是由哨兵说了算,所以不知道谁是主,将所有的密码都设置相同,每个服务器都开启此功能即可
从服务器1
cp -a redis-6379.conf redis-6380.conf
vim redis-6380.conf
port 6380
pidfile /usr/local/redis/logs/redis-6380.pid
logfile “/usr/local/redis/logs/redis-6380.log”
dbfilename dump-6380.rdb
replicaof 192.168.142.3 6379 #主服务器地址,端口(如果此处写本机IP,对应主服务器配置文件的bind后也要加上本机IP)
从服务器2
cp -a redis-6380.conf redis-6381.conf
vim redis-6381.conf
port 6381
pidfile /usr/local/redis/logs/redis-6381.pid
logfile “/usr/local/redis/logs/redis-6381.log”
dbfilename dump-6381.rdb
启动服务
redis-server /usr/local/redis/etc/redis-6379.conf
redis-server /usr/local/redis/etc/redis-6380.conf
redis-server /usr/local/redis/etc/redis-6381.conf
netstat -tunlp
查看端口是否都启动
登录主服务器查看状态
5.2.1.3哨兵搭建
#复制哨兵配置文件到自己定义的目录下
cp -a /usr/local/redis-5.0.3/sentinel.conf /usr/local/redis/etc/
cd /usr/local/redis/etc/
#需要搭建三台哨兵,因此需要三个哨兵配置文件
cp -a sentinel.conf sentinel-26379.conf
vim sentinel-26379.conf
daemonize yes
pidfile /usr/local/redis/logs/redis-sentinel-26379.pid
logfile “ /usr/local/redis/logs/redis-sentinel-26379.log”
sentinel monitor mymaster 192.168.43.29 6379 2
sentinel auth-pass mymaster 123456
cd /usr/local/redis/etc/
cp -a sentinel-26379.conf sentinel-26380.conf
cp -a sentinel-26380.conf sentinel-26381.conf
vim sentinel-26380.conf
port 26380
pidfile /usr/lcoal/redis/logs/redis-sentinel-26380.pid
logfile “ /usr/lcoal/redis/logs/redis-sentinel-26380.log”
vim sentinel-26381.conf
port 26381
pidfile /usr/lcoal/redis/logs/redis-sentinel-26381.pid
logfile “ /usr/lcoal/redis/logs/redis-sentinel-26381.log”
#启动哨兵
redis-sentinel /usr/local/redis/etc/sentinel-26379.conf #启动哨兵
redis-sentinel /usr/local/redis/etc/sentinel-26380.conf #启动哨兵
redis-sentinel /usr/local/redis/etc/sentinel-26381.conf
#查看端口是否启动
netstat -tunlp
登陆端口号为26379的哨兵redis-cli -p 26379
查看哨兵状态info sentinel
故障转移测试,切换主服务器身份netstat -tunlp
找到6379的进程号kill 6379
的进程号netstat -tunlp |grep 6379
进程号 确认是否杀死该进程号
查看主从服务器的故障转移是否完成,即主从服务器的身份归属是否完成,最后在启动关闭的进程,再次查看信息,观察从服务器的描述信息是否变化。
从服务器2(6381)变成了主服务器
现在再启动原来的主服务器(6379)
原理的主服务器已经变成了从服务器
四、mysql和redis的搭配使用
MySQL是一个关系型数据库,能够存储大量数据,并通过SQL查询语句对数据进行查询和操作,但是msyql的数据是存储在磁盘中,满足不了高速读写的场景。而Redis是一种高速缓存数据库,可以将常用的数据缓存到内存中,提高访问速度。通过将Redis和MySQL结合使用,可以充分发挥两者的优势,从而提高应用程序的性能和用户体验。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。