1. 总结pg和mysql的优劣势。
mysql | postgreSQL | |
1 | innodb被甲骨文公司控制 | 完全开源,无大公司垄断 |
2 | 复杂查询处理较弱,如多索引查询下,使用查询优化器后的比表扫描还要慢 | 查询优化器强 |
3 | 主键不能太长,且最好顺序递增,否则影响性能 | 不存在此问题 |
4 | 表增加列,基本是重建表和索引,时间较长 | 新加列只是在数据字典里增加定义,不会重建表 |
5 | 时间类型到不了秒以下 | 可以精确到秒以下 |
6 | 集群做的较差 | 有丰富1的cluster软件 |
7 | 如create table不支持事务,不能回滚 | DDL也支持事务 |
8 | mysql多线程 | pg多进程,在现场多核的机器上,更能发挥性能 |
9 | 不支持操作系统认证,PAM认证等外部验证 | 支持 |
2. 总结pg二进制安装和编译安装。
二进制安装:
yum install postgresql-server
需要初始化才能起来
postgresql-setup --initdb
编译安装:
先下载依赖
yum install gcc make readline-devel zlib-devel
解压下好的源码包
cd进去,
./configure --prefix=/apps/pg
make
make install
创建postgre用户
useradd -s /bin/bash -m -d /home/postgres postgres
echo -e '123456\n123456'|passwd postgres
/pgsql/data目录需要在root下创建并chown成postgres
设置环境变量并source
[root@localhost pg]# cat /etc/profile.d/pgsql.sh
export PGHOME=/apps/pg
export PATH=$PGHOME/bin/:$PATH
export PGDATA=/pgsql/data
export PGUSER=postgres
[root@localhost pg]#
数据库初始化:
initdb (设置了环境变量,不用写绝对路径,默认路径是)
pg_ctl -D /pgsql/data/ -l logfile start
启动多实例时记得修改端口
然后psql进去看看
3. 总结pg服务管理相关命令 pg_ctl 和pgsql命令选项及示例和不同系统的初始化操作
初始化数据库,也可以新建数据库:(默认是环境变量里设置的,可以-D 指定某个实例的路径)
新建时需要修改目录下的postgresql.conf中的监听地址和端口,不然通过pg_ctl启动多个实例会冲突
pg_ctl -D /pgsql/data2 -l logfile start
pg_ctl start /pgsql/data2
pg_ctl restart /pgsql/data2
pg_ctl stop /pgsql/data2
pg_ctl status /pgsql/data2
4. 总结pg数据库结构组织
1.实例,一个pgsql实例就是一个对应的数据库目录,如/pgsql/data2
2.数据库:一个pgsql服务可以管理多个数据库,当连接到一个数据库时。一般只能访问这个数据库里面的数据
3.模式:schema,一个数据库可以创建多个名称空间,分割不同的业务数据。
4.表和索引:pgsql中术语是relation,其他叫table
5.行和列:pgsql中行的术语叫Tuple,其他数据库叫row
5. 实现pg远程连接。输入密码和无密码登陆
pgsql有一个文件pg_hba.conf来管理那些主机可以访问数据库
在最下面添加
还需要修改密码:
alter user postgres with password '123456';
可以看到做过修改的实例远程可以连接,默认状态的实例连不上
6. 总结库,模式,表的添加和删除操作。表数据的CURD。同时总结相关信息查看语句。
可以\h 跟上相关命令查询用法
库操作:
创建数据库:create database ceshi;
删除库:drop database ceshi;
列出数据库: \l
模式:
创建:create schema scname;
drop schema scname;
列出:\dn
表:
列出表:\dt (\d t1相当于desc)
C:
与MySQL类似create table tb2(id serial primary key ,name varchar(10));
注意pgsql中,使用serial类型自带auto_increment
insert into tb2 (name) values('abb');
R:
select * from tb2;
U:
update tb2 set name='ccc' where id=1;
D:
drop table tb2;
7. 总结pg的用户和角色管理。
\du查看用户
查看当前用户:select user;
pgsql中,一个角色可以等同于一个用户
create user 默认可以登录
create role 默认不可以登录
除是否默认login外,两个无区别
例:
创建可以登录的用户与密码:
create user abb with password '123456';
with 后面还能带上权限:login(可以登录)superuser(管理员)replication(复制)
修改密码:
alter user abb with password '1234567';
删除用户:
drop user abb;
8. 添加mage用户,magedu模式,准备zabbix库,配置mage用户的默认模式magedu,要求mage用户给zabbix库有所有权限。
添加用户:
create user mage with password '123456';
添加模式:
create schema magedu;
添加zabbix库:
create database zabbix;
指定模式:
alter schema magedu owner to mage;
grant all on all tables in schema magedu to mage;
\c zabbix(连接数据库)
9. 总结pgsql的进程结构,说明进程间如何协同工作的。
postmaster主进程:
是数据库实例的主控制进程,负责启动和关闭数据库。还会fork出其他的子进程并管理。
当用户与pgsql连接时,先与主进程进行连接进行身份验证,验证通过就fork一个会话进程来进行服务。
辅助子进程:
BgWriter:周期性的将内存中的脏数据进行落盘。
walWriter进程:
预写式日志进程,相当于mysql中的redo log。修改磁盘上数据库数据前,必须先将此操作记录到磁盘里然后才能修改
Checkpointer:检查点进程,保证检查点之前的日志信息和脏数据都存到磁盘里了。
AutoVacuum:自动清理进程,进行删除时,不会删除旧数据,只是打上删除的标识
当在PostgreSQL中执行DELETE时,行不会立即从数据文件中删除.而是仅通过在页头中设置xmax字段将其标记为已删除.同样对于UPDATE,它可能在PostgreSQL中被视为DELETE+INSERT.
这是PostgreSQL MVCC背后的基本思想之一,因为它允许更大并发,在不同的进程之间最小的锁定.这个MVCC实现的缺点是留下了已删除的元组,即使在所有可能看到这些版本的事务完成之后也是如此.
如果没有清理,那些"死元组"(对于任何事务实际上是不可见的)将永远留在数据文件中.对于DELETE和UPDATE比较多的的表,死元组可能占据很多磁盘空间.同时,死元组也将从索引中引用,进一步增加了浪费的磁盘空间量.这就是我们在PostgreSQL中称之为“膨胀”的东西,同时因为查询也会变慢。
Pgstat:统计数据收集进程,作为查询优化时的代价估算
Pgarch:归档进程
可以看作是bin-log的作用。开启后wal日志在自动覆盖前给他复制出来。
session:会话进程,负责用户连接
10. 总结pgsql的数据目录中结构,说明每个文件的作用,并可以配上一些示例说明文件的作用。
数据库目录在安装时指定的目录下。如、pgsql/data
初始化完成后有三个文件:
postgresql.conf:主配置文件,监听地址与端口都在此修改
pg_hba.conf:认证配置文件,那些主机允许访问数据库
pg_ident.conf:认证方式的用户映射文件
还有一些子目录:
base:表空间目录,每个表与索引都是一个单独的文件
对应关系
pg_wal目录:存放wal日志的
wal日志中的最后八位的前6位为0,最后两位是lsn的低32位的前两位。
11. 尝试将pgsql新版本的运行日志存储到数据库。
12. 图文并茂总结LSN和WAL日志相关概念
LSN:log sequence number,用于记录WAL文件当前的位置,在WAL日志中全局唯一
WAL日志写入是有顺序的,所以需要记录wal日志的写入顺序,LSN就是给每条wal日志记录编号。
WAL日志LSN编号:高32位/低32位
查询当前lsn可见,wal文件的最后两位就是LSN的低位的前两位(最前面的省略了,只有7位了)
13. 实现WAL日志多种类型的备份,及数据还原。
本地备份:
需要修改配置文件,开启归档备份
注:配置文件规范中,一般不省略默认的配置项,而是将默认的参数写出来如wal_level = replica,然后注释掉,变成#wal_level = replica,易于别人理解。
archive_mode = on
archive_command = 'cp %p /pgsql/backup/%f'
远程备份:
可以在archive_command 后面的命令使用scp来拷贝到其他主机(需要提前做ssh免密)
备份还原:
备份:
pg_dump -h 192.168.22.12 -U postgres -C hellodb > yyl.sql
还原:psql < yyl.sql
自定义格式的需要使用pg_restore
14. 实现WAL日志完成主从流复制,要求在从节点上进行crontab数据备份,同时手工让主节点宕机,让从节点切换为主节点,并添加新的从节点。
流复制可以看作一个没有边界的字符串流,如果是基于文件来同步的话,从库总是落后主库一个wal文件。流复制可以让从库保持最新的状态。
master节点:
创建复制的账号:
还需要在配置文件中listen address改为*
修改pg_hba文件,添加一行:
host replication repluser 0.0.0.0/0 md5
修改postgresql.conf文件:
然后重启,注意/archive需要先创建然后chown(/pgsql/backup也相同)
从节点:
先停止数据库,/pgsql/data,/pgsql/backup/ /pgsql/backup下内容清空
pg_ctl stop -D /pgsql/data
rm -rf /pgsql/data/*
rm -rf /archive/*
rm -rf /pgsql/backup/*
从主库备份数据过来
pg_basebackup -D /pgsql/backup/ -Ft -Pv -Urepluser -h 192.168.174.10 -p 5432 -R
解压:
tar xf /pgsql/backup/base.tar -C /pgsql/data/
tar xf /pgsql/backup/pg_wal.tar -C /archive/
修改postgre配置文件,添加:
primary_conninfo = 'host=192.168.174.10 port=5432 user=repluser password=123456'
restore_command = 'cp /archive/%f %p'
启动数据库:
查看状态:
主库:
从库:
验证:进入主库创建zabbix数据库,可见从库也自动更新,\l也可以看见zabbix被创建了
15. 总结日志记录的内容包含什么
历史事件:时间,地点,人物,事件
日志级别:事件的关键性程度,log level
16. 总结日志分类, 优先级别。图文并茂解释应用如何将日志发到rsyslog,并写到目标。
facility:设施,从功能或程序上对日志进行归类:
#内置分类
auth, authpriv, cron, daemon,ftp,kern, lpr, mail, news, security(auth), user(default), uucp, syslog
#自定义的分类
local0-local7
Priority 优先级别,从低到高排序:
debug,info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
应用如何将日志发到rsyslog,并写到目标:
启用网络日志服务,打开对外接收日志的端口,udp监听端口514,把应用上发生的所有info级别及以上的设施都发送到日志服务器上,514收到后就会写到/var/log/syslog文件中
17. 总结rsyslog配置文件格式
MODULES:相关模块配置,如UDP模块,TCP模块,开启后可以日志远程记录
GLOBAL DIRECTIVES:全局配置
RULES:日志记录相关的规则配置
18.完成功能,sshd应用将日志写到rsyslog的local6分类,过滤所有级别,写入到/var/log/ssh.log。
修改sshd_config(sshd是服务端,ssh是客户端)
修改rsyslog配置文件:
把前面的local6写入到/var/log/ssh.log里
重启sshd与rsyslog服务
tail查看/var/log/ssh.log是否有日志生成
18. 完成功能,将3个主机(要求主机名为ip)的ssh日志,通过rsyslog服务将ssh日志写入到集中的主机上的rsyslog服务,写入到/var/log/sshceshi.log文件
服务器:
在日志服务器上开启udp或者tcp这个模块(修改rsyslog配置文件,取消注释)
添加
local6.* /var/log/sshceshi.log
重启rsyslog服务,可以看到udp的514端口已经处于监听了
客户端:
修改sshd配置文件:先划到local6下
然后在rsyslog的配置文件添加
local6.* @192.168.174.6
重启服务
最终结果:
在日志服务器上可以看到客户端的ssh日志
19. 总结/var/log/目录下常用日志文件作用。
/var/log/secure:系统安全日志,文本格式,应周期性分析
/var/log/btmp:当前系统上,用户的失败尝试登录相关的日志信息,二进制格式,lastb命令进行 查看
/var/log/wtmp:当前系统上,用户正常登录系统的相关日志信息,二进制格式,last命令可以查看
/var/log/lastlog:每一个用户最近一次的登录信息,二进制格式,lastlog命令可以查看
/var/log/dmesg:CentOS7 之前版本系统引导过程中的日志信息,文本格式,开机后的硬件变化 将不再记录,也可以通过专用命令
dmesg查看,可持续记录硬件变化的情况
/var/log/boot.log:系统服务启动的相关信息,文本格式,Ubuntu无此文件
/var/log/messages:系统中大部分的信息
/var/log/anaconda:anaconda的日志
20. 总结journalctl命令的选项及示例
查看所有日志(默认保留此次启动的日志):
journalctl
内核日志:
journalctl -k
指定时间:
journalctl --since 09:00 --until "1 hour ago"
查看指定进程日志:
如:journalctl _PID=1
查看某一个UNIT
journalctl -u sshd
21. 完成将多个主机(要求主机名为ip)的nginx日志集中写入到mysql表中
客户端:
服务端:
22. 尝试使用logrotate服务切割nginx日志,每天切割一次,要求大于不超过3M, 保存90天的日志, 旧日志以时间为后缀,要求压缩。
23. 总结DAS, NAS, SAN区别,使用场景
24. 实现nfs共享/data/nfs目录,所有压缩为666用户。并配置其他虚拟机自动挂载。
centos8自带nfs软件
nfs,network file sysytem
服务端:
mkdir -p /data/nfs
exportfs -r
客户端:
临时挂载
mount 192.168.174.6:/data/nfs /data/nfs
永久挂载需要写道配置文件中/etc/fstab
25. 总结inotify原理,命令及使用
inotify是监控服务,监听同步数据服务器目录中的信息变化
前台记录
26. 总结rsync原理,命令及ssh命令和rsync协议使用。完成目录文件同步。
服务端:
配置密码:
conf文件:
客户端:
配置密码:
测试:
服务端:
客户端输入:
可以见到与服务端保持一致了,带上了--delete,多了删除,少了补上。
27. 总结sersync的配置,同时基于sersync替换inotify+rsync.
28. 配置LAMP要求 域名使用主从dns, dns解析到2个apache节点,apache和php在同一个节点,同时将wordpress的upload目录基于nfs挂载,同时基于rsync协议将网站同步到备份的nfs服务器, mariadb使用mycat读写分离并且要求后端为MHA集群。 架构规划图及解析一次请求和响应的流程和实践过程。同时将所有主机的apache, php, mariadb日志集中收集。
待完成
29. 总结 Redis多种安装方法和内核参数优化
yum安装:
yum install redis
编译安装
wget https://download.redis.io/releases/redis-6.2.6.tar.gz
mv redis-6.2.6.tar.gz /opt
cd /opt/
tar zxvf redis-6.2.6.tar.gz
cd redis-6.2.6/
mkdir /opt/redis
make -j 2 PREFIX=/opt/redis install
echo 'PATH=/opt/redis/bin:$PATH' > /etc/profile.d/redis.sh
. /etc/profile.d/redis.sh
mkdir /opt/redis/{etc,log,data,run}
cp redis.conf /opt/redis/etc/
redis-server /opt/redis/etc/redis.conf
ss -ntl
内核优化:
sysctl -p
30. 总结 Redis 常见指令和数据类型
常见指令:
1.info:查看当前运行状态:
2.select,切换数据库
3.keys,查看当前库所有key
4.bgsave,手动在后台执行RBD持久化操作
5.dbsize,返回当前key的数量
6.flushdb,flushall。清空所有key,一个是清空当前库,一个是清空所有
7.set/get ,设置key value与查看。 mset/mget,批量
7.strlen,返回字符串key的value长度
8.ttl,查看key的过期时间,-1表示永不过期
9.incr,decr,数字递增递减
10.incrby ,decrby,数字增加,减少
列表:
可以看作字符串数组
lpush ,从左边插入到list里,如1 2 3,从左插入就是 1 > 2 1 > 3 2 1
rpush,从右边插入到list里。lpush与rpush也可以追加数据
llen,获取列表长度
lset,可以修改列表中指定索引的值
lpop,rpop,删除最左/右边的一个元素
集合:
特点:无序。无重复
sadd,创建集合,可以追加,追加只能加集合里面没有的数据
smembers,获取集合中的所有数据,注意是无序的,不用在意顺序
srem,删除集合中的元素
sinter 集合1 集合2 取集合的交集
sunion,取集合的并集
sdiff s1 s2,取交集 ,属于s1不属于s2的元素
有序集合
在无序集合的基础上,元素还关联了一个score,用于排行榜的场景
特点:有序,无重复元素,每个元素都由score与value组成,score可以重复,value不能重复
zadd s1 1 v1 2 v2 3 v3,创建有序集合
zrange s1 0 -1,正序排序 ,zrevrange,逆序
zcard,查看元素个数
查找元素 zrange s1 1 3
zrank ,查询指定数据的排名
zscore 获取分数
删除数据,zrem
哈希hash
无序,k/v对
key -> 多个field与value
hset,创建hash
hset stadents name yyl age 40
hmset,设置多个
hget,查看,hmget,获取多个field的value
查看hash的所有field与value
hdel,删除field
del删除hash
数据类型:
1.字符串,string
2.列表list
3.集合set
4.有序集合
5.哈希
6.消息队列