小言_互联网的博客

运维学习笔记

832人阅读  评论(0)

1. 项目运维
1.1 运维的分类

① helpdesk:维修电脑、打印机等,随叫随到。

② 初级运维:熟悉linux命令,可以搭建ftp,smba,nginx,apache等,发布开发打包过来的项目+nginx+uwgsi,发布高性能的网站。

③ 架构师(运维开发):精通python,精通linux,精通网络,知识领域非常广。

1.2 项目发布流程

开发人员把代码写好之后发给测试人员测试性能。测试通过之后,给运维人员进行线上发布。监控运维,无论是各部门的运维,都要保障项目/网站 7*24小时正常工作。

2. 软件安装与项目部署
2.1 软件安装的方式

① yum安装:适合小型软件

② rpm安装:需要处理依赖关系,不推荐使用

③ 编译安装:适合大型软件,需要自定制功能的软件

2.2 编译安装python3

① 解决依赖关系

[root@instance-mtfsf05r ~]# yum update

[root@VM_39_157_centos ~]# yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y

② 下载python3的源代码

[root@VM_39_157_centos ~]# wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz,或

[root@instance-mtfsf05r ~]# wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz

③ 解压缩源代码

[root@instance-mtfsf05r ~]# tar zxvf Python-3.7.3.tgz -C ./

[root@instance-mtfsf05r ~]# xz -d Python-3.4.7.tar.xz

[root@instance-mtfsf05r ~]# tar -xf Python-3.4.7.tar

④ 切换进入python源代码目录

[root@instance-mtfsf05r ~]# cd Python-3.7.3/

⑤ 释放编译文件

[root@instance-mtfsf05r Python-3.7.3]# ./configure --prefix=/usr/local/python373

执行完这条语句后还不会生成/usr/local/python373这个文件夹。./configure是用来检测安装平题啊的目标特征。比如,它会检测你是不是有CC或GCC,它是一个sheel脚本。configure脚本执行后,会生成一个Makefile文件。

./configure:是当前文件夹下面的configure文件(绿色的文件表示可执行文件)
./configure --prefix=/usr/local:释放脚本文件,指明安装路径。

执行后会检查依赖问题,如果依赖没解决好,就会有各种报错。

⑥ 编译与安装

[root@instance-mtfsf05r Python-3.7.3]# make

[root@instance-mtfsf05r Python-3.7.3]# make install

这两步完成后才会创建/usr/local/python373这个文件夹。make是用来编译的,它从Makefile中读取指令,然后编译。make install是用来安装的,它也会从Makefile中读取指令,安装到指定的位置。

这两句也可以一句执行:make && make install,表示make执行成功之后,才会执行make install命令。make命令执行的时候,就会调Makefile开始编译。

⑦ 配置软链接,快捷启动python3和pip3(如果选择配置软链接,请忽略⑧⑨ )

[root@instance-mtfsf05r bin]# ln -s /usr/local/python373/bin/python3 /usr/bin/python3

[root@instance-mtfsf05r bin]# ln -s /usr/local/python373/bin/pip3 /usr/bin/pip3

[root@instance-mtfsf05r ~]# pip3 install --upgrade pip

pip3 install --upgrade pip的意思是:通过pip3 install 这个命令去升级pip

如果想要直接执行python就使用python3可以执行下面的操作:
[root@instance-mtfsf05r ~]# cd /usr/bin
[root@instance-mtfsf05r bin]# mv python python.backup
[root@instance-mtfsf05r bin]# ln -s /usr/local/bin/python3.7 /usr/bin/python

⑧ 配置系统环境变量,加入python3的目录(与⑦ 任选其一种方式)

  • 第一种方式:PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/python3/bin/
  • 第二种方式:PATH=$PATH:/usr/local/python3/bin/

配置环境变量需要谨慎,如果配错了,其它命令也会丢失。

⑨ 写入个人配置文件,永久生效

  • 编辑配置文件:[root@instance-mtfsf05r bin]# vim /etc/profile
  • 将PATH写入到配置文件中:PATH=$PATH:/usr/local/python3/bin/(可以放到最后一行)
  • 读取配置文件,生效配置:[root@instance-mtfsf05r bin]# source /etc/profile
2.3 安装启动django

① 安装django

[root@instance-mtfsf05r ~]# pip3 install django

② 创建django项目

[root@instance-mtfsf05r ~]# /usr/local/python373/bin/django-admin startproject mysite

