创建amoeba服务管理脚本
vim /etc/rc.d/init.d/amoeba
添加:
#!/bin/bash
#chkconfig: 35 85 21
case $1 in
start)
/usr/local/amoeba/bin/amoeba start &
if [ $? -eq 0 ];then
echo "amoeba服务已启动"
else
echo "amoeba服务无法启动"
fi
;;
stop)
/usr/local/amoeba/bin/amoeba stop &> /dev/null
;;
restart)
$0 stop
$0 start
;;
*)
echo "start | stop | restart"
;;
esac
2、客户端访问
mysql -u li4 -p123.com -h 192.168.10.5 -P 8066
3、给所有的mysql节点服务器授权
MariaDB [(none)]> grant all on *.* to 'zhang3'@'192.168.10.5' identified by '123.com';
4、访问测试
在slave1服务器上添加数据
insert into biao1 values (10,'slave1');
在slave2服务器上添加数据
insert into biao1 values (20,'slave2');
在客户端上查询
5、配置LAMP,使httpd服务器连接访问amoeba
vim /myweb/guiguedu/index.php
添加:
<?php
$link=mysql_connect('192.168.10.5:8066','root','123.com');
if($link) echo "恭喜你,guiguedu的数据库连接成功啦!!";
?>
1、非关系型数据库
1.常用的关系型数据库
是一种结构化的数据库,主要建立库表结构,建立在关系型模型上,一般面向与记录。
mysql sqlserver oracle db2
2.非关系型数据库 NOT ONLY SQL
面向对象应用的数据库,针对某个行业或者某种类型的数据存储。在应用中解决大数据的读写问题。
High performance——对数据库高并发读写需求
百度的搜索信息记录 个人身份信息,
Huge Storage——对海量数据高效存储与访问需求
抖音视频,微博类,评价类,购物网站
High Scalability && High Availability——对数据库高可扩展性与高可用性需求
对特殊行业的需求,进行数据库结构的更改或扩展功能。
3.非关系型数据库的分类
Column-Oriented: 面向检索的列式存储,主要用于提供高速的分类查询。对同类数据,或指定时间范围的数据进行分类索引。银行的账单,评价类,微博微信等信息类。
Key-Value 面向高性能并发读写的缓存存储,提供高速读写,也可以作为关系型数据库的缓存服务器使用。
Document-Oriented 面向海量数据访问的文档存储,能够快速,有效的存储文件类数据,视频类,图片类,云空间类。
4.常用的非关系型数据库
Hbase :是面向检索的列式存储。
redis :是一个key-value存储系统,提供高并发的数据读写,与数据缓存。
mongodbd :用于分布式存储文件的数据库。
Neo4j?:是一种特殊的图形化数据库,用于建立数据关系,朋友圈类
2、redis的安装部署
redis的工作特性:
redis会将所有的数据放入内存中进行读写处理,所有读写速度非常快,也支持内存到硬盘的数据回写处理,保证在系统重启或故障时,数据不会丢失。
1.解压redis软件
tar -zxvf redis-3.2.9.tar.gz -C /usr/src
cd /usr/src/redis-3.2.9
2.编译安装
make && make install
3.初始化redis
cd /usr/src/redis-3.2.9/utils
./install_server.sh
4.服务脚本优化
[root@localhost utils]# chkconfig --add redis_6379
[root@localhost utils]# chkconfig redis_6379 on
3、修改配置文件
[root@localhost ~]# vim /etc/redis/6379.conf
修改:
bind 192.168.10.2 #监听地址
port 6379 #监听端口号,如果需要一台服务器启动多个redis进程时,需要修改。
daemonize yes #redis的守护进程,防止redis在后台被系统自动关闭。
pidfile /var/run/redis_6379.pid #进程ID号管理文件
logfile /var/log/redis_6379.log #日志文件
4、重启两次服务
systemctl restart redis_6379
5、redis的基本操作
[root@localhost ~]# redis-cli -h 192.168.10.2
192.168.10.2:6379> ping #测试redis服务是否启动,一般用于测试远程服务器的redis状态。
192.168.10.2:6379> info #显示redis服务器的相关信息,包括redis信息,系统信息,客户端访问量,内存使用信息,CPU使用信息,进程状态,群集状态等。
192.168.10.2:6379> help @list #查看@list组中的命令帮助
192.168.10.2:6379> help @string #查看@string组中的命令帮助
192.168.10.2:6379> quit #退出redis数据库管理器
1、redis性能测试工具
redis-benchmark:redis自带的测试工具,用于测试网络环境,服务器的硬件运行环境。通过发送大量的并发请求,统计测试结果。
-h:指定主机名
-p:端口号
-s:服务器socket
-c:并发连接数
-n:请求数
-d:数据大小,单位字节
-k:保持会话或重置会话 1=keepalive 0=reconnect
-r:SET/GET/INCR 使用随机key
-P:同过管道传输<numreq>请求
-q:强制退出redis
--csv:以CSV格式输出
-l:生成循环,永久执行测试
-t:仅运行以逗号分隔的测试命令列表
-I:Idle模式。仅打开N个idle连接并等待
测试1:给指定的服务器发送100个并发链接,1000访问请求,不显示过程,只显示统计结果。
redis-benchmark -h 192.168.10.2 -p 6379 -c 1000 -n 10000 -q
获得的结果会受到计算机硬件的影响,如CPU性能,内存大小,硬盘读取速度等,也会受到网络传输的影响。
测试2:测试指定服务器,存取100B大小的数据包的性能
redis-benchmark -h 192.168.10.2 -p 6379 -d 100 -q
测试3:对服务器测试指定操作的性能
redis-benchmark -h 192.168.10.2 -p 6379 -t set,lpush -n 1000 -q
2、mysql性能测试
mysqlslap -uroot -p123.com -a --concurrency=100 --number-of-queries=3000 -i 3 --number-char-cols=4 --number-int-cols=4 --engine=innodb --auto-generate-sql-load-type=write
redis的基本操作命令
登录redis:
redis-cli -h 192.168.10.2 -p 6379
在redis中,一个数据库中一张默认的表,表中只有两个字段,key 和 value,库之间没有依赖关系。
1.set 添加数据,如果有同名key的数据,则会覆盖此数据。
格式:
set 键名 值
例:
set k1 zhang1
2.get 查看指定键名的数据值
格式:
get 键名
例:
get k1
3.mset 添加多行数据,如果添加的数据值有key重名,则会覆盖之前的数据。
格式:
mset 键名1 值1 键名2 值2 键名3 值3 ......
例:
mset k2 zhang2 k3 zhang3 k1 zhang1 k4 liu2
4.setnx 添加数据,但是不覆盖重名key的数据。如果添加成功,则提示信息为1,如果失败则提示0。
格式:
setnx 键名 值
例:
setnx k1 zhang1
5.msetnx 添加多行数据,但不覆盖重名key的数据。一旦添加数据出错,则整个命令被中断,其他记录不会被添加。
格式:
msetnx 键名1 值1 键名2 值2 ....
例:
msetnx k6 zhang1 k7 aaa
6. keys 查看key列表
keys * 查看key列表中的所有键名。
7.setex 添加具有生存时间的数据,超过生存时间后,数据会被自动清除。覆盖重名key的数据。
格式:
setex 键名 生存时间 值
例:
setex 2020 10 aaaaaaaaaaa
8.mget 查看多个数据记录
格式:
mget 键名1 键名2 键名3 。。。。。
例:
mget k1 k2 k3 k4
9.keys 命令的其他格式
keys k* 查看以k开头的键名
keys *1 查看以1结尾的键名
keys 2020*2 查看以2020开头,以2结尾的键名
1、exists 返回指定的键名是否存在,如果存在返回数值1,不存在返回数值0。一般在程序中进行键名判断时使用此命令。
exists k1
2、del 删除指定的键
del 键名
例:
del k2
del k3 k4 k5
3、type 查看指定键值的类型
type 键名
4、rename 修改键名,修改键名不会覆盖内容。如果目标键名已存在,则会覆盖目标键值。
rename 旧键名 新键名
例:
rename 202020522 20200522
5、renamenx 修改键名,如果目标键名存在,则不覆盖目标键值。
renamenx 旧键名 新键名
6、dbsize 统计当前数据库中的key数
dbsize
7、select 切换数据库
redis默认数据库ID号为0,切换数据库时,使用select 数据库ID号。redis最大16个数据库,ID号到15。
select 1
8、move 移动数据到其他数据库,可以在不同库之间相互移动数据。
move 键名 数据库ID号
move k2 1
9、flushdb 清除当前数据库中的数据记录
flushdb
10、flushall 清除所有数据库中的数据记录
flushall
注意:flushdb和flushall命令只能在redis服务器做缓存时使用,千万不要在存储实体数据时使用。
11、incr 增加数值
incr能够对指定键中的数值+1 ,返回增加后的结果。如果值为字符串,则报错,如果键名不存在,则默认创建键名,数值从0开始累加1
incr 键名
incr k2
12、incrby 指定增加数值量
incrby 键名 指定增加的值
incrby k2 10
13、decr 减少数值
decr能够对指定键中的数值-1,返回较少后的结果。如果键名不存在,则默认从0开始-1。
decr 键名
14、decrby 减少指定的数量
decrby 键名 指定减少的数值
decrby k2 20
15、hmset 添加数据类型为hash的键值,使用哈希hash值的算法,将多个值写入到一个键名中。
hmset 键名 field1 值1 field2 值2 ....
hmset name field1 zhang1 field2 zhang2
16、hget 查看hash类型的键值,查看hmset添加的键值数据。
hget 键名 field1
17、list(列表) 有序列表,在同一个键名中,添加多个值,并按顺序排序。
添加数据:
lpush 键名 数据
查看数据:
lrange 键名 起始序号 结束序号
1、redis群集
构建数据库群集的原因:数据库在读写数据时所占用的硬件资源比web服务更多,任何单服务器的硬件资源都是有限的。数据库在大量的读写访问时,硬件资源会产生瓶颈。所以,数据库可以通过构建群集,提升数据访问的并发量。如:支付宝,微信交易,朋友圈等,微信聊天。
redis群集关键词:
1.虚拟槽:slots(插槽,一般指主板上扩展设备的一个接口),在redis数据库中的虚拟槽,是在redis数据库中开启一个虚拟接口,客户端可以通过虚拟接口连接数据库,并对数据进行读取写入,每个槽都可以独立接收任务。
2.虚拟槽分区:redis数据库定义了在群集中,虚拟槽的总数为16384个,所有参与到群集的redis服务器平分这些槽,最后每个redis服务器分配到的槽数量范围为槽分区。对于redis服务器,上千个槽是足够用的。
3.无中心结构:一般构建群集的结构分为两种情况,第一种有中心结构,如LVS,haproxy,nginx,amoeba等等,必须有有一个独立的调度器,对数据访问请求进行群集规则调度,工作原理相对比较简单,容易实现,缺点时单点故障问题。无中心结构,没有固定的调度器,群集中的任何一台节点服务器都能够作为调度器使用,节点之间协商调度规则,分配访问请求的处理。工作原理相对比较复杂,对数据处理的效率相对高一点,能够有效解决单点故障问题。还能解决服务的接口访问并发量问题。
4.群集状态信息:每个群集都有自己的虚拟地址和群集相关的信息,如群集名称,虚拟IP,虚拟MAC,节点服务器数量,节点服务器地址,节点服务器的作用类型,数据调度算法,节点健康检查规则等等。redis群集中,每台节点服务器都要相关的信息,任何一台节点接收到客户端的访问请求后,通过状态信息判断数据在那个节点上,通知该节点服务器进行响应。工作方式有点像银行或保险公司的一站式服务。
5.群集角色:
master:在群集中用于接收客户端访问请求,并且进行读写数据响应的节点服务器,master节点之间分配槽分区。
slave:给master提供冗余的数据同步服务器,当master出现故障时,有slave顶替master的工作。所以,在redis群集中,一般会给每台master数据库匹配一台slave,提供冗余功能。
6.redis群集的端口号:
6379:面向客户端开放的端口号,用于接收客户端的访问请求,进行数据回应。
16379:面向群集中,节点服务器开发的端口号,用于同步数据,更新同步群集信息,包括健康检查。
2、redis工作原理
1.构建群集,并进行master的选举:
首先,redis群集由6台以上的偶数服务器数量构建。服务器的数量是计算了slave的。最少构建要求是3台master节点。首次创建群集的选举,是通过用户输入构建群集节点的IP地址升序排序进行设置,前一半的服务器做master,后一半的服务器做相对应的slave。
确认好master节点后,进行slots分配。slave上的槽数量与master相同。
2.添加节点
群集在使用过程中如果添加节点服务器,每次添加的数量是偶数。新添加的节点根据新节点服务器的IP地址的排序进行master和slave的分配,不影响之前的master。确认好master后,重新分配slots数,不是全部打撒,计算好需要保留的槽数,将多余的槽减掉,分配给新master节点。
3.缩减节点
先将被收缩节点服务器上的数据平均存储给其他剩余节点服务器,将被收缩节点服务器的槽平均分配给剩余的其他节点服务器。发送通告给所哟节点服务器,在群集信息中删除该节点信息。