「mongoDB」- 忘记密码(Docker)

内容简介
本文介绍如何重置mongoDB的密码,这个mongoDB还是在Docker中启动的。
问题概述
开发在测试环境启动了一个mongoDB服务,该mongoDB是以Docker容器启动的。现在,他忘记了admin帐号的密码,来找我重置。
系统信息

mongoDB
mongo:3.4.10

Container Entrypoint
docker-entrypoint.sh

Container Cmd
–smallfiles –rest –auth

Container NAME
mongodb-single

解决办法

#!/bin/sh

#1 停止原有容器
docker container stop mongodb-single

#2 启动新容器,将原由容器的卷挂载到新容器中。使用–noauth选项关闭认证
docker run -it –name mongo-repair –rm –volumes-from mongodb-single mongo:3.4.10 –smallfiles –rest –noauth

#3 进入新容器,并直接连接,直接重置密码
docker exec -it mongo-repair mongo –port 27017
> db.changeUserPassword(“admin”, “new-pwd”)

#4 停止新容器
docker container stop mongo-repair

#5 启动原有容器
docker container start mongodb-single

#6 验证是否成功
mongo -u admin -p ‘new-pwd’ 10.10.21.36:27017/admin <<<‘db.runCommand({connectionStatus: 1})’

参考文献
How to Name or Rename Docker Containers MongoDB Show Current User Docker: Mount directory from one container to another Modify The Default MongoDB Root Password MongoDB what are the default user and password?[……]

READ MORE

「MongoDB」- 常用操作

TODO 进行mongoDB日常维护
常用操作

# 连接mongodb数据库
mongo admin –host 10.10.50.226 –port 27017 -u root -p

# 创建管理员用户
> use admin
> db.createUser(
{
user: “useradmin”,
pwd: “thepianohasbeendrinking”,
roles: [ { role: “userAdminAnyDatabase”, db: “admin” } ]
}
)

# 创建普通用户
> use test
> db.createUser(
{
user: “myTester”,
pwd: “xyz123”,
roles: [ { role: “readWrite”, db: “test” } ]
}
)

# 修改密码
db.changeUserPassword(username, password)

# 修改用户角色
# 注:updateuser它是完全替换之前的值,如果要新增或添加roles而不是代替它
# 则使用方法: db.grantRolesToUser() 和 db.revokeRolesFromUser()
db.updateUser(“usertest”,{roles:[ {role:”read”,db:”testDB”} ]})

# 删除用户,建议使用dropUser删除用户
db.removeUser(‘demo’)
db.dropUser(‘demo’)

参考文献
MongoDB Tutorial MongoDB 基础命令行 MongoDB 创建用户 修改权限 修改密码 删除用户 MongoDB增加用户认证: 增加用户、删除用户、修改用户密码、读写权限、只读权限 db.createUser() mongo Shell Quick Reference Mongo Create a user as admin for any database raise an error MongoDB 3.0 用户创建 Create Superuser in mongo Reference > mongo Shell Methods > User Management Methods > db.changeUserPassword() How to Enable Authentication on MongoDB[……]

READ MORE

「MySQL」- 常用工具整理

本文将整理部分 MySQL 常用工具,并简述这些工具能够解决的问题。
Yearning
Mysql web端sql审核平台 http://yearning.io https://github.com/cookieY/Yearning
MySQL Utilities
包含系列用于管理 MySQL 数据库的脚本工具,使用Python编写。
Percona Toolkit
衍生自 Maatkit 和 Aspersa,用于 MySQL 和系统任务的高级命令行工具的集合,主要用于处理各种 MySQL 和系统任务相关的“手动执行难度大的问题“。
图形界面 的管理工具
MySQl Workbench
https://www.mysql.com/products/workbench/ https://dev.mysql.com/downloads/workbench
MySQL Workbench,官方发布,分为企业版和社区版,能够与 MySQL Utilities 集成,但是只能管理MySQL数据库。
比较难编译,主要卡在gdal库上。如果不愿意折腾:官网上有安装包,直接安装即可;某些发行版的源里也有;或者使用 snap 安装:

# https://snapcraft.io/install/mysql-workbench-community/debian
snap install mysql-workbench-community –candidate

phpMyAdmin
PHP语言开发的MySQL管理工具。
Adminer
也是一个PHP写的数据库管理工具。
Webyog && SQLyog
MySQL数据库的监控及管理工具。 访问主页: https://www.webyog.com/
MySQLDumper
基于PHP开发的MySQL数据库备份恢复程序。 访问主页: http://www.mysqldumper.de/
MySQL Administrator(已停止维护)
Homepage:https://downloads.mysql.com/archives/administrator/
MySQL Query Browser(以停止维护)
Homepage:https://downloads.mysql.com/archives/query/
命令类型 的管理工具
Maatkit and Aspersa
MySQL管理工具,类似用于Percona Toolkit。 PDF:https://www.percona.com/files/presentations/LOADA[……]

READ MORE

「MySQL Utilities」- 安装

在 MySQL Utilities 中,包含众多管理 MySQL 的脚本工具,比如数据库结构对比、用户账户克隆、索引检查等等。目的是将复杂操作封装到单个工具中,以简化操作。
使用开源工具最担心:登船之后,船长跑路。目前 MySQL Utilities 支持 Python 2 环境,还没有得到支持 Python 3 环境的消息。至少在 MySQL 8 以前可以放心使用。
相关连接
项目仓库:https://github.com/mysql/mysql-utilities 下载地址:https://downloads.mysql.com/archives/utilities
Appendix F MySQL Utilities
开始安装
第一步、下载
我们安装 1.6.5 版本,可以直接从官网下载页中获取:

#!/bin/sh

# https://dev.mysql.com/downloads/utilities/
wget https://downloads.mysql.com/archives/get/p/30/file/mysql-utilities-1.6.5.tar.gz

第二步、安装
当下载完成后,执行以下命令安装该工具:

#!/bin/sh

tar -xf mysql-utilities-1.6.5.tar.gz
cd mysql-utilities-1.6.5

python ./setup.py install –record instfile.log # 安装命令工具

1)使用选项 –record instfile.log 记录安装到系统的文件,在卸载时使用(手动删除)。 2)执行 python setup.py help 查看其他选项及帮助信息。 3)所有命令会默认安装在 /usr/local/ 中。
安装到系统的命令
在 MySQL Utilities 中,工具可以分为以下类别:

