ansible和nginx版本协议

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系统调用是一种通过在内核空间中直接操作文件数据来减少数据拷贝次数的技术
- 它可以在网络套接字和文件之间直接传输数据,而不需要将数据从内核缓冲区拷贝到用户缓冲区,提高了数据传输的效率
  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值