07/07/2022

Общие вопросы TestOps

Общие вопросы TestOps

Какие есть виды индексов? Когда и зачем использовать?

Индекс (англ. index) — объект базы данных, создаваемый с целью повышения производительности поиска данных. Таблицы в базе данных могут иметь большое количество строк, которые хранятся в произвольном порядке, и их поиск по заданному критерию путём последовательного просмотра таблицы строка за строкой может занимать много времени. Индекс формируется из значений одного или нескольких столбцов таблицы и указателей на соответствующие строки таблицы и, таким образом, позволяет искать строки, удовлетворяющие критерию поиска. Ускорение работы с использованием индексов достигается в первую очередь за счёт того, что индекс имеет структуру, оптимизированную под поиск — например, сбалансированного дерева.

В общем виде, индекс в базах данных — это файл с последовательностью пар ключей и указателей. Идея использования индексов пришла от того, что современные базы данных слишком массивны и не помещаются в основную память. Мы обычно делим данные на блоки и размещаем данные в памяти поблочно. Однако поиск записи в БД может занять много времени. С другой стороны, файл индексов или блок индексов намного меньше блока данных и может поместиться в буфере основной памяти, что увеличивает скорость поиска записи.

Разрежённый индекс (англ. sparse index) характеризуется тем, что каждый ключ ассоциируется с определённым указателем на блок в сортированном файле данных.

Плотный индекс (англ. dense index) в свою очередь отличается тем, что каждый ключ ассоциируется с определённым указателем на запись в сортированном файле данных.

В кластерных индексах с дублированными ключами разрежённый индекс указывает на наименьший ключ в каждом блоке, в то время как плотный индекс указывает на первую запись с указанным ключом.

Можно ли вывести список баз данных/таблиц через CLI

В Postgress

-l или \list

В MySQL

SHOW DATABASES;

Транзакции,команды для транзакций

Транзакции — это фундаментальное понятие во всех СУБД. Суть транзакции в том, что она объединяет последовательность действий в одну операцию «всё или ничего». Промежуточные состояния внутри последовательности не видны другим транзакциям, и если что-то помешает успешно завершить транзакцию, ни один из результатов этих действий не сохранится в базе данных.

Транзакцией называется последовательность операций над данными имеющая начало и конец

Транзакция это последовательное выполнение операций чтения и записи. Окончанием транзакции может быть либо сохранение изменений (фиксация, commit) либо отмена изменений (откат, rollback). Применительно к БД транзакция это нескольких запросов, которые трактуются как единый запрос.

Транзакции должны удовлетворять свойствам ACID

Атомарность. Транзакция либо выполняется полностью либо не выполняется вовсе.

Согласованность. При завершении транзакции не должны быть нарушены ограничения накладываемые на данные (например constraints в БД). Согласованность подразумевает, что система будет переведена из одного корректного состояния в другое корректное.

Изолированность. Параллельно выполняемые транзакции не должны влиять друг на друга, например менять данные которые использует другая транзакция. Результат выполнения параллельных транзакций должен быть таким, как если бы транзакции выполнялись последовательно.

Устойчивость. После фиксации изменения не должны быть утеряны.

BEGIN;
UPDATE accounts SET balance = balance - 100.00
    WHERE name = 'Alice';
SAVEPOINT my_savepoint;
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Bob';
-- ошибочное действие... забыть его и использовать счёт Уолли
ROLLBACK TO my_savepoint;
UPDATE accounts SET balance = balance + 100.00
    WHERE name = 'Wally';
COMMIT;

Что такое индекс и что такое ключ

Ключ представляет собой комбинацию полей, данные в которых однозначно определяют каждую запись в таблице. Простой ключ состоит из одного поля, а составной (сложный) из нескольких полей. Поля, по которым построен ключ, называют ключевыми.

Индекс, как и ключ, представляет собой своеобразное оглавление таблицы, просмотр которого выполняется перед обращением к ее записям. Таким образом, использование индекса повышает скорость доступа к данным в таблице за счет того, что доступ выполняется не последовательным, а индексно-последовательным методом.

Deployment strategies

Rolling (постепенный, «накатываемый» деплой)

