mariadb ---磁盘型数据库
基础安装
配置好yum源后,软件就可以通过配置的yum源进行安装,按理来讲安装mysql直接通过 yum install mariadb -y 便可安装,但是再企业中通过配置的阿里云的两个源版本太低,因此会使用mariadb官方提供的yum源,下载官方的mariadb包
实现远程连接
- 进入yum仓库, /etc/yum.repos.d 目录下,手动创建一个 mariadb.repo文件
#写入如下信息
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1执行 yum install mariadb #这是下载mariadb的yum源就变成了官方的源
- 安装成功后启动mariadb systemctl start mariadb
- mariadb初始化 mysql_secure_installation
初始化操作步骤
- 修改数据库编码
#中文编码设置,编辑mysql配置文件 /etc/my.conf 写入以下代码 [mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
log-error=/var/log/mysqld.logdatadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock[client]
default-character-set=utf8
[mysql]
default-character-set=utf8[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid - 远程连接数据库
首先进入数据库 mysql -uroot -p +密码
1.#创建普通用户
create user son1@'%' identified by 'son123'; 2.#对用户授权,给予root用户远程登录的权限
grant all privileges on *.* to root@"%" identified by "redhat123"; 3.#立即刷新授权表
flush privileges;这样便可以远程连接linux服务器了...
基础使用
-- 1 备份mysql数据
1.执行导出数据库命令
mysqldump -u root -p --all-databases > /tmp/db.dump
# --all-databases导出所有数据库 写入tmp下的db.dump文件中 #也可以指定的导出数据库
#指定crm数据库导出
#mysqldump -uroot -p --database crm > /tmp/ace_crm.dump
2.进入数据库删掉你不顺眼的库;嘿嘿...比如你的项目..
3.执行导入数据库命令
1. mysql -u root -p < /tmp/db.dump
#导入数据库信息
2. source /tmp.db.dump
#注意!!!这条命令是在数据库中执行,同步数据库原先你删掉的项目 哈哈,咱不慌...
--2 mysql的主从复制
1.环境准备
主库配置如下:
主库配置:编辑mysql的配置文件 vim /etc/my.cnf
1.写入如下内容
[mysql]
server-id=1
log-bin=s17-mysql-bin 2.创建一个用于同步的用户 create user 'son'@'%' identified by ''; 3.给予这个账号,一个从的身份 grant replication slave on *.* to 'son'@'%'; 4.导出当前数据库的数据,发送给从库,进行导入
mysqldump -u root -p --all-databases > /tmp/db.dump 5.发送主库的mysql数据,给从库
scp /tmpdb.dump root@从库ip地址+端口号
从库操作如下:
1.编辑从库的mysql配置文件,写入一个身份id号,区别于主库, vim /etc/my.cnf
写入主机身份id server-id =10 # 任意不和主库server-id重复的id号
2.通过一条命令,确保主从成功
#在从库执行这条SQL命令中 change master to master_host='主库ip地址',
master_user='主库名',
master_password='主库密码',
master_log_file='s17-mysql-bin.000001', #主库文件
master_log_pos=1510; #主库的数据的起始点
3.开启slave同步
#在从库中执行这条SQL命令 start alave;
4.检查主从同步是否正常
#在从库中执行SQL命令
show slave status\G;
5.然后可以测试往主库写入数据,查看从库数据
-----------------------------------------------------------------------------------------------------------
redis ---内存型数据库
数据存储在内存中,kv数据库系统,服务器断电,进程退出,数据丢失,所以需要做数据持久化,用途,微信红包/微博点赞/关注度,淘宝的首页的轮播图热数据,等等都是存在redis中,性能极高,每秒钟10W次读写,微博评论等高吞吐量数据能够支撑,同时新浪微博是用redis,全世界用redis集群最大的公司
基础安装
1.查看你是否先前安装过redis,如果有,卸载通过yum安装的redis数据库
yum remove redis -y
2.通过编码编译安装
- 下载redis的源代码
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
- 解压源代码
tar -zxf redis-4.0.10.tar.gz
- 进入redis源码目录,编译安装,生成可执行命令 注意:redis不需要执行configure,因为他已经生成了makefile
- 执行 make && make install
- 此时已经可以正常启动redis服务端了
3.安全性能下启动redis, 在redis.conf中,更改默认端口,添加密码,开启安全模式
#当然先麻烦的话也可以手动创建一个redis的配置文件 touch about_redis.conf
写入以下配置信息
[root@master redis-4.0.10]# cat about_redis.conf
bind 0.0.0.0
protected-mode yes
port 6999
daemonize yes
requirepass hehe
4.启动redis服务端,指定配置文件
redis-server about_redis.conf
5.测试访问redis服务端
#测试访问服务端
redis-cli -p 6999 进入后通过auth指令进行redis密码验证,验证通过后 发送ping,得到pong指定后代表redis正常
redis数据结构以及常用命令
redis是一种高级的key:value存储系统,其中value支持5种数据类型
字符串 --- strings 散列 --- hashes 列表 --- lists 集合 --- sets 有序集合 ---sorted sets
基本命令
keys * #查看所有的key type key #查看key的类型 expire key seconds # key过期时间 ttl key #查看key的过期时间 -2表示key不存在了 persist key #取消key的过期时间 -1表示key还在,没有过期时间 exsits key #判断key是否存在, 存在返回1 否则0 dbsize # 查看有多少个key 返回数字 del keys #删除key,可删除多个key
strings类型
set #设置key get #获取key append #追加string
#例如 set you 'sb'
append you ''
get you #显示"sb250" mset # 设置多个键值对
#mset food1 'apple' food2 'banana' food3 'orange' mget #获取多个键值对
#mget food1 food2 food3 #'apple' 'banana' 'orange'
del key #删除key
incr #递增+1 一般用于点赞+1
decr #递减-1 取关
lists类型
lpush #向列表左侧插入
rpush #向列表右侧插入 lrange #获取一定长度的元素 lrange key start end
# lrange key 0 -1 #获取全部元素 lpop # 删除最左侧列表元素
rpop #删除最右侧列表元素 lpushx /rpushx #key 存在添加,否则不作处理
sets集合类型(无序去重)
sadd key '元素' # 创建一个集合 smembers key #查看集合 sismember key ''元素'' #查看集合中的元素是否存在,返回0,1 sadd family 'father' 'mother' 'sister'
sadd family2 'mother' 'bother' 'son' #如上创建了两个集合family family2 sdiff family family2 #找出family有的,family2没有的 也就是father sister sdiff family2 family #找出family2有的,family 没有的 也就是 'bother'
'son' sinter family family2 #找出两个集合里都有的 mother sunion family family2 #找出两个集合里所有不重复的元素 'father' 'mother' 'sister' 'bother' 'son'
有序集合类型
都是z开头的命令,用来保存成绩,工资,价格等...
zadd #有序集合
#有序集合查看价格表
zadd price_list 8888 iPhoneX
zadd price_list 1 latiao
zadd price_list 10 book ZREVRANGE price_list 0 -1 withscores #倒序价格排列 1) "iPhoneX"
2) ""
3) "book"
4) ""
5) "latiao"
6) "" ZRANGE price_list 0 -1 withscores #正序价格排列
1) "latiao"
2) ""
3) "book"
4) ""
5) "iPhoneX"
6) "" ZREM price_list latiao #移除有序集合中的latiao元素 ZCARD price_list #返回有序集合中的元素计数 ZSCORE price_list book #返回集合里面书的价格
哈希数据结构
哈希结构就是字典套字典结构, k1:{'k2':v2,'k3':v3} ,哈希结构是redis-2.0.0版本才有的数据结构
hset book title 'mood' #设置book 对应的key title的值是"mood"
hset book content 'happy' #添加一个key content 值是 'happy' hget book title/content #获取 title/content的内容 hmget book title content #获取多个key的值 hmset book1 title "status" content "nice" #同时设置多个字段 hkeys book1 #获取book1所有的key hvals book #获取book中key对应的所有的值 hlen book #查看book的可以的数量 hexists book title #查看book中的key是否存在,返回0,1
Redis的发布订阅
redis的发布订阅就像一个广播系统,多个收听者可以订阅电台的多个广播频道,例如QQqun,OA群聊等,redis支持在一台机器上运行多个实例数据库,
SUBSCRIBE #订阅
#SUBSCRIBE xiaojiejie 订阅一个xiaojiejie的频道
#PSUBSCRIBE python* 订阅一个跟所欲python开头相关的频道 PUBLISH #将 信息发送到指定的频道 PUBLISH xiaojiejie nice #向xiaojiejie频道发送nice #可以同时开多个redis客户端,模拟一个电台向多个频道发送信息
reids的持久化---RDB模式和AOF模式
什么是redis的持久化呢?
由于redis是一种内存型数据库,一旦服务器进程退出或断电,数据库的数据就会丢失,为了解决这个问题,redis提供了两种持久化的方案,将内存中的数据保存在磁盘中,避免数据的丢失.
RDB模式
将redis的内存状态保存到硬盘中,它可以进行手动执行,也可以对redis.conf中配置,定期执行,RDB持久化产生的RDB文件是一个经过压缩的二进制文件,这个文件保存在硬盘中,redis通过这个文件还原数据库当时的状态
操作步骤:
1.准备一个redis配置文件,rdbredis.conf,写入如下内容
daemonize yes #后台运行
port 6379
logfile /data/6379/redis.log
dir /data/6379/ #指定持久化文件存储位置
dbfilename dbmp.rdb #rdb持久化文件
bind 0.0.0.0 #redis绑定地址
requirepass 123 #redis登录密码
save 900 1 #rdb机制 每900秒 有1个修改记录
save 300 10 #每300秒 10个修改记录
save 60 10000 #每60秒内 10000修改记录
当然先创建持久化文件目录 mkdir -p /data/6379,还有复制这些参数的时候不要有中文!!!
2.启动redis服务端 redis-server rdbredis.conf
AOF模式 不需要手动的save 触发持久化
步骤:
1.准备一个redis配置文件,aofredis.conf
#写入如下内容
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
appendonly yes #开启aof持久化的参数,就是这个
appendfsync everysec #每秒进行一次aof持久化
2. 支持aof方式的额持久化
redis-server aofredis.conf
3.验证aof持久化,写入数据后,杀死进程,再次启动redis检查数据.
在不重启的情况下,切换rdb数据到aof模式下
1.环境准备,准备一个rdb的redis数据库,并且是2.0版本以上的
2.登录此时的rdb数据库,通过两条命令,临时修改切换到aof模式下,也是把rdb数据转化为aof模式
127.0.0.1:6379> CONFIG set appendonly yes #开启AOF功能
OK
127.0.0.1:6379> CONFIG SET save "" #关闭RDB功能
OK
3.此时还是临时生效,必须修改配置文件,永久生效,配置文件修改如下
[root@master redis-4.0.10]# cat rdbredis.conf
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379/
bind 0.0.0.0
appendonly yes
appendfsync everysec
这样就可以了....无缝切换
redis主从同步机制
1.环境准备,准备3个redis数据库实例 准备3个redis配置文件即可.
redis-6379.conf port 6379
daemonize yes
pidfile /data/6379/redis.pid
loglevel notice
logfile "/data/6379/redis.log"
dbfilename dump.rdb
dir /data/6379 redis-6380.conf
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
SLAVEOF 127.0.0.1 6379
#记得先创建pidfile的目录 mkdir /data/6380 redis-6381.conf port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
SLAVEOF 127.0.0.1 6379
#还有 mkdir /data/6381
2.分别启动三个数据库,进入客户端模式
3.此时已经生成一主两从的身份了
4.此时可以演示在主库里写入数据,从库读取数据
手动切换中从同步的故障(当主库挂掉的时候,怎么办)
1.模拟主库挂掉,kill杀死主库的进程
2.此时两个从库不知所措.....
3,手动切换两个从库的身份,让其中一个为新的master,选举6381为新的master,只需要在6381下输入slaveof on one,然后配置6380为新的slave,只需要在6380下输入slaveof 127.0.0.1 6381
4.此时的一主一从就ok了 主库6381 从库6380
5.测试写入数据,万事大吉!!!
redis-sentinel(哨兵)
简介:reids-sentinel 是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机,redis本身或者客户端没有实现主从切换的功能,而redis-sentinel就是一个独立运行的进程,用户监控master-slave集群.自动发现master宕机,进行自动切换到slave>>>master
功能:
不时的监控redis是否良好运行,如果节点不可达就会对节点进行下线标识;
如果被标识主节点,sentinel就会与其他sentinel节点'沟通',如果其他节点也人为主节点不可达,就会选举一个sentinel节点完成自动故障转义;
在master-slave进行切换之后,master_redis.conf,slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标随之切换
架构:redis的一个进程,但是不存储数据,只是监控redis
#redis sentinel 故障转移流程 1.多个sentinel发现并确认master出现故障
2.选举出一个sentinel作为领导
3.选出一个slave作为master
4.通知其余slave成为新的master的slave
5.通知客户端的主从变化
6.等待原先的master恢复成为新master的slave
redis命令相关
redis-cli info #查看redis数据库信息 redis-cli info replication #查看redis复制授权信息 redis-cli info sentinel #查看redis的哨兵信息
安装和配置(一主两从的方案)
1.环境准备,主备一主两从的redis架构
redis-6379.conf port 6379
daemonize yes
logfile "6379.log"
dbfilename "dump-6379.rdb"
dir "/opt/redis/6379/" redis-6380.conf port 6380
daemonize yes
logfile "6380.log"
dbfilename "dump-6380.rdb"
dir "/opt/redis/6380/"
slaveof 127.0.0.1 6379 redis-6381.conf port 6381
daemonize yes
logfile "6381.log"
dbfilename "dump-6381.rdb"
dir "/opt/redis/6381/"
slaveof 127.0.0.1 6379
2. 准备三个数据文件夹
mkdir -p /opt/redis/{6379,6380,6381}
3.分别启动三个数据库
[root@master sbredis]# redis-server redis-6379.conf
[root@master sbredis]# redis-server redis-6380.conf
[root@master sbredis]# redis-server redis-6381.conf
4.检测主从状态
redis-cli -p 6379 info replication
redis-cli -p 6380 info replication
redis-cli -p 6381 info replication
5.准备3个redis哨兵,进行检测主从状态,准备三个哨兵配置文件
redis-66379.conf port 66379
dir /opt/redis/66379/
logfile "66379.log"
daemonize yes
sentinel monitor s17ms 127.0.0.1 6379 2 sentinel down-after-milliseconds s17ms 30000 sentinel parallel-syncs s17ms 1 sentinel failover-timeout s17ms 180000 redis-66380.conf redis-66381.conf
创建3个文件夹 mkdir -p /opt/redis/{66379,66380,66381}
由于三个配置文件,仅仅是端口不同,通过快捷命令快速生成配置文件
sed "s/66379/66380/g" redis-66379.conf > redis-66380.conf sed "s/66379/66381/g" redis-66379.conf > redis-66381.conf
6.分别启动三个哨兵
[root@master sbredis]# redis-sentinel redis-26379.conf
[root@master sbredis]# redis-sentinel redis-26380.conf
[root@master sbredis]# redis-sentinel redis-26381.conf
7.检测哨兵,主从状态
redis-cli -p 26379 info sentinel #看到如下信息,就和我一样了 [root@master sbredis]# redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=s17ms,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3
8.干掉master redis,是否自动切换
9.再次启动redis 6379 查看它是否加入主从集群
redis-cluster(redis集群)
为什么要用这个呀?
两个问题.并发问题,redis 10万/秒的并发,假如业务需要100万/秒的并发呢?;数据量太大,比如一台服务器内存正常是16G~256G,如果业务需要500G就很麻烦了,因此集群是解决这两个问题最好的办法.
虚拟槽分区
redis-cluster采用了虚拟槽分区,虚拟槽巧妙的使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围的整数集合,整数定义为槽(slot)
redis cluster 槽的范围 0~16383 ; 槽是集群内数据管理和迁移的基本单位,采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,每个节点负责一定数量的槽
搭建redis-cluster
1.准备6个数据库节点,也就是6个redis实例,也就是6个配置文件
#配置文件如下:
redis-8001.conf, redis-8002.conf, redis-8003.conf,
redis-8004.conf, redis-8005.conf, redis-8006.conf #且配置内容都是一致的.仅仅是端口的不同
port 8001
daemonize yes
dir "/opt/data"
logfile "8001.log"
dbfilename "dump-8001.rdb"
cluster-enabled yes
cluster-config-file nodes-8001.conf
cluster-require-full-coverage no
创建一个关于集群的文件夹 mkdir clusterredis ;在这个文件夹下 touch redis-8000.conf
2.创建6个redis节点,通过sed命令快速创建,仅仅是端口的区分
# sed "s/8001/8002/g" redis-8001.conf > redis-8002.conf
# sed "s/8001/8003/g" redis-8001.conf > redis-8003.conf
# sed "s/8001/7004/g" redis-8001.conf > redis-8004.conf # sed "s/8001/8005/g" redis-8001.conf > redis-8005.conf
# sed "s/8001/8006/g" redis-8001.conf > redis-8006.conf
同时创建启动所需文件 mkdir -p /opt/data
3.分别启动6个数据库实例
# redis-server redis-8001.conf
# redis-server redis-8002.conf
# redis-server redis-8003.conf
# redis-server redis-8004.conf
# redis-server redis-8005.conf
# redis-server redis-8006.conf
4.开始分配redis数据库的槽位,通过ruby脚本,自动化分配槽位
5.配置ruby的解释器环境
1.下载源码
#wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz 2.释放编译文件
#在/opt下解压缩
# tar -zxvf ruby-2.3.1.tar.gz # 进入ruby-2.3.1目录执行如下命令
# ./configure --prefix=/opt/ruby
# make && make install 3.配置ruby的环境变量 #进入ruby的bin目录 pwd 获取到路径 /opt/ruby/bin
#添加环境变量 vim /etc/profile 将这个路径添加到PATH中
#添加完毕后 执行source /etc/profile 4.下载ruby gem包管理工具操作redis的模块
wget http://rubygems.org/downloads/redis-3.3.0.gem 5.通过ruby的包管理工具安装
gem install -l redis-3.3.0.gem 6.通过ruby的脚本,自动化分配redis虚拟槽位,开启集群功能 /opt/redis-4.0.10/src/redis-trib.rb create --replicas 1 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005 127.0.0.1:8006 7.验证集群是否开启
#redis-cli -p 7000 cluster info
8.登录redis集群,写入数据,查看数据流向
redis-cli -c -p 8001
发现数据会在集群中,在节点中重定向
#三主三从,主从数据同步,且当8001进程被kill,8004默认成为master,8001复活后成为8004的slave
...