③ 修改django项目中的settings.py配置文件

settings.py

…
ALLOW_HOST = ['*']

④ 启动django

[root@instance-mtfsf05r mysite]# python3 manage.py runserver 0.0.0.0:5001

2.4 virtualenv详解

在使用python开发的过程中,物理环境中存在各种各样的库,这些库的版本是固定的,而不同的工程依赖于不同版本的库,就会引起依赖问题。这个时候,我们需要对不同的工程使用不同的虚拟环境来保持开发环境以及宿主环境的清洁。virtualenv是一个帮助我们管理不同python环境的工具,使用virtualenv可以在系统上建立多个不同并且相互不干扰的虚拟环境。

virtualenv的原理是:把系统python复制一份到virtualenv环境,用命令source venv/bin/activate进入virtualenv环境时,virtualenv会修改环境变量,在原有$ PATH(echo $ PATH)的最前面加上虚拟环境的bin目录,这样,在虚拟环境下优先执行虚拟环境中的python3和pip3。也就是说虚拟环境中的$PATH和物理环境中的是不一样的。

① 安装virtualenv库

pip3 install --upgrade pip:升级pip工具

pip3 install virtualenv:安装virtualenv。如果下载慢,可以指定清华源或者豆瓣源下载:

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv

② 创建独立运行

virtualenv --no-site-packages --python=python3 venv

–no-site-packages的意思是构建一个干净的、和外界没有关系的虚拟环境。虚拟环境是基于物理环境的复制,这里是基于python3,所有需要使用–python=python3。venv是虚拟环境的名字,这里使用的相对路径。

③ 激活虚拟环境

source venv/bin/activate

④ 退出虚拟环境

deactivate

⑤ 查看pip3,可以看到pip3来自于虚拟环境

which pip3

2.5 开发环境的一致性

我们在本地开发环境准备好了python项目和依赖环境,现在需要放到服务器中上线发布,那么必须要保证服务器服务器的python环境和本地环境是一致的。

① 导出当前python环境的包

pip3 freeze > requirements.txt

这句命令执行后将会创建一个 requirements.txt 的文件,其中包含了当前环境所有的包/库以及各自版本的简单列表。

② 将产生的文件上传到服务器,在服务器下创建虚拟环境,在虚拟环境(venv)中导入项目所需要的模块依赖。

pip3 install -r requirements.txt

3. mysql相关
3.1 安装mysql

可以参考官方安装方式:https://downloads.mariadb.org/mariadb/repositories/#distro=CentOS&distro_release=centos7-ppc64le–centos7&mirror=tuna&version=10.4

① 添加MariaDB yum仓库

1、切换到yum.repos.d目录下
[root@instance-mtfsf05r ~]# cd /etc/yum.repos.d/
2、创建并且编辑MariaDB.repo yum仓库文件
[root@instance-mtfsf05r yum.repos.d]# vim MariaDB.repo
3、将下面的内容写入到MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
PS:还可以指定指定清华源,下载更快
[mariadb]
name = MariaDB
baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.4/centos7-amd64
gpgkey=https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1

清理yum缓存:yum clean all

生成缓存:yum makecache

② 安装MariaDB

sudo yum install MariaDB-server MariaDB-client -y

③ MariaDB的卸载

1、使用yum卸载mariadb
[root@instance-mtfsf05r ~]# yum remove mariadbdb
2、删除数据库配置文件
[root@instance-mtfsf05r ~]# rm -f /etc/my.cnf
3、删除数据目录
[root@instance-mtfsf05r ~]# rm -rf  /var/lib/mysql
3.2 启动/关闭相关命令
  • 启动Mariadb:systemctl start mariadb
  • 查看MariaDB的启动状态:systemctl status mariadb
  • 停止Mariadb:systemctl stop mariadb
  • 重启Mariadb:systemctl restart mariadb
  • 设置开机启动:systemctl enable mariadb
3.3 初始化mysql
在确认 MariaDB 数据库软件程序安装完毕并成功启动后请不要立即使用。为了确保数据 库的安全性和正常运转,需要先对数据库程序进行初始化操作。这个初始化操作涉及下面 5 个 步骤。
➢ 设置 root 管理员在数据库中的密码值(注意,该密码并非 root 管理员在系统中的密 码,这里的密码值默认应该为空,可直接按回车键)。
➢ 设置 root 管理员在数据库中的专有密码。
➢ 随后删除匿名账户,并使用 root 管理员从远程登录数据库,以确保数据库上运行的业
务的安全性。
➢ 删除默认的测试数据库,取消测试数据库的一系列访问权限。
➢ 刷新授权列表,让初始化的设定立即生效。