二进制日志相关的工具
数据库对象相关的工具;
通用工具;
高可用相关的工具;
服务相关的工具;
专业操作工具;

下面将按照分类介绍这些工具的作用。
二进制日志操作(Binary Log Operations)
下面的这几个工具使用于二进制日志文件操作的
mysqlbinlogmove 重新定位二进制日志文件; 根据其序列号或修改日期移动文件;
mysqlbinlogpurge 二进制日志清除工具;
mysqlbinlogrotate 轮转二进制日志;
数据库对象的操作(Database Operations)
下面[……]

READ MORE

「MySQL」 – 使用「登录路径(login-paths)」存储帐号信息

在~/.mylogin.cnf中存储了访问服务器的连接及身份凭据信息。此文件不仅加密存储,而且MySQL Utilities访问服务器的任何连接信息都不会出现在日志中,因此日志中不会显示用户名,密码,端口等。这些都是出于安全考虑,不因该在日志中出现敏感信息。
MySQL Utilities支持在连接中使用“登录路径”,格式:login-path-name [:port] [:socket],其中port和socket是可选的,如果使用了,则会覆盖指定的“登录路径”文件中的相对应的选项。
当使用“登录路径”时,在指定套接字时,除了POSIX系统之外,没有默认值。在这种情况下,host选项在端口3306上默认为localhost。这表示将“登录路径”中指定的值至少要指定一个用户,一个主机名和一个端口,或者socket。
配置与查看.mylogin.cnf文件
使用mysql_config_editor命令添加连接信息,示例如下:

#!/bin/bash

mysql_config_editor set –login-path=instance_13001 –host=localhost –user=root –port=13001 –password

使用以下命令确认登录路径数据已正确添加到.mylogin.cnf(这是个加密文件无法直接查看)中:

#!/bin/bash

mysql_config_editor print –login-path=instance_13001

# 该命令会输入如下内容:
# [instance_13001]
# user = root
# password = *****
# host = localhost
# port = 13001

一旦配置了.mylogin.cnf文件,连接时只需要指定”服务器实例”。例如,在前面的例子中的’instance_13001’,因此我们可以使用–server=instance_13001。如下示例:

#!/bin/sh

mysqlserverinfo –server=instance_13001 –format=vertical

# 输出类似如下内容:
#
# # Source on localhost: … connected.
# ******************* 1. row *******************
# server: localhost:13001
# config_file: /etc/my.cnf, /etc/mysql/my.cnf
# binary_log: clone-bin.000001
# binary_log_po[……]

READ MORE

「mysqldiff」-