Это стандартная стратегия развертывания в Kubernetes. Она постепенно, один за другим, заменяет pod'ы со старой версией приложения на pod'ы с новой версией — без простоя кластера.

Recreate (повторное создание)

В этом простейшем типе развертывания старые pod'ы убиваются все разом и заменяются новыми

Blue/Green (сине-зеленые развертывания)

Стратегия сине-зеленого развертывания (иногда ее ещё называют red/black, т.е. красно-чёрной) предусматривает одновременное развертывание старой (зеленой) и новой (синей) версий приложения. После размещения обеих версий обычные пользователи получают доступ к зеленой, в то время как синяя доступна для QA-команды для автоматизации тестов через отдельный сервис или прямой проброс портов

Canary (канареечные развертывания)

Канареечные выкаты похожи на сине-зеленые, но лучше управляются и используют прогрессивный поэтапный подход. К этому типу относятся несколько различных стратегий, включая «скрытые» запуски и А/В-тестирование.

Эта стратегия применяется, когда необходимо испытать некую новую функциональность, как правило, в бэкенде приложения. Суть подхода в том, чтобы создать два практически одинаковых сервера: один обслуживает почти всех пользователей, а другой, с новыми функциями, обслуживает лишь небольшую подгруппу пользователей, после чего результаты их работы сравниваются. Если все проходит без ошибок, новая версия постепенно выкатывается на всю инфраструктуру.

Dark (скрытые) или А/В-развертывания

Скрытое развертывание — еще одна вариация канареечной стратегии (с ней, кстати, Flagger тоже может работать). Разница между скрытым и канареечным развертыванием состоит в том, что скрытые развертывания имеют дело с фронтендом, а не с бэкендом, как канареечные.

Другое название этих развертываний — А/В-тестирование. Вместо того, чтобы открыть доступ к новой функции всем пользователям, ее предлагают лишь ограниченной их части. Обычно эти пользователи не знают, что выступают тестерами-первопроходцами (отсюда и термин «скрытое развертывание»).

Flagger и A/B-развертывания

Помимо маршрутизации с учётом весов, Flagger также может направлять на канареечный сервер трафик в зависимости от параметров HTTP. При А/В-тестировании можно использовать заголовки HTTP или файлы cookie для перенаправления определенного сегмента пользователей. Это особенно эффективно в случае frontend-приложений, требующих привязки сессии к серверу (session affinity). Дополнительную информацию можно найти в документации Flagger.

Что такое контроллер?

Контроллер - это что-либо в вашем кластере, которое отслеживает хотя бы один другой тип ресурса Kubernetes. Контроллеры могут быть пассивными или активными. Активный контроллер сам выполнит необходимые действия; пассивы будут передавать изменения другим компонентам или серверу API кластера.

Что такое операторы?

Оператор - это специализированная форма контроллера. Операторы реализуют модель контроллера, что означает, что они переводят кластер в определенное состояние, но у них также есть дополнительные характеристики. Первоначально этот термин был придуман CoreOS, но теперь получил более широкое распространение в Kubernetes.

Операторы адаптированы к конкретным приложениям. Они добавляют расширения Kubernetes API через пользовательские определения ресурсов, создавая новые типы объектов, используемых приложением, которым они управляют.

Права к файлу 755

У файла установлены права 755.

Первая цифра — 7, это значит, что хозяин имеет на файл все права: чтение, запись и запуск (7 — 111).

Вторая цифра — 5, пользователи из одной с хозяином группы имеют возможность читать и запускать файл, но не могут в него писать (5 — 101).

Аналогично и все остальные — третья цифра тоже пятерка.

Какое максимальное количество docker layers возможно

127

Что такое многоэтапный build

много-этапные (multi-stage builds) сборки позволяют значительно упростить процесс и описать его внутри Dockerfile. Каждая инструкция FROM может использовать индивидуальный базовый образ и каждая из них начинает новую стадию сборки docker образа. Но основное преимущество, что вы можете копировать необходимые артефакты из одной стадии в другую. В результате все вышеперечисленные шаги могут быть описаны вот так Dockerfile:

FROM golang:latest as build
COPY . .
RUN go build ./src/main.go

FROM alpine:latest as production
COPY --from=build /go/main .
CMD ["./main"]