确保mariadb服务器启动后,执行命令初始化:mysql_secure_installation,执行后会问你这几个问题,需要y然后设置即可。

Set root password? [Y/n] 
Remove anonymous users? [Y/n] 
Disallow root login remotely? [Y/n]
Remove test database and access to it? [Y/n]
Reload privilege tables now? [Y/n]
3.4 mysql基本命令
  • 修改mysql密码:MariaDB [(none)]> set password=password('123456');
  • 创建其它数据库用户:MariaDB [(none)]> create user thanlon@'%' identified by '123456';
  • 查看那thanlon数据库用户的相关信息:
MariaDB [mysql]> use mysql
MariaDB [mysql]> select *from user where user='thanlon'\G;
MariaDB [mysql]> select host,user,password from user where user='thanlon'\G;

如果切换到thanlon用户是无法查看到完整的数据库列表。

3.5 权限的配置

mysql使用grant命令对账户进行授权:

grant 权限 on 数据库.表名 to 账户@主机名           #对特定数据库中的特定表授权
grant 权限 on 数据库.* to 账户@主机名             #对特定数据库中的所有表给与授权
grant 权限1,权限2,权限3 on *.* to 账户@主机名     #对所有库中的所有表给与多个授权
grant all privileges on *.* to 账户@主机名      #对所有库和所有表授权所有权限

给thanlon所有数据库所有表的权限:MariaDB [(none)]> grant all privileges on *.* to thanlon@'%';
给thanlon创建数据库数据表的权限:MariaDB [(none)]> grant create on *.* to thanlon@'%';
给thanlon删除数据库数据表的权限:MariaDB [(none)]> grant drop on *.* to thanlon@'%';
查看授权给某个用户的权限:MariaDB [(none)]> show grants for thanlon@'%';
移除权限:MariaDB [(none)]> revoke all privileges on *.* from thanlon@'%';

3.5 编码的配置

查看数据库中编码:\s

Server characterset:	latin1
Db     characterset:	latin1
Client characterset:	utf8
Conn.  characterset:	utf8

需要都配置成utf8的编码,才能显示中文。所以需要修改配置文件,编辑配置文件vim /etc/my.cnf,在mysqld下输入:

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
log-error=/var/log/mysqld.log
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

此时输入\s,查看编码:

Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
3.6 远程登录的配置

授权配置:远程连接设置所有库和所有表的所有权限,赋值权限给所有ip地址的thanlon用户

# 授权
grant all privileges on *.* to root@'%' identified by '123456';
# 刷新权限,防止授权没有生效
flush privileges;
# 查看权限
show grants for root@'%';
# 移除权限
revoke all privileges on *.* from root@'%';

远程登录:

thanlon@plus-book:~$ mysql -uroot -p -h10.0.0.2
thanlon@plus-book:~$ mysql -uroot -p -h10.0.0.3

如果遇到问题,查看是不是防火墙的问题,可以关闭防火墙:

1、查看防火墙的状态
[root@instance-mtfsf05r ~]# getenforce
2、清空防火墙规则																
[root@instance-mtfsf05r ~]# iptables -F
3、关闭防火墙
[root@instance-mtfsf05r ~]# systemctl stop firewalld
4、移除开机自启
[root@instance-mtfsf05r ~]# systemctl disable firewalld
3.7 数据的备份与恢复

mysqldump命令用于备份数据库的数据,备份的命令是:

[root@instance-mtfsf05r ~]# mysqldump -uroot -p --all-databases > all.dump

删除一个数据库,如何恢复,可以通过备份文件进行恢复:

1、登录数据库后使用source
[root@instance-mtfsf05r ~]# source all.dump
2、登录数据库的时候,使用<是重定向写入符号写入数据库
[root@instance-mtfsf05r ~]# mysql -uroot -p < all.dump
3.8 主从复制

mysql数据库的主从复制方案,是其自带的功能。并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上。mysql数据库支持单向、双向、链式级联,等不同业务场景的复制。在复制的过程中,一台服务器充当主服务器(master),接收来自用户的内容更新。而一个或多个其他的服务器充当从服务器(slave),接收来自master上binlog文件的日志内容,解析出sql,重新更新到自己的服务器上,使得主从服务器数据达到一致。

