1.角色完成mysql二进制安装
[17:44:49root@localhost luo]# yum install ansible #安装ansible
[17:46:13root@localhost luo]# ssh-keygen #创建公钥私钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:AoJsdjpiM4d9rONvgBCFXy9ldUer6T2TCiHkBGZi9Cc root@localhost.localdomain
The key's randomart image is:
+---[RSA 3072]----+
| += + .. ..o |
|+o =..o . . . |
|.*.oE++ . |
|+ *.oB. o |
|oB.o ++ S o |
|o.=.o o o . . |
| o. . . = |
| . .. . . o |
| .o. . |
+----[SHA256]-----+
[17:47:39root@localhost ~]# ssh-copy-id 10.0.0.8 #完成sshkey验证
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '10.0.0.8 (10.0.0.8)' can't be established.
ECDSA key fingerprint is SHA256:xqqVtWwL4PRBjaQ11xGCujl14upZRMkYKHZZ7YQ3jwU.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.0.0.8's password;':
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '10.0.0.8'"
and check to make sure that only the key(s) you wanted were added
[17:48:42root@localhost luo]# tree #创建角色结构
.
├── ansible.cfg
├── ansible_setup_info.json
├── hosts
├── mysql.yml
└── roles
└── mysql
├── files
│ └── mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz
├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
└── templates
├── my.cnf.j2
└── mysqld.service.j2
6 directories, 8 files
[17:49:37root@localhost luo]# cat hosts
[webservers]
10.0.0.8
10.0.0.38
10.0.0.25
[webservers:vars]
uid=88
user=mysql
gid=88
group=mysql
version="8.0.30"
url="https://downloads.mysql.com/archives/get/p/23/file/mysql-{{ version }}-linux-glibc2.12-x86_64.tar.xz"
mysql_data="/data/mysql"
mysql_tar_dir=/usr/local/src
[appservers]
10.0.0.101
10.0.0.102
[dbservers]
10.0.0.28
[17:50:59root@localhost luo]# cat mysql.yml
- hosts: 10.0.0.8
remote_user: root
roles:
- mysql
├── tasks
│ └── main.yml
- name: 安装mysql依赖包
yum :
name: "{{ item }}"
loop:
- libaio
- perl-Data-Dumper
- ncurses-compat-libs
when: ansible_os_family == "RedHat"
- name: ubuntu安装mysql依赖
apt :
name: "{{ item }}"
loop:
- numactl
- libaio-dev
- libtinfo5
when: ansible_os_family == "Debian"
- name: 下载解压mysql #发现下载mysql会出错应该是文件太大了
unarchive:
#src: "{{ url }}"
src: "mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz"
dest: "/usr/local/src"
#remote_src: yes
creates: "{{ mysql_tar_dir }}/mysql-8.0.30-linux-glibc2.12-x86_64/bin"
- name: 创建软链接
file:
src: "/usr/local/src/mysql-{{ version }}-linux-glibc2.12-x86_64"
dest: /usr/local/mysql
state: link
- name: 创建组
group:
name: "{{ group }}"
gid: "{{ gid}}"
- name: 创建用户
user:
name: "{{ user }}"
uid: "{{ uid }}"
shell: /sbin/nologin
group: "{{ group }}"
system: yes
- name: 创建基于目录权限
file:
path: "/usr/local/mysql"
owner: "{{ user }}"
group: "{{ group }}"
recurse: yes
state: directory
#- name: 添加PATH #这些都是测试写发使用不了
# lineinfile:
# path: /etc/profile.d/mysql.sh
# line: "export PATH=$PATH:/usr/local/mysql/bin"
# state: present
# create: yes
# mode: 554
#- name: 执行PATH
#shell:
#cmd: "export PATH=$PATH:/usr/local/mysql/bin"
#- name: 执行 PATH
# shell: echo 'export PATH=$PATH:/usr/local/mysql/bin' >> ~/.bashrc
# args:
# executable: /bin/bash
# become: yes
# #become_user: root
- name : PATH
shell: source ~/.bashrc
tags: path
- name: 传送mysql配置文件
template:
src: my.cnf.j2
dest: /etc/my.cnf
notify:
- restart mysqld
- name: 创建mysql数据文件基于权限
file:
path: "/data"
owner: "{{ user }}"
group: "{{ group }}"
recurse: yes
state: directory
- name: 安装mysql数据
shell:
cmd: "/usr/local/mysql/bin/mysqld --initialize --user={{ user }} --datadir={{ mysql_data }}"
chdir: "/usr/local/mysql/bin/"
creates: "{{mysql_data}}/mysql"
- name: 复制启动文件到init.d
copy:
src: "/usr/local/mysql/support-files/mysql.server"
dest: "/etc/init.d/mysqld"
mode: 0754
remote_src: yes
- name: Centos MySQL 服务添加到系统的服务管理器设置开机启动
shell:
cmd: |
chkconfig --add mysqld
chkconfig mysqld on
when: ansible_os_family == "RedHat"
- name: Ubuntu MySQL 服务添加到系统的服务管理器设置开机启动
shell:
cmd: "update-rc.d -f mysqld defaults"
when: ansible_os_family == "Debian"
- name: 编写service文件
template:
src: mysqld.service.j2
dest: /lib/systemd/system/mysqld.service
- name: 启动mysql服务
service:
name: mysqld
daemon_reload: yes
state: started
enabled: yes
- name: 获取MySQL临时密码
shell: "awk '/A temporary password/{print $NF}' {{ mysql_data}}/mysql.log"
register: mysql_temp_password
changed_when: false
#- name: 编写密码文件
# template:
# src: passwd.j2
# dest: /data/passwd
# tags: passwd
- name: 创建新密码
shell: "/usr/local/mysql/bin/mysqladmin -u root -p'{{ mysql_temp_password.stdout }}' password '123456'"
[17:53:28root@localhost mysql]# cat handlers/main.yml
- name: restart mysqld
service:
name: mysqld
state: restarted
[17:53:57root@localhost mysql]# cat templates/my.cnf.j2
[mysqld]
server-id=1
log-bin
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-error=/data/mysql/mysql.log
pid-file=/data/mysql/mysql.pid
[client]
socket=/data/mysql/mysql.sock
[17:54:14root@localhost mysql]# cat templates/mysqld.service.j2
[Unit]
Description=mysql database server
After=network.target
[Service]
Type=notify
PrivateNetwork=false
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/mysqld start
ExecStop=/etc/init.d/mysqld stop
ExecReload=/etc/init.d/mysqld reload
[Install]
WantedBy=multi-user.target
Alias=mysqld.service
[17:58:10root@localhost luo]# ansible-playbook mysql.yml
PLAY [10.0.0.8] *****************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************
ok: [10.0.0.8]
TASK [mysql : 安装mysql依赖包] **************************************************************************************
ok: [10.0.0.8] => (item=libaio)
ok: [10.0.0.8] => (item=perl-Data-Dumper)
changed: [10.0.0.8] => (item=ncurses-compat-libs)
TASK [mysql : ubuntu安装mysql依赖] **********************************************************************************
skipping: [10.0.0.8] => (item=numactl)
skipping: [10.0.0.8] => (item=libaio-dev)
skipping: [10.0.0.8] => (item=libtinfo5)
skipping: [10.0.0.8]
TASK [mysql : 下载解压mysql] ****************************************************************************************
changed: [10.0.0.8]
TASK [mysql : 创建软链接] *******************************************************************************************
changed: [10.0.0.8]
TASK [mysql : 创建组] ***********************************************************************************************
changed: [10.0.0.8]
TASK [mysql : 创建用户] *********************************************************************************************
changed: [10.0.0.8]
TASK [mysql : 创建基于目录权限] *************************************************************************************
changed: [10.0.0.8]
TASK [mysql : PATH] *************************************************************************************************
changed: [10.0.0.8]
TASK [mysql : 传送mysql配置文件] ************************************************************************************
changed: [10.0.0.8]
TASK [mysql : 创建mysql数据文件基于权限] ****************************************************************************
changed: [10.0.0.8]
TASK [mysql : 安装mysql数据] ****************************************************************************************
changed: [10.0.0.8]
TASK [mysql : 复制启动文件到init.d] *********************************************************************************
changed: [10.0.0.8]
TASK [mysql : Centos MySQL 服务添加到系统的服务管理器设置开机启动] **************************************************
changed: [10.0.0.8]
TASK [mysql : Ubuntu MySQL 服务添加到系统的服务管理器设置开机启动] **************************************************
skipping: [10.0.0.8]
TASK [mysql : 编写service文件] **************************************************************************************
changed: [10.0.0.8]
TASK [mysql : 启动mysql服务] ****************************************************************************************
changed: [10.0.0.8]
TASK [mysql : 获取MySQL临时密码] ************************************************************************************
ok: [10.0.0.8]
TASK [mysql : 创建新密码] ************************************************************************************
ok: [10.0.0.8]
RUNNING HANDLER [mysql : restart mysqld] ****************************************************************************
changed: [10.0.0.8]
PLAY RECAP **********************************************************************************************************
10.0.0.8 : ok=16 changed=15 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0
#安装完成测试一下
[18:02:36root@localhost ~]# systemctl status mysqld.service
● mysqld.service - mysql database server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2024-03-19 18:01:59 CST; 48s ago
Process: 36653 ExecStop=/etc/init.d/mysqld stop (code=exited, status=0/SUCCESS)
Process: 36678 ExecStart=/etc/init.d/mysqld start (code=exited, status=0/SUCCESS)
Tasks: 40 (limit: 11088)
Memory: 425.3M
CGroup: /system.slice/mysqld.service
├─36688 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/mysql.pid
└─36860 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/lo>
Mar 19 18:01:57 localhost.localdomain systemd[1]: Starting mysql database server...
Mar 19 18:01:59 localhost.localdomain mysqld[36678]: Starting MySQL.. SUCCESS!
Mar 19 18:01:59 localhost.localdomain systemd[1]: Started mysql database server.
[21:44:15root@localhost mysql]# . /etc/profile.d/mysql.sh
[21:44:17root@localhost mysql]# echo $PATH
/usr/local/mysql/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[21:44:41root@localhost mysql]# mysql -u root -p'123456'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 41
Server version: 8.0.30 MySQL Community Server - GPL
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
2.总结http协议版本和工作原理
版本 | 工作原理 | 特点 |
---|---|---|
HTTP/1.0 | - 基于客户端-服务器架构,每次请求-响应完成后关闭连接 - 请求-响应模式:客户端发送请求,服务器返回响应,并在响应后关闭连接 - 每次请求-响应都需要建立新的TCP连接,效率较低 - 没有持久连接、请求管道、分块传输编码等现代特性 - 存在的问题:请求响应时延高,TCP连接数量多,不适用于多媒体、大数据传输等场景 | - 每次请求都需要建立新的TCP连接,效率较低 - 不支持持久连接、请求管道、分块传输编码等现代特性 - 请求响应时延高,TCP连接数量多,不适用于多媒体、大数据传输等场景 |
HTTP/1.1 | - 引入持久连接(HTTP Keep-Alive):一个TCP连接可以传输多个HTTP请求和响应,减少了TCP连接的建立和关闭次数,提高了性能 - 引入请求管道(Pipeline):客户端可以在不等待响应的情况下发送多个请求,减少了请求-响应的等待时间,提高了效率 - 支持分块传输编码(Chunked Transfer Encoding):允许服务器将数据分块发送,适用于大文件传输等场景 | - 引入持久连接、请求管道、分块传输编码等现代特性,提高了性能 - 减少了TCP连接的建立和关闭次数,降低了延迟 - 支持更高效的请求-响应模式,适用于多媒体、大数据传输等场景 |
HTTP/2 | - 采用二进制帧(Frame)传输,代替了HTTP/1.x的文本格式,减少了传输开销 - 多路复用(Multiplexing):一个TCP连接上可以并行发送多个请求和响应,避免了HTTP/1.x中的队头阻塞问题,提高了并发性能 - 头部压缩(Header Compression):采用HPACK算法对请求和响应头部进行压缩,减少了数据传输量 - 服务器推送(Server Push):服务器可以在客户端请求之前推送资源,提前满足客户端的需求,优化页面加载速度 | - 采用二进制帧传输,减少了传输开销 - 引入多路复用机制,避免了HTTP/1.x中的队头阻塞问题,提高了并发性能 - 头部压缩减少了数据传输量,提高了效率 - 支持服务器推送,优化了页面加载速度 |
3.总结IO模型和零复制技术的原理
3.1总结IO模型
IO模型 | 描述 |
---|---|
阻塞IO | - 应用程序调用IO操作后,如果数据没有准备好,程序将被阻塞,直到数据准备好为止 - 典型的阻塞IO包括普通文件IO、网络IO等,应用程序需要等待IO操作完成后才能继续执行后续代码 |
非阻塞IO | - 应用程序调用非阻塞IO操作后,如果数据没有准备好,操作会立即返回一个错误码,不会阻塞程序执行 - 应用程序可以通过轮询或其他方式等待数据准备好,然后再进行IO操作,提高了程序的并发性能 |
IO多路复用 | - 应用程序使用select、poll或epoll等系统调用同时监听多个文件描述符的IO事件,当有IO事件就绪时,再进行IO操作 - IO多路复用模型可以同时处理多个IO事件,提高了程序的并发性能 |
信号驱动IO | - 应用程序通过信号驱动IO模型,向内核注册一个信号处理函数,并请求内核在IO事件准备就绪时发送一个信号 - 当IO事件就绪时,内核会发送一个信号给应用程序,应用程序在信号处理函数中进行IO操作 |
异步IO | - 应用程序发起IO操作后立即返回,不需要等待IO操作完成 - 当IO操作完成时,内核会通知应用程序,应用程序再进行后续处理 - 异步IO操作由内核负责管理和调度,应用程序只需注册IO完成的回调函数 |
3.2零复制技术的原理
技术 | 描述 |
---|---|
mmap | - mmap技术允许应用程序将文件映射到内存中的一段地址空间,通过直接访问内存来读写文件,而不需要通过read和write系统调用 - mmap技术可以减少数据在用户空间和内核空间之间的拷贝开销,提高了IO操作的效率 |
splice | - splice系统调用是一种在内核空间中直接操作文件数据的技术,用于将一个文件描述符的数据传输到另一个文件描述符,或者将数据传输到网络套接字 - splice技术可以减少数据在内核空间和用户空间之间的拷贝开销,提高了数据传输的效率 |
sendfile | - sendfile系统调用是一种通过在内核空间中直接操作文件数据来减少数据拷贝次数的技术 - 它可以在网络套接字和文件之间直接传输数据,而不需要将数据从内核缓冲区拷贝到用户缓冲区,提高了数据传输的效率 |