mysqldiff,用于识别数据库对象之间的差异。它读取对象的定义,并使用类似diff的方法进行比较,以确定它们是否相同。该程序可以显示不同的对象的差异。
命令的语法及相关选项
mysqldiff [options] {db1[:db1] | {db1.obj1[:db2.obj2]} …

使用”db1:db2“的形式指出要比较的数据库;或者只用db1来表示比较两个同名数据库(就是说db1:db1可以简写成db1)。

可以通过仅指定–server1选项在单个服务器上针对两个不同名称的数据库执行比较。用户也可以通过指定–server2选项来连接到其他服务器,在这种情况下,db1表示server1名为db1的数据库和db2表示server2上名为db2的数据库。请看如下命令:

# mysqldiff –force –difftype=sql –server1=root@host1 –server2=root@host2 –difftype=sql db1.table1:dbx.table3

db1存在于由–server1指定的服务器上,dbx存在于由–server2指定的服务器上。

要比较一对特定的对象,使用db.obj格式将「对象名」添加到「数据库名」后面,例如:db1.obj1:db2.obj2比较两个对象;或者使用db1.obj1来比较同名数据库中同名称对象。 不允许将数据库名称与对象名称混合使用,例如:db1.obj1:db2和db1:db2.obj2是不允许的。
如果「库名」或者「对象名」有保留字或者特殊字符,需要使用反引号(`)引用,同时由于反引号在shell中有特殊的含义,所以整个部分还需要使用单引号(linux下),如下:

‘`weird“db.name`.`weird“table1`:`other:weird“db.name`.`weird“table2`’

命令支持的选项及含义
–changes-for=<direction> 用于指定比较的”方向“,默认值是server1。具体含义如下:

· –changes-for=server1: server1为”目标对象“,即server1是要被修改的。此时server2为”源对象“、“参照表”。
· –changes-for=server2: server2为”目标对象“,即server2是要被修改的。此时server1为”源对象“、“参照表”。

–character-set=<charset> 设[……]

READ MORE

「Percona Toolkit」- 安装及介绍

解决方案
Version 3.0.2
Percona Toolkit 集合了一系列的命令,这些命令用于 MySQL 和系统任务,主要用于处理“手动执行难度大”的各种 MySQL 和系统任务相关问题;
这里面的一些工具都是专业的开发、经过正式测试的、文档完整的工具;
Percona Toolkit 衍生自 Maatkit 和 Aspersa;
提供了如下功能

验证主副本数据的一致性;
有效地存档行;
查找重复的索引;
总结 MySQL 服务器;
从日志和 tcpdump 分析查询;
在发生问题时收集重要的系统信息;

安装笔记
Percona Toolkit 3.2.0 on CentOS 7.4
Configuring Percona Repositories with percona-release Installing Percona Toolkit

# 添加仓库
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

# 执行安装
yum install percona-toolkit-3.2.0

通过编译安装
下载的话可以去官网下载Percona Toolkit
可以查看官方的安装教程。
源码目录中的INSTALL文件也包含了安装方法,以下内容摘自INSTALL文件,更多内容参阅源码目录下的INSTALL文件:
系统环境要求及相关依赖 Most tools require:
* Perl v5.8 or newer * Bash v3 or newer * Core Perl modules like Time::HiRes
Tools that connect to MySQL require:
* Perl modules DBI and DBD::mysql * MySQL 5.0 or newer
构建及安装

tar zxvf percona‐toolkit‐<version>.tar.gz
cd percona‐toolkit‐<version>

# perl Makefile.PL PREFIX=${HOME},PREFIX指定安装路径,默认为/usr/local
perl Makefile.PL
make

# 测试
make test

make install

在使用工具前,需要阅读的文档
如何指定 DSN 参数:DSN (DATA SOURCE NAME) SPECIFICATIO[……]

READ MORE

「pt-table-sync」

pt-table-sync,有效地同步MySQL表数据 在大量的使用案例证明,该工具已经成熟了(作者是这么承诺的),而且经过了良好的测试。但使用不当依旧会有问题。
相关文章:
博客: http://www.drdobbs.com/ PostgreSQL表内容对照工具: https://www.cri.ensmp.fr/people/coelho/pg_comparator/ 远程MySQL表对照: http://www.perlmonks.org/?node_id=381053 远程MySQL表对照技术解释: http://cri.ensmp.fr/classement/doc/A-375.pdf MySQL数据比较算法: http://tinyurl.com/mysql-data-diff-algorithm webyog中的SQLyog Job Agent(SJA,表同步工具): https://www.webyog.com/ SJA和pt-table-sync的比较: http://tinyurl.com/maatkit-vs-sqlyog
使用前要注意的问题及风险。由于pt-table-sync会修改数据,所以使用的使用要小心。注意以下几点:

完整阅读了工具手册,你要清楚自己在干嘛。
熟知工具的BUGS,手册里都有BUG的描述。
一定要在非生产环境进行了测试。
备份生产数据,并且验证备份数据。
一定要先运行”–dry-run” 和 “–print”来测试同步。

命令语法
pt-table-sync [OPTIONS] DSN [DSN]

This tool changes data, so for maximum safety, you should back up your data before using it. When
synchronizing a server that is a replication slave with the “–replicate” or “–sync-to-master”
methods, it always makes the changes on the replication master, never the replication slave directly.
This is in general the only safe way to bring a replica back in sync with its master; changes to the
replica are usually the source of the proble[……]

READ MORE

「MySQL」- 使用 XtraBackup 备份

Xtrabackup
开源、免费的 MySQL 热备工具,可以对 InnoDB、XtraDB、MyISAM 数据库进行非阻塞备份。
问题解决方案
它可以执行流式、压缩、增量的MySQL数据库备份。
功能及其特性
一、备份快速且可靠; 二、备份不会中断事务处理; 三、节省带宽与磁盘空间; 四、自动备份验证; 五、由快速恢复所带来的高可用时间;
实际应用场景
进行 MySQL 数据库热备。
相关链接
How Percona XtraBackup Works
安装及说明
Percona XtraBackup User Manual
版本选择
虽然我们没有找到正式的说明,但是通过 About Percona XtraBackup 左侧的 Percona XtraBackup Series 菜单可以看出来版本号存在跳跃,所以我们猜测官方可能想与 MySQL 的主版本保持同步。
根据官方「About Percona XtraBackup」页面说明:

With the introduction of Percona XtraBackup 8.0, Percona XtraBackup 2.4 will continue to support MySQL and Percona Server 5.6 and 5.7 databases. Due to the new MySQL redo log and data dictionary formats the Percona XtraBackup 8.0.x versions will only be compatible with MySQL 8.0.x and the upcoming Percona Server for MySQL 8.0.x

由于我们使用 MySQL 5.7 数据库,所以我们选择 Percona XtraBackup 2.4 版本。
CentOS release 6.5 (Final) and Percona XtraBackup 2.4
# 03/12/2020 # Installing Percona XtraBackup on Red Hat Enterprise Linux and CentOS

#!/bin/sh

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

yum install -y percona-xtrabackup-24

Debian GNU/Linux 8.2 (jessie) and Percona Xtra[……]

READ MORE

「PostgreSQL」- 概念术语

单词 PostgreSQL 发音
https://www.postgresql.org/files/postgresql.mp3
Database Cluster
即我们常说的数据库目录,并非指数据库实例的集群。[……]

READ MORE

「PostgreSQL」- 选择文件系统

关于次级文件系统
这里的次级文件系统是指:在目录中挂载额外的数据盘,以用于 PostgreSQL 的数据存储。
官方不建议直接使用次级文件系统的根目录作为数据目录,而应该在次级文件系统中创建子目录,来进行 PostgreSQL 数据存储。
关于文件系统性能
经验表明,在所有其他条件相同的情况下,不应仅仅 通过切换文件系统 或 进行较小的文件系统配置更改 来期望重大的性能或行为变化。
关于 NFS 存储
这是我们比较关心的问题,鉴于无法提供块存储,网络存储则多以 NFS 为主。
PostgreSQL 并未使用 NFS 某些高级特性,诸如 File Locking 等等。
但是 PostgreSQL 要求 NFS 开启部分挂载选项:
hard vs. soft
1)建议开启 NFS hard 挂载选项,以在出现网络问题时,进程能够“挂起”; 2)如果通过 soft 挂载,那么当网络故障时,系统调用将被中断,并且 PostgreSQL 不会进行重试,而是返回 IO 错误。
sync vs. async
1)建议开启 NFS sync 挂载选项,以保证数据实际写入磁盘; 2)鉴于 PostgreSQL 会调用 fsync 刷新写缓存,虽然 NFS async 选项足够,但是 fsync 并不能保证数据写入持久存储;
关于 iSCSI 存储
如果使用块存储,例如 iSCSI 等等,就无需考虑 NFS 复杂问题,当然可能需要考虑其他问题。
参考文献
PostgreSQL: Documentation: 14: 19.2. Creating a Database Cluster[……]

READ MORE

「PostgreSQL」- 安装部署(Ubuntu,CentOS)

on Ubuntu 20.04 LTS
https://www.postgresql.org/download/linux/ubuntu/

# Create the file repository configuration:
sudo sh -c ‘echo “deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main” > /etc/apt/sources.list.d/pgdg.list’

# Import the repository signing key:
wget –quiet -O – https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add –

# Update the package lists:
sudo apt-get update

# Install the latest version of PostgreSQL.
# If you want a specific version, use ‘postgresql-12’ or similar instead of ‘postgresql’:
sudo apt-get -y install postgresql
sudo apt-get -y install postgresql-14 # 安装 PostgreSQL 14 版本

PostgreSQL 10 On CentOS 7.x

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql10-server

/usr/pgsql-10/bin/postgresql-10-setup initdb

systemctl enable postgresql-10
systemctl start postgresql-10

PostgreSQL 9.2.24 on CentOS 7.5

# 安装
yum install postgresql-server

# 初始化
postgresql-setup initdb

# 启动服务
systemctl start postgresql

参考文献
Linux downloads (Red Hat family)[……]

READ MORE

「Kubernetes」- 部署 PostgreSQL 数据库

问题描述
该笔记将记录:在 Kubernetes Cluser 中,如何部署 PostgreSQL 数据库,以及相关问题的解决办法;
解决方案

# helm repo add bitnami https://charts.bitnami.com/bitnami
# helm repo update

# helm pull bitnami/postgresql # CHART 11.6.18, APP 14.4.0
# helm show values ./postgresql-11.6.18.tgz > postgresql-11.6.18.helm-values.yaml
…(1)修改存储类:global.storageClass
…(2)修改 postgres 密码:global.postgresql.auth.postgresPassword
…(3)修改服务类型:primary.service.type(可选)

# helm –namespace infra-database \
install postgresql ./postgresql-11.6.18.tgz \
-f postgresql-11.6.18.helm-values.yaml \
–create-namespace

# helm –namespace infra-database \
upgrade postgresql ./postgresql-11.6.18.tgz \
-f postgresql-11.6.18.helm-values.yaml

// —————————————————————————- // 当执行成功后,产生如下输出:

PostgreSQL can be accessed via port 5432 on the following DNS names from within your cluster:

postgresql.infra-database.svc.cluster.[……]

READ MORE

「PostgreSQL」- 服务端配置(=> Chapter 20. Server Configuration)

配置参数(Setting Parameters)
Parameter Names and Values
参数名大小写不敏感;
五种参数类型: 1)boolean:on, off, true, false, yes, no, 1, 0,或明确的前缀 2)string:单双引号进行引用; 3)Numeric:数值类型,整数、浮点数,十六进制; 4)Numeric with Unit:带有单位的数值类型; 5)enumerated (enum):枚举类型;
Parameter Interaction via the Configuration File
配置文件示例:

# This is a comment
log_connections = yes
log_destination = ‘syslog’
search_path = ‘”$user”, public’
shared_buffers = 128MB

配置保存在配置文件中:postgresql.conf,通过手动配置;postgresql.auto.conf,通过 ALTER SYSTEM 配置; 其中的等号是可选的,通过空格来分隔即可; SIGHUP,pg_ctl reload,pg_reload_conf(),重新加载参数;部分参数需要重启;错误参数不会记录但不会被应用; View pg_file_settings,用于:配置文件变化的预先测试,或如果 SIGHUP 不好用时诊断错误;
Parameter Interaction via SQL
通过 SQL 修改配置: 1)ALTER SYSTEM,修改 postgresql.auto.conf 配置文件; 2)ALTER DATABASE,覆盖全局配置,应用于数据库层面; 3)ALTER ROLE,覆盖全局或数据库配置,应用与用户层面;
当客户端连接成功后,能供通过如下命令与会话及变量进行交互: 1)SHOW 2)SET
视图 pg_settings 也能够用来修改参数: 1)类似 SHOW ALL 但是能够过滤; 2)通过 UPDATE 进行修改:UPDATE pg_settings SET setting = …
Parameter Interaction via the Shell
通过命令行,指定服务运行参数:postgres -c log_connections=yes -c log_destination=’syslog’
通过命令行,指定客户端参数:env PGOPTIONS=”-c geqo=off -c statement_timeout=5min” psql
Managing Configuration Fil[……]

READ MORE

「PostgreSQL」- 客户端认证(=> Chapter 21. Client Authentication)

在 PostgreSQL 中,有很多的认证方式(ldap,md5,scram-sha-256……)。PostgreSQL 提供多种认证方式,能够基于 地址、数据库、用户 进行认证。
不同的认证方式,认证口令(密码)的存储位置也不相同。有些是存储在数据库中的,这些可以查看 pg_authid 表(select * from pg_authid)。参考「20.5. Password Authentication」一文。
数据库用户名与操作系统用户名是分离的,但是如果数据库用户具有在操作系统中的对应用户名,那分配 匹配操作系统用户名的 数据库用户名是有意义的。
配置文件(The pg_hba.conf File)
注意事项:该部分描述的认证并非我们理解的数据库认证,而是更底层的认证,其更倾向于控制用户参与认证的方法,而非具体的帐号密码等等。
客户端认证由 pg_hba.conf 文件控制,HBA(host-based authentication),默认的 pg_hba.conf 在 initdb 时创建,但是可以使用 hba_file 指令指定该文件位置;
该文件通常位于/var/lib/pgsql/data/pg_hba.conf,或者可以使用 locate(1)命令进行定位。
当配置文件发生变更后,需要 reload 进行加载。 视图 pg_hba_file_rules 用于协助排查配置文件错误。
在配置文件中,是系列记录:空格分割字段,反斜线换行,井号注释,引号处理空格字符。
记录格式:a connection type, a client IP address range (if relevant for the connection type), a database name, a user name, the authentication method
首个匹配 connection type, client address, requested database, user name 的记录,将用于认证。
配置文件格式:

local database user auth-method [auth-options]
host database user address auth-method [auth-options]
hostssl database user address auth-method [auth-options]
hostnossl database user address auth-method [auth-options]
ho[……]

READ MORE

「PostgreSQL」- 数据库角色(=> Chapter 22. Database Roles)

用户角色(Database Roles)
DB Role 类似我们理解的角色(用户),其是权限的代表。在 DB Cluster 中,DB Role 是全局的(而不是每个单独的数据库)。

CREATE ROLE name; # createuser name
DROP ROLE name; # dropuser name

# 查看所有 ROLE
SELECT rolname FROM pg_roles;
psql> \du

当数据库初始化时,initdb,将创建默认 postgres 角色。如果需要创建其他角色,则需要先登录该角色。
角色权限(Role Attributes)
用户登录:CREATE ROLE name LOGIN # 若无 LOGIN,则无法登录; 超级用户:CREATE ROLE name SUPERUSER 建数据库:CREATE ROLE name CREATEDB 角色创建:CREATE ROLE name CREATEROLE 允许复制:CREATE ROLE name REPLICATION LOGIN # 复制,还要允许其登录; 配置密码:CREATE ROLE name PASSWORD ‘string’
ALTER ROLE:修改已创建角色的配置;
基于 ROLE 的参数配置:

ALTER ROLE myname SET enable_indexscan TO off;
ALTER ROLE rolename RESET varname # 修改原有配置;

角色群组(Role Membership)
Role 既是 User 也是 Group;

CREATE ROLE name; # 创建角色组,其与创建角色相同

GRANT group_role TO role1, … ;
REVOKE group_role FROM role1, … ;

授予 Role 之后,具有两种使用方法: 1)SET ROLE:使当前 Role 临时成为被授予的角色,此时创建的数据库对象将属于被授予的角色; 2)INHERIT:通过该关键字,当前用户[……]

READ MORE

「PostgreSQL」- 运行服务(=> Chapter 19. Server Setup and Operation)

第一步、数据目录初始化
我们通过 APT 安装 PostgreSQL 数据库,所以数据初始化是自动完成。
如果通过源码安装,需要通过 initdb 方式进行初始化,参考文档以获取更多内容。
第二步、启动数据库服务
我们通过 APT 安装 PostgreSQL 数据库,所以服务的启动已经自动完成。
如果需要手动执行命令:

systemctl start postgresql

如果通过源码或其他方式安装,需要进行 PostgreSQL 服务的启动,参考文档以获取更多内容。
配置允许远程连接
我们通过 APT 安装,所以部分配置方法与主机管理相关,但其本质还是共通的。

# vim /etc/postgresql/14/main/conf.d/conn-and-auth.conf

listen_addresses = ‘*’

# nc -v -z 192.168.10.78 5432
Connection to 192.168.10.78 5432 port [tcp/postgresql] succeeded!

# vim pg_hba.conf
host all all 0.0.0.0/0 md5
host all all ::/0 md5

# systemctl restart postgresql.service

第三步、连接数据库服务
Connecting to PostgreSQL on Linux for the first time Getting error: Peer authentication failed for user “postgres”, when trying to get pgsql working with rails
我们具有 MySQL 的使用经验,但是多种数据库产品在连接方式上存在细微差异。
下面演示如何使用 psql 命令连接 PostgreSQL 数据库:

// —————————————————————————- // 远程连接

# psql -h 107.170.158.89 -U postgres
Password for user postgres:

// —————————————–[……]

READ MORE

「PostgreSQL」- 管理数据库(=> Chapter 23. Managing Databases)

概览概述(Overview)
部分 角色、数据库、表空间 对象,是在 DB Cluster 级别创建的,保存在 pg_global 中。
对象间的层级关系:Cluster Database Schema Table;(Schema 是个总称,其中包含 Table Function 等等);
当建立连接时,必须指定数据库。
查看数据库:

SELECT datname FROM pg_database;
psql> \l

创建数据库(Creating a Database)

CREATE DATABASE name;
createdb dbname # 命令行创建数据库;
createdb # 以当前用户名创建数据库;

// 为某个用户创建数据库
// 相应数据库属于当前用户,也用于后期删除操作;
CREATE DATABASE dbname OWNER rolename;
createdb -O rolename dbname

pg_database 的 datistemplate:暗示数据库是否为模板;否则只有 SuperUser 能够克隆该数据库; pg_database 的 datallowconn:暗示数据库能否被连接;
模板数据库(Template Databases)
postgres,是最初的数据库,通过 initdb 创建;
template1,也是最初创建的数据库,所有 CREATE DATABASE 将复制该数据库;
template0,也是最初创建的数据库,但是其内容更加简单。需要使用这种类型的数据库:恢复 pg_dump 产生的数据时;template1 包含某些特定设置,而 template 则可以进行所需要的设置;
通过模板创建数据库:

CREATE DATABASE dbname TEMPLATE template0;
createdb -T template0 dbname

数据库配置(Database Configuration)
修改特定数据库的配置:

ALTER DATABASE mydb SET geqo TO off;
ALTER DATABASE dbname RESET varname; # 重置数据库配置

销毁数据库(Destroying a Database)[……]

READ MORE

「Redis」- 基本概念及常用操作

支持的数据类型
String、List、Set、Hash、Sorted set、Bitmap(Bit array, Simply bitmap)、HyperLogLog、Stream
连接Redis服务
如果是图形化程序的化,可以使用「Redis Desktop Manager」工具。
在命令行中,可以使用自带的redis-cli(1)命令:

#!/bin/sh

redis-cli -h 172.16.0.116 -p 6379

# 如果设置了认证,则可以使用-a选项指定密码(但是不建议这样做)
redis-cli -h 172.16.0.116 -p 6379 -a password

# 另外一种指定密码的方式是登录后,使用AUTH命令

常用Redis操作
数据操作

操作
命令
说明

添加String类型数据
SET key value [EX seconds|PX milliseconds] [NX|XX]
 

获取String类型数据
GET key
 

追加内容
APPEND key value
 

 
 
 

对KEY模糊匹配
KEYS pattern
参数pattern与Shell的通配符类似。

判断KEY是否存在
EXISTS key [key …]
 

删除键
DEL key [key …]
 

获得键值的数据类型
TYPE key
 

 
 
 

增加指定的整数
INCRBY key increment
 

查看服务信息

操作
命令
说明

查看Redis服务全部信息
INFO
返回服务所有的信息

服务软件信息
INFO server
返回Redis软件、构建、版本等等信息[……]

READ MORE

「Redis」- 部署和测试

on Kubernetes
https://rancher.com/blog/2019/deploying-redis-cluster/
部署 Redis 服务(CentOS 7.0)

#!/bin/sh

# 安装服务
yum install -y redis.x86_64

# 启动服务,并设置为自启动
systemctl start redis.service
systemctl enable redis.service

测试Redis服务

#!/bin/sh

# redis-cli
127.0.0.1:6379> SET k4nz demo
OK
127.0.0.1:6379> GET k4nz
“demo”
127.0.0.1:6379> DEL k4nz
(integer) 1
127.0.0.1:6379> GET k4nz
(nil)

与Redis有关的命令
redis-server – 服务端程序
redis-cli – 客户端程序
redis-sentinel – 到redis-server的软链接,使redis运行于Sentinel模式,官方推荐的高可用性(HA)解决方案
redis-benchmark – 用于Redis的基准测试
redis-check-aof – 用于Redis AOF文件的检查和修复
redis-check-rdb – 用于Redis RDB文件的检查
参考文献
Linux下redis安装与使用[……]

READ MORE

「Redis」- 配置主从复制

内容简介
本部分将介绍如何搭建Redis主从复制。
主从模式
作用:

数据备份
负载均衡

一些要注意的点:

一主多从
主节点进行读写,从节点只能进行读
从节点要禁用写操作
从节点故障后,不会影响其他节点,重启后还会从主节点同步数据
主节点故障后,无法进行写入操作,只能进行从节点的数据读取
在主节点故障后,需要使用Redis Sentinel让从节点成为主节点
如果主节点配置了密码,从节点需要在配置文件中指定密码来访问主节点。客户端访问主节点需要密码,访问从节点不需要密码。

主从模式缺点:

主节点故障后,无法进行写入操作,只能进行从节点的数据读取(使用Redis Sentinel来解决)

环境说明
在测试环境中,共由三台主机:

centos7.0-redis-0: 172.16.0.117, Master
centos7.0-redis-1: 172.16.0.118, Slave
centos7.0-redis-2: 172.16.0.117, Slave

CentOS 7.0,Redis 3.2.12,Port 6379
搭建主从复制

################################################################################
# 1. 安装服务
################################################################################
yum install -y redis.x86_64

################################################################################
# 2. 启动服务并开机启动
################################################################################
systemctl start redis.service
systemctl enable redis.service

################################################################################
# 3. 查看服务状态(分别在三台主机中执行,或者使用Ansible执行)
# !!!此步骤可以跳过,只是为了查看及测试服务状态
#####[……]

READ MORE

「Redis」- Sentinel

Redis Sentinel
在主从模式的基础上,当主机点故障时,Sentinel会从从节点中选取一个,使其成为主节点。
Sentinel集群无需设置其他Sentinel节点地址,它可以自动发现,它会将唯一一个Sentinel列表。
Sentinel集群不会同时进行故障迁移,只有第一个故障迁移失败后,才会进行第二个。
当Seninel将一个从节点选举为主节点并发送SLAVE OF NO ONE之后,即使从节点没有更新配置,也会将故障迁移视为成功。
在故障迁移过程中,如果收到重启了旧的主节点,将会导致整个集群出于无主节点状态。所以,不要重启主节点。
在故障迁移后,Sentinel会更新主节点、从节点、Seninel的配置。
Sentinel一般能满足高可用性,但是通常遇到的问题是内存瓶颈。
注意的问题:

「Sentinel模式」是建立在「主从模式」之上的
主节点故障后,Sentinel会选取从节点成为主节点,并修改其配置,并且也会修改其他从节点的配置
当故障的主节点重启后,它不再是主节点,而是成为从节点
当主从模式设置了密码时,Sentinel也会同步密码
Sentinel也会故障,因此Sentinel也需要集群和高可用
一个Sentinel可以管理多个Redis节点
Sentinel最好不要和Redis部署在同一台主机中
Sentinel监控的Redis集群都会定义一个主节点名字,这个名字代表Redis集群的主节点Redis
客户端连接Sentinel服务,由Sentinel来提供服务

Sentinel集群:

单个Sentinel容易出现单点故障,这会使得整个集群不可以用
多个Sentinel中,客户端可以访问任意一个Sentinel服务

环境说明
在测试环境中,共由三台主机:

centos7.0-redis-0: 172.16.0.117, Sentinel-Master
centos7.0-redis-1: 172.16.0.118, Sentinel-Slave
centos7.0-redis-2: 172.16.0.117, Sentinel-Slave

CentOS 7.0,Redis 3.2.12,Port 6379
配置Sentinel服务

################################################################################
# 1. 安装服务(Redis Sentinel附带在Redis的包中)
###[……]

READ MORE

「Redis」- 使用内置脚本创建集群(实验性质)

内容简介
我们需要在测试环境中部署三主三从的REDIS集群。本文将介绍如何使用官方脚本快速创建REDIS测试集群。
注意事项
本方法部署的REDIS集群只用于测试,不可用于生产环境部署。
服务部署
第一步、准备工作

#!/bin/sh

# 创建工作目录
mkdir -pv /usr/local/redis-cluster/
cd /usr/local/redis-cluster/

# 进入REDIS目录
wget http://download.redis.io/releases/redis-4.0.14.tar.gz
tar -xf redis-4.0.14.tar.gz
cd redis-4.0.14

第二步、创建集群

#!/bin/sh

# 生成二进制程序
make # 不要make install进行安装
cd utils/create-cluster/

# 第一步、启动实例
./create-cluster start

# 第二步、创建集群
./create-cluster create

# 在下次启动是,需要./create-cluster start命令,不需要再次执行create命令

第三步、测试连接

#!/bin/sh

# 连接集群
redis-cli -h 10.10.50.232 -p 30001

# 查看集群模式是否启用
redis-cli -h 10.10.50.232 -p 30001 INFO Cluster

附加说明
# 目前「redis-trib.rb」不支持认证
Getting a connection error when using redis-trib.rb to create a cluster? Redis Cluster and auth (password) 脚本redis-trib.rb用于创建集群,但是它处理不了配置了认证(requirepass)的节点。原因在于“认证并没有提供提高集群的安全性”。(1)认证只是对客户端进行认证。而集群节点之间的沟通是通过集群总线,集群总线是没有认证的,所以集群的配置中不应该出现认证关系。(2)但是,配置集群所使用的API在连接是是需要认证的,因为它是来自于客户端的请求。(#)这两个地方形成了一个冲突。认证作用于客户端,并没用作用于集群。
参考文献
Creating a Redis Cluster using the create-cluster script[……]

READ MORE

「Redis」- Zabbix solutions

内容简介
本文将介绍使用Zabbix监控Redis的解决方案。主要参考了「Zabbix/Redis/Available solutions」中的解决方案。
注意事项
本文是在08/22/2019整理的,后面不保证能够跟随这些解决方案进行及时更新。
可用解决方案
让我们挨个看,挨个分析。
# Redis Discovery Template for Zabbix
https://github.com/cuimingkun/zbx_tem_redis
特点:通过端口发现redis实例和谁是从节点;获取redis的info/config/slaveinfo并输出json格式;通过“preprocessing”创建“Dependent Item”;生成图表和关键指标触发器。
# Redis Template for Zabbix
https://github.com/pavelnemirovsky/zabbix-redis-template
特点:能够发现在同一主机上运行的多个Redis实例;自动生成zabbix的“Screen”以进行总体概述,仅在使用Redis命令(依赖少);触发器自动识别异常命令(尚未完成)和实例崩溃。
# Zabbix template for Redis (不适合我们的场景)
https://github.com/adubkov/zbx_redis_template
特点:支持两种语言环境,PYTHON,NODEJS,并支持两种模式「捕获模式」与「代理模式」,但是NODEJS实现只支持「代理模式」。
!!!不适合我们的场景,配置挺麻烦的,而且需要其他的语言环境,但是GitHub Star很多。
# zabbix-agent-extensions (不适合我们的场景)
https://github.com/scoopex/zabbix-agent-extensions
特点:对Zabbix进行了一系列扩展,而Redis监控只是其中的一部分。相关配置可以参考「custom-service-redis」文件。
!!!不适合我们的场景,东西太多了,只需要一个REDIS监控。
# zabbix-template-for-redis (不适合我们的场景)
https://github.com/allenta/zabbix-template-for-redis
特点:包含Zabbix模板、发现、发件人脚本,可用于监控Redis Server和Redis Sentinel实例
!!!不适合我们的场景,用了PYTHON脚本,但是脚本里依赖redis-cli命令,而没有使用redis库。
# Zabbi[……]

READ MORE

「Redis」 – INFO [section]

内容简介
使用REDIS的INFO指令,可以查看REDIS当前信息及各项统计数据。输出易于解读,也易于程序解析。可选的[section]参数,可以用于指定要查看的部分。
本文将介绍这些参数,及每个参数所代表的含义。
注意事项
本文所列举的字段是在REDIS 3.2.12版本中INFO命令返回的字段,可能未涉及某些在新版REDIS中的字段。
完整的字段及含义,可以参考官方「Redis/Documentation/INFO」手册。
# Server
描述了Redis服务的基本信息。

字段名
监控指标
示例值
含义

redis_mode
 
standalone
服务所处的模式:”standalone”, “sentinel”, “cluster”

multiplexing_api
 
epoll
当前Redis使用的事件循环机制

redis_build_id
 
b2d74fe5fff7657d
构建的ID值

os
 
Linux 2.6.32-431.el6.x86_64 x86_64
操作系统的信息

lru_clock
 
5948172
每分钟时钟递增,用于LRU管理

tcp_port
 
6379
当前监听的端口号

arch_bits
 
64
系统架构:32, 64

run_id
 
56cdbb6c4a77efeca749b0cc35ad5b1e6eb0b7b4
当前实例的唯一标识。在Sentinel与Cluter中使用。

gcc_version
 
4.4.7
编译时所使用的编译器版本

redis_version
 
3.2.12
代表Redis Server的版本号

process_id
 
2110
当前REDIS服务的进程PID值[……]

READ MORE

「etcd」- 概念与架构

问题描述
2013 年,CoreOS 团队需要一个协调服务来存储服务配置信息、提供分布式锁等能力;
需求概述: 该服务需要满足五个目标:可用性角度:高可用;数据一致性角度:提供读取“最新”数据的机制;容量角度:低容量、仅存储关键元数据配置;功能:增删改查,监听数据变化的机制(数据同步);运维复杂度:可维护性;
现有方案: 高可用性、数据一致性、功能:从这三个角度来说,ZooKeeper 是满足 CoreOS 诉求的; 配置繁琐:但是,当时的 ZooKeeper 不支持通过 API 安全地变更成员,需要人工修改一个个节点的配置,并重启进程; 容易故障:如果操作错误,则 ZooKeeper 有可能出现脑裂等严重故障; 维护成本:适配云环境、可平滑调整集群规模、在线变更运行时配置是 CoreOS 的期望目标,而 ZooKeeper 在这块的可维护成本相对较高; 资源占用:ZooKeeper 是用 Java 编写的,占用较多的内存资源; 部署繁琐: 专有接口:同时 ZooKeeper RPC 的序列化机制用的是 Jute,自己实现的 RPC API,其无法使用 curl 等常用工具来操作,CoreOS 期望使用比较简单的 HTTP + JSON;
解决方案
CoreOS 决定开始开发协调服务(具体原因我们不得而知,总之 CoreOS 开始着手 etcd 开发);
原理简述
概览架构

详细架构

Client Layer
该层层包括: 1)Client API v2 和 Client API v3 两个版本,提供简洁易用的 API, 2)同时支持负载均衡、节点间故障自动转移,可极大降低业务使用 etcd 复杂度,提升开发效率、服务可用性;
API Layer
该层包括 client 访问 server 和 server 节点之间的通信协议; 1)Client 访问 etcd 的 API v2 和 API v3 两个版本:API v2 使用 HTTP/1.x 协议;API v3 使用 gRPC 协议,且 API v3 通过 etcd grpc-gateway 组件也支持 HTTP/1.x 协议,便于各种语言的服务调用; 2)Server 间通信协议(是指节点间通过 Raft 算法实现数据复制和 Leader 选举等功能时使用的协议),其为 HTTP 协议;
Raft Layer
Raft 算法层实现 Leader 选举、日志复制、ReadIndex 等核心算法特性,用于保障 etcd 多个节点间的数据一致性、提升服务可用性等;
功能逻辑层
etcd 核心特性实现层: 1)典型的 KV-Server 模块、Auth-Server 模块、Lease 租约模块、Co[……]

READ MORE

「etcd」- 数据读取流程

问题描述
该笔记将记录:我们将学习 etcd 数据读流程,以理解 etcd 数据读取的工作原理;
解决方案
极客时间 /etcd 实战课(唐聪,腾讯云资深工程师,etcd 活跃贡献者)
虽说 etcd 是典型的「读多写少」存储,但是具体的读写取决于业务场景,部分我们将学习读请求是如何执行的;

执行命令:

// 写入数据
// 如果为提前 put 数据,Server 将产生 connect reset by peer 错误

# ./bin/etcdctl put hello “world” –endpoints http://127.0.0.1:2379
OK

// 读取数据
// “get”是请求的方法,它是 KVServer 模块的 API;
// “hello”是我们查询的 key 名;
// “endpoints”是我们后端的 etcd 地址,通常,生产环境下需要配置多个 endpoints,以在节点出现故障后,client 能够自动重连到其它正常的节点;

# ./bin/etcdctl get hello –endpoints http://127.0.0.1:2379
hello
world

第一步、etcdctl => etcd/KVServer
在 etcd v3.4.9 版本中,etcdctl 是通过 clientv3 库来访问 etcd server 的,clientv3 库基于 gRPC client API 封装操作 etcd KVServer、Cluster、Auth、Lease、Watch 等模块的 API,同时还包含负载均衡、健康探测和故障切换等特性;
在解析完请求中的参数后,etcdctl 会创建一个 clientv3 库对象,使用 KVServer 模块的 API 来访问 etcd server;
接下来,通过负载均衡算法为这个 get hello 请求选择一个合适的 etcd server 节点。在 etcd 3.4 中,Client v3 库采用的 Round-robin 负载均衡算法为。针对每一个请求,Round-robin 算法通过轮询的方式依次从 endpoint 列表中选择一个 endpoint 访问 (长连接),使 etcd server 负载尽量均衡;
关于负载均衡算法,需要特别注意以下两点;

如果 client version <= 3.3,那么当配置多个 endpoint 时,负载均衡算法仅会从中选择一个 IP 并创建一个连接(Pinned endpoint),这样可以节省服务器总连接数。但在在 heavy usage 场景中,这可能会造成 server 负载不均[……]

READ MORE

「etcd」- ReadIndex

读取到旧数据(异步提交的数据不一致)
那各个节点数据在任意时间点读出来都是一致的吗?什么情况下会读到旧数据呢?

1)Client 发起一个更新 hello 为 world 请求;
2)Leader 收到写请求,它会将此请求持久化到 WAL 日志,并广播给各个节点(并发的,一方面广播给 Follower 节点,一方面自己写 WAL); 若一半以上节点持久化成功,则该请求对应的日志条目被标识为已提交,etcdserver 模块异步从 Raft 模块获取已提交的日志条目,应用到状态机(如 boltdb 等);
Client 发起一个读取 hello 的请求,假设此请求直接从状态机中读取, 如果连接到的是 C 节点,若 C 节点磁盘 I/O 出现波动,可能导致它应用已提交的日志条目很慢,则会出现更新 hello 为 world 的写命令,在 client 读 hello 的时候还未被提交到状态机,因此就可能读取到旧数据;
ReadIndex
前面我们聊到串行读时提到,它之所以能读到旧数据,主要原因是 Follower 节点收到 Leader 节点同步的写请求后,应用日志条目到状态机是个异步过程,那如何保证读取到最新的数据呢?
其实这个机制就是叫 ReadIndex,它是在 etcd 3.1 中引入的。该机制保证:在读取的时候,确保最新的数据已写入状态机中;
原理如图:
线性读通过 ReadIndex 机制保证数据一致性原理,大致原理如下:

当 Follower C 收到线性读请求时,将由其线性模块处理,Follower C 首先会从 Leader 获取集群最新的已提交的日志索引 (committed index),如上图中的流程二所示;

Leader 收到 ReadIndex 请求时,为防止脑裂等异常场景,Leader 会向所有 Follower 发送心跳确认,一半以上 Follower 确认 Leader 身份后,Leader 才能将 Committed Index 返回给 Follower C(上图中的流程三);

Follower C 则会等待(上图中的流程四),直到其状态机 Applied Index >= Leader’s Committed Index,然后将通知读请求其数据已赶上 Leader,可以从状态机中访问数据(上图中的流程五);

当然还有其它机制也能实现线性读,例如,在早期 etcd 3.0 中读请求通过走一遍 Raft 协议保证一致性,这种 Raft log read 机制依赖磁盘 IO,性能相比 ReadIndex 较差;[……]

READ MORE

「etcd」- 数据写入流程

问题描述
该笔记将记录:我们将学习 etcd 数据读流程,以理解 etcd 数据读取的工作原理;
解决方案
极客时间 /etcd 实战课(唐聪,腾讯云资深工程师,etcd 活跃贡献者)

写数据命令:

etcdctl put hello world –endpoints http://127.0.0.1:2379
OK

Client =(gPRC)=> etcd Node
通过负载均衡算法,Client 选择一个 etcd Node,发起 gRPC 调用,即 ① 步骤;
Quota Module
然后 etcd Node 收到请求后,经过 gRPC 拦截器,Write Request 需要经过 Quota(配额模块)处理,即 ② 步骤;
模块功能:配额限制;
概述原理
当 etcd Server 收到 put/txn 等 Write Request 的时候,会首先检查当前 etcd db 大小加上请求的 K/V 大小之和是否超过配额(quota-backend-bytes);
如果超过配额,它会产生一个告警(Alarm)请求,告警类型是 NO SPACE,并通过 Raft 日志同步给其它 Follower,告知 db 无空间,并将 Alarm 持久化存储到 db 中;
最终,gRPC Module(API 层 )和 Apply Module(负责将 Raft 侧已提交的日志条目应用到状态机),都拒绝写入,集群只读;
触发配额限制的场景
在使用 etcd 过程中,出现 etcdserver: mvcc: database space exceeded 错误,则表示当前 etcd db 文件大小超过配额。当出现此错误后,整个集群将不可写入(只读状态);
默认 db 配额仅为 2G,当业务数据、Write QPS、Kubernetes 集群规模增大后,etcd db 大小就可能会超过 2G;
etcd v3 是个 MVCC 数据库,保存 key 的历史版本。当未配置压缩策略的时候,随着数据不断写入,db 大小会不断增大,导致超限;
如果 etcd Version < 3.2.10 版本,备份操作可能会触发 boltdb 的某个 Bug,它会导致 db 大小不断上涨,最终达到配额限制;
调整配额的方法(流程)
调整配额: 1)直接调整配额,但 etcd 社区建议不超过 8G; 2)需要注意配额(quota-backend-bytes)的行为:默认’0’就是使用 etcd 默认的 2GB 大小;如果参数 < 0 ,就会禁用配额功能,可能会导致 db 大小处于失控,导致性能下降,所以不建议禁[……]

READ MORE

「WAL」- Write Ahead Log

日志结构

它由多种类型的 WAL 记录顺序追加写入组成,每个记录由:
Type(记录类型)
不同类型的记录通过 Type 字段区分,
目前,记录类型支持 5 种,分别是:
文件元数据记录:文件元数据记录包含节点 ID、集群 ID 信息,它在 WAL 文件创建的时候写入;
日志条目记录:包含 Raft 日志信息,如 put 提案内容
状态信息记录:包含集群的任期号、节点投票信息等,一个日志文件中会有多条,以最后的记录为准;
CRC 记录:包含上一个 WAL 文件的最后的 CRC(循环冗余校验码)信息, 在创建、切割 WAL 文件时,作为第一条记录写入到新的 WAL 文件, 用于校验数据文件的完整性、准确性等;
快照记录:包含快照的任期号、日志索引信息,用于检查快照文件的准确性。
CRC(循环冗余校验码)
CRC 为循环校验码信息;
Data(数据)
Data 为对应记录内容,[……]

READ MORE