① 主从复制的架构

  • 一主一从,单向主从同步模式,只能在Master端写入数据
  • 一主多从
  • 双主复制架构,此架构可以在master或master进行数据写入,或者两端同事写入(特殊设置):

注意:在生产环境中,mysql主从复制都是异步的复制方式,即不是严格的实时复制,但是给用户的体验都是实时的。mysql主从复制集群功能使得mysql数据库支持大规模高并发读写成为可能,且有效的保护了服务器宕机的数据备份。

② 主从复制的应用场景
利用复制功能当Master服务器出现问题时,我们可以人工的切换到从服务器继续提供服务,此时服务器的数据和宕机时的数据几乎完全一致。复制功能也可用作数据备份,但是如果人为的执行drop,delete等语句删除,那么从库的备份功能也就失效。

③ 主从复制的实现原理

1、master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events); 
2、slave将master的binary log events拷贝到它的中继日志(relay log)3、slave重做中继日志中的事件,将改变反映它自己的数据。
3.9 主从复制的实现

实现主从配置的环境是需要两台服务器,一台服务器安装主数据库,一台安装从数据库。如果你有两台云服务器,这将节省下很多安装系统的时间。如果你没有云服务器,也是没有关系的。我们可以VMware软件虚拟化两台服务器,注意这两台服务器要在使用NAT方式连接网络,并且要配置静态ip,还要在同一个局域网中。具体配置可以到网上搜索,配置实在是有问题可以在评论区留言。我这里虚拟化两台服务器,ip地址分别是10.0.0.210.0.0.3,前者安装主库,后者安装从库。主从复制有好三种架构,我们这里使用其中的一种:一主一从。

① 主库的配置

  • 修改配置文件
[root@master ~]# vim /etc/my.cnf
在配置文件的[mysqld]下追加下面的内容(server-id服务的唯一标识,主从之间都必须不同;log-bin启动二进制日志名称为mysql-bin):
[mysqld]
server-id=1
log-bin=mysql-bin
  • 重启mysql数据库
[root@master ~]# systemctl restart mariadb
重启后,mysql主库已经开启同步功能,创建了mysql-bin日志文件
可以通过下面的命令查看生成的二进制文件:
[root@master ~]# ls /var/lib/mysql
  • 创建用于主从同步的账号并赋予权限
# 创建用于主从同步的账号
MariaDB [(none)]> create user 'slave'@'%' identified by '123456';
# 为这个账户赋予slave权限
MariaDB [(none)]> grant replication slave on *.* to slave@'%';
# 刷新权限列表,防止没有生效
MariaDB [(none)]> flush privileges;
# 检查一下主库创建的账号信息
MariaDB [(none)]> select user,host from mysql.user;
# 查看这个账户的权限
MariaDB [(none)]> show grants for slave@'%';
  • 主库的锁表,防止数据写入
MariaDB [(none)]> flush table with read lock;
  • 检查主库的日志状态,查看日志位置(锁表是防止日志位置发生变化)
MariaDB [(none)]> show master status
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      632 |              |                  |
+------------------+----------+--------------+------------------+
  • 数据备份,导出主库的已经存在数据,然后用于从库写入
# 将主库数据全部导出到/tmp/my_all.dump文件中
[root@master ~]# mysqldump -uroot -p  --all-databases > /tmp/my_all.dump
# 上传到从库所在服务器的/tmp/目录下
[root@master ~]# scp /tmp/my_all.dump root@10.0.0.3:/tmp

② 从库的配置

  • 在从库上导入主库的最新数据,保证数据的一致性
1、登录从库
3、删除从库所有的数据库
2、导入数据
MariaDB [(none)]> source /tmp/my_all.dump
  • 修改从库数据库配置文件,添加用于同步的配置,和主库区别开
[root@slave ~]# vi /etc/my.cnf
# 在[mysqld]下追加下面的内容,server-id不一定是2,只要和主库配置的不同即可
[mysqld]
character-set-server=utf8
server-id=2
  • 重启数据库
[root@slave ~]# systemctl restart mariadb
  • 登录数据库检查从库的各项参数
MariaDB [(none)]> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
1 row in set (0.001 sec)

MariaDB [(none)]> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
  • 将从库同步于主库