DinD (Docker in docker)

Docker предоставляется в виде самодостаточного образа через тег docker:dind на Docker Hub.

Запустив этот образ, вы получите функционирующую установку демона Docker внутри вашего нового контейнера.

Он будет работать независимо от демона вашего хоста, который запускает контейнер dind, поэтому docker ps внутри контейнера даст результаты, отличные от docker ps на вашем хосте.

docker run -d --privileged --name docker \
    -e DOCKER_TLS_CERTDIR=/certs \
    -v docker-certs-ca:/certs/ca \
    -v docker-certs-client:/certs/client \
    docker:dind

Использование Docker-in-Docker таким образом связано с одним большим предостережением: необходимо использовать привилегированный режим.

Это ограничение действует, даже если вы используете контейнеры без рутов.

Привилегированный режим активируется флагом –privileged в команде, показанной выше.

Использование привилегированного режима дает контейнеру полный доступ к вашей хост-системе.

Это необходимо в сценарии Docker-in-Docker, чтобы ваш внутренний Docker мог создавать новые контейнеры.

Однако в некоторых средах это может быть неприемлемым риском для безопасности.

Существуют и другие проблемы с dind.

В некоторых системах могут возникать конфликты с модулями безопасности Linux Security Modules (LSM), такими как AppArmor и SELinux.

Это происходит, когда внутренний Docker применяет политики LSM, которые внешний демон не может предугадать.

Еще одна проблема связана с файловыми системами контейнеров.

Внешний демон будет работать поверх обычной файловой системы вашего хоста, например ext4.

Переменная PATH

Для того, чтобы посмотреть содержимое переменной PATH в Linux, выполните в терминале команду:

echo $PATH

Для того, чтобы добавить новый путь к переменной PATH, можно воспользоваться командой export. Например, давайте добавим к значению переменной PATH папку/opt/local/bin. Для того, чтобы не перезаписать имеющееся значение переменной PATH новым, нужно именно добавить (дописать) это новое значение к уже имеющемуся, не забыв о разделителе-двоеточии:

export PATH=$PATH:/opt/local/bin

Команды для копирования и переименования файла

  • cp
  • mv

Команда env

Команда env позволяет модифицировать список переменных окружения перед исполнением пользовательской команды. В некоторых командных оболочках она является встроенной, в некоторых — внешней командой.

Базовый синтаксис команды выглядит следующим образом:

$ env [параметры] [ИМЯ=ЗНАЧЕНИЕ] ... [команда]

При вызове env без каких-либо параметров будет выведен список всех переменных окружения. Исполнение команды с измененными значениями переменных окружения Для изменения значения произвольной переменной окружения перед запуском команды достаточно указать имя этой переменной и ее значение после символа равенства. Например, для вывода времени по Гринвичу достаточно изменить значение переменной окружения TZ:

$ env TZ=GMT date
Ср июл 26 17:50:30 GMT 2017

Исполнение команды лишь с заданными переменными окружения Для исполнения команды с несколькими пользовательскими переменными окружения следует воспользоваться параметром -i и вручную задать значения необходимых переменных:

$ env -i PWD=/root env
PWD=/root

DELETE vs TRUNCATE

Партиционирование

Партиционирование – это метод разделения больших (исходя из количества записей, а не столбцов) таблиц на много маленьких. И желательно, чтобы это происходило прозрачным для приложения способом.

когда таблица готова, я могу создать партиции, что означает – наследованные таблицы:

create table users_1 () inherits (users);

  • Deadlock
  • Задачка на LEFT JOIN примерно как в собесе выше

Что такое CI/CD

  • Инструменты (Jenkins, Gitlab CI ...)
  • Green / Blue deploy
  • Канареечный релиз
  • Балансировщик

В чем отличие контейнеризации от виртуализации

Виртуализация - эмулируется аппаратное окружение и может быть запущен широкий спектр гостевых операционных систем, Контейнеризация - может быть запущен экземпляр операционной системы только с тем же ядром, что и у хостовой операционной системы отсутствуют дополнительные ресурсные накладные расходы на эмуляцию виртуального оборудования и запуск полноценного экземпляра операционной системы