IO理论知识
同步、异步、阻塞、非阻塞
同步:系统调用一个函数、并不会立即完成而是等待外部调用工作完成后才结束。
阻塞:系统调用一个功能,同样不会立即完成,并等待io完成,直到io完成才结束。
非阻塞:系统调用一个功能,并很快返回一个未完成的状态结果,并定期轮询查看进程执行情况,称为非阻塞。
异步:系统发起一个调用请求后,继续执行其他进程,待结束后,返回一个结果信息。
linux优先级:priority
实时优先级:1-99,数值小,优先级低
静态优先级:描述用户状态,100-139,数值小,优先级高
实时优先级比静态优先级高
通过top可以查看进程当前的优先级,通过nice来调整优先级,由于用户优先级是100-139,而nice调整的范围是-20 至 19,可以推断出用户优先级默认是120。
调度类型:
实时进程:
sched_fifo:先进先出队列 FF
sched_rr:轮训调度
sched_other:调度用户空间进程 TS
动态优先级:对于长期不能得到相应的优先级低的进程,会临时调整优先级,主要对sched_other类型进行调整。
手动调整优先级:nice
100-139之间
对于未启动的进程设置优先级
nice n command
对于已启动的进程设置优先级
renice -n process-id
1-99之间
chrt
-f:fifo类别
-r:rr类型
-o:other类型
例如:chrt -f -p [prio] pid
启动一个进程直接设置优先级,chrt -f -p [prio] command
web服务器内核工作常见协议
CGI协议
CGI是通用网关接口,主要负责web服务器前端和后面解释器、应用环境的通信,举例说:一个用户请求一个WEB页面,如果这个请求是一个静态页面请求,那么直接由httpd、nginx处理即可,如果请求的是一个需要进行计算的动态页面,那么这个请求就要涉及到具体的解释器或者应用程序,这个通常是在编写网页的时候就应经制定的比如php、jsp、tomcat等应用程序,这个时候httpd与php之间就需要CGI来作为通信协议保证之间的正常通信了。
httpd会主动生成一个进程来处理动态请求,并在动态请求结束后进行销毁工作。
在CGI的协议下,由于IO工作模型不同,有一下几种模型:
1、单进程阻塞工作
由于是工作在阻塞模式下,前端httpd只可以接受一个动态请求,直到请求处理结束后才处理第二个请求。
2、perfork工作机制: 客户端请求服务,httpd会有一个主进程专门用来派发动态请求,服务器的主进程对服务请求进行相应,并分配一个空闲进程来对客户端服务进行处理,一个进程只能处理一个请求。主进程只负责接收请求并派发给空闲进程。即实现多路io复用。
缺点:对于大量访问,需要分配大量子进程,消耗cpu资源,造成浪费
解决方法:线程的使用worker。
worker工作机制:客户端发起请求服务,服务器的主进程后面会有多个工作进程,并且会将请求分配到工作进程的线程里面去,实现多进程多线程的工作模式。
缺点:追踪问题困难
event模型:同样是一个主进程接受客户端请求并派发,子进程采用AIO模式,一个进程可以接受多个请求,不存在上下文切换。
上下文切换:不同进程或线程直接在请求信息和完成请求的时候会产生切换,称为上下文切换,上下文切换会造成资源大量损耗。
Fast-CGI协议
CGI是通过web服务器(httpd、nginx)来生成一个调用CGI的进程,这个进程是立即生成并调用的,同时维护CGI的完成。而FASTCGI采用C/S架构,自身独立于web服务器产生一个“服务器”,用来接收web服务器的关于动态请求,这个“服务器”工作方式类似prework,它是事先生成空闲进程,当web服务器需要调用动态请求的时候,这个“服务器”会随时调用空闲进程,这样为web服务器节约了cpu资源,并且也提高了访问速度。
有了fastCGI可以实现web服务器的动静分离。
动态网站开发语言
php:mysql
jsp:tomcat
python:mod_python (UWSGI,性能优于fastCGI)
ruby
数据模型引入
2-8法则:一小部分的数据被大量访问,而另外大部分数据访问很少,也就是数据的局部性。
数据管理系统
数据库引擎
数据模型:
层次模型
网状模型
关系模型
数据库范式:用于规范数据模型,有第一,第二、第三第四范式。
关系运算:
交叉连接:
投影:挑选列
选择:挑选行
操作:
read、creat、update、delete等。
数据库管理系统DBMS设计目标
1、数据冗余和不一致问题。
2、数据查找困难问题
3、解决数据的孤立性(耦合问题)
4、完整性问题
数据库访问驱动(访问接口):外部用于访问、查询、删除数据库内容的接口。不同程序访问数据的驱动接口是不同的。
通用数据库访问接口驱动:适用于各种程序访问数据库,但是比较底层,操作困难。比如ODBC。
专用数据库访问驱动:
JDBC:java程序专用
mysql被oracle收购后,原作者研发了新的mariaDBS数据库。
postgreSQL性能远远强大于mysql、oracle。
RHEL7,默认安装mariaDB,percona。
MYSQL
mysql服务:mysqld (mysql-server)
端口:3306/tcp
用户:
默认用户:root,密码:空
mysql客户端(mysql)
用户:默认是root
-u:用户名
-h:主机名
-p:密码
如果不加任何参数表示已root用户在本地登录,密码为空。
官网上常用的软件包:mysql community server (mysql软件包免费),mysql workbench(设计数据库工具包),mysql utilities (管理包),mysql proxy (代理),mysql connetcors (专用程序链接mysql的驱动)
客户端命令:不用分号结束
use db_name:设置db_name为默认数据库。
服务器端命令:必须使用分号结尾。
show databases;显示有访问权限的所有数据库
select databse();:显示默认数据库
create database mydb;:创建mydb数据库
drop database mydb;:删除mydb数据库
存储引擎:将数据库的逻辑结构比如表、索引,链接等逻辑数据信息存储在物理磁盘上,并可以实现物理数据和逻辑数据之间的链接和查找功能。
mysql的存储引擎有10多种,功能各不相同,最常见的是myisam和innodb。
php链接mysql的测试:
<hi>nihao a <hi>
<?php
$link=mysql_connect(localhost,root,"");
if($link)
echo "sueccess....";
else
echo"failure....";
?>
linux+httpd+php+mysql:LAMP
个人建站系统:
wordpress
phpwind
phpbb
drupal
joomla
discuz
phpmyadmin:用于管理mysql数据库
要求:用户名,密码必须完整且不能空密码登陆。
设置mysql用户名,密码
set password for 'root'@localhost =password('redhat'), 设置本地用户名为root,密码为redhat
启用密码
flush privileges;
php:适合小型网站的编程,由于自身问题,php公司研发了hiphop来将php翻译成c++代码,提供效率。
jsp:大型网站编程
SQL语句:统一标准由ANSI来定义,但各个数据库厂家的sql语句还是有区别的,比如mysql使用sql,sqlserver使用t-sql、oracle使用pl/sql。
第二节 安装MYSQL数据库
一、安装方式:
1、通过系统自身自带安装,os vender:mysql mysql-server,mysql-devel(开发使用)
2、源码编译:优势是可以指定自己需求,优化性能。
编译安装一般步骤:
a、创建用户和用户组
useradd -s /bin/nologin mysql
b、解压缩源码包,并指定解压位置。
tar -zxf mysql.tar.gz -C /usr/local/mysql
c、为了方便可以创建快捷方式-软连接。
ln -s /usr/local/mysql /mysql
d、编译安装mysql。 mysql5.5之后编译安装采用cmake的方式,需要先安装cmake,git。如果是mysql5.7及以上版本需要安装boost,下载boost后需要编译安装boost,方法是:bash bootstrap.sh后执行bjam
[root@localhost mysql-5.6.29]# yum install cmake git
boost安装参考:
1、安装cmake软件包
2、确定编译环境,其实所有编译安装都是需要确定编译环境的。
[root@localhost mysql-5.6.29]# yum install gcc gcc-c++
安装开发环境依赖的软件包组:
Development Tools
Server Platform Development
Desktop Platform Development
安装
[root@localhost mysql-5.6.29]# cmake -DCMAKE_INNOBASE_STORAGE_ENGINE=1 -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_CHARSET=utf8 -DMYSQL_DATADIR=/usr/local/mysql/data -DMYSQL_USER=mysql -DSYSCONFDIR=/etc
注意:参数都是使用大写方式。
以下适用于编译安装方式:
1、 导出帮助文件(使用man 的功能)
通常man文件位于/usr/local/mysql/man中(编译安装),通过修改mysql的man.config文件来进行添加man路径即可。添加MANPATH /usr/local/mysql/man。
2、导出头文件:将编译安装的mysql文件目录中的incloud目录链接到/usr/incloud/mysql中。
设置动态库文件查找:一般情况命令执行需要的动态库文件会查找/lib、/usr/lib目录以及/etc/ld.so.conf配置文件,当然也就是在ld.so.conf.d目录下创建单独的配置文件,只要指明库文件的位置即可。
命令:ln -sv /usr/local/mysql/incloude /usr/include/mysql
3、导出库文件:
命令:vim /etc/ld.so.conf.d/mysql.conf 指定库文件,首先需要创建mysql.conf文件,然后在文件里面讲mysql的库文件路径添加进来,通常是/usr/local/mysql/lib。
ldconfig -v |grep mysql //查看库文件是否已经注册,主要看libmysqlclient.so.18->libmysqlclient_r.so.18.0.0
3、通用二进制格式程序包,tarball(类似绿色版)
数据包格式通常是tar的归档类型。并且建议所有mysql数据存储位置都应该是lvm类型的磁盘格式,这样便于数据的备份(快照)。通常是安装到/usr/local/mysql中,数据默认也是存储在/usr/local/myql/data/目录下。创建mysql用户和mysql组,然后为安装目录创建软连接,ln -s 原目录 创建的链接目录。
4、rpm软件包
数据默认存储位置是/var/lib/mysq/data/目录下。此安装方式安装过程中,需要先删除之前系统中自带的早期的mysql-libs库文件,否则会包如下错误:
事务测试出错:
file /usr/share/mysql/czech/errmsg.sys from install of MySQL-server-5.6.36-1.el6.x86_64 conflicts with file from package mysql-libs-5.1.73-5.el6_6.x86_64
rpm安装,至少需要安装server和client软件,数据库通常放在/var/lib/data目录下。mysql_server 服务器端软件
mysql_client 客户端软件
mysql_bench 测试及基准程序,需要perl支持
mysql_devel 编写其他mysql和客户端的函数库和文件
mysql_share 共享函数库
warning: MySQL-client-5.6.36-1.el6.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Preparing... ########################################### [100%]
1:MySQL-client ########################################### [100%]
[root@localhost ~]# rpm -ivh MySQL-devel-5.6.36-1.el6.x86_64.rpm-5.6.36-1.el6.x86_64.rpm
error: open of MySQL-devel-5.6.36-1.el6.x86_64.rpm-5.6.36-1.el6.x86_64.rpm failed: 没有那个文件或目录
[root@localhost ~]# rpm -ivh MySQL-devel-5.6.36-1.el6.x86_64.rpm
warning: MySQL-devel-5.6.36-1.el6.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Preparing... ########################################### [100%]
1:MySQL-devel ########################################### [100%]
[root@localhost ~]# yum install MySQL-server-5.6.36-1.el6.x86_64.rpm
已加载插件:fastestmirror
设置安装进程
诊断 MySQL-server-5.6.36-1.el6.x86_64.rpm: MySQL-server-5.6.36-1.el6.x86_64
复制启动脚本
[root@localhost ~]# cp /usr/share/mysql/mysql.server /etc/init.d/mysqld
[root@localhost ~]# service mysqld start
Starting MySQL. SUCCESS!
通过rpm安装的mysql,会随机生成一个root的密码并将密码存放在/root/.mysql_secret。复制这个秘钥串,并进入mysql后重新登录并设置密码
[root@10 ~]# cat /root/.mysql_secret
# The random password set for the root user at Fri Jul 21 22:34:21 2017 (local time): O0UC3_Mv888DFpQ1
[root@10 ~]# mysql -u root -p
Enter password:
mysql> SET PASSWORD = PASSWORD('123456');
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
rpm安装的mysql默认配置文件在/usr/my.cnf,复制一个新的到/etc/my.cnf。并添加以下内容:
port = 3306
datadir = /mysqldata/data
socket = /mysqldata/data/mysql.sock
pid-file = /mysqldata/data/mysqld.pid
log-error = /mysqldata/data/mysql.err
参考文件:
:
然后初始化mysql_install_db,进入数据库创建root账户
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> update user set password=password('123123') where user='root';
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0
退出后重新登录
mysql> set password for 'root'@‘%localhost‘=password('123123');
常见问题:
1、通过rpm安装过程中,出现conflicts with 5.xx的情况,说明系统的mysql-libs库使用的版本低于目前需要安装的版本,才会造成版本冲突,解决方法就是删除早期版本的libs
方法:yum remove mysql-libs
2、mysql的开机启动脚本通常是mysql.server文件,一般位置在/usr/share/mysql/mysql.server,如果不能找到可以通过rpm -qpl mysql-server-5.xxx.rpm |grep server的方式查找。
3、一般mysql的配置文件存放在/etc/mysql.cnf。如果没有或者丢失,可以通过rpm -qpl mysql-server-5.xxx.rpm |grep cnf的方式查找。
4、Curses library not found. Please install appropriate package
处理方法:1、删除CMakeCache.txt文件。
2、yum install ncurses-devel debian,ubuantu需要安装libncurses5-dev。
5、开启服务提示sock错误:
error: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)'
Check that mysqld is running and that the socket: '/var/lib/mysql/mysql.sock' exists!
通常需要修改my.cnf配置文件,将[mysqld]的socket和[mysql]的socket均设置为同一个路径。
6、出现120223 21:29:59 mysqld_safe mysqld from pid file /usr/local/mysql/data/localhost.localdomain.pid ended问题。
删除mysql安装目录下data目录下的ib开头的所有文件。
7、/usr/bin/mysqladmin: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory
解决办法:重新安装mysql-libs文件。
[ data]# ll
total 94224
drwx------. 2 mysql mysql 4096 Mar 15 03:04 ec_school
-rw-rw----. 1 mysql mysql 85983232 Mar 16 03:08 ibdata1
-rw-rw----. 1 mysql mysql 5242880 Mar 16 03:08 ib_logfile0
-rw-rw----. 1 mysql mysql 5242880 Mar 16 03:08 ib_logfile1
drwxr-x---. 2 mysql root 4096 Mar 8 01:20 mysql
drwx------. 2 mysql mysql 4096 Mar 8 02:14 performance_schema
drwx------. 2 mysql root 4096 Mar 8 02:12 test
8、出现无法启动*.pid文件的处理办法参考以下链接,主要是解决权限和enforce的问题。
二、数据库初始化
目的:创建mysql许可表。可以初始化登录用户、数据库存放位置、源码位置等信息。
命令: mysql_install_db -user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
--user= //以某个用户身份执行,一般是mysql
--datadir= //指定数据库位置
--basedir= //指定mysql的安装路径。
information_schema和performance_schema是类似linux的proc目录,显示的信息都是虚拟化的临时信息。
三、设置权限
将mysql安装目录设置为属主和属组均为mysql用户。
chown -R mysql:mysql /usr/local/mysqld
四、启动服务
启动服务:./bin/safe_mysqld --user-mysql &
停止服务:./bin/mysqladmin shutdown
开机启动服务,添加内容到配置rc.local文件:/bin/sh -c '/usr/local/mysql: /bin/mysqld_safe'