数据库常遇到的问题: 1.向上拓展 scale up( 个体本身 硬件的拓展) 缺点:容易达到极限 2.向外拓展 scale out(计算机的个数,组合成集群) 摩尔定律:每18个月芯片的技术翻一倍,价格增长一倍,体积减少一倍 mysql的主从实现: 企业级数据库高可用构架图: mysql内建的复制功能是构建大型,高性能应用程序的基础。

mysql复制的特点:

*mysql复制工作如何进行:

mysql的主从复制是异步的

binlog二进制日志

dump:主mysql中的线程,它会把二进制日志 I/O线程:在主的mysql上拉二进制文件,记录在relaylog中 SQL线程:从relaylog中拉出日志内容,去往数据库中写 mysql的主从复制解决高可用的问题

实战演练: mysql的主从实现

 主:
    vim /etc/my.cnf
    server-id=1  让服务器有唯一的ID号
    log_bin=mysql-bin  开启二进制文件
    skip-name-resolve 名字解析
    hostname mysql-master 修改主机名
    systemctl start mariadb
    cd /var/lib/mysql  ls 查看是否生成二进制日志
    mysql -uroot -p
    >GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO slave@'172.17./%.%' IDENTIFIED BY 'magedu';授权
  //  >flush tables with read lock 给表加锁 
  //  >unlocak tables 解锁
    >create database magedu;
    >use magedu;
    >create table m26(id int not null,name char(20));
    >show create table m26 \G;
    >insert into m26 values(1,'laowang');
    > show binlog events;
    > show master status;
```

从:
```
   vim /etc/mysql
   server-id=2
   relay-log=mysql-relay-bin
   read_only =1
   log_bin =mysql-bin
   log_slave_updates=1
   systemctl start mariadb
   cd /var/lib/mysql  ls 查看是否生成二进制日志 
   启动复制线程之前,指定服务器的配置
   mysql -uroot -p
   >CHANGE MASTER TO MASTER_HOST='172.17.0.159',
    MASTER_USER='SLAVE',
    MASTER_PASSWORD='magedu',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=811;
   > start slave;
   > show tabless;
   >create tables m27(id int not null,name char(20)); 在从服务器上插表
   >select * from m26;
   ```

show slave status\G 查看是否成功

实现主从从构架:
 从节点需要开启二进制日志,可以搭建主从从构架,
 
   
mysql的复制过滤器:仅限有一个或几个数据相关的数据,而非所有,由复制过滤器进行



什么是自增长ID:

什么是主键:关系型数据中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能够唯一标识一条记录,该属性组就可以成为一个主键
主键的作用:1.可以保证数据的唯一,不会产生冗余的数据 2.可以加快数据的操作速度
外键:用来链表查询
索引:它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单
索引的作用:是快速帮助查询数据

mysql互为主从:
```
   1.vim /etc/my.cnf
     server-id=1
     skip-name-resolve
     relay-log=mysql-relay-bin
     log-bin=mysql-bin
     log_slave_updates=1
     auto_increment_increment=2
     auto_increment_offset=1
    # replicate_do_db=magedu
     systemctl restart mariadb
     mysql -uroot -p 
    >show databases
    >show master status;
    >CHANGE MASTER TO MASTER_HOST='172.17.0.170',
    MASTER_USER='SLAVE',
    MASTER_PASSWORD='magedu',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=245;
    >start slave;
    >show slave status;
    >use magedu
    >create table userinfo(id int PRIMARY KEY AUTO_INCREMENT, name varchar(50) NOT NULL);
    >show tables;
    >desc userinfo;查看表
    >insert into userinfo(name)value('xiao'),('da'),('lao');
    >select * from userinfo;
   2.vim /etc/my.cnf
     server-id=2
     relay-log=mysql-relay-bin
     log-bin=mysql-bin
     log_:wqslave_updates=1
     auto_increment_increment=2
     auto_increment_offset=2
    # replicate_do_db=magedu
     systemctl restart mariadb        
     mysql -uroot -p
     >show databases
     >show slave status\G;     
     >CHANGE MASTER TO MASTER_HOST='172.17.0.159',
      MASTER_USER='SLAVE',
      MASTER_PASSWORD='magedu',
      MASTER_LOG_FILE='mysql-bin.000002',
      MASTER_LOG_POS=245;
     >start slave;
     >show slave status;
     >use magedu;
     >show tables;
     >insert into userinfo(name)value('ni'),('wo'),('ta');
     >select * from userinfo;