#主库所在的主机 master_host
#用于主从同步的账号 master_user和密码master_password
#主库配置的日志文件 master_log_file
#和主库日志文件的起始位置 master_log_pos
#(可在主库中执行 show master status;查看master_log_file和master_log_pos)
MariaDB [(none)]> change master to master_host='10.0.0.2',master_user='slave', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=632;
  • 开启主从复制
MariaDB [(none)]> start slave;
  • 检查复制的状态
MariaDB [(none)]> show slave status\G;
# 检查从库同步参数,这两条参数都为YES说明配置成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

③ 测试主从同步

  • 主库中的操作
# 主库解锁
MariaDB [(none)]> unlock tables;
# 查看主库当前数据库
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
# 主库中创建test数据库
MariaDB [(none)]> create database test;
Query OK, 1 row affected (0.001 sec)
# 查看创建的数据库
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.001 sec)
  • 从库中的操作
# 登录从数据库后,查看当前数据库,发现从苦衷出现 test 数据库
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.001 sec)
4. redis相关
4.1 redis的安装

安装redis:

[root@instance-mtfsf05r ~]# wget http://download.redis.io/releases/redis-5.0.5.tar.gz
[root@instance-mtfsf05r ~]# tar zxf redis-5.0.5.tar.gz
[root@instance-mtfsf05r ~]# cd redis-5.0.5/
[root@instance-mtfsf05r redis-5.0.5]# make
[root@instance-mtfsf05r redis-5.0.5]# make test

启动服务端:

[root@instance-mtfsf05r redis-5.0.5]# src/redis-server

启动客户端:

[root@instance-mtfsf05r redis-5.0.5]# src/redis-cli
4.2 连接redis数据库

第一种方式使用的是普通的连接:

# -*- coding: utf-8 -*-
import redis

conn = redis.Redis(host='106.12.115.133', port=6379)
conn.set('name', 'kiku')
print(conn.get('name'))

第二种方式使用的是连接池连接(与线程池是一样的,可以防止重复的连接节省开销,建议使用这种方式):

# -*- coding: utf-8 -*-
import redis

pool = redis.ConnectionPool(host='106.12.115.133', port=6379, max_connections=1000)  # max_connections最大连接数
conn = redis.Redis(connection_pool=pool)
conn.set('name', 'thanlon')
4.2 redis操作

① String操作
redis中的String在内存中按照一个name对应一个value来存储

  • set(name, value, ex=None, px=None, nx=False, xx=False):在redis中设置值,默认不存在则创建存在则修改
ex:过期时间()
px:过期时间(毫秒)
nx:如果设置为True,只有name不存在时,当前set操作才执行(添加)
xx:如果设置为True,只有name存在时,当前set才执行操作(修改)

  • setnx(name,value):设置值,只有name不存在时,执行设置操作
  • setex(name,value,time):设置值,time是过期时间(数字秒或timedelta对象)
  • psetex(name,time_ms,value):设置值,time_ms是过期时间(数字秒或timedelta对象)
  • mset(*args,**keargs):批量设置值,如:
mset('k1'='v1','k2'='v2 ') # 或者mget({"k1':'v1','k2':'v2'})
  • get(name):获取值
  • mget(keys,*args):批量获取值,如:
mget('thanlon','kiku') # 或mget(['thanlon','kiku'])
  • getset(name,value):设置新值并获取原来的值
  • getrange(key,start,end):获取子序列(根据字节获取,非字符),start表示起始位置(字节);end表示结束位置(字节)。python2中代表的是字符。
  • setrange(name,offset,value):修改字符串内容,从指定字符串索引开始后替换(新值太长时,则向后添加)。offset表示字符串索引,字节(一个汉字三个字节);value是要设置的值。
  • setbit(name,offset,value):对name对应的值的二进制表示的位进行操作,修改二进制位。name是redis中的name,offseet是位的索引(将值变换成二进制后再进行索引),value的值只能是1或0。
  • getbit(name,offset):获取name对应的值的二进制表示中的某位的值,可用来判断获取的是0还是1
  • bitcount(key,start=None,end=None):









4.3 redis发布和订阅
4.4 redis基本使用
4.5 redis主从
4.6 redis多实例配置

①②③④⑤⑥⑦⑧⑨⑩

参考文章:https://www.cnblogs.com/pyyu/articles/9355477.html


转载:https://blog.csdn.net/Thanlon/article/details/100941385
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场