```
半同步复制:基于互为主从复制进行的操作
  主节点:
    ```
    1. > INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
       >SHOW GLOBA VARIABLES LIKE 'rpl_semi%';
       >set global rpl_semi_sync_master_enabled =1;
       >stop slave;
       >start slave;
       cd /var/lib/mysql
       cd /var/log/mariadb
       tail -200 mariadb.log 查看日志 
        
    2. >INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_slave.so';
       >SHOW GLOBA VARIABLES LIKE 'rpl_semi%';
       >set global rpl_semi_sync_master_enabled =1;
```
mysql高可用构架之MHA: 
     1.安装配置MHA
     2.准备基于SSH互信通信环境
     3.进行安装包安装  yum install mha4mysql..... 在ftp上   n装ode 包也需要
     4.初始化MHA,进行配置
     
mysql主从复制技术有哪些好处:提高性能,实现高可用
I/O线程和SQL线程
 
   ysql读写分离,分库分表和优化介绍
select for update
中间件:mysql proxy实现mysql的代理,one proxy(mysql的代理)aliSQL proxySQL 
动态请求:php-->server node1
静态请求:css images js html-->server node2

分库分表:
        1.水平拆分
        2.垂直拆分
mysql优化:
1.可以用数据缓存 常见的memcached
2.数据库生身有很多的缓存机制,可使用对应的缓存策略
3.对数据来说,尽可能使用索引
4.对请求而言,可以实现读写分离,对读请求进行负载均衡
5.对大数据库,可根据业务逻辑进行分库分表
6.所有的优化,尽可能往内存中存放

Tomcat和servlet

编程语言分类:
 硬件级:微码编程,汇编语言
 系统级:C C++......  (C语言性能高)
 应用级:JAVA,PHP,Python,Ruby,Perl,C#,.......

面向对象:对象就是对事物的一种抽象描述

面向过程:按照事情发展的顺序一步一步的进行操作

JAVA使用的是面向对象的系统设计方法,并且JAVA可以实现多层构架对于跨平台的大型企业应用系统来讲,JAVA几乎已经成为唯一的选择

PHP:PHP适合于快速开发,中小型应用系统,开发成本低,能够对变动的需求作出快速的反应

JAVA编译器(字节码)-》虚拟机(解释器)-》解释器(翻译)-》机器码

*.java->*.class->机器码

JAVA运行原理:
编程语言编译类型大致可以分为三种:
  1.源代码-编译器-本机代码-运行
  2.源代码-解释器-本机代码-运行
  3.源代码-中间语言-虚拟机(相当于解释器)-本机代码-运行
  可以发现最后都需要变成本机代码才能执行

JAVA三大分支:
1.J2SE--java standard edition 标准版本
2.J2ME--java Micro edition 一般 位于嵌入式应用
3.J2EE--java Enterprise Edition 一般为服务器端程序的应用

servlet完全依赖于服务器端  
servlet的本质是一个帮助程序

静态网站技术和动态网站技术:
servlet技术是什么:作为Java正营的CGI解决方案
servlet容器的作用:Servlet容器也叫做servlet引擎,是web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化基于MIME的响应
                  有了servlet之后用户通过单击某个链接或者直接在浏览器的地址中输入URL来访问servlet

servlet容器能提供什么:
  1.通信支持:利用容器提供的方法,你能轻松的让servlet与web服务器对话,而不用自己建立serversocket,监听端口
  2.生命周期管理
  3.多线程支持
  4.JSP支持

Tomcat是Apache软件基金会

Tomcat的核心分为三个部分:
1.web容器--处理静态的页面
2.catalina--一个servlet容器---处理servlet
3.还有有就是JSP容器,它就是把JSP页面翻译成为一个servlet


JSP和servlet的区别:JSP就是在HTML里面写Java代码,servlet就是在Java里面写HTML代码...其实JSP经过容器解释器之后就是servlet
 JSEE-->sevlet--->CGI
 java写的sevlet程序
 Java容器过来调用
 JSP html-->java标签-->sevlet

tomcat和servlet的关系:tomcat实际上就是servlet用Java编写的程序

JRE顾名思义是Java运行时的环境,包含了Java虚拟机,Java基础类库
JDK顾名思义是Java开发工具包,是程序使用Java语言编写Java程序所开发的工具包,是提供给程序员使用的。

JDK:yum install jdk-8u144-linux

Java -version可以查看

tomcat安装方式:
```
1.lftp 172.17.0.1
>cd pub
>cd sources
>ls
>cd 7.x86_64 
>cd jdk
>ls
>get jdk-8u144-linux 下载
```

yum localinstall jdk......
默认路径
cd /usr/lib/jvm
cd /usr/java/jdk1.8.0_144/bin
cd ..   java]

2.设置环境变量
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_144
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH


chmod +x /etc/profile.d/java.sh
. /etc/profile.d/java.sh 进行读取

echo $JAVA_HOME 查看 Jdk 

Java -version再次可以查看,版本是否改变

```
3.lftp 172.17.0.1
 cd pub
 cd sources
 cd 7.x86_64
 cd tomcat
 mget apache-tomcat-7.0.78.tar.gz solo-2.2.0.war(部署文件)
```
4. tar -xvf apache.....
 cd apache-tomcat-7.0.78
 ls 查看
 cd ..
 mv apache-tomcat-7.0.78 /usr/local/tomcat
 cd  /usr/local/tomcat

 ls 
 cd bin
 ./catalina.sh start 运行tomcat
 netstat -tunlp 

172.17....:8080 访问测试
 

cd /conf    server.xml 主配置配置文件
             
              1.server:server表示整个的Catalina servlet容器。   
              2.service :service是存活在server内部的中间组件
              3.Connector组件:连接器处理与客户端的通信
              4.Engine组件:在tomcat中,每个service只能包含一个servlet引擎
              5.Host组件:位于engine内部用于接收请求并进行相应处理的主机或虚拟主机类似Nginx server
              6.Context组件:一个context表示了一个web应用程序,运行在特定的虚拟主机中,一个host可以包含多个context(代表web应用程序)
                          类似Nginx location
           web.xml web应用程序描述文件
           context.xml 可以用来配置数据库之类的信息
           logging.properties日志系统相关的配置

tomcat页面: manmger
            
            admin

测试jsp脚本
 cd webapps
 mkdir test  
 cd test
 vim  index.jsp


tomcat相关配置:
cd  /usr/local/tomcat
cd conf
vim tomcat-users.xml  
< role rolename="manager-gui"
< role rolename="admin-gui"
< user username="tomcat" password="tomcat"  roles="manager-gui,admin-gui"/>


./bin/catalina.sh stop
./bin/catalina.sh start



Tomcat的部署:
将ftp上的solo包部署到Tomcat上


cp sols-2.2.0.war /usr/local/tomcat/webapps

cd webapps
mv solo-2.2.0.war /tmp

cd webapps
mv /tmp/solo-2.2.0.war  ./

cd logs日志存放路径

tomcat组成原理:
service:就是连接器与引擎组合在一起
 connector:连接器用来接收用户的请求
 engine:引擎是用来处理用户的请求         
 host:就是虚拟主机
 context:相当于location ,也就是相当于路由,也可做匹配
 servlet:就是程序


JSP webapp的组织结构:
     /:webapps的根目录;
     index.jsp主页;  cd /manager

maven 项目管理工具  www.oschina.net  java开源项目

mysql -uroot -p -D magedu < jeesns.sql 在magedu数据库中导文件